@datagrok/eda 1.1.27 → 1.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/111.js +2 -0
- package/dist/111.js.map +1 -0
- package/dist/153.js +2 -0
- package/dist/153.js.map +1 -0
- package/dist/23.js +2 -2
- package/dist/23.js.map +1 -0
- package/dist/234.js +2 -0
- package/dist/234.js.map +1 -0
- package/dist/242.js +2 -0
- package/dist/242.js.map +1 -0
- package/dist/260.js +2 -0
- package/dist/260.js.map +1 -0
- package/dist/317.js +2 -0
- package/dist/317.js.map +1 -0
- package/dist/33.js +2 -0
- package/dist/33.js.map +1 -0
- package/dist/348.js +2 -0
- package/dist/348.js.map +1 -0
- package/dist/377.js +2 -0
- package/dist/377.js.map +1 -0
- package/dist/412.js +2 -0
- package/dist/412.js.map +1 -0
- package/dist/415.js +2 -0
- package/dist/415.js.map +1 -0
- package/dist/531.js +2 -0
- package/dist/531.js.map +1 -0
- package/dist/583.js +2 -0
- package/dist/583.js.map +1 -0
- package/dist/589.js +2 -0
- package/dist/589.js.map +1 -0
- package/dist/603.js +2 -0
- package/dist/603.js.map +1 -0
- package/dist/656.js +2 -0
- package/dist/656.js.map +1 -0
- package/dist/682.js +2 -0
- package/dist/682.js.map +1 -0
- package/dist/705.js +2 -0
- package/dist/705.js.map +1 -0
- package/dist/731.js +2 -0
- package/dist/731.js.map +1 -0
- package/dist/738.js +3 -0
- package/dist/738.js.map +1 -0
- package/dist/763.js +2 -0
- package/dist/763.js.map +1 -0
- package/dist/778.js +2 -0
- package/dist/778.js.map +1 -0
- package/dist/783.js +2 -0
- package/dist/783.js.map +1 -0
- package/dist/793.js +2 -0
- package/dist/793.js.map +1 -0
- package/dist/907.js +2 -0
- package/dist/907.js.map +1 -0
- package/dist/91.js +2 -0
- package/dist/91.js.map +1 -0
- package/dist/950.js +2 -0
- package/dist/950.js.map +1 -0
- package/dist/package-test.js +2 -2
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -0
- package/package.json +3 -3
- package/src/missing-values-imputation/ui.ts +80 -66
- package/src/package.ts +104 -46
- package/src/pls/pls-tools.ts +5 -6
- package/src/svm.ts +19 -17
- package/tsconfig.json +4 -4
- package/webpack.config.js +1 -1
- package/dist/208.js +0 -2
- package/dist/221.js +0 -2
- package/dist/231.js +0 -2
- package/dist/261.js +0 -2
- package/dist/282.js +0 -2
- package/dist/334.js +0 -2
- package/dist/356.js +0 -2
- package/dist/36.js +0 -2
- package/dist/367.js +0 -2
- package/dist/374.js +0 -2
- package/dist/40.js +0 -2
- package/dist/413.js +0 -2
- package/dist/42.js +0 -2
- package/dist/427.js +0 -2
- package/dist/445.js +0 -2
- package/dist/467.js +0 -2
- package/dist/523.js +0 -3
- package/dist/533.js +0 -2
- package/dist/590.js +0 -2
- package/dist/65.js +0 -2
- package/dist/694.js +0 -2
- package/dist/729.js +0 -2
- package/dist/796.js +0 -2
- package/dist/901.js +0 -2
- package/dist/902.js +0 -2
- package/dist/910.js +0 -2
- package/dist/972.js +0 -2
- /package/dist/{523.js.LICENSE.txt → 738.js.LICENSE.txt} +0 -0
package/dist/231.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var eda;(()=>{"use strict";var e,n,t={9295:(e,n,t)=>{var r;!function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}));const a={[r.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[r.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var i;!function(e){e.HAMMING="Hamming",e.EUCLIDEAN="Euclidean",e.MANHATTAN="Manhattan",e.TANIMOTO="Tanimoto",e.LEVENSTEIN="Levenshtein",e.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",e.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",e.SOKAL="Sokal",e.COSINE="Cosine",e.ASYMMETRIC="Asymmetric",e.Difference="Difference",e.OneHot="One-Hot"}(i||(i={}));const o={[i.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[i.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[i.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[i.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[i.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[i.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[i.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[i.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[i.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[i.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},s={[i.HAMMING]:e=>Math.ceil(e/30),[i.EUCLIDEAN]:e=>Math.ceil(e/30),[i.MANHATTAN]:e=>Math.ceil(e/30),[i.TANIMOTO]:e=>Math.ceil(e/60),[i.SOKAL]:e=>Math.ceil(e/60),[i.COSINE]:e=>Math.ceil(e/60),[i.ASYMMETRIC]:e=>Math.ceil(e/60),[i.LEVENSTEIN]:e=>Math.ceil(e*e/60),[i.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[i.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[i.Difference]:e=>1,[i.OneHot]:e=>Math.ceil(e/40)},u={STRING:new Set([i.HAMMING,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.MONOMER_CHEMICAL_DISTANCE,i.OneHot]),UINT32ARRAY:new Set([i.HAMMING,i.EUCLIDEAN,i.MANHATTAN,i.MONOMER_CHEMICAL_DISTANCE,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC,i.OneHot,i.Difference]),INT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.OneHot,i.Difference]),FLOAT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),NUMBER:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),BITARRAY:new Set([i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC])};var l=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};let f=null,c=null;function d(){return l(this,void 0,void 0,(function*(){if(!f&&(f=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==f))return null;let e=!1;if(c&&(c.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!c||e){const e=1e9,n=f.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return c=yield f.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),c}catch(e){return console.error("Failed to create device with required limits",e),c=yield f.requestDevice(),c}}return c}))}function p(e,n=.8,t,a,o,l){return f=this,c=void 0,h=function*(){const f=yield d();if(!f)return null;const c=Object.values(i);if(t.some((e=>!c.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(r).includes(a))throw new Error("Invalid aggregation function provided: "+a);const p=1-n;if(l.length!==e.length||l.length!==t.length||l.length!==o.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const h=e.length,g=e[0].length,y=e.map(((e,n)=>function(e,n=i.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var a,o;let l=null;const f=e.some((e=>"string"==typeof e))?(l="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(l="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(l="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(l="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(l="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(l="INT32ARRAY",e):void 0;if(!f||!l)throw new Error("Invalid entry type, could not determine entry type from input list");const c=f[0]instanceof Int32Array?"INT32ARRAY":f[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",d=new Uint32Array(f.map((e=>e.length)));if(!u[l]||!u[l].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${l}'`);const p=d.reduce(((e,n)=>Math.max(e,n)),0),m=s[n](p),h="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new h(f.length*p);f.forEach(((e,n)=>{g.set(e,n*p)}));let y="",A=0,b="FLOAT32ARRAY",w=null;if(n===i.NEEDLEMAN_WUNSCH||n===i.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),i=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)i[n][n]=1;const s=r.alphabetIndexes;for(const e of Object.keys(s))for(const n of Object.keys(s))e!==n&&(i[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[s[e]][s[n]]);A=2+n,b="FLOAT32ARRAY",w=new Float32Array(A),w[0]=null!==(a=r.gapOpenPenalty)&&void 0!==a?a:1,w[1]=null!==(o=r.gapExtensionPenalty)&&void 0!==o?o:.6;let u=2;for(let e=0;e<i.length;e++)w.set(i[e],u),u+=i[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===i.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const e=g.reduce(((e,n)=>Math.min(e,n)),g[0]),n=g.reduce(((e,n)=>Math.max(e,n)),g[0]);r.range=n-e}r.range<=0&&(r.range=1),A=1,b="FLOAT32ARRAY",w=new Float32Array([r.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",E=`data${t}: array<array<${x}, ${p}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:p,arraySizes:d,complexity:m,suppInfoBuffer:w,suppInfoSize:A,suppInfoType:b,suppInfoStructWgsl:y,entryType:l,dataTypeWGSL:x,dataStructWgsl:E,EncodedArrayConstructor:h}}(e,t[n],n,l[n])));if(0===h)throw new Error("No columns provided. Please provide at least one column of data.");1===h&&(a=r.MANHATTAN);let A=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),b=!1;A&&""!=A.trim()||(b=!0,A="\ndummy: f32\n");const w=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(h*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const E=1e4,I=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),B=10*v,S=g*(g-1)/2,U=Math.ceil(S/E),C=f.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${U} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${g}>, ${h}>,\n // the weights for each entry\n weights: array<f32, ${h}>,\n // the data for each entry\n ${w} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${A}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${b?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${B} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${g}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${g}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${p}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${g}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(t,y.map((e=>e.maxEntryLen)),p,a)}\n\n\n `}),O=f.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:C,entryPoint:"calcSparseMatrix"}}),L=new Uint32Array(E),P=new Uint32Array(E),R=new Uint32Array(E),T=new Uint32Array(E),_=Math.floor(S/E);let j=0,$=1;console.time("GPUthreadStarts");for(let e=0;e<E;e++){const n=9999===e?S-1:(e+1)*_,t=g-2-Math.floor(Math.sqrt(-8*n+4*g*(g-1)-7)/2-.5),r=n-g*t+Math.floor((t+1)*(t+2)/2);L[e]=$,P[e]=j,R[e]=r,T[e]=t,j=t,$=r}console.timeEnd("GPUthreadStarts");const G=4e4+g*h+h+y.reduce(((e,n)=>e+n.sourceArraySize),0),D=y.reduce(((e,n)=>e+n.suppInfoSize),0),z=1e6,k=G*Uint32Array.BYTES_PER_ELEMENT;let Y=k;const F=15&k;0!==F&&(Y+=16-F);const H=f.createBuffer({label:"compute info buffer",size:Y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),K=H.getMappedRange();let W=0;new Uint32Array(K,W,E).set(L),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(P),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(R),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(T),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,h).set(o),W+=h*Float32Array.BYTES_PER_ELEMENT;for(const e of y){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(K,W,t).set(e.flatSourceArray),W+=t*n.BYTES_PER_ELEMENT}H.unmap();const q=D*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const Z=f.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),J=Z.getMappedRange();let Q=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(J,Q,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Q+=e.suppInfoBuffer.byteLength);0===Q&&new Uint32Array(J,0,4).set([1,1,1,1]),Z.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15ⅇ0!==te&&(ne+=16-te);const re=f.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=f.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:O.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:Z}},{binding:2,resource:{buffer:re}}]}),ie=f.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],ue=[];let le=!1;for(;!le;){const e=f.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(O),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();f.queue.submit([t]),yield f.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,z);a+=z*Float32Array.BYTES_PER_ELEMENT;const u=new Uint32Array(r,a,E);a+=E*Uint32Array.BYTES_PER_ELEMENT,le=new Uint32Array(r,a,E).every((e=>1===e));const l=u.reduce(((e,n)=>e+n),0),c=new Uint32Array(l),d=new Uint32Array(l),p=new Float32Array(l);let m=0;for(let e=0;e<u.length;e++){const n=u[e];0!==n&&(c.set(i.subarray(e*I,e*I+n),m),d.set(o.subarray(e*I,e*I+n),m),p.set(s.subarray(e*I,e*I+n),m),m+=n)}oe.push(c),se.push(d),ue.push(p),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),pe=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),pe.set(ue[e],me),me+=oe[e].length;return H.destroy(),Z.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:pe}},new((p=void 0)||(p=Promise))((function(e,n){function t(e){try{a(h.next(e))}catch(e){n(e)}}function r(e){try{a(h.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof p?a:new p((function(e){e(a)}))).then(t,r)}a((h=h.apply(f,c||[])).next())}));var f,c,p,h}function m(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = ${t};\n ${o[e](n[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${a[r](e.length)}\n }\n \n `}var h=t(2590);async function g(e,n,t){const r=e.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=e[o],u=e[s];n[r]?.[u]>=t&&(a.push(o),i.push(s))}return function(e,n,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const u=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],l=n[t],f=r[s]-r[l],c=a[s]-a[l];Math.abs(f)>=1&&(i[s]-=u*f,i[l]+=u*f),Math.abs(c)>=1&&(o[s]-=u*c,o[l]+=u*c)}for(let e=0;e<t.length;e++){const n=Math.sqrt(i[e]*i[e]+o[e]*o[e]);n>0&&(r[e]+=i[e]/n*u,a[e]+=o[e]/n*u)}}let s=r[0],u=a[0],l=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),u=Math.min(u,a[e]),l=Math.max(l,r[e]),f=Math.max(f,a[e]);let c=l-s,d=f-u;0===c&&(c=l);for(let e=0;e<t.length;e++)r[e]=(r[e]-s)/c/2+.5;0===d&&(d=f);for(let e=0;e<t.length;e++)a[e]=(a[e]-u)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}function y(e,n,t,r){return a=this,i=void 0,s=function*(){const a=r,i=Math.ceil(a/100),o=Math.ceil(Math.sqrt(i)),s=10*o,u=e.createShaderModule({label:"colwise-normalize",code:`\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(10, 10) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${s} + col;\n if (index >= ${r}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `}),l=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:u,entryPoint:"normalize"}}),f=e.createBuffer({label:"simmilarities info buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Float32Array(f.getMappedRange()).set(n),f.unmap();const c=e.createBuffer({label:"offsets info buffer",size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(c.getMappedRange()).set(t),c.unmap();const d=e.createBindGroup({layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),p=e.createCommandEncoder(),m=p.beginComputePass();m.setPipeline(l),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const h=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});p.copyBufferToBuffer(f,0,h,0,n.byteLength),e.queue.submit([p.finish()]),yield e.queue.onSubmittedWorkDone(),yield h.mapAsync(GPUMapMode.READ);const g=new Float32Array(h.getMappedRange());n.set(g),h.unmap(),f.destroy(),c.destroy(),h.destroy()},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function r(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}u((s=s.apply(a,i||[])).next())}));var a,i,o,s}function A(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function b(e,n,t,r,a){return i=this,o=void 0,u=function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),u=10*s,l=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-l),c=new Float32Array(n.length),d=e.createShaderModule({label:"expand",code:`\n struct SparseKNN {\n knnSimilarities: array<f32, ${n.length}>,\n knnIndexes: array<u32, ${t.length}>,\n offsets: array<u32, ${r.length}>,\n rowIndexes: array<u32, ${t.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, 90000>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(10, 10) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${u} + col;\n if (index >= 90000) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${t.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${f}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `}),p=e.createComputePipeline({label:"expand compute pipeline",layout:"auto",compute:{module:d,entryPoint:"expand"}});let m=4*(n.length+t.length+r.length+t.length);const h=15&m;0!==h&&(m+=16-h);const g=e.createBuffer({label:"sparse knn buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),y=g.getMappedRange();new Float32Array(y,0,n.length).set(n),new Uint32Array(y,4*n.length,t.length).set(t),new Uint32Array(y,4*(n.length+t.length),r.length).set(r);const A=function(e){const n=new Uint32Array(e[e.length-1]);for(let t=0;t<e.length-1;t++)for(let r=e[t];r<e[t+1];r++)n[r]=t;return n}(r);new Uint32Array(y,4*(n.length+t.length+r.length),A.length).set(A),g.unmap();const b=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(b.getMappedRange()).set([0]),b.unmap();const w=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:w}},{binding:2,resource:{buffer:b}}]}),E=e.createBuffer({label:"out block buffer",size:w.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let n=0;n<Math.ceil(t.length/i);n++){const r=n*i,a=Math.min(i,t.length-r);e.queue.writeBuffer(b,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),u=o.beginComputePass({label:"expand compute pass"});u.setPipeline(p),u.setBindGroup(0,x),u.dispatchWorkgroups(s,s),u.end(),o.copyBufferToBuffer(w,0,E,0,E.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield E.mapAsync(GPUMapMode.READ);const l=new Float32Array(E.getMappedRange(),0,a);c.set(l,r),E.unmap()}return g.destroy(),b.destroy(),w.destroy(),E.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{a(u.next(e))}catch(e){n(e)}}function r(e){try{a(u.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof s?a:new s((function(e){e(a)}))).then(t,r)}a((u=u.apply(i,o||[])).next())}));var i,o,s,u}function w(e,n){const t=function(e,n){const t=new Uint32Array(n);for(let n=0;n<e.i.length;n++)t[e.i[n]]++,t[e.j[n]]++;for(let e=0;e<n;e++)t[e]++;return t}(e,n),r=function(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}(t),a=new Uint32Array(n).fill(1),i=new Uint32Array(2*e.i.length+n),o=new Float32Array(2*e.i.length+n);for(let e=0;e<n;e++)i[r[e]]=e,o[r[e]]=1;for(let n=0;n<e.i.length;n++){const t=e.i[n],s=e.j[n],u=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=u,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=u,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const x={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class E{constructor(e={}){this._options={...x,...e}}async transform(e,n){let t=this.toObjectForm(e);if(this._options.maxIterations>0){this.addLoops(t,n),this.normalize(t);for(let e=0;e<this._options.maxIterations;e++)t=this.expand(t,n),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,n);this.correctClusters(r);const o=await this.layout(r,t,n);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}async transformWebGPU(e,n){if(0===this._options.maxIterations)return this.transform(e,n);const t=await function(e,n,t=5,r=2){return a=this,i=void 0,s=function*(){const a=yield d();if(!a)throw new Error("no gpu device found");const i=w(e,n);yield y(a,i.KNNSimilarities,i.indexOffsets,n);let o=i;for(let e=0;e<t;e++){const e=yield b(a,o.KNNSimilarities,o.KNNIndexes,o.indexOffsets,n);A(e.KNNSimilarities,r),yield y(a,e.KNNSimilarities,e.indexOffsets,n),o=e}return o},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function r(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}u((s=s.apply(a,i||[])).next())}));var a,i,o,s}(e,n,this._options.maxIterations,this._options.inflateFactor),r=this.csrToSparseObject(t,n),{clusters:a,is:i,js:o}=this.assignClusters(r,n);this.correctClusters(a);const s=await this.layout(a,r,n);return{clusters:a,embedX:s.embedX,embedY:s.embedY,is:i,js:o}}correctClusters(e){const n={};for(const t of e)n[t]||(n[t]=0),n[t]++;const t=Object.keys(n).map(Number).sort(((e,t)=>n[e]-n[t])),r={};t.forEach(((e,n)=>r[e]=n+1));for(let n=0;n<e.length;n++)e[n]=r[e[n]]}csrToSparseObject(e,n){const t=Math.floor(Math.max(Math.log10(n),2))+1,r=1/Math.pow(10,t),a={};for(let t=0;t<n;t++){a[t]={};for(let n=e.indexOffsets[t];n<e.indexOffsets[t+1];n++){const i=e.KNNIndexes[n];i<=t||e.KNNSimilarities[n]<r||(a[t][i]=e.KNNSimilarities[n])}}return a}async layout(e,n,t){const r=new Float32Array(t).fill(0),a=new Float32Array(t).fill(0),i={};e.forEach(((e,n)=>{i[e]||(i[e]=[]),i[e].push(n)}));let o=0;const s=Object.keys(i);s.sort(((e,n)=>i[n].length-i[e].length));let u=6,l=0;for(const e of s){const t=i[e],s=await g(t,n,.001);o===Math.ceil(u/1.5)&&(o=0,l+=5/u,u=Math.ceil(1.5*u));const f=o%u*5/u*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/u+f,a[t[e]]=5*s.embedY[e]/u+l;o++}return{embedX:r,embedY:a}}mergeClusters(e,n,t){const r=e[n],a=e[t];for(let n=0;n<e.length;n++)e[n]===a&&(e[n]=r)}assignClusters(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=Math.pow(10,i),s=new Array(n).fill(-1);for(const n of Object.keys(e))for(const i of Object.keys(e[n]))Math.round(e[n][i]*o)/o>0&&e[n][i]!==Number(n)&&Number(i)>Number(n)&&(r.push(Number(n)),a.push(Number(i)),-1!==s[Number(n)]&&-1!==s[Number(i)]?s[Number(n)]!==s[Number(i)]&&this.mergeClusters(s,Number(n),Number(i)):-1!==s[Number(n)]?s[Number(i)]=s[Number(n)]:-1!==s[Number(i)]?s[Number(n)]=s[Number(i)]:(t++,s[Number(n)]=t,s[Number(i)]=t));for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}assignClustersCSR(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=1/Math.pow(10,i),s=new Array(n).fill(-1),u=new Uint32Array(n+1);let l=0;u[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const u=e.KNNIndexes[n];u<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(u),l++,-1!==s[i]&&-1!==s[u]?s[i]!==s[u]&&this.mergeClusters(s,i,u):-1!==s[i]?s[u]=s[i]:-1!==s[u]?s[i]=s[u]:(t++,s[i]=t,s[u]=t))}u[i+1]=l}for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a),correctedOffsets:u}}toObjectForm(e){const n={};for(let t=0;t<e.i.length;t++)n[e.i[t]]||(n[e.i[t]]={}),n[e.i[t]][e.j[t]]=1-e.distance[t],n[e.j[t]]||(n[e.j[t]]={}),n[e.j[t]][e.i[t]]=1-e.distance[t];return n}addLoops(e,n){for(let t=0;t<n;t++)e[t]||(e[t]={}),e[t][t]=this._options.multFactor}normalize(e){for(const n of Object.keys(e)){const t=e[n];let r=0;for(const e of Object.keys(t))r+=t[e];if(0!==r)for(const a of Object.keys(t))e[n][a]/=r}}expand(e,n){const t={},r=Math.floor(Math.max(Math.log10(n),2))+1,a=Math.pow(10,r);for(let r=0;r<n;r++)if(e[r]){t[r]??(t[r]={});for(let i=r;i<n;i++){if(!e[r]?.[i])continue;const n=this.getExpandValue(e,r,i);Math.round(n*a)/a>0&&(t[r][i]=n,t[i]||(t[i]={}),t[i][r]=n)}}return t}inflate(e){for(const n of Object.keys(e)){const t=e[n];for(const r of Object.keys(t))e[n][r]=Math.pow(e[n][r],this._options.inflateFactor)}}getExpandValue(e,n,t){let r=0;const a=Object.keys(e[n]??{}),i=Object.keys(e[t]??{});for(const o of a)i.includes(o)&&(r+=e[n][o]*e[t][o]);return r}}onmessage=async e=>{const{data:n,threshold:t,weights:r,aggregationMethod:a,distanceFnArgs:i,distanceFns:o,maxIterations:s,useWebGPU:u,inflate:l}=e.data;console.time("sparse matrix");let f=null;if(u)try{f=await p(n,t/100,o,a,r,i)}catch(e){console.error(e)}f||(u&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),f=await(new h._).calcMultiColumn(n,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const c=new E({maxIterations:s??5,inflateFactor:l??2});console.time("MCL");let d=null;if(u)try{d=await c.transformWebGPU(f,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}d||(d=await c.transform(f,n[0].length)),console.timeEnd("MCL"),postMessage({res:d})}},6814:(e,n,t)=>{t.d(n,{cZ:()=>a,kK:()=>r}),t(7862);const r=e=>null==e;function a(e,n,t,r){if(t>e[e.length-1])return;const a=e.findIndex((e=>t<e));e.pop(),e.splice(a,0,t),n.pop(),n.splice(a,0,r)}}},r={};function a(e){var n=r[e];if(void 0!==n)return n.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,a),i.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[590],(()=>a(9295)));return a.O(e)},e=[],a.O=(n,t,r,i)=>{if(!t){var o=1/0;for(f=0;f<e.length;f++){for(var[t,r,i]=e[f],s=!0,u=0;u<t.length;u++)(!1&i||o>=i)&&Object.keys(a.O).every((e=>a.O[e](t[u])))?t.splice(u--,1):(s=!1,i<o&&(o=i));if(s){e.splice(f--,1);var l=r();void 0!==l&&(n=l)}}return n}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[t,r,i]},a.d=(e,n)=>{for(var t in n)a.o(n,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((n,t)=>(a.f[t](e,n),n)),[])),a.u=e=>e+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var n=a.g.document;if(!e&&n&&(n.currentScript&&(e=n.currentScript.src),!e)){var t=n.getElementsByTagName("script");if(t.length)for(var r=t.length-1;r>-1&&!e;)e=t[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=self.location+"";var e={231:1};a.f.i=(n,t)=>{e[n]||importScripts(a.p+a.u(n))};var n=self.webpackChunkeda=self.webpackChunkeda||[],t=n.push.bind(n);n.push=n=>{var[r,i,o]=n;for(var s in i)a.o(i,s)&&(a.m[s]=i[s]);for(o&&o(a);r.length;)e[r.pop()]=1;t(n)}})(),n=a.x,a.x=()=>a.e(590).then(n);var i=a.x();eda=i})();
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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NkJELEVBQW1CL00sS0FBS2lOLEtBQUtGLEdBQzlEQSxFQUFtQi9NLEtBdkJDNEksSUFDbkIsSUFBS2dDLEVBQVVzQyxFQUFhQyxHQUFXdkUsRUFDdkMsSUFBSSxJQUFJd0IsS0FBWThDLEVBQ2hCL0MsRUFBb0JlLEVBQUVnQyxFQUFhOUMsS0FDckNELEVBQW9CTSxFQUFFTCxHQUFZOEMsRUFBWTlDLElBSWhELElBREcrQyxHQUFTQSxFQUFRaEQsR0FDZFMsRUFBUzdWLFFBQ2QrWCxFQUFnQmxDLEVBQVNaLE9BQVMsRUFDbkNnRCxFQUEyQnBFLEVBQUssQyxLdkJuQjdCcFosRUFBTzJhLEVBQW9CWixFQUMvQlksRUFBb0JaLEVBQUksSUFDaEJZLEVBQW9CblksRUFBRSxLQUFLSSxLQUFLNUMsR3dCRHhDLElBQUlrYixFQUFzQlAsRUFBb0JaLEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1hZ2dyZWdhdGlvbi5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9nZXRHUFVEZXZpY2UuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXguanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3ByZXByb2Nlc3Npbmcvd2ViR1BVLXByb2Nlc3MtaW5mby5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML2Jpby1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9jb2x3aXNlLW5vcm1hbGl6ZS5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML2luZmxhdGUtZXhwYW5kLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3VtYXAvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9ub2RlX21vZHVsZXMvaXMtYW55LWFycmF5L2xpYi1lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9tYXJjb3YtY2x1c3Rlci5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9tY2wtd29ya2VyLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9kaXN0YW5jZS1tYXRyaXgvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9lbnN1cmUgY2h1bmsiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZSg1OTApLnRoZW4obmV4dCk7XG59OyIsImZ1bmN0aW9uIGV1Y2xpZGVhbkFnZ3JlZ2F0aW9uV2dzbChhcnJheVNpemUpIHtcbiAgICByZXR1cm4gYFxuICAgICAgICB2YXIgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMHU7IGkgPCAke2FycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICAgIHN1bSA9IHN1bSArIGRpc3RhbmNlc1tpXSAqIGRpc3RhbmNlc1tpXSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV0gKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcXJ0KHN1bSk7XG4gICAgYDtcbn1cbjtcbmZ1bmN0aW9uIG1hbmhhdHRhbkFnZ3JlZ2F0aW9uV2dzbChhcnJheVNpemUpIHtcbiAgICByZXR1cm4gYFxuICAgICAgICB2YXIgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMHU7IGkgPCAke2FycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICAgIHN1bSA9IHN1bSArIGFicyhkaXN0YW5jZXNbaV0pICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIGA7XG59XG5leHBvcnQgdmFyIFdFQkdTTEFHR1JFR0FUSU9OO1xuKGZ1bmN0aW9uIChXRUJHU0xBR0dSRUdBVElPTikge1xuICAgIFdFQkdTTEFHR1JFR0FUSU9OW1wiRVVDTElERUFOXCJdID0gXCJFVUNMSURFQU5cIjtcbiAgICBXRUJHU0xBR0dSRUdBVElPTltcIk1BTkhBVFRBTlwiXSA9IFwiTUFOSEFUVEFOXCI7XG59KShXRUJHU0xBR0dSRUdBVElPTiB8fCAoV0VCR1NMQUdHUkVHQVRJT04gPSB7fSkpO1xuZXhwb3J0IGNvbnN0IFdFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TID0ge1xuICAgIFtXRUJHU0xBR0dSRUdBVElPTi5FVUNMSURFQU5dOiBldWNsaWRlYW5BZ2dyZWdhdGlvbldnc2wsXG4gICAgW1dFQkdTTEFHR1JFR0FUSU9OLk1BTkhBVFRBTl06IG1hbmhhdHRhbkFnZ3JlZ2F0aW9uV2dzbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1hZ2dyZWdhdGlvbi5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4vLyBpbiBhbGwgdGhlIGZ1bmN0aW9ucyBiZWxvdywgdGhlIHZhcmlhYmxlcyBhIGFuZCBiIGFyZSBhc3N1bWVkIHRvIGJlIGFycmF5cyBvZiB1aW50MzIvZjMyXG4vL3ZhbHVlcyB3aGljaCBhcmUgaW5mZXJlZCBmcm9tIHRoZSBjb2RlIHRoaXMgY2h1bmsgaXMgaW5qZWN0ZWQgaW50b1xuLy8gYWxzbywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcHV0ZUluZm8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczpcbi8vIGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXM6IGFycmF5IG9mIGFycmF5cyBvZiB1MzIgY29udGFpbmluZyB0aGUgc2l6ZXMgb2YgdGhlIGVudHJpZXNcbi8vIG90aGVyIGZpZWxkcyBhcmUgc3BlY2lmaWMgdG8gdGhlIGRpc3RhbmNlIGZ1bmN0aW9uIHNob3VsZCBiZSBpbmplY3RlZCBmcm9tIHRoZSBtYWluIHNjcmlwdCB0aGF0IGNhbGxzIHRoaXMgZnVuY3Rpb24sXG4vLyBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgc3VwcGxlbWVudGFyeUluZm8gc3RydWN0XG4vLyBsaWtlIHRoZSBzaW1pbGFyaXR5IG1hdHJpeCBmb3IgbW9ub21lciBjaGVtaWNhbCBkaXN0YW5jZS5cbi8vIHRoZSBnZXRQcm9jZXNzSW5mbyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGNvcnJlY3QgYnVmZmVyIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgc3VwcGxlbWVudGFyeUluZm8sXG4vLyBmb3IgZXZlcnkgZW50cnkgbGlzdFxuLy8gdGhlIG1heERpc3RhbmNlIHZhcmlhYmxlIGlzIGFsc28gYXNzdW1lZCB0byBiZSBhdmFpbGFibGUgaW4gdGhlXG4vLyBzY29wZSBvZiB0aGUgZnVuY3Rpb24sIGluIGNhc2Ugb2Yga25uIGl0IGlzIHRoZSBkaXN0YW5jZSBpbiB0aGUgbGFzdCBwb3N0aW9uIG9mIGtubiBvbiB0aGlzIGluZGV4LFxuLy8gaW4gY2FzZSBvZiBzcGFyc2UgbWF0cml4LCBpdCBjYW4gYmUganVzdCB0aGUgdGhyZXNob2xkIGZvciB0aGUgZGlzdGFuY2UuXG4vLyBoYW1taW5nIGRpc3RhbmNlIGZvciBzZXF1bmVuY2VzIG9mIHVpbnQzMiBhcnJheXMgb2YgbWF4IGxlbmd0aCAke21heEFycmF5U2l6ZX1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVIYW1taW5nKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IHNpemVEaWZmOiB1MzIgPSBtYXhMZW5ndGggLSBtaW5MZW5ndGg7XG4gIFxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpIC0gZjMyKHNpemVEaWZmKTtcblxuICB2YXIgZGlmZjogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke19tYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICBkaWZmID0gZGlmZiArIGYzMihhW2ldICE9IGJbaV0pO1xuICAgICAgaWYgKGRpZmYgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgICAgfVxuICB9XG4gIGRpZmYgKz0gZjMyKHNpemVEaWZmKTtcbiAgcmV0dXJuIGRpZmYgLyAke19tYXhBcnJheVNpemV9O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU1vbm9tZXJDaGVtaWNhbERpc3RhbmNlKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICAvLyBpdCBpcyBhc3N1bWV0IHRoYXQgc3VwcEluZm8gc3RydWN0IGNvbnRhaW5zIGNvcnJlY3QgbWF0cml4IGNhbGxlZCBzaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSwgKHNpbWlsYXJpdHlNYXRyaXgwLCBzaW1pbGFyaXR5TWF0cml4MSwgZXRjKVxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYnkgdGhlIGdldFByb2Nlc3NJbmZvIGZ1bmN0aW9uLlxuICAgIHJldHVybiBgXG4gIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgc2l6ZURpZmY6IHUzMiA9IG1heExlbmd0aCAtIG1pbkxlbmd0aDtcbiAgXG4gIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSkgLSBmMzIoc2l6ZURpZmYpO1xuXG4gIGxldCBzaW1NYXRyaXggPSAmKHN1cHBJbmZvLnNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9KTsgLy8gdXNpbmcgcG9pbnRlcnMgbWFrZSB0aGluZ3MgZmFzdGVyXG4gIHZhciBkaWZmOiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7X21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICAgIGRpZmYgPSBkaWZmICsgMS4wIC0gKCpzaW1NYXRyaXgpW3UzMihhW2ldKV1bdTMyKGJbaV0pXTtcbiAgICAgIGlmIChkaWZmID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICAgIH1cbiAgfVxuICBkaWZmICs9IGYzMihzaXplRGlmZik7XG4gIHJldHVybiBkaWZmIC8gJHtfbWF4QXJyYXlTaXplfTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVMZXZlbnN0ZWluKG1heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuXG4gIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSk7XG5cbiAgLy8gd2Ugd2lsbCBzdG9yZSB0d28gYXJyYXlzIGFzIG1hdHJpeCBhbmQgc3dhcCB0aGUgd29ya2luZyBpbmRpY2VzIHBlciBwYXNzLlxuICAvLyB0aGlzIHdheSB3ZSBjYW4gcmVkdWNlIG1lbW9yeSB1c2FnZSBwZXIgY29tcHV0YXRpb24gdG8ganVzdCBPKGFMZW5ndGgpXG4gIC8vIHRoZSBncmlkIHdpbGwgaGF2ZSBhTGVuZ3RoICsgMSBjb2x1bW5zIGFuZCBiTGVuZ3RoICsgMSByb3dzXG4gIC8vIHRoaXMgd2lsbCBiZSBndWFyYW50ZWVkIGJ5IGl0ZXJhdGlvbiwgYnV0IHRoZSBhcnJheSBzaXplcyBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZSwgc28gd2Ugd2lsbCB1c2UgYSBmaXhlZCBzaXplIG9mIG1heEFycmF5U2l6ZVxuICB2YXIgZHluYW1pY1Bhc3NNYXQ6IGFycmF5PGFycmF5PGYzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+LCAyPjsgLy8gaW5pdGlhbGl6ZSB0byAwXG4gIFxuICB2YXIgcHJldkluZGV4OiB1MzIgPSAwO1xuICB2YXIgY3VySW5kZXg6IHUzMiA9IDE7IC8vIHdlIHdpbGwgc3dhcCB0aGVzZSBpbmRpY2VzIHBlciBwYXNzXG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZmlyc3Qgcm93XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8PSBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2ldID0gZjMyKGkpO1xuICB9XG5cbiAgLy8gaXRlcmF0ZSBvdmVyIHRoZSByb3dzXG4gIGZvciAodmFyIGkgPSAxdTsgaSA8PSBiTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICBkeW5hbWljUGFzc01hdFtjdXJJbmRleF1bMF0gPSBmMzIoaSk7XG4gICAgICB2YXIgbWluRW50cnk6IGYzMiA9IGYzMihtYXhMZW5ndGgpO1xuICAgICAgbGV0IHByZXZSb3cgPSAmZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XTtcbiAgICAgIGxldCBjdXJSb3cgPSAmZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdO1xuICAgICAgbGV0IGJNb24gPSB1MzIoYltpIC0gMV0pO1xuICAgICAgZm9yICh2YXIgaiA9IDF1OyBqIDw9IGFMZW5ndGg7IGogPSBqICsgMXUpIHtcbiAgICAgICAgICB2YXIgY29zdDogZjMyID0gZjMyKGFbaiAtIDFdICE9IGJNb24pO1xuICAgICAgICAgIHZhciByZXM6IGYzMiA9IG1pbihcbiAgICAgICAgICAgICAgbWluKFxuICAgICAgICAgICAgICAgICgqcHJldlJvdylbal0gKyAxLjAsIC8vIGRlbGV0aW9uXG4gICAgICAgICAgICAgICAgKCpjdXJSb3cpW2ogLSAxXSArIDEuMCwgLy8gaW5zZXJ0aW9uXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICgqcHJldlJvdylbaiAtIDFdICsgY29zdCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgKCpjdXJSb3cpW2pdID0gcmVzO1xuICAgICAgICAgIGlmIChyZXMgPCBtaW5FbnRyeSkge1xuICAgICAgICAgICAgICBtaW5FbnRyeSA9IHJlcztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzd2FwIHRoZSBpbmRpY2VzXG4gICAgICBsZXQgdGVtcDogdTMyID0gcHJldkluZGV4O1xuICAgICAgcHJldkluZGV4ID0gY3VySW5kZXg7XG4gICAgICBjdXJJbmRleCA9IHRlbXA7XG4gICAgICBpZiAobWluRW50cnkgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVthTGVuZ3RoXSAvIGYzMihtYXhMZW5ndGgpO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU5lZWRsZW1hbld1bnNjaChtYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICAvLyB2ZXJzaW9uIG9mIHRoZSBsZXZlbnNodGFpbiB3aGVyZSB0aGUgY29zdCBvZiBzdWJzdGl0dXRpb24gaXMgY3VzdG9taXphYmxlXG4gICAgLy8gaXQgaXMgYXNzdW1ldCB0aGF0IHN1cHBJbmZvIHN0cnVjdCBjb250YWlucyBjb3JyZWN0IG1hdHJpeCBjYWxsZWQgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0sIChzaW1pbGFyaXR5TWF0cml4MCwgc2ltaWxhcml0eU1hdHJpeDEsIGV0YylcbiAgICAvLyBhbmQgZ2FwT3BlblBlbmFsdHksIGdhcEV4dGVuc2lvblBlbmFsdHlcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGJ5IHRoZSBnZXRQcm9jZXNzSW5mbyBmdW5jdGlvbi5cbiAgICByZXR1cm4gYFxuICAgICAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgICAgIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gICAgICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gICAgICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIFxuICAgICAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKTtcbiAgICAgIC8vIHdlIHdpbGwgc3RvcmUgdHdvIGFycmF5cyBhcyBtYXRyaXggYW5kIHN3YXAgdGhlIHdvcmtpbmcgaW5kaWNlcyBwZXIgcGFzcy5cbiAgICAgIC8vIHRoaXMgd2F5IHdlIGNhbiByZWR1Y2UgbWVtb3J5IHVzYWdlIHBlciBjb21wdXRhdGlvbiB0byBqdXN0IE8oYUxlbmd0aClcbiAgICAgIC8vIHRoZSBncmlkIHdpbGwgaGF2ZSBhTGVuZ3RoICsgMSBjb2x1bW5zIGFuZCBiTGVuZ3RoICsgMSByb3dzXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgZ3VhcmFudGVlZCBieSBpdGVyYXRpb24sIGJ1dCB0aGUgYXJyYXkgc2l6ZXMgbXVzdCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIHdpbGwgdXNlIGEgZml4ZWQgc2l6ZSBvZiBtYXhBcnJheVNpemVcbiAgICAgIHZhciBkeW5hbWljUGFzc01hdDogYXJyYXk8YXJyYXk8ZjMyLCAke21heEFycmF5U2l6ZSArIDF9dT4sIDI+OyAvLyBpbml0aWFsaXplIHRvIDBcbiAgICAgIFxuICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIG9wZXJhdGlvbiBsZWQgdG8gdGhlIGN1cnJlbnQgY2VsbFxuICAgICAgLy8gaS5lLiB3aGV0aGVyIHdlIGNhbWUgZnJvbSB0aGUgbGVmdCwgdG9wIG9yIGRpYWdvbmFsIHRvIGFzc2lnbiBnYXAgb3Blbi9nYXAgZXh0ZW5kIHBlbmFsdHlcbiAgICAgIHZhciB2ZXJ0aWNhbEdhcHM6IGFycmF5PHUzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+O1xuICAgICAgdmFyIGhvcml6b250YWxHYXBzOiBhcnJheTx1MzIsICR7bWF4QXJyYXlTaXplICsgMX11PjtcblxuICAgICAgbGV0IGdhcE9wZW5QZW5hbHR5OiBmMzIgPSBzdXBwSW5mby5nYXBPcGVuUGVuYWx0eSR7ZW50cnlJbmRleH07XG4gICAgICBsZXQgZ2FwRXh0ZW5zaW9uUGVuYWx0eTogZjMyID0gc3VwcEluZm8uZ2FwRXh0ZW5zaW9uUGVuYWx0eSR7ZW50cnlJbmRleH07XG4gICAgICB2YXIgcHJldkluZGV4OiB1MzIgPSAwO1xuICAgICAgdmFyIGN1ckluZGV4OiB1MzIgPSAxOyAvLyB3ZSB3aWxsIHN3YXAgdGhlc2UgaW5kaWNlcyBwZXIgcGFzc1xuICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZmlyc3Qgcm93XG4gICAgICBmb3IgKHZhciBpID0gMHU7IGkgPD0gYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1baV0gPSBnYXBPcGVuUGVuYWx0eSArIGYzMihpIC0gMSkgKiBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgIGR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XVtpXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIGR5bmFtaWNQYXNzTWF0WzBdWzBdID0gMC4wO1xuXG4gICAgICBsZXQgc2ltTWF0cml4ID0gJnN1cHBJbmZvLnNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9OyAvLyB1c2luZyBwb2ludGVycyBtYWtlIHRoaW5ncyBmYXN0ZXJcbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xuICAgICAgZm9yICh2YXIgaSA9IDF1OyBpIDw9IGJMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICBsZXQgcHJldlJvdyA9ICZkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdO1xuICAgICAgICAgIGxldCBjdXJSb3cgPSAmZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdO1xuICAgICAgICAgICgqY3VyUm93KVswXSA9IGdhcE9wZW5QZW5hbHR5ICsgZjMyKGkgLSAxKSAqIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgdmFyIG1pbkVudHJ5OiBmMzIgPSBmMzIobWF4TGVuZ3RoKTtcbiAgICAgICAgICBsZXQgbW9uQiA9IHUzMihiW2kgLSAxXSk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDF1OyBqIDw9IGFMZW5ndGg7IGogPSBqICsgMXUpIHtcbiAgICAgICAgICAgICAgbGV0IG1vbkEgPSB1MzIoYVtqIC0gMV0pO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgbGV0IGNvc3Q6IGYzMiA9ICgqcHJldlJvdylbaiAtIDFdICsgMWYgLSAoKnNpbU1hdHJpeClbbW9uQV1bbW9uQl07XG4gICAgICAgICAgICAgIHZhciB0b3AgPSAoKnByZXZSb3cpW2pdOyAvLyBkZWxldGlvblxuICAgICAgICAgICAgICBpZiAodmVydGljYWxHYXBzW2pdID4gMCkge1xuICAgICAgICAgICAgICAgICAgdG9wID0gdG9wICsgZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcCArIGdhcE9wZW5QZW5hbHR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBsZWZ0ID0gKCpjdXJSb3cpW2ogLSAxXTsgLy8gaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIGlmIChob3Jpem9udGFsR2Fwc1tqIC0gMV0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCArIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCArIGdhcE9wZW5QZW5hbHR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciByZXM6IGYzMiA9IG1pbihcbiAgICAgICAgICAgICAgICAgIG1pbihcbiAgICAgICAgICAgICAgICAgICAgICB0b3AsIC8vIGRlbGV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdCwgLy8gaW5zZXJ0aW9uXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY29zdCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAoKmN1clJvdylbal0gPSByZXM7XG4gICAgICAgICAgICAgIGlmIChyZXMgPCBtaW5FbnRyeSkge1xuICAgICAgICAgICAgICAgICAgbWluRW50cnkgPSByZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBnYXBzXG4gICAgICAgICAgICAgIGlmIChyZXMgPT0gY29zdCkge1xuICAgICAgICAgICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gMDtcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gbGVmdCkge1xuICAgICAgICAgICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gMDtcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDE7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3dhcCB0aGUgaW5kaWNlc1xuICAgICAgICAgIGxldCB0ZW1wOiB1MzIgPSBwcmV2SW5kZXg7XG4gICAgICAgICAgcHJldkluZGV4ID0gY3VySW5kZXg7XG4gICAgICAgICAgY3VySW5kZXggPSB0ZW1wO1xuICAgICAgICAgIGlmIChtaW5FbnRyeSA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1bYUxlbmd0aF0gLyBmMzIobWF4TGVuZ3RoKTtcbiAgXG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVRXVjbGlkZWFuKG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgZGlzdDogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICBkaXN0ID0gZGlzdCArIGYzMihhW2ldIC0gYltpXSkgKiBmMzIoYVtpXSAtIGJbaV0pO1xuICB9XG4gIHJldHVybiBzcXJ0KGRpc3QpO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU1hbmhhdHRhbihtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIGRpc3Q6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgZGlzdCA9IGRpc3QgKyBhYnMoZjMyKGFbaV0gLSBiW2ldKSk7XG4gIH1cbiAgcmV0dXJuIGRpc3Q7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVT25lSG90RGlzdGFuY2UoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gIGlmIChhTGVuZ3RoICE9IGJMZW5ndGgpIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICBpZihhW2ldICE9IGJbaV0pIHtcbiAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuICB9XG4gIHJldHVybiAwLjA7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTnVtZXJpY0Rpc3RhbmNlKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICAvLyB3ZSBhc3N1bWUgdGhhdCByYW5nZSR7ZW50cnlJbmRleH0gaXMgYXZhaWxhYmxlIGluIHRoZSBzdXBwbGVtZW50YXJ5SW5mbyBzdHJ1Y3RcbiAgICByZXR1cm4gYFxuICAgIGxldCByYW5nZSA9IHN1cHBJbmZvLnJhbmdlJHtlbnRyeUluZGV4fTtcbiAgICByZXR1cm4gZjMyKGFicyhmMzIoYVswXSkgLSBmMzIoYlswXSkpIC8gcmFuZ2UpO1xuICBgO1xufVxuLy8gdGFuaW1vdG8gZGlzdGFuY2UgZm9yIHVpbnQzMiBhcnJheXMgb2YgbGVuZ3RoICR7bWF4QXJyYXlTaXplfVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVVRhbmltb3RvQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG5cbiAgaWYgKG9uQml0c2EgPT0gMHUgJiYgb25CaXRzYiA9PSAwdSkge1xuICAgICAgcmV0dXJuIDAuMDtcbiAgfVxuXG4gIGxldCB0b3RhbE9uQml0cyA9IG9uQml0c2EgKyBvbkJpdHNiO1xuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuXG4gIHJldHVybiAxLjAgLSBmMzIoY29tbW9uQml0cykgLyBmMzIodG90YWxPbkJpdHMgLSBjb21tb25CaXRzKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVBc3ltbWV0cmljQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG4gIGxldCBtaW4gPSBtaW4ob25CaXRzYSwgb25CaXRzYik7XG4gIGlmIChtaW4gPT0gMHUpIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHZhciBjb21tb25CaXRzOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgY29tbW9uQml0cyA9IGNvbW1vbkJpdHMgKyBjb3VudE9uZUJpdHMoYVtpXSAmIGJbaV0pO1xuICB9XG4gIHJldHVybiAxLjAgLSBmMzIoY29tbW9uQml0cykgLyBmMzIobWluKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVDb3NpbmVCaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cbiAgbGV0IHRvdGFsID0gb25CaXRzYSAqIG9uQml0c2I7IC8vIHAucy4gaGVyZSB0b3RhbCBpcyB0YWtlbiBieSBtdWx0aXBseWluZ1xuICBpZiAodG90YWwgPT0gMHUpIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHZhciBjb21tb25CaXRzOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgY29tbW9uQml0cyA9IGNvbW1vbkJpdHMgKyBjb3VudE9uZUJpdHMoYVtpXSAmIGJbaV0pO1xuICB9XG4gIHJldHVybiAxLjAgLSBmMzIoY29tbW9uQml0cykgLyBzcXJ0KGYzMih0b3RhbCkpO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVVNva2FsQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG4gIGxldCB0b3RhbCA9IG9uQml0c2EgKyBvbkJpdHNiO1xuICBpZiAodG90YWwgPT0gMHUpIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHZhciBjb21tb25CaXRzOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgY29tbW9uQml0cyA9IGNvbW1vbkJpdHMgKyBjb3VudE9uZUJpdHMoYVtpXSAmIGJbaV0pO1xuICB9XG4gIHJldHVybiAxLjAgLSBmMzIoY29tbW9uQml0cykgLyBmMzIodG90YWwgKiAyIC0gY29tbW9uQml0cyAqIDMpO1xuICBgO1xufVxuZXhwb3J0IHZhciBXRUJHUFVESVNUQU5DRTtcbihmdW5jdGlvbiAoV0VCR1BVRElTVEFOQ0UpIHtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkhBTU1JTkdcIl0gPSBcIkhhbW1pbmdcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkVVQ0xJREVBTlwiXSA9IFwiRXVjbGlkZWFuXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJNQU5IQVRUQU5cIl0gPSBcIk1hbmhhdHRhblwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiVEFOSU1PVE9cIl0gPSBcIlRhbmltb3RvXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJMRVZFTlNURUlOXCJdID0gXCJMZXZlbnNodGVpblwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTkVFRExFTUFOX1dVTlNDSFwiXSA9IFwiTmVlZGxlbWFubi1XdW5zY2hcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VcIl0gPSBcIk1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2VcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIlNPS0FMXCJdID0gXCJTb2thbFwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiQ09TSU5FXCJdID0gXCJDb3NpbmVcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkFTWU1NRVRSSUNcIl0gPSBcIkFzeW1tZXRyaWNcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkRpZmZlcmVuY2VcIl0gPSBcIkRpZmZlcmVuY2VcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk9uZUhvdFwiXSA9IFwiT25lLUhvdFwiO1xufSkoV0VCR1BVRElTVEFOQ0UgfHwgKFdFQkdQVURJU1RBTkNFID0ge30pKTtcbmV4cG9ydCBjb25zdCB3ZWJHUFVGdW5jdGlvbnMgPSB7XG4gICAgW1dFQkdQVURJU1RBTkNFLkhBTU1JTkddOiB3ZWJHUFVIYW1taW5nLFxuICAgIFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU5dOiB3ZWJHUFVFdWNsaWRlYW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLk1BTkhBVFRBTl06IHdlYkdQVU1hbmhhdHRhbixcbiAgICBbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE9dOiB3ZWJHUFVUYW5pbW90b0JpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOXTogd2ViR1BVTGV2ZW5zdGVpbixcbiAgICBbV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSF06IHdlYkdQVU5lZWRsZW1hbld1bnNjaCxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IHdlYkdQVU1vbm9tZXJDaGVtaWNhbERpc3RhbmNlLFxuICAgIFtXRUJHUFVESVNUQU5DRS5TT0tBTF06IHdlYkdQVVNva2FsQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkNPU0lORV06IHdlYkdQVUNvc2luZUJpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDXTogd2ViR1BVQXN5bW1ldHJpY0JpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXTogd2ViR1BVTnVtZXJpY0Rpc3RhbmNlLFxuICAgIFtXRUJHUFVESVNUQU5DRS5PbmVIb3RdOiB3ZWJHUFVPbmVIb3REaXN0YW5jZVxufTtcbmV4cG9ydCBjb25zdCBkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSA9IHtcbiAgICBbV0VCR1BVRElTVEFOQ0UuSEFNTUlOR106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAzMCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTl06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAzMCksXG4gICAgW1dFQkdQVURJU1RBTkNFLk1BTkhBVFRBTl06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAzMCksXG4gICAgW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuU09LQUxdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5DT1NJTkVdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTl06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgKiBtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0hdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplICogbWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDI1KSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV06IChfbWF4RW50cnlTaXplKSA9PiAxLFxuICAgIFtXRUJHUFVESVNUQU5DRS5PbmVIb3RdOiAoX21heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKF9tYXhFbnRyeVNpemUgLyA0MCksXG59O1xuZXhwb3J0IGNvbnN0IFR5cGVTdXBwb3J0ZWREaXN0YW5jZXMgPSB7XG4gICAgW1wiU1RSSU5HXCIgLyogV0dQVUVOVFJZVFlQRS5TVFJJTkcgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HLCBXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOLCBXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NILCBXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFLCBXRUJHUFVESVNUQU5DRS5PbmVIb3RdKSxcbiAgICBbXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HLCBXRUJHUFVESVNUQU5DRS5FVUNMSURFQU4sIFdFQkdQVURJU1RBTkNFLk1BTkhBVFRBTiwgV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSwgV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTiwgV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCwgV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE8sIFdFQkdQVURJU1RBTkNFLkNPU0lORSwgV0VCR1BVRElTVEFOQ0UuU09LQUwsIFdFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUMsIFdFQkdQVURJU1RBTkNFLk9uZUhvdCwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU4sIFdFQkdQVURJU1RBTkNFLk1BTkhBVFRBTiwgV0VCR1BVRElTVEFOQ0UuT25lSG90LCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU4sIFdFQkdQVURJU1RBTkNFLk1BTkhBVFRBTiwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIk5VTUJFUlwiIC8qIFdHUFVFTlRSWVRZUEUuTlVNQkVSICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJCSVRBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuQklUQVJSQVkgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UTywgV0VCR1BVRElTVEFOQ0UuQ09TSU5FLCBXRUJHUFVESVNUQU5DRS5TT0tBTCwgV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ10pXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcy5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmxldCBncHVBZGFwdGVyID0gbnVsbDtcbmxldCBncHVEZXZpY2UgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdQVURldmljZSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIWdwdUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIC8vcmVhc29uOiBvbmx5IGhlcmUgd2UgZ2V0IHRoZSBncHVBZGFwdGVyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgIGdwdUFkYXB0ZXIgPSB5aWVsZCBuYXZpZ2F0b3IuZ3B1LnJlcXVlc3RBZGFwdGVyKHsgcG93ZXJQcmVmZXJlbmNlOiAnaGlnaC1wZXJmb3JtYW5jZScgfSk7XG4gICAgICAgICAgICBpZiAoZ3B1QWRhcHRlciA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpc0xvc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKGdwdURldmljZSkge1xuICAgICAgICAgICAgZ3B1RGV2aWNlLmxvc3QudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNMb3N0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTApKTsgLy8gd2FpdCB0byBzZWUgaWYgdGhlIGRldmljZSBpcyBsb3N0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFncHVEZXZpY2UgfHwgaXNMb3N0KSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZEJ1ZmZlclNpemUgPSAxMDAwMDAwMDAwOyAvLyB+MTAwME1CXG4gICAgICAgICAgICBjb25zdCBhZGFwdGVyTGltaXRzID0gZ3B1QWRhcHRlci5saW1pdHM7XG4gICAgICAgICAgICBjb25zdCBidWZmZmVyU2l6ZUxpbWl0ID0gYWRhcHRlckxpbWl0cy5tYXhCdWZmZXJTaXplO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZUJ1ZmZlclNpemVMaW1pdCA9IGFkYXB0ZXJMaW1pdHMubWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBncHVEZXZpY2UgPSB5aWVsZCBncHVBZGFwdGVyLnJlcXVlc3REZXZpY2UoeyByZXF1aXJlZExpbWl0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmZmVyU2l6ZTogTWF0aC5taW4oYnVmZmZlclNpemVMaW1pdCwgcmVxdWlyZWRCdWZmZXJTaXplKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZTogTWF0aC5taW4oc3RvcmFnZUJ1ZmZlclNpemVMaW1pdCwgcmVxdWlyZWRCdWZmZXJTaXplKVxuICAgICAgICAgICAgICAgICAgICB9IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIHdpdGggcmVxdWlyZWQgbGltaXRzJywgZSk7XG4gICAgICAgICAgICAgICAgZ3B1RGV2aWNlID0geWllbGQgZ3B1QWRhcHRlci5yZXF1ZXN0RGV2aWNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdQVUFkYXB0ZXJEZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIWdwdUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIC8vIHJlYXNvbjogb25seSBoZXJlIHdlIGdldCB0aGUgZ3B1QWRhcHRlclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICBncHVBZGFwdGVyID0geWllbGQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlcigpO1xuICAgICAgICAgICAgaWYgKGdwdUFkYXB0ZXIgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0geWllbGQgZ3B1QWRhcHRlci5yZXF1ZXN0QWRhcHRlckluZm8oKTtcbiAgICAgICAgaWYgKCFpbmZvKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IG91dFN0cmluZyA9IHJlcGxhY2VFbXB0eVN0cmluZyhpbmZvLmRlc2NyaXB0aW9uLCByZXBsYWNlRW1wdHlTdHJpbmcoaW5mby52ZW5kb3IsICdObyBHUFUgZGVzY3JpcHRpb24gYXZhaWxhYmxlJykpO1xuICAgICAgICByZXR1cm4gb3V0U3RyaW5nO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZUVtcHR5U3RyaW5nKHN0ciwgcmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gIXN0ciB8fCBzdHIgPT0gJycgPyByZXBsYWNlbWVudCA6IHN0cjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEdQVURldmljZS5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFdFQkdTTEFHR1JFR0FUSU9OLCBXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUywgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1hZ2dyZWdhdGlvbic7XG5pbXBvcnQgeyBXRUJHUFVESVNUQU5DRSwgd2ViR1BVRnVuY3Rpb25zLCB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcyc7XG5pbXBvcnQgeyB3ZWJHUFVQcm9jZXNzSW5mbyB9IGZyb20gJy4uL3ByZXByb2Nlc3Npbmcvd2ViR1BVLXByb2Nlc3MtaW5mbyc7XG5pbXBvcnQgeyBnZXRHUFVEZXZpY2UgfSBmcm9tICcuLi9nZXRHUFVEZXZpY2UnO1xuLyoqIGdlbmVyYXRlIHNwYXJzZSBtYXRyaXggYmFzZWQgb24gbGlzdCBvZiBsaXN0cyBvZiBlbnRyaWVzLlxuICogIHRoZXNlIGVudHJpZXMgYXJlIGVhY2ggZW5jb2RlZCBhcyBVaW50MzJBcnJheSBvciBGTE9BVDMyQXJyYXkgKGRlcGVuZGluZyBvbiB0aGVpciB0eXBlKS5cbiAqIGZvciBleGFtcGxlLCBzZXF1ZW5jZXMgd291bGQgYmUgZW5jb2RlZCBhcyBVaW50MzJBcnJheSBiYXNlZCBvbiBjaGFyIGNvZGUgb2YgdGhlIGxldHRlciBhdCBlYWNoIHBvc2l0aW9uLlxuICogWzY1LCA2NiwgNjcsIDY4LCA2OV0gd291bGQgYmUgYSBzZXF1ZW5jZSBvZiA1IGxldHRlcnMuXG4gKiBmb3IgY2hlbWljYWwgZmluZ2VycHJpbnRzLCBpdCB3b3VsZCBiZSBhIGJpbmFyeSBhcnJheSBvZiAwcyBhbmQgMXMsXG4gKiByZXByZXNlbnRlZCBhcyBVaW50MzJBcnJheShfZGF0YSBwcm9wZXJ0eSBvZiBERyBiaXRhcnJheSkuXG4gKlxuICogQmUgd2FyZSB0aGF0IHNpemUgb2YgZW50cnlMaXN0LCBkaXN0YW5jZU1ldHJpY3MsIHdlaWdodHMgYW5kIG9wdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS5cbiAqIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zIGZvciBlbnRyaWVzIGksIHBhc3MgYW4gZW1wdHkgb2JqZWN0LlxuICogZm9yIG5vdyBvcHRpb25zIGFyZSBuZWVkZWQgZm9yXG4gKiBuZWVkbGVtYW4td3Vuc2NoIGFuZCBtb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlczogc2VlIHtAbGluayBCaW9EaXN0YW5jZUZuT3B0aW9uc30gYXMgZm9yIGhvdyBpdCBzaG91bGQgYmUgcGFzc2VkXG4gKiBudW1lcmljIGRpc3RhbmNlcyAoRGlmZmVyZW5jZSk6IHtyYW5nZTogbnVtYmVyfSB3aGVyZSByYW5nZSBpcyB0aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlcyBpbiB0aGUgY29sdW1uIChtYXggLSBtaW4pLlxuICogaW4gYm90aCBjYXNlcywgaWYgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkLCB0aGV5IHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoZW50cnlMaXN0LCAvLyBsaXN0IG9mIGxpc3RzIG9mIGVudHJpZXMsIGZvciBtdWx0aXBsZSBjb2x1bW5zXG50aHJlc2hvbGQgPSAwLjgsIC8vIHNpbWlsYXJpdHkgdGhyZXNob2xkLCBiZSB3YXJlIHRoYXQgaWYgeW91IHVzZSB0b28gc21hbGwgdGhyZXNob2xkLCB0aGVyZSBtaWdodCBiZSBtZW1vcnkgb3ZlcmZsb3cuLi5cbmRpc3RhbmNlTWV0cmljcywgLy8gZGlzdGFuY2UgbWV0cmljcyBmb3IgZWFjaCBjb2x1bW5cbmFnZ3JlZ2F0aW9uRnVuY3Rpb24sIC8vIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgZGlzdGFuY2VzXG53ZWlnaHRzLCAvLyB3ZWlnaHRzIGZvciBlYWNoIGNvbHVtblxub3B0aW9ucyAvLyBzdXBwbGVtZW50YXJ5IG9wdGlvbnMgZm9yIGVhY2ggY29sdW1uXG4pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkZXZpY2UgPSB5aWVsZCBnZXRHUFVEZXZpY2UoKTtcbiAgICAgICAgaWYgKCFkZXZpY2UpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gaWYgbm8gZGV2aWNlLCByZXR1cm4gbnVsbCwgYXMgd2UgY2Fubm90IGRvIGFueXRoaW5nIHdpdGhvdXQgaXQuXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZURpc3RhbmNlTWV0cmljcyA9IE9iamVjdC52YWx1ZXMoV0VCR1BVRElTVEFOQ0UpO1xuICAgICAgICBpZiAoZGlzdGFuY2VNZXRyaWNzLnNvbWUoKG1ldHJpYykgPT4gIWF2YWlsYWJsZURpc3RhbmNlTWV0cmljcy5pbmNsdWRlcyhtZXRyaWMpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkaXN0YW5jZSBtZXRyaWNzIHByb3ZpZGVkOiAnICsgZGlzdGFuY2VNZXRyaWNzLmpvaW4oJywgJykpO1xuICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2dyZWdhdGlvbkZ1bmN0aW9ucyA9IE9iamVjdC52YWx1ZXMoV0VCR1NMQUdHUkVHQVRJT04pO1xuICAgICAgICBpZiAoIWF2YWlsYWJsZUFnZ3JlZ2F0aW9uRnVuY3Rpb25zLmluY2x1ZGVzKGFnZ3JlZ2F0aW9uRnVuY3Rpb24pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkOiAnICsgYWdncmVnYXRpb25GdW5jdGlvbik7XG4gICAgICAgIGNvbnN0IG1heERpc3RhbmNlID0gMSAtIHRocmVzaG9sZDsgLy8gbWF4aW11bSBkaXN0YW5jZVxuICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhhdCBhbGwgdGhlIHN1cHBsZW1lbnRhcnkgb3B0aW9ucyBhcmUgcHJvdmlkZWQgYW5kIGFyZSB0aGUgc2FtZSBsZW5ndGg6XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCAhPT0gZW50cnlMaXN0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggIT09IGRpc3RhbmNlTWV0cmljcy5sZW5ndGggfHxcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcHRpb25zLCB3ZWlndGhzIGFuZCBkaXN0YW5jZSBmdW5jdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBmb3IgZWFjaCBjb2x1bW4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCB0aGUgZW50cnkgbGlzdHMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGxpc3QpID0+IGxpc3QubGVuZ3RoICE9PSBlbnRyeUxpc3RbMF0ubGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIGVudHJ5IGxpc3RzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IG51bU9mQ29sdW1ucyA9IGVudHJ5TGlzdC5sZW5ndGg7IC8vIG51bWJlciBvZiBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGxpc3RTaXplID0gZW50cnlMaXN0WzBdLmxlbmd0aDsgLy8gc2l6ZSBvZiBlYWNoIGxpc3QgKG9yIGNvbHVtbilcbiAgICAgICAgY29uc3QgcHJvY2Vzc0luZm8gPSBlbnRyeUxpc3QubWFwKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdlYkdQVVByb2Nlc3NJbmZvKGVudHJ5LCBkaXN0YW5jZU1ldHJpY3NbaV0sIGksIG9wdGlvbnNbaV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG51bU9mQ29sdW1ucyA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2x1bW5zIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY29sdW1uIG9mIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bU9mQ29sdW1ucyA9PT0gMSlcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uRnVuY3Rpb24gPSBXRUJHU0xBR0dSRUdBVElPTi5NQU5IQVRUQU47IC8vIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgICAgICAvLyBjb21iaW5lIGFsbCBzdHJ1Y3QgdHlwZXMgaW50byBvbmUgdG8gcHV0IGludG8gdGhlIHN1cHBJbmZvIHN0cnVjdC5cbiAgICAgICAgbGV0IHN1cHBJbmZvV2dzbCA9IHByb2Nlc3NJbmZvXG4gICAgICAgICAgICAubWFwKChpbmZvKSA9PiBpbmZvLnN1cHBJbmZvU3RydWN0V2dzbClcbiAgICAgICAgICAgIC5maWx0ZXIoKHdnc2wpID0+ICEhd2dzbCAmJiB3Z3NsICE9ICcnKVxuICAgICAgICAgICAgLmpvaW4oJyxcXG4nKTtcbiAgICAgICAgLy8gc3RydWN0dXJlcyBpbiB3Z3NsIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWVtYmVyLCBzbyBpZiB3ZSBoYXZlIG5vIHN0cnVjdHVyZXMsIHdlIG5lZWQgdG8gYWRkIGEgZHVtbXkgb25lXG4gICAgICAgIGxldCBuZWVkc0R1bW15ID0gZmFsc2U7XG4gICAgICAgIGlmICghc3VwcEluZm9XZ3NsIHx8IHN1cHBJbmZvV2dzbC50cmltKCkgPT0gJycpIHtcbiAgICAgICAgICAgIG5lZWRzRHVtbXkgPSB0cnVlO1xuICAgICAgICAgICAgc3VwcEluZm9XZ3NsID0gJ1xcbmR1bW15OiBmMzJcXG4nO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIGRhdGEgd2dzbCBzdHJ1Y3QgY29kZSBpbnRvIG9uZVxuICAgICAgICBjb25zdCBkYXRhV2dzbCA9IHByb2Nlc3NJbmZvLm1hcCgoaW5mbykgPT4gaW5mby5kYXRhU3RydWN0V2dzbCkuZmlsdGVyKCh3Z3NsKSA9PiAhIXdnc2wgJiYgd2dzbCAhPSAnJykuam9pbignLFxcbicpO1xuICAgICAgICAvLyBjb21iaW5lIGFsbCBhcnJheSBzaXplcyBpbnRvIG9uZSBhcnJheSAoZWFzaWVyIGZvciBzZXR0aW5nKVxuICAgICAgICBjb25zdCBhcnJheVNpemVzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mQ29sdW1ucyAqIGxpc3RTaXplKTtcbiAgICAgICAgcHJvY2Vzc0luZm8uZm9yRWFjaCgoaW5mbywgaSkgPT4ge1xuICAgICAgICAgICAgYXJyYXlTaXplcy5zZXQoaW5mby5hcnJheVNpemVzLCBpICogbGlzdFNpemUpO1xuICAgICAgICB9KTsgLy8gYXJyYXkuZmxhdCBpcyBub3QgYXMgb3B0aW1pemVkIGFzIHRoaXNcbiAgICAgICAgLy8gaWYgd2UgdHJ5IHRvIG1hcCBsYXJnZSBhcnJheXMgZGlyZWN0bHkgZnJvbSBHUFUsIHNvbWV0aW1lcywgZGV2aWNlIGRpc2Nvbm5lY3RzLiBzbyB3ZSBuZWVkIHRvIGRvIGl0IGluIGNodW5rcywgYSBnb29kIG51bWJlclxuICAgICAgICAvLyB3ZSBmb3VuZCBpcyAxMDAwMC4gU28gd2Ugd2lsbCBwZXJmb3JtIGNvbXB1dGF0aW9ucyBpbiBjaHVua3Mgb2YgMTAwMDAuIG1lYW5pbmcgdGhhdCB3ZSB3aWxsIGRpc3BhdGNoIDEwMDAwIHRocmVhZHMgYXQgYSB0aW1lLlxuICAgICAgICBjb25zdCBudW1PZlRocmVhZHMgPSAxMDAwMDtcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbXBsZXhpdHkgb2YgdGhlIGFsZ29yaXRobSwgYXMgdGhlIDEwMCBpcyBsb3cgZW5hdWdoIG51bWJlciwgd2hpY2ggaXMgbGltaXRlZCBieSBtZW1vcnkgdXNhZ2UuXG4gICAgICAgIGNvbnN0IHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgPSAxMDA7IC8vIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciB0aHJlYWQgKG51bWJlciBvZiBwYWlyIGNvbXBhcmlzb25zKVxuICAgICAgICBjb25zdCBjb21iaW5lZENvbXBsZXhpdHkgPSBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLmNvbXBsZXhpdHksIDApOyAvLyBjb21iaW5lZCBjb21wbGV4aXR5IG9mIGFsbCB0aGUgY29sdW1uc1xuICAgICAgICBjb25zdCBtYXhJdGVyYXRpb25zUGVyVGhyZWFkID0gTWF0aC5jZWlsKDEwMDAwIC8gY29tYmluZWRDb21wbGV4aXR5KTsgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXIgdGhyZWFkXG4gICAgICAgIGNvbnN0IHdvcmtHcm91cERpdmlzaW9uID0gMTA7IC8vIGhvdyBtYW55IHRocmVhZHMgaW5zaWRlIG9mIG9uZSB3b3JrZ3JvdXAgZGltZW5zaW9uIChpbiB0aGlzIGNhc2UgMTAgKiAxMCB0aHJlYWRzIHBlciB3b3JrZ3JvdXApXG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJXb3JrZ3JvdXAgPSB3b3JrR3JvdXBEaXZpc2lvbiAqIHdvcmtHcm91cERpdmlzaW9uO1xuICAgICAgICBjb25zdCB3b3JrZ3JvdXBzRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChNYXRoLmNlaWwobnVtT2ZUaHJlYWRzIC8gdGhyZWFkc1Blcldvcmtncm91cCkpKTsgLy8gaG93IG1hbnkgd29ya2dyb3VwcyBwZXIgMmQgZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGdsb2JhbFRocmVhZERpbVNpemUgPSB3b3JrZ3JvdXBzRGltICogd29ya0dyb3VwRGl2aXNpb247IC8vIGhvdyBtYW55IHRocmVhZHMgcGVyIDJkIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgPSBsaXN0U2l6ZSAqIChsaXN0U2l6ZSAtIDEpIC8gMjsgLy8gc2l6ZSBvZiB0aGUgY29uZGVuc2VkIGRpc3RhbmNlIG1hdHJpeCwgdGhpcyBtYW55IGNvbXBhcmlzb25zIHdpbGwgYmUgbWFkZS5cbiAgICAgICAgY29uc3QgZG1DaHVua1NpemVQZXJUaHJlYWQgPSBNYXRoLmNlaWwoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gbnVtT2ZUaHJlYWRzKTsgLy8gaG93IG1hbnkgY29tcGFyaXNvbnMgcGVyIHRocmVhZFxuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnU3BhcnNlIG1hdHJpeCBjb21wdXRlIHNoYWRlcicsXG4gICAgICAgICAgICBjb2RlOiBgXG4gICAgLy8gZWFjaCB0aHJlYWQgd2lsbCBwZXJmb3JtICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0gaXRlcmF0aW9ucyBhdCBvbmUgdGltZSwgY29tcGFyaW5nICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0gcGFpcnMgb2YgZW50cmllcy5cbiAgICAvLyBpbiB0b3RhbCwgZWFjaCB0aHJlYWQgd2lsbCBwZXJmb3JtIGF0IG1vc3QgJHtkbUNodW5rU2l6ZVBlclRocmVhZH0gY29tcGFyaXNvbnMuXG4gICAgLy8gZmlyc3QgaXMgdGhlIHJlc3VsdCBzdHJ1Y3QsIGNvbnRhaW5pbmcgaXMsIGpzLCBhbmQgZGlzdGFuY2VzLiBlYWNoIGFycmF5IHdpdGggbGVuZ3RoIG9mICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0sXG4gICAgLy8gYW5kIGFsc28gaW50ZWdlciBmb3IgaG93IG1hbnkgcGFpcnMgd2VyZSBmb3VuZCB0byBiZSBiZWxvdyB0aHJlc2hvbGQuXG4gICAgc3RydWN0IFNwYXJzZVJlc3VsdCB7XG4gICAgICBpOiBhcnJheTxhcnJheTx1MzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgajogYXJyYXk8YXJyYXk8dTMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGRpc3RhbmNlczogYXJyYXk8YXJyYXk8ZjMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGZvdW5kOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBkb25lOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT5cbiAgICB9XG4gICAgLy8gc3RydWN0IGZvciB0aGUgZGF0YVxuICAgIHN0cnVjdCBDb21wdXRlSW5mbyB7XG4gICAgICAvLyBzdGFydCBhdCBjb2xzIGFuZCByb3dzLCBhbmQgZW5kIGF0IGNvbHMgYW5kIHJvd3MgZm9yIGVhY2ggdGhyZWFkLCB0aGVzZSB3aWxsIGJlIGNhbGN1bGF0ZWQgb24gY3B1IGFuZCBwYXNzZWQgdG8gZ3B1LlxuICAgICAgc3RhcnRBdENvbHM6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIHN0YXJ0QXRSb3dzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBlbmRBdENvbHM6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGVuZEF0Um93czogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuXG4gICAgICAvLyB0aGUgQUNUVUFMTFkgc2l6ZXMgb2YgZWFjaCBlbnRyeVxuICAgICAgZW50cnlTaXplczogYXJyYXk8YXJyYXk8dTMyLCAke2xpc3RTaXplfT4sICR7bnVtT2ZDb2x1bW5zfT4sXG4gICAgICAvLyB0aGUgd2VpZ2h0cyBmb3IgZWFjaCBlbnRyeVxuICAgICAgd2VpZ2h0czogYXJyYXk8ZjMyLCAke251bU9mQ29sdW1uc30+LFxuICAgICAgLy8gdGhlIGRhdGEgZm9yIGVhY2ggZW50cnlcbiAgICAgICR7ZGF0YVdnc2x9IC8vIGFuIGV4YW1wbGUgb2YgdGhlIGRhdGFXZ3NsIHdvdWxkIGJlOlxuICAgICAgLy9kYXRhMDogYXJyYXk8YXJyYXk8dTMyLDIwPiwxMDA+LFxuICAgICAgLy9kYXRhMTogYXJyYXk8YXJyYXk8dTMyLDIwPiwxMDA+XG4gICAgfVxuXG4gICAgLy8gc3RydWN0IGZvciB0aGUgc3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvblxuICAgIHN0cnVjdCBTdXBwSW5mbyB7XG4gICAgICAvLyBzdHJ1Y3QgY29udGFpbmluZyBhbGwgdGhlIHN1cHBsZW1lbnRhcnkgaW5mbywgbGlrZSBzY29yaW5nIG1hdHJpeCwgYWxwaGFiZXQgaW5kZXhlcywgcmFuZ2UsIGV0Yy5cbiAgICAgICR7c3VwcEluZm9XZ3NsfVxuICAgIH07XG5cbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IGNvbXB1dGVJbmZvOiBDb21wdXRlSW5mbztcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHN1cHBJbmZvOiBTdXBwSW5mbztcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHJlc3VsdHM6IFNwYXJzZVJlc3VsdDtcbiAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBEaXZpc2lvbn0sICR7d29ya0dyb3VwRGl2aXNpb259KSBmbiBjYWxjU3BhcnNlTWF0cml4KFxuICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj5cbiAgICApIHtcbiAgICAgICR7bmVlZHNEdW1teSA/IGBsZXQgb3RoZXJEdW1teSA9IHN1cHBJbmZvLmR1bW15ICogMjtgIDogJyd9IC8vIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN1cHBJbmZvIGlzIG5vdCBvcHRpbWl6ZWQgb3V0XG4gICAgICBsZXQgdGhyZWFkQ29sID0gaWQueDtcbiAgICAgIGxldCB0aHJlYWRSb3cgPSBpZC55O1xuICAgICAgbGV0IGxpbmVhckluZGV4ID0gdGhyZWFkUm93ICogJHtnbG9iYWxUaHJlYWREaW1TaXplfSArIHRocmVhZENvbDtcbiAgICAgIGlmIChsaW5lYXJJbmRleCA+PSAke251bU9mVGhyZWFkc30pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcywgcmV0dXJuXG4gICAgICB9ICAgICAgXG4gICAgICB2YXIgc3RhcnRBdENvbDogdTMyID0gY29tcHV0ZUluZm8uc3RhcnRBdENvbHNbbGluZWFySW5kZXhdO1xuICAgICAgdmFyIHN0YXJ0QXRSb3c6IHUzMiA9IGNvbXB1dGVJbmZvLnN0YXJ0QXRSb3dzW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBlbmRBdENvbDogdTMyID0gbWluKGNvbXB1dGVJbmZvLmVuZEF0Q29sc1tsaW5lYXJJbmRleF0sICR7bGlzdFNpemV9dSk7XG4gICAgICBsZXQgZW5kQXRSb3c6IHUzMiA9IG1pbihjb21wdXRlSW5mby5lbmRBdFJvd3NbbGluZWFySW5kZXhdLCAke2xpc3RTaXplfXUpO1xuICAgICAgbGV0IGlzID0gJnJlc3VsdHMuaVtsaW5lYXJJbmRleF07XG4gICAgICBsZXQganMgPSAmcmVzdWx0cy5qW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBkaXN0YW5jZXMgPSAmcmVzdWx0cy5kaXN0YW5jZXNbbGluZWFySW5kZXhdO1xuICAgICAgcmVzdWx0cy5mb3VuZFtsaW5lYXJJbmRleF0gPSAwOyAvLyBpbml0aWFsaXplIHRoZSBmb3VuZCBjb3VudGVyXG4gICAgICB2YXIgZm91bmQ6IHUzMiA9IDA7XG4gICAgICBpZiAocmVzdWx0cy5kb25lW2xpbmVhckluZGV4XSA+IDApIHtcbiAgICAgICAgcmV0dXJuOyAvLyBpZiB3ZSBhcmUgZG9uZSwgcmV0dXJuXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICR7bWF4SXRlcmF0aW9uc1BlclRocmVhZH07IGkrKykge1xuICAgICAgICBpZiAoc3RhcnRBdENvbCA+PSBlbmRBdENvbCAmJiBzdGFydEF0Um93ID49IGVuZEF0Um93KSB7XG4gICAgICAgICAgcmVzdWx0cy5kb25lW2xpbmVhckluZGV4XSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kID49ICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlzdCA9IGNvbWJpbmVkRGlzdGFuY2Uoc3RhcnRBdENvbCwgc3RhcnRBdFJvdyk7XG4gICAgICAgIGlmIChkaXN0IDw9ICR7bWF4RGlzdGFuY2V9KSB7XG4gICAgICAgICAgKCppcylbZm91bmRdID0gc3RhcnRBdENvbDtcbiAgICAgICAgICAoKmpzKVtmb3VuZF0gPSBzdGFydEF0Um93O1xuICAgICAgICAgICgqZGlzdGFuY2VzKVtmb3VuZF0gPSBkaXN0O1xuICAgICAgICAgIGZvdW5kID0gZm91bmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0QXRDb2wgPSBzdGFydEF0Q29sICsgMTtcbiAgICAgICAgaWYgKHN0YXJ0QXRDb2wgPj0gJHtsaXN0U2l6ZX11KSB7XG4gICAgICAgICAgc3RhcnRBdFJvdyArPSAxO1xuICAgICAgICAgIHN0YXJ0QXRDb2wgPSBzdGFydEF0Um93ICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0cy5mb3VuZFtsaW5lYXJJbmRleF0gPSBmb3VuZDtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhcnRBdENvbHMgYW5kIHN0YXJ0QXRSb3dzXG4gICAgICBjb21wdXRlSW5mby5zdGFydEF0Q29sc1tsaW5lYXJJbmRleF0gPSBzdGFydEF0Q29sO1xuICAgICAgY29tcHV0ZUluZm8uc3RhcnRBdFJvd3NbbGluZWFySW5kZXhdID0gc3RhcnRBdFJvdztcblxuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZGlzdGFuY2Ugc2NyaXB0IGZvciBlYWNoIGRpc3RhbmNlIG1ldHJpYyBhbmQgdGhlbiBjb21iaW5lIHRoZW0gaW50byBvbmVcbiAgICAke2dldENvbWJpbmVkRGlzdGFuY2VTY3JpcHQoZGlzdGFuY2VNZXRyaWNzLCBwcm9jZXNzSW5mby5tYXAoKGluZm8pID0+IGluZm8ubWF4RW50cnlMZW4pLCBtYXhEaXN0YW5jZSwgYWdncmVnYXRpb25GdW5jdGlvbil9XG5cblxuICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ3NwYXJzZSBtYXRyaXggY29tcHV0ZSBwaXBlbGluZScsXG4gICAgICAgICAgICBsYXlvdXQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXB1dGU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICAgICAgZW50cnlQb2ludDogJ2NhbGNTcGFyc2VNYXRyaXgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgY29uc3Qgc3RhcnRBdENvbHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgc3RhcnRBdFJvd3MgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgZW5kQXRDb2xzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGVuZEF0Um93cyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIG51bU9mVGhyZWFkcyk7IC8vIHNpemUgb2YgdGhlIGNodW5rIHBlciB0aHJlYWQgKGluIHRvdGFsKVxuICAgICAgICBsZXQgc3RhcnRSb3cgPSAwO1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSAxO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ0dQVXRocmVhZFN0YXJ0cycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9mVGhyZWFkczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpID09PSBudW1PZlRocmVhZHMgLSAxID8gY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC0gMSA6IChpICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICAvLyBmYW5jeSBmb3JtdWxhcyB0byBjYWxjdWxhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGNvbmRlbnNlZCBkaXN0YW5jZSBtYXRyaXggZm9yIGVhY2ggdGhyZWFkIHN0YXJ0XG4gICAgICAgICAgICBjb25zdCBlbmRSb3cgPSBsaXN0U2l6ZSAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZElkeCArIDQgKiBsaXN0U2l6ZSAqIChsaXN0U2l6ZSAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbCA9IGVuZElkeCAtIGxpc3RTaXplICogZW5kUm93ICsgTWF0aC5mbG9vcigoZW5kUm93ICsgMSkgKiAoZW5kUm93ICsgMikgLyAyKTtcbiAgICAgICAgICAgIHN0YXJ0QXRDb2xzW2ldID0gc3RhcnRDb2w7XG4gICAgICAgICAgICBzdGFydEF0Um93c1tpXSA9IHN0YXJ0Um93O1xuICAgICAgICAgICAgZW5kQXRDb2xzW2ldID0gZW5kQ29sO1xuICAgICAgICAgICAgZW5kQXRSb3dzW2ldID0gZW5kUm93O1xuICAgICAgICAgICAgc3RhcnRSb3cgPSBlbmRSb3c7XG4gICAgICAgICAgICBzdGFydENvbCA9IGVuZENvbDtcbiAgICAgICAgICAgIC8vIGNvbnN0IHN0YXJ0Um93ID0gdmFsdWVzWzBdLmxlbmd0aCAtIDIgLSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgLy8gICBNYXRoLnNxcnQoLTggKiBzdGFydElkeCArIDQgKiB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAtIDcpIC8gMiAtIDAuNSk7XG4gICAgICAgICAgICAvLyBjb25zdCBzdGFydENvbCA9IHN0YXJ0SWR4IC0gdmFsdWVzWzBdLmxlbmd0aCAqIHN0YXJ0Um93ICsgTWF0aC5mbG9vcigoc3RhcnRSb3cgKyAxKSAqIChzdGFydFJvdyArIDIpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdHUFV0aHJlYWRTdGFydHMnKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgY29tcHV0ZUluZm8gYnVmZmVyXG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyMzJTaXplID0gbnVtT2ZUaHJlYWRzICogNCArIC8vIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgICAgIGxpc3RTaXplICogbnVtT2ZDb2x1bW5zICsgLy8gZW50cnlTaXplc1xuICAgICAgICAgICAgbnVtT2ZDb2x1bW5zICsgLy8gd2VpZ2h0c1xuICAgICAgICAgICAgcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5zb3VyY2VBcnJheVNpemUsIDApO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSBzdXBwSW5mbyBidWZmZXJcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXIzMlNpemUgPSBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLnN1cHBJbmZvU2l6ZSwgMCk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIHJlc3VsdHMgYnVmZmVyXG4gICAgICAgIGNvbnN0IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSA9IHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKiBudW1PZlRocmVhZHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXIzMlNpemUgPSAzICogc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICsgbnVtT2ZUaHJlYWRzICsgbnVtT2ZUaHJlYWRzOyAvLyBpLCBqLCBkaXN0YW5jZXMsIGZvdW5kLCBkb25lXG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgR1BVIHRvIGhvbGQgY29tcHV0ZUluZm9cbiAgICAgICAgLy8gYmV3YXJlIHRoYXQgc3RydWN0IG11c3QgYmUgcGFkZGVkIHRvIDE2IGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0IGluIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlclNpemUgPSBjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplID0gY29tcHV0ZUluZm9CdWZmZXJTaXplO1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBjb21wdXRlSW5mb0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplICs9IDE2IC0gcmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnY29tcHV0ZSBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIgPSBjb21wdXRlSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpOyAvLyBnZXQgZnVsbCBidWZmZXJcbiAgICAgICAgLy8gZHluYW1pYyBvZmZzZXQgZm9yIHRoZSBjb21wdXRlSW5mbyBidWZmZXJcbiAgICAgICAgbGV0IGNvbXB1dGVJbmZvT2ZmU2V0ID0gMDtcbiAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgY29uc3Qgc3RhcnRBdENvbHNCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBzdGFydEF0Q29sc0J1ZmZlclZpZXcuc2V0KHN0YXJ0QXRDb2xzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBzdGFydEF0Um93c0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIHN0YXJ0QXRSb3dzQnVmZmVyVmlldy5zZXQoc3RhcnRBdFJvd3MpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGVuZEF0Q29sc0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGVuZEF0Q29sc0J1ZmZlclZpZXcuc2V0KGVuZEF0Q29scyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgZW5kQXRSb3dzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgZW5kQXRSb3dzQnVmZmVyVmlldy5zZXQoZW5kQXRSb3dzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICAvLyB0aGVuIHdyaXRlIHRoZSBlbnRyeVNpemVzXG4gICAgICAgIGNvbnN0IGVudHJ5U2l6ZXNWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBhcnJheVNpemVzLmxlbmd0aCk7XG4gICAgICAgIGVudHJ5U2l6ZXNWaWV3LnNldChhcnJheVNpemVzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gYXJyYXlTaXplcy5sZW5ndGggKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIC8vIHRoZW4gd3JpdGUgdGhlIHdlaWdodHNcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1ZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZkNvbHVtbnMpO1xuICAgICAgICB3ZWlnaHRzVmlldy5zZXQod2VpZ2h0cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mQ29sdW1ucyAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIGRhdGEgaXRzZWxmXG4gICAgICAgIGZvciAoY29uc3QgaW5mbyBvZiBwcm9jZXNzSW5mbykge1xuICAgICAgICAgICAgY29uc3QgQXJyYXlDb25zdHJ1Y3RvciA9IGluZm8uRW5jb2RlZEFycmF5Q29uc3RydWN0b3I7XG4gICAgICAgICAgICBjb25zdCBjaHVua1NpemUgPSBpbmZvLnNvdXJjZUFycmF5U2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IEFycmF5Q29uc3RydWN0b3IobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIGNodW5rU2l6ZSk7IC8vbmV3IEFycmF5Q29uc3RydWN0b3IoY29tcHV0ZUluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoY29tcHV0ZUluZm9PZmZTZXQsIGNodW5rQnl0ZVNpemUpKTtcbiAgICAgICAgICAgIGRhdGFWaWV3LnNldChpbmZvLmZsYXRTb3VyY2VBcnJheSk7XG4gICAgICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBjaHVua1NpemUgKiBBcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlIGFyZSBkb25lIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGNvbXB1dGVJbmZvQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgR1BVIHRvIGhvbGQgc3VwcEluZm9cbiAgICAgICAgLy8gc2FtZSBoZXJlLCB3ZSBuZWVkIHRvIHBhZCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0IHRvIDE2IGJ5dGVzXG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyU2l6ZSA9IHN1cHBJbmZvQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgPSBzdXBwSW5mb0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHN1cHBJbmZvUmVtYWluZGVyID0gc3VwcEluZm9CdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHN1cHBJbmZvUmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplICs9IDE2IC0gc3VwcEluZm9SZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgPSBNYXRoLm1heChwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUsIDE2KTtcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3VwcCBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIgPSBzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpOyAvLyBnZXQgZnVsbCBidWZmZXJcbiAgICAgICAgbGV0IHN1cHBJbmZvT2ZmU2V0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIHByb2Nlc3NJbmZvKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5zdXBwSW5mb0J1ZmZlciAmJiBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGggPiAwICYmIGluZm8uc3VwcEluZm9TaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5Q29uc3RydWN0b3IgPSBpbmZvLnN1cHBJbmZvVHlwZSA9PT0gXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi8gPyBVaW50MzJBcnJheSA6IEZsb2F0MzJBcnJheTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXBwSW5mb1ZpZXcgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyLCBzdXBwSW5mb09mZlNldCwgaW5mby5zdXBwSW5mb0J1ZmZlci5sZW5ndGgpOyAvL25ldyBBcnJheUNvbnN0cnVjdG9yKHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKHN1cHBJbmZvT2ZmU2V0LCBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBzdXBwSW5mb1ZpZXcuc2V0KGluZm8uc3VwcEluZm9CdWZmZXIpO1xuICAgICAgICAgICAgICAgIHN1cHBJbmZvT2ZmU2V0ICs9IGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aDsgLy8gaW5mby5zdXBwSW5mb0J1ZmZlci5sZW5ndGggKiBBcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdXBwSW5mb09mZlNldCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZHVtbXlWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIsIDAsIDQpOyAvL25ldyBVaW50MzJBcnJheShzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgwLCAxNikpO1xuICAgICAgICAgICAgZHVtbXlWaWV3LnNldChbMSwgMSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdHNcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlclNpemUgPSByZXN1bHRzQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSA9IHJlc3VsdHNCdWZmZXJTaXplO1xuICAgICAgICBjb25zdCByZXN1bHRzUmVtYWluZGVyID0gcmVzdWx0c0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAocmVzdWx0c1JlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplICs9IDE2IC0gcmVzdWx0c1JlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVzdWx0cyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkNcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNldHVwIGEgYmluZEdyb3VwIHRvIHRlbGwgdGhlIHNoYWRlciB3aGljaFxuICAgICAgICAvLyBidWZmZXIgdG8gdXNlIGZvciB0aGUgY29tcHV0YXRpb25cbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYWJlbDogJ2JpbmRHcm91cCBmb3Igc3BhcnNlIG1hdHJpeCBidWZmZXInLFxuICAgICAgICAgICAgbGF5b3V0OiBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoMCksXG4gICAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAwLCByZXNvdXJjZTogeyBidWZmZXI6IGNvbXB1dGVJbmZvQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDEsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3VwcEluZm9CdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMiwgcmVzb3VyY2U6IHsgYnVmZmVyOiByZXN1bHRzQnVmZmVyIH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICAvL2NvbnN0IHBhaXJDb21wYXJpc29uc1BlclBhc3MgPSBtYXhJdGVyYXRpb25zUGVyVGhyZWFkICogbnVtT2ZUaHJlYWRzO1xuICAgICAgICAvL2NvbnN0IHBhc3NlcyA9IE1hdGguY2VpbChjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBwYWlyQ29tcGFyaXNvbnNQZXJQYXNzKTtcbiAgICAgICAgLy8gd2Ugd2lsbCBkaXN0cGF0Y2ggdGhpcyBtYW55IHBhc3NlcyB0byB0aGUgR1BVLCBhbmQgaXQgd2lsbCBoYW5kbGUgaW5kZXhlcyBhbGwgYnkgaXRzZWxmLlxuICAgICAgICAvLyB3ZSBhbHJlYWR5IGNvcGllZCB0aGUgc3RhcnQvZW5kIGluZm9ybWF0aW9uIHRvIGl0LCBzbyBpdCB3aWxsIGtub3cgd2hlcmUgdG8gc3RhcnQgYW5kIGVuZCBvbiBlYWNoIHBhc3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdHNPdXRCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVzdWx0cyBvdXQgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHJlc3VsdHNCdWZmZXIuc2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0SXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0SnMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0RGlzdGFuY2VzID0gW107XG4gICAgICAgIC8vbGV0IGNvbWJpbmVkRm91bmQgPSAwO1xuICAgICAgICBsZXQgaXNBbGxEb25lID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNBbGxEb25lKSB7XG4gICAgICAgICAgICAvLyBFbmNvZGUgY29tbWFuZHMgdG8gZG8gdGhlIGNvbXB1dGF0aW9uXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2Rpc3RhbmNlIGVuY29kZXInLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwYXNzID0gZW5jb2Rlci5iZWdpbkNvbXB1dGVQYXNzKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2Rpc3RhbmNlIGNvbXB1dGUgcGFzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhc3Muc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICAgICAgcGFzcy5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgICAgIHBhc3MuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtncm91cHNEaW0sIHdvcmtncm91cHNEaW0pO1xuICAgICAgICAgICAgcGFzcy5lbmQoKTtcbiAgICAgICAgICAgIGVuY29kZXIuY29weUJ1ZmZlclRvQnVmZmVyKHJlc3VsdHNCdWZmZXIsIDAsIHJlc3VsdHNPdXRCdWZmZXIsIDAsIHJlc3VsdHNPdXRCdWZmZXIuc2l6ZSk7XG4gICAgICAgICAgICAvLyBGaW5pc2ggZW5jb2RpbmcgYW5kIHN1Ym1pdCB0aGUgY29tbWFuZHNcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRCdWZmZXIgPSBlbmNvZGVyLmZpbmlzaCgpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEJ1ZmZlcl0pO1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzdWx0c1xuICAgICAgICAgICAgeWllbGQgZGV2aWNlLnF1ZXVlLm9uU3VibWl0dGVkV29ya0RvbmUoKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdHNPdXRCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNPdXRBcnJheUJ1ZmZlciA9IHJlc3VsdHNPdXRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3VsdHNcbiAgICAgICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0kgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzSiA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNGb3VuZCA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNEb25lID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICAgICAgaXNBbGxEb25lID0gcmVzdWx0c0RvbmUuZXZlcnkoKGQpID0+IGQgPT09IDEpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxSZXN1bHRzID0gcmVzdWx0c0ZvdW5kLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWRJID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZEogPSBuZXcgVWludDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgbGV0IGNvbWJpbmVkT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHJlc0kgPSAwOyByZXNJIDwgcmVzdWx0c0ZvdW5kLmxlbmd0aDsgcmVzSSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSByZXN1bHRzRm91bmRbcmVzSV07XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZEkuc2V0KHJlc3VsdHNJLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkSi5zZXQocmVzdWx0c0ouc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWREaXN0YW5jZXMuc2V0KHJlc3VsdHNEaXN0YW5jZXMuc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWRPZmZzZXQgKz0gZm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRJcy5wdXNoKGNvbWJpbmVkSSk7XG4gICAgICAgICAgICByZXN1bHRKcy5wdXNoKGNvbWJpbmVkSik7XG4gICAgICAgICAgICByZXN1bHREaXN0YW5jZXMucHVzaChjb21iaW5lZERpc3RhbmNlcyk7XG4gICAgICAgICAgICByZXN1bHRzT3V0QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxTaXplID0gcmVzdWx0SXMucmVkdWNlKChhLCBiKSA9PiBhICsgYi5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBmaW5hbEkgPSBuZXcgVWludDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgY29uc3QgZmluYWxKID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBsZXQgZmluYWxPZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdElzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaW5hbEkuc2V0KHJlc3VsdElzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbEouc2V0KHJlc3VsdEpzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbERpc3RhbmNlcy5zZXQocmVzdWx0RGlzdGFuY2VzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbE9mZnNldCArPSByZXN1bHRJc1tpXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXMgcnVsZSBtYW5kYXRlcywgZGVzdHJveSBhbGwgYnVmZmVycy5cbiAgICAgICAgY29tcHV0ZUluZm9CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJlc3VsdHNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRzT3V0QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHsgaTogZmluYWxJLCBqOiBmaW5hbEosIGRpc3RhbmNlOiBmaW5hbERpc3RhbmNlcyB9O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdChkaXN0YW5jZU1ldHJpY3MsIG1heEVudHJ5TGVucywgbWF4RGlzdGFuY2UsIGFnZ3JlZ2F0aW9uKSB7XG4gICAgY29uc3QgZGlzdGFuY2VXZ3NscyA9IGRpc3RhbmNlTWV0cmljcy5tYXAoKG1ldHJpYywgaSkgPT4ge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICBmbiBkaXN0YW5jZVNjcmlwdCR7aX0oYUluZGV4OiB1MzIsIGJJbmRleDogdTMyKSAtPiBmMzIge1xuICAgICAgICAgIGxldCBhID0gY29tcHV0ZUluZm8uZGF0YSR7aX1bYUluZGV4XTtcbiAgICAgICAgICBsZXQgYiA9IGNvbXB1dGVJbmZvLmRhdGEke2l9W2JJbmRleF07XG4gICAgICAgICAgbGV0IG1heERpc3RhbmNlOiBmMzIgPSAke21heERpc3RhbmNlfTtcbiAgICAgICAgICAke3dlYkdQVUZ1bmN0aW9uc1ttZXRyaWNdKG1heEVudHJ5TGVuc1tpXSwgaSl9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSk7XG4gICAgY29uc3QgYWxsRGlzdGFuY2VTY3JpcHRzID0gZGlzdGFuY2VXZ3Nscy5qb2luKCdcXG4nKTtcbiAgICBjb25zdCBjb21iaW5lRGlzdGFuY2VzU2NyaXB0ID0gYFxuICAgICAgZm4gY29tYmluZWREaXN0YW5jZShhSW5kZXg6IHUzMiwgYkluZGV4OiB1MzIpIC0+IGYzMiB7XG4gICAgICAgIHZhciBkaXN0YW5jZXM6IGFycmF5PGYzMiwgJHtkaXN0YW5jZU1ldHJpY3MubGVuZ3RofT47XG4gICAgICAgICR7ZGlzdGFuY2VNZXRyaWNzLm1hcCgoXywgaSkgPT4gYGRpc3RhbmNlc1ske2l9XSA9IGRpc3RhbmNlU2NyaXB0JHtpfShhSW5kZXgsIGJJbmRleCk7YCkuam9pbignXFxuJyl9XG4gICAgICAgICR7V0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlNbYWdncmVnYXRpb25dKGRpc3RhbmNlTWV0cmljcy5sZW5ndGgpfVxuICAgICAgfVxuICAgIFxuICAgIGA7XG4gICAgcmV0dXJuIGFsbERpc3RhbmNlU2NyaXB0cyArICdcXG4nICsgY29tYmluZURpc3RhbmNlc1NjcmlwdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1zcGFyc2UtbWF0cml4LmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5LCBUeXBlU3VwcG9ydGVkRGlzdGFuY2VzLCBXRUJHUFVESVNUQU5DRSB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcyc7XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVUHJvY2Vzc0luZm8oZW50cnlMaXN0LCBkaXN0YW5jZU1ldHJpYyA9IFdFQkdQVURJU1RBTkNFLkhBTU1JTkcsIGVudHJ5SW5kZXgsIC8vIGluZGV4IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IG9mIGxpc3RzIHRoYXQgd2Ugd2FudCB0byBwcm9jZXNzXG5vcHRpb25zID0geyBnYXBPcGVuUGVuYWx0eTogMS4wLCBnYXBFeHRlbnNpb25QZW5hbHR5OiAwLjYgfSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGVudHJ5VHlwZSA9IG51bGw7XG4gICAgY29uc3QgZW5jb2RlZExpc3QgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IHR5cGVvZiBlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiU1RSSU5HXCIgLyogV0dQVUVOVFJZVFlQRS5TVFJJTkcgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IG5ldyBVaW50MzJBcnJheShlbnRyeS5zcGxpdCgnJykubWFwKChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiB0eXBlb2YgZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIk5VTUJFUlwiIC8qIFdHUFVFTlRSWVRZUEUuTlVNQkVSICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBuZXcgRmxvYXQzMkFycmF5KFtlbnRyeV0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5TGlzdFswXSA9PSAnb2JqZWN0JyAmJiBlbnRyeUxpc3Quc29tZSgoZSkgPT4gJ19kYXRhJyBpbiBlICYmICdfbGVuZ3RoJyBpbiBlKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJCSVRBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuQklUQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IGVudHJ5Ll9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBlbnRyeUxpc3QgYXMgVWludDMyQXJyYXlbXTtcbiAgICB9KSgpO1xuICAgIGlmICghZW5jb2RlZExpc3QgfHwgIWVudHJ5VHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVudHJ5IHR5cGUsIGNvdWxkIG5vdCBkZXRlcm1pbmUgZW50cnkgdHlwZSBmcm9tIGlucHV0IGxpc3QnKTtcbiAgICBjb25zdCBlbmNvZGVkTGlzdFR5cGUgPSBlbmNvZGVkTGlzdFswXSBpbnN0YW5jZW9mIEludDMyQXJyYXkgPyBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi8gOlxuICAgICAgICBlbmNvZGVkTGlzdFswXSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSA/IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi8gOiBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLztcbiAgICAvLyBzaXplcyBvZiBlYWNoIGVudHJpZXMgbWlnaHQgZGlmZmVyLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhhdCBmb3Igc29tZSBkaXN0YW5jZSBtZXRyaWNzLCBsaWtlIGhhbW1pbmcgZm9yIGV4YW1wbGVcbiAgICBjb25zdCBhcnJheVNpemVzID0gbmV3IFVpbnQzMkFycmF5KGVuY29kZWRMaXN0Lm1hcCgoYXJyKSA9PiBhcnIubGVuZ3RoKSk7XG4gICAgaWYgKCFUeXBlU3VwcG9ydGVkRGlzdGFuY2VzW2VudHJ5VHlwZV0gfHwgIVR5cGVTdXBwb3J0ZWREaXN0YW5jZXNbZW50cnlUeXBlXS5oYXMoZGlzdGFuY2VNZXRyaWMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc3RhbmNlIG1ldHJpYyAnJHtkaXN0YW5jZU1ldHJpY30nIG5vdCBzdXBwb3J0ZWQgZm9yIGVudHJ5IHR5cGUgJyR7ZW50cnlUeXBlfSdgKTtcbiAgICBjb25zdCBtYXhFbnRyeUxlbiA9IGFycmF5U2l6ZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XG4gICAgLy8gZ2V0IHRoZSBjb21wbGV4aXR5IG9mIHVzZWQgYWxnb3JpdGhtXG4gICAgY29uc3QgY29tcGxleGl0eSA9IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5W2Rpc3RhbmNlTWV0cmljXShtYXhFbnRyeUxlbik7XG4gICAgY29uc3QgRW5jb2RlZEFycmF5Q29uc3RydWN0b3IgPSBlbmNvZGVkTGlzdFR5cGUgPT09IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLyA/IEludDMyQXJyYXkgOlxuICAgICAgICAoZW5jb2RlZExpc3RUeXBlID09PSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovID8gRmxvYXQzMkFycmF5IDogVWludDMyQXJyYXkpO1xuICAgIGNvbnN0IGZsYXRTb3VyY2VBcnJheSA9IG5ldyBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvcihlbmNvZGVkTGlzdC5sZW5ndGggKiBtYXhFbnRyeUxlbik7XG4gICAgLy8gd2hlbiBzZXR0aW5nLCB3ZSBuZWVkIHRvIHNldCBlYWNoIGFycmF5IGF0IGEgc3BlY2lmaWMgb2Zmc2V0LCB3aGljaCBpcyBjb250cm9sbGVkIGJ5IG1heEFycmF5TGVuIGJlY2F1c2UgZWFjaCBhcnJheSBtaWdodCBoYXZlIGRpZmZlcmVudCBzaXplcy5cbiAgICAvLyB0aGlzIHdheSB3ZSB3aWxsIGdldCBjb3JyZWN0IG1hdHJpeCByZXByZXNlbnRhdGlvbiBpbiB0aGUgY29tcHV0ZSBzaGFkZXJcbiAgICBlbmNvZGVkTGlzdC5mb3JFYWNoKChzZXEsIGkpID0+IHtcbiAgICAgICAgZmxhdFNvdXJjZUFycmF5LnNldChzZXEsIGkgKiBtYXhFbnRyeUxlbik7XG4gICAgfSk7XG4gICAgLy8gTkIhIGFsbCB0aGlzIGJlZm9yZSB0aGUgbGluZSB3YXMgZ2VuZXJpYywgbm93IHdlIG5lZWQgdG8gY2FsY3VsYXRlIHNvbWUgc3BlY2lmaWMgdGhpbmdzIGZvciBzb21lIHNwZWNpZmljIGRpc3RhbmNlIG1ldHJpY3NcbiAgICAvLyBpbml0aWFsaXplIHN1cHAgaW5mbyBsaW5lIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgc2hhZGVyO1xuICAgIGxldCBzdXBwSW5mb1N0cnVjdFdnc2wgPSAnJzsgLy8gdGhlIGNvZGUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgb2Ygc3VwcEluZm9cbiAgICBsZXQgc3VwcEluZm9TaXplID0gMDtcbiAgICBsZXQgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICBsZXQgc3VwcEluZm9CdWZmZXIgPSBudWxsO1xuICAgIGlmIChkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCB8fCBkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSkge1xuICAgICAgICBsZXQgbWF4TW9ub21lckluZGV4ID0gb3B0aW9ucy5zY29yaW5nTWF0cml4ICYmIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzID9cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzKS5yZWR1Y2UoKHByZXYsIG4pID0+IE1hdGgubWF4KHByZXYsIG4uY2hhckNvZGVBdCgwKSksIDApIDogLTE7XG4gICAgICAgIC8vIGdlbmVyYXRlIGRlZmF1bHQgc2ltaWxhcml0eSBtYXRyaXggaWYgaXQgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgIGlmICghb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgfHwgIW9wdGlvbnMuc2NvcmluZ01hdHJpeCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbGF0U291cmNlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdFNvdXJjZUFycmF5W2ldID4gbWF4TW9ub21lckluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYXhNb25vbWVySW5kZXggPSBmbGF0U291cmNlQXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXggPVxuICAgICAgICAgICAgICAgIG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbCgwKSk7XG4gICAgICAgICAgICBvcHRpb25zLmFscGhhYmV0SW5kZXhlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLnNjb3JpbmdNYXRyaXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXhbaV1baV0gPSAxO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzW1N0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaW1pbGFyaXR5TWF0cml4U2l6ZSA9IChtYXhNb25vbWVySW5kZXggKyAxKSAqIChtYXhNb25vbWVySW5kZXggKyAxKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXggPSBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEZsb2F0MzJBcnJheShtYXhNb25vbWVySW5kZXggKyAxKSk7XG4gICAgICAgIC8vIHNldCBkaWFnb25hbCB0byAxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TW9ub21lckluZGV4ICsgMTsgaSsrKVxuICAgICAgICAgICAgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV1baV0gPSAxO1xuICAgICAgICBjb25zdCBhbHBoYWJldEluZGV4ZXMgPSBvcHRpb25zLmFscGhhYmV0SW5kZXhlcztcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYWxwaGFiZXRJbmRleGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIE9iamVjdC5rZXlzKGFscGhhYmV0SW5kZXhlcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBrZXkyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtrZXkuY2hhckNvZGVBdCgwKV1ba2V5Mi5jaGFyQ29kZUF0KDApXSA9XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNba2V5XV1bYWxwaGFiZXRJbmRleGVzW2tleTJdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpbiBtZW1vcnkgbGF5b3V0LCB3ZSB3aWxsIGhhdmUgMiBmbG9hdDMyIHMgZm9yIGdhcE9wZW4gYW5kIGdhcEV4dGVuc2lvbiBwZW5hbHRpZXMsIGFuZCB0aGVuIGYzMiBhcnJheTxhcnJheTxmMzI+PiBmb3Igc2ltaWxhcml0eSBtYXRyaXguXG4gICAgICAgIC8vIGJlY2F1c2Ugb2YgcHJpbWl0aXZlcywgdGhlcmUgd2lsbCBiZSBubyBwYWRkaW5nLCBzbyB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBzaXplIGRpcmVjdGx5XG4gICAgICAgIHN1cHBJbmZvU2l6ZSA9IDIgKyBzaW1pbGFyaXR5TWF0cml4U2l6ZTtcbiAgICAgICAgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgc3VwcEluZm9CdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KHN1cHBJbmZvU2l6ZSk7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyWzBdID0gKF9hID0gb3B0aW9ucy5nYXBPcGVuUGVuYWx0eSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMS4wO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlclsxXSA9IChfYiA9IG9wdGlvbnMuZ2FwRXh0ZW5zaW9uUGVuYWx0eSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMC42O1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VwcEluZm9CdWZmZXIuc2V0KHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wgPSBgXG4gICAgICAgICAgICBnYXBPcGVuUGVuYWx0eSR7ZW50cnlJbmRleH06IGYzMixcbiAgICAgICAgICAgIGdhcEV4dGVuc2lvblBlbmFsdHkke2VudHJ5SW5kZXh9OiBmMzIsXG4gICAgICAgICAgICBzaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fTogYXJyYXk8YXJyYXk8ZjMyLCAke21heE1vbm9tZXJJbmRleCArIDF9PiwgJHttYXhNb25vbWVySW5kZXggKyAxfT5gO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZSkge1xuICAgICAgICAvLyBmb3IgZGlmZmVyZW5jZSwgd2UgbmVlZCByYW5nZSBvZiB2YWx1ZXMgZm9yIG5vcm1hbGl6YXRpb24gb2YgdGhlIGRpZmZlcmVuY2VcbiAgICAgICAgaWYgKCFvcHRpb25zLnJhbmdlIHx8IHR5cGVvZiBvcHRpb25zLnJhbmdlICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJhbmdlIDw9IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGZsYXRTb3VyY2VBcnJheS5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLCBmbGF0U291cmNlQXJyYXlbMF0pO1xuICAgICAgICAgICAgY29uc3QgbWF4ID0gZmxhdFNvdXJjZUFycmF5LnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIGZsYXRTb3VyY2VBcnJheVswXSk7XG4gICAgICAgICAgICBvcHRpb25zLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJhbmdlIDw9IDApXG4gICAgICAgICAgICBvcHRpb25zLnJhbmdlID0gMS4wOyAvLyB0aGlzIG1lYW5zIHRoYXQgYWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUsIGFuZCBhbGwgZGlzdGFuY2VzIHdpbGwgcHJvZHVjZSAwLlxuICAgICAgICBzdXBwSW5mb1NpemUgPSAxO1xuICAgICAgICBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoW29wdGlvbnMucmFuZ2VdKTtcbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gYFxuICAgICAgICAgICAgcmFuZ2Uke2VudHJ5SW5kZXh9OiBmMzJgO1xuICAgIH1cbiAgICBjb25zdCBkYXRhVHlwZVdHU0wgPSBmbGF0U291cmNlQXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ID8gJ2kzMicgOiAoZmxhdFNvdXJjZUFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gJ2YzMicgOiAndTMyJyk7XG4gICAgY29uc3QgZGF0YVN0cnVjdFdnc2wgPSBgZGF0YSR7ZW50cnlJbmRleH06IGFycmF5PGFycmF5PCR7ZGF0YVR5cGVXR1NMfSwgJHttYXhFbnRyeUxlbn0+LCAke2VuY29kZWRMaXN0Lmxlbmd0aH0+YDtcbiAgICAvLyBmb3Igbm93LCBvdGhlciBkaXN0YW5jZXMgZG8gbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHNvIHdlIGNhbiBza2lwIHRoYXRcbiAgICByZXR1cm4ge1xuICAgICAgICBmbGF0U291cmNlQXJyYXksXG4gICAgICAgIHNvdXJjZUFycmF5U2l6ZTogZmxhdFNvdXJjZUFycmF5Lmxlbmd0aCxcbiAgICAgICAgbWF4RW50cnlMZW4sXG4gICAgICAgIGFycmF5U2l6ZXMsXG4gICAgICAgIGNvbXBsZXhpdHksXG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLFxuICAgICAgICBzdXBwSW5mb1NpemUsXG4gICAgICAgIHN1cHBJbmZvVHlwZTogc3VwcEluZm9UeXBlLFxuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wsXG4gICAgICAgIGVudHJ5VHlwZSxcbiAgICAgICAgZGF0YVR5cGVXR1NMLFxuICAgICAgICBkYXRhU3RydWN0V2dzbCxcbiAgICAgICAgRW5jb2RlZEFycmF5Q29uc3RydWN0b3JcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLXByb2Nlc3MtaW5mby5qcy5tYXAiLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gYmlvTGF5b3V0KGNsdXN0ZXIsIHNwYXJzZU9iamVjdCwgdGhyZXNob2xkKSB7XG4gICAgY29uc3QgbiA9IGNsdXN0ZXIubGVuZ3RoO1xuICAgIGNvbnN0IGlzID0gW107XG4gICAgY29uc3QganMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjbHVzdGVyW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IGNsdXN0ZXJbal07XG4gICAgICAgICAgICBpZiAoc3BhcnNlT2JqZWN0W2FdPy5bYl0gPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzLCBqcywgY2x1c3Rlcik7XG59XG5mdW5jdGlvbiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzLCBqcywgY2x1c3Rlcikge1xuICAgIGNvbnN0IGVtYmVkWCA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCkubWFwKCgpID0+IE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKS5tYXAoKCkgPT4gTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICBjb25zdCBpdGVyYXRpb25zID0gMTAwO1xuICAgIGNvbnN0IHhWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCB5VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGVtcGVyYXR1cmUgPSAoMSAtIGkgLyBpdGVyYXRpb25zKTtcbiAgICAgICAgeFZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICAgICAgeVZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgaXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYSA9IGlzW2lkeF07XG4gICAgICAgICAgICBjb25zdCBiID0ganNbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gZW1iZWRYW2FdIC0gZW1iZWRYW2JdO1xuICAgICAgICAgICAgY29uc3QgZHkgPSBlbWJlZFlbYV0gLSBlbWJlZFlbYl07XG4gICAgICAgICAgICAvLyAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgICAgICAgIC8vICAgY29uc3QgZmFjdG9yID0gKGRpc3RhbmNlIC0gMSkgLyBkaXN0YW5jZTtcbiAgICAgICAgICAgIC8vICAgY29uc3Qgb2Zmc2V0WCA9IGR4ICogZmFjdG9yO1xuICAgICAgICAgICAgLy8gICBjb25zdCBvZmZzZXRZID0gZHkgKiBmYWN0b3I7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHgpID49IDEpIHtcbiAgICAgICAgICAgICAgICB4VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICAgICAgICAgIHhWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHkpID49IDEpIHtcbiAgICAgICAgICAgICAgICB5VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR5O1xuICAgICAgICAgICAgICAgIHlWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgIGVtYmVkWVthXSArPSBvZmZzZXRZICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICAvLyAgIGVtYmVkWVtiXSAtPSBvZmZzZXRZICogdGVtcGVyYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2ZWNTaXplID0gTWF0aC5zcXJ0KHhWZWxvY2l0aWVzW2lkeF0gKiB4VmVsb2NpdGllc1tpZHhdICsgeVZlbG9jaXRpZXNbaWR4XSAqIHlWZWxvY2l0aWVzW2lkeF0pO1xuICAgICAgICAgICAgaWYgKHZlY1NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRYW2lkeF0gKz0geFZlbG9jaXRpZXNbaWR4XSAvIHZlY1NpemUgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgICAgICBlbWJlZFlbaWR4XSArPSB5VmVsb2NpdGllc1tpZHhdIC8gdmVjU2l6ZSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG5vcm1hbGl6ZVxuICAgIGxldCBtaW5YID0gZW1iZWRYWzBdO1xuICAgIGxldCBtaW5ZID0gZW1iZWRZWzBdO1xuICAgIGxldCBtYXhYID0gZW1iZWRYWzBdO1xuICAgIGxldCBtYXhZID0gZW1iZWRZWzBdO1xuICAgIGZvciAobGV0IGlkeCA9IDE7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYW2lkeF0pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZW1iZWRZW2lkeF0pO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYW2lkeF0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZW2lkeF0pO1xuICAgIH1cbiAgICBsZXQgcmFuZ2VYID0gbWF4WCAtIG1pblg7XG4gICAgbGV0IHJhbmdlWSA9IG1heFkgLSBtaW5ZO1xuICAgIGlmIChyYW5nZVggPT09IDApXG4gICAgICAgIHJhbmdlWCA9IG1heFg7XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKVxuICAgICAgICBlbWJlZFhbaWR4XSA9IChlbWJlZFhbaWR4XSAtIG1pblgpIC8gcmFuZ2VYIC8gMiArIDAuNTtcbiAgICBpZiAocmFuZ2VZID09PSAwKVxuICAgICAgICByYW5nZVkgPSBtYXhZO1xuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICAgICAgZW1iZWRZW2lkeF0gPSAoZW1iZWRZW2lkeF0gLSBtaW5ZKSAvIHJhbmdlWSAvIDIgKyAwLjU7XG4gICAgcmV0dXJuIHsgZW1iZWRYLCBlbWJlZFkgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaVltbHZMV3hoZVc5MWRDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW1KcGJ5MXNZWGx2ZFhRdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJSVUVzVFVGQlRTeERRVUZETEV0QlFVc3NWVUZCVlN4VFFVRlRMRU5CUVVNc1QwRkJhVUlzUlVGQlJTeFpRVUZuUXl4RlFVRkZMRk5CUVdsQ08wbEJRM0JITEUxQlFVMHNRMEZCUXl4SFFVRkhMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU03U1VGRGVrSXNUVUZCVFN4RlFVRkZMRWRCUVdFc1JVRkJSU3hEUVVGRE8wbEJRM2hDTEUxQlFVMHNSVUZCUlN4SFFVRmhMRVZCUVVVc1EwRkJRenRKUVVONFFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUXpGQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsQ0xFMUJRVTBzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOeVFpeE5RVUZOTEVOQlFVTXNSMEZCUnl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGNrSXNTVUZCU1N4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4VFFVRlRMRVZCUVVVN1owSkJRM0pETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlExZ3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dGhRVU5hTzFOQlEwWTdTMEZEUmp0SlFVTkVMRTlCUVU4c2JVSkJRVzFDTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hQUVVGUExFTkJRVU1zUTBGQlF6dEJRVU01UXl4RFFVRkRPMEZCUlVRc1UwRkJVeXh0UWtGQmJVSXNRMEZCUXl4RlFVRlpMRVZCUVVVc1JVRkJXU3hGUVVGRkxFOUJRV2xDTzBsQlEzaEZMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRKUVVOMFJpeE5RVUZOTEUxQlFVMHNSMEZCUnl4SlFVRkpMRmxCUVZrc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFZEJRVWNzUlVGQlJTeERRVUZETEVOQlFVTTdTVUZEZEVZc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETzBsQlEzWkNMRTFCUVUwc1YwRkJWeXhIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZETjBRc1RVRkJUU3hYUVVGWExFZEJRVWNzU1VGQlNTeFpRVUZaTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTTNSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1ZVRkJWU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFGQlEyNURMRTFCUVUwc1YwRkJWeXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1EwRkJRenRSUVVONlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JDTEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGNFSXNTMEZCU3l4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFVkJRVVVzUjBGQlJ5eEhRVUZITEVWQlFVVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRkxFVkJRVVU3V1VGRGVFTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEyeENMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTnNRaXhOUVVGTkxFVkJRVVVzUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEycERMRTFCUVUwc1JVRkJSU3hIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGFrTXNiVVJCUVcxRU8xbEJRMjVFTERoRFFVRTRRenRaUVVNNVF5eHBRMEZCYVVNN1dVRkRha01zYVVOQlFXbERPMWxCUTJwRExFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVU3WjBKQlEzSkNMRmRCUVZjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFhRVUZYTEVkQlFVY3NSVUZCUlN4RFFVRkRPMmRDUVVOdVF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1YwRkJWeXhIUVVGSExFVkJRVVVzUTBGQlF6dGhRVU53UXp0WlFVTkVMRWxCUVVrc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVN1owSkJRM0pDTEZkQlFWY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hYUVVGWExFZEJRVWNzUlVGQlJTeERRVUZETzJkQ1FVTnVReXhYUVVGWExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NWMEZCVnl4SFFVRkhMRVZCUVVVc1EwRkJRenRoUVVOd1F6dFpRVU5JTEhkRFFVRjNRenRaUVVONFF5eDNRMEZCZDBNN1UwRkRka003VVVGRFJDeExRVUZMTEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSU3hIUVVGSExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSVHRaUVVNM1F5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4WFFVRlhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzVjBGQlZ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRmRCUVZjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEzSkhMRWxCUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzVjBGQlZ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRTlCUVU4c1IwRkJSeXhYUVVGWExFTkJRVU03WjBKQlEzaEVMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeFhRVUZYTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1QwRkJUeXhIUVVGSExGZEJRVmNzUTBGQlF6dGhRVU42UkR0VFFVTkdPMHRCUTBZN1NVRkZSQ3haUVVGWk8wbEJRMW9zU1VGQlNTeEpRVUZKTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pDTEVsQlFVa3NTVUZCU1N4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU55UWl4SlFVRkpMRWxCUVVrc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEY2tJc1NVRkJTU3hKUVVGSkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNKQ0xFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZPMUZCUXpkRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTnVReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEYmtNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEyNURMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dExRVU53UXp0SlFVTkVMRWxCUVVrc1RVRkJUU3hIUVVGSExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTTdTVUZEZWtJc1NVRkJTU3hOUVVGTkxFZEJRVWNzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXp0SlFVTjZRaXhKUVVGSkxFMUJRVTBzUzBGQlN5eERRVUZETzFGQlEyUXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJRenRKUVVOb1FpeExRVUZMTEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSU3hIUVVGSExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRVZCUVVVN1VVRkRNME1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRTFCUVUwc1IwRkJSeXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzBsQlEzaEVMRWxCUVVrc1RVRkJUU3hMUVVGTExFTkJRVU03VVVGRFpDeE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUTJoQ0xFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlR0UlFVTXpReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NUVUZCVFN4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03U1VGRmVFUXNUMEZCVHl4RlFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVU1zUTBGQlF6dEJRVU14UWl4RFFVRkRJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1I5SUdaeWIyMGdKeTR2ZEhsd1pYTW5PMXh1WEc1bGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdZbWx2VEdGNWIzVjBLR05zZFhOMFpYSTZJRzUxYldKbGNsdGRMQ0J6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dkR2h5WlhOb2IyeGtPaUJ1ZFcxaVpYSXBJSHRjYmlBZ1kyOXVjM1FnYmlBOUlHTnNkWE4wWlhJdWJHVnVaM1JvTzF4dUlDQmpiMjV6ZENCcGN6b2diblZ0WW1WeVcxMGdQU0JiWFR0Y2JpQWdZMjl1YzNRZ2FuTTZJRzUxYldKbGNsdGRJRDBnVzEwN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmpzZ2FTc3JLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SUdrZ0t5QXhPeUJxSUR3Z2Jqc2dhaXNyS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JoSUQwZ1kyeDFjM1JsY2x0cFhUdGNiaUFnSUNBZ0lHTnZibk4wSUdJZ1BTQmpiSFZ6ZEdWeVcycGRPMXh1SUNBZ0lDQWdhV1lnS0hOd1lYSnpaVTlpYW1WamRGdGhYVDh1VzJKZElENDlJSFJvY21WemFHOXNaQ2tnZTF4dUlDQWdJQ0FnSUNCcGN5NXdkWE5vS0drcE8xeHVJQ0FnSUNBZ0lDQnFjeTV3ZFhOb0tHb3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z1oyVjBUR0Y1YjNWMFJXMWlaV1JrYVc1bmN5aHBjeXdnYW5Nc0lHTnNkWE4wWlhJcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUk1ZWGx2ZFhSRmJXSmxaR1JwYm1kektHbHpPaUJ1ZFcxaVpYSmJYU3dnYW5NNklHNTFiV0psY2x0ZExDQmpiSFZ6ZEdWeU9pQnVkVzFpWlhKYlhTa2dlMXh1SUNCamIyNXpkQ0JsYldKbFpGZ2dQU0J1WlhjZ1JteHZZWFF6TWtGeWNtRjVLR05zZFhOMFpYSXViR1Z1WjNSb0tTNW1hV3hzS0RBcExtMWhjQ2dvS1NBOVBpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ01UQXBPMXh1SUNCamIyNXpkQ0JsYldKbFpGa2dQU0J1WlhjZ1JteHZZWFF6TWtGeWNtRjVLR05zZFhOMFpYSXViR1Z1WjNSb0tTNW1hV3hzS0RBcExtMWhjQ2dvS1NBOVBpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ01UQXBPMXh1SUNCamIyNXpkQ0JwZEdWeVlYUnBiMjV6SUQwZ01UQXdPMXh1SUNCamIyNXpkQ0I0Vm1Wc2IyTnBkR2xsY3lBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1kyeDFjM1JsY2k1c1pXNW5kR2dwTG1acGJHd29NQ2s3WEc0Z0lHTnZibk4wSUhsV1pXeHZZMmwwYVdWeklEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaGpiSFZ6ZEdWeUxteGxibWQwYUNrdVptbHNiQ2d3S1R0Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JwZEdWeVlYUnBiMjV6T3lCcEt5c3BJSHRjYmlBZ0lDQmpiMjV6ZENCMFpXMXdaWEpoZEhWeVpTQTlJQ2d4SUMwZ2FTQXZJR2wwWlhKaGRHbHZibk1wTzF4dUlDQWdJSGhXWld4dlkybDBhV1Z6TG1acGJHd29NQ2s3WEc0Z0lDQWdlVlpsYkc5amFYUnBaWE11Wm1sc2JDZ3dLVHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnBaSGdnUFNBd095QnBaSGdnUENCcGN5NXNaVzVuZEdnN0lHbGtlQ3NyS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JoSUQwZ2FYTmJhV1I0WFR0Y2JpQWdJQ0FnSUdOdmJuTjBJR0lnUFNCcWMxdHBaSGhkTzF4dUlDQWdJQ0FnWTI5dWMzUWdaSGdnUFNCbGJXSmxaRmhiWVYwZ0xTQmxiV0psWkZoYllsMDdYRzRnSUNBZ0lDQmpiMjV6ZENCa2VTQTlJR1Z0WW1Wa1dWdGhYU0F0SUdWdFltVmtXVnRpWFR0Y2JpQWdJQ0FnSUM4dklDQWdZMjl1YzNRZ1pHbHpkR0Z1WTJVZ1BTQk5ZWFJvTG5OeGNuUW9aSGdnS2lCa2VDQXJJR1I1SUNvZ1pIa3BPMXh1SUNBZ0lDQWdMeThnSUNCamIyNXpkQ0JtWVdOMGIzSWdQU0FvWkdsemRHRnVZMlVnTFNBeEtTQXZJR1JwYzNSaGJtTmxPMXh1SUNBZ0lDQWdMeThnSUNCamIyNXpkQ0J2Wm1aelpYUllJRDBnWkhnZ0tpQm1ZV04wYjNJN1hHNGdJQ0FnSUNBdkx5QWdJR052Ym5OMElHOW1abk5sZEZrZ1BTQmtlU0FxSUdaaFkzUnZjanRjYmlBZ0lDQWdJR2xtSUNoTllYUm9MbUZpY3loa2VDa2dQajBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQjRWbVZzYjJOcGRHbGxjMXRoWFNBdFBTQjBaVzF3WlhKaGRIVnlaU0FxSUdSNE8xeHVJQ0FnSUNBZ0lDQjRWbVZzYjJOcGRHbGxjMXRpWFNBclBTQjBaVzF3WlhKaGRIVnlaU0FxSUdSNE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWWdLRTFoZEdndVlXSnpLR1I1S1NBK1BTQXhLU0I3WEc0Z0lDQWdJQ0FnSUhsV1pXeHZZMmwwYVdWelcyRmRJQzA5SUhSbGJYQmxjbUYwZFhKbElDb2daSGs3WEc0Z0lDQWdJQ0FnSUhsV1pXeHZZMmwwYVdWelcySmRJQ3M5SUhSbGJYQmxjbUYwZFhKbElDb2daSGs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdMeThnSUNCbGJXSmxaRmxiWVYwZ0t6MGdiMlptYzJWMFdTQXFJSFJsYlhCbGNtRjBkWEpsTzF4dUlDQWdJQzh2SUNBZ1pXMWlaV1JaVzJKZElDMDlJRzltWm5ObGRGa2dLaUIwWlcxd1pYSmhkSFZ5WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdabTl5SUNoc1pYUWdhV1I0SUQwZ01Ec2dhV1I0SUR3Z1kyeDFjM1JsY2k1c1pXNW5kR2c3SUdsa2VDc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQjJaV05UYVhwbElEMGdUV0YwYUM1emNYSjBLSGhXWld4dlkybDBhV1Z6VzJsa2VGMGdLaUI0Vm1Wc2IyTnBkR2xsYzF0cFpIaGRJQ3NnZVZabGJHOWphWFJwWlhOYmFXUjRYU0FxSUhsV1pXeHZZMmwwYVdWelcybGtlRjBwTzF4dUlDQWdJQ0FnYVdZZ0tIWmxZMU5wZW1VZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXRnRwWkhoZElDczlJSGhXWld4dlkybDBhV1Z6VzJsa2VGMGdMeUIyWldOVGFYcGxJQ29nZEdWdGNHVnlZWFIxY21VN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV1Z0cFpIaGRJQ3M5SUhsV1pXeHZZMmwwYVdWelcybGtlRjBnTHlCMlpXTlRhWHBsSUNvZ2RHVnRjR1Z5WVhSMWNtVTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnYm05eWJXRnNhWHBsWEc0Z0lHeGxkQ0J0YVc1WUlEMGdaVzFpWldSWVd6QmRPMXh1SUNCc1pYUWdiV2x1V1NBOUlHVnRZbVZrV1Zzd1hUdGNiaUFnYkdWMElHMWhlRmdnUFNCbGJXSmxaRmhiTUYwN1hHNGdJR3hsZENCdFlYaFpJRDBnWlcxaVpXUlpXekJkTzF4dUlDQm1iM0lnS0d4bGRDQnBaSGdnUFNBeE95QnBaSGdnUENCamJIVnpkR1Z5TG14bGJtZDBhRHNnYVdSNEt5c3BJSHRjYmlBZ0lDQnRhVzVZSUQwZ1RXRjBhQzV0YVc0b2JXbHVXQ3dnWlcxaVpXUllXMmxrZUYwcE8xeHVJQ0FnSUcxcGJsa2dQU0JOWVhSb0xtMXBiaWh0YVc1WkxDQmxiV0psWkZsYmFXUjRYU2s3WEc0Z0lDQWdiV0Y0V0NBOUlFMWhkR2d1YldGNEtHMWhlRmdzSUdWdFltVmtXRnRwWkhoZEtUdGNiaUFnSUNCdFlYaFpJRDBnVFdGMGFDNXRZWGdvYldGNFdTd2daVzFpWldSWlcybGtlRjBwTzF4dUlDQjlYRzRnSUd4bGRDQnlZVzVuWlZnZ1BTQnRZWGhZSUMwZ2JXbHVXRHRjYmlBZ2JHVjBJSEpoYm1kbFdTQTlJRzFoZUZrZ0xTQnRhVzVaTzF4dUlDQnBaaUFvY21GdVoyVllJRDA5UFNBd0tWeHVJQ0FnSUhKaGJtZGxXQ0E5SUcxaGVGZzdYRzRnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJR05zZFhOMFpYSXViR1Z1WjNSb095QnBaSGdyS3lsY2JpQWdJQ0JsYldKbFpGaGJhV1I0WFNBOUlDaGxiV0psWkZoYmFXUjRYU0F0SUcxcGJsZ3BJQzhnY21GdVoyVllJQzhnTWlBcklEQXVOVHRjYmlBZ2FXWWdLSEpoYm1kbFdTQTlQVDBnTUNsY2JpQWdJQ0J5WVc1blpWa2dQU0J0WVhoWk8xeHVJQ0JtYjNJZ0tHeGxkQ0JwWkhnZ1BTQXdPeUJwWkhnZ1BDQmpiSFZ6ZEdWeUxteGxibWQwYURzZ2FXUjRLeXNwWEc0Z0lDQWdaVzFpWldSWlcybGtlRjBnUFNBb1pXMWlaV1JaVzJsa2VGMGdMU0J0YVc1WktTQXZJSEpoYm1kbFdTQXZJRElnS3lBd0xqVTdYRzVjYmlBZ2NtVjBkWEp1SUh0bGJXSmxaRmdzSUdWdFltVmtXWDA3WEc1OVhHNGlYWDA9IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIGNvbHdpc2Ugbm9ybWFsaXplIHRoZSBrbm4gc2ltaWxhcml0aWVzXG4gKiBCRSBXQVJFLCBtb2RpZmllcyB0aGUgaW5wdXQgYXJyYXkgaW4gcGxhY2VcbiAqIEBwYXJhbSBkZXZpY2VcbiAqIEBwYXJhbSBrbm5TaW1pbGFyaXRpZXNcbiAqIEBwYXJhbSBvZmZzZXRzXG4gKiBAcGFyYW0gblJvd3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZShkZXZpY2UsIGtublNpbWlsYXJpdGllcywgb2Zmc2V0cywgblJvd3MpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBuZWVkZWRUaHJlYWRzID0gblJvd3M7XG4gICAgICAgIGNvbnN0IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gPSAxMDtcbiAgICAgICAgY29uc3QgdG90YWxXb3JrZ3JvdXBUaHJlYWRzID0gd29ya0dyb3VwVGhyZWFkc1BlckRpbSAqIHdvcmtHcm91cFRocmVhZHNQZXJEaW07XG4gICAgICAgIGNvbnN0IG5lZWRlZFdvcmtHcm91cHMgPSBNYXRoLmNlaWwobmVlZGVkVGhyZWFkcyAvIHRvdGFsV29ya2dyb3VwVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IHdvcmtHcm91cERpbSA9IE1hdGguY2VpbChNYXRoLnNxcnQobmVlZGVkV29ya0dyb3VwcykpO1xuICAgICAgICBjb25zdCB0aHJlYWRzUGVyRGltID0gd29ya0dyb3VwVGhyZWFkc1BlckRpbSAqIHdvcmtHcm91cERpbTtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2NvbHdpc2Utbm9ybWFsaXplJyxcbiAgICAgICAgICAgIGNvZGU6IGBcbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBrbm5TaW1pbGFyaXRpZXMgOiBhcnJheTxmMzI+O1xuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2UsIHJlYWQ+IG9mZnNldHMgOiBhcnJheTx1MzI+O1xuICAgICAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSwgJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSkgZm4gbm9ybWFsaXplKFxuICAgICAgICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj4sXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gaWQueDtcbiAgICAgICAgICAgIGxldCBjb2wgPSBpZC55O1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcm93ICogJHt0aHJlYWRzUGVyRGltfSArIGNvbDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAke25Sb3dzfSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvZmZzZXRCZWdpbiA9IG9mZnNldHNbaW5kZXhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEVuZCA9IG9mZnNldHNbaW5kZXggKyAxXTtcbiAgICAgICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0RW5kIC0gb2Zmc2V0QmVnaW4gPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBvZmZzZXRCZWdpbjsgaSA8IG9mZnNldEVuZDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgc3VtID0gc3VtICsga25uU2ltaWxhcml0aWVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1bSA+IDAuMCkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0QmVnaW47IGkgPCBvZmZzZXRFbmQ7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgICAga25uU2ltaWxhcml0aWVzW2ldID0ga25uU2ltaWxhcml0aWVzW2ldIC8gc3VtO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2hhbW1pbmcgY29tcHV0ZSBwaXBlbGluZScsXG4gICAgICAgICAgICBsYXlvdXQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXB1dGU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICAgICAgZW50cnlQb2ludDogJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2ltbWlsYXJpdGllc0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdzaW1taWxhcml0aWVzIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IGtublNpbWlsYXJpdGllcy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgRmxvYXQzMkFycmF5KHNpbW1pbGFyaXRpZXNCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KGtublNpbWlsYXJpdGllcyk7XG4gICAgICAgIHNpbW1pbGFyaXRpZXNCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0c0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdvZmZzZXRzIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IG9mZnNldHMuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbmV3IFVpbnQzMkFycmF5KG9mZnNldHNCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KG9mZnNldHMpO1xuICAgICAgICBvZmZzZXRzQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICAgICAgbGF5b3V0OiBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoMCksXG4gICAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBzaW1taWxhcml0aWVzQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nOiAxLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBvZmZzZXRzQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY29tbWFuZEVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgcGFzc0VuY29kZXIgPSBjb21tYW5kRW5jb2Rlci5iZWdpbkNvbXB1dGVQYXNzKCk7XG4gICAgICAgIHBhc3NFbmNvZGVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgcGFzc0VuY29kZXIuc2V0QmluZEdyb3VwKDAsIGJpbmRHcm91cCk7XG4gICAgICAgIHBhc3NFbmNvZGVyLmRpc3BhdGNoV29ya2dyb3Vwcyh3b3JrR3JvdXBEaW0sIHdvcmtHcm91cERpbSk7XG4gICAgICAgIHBhc3NFbmNvZGVyLmVuZCgpO1xuICAgICAgICBjb25zdCBvdXRTaW1pbGFyaXR5QnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ291dCBzaW1pbGFyaXR5IGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBrbm5TaW1pbGFyaXRpZXMuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29tbWFuZEVuY29kZXIuY29weUJ1ZmZlclRvQnVmZmVyKHNpbW1pbGFyaXRpZXNCdWZmZXIsIDAsIG91dFNpbWlsYXJpdHlCdWZmZXIsIDAsIGtublNpbWlsYXJpdGllcy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEVuY29kZXIuZmluaXNoKCldKTtcbiAgICAgICAgeWllbGQgZGV2aWNlLnF1ZXVlLm9uU3VibWl0dGVkV29ya0RvbmUoKTtcbiAgICAgICAgeWllbGQgb3V0U2ltaWxhcml0eUJ1ZmZlci5tYXBBc3luYyhHUFVNYXBNb2RlLlJFQUQpO1xuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkob3V0U2ltaWxhcml0eUJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKTtcbiAgICAgICAga25uU2ltaWxhcml0aWVzLnNldChhcnJheUJ1ZmZlcik7XG4gICAgICAgIG91dFNpbWlsYXJpdHlCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgc2ltbWlsYXJpdGllc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG9mZnNldHNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBvdXRTaW1pbGFyaXR5QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHdpc2Utbm9ybWFsaXplLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBpbmZsYXRpb24gb3BlcmF0b3IgaW4gcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmxhdGUoa25uU2ltaWxhcml0aWVzLCBmYWN0b3IgPSAyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5TaW1pbGFyaXRpZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIGtublNpbWlsYXJpdGllc1tpXSA9IE1hdGgucG93KGtublNpbWlsYXJpdGllc1tpXSwgZmFjdG9yKTtcbn1cbmZ1bmN0aW9uIGdldFJvd0luZGV4ZXMob2Zmc2V0cykge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50MzJBcnJheShvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IG9mZnNldHNbaV07IGogPCBvZmZzZXRzW2kgKyAxXTsgaisrKVxuICAgICAgICAgICAgcmVzW2pdID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IGxvb2tpbmcgYXQgYWxyZWFkeSB6ZXJvZWQgb3V0IHZhbHVlcywgYW5kIG9ubHkgbG9va3MgYXQgbGl2ZSBjZWxscy5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmROb1Jldml2ZShkZXZpY2UsIGtublNpbWlsYXJpdGllcywga25uSW5kZXhlcywgb2Zmc2V0cywgblJvd3MpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBuZWVkZWRUaHJlYWRzID0gOTAwMDA7XG4gICAgICAgIGNvbnN0IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gPSAxMDtcbiAgICAgICAgY29uc3QgdG90YWxXb3JrZ3JvdXBUaHJlYWRzID0gd29ya0dyb3VwVGhyZWFkc1BlckRpbSAqIHdvcmtHcm91cFRocmVhZHNQZXJEaW07XG4gICAgICAgIGNvbnN0IG5lZWRlZFdvcmtHcm91cHMgPSBNYXRoLmNlaWwobmVlZGVkVGhyZWFkcyAvIHRvdGFsV29ya2dyb3VwVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IHdvcmtHcm91cERpbSA9IE1hdGguY2VpbChNYXRoLnNxcnQobmVlZGVkV29ya0dyb3VwcykpO1xuICAgICAgICBjb25zdCB0aHJlYWRzUGVyRGltID0gd29ya0dyb3VwVGhyZWFkc1BlckRpbSAqIHdvcmtHcm91cERpbTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICAvLyBtaW5pbXVtIHZhbHVlIGFmdGVyIGV4cGFuc2lvbi5cbiAgICAgICAgY29uc3QgcHJ1bmVWYWx1ZSA9IE1hdGgucG93KDEwLCAtb3JkZXIpO1xuICAgICAgICBjb25zdCBvdXRLTk5TaW1pbGFyaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGtublNpbWlsYXJpdGllcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kJyxcbiAgICAgICAgICAgIGNvZGU6IGBcbiAgICAgICAgc3RydWN0IFNwYXJzZUtOTiB7XG4gICAgICAgICAgICBrbm5TaW1pbGFyaXRpZXM6IGFycmF5PGYzMiwgJHtrbm5TaW1pbGFyaXRpZXMubGVuZ3RofT4sXG4gICAgICAgICAgICBrbm5JbmRleGVzOiBhcnJheTx1MzIsICR7a25uSW5kZXhlcy5sZW5ndGh9PixcbiAgICAgICAgICAgIG9mZnNldHM6IGFycmF5PHUzMiwgJHtvZmZzZXRzLmxlbmd0aH0+LFxuICAgICAgICAgICAgcm93SW5kZXhlczogYXJyYXk8dTMyLCAke2tubkluZGV4ZXMubGVuZ3RofT4sXG4gICAgICAgIH1cblxuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHNwYXJzZUtOTjogU3BhcnNlS05OO1xuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHJlc3VsdFNpbUJsb2NrOiBhcnJheTxmMzIsICR7bmVlZGVkVGhyZWFkc30+O1xuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHN0YXJ0QXQ6IHUzMjtcbiAgICAgICAgQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCR7d29ya0dyb3VwVGhyZWFkc1BlckRpbX0sICR7d29ya0dyb3VwVGhyZWFkc1BlckRpbX0pIGZuIGV4cGFuZChcbiAgICAgICAgICAgIEBidWlsdGluKGdsb2JhbF9pbnZvY2F0aW9uX2lkKSBpZDogdmVjMzx1MzI+LFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGNvbCA9IGlkLng7XG4gICAgICAgICAgICBsZXQgcm93ID0gaWQueTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJvdyAqICR7dGhyZWFkc1BlckRpbX0gKyBjb2w7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gJHtuZWVkZWRUaHJlYWRzfSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB3b3JraW5nSW5kZXggPSBpbmRleCArIHN0YXJ0QXQ7XG4gICAgICAgICAgICBpZiAod29ya2luZ0luZGV4ID49ICR7a25uSW5kZXhlcy5sZW5ndGh9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgcm93SWR4ID0gc3BhcnNlS05OLnJvd0luZGV4ZXNbd29ya2luZ0luZGV4XTtcbiAgICAgICAgICAgIGxldCBjb2xJZHggPSBzcGFyc2VLTk4ua25uSW5kZXhlc1t3b3JraW5nSW5kZXhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luUm93ID0gc3BhcnNlS05OLm9mZnNldHNbcm93SWR4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbmRSb3cgPSBzcGFyc2VLTk4ub2Zmc2V0c1tyb3dJZHggKyAxXTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRCZWdpbkNvbCA9IHNwYXJzZUtOTi5vZmZzZXRzW2NvbElkeF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0RW5kQ29sID0gc3BhcnNlS05OLm9mZnNldHNbY29sSWR4ICsgMV07XG4gICAgICAgICAgICB2YXIgc3VtID0gMC4wO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldEJlZ2luUm93OyBpIDwgb2Zmc2V0RW5kUm93OyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGogPSBvZmZzZXRCZWdpbkNvbDsgaiA8IG9mZnNldEVuZENvbDsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFyc2VLTk4ua25uSW5kZXhlc1tpXSA9PSBzcGFyc2VLTk4ua25uSW5kZXhlc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gc3VtICsgc3BhcnNlS05OLmtublNpbWlsYXJpdGllc1tpXSAqIHNwYXJzZUtOTi5rbm5TaW1pbGFyaXRpZXNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdW0gPiAke3BydW5lVmFsdWV9KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0U2ltQmxvY2tbaW5kZXhdID0gc3VtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRTaW1CbG9ja1tpbmRleF0gPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBgXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXBlbGluZSA9IGRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe1xuICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQgY29tcHV0ZSBwaXBlbGluZScsXG4gICAgICAgICAgICBsYXlvdXQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXB1dGU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnZXhwYW5kJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzcGFyc2VLTk5CdWZmZXIzMlNpemUgPSBrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGggKyBvZmZzZXRzLmxlbmd0aCArIGtubkluZGV4ZXMubGVuZ3RoO1xuICAgICAgICBsZXQgc3BhcnNlS05OQnVmZmVyQnl0ZVNpemUgPSBzcGFyc2VLTk5CdWZmZXIzMlNpemUgKiA0O1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSAmIDE1O1xuICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgc3BhcnNlS05OQnVmZmVyQnl0ZVNpemUgKz0gMTYgLSByZW1haW5kZXI7XG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdzcGFyc2Uga25uIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3BhcnNlS05OQXJyYXlCdWZmZXIgPSBzcGFyc2VLTk5CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcbiAgICAgICAgLy8gc2V0IHNpbWlsYXJpdGllc1xuICAgICAgICBuZXcgRmxvYXQzMkFycmF5KHNwYXJzZUtOTkFycmF5QnVmZmVyLCAwLCBrbm5TaW1pbGFyaXRpZXMubGVuZ3RoKS5zZXQoa25uU2ltaWxhcml0aWVzKTtcbiAgICAgICAgLy8gc2V0IGluZGV4ZXNcbiAgICAgICAgbmV3IFVpbnQzMkFycmF5KHNwYXJzZUtOTkFycmF5QnVmZmVyLCBrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICogNCwga25uSW5kZXhlcy5sZW5ndGgpLnNldChrbm5JbmRleGVzKTtcbiAgICAgICAgLy8gc2V0IG9mZnNldHNcbiAgICAgICAgbmV3IFVpbnQzMkFycmF5KHNwYXJzZUtOTkFycmF5QnVmZmVyLCAoa25uU2ltaWxhcml0aWVzLmxlbmd0aCArIGtubkluZGV4ZXMubGVuZ3RoKSAqIDQsIG9mZnNldHMubGVuZ3RoKS5zZXQob2Zmc2V0cyk7XG4gICAgICAgIC8vIHNldCByb3cgaW5kZXhlc1xuICAgICAgICBjb25zdCByb3dJbmRleGVzID0gZ2V0Um93SW5kZXhlcyhvZmZzZXRzKTtcbiAgICAgICAgbmV3IFVpbnQzMkFycmF5KHNwYXJzZUtOTkFycmF5QnVmZmVyLCAoa25uU2ltaWxhcml0aWVzLmxlbmd0aCArIGtubkluZGV4ZXMubGVuZ3RoICsgb2Zmc2V0cy5sZW5ndGgpICogNCwgcm93SW5kZXhlcy5sZW5ndGgpLnNldChyb3dJbmRleGVzKTtcbiAgICAgICAgc3BhcnNlS05OQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0QnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3N0YXJ0IGVuZCBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogNCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbmV3IFVpbnQzMkFycmF5KHN0YXJ0QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChbMF0pO1xuICAgICAgICBzdGFydEJ1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCByZXN1bHRCbG9ja0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdyZXN1bHQgYmxvY2sgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IG5lZWRlZFRocmVhZHMgKiA0LFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICAgICAgbGF5b3V0OiBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoMCksXG4gICAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAwLCByZXNvdXJjZTogeyBidWZmZXI6IHNwYXJzZUtOTkJ1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAxLCByZXNvdXJjZTogeyBidWZmZXI6IHJlc3VsdEJsb2NrQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDIsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3RhcnRCdWZmZXIgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG91dEJsb2NrQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ291dCBibG9jayBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcmVzdWx0QmxvY2tCdWZmZXIuc2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChrbm5JbmRleGVzLmxlbmd0aCAvIG5lZWRlZFRocmVhZHMpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIG5lZWRlZFRocmVhZHM7XG4gICAgICAgICAgICBjb25zdCBjdXJMZW5ndGggPSBNYXRoLm1pbihuZWVkZWRUaHJlYWRzLCBrbm5JbmRleGVzLmxlbmd0aCAtIHN0YXJ0KTtcbiAgICAgICAgICAgIGRldmljZS5xdWV1ZS53cml0ZUJ1ZmZlcihzdGFydEJ1ZmZlciwgMCwgbmV3IFVpbnQzMkFycmF5KFtzdGFydF0pKTtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kIGVuY29kZXInLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwYXNzID0gZW5jb2Rlci5iZWdpbkNvbXB1dGVQYXNzKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCBjb21wdXRlIHBhc3MnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXNzLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgICAgIHBhc3Muc2V0QmluZEdyb3VwKDAsIGJpbmRHcm91cCk7XG4gICAgICAgICAgICBwYXNzLmRpc3BhdGNoV29ya2dyb3Vwcyh3b3JrR3JvdXBEaW0sIHdvcmtHcm91cERpbSk7XG4gICAgICAgICAgICBwYXNzLmVuZCgpO1xuICAgICAgICAgICAgZW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIocmVzdWx0QmxvY2tCdWZmZXIsIDAsIG91dEJsb2NrQnVmZmVyLCAwLCBvdXRCbG9ja0J1ZmZlci5zaXplKTtcbiAgICAgICAgICAgIGRldmljZS5xdWV1ZS5zdWJtaXQoW2VuY29kZXIuZmluaXNoKCldKTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lKCdvblN1Ym1pdHRlZFdvcmtEb25lJyk7XG4gICAgICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWVFbmQoJ29uU3VibWl0dGVkV29ya0RvbmUnKTtcbiAgICAgICAgICAgIHlpZWxkIG91dEJsb2NrQnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgICAgICBjb25zdCBvdXRCbG9jayA9IG5ldyBGbG9hdDMyQXJyYXkob3V0QmxvY2tCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSwgMCwgY3VyTGVuZ3RoKTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lKCdmaWxsb3V0Jyk7XG4gICAgICAgICAgICBvdXRLTk5TaW1pbGFyaXRpZXMuc2V0KG91dEJsb2NrLCBzdGFydCk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZUVuZCgnZmlsbG91dCcpO1xuICAgICAgICAgICAgb3V0QmxvY2tCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZXN0cm95XG4gICAgICAgIHNwYXJzZUtOTkJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHN0YXJ0QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmVzdWx0QmxvY2tCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBvdXRCbG9ja0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiB7IEtOTkluZGV4ZXM6IGtubkluZGV4ZXMsIEtOTlNpbWlsYXJpdGllczogb3V0S05OU2ltaWxhcml0aWVzLCBpbmRleE9mZnNldHM6IG9mZnNldHMgfTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZmxhdGUtZXhwYW5kLmpzLm1hcCIsImltcG9ydCB7IHRvT2Zmc2V0Rm9ybSB9IGZyb20gJy4uL3VtYXAvdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50T2NjdXJhbmNlc0FkZExvb3BzKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDMyQXJyYXkoblJvd3MpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW3NwYXJzZU1hdHJpeC5pW2ldXSsrO1xuICAgICAgICByZXNbc3BhcnNlTWF0cml4LmpbaV1dKys7XG4gICAgfVxuICAgIC8vIGFkZCBsb29wc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKylcbiAgICAgICAgcmVzW2ldKys7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQkUgV0FSRSwgdGhpcyBmdW5jdGlvbiBpcyBtZW50IGZvciBoYWxmIHNwYXJzZSBtYXRyaWNlcyBvbmx5ISEhXG4gKiBAcGFyYW0gc3BhcnNlTWF0cml4XG4gKiBAcGFyYW0gblJvd3NcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NwYXJzZUtOTlNpbWlsYXJpdHlGb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICBjb25zdCBvY2N1cmVuY2VDb3VudCA9IGNvdW50T2NjdXJhbmNlc0FkZExvb3BzKHNwYXJzZU1hdHJpeCwgblJvd3MpO1xuICAgIGNvbnN0IG9mZnNldEZvcm0gPSB0b09mZnNldEZvcm0ob2NjdXJlbmNlQ291bnQpO1xuICAgIGNvbnN0IGluc2VydENvdW50ZXIgPSBuZXcgVWludDMyQXJyYXkoblJvd3MpLmZpbGwoMSk7IC8vIGZvciBjb3VudGluZyBob3cgbWFueSB0aGluZ3Mgd2UgaW5zZXJ0ZWQgaW50byB0aGUga25uIGFycmF5cy5cbiAgICAvLyB3ZSBpbml0aWFsaXplIHRoZXNlIGNvdW50ZXJzIHRvIG9uZSBiZWNhdXNlIGZpcnN0IHdlIGluc2VydCB0aGUgc2VsZiBsb29wc1xuICAgIC8vIGRvbnQgYmUgY29uZnVzZWQgYnkgdGhlIG5hbWUga25uLCBrIGhlcmUgaXMgdmFyaWFibGUsIGl0cyBqdXN0IHRoZSB0aGluZyB0aGF0IGluIHRoaXMgZm9ybSwgd2Uga25vdyB0aGF0IGF0IGluZGV4IGlcbiAgICAvLyB3ZSBoYXZlIHNvbWUgayh2YXJpYWJsZSkgYW1tb3VudCBvZiBzcGFyc2UgbmVpZ2JvdXJzXG4gICAgLy8gd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgc3BhcnNlIG1hdHJpeCB3aWxsIG5vdCBjb250YWluIGFueSBkdXBsaWNhdGVzLCB3ZSBhZGQgblJvd3MgdG8gYWNjb3VudCBmb3Igc2VsZiBsb29wc1xuICAgIGNvbnN0IEtOTkluZGV4ZXMgPSBuZXcgVWludDMyQXJyYXkoc3BhcnNlTWF0cml4LmkubGVuZ3RoICogMiArIG5Sb3dzKTtcbiAgICBjb25zdCBLTk5TaW1pbGFyaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNwYXJzZU1hdHJpeC5pLmxlbmd0aCAqIDIgKyBuUm93cyk7XG4gICAgLy8gaW5zZXJ0IHNlbGYgbG9vcHMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggb2Zmc2V0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICAgIEtOTkluZGV4ZXNbb2Zmc2V0Rm9ybVtpXV0gPSBpO1xuICAgICAgICBLTk5TaW1pbGFyaXRpZXNbb2Zmc2V0Rm9ybVtpXV0gPSAxO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHNwYXJzZU1hdHJpeC5pW2ldO1xuICAgICAgICBjb25zdCBjb2wgPSBzcGFyc2VNYXRyaXgualtpXTtcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgICAgIEtOTkluZGV4ZXNbb2Zmc2V0Rm9ybVtyb3ddICsgaW5zZXJ0Q291bnRlcltyb3ddXSA9IGNvbDtcbiAgICAgICAgS05OU2ltaWxhcml0aWVzW29mZnNldEZvcm1bcm93XSArIGluc2VydENvdW50ZXJbcm93XV0gPSBzaW1pbGFyaXR5O1xuICAgICAgICBpbnNlcnRDb3VudGVyW3Jvd10rKztcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW2NvbF0gKyBpbnNlcnRDb3VudGVyW2NvbF1dID0gcm93O1xuICAgICAgICBLTk5TaW1pbGFyaXRpZXNbb2Zmc2V0Rm9ybVtjb2xdICsgaW5zZXJ0Q291bnRlcltjb2xdXSA9IHNpbWlsYXJpdHk7XG4gICAgICAgIGluc2VydENvdW50ZXJbY29sXSsrO1xuICAgIH1cbiAgICByZXR1cm4geyBLTk5JbmRleGVzLCBLTk5TaW1pbGFyaXRpZXMsIGluZGV4T2Zmc2V0czogb2Zmc2V0Rm9ybSB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGtublRvU3BhcnNlRm9ybShrbm5JbmRleGVzLCBrbm5TaW1zKSB7XG4gICAgY29uc3QgbGVuZ3RocyA9IGtubkluZGV4ZXMubWFwKCh4KSA9PiB4Lmxlbmd0aCk7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBsZW5ndGhzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgIGNvbnN0IG9mZnNldHMgPSB0b09mZnNldEZvcm0obGVuZ3Rocyk7XG4gICAgY29uc3Qgb3V0SW5kZXhlcyA9IG5ldyBVaW50MzJBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgY29uc3Qgb3V0U2ltcyA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga25uSW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRJbmRleGVzLnNldChrbm5JbmRleGVzW2ldLCBvZmZzZXRzW2ldKTtcbiAgICAgICAgb3V0U2ltcy5zZXQoa25uU2ltc1tpXSwgb2Zmc2V0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiB7IEtOTkluZGV4ZXM6IG91dEluZGV4ZXMsIEtOTlNpbWlsYXJpdGllczogb3V0U2ltcywgaW5kZXhPZmZzZXRzOiBvZmZzZXRzIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IGxldmVuYmVyZ01hcnF1YXJkdCB9IGZyb20gJ21sLWxldmVuYmVyZy1tYXJxdWFyZHQnO1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcih4MSwgeDIsIG4pIHtcbiAgICBjb25zdCBzdGVwID0gKHgyIC0geDEpIC8gKG4gLSAxKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4geDEgKyBzdGVwICogaSk7XG59XG4vKipcbiAqIEZpdCBhLCBiIHBhcmFtcyBmb3IgdGhlIGRpZmZlcmVudGlhYmxlIGN1cnZlIHVzZWQgaW4gbG93ZXJcbiAqIGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWwgY29tcGxleCBjb25zdHJ1Y3Rpb24uIFdlIHdhbnQgdGhlXG4gKiBzbW9vdGggY3VydmUgKGZyb20gYSBwcmUtZGVmaW5lZCBmYW1pbHkgd2l0aCBzaW1wbGUgZ3JhZGllbnQpIHRoYXRcbiAqIGJlc3QgbWF0Y2hlcyBhbiBvZmZzZXQgZXhwb25lbnRpYWwgZGVjYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQUJQYXJhbXMoc3ByZWFkLCBtaW5EaXN0KSB7XG4gICAgY29uc3QgY3VydmUgPSAoW2EsIGJdKSA9PiAoeCkgPT4ge1xuICAgICAgICByZXR1cm4gMS4wIC8gKDEuMCArIGEgKiBNYXRoLnBvdyh4LCAoMiAqIGIpKSk7XG4gICAgfTtcbiAgICBjb25zdCB4diA9IGxpbmVhcigwLCBzcHJlYWQgKiAzLCAzMDApXG4gICAgICAgIC5tYXAoKHZhbCkgPT4gKHZhbCA8IG1pbkRpc3QgPyAxLjAgOiB2YWwpKTtcbiAgICBjb25zdCB5diA9IG5ldyBBcnJheSh4di5sZW5ndGgpLmZpbGwoMCkubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGd0ZSA9IHh2W2luZGV4XSA+PSBtaW5EaXN0O1xuICAgICAgICByZXR1cm4gZ3RlID8gTWF0aC5leHAoLSh4dltpbmRleF0gLSBtaW5EaXN0KSAvIHNwcmVhZCkgOiB2YWw7XG4gICAgfSk7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlcyA9IFswLjUsIDAuNV07XG4gICAgY29uc3QgZGF0YSA9IHsgeDogeHYsIHk6IHl2IH07XG4gICAgLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtIChmcm9tIGdpdGh1YiBleGFtcGxlKVxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGRhbXBpbmc6IDEuNSxcbiAgICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICAgICAgZ3JhZGllbnREaWZmZXJlbmNlOiAxMGUtMixcbiAgICAgICAgbWF4SXRlcmF0aW9uczogMTAwLFxuICAgICAgICBlcnJvclRvbGVyYW5jZTogMTBlLTMsXG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgIGNvbnN0IHsgcGFyYW1ldGVyVmFsdWVzIH0gPSBsZXZlbmJlcmdNYXJxdWFyZHQoZGF0YSwgY3VydmUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IFthLCBiXSA9IHBhcmFtZXRlclZhbHVlcztcbiAgICByZXR1cm4geyBhLCBiIH07XG59XG4vKipcbiAqIGhldXJpc3RpYyBmb3IgbnVtYmVyIG9mIGVwb2NocyBvZiB1bWFwLCBkaWZmZXJzIGZyb20gY3B1IHZlcnNpb24sIGJlY2F1c2Ugb2YgdGhlIHdheSBncHUgcGFzc2VzIGRhdGFcbiAqIEBwYXJhbSBlbnRyeUxlbiBudW1iZXIgb2YgZW50cmllc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5FcG9jaHMoZW50cnlMZW4pIHtcbiAgICAvL1xuICAgIGNvbnN0IGxlbmd0aCA9IGVudHJ5TGVuO1xuICAgIGlmIChsZW5ndGggPD0gMjUwMClcbiAgICAgICAgcmV0dXJuIDEwMDA7XG4gICAgZWxzZSBpZiAobGVuZ3RoIDw9IDUwMDApXG4gICAgICAgIHJldHVybiA4MDA7XG4gICAgZWxzZSBpZiAobGVuZ3RoIDw9IDc1MDApXG4gICAgICAgIHJldHVybiA2NTA7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gNDAwO1xufVxuLyoqICBoZWxwZXIgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIGFycmF5IG9mIHNpemVzIHRvIG9mZnNldCBmb3JtICovXG5leHBvcnQgZnVuY3Rpb24gdG9PZmZzZXRGb3JtKGFyKSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQzMkFycmF5KGFyLmxlbmd0aCArIDEpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQgKz0gYXJbaV07XG4gICAgfVxuICAgIHJlc1thci5sZW5ndGhdID0gb2Zmc2V0O1xuICAgIHJldHVybiByZXM7XG59XG4vKiogbXVsdGlwbGllcyBmbGF0IHJlcHJlc2VudGF0aW9uIG9mIHNwYXJzZSBrbm4gaW5mbyBieSBzY2FsYXIuXG4gKiBhbHNvIG5vIHBvaW50IG9mIGRvaW5nIHRoaXMgb24gZ3B1LCBjYW4gYmUgZG9uZSBvbiBjcHUgcHJldHR5IHF1aWNrbHkuXG4gKiBpZiB0aGVyZSB3aWxsIGJlIG5lZWQgZm9yIGl0LCBpdCBjYW4gYmUgZG9uZSBvbiBncHUgYXMgd2VsbCB2ZXJ5IHZlcnkgZWFzaWx5LlxuICogQHBhcmFtIHZhbHVlcyB2YWx1ZXMgYXJyYXlcbiAqIEBwYXJhbSBzY2FsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKHZhbHVlcywgc2NhbGFyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpXSAqIHNjYWxhcjtcbn1cbi8qKlxuICogZ2VuZXJhdGUgdHJhbnNwb3NlIG9mIGtubiBmcm9tIHRoZSB0cmFuc3Bvc2l0aW9uIGluZm8gdGFrZW4gZnJvbSBzcGFyc2Uga25uIGluZm9cbiAqIHVzaW5nIHRoaXMgaW5mb3JtYXRpb24gYXZvaWRzIGJpbGxpb25zIG9mIGFycmF5LnB1c2ggY2FsbHMsIGlzIG11Y2ggY2xlYW5lciwgYWxsb3dzIHR5cGVkIGFycmF5IHVzZSBhbmQgaXMgZmFzdGVyLlxuICogbm8gcG9pbnQgb2YgZG9pbmcgdGhpcyBvbiBncHUsIGNhbiBiZSBkb25lIG9uIGNwdSBhcyB3ZSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBpbmZvIG5lZWRlZC5cbiAqIEBwYXJhbSBrbm5JbmRleGVzXG4gKiBAcGFyYW0ga25uRGlzdGFuY2VzXG4gKiBAcGFyYW0ga25uU3BhcnNlSW5mb1xuICogQHBhcmFtIGtublNpemVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VLTk4oa25uSW5kZXhlcywga25uRGlzdGFuY2VzLCBrbm5TcGFyc2VJbmZvLCBrbm5TaXplID0gMTUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBudW1PZkVudHJpZXMgPSBrbm5JbmRleGVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZnVsbEtubkVudHJ5U2l6ZSA9IGtublNpemUgKiBudW1PZkVudHJpZXM7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZVNpemVzID0ga25uU3BhcnNlSW5mby5yZXN1bHRUcmFuc3Bvc2VTaXplc0FycmF5O1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VPZmZzZXRzID0gdG9PZmZzZXRGb3JtKHRyYW5zcG9zZVNpemVzKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0c0NvcHkgPSBuZXcgVWludDMyQXJyYXkodHJhbnNwb3NlT2Zmc2V0cy5sZW5ndGgpO1xuICAgICAgICBvZmZzZXRzQ29weS5zZXQodHJhbnNwb3NlT2Zmc2V0cyk7IC8vIHdpbGwgYmUgdXNlZCBmb3IgZHluYW1pYyBpbmRleGluZ1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VLTk5JbmRleGVzID0gbmV3IEludDMyQXJyYXkoZnVsbEtubkVudHJ5U2l6ZSkuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlS05ORGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheShmdWxsS25uRW50cnlTaXplKS5maWxsKDApO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9mRW50cmllczsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGtublNpemU7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVySW5kZXggPSBrbm5JbmRleGVzW2ldW2pdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVySW5kZXhPZmZzZXQgPSBvZmZzZXRzQ29weVtvdGhlckluZGV4XTtcbiAgICAgICAgICAgICAgICB0cmFuc3Bvc2VLTk5JbmRleGVzW290aGVySW5kZXhPZmZzZXRdID0gaTtcbiAgICAgICAgICAgICAgICB0cmFuc3Bvc2VLTk5EaXN0YW5jZXNbb3RoZXJJbmRleE9mZnNldF0gPSBrbm5EaXN0YW5jZXNbaV1bal07XG4gICAgICAgICAgICAgICAgb2Zmc2V0c0NvcHlbb3RoZXJJbmRleF0gKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0cmFuc3Bvc2VLTk5JbmRleGVzLCB0cmFuc3Bvc2VLTk5EaXN0YW5jZXMsIHRyYW5zcG9zZU9mZnNldHMgfTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhbiBBcnJheSAoYXJyYXkgb3IgdHlwZWQgYXJyYXksIGV4Y2VwdCB0aG9zZSB0aGF0IGNvbnRhaW4gYmlnaW50IHZhbHVlcykuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gT2JqZWN0IHRvIGNoZWNrLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGFycmF5IG9yIGEgdHlwZWQgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FueUFycmF5KHZhbHVlKSB7XG4gICAgY29uc3QgdGFnID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRhZy5lbmRzV2l0aCgnQXJyYXldJykgJiYgIXRhZy5pbmNsdWRlcygnQmlnJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBiaW9MYXlvdXQgfSBmcm9tICcuL2Jpby1sYXlvdXQnO1xuaW1wb3J0IHsgbWFya292Q2x1c3RlcldlYkdQVSB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9NQ0wtd2ViR1BVJztcbmV4cG9ydCBjb25zdCBkZWZhdWx0TUNMT3B0aW9ucyA9IHtcbiAgICBleHBhbmRGYWN0b3I6IDIsXG4gICAgbWF4SXRlcmF0aW9uczogNSxcbiAgICBpbmZsYXRlRmFjdG9yOiAyLFxuICAgIG11bHRGYWN0b3I6IDEsXG59O1xuZXhwb3J0IGNsYXNzIE1DTFNwYXJzZVJlZHVjZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0geyAuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0cyB9O1xuICAgIH1cbiAgICBhc3luYyB0cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICAvLyB0ZXN0V29ya2VyTXVsdGlwbHkoKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBJbnQzMkFycmF5KG5Sb3dzKTtcbiAgICAgICAgbGV0IHNwYXJzZU9iamVjdCA9IHRoaXMudG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCk7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExvb3BzKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3QgPSB0aGlzLmV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZmxhdGUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY2x1c3RlcnMsIGlzLCBqcyB9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgdGhpcy5sYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzIH07XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZm9ybVdlYkdQVShzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgICAgIGNvbnN0IG1jbFJlcyA9IGF3YWl0IG1hcmtvdkNsdXN0ZXJXZWJHUFUoc3BhcnNlTWF0cml4LCBuUm93cywgdGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IpO1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB0aGlzLmNzclRvU3BhcnNlT2JqZWN0KG1jbFJlcywgblJvd3MpO1xuICAgICAgICBjb25zdCB7IGNsdXN0ZXJzLCBpcywganMgfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKGNsdXN0ZXJzKTtcbiAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IHRoaXMubGF5b3V0KGNsdXN0ZXJzLCBzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGVtYmVkWDogZW1iZWRkaW5ncy5lbWJlZFgsIGVtYmVkWTogZW1iZWRkaW5ncy5lbWJlZFksIGlzLCBqcyB9O1xuICAgIH1cbiAgICBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlclNpemVNYXAgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIWNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKVxuICAgICAgICAgICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdID0gMDtcbiAgICAgICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkSW5kZXhlcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJTaXplTWFwKS5tYXAoTnVtYmVyKS5zb3J0KChhLCBiKSA9PiBjbHVzdGVyU2l6ZU1hcFthXSAtIGNsdXN0ZXJTaXplTWFwW2JdKTtcbiAgICAgICAgY29uc3QgY2x1c3Rlck1hcCA9IHt9O1xuICAgICAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgICAgICAvLyBsZXQgY3VyQ2x1c3RlciA9IDE7XG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dKSB7XG4gICAgICAgIC8vICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXSA9IGN1ckNsdXN0ZXI7XG4gICAgICAgIC8vICAgICBjbHVzdGVyc1tpXSA9IGN1ckNsdXN0ZXI7XG4gICAgICAgIC8vICAgICBjdXJDbHVzdGVyKys7XG4gICAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuICAgIGNzclRvU3BhcnNlT2JqZWN0KG1jbFJlcywgblJvd3MpIHtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IDEgLyBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSBtY2xSZXMuaW5kZXhPZmZzZXRzW2ldOyBrIDwgbWNsUmVzLmluZGV4T2Zmc2V0c1tpICsgMV07IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGogPSBtY2xSZXMuS05OSW5kZXhlc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPCBtaW5PcmRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBsYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgY2x1c3Rlck1hcCA9IHt9O1xuICAgICAgICBjbHVzdGVycy5mb3JFYWNoKChjbHVzdGVyLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXS5wdXNoKGkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29uc3QgbkNsdXN0ZXJzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCkubGVuZ3RoO1xuICAgICAgICAvLyBjb25zdCBwZXJSb3cgPSBNYXRoLmZsb29yKE1hdGguc3FydChuQ2x1c3RlcnMpKTtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBzb3J0ZWRDbHVzdGVyTmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKTtcbiAgICAgICAgc29ydGVkQ2x1c3Rlck5hbWVzLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJNYXBbYl0ubGVuZ3RoIC0gY2x1c3Rlck1hcFthXS5sZW5ndGgpO1xuICAgICAgICBsZXQgcGVyUm93ID0gNjtcbiAgICAgICAgbGV0IHlPZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCBsYXlvdXRTaXplID0gNTtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVyTWFwW2NsdXN0ZXJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlTWF0cml4LCAwLjAwMSk7XG4gICAgICAgICAgICBpZiAoY2x1c3Rlck51bSA9PT0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSkpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgICAgICAgICB5T2Zmc2V0ICs9IGxheW91dFNpemUgLyBwZXJSb3c7XG4gICAgICAgICAgICAgICAgcGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAqIDEuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gKChjbHVzdGVyTnVtICUgcGVyUm93KSAqIGxheW91dFNpemUgLyBwZXJSb3cpICogMS41O1xuICAgICAgICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbWJlZGRpbmdzLmVtYmVkWC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVtYmVkWFtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRYW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIG9mZnNldFg7XG4gICAgICAgICAgICAgICAgZW1iZWRZW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFlbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgeU9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlbWJlZFgsIGVtYmVkWSB9O1xuICAgIH1cbiAgICBtZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKSB7XG4gICAgICAgIGNvbnN0IGlDbHVzdGVyID0gY2x1c3RlcnNbaV07XG4gICAgICAgIGNvbnN0IGpDbHVzdGVyID0gY2x1c3RlcnNbal07XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1trXSA9PT0gakNsdXN0ZXIpXG4gICAgICAgICAgICAgICAgY2x1c3RlcnNba10gPSBpQ2x1c3RlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25DbHVzdGVycyhzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIGxldCBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgY29uc3QgaXMgPSBbXTtcbiAgICAgICAgY29uc3QganMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhzcGFyc2VNYXRyaXhbaV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoc3BhcnNlTWF0cml4W2ldW2pdICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIHNwYXJzZU1hdHJpeFtpXVtqXSAhPT0gTnVtYmVyKGkpICYmIE51bWJlcihqKSA+IE51bWJlcihpKSkge1xuICAgICAgICAgICAgICAgICAgICBpcy5wdXNoKE51bWJlcihpKSk7XG4gICAgICAgICAgICAgICAgICAgIGpzLnB1c2goTnVtYmVyKGopKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xICYmIGNsdXN0ZXJzW051bWJlcihqKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gY2x1c3RlcnNbTnVtYmVyKGopXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIE51bWJlcihpKSwgTnVtYmVyKGopKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJzW051bWJlcihpKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyc1tOdW1iZXIoaildO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaildID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgaXM6IG5ldyBVaW50MzJBcnJheShpcyksIGpzOiBuZXcgVWludDMyQXJyYXkoanMpIH07XG4gICAgfVxuICAgIC8qKiBzYW1lIGFzIGFzc2lnbiBjbHVzdGVycyBidXQgd29ya2luZyBvbiB0aGUgbGV2ZWwgb2YgQ1NSIGZvcm1hdCByZXR1cm5lZCBmcm9tIHdlYkdQVSAqL1xuICAgIGFzc2lnbkNsdXN0ZXJzQ1NSKG1jbFJlcywgblJvd3MpIHtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBpcyA9IFtdO1xuICAgICAgICBjb25zdCBqcyA9IFtdO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gMSAvIE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkT2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShuUm93cyArIDEpO1xuICAgICAgICBsZXQgb2Zmc2V0Q291bnRlciA9IDA7XG4gICAgICAgIGNvcnJlY3RlZE9mZnNldHNbMF0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSBtY2xSZXMuaW5kZXhPZmZzZXRzW2ldOyBrIDwgbWNsUmVzLmluZGV4T2Zmc2V0c1tpICsgMV07IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGogPSBtY2xSZXMuS05OSW5kZXhlc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPD0gbWluT3JkZXIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAganMucHVzaChqKTtcbiAgICAgICAgICAgICAgICBvZmZzZXRDb3VudGVyKys7XG4gICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSAmJiBjbHVzdGVyc1tqXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9PSBjbHVzdGVyc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgaSwgaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tqXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ycmVjdGVkT2Zmc2V0c1tpICsgMV0gPSBvZmZzZXRDb3VudGVyO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyksIGNvcnJlY3RlZE9mZnNldHMgfTtcbiAgICB9XG4gICAgdG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCkge1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmlbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV1bc3BhcnNlTWF0cml4LmpbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5qW2ldXSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dW3NwYXJzZU1hdHJpeC5pW2ldXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwYXJzZU9iamVjdDtcbiAgICB9XG4gICAgYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2ldID0gdGhpcy5fb3B0aW9ucy5tdWx0RmFjdG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vcm1hbGl6ZShzcGFyc2VPYmplY3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNwYXJzZU9iamVjdFtpXTtcbiAgICAgICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgICAgICAgICAgc3VtICs9IHJvd1tqXTtcbiAgICAgICAgICAgIGlmIChzdW0gPT09IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gLz0gc3VtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkT2JqZWN0ID0ge307XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgZXhwYW5kZWRPYmplY3RbaV0gPz8gKGV4cGFuZGVkT2JqZWN0W2ldID0ge30pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0/LltqXSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3QsIGksIGopOyAvL3BydW5pbmcgc3RlcFxuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHZhbCAqIG1pbk9yZGVyKSAvIG1pbk9yZGVyID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXVtqXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBhbmRlZE9iamVjdFtqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwYW5kZWRPYmplY3Q7XG4gICAgfVxuICAgIC8vIHByaXZhdGUgcHJ1bmUocm93OiBTcGFyc2VNYXRyaXhPYmplY3RbbnVtYmVyXSkge1xuICAgIC8vIH1cbiAgICBpbmZsYXRlKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gTWF0aC5wb3coc3BhcnNlT2JqZWN0W2ldW2pdLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaikge1xuICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3RbaV0gPz8ge30pO1xuICAgICAgICBjb25zdCBvdGhlckluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3Rbal0gPz8ge30pO1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgY3VycmVudEluZGV4ZXMpIHtcbiAgICAgICAgICAgIGlmIChvdGhlckluZGV4ZXMuaW5jbHVkZXMoaykpXG4gICAgICAgICAgICAgICAgdmFsICs9IHNwYXJzZU9iamVjdFtpXVtrXSAqIHNwYXJzZU9iamVjdFtqXVtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWJXRnlZMjkyTFdOc2RYTjBaWEl1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SnRZWEpqYjNZdFkyeDFjM1JsY2k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkRRU3hQUVVGUExFVkJRVU1zVTBGQlV5eEZRVUZETEUxQlFVMHNZMEZCWXl4RFFVRkRPMEZCUjNaRExFOUJRVThzUlVGQlF5eHRRa0ZCYlVJc1JVRkJReXhOUVVGTkxHOUVRVUZ2UkN4RFFVRkRPMEZCUTNaR0xFMUJRVTBzUTBGQlF5eE5RVUZOTEdsQ1FVRnBRaXhIUVVGbE8wbEJRek5ETEZsQlFWa3NSVUZCUlN4RFFVRkRPMGxCUTJZc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNZVUZCWVN4RlFVRkZMRU5CUVVNN1NVRkRhRUlzVlVGQlZTeEZRVUZGTEVOQlFVTTdRMEZEWkN4RFFVRkRPMEZCUlVZc1RVRkJUU3hQUVVGUExHZENRVUZuUWp0SlFVY3pRaXhaUVVGWkxFOUJRVFJDTEVWQlFVVTdVVUZEZUVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEZRVUZETEVkQlFVY3NhVUpCUVdsQ0xFVkJRVVVzUjBGQlJ5eEpRVUZKTEVWQlFVTXNRMEZCUXp0SlFVTnNSQ3hEUVVGRE8wbEJSVTBzUzBGQlN5eERRVUZETEZOQlFWTXNRMEZCUXl4WlFVRm5ReXhGUVVGRkxFdEJRV0U3VVVGRGNFVXNkMEpCUVhkQ08xRkJRM2hDTEdkRFFVRm5RenRSUVVOb1F5eEpRVUZKTEZsQlFWa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFGQlEyNUVMRWxCUVVrc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVkQlFVY3NRMEZCUXl4RlFVRkZPMWxCUTI1RExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNXVUZCV1N4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xbEJRMjVETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03V1VGRE4wSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzJkQ1FVTndSQ3haUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03WjBKQlEyaEVMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdaMEpCUXpOQ0xFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1lVRkRPVUk3VTBGRFJqdFJRVU5FTEUxQlFVMHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzQkZMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1JVRkJSU3haUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VVc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzVlVGQlZTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFTkJRVU03U1VGRGJFWXNRMEZCUXp0SlFVVk5MRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUXpGRkxFbEJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRXRCUVVzc1EwRkJRenRaUVVOdVF5eFBRVUZQTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlJUZERMRTFCUVUwc1RVRkJUU3hIUVVGSExFMUJRVTBzYlVKQlFXMUNMRU5CUTNSRExGbEJRVmtzUlVGQlJTeExRVUZMTEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhoUVVGaExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUXpsRkxFTkJRVU03VVVGRFJpeE5RVUZOTEZsQlFWa3NSMEZCUnl4SlFVRkpMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNUVUZCVFN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xRkJRek5FTEUxQlFVMHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzQkZMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1JVRkJSU3haUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VVc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzVlVGQlZTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFTkJRVU03U1VGRGJFWXNRMEZCUXp0SlFVVlBMR1ZCUVdVc1EwRkJReXhSUVVGclFqdFJRVU40UXl4TlFVRk5MR05CUVdNc1IwRkJNRUlzUlVGQlJTeERRVUZETzFGQlEycEVMRXRCUVVzc1RVRkJUU3hQUVVGUExFbEJRVWtzVVVGQlVTeEZRVUZGTzFsQlF6bENMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zVDBGQlR5eERRVUZETzJkQ1FVTXhRaXhqUVVGakxFTkJRVU1zVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUXpsQ0xHTkJRV01zUTBGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPMU5CUXpOQ08xRkJRMFFzVFVGQlRTeGhRVUZoTEVkQlFVY3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JJTEUxQlFVMHNWVUZCVlN4SFFVRXdRaXhGUVVGRkxFTkJRVU03VVVGRE4wTXNZVUZCWVN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExGVkJRVlVzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRlZCUVZVc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla1VzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZPMWxCUTNSRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZUVNc2MwSkJRWE5DTzFGQlEzUkNMRGhEUVVFNFF6dFJRVU01UXl4dlEwRkJiME03VVVGRGNFTXNORU5CUVRSRE8xRkJRelZETEdkRFFVRm5RenRSUVVOb1F5eHZRa0ZCYjBJN1VVRkRjRUlzWVVGQllUdFJRVU5pTERaRFFVRTJRenRSUVVNM1F5eE5RVUZOTzFGQlEwNHNTVUZCU1R0SlFVTk9MRU5CUVVNN1NVRkZUeXhwUWtGQmFVSXNRMEZCUXl4TlFVRjFRaXhGUVVGRkxFdEJRV0U3VVVGRE9VUXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUzBGQlN5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRE4wUXNUVUZCVFN4UlFVRlJMRWRCUVVjc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xRkJRM3BETEUxQlFVMHNXVUZCV1N4SFFVRjFRaXhGUVVGRkxFTkJRVU03VVVGRE5VTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEV0QlFVc3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRaUVVNNVFpeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRM0pDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEzaEZMRTFCUVUwc1EwRkJReXhIUVVGSExFMUJRVTBzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJReTlDTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRkZCUVZFN2IwSkJRMmhFTEZOQlFWTTdaMEpCUTFnc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRTFCUVUwc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdZVUZEYUVRN1UwRkRSanRSUVVORUxFOUJRVThzV1VGQldTeERRVUZETzBsQlEzUkNMRU5CUVVNN1NVRkZUeXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFXdENMRVZCUVVVc1dVRkJaME1zUlVGQlJTeExRVUZoTzFGQlEzUkdMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU12UXl4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGbEJRVmtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGREwwTXNUVUZCVFN4VlFVRlZMRWRCUVRSQ0xFVkJRVVVzUTBGQlF6dFJRVU12UXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zVDBGQlR5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsQ0xFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVRkRPMmRDUVVOMFFpeFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRek5DTEZWQlFWVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZET1VJc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRFNDeHZSRUZCYjBRN1VVRkRjRVFzYlVSQlFXMUVPMUZCUTI1RUxFbEJRVWtzVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnVRaXhOUVVGTkxHdENRVUZyUWl4SFFVRkhMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdVVUZEYmtRc2EwSkJRV3RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eFZRVUZWTEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03VVVGRE4wWXNTVUZCU1N4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJSV1lzU1VGQlNTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTJoQ0xFMUJRVTBzVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnlRaXhMUVVGTExFMUJRVTBzVjBGQlZ5eEpRVUZKTEd0Q1FVRnJRaXhGUVVGRk8xbEJRelZETEUxQlFVMHNUMEZCVHl4SFFVRkhMRlZCUVZVc1EwRkJReXhYUVVGclFpeERRVUZGTEVOQlFVTTdXVUZEYUVRc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeFRRVUZUTEVOQlFVTXNUMEZCVHl4RlFVRkZMRmxCUVZrc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFpRVU5xUlN4SlFVRkpMRlZCUVZVc1MwRkJTeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSVHRuUWtGRE1VTXNWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRuUWtGRFppeFBRVUZQTEVsQlFVa3NWVUZCVlN4SFFVRkhMRTFCUVUwc1EwRkJRenRuUWtGREwwSXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRPMkZCUTJ4RE8xbEJRMFFzVFVGQlRTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRkRMRlZCUVZVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUjBGQlJ5eFZRVUZWTEVkQlFVY3NUVUZCVFN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRE8xbEJRM0JGTEhWRVFVRjFSRHRaUVVWMlJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEycEVMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNSMEZCUnl4TlFVRk5MRWRCUVVjc1QwRkJUeXhEUVVGRE8yZENRVU14UlN4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVkQlFVY3NUVUZCVFN4SFFVRkhMRTlCUVU4c1EwRkJRenRoUVVNelJUdFpRVU5FTEZWQlFWVXNSVUZCUlN4RFFVRkRPMU5CUTJRN1VVRkRSQ3hQUVVGUExFVkJRVU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUXl4RFFVRkRPMGxCUXpGQ0xFTkJRVU03U1VGRlR5eGhRVUZoTEVOQlFVTXNVVUZCYTBJc1JVRkJSU3hEUVVGVExFVkJRVVVzUTBGQlV6dFJRVU0xUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZETjBJc1RVRkJUU3hSUVVGUkxFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXpkQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUTNoRExFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRkZCUVZFN1owSkJRekZDTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU03VTBGRE1VSTdTVUZEU0N4RFFVRkRPMGxCUTAwc1kwRkJZeXhEUVVGRExGbEJRV2RETEVWQlFVVXNTMEZCWVR0UlFVTnVSU3hKUVVGSkxGVkJRVlVzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZEYmtJc1RVRkJUU3hGUVVGRkxFZEJRV0VzUlVGQlJTeERRVUZETzFGQlEzaENMRTFCUVUwc1JVRkJSU3hIUVVGaExFVkJRVVVzUTBGQlF6dFJRVU40UWl4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU0zUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVOeVF5eE5RVUZOTEZGQlFWRXNSMEZCWVN4SlFVRkpMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOeVJDeExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVTdXVUZEZWtNc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTnVSQ3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFTkJRVkVzUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4SFFVRkhMRkZCUVZFc1IwRkJSeXhEUVVGRE8yOUNRVU40UlN4WlFVRlpMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zUTBGQlVTeERRVUZETEV0QlFVc3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVU3YjBKQlEzcEZMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2IwSkJRMjVDTEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdiMEpCUTI1Q0xFbEJRVWtzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0M1FrRkROVVFzU1VGQlNTeFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenMwUWtGRE4wTXNTVUZCU1N4RFFVRkRMR0ZCUVdFc1EwRkJReXhSUVVGUkxFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzNGQ1FVTjBSRHQ1UWtGQlRTeEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0M1FrRkRja01zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR4UWtGRE0wTTdlVUpCUVUwc1NVRkJTU3hSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3ZDBKQlEzSkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdjVUpCUXpORE8zbENRVUZOTzNkQ1FVTk1MRlZCUVZVc1JVRkJSU3hEUVVGRE8zZENRVU5pTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdkMEpCUTJwRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU03Y1VKQlEyeERPMmxDUVVOR08yRkJRMFk3VTBGRFJqdFJRVU5FTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRM1JETEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTjBRaXhWUVVGVkxFVkJRVWNzUTBGQlF6dG5Ra0ZEWkN4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETzJGQlF6RkNPMU5CUTBZN1VVRkRSQ3hQUVVGUExFVkJRVU1zVVVGQlVTeEZRVUZGTEVWQlFVVXNSVUZCUlN4SlFVRkpMRmRCUVZjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVWQlFVVXNTVUZCU1N4WFFVRlhMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVU1zUTBGQlF6dEpRVU4wUlN4RFFVRkRPMGxCUlVRc01FWkJRVEJHTzBsQlEyeEdMR2xDUVVGcFFpeERRVUZETEUxQlFYVkNMRVZCUVVVc1MwRkJZVHRSUVVNNVJDeEpRVUZKTEZWQlFWVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRia0lzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMUZCUTNoQ0xFMUJRVTBzUlVGQlJTeEhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTjRRaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTNSQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEZWtNc1RVRkJUU3hSUVVGUkxFZEJRV0VzU1VGQlNTeExRVUZMTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY2tRc1RVRkJUU3huUWtGQlowSXNSMEZCUnl4SlFVRkpMRmRCUVZjc1EwRkJReXhMUVVGTExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VRc1NVRkJTU3hoUVVGaExFZEJRVWNzUTBGQlF5eERRVUZETzFGQlEzUkNMR2RDUVVGblFpeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVONFFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUzBGQlN5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRM2hGTEUxQlFVMHNRMEZCUXl4SFFVRkhMRTFCUVUwc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUXk5Q0xFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEZGQlFWRTdiMEpCUTJwRUxGTkJRVk03WjBKQlExZ3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEV0N4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTllMR0ZCUVdFc1JVRkJSU3hEUVVGRE8yZENRVU5vUWl4SlFVRkpMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdiMEpCUXpWRExFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU03ZDBKQlF6ZENMRWxCUVVrc1EwRkJReXhoUVVGaExFTkJRVU1zVVVGQlVTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRwUWtGRGRFTTdjVUpCUVUwc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN2IwSkJRemRDTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdhVUpCUXpOQ08zRkNRVUZOTEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTzI5Q1FVTTNRaXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8ybENRVU16UWp0eFFrRkJUVHR2UWtGRFRDeFZRVUZWTEVWQlFVVXNRMEZCUXp0dlFrRkRZaXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRPMjlDUVVONlFpeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRE8ybENRVU14UWp0aFFVTkdPMWxCUTBRc1owSkJRV2RDTEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExHRkJRV0VzUTBGQlF6dFRRVU42UXp0UlFVTkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFsQlEzUkRMRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPMmRDUVVOMFFpeFZRVUZWTEVWQlFVY3NRMEZCUXp0blFrRkRaQ3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRPMkZCUXpGQ08xTkJRMFk3VVVGRFJDeFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1NVRkJTU3hYUVVGWExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNaMEpCUVdkQ0xFVkJRVU1zUTBGQlF6dEpRVU40Uml4RFFVRkRPMGxCUlUwc1dVRkJXU3hEUVVGRExGbEJRV2RETzFGQlEyeEVMRTFCUVUwc1dVRkJXU3hIUVVGNVF5eEZRVUZGTEVOQlFVTTdVVUZET1VRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGRrTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYkVZc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU5zUXl4WlFVRlpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOMlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NXVUZCV1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFRRVU51Ump0UlFVTkVMRTlCUVU4c1dVRkJXU3hEUVVGRE8wbEJRM1JDTEVOQlFVTTdTVUZGVHl4UlFVRlJMRU5CUVVNc1dVRkJaME1zUlVGQlJTeExRVUZoTzFGQlF6bEVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyeENMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZEZGtJc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVlVGQlZTeERRVUZETzFOQlF5OURPMGxCUTBnc1EwRkJRenRKUVVWUExGTkJRVk1zUTBGQlF5eFpRVUZuUXp0UlFVTm9SQ3hMUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFVkJRVVU3V1VGRGVrTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1dVRkJXU3hEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETzFsQlEyNURMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVU5hTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xFZEJRVWNzU1VGQlNTeEhRVUZITEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNN1dVRkRka0lzU1VGQlNTeEhRVUZITEV0QlFVc3NRMEZCUXp0blFrRkJSU3hUUVVGVE8xbEJRM2hDTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU03VTBGRE0wTTdTVUZEU0N4RFFVRkRPMGxCUlU4c1RVRkJUU3hEUVVGRExGbEJRV2RETEVWQlFVVXNTMEZCWVR0UlFVTTFSQ3hOUVVGTkxHTkJRV01zUjBGQmRVSXNSVUZCUlN4RFFVRkRPMUZCUXpsRExFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpkRUxFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzSkRMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyeENMRk5CUVZNN1dVRkRXQ3dyUWtGQkswSTdXVUZETDBJc1kwRkJZeXhEUVVGRExFTkJRVU1zVFVGQmFFSXNZMEZCWXl4RFFVRkRMRU5CUVVNc1NVRkJUU3hGUVVGRkxFVkJRVU03V1VGRGVrSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEV0QlFVc3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRuUWtGRE9VSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0dlFrRkRka0lzVTBGQlV6dG5Ra0ZEV0N4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zWTBGQll5eERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eGpRVUZqTzJkQ1FVTnVSU3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4SFFVRkhMRkZCUVZFc1EwRkJReXhIUVVGSExGRkJRVkVzUjBGQlJ5eERRVUZETEVWQlFVVTdiMEpCUXpkRExHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03YjBKQlF6TkNMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUTBGQlF5eERRVUZETzNkQ1FVTndRaXhqUVVGakxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMjlDUVVONlFpeGpRVUZqTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzJsQ1FVTTFRanRoUVVOR08xTkJRMFk3VVVGRFJDeFBRVUZQTEdOQlFXTXNRMEZCUXp0SlFVTjRRaXhEUVVGRE8wbEJSVVFzYlVSQlFXMUVPMGxCUlc1RUxFbEJRVWs3U1VGRlNTeFBRVUZQTEVOQlFVTXNXVUZCWjBNN1VVRkRPVU1zUzBGQlN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEZRVUZGTzFsQlEzcERMRTFCUVUwc1IwRkJSeXhIUVVGSExGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXp0WlFVTnVReXhMUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRE8yZENRVU01UWl4WlFVRlpMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zUTBGQlVTeERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNRMEZCVVN4RFFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXp0VFFVTTVSenRKUVVOSUxFTkJRVU03U1VGRlR5eGpRVUZqTEVOQlFVTXNXVUZCWjBNc1JVRkJSU3hEUVVGTkxFVkJRVVVzUTBGQlRUdFJRVU55UlN4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRFdpeE5RVUZOTEdOQlFXTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNc1EwRkJRenRSUVVNeFJDeE5RVUZOTEZsQlFWa3NSMEZCUnl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNc1EwRkJRenRSUVVONFJDeExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMR05CUVdNc1JVRkJSVHRaUVVNNVFpeEpRVUZKTEZsQlFWa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU14UWl4SFFVRkhMRWxCUVVrc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFWRXNRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXp0VFFVTm9SVHRSUVVORUxFOUJRVThzUjBGQlJ5eERRVUZETzBsQlEySXNRMEZCUXp0RFFVTkdJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRUY0dGeWMyVk5ZWFJ5YVhoU1pYTjFiSFI5SUdaeWIyMGdKeTR1TDJScGMzUmhibU5sTFcxaGRISnBlQzl6Y0dGeWMyVXRiV0YwY21sNExYTmxjblpwWTJVbk8xeHVhVzF3YjNKMElIdGlhVzlNWVhsdmRYUjlJR1p5YjIwZ0p5NHZZbWx2TFd4aGVXOTFkQ2M3WEc1cGJYQnZjblFnZTAxRFRFOXdkR2x2Ym5Nc0lGTndZWEp6WlUxaGRISnBlRTlpYW1WamRIMGdabkp2YlNBbkxpOTBlWEJsY3ljN1hHNXBiWEJ2Y25RZ2UwMURURTl3VW1WMGRYSnVWSGx3WlgwZ1puSnZiU0FuUUdSaGRHRm5jbTlyTFd4cFluSmhjbWxsY3k5dFlYUm9MM055WXk5M1pXSkhVRlV2VFVOTUwzUjVjR1Z6Snp0Y2JtbHRjRzl5ZENCN2JXRnlhMjkyUTJ4MWMzUmxjbGRsWWtkUVZYMGdabkp2YlNBblFHUmhkR0ZuY205ckxXeHBZbkpoY21sbGN5OXRZWFJvTDNOeVl5OTNaV0pIVUZVdlRVTk1MMDFEVEMxM1pXSkhVRlVuTzF4dVpYaHdiM0owSUdOdmJuTjBJR1JsWm1GMWJIUk5RMHhQY0hScGIyNXpPaUJOUTB4UGNIUnBiMjV6SUQwZ2UxeHVJQ0JsZUhCaGJtUkdZV04wYjNJNklESXNYRzRnSUcxaGVFbDBaWEpoZEdsdmJuTTZJRFVzWEc0Z0lHbHVabXhoZEdWR1lXTjBiM0k2SURJc1hHNGdJRzExYkhSR1lXTjBiM0k2SURFc1hHNTlPMXh1WEc1bGVIQnZjblFnWTJ4aGMzTWdUVU5NVTNCaGNuTmxVbVZrZFdObGNpQjdYRzRnSUhCeWFYWmhkR1VnWDI5d2RHbHZibk02SUUxRFRFOXdkR2x2Ym5NN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb2IzQjBjem9nVUdGeWRHbGhiRHhOUTB4UGNIUnBiMjV6UGlBOUlIdDlLU0I3WEc0Z0lDQWdkR2hwY3k1ZmIzQjBhVzl1Y3lBOUlIc3VMaTVrWldaaGRXeDBUVU5NVDNCMGFXOXVjeXdnTGk0dWIzQjBjMzA3WEc0Z0lIMWNibHh1SUNCd2RXSnNhV01nWVhONWJtTWdkSEpoYm5ObWIzSnRLSE53WVhKelpVMWhkSEpwZURvZ1UzQmhjbk5sVFdGMGNtbDRVbVZ6ZFd4MExDQnVVbTkzY3pvZ2JuVnRZbVZ5S1NCN1hHNGdJQ0FnTHk4Z2RHVnpkRmR2Y210bGNrMTFiSFJwY0d4NUtDazdYRzRnSUNBZ0x5OGdjbVYwZFhKdUlHNWxkeUJKYm5Rek1rRnljbUY1S0c1U2IzZHpLVHRjYmlBZ0lDQnNaWFFnYzNCaGNuTmxUMkpxWldOMElEMGdkR2hwY3k1MGIwOWlhbVZqZEVadmNtMG9jM0JoY25ObFRXRjBjbWw0S1R0Y2JpQWdJQ0JwWmlBb2RHaHBjeTVmYjNCMGFXOXVjeTV0WVhoSmRHVnlZWFJwYjI1eklENGdNQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NWhaR1JNYjI5d2N5aHpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQWdJSFJvYVhNdWJtOXliV0ZzYVhwbEtITndZWEp6WlU5aWFtVmpkQ2s3WEc0Z0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhSb2FYTXVYMjl3ZEdsdmJuTXViV0Y0U1hSbGNtRjBhVzl1Y3pzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRDQTlJSFJvYVhNdVpYaHdZVzVrS0hOd1lYSnpaVTlpYW1WamRDd2dibEp2ZDNNcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1sdVpteGhkR1VvYzNCaGNuTmxUMkpxWldOMEtUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dWIzSnRZV3hwZW1Vb2MzQmhjbk5sVDJKcVpXTjBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjM1FnZTJOc2RYTjBaWEp6TENCcGN5d2dhbk45SUQwZ2RHaHBjeTVoYzNOcFoyNURiSFZ6ZEdWeWN5aHpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQjBhR2x6TG1OdmNuSmxZM1JEYkhWemRHVnljeWhqYkhWemRHVnljeWs3WEc0Z0lDQWdZMjl1YzNRZ1pXMWlaV1JrYVc1bmN5QTlJR0YzWVdsMElIUm9hWE11YkdGNWIzVjBLR05zZFhOMFpYSnpMQ0J6Y0dGeWMyVlBZbXBsWTNRc0lHNVNiM2R6S1R0Y2JpQWdJQ0J5WlhSMWNtNGdlMk5zZFhOMFpYSnpMQ0JsYldKbFpGZzZJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUllMQ0JsYldKbFpGazZJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUlpMQ0JwY3l3Z2FuTjlPMXh1SUNCOVhHNWNiaUFnY0hWaWJHbGpJR0Z6ZVc1aklIUnlZVzV6Wm05eWJWZGxZa2RRVlNoemNHRnljMlZOWVhSeWFYZzZJRk53WVhKelpVMWhkSEpwZUZKbGMzVnNkQ3dnYmxKdmQzTTZJRzUxYldKbGNpa2dlMXh1SUNBZ0lHbG1JQ2gwYUdsekxsOXZjSFJwYjI1ekxtMWhlRWwwWlhKaGRHbHZibk1nUFQwOUlEQXBYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUwY21GdWMyWnZjbTBvYzNCaGNuTmxUV0YwY21sNExDQnVVbTkzY3lrN1hHNWNiaUFnSUNCamIyNXpkQ0J0WTJ4U1pYTWdQU0JoZDJGcGRDQnRZWEpyYjNaRGJIVnpkR1Z5VjJWaVIxQlZLRnh1SUNBZ0lDQWdjM0JoY25ObFRXRjBjbWw0TENCdVVtOTNjeXdnZEdocGN5NWZiM0IwYVc5dWN5NXRZWGhKZEdWeVlYUnBiMjV6TENCMGFHbHpMbDl2Y0hScGIyNXpMbWx1Wm14aGRHVkdZV04wYjNKY2JpQWdJQ0FwTzF4dUlDQWdJR052Ym5OMElITndZWEp6WlU5aWFtVmpkQ0E5SUhSb2FYTXVZM055Vkc5VGNHRnljMlZQWW1wbFkzUW9iV05zVW1WekxDQnVVbTkzY3lrN1hHNGdJQ0FnWTI5dWMzUWdlMk5zZFhOMFpYSnpMQ0JwY3l3Z2FuTjlJRDBnZEdocGN5NWhjM05wWjI1RGJIVnpkR1Z5Y3loemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNCMGFHbHpMbU52Y25KbFkzUkRiSFZ6ZEdWeWN5aGpiSFZ6ZEdWeWN5azdYRzRnSUNBZ1kyOXVjM1FnWlcxaVpXUmthVzVuY3lBOUlHRjNZV2wwSUhSb2FYTXViR0Y1YjNWMEtHTnNkWE4wWlhKekxDQnpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQnlaWFIxY200Z2UyTnNkWE4wWlhKekxDQmxiV0psWkZnNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWUxDQmxiV0psWkZrNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWkxDQnBjeXdnYW5OOU8xeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmpiM0p5WldOMFEyeDFjM1JsY25Nb1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZEtTQjdYRzRnSUNBZ1kyOXVjM1FnWTJ4MWMzUmxjbE5wZW1WTllYQTZJSHRiWHpvZ2JuVnRZbVZ5WFRvZ2JuVnRZbVZ5ZlNBOUlIdDlPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdZMngxYzNSbGNpQnZaaUJqYkhWemRHVnljeWtnZTF4dUlDQWdJQ0FnYVdZZ0tDRmpiSFZ6ZEdWeVUybDZaVTFoY0Z0amJIVnpkR1Z5WFNsY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2xOcGVtVk5ZWEJiWTJ4MWMzUmxjbDBnUFNBd08xeHVJQ0FnSUNBZ1kyeDFjM1JsY2xOcGVtVk5ZWEJiWTJ4MWMzUmxjbDByS3p0Y2JpQWdJQ0I5WEc0Z0lDQWdZMjl1YzNRZ2MyOXlkR1ZrU1c1a1pYaGxjeUE5SUU5aWFtVmpkQzVyWlhsektHTnNkWE4wWlhKVGFYcGxUV0Z3S1M1dFlYQW9UblZ0WW1WeUtTNXpiM0owS0NoaExDQmlLU0E5UGlCamJIVnpkR1Z5VTJsNlpVMWhjRnRoWFNBdElHTnNkWE4wWlhKVGFYcGxUV0Z3VzJKZEtUdGNiaUFnSUNCamIyNXpkQ0JqYkhWemRHVnlUV0Z3T2lCN1cxODZJRzUxYldKbGNsMDZJRzUxYldKbGNuMGdQU0I3ZlR0Y2JpQWdJQ0J6YjNKMFpXUkpibVJsZUdWekxtWnZja1ZoWTJnb0tHTnNkWE4wWlhKSlpIZ3NJR2twSUQwK0lHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNrbGtlRjBnUFNCcElDc2dNU2s3WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JqYkhWemRHVnljeTVzWlc1bmRHZzdJR2tyS3lsY2JpQWdJQ0FnSUdOc2RYTjBaWEp6VzJsZElEMGdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnljMXRwWFYwN1hHNGdJQ0FnTHk4Z2JHVjBJR04xY2tOc2RYTjBaWElnUFNBeE8xeHVJQ0FnSUM4dklHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZMngxYzNSbGNuTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0F2THlBZ0lHbG1JQ2doWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5YzF0cFhWMHBJSHRjYmlBZ0lDQXZMeUFnSUNBZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeWMxdHBYVjBnUFNCamRYSkRiSFZ6ZEdWeU8xeHVJQ0FnSUM4dklDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTjFja05zZFhOMFpYSTdYRzRnSUNBZ0x5OGdJQ0FnSUdOMWNrTnNkWE4wWlhJckt6dGNiaUFnSUNBdkx5QWdJSDBnWld4elpTQjdYRzRnSUNBZ0x5OGdJQ0FnSUdOc2RYTjBaWEp6VzJsZElEMGdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnljMXRwWFYwN1hHNGdJQ0FnTHk4Z0lDQjlYRzRnSUNBZ0x5OGdmVnh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JqYzNKVWIxTndZWEp6WlU5aWFtVmpkQ2h0WTJ4U1pYTTZJRTFEVEU5d1VtVjBkWEp1Vkhsd1pTd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdOdmJuTjBJRzl5WkdWeUlEMGdUV0YwYUM1bWJHOXZjaWhOWVhSb0xtMWhlQ2hOWVhSb0xteHZaekV3S0c1U2IzZHpLU3dnTWlrcElDc2dNVHRjYmlBZ0lDQmpiMjV6ZENCdGFXNVBjbVJsY2lBOUlERWdMeUJOWVhSb0xuQnZkeWd4TUN3Z2IzSmtaWElwTzF4dUlDQWdJR052Ym5OMElITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wSUQwZ2UzMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnVVbTkzY3pzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmFWMGdQU0I3ZlR0Y2JpQWdJQ0FnSUdadmNpQW9iR1YwSUdzZ1BTQnRZMnhTWlhNdWFXNWtaWGhQWm1aelpYUnpXMmxkT3lCcklEd2diV05zVW1WekxtbHVaR1Y0VDJabWMyVjBjMXRwSUNzZ01WMDdJR3NyS3lrZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCcUlEMGdiV05zVW1WekxrdE9Ua2x1WkdWNFpYTmJhMTA3WEc0Z0lDQWdJQ0FnSUdsbUlDaHFJRHc5SUdrZ2ZId2diV05zVW1WekxrdE9UbE5wYldsc1lYSnBkR2xsYzF0clhTQThJRzFwYms5eVpHVnlLVnh1SUNBZ0lDQWdJQ0FnSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJhVjFiYWwwZ1BTQnRZMnhTWlhNdVMwNU9VMmx0YVd4aGNtbDBhV1Z6VzJ0ZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdjM0JoY25ObFQySnFaV04wTzF4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCaGMzbHVZeUJzWVhsdmRYUW9ZMngxYzNSbGNuTTZJRzUxYldKbGNsdGRMQ0J6Y0dGeWMyVk5ZWFJ5YVhnNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdOdmJuTjBJR1Z0WW1Wa1dDQTlJRzVsZHlCR2JHOWhkRE15UVhKeVlYa29ibEp2ZDNNcExtWnBiR3dvTUNrN1hHNGdJQ0FnWTI5dWMzUWdaVzFpWldSWklEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaHVVbTkzY3lrdVptbHNiQ2d3S1R0Y2JpQWdJQ0JqYjI1emRDQmpiSFZ6ZEdWeVRXRndPaUI3VzE4NklHNTFiV0psY2wwNklHNTFiV0psY2x0ZGZTQTlJSHQ5TzF4dUlDQWdJR05zZFhOMFpYSnpMbVp2Y2tWaFkyZ29LR05zZFhOMFpYSXNJR2twSUQwK0lIdGNiaUFnSUNBZ0lHbG1JQ2doWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5WFNsY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeVhTQTlJRnRkTzF4dUlDQWdJQ0FnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5WFM1d2RYTm9LR2twTzF4dUlDQWdJSDBwTzF4dUlDQWdJQzh2SUdOdmJuTjBJRzVEYkhWemRHVnljeUE5SUU5aWFtVmpkQzVyWlhsektHTnNkWE4wWlhKTllYQXBMbXhsYm1kMGFEdGNiaUFnSUNBdkx5QmpiMjV6ZENCd1pYSlNiM2NnUFNCTllYUm9MbVpzYjI5eUtFMWhkR2d1YzNGeWRDaHVRMngxYzNSbGNuTXBLVHRjYmlBZ0lDQnNaWFFnWTJ4MWMzUmxjazUxYlNBOUlEQTdYRzRnSUNBZ1kyOXVjM1FnYzI5eWRHVmtRMngxYzNSbGNrNWhiV1Z6SUQwZ1QySnFaV04wTG10bGVYTW9ZMngxYzNSbGNrMWhjQ2s3WEc0Z0lDQWdjMjl5ZEdWa1EyeDFjM1JsY2s1aGJXVnpMbk52Y25Rb0tHRXNJR0lwSUQwK0lHTnNkWE4wWlhKTllYQmJZaUJoY3lCaGJubGRMbXhsYm1kMGFDQXRJR05zZFhOMFpYSk5ZWEJiWVNCaGN5QmhibmxkTG14bGJtZDBhQ2s3WEc0Z0lDQWdiR1YwSUhCbGNsSnZkeUE5SURZN1hHNWNiaUFnSUNCc1pYUWdlVTltWm5ObGRDQTlJREE3WEc0Z0lDQWdZMjl1YzNRZ2JHRjViM1YwVTJsNlpTQTlJRFU3WEc0Z0lDQWdabTl5SUNoamIyNXpkQ0JqYkhWemRHVnlUbUZ0WlNCdlppQnpiM0owWldSRGJIVnpkR1Z5VG1GdFpYTXBJSHRjYmlBZ0lDQWdJR052Ym5OMElHTnNkWE4wWlhJZ1BTQmpiSFZ6ZEdWeVRXRndXMk5zZFhOMFpYSk9ZVzFsSUdGeklHRnVlVjBoTzF4dUlDQWdJQ0FnWTI5dWMzUWdaVzFpWldSa2FXNW5jeUE5SUdGM1lXbDBJR0pwYjB4aGVXOTFkQ2hqYkhWemRHVnlMQ0J6Y0dGeWMyVk5ZWFJ5YVhnc0lEQXVNREF4S1R0Y2JpQWdJQ0FnSUdsbUlDaGpiSFZ6ZEdWeVRuVnRJRDA5UFNCTllYUm9MbU5sYVd3b2NHVnlVbTkzSUM4Z01TNDFLU2tnZTF4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5VG5WdElEMGdNRHRjYmlBZ0lDQWdJQ0FnZVU5bVpuTmxkQ0FyUFNCc1lYbHZkWFJUYVhwbElDOGdjR1Z5VW05M08xeHVJQ0FnSUNBZ0lDQndaWEpTYjNjZ1BTQk5ZWFJvTG1ObGFXd29jR1Z5VW05M0lDb2dNUzQxS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdOdmJuTjBJRzltWm5ObGRGZ2dQU0FvS0dOc2RYTjBaWEpPZFcwZ0pTQndaWEpTYjNjcElDb2diR0Y1YjNWMFUybDZaU0F2SUhCbGNsSnZkeWtnS2lBeExqVTdYRzRnSUNBZ0lDQXZMeUJqYjI1emRDQnZabVp6WlhSWklEMGdUV0YwYUM1bWJHOXZjaWhqYkhWemRHVnlUblZ0SUM4Z2NHVnlVbTkzS1NBcUlESTdYRzVjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWlcxaVpXUmthVzVuY3k1bGJXSmxaRmd1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdaVzFpWldSWVcyTnNkWE4wWlhKYmFWMWRJRDBnWlcxaVpXUmthVzVuY3k1bGJXSmxaRmhiYVYwZ0tpQnNZWGx2ZFhSVGFYcGxJQzhnY0dWeVVtOTNJQ3NnYjJabWMyVjBXRHRjYmlBZ0lDQWdJQ0FnWlcxaVpXUlpXMk5zZFhOMFpYSmJhVjFkSUQwZ1pXMWlaV1JrYVc1bmN5NWxiV0psWkZsYmFWMGdLaUJzWVhsdmRYUlRhWHBsSUM4Z2NHVnlVbTkzSUNzZ2VVOW1abk5sZER0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdOc2RYTjBaWEpPZFcwckt6dGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSHRsYldKbFpGZ3NJR1Z0WW1Wa1dYMDdYRzRnSUgxY2JseHVJQ0J3Y21sMllYUmxJRzFsY21kbFEyeDFjM1JsY25Nb1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZExDQnBPaUJ1ZFcxaVpYSXNJR282SUc1MWJXSmxjaWtnZTF4dUlDQWdJR052Ym5OMElHbERiSFZ6ZEdWeUlEMGdZMngxYzNSbGNuTmJhVjA3WEc0Z0lDQWdZMjl1YzNRZ2FrTnNkWE4wWlhJZ1BTQmpiSFZ6ZEdWeWMxdHFYVHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnJJRDBnTURzZ2F5QThJR05zZFhOMFpYSnpMbXhsYm1kMGFEc2dheXNyS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJhMTBnUFQwOUlHcERiSFZ6ZEdWeUtWeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHJYU0E5SUdsRGJIVnpkR1Z5TzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J3ZFdKc2FXTWdZWE56YVdkdVEyeDFjM1JsY25Nb2MzQmhjbk5sVFdGMGNtbDRPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQnNaWFFnWTJ4MWMzUmxjazUxYlNBOUlEQTdYRzRnSUNBZ1kyOXVjM1FnYVhNNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2FuTTZJRzUxYldKbGNsdGRJRDBnVzEwN1hHNGdJQ0FnWTI5dWMzUWdiM0prWlhJZ1BTQk5ZWFJvTG1ac2IyOXlLRTFoZEdndWJXRjRLRTFoZEdndWJHOW5NVEFvYmxKdmQzTXBMQ0F5S1NrZ0t5QXhPMXh1SUNBZ0lHTnZibk4wSUcxcGJrOXlaR1Z5SUQwZ1RXRjBhQzV3YjNjb01UQXNJRzl5WkdWeUtUdGNiaUFnSUNCamIyNXpkQ0JqYkhWemRHVnljem9nYm5WdFltVnlXMTBnUFNCdVpYY2dRWEp5WVhrb2JsSnZkM01wTG1acGJHd29MVEVwTzF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnYVNCdlppQlBZbXBsWTNRdWEyVjVjeWh6Y0dGeWMyVk5ZWFJ5YVhncEtTQjdYRzRnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR29nYjJZZ1QySnFaV04wTG10bGVYTW9jM0JoY25ObFRXRjBjbWw0VzJrZ1lYTWdZVzU1WFNrcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0UxaGRHZ3VjbTkxYm1Rb2MzQmhjbk5sVFdGMGNtbDRXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBnS2lCdGFXNVBjbVJsY2lrZ0x5QnRhVzVQY21SbGNpQStJREFnSmlaY2JpQWdJQ0FnSUNBZ0lDQnpjR0Z5YzJWTllYUnlhWGhiYVNCaGN5QmhibmxkVzJvZ1lYTWdZVzU1WFNBaFBUMGdUblZ0WW1WeUtHa3BJQ1ltSUU1MWJXSmxjaWhxS1NBK0lFNTFiV0psY2locEtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdsekxuQjFjMmdvVG5WdFltVnlLR2twS1R0Y2JpQWdJQ0FnSUNBZ0lDQnFjeTV3ZFhOb0tFNTFiV0psY2locUtTazdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcwNTFiV0psY2locEtWMGdJVDA5SUMweElDWW1JR05zZFhOMFpYSnpXMDUxYldKbGNpaHFLVjBnSVQwOUlDMHhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjbk5iVG5WdFltVnlLR2twWFNBaFBUMGdZMngxYzNSbGNuTmJUblZ0WW1WeUtHb3BYU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dFpYSm5aVU5zZFhOMFpYSnpLR05zZFhOMFpYSnpMQ0JPZFcxaVpYSW9hU2tzSUU1MWJXSmxjaWhxS1NrN1hHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYkhWemRHVnljMXRPZFcxaVpYSW9hU2xkSUNFOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNuTmJUblZ0WW1WeUtHb3BYU0E5SUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwN1hHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYkhWemRHVnljMXRPZFcxaVpYSW9haWxkSUNFOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNuTmJUblZ0WW1WeUtHa3BYU0E5SUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwN1hHNGdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEpPZFcwckt6dGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwZ1BTQmpiSFZ6ZEdWeVRuVnRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTQTlJR05zZFhOMFpYSk9kVzA3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1Ec2dhU0E4SUdOc2RYTjBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjbk5iYVYwZ1BUMDlJQzB4S1NCN1hHNGdJQ0FnSUNBZ0lHTnNkWE4wWlhKT2RXMGdLeXM3WEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzJsZElEMGdZMngxYzNSbGNrNTFiVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUh0amJIVnpkR1Z5Y3l3Z2FYTTZJRzVsZHlCVmFXNTBNekpCY25KaGVTaHBjeWtzSUdwek9pQnVaWGNnVldsdWRETXlRWEp5WVhrb2FuTXBmVHRjYmlBZ2ZWeHVYRzRnSUM4cUtpQnpZVzFsSUdGeklHRnpjMmxuYmlCamJIVnpkR1Z5Y3lCaWRYUWdkMjl5YTJsdVp5QnZiaUIwYUdVZ2JHVjJaV3dnYjJZZ1ExTlNJR1p2Y20xaGRDQnlaWFIxY201bFpDQm1jbTl0SUhkbFlrZFFWU0FxTDF4dUlDQndjbWwyWVhSbElHRnpjMmxuYmtOc2RYTjBaWEp6UTFOU0tHMWpiRkpsY3pvZ1RVTk1UM0JTWlhSMWNtNVVlWEJsTENCdVVtOTNjem9nYm5WdFltVnlLU0I3WEc0Z0lDQWdiR1YwSUdOc2RYTjBaWEpPZFcwZ1BTQXdPMXh1SUNBZ0lHTnZibk4wSUdsek9pQnVkVzFpWlhKYlhTQTlJRnRkTzF4dUlDQWdJR052Ym5OMElHcHpPaUJ1ZFcxaVpYSmJYU0E5SUZ0ZE8xeHVJQ0FnSUdOdmJuTjBJRzl5WkdWeUlEMGdUV0YwYUM1bWJHOXZjaWhOWVhSb0xtMWhlQ2hOWVhSb0xteHZaekV3S0c1U2IzZHpLU3dnTWlrcElDc2dNVHRjYmlBZ0lDQmpiMjV6ZENCdGFXNVBjbVJsY2lBOUlERWdMeUJOWVhSb0xuQnZkeWd4TUN3Z2IzSmtaWElwTzF4dUlDQWdJR052Ym5OMElHTnNkWE4wWlhKek9pQnVkVzFpWlhKYlhTQTlJRzVsZHlCQmNuSmhlU2h1VW05M2N5a3VabWxzYkNndE1TazdYRzRnSUNBZ1kyOXVjM1FnWTI5eWNtVmpkR1ZrVDJabWMyVjBjeUE5SUc1bGR5QlZhVzUwTXpKQmNuSmhlU2h1VW05M2N5QXJJREVwTzF4dUlDQWdJR3hsZENCdlptWnpaWFJEYjNWdWRHVnlJRDBnTUR0Y2JpQWdJQ0JqYjNKeVpXTjBaV1JQWm1aelpYUnpXekJkSUQwZ01EdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHNVNiM2R6T3lCcEt5c3BJSHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR3NnUFNCdFkyeFNaWE11YVc1a1pYaFBabVp6WlhSelcybGRPeUJySUR3Z2JXTnNVbVZ6TG1sdVpHVjRUMlptYzJWMGMxdHBJQ3NnTVYwN0lHc3JLeWtnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JxSUQwZ2JXTnNVbVZ6TGt0T1RrbHVaR1Y0WlhOYmExMDdYRzRnSUNBZ0lDQWdJR2xtSUNocUlEdzlJR2tnZkh3Z2JXTnNVbVZ6TGt0T1RsTnBiV2xzWVhKcGRHbGxjMXRyWFNBOFBTQnRhVzVQY21SbGNpbGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQWdJQ0FnYVhNdWNIVnphQ2hwS1R0Y2JpQWdJQ0FnSUNBZ2FuTXVjSFZ6YUNocUtUdGNiaUFnSUNBZ0lDQWdiMlptYzJWMFEyOTFiblJsY2lzck8xeHVJQ0FnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjbk5iYVYwZ0lUMDlJQzB4SUNZbUlHTnNkWE4wWlhKelcycGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaGpiSFZ6ZEdWeWMxdHBYU0FoUFQwZ1kyeDFjM1JsY25OYmFsMHBYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTFsY21kbFEyeDFjM1JsY25Nb1kyeDFjM1JsY25Nc0lHa3NJR29wTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHTnNkWE4wWlhKelcybGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzJwZElEMGdZMngxYzNSbGNuTmJhVjA3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyeDFjM1JsY25OYmFsMGdJVDA5SUMweEtTQjdYRzRnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iYVYwZ1BTQmpiSFZ6ZEdWeWMxdHFYVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCamJIVnpkR1Z5VG5WdEt5czdYRzRnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iYVYwZ1BTQmpiSFZ6ZEdWeVRuVnRPMXh1SUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzJwZElEMGdZMngxYzNSbGNrNTFiVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnWTI5eWNtVmpkR1ZrVDJabWMyVjBjMXRwSUNzZ01WMGdQU0J2Wm1aelpYUkRiM1Z1ZEdWeU8xeHVJQ0FnSUgxY2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN0lHa2dQQ0JqYkhWemRHVnljeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLR05zZFhOMFpYSnpXMmxkSUQwOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5VG5WdElDc3JPMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTnNkWE4wWlhKT2RXMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUI3WTJ4MWMzUmxjbk1zSUdsek9pQnVaWGNnVldsdWRETXlRWEp5WVhrb2FYTXBMQ0JxY3pvZ2JtVjNJRlZwYm5Rek1rRnljbUY1S0dwektTd2dZMjl5Y21WamRHVmtUMlptYzJWMGMzMDdYRzRnSUgxY2JseHVJQ0J3ZFdKc2FXTWdkRzlQWW1wbFkzUkdiM0p0S0hOd1lYSnpaVTFoZEhKcGVEb2dVM0JoY25ObFRXRjBjbWw0VW1WemRXeDBLVG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wSUh0Y2JpQWdJQ0JqYjI1emRDQnpjR0Z5YzJWUFltcGxZM1E2SUh0Ylh6b2diblZ0WW1WeVhUb2dlMXRmT2lCdWRXMWlaWEpkT2lCdWRXMWlaWEo5ZlNBOUlIdDlPMXh1SUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2djM0JoY25ObFRXRjBjbWw0TG1rdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNnaGMzQmhjbk5sVDJKcVpXTjBXM053WVhKelpVMWhkSEpwZUM1cFcybGRYU2xjYmlBZ0lDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVwVzJsZFhTQTlJSHQ5TzF4dUlDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVwVzJsZFhWdHpjR0Z5YzJWTllYUnlhWGd1YWx0cFhWMGdQU0F4SUMwZ2MzQmhjbk5sVFdGMGNtbDRMbVJwYzNSaGJtTmxXMmxkTzF4dUlDQWdJQ0FnYVdZZ0tDRnpjR0Z5YzJWUFltcGxZM1JiYzNCaGNuTmxUV0YwY21sNExtcGJhVjFkS1Z4dUlDQWdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJjM0JoY25ObFRXRjBjbWw0TG1wYmFWMWRJRDBnZTMwN1hHNGdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJjM0JoY25ObFRXRjBjbWw0TG1wYmFWMWRXM053WVhKelpVMWhkSEpwZUM1cFcybGRYU0E5SURFZ0xTQnpjR0Z5YzJWTllYUnlhWGd1WkdsemRHRnVZMlZiYVYwN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnpjR0Z5YzJWUFltcGxZM1E3WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUdGa1pFeHZiM0J6S0hOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBMQ0J1VW05M2N6b2diblZ0WW1WeUtTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnVVbTkzY3pzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0JwWmlBb0lYTndZWEp6WlU5aWFtVmpkRnRwWFNsY2JpQWdJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmxkSUQwZ2UzMDdYRzRnSUNBZ0lDQnpjR0Z5YzJWUFltcGxZM1JiYVYxYmFWMGdQU0IwYUdsekxsOXZjSFJwYjI1ekxtMTFiSFJHWVdOMGIzSTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQnViM0p0WVd4cGVtVW9jM0JoY25ObFQySnFaV04wT2lCVGNHRnljMlZOWVhSeWFYaFBZbXBsWTNRcElIdGNiaUFnSUNCbWIzSWdLR052Ym5OMElHa2diMllnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVDJKcVpXTjBLU2tnZTF4dUlDQWdJQ0FnWTI5dWMzUWdjbTkzSUQwZ2MzQmhjbk5sVDJKcVpXTjBXMmtnWVhNZ1lXNTVYVHRjYmlBZ0lDQWdJR3hsZENCemRXMGdQU0F3TzF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCcUlHOW1JRTlpYW1WamRDNXJaWGx6S0hKdmR5a3BYRzRnSUNBZ0lDQWdJSE4xYlNBclBTQnliM2RiYWlCaGN5QmhibmxkTzF4dUlDQWdJQ0FnYVdZZ0tITjFiU0E5UFQwZ01Da2dZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR29nYjJZZ1QySnFaV04wTG10bGVYTW9jbTkzS1NsY2JpQWdJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBnTHowZ2MzVnRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEJ5YVhaaGRHVWdaWGh3WVc1a0tITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wTENCdVVtOTNjem9nYm5WdFltVnlLU0I3WEc0Z0lDQWdZMjl1YzNRZ1pYaHdZVzVrWldSUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZENBOUlIdDlPMXh1SUNBZ0lHTnZibk4wSUc5eVpHVnlJRDBnVFdGMGFDNW1iRzl2Y2loTllYUm9MbTFoZUNoTllYUm9MbXh2WnpFd0tHNVNiM2R6S1N3Z01pa3BJQ3NnTVR0Y2JpQWdJQ0JqYjI1emRDQnRhVzVQY21SbGNpQTlJRTFoZEdndWNHOTNLREV3TENCdmNtUmxjaWs3WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J1VW05M2N6c2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9JWE53WVhKelpVOWlhbVZqZEZ0cFhTbGNiaUFnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQXZMeUJqYjI1emRDQnliM2NnUFNCemNHRnljMlZQWW1wbFkzUmJhVjA3WEc0Z0lDQWdJQ0JsZUhCaGJtUmxaRTlpYW1WamRGdHBYU0EvUHowZ2UzMDdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnFJRDBnYVRzZ2FpQThJRzVTYjNkek95QnFLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLQ0Z6Y0dGeWMyVlBZbXBsWTNSYmFWMC9MbHRxWFNsY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2RtRnNJRDBnZEdocGN5NW5aWFJGZUhCaGJtUldZV3gxWlNoemNHRnljMlZQWW1wbFkzUXNJR2tzSUdvcE95QXZMM0J5ZFc1cGJtY2djM1JsY0Z4dUlDQWdJQ0FnSUNCcFppQW9UV0YwYUM1eWIzVnVaQ2gyWVd3Z0tpQnRhVzVQY21SbGNpa2dMeUJ0YVc1UGNtUmxjaUErSURBcElIdGNiaUFnSUNBZ0lDQWdJQ0JsZUhCaGJtUmxaRTlpYW1WamRGdHBYVnRxWFNBOUlIWmhiRHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9JV1Y0Y0dGdVpHVmtUMkpxWldOMFcycGRLVnh1SUNBZ0lDQWdJQ0FnSUNBZ1pYaHdZVzVrWldSUFltcGxZM1JiYWwwZ1BTQjdmVHRjYmlBZ0lDQWdJQ0FnSUNCbGVIQmhibVJsWkU5aWFtVmpkRnRxWFZ0cFhTQTlJSFpoYkR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdaWGh3WVc1a1pXUlBZbXBsWTNRN1hHNGdJSDFjYmx4dUlDQXZMeUJ3Y21sMllYUmxJSEJ5ZFc1bEtISnZkem9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wVzI1MWJXSmxjbDBwSUh0Y2JseHVJQ0F2THlCOVhHNWNiaUFnY0hKcGRtRjBaU0JwYm1ac1lYUmxLSE53WVhKelpVOWlhbVZqZERvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMEtTQjdYRzRnSUNBZ1ptOXlJQ2hqYjI1emRDQnBJRzltSUU5aWFtVmpkQzVyWlhsektITndZWEp6WlU5aWFtVmpkQ2twSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJSEp2ZHlBOUlITndZWEp6WlU5aWFtVmpkRnRwSUdGeklHRnVlVjA3WEc0Z0lDQWdJQ0JtYjNJZ0tHTnZibk4wSUdvZ2IyWWdUMkpxWldOMExtdGxlWE1vY205M0tTbGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzJrZ1lYTWdZVzU1WFZ0cUlHRnpJR0Z1ZVYwZ1BTQk5ZWFJvTG5CdmR5aHpjR0Z5YzJWUFltcGxZM1JiYVNCaGN5QmhibmxkVzJvZ1lYTWdZVzU1WFN3Z2RHaHBjeTVmYjNCMGFXOXVjeTVwYm1ac1lYUmxSbUZqZEc5eUtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHZGxkRVY0Y0dGdVpGWmhiSFZsS0hOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBMQ0JwT2lCaGJua3NJR282SUdGdWVTa2dlMXh1SUNBZ0lHeGxkQ0IyWVd3Z1BTQXdPMXh1SUNBZ0lHTnZibk4wSUdOMWNuSmxiblJKYm1SbGVHVnpJRDBnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVDJKcVpXTjBXMmxkSUQ4L0lIdDlLVHRjYmlBZ0lDQmpiMjV6ZENCdmRHaGxja2x1WkdWNFpYTWdQU0JQWW1wbFkzUXVhMlY1Y3loemNHRnljMlZQWW1wbFkzUmJhbDBnUHo4Z2UzMHBPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdheUJ2WmlCamRYSnlaVzUwU1c1a1pYaGxjeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHOTBhR1Z5U1c1a1pYaGxjeTVwYm1Oc2RXUmxjeWhyS1NsY2JpQWdJQ0FnSUNBZ2RtRnNJQ3M5SUhOd1lYSnpaVTlpYW1WamRGdHBYVnRySUdGeklHRnVlVjBnS2lCemNHRnljMlZQWW1wbFkzUmJhbDFiYXlCaGN5QmhibmxkTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2RtRnNPMXh1SUNCOVhHNTlYRzVjYmlKZGZRPT0iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IGdldEdQVURldmljZSB9IGZyb20gJy4uL2dldEdQVURldmljZSc7XG5pbXBvcnQgeyBzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UgfSBmcm9tICcuL2NvbHdpc2Utbm9ybWFsaXplJztcbmltcG9ydCB7IGV4cGFuZE5vUmV2aXZlLCBpbmZsYXRlIH0gZnJvbSAnLi9pbmZsYXRlLWV4cGFuZCc7XG5pbXBvcnQgeyB0b1NwYXJzZUtOTlNpbWlsYXJpdHlGb3JtIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gbWFya292Q2x1c3RlcldlYkdQVShzcGFyc2VNYXRyaXgsIG5Sb3dzLCBtYXhJdGVyYXRpb25zID0gNSwgaW5mbGF0ZUZhY3RvciA9IDIpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkZXZpY2UgPSB5aWVsZCBnZXRHUFVEZXZpY2UoKTtcbiAgICAgICAgaWYgKCFkZXZpY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGdwdSBkZXZpY2UgZm91bmQnKTtcbiAgICAgICAgLy8gc2VsZiBsb29wcyBhcmUgYWxyZWFkeSBhZGRlZCBoZXJlXG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkZvcm0gPSB0b1NwYXJzZUtOTlNpbWlsYXJpdHlGb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpO1xuICAgICAgICAvLyBmaXJzdCwgd2Ugbm9ybWlsaXplIHRoZSBzaW1pbGFyaXRpZXNcbiAgICAgICAgeWllbGQgc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwgc3BhcnNlS05ORm9ybS5LTk5TaW1pbGFyaXRpZXMsIHNwYXJzZUtOTkZvcm0uaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgIGxldCByZXMgPSBzcGFyc2VLTk5Gb3JtO1xuICAgICAgICAvLyB0aGVuIHdlIGV4cGFuZCB0aGUgc2ltaWxhcml0aWVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4SXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNoZWNrU29ydGVkKHJlcy5LTk5JbmRleGVzLCByZXMuaW5kZXhPZmZzZXRzKSk7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRSZXMgPSB5aWVsZCBleHBhbmROb1Jldml2ZShkZXZpY2UsIHJlcy5LTk5TaW1pbGFyaXRpZXMsIHJlcy5LTk5JbmRleGVzLCByZXMuaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgICAgICAvLyB0aGVuIHdlIGluZmxhdGUgdGhlIHNpbWlsYXJpdGllc1xuICAgICAgICAgICAgaW5mbGF0ZShleHBhbmRSZXMuS05OU2ltaWxhcml0aWVzLCBpbmZsYXRlRmFjdG9yKTtcbiAgICAgICAgICAgIC8vIHRoZW4gd2Ugbm9ybWlsaXplIHRoZSBzaW1pbGFyaXRpZXMgYWdhaW5cbiAgICAgICAgICAgIHlpZWxkIHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZShkZXZpY2UsIGV4cGFuZFJlcy5LTk5TaW1pbGFyaXRpZXMsIGV4cGFuZFJlcy5pbmRleE9mZnNldHMsIG5Sb3dzKTtcbiAgICAgICAgICAgIHJlcyA9IGV4cGFuZFJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TUNMLXdlYkdQVS5qcy5tYXAiLCJpbXBvcnQgeyBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXgnO1xuaW1wb3J0IHsgU3BhcnNlTWF0cml4U2VydmljZSB9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHsgTUNMU3BhcnNlUmVkdWNlciB9IGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZuQXJncywgZGlzdGFuY2VGbnMsIG1heEl0ZXJhdGlvbnMsIHVzZVdlYkdQVSwgaW5mbGF0ZSB9ID0gZXZlbnQuZGF0YTtcbiAgICBjb25zb2xlLnRpbWUoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgICBsZXQgc3BhcnNlID0gbnVsbDtcbiAgICBpZiAodXNlV2ViR1BVKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzcGFyc2UgPSBhd2FpdCBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChkYXRhLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5zLCBhZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0cywgZGlzdGFuY2VGbkFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc3BhcnNlKSB7IC8vIGZhbHNiYWNrIHRvIENQVVxuICAgICAgICBpZiAodXNlV2ViR1BVKVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignV0VCR1BVIHNwYXJzZSBtYXRyaXggY2FsY3VsYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIGltcGxlbWVudGF0aW9uJyk7XG4gICAgICAgIHNwYXJzZSA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgICAgICAgIC5jYWxjTXVsdGlDb2x1bW4oZGF0YSwgZGlzdGFuY2VGbnMsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbkFyZ3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgICB9XG4gICAgY29uc29sZS50aW1lRW5kKCdzcGFyc2UgbWF0cml4Jyk7XG4gICAgLy9jb25zdCByZXMgPSBhd2FpdCBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1fSkudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7IG1heEl0ZXJhdGlvbnM6IG1heEl0ZXJhdGlvbnMgPz8gNSwgaW5mbGF0ZUZhY3RvcjogaW5mbGF0ZSA/PyAyIH0pO1xuICAgIGNvbnNvbGUudGltZSgnTUNMJyk7XG4gICAgbGV0IHJlcyA9IG51bGw7XG4gICAgaWYgKHVzZVdlYkdQVSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm1XZWJHUFUoc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3dlYkdQVSBNQ0wgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIGltcGxlbWVudGF0aW9uJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzKVxuICAgICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICBjb25zb2xlLnRpbWVFbmQoJ01DTCcpO1xuICAgIHBvc3RNZXNzYWdlKHsgcmVzIH0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWJXTnNMWGR2Y210bGNpNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW0xamJDMTNiM0pyWlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlR5eEZRVUZETERCQ1FVRXdRaXhGUVVGRExFMUJRVTBzZDBWQlFYZEZMRU5CUVVNN1FVRkRiRWdzVDBGQlR5eEZRVUZ4UWl4dFFrRkJiVUlzUlVGQlF5eE5RVUZOTERCRFFVRXdReXhEUVVGRE8wRkJSMnBITEU5QlFVOHNSVUZCUXl4blFrRkJaMElzUlVGQlF5eE5RVUZOTEd0Q1FVRnJRaXhEUVVGRE8wRkJSV3hFTEZOQlFWTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1MwRkJTeXhGUVVGRkxFVkJRVVU3U1VGRE1VSXNUVUZCVFN4RlFVRkRMRWxCUVVrc1JVRkJSU3hUUVVGVExFVkJRVVVzVDBGQlR5eEZRVUZGTEdsQ1FVRnBRaXhGUVVGRkxHTkJRV01zUlVGQlJTeFhRVUZYTEVWQlFVVXNZVUZCWVN4RlFVRkZMRk5CUVZNc1JVRkJSU3hQUVVGUExFVkJRVU1zUjBGTkwwY3NTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJRenRKUVVWbUxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNN1NVRkRPVUlzU1VGQlNTeE5RVUZOTEVkQlFUaENMRWxCUVVrc1EwRkJRenRKUVVNM1F5eEpRVUZKTEZOQlFWTXNSVUZCUlR0UlFVTmlMRWxCUVVrN1dVRkRSaXhOUVVGTkxFZEJRVWNzVFVGQlRTd3dRa0ZCTUVJc1EwRkRka01zU1VGQlNTeEZRVUZGTEZOQlFWTXNSMEZCUnl4SFFVRkhMRVZCUVVVc1YwRkJhMElzUlVGQlJTeHBRa0ZCZDBJc1JVRkJSU3hQUVVGUExFVkJRVVVzWTBGQll5eERRVUZETEVOQlFVTTdVMEZEYWtjN1VVRkJReXhQUVVGUExFTkJRVU1zUlVGQlJUdFpRVU5XTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VTBGRGJFSTdTMEZEUmp0SlFVTkVMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUlVGQlJTeHJRa0ZCYTBJN1VVRkRMMElzU1VGQlNTeFRRVUZUTzFsQlExZ3NUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXcyUlVGQk5rVXNRMEZCUXl4RFFVRkRPMUZCUlM5R0xFMUJRVTBzUjBGQlJ5eE5RVUZOTEVsQlFVa3NiVUpCUVcxQ0xFVkJRVVU3WVVGRGNrTXNaVUZCWlN4RFFVRkRMRWxCUVVrc1JVRkJSU3hYUVVGWExFVkJRVVVzVTBGQlV5eEhRVUZITEVkQlFVY3NSVUZCUlN4alFVRmpMRVZCUVVVc1QwRkJUeXhGUVVGRkxHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1MwRkRjRWM3U1VGRFJDeFBRVUZQTEVOQlFVTXNUMEZCVHl4RFFVRkRMR1ZCUVdVc1EwRkJReXhEUVVGRE8wbEJSV3BETEdkSVFVRm5TRHRKUVVOb1NDeE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMR2RDUVVGblFpeERRVUZETEVWQlFVTXNZVUZCWVN4RlFVRkZMR0ZCUVdFc1NVRkJTU3hEUVVGRExFVkJRVVVzWVVGQllTeEZRVUZGTEU5QlFVOHNTVUZCU1N4RFFVRkRMRVZCUVVNc1EwRkJReXhEUVVGRE8wbEJRM1pITEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03U1VGRGNFSXNTVUZCU1N4SFFVRkhMRWRCUVZFc1NVRkJTU3hEUVVGRE8wbEJRM0JDTEVsQlFVa3NVMEZCVXl4RlFVRkZPMUZCUTJJc1NVRkJTVHRaUVVOR0xFZEJRVWNzUjBGQlJ5eE5RVUZOTEU5QlFVOHNRMEZCUXl4bFFVRmxMRU5CUVVNc1RVRkJUU3hGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRUUVVNM1JEdFJRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZPMWxCUTFZc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eDFSRUZCZFVRc1EwRkJReXhEUVVGRE8xbEJRM1pGTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VTBGRGJFSTdTMEZEUmp0SlFVTkVMRWxCUVVrc1EwRkJReXhIUVVGSE8xRkJRMDRzUjBGQlJ5eEhRVUZITEUxQlFVMHNUMEZCVHl4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wbEJRM2hFTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03U1VGRmRrSXNWMEZCVnl4RFFVRkRMRVZCUVVNc1IwRkJSeXhGUVVGRExFTkJRVU1zUTBGQlF6dEJRVU55UWl4RFFVRkRMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UyMTFiSFJwUTI5c1YyVmlSMUJWVTNCaGNuTmxUV0YwY21sNGZTQm1jbTl0SUNkQVpHRjBZV2R5YjJzdGJHbGljbUZ5YVdWekwyMWhkR2d2YzNKakwzZGxZa2RRVlM5emNHRnljMlV0YldGMGNtbDRMM2RsWWtkUVZTMXpjR0Z5YzJVdGJXRjBjbWw0Snp0Y2JtbHRjRzl5ZENCN1UzQmhjbk5sVFdGMGNtbDRVbVZ6ZFd4MExDQlRjR0Z5YzJWTllYUnlhWGhUWlhKMmFXTmxmU0JtY205dElDY3VMaTlrYVhOMFlXNWpaUzF0WVhSeWFYZ3ZjM0JoY25ObExXMWhkSEpwZUMxelpYSjJhV05sSnp0Y2JtbHRjRzl5ZENCN1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkgwZ1puSnZiU0FuTGk0dlpHbHpkR0Z1WTJVdGJXRjBjbWw0TDNSNWNHVnpKenRjYm1sdGNHOXlkQ0I3UzI1dmQyNU5aWFJ5YVdOemZTQm1jbTl0SUNjdUxpOTBlWEJsWkMxdFpYUnlhV056Snp0Y2JtbHRjRzl5ZENCN1RVTk1VM0JoY25ObFVtVmtkV05sY24wZ1puSnZiU0FuTGk5dFlYSmpiM1l0WTJ4MWMzUmxjaWM3WEc1Y2JtOXViV1Z6YzJGblpTQTlJR0Z6ZVc1aklDaGxkbVZ1ZENrZ1BUNGdlMXh1SUNCamIyNXpkQ0I3WkdGMFlTd2dkR2h5WlhOb2IyeGtMQ0IzWldsbmFIUnpMQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ3dnWkdsemRHRnVZMlZHYmtGeVozTXNJR1JwYzNSaGJtTmxSbTV6TENCdFlYaEpkR1Z5WVhScGIyNXpMQ0IxYzJWWFpXSkhVRlVzSUdsdVpteGhkR1Y5T2x4dUlDQWdlMXh1SUNBZ0lHUmhkR0U2SUdGdWVWdGRXMTBzSUhSb2NtVnphRzlzWkRvZ2JuVnRZbVZ5TEZ4dUlDQWdJSGRsYVdkb2RITTZJRzUxYldKbGNsdGRMQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaRG9nUkdsemRHRnVZMlZCWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ3hjYmlBZ0lDQmthWE4wWVc1alpVWnVjem9nUzI1dmQyNU5aWFJ5YVdOelcxMHNJR1JwYzNSaGJtTmxSbTVCY21kek9pQmhibmxiWFN3Z2JXRjRTWFJsY21GMGFXOXVjem9nYm5WdFltVnlMRnh1SUNBZ0lIVnpaVmRsWWtkUVZUODZJR0p2YjJ4bFlXNHNJR2x1Wm14aGRHVS9PaUJ1ZFcxaVpYSmNiaUFnZlNBOUlHVjJaVzUwTG1SaGRHRTdYRzVjYmlBZ1kyOXVjMjlzWlM1MGFXMWxLQ2R6Y0dGeWMyVWdiV0YwY21sNEp5azdYRzRnSUd4bGRDQnpjR0Z5YzJVNklGTndZWEp6WlUxaGRISnBlRkpsYzNWc2RDQjhJRzUxYkd3Z1BTQnVkV3hzTzF4dUlDQnBaaUFvZFhObFYyVmlSMUJWS1NCN1hHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lITndZWEp6WlNBOUlHRjNZV2wwSUcxMWJIUnBRMjlzVjJWaVIxQlZVM0JoY25ObFRXRjBjbWw0S0Z4dUlDQWdJQ0FnSUNCa1lYUmhMQ0IwYUhKbGMyaHZiR1FnTHlBeE1EQXNJR1JwYzNSaGJtTmxSbTV6SUdGeklHRnVlU3dnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFnWVhNZ1lXNTVMQ0IzWldsbmFIUnpMQ0JrYVhOMFlXNWpaVVp1UVhKbmN5azdYRzRnSUNBZ2ZTQmpZWFJqYUNBb1pTa2dlMXh1SUNBZ0lDQWdZMjl1YzI5c1pTNWxjbkp2Y2lobEtUdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2FXWWdLQ0Z6Y0dGeWMyVXBJSHNnTHk4Z1ptRnNjMkpoWTJzZ2RHOGdRMUJWWEc0Z0lDQWdhV1lnS0hWelpWZGxZa2RRVlNsY2JpQWdJQ0FnSUdOdmJuTnZiR1V1WlhKeWIzSW9KMWRGUWtkUVZTQnpjR0Z5YzJVZ2JXRjBjbWw0SUdOaGJHTjFiR0YwYVc5dUlHWmhhV3hsWkN3Z1ptRnNiR2x1WnlCaVlXTnJJSFJ2SUVOUVZTQnBiWEJzWlcxbGJuUmhkR2x2YmljcE8xeHVYRzRnSUNBZ2MzQmhjbk5sSUQwZ1lYZGhhWFFnYm1WM0lGTndZWEp6WlUxaGRISnBlRk5sY25acFkyVW9LVnh1SUNBZ0lDQWdMbU5oYkdOTmRXeDBhVU52YkhWdGJpaGtZWFJoTENCa2FYTjBZVzVqWlVadWN5d2dkR2h5WlhOb2IyeGtJQzhnTVRBd0xDQmthWE4wWVc1alpVWnVRWEpuY3l3Z2QyVnBaMmgwY3l3Z1lXZG5jbVZuWVhScGIyNU5aWFJvYjJRcE8xeHVJQ0I5WEc0Z0lHTnZibk52YkdVdWRHbHRaVVZ1WkNnbmMzQmhjbk5sSUcxaGRISnBlQ2NwTzF4dVhHNGdJQzh2WTI5dWMzUWdjbVZ6SUQwZ1lYZGhhWFFnYm1WM0lFMURURk53WVhKelpWSmxaSFZqWlhJb2UyMWhlRWwwWlhKaGRHbHZibk02SUcxaGVFbDBaWEpoZEdsdmJuTWdQejhnTlgwcExuUnlZVzV6Wm05eWJTaHpjR0Z5YzJVc0lHUmhkR0ZiTUYwdWJHVnVaM1JvS1R0Y2JpQWdZMjl1YzNRZ2NtVmtkV05sY2lBOUlHNWxkeUJOUTB4VGNHRnljMlZTWldSMVkyVnlLSHR0WVhoSmRHVnlZWFJwYjI1ek9pQnRZWGhKZEdWeVlYUnBiMjV6SUQ4L0lEVXNJR2x1Wm14aGRHVkdZV04wYjNJNklHbHVabXhoZEdVZ1B6OGdNbjBwTzF4dUlDQmpiMjV6YjJ4bExuUnBiV1VvSjAxRFRDY3BPMXh1SUNCc1pYUWdjbVZ6T2lCaGJua2dQU0J1ZFd4c08xeHVJQ0JwWmlBb2RYTmxWMlZpUjFCVktTQjdYRzRnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJSEpsY3lBOUlHRjNZV2wwSUhKbFpIVmpaWEl1ZEhKaGJuTm1iM0p0VjJWaVIxQlZLSE53WVhKelpTd2daR0YwWVZzd1hTNXNaVzVuZEdncE8xeHVJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lHTnZibk52YkdVdVpYSnliM0lvSjNkbFlrZFFWU0JOUTB3Z1ptRnBiR1ZrTENCbVlXeHNhVzVuSUdKaFkyc2dkRzhnUTFCVklHbHRjR3hsYldWdWRHRjBhVzl1SnlrN1hHNGdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLR1VwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0JwWmlBb0lYSmxjeWxjYmlBZ0lDQnlaWE1nUFNCaGQyRnBkQ0J5WldSMVkyVnlMblJ5WVc1elptOXliU2h6Y0dGeWMyVXNJR1JoZEdGYk1GMHViR1Z1WjNSb0tUdGNiaUFnWTI5dWMyOXNaUzUwYVcxbFJXNWtLQ2ROUTB3bktUdGNibHh1SUNCd2IzTjBUV1Z6YzJGblpTaDdjbVZ6ZlNrN1hHNTlPMXh1SWwxOSIsImltcG9ydCB7IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeCkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U21hbGxlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMpIHtcbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuTUFOSEFUVEFOOlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgKHZhbCAqIHdlaWdodHNbaWR4XSkgKiogMiwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUoxZEdsc2N5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVRSQ0xEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc1UwRkJVeXhEUVVGRE8wRkJSVGxGTEUxQlFVMHNRMEZCUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETzBGQlJTOUVMRTFCUVUwc1ZVRkJWU3hoUVVGaExFTkJRVU1zVjBGQmNVSXNSVUZCUlN4UFFVRnBRaXhGUVVGRkxFZEJRVmNzUlVGQlJTeExRVUZoTzBsQlEyaEhMRWxCUVVrc1IwRkJSeXhIUVVGSExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONlF5eFBRVUZQTzBsQlJWUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6RkVMRmRCUVZjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5zUWl4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1NVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMGxCUTJRc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM2hETEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1dVRkJXU3hEUVVGRExGZEJRWEZDTEVWQlFVVXNUMEZCYVVJc1JVRkJSU3hIUVVGWExFVkJRVVVzUzBGQllUdEpRVU12Uml4SlFVRkpMRWRCUVVjc1IwRkJSeXhYUVVGWExFTkJRVU1zVjBGQlZ5eERRVUZETEUxQlFVMHNSMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla01zVDBGQlR6dEpRVVZVTEUxQlFVMHNWMEZCVnl4SFFVRkhMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU14UkN4WFFVRlhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRGJFSXNWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUTNoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTmtMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFF5eERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMSE5DUVVGelFpeERRVU53UXl4cFFrRkJORU1zUlVGQlJTeFBRVUZwUWp0SlFVVXZSQ3hSUVVGUkxHbENRVUZwUWl4RlFVRkZPMUZCUTNwQ0xFdEJRVXNzTUVKQlFUQkNMRU5CUVVNc1UwRkJVenRaUVVOMlF5eFBRVUZQTEVOQlFVTXNSVUZCV1N4RlFVRkZMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNKR08xbEJRMFVzVDBGQlR5eERRVUZETEVWQlFWa3NSVUZCUlN4RlFVRkZPMmRDUVVOMFFpeFpRVUZaTzJkQ1FVTmFMRTFCUVUwc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBVc1QwRkJUeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTNoQ0xFTkJRVU1zUTBGQlF6dExRVU5NTzBGQlEwZ3NRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkN3Z1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkhOOUlHWnliMjBnSnk0dmRIbHdaWE1uTzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOT2FXd2dQU0FvZURvZ1lXNTVLU0E5UGlCNElEMDlQU0J1ZFd4c0lIeDhJSGdnUFQwOUlIVnVaR1ZtYVc1bFpEdGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x1YzJWeWRGTnRZV3hzWlhJb1pHbHpkR0Z1WTJWelFYSTZJRzUxYldKbGNsdGRMQ0JwYm1SbGVHVnpPaUJ1ZFcxaVpYSmJYU3dnYm5WdE9pQnVkVzFpWlhJc0lHbHVaR1Y0T2lCdWRXMWlaWElwSUh0Y2JpQWdhV1lnS0c1MWJTQStJR1JwYzNSaGJtTmxjMEZ5VzJScGMzUmhibU5sYzBGeUxteGxibWQwYUMweFhTbGNiaUFnSUNCeVpYUjFjbTQ3WEc1Y2JpQWdZMjl1YzNRZ2JtVjNVRzl6YVhScGIyNGdQU0JrYVhOMFlXNWpaWE5CY2k1bWFXNWtTVzVrWlhnb0tIWXBJRDArSUc1MWJTQThJSFlwTzF4dUlDQmthWE4wWVc1alpYTkJjaTV3YjNBb0tUdGNiaUFnWkdsemRHRnVZMlZ6UVhJdWMzQnNhV05sS0c1bGQxQnZjMmwwYVc5dUxDQXdMQ0J1ZFcwcE8xeHVJQ0JwYm1SbGVHVnpMbkJ2Y0NncE8xeHVJQ0JwYm1SbGVHVnpMbk53YkdsalpTaHVaWGRRYjNOcGRHbHZiaXdnTUN3Z2FXNWtaWGdwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzV6WlhKMFRHRnlaMlZ5S0dScGMzUmhibU5sYzBGeU9pQnVkVzFpWlhKYlhTd2dhVzVrWlhobGN6b2diblZ0WW1WeVcxMHNJRzUxYlRvZ2JuVnRZbVZ5TENCcGJtUmxlRG9nYm5WdFltVnlLU0I3WEc0Z0lHbG1JQ2h1ZFcwZ1BDQmthWE4wWVc1alpYTkJjbHRrYVhOMFlXNWpaWE5CY2k1c1pXNW5kR2d0TVYwcFhHNGdJQ0FnY21WMGRYSnVPMXh1WEc0Z0lHTnZibk4wSUc1bGQxQnZjMmwwYVc5dUlEMGdaR2x6ZEdGdVkyVnpRWEl1Wm1sdVpFbHVaR1Y0S0NoMktTQTlQaUJ1ZFcwZ1BpQjJLVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjRzl3S0NrN1hHNGdJR1JwYzNSaGJtTmxjMEZ5TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2diblZ0S1R0Y2JpQWdhVzVrWlhobGN5NXdiM0FvS1R0Y2JpQWdhVzVrWlhobGN5NXpjR3hwWTJVb2JtVjNVRzl6YVhScGIyNHNJREFzSUdsdVpHVjRLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZuWjNKbFoyRjBhVzl1Um5WdVkzUnBiMjRvWEc0Z0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0xDQjNaV2xuYUhSek9pQnVkVzFpWlhKYlhWeHVLVG9nS0haaGJIVmxjem9nYm5WdFltVnlXMTBwSUQwK0lHNTFiV0psY2lCN1hHNGdJSE4zYVhSamFDQW9ZV2RuY21WbllYUnBiMjVOWlhSb2IyUXBJSHRjYmlBZ0lDQmpZWE5sSUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGsxQlRraEJWRlJCVGpwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUIyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJSFpoYkNBcUlIZGxhV2RvZEhOYmFXUjRYU3dnTUNrN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSEpsZEhWeWJpQW9kbk02SUc1MWJXSmxjbHRkS1NBOVBpQjdYRzRnSUNBZ0lDQWdJQzh2SUdWMVkyeHBaR1ZoYmx4dUlDQWdJQ0FnSUNCamIyNXpkQ0J6ZFcwZ1BTQjJjeTV5WldSMVkyVW9LR0ZqWXl3Z2RtRnNMQ0JwWkhncElEMCtJR0ZqWXlBcklDaDJZV3dnS2lCM1pXbG5hSFJ6VzJsa2VGMHBJQ29xSURJc0lEQXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdUV0YwYUM1emNYSjBLSE4xYlNrN1hHNGdJQ0FnSUNCOU8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4vLyB0aGUgc3RhcnR1cCBmdW5jdGlvblxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcblx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5cdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgWzU5MF0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTUpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBzaWJsaW5nIGNodW5rcyBmb3IgdGhlIGVudHJ5cG9pbnRcbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5qc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpXG5cdFx0c2NyaXB0VXJsID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG5cdGlmICghc2NyaXB0VXJsKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRpZihzY3JpcHRzLmxlbmd0aCkge1xuXHRcdFx0dmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7XG5cdFx0XHR3aGlsZSAoaSA+IC0xICYmICFzY3JpcHRVcmwpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBzZWxmLmxvY2F0aW9uICsgXCJcIjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0MjMxOiAxXG59O1xuXG4vLyBpbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmdcbnZhciBpbnN0YWxsQ2h1bmsgPSAoZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdHdoaWxlKGNodW5rSWRzLmxlbmd0aClcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHMucG9wKCldID0gMTtcblx0cGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG59O1xuX193ZWJwYWNrX3JlcXVpcmVfXy5mLmkgPSAoY2h1bmtJZCwgcHJvbWlzZXMpID0+IHtcblx0Ly8gXCIxXCIgaXMgdGhlIHNpZ25hbCBmb3IgXCJhbHJlYWR5IGxvYWRlZFwiXG5cdGlmKCFpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRpZih0cnVlKSB7IC8vIGFsbCBjaHVua3MgaGF2ZSBKU1xuXHRcdFx0aW1wb3J0U2NyaXB0cyhfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCkpO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGNodW5rTG9hZGluZ0dsb2JhbCA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtlZGFcIl0gPSBzZWxmW1wid2VicGFja0NodW5rZWRhXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIvLyBydW4gc3RhcnR1cFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLngoKTtcbiJdLCJuYW1lcyI6WyJkZWZlcnJlZCIsIm5leHQiLCJXRUJHU0xBR0dSRUdBVElPTiIsIldFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TIiwiRVVDTElERUFOIiwiYXJyYXlTaXplIiwiTUFOSEFUVEFOIiwiV0VCR1BVRElTVEFOQ0UiLCJ3ZWJHUFVGdW5jdGlvbnMiLCJIQU1NSU5HIiwiX21heEFycmF5U2l6ZSIsImVudHJ5SW5kZXgiLCJtYXhBcnJheVNpemUiLCJfZW50cnlJbmRleCIsIlRBTklNT1RPIiwiTEVWRU5TVEVJTiIsIk5FRURMRU1BTl9XVU5TQ0giLCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFIiwiU09LQUwiLCJDT1NJTkUiLCJBU1lNTUVUUklDIiwiRGlmZmVyZW5jZSIsIk9uZUhvdCIsImRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5IiwibWF4RW50cnlTaXplIiwiTWF0aCIsImNlaWwiLCJfbWF4RW50cnlTaXplIiwiVHlwZVN1cHBvcnRlZERpc3RhbmNlcyIsIlNldCIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsImdwdUFkYXB0ZXIiLCJncHVEZXZpY2UiLCJnZXRHUFVEZXZpY2UiLCJ0aGlzIiwibmF2aWdhdG9yIiwiZ3B1IiwicmVxdWVzdEFkYXB0ZXIiLCJwb3dlclByZWZlcmVuY2UiLCJpc0xvc3QiLCJsb3N0IiwiciIsInNldFRpbWVvdXQiLCJyZXF1aXJlZEJ1ZmZlclNpemUiLCJhZGFwdGVyTGltaXRzIiwibGltaXRzIiwiYnVmZmZlclNpemVMaW1pdCIsIm1heEJ1ZmZlclNpemUiLCJzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0IiwibWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIiwicmVxdWVzdERldmljZSIsInJlcXVpcmVkTGltaXRzIiwibWluIiwiY29uc29sZSIsImVycm9yIiwibXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgiLCJlbnRyeUxpc3QiLCJ0aHJlc2hvbGQiLCJkaXN0YW5jZU1ldHJpY3MiLCJhZ2dyZWdhdGlvbkZ1bmN0aW9uIiwid2VpZ2h0cyIsIm9wdGlvbnMiLCJkZXZpY2UiLCJhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwibWV0cmljIiwiaW5jbHVkZXMiLCJFcnJvciIsImpvaW4iLCJtYXhEaXN0YW5jZSIsImxlbmd0aCIsImxpc3QiLCJudW1PZkNvbHVtbnMiLCJsaXN0U2l6ZSIsInByb2Nlc3NJbmZvIiwibWFwIiwiZW50cnkiLCJpIiwiZGlzdGFuY2VNZXRyaWMiLCJnYXBPcGVuUGVuYWx0eSIsImdhcEV4dGVuc2lvblBlbmFsdHkiLCJfYSIsIl9iIiwiZW50cnlUeXBlIiwiZW5jb2RlZExpc3QiLCJVaW50MzJBcnJheSIsInNwbGl0IiwiYyIsImNoYXJDb2RlQXQiLCJGbG9hdDMyQXJyYXkiLCJfZGF0YSIsIkludDMyQXJyYXkiLCJlbmNvZGVkTGlzdFR5cGUiLCJhcnJheVNpemVzIiwiYXJyIiwiaGFzIiwibWF4RW50cnlMZW4iLCJyZWR1Y2UiLCJhIiwiYiIsIm1heCIsImNvbXBsZXhpdHkiLCJFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvciIsImZsYXRTb3VyY2VBcnJheSIsImZvckVhY2giLCJzZXEiLCJzZXQiLCJzdXBwSW5mb1N0cnVjdFdnc2wiLCJzdXBwSW5mb1NpemUiLCJzdXBwSW5mb1R5cGUiLCJzdXBwSW5mb0J1ZmZlciIsIm1heE1vbm9tZXJJbmRleCIsInNjb3JpbmdNYXRyaXgiLCJhbHBoYWJldEluZGV4ZXMiLCJrZXlzIiwicHJldiIsIm4iLCJBcnJheSIsImZpbGwiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzaW1pbGFyaXR5TWF0cml4U2l6ZSIsInRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4Iiwia2V5Iiwia2V5MiIsIm9mZnNldCIsInJhbmdlIiwiZGF0YVR5cGVXR1NMIiwiZGF0YVN0cnVjdFdnc2wiLCJzb3VyY2VBcnJheVNpemUiLCJ3ZWJHUFVQcm9jZXNzSW5mbyIsInN1cHBJbmZvV2dzbCIsImluZm8iLCJmaWx0ZXIiLCJ3Z3NsIiwibmVlZHNEdW1teSIsInRyaW0iLCJkYXRhV2dzbCIsIm51bU9mVGhyZWFkcyIsInNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQiLCJjb21iaW5lZENvbXBsZXhpdHkiLCJtYXhJdGVyYXRpb25zUGVyVGhyZWFkIiwid29ya2dyb3Vwc0RpbSIsInNxcnQiLCJnbG9iYWxUaHJlYWREaW1TaXplIiwiY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIiwiZG1DaHVua1NpemVQZXJUaHJlYWQiLCJtb2R1bGUiLCJjcmVhdGVTaGFkZXJNb2R1bGUiLCJsYWJlbCIsImNvZGUiLCJnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0IiwicGlwZWxpbmUiLCJjcmVhdGVDb21wdXRlUGlwZWxpbmUiLCJsYXlvdXQiLCJjb21wdXRlIiwiZW50cnlQb2ludCIsInN0YXJ0QXRDb2xzIiwic3RhcnRBdFJvd3MiLCJlbmRBdENvbHMiLCJlbmRBdFJvd3MiLCJjaHVua1NpemUiLCJmbG9vciIsInN0YXJ0Um93Iiwic3RhcnRDb2wiLCJ0aW1lIiwiZW5kSWR4IiwiZW5kUm93IiwiZW5kQ29sIiwidGltZUVuZCIsImNvbXB1dGVJbmZvQnVmZmVyMzJTaXplIiwic3VwcEluZm9CdWZmZXIzMlNpemUiLCJzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUiLCJjb21wdXRlSW5mb0J1ZmZlclNpemUiLCJCWVRFU19QRVJfRUxFTUVOVCIsInBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSIsInJlbWFpbmRlciIsImNvbXB1dGVJbmZvQnVmZmVyIiwiY3JlYXRlQnVmZmVyIiwic2l6ZSIsInVzYWdlIiwiR1BVQnVmZmVyVXNhZ2UiLCJTVE9SQUdFIiwiQ09QWV9TUkMiLCJDT1BZX0RTVCIsIm1hcHBlZEF0Q3JlYXRpb24iLCJtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyIiwiZ2V0TWFwcGVkUmFuZ2UiLCJjb21wdXRlSW5mb09mZlNldCIsIkFycmF5Q29uc3RydWN0b3IiLCJ1bm1hcCIsInN1cHBJbmZvQnVmZmVyU2l6ZSIsInBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSIsInN1cHBJbmZvUmVtYWluZGVyIiwibWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciIsInN1cHBJbmZvT2ZmU2V0IiwiYnl0ZUxlbmd0aCIsInJlc3VsdHNCdWZmZXJTaXplIiwicGFkZGVkUmVzdWx0c0J1ZmZlclNpemUiLCJyZXN1bHRzUmVtYWluZGVyIiwicmVzdWx0c0J1ZmZlciIsImJpbmRHcm91cCIsImNyZWF0ZUJpbmRHcm91cCIsImdldEJpbmRHcm91cExheW91dCIsImVudHJpZXMiLCJiaW5kaW5nIiwicmVzb3VyY2UiLCJidWZmZXIiLCJyZXN1bHRzT3V0QnVmZmVyIiwiTUFQX1JFQUQiLCJyZXN1bHRJcyIsInJlc3VsdEpzIiwicmVzdWx0RGlzdGFuY2VzIiwiaXNBbGxEb25lIiwiZW5jb2RlciIsImNyZWF0ZUNvbW1hbmRFbmNvZGVyIiwicGFzcyIsImJlZ2luQ29tcHV0ZVBhc3MiLCJzZXRQaXBlbGluZSIsInNldEJpbmRHcm91cCIsImRpc3BhdGNoV29ya2dyb3VwcyIsImVuZCIsImNvcHlCdWZmZXJUb0J1ZmZlciIsImNvbW1hbmRCdWZmZXIiLCJmaW5pc2giLCJxdWV1ZSIsInN1Ym1pdCIsIm9uU3VibWl0dGVkV29ya0RvbmUiLCJtYXBBc3luYyIsIkdQVU1hcE1vZGUiLCJSRUFEIiwicmVzdWx0c091dEFycmF5QnVmZmVyIiwicmVzdWx0T2Zmc2V0IiwicmVzdWx0c0kiLCJyZXN1bHRzSiIsInJlc3VsdHNEaXN0YW5jZXMiLCJyZXN1bHRzRm91bmQiLCJldmVyeSIsImQiLCJ0b3RhbFJlc3VsdHMiLCJjb21iaW5lZEkiLCJjb21iaW5lZEoiLCJjb21iaW5lZERpc3RhbmNlcyIsImNvbWJpbmVkT2Zmc2V0IiwicmVzSSIsImZvdW5kIiwic3ViYXJyYXkiLCJwdXNoIiwidG90YWxTaXplIiwiZmluYWxJIiwiZmluYWxKIiwiZmluYWxEaXN0YW5jZXMiLCJmaW5hbE9mZnNldCIsImRlc3Ryb3kiLCJqIiwiZGlzdGFuY2UiLCJtYXhFbnRyeUxlbnMiLCJhZ2dyZWdhdGlvbiIsIl8iLCJhc3luYyIsImJpb0xheW91dCIsImNsdXN0ZXIiLCJzcGFyc2VPYmplY3QiLCJpcyIsImpzIiwiZW1iZWRYIiwicmFuZG9tIiwiZW1iZWRZIiwieFZlbG9jaXRpZXMiLCJ5VmVsb2NpdGllcyIsInRlbXBlcmF0dXJlIiwiaWR4IiwiZHgiLCJkeSIsImFicyIsInZlY1NpemUiLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwicmFuZ2VYIiwicmFuZ2VZIiwiZ2V0TGF5b3V0RW1iZWRkaW5ncyIsInNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZSIsImtublNpbWlsYXJpdGllcyIsIm9mZnNldHMiLCJuUm93cyIsIm5lZWRlZFRocmVhZHMiLCJuZWVkZWRXb3JrR3JvdXBzIiwid29ya0dyb3VwVGhyZWFkc1BlckRpbSIsIndvcmtHcm91cERpbSIsInRocmVhZHNQZXJEaW0iLCJzaW1taWxhcml0aWVzQnVmZmVyIiwib2Zmc2V0c0J1ZmZlciIsImNvbW1hbmRFbmNvZGVyIiwicGFzc0VuY29kZXIiLCJvdXRTaW1pbGFyaXR5QnVmZmVyIiwiYXJyYXlCdWZmZXIiLCJpbmZsYXRlIiwiZmFjdG9yIiwicG93IiwiZXhwYW5kTm9SZXZpdmUiLCJrbm5JbmRleGVzIiwib3JkZXIiLCJsb2cxMCIsInBydW5lVmFsdWUiLCJvdXRLTk5TaW1pbGFyaXRpZXMiLCJzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSIsInNwYXJzZUtOTkJ1ZmZlciIsInNwYXJzZUtOTkFycmF5QnVmZmVyIiwicm93SW5kZXhlcyIsInJlcyIsImdldFJvd0luZGV4ZXMiLCJzdGFydEJ1ZmZlciIsInJlc3VsdEJsb2NrQnVmZmVyIiwib3V0QmxvY2tCdWZmZXIiLCJzdGFydCIsImN1ckxlbmd0aCIsIndyaXRlQnVmZmVyIiwib3V0QmxvY2siLCJLTk5JbmRleGVzIiwiS05OU2ltaWxhcml0aWVzIiwiaW5kZXhPZmZzZXRzIiwidG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybSIsInNwYXJzZU1hdHJpeCIsIm9jY3VyZW5jZUNvdW50IiwiY291bnRPY2N1cmFuY2VzQWRkTG9vcHMiLCJvZmZzZXRGb3JtIiwiYXIiLCJpbnNlcnRDb3VudGVyIiwicm93IiwiY29sIiwic2ltaWxhcml0eSIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiZGVmYXVsdE1DTE9wdGlvbnMiLCJleHBhbmRGYWN0b3IiLCJtYXhJdGVyYXRpb25zIiwiaW5mbGF0ZUZhY3RvciIsIm11bHRGYWN0b3IiLCJNQ0xTcGFyc2VSZWR1Y2VyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX29wdGlvbnMiLCJ0b09iamVjdEZvcm0iLCJhZGRMb29wcyIsIm5vcm1hbGl6ZSIsImV4cGFuZCIsImNsdXN0ZXJzIiwiYXNzaWduQ2x1c3RlcnMiLCJjb3JyZWN0Q2x1c3RlcnMiLCJlbWJlZGRpbmdzIiwidHJhbnNmb3JtIiwibWNsUmVzIiwic3BhcnNlS05ORm9ybSIsImV4cGFuZFJlcyIsIm1hcmtvdkNsdXN0ZXJXZWJHUFUiLCJjc3JUb1NwYXJzZU9iamVjdCIsImNsdXN0ZXJTaXplTWFwIiwic29ydGVkSW5kZXhlcyIsIk51bWJlciIsInNvcnQiLCJjbHVzdGVyTWFwIiwiY2x1c3RlcklkeCIsIm1pbk9yZGVyIiwiayIsImNsdXN0ZXJOdW0iLCJzb3J0ZWRDbHVzdGVyTmFtZXMiLCJwZXJSb3ciLCJ5T2Zmc2V0IiwiY2x1c3Rlck5hbWUiLCJvZmZzZXRYIiwibWVyZ2VDbHVzdGVycyIsImlDbHVzdGVyIiwiakNsdXN0ZXIiLCJyb3VuZCIsImFzc2lnbkNsdXN0ZXJzQ1NSIiwiY29ycmVjdGVkT2Zmc2V0cyIsIm9mZnNldENvdW50ZXIiLCJzdW0iLCJleHBhbmRlZE9iamVjdCIsInZhbCIsImdldEV4cGFuZFZhbHVlIiwiY3VycmVudEluZGV4ZXMiLCJvdGhlckluZGV4ZXMiLCJvbm1lc3NhZ2UiLCJldmVudCIsImRhdGEiLCJhZ2dyZWdhdGlvbk1ldGhvZCIsImRpc3RhbmNlRm5BcmdzIiwiZGlzdGFuY2VGbnMiLCJ1c2VXZWJHUFUiLCJzcGFyc2UiLCJjYWxjTXVsdGlDb2x1bW4iLCJyZWR1Y2VyIiwidHJhbnNmb3JtV2ViR1BVIiwicG9zdE1lc3NhZ2UiLCJpc05pbCIsIngiLCJpbnNlcnRTbWFsbGVyIiwiZGlzdGFuY2VzQXIiLCJpbmRleGVzIiwibnVtIiwiaW5kZXgiLCJuZXdQb3NpdGlvbiIsImZpbmRJbmRleCIsInYiLCJwb3AiLCJzcGxpY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJleHBvcnRzIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm0iLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiTyIsImNodW5rSWRzIiwiZm4iLCJwcmlvcml0eSIsIm5vdEZ1bGZpbGxlZCIsIkluZmluaXR5IiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJmIiwiY2h1bmtJZCIsImFsbCIsInByb21pc2VzIiwidSIsImciLCJnbG9iYWxUaGlzIiwiRnVuY3Rpb24iLCJ3aW5kb3ciLCJvYmoiLCJwcm9wIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic2NyaXB0VXJsIiwiaW1wb3J0U2NyaXB0cyIsImxvY2F0aW9uIiwiZG9jdW1lbnQiLCJjdXJyZW50U2NyaXB0Iiwic3JjIiwic2NyaXB0cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwicmVwbGFjZSIsInAiLCJzZWxmIiwiaW5zdGFsbGVkQ2h1bmtzIiwiY2h1bmtMb2FkaW5nR2xvYmFsIiwicGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24iLCJiaW5kIiwibW9yZU1vZHVsZXMiLCJydW50aW1lIl0sInNvdXJjZVJvb3QiOiIifQ==
|