-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2 lines (2 loc) · 352 KB
/
index.html
File metadata and controls
2 lines (2 loc) · 352 KB
1
2
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,shrink-to-fit=0,user-scalable=no,minimum-scale=1,maximum-scale=1"><title>index</title><style>html{width:100%;height:100%;display:flex;justify-content:center;align-items:center;flex-direction:column}body{width:100%;height:100%;display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0}canvas{margin:auto;display:block;box-shadow:0 2px 12px -2px rgba(0,0,0,.15)}</style><body><script>!function(){return function t(e,n,r){function i(a,s){if(!n[a]){if(!e[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[a]={exports:{}};e[a][0].call(p.exports,function(t){return i(e[a][1][t]||t)},p,p.exports,t,e,n,r)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}}()({1:[function(t,e,n){const r=t("canvas-sketch"),i=t("load-asset"),o=t("canvas-sketch-util/random"),a=(t("load-asset/loaders"),"mixed"),s="",u=!1,c=.2,p=!0,f=.01,l=.1,d=100,h=!0,m=!0,y={bezier:7,lines:5,circles:8,dots:7,mixed:10};let g,v,w,b=[];r(async()=>{const t=await i("assets/hh.jpg");b=[t.width/5,t.height/5];const e=document.createElement("canvas");e.width=b[0],e.height=b[1];const n=e.getContext("2d");n.drawImage(t,0,0,e.width,e.height),w=n.getImageData(0,0,e.width,e.height).data,(g=document.createElement("canvas")).width=b[0],g.height=b[1],(v=g.getContext("2d")).fillStyle="white";const r=new x(50);let o=0;return({context:e,width:n,height:i})=>{if(e.fillStyle="white",e.fillRect(0,0,n,i),r.iterate(),console.log(o++,r.fittest.fitness),u)e.drawImage(t,0,0,t.width,t.height),r.fittest.draw(e,t.width,t.height);else{const o=function(t,e){const n=t[0]/t[1];let r,i;return r=n>e[0]/e[1]?{x:0,y:(e[1]-(i=[e[0],e[0]*(1/n)])[1])/2}:{x:(e[0]-(i=[e[1]*n,e[1]])[0])/2,y:0},{dimensions:i,translate:r}}([t.width,t.height],[n,i]);e.translate(o.translate.x,o.translate.y),r.fittest.draw(e,o.dimensions[0],o.dimensions[1])}}},{animate:!0,fps:1});class x{constructor(t){this.individuals=this.populate(t),this.size=t,this.sortIndividualsByFitness(),this.fittest=this.individuals[0]}populate(t){let e=[];for(let n=0;n<t;n++)e.push(new M);return e}sortIndividualsByFitness(){return this.individuals=this.individuals.sort((t,e)=>e.fitness-t.fitness),this.individuals}iterate(){this.sortIndividualsByFitness(),this.fittest=this.individuals[0];const t=Math.floor(c*this.individuals.length);this.individuals=new Array(this.size).fill(0).map(e=>{let[n,r]=[{},{}];for(;n.name==r.name;)n=this.getFitParent(t),r=this.getFitParent(t);return new M(n,r)})}getFitParent(t){let e=Math.abs(o.gaussian(0,1));e=e>1?o.value():e;const n=Math.floor(e*t);return this.individuals[n]}}class M{constructor(t,e,n=d,r=a){this.phenotype=r,this.dnaLength=n,this.geneLength=k.dataPointsNeededFor(r),this.dna=M.generateDNA(e,t,n,this.geneLength),this.fitness=M.calculateFitness(h,this.dna,r),this.name=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,t=>(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16))}static generateDNA(t,e,n,r){return t&&e?M.inheritDNAFrom(t,e):M.generateOrphanDNA(n,r)}static inheritDNAFrom(t,e){const n=Math.floor(Math.random()*this.dnaLength);return e.dna.map((e,r)=>{let i=Math.random()<.5?e:t.dna[r];return M.maybeMutate(i=r>n?e:t.dna[r])})}static maybeMutate(t){return p?M.mutateGene(t):M.mutateRandom(t)}static mutateRandom(t){return t.map(t=>Math.random()<f?Math.random():t)}static mutateGene(t){return t.map(t=>{let e=t;if(Math.random()<f){e=(e=(e+=l*(2*Math.random()-1))<0?Math.random():e)>1?Math.random():e}return e})}static generateOrphanDNA(t,e){const n=[];for(var r=0;r<t;r+=1)n.push(new Array(e).fill(0).map(t=>Math.random()));return n}static calculateFitness(t,e,n){const r=w.length,i=M.getRenderData(e,n);let o=0,a=0;if(t){for(var s=0;s<r;s++){var u=i[s]-w[s];o+=u*u}a=1-o/(256*r*256)}else{for(s=0;s<r;s++)o+=Math.abs(i[s]-w[s]);a=1-o/(256*r)}return a}static getRenderData(t,e){return v.fillStyle="white",v.fillRect(0,0,b[0],b[1]),k.draw(v,b[0],b[1],t,e),v.getImageData(0,0,b[0],b[1]).data}draw(t,e,n,r){k.draw(t,e,n,this.dna,this.phenotype,r)}}class k{static draw(t,e,n,r,i,o=[0,0]){u||(t.fillStyle="white",t.fillRect(0,0,e,n)),t.strokeStyle=s;for(let o=0;o<r.length;o+=1)m&&r[o][0]>.5||(t.save(),k.drawFor(i)(t,e,n,r[o]),t.restore())}static dataPointsNeededFor(t){return y[t]}static drawFor(t){let e=t.charAt(0).toUpperCase()+t.slice(1);return k["draw"+e]}static drawCircles(t,e,n,r){const[i,o,a,s,u,c,p,f]=r;t.fillStyle=`rgba(${Math.floor(255*u)},${Math.floor(255*c)}, ${Math.floor(255*p)}, ${f-.3})`;const l=o*(n/15);t.beginPath(),t.moveTo(e*a+l,n*s),t.arc(e*a,n*s,l,0,2*Math.PI),t.closePath(),t.fill()}static drawDots(t,e,n,r){const[i,o,a,s,u,c,p]=r;t.fillStyle=`rgba(${Math.floor(255*s)},${Math.floor(255*u)}, ${Math.floor(255*c)}, ${p-.3})`;const f=Math.min(e,n)/50;t.beginPath(),t.moveTo(e*o+f,n*a),t.arc(e*o,n*a,f,0,2*Math.PI),t.closePath(),t.fill()}static drawBezier(t,e,n,r){const[i,o,a,s,u,c,p]=r;t.beginPath(),t.moveTo(e*o,n*a),t.quadraticCurveTo(e*c,n*p,e*s,n*u),t.stroke()}static drawLines(t,e,n,r){const[i,o,a,s,u,c,p,f,l]=r;t.strokeStyle=`rgba(${Math.floor(255*c)},${Math.floor(255*f)}, ${Math.floor(255*p)}, ${l})`,t.lineWidth=Math.min(e,n)/200,t.beginPath(),t.moveTo(e*o,n*a),t.lineTo(e*s,n*u),t.stroke()}static drawMixed(t,e,n,r){const[i,o,...a]=r;let s;o<.2?s=k.drawLines:o<.4?s=k.drawBezier:o<.6?s=k.drawDots:o<1&&(s=k.drawCircles),s(t,e,n,[i,...a])}}},{"canvas-sketch":5,"canvas-sketch-util/random":4,"load-asset":10,"load-asset/loaders":13}],2:[function(t,e,n){var r=t("./mime-types.json"),i={};Object.keys(r).forEach(function(t){r[t].forEach(function(e){i[e]=t})}),e.exports=function(t){if(!t)throw new TypeError("must specify extension string");return 0===t.indexOf(".")&&(t=t.substring(1)),i[t.toLowerCase()]}},{"./mime-types.json":3}],3:[function(t,e,n){e.exports={"audio/midi":["mid","midi","kar","rmi"],"audio/mp4":["mp4a","m4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/webm":["weba"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/wav":["wav"],"video/3gpp":["3gp"],"video/3gpp2":["3g2"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"]}},{}],4:[function(t,e,n){var r=t("seed-random"),i=t("simplex-noise"),o=t("defined");e.exports=function t(e){e=o(e,null);var n,a,s,u=Math.random,c=null,p=!1;return f(e),{value:l,createRandom:function(e){return t(e)},setSeed:f,getSeed:function(){return n},getRandomSeed:function(){return String(Math.floor(1e6*Math.random()))},valueNonZero:function(){for(var t=0;0===t;)t=l();return t},permuteNoise:function(){s=d()},noise1D:function(t,e,n){if(!isFinite(t))throw new TypeError("x component for noise() must be finite");return e=o(e,1),(n=o(n,1))*s.noise2D(t*e,0)},noise2D:function(t,e,n,r){if(!isFinite(t))throw new TypeError("x component for noise() must be finite");if(!isFinite(e))throw new TypeError("y component for noise() must be finite");return n=o(n,1),(r=o(r,1))*s.noise2D(t*n,e*n)},noise3D:function(t,e,n,r,i){if(!isFinite(t))throw new TypeError("x component for noise() must be finite");if(!isFinite(e))throw new TypeError("y component for noise() must be finite");if(!isFinite(n))throw new TypeError("z component for noise() must be finite");return r=o(r,1),(i=o(i,1))*s.noise3D(t*r,e*r,n*r)},noise4D:function(t,e,n,r,i,a){if(!isFinite(t))throw new TypeError("x component for noise() must be finite");if(!isFinite(e))throw new TypeError("y component for noise() must be finite");if(!isFinite(n))throw new TypeError("z component for noise() must be finite");if(!isFinite(r))throw new TypeError("w component for noise() must be finite");return i=o(i,1),(a=o(a,1))*s.noise4D(t*i,e*i,n*i,r*i)},sign:function(){return h()?1:-1},boolean:h,chance:function(t){if("number"!=typeof(t=o(t,.5)))throw new TypeError("expected n to be a number");return l()<t},range:m,rangeFloor:y,pick:function(t){return 0===t.length?void 0:t[y(0,t.length)]},shuffle:function(t){if(!Array.isArray(t))throw new TypeError("Expected Array, got "+typeof t);for(var e,n,r=t.length,i=t.slice();r;)e=Math.floor(l()*r--),n=i[r],i[r]=i[e],i[e]=n;return i},onCircle:g,insideCircle:function(t,e){t=o(t,1),g(1,e=e||[]);var n=t*Math.sqrt(l());return e[0]*=n,e[1]*=n,e},onSphere:function(t,e){t=o(t,1),e=e||[];var n=l()*Math.PI*2,r=2*l()-1,i=n,a=Math.acos(r);return e[0]=t*Math.sin(a)*Math.cos(i),e[1]=t*Math.sin(a)*Math.sin(i),e[2]=t*Math.cos(a),e},insideSphere:function(t,e){t=o(t,1),e=e||[];var n=l()*Math.PI*2,r=2*l()-1,i=l(),a=n,s=Math.acos(r),u=t*Math.cbrt(i);return e[0]=u*Math.sin(s)*Math.cos(a),e[1]=u*Math.sin(s)*Math.sin(a),e[2]=u*Math.cos(s),e},quaternion:function(t){t=t||[];var e=l(),n=l(),r=l(),i=Math.sqrt(1-e),o=Math.sqrt(e),a=2*Math.PI*n,s=2*Math.PI*r,u=Math.sin(a)*i,c=Math.cos(a)*i,p=Math.sin(s)*o,f=Math.cos(s)*o;return t[0]=u,t[1]=c,t[2]=p,t[3]=f,t},weighted:w,weightedSet:function(t){return 0===(t=t||[]).length?null:t[v(t)].value},weightedSetIndex:v,gaussian:function(t,e){if(t=o(t,0),e=o(e,1),p){p=!1;var n=c;return c=null,t+e*n}var r=0,i=0,a=0;do{r=2*l()-1,i=2*l()-1,a=r*r+i*i}while(a>=1||0===a);var s=Math.sqrt(-2*Math.log(a)/a);return c=i*s,p=!0,t+e*(r*s)}};function f(t,e){"number"==typeof t||"string"==typeof t?a=r(n=t,e):(n=void 0,a=u),s=d(),c=null,p=!1}function l(){return a()}function d(){return new i(a)}function h(){return l()>.5}function m(t,e){if(void 0===e&&(e=t,t=0),"number"!=typeof t||"number"!=typeof e)throw new TypeError("Expected all arguments to be numbers");return l()*(e-t)+t}function y(t,e){if(void 0===e&&(e=t,t=0),"number"!=typeof t||"number"!=typeof e)throw new TypeError("Expected all arguments to be numbers");return Math.floor(m(t,e))}function g(t,e){t=o(t,1),e=e||[];var n=2*l()*Math.PI;return e[0]=t*Math.cos(n),e[1]=t*Math.sin(n),e}function v(t){return 0===(t=t||[]).length?-1:w(t.map(function(t){return t.weight}))}function w(t){if(0===(t=t||[]).length)return-1;var e,n=0;for(e=0;e<t.length;e++)n+=t[e];if(n<=0)throw new Error("Weights must sum to > 0");var r=l()*n;for(e=0;e<t.length;e++){if(r<t[e])return e;r-=t[e]}return 0}}()},{defined:6,"seed-random":17,"simplex-noise":18}],5:[function(t,e,n){(function(t){!function(t,r){"object"==typeof n&&void 0!==e?e.exports=r():"function"==typeof define&&define.amd?define(r):t.canvasSketch=r()}(this,function(){var e=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;var i=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(t){r[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(t){return!1}}()?Object.assign:function(t,i){for(var o,a,s=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),u=1;u<arguments.length;u++){for(var c in o=Object(arguments[u]))n.call(o,c)&&(s[c]=o[c]);if(e){a=e(o);for(var p=0;p<a.length;p++)r.call(o,a[p])&&(s[a[p]]=o[a[p]])}}return s},o="undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{};function a(t,e){return t(e={exports:{}},e.exports),e.exports}var s=o.performance&&o.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date},u=function(t){return!!t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof t.then};var c=function(t){return!(!t||"object"!=typeof t)&&("object"==typeof window&&"object"==typeof window.Node?t instanceof window.Node:"number"==typeof t.nodeType&&"string"==typeof t.nodeName)};function p(){return"undefined"!=typeof window&&window["canvas-sketch-cli"]}function f(){for(var t=arguments,e=0;e<arguments.length;e++)if(null!=t[e])return t[e]}function l(){return"undefined"!=typeof document}var d,h=a(function(t,e){function n(t){var e=[];for(var n in t)e.push(n);return e}(t.exports="function"==typeof Object.keys?Object.keys:n).shim=n}),m=a(function(t,e){var n="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();function r(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function i(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}(e=t.exports=n?r:i).supported=r,e.unsupported=i}),y=a(function(t){var e=Array.prototype.slice,n=t.exports=function(t,o,a){return a||(a={}),t===o||(t instanceof Date&&o instanceof Date?t.getTime()===o.getTime():!t||!o||"object"!=typeof t&&"object"!=typeof o?a.strict?t===o:t==o:function(t,o,a){var s,u;if(r(t)||r(o))return!1;if(t.prototype!==o.prototype)return!1;if(m(t))return!!m(o)&&(t=e.call(t),o=e.call(o),n(t,o,a));if(i(t)){if(!i(o))return!1;if(t.length!==o.length)return!1;for(s=0;s<t.length;s++)if(t[s]!==o[s])return!1;return!0}try{var c=h(t),p=h(o)}catch(t){return!1}if(c.length!=p.length)return!1;for(c.sort(),p.sort(),s=c.length-1;s>=0;s--)if(c[s]!=p[s])return!1;for(s=c.length-1;s>=0;s--)if(!n(t[u=c[s]],o[u],a))return!1;return typeof t==typeof o}(t,o,a))};function r(t){return null==t}function i(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}}),g=a(function(t,e){!function(e){var n,r,i,o=(n=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,r=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,i=/[^-+\dA-Z]/g,function(t,e,s,u){if(1!==arguments.length||"string"!==(null===(c=t)?"null":void 0===c?"undefined":"object"!=typeof c?typeof c:Array.isArray(c)?"array":{}.toString.call(c).slice(8,-1).toLowerCase())||/\d/.test(t)||(e=t,t=void 0),(t=t||new Date)instanceof Date||(t=new Date(t)),isNaN(t))throw TypeError("Invalid date");var c,p=(e=String(o.masks[e]||e||o.masks.default)).slice(0,4);"UTC:"!==p&&"GMT:"!==p||(e=e.slice(4),s=!0,"GMT:"===p&&(u=!0));var f=s?"getUTC":"get",l=t[f+"Date"](),d=t[f+"Day"](),h=t[f+"Month"](),m=t[f+"FullYear"](),y=t[f+"Hours"](),g=t[f+"Minutes"](),v=t[f+"Seconds"](),w=t[f+"Milliseconds"](),b=s?0:t.getTimezoneOffset(),x=function(t){var e=new Date(t.getFullYear(),t.getMonth(),t.getDate());e.setDate(e.getDate()-(e.getDay()+6)%7+3);var n=new Date(e.getFullYear(),0,4);n.setDate(n.getDate()-(n.getDay()+6)%7+3);var r=e.getTimezoneOffset()-n.getTimezoneOffset();return e.setHours(e.getHours()-r),1+Math.floor((e-n)/6048e5)}(t),M=function(t){var e=t.getDay();return 0===e&&(e=7),e}(t),k={d:l,dd:a(l),ddd:o.i18n.dayNames[d],dddd:o.i18n.dayNames[d+7],m:h+1,mm:a(h+1),mmm:o.i18n.monthNames[h],mmmm:o.i18n.monthNames[h+12],yy:String(m).slice(2),yyyy:m,h:y%12||12,hh:a(y%12||12),H:y,HH:a(y),M:g,MM:a(g),s:v,ss:a(v),l:a(w,3),L:a(Math.round(w/10)),t:y<12?o.i18n.timeNames[0]:o.i18n.timeNames[1],tt:y<12?o.i18n.timeNames[2]:o.i18n.timeNames[3],T:y<12?o.i18n.timeNames[4]:o.i18n.timeNames[5],TT:y<12?o.i18n.timeNames[6]:o.i18n.timeNames[7],Z:u?"GMT":s?"UTC":(String(t).match(r)||[""]).pop().replace(i,""),o:(b>0?"-":"+")+a(100*Math.floor(Math.abs(b)/60)+Math.abs(b)%60,4),S:["th","st","nd","rd"][l%10>3?0:(l%100-l%10!=10)*l%10],W:x,N:M};return e.replace(n,function(t){return t in k?k[t]:t.slice(1,t.length-1)})});function a(t,e){for(t=String(t),e=e||2;t.length<e;)t="0"+t;return t}o.masks={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},o.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],timeNames:["a","p","am","pm","A","P","AM","PM"]},t.exports=o}()}),v="",w=function(t,e){if("string"!=typeof t)throw new TypeError("expected a string");if(1===e)return t;if(2===e)return t+t;var n=t.length*e;if(d!==t||void 0===d)d=t,v="";else if(v.length>=n)return v.substr(0,n);for(;n>v.length&&e>1;)1&e&&(v+=t),e>>=1,t+=t;return v=(v+=t).substr(0,n)};var b,x=function(t,e,n){return t=t.toString(),void 0===e?t:(n=0===n?"0":n?n.toString():" ",w(n,e-t.length)+t)},M=function(){},k={extension:"",prefix:"",suffix:""},E=["image/png","image/jpeg","image/webp"];function _(t,e){return void 0===e&&(e={}),new Promise(function(n,r){e=i({},k,e);var o=P(Object.assign({},e,{extension:"",frame:void 0})),a=t?"streamStart":"streamEnd",s=p();return s&&s.output&&"function"==typeof s[a]?s[a](i({},e,{filename:o})).then(function(t){return n(t)}):n({filename:o,client:!1})})}function T(t,e){return void 0===e&&(e={}),function(t){return new Promise(function(e){var n=t.indexOf(",");if(-1!==n){for(var r=t.slice(n+1),i=window.atob(r),o=t.slice(0,n),a=/data:([^;]+)/.exec(o),s=(a?a[1]:"")||void 0,u=new ArrayBuffer(i.length),c=new Uint8Array(u),p=0;p<i.length;p++)c[p]=i.charCodeAt(p);e(new window.Blob([u],{type:s}))}else e(new window.Blob)})}(t).then(function(t){return j(t,e)})}function j(t,e){return void 0===e&&(e={}),new Promise(function(n){var r=(e=i({},k,e)).filename,o=p();if(o&&"function"==typeof o.saveBlob&&o.output)return o.saveBlob(t,i({},e,{filename:r})).then(function(t){return n(t)});b||((b=document.createElement("a")).style.visibility="hidden",b.target="_blank"),b.download=r,b.href=window.URL.createObjectURL(t),document.body.appendChild(b),b.onclick=function(){b.onclick=M,setTimeout(function(){window.URL.revokeObjectURL(t),b.parentElement&&b.parentElement.removeChild(b),b.removeAttribute("href"),n({filename:r,client:!1})})},b.click()})}function P(t){if(void 0===t&&(t={}),"function"==typeof(t=i({},t)).file)return t.file(t);if(t.file)return t.file;var e,n=null,r="";("string"==typeof t.extension&&(r=t.extension),"number"==typeof t.frame)&&(e="number"==typeof t.totalFrames?t.totalFrames:Math.max(1e4,t.frame),n=x(String(t.frame),String(e).length,"0"));var o=isFinite(t.totalLayers)&&isFinite(t.layer)&&t.totalLayers>1?""+t.layer:"";return null!=n?[o,n].filter(Boolean).join("-")+r:[t.prefix,t.name||t.timeStamp,o,t.hash,t.suffix].filter(Boolean).join("-")+r}var R={dimension:"dimensions",animated:"animate",animating:"animate",unit:"units",P5:"p5",pixellated:"pixelated",looping:"loop",pixelPerInch:"pixels"},O=["dimensions","units","pixelsPerInch","orientation","scaleToFit","scaleToView","bleed","pixelRatio","exportPixelRatio","maxPixelRatio","scaleContext","resizeCanvas","styleCanvas","canvas","context","attributes","parent","file","name","prefix","suffix","animate","playing","loop","duration","totalFrames","fps","playbackRate","timeScale","frame","time","flush","pixelated","hotkeys","p5","id","scaleToFitPadding","data","params","encoding","encodingQuality"],S=function(t){Object.keys(t).forEach(function(t){t in R?console.warn('[canvas-sketch] Could not recognize the setting "'+t+'", did you mean "'+R[t]+'"?'):O.includes(t)||console.warn('[canvas-sketch] Could not recognize the setting "'+t+'"')})};var C=[["postcard",101.6,152.4],["poster-small",280,430],["poster",460,610],["poster-large",610,910],["business-card",50.8,88.9],["2r",64,89],["3r",89,127],["4r",102,152],["5r",127,178],["6r",152,203],["8r",203,254],["10r",254,305],["11r",279,356],["12r",305,381],["a0",841,1189],["a1",594,841],["a2",420,594],["a3",297,420],["a4",210,297],["a5",148,210],["a6",105,148],["a7",74,105],["a8",52,74],["a9",37,52],["a10",26,37],["2a0",1189,1682],["4a0",1682,2378],["b0",1e3,1414],["b1",707,1e3],["b1+",720,1020],["b2",500,707],["b2+",520,720],["b3",353,500],["b4",250,353],["b5",176,250],["b6",125,176],["b7",88,125],["b8",62,88],["b9",44,62],["b10",31,44],["b11",22,32],["b12",16,22],["c0",917,1297],["c1",648,917],["c2",458,648],["c3",324,458],["c4",229,324],["c5",162,229],["c6",114,162],["c7",81,114],["c8",57,81],["c9",40,57],["c10",28,40],["c11",22,32],["c12",16,22],["half-letter",5.5,8.5,"in"],["letter",8.5,11,"in"],["legal",8.5,14,"in"],["junior-legal",5,8,"in"],["ledger",11,17,"in"],["tabloid",11,17,"in"],["ansi-a",8.5,11,"in"],["ansi-b",11,17,"in"],["ansi-c",17,22,"in"],["ansi-d",22,34,"in"],["ansi-e",34,44,"in"],["arch-a",9,12,"in"],["arch-b",12,18,"in"],["arch-c",18,24,"in"],["arch-d",24,36,"in"],["arch-e",36,48,"in"],["arch-e1",30,42,"in"],["arch-e2",26,38,"in"],["arch-e3",27,39,"in"]].reduce(function(t,e){var n={units:e[3]||"mm",dimensions:[e[1],e[2]]};return t[e[0]]=n,t[e[0].replace(/-/g," ")]=n,t},{}),F=function(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]},D=["mm","cm","m","pc","pt","in","ft","px"],A={m:{system:"metric",factor:1},cm:{system:"metric",factor:.01},mm:{system:"metric",factor:.001},pt:{system:"imperial",factor:1/72},pc:{system:"imperial",factor:1/6},in:{system:"imperial",factor:1},ft:{system:"imperial",factor:12}};const N={metric:{unit:"m",ratio:1/.0254},imperial:{unit:"in",ratio:.0254}};var L=function(t,e,n,r){if("number"!=typeof t||!isFinite(t))throw new Error("Value must be a finite number");if(!e||!n)throw new Error("Must specify from and to units");var i=F((r=r||{}).pixelsPerInch,96),o=r.precision,a=!1!==r.roundPixel;if(e=e.toLowerCase(),n=n.toLowerCase(),-1===D.indexOf(e))throw new Error('Invalid from unit "'+e+'", must be one of: '+D.join(", "));if(-1===D.indexOf(n))throw new Error('Invalid from unit "'+n+'", must be one of: '+D.join(", "));if(e===n)return t;var s=1,u=1,c=!1;"px"===e&&(u=1/i,e="in"),"px"===n&&(c=!0,s=i,n="in");var p=A[e],f=A[n],l=t*p.factor*u;p.system!==f.system&&(l*=N[p.system].ratio);var d=l/f.factor*s;return c&&a?d=Math.round(d):"number"==typeof o&&isFinite(o)&&(d=function(t,e){return Number(Math.round(t+"e"+e)+"e-"+e)}(d,o)),d};function H(t,e,n,r){return void 0===e&&(e="px"),void 0===n&&(n="px"),void 0===r&&(r=72),L(t,e,n,{pixelsPerInch:r,precision:4,roundPixel:!0})}function I(t,e){var n,r,i,o,a,s,u=l(),c=e.dimensions,p=function(t){return!(!t.dimensions||"string"!=typeof t.dimensions&&!(Array.isArray(t.dimensions)&&t.dimensions.length>=2))}(e),d=t.exporting,h=!!p&&!1!==e.scaleToFit,m=!(!d&&p)||e.scaleToView;u||(h=m=!1);var y,g,v=e.units,w="number"==typeof e.pixelsPerInch&&isFinite(e.pixelsPerInch)?e.pixelsPerInch:72,b=f(e.bleed,0),x=u?window.devicePixelRatio:1,M=m?x:1;"number"==typeof e.pixelRatio&&isFinite(e.pixelRatio)?g=f(e.exportPixelRatio,y=e.pixelRatio):p?(y=M,g=f(e.exportPixelRatio,1)):g=f(e.exportPixelRatio,y=x),"number"==typeof e.maxPixelRatio&&isFinite(e.maxPixelRatio)&&(y=Math.min(e.maxPixelRatio,y)),d&&(y=g);var k,E,_=function(t,e){if(!l())return[300,150];var n=e.parent||window;if(n===window||n===document||n===document.body)return[window.innerWidth,window.innerHeight];var r=n.getBoundingClientRect();return[r.width,r.height]}(0,e),T=_[0],j=_[1];if(p){var P=function(t,e,n){if(void 0===e&&(e="px"),void 0===n&&(n=72),"string"==typeof t){var r=t.toLowerCase();if(!(r in C))throw new Error('The dimension preset "'+t+'" is not supported or could not be found; try using a4, a3, postcard, letter, etc.');var i=C[r];return i.dimensions.map(function(t){return H(t,i.units,e,n)})}return t}(c,v,w),R=Math.max(P[0],P[1]),O=Math.min(P[0],P[1]);if(e.orientation){var S="landscape"===e.orientation;n=S?R:O,r=S?O:R}else n=P[0],r=P[1];k=n,E=r,n+=2*b,r+=2*b}else k=n=T,E=r=j;var F=n,D=r;if(p&&v&&(F=H(n,v,"px",w),D=H(r,v,"px",w)),i=Math.round(F),o=Math.round(D),h&&!d&&p){var A=n/r,N=T/j,L=f(e.scaleToFitPadding,40),I=Math.round(T-2*L),q=Math.round(j-2*L);(i>I||o>q)&&(N>A?(o=q,i=Math.round(o*A)):(i=I,o=Math.round(i/A)))}return{bleed:b,pixelRatio:y,width:n,height:r,dimensions:[n,r],units:v||"px",scaleX:(a=m?Math.round(y*i):Math.round(y*F))/n,scaleY:(s=m?Math.round(y*o):Math.round(y*D))/r,pixelsPerInch:w,viewportWidth:m?Math.round(i):Math.round(F),viewportHeight:m?Math.round(o):Math.round(D),canvasWidth:a,canvasHeight:s,trimWidth:k,trimHeight:E,styleWidth:i,styleHeight:o}}L.units=D;var q=function(t,e){if("string"!=typeof t)throw new TypeError("must specify type string");if(e=e||{},"undefined"==typeof document&&!e.canvas)return null;var n=e.canvas||document.createElement("canvas");"number"==typeof e.width&&(n.width=e.width);"number"==typeof e.height&&(n.height=e.height);var r,i=e;try{var o=[t];0===t.indexOf("webgl")&&o.push("experimental-"+t);for(var a=0;a<o.length;a++)if(r=n.getContext(o[a],i))return r}catch(t){r=null}return r||null};function z(t){var e,n;void 0===t&&(t={});var r=!1;if(!1!==t.canvas){if(!(e=t.context)||"string"==typeof e){var o=t.canvas;o||(o=function(){if(!l())throw new Error("It appears you are runing from Node.js or a non-browser environment. Try passing in an existing { canvas } interface instead.");return document.createElement("canvas")}(),r=!0);var a=e||"2d";if("function"!=typeof o.getContext)throw new Error("The specified { canvas } element does not have a getContext() function, maybe it is not a <canvas> tag?");if(!(e=q(a,i({},t.attributes,{canvas:o}))))throw new Error("Failed at canvas.getContext('"+a+"') - the browser may not support this context, or a different context may already be in use with this canvas.")}if(n=e.canvas,t.canvas&&n!==t.canvas)throw new Error("The { canvas } and { context } settings must point to the same underlying canvas element");t.pixelated&&(e.imageSmoothingEnabled=!1,e.mozImageSmoothingEnabled=!1,e.oImageSmoothingEnabled=!1,e.webkitImageSmoothingEnabled=!1,e.msImageSmoothingEnabled=!1,n.style["image-rendering"]="pixelated")}return{canvas:n,context:e,ownsCanvas:r}}var U=function(){var t=this;this._settings={},this._props={},this._sketch=void 0,this._raf=null,this._recordTimeout=null,this._lastRedrawResult=void 0,this._isP5Resizing=!1,this._keyboardShortcuts=function(t){void 0===t&&(t={});var e=function(e){if(t.enabled()){var n=p();83!==e.keyCode||e.altKey||!e.metaKey&&!e.ctrlKey?32===e.keyCode?t.togglePlay(e):n&&!e.altKey&&75===e.keyCode&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),t.commit(e)):(e.preventDefault(),t.save(e))}};return{attach:function(){window.addEventListener("keydown",e)},detach:function(){window.removeEventListener("keydown",e)}}}({enabled:function(){return!1!==t.settings.hotkeys},save:function(e){e.shiftKey?t.props.recording?(t.endRecord(),t.run()):t.record():t.props.recording||t.exportFrame()},togglePlay:function(){t.props.playing?t.pause():t.play()},commit:function(e){t.exportFrame({commit:!0})}}),this._animateHandler=function(){return t.animate()},this._resizeHandler=function(){t.resize()&&t.render()}},W={sketch:{configurable:!0},settings:{configurable:!0},props:{configurable:!0}};W.sketch.get=function(){return this._sketch},W.settings.get=function(){return this._settings},W.props.get=function(){return this._props},U.prototype._computePlayhead=function(t,e){return"number"==typeof e&&isFinite(e)?t/e:0},U.prototype._computeFrame=function(t,e,n,r){return isFinite(n)&&n>1?Math.floor(t*(n-1)):Math.floor(r*e)},U.prototype._computeCurrentFrame=function(){return this._computeFrame(this.props.playhead,this.props.time,this.props.totalFrames,this.props.fps)},U.prototype._getSizeProps=function(){var t=this.props;return{width:t.width,height:t.height,pixelRatio:t.pixelRatio,canvasWidth:t.canvasWidth,canvasHeight:t.canvasHeight,viewportWidth:t.viewportWidth,viewportHeight:t.viewportHeight}},U.prototype.run=function(){if(!this.sketch)throw new Error("should wait until sketch is loaded before trying to play()");return!1!==this.settings.playing&&this.play(),"function"==typeof this.sketch.dispose&&console.warn("In canvas-sketch@0.0.23 the dispose() event has been renamed to unload()"),this.props.started||(this._signalBegin(),this.props.started=!0),this.tick(),this.render(),this},U.prototype._cancelTimeouts=function(){null!=this._raf&&"undefined"!=typeof window&&"function"==typeof window.cancelAnimationFrame&&(window.cancelAnimationFrame(this._raf),this._raf=null),null!=this._recordTimeout&&(clearTimeout(this._recordTimeout),this._recordTimeout=null)},U.prototype.play=function(){var t=this.settings.animate;"animation"in this.settings&&(t=!0,console.warn("[canvas-sketch] { animation } has been renamed to { animate }")),t&&(l()?this.props.playing||(this.props.started||(this._signalBegin(),this.props.started=!0),this.props.playing=!0,this._cancelTimeouts(),this._lastTime=s(),this._raf=window.requestAnimationFrame(this._animateHandler)):console.error("[canvas-sketch] WARN: Using { animate } in Node.js is not yet supported"))},U.prototype.pause=function(){this.props.recording&&this.endRecord(),this.props.playing=!1,this._cancelTimeouts()},U.prototype.togglePlay=function(){this.props.playing?this.pause():this.play()},U.prototype.stop=function(){this.pause(),this.props.frame=0,this.props.playhead=0,this.props.time=0,this.props.deltaTime=0,this.props.started=!1,this.render()},U.prototype.record=function(){var t=this;if(!this.props.recording)if(l()){this.stop(),this.props.playing=!0,this.props.recording=!0;var e=this._createExportOptions({sequence:!0}),n=1/this.props.fps;this._cancelTimeouts();var r,i=function(){return t.props.recording?(t.props.deltaTime=n,t.tick(),t.exportFrame(e).then(function(){t.props.recording&&(t.props.deltaTime=0,t.props.frame++,t.props.frame<t.props.totalFrames?(t.props.time+=n,t.props.playhead=t._computePlayhead(t.props.time,t.props.duration),t._recordTimeout=setTimeout(i,0)):(console.log("Finished recording"),t._signalEnd(),t.endRecord(),t.stop(),t.run()))})):Promise.resolve()};this.props.started||(this._signalBegin(),this.props.started=!0),this.sketch&&"function"==typeof this.sketch.beginRecord&&this._wrapContextScale(function(e){return t.sketch.beginRecord(e)}),(r=e,void 0===r&&(r={}),_(!0,r)).catch(function(t){console.error(t)}).then(function(e){t._raf=window.requestAnimationFrame(i)})}else console.error("[canvas-sketch] WARN: Recording from Node.js is not yet supported")},U.prototype._signalBegin=function(){var t=this;this.sketch&&"function"==typeof this.sketch.begin&&this._wrapContextScale(function(e){return t.sketch.begin(e)})},U.prototype._signalEnd=function(){var t=this;this.sketch&&"function"==typeof this.sketch.end&&this._wrapContextScale(function(e){return t.sketch.end(e)})},U.prototype.endRecord=function(){var t,e=this,n=this.props.recording;return this._cancelTimeouts(),this.props.recording=!1,this.props.deltaTime=0,this.props.playing=!1,(void 0===t&&(t={}),_(!1,t)).catch(function(t){console.error(t)}).then(function(){n&&e.sketch&&"function"==typeof e.sketch.endRecord&&e._wrapContextScale(function(t){return e.sketch.endRecord(t)})})},U.prototype._createExportOptions=function(t){return void 0===t&&(t={}),{sequence:t.sequence,save:t.save,fps:this.props.fps,frame:t.sequence?this.props.frame:void 0,file:this.settings.file,name:this.settings.name,prefix:this.settings.prefix,suffix:this.settings.suffix,encoding:this.settings.encoding,encodingQuality:this.settings.encodingQuality,timeStamp:t.timeStamp||g(new Date,"yyyy.mm.dd-HH.MM.ss"),totalFrames:isFinite(this.props.totalFrames)?Math.max(0,this.props.totalFrames):1e3}},U.prototype.exportFrame=function(t){var e=this;if(void 0===t&&(t={}),!this.sketch)return Promise.all([]);"function"==typeof this.sketch.preExport&&this.sketch.preExport();var n=this._createExportOptions(t),r=p(),o=Promise.resolve();if(r&&t.commit&&"function"==typeof r.commit){var a=i({},n),s=r.commit(a);o=u(s)?s:Promise.resolve(s)}return o.then(function(t){return e._doExportFrame(i({},n,{hash:t||""}))}).then(function(t){return 1===t.length?t[0]:t})},U.prototype._doExportFrame=function(t){var e=this;void 0===t&&(t={}),this._props.exporting=!0,this.resize();var n=this.render();return void 0===n&&(n=[this.props.canvas]),n=(n=[].concat(n).filter(Boolean)).map(function(e){var n,r="object"==typeof e&&e&&("data"in e||"dataURL"in e),o=r?e.data:e,a=r?i({},e,{data:o}):{data:o};if(c(n=o)&&/canvas/i.test(n.nodeName)&&"function"==typeof n.getContext){var s=function(t,e){void 0===e&&(e={});var n=e.encoding||"image/png";if(!E.includes(n))throw new Error("Invalid canvas encoding "+n);var r=(n.split("/")[1]||"").replace(/jpeg/i,"jpg");return r&&(r=("."+r).toLowerCase()),{extension:r,type:n,dataURL:t.toDataURL(n,e.encodingQuality)}}(o,{encoding:a.encoding||t.encoding,encodingQuality:f(a.encodingQuality,t.encodingQuality,.95)});return Object.assign(a,{dataURL:s.dataURL,extension:s.extension,type:s.type})}return a}),this._props.exporting=!1,this.resize(),this.render(),Promise.all(n.map(function(e,n,r){var o=i({extension:"",prefix:"",suffix:""},t,e,{layer:n,totalLayers:r.length}),a=!1!==t.save&&e.save;for(var s in o.save=!1!==a,o.filename=P(o),delete o.encoding,delete o.encodingQuality,o)void 0===o[s]&&delete o[s];var u=Promise.resolve({});if(o.save){var c=o.data;if(o.dataURL)u=T(o.dataURL,o);else u=function(t,e){void 0===e&&(e={});var n=Array.isArray(t)?t:[t];return j(new window.Blob(n,{type:e.type||""}),e)}(c,o)}return u.then(function(t){return Object.assign({},o,t)})})).then(function(n){var r=n.filter(function(t){return t.save});if(r.length>0){var i,o=r.find(function(t){return t.outputName}),a=r.some(function(t){return t.client}),s=r.some(function(t){return t.stream});i=r.length>1?r.length:o?o.outputName+"/"+r[0].filename:""+r[0].filename;var u="";if(t.sequence)u=isFinite(e.props.totalFrames)?" (frame "+(t.frame+1)+" / "+e.props.totalFrames+")":" (frame "+t.frame+")";else r.length>1&&(u=" files");console.log("%c["+(a?"canvas-sketch-cli":"canvas-sketch")+"]%c "+(s?"Streaming into":"Exported")+" %c"+i+"%c"+u,"color: #8e8e8e;","color: initial;","font-weight: bold;","font-weight: initial;")}return"function"==typeof e.sketch.postExport&&e.sketch.postExport(),n})},U.prototype._wrapContextScale=function(t){this._preRender(),t(this.props),this._postRender()},U.prototype._preRender=function(){var t=this.props;this.props.gl||!t.context||t.p5?t.p5&&t.p5.scale(t.scaleX/t.pixelRatio,t.scaleY/t.pixelRatio):(t.context.save(),!1!==this.settings.scaleContext&&t.context.scale(t.scaleX,t.scaleY))},U.prototype._postRender=function(){var t=this.props;this.props.gl||!t.context||t.p5||t.context.restore(),t.gl&&!1!==this.settings.flush&&!t.p5&&t.gl.flush()},U.prototype.tick=function(){this.sketch&&"function"==typeof this.sketch.tick&&(this._preRender(),this.sketch.tick(this.props),this._postRender())},U.prototype.render=function(){return this.props.p5?(this._lastRedrawResult=void 0,this.props.p5.redraw(),this._lastRedrawResult):this.submitDrawCall()},U.prototype.submitDrawCall=function(){if(this.sketch){var t,e=this.props;return this._preRender(),"function"==typeof this.sketch?t=this.sketch(e):"function"==typeof this.sketch.render&&(t=this.sketch.render(e)),this._postRender(),t}},U.prototype.update=function(t){var e=this;void 0===t&&(t={});var n=["animate"];Object.keys(t).forEach(function(t){if(n.indexOf(t)>=0)throw new Error("Sorry, the { "+t+" } option is not yet supported with update().")});var r=this._settings.canvas,i=this._settings.context;for(var o in t){var a=t[o];void 0!==a&&(e._settings[o]=a)}var s=Object.assign({},this._settings,t);if("time"in t&&"frame"in t)throw new Error("You should specify { time } or { frame } but not both");if("time"in t?delete s.frame:"frame"in t&&delete s.time,"duration"in t&&"totalFrames"in t)throw new Error("You should specify { duration } or { totalFrames } but not both");"duration"in t?delete s.totalFrames:"totalFrames"in t&&delete s.duration,"data"in t&&(this._props.data=t.data);var u=this.getTimeProps(s);if(Object.assign(this._props,u),r!==this._settings.canvas||i!==this._settings.context){var c=z(this._settings),p=c.context;this.props.canvas=c.canvas,this.props.context=p,this._setupGLKey(),this._appendCanvasIfNeeded()}return t.p5&&"function"!=typeof t.p5&&(this.props.p5=t.p5,this.props.p5.draw=function(){e._isP5Resizing||(e._lastRedrawResult=e.submitDrawCall())}),"playing"in t&&(t.playing?this.play():this.pause()),S(this._settings),this.resize(),this.render(),this.props},U.prototype.resize=function(){var t=this._getSizeProps(),e=this.settings,n=this.props,r=I(n,e);Object.assign(this._props,r);var i=this.props,o=i.pixelRatio,a=i.canvasWidth,s=i.canvasHeight,u=i.styleWidth,c=i.styleHeight,p=this.props.canvas;p&&!1!==e.resizeCanvas&&(n.p5?p.width===a&&p.height===s||(this._isP5Resizing=!0,n.p5.pixelDensity(o),n.p5.resizeCanvas(a/o,s/o,!1),this._isP5Resizing=!1):(p.width!==a&&(p.width=a),p.height!==s&&(p.height=s)),l()&&!1!==e.styleCanvas&&(p.style.width=u+"px",p.style.height=c+"px"));var f=this._getSizeProps(),d=!y(t,f);return d&&this._sizeChanged(),d},U.prototype._sizeChanged=function(){this.sketch&&"function"==typeof this.sketch.resize&&this.sketch.resize(this.props)},U.prototype.animate=function(){if(this.props.playing)if(l()){this._raf=window.requestAnimationFrame(this._animateHandler);var t=s(),e=1e3/this.props.fps,n=t-this._lastTime,r=this.props.duration,i="number"==typeof r&&isFinite(r),o=!0,a=this.settings.playbackRate;"fixed"===a?n=e:"throttle"===a?n>e?this._lastTime=t-=n%e:o=!1:this._lastTime=t;var u=n/1e3,c=this.props.time+u*this.props.timeScale;c<0&&i&&(c=r+c);var p=!1,f=!1;if(i&&c>=r&&(!1!==this.settings.loop?(o=!0,c%=r,f=!0):(o=!1,c=r,p=!0),this._signalEnd()),o){this.props.deltaTime=u,this.props.time=c,this.props.playhead=this._computePlayhead(c,r);var d=this.props.frame;this.props.frame=this._computeCurrentFrame(),f&&this._signalBegin(),d!==this.props.frame&&this.tick(),this.render(),this.props.deltaTime=0}p&&this.pause()}else console.error("[canvas-sketch] WARN: Animation in Node.js is not yet supported")},U.prototype.dispatch=function(t){if("function"!=typeof t)throw new Error("must pass function into dispatch()");t(this.props),this.render()},U.prototype.mount=function(){this._appendCanvasIfNeeded()},U.prototype.unmount=function(){l()&&(window.removeEventListener("resize",this._resizeHandler),this._keyboardShortcuts.detach()),this.props.canvas.parentElement&&this.props.canvas.parentElement.removeChild(this.props.canvas)},U.prototype._appendCanvasIfNeeded=function(){l()&&(!1!==this.settings.parent&&this.props.canvas&&!this.props.canvas.parentElement&&(this.settings.parent||document.body).appendChild(this.props.canvas))},U.prototype._setupGLKey=function(){var t;this.props.context&&("function"==typeof(t=this.props.context).clear&&"function"==typeof t.clearColor&&"function"==typeof t.bufferData?this._props.gl=this.props.context:delete this._props.gl)},U.prototype.getTimeProps=function(t){void 0===t&&(t={});var e=t.duration,n=t.totalFrames,r=f(t.timeScale,1),i=f(t.fps,24),o="number"==typeof e&&isFinite(e),a="number"==typeof n&&isFinite(n),s=o?Math.floor(i*e):void 0,u=a?n/i:void 0;if(o&&a&&s!==n)throw new Error("You should specify either duration or totalFrames, but not both. Or, they must match exactly.");void 0===t.dimensions&&void 0!==t.units&&console.warn("You've specified a { units } setting but no { dimension }, so the units will be ignored."),n=f(n,s,Infinity),e=f(e,u,Infinity);var c=t.time,p=t.frame,l="number"==typeof c&&isFinite(c),d="number"==typeof p&&isFinite(p),h=0,m=0,y=0;if(l&&d)throw new Error("You should specify either start frame or time, but not both.");return l?(y=this._computePlayhead(h=c,e),m=this._computeFrame(y,h,n,i)):d&&(y=this._computePlayhead(h=(m=p)/i,e)),{playhead:y,time:h,frame:m,duration:e,totalFrames:n,fps:i,timeScale:r}},U.prototype.setup=function(t){var e=this;if(void 0===t&&(t={}),this.sketch)throw new Error("Multiple setup() calls not yet supported.");this._settings=Object.assign({},t,this._settings),S(this._settings);var n=z(this._settings),r=n.context,i=n.canvas,o=this.getTimeProps(this._settings);this._props=Object.assign({},o,{canvas:i,context:r,deltaTime:0,started:!1,exporting:!1,playing:!1,recording:!1,settings:this.settings,data:this.settings.data,render:function(){return e.render()},togglePlay:function(){return e.togglePlay()},dispatch:function(t){return e.dispatch(t)},tick:function(){return e.tick()},resize:function(){return e.resize()},update:function(t){return e.update(t)},exportFrame:function(t){return e.exportFrame(t)},record:function(){return e.record()},play:function(){return e.play()},pause:function(){return e.pause()},stop:function(){return e.stop()}}),this._setupGLKey(),this.resize()},U.prototype.loadAndRun=function(t,e){var n=this;return this.load(t,e).then(function(){return n.run(),n})},U.prototype.unload=function(){var t=this;this.pause(),this.sketch&&("function"==typeof this.sketch.unload&&this._wrapContextScale(function(e){return t.sketch.unload(e)}),this._sketch=null)},U.prototype.destroy=function(){this.unload(),this.unmount()},U.prototype.load=function(t,e){var n=this;if("function"!=typeof t)throw new Error("The function must take in a function as the first parameter. Example:\n canvasSketcher(() => { ... }, settings)");this.sketch&&this.unload(),void 0!==e&&this.update(e),this._preRender();var r=Promise.resolve();if(this.settings.p5){if(!l())throw new Error("[canvas-sketch] ERROR: Using p5.js in Node.js is not supported");r=new Promise(function(t){var e,r=n.settings.p5;r.p5&&(e=r.preload,r=r.p5);var i=function(r){e&&(r.preload=function(){return e(r)}),r.setup=function(){var e=n.props,i="webgl"===n.settings.context,o=i?r.WEBGL:r.P2D;r.noLoop(),r.pixelDensity(e.pixelRatio),r.createCanvas(e.viewportWidth,e.viewportHeight,o),i&&n.settings.attributes&&r.setAttributes(n.settings.attributes),n.update({p5:r,canvas:r.canvas,context:r._renderer.drawingContext}),t()}};if("function"==typeof r)new r(i);else{if("function"!=typeof window.createCanvas)throw new Error("{ p5 } setting is passed but can't find p5.js in global (window) scope. Maybe you did not create it globally?\nnew p5(); // <-- attaches to global scope");i(window)}})}return r.then(function(){var e=t(n.props);return u(e)||(e=Promise.resolve(e)),e}).then(function(t){return t||(t={}),n._sketch=t,l()&&(n._keyboardShortcuts.attach(),window.addEventListener("resize",n._resizeHandler)),n._postRender(),n._sizeChanged(),n}).catch(function(t){throw console.warn("Could not start sketch, the async loading function rejected with an error:\n Error: "+t.message),t})},Object.defineProperties(U.prototype,W);var B="hot-id-cache",X=[];function $(t,e){if(void 0===e&&(e={}),e.p5){if(e.canvas||e.context&&"string"!=typeof e.context)throw new Error('In { p5 } mode, you can\'t pass your own canvas or context, unless the context is a "webgl" or "2d" string');e=Object.assign({},e,{canvas:!1,context:"string"==typeof e.context&&e.context})}var n,r,i=(n=p())&&n.hot;i&&(r=f(e.id,"$__DEFAULT_CANVAS_SKETCH_ID__$"));var o=i&&"string"==typeof r;o&&X.includes(r)&&(console.warn("Warning: You have multiple calls to canvasSketch() in --hot mode. You must pass unique { id } strings in settings to enable hot reload across multiple sketches. ",r),o=!1);var a=Promise.resolve();if(o){X.push(r);var s=function(t){var e=p();if(e)return e[B]=e[B]||{},e[B][t]}(r);if(s){var u=function(){var t,n=(t=s.manager,e.animate?{time:t.props.time}:void 0);return s.manager.destroy(),n};a=s.load.then(u).catch(u)}}return a.then(function(n){var i,a,s,u,c=new U;return t?(e=Object.assign({},e,n),c.setup(e),c.mount(),i=c.loadAndRun(t)):i=Promise.resolve(c),o&&(a=r,s={load:i,manager:c},(u=p())&&(u[B]=u[B]||{},u[B][a]=s)),i})}return $.canvasSketch=$,$.PaperSizes=C,$})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],6:[function(t,e,n){e.exports=function(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}},{}],7:[function(t,e,n){(function(t){var n;n="undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{},e.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],8:[function(t,e,n){e.exports=function(t){if(!t)return!1;var e=r.call(t);return"[object Function]"===e||"function"==typeof t&&"[object RegExp]"!==e||"undefined"!=typeof window&&(t===window.setTimeout||t===window.alert||t===window.confirm||t===window.prompt)};var r=Object.prototype.toString},{}],9:[function(t,e,n){function r(t){return!!t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof t.then}e.exports=r,e.exports.default=r},{}],10:[function(t,e,n){var r=t("./loaders"),i=t("object-assign"),o=t("is-promise"),a=function(){};function s(t,e,n){if("function"!=typeof(e=e||a))return Promise.reject(new Error("The second argument to load.all() and load.any() must be a function, or undefined"));var r,i,o=0,s=function(t,n,i,o){var a={target:t,total:r,count:i,progress:i/r,value:n};o&&(a.error=o),e(a)};if(i=n?function(t){return u(t).then(function(t){return{value:t}},function(t){return{value:null,error:t}}).then(function(e){return s(t,e.value,++o,e.error),e.value})}:function(t){return u(t).then(function(e){return s(t,e,++o),e})},Array.isArray(t))return r=t.length,Promise.all(t.map(function(t){return i(t)}));if(t){var c=Object.keys(t).map(function(e){return{key:e,value:t[e]}});return r=c.length,Promise.all(c.map(function(t){var e=t.key;return i(t.value).then(function(t){return{value:t,key:e}})})).then(function(t){return t.reduce(function(t,e){return t[e.key]=e.value,t},{})})}return Promise.reject(new Error("You must specify an array of assets or object group to load"))}function u(t){return t?("string"==typeof t&&(t={url:t}),o(t)?t:function(t){var e,n,i=t.type?t.type:null;if(i){if("function"==typeof i)return Promise.resolve(i);if(i=i.toLowerCase(),!t.url)return Promise.reject(new Error("When using loadAsset(), you must specify a URL or descriptor of the asset to load"));for(e=0;e<r.length;e++)if((n=r[e]).key===i)return Promise.resolve(n.load);return Promise.reject(new Error('Could not find an asset loader by the key "'+t.type+'"'))}if(!t.url)return Promise.reject(new Error("When using loadAsset(), you must specify a URL or descriptor of the asset to load"));var o=function(t){if(!t)return"";var e=t.lastIndexOf("/");-1!==e&&(t=t.substring(e+1));-1!==(e=t.indexOf("?"))&&(t=t.substring(0,e));-1!==(e=t.indexOf("#"))&&(t=t.substring(0,e));return-1!==(e=t.lastIndexOf("."))?t.substring(e):""}(t.url);if(!o)return Promise.reject(new Error('No extension found for input URL "'+t.url+'", try to specify a { type } such as "image" or "text"'));for(e=0;e<r.length;e++)if((n=r[e]).match){var a="function"==typeof n.match?n.match(o):n.match.test(o);if(a)return Promise.resolve(n.load)}return Promise.reject(new Error('Could not infer an asset loader from the file type "'+o+'", try specifying { type } such as "image" or "text"'))}(t).then(function(e){return delete(t=i({},t)).type,e(t)})):Promise.reject(new Error("You must specify a URL or descriptor of the asset to load"))}e.exports=u,e.exports.all=function(t,e){return s(t,e,!1)},e.exports.any=function(t,e){return s(t,e,!0)}},{"./loaders":13,"is-promise":9,"object-assign":15}],11:[function(t,e,n){var r=t("xhr"),i=t("object-assign");e.exports=function(t){return function(e){return("fetch"in window?window.fetch(e.url,e).then(function(e){if(/404/.test(e.status))throw new Error("Resource not found");if(!/^2/.test(e.status))throw new Error("Unexpected HTTP Status Code: "+e.status);if(!e.ok)throw new Error("Response not OK");return"json"===t?e.json():"binary"===t?e.arrayBuffer():"blob"===t?e.blob():e.text()}):function(t,e){return new Promise(function(n,o){var a="text";"json"===t?a="text":"binary"===t?a="arraybuffer":"blob"===t&&(a="blob"),e=i({},e,{json:!1,responseType:a}),r(e,function(e,r,i){if(e)return o(e);if(/404/.test(r.statusCode))throw new Error("Resource not found");if(!/^2/.test(r.statusCode))return o(new Error("Unexpected HTTP Status Code: "+r.statusCode));if("json"===t)try{i=JSON.parse(i)}catch(e){return o(e)}n(i)})})}(t,e)).catch(function(t){throw new Error(t.message+" while loading file "+e.url)})}}},{"object-assign":15,xhr:19}],12:[function(t,e,n){var r=t("browser-media-mime-type");e.exports=function(t,e){return{key:t,match:function(e){return function(t){var e=r(t);return e?0===e.indexOf("audio")?"audio":0===e.indexOf("video")?"video":null:null}(e)===t},load:function(n){return new Promise(function(r,i){var o=!1,a=e(),s=function(){o||(o=!0,r(a))},u=(n.event||"canplay").toLowerCase();if("loadedmetadata"===u?a.onloadedmetadata=s:"canplaythrough"===u?a.oncanplaythrough=s:"loadeddata"===u?a.onloadeddata=s:a.oncanplay=s,a.onerror=function(e){o||(o=!0,i(new Error("Error while loading "+t+" at "+n.url)))},n.crossOrigin&&(a.crossOrigin=n.crossOrigin),void 0!==n.volume&&(a.volume=n.volume),void 0!==n.preload&&(a.preload=n.volume),void 0!==n.playbackRate&&(a.playbackRate=n.volume),void 0!==n.muted&&(a.muted=n.volume),void 0!==n.currentTime&&(a.currentTime=n.volume),void 0!==n.controls&&(a.controls=n.volume),void 0!==n.autoPlay&&(a.autoPlay=n.volume),a.src=n.url,a.readyState>=a.HAVE_ENOUGH_DATA)return o=!0,r(a);a.load()})}}}},{"browser-media-mime-type":2}],13:[function(t,e,n){const r=t("./createMediaLoader"),i=t("./createFileLoader"),o=t("./loadImage");e.exports=[{key:"json",match:/\.json$/i,load:i("json")},{key:"text",match:/\.txt$/i,load:i("text")},{key:"image",match:/\.(jpg|jpeg|svg|png|gif|webp|bmp|tga|tif|apng|wbpm|ico)$/i,load:o},r("audio",function(){return new window.Audio}),r("video",function(){return document.createElement("video")}),{key:"binary",match:/\.bin$/i,load:i("binary")},{key:"blob",load:i("blob")}]},{"./createFileLoader":11,"./createMediaLoader":12,"./loadImage":14}],14:[function(t,e,n){e.exports=function(t){return new Promise(function(e,n){var r=!1,i=new window.Image;i.onload=function(){r||(r=!0,e(i))},i.onerror=function(){r||(r=!0,n(new Error("Error while loading image at "+t.url)))},t.crossOrigin&&(i.crossOrigin=t.crossOrigin),i.src=t.url})}},{}],15:[function(t,e,n){"use strict";var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(t){r[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,a,s=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),u=1;u<arguments.length;u++){for(var c in n=Object(arguments[u]))i.call(n,c)&&(s[c]=n[c]);if(r){a=r(n);for(var p=0;p<a.length;p++)o.call(n,a[p])&&(s[a[p]]=n[a[p]])}}return s}},{}],16:[function(t,e,n){var r=function(t){return t.replace(/^\s+|\s+$/g,"")};e.exports=function(t){if(!t)return{};for(var e={},n=r(t).split("\n"),i=0;i<n.length;i++){var o=n[i],a=o.indexOf(":"),s=r(o.slice(0,a)).toLowerCase(),u=r(o.slice(a+1));void 0===e[s]?e[s]=u:"[object Array]"===Object.prototype.toString.call(e[s])?e[s].push(u):e[s]=[e[s],u]}return e}},{}],17:[function(t,e,n){(function(t){"use strict";var n=256,r=[],i=void 0===t?window:t,o=Math.pow(n,6),a=Math.pow(2,52),s=2*a,u=n-1,c=Math.random;function p(t){var e,r=t.length,i=this,o=0,a=i.i=i.j=0,s=i.S=[];for(r||(t=[r++]);o<n;)s[o]=o++;for(o=0;o<n;o++)s[o]=s[a=u&a+t[o%r]+(e=s[o])],s[a]=e;(i.g=function(t){for(var e,r=0,o=i.i,a=i.j,s=i.S;t--;)e=s[o=u&o+1],r=r*n+s[u&(s[o]=s[a=u&a+e])+(s[a]=e)];return i.i=o,i.j=a,r})(n)}function f(t,e){for(var n,r=t+"",i=0;i<r.length;)e[u&i]=u&(n^=19*e[u&i])+r.charCodeAt(i++);return l(e)}function l(t){return String.fromCharCode.apply(0,t)}e.exports=function(t,u){if(u&&!0===u.global)return u.global=!1,Math.random=e.exports(t,u),u.global=!0,Math.random;var c=[],d=(f(function t(e,n){var r,i=[],o=(typeof e)[0];if(n&&"o"==o)for(r in e)try{i.push(t(e[r],n-1))}catch(t){}return i.length?i:"s"==o?e:e+"\0"}(u&&u.entropy||!1?[t,l(r)]:0 in arguments?t:function(t){try{return i.crypto.getRandomValues(t=new Uint8Array(n)),l(t)}catch(t){return[+new Date,i,i.navigator&&i.navigator.plugins,i.screen,l(r)]}}(),3),c),new p(c));return f(l(d.S),r),function(){for(var t=d.g(6),e=o,r=0;t<a;)t=(t+r)*n,e*=n,r=d.g(1);for(;t>=s;)t/=2,e/=2,r>>>=1;return(t+r)/e}},e.exports.resetGlobal=function(){Math.random=c},f(Math.random(),r)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],18:[function(t,e,n){!function(){"use strict";var t=.5*(Math.sqrt(3)-1),r=(3-Math.sqrt(3))/6,i=1/6,o=(Math.sqrt(5)-1)/4,a=(5-Math.sqrt(5))/20;function s(t){var e;e="function"==typeof t?t:t?function(){var t=0,e=0,n=0,r=1,i=(o=4022871197,function(t){t=t.toString();for(var e=0;e<t.length;e++){var n=.02519603282416938*(o+=t.charCodeAt(e));n-=o=n>>>0,o=(n*=o)>>>0,o+=4294967296*(n-=o)}return 2.3283064365386963e-10*(o>>>0)});var o;t=i(" "),e=i(" "),n=i(" ");for(var a=0;a<arguments.length;a++)(t-=i(arguments[a]))<0&&(t+=1),(e-=i(arguments[a]))<0&&(e+=1),(n-=i(arguments[a]))<0&&(n+=1);return i=null,function(){var i=2091639*t+2.3283064365386963e-10*r;return t=e,e=n,n=i-(r=0|i)}}(t):Math.random,this.p=u(e),this.perm=new Uint8Array(512),this.permMod12=new Uint8Array(512);for(var n=0;n<512;n++)this.perm[n]=this.p[255&n],this.permMod12[n]=this.perm[n]%12}function u(t){var e,n=new Uint8Array(256);for(e=0;e<256;e++)n[e]=e;for(e=0;e<255;e++){var r=e+~~(t()*(256-e)),i=n[e];n[e]=n[r],n[r]=i}return n}s.prototype={grad3:new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]),grad4:new Float32Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]),noise2D:function(e,n){var i,o,a=this.permMod12,s=this.perm,u=this.grad3,c=0,p=0,f=0,l=(e+n)*t,d=Math.floor(e+l),h=Math.floor(n+l),m=(d+h)*r,y=e-(d-m),g=n-(h-m);y>g?(i=1,o=0):(i=0,o=1);var v=y-i+r,w=g-o+r,b=y-1+2*r,x=g-1+2*r,M=255&d,k=255&h,E=.5-y*y-g*g;if(E>=0){var _=3*a[M+s[k]];c=(E*=E)*E*(u[_]*y+u[_+1]*g)}var T=.5-v*v-w*w;if(T>=0){var j=3*a[M+i+s[k+o]];p=(T*=T)*T*(u[j]*v+u[j+1]*w)}var P=.5-b*b-x*x;if(P>=0){var R=3*a[M+1+s[k+1]];f=(P*=P)*P*(u[R]*b+u[R+1]*x)}return 70*(c+p+f)},noise3D:function(t,e,n){var r,o,a,s,u,c,p,f,l,d,h=this.permMod12,m=this.perm,y=this.grad3,g=(t+e+n)*(1/3),v=Math.floor(t+g),w=Math.floor(e+g),b=Math.floor(n+g),x=(v+w+b)*i,M=t-(v-x),k=e-(w-x),E=n-(b-x);M>=k?k>=E?(u=1,c=0,p=0,f=1,l=1,d=0):M>=E?(u=1,c=0,p=0,f=1,l=0,d=1):(u=0,c=0,p=1,f=1,l=0,d=1):k<E?(u=0,c=0,p=1,f=0,l=1,d=1):M<E?(u=0,c=1,p=0,f=0,l=1,d=1):(u=0,c=1,p=0,f=1,l=1,d=0);var _=M-u+i,T=k-c+i,j=E-p+i,P=M-f+2*i,R=k-l+2*i,O=E-d+2*i,S=M-1+.5,C=k-1+.5,F=E-1+.5,D=255&v,A=255&w,N=255&b,L=.6-M*M-k*k-E*E;if(L<0)r=0;else{var H=3*h[D+m[A+m[N]]];r=(L*=L)*L*(y[H]*M+y[H+1]*k+y[H+2]*E)}var I=.6-_*_-T*T-j*j;if(I<0)o=0;else{var q=3*h[D+u+m[A+c+m[N+p]]];o=(I*=I)*I*(y[q]*_+y[q+1]*T+y[q+2]*j)}var z=.6-P*P-R*R-O*O;if(z<0)a=0;else{var U=3*h[D+f+m[A+l+m[N+d]]];a=(z*=z)*z*(y[U]*P+y[U+1]*R+y[U+2]*O)}var W=.6-S*S-C*C-F*F;if(W<0)s=0;else{var B=3*h[D+1+m[A+1+m[N+1]]];s=(W*=W)*W*(y[B]*S+y[B+1]*C+y[B+2]*F)}return 32*(r+o+a+s)},noise4D:function(t,e,n,r){var i,s,u,c,p,f,l,d,h,m,y,g,v,w,b,x,M,k=this.perm,E=this.grad4,_=(t+e+n+r)*o,T=Math.floor(t+_),j=Math.floor(e+_),P=Math.floor(n+_),R=Math.floor(r+_),O=(T+j+P+R)*a,S=t-(T-O),C=e-(j-O),F=n-(P-O),D=r-(R-O),A=0,N=0,L=0,H=0;S>C?A++:N++,S>F?A++:L++,S>D?A++:H++,C>F?N++:L++,C>D?N++:H++,F>D?L++:H++;var I=S-(f=A>=3?1:0)+a,q=C-(l=N>=3?1:0)+a,z=F-(d=L>=3?1:0)+a,U=D-(h=H>=3?1:0)+a,W=S-(m=A>=2?1:0)+2*a,B=C-(y=N>=2?1:0)+2*a,X=F-(g=L>=2?1:0)+2*a,$=D-(v=H>=2?1:0)+2*a,Y=S-(w=A>=1?1:0)+3*a,G=C-(b=N>=1?1:0)+3*a,K=F-(x=L>=1?1:0)+3*a,J=D-(M=H>=1?1:0)+3*a,Q=S-1+4*a,V=C-1+4*a,Z=F-1+4*a,tt=D-1+4*a,et=255&T,nt=255&j,rt=255&P,it=255&R,ot=.6-S*S-C*C-F*F-D*D;if(ot<0)i=0;else{var at=k[et+k[nt+k[rt+k[it]]]]%32*4;i=(ot*=ot)*ot*(E[at]*S+E[at+1]*C+E[at+2]*F+E[at+3]*D)}var st=.6-I*I-q*q-z*z-U*U;if(st<0)s=0;else{var ut=k[et+f+k[nt+l+k[rt+d+k[it+h]]]]%32*4;s=(st*=st)*st*(E[ut]*I+E[ut+1]*q+E[ut+2]*z+E[ut+3]*U)}var ct=.6-W*W-B*B-X*X-$*$;if(ct<0)u=0;else{var pt=k[et+m+k[nt+y+k[rt+g+k[it+v]]]]%32*4;u=(ct*=ct)*ct*(E[pt]*W+E[pt+1]*B+E[pt+2]*X+E[pt+3]*$)}var ft=.6-Y*Y-G*G-K*K-J*J;if(ft<0)c=0;else{var lt=k[et+w+k[nt+b+k[rt+x+k[it+M]]]]%32*4;c=(ft*=ft)*ft*(E[lt]*Y+E[lt+1]*G+E[lt+2]*K+E[lt+3]*J)}var dt=.6-Q*Q-V*V-Z*Z-tt*tt;if(dt<0)p=0;else{var ht=k[et+1+k[nt+1+k[rt+1+k[it+1]]]]%32*4;p=(dt*=dt)*dt*(E[ht]*Q+E[ht+1]*V+E[ht+2]*Z+E[ht+3]*tt)}return 27*(i+s+u+c+p)}},s._buildPermutationTable=u,"undefined"!=typeof define&&define.amd&&define(function(){return s}),void 0!==n?n.SimplexNoise=s:"undefined"!=typeof window&&(window.SimplexNoise=s),void 0!==e&&(e.exports=s)}()},{}],19:[function(t,e,n){"use strict";var r=t("global/window"),i=t("is-function"),o=t("parse-headers"),a=t("xtend");function s(t,e,n){var r=t;return i(e)?(n=e,"string"==typeof t&&(r={uri:t})):r=a(e,{uri:t}),r.callback=n,r}function u(t,e,n){return c(e=s(t,e,n))}function c(t){if(void 0===t.callback)throw new Error("callback argument missing");var e=!1,n=function(n,r,i){e||(e=!0,t.callback(n,r,i))};function r(){var t=void 0;if(t=p.response?p.response:p.responseText||function(t){try{if("document"===t.responseType)return t.responseXML;var e=t.responseXML&&"parsererror"===t.responseXML.documentElement.nodeName;if(""===t.responseType&&!e)return t.responseXML}catch(t){}return null}(p),g)try{t=JSON.parse(t)}catch(t){}return t}function i(t){return clearTimeout(f),t instanceof Error||(t=new Error(""+(t||"Unknown XMLHttpRequest Error"))),t.statusCode=0,n(t,v)}function a(){if(!c){var e;clearTimeout(f);var i=v,a=null;return 0!==(e=t.useXDR&&void 0===p.status?200:1223===p.status?204:p.status)?(i={body:r(),statusCode:e,method:d,headers:{},url:l,rawRequest:p},p.getAllResponseHeaders&&(i.headers=o(p.getAllResponseHeaders()))):a=new Error("Internal XMLHttpRequest Error"),n(a,i,i.body)}}var s,c,p=t.xhr||null;p||(p=t.cors||t.useXDR?new u.XDomainRequest:new u.XMLHttpRequest);var f,l=p.url=t.uri||t.url,d=p.method=t.method||"GET",h=t.body||t.data,m=p.headers=t.headers||{},y=!!t.sync,g=!1,v={body:void 0,headers:{},statusCode:0,method:d,url:l,rawRequest:p};if("json"in t&&!1!==t.json&&(g=!0,m.accept||m.Accept||(m.Accept="application/json"),"GET"!==d&&"HEAD"!==d&&(m["content-type"]||m["Content-Type"]||(m["Content-Type"]="application/json"),h=JSON.stringify(!0===t.json?h:t.json))),p.onreadystatechange=function(){4===p.readyState&&setTimeout(a,0)},p.onload=a,p.onerror=i,p.onprogress=function(){},p.onabort=function(){c=!0},p.ontimeout=i,p.open(d,l,!y,t.username,t.password),y||(p.withCredentials=!!t.withCredentials),!y&&t.timeout>0&&(f=setTimeout(function(){if(!c){c=!0,p.abort("timeout");var t=new Error("XMLHttpRequest timeout");t.code="ETIMEDOUT",i(t)}},t.timeout)),p.setRequestHeader)for(s in m)m.hasOwnProperty(s)&&p.setRequestHeader(s,m[s]);else if(t.headers&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(t.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in t&&(p.responseType=t.responseType),"beforeSend"in t&&"function"==typeof t.beforeSend&&t.beforeSend(p),p.send(h||null),p}e.exports=u,e.exports.default=u,u.XMLHttpRequest=r.XMLHttpRequest||function(){},u.XDomainRequest="withCredentials"in new u.XMLHttpRequest?u.XMLHttpRequest:r.XDomainRequest,function(t,e){for(var n=0;n<t.length;n++)e(t[n])}(["get","put","post","patch","head","delete"],function(t){u["delete"===t?"del":t]=function(e,n,r){return(n=s(e,n,r)).method=t.toUpperCase(),c(n)}})},{"global/window":7,"is-function":8,"parse-headers":16,xtend:20}],20:[function(t,e,n){e.exports=function(){for(var t={},e=0;e<arguments.length;e++){var n=arguments[e];for(var i in n)r.call(n,i)&&(t[i]=n[i])}return t};var r=Object.prototype.hasOwnProperty},{}],21:[function(t,e,n){(function(t){t.CANVAS_SKETCH_DEFAULT_STORAGE_KEY=window.location.href}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1,21]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gtY2xpL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJnZW5ldGljLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItbWVkaWEtbWltZS10eXBlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItbWVkaWEtbWltZS10eXBlL21pbWUtdHlwZXMuanNvbiIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoLXV0aWwvcmFuZG9tLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbm9kZV9tb2R1bGVzL3JpZ2h0LW5vdy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9ub2RlX21vZHVsZXMvaXMtcHJvbWlzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbm9kZV9tb2R1bGVzL2lzLWRvbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL25vZGVfbW9kdWxlcy9yZXBlYXQtc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9ub2RlX21vZHVsZXMvZGVlcC1lcXVhbC9saWIva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvbGliL2lzX2FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbm9kZV9tb2R1bGVzL2RlZXAtZXF1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL25vZGVfbW9kdWxlcy9kYXRlZm9ybWF0L2xpYi9kYXRlZm9ybWF0LmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9ub2RlX21vZHVsZXMvcGFkLWxlZnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2xpYi9zYXZlLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9saWIvYWNjZXNzaWJpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbGliL3BhcGVyLXNpemVzLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9ub2RlX21vZHVsZXMvZGVmaW5lZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbm9kZV9tb2R1bGVzL2NvbnZlcnQtbGVuZ3RoL2NvbnZlcnQtbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9saWIvZGlzdGFuY2VzLmpzIiwibm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvZGlzdC9ub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9saWIvY29yZS9yZXNpemVDYW52YXMuanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL25vZGVfbW9kdWxlcy9nZXQtY2FudmFzLWNvbnRleHQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2xpYi9jb3JlL2NyZWF0ZUNhbnZhcy5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbGliL2NvcmUvU2tldGNoTWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2Rpc3Qvbm9kZV9tb2R1bGVzL2NhbnZhcy1za2V0Y2gvbGliL2NvcmUva2V5Ym9hcmRTaG9ydGN1dHMuanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXNrZXRjaC9kaXN0L25vZGVfbW9kdWxlcy9jYW52YXMtc2tldGNoL2xpYi9jYW52YXMtc2tldGNoLmpzIiwibm9kZV9tb2R1bGVzL2RlZmluZWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2xvYmFsL3dpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1wcm9taXNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvYWQtYXNzZXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9hZC1hc3NldC9sb2FkZXJzL2NyZWF0ZUZpbGVMb2FkZXIuanMiLCJub2RlX21vZHVsZXMvbG9hZC1hc3NldC9sb2FkZXJzL2NyZWF0ZU1lZGlhTG9hZGVyLmpzIiwibm9kZV9tb2R1bGVzL2xvYWQtYXNzZXQvbG9hZGVycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2FkLWFzc2V0L2xvYWRlcnMvbG9hZEltYWdlLmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtaGVhZGVycy9wYXJzZS1oZWFkZXJzLmpzIiwibm9kZV9tb2R1bGVzL3NlZWQtcmFuZG9tL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZXgtbm9pc2Uvc2ltcGxleC1ub2lzZS5qcyIsIm5vZGVfbW9kdWxlcy94aHIvaW5kZXguanMiLCJub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwiY2FudmFzLXNrZXRjaC1jbGkvaW5qZWN0ZWQvc3RvcmFnZS1rZXkuanMiXSwibmFtZXMiOlsiciIsImUiLCJuIiwidCIsIm8iLCJpIiwiZiIsImMiLCJyZXF1aXJlIiwidSIsImEiLCJFcnJvciIsImNvZGUiLCJwIiwiZXhwb3J0cyIsImNhbGwiLCJsZW5ndGgiLCIxIiwibW9kdWxlIiwiY2FudmFzU2tldGNoIiwibG9hZCIsInJhbmRvbSIsIlBIRU5PVFlQRSIsIkRSQVdJTkdfQ09MT1IiLCJPVkVSTEFQUF9JTUFHRSIsIlNVUlZJVkFMX1JBVEUiLCJNVVRBVEVfQ09OVElOVU9VU0xZIiwiTVVUQVRJT05fQ0hBTkNFIiwiTVVUQVRJT05fSU1QQUNUIiwiRE5BX0xFTkdUSCIsIlVTRV9ESUZGX1NRVUFSRUQiLCJSRUNFU1NJVkVfR0VORVMiLCJHRU5FX0xFTkdUSCIsImJlemllciIsImxpbmVzIiwiY2lyY2xlcyIsImRvdHMiLCJtaXhlZCIsImxpZmVDYW52YXMiLCJsaWZlQ29udGV4dCIsInRhcmdldERhdGEiLCJ0YXJnZXRTaXplIiwiYXN5bmMiLCJpbWFnZSIsIndpZHRoIiwiaGVpZ2h0IiwidGFyZ2V0Q2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGFyZ2V0Q29udGV4dCIsImdldENvbnRleHQiLCJkcmF3SW1hZ2UiLCJnZXRJbWFnZURhdGEiLCJkYXRhIiwiZmlsbFN0eWxlIiwicG9wdWxhdGlvbiIsIlBvcHVsYXRpb24iLCJjb250ZXh0IiwiZmlsbFJlY3QiLCJpdGVyYXRlIiwiY29uc29sZSIsImxvZyIsImZpdHRlc3QiLCJmaXRuZXNzIiwiZHJhdyIsInJlbmRlclBhcmFtcyIsImltYWdlRGltZW5zaW9ucyIsImNhbnZhc0RpbWVuc2lvbnMiLCJpbWFnZVJhdGlvIiwidHJhbnNsYXRlIiwiZGltZW5zaW9ucyIsIngiLCJ5IiwiZ2V0Q2VudGVyaW5nUGFyYW1ldGVycyIsImFuaW1hdGUiLCJmcHMiLCJbb2JqZWN0IE9iamVjdF0iLCJzaXplIiwidGhpcyIsImluZGl2aWR1YWxzIiwicG9wdWxhdGUiLCJzb3J0SW5kaXZpZHVhbHNCeUZpdG5lc3MiLCJwdXNoIiwiSW5kaXZpZHVhbCIsInNvcnQiLCJiIiwiY3V0b2ZmIiwiTWF0aCIsImZsb29yIiwiQXJyYXkiLCJmaWxsIiwibWFwIiwiXyIsIm1vdGhlciIsImZhdGhlciIsIm5hbWUiLCJnZXRGaXRQYXJlbnQiLCJyR2F1c3MiLCJhYnMiLCJnYXVzc2lhbiIsInZhbHVlIiwiaW5kZXgiLCJkbmFMZW5ndGgiLCJwaGVub3R5cGUiLCJnZW5lTGVuZ3RoIiwiUmVuZGVyZXIiLCJkYXRhUG9pbnRzTmVlZGVkRm9yIiwiZG5hIiwiZ2VuZXJhdGVETkEiLCJjYWxjdWxhdGVGaXRuZXNzIiwicmVwbGFjZSIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsIlVpbnQ4QXJyYXkiLCJ0b1N0cmluZyIsImluaGVyaXRETkFGcm9tIiwiZ2VuZXJhdGVPcnBoYW5ETkEiLCJzcGxpdEluZGV4IiwibW90aGVyR2VuZSIsImNoaWxkR2VuZSIsIm1heWJlTXV0YXRlIiwiZ2VuZSIsIm11dGF0ZUdlbmUiLCJtdXRhdGVSYW5kb20iLCJnIiwiY2FuZGlkYXRlIiwiZGlmZlNxdWFyZWQiLCJ0YXJnZXRQaXhlbENvdW50IiwiY3VycmVudERhdGEiLCJnZXRSZW5kZXJEYXRhIiwiZGlmZiIsImRwIiwic3Ryb2tlU3R5bGUiLCJzYXZlIiwiZHJhd0ZvciIsInJlc3RvcmUiLCJjYXBpdGFsaXplZFBoZW5vdHlwZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJhY3RpdmUiLCJyYWRpdXMiLCJjZW50ZXJYIiwiY2VudGVyWSIsInJlZCIsImdyZWVuIiwiYmx1ZSIsImFscGhhIiwiYmVnaW5QYXRoIiwibW92ZVRvIiwiYXJjIiwiUEkiLCJjbG9zZVBhdGgiLCJtaW4iLCJmcm9tWCIsImZyb21ZIiwidG9YIiwidG9ZIiwiY29udHJvbFgiLCJjb250cm9sWSIsInF1YWRyYXRpY0N1cnZlVG8iLCJzdHJva2UiLCJsaW5lV2lkdGgiLCJsaW5lVG8iLCJyZW5kZXJlciIsImRyYXdMaW5lcyIsImRyYXdCZXppZXIiLCJkcmF3RG90cyIsImRyYXdDaXJjbGVzIiwibWltZVR5cGVzIiwibWltZUxvb2t1cCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiZXh0IiwiVHlwZUVycm9yIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsInRvTG93ZXJDYXNlIiwiYXVkaW8vbWlkaSIsImF1ZGlvL21wNCIsImF1ZGlvL21wZWciLCJhdWRpby9vZ2ciLCJhdWRpby93ZWJtIiwiYXVkaW8veC1tYXRyb3NrYSIsImF1ZGlvL3gtbXBlZ3VybCIsImF1ZGlvL3dhdiIsInZpZGVvLzNncHAiLCJ2aWRlby8zZ3BwMiIsInZpZGVvL21wNCIsInZpZGVvL21wZWciLCJ2aWRlby9vZ2ciLCJ2aWRlby9xdWlja3RpbWUiLCJ2aWRlby93ZWJtIiwidmlkZW8veC1mNHYiLCJ2aWRlby94LWZsaSIsInZpZGVvL3gtZmx2IiwidmlkZW8veC1tNHYiLCJ2aWRlby94LW1hdHJvc2thIiwic2VlZFJhbmRvbSIsIlNpbXBsZXhOb2lzZSIsImRlZmluZWQiLCJjcmVhdGVSYW5kb20iLCJkZWZhdWx0U2VlZCIsImN1cnJlbnRTZWVkIiwiY3VycmVudFJhbmRvbSIsIm5vaXNlR2VuZXJhdG9yIiwiZGVmYXVsdFJhbmRvbSIsIl9uZXh0R2F1c3NpYW4iLCJfaGFzTmV4dEdhdXNzaWFuIiwic2V0U2VlZCIsImdldFNlZWQiLCJnZXRSYW5kb21TZWVkIiwiU3RyaW5nIiwidmFsdWVOb25aZXJvIiwicGVybXV0ZU5vaXNlIiwiY3JlYXRlTm9pc2UiLCJub2lzZTFEIiwiZnJlcXVlbmN5IiwiYW1wbGl0dWRlIiwiaXNGaW5pdGUiLCJub2lzZTJEIiwibm9pc2UzRCIsInoiLCJub2lzZTREIiwidyIsInNpZ24iLCJib29sZWFuIiwiY2hhbmNlIiwicmFuZ2UiLCJyYW5nZUZsb29yIiwicGljayIsImFycmF5Iiwic2h1ZmZsZSIsImFyciIsImlzQXJyYXkiLCJyYW5kIiwidG1wIiwibGVuIiwicmV0Iiwib25DaXJjbGUiLCJpbnNpZGVDaXJjbGUiLCJvdXQiLCJzcXJ0Iiwib25TcGhlcmUiLCJ2IiwicGhpIiwidGhldGEiLCJhY29zIiwic2luIiwiY29zIiwiaW5zaWRlU3BoZXJlIiwiayIsImNicnQiLCJxdWF0ZXJuaW9uIiwidTEiLCJ1MiIsInUzIiwic3ExIiwic3EyIiwidGhldGExIiwidGhldGEyIiwid2VpZ2h0ZWQiLCJ3ZWlnaHRlZFNldCIsInNldCIsIndlaWdodGVkU2V0SW5kZXgiLCJtZWFuIiwic3RhbmRhcmREZXJpdmF0aW9uIiwicmVzdWx0IiwidjEiLCJ2MiIsInMiLCJtdWx0aXBsaWVyIiwic2VlZCIsIm9wdCIsInVuZGVmaW5lZCIsIm1heCIsIndlaWdodCIsIndlaWdodHMiLCJ0b3RhbFdlaWdodCIsImdldE93blByb3BlcnR5U3ltYm9scyIsImhhc093blByb3BlcnR5IiwicHJvdG90eXBlIiwicHJvcElzRW51bWVyYWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwib2JqZWN0QXNzaWduIiwiYXNzaWduIiwidGVzdDEiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwidGVzdDIiLCJmcm9tQ2hhckNvZGUiLCJqb2luIiwidGVzdDMiLCJzcGxpdCIsImxldHRlciIsImVyciIsInNob3VsZFVzZU5hdGl2ZSIsInRhcmdldCIsInNvdXJjZSIsImZyb20iLCJzeW1ib2xzIiwidG8iLCJ2YWwiLCJ0b09iamVjdCIsImFyZ3VtZW50cyIsImJyb3dzZXIiLCJjb21tb25qc0dsb2JhbCIsInBlcmZvcm1hbmNlIiwibm93IiwiRGF0ZSIsImlzUHJvbWlzZV8xIiwib2JqIiwidGhlbiIsImlzRG9tIiwid2luZG93IiwiTm9kZSIsIm5vZGVUeXBlIiwibm9kZU5hbWUiLCJnZXRDbGllbnRBUEkiLCJhcmd1bWVudHMkMSIsImlzQnJvd3NlciIsImNhY2hlIiwic2hpbSIsInN1cHBvcnRzQXJndW1lbnRzQ2xhc3MiLCJzdXBwb3J0ZWQiLCJvYmplY3QiLCJ1bnN1cHBvcnRlZCIsInBTbGljZSIsImRlZXBFcXVhbCIsImFjdHVhbCIsImV4cGVjdGVkIiwib3B0cyIsImdldFRpbWUiLCJzdHJpY3QiLCJpc1VuZGVmaW5lZE9yTnVsbCIsImlzX2FyZ3VtZW50cyIsImlzQnVmZmVyIiwia2EiLCJrYiIsIm9iakVxdWl2IiwiY29weSIsImdsb2JhbCIsInRva2VuIiwidGltZXpvbmUiLCJ0aW1lem9uZUNsaXAiLCJkYXRlRm9ybWF0IiwiZGF0ZSIsIm1hc2siLCJ1dGMiLCJnbXQiLCJ0ZXN0IiwiaXNOYU4iLCJtYXNrU2xpY2UiLCJtYXNrcyIsImQiLCJEIiwibSIsIkgiLCJNIiwiTCIsImdldFRpbWV6b25lT2Zmc2V0IiwiVyIsInRhcmdldFRodXJzZGF5IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJzZXREYXRlIiwiZ2V0RGF5IiwiZmlyc3RUaHVyc2RheSIsImRzIiwic2V0SG91cnMiLCJnZXRIb3VycyIsImdldFdlZWsiLCJOIiwiZG93IiwiZ2V0RGF5T2ZXZWVrIiwiZmxhZ3MiLCJkZCIsInBhZCIsImRkZCIsImkxOG4iLCJkYXlOYW1lcyIsImRkZGQiLCJtbSIsIm1tbSIsIm1vbnRoTmFtZXMiLCJtbW1tIiwieXkiLCJ5eXl5IiwiaCIsImhoIiwiSEgiLCJNTSIsInNzIiwibCIsInJvdW5kIiwidGltZU5hbWVzIiwidHQiLCJUIiwiVFQiLCJaIiwibWF0Y2giLCJwb3AiLCJTIiwiZGVmYXVsdCIsInNob3J0RGF0ZSIsIm1lZGl1bURhdGUiLCJsb25nRGF0ZSIsImZ1bGxEYXRlIiwic2hvcnRUaW1lIiwibWVkaXVtVGltZSIsImxvbmdUaW1lIiwiaXNvRGF0ZSIsImlzb1RpbWUiLCJpc29EYXRlVGltZSIsImlzb1V0Y0RhdGVUaW1lIiwiZXhwaXJlc0hlYWRlckZvcm1hdCIsInJlcyIsInJlcGVhdFN0cmluZyIsInN0ciIsIm51bSIsInN1YnN0ciIsImxpbmsiLCJwYWRMZWZ0IiwiY2giLCJub29wIiwiZGVmYXVsdEV4dHMiLCJleHRlbnNpb24iLCJwcmVmaXgiLCJzdWZmaXgiLCJzdXBwb3J0ZWRFbmNvZGluZ3MiLCJzdHJlYW0iLCJpc1N0YXJ0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmaWxlbmFtZSIsInJlc29sdmVGaWxlbmFtZSIsImZyYW1lIiwiZnVuYyIsImNsaWVudCIsIm91dHB1dCIsImV2Iiwic2F2ZURhdGFVUkwiLCJkYXRhVVJMIiwiYmFzZTY0IiwiYnl0ZVN0cmluZyIsImF0b2IiLCJ0eXBlIiwibWltZU1hdGNoIiwiZXhlYyIsIm1pbWUiLCJhYiIsIkFycmF5QnVmZmVyIiwiaWEiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImNyZWF0ZUJsb2JGcm9tRGF0YVVSTCIsImJsb2IiLCJzYXZlQmxvYiIsInN0eWxlIiwidmlzaWJpbGl0eSIsImRvd25sb2FkIiwiaHJlZiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsIm9uY2xpY2siLCJzZXRUaW1lb3V0IiwicmV2b2tlT2JqZWN0VVJMIiwicGFyZW50RWxlbWVudCIsInJlbW92ZUNoaWxkIiwicmVtb3ZlQXR0cmlidXRlIiwiY2xpY2siLCJmaWxlIiwidG90YWxGcmFtZXMiLCJsYXllclN0ciIsInRvdGFsTGF5ZXJzIiwibGF5ZXIiLCJmaWx0ZXIiLCJCb29sZWFuIiwidGltZVN0YW1wIiwiaGFzaCIsImNvbW1vblR5cG9zIiwiZGltZW5zaW9uIiwiYW5pbWF0ZWQiLCJhbmltYXRpbmciLCJ1bml0IiwiUDUiLCJwaXhlbGxhdGVkIiwibG9vcGluZyIsInBpeGVsUGVySW5jaCIsImFsbEtleXMiLCJjaGVja1NldHRpbmdzIiwic2V0dGluZ3MiLCJ3YXJuIiwiaW5jbHVkZXMiLCJwYXBlclNpemVzIiwicmVkdWNlIiwiZGljdCIsInByZXNldCIsIml0ZW0iLCJ1bml0cyIsImRlZmluZWQkMSIsImNvbnZlcnNpb25zIiwic3lzdGVtIiwiZmFjdG9yIiwiY20iLCJwdCIsInBjIiwiaW4iLCJmdCIsImFuY2hvcnMiLCJtZXRyaWMiLCJyYXRpbyIsImltcGVyaWFsIiwiY29udmVydExlbmd0aCIsImZyb21Vbml0IiwidG9Vbml0IiwicGl4ZWxzUGVySW5jaCIsInByZWNpc2lvbiIsInJvdW5kUGl4ZWwiLCJ0b0ZhY3RvciIsImZyb21GYWN0b3IiLCJpc1RvUGl4ZWwiLCJmcm9tVW5pdERhdGEiLCJ0b1VuaXREYXRhIiwiYW5jaG9yIiwiZGVjaW1hbHMiLCJOdW1iZXIiLCJjb252ZXJ0RGlzdGFuY2UkMSIsInVuaXRzRnJvbSIsInVuaXRzVG8iLCJyZXNpemVDYW52YXMiLCJwcm9wcyIsInN0eWxlV2lkdGgiLCJzdHlsZUhlaWdodCIsImNhbnZhc1dpZHRoIiwiY2FudmFzSGVpZ2h0IiwiaGFzRGltZW5zaW9ucyIsImNoZWNrSWZIYXNEaW1lbnNpb25zIiwiZXhwb3J0aW5nIiwic2NhbGVUb0ZpdCIsInNjYWxlVG9WaWV3IiwicGl4ZWxSYXRpbyIsImV4cG9ydFBpeGVsUmF0aW8iLCJibGVlZCIsImRldmljZVBpeGVsUmF0aW8iLCJiYXNlUGl4ZWxSYXRpbyIsIm1heFBpeGVsUmF0aW8iLCJ0cmltV2lkdGgiLCJ0cmltSGVpZ2h0IiwicmVmIiwiZWxlbWVudCIsInBhcmVudCIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImdldFBhcmVudFNpemUiLCJwYXJlbnRXaWR0aCIsInBhcmVudEhlaWdodCIsImdldERpbWVuc2lvbnNGcm9tUHJlc2V0IiwiaGlnaGVzdCIsImxvd2VzdCIsIm9yaWVudGF0aW9uIiwibGFuZHNjYXBlIiwicmVhbFdpZHRoIiwicmVhbEhlaWdodCIsImFzcGVjdCIsIndpbmRvd0FzcGVjdCIsInNjYWxlVG9GaXRQYWRkaW5nIiwibWF4V2lkdGgiLCJtYXhIZWlnaHQiLCJnZXRDYW52YXNDb250ZXh0XzEiLCJjYW52YXMiLCJnbCIsImF0dHJpYnMiLCJuYW1lcyIsImNyZWF0ZUNhbnZhcyIsIm93bnNDYW52YXMiLCJuZXdDYW52YXMiLCJjcmVhdGVDYW52YXNFbGVtZW50IiwiYXR0cmlidXRlcyIsInBpeGVsYXRlZCIsImltYWdlU21vb3RoaW5nRW5hYmxlZCIsIm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCIsIm9JbWFnZVNtb290aGluZ0VuYWJsZWQiLCJ3ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQiLCJtc0ltYWdlU21vb3RoaW5nRW5hYmxlZCIsIlNrZXRjaE1hbmFnZXIiLCJfc2V0dGluZ3MiLCJfcHJvcHMiLCJfc2tldGNoIiwiX3JhZiIsIl9yZWNvcmRUaW1lb3V0IiwiX2xhc3RSZWRyYXdSZXN1bHQiLCJfaXNQNVJlc2l6aW5nIiwiX2tleWJvYXJkU2hvcnRjdXRzIiwiaGFuZGxlciIsImVuYWJsZWQiLCJrZXlDb2RlIiwiYWx0S2V5IiwibWV0YUtleSIsImN0cmxLZXkiLCJ0b2dnbGVQbGF5IiwicHJldmVudERlZmF1bHQiLCJjb21taXQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImtleWJvYXJkU2hvcnRjdXRzIiwidGhpcyQxIiwiaG90a2V5cyIsInNoaWZ0S2V5IiwicmVjb3JkaW5nIiwiZW5kUmVjb3JkIiwicnVuIiwicmVjb3JkIiwiZXhwb3J0RnJhbWUiLCJwbGF5aW5nIiwicGF1c2UiLCJwbGF5IiwiX2FuaW1hdGVIYW5kbGVyIiwiX3Jlc2l6ZUhhbmRsZXIiLCJyZXNpemUiLCJyZW5kZXIiLCJza2V0Y2giLCJnZXQiLCJfY29tcHV0ZVBsYXloZWFkIiwiY3VycmVudFRpbWUiLCJkdXJhdGlvbiIsIl9jb21wdXRlRnJhbWUiLCJwbGF5aGVhZCIsInRpbWUiLCJfY29tcHV0ZUN1cnJlbnRGcmFtZSIsIl9nZXRTaXplUHJvcHMiLCJ2aWV3cG9ydFdpZHRoIiwidmlld3BvcnRIZWlnaHQiLCJkaXNwb3NlIiwic3RhcnRlZCIsIl9zaWduYWxCZWdpbiIsInRpY2siLCJfY2FuY2VsVGltZW91dHMiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIl9sYXN0VGltZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImVycm9yIiwic3RvcCIsImRlbHRhVGltZSIsImV4cG9ydE9wdHMiLCJfY3JlYXRlRXhwb3J0T3B0aW9ucyIsImZyYW1lSW50ZXJ2YWwiLCJfc2lnbmFsRW5kIiwiYmVnaW5SZWNvcmQiLCJfd3JhcENvbnRleHRTY2FsZSIsImNhdGNoIiwicmVzcG9uc2UiLCJiZWdpbiIsImVuZCIsIndhc1JlY29yZGluZyIsInNlcXVlbmNlIiwiZW5jb2RpbmciLCJlbmNvZGluZ1F1YWxpdHkiLCJkYXRlZm9ybWF0IiwiYWxsIiwicHJlRXhwb3J0IiwiY29tbWl0T3B0cyIsIl9kb0V4cG9ydEZyYW1lIiwiZHJhd1Jlc3VsdCIsImNvbmNhdCIsImhhc0RhdGFPYmplY3QiLCJ0b0RhdGFVUkwiLCJleHBvcnRDYW52YXMiLCJsYXllckxpc3QiLCJjdXJPcHQiLCJzYXZlUGFyYW0iLCJzYXZlUHJvbWlzZSIsInBhcnRzIiwic2F2ZUZpbGUiLCJzYXZlUmVzdWx0Iiwic2F2ZWRFdmVudHMiLCJldmVudFdpdGhPdXRwdXQiLCJmaW5kIiwib3V0cHV0TmFtZSIsImlzQ2xpZW50Iiwic29tZSIsImlzU3RyZWFtaW5nIiwib2ZTZXEiLCJwb3N0RXhwb3J0IiwiY2IiLCJfcHJlUmVuZGVyIiwiX3Bvc3RSZW5kZXIiLCJwNSIsInNjYWxlIiwic2NhbGVYIiwic2NhbGVZIiwic2NhbGVDb250ZXh0IiwiZmx1c2giLCJyZWRyYXciLCJzdWJtaXREcmF3Q2FsbCIsInVwZGF0ZSIsIm5vdFlldFN1cHBvcnRlZCIsIm9sZENhbnZhcyIsIm9sZENvbnRleHQiLCJ0aW1lT3B0cyIsInRpbWVQcm9wcyIsImdldFRpbWVQcm9wcyIsIl9zZXR1cEdMS2V5IiwiX2FwcGVuZENhbnZhc0lmTmVlZGVkIiwib2xkU2l6ZXMiLCJuZXdQcm9wcyIsInBpeGVsRGVuc2l0eSIsInN0eWxlQ2FudmFzIiwibmV3U2l6ZXMiLCJjaGFuZ2VkIiwiZGVlcEVxdWFsXzEiLCJfc2l6ZUNoYW5nZWQiLCJmcmFtZUludGVydmFsTVMiLCJkZWx0YVRpbWVNUyIsImhhc0R1cmF0aW9uIiwiaXNOZXdGcmFtZSIsInBsYXliYWNrUmF0ZSIsIm5ld1RpbWUiLCJ0aW1lU2NhbGUiLCJpc0ZpbmlzaGVkIiwiaXNMb29wU3RhcnQiLCJsb29wIiwibGFzdEZyYW1lIiwiZGlzcGF0Y2giLCJtb3VudCIsInVubW91bnQiLCJkZXRhY2giLCJjdHgiLCJjbGVhciIsImNsZWFyQ29sb3IiLCJidWZmZXJEYXRhIiwiaGFzVG90YWxGcmFtZXMiLCJ0b3RhbEZyYW1lc0Zyb21EdXJhdGlvbiIsImR1cmF0aW9uRnJvbVRvdGFsRnJhbWVzIiwiSW5maW5pdHkiLCJzdGFydFRpbWUiLCJzdGFydEZyYW1lIiwiaGFzU3RhcnRUaW1lIiwiaGFzU3RhcnRGcmFtZSIsInNldHVwIiwibG9hZEFuZFJ1biIsIm5ld1NldHRpbmdzIiwidW5sb2FkIiwiZGVzdHJveSIsImNyZWF0ZVNrZXRjaCIsInByZWxvYWQiLCJQNUNvbnN0cnVjdG9yIiwicDVTa2V0Y2giLCJpc0dMIiwiV0VCR0wiLCJQMkQiLCJub0xvb3AiLCJzZXRBdHRyaWJ1dGVzIiwiX3JlbmRlcmVyIiwiZHJhd2luZ0NvbnRleHQiLCJsb2FkZXIiLCJhdHRhY2giLCJtZXNzYWdlIiwiQ0FDSEUiLCJydW50aW1lQ29sbGlzaW9ucyIsImhvdElEIiwiaXNIb3QiLCJob3QiLCJpZCIsImlzSW5qZWN0aW5nIiwicHJldmlvdXNEYXRhIiwiY2FjaGVHZXQiLCJuZXh0Iiwib2xkTWFuYWdlciIsIm1hbmFnZXIiLCJQYXBlclNpemVzIiwid2luIiwic2VsZiIsImZuIiwic3RyaW5nIiwiYWxlcnQiLCJjb25maXJtIiwicHJvbXB0IiwiaXNQcm9taXNlIiwibG9hZGVycyIsImxvYWRNdWx0aXBsZSIsInByb2dyZXNzIiwic2tpcE1pc3NpbmciLCJ0b3RhbCIsImNvdW50IiwiZW1pdFByb2dyZXNzIiwibG9hZEFzc2V0Iiwib3B0aW9uYWwiLCJlbnRyaWVzIiwicmVzdWx0cyIsInVybCIsImlkeCIsImxhc3RJbmRleE9mIiwiZXh0bmFtZSIsImlzTWF0Y2giLCJnZXRMb2FkZXIiLCJhbnkiLCJ4aHIiLCJmZXRjaCIsInN0YXR1cyIsIm9rIiwianNvbiIsImFycmF5QnVmZmVyIiwidGV4dCIsInJlc3BvbnNlVHlwZSIsInN0YXR1c0NvZGUiLCJKU09OIiwicGFyc2UiLCJ4aHJGZXRjaCIsImdldE1lZGlhVHlwZSIsImZpbmlzaGVkIiwibWVkaWEiLCJvbkxvYWRlZCIsImV2ZW50Iiwib25sb2FkZWRtZXRhZGF0YSIsIm9uY2FucGxheXRocm91Z2giLCJvbmxvYWRlZGRhdGEiLCJvbmNhbnBsYXkiLCJvbmVycm9yIiwiZXIiLCJjcm9zc09yaWdpbiIsInZvbHVtZSIsIm11dGVkIiwiY29udHJvbHMiLCJhdXRvUGxheSIsInNyYyIsInJlYWR5U3RhdGUiLCJIQVZFX0VOT1VHSF9EQVRBIiwiY3JlYXRlTWVkaWFMb2FkZXIiLCJjcmVhdGVGaWxlTG9hZGVyIiwibG9hZEltYWdlIiwiQXVkaW8iLCJJbWFnZSIsIm9ubG9hZCIsInRyaW0iLCJoZWFkZXJzIiwiaGVhZGVyc0FyciIsInJvdyIsInBvb2wiLCJHTE9CQUwiLCJzdGFydGRlbm9tIiwicG93Iiwic2lnbmlmaWNhbmNlIiwib3ZlcmZsb3ciLCJvbGRSYW5kb20iLCJBUkM0Iiwia2V5bGVuIiwibWUiLCJqIiwibWl4a2V5Iiwic21lYXIiLCJzdHJpbmdzZWVkIiwidG9zdHJpbmciLCJhcHBseSIsIm9wdGlvbnMiLCJhcmM0IiwiZmxhdHRlbiIsImRlcHRoIiwicHJvcCIsInR5cCIsImVudHJvcHkiLCJuYXZpZ2F0b3IiLCJwbHVnaW5zIiwic2NyZWVuIiwiYXV0b3NlZWQiLCJyZXNldEdsb2JhbCIsIkYyIiwiRzIiLCJHMyIsIkY0IiwiRzQiLCJyYW5kb21PclNlZWQiLCJzMCIsInMxIiwiczIiLCJtYXNoIiwiYWxlYSIsImJ1aWxkUGVybXV0YXRpb25UYWJsZSIsInBlcm0iLCJwZXJtTW9kMTIiLCJhdXgiLCJncmFkMyIsIkZsb2F0MzJBcnJheSIsImdyYWQ0IiwieGluIiwieWluIiwiaTEiLCJqMSIsIm4wIiwibjEiLCJuMiIsIngwIiwieTAiLCJ4MSIsInkxIiwieDIiLCJ5MiIsImlpIiwiamoiLCJ0MCIsImdpMCIsInQxIiwiZ2kxIiwidDIiLCJnaTIiLCJ6aW4iLCJuMyIsImsxIiwiaTIiLCJqMiIsImsyIiwiejAiLCJ6MSIsInoyIiwieDMiLCJ5MyIsInozIiwia2siLCJ0MyIsImdpMyIsIm40IiwibDEiLCJsMiIsImkzIiwiajMiLCJrMyIsImwzIiwidzAiLCJyYW5reCIsInJhbmt5IiwicmFua3oiLCJyYW5rdyIsIncxIiwidzIiLCJ3MyIsIng0IiwieTQiLCJ6NCIsInc0IiwibGwiLCJ0NCIsImdpNCIsIl9idWlsZFBlcm11dGF0aW9uVGFibGUiLCJkZWZpbmUiLCJhbWQiLCJpc0Z1bmN0aW9uIiwicGFyc2VIZWFkZXJzIiwieHRlbmQiLCJpbml0UGFyYW1zIiwidXJpIiwiY2FsbGJhY2siLCJwYXJhbXMiLCJjcmVhdGVYSFIiLCJfY3JlYXRlWEhSIiwiY2FsbGVkIiwiZ2V0Qm9keSIsInJlc3BvbnNlVGV4dCIsInJlc3BvbnNlWE1MIiwiZmlyZWZveEJ1Z1Rha2VuRWZmZWN0IiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0WG1sIiwiaXNKc29uIiwiZXJyb3JGdW5jIiwiZXZ0IiwiY2xlYXJUaW1lb3V0IiwidGltZW91dFRpbWVyIiwiZmFpbHVyZVJlc3BvbnNlIiwibG9hZEZ1bmMiLCJhYm9ydGVkIiwidXNlWERSIiwibWV0aG9kIiwicmF3UmVxdWVzdCIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsImNvcnMiLCJYRG9tYWluUmVxdWVzdCIsIlhNTEh0dHBSZXF1ZXN0Iiwic3luYyIsInN0cmluZ2lmeSIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIm9ucHJvZ3Jlc3MiLCJvbmFib3J0Iiwib250aW1lb3V0Iiwib3BlbiIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJ3aXRoQ3JlZGVudGlhbHMiLCJ0aW1lb3V0IiwiYWJvcnQiLCJzZXRSZXF1ZXN0SGVhZGVyIiwiaXNFbXB0eSIsImJlZm9yZVNlbmQiLCJzZW5kIiwiaXRlcmF0b3IiLCJmb3JFYWNoQXJyYXkiLCJDQU5WQVNfU0tFVENIX0RFRkFVTFRfU1RPUkFHRV9LRVkiLCJsb2NhdGlvbiJdLCJtYXBwaW5ncyI6IkNBQUEsV0FBQSxPQUFBLFNBQUFBLEVBQUFDLEVBQUFDLEVBQUFDLEdBQUEsU0FBQUMsRUFBQUMsRUFBQUMsR0FBQSxJQUFBSixFQUFBRyxHQUFBLENBQUEsSUFBQUosRUFBQUksR0FBQSxDQUFBLElBQUFFLEVBQUEsbUJBQUFDLFNBQUFBLFFBQUEsSUFBQUYsR0FBQUMsRUFBQSxPQUFBQSxFQUFBRixHQUFBLEdBQUEsR0FBQUksRUFBQSxPQUFBQSxFQUFBSixHQUFBLEdBQUEsSUFBQUssRUFBQSxJQUFBQyxNQUFBLHVCQUFBTixFQUFBLEtBQUEsTUFBQUssRUFBQUUsS0FBQSxtQkFBQUYsRUFBQSxJQUFBRyxFQUFBWCxFQUFBRyxHQUFBLENBQUFTLFFBQUEsSUFBQWIsRUFBQUksR0FBQSxHQUFBVSxLQUFBRixFQUFBQyxRQUFBLFNBQUFkLEdBQUEsT0FBQUksRUFBQUgsRUFBQUksR0FBQSxHQUFBTCxJQUFBQSxJQUFBYSxFQUFBQSxFQUFBQyxRQUFBZCxFQUFBQyxFQUFBQyxFQUFBQyxHQUFBLE9BQUFELEVBQUFHLEdBQUFTLFFBQUEsSUFBQSxJQUFBTCxFQUFBLG1CQUFBRCxTQUFBQSxRQUFBSCxFQUFBLEVBQUFBLEVBQUFGLEVBQUFhLE9BQUFYLElBQUFELEVBQUFELEVBQUFFLElBQUEsT0FBQUQsR0FB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QUFzM0IsRUFFQSxPQUFBejJCLEVBM1ZBNEwsRUFBQWtGLFVBQUEsQ0FDQTRsQixNQUFBLElBQUFDLGFBQUEsQ0FBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLEVBQUEsRUFDQSxHQUFBLEVBQUEsR0FFQSxHQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsR0FDQSxFQUFBLEVBQUEsRUFFQSxFQUFBLEdBQUEsR0FDQSxFQUFBLEdBQUEsRUFDQSxFQUFBLEVBQUEsRUFFQSxHQUFBLEVBQUEsRUFDQSxFQUFBLEdBQUEsRUFDQSxHQUFBLEdBQUEsSUFDQUMsTUFBQSxJQUFBRCxhQUFBLENBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEdBQUEsRUFDQSxHQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsR0FBQSxHQUFBLEdBQ0EsRUFBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUNBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxHQUFBLEdBQUEsRUFBQSxHQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FDQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsRUFBQSxJQUNBMXBCLFFBQUEsU0FBQTRwQixFQUFBQyxHQUNBLElBaUJBQyxFQUFBQyxFQWpCQVIsRUFBQXZ5QixLQUFBdXlCLFVBQ0FELEVBQUF0eUIsS0FBQXN5QixLQUNBRyxFQUFBenlCLEtBQUF5eUIsTUFDQU8sRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsRUFFQWhuQixHQUFBMG1CLEVBQUFDLEdBQUFuQixFQUNBbjJCLEVBQUFrRixLQUFBQyxNQUFBa3lCLEVBQUExbUIsR0FDQXNrQixFQUFBL3ZCLEtBQUFDLE1BQUFteUIsRUFBQTNtQixHQUNBN1EsR0FBQUUsRUFBQWkxQixHQUFBbUIsRUFHQXdCLEVBQUFQLEdBRkFyM0IsRUFBQUYsR0FHQSszQixFQUFBUCxHQUZBckMsRUFBQW4xQixHQU1BODNCLEVBQUFDLEdBQ0FOLEVBQUEsRUFDQUMsRUFBQSxJQUdBRCxFQUFBLEVBQ0FDLEVBQUEsR0FLQSxJQUFBTSxFQUFBRixFQUFBTCxFQUFBbkIsRUFDQTJCLEVBQUFGLEVBQUFMLEVBQUFwQixFQUNBNEIsRUFBQUosRUFBQSxFQUFBLEVBQUF4QixFQUNBNkIsRUFBQUosRUFBQSxFQUFBLEVBQUF6QixFQUVBOEIsRUFBQSxJQUFBbDRCLEVBQ0FtNEIsRUFBQSxJQUFBbEQsRUFFQW1ELEVBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFDQSxHQUFBTyxHQUFBLEVBQUEsQ0FDQSxJQUFBQyxFQUFBLEVBQUFyQixFQUFBa0IsRUFBQW5CLEVBQUFvQixJQUVBVixHQURBVyxHQUFBQSxHQUNBQSxHQUFBbEIsRUFBQW1CLEdBQUFULEVBQUFWLEVBQUFtQixFQUFBLEdBQUFSLEdBRUEsSUFBQVMsRUFBQSxHQUFBUixFQUFBQSxFQUFBQyxFQUFBQSxFQUNBLEdBQUFPLEdBQUEsRUFBQSxDQUNBLElBQUFDLEVBQUEsRUFBQXZCLEVBQUFrQixFQUFBWCxFQUFBUixFQUFBb0IsRUFBQVgsSUFFQUUsR0FEQVksR0FBQUEsR0FDQUEsR0FBQXBCLEVBQUFxQixHQUFBVCxFQUFBWixFQUFBcUIsRUFBQSxHQUFBUixHQUVBLElBQUFTLEVBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFDQSxHQUFBTyxHQUFBLEVBQUEsQ0FDQSxJQUFBQyxFQUFBLEVBQUF6QixFQUFBa0IsRUFBQSxFQUFBbkIsRUFBQW9CLEVBQUEsSUFFQVIsR0FEQWEsR0FBQUEsR0FDQUEsR0FBQXRCLEVBQUF1QixHQUFBVCxFQUFBZCxFQUFBdUIsRUFBQSxHQUFBUixHQUlBLE9BQUEsSUFBQVIsRUFBQUMsRUFBQUMsSUFHQWpxQixRQUFBLFNBQUEycEIsRUFBQUMsRUFBQW9CLEdBQ0EsSUFHQWpCLEVBQUFDLEVBQUFDLEVBQUFnQixFQWVBcEIsRUFBQUMsRUFBQW9CLEVBQ0FDLEVBQUFDLEVBQUFDLEVBbkJBL0IsRUFBQXZ5QixLQUFBdXlCLFVBQ0FELEVBQUF0eUIsS0FBQXN5QixLQUNBRyxFQUFBenlCLEtBQUF5eUIsTUFHQXZtQixHQUFBMG1CLEVBQUFDLEVBQUFvQixJQW5IQSxFQUFBLEdBb0hBMTRCLEVBQUFrRixLQUFBQyxNQUFBa3lCLEVBQUExbUIsR0FDQXNrQixFQUFBL3ZCLEtBQUFDLE1BQUFteUIsRUFBQTNtQixHQUNBbkIsRUFBQXRLLEtBQUFDLE1BQUF1ekIsRUFBQS9uQixHQUNBN1EsR0FBQUUsRUFBQWkxQixFQUFBemxCLEdBQUE2bUIsRUFJQXVCLEVBQUFQLEdBSEFyM0IsRUFBQUYsR0FJQSszQixFQUFBUCxHQUhBckMsRUFBQW4xQixHQUlBazVCLEVBQUFOLEdBSEFscEIsRUFBQTFQLEdBUUE4M0IsR0FBQUMsRUFDQUEsR0FBQW1CLEdBQ0F6QixFQUFBLEVBQ0FDLEVBQUEsRUFDQW9CLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsR0FFQW5CLEdBQUFvQixHQUNBekIsRUFBQSxFQUNBQyxFQUFBLEVBQ0FvQixFQUFBLEVBQ0FDLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLElBR0F4QixFQUFBLEVBQ0FDLEVBQUEsRUFDQW9CLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsR0FJQWxCLEVBQUFtQixHQUNBekIsRUFBQSxFQUNBQyxFQUFBLEVBQ0FvQixFQUFBLEVBQ0FDLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLEdBRUFuQixFQUFBb0IsR0FDQXpCLEVBQUEsRUFDQUMsRUFBQSxFQUNBb0IsRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsRUFDQUMsRUFBQSxJQUdBeEIsRUFBQSxFQUNBQyxFQUFBLEVBQ0FvQixFQUFBLEVBQ0FDLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLEdBT0EsSUFBQWpCLEVBQUFGLEVBQUFMLEVBQUFsQixFQUNBMEIsRUFBQUYsRUFBQUwsRUFBQW5CLEVBQ0E0QyxFQUFBRCxFQUFBSixFQUFBdkMsRUFDQTJCLEVBQUFKLEVBQUFpQixFQUFBLEVBQUF4QyxFQUNBNEIsRUFBQUosRUFBQWlCLEVBQUEsRUFBQXpDLEVBQ0E2QyxFQUFBRixFQUFBRCxFQUFBLEVBQUExQyxFQUNBOEMsRUFBQXZCLEVBQUEsRUFBQSxHQUNBd0IsRUFBQXZCLEVBQUEsRUFBQSxHQUNBd0IsRUFBQUwsRUFBQSxFQUFBLEdBRUFkLEVBQUEsSUFBQWw0QixFQUNBbTRCLEVBQUEsSUFBQWxELEVBQ0FxRSxFQUFBLElBQUE5cEIsRUFFQTRvQixFQUFBLEdBQUFSLEVBQUFBLEVBQUFDLEVBQUFBLEVBQUFtQixFQUFBQSxFQUNBLEdBQUFaLEVBQUEsRUFBQVgsRUFBQSxNQUNBLENBQ0EsSUFBQVksRUFBQSxFQUFBckIsRUFBQWtCLEVBQUFuQixFQUFBb0IsRUFBQXBCLEVBQUF1QyxLQUVBN0IsR0FEQVcsR0FBQUEsR0FDQUEsR0FBQWxCLEVBQUFtQixHQUFBVCxFQUFBVixFQUFBbUIsRUFBQSxHQUFBUixFQUFBWCxFQUFBbUIsRUFBQSxHQUFBVyxHQUVBLElBQUFWLEVBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQWtCLEVBQUFBLEVBQ0EsR0FBQVgsRUFBQSxFQUFBWixFQUFBLE1BQ0EsQ0FDQSxJQUFBYSxFQUFBLEVBQUF2QixFQUFBa0IsRUFBQVgsRUFBQVIsRUFBQW9CLEVBQUFYLEVBQUFULEVBQUF1QyxFQUFBVixLQUVBbEIsR0FEQVksR0FBQUEsR0FDQUEsR0FBQXBCLEVBQUFxQixHQUFBVCxFQUFBWixFQUFBcUIsRUFBQSxHQUFBUixFQUFBYixFQUFBcUIsRUFBQSxHQUFBVSxHQUVBLElBQUFULEVBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQWlCLEVBQUFBLEVBQ0EsR0FBQVYsRUFBQSxFQUFBYixFQUFBLE1BQ0EsQ0FDQSxJQUFBYyxFQUFBLEVBQUF6QixFQUFBa0IsRUFBQVcsRUFBQTlCLEVBQUFvQixFQUFBVyxFQUFBL0IsRUFBQXVDLEVBQUFQLEtBRUFwQixHQURBYSxHQUFBQSxHQUNBQSxHQUFBdEIsRUFBQXVCLEdBQUFULEVBQUFkLEVBQUF1QixFQUFBLEdBQUFSLEVBQUFmLEVBQUF1QixFQUFBLEdBQUFTLEdBRUEsSUFBQUssRUFBQSxHQUFBSixFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxFQUFBQSxFQUNBLEdBQUFFLEVBQUEsRUFBQVosRUFBQSxNQUNBLENBQ0EsSUFBQWEsRUFBQSxFQUFBeEMsRUFBQWtCLEVBQUEsRUFBQW5CLEVBQUFvQixFQUFBLEVBQUFwQixFQUFBdUMsRUFBQSxLQUVBWCxHQURBWSxHQUFBQSxHQUNBQSxHQUFBckMsRUFBQXNDLEdBQUFMLEVBQUFqQyxFQUFBc0MsRUFBQSxHQUFBSixFQUFBbEMsRUFBQXNDLEVBQUEsR0FBQUgsR0FJQSxPQUFBLElBQUE1QixFQUFBQyxFQUFBQyxFQUFBZ0IsSUFHQS9xQixRQUFBLFNBQUExSixFQUFBQyxFQUFBd0osRUFBQUUsR0FDQSxJQUdBNHBCLEVBQUFDLEVBQUFDLEVBQUFnQixFQUFBYyxFQXFDQWxDLEVBQUFDLEVBQUFvQixFQUFBYyxFQUNBYixFQUFBQyxFQUFBQyxFQUFBWSxFQUNBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQTFDQWhELEVBQUF0eUIsS0FBQXN5QixLQUNBSyxFQUFBM3lCLEtBQUEyeUIsTUFJQXptQixHQUFBek0sRUFBQUMsRUFBQXdKLEVBQUFFLEdBQUF5b0IsRUFDQXQyQixFQUFBa0YsS0FBQUMsTUFBQWpCLEVBQUF5TSxHQUNBc2tCLEVBQUEvdkIsS0FBQUMsTUFBQWhCLEVBQUF3TSxHQUNBbkIsRUFBQXRLLEtBQUFDLE1BQUF3SSxFQUFBZ0QsR0FDQTJILEVBQUFwVCxLQUFBQyxNQUFBMEksRUFBQThDLEdBQ0E3USxHQUFBRSxFQUFBaTFCLEVBQUF6bEIsRUFBQThJLEdBQUFpZSxFQUtBcUIsRUFBQTF6QixHQUpBbEUsRUFBQUYsR0FLQSszQixFQUFBMXpCLEdBSkE4d0IsRUFBQW4xQixHQUtBazVCLEVBQUFyckIsR0FKQTZCLEVBQUExUCxHQUtBazZCLEVBQUFuc0IsR0FKQXlLLEVBQUF4WSxHQVVBbTZCLEVBQUEsRUFDQUMsRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsRUFDQXhDLEVBQUFDLEVBQUFvQyxJQUNBQyxJQUNBdEMsRUFBQW9CLEVBQUFpQixJQUNBRSxJQUNBdkMsRUFBQW9DLEVBQUFDLElBQ0FHLElBQ0F2QyxFQUFBbUIsRUFBQWtCLElBQ0FDLElBQ0F0QyxFQUFBbUMsRUFBQUUsSUFDQUUsSUFDQXBCLEVBQUFnQixFQUFBRyxJQUNBQyxJQXdCQSxJQUFBdEMsRUFBQUYsR0FmQUwsRUFBQTBDLEdBQUEsRUFBQSxFQUFBLEdBZUExRCxFQUNBd0IsRUFBQUYsR0FmQUwsRUFBQTBDLEdBQUEsRUFBQSxFQUFBLEdBZUEzRCxFQUNBMEMsRUFBQUQsR0FmQUosRUFBQXVCLEdBQUEsRUFBQSxFQUFBLEdBZUE1RCxFQUNBOEQsRUFBQUwsR0FmQU4sRUFBQVUsR0FBQSxFQUFBLEVBQUEsR0FlQTdELEVBQ0F5QixFQUFBSixHQWRBaUIsRUFBQW9CLEdBQUEsRUFBQSxFQUFBLEdBY0EsRUFBQTFELEVBQ0EwQixFQUFBSixHQWRBaUIsRUFBQW9CLEdBQUEsRUFBQSxFQUFBLEdBY0EsRUFBQTNELEVBQ0EyQyxFQUFBRixHQWRBRCxFQUFBb0IsR0FBQSxFQUFBLEVBQUEsR0FjQSxFQUFBNUQsRUFDQStELEVBQUFOLEdBZEFMLEVBQUFTLEdBQUEsRUFBQSxFQUFBLEdBY0EsRUFBQTdELEVBQ0E0QyxFQUFBdkIsR0FiQWdDLEVBQUFLLEdBQUEsRUFBQSxFQUFBLEdBYUEsRUFBQTFELEVBQ0E2QyxFQUFBdkIsR0FiQWdDLEVBQUFLLEdBQUEsRUFBQSxFQUFBLEdBYUEsRUFBQTNELEVBQ0E4QyxFQUFBTCxHQWJBYyxFQUFBSyxHQUFBLEVBQUEsRUFBQSxHQWFBLEVBQUE1RCxFQUNBZ0UsRUFBQVAsR0FiQUQsRUFBQUssR0FBQSxFQUFBLEVBQUEsR0FhQSxFQUFBN0QsRUFDQWlFLEVBQUE1QyxFQUFBLEVBQUEsRUFBQXJCLEVBQ0FrRSxFQUFBNUMsRUFBQSxFQUFBLEVBQUF0QixFQUNBbUUsRUFBQTFCLEVBQUEsRUFBQSxFQUFBekMsRUFDQW9FLEdBQUFYLEVBQUEsRUFBQSxFQUFBekQsRUFFQTJCLEdBQUEsSUFBQWw0QixFQUNBbTRCLEdBQUEsSUFBQWxELEVBQ0FxRSxHQUFBLElBQUE5cEIsRUFDQW9yQixHQUFBLElBQUF0aUIsRUFFQThmLEdBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQW1CLEVBQUFBLEVBQUFnQixFQUFBQSxFQUNBLEdBQUE1QixHQUFBLEVBQUFYLEVBQUEsTUFDQSxDQUNBLElBQUFZLEdBQUF0QixFQUFBbUIsR0FBQW5CLEVBQUFvQixHQUFBcEIsRUFBQXVDLEdBQUF2QyxFQUFBNkQsT0FBQSxHQUFBLEVBRUFuRCxHQURBVyxJQUFBQSxJQUNBQSxJQUFBaEIsRUFBQWlCLElBQUFULEVBQUFSLEVBQUFpQixHQUFBLEdBQUFSLEVBQUFULEVBQUFpQixHQUFBLEdBQUFXLEVBQUE1QixFQUFBaUIsR0FBQSxHQUFBMkIsR0FFQSxJQUFBMUIsR0FBQSxHQUFBUixFQUFBQSxFQUFBQyxFQUFBQSxFQUFBa0IsRUFBQUEsRUFBQW9CLEVBQUFBLEVBQ0EsR0FBQS9CLEdBQUEsRUFBQVosRUFBQSxNQUNBLENBQ0EsSUFBQWEsR0FBQXhCLEVBQUFtQixHQUFBWCxFQUFBUixFQUFBb0IsR0FBQVgsRUFBQVQsRUFBQXVDLEdBQUFWLEVBQUE3QixFQUFBNkQsR0FBQWxCLE1BQUEsR0FBQSxFQUVBaEMsR0FEQVksSUFBQUEsSUFDQUEsSUFBQWxCLEVBQUFtQixJQUFBVCxFQUFBVixFQUFBbUIsR0FBQSxHQUFBUixFQUFBWCxFQUFBbUIsR0FBQSxHQUFBVSxFQUFBN0IsRUFBQW1CLEdBQUEsR0FBQThCLEdBRUEsSUFBQTdCLEdBQUEsR0FBQVIsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQWlCLEVBQUFBLEVBQUFvQixFQUFBQSxFQUNBLEdBQUE5QixHQUFBLEVBQUFiLEVBQUEsTUFDQSxDQUNBLElBQUFjLEdBQUExQixFQUFBbUIsR0FBQVcsRUFBQTlCLEVBQUFvQixHQUFBVyxFQUFBL0IsRUFBQXVDLEdBQUFQLEVBQUFoQyxFQUFBNkQsR0FBQWpCLE1BQUEsR0FBQSxFQUVBaEMsR0FEQWEsSUFBQUEsSUFDQUEsSUFBQXBCLEVBQUFxQixJQUFBVCxFQUFBWixFQUFBcUIsR0FBQSxHQUFBUixFQUFBYixFQUFBcUIsR0FBQSxHQUFBUyxFQUFBOUIsRUFBQXFCLEdBQUEsR0FBQTZCLEdBRUEsSUFBQWYsR0FBQSxHQUFBSixFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxFQUFBQSxFQUFBa0IsRUFBQUEsRUFDQSxHQUFBaEIsR0FBQSxFQUFBWixFQUFBLE1BQ0EsQ0FDQSxJQUFBYSxHQUFBekMsRUFBQW1CLEdBQUEwQixFQUFBN0MsRUFBQW9CLEdBQUEwQixFQUFBOUMsRUFBQXVDLEdBQUFRLEVBQUEvQyxFQUFBNkQsR0FBQWIsTUFBQSxHQUFBLEVBRUFwQixHQURBWSxJQUFBQSxJQUNBQSxJQUFBbkMsRUFBQW9DLElBQUFMLEVBQUEvQixFQUFBb0MsR0FBQSxHQUFBSixFQUFBaEMsRUFBQW9DLEdBQUEsR0FBQUgsRUFBQWpDLEVBQUFvQyxHQUFBLEdBQUFlLEdBRUEsSUFBQU0sR0FBQSxHQUFBTCxFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxHQUFBQSxHQUNBLEdBQUFFLEdBQUEsRUFBQXBCLEVBQUEsTUFDQSxDQUNBLElBQUFxQixHQUFBL0QsRUFBQW1CLEdBQUEsRUFBQW5CLEVBQUFvQixHQUFBLEVBQUFwQixFQUFBdUMsR0FBQSxFQUFBdkMsRUFBQTZELEdBQUEsTUFBQSxHQUFBLEVBRUFuQixHQURBb0IsSUFBQUEsSUFDQUEsSUFBQXpELEVBQUEwRCxJQUFBTixFQUFBcEQsRUFBQTBELEdBQUEsR0FBQUwsRUFBQXJELEVBQUEwRCxHQUFBLEdBQUFKLEVBQUF0RCxFQUFBMEQsR0FBQSxHQUFBSCxJQUdBLE9BQUEsSUFBQWxELEVBQUFDLEVBQUFDLEVBQUFnQixFQUFBYyxLQWtCQXJ0QixFQUFBMnVCLHVCQUFBakUsRUF1REEsb0JBQUFrRSxRQUFBQSxPQUFBQyxLQUFBRCxPQUFBLFdBQUEsT0FBQTV1QixTQUVBLElBQUEzTCxFQUFBQSxFQUFBMkwsYUFBQUEsRUFFQSxvQkFBQWtILFNBQUFBLE9BQUFsSCxhQUFBQSxRQUVBLElBQUF2TCxJQUNBQSxFQUFBSixRQUFBMkwsR0F4YkEsNEJDN0JBLGFBQ0EsSUFBQWtILEVBQUFuVCxFQUFBLGlCQUNBKzZCLEVBQUEvNkIsRUFBQSxlQUNBZzdCLEVBQUFoN0IsRUFBQSxpQkFDQWk3QixFQUFBajdCLEVBQUEsU0E2QkEsU0FBQWs3QixFQUFBQyxFQUFBL0YsRUFBQWdHLEdBQ0EsSUFBQUMsRUFBQUYsRUFZQSxPQVZBSixFQUFBM0YsSUFDQWdHLEVBQUFoRyxFQUNBLGlCQUFBK0YsSUFDQUUsRUFBQSxDQUFBRixJQUFBQSxLQUdBRSxFQUFBSixFQUFBN0YsRUFBQSxDQUFBK0YsSUFBQUEsSUFHQUUsRUFBQUQsU0FBQUEsRUFDQUMsRUFHQSxTQUFBQyxFQUFBSCxFQUFBL0YsRUFBQWdHLEdBRUEsT0FBQUcsRUFEQW5HLEVBQUE4RixFQUFBQyxFQUFBL0YsRUFBQWdHLElBSUEsU0FBQUcsRUFBQW5HLEdBQ0EsUUFBQSxJQUFBQSxFQUFBZ0csU0FDQSxNQUFBLElBQUFqN0IsTUFBQSw2QkFHQSxJQUFBcTdCLEdBQUEsRUFDQUosRUFBQSxTQUFBcHBCLEVBQUF5VyxFQUFBOUwsR0FDQTZlLElBQ0FBLEdBQUEsRUFDQXBHLEVBQUFnRyxTQUFBcHBCLEVBQUF5VyxFQUFBOUwsS0FVQSxTQUFBOGUsSUFFQSxJQUFBOWUsT0FBQS9MLEVBUUEsR0FMQStMLEVBREFnVixFQUFBbEosU0FDQWtKLEVBQUFsSixTQUVBa0osRUFBQStKLGNBc0pBLFNBQUEvSixHQUdBLElBQ0EsR0FBQSxhQUFBQSxFQUFBTyxhQUNBLE9BQUFQLEVBQUFnSyxZQUVBLElBQUFDLEVBQUFqSyxFQUFBZ0ssYUFBQSxnQkFBQWhLLEVBQUFnSyxZQUFBRSxnQkFBQXZvQixTQUNBLEdBQUEsS0FBQXFlLEVBQUFPLGVBQUEwSixFQUNBLE9BQUFqSyxFQUFBZ0ssWUFFQSxNQUFBbDhCLElBRUEsT0FBQSxLQW5LQXE4QixDQUFBbkssR0FHQW9LLEVBQ0EsSUFDQXBmLEVBQUF5VixLQUFBQyxNQUFBMVYsR0FDQSxNQUFBbGQsSUFHQSxPQUFBa2QsRUFHQSxTQUFBcWYsRUFBQUMsR0FNQSxPQUxBQyxhQUFBQyxHQUNBRixhQUFBOTdCLFFBQ0E4N0IsRUFBQSxJQUFBOTdCLE1BQUEsSUFBQTg3QixHQUFBLGtDQUVBQSxFQUFBOUosV0FBQSxFQUNBaUosRUFBQWEsRUFBQUcsR0FJQSxTQUFBQyxJQUNBLElBQUFDLEVBQUEsQ0FDQSxJQUFBekssRUFDQXFLLGFBQUFDLEdBT0EsSUFBQTFULEVBQUEyVCxFQUNBcHFCLEVBQUEsS0FpQkEsT0FmQSxLQVBBNmYsRUFGQXVELEVBQUFtSCxhQUFBM3JCLElBQUErZ0IsRUFBQUUsT0FFQSxJQUVBLE9BQUFGLEVBQUFFLE9BQUEsSUFBQUYsRUFBQUUsU0FNQXBKLEVBQUEsQ0FDQTlMLEtBQUE4ZSxJQUNBdEosV0FBQU4sRUFDQTJLLE9BQUFBLEVBQ0F2SSxRQUFBLEdBQ0E3QyxJQUFBK0osRUFDQXNCLFdBQUE5SyxHQUVBQSxFQUFBK0ssd0JBQ0FqVSxFQUFBd0wsUUFBQStHLEVBQUFySixFQUFBK0ssMkJBR0ExcUIsRUFBQSxJQUFBN1IsTUFBQSxpQ0FFQWk3QixFQUFBcHBCLEVBQUF5VyxFQUFBQSxFQUFBOUwsT0FHQSxJQVVBclMsRUFDQWd5QixFQVhBM0ssRUFBQXlELEVBQUF6RCxLQUFBLEtBRUFBLElBRUFBLEVBREF5RCxFQUFBdUgsTUFBQXZILEVBQUFtSCxPQUNBLElBQUFqQixFQUFBc0IsZUFFQSxJQUFBdEIsRUFBQXVCLGdCQU1BLElBTUFWLEVBTkFoQixFQUFBeEosRUFBQVAsSUFBQWdFLEVBQUErRixLQUFBL0YsRUFBQWhFLElBQ0FvTCxFQUFBN0ssRUFBQTZLLE9BQUFwSCxFQUFBb0gsUUFBQSxNQUNBN2YsRUFBQXlZLEVBQUF6WSxNQUFBeVksRUFBQXZ5QixLQUNBb3hCLEVBQUF0QyxFQUFBc0MsUUFBQW1CLEVBQUFuQixTQUFBLEdBQ0E2SSxJQUFBMUgsRUFBQTBILEtBQ0FmLEdBQUEsRUFFQUssRUFBQSxDQUNBemYsVUFBQS9MLEVBQ0FxakIsUUFBQSxHQUNBOUIsV0FBQSxFQUNBcUssT0FBQUEsRUFDQXBMLElBQUErSixFQUNBc0IsV0FBQTlLLEdBMENBLEdBdkNBLFNBQUF5RCxJQUFBLElBQUFBLEVBQUFyRCxPQUNBZ0ssR0FBQSxFQUNBOUgsRUFBQSxRQUFBQSxFQUFBLFNBQUFBLEVBQUEsT0FBQSxvQkFDQSxRQUFBdUksR0FBQSxTQUFBQSxJQUNBdkksRUFBQSxpQkFBQUEsRUFBQSxrQkFBQUEsRUFBQSxnQkFBQSxvQkFDQXRYLEVBQUF5VixLQUFBMkssV0FBQSxJQUFBM0gsRUFBQXJELEtBQUFwVixFQUFBeVksRUFBQXJELFFBSUFKLEVBQUFxTCxtQkF2R0EsV0FDQSxJQUFBckwsRUFBQTZCLFlBQ0ExVyxXQUFBdWYsRUFBQSxJQXNHQTFLLEVBQUFvQyxPQUFBc0ksRUFDQTFLLEVBQUFxQixRQUFBZ0osRUFFQXJLLEVBQUFzTCxXQUFBLGFBR0F0TCxFQUFBdUwsUUFBQSxXQUNBWixHQUFBLEdBRUEzSyxFQUFBd0wsVUFBQW5CLEVBQ0FySyxFQUFBeUwsS0FBQVosRUFBQXJCLEdBQUEyQixFQUFBMUgsRUFBQWlJLFNBQUFqSSxFQUFBa0ksVUFFQVIsSUFDQW5MLEVBQUE0TCxrQkFBQW5JLEVBQUFtSSxrQkFLQVQsR0FBQTFILEVBQUFvSSxRQUFBLElBQ0FyQixFQUFBcmYsV0FBQSxXQUNBLElBQUF3ZixFQUFBLENBQ0FBLEdBQUEsRUFDQTNLLEVBQUE4TCxNQUFBLFdBQ0EsSUFBQWgrQixFQUFBLElBQUFVLE1BQUEsMEJBQ0FWLEVBQUFXLEtBQUEsWUFDQTQ3QixFQUFBdjhCLEtBQ0EyMUIsRUFBQW9JLFVBR0E3TCxFQUFBK0wsaUJBQ0EsSUFBQXB6QixLQUFBMnBCLEVBQ0FBLEVBQUEvaUIsZUFBQTVHLElBQ0FxbkIsRUFBQStMLGlCQUFBcHpCLEVBQUEycEIsRUFBQTNwQixTQUdBLEdBQUE4cUIsRUFBQW5CLFVBcExBLFNBQUFqaEIsR0FDQSxJQUFBLElBQUFuVCxLQUFBbVQsRUFDQSxHQUFBQSxFQUFBOUIsZUFBQXJSLEdBQUEsT0FBQSxFQUVBLE9BQUEsRUFnTEE4OUIsQ0FBQXZJLEVBQUFuQixTQUNBLE1BQUEsSUFBQTl6QixNQUFBLHFEQWtCQSxNQWZBLGlCQUFBaTFCLElBQ0F6RCxFQUFBTyxhQUFBa0QsRUFBQWxELGNBR0EsZUFBQWtELEdBQ0EsbUJBQUFBLEVBQUF3SSxZQUVBeEksRUFBQXdJLFdBQUFqTSxHQU1BQSxFQUFBa00sS0FBQWxoQixHQUFBLE1BRUFnVixFQTNOQWp4QixFQUFBSixRQUFBZzdCLEVBRUE1NkIsRUFBQUosUUFBQXVZLFFBQUF5aUIsRUFDQUEsRUFBQXVCLGVBQUExcEIsRUFBQTBwQixnQkE2T0EsYUE1T0F2QixFQUFBc0IsZUFBQSxvQkFBQSxJQUFBdEIsRUFBQXVCLGVBQUF2QixFQUFBdUIsZUFBQTFwQixFQUFBeXBCLGVBVUEsU0FBQTN1QixFQUFBNnZCLEdBQ0EsSUFBQSxJQUFBaitCLEVBQUEsRUFBQUEsRUFBQW9PLEVBQUF6TixPQUFBWCxJQUNBaStCLEVBQUE3dkIsRUFBQXBPLElBVkFrK0IsQ0FBQSxDQUFBLE1BQUEsTUFBQSxPQUFBLFFBQUEsT0FBQSxVQUFBLFNBQUF2QixHQUNBbEIsRUFBQSxXQUFBa0IsRUFBQSxNQUFBQSxHQUFBLFNBQUFyQixFQUFBL0YsRUFBQWdHLEdBR0EsT0FGQWhHLEVBQUE4RixFQUFBQyxFQUFBL0YsRUFBQWdHLElBQ0FvQixPQUFBQSxFQUFBdDBCLGNBQ0FxekIsRUFBQW5HLDRGQ2hCQTEwQixFQUFBSixRQUlBLFdBR0EsSUFGQSxJQUFBNFIsRUFBQSxHQUVBclMsRUFBQSxFQUFBQSxFQUFBNFMsVUFBQWpTLE9BQUFYLElBQUEsQ0FDQSxJQUFBc1MsRUFBQU0sVUFBQTVTLEdBRUEsSUFBQSxJQUFBeUssS0FBQTZILEVBQ0FqQixFQUFBM1EsS0FBQTRSLEVBQUE3SCxLQUNBNEgsRUFBQTVILEdBQUE2SCxFQUFBN0gsSUFLQSxPQUFBNEgsR0FmQSxJQUFBaEIsRUFBQS9HLE9BQUFnSCxVQUFBRCxxRENEQTRELEVBQUFrcEIsa0NBQUE3cUIsT0FBQThxQixTQUFBemhCIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qXG4gKiBHZW5ldGljIEFsZ29yaXRobVxuICogV3JpdHRlbiBieSBKb2hhbm51cyBWb2dlbFxuICpcbiAqIEluc3BpcmVkIG9uIGBHZW5ldGljIEFsZ29yaXRobScgLSBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgQ2hyaXMgQ3VtbWlucy5cbiAqIGh0dHBzOi8vY2hyaXNjdW1taW5zLmNjL2dlbmV0aWNzXG4gKi9cblxuXG5jb25zdCBjYW52YXNTa2V0Y2ggPSByZXF1aXJlKCdjYW52YXMtc2tldGNoJyk7XG5jb25zdCBsb2FkID0gcmVxdWlyZSgnbG9hZC1hc3NldCcpO1xuY29uc3QgcmFuZG9tID0gcmVxdWlyZSgnY2FudmFzLXNrZXRjaC11dGlsL3JhbmRvbScpO1xuY29uc3QgeyBwb3AgfSA9IHJlcXVpcmUoJ2xvYWQtYXNzZXQvbG9hZGVycycpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHtcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgZnBzOiAxXG59O1xuY29uc3QgUEhFTk9UWVBFID0gJ21peGVkJ1xuY29uc3QgRFJBV0lOR19DT0xPUiA9IFwiXCJcbmNvbnN0IE9WRVJMQVBQX0lNQUdFID0gZmFsc2VcbmNvbnN0IFNJREVfQ09NUEFSRSA9IGZhbHNlXG5jb25zdCBTVVJWSVZBTF9SQVRFID0gMC4yXG5jb25zdCBNVVRBVEVfQ09OVElOVU9VU0xZID0gdHJ1ZVxuY29uc3QgTVVUQVRJT05fQ0hBTkNFID0gMC4wMVxuY29uc3QgTVVUQVRJT05fSU1QQUNUID0gMC4xXG5jb25zdCBETkFfTEVOR1RIID0gMTAwXG5jb25zdCBQT1BVTEFUSU9OX1NJWkUgPSA1MFxuY29uc3QgVVNFX0RJRkZfU1FVQVJFRCA9IHRydWVcbmNvbnN0IFJBVElPX1JFRFVDVElPTl9GQUNUT1IgPSA1XG5jb25zdCBQUklOVF9UT1BfRklUTkVTUyA9IHRydWU7XG5jb25zdCBSRUNFU1NJVkVfR0VORVMgPSB0cnVlO1xuY29uc3QgR0VORV9MRU5HVEggPSB7XG4gIGJlemllcjogNyxcbiAgbGluZXM6IDUsXG4gIGNpcmNsZXM6IDgsXG4gIGRvdHM6IDcsXG4gIG1peGVkOiAxMFxufVxuXG5sZXQgdGFyZ2V0U2l6ZSA9IFtdXG5sZXQgbGlmZUNhbnZhcywgbGlmZUNvbnRleHQ7XG5sZXQgdGFyZ2V0RGF0YTtcblxuY29uc3Qgc2tldGNoID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBpbWFnZSA9IGF3YWl0IGxvYWQoJ2Fzc2V0cy9oaC5qcGcnKTtcbiAgdGFyZ2V0U2l6ZSA9IFtpbWFnZS53aWR0aCAvIFJBVElPX1JFRFVDVElPTl9GQUNUT1IsIGltYWdlLmhlaWdodCAvIFJBVElPX1JFRFVDVElPTl9GQUNUT1JdXG4gIGNvbnN0IHRhcmdldENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICB0YXJnZXRDYW52YXMud2lkdGggPSB0YXJnZXRTaXplWzBdO1xuICB0YXJnZXRDYW52YXMuaGVpZ2h0ID0gdGFyZ2V0U2l6ZVsxXTtcbiAgY29uc3QgdGFyZ2V0Q29udGV4dCA9IHRhcmdldENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICB0YXJnZXRDb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgdGFyZ2V0Q2FudmFzLndpZHRoLCB0YXJnZXRDYW52YXMuaGVpZ2h0KTtcbiAgdGFyZ2V0RGF0YSA9IHRhcmdldENvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRhcmdldENhbnZhcy53aWR0aCwgdGFyZ2V0Q2FudmFzLmhlaWdodCkuZGF0YTtcblxuXG4gIGxpZmVDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgbGlmZUNhbnZhcy53aWR0aCA9IHRhcmdldFNpemVbMF07XG4gIGxpZmVDYW52YXMuaGVpZ2h0ID0gdGFyZ2V0U2l6ZVsxXTtcbiAgbGlmZUNvbnRleHQgPSBsaWZlQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGxpZmVDb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG5cblxuICBjb25zdCBwb3B1bGF0aW9uID0gbmV3IFBvcHVsYXRpb24oUE9QVUxBVElPTl9TSVpFKVxuXG4gIGxldCBpID0gMFxuICByZXR1cm4gKHsgY29udGV4dCwgd2lkdGgsIGhlaWdodCB9KSA9PiB7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSAnd2hpdGUnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cblxuXG4gICAgcG9wdWxhdGlvbi5pdGVyYXRlKClcblxuICAgIGlmIChQUklOVF9UT1BfRklUTkVTUykge1xuICAgICAgY29uc29sZS5sb2coaSsrLCBwb3B1bGF0aW9uLmZpdHRlc3QuZml0bmVzcylcbiAgICB9XG5cblxuICAgIGlmIChTSURFX0NPTVBBUkUpIHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCB0YXJnZXRDYW52YXMud2lkdGgsIDAsIHRhcmdldENhbnZhcy53aWR0aCwgdGFyZ2V0Q2FudmFzLmhlaWdodCk7XG4gICAgICBwb3B1bGF0aW9uLmZpdHRlc3QuZHJhdyhjb250ZXh0LCB0YXJnZXRDYW52YXMud2lkdGgsIHRhcmdldENhbnZhcy5oZWlnaHQpXG4gICAgfSBlbHNlIGlmIChPVkVSTEFQUF9JTUFHRSkge1xuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpO1xuICAgICAgcG9wdWxhdGlvbi5maXR0ZXN0LmRyYXcoY29udGV4dCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVuZGVyUGFyYW1zID0gZ2V0Q2VudGVyaW5nUGFyYW1ldGVycyhbaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodF0sIFt3aWR0aCwgaGVpZ2h0XSlcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHJlbmRlclBhcmFtcy50cmFuc2xhdGUueCwgcmVuZGVyUGFyYW1zLnRyYW5zbGF0ZS55KVxuICAgICAgcG9wdWxhdGlvbi5maXR0ZXN0LmRyYXcoY29udGV4dCwgcmVuZGVyUGFyYW1zLmRpbWVuc2lvbnNbMF0sIHJlbmRlclBhcmFtcy5kaW1lbnNpb25zWzFdKVxuICAgIH1cblxuXG5cbiAgfTtcbn07XG5cbmNhbnZhc1NrZXRjaChza2V0Y2gsIHNldHRpbmdzKTtcblxuXG5cblxuY2xhc3MgUG9wdWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICB0aGlzLmluZGl2aWR1YWxzID0gdGhpcy5wb3B1bGF0ZShzaXplKVxuICAgIHRoaXMuc2l6ZSA9IHNpemVcbiAgICB0aGlzLnNvcnRJbmRpdmlkdWFsc0J5Rml0bmVzcygpXG4gICAgdGhpcy5maXR0ZXN0ID0gdGhpcy5pbmRpdmlkdWFsc1swXVxuICB9XG5cbiAgcG9wdWxhdGUoc2l6ZSkge1xuICAgIGxldCBpbmRpdmlkdWFscyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGluZGl2aWR1YWxzLnB1c2gobmV3IEluZGl2aWR1YWwoKSlcbiAgICB9XG4gICAgcmV0dXJuIGluZGl2aWR1YWxzXG4gIH1cblxuICBzb3J0SW5kaXZpZHVhbHNCeUZpdG5lc3MoKSB7XG4gICAgdGhpcy5pbmRpdmlkdWFscyA9IHRoaXMuaW5kaXZpZHVhbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgcmV0dXJuIGIuZml0bmVzcyAtIGEuZml0bmVzc1xuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuaW5kaXZpZHVhbHNcbiAgfVxuXG4gIGl0ZXJhdGUoKSB7XG4gICAgdGhpcy5zb3J0SW5kaXZpZHVhbHNCeUZpdG5lc3MoKVxuXG4gICAgdGhpcy5maXR0ZXN0ID0gdGhpcy5pbmRpdmlkdWFsc1swXVxuXG4gICAgY29uc3QgY3V0b2ZmID0gTWF0aC5mbG9vcihTVVJWSVZBTF9SQVRFICogdGhpcy5pbmRpdmlkdWFscy5sZW5ndGgpXG5cbiAgICB0aGlzLmluZGl2aWR1YWxzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSkuZmlsbCgwKS5tYXAoKF8pID0+IHtcbiAgICAgIGxldCBbbW90aGVyLCBmYXRoZXJdID0gW3t9LCB7fV07XG5cbiAgICAgIHdoaWxlIChtb3RoZXIubmFtZSA9PSBmYXRoZXIubmFtZSkge1xuICAgICAgICBtb3RoZXIgPSB0aGlzLmdldEZpdFBhcmVudChjdXRvZmYpXG4gICAgICAgIGZhdGhlciA9IHRoaXMuZ2V0Rml0UGFyZW50KGN1dG9mZilcblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEluZGl2aWR1YWwobW90aGVyLCBmYXRoZXIpXG4gICAgfSlcblxuXG4gIH1cblxuICBnZXRGaXRQYXJlbnQoY3V0b2ZmKSB7XG4gICAgbGV0IHJHYXVzcyA9IE1hdGguYWJzKHJhbmRvbS5nYXVzc2lhbigwLCAxKSlcbiAgICByR2F1c3MgPSByR2F1c3MgPiAxID8gcmFuZG9tLnZhbHVlKCkgOiByR2F1c3M7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKHJHYXVzcyAqIGN1dG9mZilcbiAgICByZXR1cm4gdGhpcy5pbmRpdmlkdWFsc1tpbmRleF1cbiAgfVxufVxuXG5jbGFzcyBJbmRpdmlkdWFsIHtcbiAgY29uc3RydWN0b3IobW90aGVyID0gdW5kZWZpbmVkLCBmYXRoZXIgPSB1bmRlZmluZWQsIGRuYUxlbmd0aCA9IEROQV9MRU5HVEgsIHBoZW5vdHlwZSA9IFBIRU5PVFlQRSkge1xuICAgIHRoaXMucGhlbm90eXBlID0gcGhlbm90eXBlXG4gICAgdGhpcy5kbmFMZW5ndGggPSBkbmFMZW5ndGhcbiAgICB0aGlzLmdlbmVMZW5ndGggPSBSZW5kZXJlci5kYXRhUG9pbnRzTmVlZGVkRm9yKHBoZW5vdHlwZSlcbiAgICB0aGlzLmRuYSA9IEluZGl2aWR1YWwuZ2VuZXJhdGVETkEoZmF0aGVyLCBtb3RoZXIsIGRuYUxlbmd0aCwgdGhpcy5nZW5lTGVuZ3RoKVxuICAgIHRoaXMuZml0bmVzcyA9IEluZGl2aWR1YWwuY2FsY3VsYXRlRml0bmVzcyhVU0VfRElGRl9TUVVBUkVELCB0aGlzLmRuYSwgcGhlbm90eXBlKVxuICAgIHRoaXMubmFtZSA9IHV1aWR2NCgpXG5cbiAgfVxuXG4gIHN0YXRpYyBnZW5lcmF0ZUROQShmYXRoZXIsIG1vdGhlciwgZG5hTGVuZ3RoLCBnZW5lTGVuZ3RoKSB7XG4gICAgaWYgKGZhdGhlciAmJiBtb3RoZXIpIHtcbiAgICAgIHJldHVybiBJbmRpdmlkdWFsLmluaGVyaXRETkFGcm9tKGZhdGhlciwgbW90aGVyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW5kaXZpZHVhbC5nZW5lcmF0ZU9ycGhhbkROQShkbmFMZW5ndGgsIGdlbmVMZW5ndGgpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGluaGVyaXRETkFGcm9tKGZhdGhlciwgbW90aGVyKSB7XG4gICAgY29uc3Qgc3BsaXRJbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuZG5hTGVuZ3RoKVxuICAgIGNvbnN0IGRuYSA9IG1vdGhlci5kbmEubWFwKChtb3RoZXJHZW5lLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IGNoaWxkR2VuZSA9IE1hdGgucmFuZG9tKCkgPCAwLjUgPyBtb3RoZXJHZW5lIDogZmF0aGVyLmRuYVtpbmRleF1cbiAgICAgIGlmIChpbmRleCA+IHNwbGl0SW5kZXgpIHtcbiAgICAgICAgY2hpbGRHZW5lID0gbW90aGVyR2VuZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRHZW5lID0gZmF0aGVyLmRuYVtpbmRleF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEluZGl2aWR1YWwubWF5YmVNdXRhdGUoY2hpbGRHZW5lKVxuICAgIH0pXG5cbiAgICByZXR1cm4gZG5hXG4gIH1cblxuICBzdGF0aWMgbWF5YmVNdXRhdGUoZ2VuZSkge1xuICAgIGlmIChNVVRBVEVfQ09OVElOVU9VU0xZKSB7XG4gICAgICByZXR1cm4gSW5kaXZpZHVhbC5tdXRhdGVHZW5lKGdlbmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBJbmRpdmlkdWFsLm11dGF0ZVJhbmRvbShnZW5lKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBtdXRhdGVSYW5kb20oZ2VuZSkge1xuICAgIHJldHVybiBnZW5lLm1hcCgoZykgPT4ge1xuICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCBNVVRBVElPTl9DSEFOQ0UpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnXG4gICAgICB9XG4gICAgfSlcblxuXG4gIH1cblxuICBzdGF0aWMgbXV0YXRlR2VuZShnZW5lKSB7XG4gICAgcmV0dXJuIGdlbmUubWFwKChnKSA9PiB7XG4gICAgICBsZXQgY2FuZGlkYXRlID0gZ1xuICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCBNVVRBVElPTl9DSEFOQ0UpIHtcbiAgICAgICAgbGV0IG11dGF0aW9uID0gTVVUQVRJT05fSU1QQUNUICogKE1hdGgucmFuZG9tKCkgKiAyIC0gMSlcbiAgICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlICsgbXV0YXRpb25cbiAgICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlIDwgMCA/IE1hdGgucmFuZG9tKCkgOiBjYW5kaWRhdGU7XG4gICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZSA+IDEgPyBNYXRoLnJhbmRvbSgpIDogY2FuZGlkYXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVPcnBoYW5ETkEoZG5hTGVuZ3RoLCBnZW5lTGVuZ3RoKSB7XG4gICAgY29uc3QgZG5hID0gW11cbiAgICBmb3IgKHZhciBnID0gMDsgZyA8IGRuYUxlbmd0aDsgZyArPSAxKSB7XG4gICAgICBkbmEucHVzaChuZXcgQXJyYXkoZ2VuZUxlbmd0aCkuZmlsbCgwKS5tYXAoXyA9PiBNYXRoLnJhbmRvbSgpKSlcbiAgICB9XG4gICAgcmV0dXJuIGRuYVxuICB9XG5cbiAgc3RhdGljIGNhbGN1bGF0ZUZpdG5lc3MoZGlmZlNxdWFyZWQsIGRuYSwgcGhlbm90eXBlKSB7XG4gICAgY29uc3QgdGFyZ2V0UGl4ZWxDb3VudCA9IHRhcmdldERhdGEubGVuZ3RoXG4gICAgY29uc3QgY3VycmVudERhdGEgPSBJbmRpdmlkdWFsLmdldFJlbmRlckRhdGEoZG5hLCBwaGVub3R5cGUpXG4gICAgbGV0IGRpZmYgPSAwXG4gICAgbGV0IGZpdG5lc3MgPSAwXG4gICAgaWYgKGRpZmZTcXVhcmVkKSB7ICAvLyBTdW0gc3F1YXJlZCBkaWZmZXJlbmNlcy5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgdGFyZ2V0UGl4ZWxDb3VudDsgcCsrKSB7XG4gICAgICAgIHZhciBkcCA9IGN1cnJlbnREYXRhW3BdIC0gdGFyZ2V0RGF0YVtwXTtcbiAgICAgICAgZGlmZiArPSBkcCAqIGRwO1xuICAgICAgfVxuICAgICAgZml0bmVzcyA9IDEgLSBkaWZmIC8gKHRhcmdldFBpeGVsQ291bnQgKiAyNTYgKiAyNTYpO1xuICAgIH0gZWxzZSB7ICAvLyBTdW0gZGlmZmVyZW5jZXMuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHRhcmdldFBpeGVsQ291bnQ7IHArKylcbiAgICAgICAgZGlmZiArPSBNYXRoLmFicyhjdXJyZW50RGF0YVtwXSAtIHRhcmdldERhdGFbcF0pO1xuICAgICAgZml0bmVzcyA9IDEgLSBkaWZmIC8gKHRhcmdldFBpeGVsQ291bnQgKiAyNTYpO1xuICAgIH1cbiAgICByZXR1cm4gZml0bmVzc1xuICB9XG5cblxuICBzdGF0aWMgZ2V0UmVuZGVyRGF0YShkbmEsIHBoZW5vdHlwZSkge1xuICAgIGxpZmVDb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG4gICAgbGlmZUNvbnRleHQuZmlsbFJlY3QoMCwgMCwgdGFyZ2V0U2l6ZVswXSwgdGFyZ2V0U2l6ZVsxXSk7XG4gICAgUmVuZGVyZXIuZHJhdyhsaWZlQ29udGV4dCwgdGFyZ2V0U2l6ZVswXSwgdGFyZ2V0U2l6ZVsxXSwgZG5hLCBwaGVub3R5cGUpXG5cbiAgICByZXR1cm4gbGlmZUNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRhcmdldFNpemVbMF0sIHRhcmdldFNpemVbMV0pLmRhdGE7XG4gIH1cblxuICBkcmF3KGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGltYWdlRGltZW5zaW9ucykge1xuICAgIFJlbmRlcmVyLmRyYXcoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgdGhpcy5kbmEsIHRoaXMucGhlbm90eXBlLCBpbWFnZURpbWVuc2lvbnMpXG4gIH1cblxufVxuXG5jbGFzcyBSZW5kZXJlciB7XG4gIHN0YXRpYyBkcmF3KGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGRuYSwgcGhlbm90eXBlLCBpbWFnZURpbWVuc2lvbnMgPSBbMCwgMF0pIHtcbiAgICBpZiAoIU9WRVJMQVBQX0lNQUdFKSB7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBEUkFXSU5HX0NPTE9SXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRuYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKFJFQ0VTU0lWRV9HRU5FUyAmJiBkbmFbaV1bMF0gPiAwLjUpIGNvbnRpbnVlOyAvLyBkbyBub3QgZHJhdyBpZiBcImluYWN0aXZlXCJcbiAgICAgIGNvbnRleHQuc2F2ZSgpXG4gICAgICBSZW5kZXJlci5kcmF3Rm9yKHBoZW5vdHlwZSkoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgZG5hW2ldKVxuICAgICAgY29udGV4dC5yZXN0b3JlKClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGF0YVBvaW50c05lZWRlZEZvcihwaGVub3R5cGUpIHtcbiAgICByZXR1cm4gR0VORV9MRU5HVEhbcGhlbm90eXBlXVxuICB9XG5cbiAgc3RhdGljIGRyYXdGb3IocGhlbm90eXBlKSB7XG4gICAgbGV0IGNhcGl0YWxpemVkUGhlbm90eXBlID0gcGhlbm90eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGhlbm90eXBlLnNsaWNlKDEpXG4gICAgcmV0dXJuIFJlbmRlcmVyW1wiZHJhd1wiICsgY2FwaXRhbGl6ZWRQaGVub3R5cGVdXG5cbiAgfVxuXG4gIHN0YXRpYyBkcmF3Q2lyY2xlcyhjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBnZW5lKSB7XG4gICAgY29uc3QgW2FjdGl2ZSwgcmFkaXVzLCBjZW50ZXJYLCBjZW50ZXJZLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYV0gPSBnZW5lXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBgcmdiYSgke01hdGguZmxvb3IocmVkICogMjU1KX0sJHtNYXRoLmZsb29yKGdyZWVuICogMjU1KX0sICR7TWF0aC5mbG9vcihibHVlICogMjU1KX0sICR7YWxwaGEgLSAwLjN9KWA7XG4gICAgY29uc3QgciA9IHJhZGl1cyAqIChoZWlnaHQgLyAxNSlcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHdpZHRoICogY2VudGVyWCArIHIsIGhlaWdodCAqIGNlbnRlclkpO1xuICAgIGNvbnRleHQuYXJjKHdpZHRoICogY2VudGVyWCwgaGVpZ2h0ICogY2VudGVyWSwgciwgMCwgMiAqIE1hdGguUEkpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKClcbiAgICBjb250ZXh0LmZpbGwoKVxuICB9XG5cbiAgc3RhdGljIGRyYXdEb3RzKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGdlbmUpIHtcbiAgICBjb25zdCBbYWN0aXZlLCBjZW50ZXJYLCBjZW50ZXJZLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYV0gPSBnZW5lXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBgcmdiYSgke01hdGguZmxvb3IocmVkICogMjU1KX0sJHtNYXRoLmZsb29yKGdyZWVuICogMjU1KX0sICR7TWF0aC5mbG9vcihibHVlICogMjU1KX0sICR7YWxwaGEgLSAwLjN9KWA7XG4gICAgY29uc3QgciA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gNTBcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHdpZHRoICogY2VudGVyWCArIHIsIGhlaWdodCAqIGNlbnRlclkpO1xuICAgIGNvbnRleHQuYXJjKHdpZHRoICogY2VudGVyWCwgaGVpZ2h0ICogY2VudGVyWSwgciwgMCwgMiAqIE1hdGguUEkpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKClcbiAgICBjb250ZXh0LmZpbGwoKVxuICB9XG5cbiAgc3RhdGljIGRyYXdCZXppZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgZ2VuZSkge1xuICAgIGNvbnN0IFthY3RpdmUsIGZyb21YLCBmcm9tWSwgdG9YLCB0b1ksIGNvbnRyb2xYLCBjb250cm9sWV0gPSBnZW5lXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyh3aWR0aCAqIGZyb21YLCBoZWlnaHQgKiBmcm9tWSlcbiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8od2lkdGggKiBjb250cm9sWCwgaGVpZ2h0ICogY29udHJvbFksIHdpZHRoICogdG9YLCBoZWlnaHQgKiB0b1kpXG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgfVxuXG4gIHN0YXRpYyBkcmF3TGluZXMoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgZ2VuZSkge1xuICAgIGNvbnN0IFthY3RpdmUsIGZyb21YLCBmcm9tWSwgdG9YLCB0b1ksIHJlZCwgYmx1ZSwgZ3JlZW4sIGFscGhhXSA9IGdlbmVcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gYHJnYmEoJHtNYXRoLmZsb29yKHJlZCAqIDI1NSl9LCR7TWF0aC5mbG9vcihncmVlbiAqIDI1NSl9LCAke01hdGguZmxvb3IoYmx1ZSAqIDI1NSl9LCAke2FscGhhfSlgO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyMDA7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyh3aWR0aCAqIGZyb21YLCBoZWlnaHQgKiBmcm9tWSlcbiAgICBjb250ZXh0LmxpbmVUbyh3aWR0aCAqIHRvWCwgaGVpZ2h0ICogdG9ZKVxuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cblxuICBzdGF0aWMgZHJhd01peGVkKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGdlbmUpIHtcbiAgICBjb25zdCBbYSwgcCwgLi4uZ10gPSBnZW5lXG4gICAgbGV0IHJlbmRlcmVyO1xuICAgIGlmIChwIDwgMC4yKSB7XG4gICAgICByZW5kZXJlciA9IFJlbmRlcmVyLmRyYXdMaW5lc1xuICAgIH0gZWxzZSBpZiAocCA8IDAuNCkge1xuICAgICAgcmVuZGVyZXIgPSBSZW5kZXJlci5kcmF3QmV6aWVyXG4gICAgfSBlbHNlIGlmIChwIDwgMC42KSB7XG4gICAgICByZW5kZXJlciA9IFJlbmRlcmVyLmRyYXdEb3RzXG4gICAgfSBlbHNlIGlmIChwIDwgMSkge1xuICAgICAgcmVuZGVyZXIgPSBSZW5kZXJlci5kcmF3Q2lyY2xlc1xuICAgIH1cbiAgICByZW5kZXJlcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBbYSwgLi4uZ10pXG5cbiAgfVxufVxuZnVuY3Rpb24gdXVpZHY0KCkge1xuICByZXR1cm4gKFsxZTddICsgLTFlMyArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAoYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gYyAvIDQpLnRvU3RyaW5nKDE2KVxuICApO1xufVxuXG5cbmZ1bmN0aW9uIGdldENlbnRlcmluZ1BhcmFtZXRlcnMoaW1hZ2VEaW1lbnNpb25zLCBjYW52YXNEaW1lbnNpb25zKSB7XG4gIGNvbnN0IGltYWdlUmF0aW8gPSBpbWFnZURpbWVuc2lvbnNbMF0gLyBpbWFnZURpbWVuc2lvbnNbMV1cbiAgY29uc3QgY2FudmFzUmF0aW8gPSBjYW52YXNEaW1lbnNpb25zWzBdIC8gY2FudmFzRGltZW5zaW9uc1sxXVxuICBsZXQgdHJhbnNsYXRlLCBkaW1lbnNpb25zXG4gIGlmIChpbWFnZVJhdGlvID4gY2FudmFzUmF0aW8pIHtcbiAgICBkaW1lbnNpb25zID0gW2NhbnZhc0RpbWVuc2lvbnNbMF0sIGNhbnZhc0RpbWVuc2lvbnNbMF0gKiAoMSAvIGltYWdlUmF0aW8pXVxuICAgIHRyYW5zbGF0ZSA9IHsgeDogMCwgeTogKGNhbnZhc0RpbWVuc2lvbnNbMV0gLSBkaW1lbnNpb25zWzFdKSAvIDIgfVxuICB9IGVsc2Uge1xuICAgIGRpbWVuc2lvbnMgPSBbY2FudmFzRGltZW5zaW9uc1sxXSAqIGltYWdlUmF0aW8sIGNhbnZhc0RpbWVuc2lvbnNbMV1dXG4gICAgdHJhbnNsYXRlID0geyB4OiAoY2FudmFzRGltZW5zaW9uc1swXSAtIGRpbWVuc2lvbnNbMF0pIC8gMiwgeTogMCB9XG4gIH1cbiAgcmV0dXJuIHsgZGltZW5zaW9ucywgdHJhbnNsYXRlIH1cbn0iLCIvLyBzb3VyY2VkIGZyb206XG4vLyBodHRwOi8vd3d3LmxlYW5iYWNrcGxheWVyLmNvbS90ZXN0L2g1bXQuaHRtbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLW1pbWUvYmxvYi9tYXN0ZXIvdHlwZXMuanNvblxudmFyIG1pbWVUeXBlcyA9IHJlcXVpcmUoJy4vbWltZS10eXBlcy5qc29uJylcblxudmFyIG1pbWVMb29rdXAgPSB7fVxuT2JqZWN0LmtleXMobWltZVR5cGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgdmFyIGV4dGVuc2lvbnMgPSBtaW1lVHlwZXNba2V5XVxuICBleHRlbnNpb25zLmZvckVhY2goZnVuY3Rpb24gKGV4dCkge1xuICAgIG1pbWVMb29rdXBbZXh0XSA9IGtleVxuICB9KVxufSlcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsb29rdXAgKGV4dCkge1xuICBpZiAoIWV4dCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBzcGVjaWZ5IGV4dGVuc2lvbiBzdHJpbmcnKVxuICBpZiAoZXh0LmluZGV4T2YoJy4nKSA9PT0gMCkge1xuICAgIGV4dCA9IGV4dC5zdWJzdHJpbmcoMSlcbiAgfVxuICByZXR1cm4gbWltZUxvb2t1cFtleHQudG9Mb3dlckNhc2UoKV1cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJhdWRpby9taWRpXCI6IFtcIm1pZFwiLCBcIm1pZGlcIiwgXCJrYXJcIiwgXCJybWlcIl0sXG4gIFwiYXVkaW8vbXA0XCI6IFtcIm1wNGFcIiwgXCJtNGFcIl0sXG4gIFwiYXVkaW8vbXBlZ1wiOiBbXCJtcGdhXCIsIFwibXAyXCIsIFwibXAyYVwiLCBcIm1wM1wiLCBcIm0yYVwiLCBcIm0zYVwiXSxcbiAgXCJhdWRpby9vZ2dcIjogW1wib2dhXCIsIFwib2dnXCIsIFwic3B4XCJdLFxuICBcImF1ZGlvL3dlYm1cIjogW1wid2ViYVwiXSxcbiAgXCJhdWRpby94LW1hdHJvc2thXCI6IFtcIm1rYVwiXSxcbiAgXCJhdWRpby94LW1wZWd1cmxcIjogW1wibTN1XCJdLFxuICBcImF1ZGlvL3dhdlwiOiBbXCJ3YXZcIl0sXG4gIFwidmlkZW8vM2dwcFwiOiBbXCIzZ3BcIl0sXG4gIFwidmlkZW8vM2dwcDJcIjogW1wiM2cyXCJdLFxuICBcInZpZGVvL21wNFwiOiBbXCJtcDRcIiwgXCJtcDR2XCIsIFwibXBnNFwiXSxcbiAgXCJ2aWRlby9tcGVnXCI6IFtcIm1wZWdcIiwgXCJtcGdcIiwgXCJtcGVcIiwgXCJtMXZcIiwgXCJtMnZcIl0sXG4gIFwidmlkZW8vb2dnXCI6IFtcIm9ndlwiXSxcbiAgXCJ2aWRlby9xdWlja3RpbWVcIjogW1wicXRcIiwgXCJtb3ZcIl0sXG4gIFwidmlkZW8vd2VibVwiOiBbXCJ3ZWJtXCJdLFxuICBcInZpZGVvL3gtZjR2XCI6IFtcImY0dlwiXSxcbiAgXCJ2aWRlby94LWZsaVwiOiBbXCJmbGlcIl0sXG4gIFwidmlkZW8veC1mbHZcIjogW1wiZmx2XCJdLFxuICBcInZpZGVvL3gtbTR2XCI6IFtcIm00dlwiXSxcbiAgXCJ2aWRlby94LW1hdHJvc2thXCI6IFtcIm1rdlwiLCBcIm1rM2RcIiwgXCJta3NcIl1cbn0iLCJ2YXIgc2VlZFJhbmRvbSA9IHJlcXVpcmUoJ3NlZWQtcmFuZG9tJyk7XG52YXIgU2ltcGxleE5vaXNlID0gcmVxdWlyZSgnc2ltcGxleC1ub2lzZScpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCdkZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmRvbSAoZGVmYXVsdFNlZWQpIHtcbiAgZGVmYXVsdFNlZWQgPSBkZWZpbmVkKGRlZmF1bHRTZWVkLCBudWxsKTtcbiAgdmFyIGRlZmF1bHRSYW5kb20gPSBNYXRoLnJhbmRvbTtcbiAgdmFyIGN1cnJlbnRTZWVkO1xuICB2YXIgY3VycmVudFJhbmRvbTtcbiAgdmFyIG5vaXNlR2VuZXJhdG9yO1xuICB2YXIgX25leHRHYXVzc2lhbiA9IG51bGw7XG4gIHZhciBfaGFzTmV4dEdhdXNzaWFuID0gZmFsc2U7XG5cbiAgc2V0U2VlZChkZWZhdWx0U2VlZCk7XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgY3JlYXRlUmFuZG9tOiBmdW5jdGlvbiAoZGVmYXVsdFNlZWQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSYW5kb20oZGVmYXVsdFNlZWQpO1xuICAgIH0sXG4gICAgc2V0U2VlZDogc2V0U2VlZCxcbiAgICBnZXRTZWVkOiBnZXRTZWVkLFxuICAgIGdldFJhbmRvbVNlZWQ6IGdldFJhbmRvbVNlZWQsXG4gICAgdmFsdWVOb25aZXJvOiB2YWx1ZU5vblplcm8sXG4gICAgcGVybXV0ZU5vaXNlOiBwZXJtdXRlTm9pc2UsXG4gICAgbm9pc2UxRDogbm9pc2UxRCxcbiAgICBub2lzZTJEOiBub2lzZTJELFxuICAgIG5vaXNlM0Q6IG5vaXNlM0QsXG4gICAgbm9pc2U0RDogbm9pc2U0RCxcbiAgICBzaWduOiBzaWduLFxuICAgIGJvb2xlYW46IGJvb2xlYW4sXG4gICAgY2hhbmNlOiBjaGFuY2UsXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIHJhbmdlRmxvb3I6IHJhbmdlRmxvb3IsXG4gICAgcGljazogcGljayxcbiAgICBzaHVmZmxlOiBzaHVmZmxlLFxuICAgIG9uQ2lyY2xlOiBvbkNpcmNsZSxcbiAgICBpbnNpZGVDaXJjbGU6IGluc2lkZUNpcmNsZSxcbiAgICBvblNwaGVyZTogb25TcGhlcmUsXG4gICAgaW5zaWRlU3BoZXJlOiBpbnNpZGVTcGhlcmUsXG4gICAgcXVhdGVybmlvbjogcXVhdGVybmlvbixcbiAgICB3ZWlnaHRlZDogd2VpZ2h0ZWQsXG4gICAgd2VpZ2h0ZWRTZXQ6IHdlaWdodGVkU2V0LFxuICAgIHdlaWdodGVkU2V0SW5kZXg6IHdlaWdodGVkU2V0SW5kZXgsXG4gICAgZ2F1c3NpYW46IGdhdXNzaWFuXG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0U2VlZCAoc2VlZCwgb3B0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWVkID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygc2VlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGN1cnJlbnRTZWVkID0gc2VlZDtcbiAgICAgIGN1cnJlbnRSYW5kb20gPSBzZWVkUmFuZG9tKGN1cnJlbnRTZWVkLCBvcHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50U2VlZCA9IHVuZGVmaW5lZDtcbiAgICAgIGN1cnJlbnRSYW5kb20gPSBkZWZhdWx0UmFuZG9tO1xuICAgIH1cbiAgICBub2lzZUdlbmVyYXRvciA9IGNyZWF0ZU5vaXNlKCk7XG4gICAgX25leHRHYXVzc2lhbiA9IG51bGw7XG4gICAgX2hhc05leHRHYXVzc2lhbiA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsdWUgKCkge1xuICAgIHJldHVybiBjdXJyZW50UmFuZG9tKCk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZU5vblplcm8gKCkge1xuICAgIHZhciB1ID0gMDtcbiAgICB3aGlsZSAodSA9PT0gMCkgdSA9IHZhbHVlKCk7XG4gICAgcmV0dXJuIHU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZWVkICgpIHtcbiAgICByZXR1cm4gY3VycmVudFNlZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSYW5kb21TZWVkICgpIHtcbiAgICB2YXIgc2VlZCA9IFN0cmluZyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSk7XG4gICAgcmV0dXJuIHNlZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2lzZSAoKSB7XG4gICAgcmV0dXJuIG5ldyBTaW1wbGV4Tm9pc2UoY3VycmVudFJhbmRvbSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZXJtdXRlTm9pc2UgKCkge1xuICAgIG5vaXNlR2VuZXJhdG9yID0gY3JlYXRlTm9pc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vaXNlMUQgKHgsIGZyZXF1ZW5jeSwgYW1wbGl0dWRlKSB7XG4gICAgaWYgKCFpc0Zpbml0ZSh4KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigneCBjb21wb25lbnQgZm9yIG5vaXNlKCkgbXVzdCBiZSBmaW5pdGUnKTtcbiAgICBmcmVxdWVuY3kgPSBkZWZpbmVkKGZyZXF1ZW5jeSwgMSk7XG4gICAgYW1wbGl0dWRlID0gZGVmaW5lZChhbXBsaXR1ZGUsIDEpO1xuICAgIHJldHVybiBhbXBsaXR1ZGUgKiBub2lzZUdlbmVyYXRvci5ub2lzZTJEKHggKiBmcmVxdWVuY3ksIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9pc2UyRCAoeCwgeSwgZnJlcXVlbmN5LCBhbXBsaXR1ZGUpIHtcbiAgICBpZiAoIWlzRmluaXRlKHgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCd4IGNvbXBvbmVudCBmb3Igbm9pc2UoKSBtdXN0IGJlIGZpbml0ZScpO1xuICAgIGlmICghaXNGaW5pdGUoeSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3kgY29tcG9uZW50IGZvciBub2lzZSgpIG11c3QgYmUgZmluaXRlJyk7XG4gICAgZnJlcXVlbmN5ID0gZGVmaW5lZChmcmVxdWVuY3ksIDEpO1xuICAgIGFtcGxpdHVkZSA9IGRlZmluZWQoYW1wbGl0dWRlLCAxKTtcbiAgICByZXR1cm4gYW1wbGl0dWRlICogbm9pc2VHZW5lcmF0b3Iubm9pc2UyRCh4ICogZnJlcXVlbmN5LCB5ICogZnJlcXVlbmN5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vaXNlM0QgKHgsIHksIHosIGZyZXF1ZW5jeSwgYW1wbGl0dWRlKSB7XG4gICAgaWYgKCFpc0Zpbml0ZSh4KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigneCBjb21wb25lbnQgZm9yIG5vaXNlKCkgbXVzdCBiZSBmaW5pdGUnKTtcbiAgICBpZiAoIWlzRmluaXRlKHkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCd5IGNvbXBvbmVudCBmb3Igbm9pc2UoKSBtdXN0IGJlIGZpbml0ZScpO1xuICAgIGlmICghaXNGaW5pdGUoeikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ogY29tcG9uZW50IGZvciBub2lzZSgpIG11c3QgYmUgZmluaXRlJyk7XG4gICAgZnJlcXVlbmN5ID0gZGVmaW5lZChmcmVxdWVuY3ksIDEpO1xuICAgIGFtcGxpdHVkZSA9IGRlZmluZWQoYW1wbGl0dWRlLCAxKTtcbiAgICByZXR1cm4gYW1wbGl0dWRlICogbm9pc2VHZW5lcmF0b3Iubm9pc2UzRChcbiAgICAgIHggKiBmcmVxdWVuY3ksXG4gICAgICB5ICogZnJlcXVlbmN5LFxuICAgICAgeiAqIGZyZXF1ZW5jeVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBub2lzZTREICh4LCB5LCB6LCB3LCBmcmVxdWVuY3ksIGFtcGxpdHVkZSkge1xuICAgIGlmICghaXNGaW5pdGUoeCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ggY29tcG9uZW50IGZvciBub2lzZSgpIG11c3QgYmUgZmluaXRlJyk7XG4gICAgaWYgKCFpc0Zpbml0ZSh5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigneSBjb21wb25lbnQgZm9yIG5vaXNlKCkgbXVzdCBiZSBmaW5pdGUnKTtcbiAgICBpZiAoIWlzRmluaXRlKHopKSB0aHJvdyBuZXcgVHlwZUVycm9yKCd6IGNvbXBvbmVudCBmb3Igbm9pc2UoKSBtdXN0IGJlIGZpbml0ZScpO1xuICAgIGlmICghaXNGaW5pdGUodykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3cgY29tcG9uZW50IGZvciBub2lzZSgpIG11c3QgYmUgZmluaXRlJyk7XG4gICAgZnJlcXVlbmN5ID0gZGVmaW5lZChmcmVxdWVuY3ksIDEpO1xuICAgIGFtcGxpdHVkZSA9IGRlZmluZWQoYW1wbGl0dWRlLCAxKTtcbiAgICByZXR1cm4gYW1wbGl0dWRlICogbm9pc2VHZW5lcmF0b3Iubm9pc2U0RChcbiAgICAgIHggKiBmcmVxdWVuY3ksXG4gICAgICB5ICogZnJlcXVlbmN5LFxuICAgICAgeiAqIGZyZXF1ZW5jeSxcbiAgICAgIHcgKiBmcmVxdWVuY3lcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbiAoKSB7XG4gICAgcmV0dXJuIGJvb2xlYW4oKSA/IDEgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJvb2xlYW4gKCkge1xuICAgIHJldHVybiB2YWx1ZSgpID4gMC41O1xuICB9XG5cbiAgZnVuY3Rpb24gY2hhbmNlIChuKSB7XG4gICAgbiA9IGRlZmluZWQobiwgMC41KTtcbiAgICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBuIHRvIGJlIGEgbnVtYmVyJyk7XG4gICAgcmV0dXJuIHZhbHVlKCkgPCBuO1xuICB9XG5cbiAgZnVuY3Rpb24gcmFuZ2UgKG1pbiwgbWF4KSB7XG4gICAgaWYgKG1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtYXggPSBtaW47XG4gICAgICBtaW4gPSAwO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWluICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsIGFyZ3VtZW50cyB0byBiZSBudW1iZXJzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlKCkgKiAobWF4IC0gbWluKSArIG1pbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJhbmdlRmxvb3IgKG1pbiwgbWF4KSB7XG4gICAgaWYgKG1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtYXggPSBtaW47XG4gICAgICBtaW4gPSAwO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWluICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbWF4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsIGFyZ3VtZW50cyB0byBiZSBudW1iZXJzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IocmFuZ2UobWluLCBtYXgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBpY2sgKGFycmF5KSB7XG4gICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXJyYXlbcmFuZ2VGbG9vcigwLCBhcnJheS5sZW5ndGgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNodWZmbGUgKGFycikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBBcnJheSwgZ290ICcgKyB0eXBlb2YgYXJyKTtcbiAgICB9XG5cbiAgICB2YXIgcmFuZDtcbiAgICB2YXIgdG1wO1xuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICAgIHZhciByZXQgPSBhcnIuc2xpY2UoKTtcbiAgICB3aGlsZSAobGVuKSB7XG4gICAgICByYW5kID0gTWF0aC5mbG9vcih2YWx1ZSgpICogbGVuLS0pO1xuICAgICAgdG1wID0gcmV0W2xlbl07XG4gICAgICByZXRbbGVuXSA9IHJldFtyYW5kXTtcbiAgICAgIHJldFtyYW5kXSA9IHRtcDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2lyY2xlIChyYWRpdXMsIG91dCkge1xuICAgIHJhZGl1cyA9IGRlZmluZWQocmFkaXVzLCAxKTtcbiAgICBvdXQgPSBvdXQgfHwgW107XG4gICAgdmFyIHRoZXRhID0gdmFsdWUoKSAqIDIuMCAqIE1hdGguUEk7XG4gICAgb3V0WzBdID0gcmFkaXVzICogTWF0aC5jb3ModGhldGEpO1xuICAgIG91dFsxXSA9IHJhZGl1cyAqIE1hdGguc2luKHRoZXRhKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zaWRlQ2lyY2xlIChyYWRpdXMsIG91dCkge1xuICAgIHJhZGl1cyA9IGRlZmluZWQocmFkaXVzLCAxKTtcbiAgICBvdXQgPSBvdXQgfHwgW107XG4gICAgb25DaXJjbGUoMSwgb3V0KTtcbiAgICB2YXIgciA9IHJhZGl1cyAqIE1hdGguc3FydCh2YWx1ZSgpKTtcbiAgICBvdXRbMF0gKj0gcjtcbiAgICBvdXRbMV0gKj0gcjtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gb25TcGhlcmUgKHJhZGl1cywgb3V0KSB7XG4gICAgcmFkaXVzID0gZGVmaW5lZChyYWRpdXMsIDEpO1xuICAgIG91dCA9IG91dCB8fCBbXTtcbiAgICB2YXIgdSA9IHZhbHVlKCkgKiBNYXRoLlBJICogMjtcbiAgICB2YXIgdiA9IHZhbHVlKCkgKiAyIC0gMTtcbiAgICB2YXIgcGhpID0gdTtcbiAgICB2YXIgdGhldGEgPSBNYXRoLmFjb3Modik7XG4gICAgb3V0WzBdID0gcmFkaXVzICogTWF0aC5zaW4odGhldGEpICogTWF0aC5jb3MocGhpKTtcbiAgICBvdXRbMV0gPSByYWRpdXMgKiBNYXRoLnNpbih0aGV0YSkgKiBNYXRoLnNpbihwaGkpO1xuICAgIG91dFsyXSA9IHJhZGl1cyAqIE1hdGguY29zKHRoZXRhKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zaWRlU3BoZXJlIChyYWRpdXMsIG91dCkge1xuICAgIHJhZGl1cyA9IGRlZmluZWQocmFkaXVzLCAxKTtcbiAgICBvdXQgPSBvdXQgfHwgW107XG4gICAgdmFyIHUgPSB2YWx1ZSgpICogTWF0aC5QSSAqIDI7XG4gICAgdmFyIHYgPSB2YWx1ZSgpICogMiAtIDE7XG4gICAgdmFyIGsgPSB2YWx1ZSgpO1xuXG4gICAgdmFyIHBoaSA9IHU7XG4gICAgdmFyIHRoZXRhID0gTWF0aC5hY29zKHYpO1xuICAgIHZhciByID0gcmFkaXVzICogTWF0aC5jYnJ0KGspO1xuICAgIG91dFswXSA9IHIgKiBNYXRoLnNpbih0aGV0YSkgKiBNYXRoLmNvcyhwaGkpO1xuICAgIG91dFsxXSA9IHIgKiBNYXRoLnNpbih0aGV0YSkgKiBNYXRoLnNpbihwaGkpO1xuICAgIG91dFsyXSA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHF1YXRlcm5pb24gKG91dCkge1xuICAgIG91dCA9IG91dCB8fCBbXTtcbiAgICB2YXIgdTEgPSB2YWx1ZSgpO1xuICAgIHZhciB1MiA9IHZhbHVlKCk7XG4gICAgdmFyIHUzID0gdmFsdWUoKTtcblxuICAgIHZhciBzcTEgPSBNYXRoLnNxcnQoMSAtIHUxKTtcbiAgICB2YXIgc3EyID0gTWF0aC5zcXJ0KHUxKTtcblxuICAgIHZhciB0aGV0YTEgPSBNYXRoLlBJICogMiAqIHUyO1xuICAgIHZhciB0aGV0YTIgPSBNYXRoLlBJICogMiAqIHUzO1xuXG4gICAgdmFyIHggPSBNYXRoLnNpbih0aGV0YTEpICogc3ExO1xuICAgIHZhciB5ID0gTWF0aC5jb3ModGhldGExKSAqIHNxMTtcbiAgICB2YXIgeiA9IE1hdGguc2luKHRoZXRhMikgKiBzcTI7XG4gICAgdmFyIHcgPSBNYXRoLmNvcyh0aGV0YTIpICogc3EyO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdlaWdodGVkU2V0IChzZXQpIHtcbiAgICBzZXQgPSBzZXQgfHwgW107XG4gICAgaWYgKHNldC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBzZXRbd2VpZ2h0ZWRTZXRJbmRleChzZXQpXS52YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdlaWdodGVkU2V0SW5kZXggKHNldCkge1xuICAgIHNldCA9IHNldCB8fCBbXTtcbiAgICBpZiAoc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB3ZWlnaHRlZChzZXQubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy53ZWlnaHQ7XG4gICAgfSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gd2VpZ2h0ZWQgKHdlaWdodHMpIHtcbiAgICB3ZWlnaHRzID0gd2VpZ2h0cyB8fCBbXTtcbiAgICBpZiAod2VpZ2h0cy5sZW5ndGggPT09IDApIHJldHVybiAtMTtcbiAgICB2YXIgdG90YWxXZWlnaHQgPSAwO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRvdGFsV2VpZ2h0ICs9IHdlaWdodHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRvdGFsV2VpZ2h0IDw9IDApIHRocm93IG5ldyBFcnJvcignV2VpZ2h0cyBtdXN0IHN1bSB0byA+IDAnKTtcblxuICAgIHZhciByYW5kb20gPSB2YWx1ZSgpICogdG90YWxXZWlnaHQ7XG4gICAgZm9yIChpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyYW5kb20gPCB3ZWlnaHRzW2ldKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgICAgcmFuZG9tIC09IHdlaWdodHNbaV07XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2F1c3NpYW4gKG1lYW4sIHN0YW5kYXJkRGVyaXZhdGlvbikge1xuICAgIG1lYW4gPSBkZWZpbmVkKG1lYW4sIDApO1xuICAgIHN0YW5kYXJkRGVyaXZhdGlvbiA9IGRlZmluZWQoc3RhbmRhcmREZXJpdmF0aW9uLCAxKTtcblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrLW1pcnJvci9qZGs3dS1qZGsvYmxvYi9mNGQ4MDk1N2U4OWExOWEyOWJiOWY5ODA3ZDJhMjgzNTFlZDdmN2RmL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9SYW5kb20uamF2YSNMNDk2XG4gICAgaWYgKF9oYXNOZXh0R2F1c3NpYW4pIHtcbiAgICAgIF9oYXNOZXh0R2F1c3NpYW4gPSBmYWxzZTtcbiAgICAgIHZhciByZXN1bHQgPSBfbmV4dEdhdXNzaWFuO1xuICAgICAgX25leHRHYXVzc2lhbiA9IG51bGw7XG4gICAgICByZXR1cm4gbWVhbiArIHN0YW5kYXJkRGVyaXZhdGlvbiAqIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHYxID0gMDtcbiAgICAgIHZhciB2MiA9IDA7XG4gICAgICB2YXIgcyA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIHYxID0gdmFsdWUoKSAqIDIgLSAxOyAvLyBiZXR3ZWVuIC0xIGFuZCAxXG4gICAgICAgIHYyID0gdmFsdWUoKSAqIDIgLSAxOyAvLyBiZXR3ZWVuIC0xIGFuZCAxXG4gICAgICAgIHMgPSB2MSAqIHYxICsgdjIgKiB2MjtcbiAgICAgIH0gd2hpbGUgKHMgPj0gMSB8fCBzID09PSAwKTtcbiAgICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocykgLyBzKTtcbiAgICAgIF9uZXh0R2F1c3NpYW4gPSAodjIgKiBtdWx0aXBsaWVyKTtcbiAgICAgIF9oYXNOZXh0R2F1c3NpYW4gPSB0cnVlO1xuICAgICAgcmV0dXJuIG1lYW4gKyBzdGFuZGFyZERlcml2YXRpb24gKiAodjEgKiBtdWx0aXBsaWVyKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSYW5kb20oKTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG4gIGdsb2JhbC5wZXJmb3JtYW5jZSAmJlxuICBnbG9iYWwucGVyZm9ybWFuY2Uubm93ID8gZnVuY3Rpb24gbm93KCkge1xuICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKVxuICB9IDogRGF0ZS5ub3cgfHwgZnVuY3Rpb24gbm93KCkge1xuICAgIHJldHVybiArbmV3IERhdGVcbiAgfVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpc1Byb21pc2U7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZShvYmopIHtcbiAgcmV0dXJuICEhb2JqICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzTm9kZVxuXG5mdW5jdGlvbiBpc05vZGUgKHZhbCkge1xuICByZXR1cm4gKCF2YWwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpXG4gICAgPyBmYWxzZVxuICAgIDogKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICYmIHR5cGVvZiB3aW5kb3cuTm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICA/ICh2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZSlcbiAgICAgIDogKHR5cGVvZiB2YWwubm9kZVR5cGUgPT09ICdudW1iZXInKSAmJlxuICAgICAgICAodHlwZW9mIHZhbC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpXG59XG4iLCIvLyBUT0RPOiBXZSBjYW4gcmVtb3ZlIGEgaHVnZSBjaHVuayBvZiBidW5kbGUgc2l6ZSBieSB1c2luZyBhIHNtYWxsZXJcbi8vIHV0aWxpdHkgbW9kdWxlIGZvciBjb252ZXJ0aW5nIHVuaXRzLlxuaW1wb3J0IGlzRE9NIGZyb20gJ2lzLWRvbSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRBUEkgKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93WydjYW52YXMtc2tldGNoLWNsaSddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lZCAoKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFyZ3VtZW50c1tpXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyICgpIHtcbiAgcmV0dXJuIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYkdMQ29udGV4dCAoY3R4KSB7XG4gIHJldHVybiB0eXBlb2YgY3R4LmNsZWFyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdHguY2xlYXJDb2xvciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3R4LmJ1ZmZlckRhdGEgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbnZhcyAoZWxlbWVudCkge1xuICByZXR1cm4gaXNET00oZWxlbWVudCkgJiYgL2NhbnZhcy9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Q29udGV4dCA9PT0gJ2Z1bmN0aW9uJztcbn1cbiIsIi8qIVxuICogcmVwZWF0LXN0cmluZyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvcmVwZWF0LXN0cmluZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlc3VsdHMgY2FjaGVcbiAqL1xuXG52YXIgcmVzID0gJyc7XG52YXIgY2FjaGU7XG5cbi8qKlxuICogRXhwb3NlIGByZXBlYXRgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXQ7XG5cbi8qKlxuICogUmVwZWF0IHRoZSBnaXZlbiBgc3RyaW5nYCB0aGUgc3BlY2lmaWVkIGBudW1iZXJgXG4gKiBvZiB0aW1lcy5cbiAqXG4gKiAqKkV4YW1wbGU6KipcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbiAqIHJlcGVhdCgnQScsIDUpO1xuICogLy89PiBBQUFBQVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gcmVwZWF0XG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmAgVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBSZXBlYXRlZCBzdHJpbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVwZWF0KHN0ciwgbnVtKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICAvLyBjb3ZlciBjb21tb24sIHF1aWNrIHVzZSBjYXNlc1xuICBpZiAobnVtID09PSAxKSByZXR1cm4gc3RyO1xuICBpZiAobnVtID09PSAyKSByZXR1cm4gc3RyICsgc3RyO1xuXG4gIHZhciBtYXggPSBzdHIubGVuZ3RoICogbnVtO1xuICBpZiAoY2FjaGUgIT09IHN0ciB8fCB0eXBlb2YgY2FjaGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY2FjaGUgPSBzdHI7XG4gICAgcmVzID0gJyc7XG4gIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+PSBtYXgpIHtcbiAgICByZXR1cm4gcmVzLnN1YnN0cigwLCBtYXgpO1xuICB9XG5cbiAgd2hpbGUgKG1heCA+IHJlcy5sZW5ndGggJiYgbnVtID4gMSkge1xuICAgIGlmIChudW0gJiAxKSB7XG4gICAgICByZXMgKz0gc3RyO1xuICAgIH1cblxuICAgIG51bSA+Pj0gMTtcbiAgICBzdHIgKz0gc3RyO1xuICB9XG5cbiAgcmVzICs9IHN0cjtcbiAgcmVzID0gcmVzLnN1YnN0cigwLCBtYXgpO1xuICByZXR1cm4gcmVzO1xufVxuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nXG4gID8gT2JqZWN0LmtleXMgOiBzaGltO1xuXG5leHBvcnRzLnNoaW0gPSBzaGltO1xuZnVuY3Rpb24gc2hpbSAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbiIsInZhciBzdXBwb3J0c0FyZ3VtZW50c0NsYXNzID0gKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnRzKVxufSkoKSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNBcmd1bWVudHNDbGFzcyA/IHN1cHBvcnRlZCA6IHVuc3VwcG9ydGVkO1xuXG5leHBvcnRzLnN1cHBvcnRlZCA9IHN1cHBvcnRlZDtcbmZ1bmN0aW9uIHN1cHBvcnRlZChvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxuZXhwb3J0cy51bnN1cHBvcnRlZCA9IHVuc3VwcG9ydGVkO1xuZnVuY3Rpb24gdW5zdXBwb3J0ZWQob2JqZWN0KXtcbiAgcmV0dXJuIG9iamVjdCAmJlxuICAgIHR5cGVvZiBvYmplY3QgPT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygb2JqZWN0Lmxlbmd0aCA9PSAnbnVtYmVyJyAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdjYWxsZWUnKSAmJlxuICAgICFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCAnY2FsbGVlJykgfHxcbiAgICBmYWxzZTtcbn07XG4iLCJ2YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuL2xpYi9rZXlzLmpzJyk7XG52YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2xpYi9pc19hcmd1bWVudHMuanMnKTtcblxudmFyIGRlZXBFcXVhbCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMpIHtcbiAgaWYgKCFvcHRzKSBvcHRzID0ge307XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSAmJiBleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMy4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyxcbiAgLy8gZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cbiAgfSBlbHNlIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCB0eXBlb2YgYWN0dWFsICE9ICdvYmplY3QnICYmIHR5cGVvZiBleHBlY3RlZCAhPSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcHRzLnN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gNy40LiBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoeCkge1xuICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnIHx8IHR5cGVvZiB4Lmxlbmd0aCAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB4LmNvcHkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHguc2xpY2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHgubGVuZ3RoID4gMCAmJiB0eXBlb2YgeFswXSAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIG9wdHMpIHtcbiAgdmFyIGksIGtleTtcbiAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGEpIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSByZXR1cm4gZmFsc2U7XG4gIC8vfn5+SSd2ZSBtYW5hZ2VkIHRvIGJyZWFrIE9iamVjdC5rZXlzIHRocm91Z2ggc2NyZXd5IGFyZ3VtZW50cyBwYXNzaW5nLlxuICAvLyAgIENvbnZlcnRpbmcgdG8gYXJyYXkgc29sdmVzIHRoZSBwcm9ibGVtLlxuICBpZiAoaXNBcmd1bWVudHMoYSkpIHtcbiAgICBpZiAoIWlzQXJndW1lbnRzKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIGRlZXBFcXVhbChhLCBiLCBvcHRzKTtcbiAgfVxuICBpZiAoaXNCdWZmZXIoYSkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICB2YXIga2EgPSBvYmplY3RLZXlzKGEpLFxuICAgICAgICBrYiA9IG9iamVjdEtleXMoYik7XG4gIH0gY2F0Y2ggKGUpIHsvL2hhcHBlbnMgd2hlbiBvbmUgaXMgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgdGhlIG90aGVyIGlzbid0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgb3B0cykpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiO1xufVxuIiwiLypcbiAqIERhdGUgRm9ybWF0IDEuMi4zXG4gKiAoYykgMjAwNy0yMDA5IFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPlxuICogTUlUIGxpY2Vuc2VcbiAqXG4gKiBJbmNsdWRlcyBlbmhhbmNlbWVudHMgYnkgU2NvdHQgVHJlbmRhIDxzY290dC50cmVuZGEubmV0PlxuICogYW5kIEtyaXMgS293YWwgPGNpeGFyLmNvbS9+a3Jpcy5rb3dhbC8+XG4gKlxuICogQWNjZXB0cyBhIGRhdGUsIGEgbWFzaywgb3IgYSBkYXRlIGFuZCBhIG1hc2suXG4gKiBSZXR1cm5zIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZGF0ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBkYXRlL3RpbWUuXG4gKiBUaGUgbWFzayBkZWZhdWx0cyB0byBkYXRlRm9ybWF0Lm1hc2tzLmRlZmF1bHQuXG4gKi9cblxuKGZ1bmN0aW9uKGdsb2JhbCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGRhdGVGb3JtYXQgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdG9rZW4gPSAvZHsxLDR9fG17MSw0fXx5eSg/Onl5KT98KFtIaE1zVHRdKVxcMT98W0xsb1NaV05dfFwiW15cIl0qXCJ8J1teJ10qJy9nO1xuICAgICAgdmFyIHRpbWV6b25lID0gL1xcYig/OltQTUNFQV1bU0RQXVR8KD86UGFjaWZpY3xNb3VudGFpbnxDZW50cmFsfEVhc3Rlcm58QXRsYW50aWMpICg/OlN0YW5kYXJkfERheWxpZ2h0fFByZXZhaWxpbmcpIFRpbWV8KD86R01UfFVUQykoPzpbLStdXFxkezR9KT8pXFxiL2c7XG4gICAgICB2YXIgdGltZXpvbmVDbGlwID0gL1teLStcXGRBLVpdL2c7XG4gIFxuICAgICAgLy8gUmVnZXhlcyBhbmQgc3VwcG9ydGluZyBmdW5jdGlvbnMgYXJlIGNhY2hlZCB0aHJvdWdoIGNsb3N1cmVcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbWFzaywgdXRjLCBnbXQpIHtcbiAgXG4gICAgICAgIC8vIFlvdSBjYW4ndCBwcm92aWRlIHV0YyBpZiB5b3Ugc2tpcCBvdGhlciBhcmdzICh1c2UgdGhlICdVVEM6JyBtYXNrIHByZWZpeClcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYga2luZE9mKGRhdGUpID09PSAnc3RyaW5nJyAmJiAhL1xcZC8udGVzdChkYXRlKSkge1xuICAgICAgICAgIG1hc2sgPSBkYXRlO1xuICAgICAgICAgIGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlO1xuICBcbiAgICAgICAgaWYoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGlmIChpc05hTihkYXRlKSkge1xuICAgICAgICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBkYXRlJyk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIG1hc2sgPSBTdHJpbmcoZGF0ZUZvcm1hdC5tYXNrc1ttYXNrXSB8fCBtYXNrIHx8IGRhdGVGb3JtYXQubWFza3NbJ2RlZmF1bHQnXSk7XG4gIFxuICAgICAgICAvLyBBbGxvdyBzZXR0aW5nIHRoZSB1dGMvZ210IGFyZ3VtZW50IHZpYSB0aGUgbWFza1xuICAgICAgICB2YXIgbWFza1NsaWNlID0gbWFzay5zbGljZSgwLCA0KTtcbiAgICAgICAgaWYgKG1hc2tTbGljZSA9PT0gJ1VUQzonIHx8IG1hc2tTbGljZSA9PT0gJ0dNVDonKSB7XG4gICAgICAgICAgbWFzayA9IG1hc2suc2xpY2UoNCk7XG4gICAgICAgICAgdXRjID0gdHJ1ZTtcbiAgICAgICAgICBpZiAobWFza1NsaWNlID09PSAnR01UOicpIHtcbiAgICAgICAgICAgIGdtdCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gIFxuICAgICAgICB2YXIgXyA9IHV0YyA/ICdnZXRVVEMnIDogJ2dldCc7XG4gICAgICAgIHZhciBkID0gZGF0ZVtfICsgJ0RhdGUnXSgpO1xuICAgICAgICB2YXIgRCA9IGRhdGVbXyArICdEYXknXSgpO1xuICAgICAgICB2YXIgbSA9IGRhdGVbXyArICdNb250aCddKCk7XG4gICAgICAgIHZhciB5ID0gZGF0ZVtfICsgJ0Z1bGxZZWFyJ10oKTtcbiAgICAgICAgdmFyIEggPSBkYXRlW18gKyAnSG91cnMnXSgpO1xuICAgICAgICB2YXIgTSA9IGRhdGVbXyArICdNaW51dGVzJ10oKTtcbiAgICAgICAgdmFyIHMgPSBkYXRlW18gKyAnU2Vjb25kcyddKCk7XG4gICAgICAgIHZhciBMID0gZGF0ZVtfICsgJ01pbGxpc2Vjb25kcyddKCk7XG4gICAgICAgIHZhciBvID0gdXRjID8gMCA6IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgdmFyIFcgPSBnZXRXZWVrKGRhdGUpO1xuICAgICAgICB2YXIgTiA9IGdldERheU9mV2VlayhkYXRlKTtcbiAgICAgICAgdmFyIGZsYWdzID0ge1xuICAgICAgICAgIGQ6ICAgIGQsXG4gICAgICAgICAgZGQ6ICAgcGFkKGQpLFxuICAgICAgICAgIGRkZDogIGRhdGVGb3JtYXQuaTE4bi5kYXlOYW1lc1tEXSxcbiAgICAgICAgICBkZGRkOiBkYXRlRm9ybWF0LmkxOG4uZGF5TmFtZXNbRCArIDddLFxuICAgICAgICAgIG06ICAgIG0gKyAxLFxuICAgICAgICAgIG1tOiAgIHBhZChtICsgMSksXG4gICAgICAgICAgbW1tOiAgZGF0ZUZvcm1hdC5pMThuLm1vbnRoTmFtZXNbbV0sXG4gICAgICAgICAgbW1tbTogZGF0ZUZvcm1hdC5pMThuLm1vbnRoTmFtZXNbbSArIDEyXSxcbiAgICAgICAgICB5eTogICBTdHJpbmcoeSkuc2xpY2UoMiksXG4gICAgICAgICAgeXl5eTogeSxcbiAgICAgICAgICBoOiAgICBIICUgMTIgfHwgMTIsXG4gICAgICAgICAgaGg6ICAgcGFkKEggJSAxMiB8fCAxMiksXG4gICAgICAgICAgSDogICAgSCxcbiAgICAgICAgICBISDogICBwYWQoSCksXG4gICAgICAgICAgTTogICAgTSxcbiAgICAgICAgICBNTTogICBwYWQoTSksXG4gICAgICAgICAgczogICAgcyxcbiAgICAgICAgICBzczogICBwYWQocyksXG4gICAgICAgICAgbDogICAgcGFkKEwsIDMpLFxuICAgICAgICAgIEw6ICAgIHBhZChNYXRoLnJvdW5kKEwgLyAxMCkpLFxuICAgICAgICAgIHQ6ICAgIEggPCAxMiA/IGRhdGVGb3JtYXQuaTE4bi50aW1lTmFtZXNbMF0gOiBkYXRlRm9ybWF0LmkxOG4udGltZU5hbWVzWzFdLFxuICAgICAgICAgIHR0OiAgIEggPCAxMiA/IGRhdGVGb3JtYXQuaTE4bi50aW1lTmFtZXNbMl0gOiBkYXRlRm9ybWF0LmkxOG4udGltZU5hbWVzWzNdLFxuICAgICAgICAgIFQ6ICAgIEggPCAxMiA/IGRhdGVGb3JtYXQuaTE4bi50aW1lTmFtZXNbNF0gOiBkYXRlRm9ybWF0LmkxOG4udGltZU5hbWVzWzVdLFxuICAgICAgICAgIFRUOiAgIEggPCAxMiA/IGRhdGVGb3JtYXQuaTE4bi50aW1lTmFtZXNbNl0gOiBkYXRlRm9ybWF0LmkxOG4udGltZU5hbWVzWzddLFxuICAgICAgICAgIFo6ICAgIGdtdCA/ICdHTVQnIDogdXRjID8gJ1VUQycgOiAoU3RyaW5nKGRhdGUpLm1hdGNoKHRpbWV6b25lKSB8fCBbJyddKS5wb3AoKS5yZXBsYWNlKHRpbWV6b25lQ2xpcCwgJycpLFxuICAgICAgICAgIG86ICAgIChvID4gMCA/ICctJyA6ICcrJykgKyBwYWQoTWF0aC5mbG9vcihNYXRoLmFicyhvKSAvIDYwKSAqIDEwMCArIE1hdGguYWJzKG8pICUgNjAsIDQpLFxuICAgICAgICAgIFM6ICAgIFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXVtkICUgMTAgPiAzID8gMCA6IChkICUgMTAwIC0gZCAlIDEwICE9IDEwKSAqIGQgJSAxMF0sXG4gICAgICAgICAgVzogICAgVyxcbiAgICAgICAgICBOOiAgICBOXG4gICAgICAgIH07XG4gIFxuICAgICAgICByZXR1cm4gbWFzay5yZXBsYWNlKHRva2VuLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggaW4gZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBmbGFnc1ttYXRjaF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXRjaC5zbGljZSgxLCBtYXRjaC5sZW5ndGggLSAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgZGF0ZUZvcm1hdC5tYXNrcyA9IHtcbiAgICAnZGVmYXVsdCc6ICAgICAgICAgICAgICAgJ2RkZCBtbW0gZGQgeXl5eSBISDpNTTpzcycsXG4gICAgJ3Nob3J0RGF0ZSc6ICAgICAgICAgICAgICdtL2QveXknLFxuICAgICdtZWRpdW1EYXRlJzogICAgICAgICAgICAnbW1tIGQsIHl5eXknLFxuICAgICdsb25nRGF0ZSc6ICAgICAgICAgICAgICAnbW1tbSBkLCB5eXl5JyxcbiAgICAnZnVsbERhdGUnOiAgICAgICAgICAgICAgJ2RkZGQsIG1tbW0gZCwgeXl5eScsXG4gICAgJ3Nob3J0VGltZSc6ICAgICAgICAgICAgICdoOk1NIFRUJyxcbiAgICAnbWVkaXVtVGltZSc6ICAgICAgICAgICAgJ2g6TU06c3MgVFQnLFxuICAgICdsb25nVGltZSc6ICAgICAgICAgICAgICAnaDpNTTpzcyBUVCBaJyxcbiAgICAnaXNvRGF0ZSc6ICAgICAgICAgICAgICAgJ3l5eXktbW0tZGQnLFxuICAgICdpc29UaW1lJzogICAgICAgICAgICAgICAnSEg6TU06c3MnLFxuICAgICdpc29EYXRlVGltZSc6ICAgICAgICAgICAneXl5eS1tbS1kZFxcJ1RcXCdISDpNTTpzc28nLFxuICAgICdpc29VdGNEYXRlVGltZSc6ICAgICAgICAnVVRDOnl5eXktbW0tZGRcXCdUXFwnSEg6TU06c3NcXCdaXFwnJyxcbiAgICAnZXhwaXJlc0hlYWRlckZvcm1hdCc6ICAgJ2RkZCwgZGQgbW1tIHl5eXkgSEg6TU06c3MgWidcbiAgfTtcblxuICAvLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdHJpbmdzXG4gIGRhdGVGb3JtYXQuaTE4biA9IHtcbiAgICBkYXlOYW1lczogW1xuICAgICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsXG4gICAgICAnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXG4gICAgXSxcbiAgICBtb250aE5hbWVzOiBbXG4gICAgICAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnLFxuICAgICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gICAgXSxcbiAgICB0aW1lTmFtZXM6IFtcbiAgICAgICdhJywgJ3AnLCAnYW0nLCAncG0nLCAnQScsICdQJywgJ0FNJywgJ1BNJ1xuICAgIF1cbiAgfTtcblxuZnVuY3Rpb24gcGFkKHZhbCwgbGVuKSB7XG4gIHZhbCA9IFN0cmluZyh2YWwpO1xuICBsZW4gPSBsZW4gfHwgMjtcbiAgd2hpbGUgKHZhbC5sZW5ndGggPCBsZW4pIHtcbiAgICB2YWwgPSAnMCcgKyB2YWw7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIElTTyA4NjAxIHdlZWsgbnVtYmVyXG4gKiBCYXNlZCBvbiBjb21tZW50cyBmcm9tXG4gKiBodHRwOi8vdGVjaGJsb2cucHJvY3VyaW9zLm5sL2svbjYxOC9uZXdzL3ZpZXcvMzM3OTYvMTQ4NjMvQ2FsY3VsYXRlLUlTTy04NjAxLXdlZWstYW5kLXllYXItaW4tamF2YXNjcmlwdC5odG1sXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBgZGF0ZWBcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0V2VlayhkYXRlKSB7XG4gIC8vIFJlbW92ZSB0aW1lIGNvbXBvbmVudHMgb2YgZGF0ZVxuICB2YXIgdGFyZ2V0VGh1cnNkYXkgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuXG4gIC8vIENoYW5nZSBkYXRlIHRvIFRodXJzZGF5IHNhbWUgd2Vla1xuICB0YXJnZXRUaHVyc2RheS5zZXREYXRlKHRhcmdldFRodXJzZGF5LmdldERhdGUoKSAtICgodGFyZ2V0VGh1cnNkYXkuZ2V0RGF5KCkgKyA2KSAlIDcpICsgMyk7XG5cbiAgLy8gVGFrZSBKYW51YXJ5IDR0aCBhcyBpdCBpcyBhbHdheXMgaW4gd2VlayAxIChzZWUgSVNPIDg2MDEpXG4gIHZhciBmaXJzdFRodXJzZGF5ID0gbmV3IERhdGUodGFyZ2V0VGh1cnNkYXkuZ2V0RnVsbFllYXIoKSwgMCwgNCk7XG5cbiAgLy8gQ2hhbmdlIGRhdGUgdG8gVGh1cnNkYXkgc2FtZSB3ZWVrXG4gIGZpcnN0VGh1cnNkYXkuc2V0RGF0ZShmaXJzdFRodXJzZGF5LmdldERhdGUoKSAtICgoZmlyc3RUaHVyc2RheS5nZXREYXkoKSArIDYpICUgNykgKyAzKTtcblxuICAvLyBDaGVjayBpZiBkYXlsaWdodC1zYXZpbmctdGltZS1zd2l0Y2ggb2NjdXJyZWQgYW5kIGNvcnJlY3QgZm9yIGl0XG4gIHZhciBkcyA9IHRhcmdldFRodXJzZGF5LmdldFRpbWV6b25lT2Zmc2V0KCkgLSBmaXJzdFRodXJzZGF5LmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIHRhcmdldFRodXJzZGF5LnNldEhvdXJzKHRhcmdldFRodXJzZGF5LmdldEhvdXJzKCkgLSBkcyk7XG5cbiAgLy8gTnVtYmVyIG9mIHdlZWtzIGJldHdlZW4gdGFyZ2V0IFRodXJzZGF5IGFuZCBmaXJzdCBUaHVyc2RheVxuICB2YXIgd2Vla0RpZmYgPSAodGFyZ2V0VGh1cnNkYXkgLSBmaXJzdFRodXJzZGF5KSAvICg4NjQwMDAwMCo3KTtcbiAgcmV0dXJuIDEgKyBNYXRoLmZsb29yKHdlZWtEaWZmKTtcbn1cblxuLyoqXG4gKiBHZXQgSVNPLTg2MDEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrXG4gKiAxIChmb3IgTW9uZGF5KSB0aHJvdWdoIDcgKGZvciBTdW5kYXkpXG4gKiBcbiAqIEBwYXJhbSAge09iamVjdH0gYGRhdGVgXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldERheU9mV2VlayhkYXRlKSB7XG4gIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xuICBpZihkb3cgPT09IDApIHtcbiAgICBkb3cgPSA3O1xuICB9XG4gIHJldHVybiBkb3c7XG59XG5cbi8qKlxuICoga2luZC1vZiBzaG9ydGN1dFxuICogQHBhcmFtICB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cblxuICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gJ2FycmF5JztcbiAgfVxuXG4gIHJldHVybiB7fS50b1N0cmluZy5jYWxsKHZhbClcbiAgICAuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG5cblxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkYXRlRm9ybWF0O1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZGF0ZUZvcm1hdDtcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWwuZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XG4gIH1cbn0pKHRoaXMpO1xuIiwiLyohXG4gKiBwYWQtbGVmdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvcGFkLWxlZnQ+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWRMZWZ0KHN0ciwgbnVtLCBjaCkge1xuICBzdHIgPSBzdHIudG9TdHJpbmcoKTtcblxuICBpZiAodHlwZW9mIG51bSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgaWYgKGNoID09PSAwKSB7XG4gICAgY2ggPSAnMCc7XG4gIH0gZWxzZSBpZiAoY2gpIHtcbiAgICBjaCA9IGNoLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgY2ggPSAnICc7XG4gIH1cblxuICByZXR1cm4gcmVwZWF0KGNoLCBudW0gLSBzdHIubGVuZ3RoKSArIHN0cjtcbn07XG4iLCJpbXBvcnQgZGF0ZWZvcm1hdCBmcm9tICdkYXRlZm9ybWF0JztcbmltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbic7XG5pbXBvcnQgcGFkTGVmdCBmcm9tICdwYWQtbGVmdCc7XG5pbXBvcnQgeyBnZXRDbGllbnRBUEkgfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5sZXQgbGluaztcbmxldCBkZWZhdWx0RXh0cyA9IHsgZXh0ZW5zaW9uOiAnJywgcHJlZml4OiAnJywgc3VmZml4OiAnJyB9O1xuXG4vLyBBbHRlcm5hdGl2ZSBzb2x1dGlvbiBmb3Igc2F2aW5nIGZpbGVzLFxuLy8gYSBiaXQgc2xvd2VyIGFuZCBkb2VzIG5vdCB3b3JrIGluIFNhZmFyaVxuLy8gZnVuY3Rpb24gZmV0Y2hCbG9iRnJvbURhdGFVUkwgKGRhdGFVUkwpIHtcbi8vICAgcmV0dXJuIHdpbmRvdy5mZXRjaChkYXRhVVJMKS50aGVuKHJlcyA9PiByZXMuYmxvYigpKTtcbi8vIH1cblxuY29uc3Qgc3VwcG9ydGVkRW5jb2RpbmdzID0gW1xuICAnaW1hZ2UvcG5nJyxcbiAgJ2ltYWdlL2pwZWcnLFxuICAnaW1hZ2Uvd2VicCdcbl07XG5cbmZ1bmN0aW9uIHN0cmVhbSAoaXNTdGFydCwgb3B0cyA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgb3B0cyA9IGFzc2lnbih7fSwgZGVmYXVsdEV4dHMsIG9wdHMpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gcmVzb2x2ZUZpbGVuYW1lKE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtcbiAgICAgIGV4dGVuc2lvbjogJycsXG4gICAgICBmcmFtZTogdW5kZWZpbmVkXG4gICAgfSkpO1xuICAgIGNvbnN0IGZ1bmMgPSBpc1N0YXJ0ID8gJ3N0cmVhbVN0YXJ0JyA6ICdzdHJlYW1FbmQnO1xuICAgIGNvbnN0IGNsaWVudCA9IGdldENsaWVudEFQSSgpO1xuICAgIGlmIChjbGllbnQgJiYgY2xpZW50Lm91dHB1dCAmJiB0eXBlb2YgY2xpZW50W2Z1bmNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2xpZW50W2Z1bmNdKGFzc2lnbih7fSwgb3B0cywgeyBmaWxlbmFtZSB9KSlcbiAgICAgICAgLnRoZW4oZXYgPT4gcmVzb2x2ZShldikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSh7IGZpbGVuYW1lLCBjbGllbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJlYW1TdGFydCAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBzdHJlYW0odHJ1ZSwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJlYW1FbmQgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gc3RyZWFtKGZhbHNlLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENhbnZhcyAoY2FudmFzLCBvcHQgPSB7fSkge1xuICBjb25zdCBlbmNvZGluZyA9IG9wdC5lbmNvZGluZyB8fCAnaW1hZ2UvcG5nJztcbiAgaWYgKCFzdXBwb3J0ZWRFbmNvZGluZ3MuaW5jbHVkZXMoZW5jb2RpbmcpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2FudmFzIGVuY29kaW5nICR7ZW5jb2Rpbmd9YCk7XG4gIGxldCBleHRlbnNpb24gPSAoZW5jb2Rpbmcuc3BsaXQoJy8nKVsxXSB8fCAnJykucmVwbGFjZSgvanBlZy9pLCAnanBnJyk7XG4gIGlmIChleHRlbnNpb24pIGV4dGVuc2lvbiA9IGAuJHtleHRlbnNpb259YC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4ge1xuICAgIGV4dGVuc2lvbixcbiAgICB0eXBlOiBlbmNvZGluZyxcbiAgICBkYXRhVVJMOiBjYW52YXMudG9EYXRhVVJMKGVuY29kaW5nLCBvcHQuZW5jb2RpbmdRdWFsaXR5KVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVCbG9iRnJvbURhdGFVUkwgKGRhdGFVUkwpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc3BsaXRJbmRleCA9IGRhdGFVUkwuaW5kZXhPZignLCcpO1xuICAgIGlmIChzcGxpdEluZGV4ID09PSAtMSkge1xuICAgICAgcmVzb2x2ZShuZXcgd2luZG93LkJsb2IoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGFVUkwuc2xpY2Uoc3BsaXRJbmRleCArIDEpO1xuICAgIGNvbnN0IGJ5dGVTdHJpbmcgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IHR5cGUgPSBkYXRhVVJMLnNsaWNlKDAsIHNwbGl0SW5kZXgpO1xuICAgIGNvbnN0IG1pbWVNYXRjaCA9IC9kYXRhOihbXjtdKykvLmV4ZWModHlwZSk7XG4gICAgY29uc3QgbWltZSA9IChtaW1lTWF0Y2ggPyBtaW1lTWF0Y2hbMV0gOiAnJykgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgICBjb25zdCBpYSA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXNvbHZlKG5ldyB3aW5kb3cuQmxvYihbIGFiIF0sIHsgdHlwZTogbWltZSB9KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZURhdGFVUkwgKGRhdGFVUkwsIG9wdHMgPSB7fSkge1xuICByZXR1cm4gY3JlYXRlQmxvYkZyb21EYXRhVVJMKGRhdGFVUkwpXG4gICAgLnRoZW4oYmxvYiA9PiBzYXZlQmxvYihibG9iLCBvcHRzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlQmxvYiAoYmxvYiwgb3B0cyA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBvcHRzID0gYXNzaWduKHt9LCBkZWZhdWx0RXh0cywgb3B0cyk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBvcHRzLmZpbGVuYW1lO1xuXG4gICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50QVBJKCk7XG4gICAgaWYgKGNsaWVudCAmJiB0eXBlb2YgY2xpZW50LnNhdmVCbG9iID09PSAnZnVuY3Rpb24nICYmIGNsaWVudC5vdXRwdXQpIHtcbiAgICAgIC8vIG5hdGl2ZSBzYXZpbmcgdXNpbmcgYSBDTEkgdG9vbFxuICAgICAgcmV0dXJuIGNsaWVudC5zYXZlQmxvYihibG9iLCBhc3NpZ24oe30sIG9wdHMsIHsgZmlsZW5hbWUgfSkpXG4gICAgICAgIC50aGVuKGV2ID0+IHJlc29sdmUoZXYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yY2UgZG93bmxvYWRcbiAgICAgIGlmICghbGluaykge1xuICAgICAgICBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgIH1cbiAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgIGxpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgbGluay5vbmNsaWNrID0gbm9vcDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgaWYgKGxpbmsucGFyZW50RWxlbWVudCkgbGluay5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGZpbGVuYW1lLCBjbGllbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBsaW5rLmNsaWNrKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGaWxlIChkYXRhLCBvcHRzID0ge30pIHtcbiAgY29uc3QgcGFydHMgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFsgZGF0YSBdO1xuICBjb25zdCBibG9iID0gbmV3IHdpbmRvdy5CbG9iKHBhcnRzLCB7IHR5cGU6IG9wdHMudHlwZSB8fCAnJyB9KTtcbiAgcmV0dXJuIHNhdmVCbG9iKGJsb2IsIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZVN0YW1wICgpIHtcbiAgY29uc3QgZGF0ZUZvcm1hdFN0ciA9IGB5eXl5Lm1tLmRkLUhILk1NLnNzYDtcbiAgcmV0dXJuIGRhdGVmb3JtYXQobmV3IERhdGUoKSwgZGF0ZUZvcm1hdFN0cik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RmlsZSAocHJlZml4ID0gJycsIHN1ZmZpeCA9ICcnLCBleHQpIHtcbiAgLy8gY29uc3QgZGF0ZUZvcm1hdFN0ciA9IGB5eXl5Lm1tLmRkLUhILk1NLnNzYDtcbiAgY29uc3QgZGF0ZUZvcm1hdFN0ciA9IGB5eXl5LW1tLWRkICdhdCcgaC5NTS5zcyBUVGA7XG4gIHJldHVybiBgJHtwcmVmaXh9JHtkYXRlZm9ybWF0KG5ldyBEYXRlKCksIGRhdGVGb3JtYXRTdHIpfSR7c3VmZml4fSR7ZXh0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmlsZW5hbWUgKG9wdCA9IHt9KSB7XG4gIG9wdCA9IGFzc2lnbih7fSwgb3B0KTtcblxuICAvLyBDdXN0b20gZmlsZW5hbWUgZnVuY3Rpb25cbiAgaWYgKHR5cGVvZiBvcHQuZmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvcHQuZmlsZShvcHQpO1xuICB9IGVsc2UgaWYgKG9wdC5maWxlKSB7XG4gICAgcmV0dXJuIG9wdC5maWxlO1xuICB9XG5cbiAgbGV0IGZyYW1lID0gbnVsbDtcbiAgbGV0IGV4dGVuc2lvbiA9ICcnO1xuICBpZiAodHlwZW9mIG9wdC5leHRlbnNpb24gPT09ICdzdHJpbmcnKSBleHRlbnNpb24gPSBvcHQuZXh0ZW5zaW9uO1xuXG4gIGlmICh0eXBlb2Ygb3B0LmZyYW1lID09PSAnbnVtYmVyJykge1xuICAgIGxldCB0b3RhbEZyYW1lcztcbiAgICBpZiAodHlwZW9mIG9wdC50b3RhbEZyYW1lcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRvdGFsRnJhbWVzID0gb3B0LnRvdGFsRnJhbWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3RhbEZyYW1lcyA9IE1hdGgubWF4KDEwMDAwLCBvcHQuZnJhbWUpO1xuICAgIH1cbiAgICBmcmFtZSA9IHBhZExlZnQoU3RyaW5nKG9wdC5mcmFtZSksIFN0cmluZyh0b3RhbEZyYW1lcykubGVuZ3RoLCAnMCcpO1xuICB9XG5cbiAgY29uc3QgbGF5ZXJTdHIgPSBpc0Zpbml0ZShvcHQudG90YWxMYXllcnMpICYmIGlzRmluaXRlKG9wdC5sYXllcikgJiYgb3B0LnRvdGFsTGF5ZXJzID4gMSA/IGAke29wdC5sYXllcn1gIDogJyc7XG4gIGlmIChmcmFtZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIFsgbGF5ZXJTdHIsIGZyYW1lIF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy0nKSArIGV4dGVuc2lvbjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWZhdWx0RmlsZU5hbWUgPSBvcHQudGltZVN0YW1wO1xuICAgIHJldHVybiBbIG9wdC5wcmVmaXgsIG9wdC5uYW1lIHx8IGRlZmF1bHRGaWxlTmFtZSwgbGF5ZXJTdHIsIG9wdC5oYXNoLCBvcHQuc3VmZml4IF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy0nKSArIGV4dGVuc2lvbjtcbiAgfVxufVxuIiwiLy8gSGFuZGxlIHNvbWUgY29tbW9uIHR5cG9zXG5jb25zdCBjb21tb25UeXBvcyA9IHtcbiAgZGltZW5zaW9uOiAnZGltZW5zaW9ucycsXG4gIGFuaW1hdGVkOiAnYW5pbWF0ZScsXG4gIGFuaW1hdGluZzogJ2FuaW1hdGUnLFxuICB1bml0OiAndW5pdHMnLFxuICBQNTogJ3A1JyxcbiAgcGl4ZWxsYXRlZDogJ3BpeGVsYXRlZCcsXG4gIGxvb3Bpbmc6ICdsb29wJyxcbiAgcGl4ZWxQZXJJbmNoOiAncGl4ZWxzJ1xufTtcblxuLy8gSGFuZGxlIGFsbCBvdGhlciB0eXBvc1xuY29uc3QgYWxsS2V5cyA9IFtcbiAgJ2RpbWVuc2lvbnMnLCAndW5pdHMnLCAncGl4ZWxzUGVySW5jaCcsICdvcmllbnRhdGlvbicsXG4gICdzY2FsZVRvRml0JywgJ3NjYWxlVG9WaWV3JywgJ2JsZWVkJywgJ3BpeGVsUmF0aW8nLFxuICAnZXhwb3J0UGl4ZWxSYXRpbycsICdtYXhQaXhlbFJhdGlvJywgJ3NjYWxlQ29udGV4dCcsXG4gICdyZXNpemVDYW52YXMnLCAnc3R5bGVDYW52YXMnLCAnY2FudmFzJywgJ2NvbnRleHQnLCAnYXR0cmlidXRlcycsXG4gICdwYXJlbnQnLCAnZmlsZScsICduYW1lJywgJ3ByZWZpeCcsICdzdWZmaXgnLCAnYW5pbWF0ZScsICdwbGF5aW5nJyxcbiAgJ2xvb3AnLCAnZHVyYXRpb24nLCAndG90YWxGcmFtZXMnLCAnZnBzJywgJ3BsYXliYWNrUmF0ZScsICd0aW1lU2NhbGUnLFxuICAnZnJhbWUnLCAndGltZScsICdmbHVzaCcsICdwaXhlbGF0ZWQnLCAnaG90a2V5cycsICdwNScsICdpZCcsXG4gICdzY2FsZVRvRml0UGFkZGluZycsICdkYXRhJywgJ3BhcmFtcycsICdlbmNvZGluZycsICdlbmNvZGluZ1F1YWxpdHknXG5dO1xuXG4vLyBUaGlzIGlzIGZhaXJseSBvcGluaW9uYXRlZCBhbmQgZm9yY2VzIHVzZXJzIHRvIHVzZSB0aGUgJ2RhdGEnIHBhcmFtZXRlclxuLy8gaWYgdGhleSB3YW50IHRvIHBhc3MgYWxvbmcgbm9uLXNldHRpbmcgb2JqZWN0cy4uLlxuZXhwb3J0IGNvbnN0IGNoZWNrU2V0dGluZ3MgPSAoc2V0dGluZ3MpID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNldHRpbmdzKTtcbiAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKGtleSBpbiBjb21tb25UeXBvcykge1xuICAgICAgY29uc3QgYWN0dWFsID0gY29tbW9uVHlwb3Nba2V5XTtcbiAgICAgIGNvbnNvbGUud2FybihgW2NhbnZhcy1za2V0Y2hdIENvdWxkIG5vdCByZWNvZ25pemUgdGhlIHNldHRpbmcgXCIke2tleX1cIiwgZGlkIHlvdSBtZWFuIFwiJHthY3R1YWx9XCI/YCk7XG4gICAgfSBlbHNlIGlmICghYWxsS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtjYW52YXMtc2tldGNoXSBDb3VsZCBub3QgcmVjb2duaXplIHRoZSBzZXR0aW5nIFwiJHtrZXl9XCJgKTtcbiAgICB9XG4gIH0pO1xufTtcbiIsImNvbnN0IGRlZmF1bHRVbml0cyA9ICdtbSc7XG5cbmNvbnN0IGRhdGEgPSBbXG4gIC8vIENvbW1vbiBQYXBlciBTaXplc1xuICAvLyAoTW9zdGx5IE5vcnRoLUFtZXJpY2FuIGJhc2VkKVxuICBbICdwb3N0Y2FyZCcsIDEwMS42LCAxNTIuNCBdLFxuICBbICdwb3N0ZXItc21hbGwnLCAyODAsIDQzMCBdLFxuICBbICdwb3N0ZXInLCA0NjAsIDYxMCBdLFxuICBbICdwb3N0ZXItbGFyZ2UnLCA2MTAsIDkxMCBdLFxuICBbICdidXNpbmVzcy1jYXJkJywgNTAuOCwgODguOSBdLFxuXG4gIC8vIFBob3RvZ3JhcGhpYyBQcmludCBQYXBlciBTaXplc1xuICBbICcycicsIDY0LCA4OSBdLFxuICBbICczcicsIDg5LCAxMjcgXSxcbiAgWyAnNHInLCAxMDIsIDE1MiBdLFxuICBbICc1cicsIDEyNywgMTc4IF0sIC8vIDXigLN4N+KAs1xuICBbICc2cicsIDE1MiwgMjAzIF0sIC8vIDbigLN4OOKAs1xuICBbICc4cicsIDIwMywgMjU0IF0sIC8vIDjigLN4MTDigLNcbiAgWyAnMTByJywgMjU0LCAzMDUgXSwgLy8gMTDigLN4MTLigLNcbiAgWyAnMTFyJywgMjc5LCAzNTYgXSwgLy8gMTHigLN4MTTigLNcbiAgWyAnMTJyJywgMzA1LCAzODEgXSxcblxuICAvLyBTdGFuZGFyZCBQYXBlciBTaXplc1xuICBbICdhMCcsIDg0MSwgMTE4OSBdLFxuICBbICdhMScsIDU5NCwgODQxIF0sXG4gIFsgJ2EyJywgNDIwLCA1OTQgXSxcbiAgWyAnYTMnLCAyOTcsIDQyMCBdLFxuICBbICdhNCcsIDIxMCwgMjk3IF0sXG4gIFsgJ2E1JywgMTQ4LCAyMTAgXSxcbiAgWyAnYTYnLCAxMDUsIDE0OCBdLFxuICBbICdhNycsIDc0LCAxMDUgXSxcbiAgWyAnYTgnLCA1MiwgNzQgXSxcbiAgWyAnYTknLCAzNywgNTIgXSxcbiAgWyAnYTEwJywgMjYsIDM3IF0sXG4gIFsgJzJhMCcsIDExODksIDE2ODIgXSxcbiAgWyAnNGEwJywgMTY4MiwgMjM3OCBdLFxuICBbICdiMCcsIDEwMDAsIDE0MTQgXSxcbiAgWyAnYjEnLCA3MDcsIDEwMDAgXSxcbiAgWyAnYjErJywgNzIwLCAxMDIwIF0sXG4gIFsgJ2IyJywgNTAwLCA3MDcgXSxcbiAgWyAnYjIrJywgNTIwLCA3MjAgXSxcbiAgWyAnYjMnLCAzNTMsIDUwMCBdLFxuICBbICdiNCcsIDI1MCwgMzUzIF0sXG4gIFsgJ2I1JywgMTc2LCAyNTAgXSxcbiAgWyAnYjYnLCAxMjUsIDE3NiBdLFxuICBbICdiNycsIDg4LCAxMjUgXSxcbiAgWyAnYjgnLCA2MiwgODggXSxcbiAgWyAnYjknLCA0NCwgNjIgXSxcbiAgWyAnYjEwJywgMzEsIDQ0IF0sXG4gIFsgJ2IxMScsIDIyLCAzMiBdLFxuICBbICdiMTInLCAxNiwgMjIgXSxcbiAgWyAnYzAnLCA5MTcsIDEyOTcgXSxcbiAgWyAnYzEnLCA2NDgsIDkxNyBdLFxuICBbICdjMicsIDQ1OCwgNjQ4IF0sXG4gIFsgJ2MzJywgMzI0LCA0NTggXSxcbiAgWyAnYzQnLCAyMjksIDMyNCBdLFxuICBbICdjNScsIDE2MiwgMjI5IF0sXG4gIFsgJ2M2JywgMTE0LCAxNjIgXSxcbiAgWyAnYzcnLCA4MSwgMTE0IF0sXG4gIFsgJ2M4JywgNTcsIDgxIF0sXG4gIFsgJ2M5JywgNDAsIDU3IF0sXG4gIFsgJ2MxMCcsIDI4LCA0MCBdLFxuICBbICdjMTEnLCAyMiwgMzIgXSxcbiAgWyAnYzEyJywgMTYsIDIyIF0sXG5cbiAgLy8gVXNlIGluY2hlcyBmb3IgTm9ydGggQW1lcmljYW4gc2l6ZXMsXG4gIC8vIGFzIGl0IHByb2R1Y2VzIGxlc3MgZmxvYXQgcHJlY2lzaW9uIGVycm9yc1xuICBbICdoYWxmLWxldHRlcicsIDUuNSwgOC41LCAnaW4nIF0sXG4gIFsgJ2xldHRlcicsIDguNSwgMTEsICdpbicgXSxcbiAgWyAnbGVnYWwnLCA4LjUsIDE0LCAnaW4nIF0sXG4gIFsgJ2p1bmlvci1sZWdhbCcsIDUsIDgsICdpbicgXSxcbiAgWyAnbGVkZ2VyJywgMTEsIDE3LCAnaW4nIF0sXG4gIFsgJ3RhYmxvaWQnLCAxMSwgMTcsICdpbicgXSxcbiAgWyAnYW5zaS1hJywgOC41LCAxMS4wLCAnaW4nIF0sXG4gIFsgJ2Fuc2ktYicsIDExLjAsIDE3LjAsICdpbicgXSxcbiAgWyAnYW5zaS1jJywgMTcuMCwgMjIuMCwgJ2luJyBdLFxuICBbICdhbnNpLWQnLCAyMi4wLCAzNC4wLCAnaW4nIF0sXG4gIFsgJ2Fuc2ktZScsIDM0LjAsIDQ0LjAsICdpbicgXSxcbiAgWyAnYXJjaC1hJywgOSwgMTIsICdpbicgXSxcbiAgWyAnYXJjaC1iJywgMTIsIDE4LCAnaW4nIF0sXG4gIFsgJ2FyY2gtYycsIDE4LCAyNCwgJ2luJyBdLFxuICBbICdhcmNoLWQnLCAyNCwgMzYsICdpbicgXSxcbiAgWyAnYXJjaC1lJywgMzYsIDQ4LCAnaW4nIF0sXG4gIFsgJ2FyY2gtZTEnLCAzMCwgNDIsICdpbicgXSxcbiAgWyAnYXJjaC1lMicsIDI2LCAzOCwgJ2luJyBdLFxuICBbICdhcmNoLWUzJywgMjcsIDM5LCAnaW4nIF1cbl07XG5cbmV4cG9ydCBkZWZhdWx0IGRhdGEucmVkdWNlKChkaWN0LCBwcmVzZXQpID0+IHtcbiAgY29uc3QgaXRlbSA9IHtcbiAgICB1bml0czogcHJlc2V0WzNdIHx8IGRlZmF1bHRVbml0cyxcbiAgICBkaW1lbnNpb25zOiBbIHByZXNldFsxXSwgcHJlc2V0WzJdIF1cbiAgfTtcbiAgZGljdFtwcmVzZXRbMF1dID0gaXRlbTtcbiAgZGljdFtwcmVzZXRbMF0ucmVwbGFjZSgvLS9nLCAnICcpXSA9IGl0ZW07XG4gIHJldHVybiBkaWN0O1xufSwge30pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYXJndW1lbnRzW2ldO1xuICAgIH1cbn07XG4iLCJ2YXIgZGVmaW5lZCA9IHJlcXVpcmUoJ2RlZmluZWQnKTtcbnZhciB1bml0cyA9IFsgJ21tJywgJ2NtJywgJ20nLCAncGMnLCAncHQnLCAnaW4nLCAnZnQnLCAncHgnIF07XG5cbnZhciBjb252ZXJzaW9ucyA9IHtcbiAgLy8gbWV0cmljXG4gIG06IHtcbiAgICBzeXN0ZW06ICdtZXRyaWMnLFxuICAgIGZhY3RvcjogMVxuICB9LFxuICBjbToge1xuICAgIHN5c3RlbTogJ21ldHJpYycsXG4gICAgZmFjdG9yOiAxIC8gMTAwXG4gIH0sXG4gIG1tOiB7XG4gICAgc3lzdGVtOiAnbWV0cmljJyxcbiAgICBmYWN0b3I6IDEgLyAxMDAwXG4gIH0sXG4gIC8vIGltcGVyaWFsXG4gIHB0OiB7XG4gICAgc3lzdGVtOiAnaW1wZXJpYWwnLFxuICAgIGZhY3RvcjogMSAvIDcyXG4gIH0sXG4gIHBjOiB7XG4gICAgc3lzdGVtOiAnaW1wZXJpYWwnLFxuICAgIGZhY3RvcjogMSAvIDZcbiAgfSxcbiAgaW46IHtcbiAgICBzeXN0ZW06ICdpbXBlcmlhbCcsXG4gICAgZmFjdG9yOiAxXG4gIH0sXG4gIGZ0OiB7XG4gICAgc3lzdGVtOiAnaW1wZXJpYWwnLFxuICAgIGZhY3RvcjogMTJcbiAgfVxufTtcblxuY29uc3QgYW5jaG9ycyA9IHtcbiAgbWV0cmljOiB7XG4gICAgdW5pdDogJ20nLFxuICAgIHJhdGlvOiAxIC8gMC4wMjU0XG4gIH0sXG4gIGltcGVyaWFsOiB7XG4gICAgdW5pdDogJ2luJyxcbiAgICByYXRpbzogMC4wMjU0XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJvdW5kICh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgcmV0dXJuIE51bWJlcihNYXRoLnJvdW5kKHZhbHVlICsgJ2UnICsgZGVjaW1hbHMpICsgJ2UtJyArIGRlY2ltYWxzKTtcbn1cblxuZnVuY3Rpb24gY29udmVydERpc3RhbmNlICh2YWx1ZSwgZnJvbVVuaXQsIHRvVW5pdCwgb3B0cykge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCAhaXNGaW5pdGUodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyJyk7XG4gIGlmICghZnJvbVVuaXQgfHwgIXRvVW5pdCkgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHNwZWNpZnkgZnJvbSBhbmQgdG8gdW5pdHMnKTtcblxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHBpeGVsc1BlckluY2ggPSBkZWZpbmVkKG9wdHMucGl4ZWxzUGVySW5jaCwgOTYpO1xuICB2YXIgcHJlY2lzaW9uID0gb3B0cy5wcmVjaXNpb247XG4gIHZhciByb3VuZFBpeGVsID0gb3B0cy5yb3VuZFBpeGVsICE9PSBmYWxzZTtcblxuICBmcm9tVW5pdCA9IGZyb21Vbml0LnRvTG93ZXJDYXNlKCk7XG4gIHRvVW5pdCA9IHRvVW5pdC50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICh1bml0cy5pbmRleE9mKGZyb21Vbml0KSA9PT0gLTEpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmcm9tIHVuaXQgXCInICsgZnJvbVVuaXQgKyAnXCIsIG11c3QgYmUgb25lIG9mOiAnICsgdW5pdHMuam9pbignLCAnKSk7XG4gIGlmICh1bml0cy5pbmRleE9mKHRvVW5pdCkgPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZnJvbSB1bml0IFwiJyArIHRvVW5pdCArICdcIiwgbXVzdCBiZSBvbmUgb2Y6ICcgKyB1bml0cy5qb2luKCcsICcpKTtcblxuICBpZiAoZnJvbVVuaXQgPT09IHRvVW5pdCkge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY29udmVydCBmcm9tIEEgdG8gQiBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZSBhbHJlYWR5XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdmFyIHRvRmFjdG9yID0gMTtcbiAgdmFyIGZyb21GYWN0b3IgPSAxO1xuICB2YXIgaXNUb1BpeGVsID0gZmFsc2U7XG5cbiAgaWYgKGZyb21Vbml0ID09PSAncHgnKSB7XG4gICAgZnJvbUZhY3RvciA9IDEgLyBwaXhlbHNQZXJJbmNoO1xuICAgIGZyb21Vbml0ID0gJ2luJztcbiAgfVxuICBpZiAodG9Vbml0ID09PSAncHgnKSB7XG4gICAgaXNUb1BpeGVsID0gdHJ1ZTtcbiAgICB0b0ZhY3RvciA9IHBpeGVsc1BlckluY2g7XG4gICAgdG9Vbml0ID0gJ2luJztcbiAgfVxuXG4gIHZhciBmcm9tVW5pdERhdGEgPSBjb252ZXJzaW9uc1tmcm9tVW5pdF07XG4gIHZhciB0b1VuaXREYXRhID0gY29udmVyc2lvbnNbdG9Vbml0XTtcblxuICAvLyBzb3VyY2UgdG8gYW5jaG9yIGluc2lkZSBzb3VyY2UncyBzeXN0ZW1cbiAgdmFyIGFuY2hvciA9IHZhbHVlICogZnJvbVVuaXREYXRhLmZhY3RvciAqIGZyb21GYWN0b3I7XG5cbiAgLy8gaWYgc3lzdGVtcyBkaWZmZXIsIGNvbnZlcnQgb25lIHRvIGFub3RoZXJcbiAgaWYgKGZyb21Vbml0RGF0YS5zeXN0ZW0gIT09IHRvVW5pdERhdGEuc3lzdGVtKSB7XG4gICAgLy8gcmVndWxhciAnbScgdG8gJ2luJyBhbmQgc28gZm9ydGhcbiAgICBhbmNob3IgKj0gYW5jaG9yc1tmcm9tVW5pdERhdGEuc3lzdGVtXS5yYXRpbztcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBhbmNob3IgLyB0b1VuaXREYXRhLmZhY3RvciAqIHRvRmFjdG9yO1xuICBpZiAoaXNUb1BpeGVsICYmIHJvdW5kUGl4ZWwpIHtcbiAgICByZXN1bHQgPSBNYXRoLnJvdW5kKHJlc3VsdCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUocHJlY2lzaW9uKSkge1xuICAgIHJlc3VsdCA9IHJvdW5kKHJlc3VsdCwgcHJlY2lzaW9uKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnREaXN0YW5jZTtcbm1vZHVsZS5leHBvcnRzLnVuaXRzID0gdW5pdHM7XG4iLCJpbXBvcnQgcGFwZXJTaXplcyBmcm9tICcuL3BhcGVyLXNpemVzJztcbmltcG9ydCBjb252ZXJ0TGVuZ3RoIGZyb20gJ2NvbnZlcnQtbGVuZ3RoJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvbnNGcm9tUHJlc2V0IChkaW1lbnNpb25zLCB1bml0c1RvID0gJ3B4JywgcGl4ZWxzUGVySW5jaCA9IDcyKSB7XG4gIGlmICh0eXBlb2YgZGltZW5zaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBrZXkgPSBkaW1lbnNpb25zLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCEoa2V5IGluIHBhcGVyU2l6ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaW1lbnNpb24gcHJlc2V0IFwiJHtkaW1lbnNpb25zfVwiIGlzIG5vdCBzdXBwb3J0ZWQgb3IgY291bGQgbm90IGJlIGZvdW5kOyB0cnkgdXNpbmcgYTQsIGEzLCBwb3N0Y2FyZCwgbGV0dGVyLCBldGMuYClcbiAgICB9XG4gICAgY29uc3QgcHJlc2V0ID0gcGFwZXJTaXplc1trZXldO1xuICAgIHJldHVybiBwcmVzZXQuZGltZW5zaW9ucy5tYXAoZCA9PiB7XG4gICAgICByZXR1cm4gY29udmVydERpc3RhbmNlKGQsIHByZXNldC51bml0cywgdW5pdHNUbywgcGl4ZWxzUGVySW5jaCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREaXN0YW5jZSAoZGltZW5zaW9uLCB1bml0c0Zyb20gPSAncHgnLCB1bml0c1RvID0gJ3B4JywgcGl4ZWxzUGVySW5jaCA9IDcyKSB7XG4gIHJldHVybiBjb252ZXJ0TGVuZ3RoKGRpbWVuc2lvbiwgdW5pdHNGcm9tLCB1bml0c1RvLCB7XG4gICAgcGl4ZWxzUGVySW5jaCxcbiAgICBwcmVjaXNpb246IDQsXG4gICAgcm91bmRQaXhlbDogdHJ1ZVxuICB9KTtcbn1cbiIsImltcG9ydCB7IGdldERpbWVuc2lvbnNGcm9tUHJlc2V0LCBjb252ZXJ0RGlzdGFuY2UgfSBmcm9tICcuLi9kaXN0YW5jZXMnO1xuaW1wb3J0IHsgaXNCcm93c2VyLCBkZWZpbmVkIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmZ1bmN0aW9uIGNoZWNrSWZIYXNEaW1lbnNpb25zIChzZXR0aW5ncykge1xuICBpZiAoIXNldHRpbmdzLmRpbWVuc2lvbnMpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBzZXR0aW5ncy5kaW1lbnNpb25zID09PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHNldHRpbmdzLmRpbWVuc2lvbnMpICYmIHNldHRpbmdzLmRpbWVuc2lvbnMubGVuZ3RoID49IDIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudFNpemUgKHByb3BzLCBzZXR0aW5ncykge1xuICAvLyBXaGVuIG5vIHsgZGltZW5zaW9uIH0gaXMgcGFzc2VkIGluIG5vZGUsIHdlIGRlZmF1bHQgdG8gSFRNTCBjYW52YXMgc2l6ZVxuICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgcmV0dXJuIFsgMzAwLCAxNTAgXTtcbiAgfVxuXG4gIGxldCBlbGVtZW50ID0gc2V0dGluZ3MucGFyZW50IHx8IHdpbmRvdztcblxuICBpZiAoZWxlbWVudCA9PT0gd2luZG93IHx8XG4gICAgICBlbGVtZW50ID09PSBkb2N1bWVudCB8fFxuICAgICAgZWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBbIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFsgd2lkdGgsIGhlaWdodCBdO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc2l6ZUNhbnZhcyAocHJvcHMsIHNldHRpbmdzKSB7XG4gIGxldCB3aWR0aCwgaGVpZ2h0O1xuICBsZXQgc3R5bGVXaWR0aCwgc3R5bGVIZWlnaHQ7XG4gIGxldCBjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0O1xuXG4gIGNvbnN0IGJyb3dzZXIgPSBpc0Jyb3dzZXIoKTtcbiAgY29uc3QgZGltZW5zaW9ucyA9IHNldHRpbmdzLmRpbWVuc2lvbnM7XG4gIGNvbnN0IGhhc0RpbWVuc2lvbnMgPSBjaGVja0lmSGFzRGltZW5zaW9ucyhzZXR0aW5ncyk7XG4gIGNvbnN0IGV4cG9ydGluZyA9IHByb3BzLmV4cG9ydGluZztcbiAgbGV0IHNjYWxlVG9GaXQgPSBoYXNEaW1lbnNpb25zID8gc2V0dGluZ3Muc2NhbGVUb0ZpdCAhPT0gZmFsc2UgOiBmYWxzZTtcbiAgbGV0IHNjYWxlVG9WaWV3ID0gKCFleHBvcnRpbmcgJiYgaGFzRGltZW5zaW9ucykgPyBzZXR0aW5ncy5zY2FsZVRvVmlldyA6IHRydWU7XG4gIC8vIGluIG5vZGUsIGNhbmNlbCBib3RoIG9mIHRoZXNlIG9wdGlvbnNcbiAgaWYgKCFicm93c2VyKSBzY2FsZVRvRml0ID0gc2NhbGVUb1ZpZXcgPSBmYWxzZTtcbiAgY29uc3QgdW5pdHMgPSBzZXR0aW5ncy51bml0cztcbiAgY29uc3QgcGl4ZWxzUGVySW5jaCA9ICh0eXBlb2Ygc2V0dGluZ3MucGl4ZWxzUGVySW5jaCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoc2V0dGluZ3MucGl4ZWxzUGVySW5jaCkpID8gc2V0dGluZ3MucGl4ZWxzUGVySW5jaCA6IDcyO1xuICBjb25zdCBibGVlZCA9IGRlZmluZWQoc2V0dGluZ3MuYmxlZWQsIDApO1xuXG4gIGNvbnN0IGRldmljZVBpeGVsUmF0aW8gPSBicm93c2VyID8gd2luZG93LmRldmljZVBpeGVsUmF0aW8gOiAxO1xuICBjb25zdCBiYXNlUGl4ZWxSYXRpbyA9IHNjYWxlVG9WaWV3ID8gZGV2aWNlUGl4ZWxSYXRpbyA6IDE7XG5cbiAgbGV0IHBpeGVsUmF0aW8sIGV4cG9ydFBpeGVsUmF0aW87XG5cbiAgLy8gSWYgYSBwaXhlbCByYXRpbyBpcyBzcGVjaWZpZWQsIHdlIHdpbGwgdXNlIGl0LlxuICAvLyBPdGhlcndpc2U6XG4gIC8vICAtPiBJZiBkaW1lbnNpb24gaXMgc3BlY2lmaWVkLCB1c2UgYmFzZSByYXRpbyAoaS5lLiBzaXplIGZvciBleHBvcnQpXG4gIC8vICAtPiBJZiBubyBkaW1lbnNpb24gaXMgc3BlY2lmaWVkLCB1c2UgZGV2aWNlIHJhdGlvIChpLmUuIHNpemUgZm9yIHNjcmVlbilcbiAgaWYgKHR5cGVvZiBzZXR0aW5ncy5waXhlbFJhdGlvID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShzZXR0aW5ncy5waXhlbFJhdGlvKSkge1xuICAgIC8vIFdoZW4geyBwaXhlbFJhdGlvIH0gaXMgc3BlY2lmaWVkLCBpdCdzIGFsc28gdXNlZCBhcyBkZWZhdWx0IGV4cG9ydFBpeGVsUmF0aW8uXG4gICAgcGl4ZWxSYXRpbyA9IHNldHRpbmdzLnBpeGVsUmF0aW87XG4gICAgZXhwb3J0UGl4ZWxSYXRpbyA9IGRlZmluZWQoc2V0dGluZ3MuZXhwb3J0UGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhhc0RpbWVuc2lvbnMpIHtcbiAgICAgIC8vIFdoZW4gYSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkLCB1c2UgdGhlIGJhc2UgcmF0aW8gcmF0aGVyIHRoYW4gc2NyZWVuIHJhdGlvXG4gICAgICBwaXhlbFJhdGlvID0gYmFzZVBpeGVsUmF0aW87XG4gICAgICAvLyBEZWZhdWx0IHRvIGEgcGl4ZWwgcmF0aW8gb2YgMSBzbyB0aGF0IHlvdSBlbmQgdXAgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25cbiAgICAgIC8vIHlvdSBzcGVjaWZpZWQsIGkuZS4gWyA1MDAsIDUwMCBdIGlzIGV4cG9ydGVkIGFzIDUwMHg1MDAgcHhcbiAgICAgIGV4cG9ydFBpeGVsUmF0aW8gPSBkZWZpbmVkKHNldHRpbmdzLmV4cG9ydFBpeGVsUmF0aW8sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBkaW1lbnNpb24gaXMgc3BlY2lmaWVkLCBhc3N1bWUgZnVsbC1zY3JlZW4gcmV0aW5hIHNpemluZ1xuICAgICAgcGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW87XG4gICAgICAvLyBEZWZhdWx0IHRvIHNjcmVlbiBwaXhlbCByYXRpbywgc28gdGhhdCBpdCdzIGxpa2UgdGFraW5nIGEgZGV2aWNlIHNjcmVlbnNob3RcbiAgICAgIGV4cG9ydFBpeGVsUmF0aW8gPSBkZWZpbmVkKHNldHRpbmdzLmV4cG9ydFBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsYW1wIHBpeGVsIHJhdGlvXG4gIGlmICh0eXBlb2Ygc2V0dGluZ3MubWF4UGl4ZWxSYXRpbyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoc2V0dGluZ3MubWF4UGl4ZWxSYXRpbykpIHtcbiAgICBwaXhlbFJhdGlvID0gTWF0aC5taW4oc2V0dGluZ3MubWF4UGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XG4gIH1cblxuICAvLyBIYW5kbGUgZXhwb3J0IHBpeGVsIHJhdGlvXG4gIGlmIChleHBvcnRpbmcpIHtcbiAgICBwaXhlbFJhdGlvID0gZXhwb3J0UGl4ZWxSYXRpbztcbiAgfVxuXG4gIC8vIHBhcmVudFdpZHRoID0gdHlwZW9mIHBhcmVudFdpZHRoID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHROb2RlU2l6ZVswXSA6IHBhcmVudFdpZHRoO1xuICAvLyBwYXJlbnRIZWlnaHQgPSB0eXBlb2YgcGFyZW50SGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHROb2RlU2l6ZVsxXSA6IHBhcmVudEhlaWdodDtcblxuICBsZXQgWyBwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0IF0gPSBnZXRQYXJlbnRTaXplKHByb3BzLCBzZXR0aW5ncyk7XG4gIGxldCB0cmltV2lkdGgsIHRyaW1IZWlnaHQ7XG5cbiAgLy8gWW91IGNhbiBzcGVjaWZ5IGEgZGltZW5zaW9ucyBpbiBwaXhlbHMgb3IgY20vbS9pbi9ldGNcbiAgaWYgKGhhc0RpbWVuc2lvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXREaW1lbnNpb25zRnJvbVByZXNldChkaW1lbnNpb25zLCB1bml0cywgcGl4ZWxzUGVySW5jaCk7XG4gICAgY29uc3QgaGlnaGVzdCA9IE1hdGgubWF4KHJlc3VsdFswXSwgcmVzdWx0WzFdKTtcbiAgICBjb25zdCBsb3dlc3QgPSBNYXRoLm1pbihyZXN1bHRbMF0sIHJlc3VsdFsxXSk7XG4gICAgaWYgKHNldHRpbmdzLm9yaWVudGF0aW9uKSB7XG4gICAgICBjb25zdCBsYW5kc2NhcGUgPSBzZXR0aW5ncy5vcmllbnRhdGlvbiA9PT0gJ2xhbmRzY2FwZSc7XG4gICAgICB3aWR0aCA9IGxhbmRzY2FwZSA/IGhpZ2hlc3QgOiBsb3dlc3Q7XG4gICAgICBoZWlnaHQgPSBsYW5kc2NhcGUgPyBsb3dlc3QgOiBoaWdoZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aCA9IHJlc3VsdFswXTtcbiAgICAgIGhlaWdodCA9IHJlc3VsdFsxXTtcbiAgICB9XG5cbiAgICB0cmltV2lkdGggPSB3aWR0aDtcbiAgICB0cmltSGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgLy8gQXBwbHkgYmxlZWQgd2hpY2ggaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUgc2FtZSB1bml0c1xuICAgIHdpZHRoICs9IGJsZWVkICogMjtcbiAgICBoZWlnaHQgKz0gYmxlZWQgKiAyO1xuICB9IGVsc2Uge1xuICAgIHdpZHRoID0gcGFyZW50V2lkdGg7XG4gICAgaGVpZ2h0ID0gcGFyZW50SGVpZ2h0O1xuICAgIHRyaW1XaWR0aCA9IHdpZHRoO1xuICAgIHRyaW1IZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICAvLyBSZWFsIHNpemUgaW4gcGl4ZWxzIGFmdGVyIFBQSSBpcyB0YWtlbiBpbnRvIGFjY291bnRcbiAgbGV0IHJlYWxXaWR0aCA9IHdpZHRoO1xuICBsZXQgcmVhbEhlaWdodCA9IGhlaWdodDtcbiAgaWYgKGhhc0RpbWVuc2lvbnMgJiYgdW5pdHMpIHtcbiAgICAvLyBDb252ZXJ0IHRvIGRpZ2l0YWwvcGl4ZWwgdW5pdHMgaWYgbmVjZXNzYXJ5XG4gICAgcmVhbFdpZHRoID0gY29udmVydERpc3RhbmNlKHdpZHRoLCB1bml0cywgJ3B4JywgcGl4ZWxzUGVySW5jaCk7XG4gICAgcmVhbEhlaWdodCA9IGNvbnZlcnREaXN0YW5jZShoZWlnaHQsIHVuaXRzLCAncHgnLCBwaXhlbHNQZXJJbmNoKTtcbiAgfVxuXG4gIC8vIEhvdyBiaWcgdG8gc2V0IHRoZSAndmlldycgb2YgdGhlIGNhbnZhcyBpbiB0aGUgYnJvd3NlciAoaS5lLiBzdHlsZSlcbiAgc3R5bGVXaWR0aCA9IE1hdGgucm91bmQocmVhbFdpZHRoKTtcbiAgc3R5bGVIZWlnaHQgPSBNYXRoLnJvdW5kKHJlYWxIZWlnaHQpO1xuXG4gIC8vIElmIHdlIHdpc2ggdG8gc2NhbGUgdGhlIHZpZXcgdG8gdGhlIGJyb3dzZXIgd2luZG93XG4gIGlmIChzY2FsZVRvRml0ICYmICFleHBvcnRpbmcgJiYgaGFzRGltZW5zaW9ucykge1xuICAgIGNvbnN0IGFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIGNvbnN0IHdpbmRvd0FzcGVjdCA9IHBhcmVudFdpZHRoIC8gcGFyZW50SGVpZ2h0O1xuICAgIGNvbnN0IHNjYWxlVG9GaXRQYWRkaW5nID0gZGVmaW5lZChzZXR0aW5ncy5zY2FsZVRvRml0UGFkZGluZywgNDApO1xuICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5yb3VuZChwYXJlbnRXaWR0aCAtIHNjYWxlVG9GaXRQYWRkaW5nICogMik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5yb3VuZChwYXJlbnRIZWlnaHQgLSBzY2FsZVRvRml0UGFkZGluZyAqIDIpO1xuICAgIGlmIChzdHlsZVdpZHRoID4gbWF4V2lkdGggfHwgc3R5bGVIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgIGlmICh3aW5kb3dBc3BlY3QgPiBhc3BlY3QpIHtcbiAgICAgICAgc3R5bGVIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHN0eWxlV2lkdGggPSBNYXRoLnJvdW5kKHN0eWxlSGVpZ2h0ICogYXNwZWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlV2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgc3R5bGVIZWlnaHQgPSBNYXRoLnJvdW5kKHN0eWxlV2lkdGggLyBhc3BlY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbnZhc1dpZHRoID0gc2NhbGVUb1ZpZXcgPyBNYXRoLnJvdW5kKHBpeGVsUmF0aW8gKiBzdHlsZVdpZHRoKSA6IE1hdGgucm91bmQocGl4ZWxSYXRpbyAqIHJlYWxXaWR0aCk7XG4gIGNhbnZhc0hlaWdodCA9IHNjYWxlVG9WaWV3ID8gTWF0aC5yb3VuZChwaXhlbFJhdGlvICogc3R5bGVIZWlnaHQpIDogTWF0aC5yb3VuZChwaXhlbFJhdGlvICogcmVhbEhlaWdodCk7XG5cbiAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHNjYWxlVG9WaWV3ID8gTWF0aC5yb3VuZChzdHlsZVdpZHRoKSA6IE1hdGgucm91bmQocmVhbFdpZHRoKTtcbiAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSBzY2FsZVRvVmlldyA/IE1hdGgucm91bmQoc3R5bGVIZWlnaHQpIDogTWF0aC5yb3VuZChyZWFsSGVpZ2h0KTtcblxuICBjb25zdCBzY2FsZVggPSBjYW52YXNXaWR0aCAvIHdpZHRoO1xuICBjb25zdCBzY2FsZVkgPSBjYW52YXNIZWlnaHQgLyBoZWlnaHQ7XG5cbiAgLy8gQXNzaWduIHRvIGN1cnJlbnQgcHJvcHNcbiAgcmV0dXJuIHtcbiAgICBibGVlZCxcbiAgICBwaXhlbFJhdGlvLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkaW1lbnNpb25zOiBbIHdpZHRoLCBoZWlnaHQgXSxcbiAgICB1bml0czogdW5pdHMgfHwgJ3B4JyxcbiAgICBzY2FsZVgsXG4gICAgc2NhbGVZLFxuICAgIHBpeGVsc1BlckluY2gsXG4gICAgdmlld3BvcnRXaWR0aCxcbiAgICB2aWV3cG9ydEhlaWdodCxcbiAgICBjYW52YXNXaWR0aCxcbiAgICBjYW52YXNIZWlnaHQsXG4gICAgdHJpbVdpZHRoLFxuICAgIHRyaW1IZWlnaHQsXG4gICAgc3R5bGVXaWR0aCxcbiAgICBzdHlsZUhlaWdodFxuICB9O1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBnZXRDYW52YXNDb250ZXh0XG5mdW5jdGlvbiBnZXRDYW52YXNDb250ZXh0ICh0eXBlLCBvcHRzKSB7XG4gIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHNwZWNpZnkgdHlwZSBzdHJpbmcnKVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cblxuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyAmJiAhb3B0cy5jYW52YXMpIHtcbiAgICByZXR1cm4gbnVsbCAvLyBjaGVjayBmb3IgTm9kZVxuICB9XG5cbiAgdmFyIGNhbnZhcyA9IG9wdHMuY2FudmFzIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gIGlmICh0eXBlb2Ygb3B0cy53aWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICBjYW52YXMud2lkdGggPSBvcHRzLndpZHRoXG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRzLmhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICBjYW52YXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcbiAgfVxuXG4gIHZhciBhdHRyaWJzID0gb3B0c1xuICB2YXIgZ2xcbiAgdHJ5IHtcbiAgICB2YXIgbmFtZXMgPSBbIHR5cGUgXVxuICAgIC8vIHByZWZpeCBHTCBjb250ZXh0c1xuICAgIGlmICh0eXBlLmluZGV4T2YoJ3dlYmdsJykgPT09IDApIHtcbiAgICAgIG5hbWVzLnB1c2goJ2V4cGVyaW1lbnRhbC0nICsgdHlwZSlcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KG5hbWVzW2ldLCBhdHRyaWJzKVxuICAgICAgaWYgKGdsKSByZXR1cm4gZ2xcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBnbCA9IG51bGxcbiAgfVxuICByZXR1cm4gKGdsIHx8IG51bGwpIC8vIGVuc3VyZSBudWxsIG9uIGZhaWxcbn1cbiIsImltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbic7XG5pbXBvcnQgZ2V0Q2FudmFzQ29udGV4dCBmcm9tICdnZXQtY2FudmFzLWNvbnRleHQnO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhc0VsZW1lbnQgKCkge1xuICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJdCBhcHBlYXJzIHlvdSBhcmUgcnVuaW5nIGZyb20gTm9kZS5qcyBvciBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LiBUcnkgcGFzc2luZyBpbiBhbiBleGlzdGluZyB7IGNhbnZhcyB9IGludGVyZmFjZSBpbnN0ZWFkLicpO1xuICB9XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQ2FudmFzIChzZXR0aW5ncyA9IHt9KSB7XG4gIGxldCBjb250ZXh0LCBjYW52YXM7XG4gIGxldCBvd25zQ2FudmFzID0gZmFsc2U7XG4gIGlmIChzZXR0aW5ncy5jYW52YXMgIT09IGZhbHNlKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBjYW52YXMgYW5kIGNvbnRleHQgdG8gY3JlYXRlXG4gICAgY29udGV4dCA9IHNldHRpbmdzLmNvbnRleHQ7XG4gICAgaWYgKCFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IG5ld0NhbnZhcyA9IHNldHRpbmdzLmNhbnZhcztcbiAgICAgIGlmICghbmV3Q2FudmFzKSB7XG4gICAgICAgIG5ld0NhbnZhcyA9IGNyZWF0ZUNhbnZhc0VsZW1lbnQoKTtcbiAgICAgICAgb3duc0NhbnZhcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gY29udGV4dCB8fCAnMmQnO1xuICAgICAgaWYgKHR5cGVvZiBuZXdDYW52YXMuZ2V0Q29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzcGVjaWZpZWQgeyBjYW52YXMgfSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBnZXRDb250ZXh0KCkgZnVuY3Rpb24sIG1heWJlIGl0IGlzIG5vdCBhIDxjYW52YXM+IHRhZz9gKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQgPSBnZXRDYW52YXNDb250ZXh0KHR5cGUsIGFzc2lnbih7fSwgc2V0dGluZ3MuYXR0cmlidXRlcywgeyBjYW52YXM6IG5ld0NhbnZhcyB9KSk7XG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgYXQgY2FudmFzLmdldENvbnRleHQoJyR7dHlwZX0nKSAtIHRoZSBicm93c2VyIG1heSBub3Qgc3VwcG9ydCB0aGlzIGNvbnRleHQsIG9yIGEgZGlmZmVyZW50IGNvbnRleHQgbWF5IGFscmVhZHkgYmUgaW4gdXNlIHdpdGggdGhpcyBjYW52YXMuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FudmFzID0gY29udGV4dC5jYW52YXM7XG4gICAgLy8gRW5zdXJlIGNvbnRleHQgbWF0Y2hlcyB1c2VyJ3MgY2FudmFzIGV4cGVjdGF0aW9uc1xuICAgIGlmIChzZXR0aW5ncy5jYW52YXMgJiYgY2FudmFzICE9PSBzZXR0aW5ncy5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHsgY2FudmFzIH0gYW5kIHsgY29udGV4dCB9IHNldHRpbmdzIG11c3QgcG9pbnQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBjYW52YXMgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHBpeGVsYXRpb24gdG8gY2FudmFzIGlmIG5lY2Vzc2FyeSwgdGhpcyBpcyBtb3N0bHkgYSBjb252ZW5pZW5jZSB1dGlsaXR5XG4gICAgaWYgKHNldHRpbmdzLnBpeGVsYXRlZCkge1xuICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRleHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICBjb250ZXh0Lm9JbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRleHQud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICBjb250ZXh0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICBjYW52YXMuc3R5bGVbJ2ltYWdlLXJlbmRlcmluZyddID0gJ3BpeGVsYXRlZCc7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNhbnZhcywgY29udGV4dCwgb3duc0NhbnZhcyB9O1xufVxuIiwiaW1wb3J0IGFzc2lnbiBmcm9tICdvYmplY3QtYXNzaWduJztcbmltcG9ydCByaWdodE5vdyBmcm9tICdyaWdodC1ub3cnO1xuaW1wb3J0IGlzUHJvbWlzZSBmcm9tICdpcy1wcm9taXNlJztcbmltcG9ydCB7IGlzQnJvd3NlciwgZGVmaW5lZCwgaXNXZWJHTENvbnRleHQsIGlzQ2FudmFzLCBnZXRDbGllbnRBUEkgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCc7XG5pbXBvcnQge1xuICByZXNvbHZlRmlsZW5hbWUsXG4gIHNhdmVGaWxlLFxuICBzYXZlRGF0YVVSTCxcbiAgZ2V0VGltZVN0YW1wLFxuICBleHBvcnRDYW52YXMsXG4gIHN0cmVhbVN0YXJ0LFxuICBzdHJlYW1FbmRcbn0gZnJvbSAnLi4vc2F2ZSc7XG5pbXBvcnQgeyBjaGVja1NldHRpbmdzIH0gZnJvbSAnLi4vYWNjZXNzaWJpbGl0eSc7XG5cbmltcG9ydCBrZXlib2FyZFNob3J0Y3V0cyBmcm9tICcuL2tleWJvYXJkU2hvcnRjdXRzJztcbmltcG9ydCByZXNpemVDYW52YXMgZnJvbSAnLi9yZXNpemVDYW52YXMnO1xuaW1wb3J0IGNyZWF0ZUNhbnZhcyBmcm9tICcuL2NyZWF0ZUNhbnZhcyc7XG5cbmNsYXNzIFNrZXRjaE1hbmFnZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fc2V0dGluZ3MgPSB7fTtcbiAgICB0aGlzLl9wcm9wcyA9IHt9O1xuICAgIHRoaXMuX3NrZXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yYWYgPSBudWxsO1xuICAgIHRoaXMuX3JlY29yZFRpbWVvdXQgPSBudWxsO1xuXG4gICAgLy8gU29tZSBoYWNreSB0aGluZ3MgcmVxdWlyZWQgdG8gZ2V0IGFyb3VuZCBwNS5qcyBzdHJ1Y3R1cmVcbiAgICB0aGlzLl9sYXN0UmVkcmF3UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2lzUDVSZXNpemluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5fa2V5Ym9hcmRTaG9ydGN1dHMgPSBrZXlib2FyZFNob3J0Y3V0cyh7XG4gICAgICBlbmFibGVkOiAoKSA9PiB0aGlzLnNldHRpbmdzLmhvdGtleXMgIT09IGZhbHNlLFxuICAgICAgc2F2ZTogKGV2KSA9PiB7XG4gICAgICAgIGlmIChldi5zaGlmdEtleSkge1xuICAgICAgICAgIGlmICh0aGlzLnByb3BzLnJlY29yZGluZykge1xuICAgICAgICAgICAgdGhpcy5lbmRSZWNvcmQoKTtcbiAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMucmVjb3JkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucHJvcHMucmVjb3JkaW5nKSB7XG4gICAgICAgICAgdGhpcy5leHBvcnRGcmFtZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9nZ2xlUGxheTogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5wbGF5aW5nKSB0aGlzLnBhdXNlKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wbGF5KCk7XG4gICAgICB9LFxuICAgICAgY29tbWl0OiAoZXYpID0+IHtcbiAgICAgICAgdGhpcy5leHBvcnRGcmFtZSh7IGNvbW1pdDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2FuaW1hdGVIYW5kbGVyID0gKCkgPT4gdGhpcy5hbmltYXRlKCk7XG5cbiAgICB0aGlzLl9yZXNpemVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMucmVzaXplKCk7XG4gICAgICAvLyBPbmx5IHJlLXJlbmRlciB3aGVuIHNpemUgYWN0dWFsbHkgY2hhbmdlc1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZ2V0IHNrZXRjaCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NrZXRjaDtcbiAgfVxuXG4gIGdldCBzZXR0aW5ncyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICB9XG5cbiAgZ2V0IHByb3BzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHM7XG4gIH1cblxuICBfY29tcHV0ZVBsYXloZWFkIChjdXJyZW50VGltZSwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBoYXNEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZHVyYXRpb24pO1xuICAgIHJldHVybiBoYXNEdXJhdGlvbiA/IGN1cnJlbnRUaW1lIC8gZHVyYXRpb24gOiAwO1xuICB9XG5cbiAgX2NvbXB1dGVGcmFtZSAocGxheWhlYWQsIHRpbWUsIHRvdGFsRnJhbWVzLCBmcHMpIHtcbiAgICByZXR1cm4gKGlzRmluaXRlKHRvdGFsRnJhbWVzKSAmJiB0b3RhbEZyYW1lcyA+IDEpXG4gICAgICA/IE1hdGguZmxvb3IocGxheWhlYWQgKiAodG90YWxGcmFtZXMgLSAxKSlcbiAgICAgIDogTWF0aC5mbG9vcihmcHMgKiB0aW1lKTtcbiAgfVxuXG4gIF9jb21wdXRlQ3VycmVudEZyYW1lICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcHV0ZUZyYW1lKFxuICAgICAgdGhpcy5wcm9wcy5wbGF5aGVhZCwgdGhpcy5wcm9wcy50aW1lLFxuICAgICAgdGhpcy5wcm9wcy50b3RhbEZyYW1lcywgdGhpcy5wcm9wcy5mcHNcbiAgICApO1xuICB9XG5cbiAgX2dldFNpemVQcm9wcyAoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHByb3BzLmhlaWdodCxcbiAgICAgIHBpeGVsUmF0aW86IHByb3BzLnBpeGVsUmF0aW8sXG4gICAgICBjYW52YXNXaWR0aDogcHJvcHMuY2FudmFzV2lkdGgsXG4gICAgICBjYW52YXNIZWlnaHQ6IHByb3BzLmNhbnZhc0hlaWdodCxcbiAgICAgIHZpZXdwb3J0V2lkdGg6IHByb3BzLnZpZXdwb3J0V2lkdGgsXG4gICAgICB2aWV3cG9ydEhlaWdodDogcHJvcHMudmlld3BvcnRIZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcnVuICgpIHtcbiAgICBpZiAoIXRoaXMuc2tldGNoKSB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCB3YWl0IHVudGlsIHNrZXRjaCBpcyBsb2FkZWQgYmVmb3JlIHRyeWluZyB0byBwbGF5KCknKTtcblxuICAgIC8vIFN0YXJ0IGFuIGFuaW1hdGlvbiBmcmFtZSBsb29wIGlmIG5lY2Vzc2FyeVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnBsYXlpbmcgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG5cbiAgICAvLyBMZXQncyBsZXQgdGhpcyB3YXJuaW5nIGhhbmcgYXJvdW5kIGZvciBhIGZldyB2ZXJzaW9ucy4uLlxuICAgIGlmICh0eXBlb2YgdGhpcy5za2V0Y2guZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKCdJbiBjYW52YXMtc2tldGNoQDAuMC4yMyB0aGUgZGlzcG9zZSgpIGV2ZW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gdW5sb2FkKCknKTtcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIHdlIGFyZW4ndCBwbGF5aW5nIG9yIGFuaW1hdGVkLCBtYWtlIHN1cmUgd2Ugc3RpbGwgdHJpZ2dlciBiZWdpbiBtZXNzYWdlLi4uXG4gICAgaWYgKCF0aGlzLnByb3BzLnN0YXJ0ZWQpIHtcbiAgICAgIHRoaXMuX3NpZ25hbEJlZ2luKCk7XG4gICAgICB0aGlzLnByb3BzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBhbiBpbml0aWFsIGZyYW1lXG4gICAgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIF9jYW5jZWxUaW1lb3V0cyAoKSB7XG4gICAgaWYgKHRoaXMuX3JhZiAhPSBudWxsICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO1xuICAgICAgdGhpcy5fcmFmID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlY29yZFRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JlY29yZFRpbWVvdXQpO1xuICAgICAgdGhpcy5fcmVjb3JkVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcGxheSAoKSB7XG4gICAgbGV0IGFuaW1hdGUgPSB0aGlzLnNldHRpbmdzLmFuaW1hdGU7XG4gICAgaWYgKCdhbmltYXRpb24nIGluIHRoaXMuc2V0dGluZ3MpIHtcbiAgICAgIGFuaW1hdGUgPSB0cnVlO1xuICAgICAgY29uc29sZS53YXJuKCdbY2FudmFzLXNrZXRjaF0geyBhbmltYXRpb24gfSBoYXMgYmVlbiByZW5hbWVkIHRvIHsgYW5pbWF0ZSB9Jyk7XG4gICAgfVxuICAgIGlmICghYW5pbWF0ZSkgcmV0dXJuO1xuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tjYW52YXMtc2tldGNoXSBXQVJOOiBVc2luZyB7IGFuaW1hdGUgfSBpbiBOb2RlLmpzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLnBsYXlpbmcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucHJvcHMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5fc2lnbmFsQmVnaW4oKTtcbiAgICAgIHRoaXMucHJvcHMuc3RhcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3BsYXknLCB0aGlzLnByb3BzLnRpbWUpXG5cbiAgICAvLyBTdGFydCBhIHJlbmRlciBsb29wXG4gICAgdGhpcy5wcm9wcy5wbGF5aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jYW5jZWxUaW1lb3V0cygpO1xuICAgIHRoaXMuX2xhc3RUaW1lID0gcmlnaHROb3coKTtcbiAgICB0aGlzLl9yYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGVIYW5kbGVyKTtcbiAgfVxuXG4gIHBhdXNlICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5yZWNvcmRpbmcpIHRoaXMuZW5kUmVjb3JkKCk7XG4gICAgdGhpcy5wcm9wcy5wbGF5aW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jYW5jZWxUaW1lb3V0cygpO1xuICB9XG5cbiAgdG9nZ2xlUGxheSAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGxheWluZykgdGhpcy5wYXVzZSgpO1xuICAgIGVsc2UgdGhpcy5wbGF5KCk7XG4gIH1cblxuICAvLyBTdG9wIGFuZCByZXNldCB0byBmcmFtZSB6ZXJvXG4gIHN0b3AgKCkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLnByb3BzLmZyYW1lID0gMDtcbiAgICB0aGlzLnByb3BzLnBsYXloZWFkID0gMDtcbiAgICB0aGlzLnByb3BzLnRpbWUgPSAwO1xuICAgIHRoaXMucHJvcHMuZGVsdGFUaW1lID0gMDtcbiAgICB0aGlzLnByb3BzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcmVjb3JkICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5yZWNvcmRpbmcpIHJldHVybjtcbiAgICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbY2FudmFzLXNrZXRjaF0gV0FSTjogUmVjb3JkaW5nIGZyb20gTm9kZS5qcyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcCgpO1xuICAgIHRoaXMucHJvcHMucGxheWluZyA9IHRydWU7XG4gICAgdGhpcy5wcm9wcy5yZWNvcmRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgZXhwb3J0T3B0cyA9IHRoaXMuX2NyZWF0ZUV4cG9ydE9wdGlvbnMoeyBzZXF1ZW5jZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGZyYW1lSW50ZXJ2YWwgPSAxIC8gdGhpcy5wcm9wcy5mcHM7XG4gICAgLy8gUmVuZGVyIGVhY2ggZnJhbWUgaW4gdGhlIHNlcXVlbmNlXG4gICAgdGhpcy5fY2FuY2VsVGltZW91dHMoKTtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLnJlY29yZGluZykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5wcm9wcy5kZWx0YVRpbWUgPSBmcmFtZUludGVydmFsO1xuICAgICAgdGhpcy50aWNrKCk7XG4gICAgICByZXR1cm4gdGhpcy5leHBvcnRGcmFtZShleHBvcnRPcHRzKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnByb3BzLnJlY29yZGluZykgcmV0dXJuOyAvLyB3YXMgY2FuY2VsbGVkIGJlZm9yZVxuICAgICAgICAgIHRoaXMucHJvcHMuZGVsdGFUaW1lID0gMDtcbiAgICAgICAgICB0aGlzLnByb3BzLmZyYW1lKys7XG4gICAgICAgICAgaWYgKHRoaXMucHJvcHMuZnJhbWUgPCB0aGlzLnByb3BzLnRvdGFsRnJhbWVzKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnRpbWUgKz0gZnJhbWVJbnRlcnZhbDtcbiAgICAgICAgICAgIHRoaXMucHJvcHMucGxheWhlYWQgPSB0aGlzLl9jb21wdXRlUGxheWhlYWQodGhpcy5wcm9wcy50aW1lLCB0aGlzLnByb3BzLmR1cmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpY2ssIDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmluaXNoZWQgcmVjb3JkaW5nJyk7XG4gICAgICAgICAgICB0aGlzLl9zaWduYWxFbmQoKTtcbiAgICAgICAgICAgIHRoaXMuZW5kUmVjb3JkKCk7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVHJpZ2dlciBhIHN0YXJ0IGV2ZW50IGJlZm9yZSB3ZSBiZWdpbiByZWNvcmRpbmdcbiAgICBpZiAoIXRoaXMucHJvcHMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5fc2lnbmFsQmVnaW4oKTtcbiAgICAgIHRoaXMucHJvcHMuc3RhcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciAnYmVnaW4gcmVjb3JkJyBldmVudFxuICAgIGlmICh0aGlzLnNrZXRjaCAmJiB0eXBlb2YgdGhpcy5za2V0Y2guYmVnaW5SZWNvcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3dyYXBDb250ZXh0U2NhbGUocHJvcHMgPT4gdGhpcy5za2V0Y2guYmVnaW5SZWNvcmQocHJvcHMpKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWF0ZSBhIHN0cmVhbWluZyBzdGFydCBpZiBuZWNlc3NhcnlcbiAgICBzdHJlYW1TdGFydChleHBvcnRPcHRzKVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuX3JhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgICB9KTtcbiAgfVxuXG4gIF9zaWduYWxCZWdpbiAoKSB7XG4gICAgaWYgKHRoaXMuc2tldGNoICYmIHR5cGVvZiB0aGlzLnNrZXRjaC5iZWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fd3JhcENvbnRleHRTY2FsZShwcm9wcyA9PiB0aGlzLnNrZXRjaC5iZWdpbihwcm9wcykpO1xuICAgIH1cbiAgfVxuXG4gIF9zaWduYWxFbmQgKCkge1xuICAgIGlmICh0aGlzLnNrZXRjaCAmJiB0eXBlb2YgdGhpcy5za2V0Y2guZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl93cmFwQ29udGV4dFNjYWxlKHByb3BzID0+IHRoaXMuc2tldGNoLmVuZChwcm9wcykpO1xuICAgIH1cbiAgfVxuXG4gIGVuZFJlY29yZCAoKSB7XG4gICAgY29uc3Qgd2FzUmVjb3JkaW5nID0gdGhpcy5wcm9wcy5yZWNvcmRpbmc7XG5cbiAgICB0aGlzLl9jYW5jZWxUaW1lb3V0cygpO1xuICAgIHRoaXMucHJvcHMucmVjb3JkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wcm9wcy5kZWx0YVRpbWUgPSAwO1xuICAgIHRoaXMucHJvcHMucGxheWluZyA9IGZhbHNlO1xuXG4gICAgLy8gdGVsbCBDTEkgdGhhdCBzdHJlYW0gaGFzIGZpbmlzaGVkXG4gICAgcmV0dXJuIHN0cmVhbUVuZCgpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gVHJpZ2dlciAnZW5kIHJlY29yZCcgZXZlbnRcbiAgICAgICAgaWYgKHdhc1JlY29yZGluZyAmJiB0aGlzLnNrZXRjaCAmJiB0eXBlb2YgdGhpcy5za2V0Y2guZW5kUmVjb3JkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5fd3JhcENvbnRleHRTY2FsZShwcm9wcyA9PiB0aGlzLnNrZXRjaC5lbmRSZWNvcmQocHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBfY3JlYXRlRXhwb3J0T3B0aW9ucyAob3B0ID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VxdWVuY2U6IG9wdC5zZXF1ZW5jZSxcbiAgICAgIHNhdmU6IG9wdC5zYXZlLFxuICAgICAgZnBzOiB0aGlzLnByb3BzLmZwcyxcbiAgICAgIGZyYW1lOiBvcHQuc2VxdWVuY2UgPyB0aGlzLnByb3BzLmZyYW1lIDogdW5kZWZpbmVkLFxuICAgICAgZmlsZTogdGhpcy5zZXR0aW5ncy5maWxlLFxuICAgICAgbmFtZTogdGhpcy5zZXR0aW5ncy5uYW1lLFxuICAgICAgcHJlZml4OiB0aGlzLnNldHRpbmdzLnByZWZpeCxcbiAgICAgIHN1ZmZpeDogdGhpcy5zZXR0aW5ncy5zdWZmaXgsXG4gICAgICBlbmNvZGluZzogdGhpcy5zZXR0aW5ncy5lbmNvZGluZyxcbiAgICAgIGVuY29kaW5nUXVhbGl0eTogdGhpcy5zZXR0aW5ncy5lbmNvZGluZ1F1YWxpdHksXG4gICAgICB0aW1lU3RhbXA6IG9wdC50aW1lU3RhbXAgfHwgZ2V0VGltZVN0YW1wKCksXG4gICAgICB0b3RhbEZyYW1lczogaXNGaW5pdGUodGhpcy5wcm9wcy50b3RhbEZyYW1lcykgPyBNYXRoLm1heCgwLCB0aGlzLnByb3BzLnRvdGFsRnJhbWVzKSA6IDEwMDBcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0RnJhbWUgKG9wdCA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLnNrZXRjaCkgcmV0dXJuIFByb21pc2UuYWxsKFtdKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuc2tldGNoLnByZUV4cG9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5za2V0Y2gucHJlRXhwb3J0KCk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9ucyBmb3IgZXhwb3J0IGZ1bmN0aW9uXG4gICAgbGV0IGV4cG9ydE9wdHMgPSB0aGlzLl9jcmVhdGVFeHBvcnRPcHRpb25zKG9wdCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnRBUEkoKTtcbiAgICBsZXQgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChjbGllbnQgJiYgb3B0LmNvbW1pdCAmJiB0eXBlb2YgY2xpZW50LmNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgY29tbWl0T3B0cyA9IGFzc2lnbih7fSwgZXhwb3J0T3B0cyk7XG4gICAgICBjb25zdCBoYXNoID0gY2xpZW50LmNvbW1pdChjb21taXRPcHRzKTtcbiAgICAgIGlmIChpc1Byb21pc2UoaGFzaCkpIHAgPSBoYXNoO1xuICAgICAgZWxzZSBwID0gUHJvbWlzZS5yZXNvbHZlKGhhc2gpO1xuICAgIH1cblxuICAgIHJldHVybiBwLnRoZW4oaGFzaCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fZG9FeHBvcnRGcmFtZShhc3NpZ24oe30sIGV4cG9ydE9wdHMsIHsgaGFzaDogaGFzaCB8fCAnJyB9KSk7XG4gICAgfSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgLy8gTW9zdCBjb21tb24gdXNlY2FzZSBpcyB0byBleHBvcnQgYSBzaW5nbGUgbGF5ZXIsXG4gICAgICAvLyBzbyBsZXQncyBvcHRpbWl6ZSB0aGUgdXNlciBleHBlcmllbmNlIGZvciB0aGF0LlxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHJldHVybiByZXN1bHRbMF07XG4gICAgICBlbHNlIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBfZG9FeHBvcnRGcmFtZSAoZXhwb3J0T3B0cyA9IHt9KSB7XG4gICAgdGhpcy5fcHJvcHMuZXhwb3J0aW5nID0gdHJ1ZTtcblxuICAgIC8vIFJlc2l6ZSB0byBvdXRwdXQgcmVzb2x1dGlvblxuICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAvLyBEcmF3IGF0IHRoaXMgb3V0cHV0IHJlc29sdXRpb25cbiAgICBsZXQgZHJhd1Jlc3VsdCA9IHRoaXMucmVuZGVyKCk7XG5cbiAgICAvLyBUaGUgc2VsZiBvd25lZCBjYW52YXMgKG1heSBiZSB1bmRlZmluZWQuLi4hKVxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMucHJvcHMuY2FudmFzO1xuXG4gICAgLy8gR2V0IGxpc3Qgb2YgcmVzdWx0cyBmcm9tIHJlbmRlclxuICAgIGlmICh0eXBlb2YgZHJhd1Jlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRyYXdSZXN1bHQgPSBbIGNhbnZhcyBdO1xuICAgIH1cbiAgICBkcmF3UmVzdWx0ID0gW10uY29uY2F0KGRyYXdSZXN1bHQpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgY2FudmFzL2ZpbGUgZGVzY3JpcHRvcnMgaW50byBhIGNvbnNpc3RlbnQgZm9ybWF0LFxuICAgIC8vIGFuZCBwdWxsIG91dCBhbnkgZGF0YSBVUkxzIGZyb20gY2FudmFzIGVsZW1lbnRzXG4gICAgZHJhd1Jlc3VsdCA9IGRyYXdSZXN1bHQubWFwKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBoYXNEYXRhT2JqZWN0ID0gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmICgnZGF0YScgaW4gcmVzdWx0IHx8ICdkYXRhVVJMJyBpbiByZXN1bHQpO1xuICAgICAgY29uc3QgZGF0YSA9IGhhc0RhdGFPYmplY3QgPyByZXN1bHQuZGF0YSA6IHJlc3VsdDtcbiAgICAgIGNvbnN0IG9wdHMgPSBoYXNEYXRhT2JqZWN0ID8gYXNzaWduKHt9LCByZXN1bHQsIHsgZGF0YSB9KSA6IHsgZGF0YSB9O1xuICAgICAgaWYgKGlzQ2FudmFzKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IGVuY29kaW5nID0gb3B0cy5lbmNvZGluZyB8fCBleHBvcnRPcHRzLmVuY29kaW5nO1xuICAgICAgICBjb25zdCBlbmNvZGluZ1F1YWxpdHkgPSBkZWZpbmVkKG9wdHMuZW5jb2RpbmdRdWFsaXR5LCBleHBvcnRPcHRzLmVuY29kaW5nUXVhbGl0eSwgMC45NSk7XG4gICAgICAgIGNvbnN0IHsgZGF0YVVSTCwgZXh0ZW5zaW9uLCB0eXBlIH0gPSBleHBvcnRDYW52YXMoZGF0YSwgeyBlbmNvZGluZywgZW5jb2RpbmdRdWFsaXR5IH0pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvcHRzLCB7IGRhdGFVUkwsIGV4dGVuc2lvbiwgdHlwZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvcHRzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm93IHJldHVybiB0byByZWd1bGFyIHJlbmRlcmluZyBtb2RlXG4gICAgdGhpcy5fcHJvcHMuZXhwb3J0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZXNpemUoKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgLy8gQW5kIG5vdyB3ZSBjYW4gc2F2ZSBlYWNoIHJlc3VsdFxuICAgIHJldHVybiBQcm9taXNlLmFsbChkcmF3UmVzdWx0Lm1hcCgocmVzdWx0LCBpLCBsYXllckxpc3QpID0+IHtcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGlmIHJlbmRlcmluZyBtdWx0aXBsZSBsYXllcnMgd2Ugd2lsbCBnaXZlIHRoZW0gaW5kaWNlc1xuICAgICAgY29uc3QgY3VyT3B0ID0gYXNzaWduKHtcbiAgICAgICAgZXh0ZW5zaW9uOiAnJyxcbiAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgc3VmZml4OiAnJ1xuICAgICAgfSwgZXhwb3J0T3B0cywgcmVzdWx0LCB7XG4gICAgICAgIGxheWVyOiBpLFxuICAgICAgICB0b3RhbExheWVyczogbGF5ZXJMaXN0Lmxlbmd0aFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIGV4cG9ydCBpcyBleHBsaWNpdGx5IG5vdCBzYXZpbmcsIG1ha2Ugc3VyZSBub3RoaW5nIHNhdmVzXG4gICAgICAvLyBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgbGF5ZXIgc2F2ZSBvcHRpb24sIG9yIGZhbGxiYWNrIHRvIHRydWVcbiAgICAgIGNvbnN0IHNhdmVQYXJhbSA9IGV4cG9ydE9wdHMuc2F2ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHJlc3VsdC5zYXZlO1xuICAgICAgY3VyT3B0LnNhdmUgPSBzYXZlUGFyYW0gIT09IGZhbHNlO1xuXG4gICAgICAvLyBSZXNvbHZlIGEgZnVsbCBmaWxlbmFtZSBmcm9tIGFsbCB0aGUgb3B0aW9uc1xuICAgICAgY3VyT3B0LmZpbGVuYW1lID0gcmVzb2x2ZUZpbGVuYW1lKGN1ck9wdCk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHNvbWUgcGFyYW1ldGVycyB0aGF0IG1heSBiZSBhbWJpZ3VvdXMgdG8gdGhlIHVzZXJcbiAgICAgIGRlbGV0ZSBjdXJPcHQuZW5jb2Rpbmc7XG4gICAgICBkZWxldGUgY3VyT3B0LmVuY29kaW5nUXVhbGl0eTtcblxuICAgICAgLy8gQ2xlYW4gaXQgdXAgZnVydGhlciBieSBqdXN0IHJlbW92aW5nIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGZvciAobGV0IGsgaW4gY3VyT3B0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY3VyT3B0W2tdID09PSAndW5kZWZpbmVkJykgZGVsZXRlIGN1ck9wdFtrXTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNhdmVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgIGlmIChjdXJPcHQuc2F2ZSkge1xuICAgICAgICAvLyBXaGV0aGVyIHRvIGFjdHVhbGx5IHNhdmUgKGRvd25sb2FkKSB0aGlzIGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdXJPcHQuZGF0YTtcbiAgICAgICAgaWYgKGN1ck9wdC5kYXRhVVJMKSB7XG4gICAgICAgICAgY29uc3QgZGF0YVVSTCA9IGN1ck9wdC5kYXRhVVJMO1xuICAgICAgICAgIHNhdmVQcm9taXNlID0gc2F2ZURhdGFVUkwoZGF0YVVSTCwgY3VyT3B0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYXZlUHJvbWlzZSA9IHNhdmVGaWxlKGRhdGEsIGN1ck9wdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzYXZlUHJvbWlzZS50aGVuKHNhdmVSZXN1bHQgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY3VyT3B0LCBzYXZlUmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pKS50aGVuKGV2ID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkRXZlbnRzID0gZXYuZmlsdGVyKGUgPT4gZS5zYXZlKTtcbiAgICAgIGlmIChzYXZlZEV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIExvZyB0aGUgc2F2ZWQgZXhwb3J0c1xuICAgICAgICBjb25zdCBldmVudFdpdGhPdXRwdXQgPSBzYXZlZEV2ZW50cy5maW5kKGUgPT4gZS5vdXRwdXROYW1lKTtcbiAgICAgICAgY29uc3QgaXNDbGllbnQgPSBzYXZlZEV2ZW50cy5zb21lKGUgPT4gZS5jbGllbnQpO1xuICAgICAgICBjb25zdCBpc1N0cmVhbWluZyA9IHNhdmVkRXZlbnRzLnNvbWUoZSA9PiBlLnN0cmVhbSk7XG4gICAgICAgIGxldCBpdGVtO1xuICAgICAgICAvLyBtYW55IGZpbGVzLCBqdXN0IGxvZyBob3cgbWFueSB3ZXJlIGV4cG9ydGVkXG4gICAgICAgIGlmIChzYXZlZEV2ZW50cy5sZW5ndGggPiAxKSBpdGVtID0gc2F2ZWRFdmVudHMubGVuZ3RoO1xuICAgICAgICAvLyBpbiBDTEksIHdlIGtub3cgZXhhY3QgcGF0aCBkaXJuYW1lXG4gICAgICAgIGVsc2UgaWYgKGV2ZW50V2l0aE91dHB1dCkgaXRlbSA9IGAke2V2ZW50V2l0aE91dHB1dC5vdXRwdXROYW1lfS8ke3NhdmVkRXZlbnRzWzBdLmZpbGVuYW1lfWA7XG4gICAgICAgIC8vIGluIGJyb3dzZXIsIHdlIGNhbiBvbmx5IGtub3cgaXQgd2VudCB0byBcImJyb3dzZXIgZG93bmxvYWQgZm9sZGVyXCJcbiAgICAgICAgZWxzZSBpdGVtID0gYCR7c2F2ZWRFdmVudHNbMF0uZmlsZW5hbWV9YDtcbiAgICAgICAgbGV0IG9mU2VxID0gJyc7XG4gICAgICAgIGlmIChleHBvcnRPcHRzLnNlcXVlbmNlKSB7XG4gICAgICAgICAgY29uc3QgaGFzVG90YWxGcmFtZXMgPSBpc0Zpbml0ZSh0aGlzLnByb3BzLnRvdGFsRnJhbWVzKTtcbiAgICAgICAgICBvZlNlcSA9IGhhc1RvdGFsRnJhbWVzID8gYCAoZnJhbWUgJHtleHBvcnRPcHRzLmZyYW1lICsgMX0gLyAke3RoaXMucHJvcHMudG90YWxGcmFtZXN9KWAgOiBgIChmcmFtZSAke2V4cG9ydE9wdHMuZnJhbWV9KWA7XG4gICAgICAgIH0gZWxzZSBpZiAoc2F2ZWRFdmVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG9mU2VxID0gYCBmaWxlc2A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xpZW50ID0gaXNDbGllbnQgPyAnY2FudmFzLXNrZXRjaC1jbGknIDogJ2NhbnZhcy1za2V0Y2gnO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBpc1N0cmVhbWluZyA/ICdTdHJlYW1pbmcgaW50bycgOiAnRXhwb3J0ZWQnO1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbJHtjbGllbnR9XSVjICR7YWN0aW9ufSAlYyR7aXRlbX0lYyR7b2ZTZXF9YCwgJ2NvbG9yOiAjOGU4ZThlOycsICdjb2xvcjogaW5pdGlhbDsnLCAnZm9udC13ZWlnaHQ6IGJvbGQ7JywgJ2ZvbnQtd2VpZ2h0OiBpbml0aWFsOycpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnNrZXRjaC5wb3N0RXhwb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuc2tldGNoLnBvc3RFeHBvcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBldjtcbiAgICB9KTtcbiAgfVxuXG4gIF93cmFwQ29udGV4dFNjYWxlIChjYikge1xuICAgIHRoaXMuX3ByZVJlbmRlcigpO1xuICAgIGNiKHRoaXMucHJvcHMpO1xuICAgIHRoaXMuX3Bvc3RSZW5kZXIoKTtcbiAgfVxuXG4gIF9wcmVSZW5kZXIgKCkge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFNjYWxlIGNvbnRleHQgZm9yIHVuaXQgc2l6aW5nXG4gICAgaWYgKCF0aGlzLnByb3BzLmdsICYmIHByb3BzLmNvbnRleHQgJiYgIXByb3BzLnA1KSB7XG4gICAgICBwcm9wcy5jb250ZXh0LnNhdmUoKTtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNjYWxlQ29udGV4dCAhPT0gZmFsc2UpIHtcbiAgICAgICAgcHJvcHMuY29udGV4dC5zY2FsZShwcm9wcy5zY2FsZVgsIHByb3BzLnNjYWxlWSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wcy5wNSkge1xuICAgICAgcHJvcHMucDUuc2NhbGUocHJvcHMuc2NhbGVYIC8gcHJvcHMucGl4ZWxSYXRpbywgcHJvcHMuc2NhbGVZIC8gcHJvcHMucGl4ZWxSYXRpbyk7XG4gICAgfVxuICB9XG5cbiAgX3Bvc3RSZW5kZXIgKCkge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghdGhpcy5wcm9wcy5nbCAmJiBwcm9wcy5jb250ZXh0ICYmICFwcm9wcy5wNSkge1xuICAgICAgcHJvcHMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYnkgZGVmYXVsdCwgdGhpcyBtYXkgYmUgcmV2aXNpdGVkIGF0IGEgbGF0ZXIgcG9pbnQuXG4gICAgLy8gV2UgZG8gdGhpcyB0byBlbnN1cmUgdG9EYXRhVVJMIGNhbiBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIuXG4gICAgLy8gTW9zdCBsaWtlbHkgYnJvd3NlcnMgYWxyZWFkeSBoYW5kbGUgdGhpcywgc28gd2UgbWF5IHJldmlzaXQgdGhpcyBhbmRcbiAgICAvLyByZW1vdmUgaXQgaWYgaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugd2l0aG91dCBhbnkgdXNhYmlsaXR5IGlzc3Vlcy5cbiAgICBpZiAocHJvcHMuZ2wgJiYgdGhpcy5zZXR0aW5ncy5mbHVzaCAhPT0gZmFsc2UgJiYgIXByb3BzLnA1KSB7XG4gICAgICBwcm9wcy5nbC5mbHVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIHRpY2sgKCkge1xuICAgIGlmICh0aGlzLnNrZXRjaCAmJiB0eXBlb2YgdGhpcy5za2V0Y2gudGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fcHJlUmVuZGVyKCk7XG4gICAgICB0aGlzLnNrZXRjaC50aWNrKHRoaXMucHJvcHMpO1xuICAgICAgdGhpcy5fcG9zdFJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucDUpIHtcbiAgICAgIHRoaXMuX2xhc3RSZWRyYXdSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnByb3BzLnA1LnJlZHJhdygpO1xuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZWRyYXdSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnN1Ym1pdERyYXdDYWxsKCk7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0RHJhd0NhbGwgKCkge1xuICAgIGlmICghdGhpcy5za2V0Y2gpIHJldHVybjtcblxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLl9wcmVSZW5kZXIoKTtcblxuICAgIGxldCBkcmF3UmVzdWx0O1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNrZXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZHJhd1Jlc3VsdCA9IHRoaXMuc2tldGNoKHByb3BzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnNrZXRjaC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRyYXdSZXN1bHQgPSB0aGlzLnNrZXRjaC5yZW5kZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHRoaXMuX3Bvc3RSZW5kZXIoKTtcblxuICAgIHJldHVybiBkcmF3UmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlIChvcHQgPSB7fSkge1xuICAgIC8vIEN1cnJlbnRseSB1cGRhdGUoKSBpcyBvbmx5IGZvY3VzZWQgb24gcmVzaXppbmcsXG4gICAgLy8gYnV0IGxhdGVyIHdlIHdpbGwgc3VwcG9ydCBvdGhlciBvcHRpb25zIGxpa2Ugc3dpdGNoaW5nXG4gICAgLy8gZnJhbWVzIGFuZCBzdWNoLlxuICAgIGNvbnN0IG5vdFlldFN1cHBvcnRlZCA9IFtcbiAgICAgICdhbmltYXRlJ1xuICAgIF07XG5cbiAgICBPYmplY3Qua2V5cyhvcHQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChub3RZZXRTdXBwb3J0ZWQuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3JyeSwgdGhlIHsgJHtrZXl9IH0gb3B0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHdpdGggdXBkYXRlKCkuYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbGRDYW52YXMgPSB0aGlzLl9zZXR0aW5ncy5jYW52YXM7XG4gICAgY29uc3Qgb2xkQ29udGV4dCA9IHRoaXMuX3NldHRpbmdzLmNvbnRleHQ7XG5cbiAgICAvLyBNZXJnZSBuZXcgb3B0aW9ucyBpbnRvIHNldHRpbmdzXG4gICAgZm9yIChsZXQga2V5IGluIG9wdCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7IC8vIGlnbm9yZSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5fc2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIGluIHRpbWUgcHJvcHNcbiAgICBjb25zdCB0aW1lT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3NldHRpbmdzLCBvcHQpO1xuICAgIGlmICgndGltZScgaW4gb3B0ICYmICdmcmFtZScgaW4gb3B0KSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgc3BlY2lmeSB7IHRpbWUgfSBvciB7IGZyYW1lIH0gYnV0IG5vdCBib3RoJyk7XG4gICAgZWxzZSBpZiAoJ3RpbWUnIGluIG9wdCkgZGVsZXRlIHRpbWVPcHRzLmZyYW1lO1xuICAgIGVsc2UgaWYgKCdmcmFtZScgaW4gb3B0KSBkZWxldGUgdGltZU9wdHMudGltZTtcbiAgICBpZiAoJ2R1cmF0aW9uJyBpbiBvcHQgJiYgJ3RvdGFsRnJhbWVzJyBpbiBvcHQpIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBzcGVjaWZ5IHsgZHVyYXRpb24gfSBvciB7IHRvdGFsRnJhbWVzIH0gYnV0IG5vdCBib3RoJyk7XG4gICAgZWxzZSBpZiAoJ2R1cmF0aW9uJyBpbiBvcHQpIGRlbGV0ZSB0aW1lT3B0cy50b3RhbEZyYW1lcztcbiAgICBlbHNlIGlmICgndG90YWxGcmFtZXMnIGluIG9wdCkgZGVsZXRlIHRpbWVPcHRzLmR1cmF0aW9uO1xuXG4gICAgLy8gTWVyZ2UgaW4gdXNlciBkYXRhIHdpdGhvdXQgY29weWluZ1xuICAgIGlmICgnZGF0YScgaW4gb3B0KSB0aGlzLl9wcm9wcy5kYXRhID0gb3B0LmRhdGE7XG5cbiAgICBjb25zdCB0aW1lUHJvcHMgPSB0aGlzLmdldFRpbWVQcm9wcyh0aW1lT3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9wcm9wcywgdGltZVByb3BzKTtcblxuICAgIC8vIElmIGVpdGhlciBjYW52YXMgb3IgY29udGV4dCBpcyBjaGFuZ2VkLCB3ZSBzaG91bGQgcmUtdXBkYXRlXG4gICAgaWYgKG9sZENhbnZhcyAhPT0gdGhpcy5fc2V0dGluZ3MuY2FudmFzIHx8IG9sZENvbnRleHQgIT09IHRoaXMuX3NldHRpbmdzLmNvbnRleHQpIHtcbiAgICAgIGNvbnN0IHsgY2FudmFzLCBjb250ZXh0IH0gPSBjcmVhdGVDYW52YXModGhpcy5fc2V0dGluZ3MpO1xuXG4gICAgICB0aGlzLnByb3BzLmNhbnZhcyA9IGNhbnZhcztcbiAgICAgIHRoaXMucHJvcHMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAgIC8vIERlbGV0ZSBvciBhZGQgYSAnZ2wnIHByb3AgZm9yIGNvbnZlbmllbmNlXG4gICAgICB0aGlzLl9zZXR1cEdMS2V5KCk7XG5cbiAgICAgIC8vIFJlLW1vdW50IHRoZSBuZXcgY2FudmFzIGlmIGl0IGhhcyBubyBwYXJlbnRcbiAgICAgIHRoaXMuX2FwcGVuZENhbnZhc0lmTmVlZGVkKCk7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHN1cHBvcnQgUDUuanNcbiAgICBpZiAob3B0LnA1ICYmIHR5cGVvZiBvcHQucDUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMucHJvcHMucDUgPSBvcHQucDU7XG4gICAgICB0aGlzLnByb3BzLnA1LmRyYXcgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1A1UmVzaXppbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbGFzdFJlZHJhd1Jlc3VsdCA9IHRoaXMuc3VibWl0RHJhd0NhbGwoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHBsYXlpbmcgc3RhdGUgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKCdwbGF5aW5nJyBpbiBvcHQpIHtcbiAgICAgIGlmIChvcHQucGxheWluZykgdGhpcy5wbGF5KCk7XG4gICAgICBlbHNlIHRoaXMucGF1c2UoKTtcbiAgICB9XG5cbiAgICBjaGVja1NldHRpbmdzKHRoaXMuX3NldHRpbmdzKTtcblxuICAgIC8vIERyYXcgbmV3IGZyYW1lXG4gICAgdGhpcy5yZXNpemUoKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHJldHVybiB0aGlzLnByb3BzO1xuICB9XG5cbiAgcmVzaXplICgpIHtcbiAgICBjb25zdCBvbGRTaXplcyA9IHRoaXMuX2dldFNpemVQcm9wcygpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzO1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFJlY29tcHV0ZSBuZXcgcHJvcGVydGllcyBiYXNlZCBvbiBjdXJyZW50IHNldHVwXG4gICAgY29uc3QgbmV3UHJvcHMgPSByZXNpemVDYW52YXMocHJvcHMsIHNldHRpbmdzKTtcblxuICAgIC8vIEFzc2lnbiB0byBjdXJyZW50IHByb3BzXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9wcm9wcywgbmV3UHJvcHMpO1xuXG4gICAgLy8gTm93IHdlIGFjdHVhbGx5IHVwZGF0ZSB0aGUgY2FudmFzIHdpZHRoL2hlaWdodCBhbmQgc3R5bGUgcHJvcHNcbiAgICBjb25zdCB7XG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgY2FudmFzV2lkdGgsXG4gICAgICBjYW52YXNIZWlnaHQsXG4gICAgICBzdHlsZVdpZHRoLFxuICAgICAgc3R5bGVIZWlnaHRcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFVwZGF0ZSBjYW52YXMgc2V0dGluZ3NcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLnByb3BzLmNhbnZhcztcbiAgICBpZiAoY2FudmFzICYmIHNldHRpbmdzLnJlc2l6ZUNhbnZhcyAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChwcm9wcy5wNSkge1xuICAgICAgICAvLyBQNS5qcyBzcGVjaWZpYyBlZGdlIGNhc2VcbiAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gY2FudmFzV2lkdGggfHwgY2FudmFzLmhlaWdodCAhPT0gY2FudmFzSGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5faXNQNVJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgICAvLyBUaGlzIGNhdXNlcyBhIHJlLWRyYXcgOlxcIHNvIHdlIGlnbm9yZSBkcmF3cyBpbiB0aGUgbWVhbiB0aW1lLi4uIHNvcnRhIGhhY2t5XG4gICAgICAgICAgcHJvcHMucDUucGl4ZWxEZW5zaXR5KHBpeGVsUmF0aW8pO1xuICAgICAgICAgIHByb3BzLnA1LnJlc2l6ZUNhbnZhcyhjYW52YXNXaWR0aCAvIHBpeGVsUmF0aW8sIGNhbnZhc0hlaWdodCAvIHBpeGVsUmF0aW8sIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLl9pc1A1UmVzaXppbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yY2UgY2FudmFzIHNpemVcbiAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gY2FudmFzV2lkdGgpIGNhbnZhcy53aWR0aCA9IGNhbnZhc1dpZHRoO1xuICAgICAgICBpZiAoY2FudmFzLmhlaWdodCAhPT0gY2FudmFzSGVpZ2h0KSBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIGNhbnZhcyBzdHlsZVxuICAgICAgaWYgKGlzQnJvd3NlcigpICYmIHNldHRpbmdzLnN0eWxlQ2FudmFzICE9PSBmYWxzZSkge1xuICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtzdHlsZVdpZHRofXB4YDtcbiAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3N0eWxlSGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXdTaXplcyA9IHRoaXMuX2dldFNpemVQcm9wcygpO1xuICAgIGxldCBjaGFuZ2VkID0gIWRlZXBFcXVhbChvbGRTaXplcywgbmV3U2l6ZXMpO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9zaXplQ2hhbmdlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIF9zaXplQ2hhbmdlZCAoKSB7XG4gICAgLy8gU2VuZCByZXNpemUgZXZlbnQgdG8gc2tldGNoXG4gICAgaWYgKHRoaXMuc2tldGNoICYmIHR5cGVvZiB0aGlzLnNrZXRjaC5yZXNpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuc2tldGNoLnJlc2l6ZSh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cblxuICBhbmltYXRlICgpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMucGxheWluZykgcmV0dXJuO1xuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tjYW52YXMtc2tldGNoXSBXQVJOOiBBbmltYXRpb24gaW4gTm9kZS5qcyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGVIYW5kbGVyKTtcblxuICAgIGxldCBub3cgPSByaWdodE5vdygpO1xuXG4gICAgY29uc3QgZnBzID0gdGhpcy5wcm9wcy5mcHM7XG4gICAgY29uc3QgZnJhbWVJbnRlcnZhbE1TID0gMTAwMCAvIGZwcztcbiAgICBsZXQgZGVsdGFUaW1lTVMgPSBub3cgLSB0aGlzLl9sYXN0VGltZTtcblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5wcm9wcy5kdXJhdGlvbjtcbiAgICBjb25zdCBoYXNEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZHVyYXRpb24pO1xuXG4gICAgbGV0IGlzTmV3RnJhbWUgPSB0cnVlO1xuICAgIGNvbnN0IHBsYXliYWNrUmF0ZSA9IHRoaXMuc2V0dGluZ3MucGxheWJhY2tSYXRlO1xuICAgIGlmIChwbGF5YmFja1JhdGUgPT09ICdmaXhlZCcpIHtcbiAgICAgIGRlbHRhVGltZU1TID0gZnJhbWVJbnRlcnZhbE1TO1xuICAgIH0gZWxzZSBpZiAocGxheWJhY2tSYXRlID09PSAndGhyb3R0bGUnKSB7XG4gICAgICBpZiAoZGVsdGFUaW1lTVMgPiBmcmFtZUludGVydmFsTVMpIHtcbiAgICAgICAgbm93ID0gbm93IC0gKGRlbHRhVGltZU1TICUgZnJhbWVJbnRlcnZhbE1TKTtcbiAgICAgICAgdGhpcy5fbGFzdFRpbWUgPSBub3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc05ld0ZyYW1lID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xhc3RUaW1lID0gbm93O1xuICAgIH1cblxuICAgIGNvbnN0IGRlbHRhVGltZSA9IGRlbHRhVGltZU1TIC8gMTAwMDtcbiAgICBsZXQgbmV3VGltZSA9IHRoaXMucHJvcHMudGltZSArIGRlbHRhVGltZSAqIHRoaXMucHJvcHMudGltZVNjYWxlO1xuXG4gICAgLy8gSGFuZGxlIHJldmVyc2UgdGltZSBzY2FsZVxuICAgIGlmIChuZXdUaW1lIDwgMCAmJiBoYXNEdXJhdGlvbikge1xuICAgICAgbmV3VGltZSA9IGR1cmF0aW9uICsgbmV3VGltZTtcbiAgICB9XG5cbiAgICAvLyBSZS1zdGFydCBhbmltYXRpb25cbiAgICBsZXQgaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCBpc0xvb3BTdGFydCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbG9vcGluZyA9IHRoaXMuc2V0dGluZ3MubG9vcCAhPT0gZmFsc2U7XG5cbiAgICBpZiAoaGFzRHVyYXRpb24gJiYgbmV3VGltZSA+PSBkdXJhdGlvbikge1xuICAgICAgLy8gUmUtc3RhcnQgYW5pbWF0aW9uXG4gICAgICBpZiAobG9vcGluZykge1xuICAgICAgICBpc05ld0ZyYW1lID0gdHJ1ZTtcbiAgICAgICAgbmV3VGltZSA9IG5ld1RpbWUgJSBkdXJhdGlvbjtcbiAgICAgICAgaXNMb29wU3RhcnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNOZXdGcmFtZSA9IGZhbHNlO1xuICAgICAgICBuZXdUaW1lID0gZHVyYXRpb247XG4gICAgICAgIGlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zaWduYWxFbmQoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOZXdGcmFtZSkge1xuICAgICAgdGhpcy5wcm9wcy5kZWx0YVRpbWUgPSBkZWx0YVRpbWU7XG4gICAgICB0aGlzLnByb3BzLnRpbWUgPSBuZXdUaW1lO1xuICAgICAgdGhpcy5wcm9wcy5wbGF5aGVhZCA9IHRoaXMuX2NvbXB1dGVQbGF5aGVhZChuZXdUaW1lLCBkdXJhdGlvbik7XG4gICAgICBjb25zdCBsYXN0RnJhbWUgPSB0aGlzLnByb3BzLmZyYW1lO1xuICAgICAgdGhpcy5wcm9wcy5mcmFtZSA9IHRoaXMuX2NvbXB1dGVDdXJyZW50RnJhbWUoKTtcbiAgICAgIGlmIChpc0xvb3BTdGFydCkgdGhpcy5fc2lnbmFsQmVnaW4oKTtcbiAgICAgIGlmIChsYXN0RnJhbWUgIT09IHRoaXMucHJvcHMuZnJhbWUpIHRoaXMudGljaygpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHRoaXMucHJvcHMuZGVsdGFUaW1lID0gMDtcbiAgICB9XG5cbiAgICBpZiAoaXNGaW5pc2hlZCkge1xuICAgICAgdGhpcy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRpc3BhdGNoIChjYikge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcignbXVzdCBwYXNzIGZ1bmN0aW9uIGludG8gZGlzcGF0Y2goKScpO1xuICAgIGNiKHRoaXMucHJvcHMpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBtb3VudCAoKSB7XG4gICAgdGhpcy5fYXBwZW5kQ2FudmFzSWZOZWVkZWQoKTtcbiAgfVxuXG4gIHVubW91bnQgKCkge1xuICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5fa2V5Ym9hcmRTaG9ydGN1dHMuZGV0YWNoKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLmNhbnZhcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLnByb3BzLmNhbnZhcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMucHJvcHMuY2FudmFzKTtcbiAgICB9XG4gIH1cblxuICBfYXBwZW5kQ2FudmFzSWZOZWVkZWQgKCkge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5wYXJlbnQgIT09IGZhbHNlICYmICh0aGlzLnByb3BzLmNhbnZhcyAmJiAhdGhpcy5wcm9wcy5jYW52YXMucGFyZW50RWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRQYXJlbnQgPSB0aGlzLnNldHRpbmdzLnBhcmVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgZGVmYXVsdFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmNhbnZhcyk7XG4gICAgfVxuICB9XG5cbiAgX3NldHVwR0xLZXkgKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmNvbnRleHQpIHtcbiAgICAgIGlmIChpc1dlYkdMQ29udGV4dCh0aGlzLnByb3BzLmNvbnRleHQpKSB7XG4gICAgICAgIHRoaXMuX3Byb3BzLmdsID0gdGhpcy5wcm9wcy5jb250ZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3Byb3BzLmdsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFRpbWVQcm9wcyAoc2V0dGluZ3MgPSB7fSkge1xuICAgIC8vIEdldCB0aW1pbmcgZGF0YVxuICAgIGxldCBkdXJhdGlvbiA9IHNldHRpbmdzLmR1cmF0aW9uO1xuICAgIGxldCB0b3RhbEZyYW1lcyA9IHNldHRpbmdzLnRvdGFsRnJhbWVzO1xuICAgIGNvbnN0IHRpbWVTY2FsZSA9IGRlZmluZWQoc2V0dGluZ3MudGltZVNjYWxlLCAxKTtcbiAgICBjb25zdCBmcHMgPSBkZWZpbmVkKHNldHRpbmdzLmZwcywgMjQpO1xuICAgIGNvbnN0IGhhc0R1cmF0aW9uID0gdHlwZW9mIGR1cmF0aW9uID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkdXJhdGlvbik7XG4gICAgY29uc3QgaGFzVG90YWxGcmFtZXMgPSB0eXBlb2YgdG90YWxGcmFtZXMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHRvdGFsRnJhbWVzKTtcblxuICAgIGNvbnN0IHRvdGFsRnJhbWVzRnJvbUR1cmF0aW9uID0gaGFzRHVyYXRpb24gPyBNYXRoLmZsb29yKGZwcyAqIGR1cmF0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkdXJhdGlvbkZyb21Ub3RhbEZyYW1lcyA9IGhhc1RvdGFsRnJhbWVzID8gKHRvdGFsRnJhbWVzIC8gZnBzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoaGFzRHVyYXRpb24gJiYgaGFzVG90YWxGcmFtZXMgJiYgdG90YWxGcmFtZXNGcm9tRHVyYXRpb24gIT09IHRvdGFsRnJhbWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgc3BlY2lmeSBlaXRoZXIgZHVyYXRpb24gb3IgdG90YWxGcmFtZXMsIGJ1dCBub3QgYm90aC4gT3IsIHRoZXkgbXVzdCBtYXRjaCBleGFjdGx5LicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZGltZW5zaW9ucyA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNldHRpbmdzLnVuaXRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS53YXJuKGBZb3UndmUgc3BlY2lmaWVkIGEgeyB1bml0cyB9IHNldHRpbmcgYnV0IG5vIHsgZGltZW5zaW9uIH0sIHNvIHRoZSB1bml0cyB3aWxsIGJlIGlnbm9yZWQuYCk7XG4gICAgfVxuXG4gICAgdG90YWxGcmFtZXMgPSBkZWZpbmVkKHRvdGFsRnJhbWVzLCB0b3RhbEZyYW1lc0Zyb21EdXJhdGlvbiwgSW5maW5pdHkpO1xuICAgIGR1cmF0aW9uID0gZGVmaW5lZChkdXJhdGlvbiwgZHVyYXRpb25Gcm9tVG90YWxGcmFtZXMsIEluZmluaXR5KTtcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHNldHRpbmdzLnRpbWU7XG4gICAgY29uc3Qgc3RhcnRGcmFtZSA9IHNldHRpbmdzLmZyYW1lO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGltZSA9IHR5cGVvZiBzdGFydFRpbWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHN0YXJ0VGltZSk7XG4gICAgY29uc3QgaGFzU3RhcnRGcmFtZSA9IHR5cGVvZiBzdGFydEZyYW1lID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShzdGFydEZyYW1lKTtcblxuICAgIC8vIHN0YXJ0IGF0IHplcm8gdW5sZXNzIHVzZXIgc3BlY2lmaWVzIGZyYW1lIG9yIHRpbWUgKGJ1dCBub3QgYm90aCBtaXNtYXRjaGVkKVxuICAgIGxldCB0aW1lID0gMDtcbiAgICBsZXQgZnJhbWUgPSAwO1xuICAgIGxldCBwbGF5aGVhZCA9IDA7XG4gICAgaWYgKGhhc1N0YXJ0VGltZSAmJiBoYXNTdGFydEZyYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBzaG91bGQgc3BlY2lmeSBlaXRoZXIgc3RhcnQgZnJhbWUgb3IgdGltZSwgYnV0IG5vdCBib3RoLicpO1xuICAgIH0gZWxzZSBpZiAoaGFzU3RhcnRUaW1lKSB7XG4gICAgICAvLyBVc2VyIHNwZWNpZmllcyB0aW1lLCB3ZSBpbmZlciBmcmFtZXMgZnJvbSBGUFNcbiAgICAgIHRpbWUgPSBzdGFydFRpbWU7XG4gICAgICBwbGF5aGVhZCA9IHRoaXMuX2NvbXB1dGVQbGF5aGVhZCh0aW1lLCBkdXJhdGlvbik7XG4gICAgICBmcmFtZSA9IHRoaXMuX2NvbXB1dGVGcmFtZShcbiAgICAgICAgcGxheWhlYWQsIHRpbWUsXG4gICAgICAgIHRvdGFsRnJhbWVzLCBmcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChoYXNTdGFydEZyYW1lKSB7XG4gICAgICAvLyBVc2VyIHNwZWNpZmllcyBmcmFtZSBudW1iZXIsIHdlIGluZmVyIHRpbWUgZnJvbSBGUFNcbiAgICAgIGZyYW1lID0gc3RhcnRGcmFtZTtcbiAgICAgIHRpbWUgPSBmcmFtZSAvIGZwcztcbiAgICAgIHBsYXloZWFkID0gdGhpcy5fY29tcHV0ZVBsYXloZWFkKHRpbWUsIGR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGxheWhlYWQsXG4gICAgICB0aW1lLFxuICAgICAgZnJhbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIHRvdGFsRnJhbWVzLFxuICAgICAgZnBzLFxuICAgICAgdGltZVNjYWxlXG4gICAgfTtcbiAgfVxuXG4gIHNldHVwIChzZXR0aW5ncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuc2tldGNoKSB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHNldHVwKCkgY2FsbHMgbm90IHlldCBzdXBwb3J0ZWQuJyk7XG5cbiAgICB0aGlzLl9zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHNldHRpbmdzLCB0aGlzLl9zZXR0aW5ncyk7XG5cbiAgICBjaGVja1NldHRpbmdzKHRoaXMuX3NldHRpbmdzKTtcblxuICAgIC8vIEdldCBpbml0aWFsIGNhbnZhcyAmIGNvbnRleHRcbiAgICBjb25zdCB7IGNvbnRleHQsIGNhbnZhcyB9ID0gY3JlYXRlQ2FudmFzKHRoaXMuX3NldHRpbmdzKTtcblxuICAgIGNvbnN0IHRpbWVQcm9wcyA9IHRoaXMuZ2V0VGltZVByb3BzKHRoaXMuX3NldHRpbmdzKTtcblxuICAgIC8vIEluaXRpYWwgcmVuZGVyIHN0YXRlIGZlYXR1cmVzXG4gICAgdGhpcy5fcHJvcHMgPSB7XG4gICAgICAuLi50aW1lUHJvcHMsXG4gICAgICBjYW52YXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgZGVsdGFUaW1lOiAwLFxuICAgICAgc3RhcnRlZDogZmFsc2UsXG4gICAgICBleHBvcnRpbmc6IGZhbHNlLFxuICAgICAgcGxheWluZzogZmFsc2UsXG4gICAgICByZWNvcmRpbmc6IGZhbHNlLFxuICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXG4gICAgICBkYXRhOiB0aGlzLnNldHRpbmdzLmRhdGEsXG5cbiAgICAgIC8vIEV4cG9ydCBzb21lIHNwZWNpZmljIGFjdGlvbnMgdG8gdGhlIHNrZXRjaFxuICAgICAgcmVuZGVyOiAoKSA9PiB0aGlzLnJlbmRlcigpLFxuICAgICAgdG9nZ2xlUGxheTogKCkgPT4gdGhpcy50b2dnbGVQbGF5KCksXG4gICAgICBkaXNwYXRjaDogKGNiKSA9PiB0aGlzLmRpc3BhdGNoKGNiKSxcbiAgICAgIHRpY2s6ICgpID0+IHRoaXMudGljaygpLFxuICAgICAgcmVzaXplOiAoKSA9PiB0aGlzLnJlc2l6ZSgpLFxuICAgICAgdXBkYXRlOiAob3B0KSA9PiB0aGlzLnVwZGF0ZShvcHQpLFxuICAgICAgZXhwb3J0RnJhbWU6IG9wdCA9PiB0aGlzLmV4cG9ydEZyYW1lKG9wdCksXG4gICAgICByZWNvcmQ6ICgpID0+IHRoaXMucmVjb3JkKCksXG4gICAgICBwbGF5OiAoKSA9PiB0aGlzLnBsYXkoKSxcbiAgICAgIHBhdXNlOiAoKSA9PiB0aGlzLnBhdXNlKCksXG4gICAgICBzdG9wOiAoKSA9PiB0aGlzLnN0b3AoKVxuICAgIH07XG5cbiAgICAvLyBGb3IgV2ViR0wgc2tldGNoZXMsIGEgZ2wgdmFyaWFibGUgcmVhZHMgYSBiaXQgYmV0dGVyXG4gICAgdGhpcy5fc2V0dXBHTEtleSgpO1xuXG4gICAgLy8gVHJpZ2dlciBpbml0aWFsIHJlc2l6ZSBub3cgc28gdGhhdCBjYW52YXMgaXMgYWxyZWFkeSBzaXplZFxuICAgIC8vIGJ5IHRoZSB0aW1lIHdlIGxvYWQgdGhlIHNrZXRjaFxuICAgIHRoaXMucmVzaXplKCk7XG4gIH1cblxuICBsb2FkQW5kUnVuIChjYW52YXNTa2V0Y2gsIG5ld1NldHRpbmdzKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZChjYW52YXNTa2V0Y2gsIG5ld1NldHRpbmdzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMucnVuKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9KTtcbiAgfVxuXG4gIHVubG9hZCAoKSB7XG4gICAgdGhpcy5wYXVzZSgpO1xuICAgIGlmICghdGhpcy5za2V0Y2gpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHRoaXMuc2tldGNoLnVubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fd3JhcENvbnRleHRTY2FsZShwcm9wcyA9PiB0aGlzLnNrZXRjaC51bmxvYWQocHJvcHMpKTtcbiAgICB9XG4gICAgdGhpcy5fc2tldGNoID0gbnVsbDtcbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIHRoaXMudW5sb2FkKCk7XG4gICAgdGhpcy51bm1vdW50KCk7XG4gIH1cblxuICBsb2FkIChjcmVhdGVTa2V0Y2gsIG5ld1NldHRpbmdzKSB7XG4gICAgLy8gVXNlciBkaWRuJ3Qgc3BlY2lmeSBhIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiBjcmVhdGVTa2V0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGZ1bmN0aW9uIG11c3QgdGFrZSBpbiBhIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIEV4YW1wbGU6XFxuICBjYW52YXNTa2V0Y2hlcigoKSA9PiB7IC4uLiB9LCBzZXR0aW5ncyknKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5za2V0Y2gpIHtcbiAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdTZXR0aW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMudXBkYXRlKG5ld1NldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGEgYml0IG9mIGEgdHJpY2t5IGNhc2U7IHdlIHNldCB1cCB0aGUgYXV0by1zY2FsaW5nIGhlcmVcbiAgICAvLyBpbiBjYXNlIHRoZSB1c2VyIGRlY2lkZXMgdG8gcmVuZGVyIGFueXRoaW5nIHRvIHRoZSBjb250ZXh0ICpiZWZvcmUqIHRoZVxuICAgIC8vIHJlbmRlcigpIGZ1bmN0aW9uLi4uIEhvd2V2ZXIsIHVzZXJzIHNob3VsZCBpbnN0ZWFkIHVzZSBiZWdpbigpIGZ1bmN0aW9uIGZvciB0aGF0LlxuICAgIHRoaXMuX3ByZVJlbmRlcigpO1xuXG4gICAgbGV0IHByZWxvYWQgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIC8vIEJlY2F1c2Ugb2YgUDUuanMncyB1bnVzdWFsIHN0cnVjdHVyZSwgd2UgaGF2ZSB0byBkbyBhIGJpdCBvZlxuICAgIC8vIGxpYnJhcnktc3BlY2lmaWMgY2hhbmdlcyB0byBzdXBwb3J0IGl0IHByb3Blcmx5LlxuICAgIGlmICh0aGlzLnNldHRpbmdzLnA1KSB7XG4gICAgICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW2NhbnZhcy1za2V0Y2hdIEVSUk9SOiBVc2luZyBwNS5qcyBpbiBOb2RlLmpzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICAgIHByZWxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IFA1Q29uc3RydWN0b3IgPSB0aGlzLnNldHRpbmdzLnA1O1xuICAgICAgICBsZXQgcHJlbG9hZDtcbiAgICAgICAgaWYgKFA1Q29uc3RydWN0b3IucDUpIHtcbiAgICAgICAgICBwcmVsb2FkID0gUDVDb25zdHJ1Y3Rvci5wcmVsb2FkO1xuICAgICAgICAgIFA1Q29uc3RydWN0b3IgPSBQNUNvbnN0cnVjdG9yLnA1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNrZXRjaCBzZXR1cDsgZGlzYWJsZSBsb29wLCBzZXQgc2l6aW5nLCBldGMuXG4gICAgICAgIGNvbnN0IHA1U2tldGNoID0gcDUgPT4ge1xuICAgICAgICAgIC8vIEhvb2sgaW4gcHJlbG9hZCBpZiBuZWNlc3NhcnlcbiAgICAgICAgICBpZiAocHJlbG9hZCkgcDUucHJlbG9hZCA9ICgpID0+IHByZWxvYWQocDUpO1xuICAgICAgICAgIHA1LnNldHVwID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICAgICAgY29uc3QgaXNHTCA9IHRoaXMuc2V0dGluZ3MuY29udGV4dCA9PT0gJ3dlYmdsJztcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gaXNHTCA/IHA1LldFQkdMIDogcDUuUDJEO1xuICAgICAgICAgICAgcDUubm9Mb29wKCk7XG4gICAgICAgICAgICBwNS5waXhlbERlbnNpdHkocHJvcHMucGl4ZWxSYXRpbyk7XG4gICAgICAgICAgICBwNS5jcmVhdGVDYW52YXMocHJvcHMudmlld3BvcnRXaWR0aCwgcHJvcHMudmlld3BvcnRIZWlnaHQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGlmIChpc0dMICYmIHRoaXMuc2V0dGluZ3MuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICBwNS5zZXRBdHRyaWJ1dGVzKHRoaXMuc2V0dGluZ3MuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHsgcDUsIGNhbnZhczogcDUuY2FudmFzLCBjb250ZXh0OiBwNS5fcmVuZGVyZXIuZHJhd2luZ0NvbnRleHQgfSk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTdXBwb3J0IGdsb2JhbCBhbmQgaW5zdGFuY2UgUDUuanMgbW9kZXNcbiAgICAgICAgaWYgKHR5cGVvZiBQNUNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbmV3IFA1Q29uc3RydWN0b3IocDVTa2V0Y2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmNyZWF0ZUNhbnZhcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieyBwNSB9IHNldHRpbmcgaXMgcGFzc2VkIGJ1dCBjYW4ndCBmaW5kIHA1LmpzIGluIGdsb2JhbCAod2luZG93KSBzY29wZS4gTWF5YmUgeW91IGRpZCBub3QgY3JlYXRlIGl0IGdsb2JhbGx5P1xcbm5ldyBwNSgpOyAvLyA8LS0gYXR0YWNoZXMgdG8gZ2xvYmFsIHNjb3BlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwNVNrZXRjaCh3aW5kb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlbG9hZC50aGVuKCgpID0+IHtcbiAgICAgIC8vIExvYWQgdGhlIHVzZXIncyBza2V0Y2hcbiAgICAgIGxldCBsb2FkZXIgPSBjcmVhdGVTa2V0Y2godGhpcy5wcm9wcyk7XG4gICAgICBpZiAoIWlzUHJvbWlzZShsb2FkZXIpKSB7XG4gICAgICAgIGxvYWRlciA9IFByb21pc2UucmVzb2x2ZShsb2FkZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxvYWRlcjtcbiAgICB9KS50aGVuKHNrZXRjaCA9PiB7XG4gICAgICBpZiAoIXNrZXRjaCkgc2tldGNoID0ge307XG4gICAgICB0aGlzLl9za2V0Y2ggPSBza2V0Y2g7XG5cbiAgICAgIC8vIE9uY2UgdGhlIHNrZXRjaCBpcyBsb2FkZWQgd2UgY2FuIGFkZCB0aGUgZXZlbnRzXG4gICAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgICAgdGhpcy5fa2V5Ym9hcmRTaG9ydGN1dHMuYXR0YWNoKCk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9yZXNpemVIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9zdFJlbmRlcigpO1xuXG4gICAgICAvLyBUaGUgaW5pdGlhbCByZXNpemUoKSBpbiB0aGUgY29uc3RydWN0b3Igd2lsbCBub3QgaGF2ZVxuICAgICAgLy8gdHJpZ2dlcmVkIGEgcmVzaXplKCkgZXZlbnQgb24gdGhlIHNrZXRjaCwgc2luY2UgaXQgd2FzIGJlZm9yZVxuICAgICAgLy8gdGhlIHNrZXRjaCB3YXMgbG9hZGVkLiBTbyB3ZSBzZW5kIHRoZSBzaWduYWwgaGVyZSwgYWxsb3dpbmdcbiAgICAgIC8vIHVzZXJzIHRvIHJlYWN0IHRvIHRoZSBpbml0aWFsIHNpemUgYmVmb3JlIGZpcnN0IHJlbmRlci5cbiAgICAgIHRoaXMuX3NpemVDaGFuZ2VkKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3Qgc3RhcnQgc2tldGNoLCB0aGUgYXN5bmMgbG9hZGluZyBmdW5jdGlvbiByZWplY3RlZCB3aXRoIGFuIGVycm9yOlxcbiAgICBFcnJvcjogJyArIGVyci5tZXNzYWdlKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTa2V0Y2hNYW5hZ2VyO1xuIiwiaW1wb3J0IHsgZ2V0Q2xpZW50QVBJIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChvcHQgPSB7fSkge1xuICBjb25zdCBoYW5kbGVyID0gZXYgPT4ge1xuICAgIGlmICghb3B0LmVuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50QVBJKCk7XG4gICAgaWYgKGV2LmtleUNvZGUgPT09IDgzICYmICFldi5hbHRLZXkgJiYgKGV2Lm1ldGFLZXkgfHwgZXYuY3RybEtleSkpIHtcbiAgICAgIC8vIENtZCArIFNcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBvcHQuc2F2ZShldik7XG4gICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAzMikge1xuICAgICAgLy8gU3BhY2VcbiAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gd2l0aCB0aGlzPyBrZWVwIGl0LCBvciByZW1vdmUgaXQ/XG4gICAgICBvcHQudG9nZ2xlUGxheShldik7XG4gICAgfSBlbHNlIGlmIChjbGllbnQgJiYgIWV2LmFsdEtleSAmJiBldi5rZXlDb2RlID09PSA3NSAmJiAoZXYubWV0YUtleSB8fCBldi5jdHJsS2V5KSkge1xuICAgICAgLy8gQ21kICsgSywgb25seSB3aGVuIGNhbnZhcy1za2V0Y2gtY2xpIGlzIHVzZWRcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBvcHQuY29tbWl0KGV2KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXR0YWNoID0gKCkgPT4ge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcik7XG4gIH07XG5cbiAgY29uc3QgZGV0YWNoID0gKCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcik7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRhY2gsXG4gICAgZGV0YWNoXG4gIH07XG59XG4iLCJpbXBvcnQgU2tldGNoTWFuYWdlciBmcm9tICcuL2NvcmUvU2tldGNoTWFuYWdlcic7XG5pbXBvcnQgUGFwZXJTaXplcyBmcm9tICcuL3BhcGVyLXNpemVzJztcbmltcG9ydCB7IGdldENsaWVudEFQSSwgZGVmaW5lZCB9IGZyb20gJy4vdXRpbCc7XG5cbmNvbnN0IENBQ0hFID0gJ2hvdC1pZC1jYWNoZSc7XG5jb25zdCBydW50aW1lQ29sbGlzaW9ucyA9IFtdO1xuXG5mdW5jdGlvbiBpc0hvdFJlbG9hZCAoKSB7XG4gIGNvbnN0IGNsaWVudCA9IGdldENsaWVudEFQSSgpO1xuICByZXR1cm4gY2xpZW50ICYmIGNsaWVudC5ob3Q7XG59XG5cbmZ1bmN0aW9uIGNhY2hlR2V0IChpZCkge1xuICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnRBUEkoKTtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNsaWVudFtDQUNIRV0gPSBjbGllbnRbQ0FDSEVdIHx8IHt9O1xuICByZXR1cm4gY2xpZW50W0NBQ0hFXVtpZF07XG59XG5cbmZ1bmN0aW9uIGNhY2hlUHV0IChpZCwgZGF0YSkge1xuICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnRBUEkoKTtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNsaWVudFtDQUNIRV0gPSBjbGllbnRbQ0FDSEVdIHx8IHt9O1xuICBjbGllbnRbQ0FDSEVdW2lkXSA9IGRhdGE7XG59XG5cbmZ1bmN0aW9uIGdldFRpbWVQcm9wIChvbGRNYW5hZ2VyLCBuZXdTZXR0aW5ncykge1xuICAvLyBTdGF0aWMgc2tldGNoZXMgaWdub3JlIHRoZSB0aW1lIHBlcnNpc3RlbmN5XG4gIHJldHVybiBuZXdTZXR0aW5ncy5hbmltYXRlID8geyB0aW1lOiBvbGRNYW5hZ2VyLnByb3BzLnRpbWUgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2FudmFzU2tldGNoIChza2V0Y2gsIHNldHRpbmdzID0ge30pIHtcbiAgaWYgKHNldHRpbmdzLnA1KSB7XG4gICAgaWYgKHNldHRpbmdzLmNhbnZhcyB8fCAoc2V0dGluZ3MuY29udGV4dCAmJiB0eXBlb2Ygc2V0dGluZ3MuY29udGV4dCAhPT0gJ3N0cmluZycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIHsgcDUgfSBtb2RlLCB5b3UgY2FuJ3QgcGFzcyB5b3VyIG93biBjYW52YXMgb3IgY29udGV4dCwgdW5sZXNzIHRoZSBjb250ZXh0IGlzIGEgXCJ3ZWJnbFwiIG9yIFwiMmRcIiBzdHJpbmdgKTtcbiAgICB9XG5cbiAgICAvLyBEbyBub3QgY3JlYXRlIGEgY2FudmFzIG9uIHN0YXJ0dXAsIHNpbmNlIFA1LmpzIGRvZXMgdGhhdCBmb3IgdXNcbiAgICBjb25zdCBjb250ZXh0ID0gdHlwZW9mIHNldHRpbmdzLmNvbnRleHQgPT09ICdzdHJpbmcnID8gc2V0dGluZ3MuY29udGV4dCA6IGZhbHNlO1xuICAgIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZ3MsIHsgY2FudmFzOiBmYWxzZSwgY29udGV4dCB9KTtcbiAgfVxuXG4gIGNvbnN0IGlzSG90ID0gaXNIb3RSZWxvYWQoKTtcbiAgbGV0IGhvdElEO1xuICBpZiAoaXNIb3QpIHtcbiAgICAvLyBVc2UgYSBtYWdpYyBuYW1lIGJ5IGRlZmF1bHQsIGZvcmNlIHVzZXIgdG8gZGVmaW5lIGVhY2ggc2tldGNoIGlmIHRoZXlcbiAgICAvLyByZXF1aXJlIG1vcmUgdGhhbiBvbmUgaW4gYW4gYXBwbGljYXRpb24uIE9wZW4gdG8gb3RoZXIgaWRlYXMgb24gaG93IHRvIHRhY2tsZVxuICAgIC8vIHRoaXMgYXMgd2VsbC4uLlxuICAgIGhvdElEID0gZGVmaW5lZChzZXR0aW5ncy5pZCwgJyRfX0RFRkFVTFRfQ0FOVkFTX1NLRVRDSF9JRF9fJCcpO1xuICB9XG4gIGxldCBpc0luamVjdGluZyA9IGlzSG90ICYmIHR5cGVvZiBob3RJRCA9PT0gJ3N0cmluZyc7XG5cbiAgaWYgKGlzSW5qZWN0aW5nICYmIHJ1bnRpbWVDb2xsaXNpb25zLmluY2x1ZGVzKGhvdElEKSkge1xuICAgIGNvbnNvbGUud2FybihgV2FybmluZzogWW91IGhhdmUgbXVsdGlwbGUgY2FsbHMgdG8gY2FudmFzU2tldGNoKCkgaW4gLS1ob3QgbW9kZS4gWW91IG11c3QgcGFzcyB1bmlxdWUgeyBpZCB9IHN0cmluZ3MgaW4gc2V0dGluZ3MgdG8gZW5hYmxlIGhvdCByZWxvYWQgYWNyb3NzIG11bHRpcGxlIHNrZXRjaGVzLiBgLCBob3RJRCk7XG4gICAgaXNJbmplY3RpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGxldCBwcmVsb2FkID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgaWYgKGlzSW5qZWN0aW5nKSB7XG4gICAgLy8gTWFyayB0aGlzIGFzIGFscmVhZHkgc3BvdHRlZCBpbiB0aGlzIHJ1bnRpbWUgaW5zdGFuY2VcbiAgICBydW50aW1lQ29sbGlzaW9ucy5wdXNoKGhvdElEKTtcblxuICAgIGNvbnN0IHByZXZpb3VzRGF0YSA9IGNhY2hlR2V0KGhvdElEKTtcbiAgICBpZiAocHJldmlvdXNEYXRhKSB7XG4gICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAvLyBHcmFiIG5ldyBwcm9wcyBmcm9tIG9sZCBza2V0Y2ggaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbmV3UHJvcHMgPSBnZXRUaW1lUHJvcChwcmV2aW91c0RhdGEubWFuYWdlciwgc2V0dGluZ3MpO1xuICAgICAgICAvLyBEZXN0cm95IHRoZSBvbGQgaW5zdGFuY2VcbiAgICAgICAgcHJldmlvdXNEYXRhLm1hbmFnZXIuZGVzdHJveSgpO1xuICAgICAgICAvLyBQYXNzIGFsb25nIG5ldyBwcm9wc1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgICB9O1xuXG4gICAgICAvLyBNb3ZlIGFsb25nIHRoZSBuZXh0IGRhdGEuLi5cbiAgICAgIHByZWxvYWQgPSBwcmV2aW91c0RhdGEubG9hZC50aGVuKG5leHQpLmNhdGNoKG5leHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmVsb2FkLnRoZW4obmV3UHJvcHMgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgU2tldGNoTWFuYWdlcigpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHNrZXRjaCkge1xuICAgICAgLy8gTWVyZ2Ugd2l0aCBpbmNvbWluZyBkYXRhXG4gICAgICBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHNldHRpbmdzLCBuZXdQcm9wcyk7XG5cbiAgICAgIC8vIEFwcGx5IHNldHRpbmdzIGFuZCBjcmVhdGUgYSBjYW52YXNcbiAgICAgIG1hbmFnZXIuc2V0dXAoc2V0dGluZ3MpO1xuXG4gICAgICAvLyBNb3VudCB0byBET01cbiAgICAgIG1hbmFnZXIubW91bnQoKTtcblxuICAgICAgLy8gbG9hZCB0aGUgc2tldGNoIGZpcnN0XG4gICAgICByZXN1bHQgPSBtYW5hZ2VyLmxvYWRBbmRSdW4oc2tldGNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKG1hbmFnZXIpO1xuICAgIH1cbiAgICBpZiAoaXNJbmplY3RpbmcpIHtcbiAgICAgIGNhY2hlUHV0KGhvdElELCB7IGxvYWQ6IHJlc3VsdCwgbWFuYWdlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbi8vIFRPRE86IEZpZ3VyZSBvdXQgYSBuaWNlIHdheSB0byBleHBvcnQgdGhpbmdzLlxuY2FudmFzU2tldGNoLmNhbnZhc1NrZXRjaCA9IGNhbnZhc1NrZXRjaDtcbmNhbnZhc1NrZXRjaC5QYXBlclNpemVzID0gUGFwZXJTaXplcztcblxuZXhwb3J0IGRlZmF1bHQgY2FudmFzU2tldGNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYXJndW1lbnRzW2ldO1xuICAgIH1cbn07XG4iLCJ2YXIgd2luO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgIHdpbiA9IHNlbGY7XG59IGVsc2Uge1xuICAgIHdpbiA9IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbjtcbiIsIm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvblxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB2YXIgc3RyaW5nID0gdG9TdHJpbmcuY2FsbChmbilcbiAgcmV0dXJuIHN0cmluZyA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgc3RyaW5nICE9PSAnW29iamVjdCBSZWdFeHBdJykgfHxcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgLy8gSUU4IGFuZCBiZWxvd1xuICAgICAoZm4gPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmNvbmZpcm0gfHxcbiAgICAgIGZuID09PSB3aW5kb3cucHJvbXB0KSlcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzUHJvbWlzZTtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBpc1Byb21pc2U7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZShvYmopIHtcbiAgcmV0dXJuICEhb2JqICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG4iLCJ2YXIgbG9hZGVycyA9IHJlcXVpcmUoJy4vbG9hZGVycycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbnZhciBpc1Byb21pc2UgPSByZXF1aXJlKCdpcy1wcm9taXNlJyk7XG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvYWRBc3NldDtcblxubW9kdWxlLmV4cG9ydHMuYWxsID0gZnVuY3Rpb24gYWxsIChvcHQsIHByb2dyZXNzKSB7XG4gIHJldHVybiBsb2FkTXVsdGlwbGUob3B0LCBwcm9ncmVzcywgZmFsc2UpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuYW55ID0gZnVuY3Rpb24gYW55IChvcHQsIHByb2dyZXNzKSB7XG4gIHJldHVybiBsb2FkTXVsdGlwbGUob3B0LCBwcm9ncmVzcywgdHJ1ZSk7XG59O1xuXG5mdW5jdGlvbiBsb2FkTXVsdGlwbGUgKG9wdCwgcHJvZ3Jlc3MsIHNraXBNaXNzaW5nKSB7XG4gIHByb2dyZXNzID0gcHJvZ3Jlc3MgfHwgbm9vcDtcbiAgaWYgKHR5cGVvZiBwcm9ncmVzcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RoZSBzZWNvbmQgYXJndW1lbnQgdG8gbG9hZC5hbGwoKSBhbmQgbG9hZC5hbnkoKSBtdXN0IGJlIGEgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCcpKTtcbiAgfVxuXG4gIHZhciB0b3RhbDtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGxvYWQ7XG4gIHZhciBlbWl0UHJvZ3Jlc3MgPSBmdW5jdGlvbiAoaXRlbSwgdmFsdWUsIGNvdW50LCBlcnJvcikge1xuICAgIHZhciBvYmogPSB7XG4gICAgICB0YXJnZXQ6IGl0ZW0sXG4gICAgICB0b3RhbDogdG90YWwsXG4gICAgICBjb3VudDogY291bnQsXG4gICAgICBwcm9ncmVzczogY291bnQgLyB0b3RhbCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH07XG4gICAgaWYgKGVycm9yKSBvYmouZXJyb3IgPSBlcnJvcjtcbiAgICBwcm9ncmVzcyhvYmopO1xuICB9O1xuXG4gIGlmIChza2lwTWlzc2luZykge1xuICAgIGxvYWQgPSBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gbG9hZEFzc2V0KG9wdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQgfTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogbnVsbCwgZXJyb3I6IGVycm9yIH07XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcHRpb25hbCkge1xuICAgICAgICBlbWl0UHJvZ3Jlc3Mob3B0LCBvcHRpb25hbC52YWx1ZSwgKytjb3VudCwgb3B0aW9uYWwuZXJyb3IpO1xuICAgICAgICByZXR1cm4gb3B0aW9uYWwudmFsdWU7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGxvYWQgPSBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gbG9hZEFzc2V0KG9wdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGVtaXRQcm9ncmVzcyhvcHQsIHJlc3VsdCwgKytjb3VudCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0KSkge1xuICAgIHRvdGFsID0gb3B0Lmxlbmd0aDtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwob3B0Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGxvYWQoaXRlbSk7XG4gICAgfSkpO1xuICB9IGVsc2UgaWYgKG9wdCkge1xuICAgIHZhciBlbnRyaWVzID0gT2JqZWN0LmtleXMob3B0KS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiBvcHRba2V5XSB9O1xuICAgIH0pO1xuICAgIHRvdGFsID0gZW50cmllcy5sZW5ndGg7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGVudHJpZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIga2V5ID0gaXRlbS5rZXk7XG4gICAgICByZXR1cm4gbG9hZChpdGVtLnZhbHVlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGtleToga2V5IH07XG4gICAgICB9KTtcbiAgICB9KSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKGZ1bmN0aW9uIChvYmosIGl0ZW0pIHtcbiAgICAgICAgb2JqW2l0ZW0ua2V5XSA9IGl0ZW0udmFsdWU7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9LCB7fSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignWW91IG11c3Qgc3BlY2lmeSBhbiBhcnJheSBvZiBhc3NldHMgb3Igb2JqZWN0IGdyb3VwIHRvIGxvYWQnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZEFzc2V0IChvcHQpIHtcbiAgaWYgKCFvcHQpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1lvdSBtdXN0IHNwZWNpZnkgYSBVUkwgb3IgZGVzY3JpcHRvciBvZiB0aGUgYXNzZXQgdG8gbG9hZCcpKTtcbiAgaWYgKHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0ID0geyB1cmw6IG9wdCB9O1xuICB9XG4gIC8vIElmIGl0J3MgYSBwcm9taXNlLCBhc3N1bWUgbmVzdGVkIGZlYXR1cmVzLi4uXG4gIGlmIChpc1Byb21pc2Uob3B0KSkgcmV0dXJuIG9wdDtcbiAgcmV0dXJuIGdldExvYWRlcihvcHQpLnRoZW4oZnVuY3Rpb24gKGxvYWRlcikge1xuICAgIG9wdCA9IGFzc2lnbih7fSwgb3B0KTtcbiAgICBkZWxldGUgb3B0LnR5cGU7XG4gICAgcmV0dXJuIGxvYWRlcihvcHQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9hZGVyIChvcHQpIHtcbiAgdmFyIGksIGxvYWRlcjtcbiAgdmFyIHR5cGUgPSBvcHQudHlwZSA/IG9wdC50eXBlIDogbnVsbDtcbiAgaWYgKHR5cGUpIHtcbiAgICAvLyBBbGxvdyB1c2VyIHRvIHNwZWNpZnkgY3VzdG9tIHR5cGUgZnVuY3Rpb25cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIC8vIFVzZXIgc3BlY2lmaWVkIGFuIGV4cGxpY2l0IHR5cGUsIHVzZSB0aGF0LlxuICAgIGlmICghb3B0LnVybCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignV2hlbiB1c2luZyBsb2FkQXNzZXQoKSwgeW91IG11c3Qgc3BlY2lmeSBhIFVSTCBvciBkZXNjcmlwdG9yIG9mIHRoZSBhc3NldCB0byBsb2FkJykpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgbG9hZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbG9hZGVyID0gbG9hZGVyc1tpXTtcbiAgICAgIGlmIChsb2FkZXIua2V5ID09PSB0eXBlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvYWRlci5sb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgYW4gYXNzZXQgbG9hZGVyIGJ5IHRoZSBrZXkgXCInICsgb3B0LnR5cGUgKyAnXCInKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlciBkaWRuJ3Qgc3BlY2lmeSB0eXBlLCB0cnkgdG8gaW5mZXIgZnJvbSBmaWxlIGV4dGVuc2lvblxuICAgIGlmICghb3B0LnVybCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignV2hlbiB1c2luZyBsb2FkQXNzZXQoKSwgeW91IG11c3Qgc3BlY2lmeSBhIFVSTCBvciBkZXNjcmlwdG9yIG9mIHRoZSBhc3NldCB0byBsb2FkJykpO1xuICAgIH1cbiAgICB2YXIgZXh0ID0gZXh0bmFtZShvcHQudXJsKTtcbiAgICBpZiAoIWV4dCkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gZXh0ZW5zaW9uIGZvdW5kIGZvciBpbnB1dCBVUkwgXCInICsgb3B0LnVybCArICdcIiwgdHJ5IHRvIHNwZWNpZnkgYSB7IHR5cGUgfSBzdWNoIGFzIFwiaW1hZ2VcIiBvciBcInRleHRcIicpKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbG9hZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbG9hZGVyID0gbG9hZGVyc1tpXTtcbiAgICAgIGlmICghbG9hZGVyLm1hdGNoKSBjb250aW51ZTtcbiAgICAgIHZhciBpc01hdGNoID0gdHlwZW9mIGxvYWRlci5tYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGxvYWRlci5tYXRjaChleHQpXG4gICAgICAgIDogbG9hZGVyLm1hdGNoLnRlc3QoZXh0KTtcbiAgICAgIGlmIChpc01hdGNoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvYWRlci5sb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGluZmVyIGFuIGFzc2V0IGxvYWRlciBmcm9tIHRoZSBmaWxlIHR5cGUgXCInICsgZXh0ICsgJ1wiLCB0cnkgc3BlY2lmeWluZyB7IHR5cGUgfSBzdWNoIGFzIFwiaW1hZ2VcIiBvciBcInRleHRcIicpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRuYW1lICh1cmwpIHtcbiAgaWYgKCF1cmwpIHJldHVybiAnJztcbiAgdmFyIGlkeCA9IHVybC5sYXN0SW5kZXhPZignLycpO1xuICBpZiAoaWR4ICE9PSAtMSkgdXJsID0gdXJsLnN1YnN0cmluZyhpZHggKyAxKTsgLy8gS2VlcCBwYXRoIHdpdGhvdXQgaXRzIHNlZ21lbnRzXG4gIGlkeCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGlmIChpZHggIT09IC0xKSB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGlkeCk7IC8vIFJlbW92ZSBxdWVyeVxuICBpZHggPSB1cmwuaW5kZXhPZignIycpO1xuICBpZiAoaWR4ICE9PSAtMSkgdXJsID0gdXJsLnN1YnN0cmluZygwLCBpZHgpOyAvLyBSZW1vdmUgZnJhZ21lbnRcbiAgaWR4ID0gdXJsLmxhc3RJbmRleE9mKCcuJyk7XG4gIHJldHVybiBpZHggIT09IC0xID8gdXJsLnN1YnN0cmluZyhpZHgpIDogJyc7XG59XG4iLCJ2YXIgeGhyID0gcmVxdWlyZSgneGhyJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsb2FkRmlsZSAob3B0KSB7XG4gICAgdmFyIHA7XG4gICAgaWYgKCdmZXRjaCcgaW4gd2luZG93KSB7XG4gICAgICBwID0gd2luZG93LmZldGNoKG9wdC51cmwsIG9wdClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKC80MDQvLnRlc3QocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNvdXJjZSBub3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEvXjIvLnRlc3QocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIEhUVFAgU3RhdHVzIENvZGU6ICcgKyByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIG5vdCBPSycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JpbmFyeScpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSB4aHJGZXRjaCh0eXBlLCBvcHQpO1xuICAgIH1cbiAgICByZXR1cm4gcC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGVyci5tZXNzYWdlICsgJyB3aGlsZSBsb2FkaW5nIGZpbGUgJyArIG9wdC51cmxcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG59O1xuXG5mdW5jdGlvbiB4aHJGZXRjaCAodHlwZSwgb3B0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JztcbiAgICBpZiAodHlwZSA9PT0gJ2pzb24nKSByZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ2JpbmFyeScpIHJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ2Jsb2InKSByZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgb3B0ID0gYXNzaWduKHt9LCBvcHQsIHtcbiAgICAgIGpzb246IGZhbHNlLFxuICAgICAgcmVzcG9uc2VUeXBlOiByZXNwb25zZVR5cGVcbiAgICB9KTtcbiAgICB4aHIob3B0LCBmdW5jdGlvbiAoZXJyLCByZXMsIGJvZHkpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIGlmICgvNDA0Ly50ZXN0KHJlcy5zdGF0dXNDb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc291cmNlIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgICAgaWYgKCEvXjIvLnRlc3QocmVzLnN0YXR1c0NvZGUpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdVbmV4cGVjdGVkIEhUVFAgU3RhdHVzIENvZGU6ICcgKyByZXMuc3RhdHVzQ29kZSkpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdqc29uJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc29sdmUoYm9keSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwidmFyIG1pbWUgPSByZXF1aXJlKCdicm93c2VyLW1lZGlhLW1pbWUtdHlwZScpO1xuXG5mdW5jdGlvbiBnZXRNZWRpYVR5cGUgKGV4dCkge1xuICB2YXIgcmVzdWx0ID0gbWltZShleHQpO1xuICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gIGlmIChyZXN1bHQuaW5kZXhPZignYXVkaW8nKSA9PT0gMCkgcmV0dXJuICdhdWRpbyc7XG4gIGlmIChyZXN1bHQuaW5kZXhPZigndmlkZW8nKSA9PT0gMCkgcmV0dXJuICd2aWRlbyc7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZU1lZGlhTG9hZGVyICh0eXBlLCBjcmVhdGVFbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAga2V5OiB0eXBlLFxuICAgIG1hdGNoOiBmdW5jdGlvbiAoZXh0KSB7XG4gICAgICByZXR1cm4gZ2V0TWVkaWFUeXBlKGV4dCkgPT09IHR5cGU7XG4gICAgfSxcbiAgICBsb2FkOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIG1lZGlhID0gY3JlYXRlRWxlbWVudCgpO1xuICAgICAgICB2YXIgb25Mb2FkZWQgPSBmdW5jdGlvbiBvbkxvYWRlZCAoKSB7XG4gICAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUobWVkaWEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBldmVudCA9IChvcHQuZXZlbnQgfHwgJ2NhbnBsYXknKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoZXZlbnQgPT09ICdsb2FkZWRtZXRhZGF0YScpIHtcbiAgICAgICAgICBtZWRpYS5vbmxvYWRlZG1ldGFkYXRhID0gb25Mb2FkZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdjYW5wbGF5dGhyb3VnaCcpIHtcbiAgICAgICAgICBtZWRpYS5vbmNhbnBsYXl0aHJvdWdoID0gb25Mb2FkZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09ICdsb2FkZWRkYXRhJykge1xuICAgICAgICAgIG1lZGlhLm9ubG9hZGVkZGF0YSA9IG9uTG9hZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lZGlhLm9uY2FucGxheSA9IG9uTG9hZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVkaWEub25lcnJvciA9IGZ1bmN0aW9uIG9uRXJyb3IgKGVyKSB7XG4gICAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIGxvYWRpbmcgJyArIHR5cGUgKyAnIGF0ICcgKyBvcHQudXJsKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gcGFzcyB0aHJvdWdoIG1lZGlhIHByb3BlcnRpZXMgaWYgZGVmaW5lZFxuICAgICAgICBpZiAob3B0LmNyb3NzT3JpZ2luKSBtZWRpYS5jcm9zc09yaWdpbiA9IG9wdC5jcm9zc09yaWdpbjtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHQudm9sdW1lICE9PSAndW5kZWZpbmVkJykgbWVkaWEudm9sdW1lID0gb3B0LnZvbHVtZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHQucHJlbG9hZCAhPT0gJ3VuZGVmaW5lZCcpIG1lZGlhLnByZWxvYWQgPSBvcHQudm9sdW1lO1xuICAgICAgICBpZiAodHlwZW9mIG9wdC5wbGF5YmFja1JhdGUgIT09ICd1bmRlZmluZWQnKSBtZWRpYS5wbGF5YmFja1JhdGUgPSBvcHQudm9sdW1lO1xuICAgICAgICBpZiAodHlwZW9mIG9wdC5tdXRlZCAhPT0gJ3VuZGVmaW5lZCcpIG1lZGlhLm11dGVkID0gb3B0LnZvbHVtZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHQuY3VycmVudFRpbWUgIT09ICd1bmRlZmluZWQnKSBtZWRpYS5jdXJyZW50VGltZSA9IG9wdC52b2x1bWU7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0LmNvbnRyb2xzICE9PSAndW5kZWZpbmVkJykgbWVkaWEuY29udHJvbHMgPSBvcHQudm9sdW1lO1xuICAgICAgICBpZiAodHlwZW9mIG9wdC5hdXRvUGxheSAhPT0gJ3VuZGVmaW5lZCcpIG1lZGlhLmF1dG9QbGF5ID0gb3B0LnZvbHVtZTtcblxuICAgICAgICBtZWRpYS5zcmMgPSBvcHQudXJsO1xuXG4gICAgICAgIGlmIChtZWRpYS5yZWFkeVN0YXRlID49IG1lZGlhLkhBVkVfRU5PVUdIX0RBVEEpIHtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUobWVkaWEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVkaWEubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufTtcbiIsImNvbnN0IGNyZWF0ZU1lZGlhTG9hZGVyID0gcmVxdWlyZSgnLi9jcmVhdGVNZWRpYUxvYWRlcicpO1xuY29uc3QgY3JlYXRlRmlsZUxvYWRlciA9IHJlcXVpcmUoJy4vY3JlYXRlRmlsZUxvYWRlcicpO1xuY29uc3QgbG9hZEltYWdlID0gcmVxdWlyZSgnLi9sb2FkSW1hZ2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXG4gIC8vIGpzb25cbiAge1xuICAgIGtleTogJ2pzb24nLFxuICAgIG1hdGNoOiAvXFwuanNvbiQvaSxcbiAgICBsb2FkOiBjcmVhdGVGaWxlTG9hZGVyKCdqc29uJylcbiAgfSxcbiAgLy8gdGV4dFxuICB7XG4gICAga2V5OiAndGV4dCcsXG4gICAgbWF0Y2g6IC9cXC50eHQkL2ksXG4gICAgbG9hZDogY3JlYXRlRmlsZUxvYWRlcigndGV4dCcpXG4gIH0sXG4gIC8vIGltYWdlXG4gIHtcbiAgICBrZXk6ICdpbWFnZScsXG4gICAgbWF0Y2g6IC9cXC4oanBnfGpwZWd8c3ZnfHBuZ3xnaWZ8d2VicHxibXB8dGdhfHRpZnxhcG5nfHdicG18aWNvKSQvaSxcbiAgICBsb2FkOiBsb2FkSW1hZ2VcbiAgfSxcbiAgLy8gYXVkaW9cbiAgY3JlYXRlTWVkaWFMb2FkZXIoJ2F1ZGlvJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgd2luZG93LkF1ZGlvKCk7XG4gIH0pLFxuICAvLyB2aWRlb1xuICBjcmVhdGVNZWRpYUxvYWRlcigndmlkZW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gIH0pLFxuICAvLyBiaW5hcnlcbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgbWF0Y2g6IC9cXC5iaW4kL2ksXG4gICAgbG9hZDogY3JlYXRlRmlsZUxvYWRlcignYmluYXJ5JylcbiAgfSxcbiAgLy8gYmxvYlxuICB7XG4gICAga2V5OiAnYmxvYicsXG4gICAgbG9hZDogY3JlYXRlRmlsZUxvYWRlcignYmxvYicpXG4gIH1cbl07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgZmluaXNoZWQgPSBmYWxzZTtcbiAgICB2YXIgaW1hZ2UgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gb25Mb2FkZWQgKCkge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICByZXNvbHZlKGltYWdlKTtcbiAgICB9O1xuICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiBvbkVycm9yICgpIHtcbiAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgbG9hZGluZyBpbWFnZSBhdCAnICsgb3B0LnVybCkpO1xuICAgIH07XG4gICAgaWYgKG9wdC5jcm9zc09yaWdpbikgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBvcHQuY3Jvc3NPcmlnaW47XG4gICAgaW1hZ2Uuc3JjID0gb3B0LnVybDtcbiAgfSk7XG59O1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsInZhciB0cmltID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xufVxuICAsIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKVxuICAgIHJldHVybiB7fVxuXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIHZhciBoZWFkZXJzQXJyID0gdHJpbShoZWFkZXJzKS5zcGxpdCgnXFxuJylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnNBcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcm93ID0gaGVhZGVyc0FycltpXVxuICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHdpZHRoID0gMjU2Oy8vIGVhY2ggUkM0IG91dHB1dCBpcyAwIDw9IHggPCAyNTZcclxudmFyIGNodW5rcyA9IDY7Ly8gYXQgbGVhc3Qgc2l4IFJDNCBvdXRwdXRzIGZvciBlYWNoIGRvdWJsZVxyXG52YXIgZGlnaXRzID0gNTI7Ly8gdGhlcmUgYXJlIDUyIHNpZ25pZmljYW50IGRpZ2l0cyBpbiBhIGRvdWJsZVxyXG52YXIgcG9vbCA9IFtdOy8vIHBvb2w6IGVudHJvcHkgcG9vbCBzdGFydHMgZW1wdHlcclxudmFyIEdMT0JBTCA9IHR5cGVvZiBnbG9iYWwgPT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsO1xyXG5cclxuLy9cclxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHJlbGF0ZWQgdG8gSUVFRSA3NTQgbGltaXRzLlxyXG4vL1xyXG52YXIgc3RhcnRkZW5vbSA9IE1hdGgucG93KHdpZHRoLCBjaHVua3MpLFxyXG4gICAgc2lnbmlmaWNhbmNlID0gTWF0aC5wb3coMiwgZGlnaXRzKSxcclxuICAgIG92ZXJmbG93ID0gc2lnbmlmaWNhbmNlICogMixcclxuICAgIG1hc2sgPSB3aWR0aCAtIDE7XHJcblxyXG5cclxudmFyIG9sZFJhbmRvbSA9IE1hdGgucmFuZG9tO1xyXG5cclxuLy9cclxuLy8gc2VlZHJhbmRvbSgpXHJcbi8vIFRoaXMgaXMgdGhlIHNlZWRyYW5kb20gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLlxyXG4vL1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHNlZWQsIG9wdGlvbnMpIHtcclxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdsb2JhbCA9PT0gdHJ1ZSkge1xyXG4gICAgb3B0aW9ucy5nbG9iYWwgPSBmYWxzZTtcclxuICAgIE1hdGgucmFuZG9tID0gbW9kdWxlLmV4cG9ydHMoc2VlZCwgb3B0aW9ucyk7XHJcbiAgICBvcHRpb25zLmdsb2JhbCA9IHRydWU7XHJcbiAgICByZXR1cm4gTWF0aC5yYW5kb207XHJcbiAgfVxyXG4gIHZhciB1c2VfZW50cm9weSA9IChvcHRpb25zICYmIG9wdGlvbnMuZW50cm9weSkgfHwgZmFsc2U7XHJcbiAgdmFyIGtleSA9IFtdO1xyXG5cclxuICAvLyBGbGF0dGVuIHRoZSBzZWVkIHN0cmluZyBvciBidWlsZCBvbmUgZnJvbSBsb2NhbCBlbnRyb3B5IGlmIG5lZWRlZC5cclxuICB2YXIgc2hvcnRzZWVkID0gbWl4a2V5KGZsYXR0ZW4oXHJcbiAgICB1c2VfZW50cm9weSA/IFtzZWVkLCB0b3N0cmluZyhwb29sKV0gOlxyXG4gICAgMCBpbiBhcmd1bWVudHMgPyBzZWVkIDogYXV0b3NlZWQoKSwgMyksIGtleSk7XHJcblxyXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxyXG4gIHZhciBhcmM0ID0gbmV3IEFSQzQoa2V5KTtcclxuXHJcbiAgLy8gTWl4IHRoZSByYW5kb21uZXNzIGludG8gYWNjdW11bGF0ZWQgZW50cm9weS5cclxuICBtaXhrZXkodG9zdHJpbmcoYXJjNC5TKSwgcG9vbCk7XHJcblxyXG4gIC8vIE92ZXJyaWRlIE1hdGgucmFuZG9tXHJcblxyXG4gIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmRvbSBkb3VibGUgaW4gWzAsIDEpIHRoYXQgY29udGFpbnNcclxuICAvLyByYW5kb21uZXNzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgbWFudGlzc2Egb2YgdGhlIElFRUUgNzU0IHZhbHVlLlxyXG5cclxuICByZXR1cm4gZnVuY3Rpb24oKSB7ICAgICAgICAgLy8gQ2xvc3VyZSB0byByZXR1cm4gYSByYW5kb20gZG91YmxlOlxyXG4gICAgdmFyIG4gPSBhcmM0LmcoY2h1bmtzKSwgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCBhIG51bWVyYXRvciBuIDwgMiBeIDQ4XHJcbiAgICAgICAgZCA9IHN0YXJ0ZGVub20sICAgICAgICAgICAgICAgICAvLyAgIGFuZCBkZW5vbWluYXRvciBkID0gMiBeIDQ4LlxyXG4gICAgICAgIHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbmQgbm8gJ2V4dHJhIGxhc3QgYnl0ZScuXHJcbiAgICB3aGlsZSAobiA8IHNpZ25pZmljYW5jZSkgeyAgICAgICAgICAvLyBGaWxsIHVwIGFsbCBzaWduaWZpY2FudCBkaWdpdHMgYnlcclxuICAgICAgbiA9IChuICsgeCkgKiB3aWR0aDsgICAgICAgICAgICAgIC8vICAgc2hpZnRpbmcgbnVtZXJhdG9yIGFuZFxyXG4gICAgICBkICo9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZW5vbWluYXRvciBhbmQgZ2VuZXJhdGluZyBhXHJcbiAgICAgIHggPSBhcmM0LmcoMSk7ICAgICAgICAgICAgICAgICAgICAvLyAgIG5ldyBsZWFzdC1zaWduaWZpY2FudC1ieXRlLlxyXG4gICAgfVxyXG4gICAgd2hpbGUgKG4gPj0gb3ZlcmZsb3cpIHsgICAgICAgICAgICAgLy8gVG8gYXZvaWQgcm91bmRpbmcgdXAsIGJlZm9yZSBhZGRpbmdcclxuICAgICAgbiAvPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbGFzdCBieXRlLCBzaGlmdCBldmVyeXRoaW5nXHJcbiAgICAgIGQgLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJpZ2h0IHVzaW5nIGludGVnZXIgTWF0aCB1bnRpbFxyXG4gICAgICB4ID4+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBoYXZlIGV4YWN0bHkgdGhlIGRlc2lyZWQgYml0cy5cclxuICAgIH1cclxuICAgIHJldHVybiAobiArIHgpIC8gZDsgICAgICAgICAgICAgICAgIC8vIEZvcm0gdGhlIG51bWJlciB3aXRoaW4gWzAsIDEpLlxyXG4gIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5yZXNldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHtcclxuICBNYXRoLnJhbmRvbSA9IG9sZFJhbmRvbTtcclxufTtcclxuXHJcbi8vXHJcbi8vIEFSQzRcclxuLy9cclxuLy8gQW4gQVJDNCBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIGtleSBpbiB0aGUgZm9ybSBvZlxyXG4vLyBhbiBhcnJheSBvZiBhdCBtb3N0ICh3aWR0aCkgaW50ZWdlcnMgdGhhdCBzaG91bGQgYmUgMCA8PSB4IDwgKHdpZHRoKS5cclxuLy9cclxuLy8gVGhlIGcoY291bnQpIG1ldGhvZCByZXR1cm5zIGEgcHNldWRvcmFuZG9tIGludGVnZXIgdGhhdCBjb25jYXRlbmF0ZXNcclxuLy8gdGhlIG5leHQgKGNvdW50KSBvdXRwdXRzIGZyb20gQVJDNC4gIEl0cyByZXR1cm4gdmFsdWUgaXMgYSBudW1iZXIgeFxyXG4vLyB0aGF0IGlzIGluIHRoZSByYW5nZSAwIDw9IHggPCAod2lkdGggXiBjb3VudCkuXHJcbi8vXHJcbi8qKiBAY29uc3RydWN0b3IgKi9cclxuZnVuY3Rpb24gQVJDNChrZXkpIHtcclxuICB2YXIgdCwga2V5bGVuID0ga2V5Lmxlbmd0aCxcclxuICAgICAgbWUgPSB0aGlzLCBpID0gMCwgaiA9IG1lLmkgPSBtZS5qID0gMCwgcyA9IG1lLlMgPSBbXTtcclxuXHJcbiAgLy8gVGhlIGVtcHR5IGtleSBbXSBpcyB0cmVhdGVkIGFzIFswXS5cclxuICBpZiAoIWtleWxlbikgeyBrZXkgPSBba2V5bGVuKytdOyB9XHJcblxyXG4gIC8vIFNldCB1cCBTIHVzaW5nIHRoZSBzdGFuZGFyZCBrZXkgc2NoZWR1bGluZyBhbGdvcml0aG0uXHJcbiAgd2hpbGUgKGkgPCB3aWR0aCkge1xyXG4gICAgc1tpXSA9IGkrKztcclxuICB9XHJcbiAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcclxuICAgIHNbaV0gPSBzW2ogPSBtYXNrICYgKGogKyBrZXlbaSAlIGtleWxlbl0gKyAodCA9IHNbaV0pKV07XHJcbiAgICBzW2pdID0gdDtcclxuICB9XHJcblxyXG4gIC8vIFRoZSBcImdcIiBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCAoY291bnQpIG91dHB1dHMgYXMgb25lIG51bWJlci5cclxuICAobWUuZyA9IGZ1bmN0aW9uKGNvdW50KSB7XHJcbiAgICAvLyBVc2luZyBpbnN0YW5jZSBtZW1iZXJzIGluc3RlYWQgb2YgY2xvc3VyZSBzdGF0ZSBuZWFybHkgZG91YmxlcyBzcGVlZC5cclxuICAgIHZhciB0LCByID0gMCxcclxuICAgICAgICBpID0gbWUuaSwgaiA9IG1lLmosIHMgPSBtZS5TO1xyXG4gICAgd2hpbGUgKGNvdW50LS0pIHtcclxuICAgICAgdCA9IHNbaSA9IG1hc2sgJiAoaSArIDEpXTtcclxuICAgICAgciA9IHIgKiB3aWR0aCArIHNbbWFzayAmICgoc1tpXSA9IHNbaiA9IG1hc2sgJiAoaiArIHQpXSkgKyAoc1tqXSA9IHQpKV07XHJcbiAgICB9XHJcbiAgICBtZS5pID0gaTsgbWUuaiA9IGo7XHJcbiAgICByZXR1cm4gcjtcclxuICAgIC8vIEZvciByb2J1c3QgdW5wcmVkaWN0YWJpbGl0eSBkaXNjYXJkIGFuIGluaXRpYWwgYmF0Y2ggb2YgdmFsdWVzLlxyXG4gICAgLy8gU2VlIGh0dHA6Ly93d3cucnNhLmNvbS9yc2FsYWJzL25vZGUuYXNwP2lkPTIwMDlcclxuICB9KSh3aWR0aCk7XHJcbn1cclxuXHJcbi8vXHJcbi8vIGZsYXR0ZW4oKVxyXG4vLyBDb252ZXJ0cyBhbiBvYmplY3QgdHJlZSB0byBuZXN0ZWQgYXJyYXlzIG9mIHN0cmluZ3MuXHJcbi8vXHJcbmZ1bmN0aW9uIGZsYXR0ZW4ob2JqLCBkZXB0aCkge1xyXG4gIHZhciByZXN1bHQgPSBbXSwgdHlwID0gKHR5cGVvZiBvYmopWzBdLCBwcm9wO1xyXG4gIGlmIChkZXB0aCAmJiB0eXAgPT0gJ28nKSB7XHJcbiAgICBmb3IgKHByb3AgaW4gb2JqKSB7XHJcbiAgICAgIHRyeSB7IHJlc3VsdC5wdXNoKGZsYXR0ZW4ob2JqW3Byb3BdLCBkZXB0aCAtIDEpKTsgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIChyZXN1bHQubGVuZ3RoID8gcmVzdWx0IDogdHlwID09ICdzJyA/IG9iaiA6IG9iaiArICdcXDAnKTtcclxufVxyXG5cclxuLy9cclxuLy8gbWl4a2V5KClcclxuLy8gTWl4ZXMgYSBzdHJpbmcgc2VlZCBpbnRvIGEga2V5IHRoYXQgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMsIGFuZFxyXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cclxuLy9cclxuZnVuY3Rpb24gbWl4a2V5KHNlZWQsIGtleSkge1xyXG4gIHZhciBzdHJpbmdzZWVkID0gc2VlZCArICcnLCBzbWVhciwgaiA9IDA7XHJcbiAgd2hpbGUgKGogPCBzdHJpbmdzZWVkLmxlbmd0aCkge1xyXG4gICAga2V5W21hc2sgJiBqXSA9XHJcbiAgICAgIG1hc2sgJiAoKHNtZWFyIF49IGtleVttYXNrICYgal0gKiAxOSkgKyBzdHJpbmdzZWVkLmNoYXJDb2RlQXQoaisrKSk7XHJcbiAgfVxyXG4gIHJldHVybiB0b3N0cmluZyhrZXkpO1xyXG59XHJcblxyXG4vL1xyXG4vLyBhdXRvc2VlZCgpXHJcbi8vIFJldHVybnMgYW4gb2JqZWN0IGZvciBhdXRvc2VlZGluZywgdXNpbmcgd2luZG93LmNyeXB0byBpZiBhdmFpbGFibGUuXHJcbi8vXHJcbi8qKiBAcGFyYW0ge1VpbnQ4QXJyYXk9fSBzZWVkICovXHJcbmZ1bmN0aW9uIGF1dG9zZWVkKHNlZWQpIHtcclxuICB0cnkge1xyXG4gICAgR0xPQkFMLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoc2VlZCA9IG5ldyBVaW50OEFycmF5KHdpZHRoKSk7XHJcbiAgICByZXR1cm4gdG9zdHJpbmcoc2VlZCk7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgcmV0dXJuIFsrbmV3IERhdGUsIEdMT0JBTCwgR0xPQkFMLm5hdmlnYXRvciAmJiBHTE9CQUwubmF2aWdhdG9yLnBsdWdpbnMsXHJcbiAgICAgICAgICAgIEdMT0JBTC5zY3JlZW4sIHRvc3RyaW5nKHBvb2wpXTtcclxuICB9XHJcbn1cclxuXHJcbi8vXHJcbi8vIHRvc3RyaW5nKClcclxuLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmNvZGVzIHRvIGEgc3RyaW5nXHJcbi8vXHJcbmZ1bmN0aW9uIHRvc3RyaW5nKGEpIHtcclxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSgwLCBhKTtcclxufVxyXG5cclxuLy9cclxuLy8gV2hlbiBzZWVkcmFuZG9tLmpzIGlzIGxvYWRlZCwgd2UgaW1tZWRpYXRlbHkgbWl4IGEgZmV3IGJpdHNcclxuLy8gZnJvbSB0aGUgYnVpbHQtaW4gUk5HIGludG8gdGhlIGVudHJvcHkgcG9vbC4gIEJlY2F1c2Ugd2UgZG9cclxuLy8gbm90IHdhbnQgdG8gaW50ZWZlcmUgd2l0aCBkZXRlcm1pbnN0aWMgUFJORyBzdGF0ZSBsYXRlcixcclxuLy8gc2VlZHJhbmRvbSB3aWxsIG5vdCBjYWxsIE1hdGgucmFuZG9tIG9uIGl0cyBvd24gYWdhaW4gYWZ0ZXJcclxuLy8gaW5pdGlhbGl6YXRpb24uXHJcbi8vXHJcbm1peGtleShNYXRoLnJhbmRvbSgpLCBwb29sKTtcclxuIiwiLypcbiAqIEEgZmFzdCBqYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHNpbXBsZXggbm9pc2UgYnkgSm9uYXMgV2FnbmVyXG5cbkJhc2VkIG9uIGEgc3BlZWQtaW1wcm92ZWQgc2ltcGxleCBub2lzZSBhbGdvcml0aG0gZm9yIDJELCAzRCBhbmQgNEQgaW4gSmF2YS5cbldoaWNoIGlzIGJhc2VkIG9uIGV4YW1wbGUgY29kZSBieSBTdGVmYW4gR3VzdGF2c29uIChzdGVndUBpdG4ubGl1LnNlKS5cbldpdGggT3B0aW1pc2F0aW9ucyBieSBQZXRlciBFYXN0bWFuIChwZWFzdG1hbkBkcml6emxlLnN0YW5mb3JkLmVkdSkuXG5CZXR0ZXIgcmFuayBvcmRlcmluZyBtZXRob2QgYnkgU3RlZmFuIEd1c3RhdnNvbiBpbiAyMDEyLlxuXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTggSm9uYXMgV2FnbmVyXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIEYyID0gMC41ICogKE1hdGguc3FydCgzLjApIC0gMS4wKTtcbiAgdmFyIEcyID0gKDMuMCAtIE1hdGguc3FydCgzLjApKSAvIDYuMDtcbiAgdmFyIEYzID0gMS4wIC8gMy4wO1xuICB2YXIgRzMgPSAxLjAgLyA2LjA7XG4gIHZhciBGNCA9IChNYXRoLnNxcnQoNS4wKSAtIDEuMCkgLyA0LjA7XG4gIHZhciBHNCA9ICg1LjAgLSBNYXRoLnNxcnQoNS4wKSkgLyAyMC4wO1xuXG4gIGZ1bmN0aW9uIFNpbXBsZXhOb2lzZShyYW5kb21PclNlZWQpIHtcbiAgICB2YXIgcmFuZG9tO1xuICAgIGlmICh0eXBlb2YgcmFuZG9tT3JTZWVkID09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJhbmRvbSA9IHJhbmRvbU9yU2VlZDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmFuZG9tT3JTZWVkKSB7XG4gICAgICByYW5kb20gPSBhbGVhKHJhbmRvbU9yU2VlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmRvbSA9IE1hdGgucmFuZG9tO1xuICAgIH1cbiAgICB0aGlzLnAgPSBidWlsZFBlcm11dGF0aW9uVGFibGUocmFuZG9tKTtcbiAgICB0aGlzLnBlcm0gPSBuZXcgVWludDhBcnJheSg1MTIpO1xuICAgIHRoaXMucGVybU1vZDEyID0gbmV3IFVpbnQ4QXJyYXkoNTEyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICB0aGlzLnBlcm1baV0gPSB0aGlzLnBbaSAmIDI1NV07XG4gICAgICB0aGlzLnBlcm1Nb2QxMltpXSA9IHRoaXMucGVybVtpXSAlIDEyO1xuICAgIH1cblxuICB9XG4gIFNpbXBsZXhOb2lzZS5wcm90b3R5cGUgPSB7XG4gICAgZ3JhZDM6IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDAsXG4gICAgICAtMSwgMSwgMCxcbiAgICAgIDEsIC0xLCAwLFxuXG4gICAgICAtMSwgLTEsIDAsXG4gICAgICAxLCAwLCAxLFxuICAgICAgLTEsIDAsIDEsXG5cbiAgICAgIDEsIDAsIC0xLFxuICAgICAgLTEsIDAsIC0xLFxuICAgICAgMCwgMSwgMSxcblxuICAgICAgMCwgLTEsIDEsXG4gICAgICAwLCAxLCAtMSxcbiAgICAgIDAsIC0xLCAtMV0pLFxuICAgIGdyYWQ0OiBuZXcgRmxvYXQzMkFycmF5KFswLCAxLCAxLCAxLCAwLCAxLCAxLCAtMSwgMCwgMSwgLTEsIDEsIDAsIDEsIC0xLCAtMSxcbiAgICAgIDAsIC0xLCAxLCAxLCAwLCAtMSwgMSwgLTEsIDAsIC0xLCAtMSwgMSwgMCwgLTEsIC0xLCAtMSxcbiAgICAgIDEsIDAsIDEsIDEsIDEsIDAsIDEsIC0xLCAxLCAwLCAtMSwgMSwgMSwgMCwgLTEsIC0xLFxuICAgICAgLTEsIDAsIDEsIDEsIC0xLCAwLCAxLCAtMSwgLTEsIDAsIC0xLCAxLCAtMSwgMCwgLTEsIC0xLFxuICAgICAgMSwgMSwgMCwgMSwgMSwgMSwgMCwgLTEsIDEsIC0xLCAwLCAxLCAxLCAtMSwgMCwgLTEsXG4gICAgICAtMSwgMSwgMCwgMSwgLTEsIDEsIDAsIC0xLCAtMSwgLTEsIDAsIDEsIC0xLCAtMSwgMCwgLTEsXG4gICAgICAxLCAxLCAxLCAwLCAxLCAxLCAtMSwgMCwgMSwgLTEsIDEsIDAsIDEsIC0xLCAtMSwgMCxcbiAgICAgIC0xLCAxLCAxLCAwLCAtMSwgMSwgLTEsIDAsIC0xLCAtMSwgMSwgMCwgLTEsIC0xLCAtMSwgMF0pLFxuICAgIG5vaXNlMkQ6IGZ1bmN0aW9uKHhpbiwgeWluKSB7XG4gICAgICB2YXIgcGVybU1vZDEyID0gdGhpcy5wZXJtTW9kMTI7XG4gICAgICB2YXIgcGVybSA9IHRoaXMucGVybTtcbiAgICAgIHZhciBncmFkMyA9IHRoaXMuZ3JhZDM7XG4gICAgICB2YXIgbjAgPSAwOyAvLyBOb2lzZSBjb250cmlidXRpb25zIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcbiAgICAgIHZhciBuMSA9IDA7XG4gICAgICB2YXIgbjIgPSAwO1xuICAgICAgLy8gU2tldyB0aGUgaW5wdXQgc3BhY2UgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpbXBsZXggY2VsbCB3ZSdyZSBpblxuICAgICAgdmFyIHMgPSAoeGluICsgeWluKSAqIEYyOyAvLyBIYWlyeSBmYWN0b3IgZm9yIDJEXG4gICAgICB2YXIgaSA9IE1hdGguZmxvb3IoeGluICsgcyk7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3IoeWluICsgcyk7XG4gICAgICB2YXIgdCA9IChpICsgaikgKiBHMjtcbiAgICAgIHZhciBYMCA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSkgc3BhY2VcbiAgICAgIHZhciBZMCA9IGogLSB0O1xuICAgICAgdmFyIHgwID0geGluIC0gWDA7IC8vIFRoZSB4LHkgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXG4gICAgICB2YXIgeTAgPSB5aW4gLSBZMDtcbiAgICAgIC8vIEZvciB0aGUgMkQgY2FzZSwgdGhlIHNpbXBsZXggc2hhcGUgaXMgYW4gZXF1aWxhdGVyYWwgdHJpYW5nbGUuXG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc2ltcGxleCB3ZSBhcmUgaW4uXG4gICAgICB2YXIgaTEsIGoxOyAvLyBPZmZzZXRzIGZvciBzZWNvbmQgKG1pZGRsZSkgY29ybmVyIG9mIHNpbXBsZXggaW4gKGksaikgY29vcmRzXG4gICAgICBpZiAoeDAgPiB5MCkge1xuICAgICAgICBpMSA9IDE7XG4gICAgICAgIGoxID0gMDtcbiAgICAgIH0gLy8gbG93ZXIgdHJpYW5nbGUsIFhZIG9yZGVyOiAoMCwwKS0+KDEsMCktPigxLDEpXG4gICAgICBlbHNlIHtcbiAgICAgICAgaTEgPSAwO1xuICAgICAgICBqMSA9IDE7XG4gICAgICB9IC8vIHVwcGVyIHRyaWFuZ2xlLCBZWCBvcmRlcjogKDAsMCktPigwLDEpLT4oMSwxKVxuICAgICAgLy8gQSBzdGVwIG9mICgxLDApIGluIChpLGopIG1lYW5zIGEgc3RlcCBvZiAoMS1jLC1jKSBpbiAoeCx5KSwgYW5kXG4gICAgICAvLyBhIHN0ZXAgb2YgKDAsMSkgaW4gKGksaikgbWVhbnMgYSBzdGVwIG9mICgtYywxLWMpIGluICh4LHkpLCB3aGVyZVxuICAgICAgLy8gYyA9ICgzLXNxcnQoMykpLzZcbiAgICAgIHZhciB4MSA9IHgwIC0gaTEgKyBHMjsgLy8gT2Zmc2V0cyBmb3IgbWlkZGxlIGNvcm5lciBpbiAoeCx5KSB1bnNrZXdlZCBjb29yZHNcbiAgICAgIHZhciB5MSA9IHkwIC0gajEgKyBHMjtcbiAgICAgIHZhciB4MiA9IHgwIC0gMS4wICsgMi4wICogRzI7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkpIHVuc2tld2VkIGNvb3Jkc1xuICAgICAgdmFyIHkyID0geTAgLSAxLjAgKyAyLjAgKiBHMjtcbiAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgdGhyZWUgc2ltcGxleCBjb3JuZXJzXG4gICAgICB2YXIgaWkgPSBpICYgMjU1O1xuICAgICAgdmFyIGpqID0gaiAmIDI1NTtcbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udHJpYnV0aW9uIGZyb20gdGhlIHRocmVlIGNvcm5lcnNcbiAgICAgIHZhciB0MCA9IDAuNSAtIHgwICogeDAgLSB5MCAqIHkwO1xuICAgICAgaWYgKHQwID49IDApIHtcbiAgICAgICAgdmFyIGdpMCA9IHBlcm1Nb2QxMltpaSArIHBlcm1bampdXSAqIDM7XG4gICAgICAgIHQwICo9IHQwO1xuICAgICAgICBuMCA9IHQwICogdDAgKiAoZ3JhZDNbZ2kwXSAqIHgwICsgZ3JhZDNbZ2kwICsgMV0gKiB5MCk7IC8vICh4LHkpIG9mIGdyYWQzIHVzZWQgZm9yIDJEIGdyYWRpZW50XG4gICAgICB9XG4gICAgICB2YXIgdDEgPSAwLjUgLSB4MSAqIHgxIC0geTEgKiB5MTtcbiAgICAgIGlmICh0MSA+PSAwKSB7XG4gICAgICAgIHZhciBnaTEgPSBwZXJtTW9kMTJbaWkgKyBpMSArIHBlcm1bamogKyBqMV1dICogMztcbiAgICAgICAgdDEgKj0gdDE7XG4gICAgICAgIG4xID0gdDEgKiB0MSAqIChncmFkM1tnaTFdICogeDEgKyBncmFkM1tnaTEgKyAxXSAqIHkxKTtcbiAgICAgIH1cbiAgICAgIHZhciB0MiA9IDAuNSAtIHgyICogeDIgLSB5MiAqIHkyO1xuICAgICAgaWYgKHQyID49IDApIHtcbiAgICAgICAgdmFyIGdpMiA9IHBlcm1Nb2QxMltpaSArIDEgKyBwZXJtW2pqICsgMV1dICogMztcbiAgICAgICAgdDIgKj0gdDI7XG4gICAgICAgIG4yID0gdDIgKiB0MiAqIChncmFkM1tnaTJdICogeDIgKyBncmFkM1tnaTIgKyAxXSAqIHkyKTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCBjb250cmlidXRpb25zIGZyb20gZWFjaCBjb3JuZXIgdG8gZ2V0IHRoZSBmaW5hbCBub2lzZSB2YWx1ZS5cbiAgICAgIC8vIFRoZSByZXN1bHQgaXMgc2NhbGVkIHRvIHJldHVybiB2YWx1ZXMgaW4gdGhlIGludGVydmFsIFstMSwxXS5cbiAgICAgIHJldHVybiA3MC4wICogKG4wICsgbjEgKyBuMik7XG4gICAgfSxcbiAgICAvLyAzRCBzaW1wbGV4IG5vaXNlXG4gICAgbm9pc2UzRDogZnVuY3Rpb24oeGluLCB5aW4sIHppbikge1xuICAgICAgdmFyIHBlcm1Nb2QxMiA9IHRoaXMucGVybU1vZDEyO1xuICAgICAgdmFyIHBlcm0gPSB0aGlzLnBlcm07XG4gICAgICB2YXIgZ3JhZDMgPSB0aGlzLmdyYWQzO1xuICAgICAgdmFyIG4wLCBuMSwgbjIsIG4zOyAvLyBOb2lzZSBjb250cmlidXRpb25zIGZyb20gdGhlIGZvdXIgY29ybmVyc1xuICAgICAgLy8gU2tldyB0aGUgaW5wdXQgc3BhY2UgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpbXBsZXggY2VsbCB3ZSdyZSBpblxuICAgICAgdmFyIHMgPSAoeGluICsgeWluICsgemluKSAqIEYzOyAvLyBWZXJ5IG5pY2UgYW5kIHNpbXBsZSBza2V3IGZhY3RvciBmb3IgM0RcbiAgICAgIHZhciBpID0gTWF0aC5mbG9vcih4aW4gKyBzKTtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcih5aW4gKyBzKTtcbiAgICAgIHZhciBrID0gTWF0aC5mbG9vcih6aW4gKyBzKTtcbiAgICAgIHZhciB0ID0gKGkgKyBqICsgaykgKiBHMztcbiAgICAgIHZhciBYMCA9IGkgLSB0OyAvLyBVbnNrZXcgdGhlIGNlbGwgb3JpZ2luIGJhY2sgdG8gKHgseSx6KSBzcGFjZVxuICAgICAgdmFyIFkwID0gaiAtIHQ7XG4gICAgICB2YXIgWjAgPSBrIC0gdDtcbiAgICAgIHZhciB4MCA9IHhpbiAtIFgwOyAvLyBUaGUgeCx5LHogZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXG4gICAgICB2YXIgeTAgPSB5aW4gLSBZMDtcbiAgICAgIHZhciB6MCA9IHppbiAtIFowO1xuICAgICAgLy8gRm9yIHRoZSAzRCBjYXNlLCB0aGUgc2ltcGxleCBzaGFwZSBpcyBhIHNsaWdodGx5IGlycmVndWxhciB0ZXRyYWhlZHJvbi5cbiAgICAgIC8vIERldGVybWluZSB3aGljaCBzaW1wbGV4IHdlIGFyZSBpbi5cbiAgICAgIHZhciBpMSwgajEsIGsxOyAvLyBPZmZzZXRzIGZvciBzZWNvbmQgY29ybmVyIG9mIHNpbXBsZXggaW4gKGksaixrKSBjb29yZHNcbiAgICAgIHZhciBpMiwgajIsIGsyOyAvLyBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgb2Ygc2ltcGxleCBpbiAoaSxqLGspIGNvb3Jkc1xuICAgICAgaWYgKHgwID49IHkwKSB7XG4gICAgICAgIGlmICh5MCA+PSB6MCkge1xuICAgICAgICAgIGkxID0gMTtcbiAgICAgICAgICBqMSA9IDA7XG4gICAgICAgICAgazEgPSAwO1xuICAgICAgICAgIGkyID0gMTtcbiAgICAgICAgICBqMiA9IDE7XG4gICAgICAgICAgazIgPSAwO1xuICAgICAgICB9IC8vIFggWSBaIG9yZGVyXG4gICAgICAgIGVsc2UgaWYgKHgwID49IHowKSB7XG4gICAgICAgICAgaTEgPSAxO1xuICAgICAgICAgIGoxID0gMDtcbiAgICAgICAgICBrMSA9IDA7XG4gICAgICAgICAgaTIgPSAxO1xuICAgICAgICAgIGoyID0gMDtcbiAgICAgICAgICBrMiA9IDE7XG4gICAgICAgIH0gLy8gWCBaIFkgb3JkZXJcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaTEgPSAwO1xuICAgICAgICAgIGoxID0gMDtcbiAgICAgICAgICBrMSA9IDE7XG4gICAgICAgICAgaTIgPSAxO1xuICAgICAgICAgIGoyID0gMDtcbiAgICAgICAgICBrMiA9IDE7XG4gICAgICAgIH0gLy8gWiBYIFkgb3JkZXJcbiAgICAgIH1cbiAgICAgIGVsc2UgeyAvLyB4MDx5MFxuICAgICAgICBpZiAoeTAgPCB6MCkge1xuICAgICAgICAgIGkxID0gMDtcbiAgICAgICAgICBqMSA9IDA7XG4gICAgICAgICAgazEgPSAxO1xuICAgICAgICAgIGkyID0gMDtcbiAgICAgICAgICBqMiA9IDE7XG4gICAgICAgICAgazIgPSAxO1xuICAgICAgICB9IC8vIFogWSBYIG9yZGVyXG4gICAgICAgIGVsc2UgaWYgKHgwIDwgejApIHtcbiAgICAgICAgICBpMSA9IDA7XG4gICAgICAgICAgajEgPSAxO1xuICAgICAgICAgIGsxID0gMDtcbiAgICAgICAgICBpMiA9IDA7XG4gICAgICAgICAgajIgPSAxO1xuICAgICAgICAgIGsyID0gMTtcbiAgICAgICAgfSAvLyBZIFogWCBvcmRlclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpMSA9IDA7XG4gICAgICAgICAgajEgPSAxO1xuICAgICAgICAgIGsxID0gMDtcbiAgICAgICAgICBpMiA9IDE7XG4gICAgICAgICAgajIgPSAxO1xuICAgICAgICAgIGsyID0gMDtcbiAgICAgICAgfSAvLyBZIFggWiBvcmRlclxuICAgICAgfVxuICAgICAgLy8gQSBzdGVwIG9mICgxLDAsMCkgaW4gKGksaixrKSBtZWFucyBhIHN0ZXAgb2YgKDEtYywtYywtYykgaW4gKHgseSx6KSxcbiAgICAgIC8vIGEgc3RlcCBvZiAoMCwxLDApIGluIChpLGosaykgbWVhbnMgYSBzdGVwIG9mICgtYywxLWMsLWMpIGluICh4LHkseiksIGFuZFxuICAgICAgLy8gYSBzdGVwIG9mICgwLDAsMSkgaW4gKGksaixrKSBtZWFucyBhIHN0ZXAgb2YgKC1jLC1jLDEtYykgaW4gKHgseSx6KSwgd2hlcmVcbiAgICAgIC8vIGMgPSAxLzYuXG4gICAgICB2YXIgeDEgPSB4MCAtIGkxICsgRzM7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6KSBjb29yZHNcbiAgICAgIHZhciB5MSA9IHkwIC0gajEgKyBHMztcbiAgICAgIHZhciB6MSA9IHowIC0gazEgKyBHMztcbiAgICAgIHZhciB4MiA9IHgwIC0gaTIgKyAyLjAgKiBHMzsgLy8gT2Zmc2V0cyBmb3IgdGhpcmQgY29ybmVyIGluICh4LHkseikgY29vcmRzXG4gICAgICB2YXIgeTIgPSB5MCAtIGoyICsgMi4wICogRzM7XG4gICAgICB2YXIgejIgPSB6MCAtIGsyICsgMi4wICogRzM7XG4gICAgICB2YXIgeDMgPSB4MCAtIDEuMCArIDMuMCAqIEczOyAvLyBPZmZzZXRzIGZvciBsYXN0IGNvcm5lciBpbiAoeCx5LHopIGNvb3Jkc1xuICAgICAgdmFyIHkzID0geTAgLSAxLjAgKyAzLjAgKiBHMztcbiAgICAgIHZhciB6MyA9IHowIC0gMS4wICsgMy4wICogRzM7XG4gICAgICAvLyBXb3JrIG91dCB0aGUgaGFzaGVkIGdyYWRpZW50IGluZGljZXMgb2YgdGhlIGZvdXIgc2ltcGxleCBjb3JuZXJzXG4gICAgICB2YXIgaWkgPSBpICYgMjU1O1xuICAgICAgdmFyIGpqID0gaiAmIDI1NTtcbiAgICAgIHZhciBrayA9IGsgJiAyNTU7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmb3VyIGNvcm5lcnNcbiAgICAgIHZhciB0MCA9IDAuNiAtIHgwICogeDAgLSB5MCAqIHkwIC0gejAgKiB6MDtcbiAgICAgIGlmICh0MCA8IDApIG4wID0gMC4wO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBnaTAgPSBwZXJtTW9kMTJbaWkgKyBwZXJtW2pqICsgcGVybVtra11dXSAqIDM7XG4gICAgICAgIHQwICo9IHQwO1xuICAgICAgICBuMCA9IHQwICogdDAgKiAoZ3JhZDNbZ2kwXSAqIHgwICsgZ3JhZDNbZ2kwICsgMV0gKiB5MCArIGdyYWQzW2dpMCArIDJdICogejApO1xuICAgICAgfVxuICAgICAgdmFyIHQxID0gMC42IC0geDEgKiB4MSAtIHkxICogeTEgLSB6MSAqIHoxO1xuICAgICAgaWYgKHQxIDwgMCkgbjEgPSAwLjA7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGdpMSA9IHBlcm1Nb2QxMltpaSArIGkxICsgcGVybVtqaiArIGoxICsgcGVybVtrayArIGsxXV1dICogMztcbiAgICAgICAgdDEgKj0gdDE7XG4gICAgICAgIG4xID0gdDEgKiB0MSAqIChncmFkM1tnaTFdICogeDEgKyBncmFkM1tnaTEgKyAxXSAqIHkxICsgZ3JhZDNbZ2kxICsgMl0gKiB6MSk7XG4gICAgICB9XG4gICAgICB2YXIgdDIgPSAwLjYgLSB4MiAqIHgyIC0geTIgKiB5MiAtIHoyICogejI7XG4gICAgICBpZiAodDIgPCAwKSBuMiA9IDAuMDtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgZ2kyID0gcGVybU1vZDEyW2lpICsgaTIgKyBwZXJtW2pqICsgajIgKyBwZXJtW2trICsgazJdXV0gKiAzO1xuICAgICAgICB0MiAqPSB0MjtcbiAgICAgICAgbjIgPSB0MiAqIHQyICogKGdyYWQzW2dpMl0gKiB4MiArIGdyYWQzW2dpMiArIDFdICogeTIgKyBncmFkM1tnaTIgKyAyXSAqIHoyKTtcbiAgICAgIH1cbiAgICAgIHZhciB0MyA9IDAuNiAtIHgzICogeDMgLSB5MyAqIHkzIC0gejMgKiB6MztcbiAgICAgIGlmICh0MyA8IDApIG4zID0gMC4wO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBnaTMgPSBwZXJtTW9kMTJbaWkgKyAxICsgcGVybVtqaiArIDEgKyBwZXJtW2trICsgMV1dXSAqIDM7XG4gICAgICAgIHQzICo9IHQzO1xuICAgICAgICBuMyA9IHQzICogdDMgKiAoZ3JhZDNbZ2kzXSAqIHgzICsgZ3JhZDNbZ2kzICsgMV0gKiB5MyArIGdyYWQzW2dpMyArIDJdICogejMpO1xuICAgICAgfVxuICAgICAgLy8gQWRkIGNvbnRyaWJ1dGlvbnMgZnJvbSBlYWNoIGNvcm5lciB0byBnZXQgdGhlIGZpbmFsIG5vaXNlIHZhbHVlLlxuICAgICAgLy8gVGhlIHJlc3VsdCBpcyBzY2FsZWQgdG8gc3RheSBqdXN0IGluc2lkZSBbLTEsMV1cbiAgICAgIHJldHVybiAzMi4wICogKG4wICsgbjEgKyBuMiArIG4zKTtcbiAgICB9LFxuICAgIC8vIDREIHNpbXBsZXggbm9pc2UsIGJldHRlciBzaW1wbGV4IHJhbmsgb3JkZXJpbmcgbWV0aG9kIDIwMTItMDMtMDlcbiAgICBub2lzZTREOiBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgICB2YXIgcGVybSA9IHRoaXMucGVybTtcbiAgICAgIHZhciBncmFkNCA9IHRoaXMuZ3JhZDQ7XG5cbiAgICAgIHZhciBuMCwgbjEsIG4yLCBuMywgbjQ7IC8vIE5vaXNlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgZml2ZSBjb3JuZXJzXG4gICAgICAvLyBTa2V3IHRoZSAoeCx5LHosdykgc3BhY2UgdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGwgb2YgMjQgc2ltcGxpY2VzIHdlJ3JlIGluXG4gICAgICB2YXIgcyA9ICh4ICsgeSArIHogKyB3KSAqIEY0OyAvLyBGYWN0b3IgZm9yIDREIHNrZXdpbmdcbiAgICAgIHZhciBpID0gTWF0aC5mbG9vcih4ICsgcyk7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3IoeSArIHMpO1xuICAgICAgdmFyIGsgPSBNYXRoLmZsb29yKHogKyBzKTtcbiAgICAgIHZhciBsID0gTWF0aC5mbG9vcih3ICsgcyk7XG4gICAgICB2YXIgdCA9IChpICsgaiArIGsgKyBsKSAqIEc0OyAvLyBGYWN0b3IgZm9yIDREIHVuc2tld2luZ1xuICAgICAgdmFyIFgwID0gaSAtIHQ7IC8vIFVuc2tldyB0aGUgY2VsbCBvcmlnaW4gYmFjayB0byAoeCx5LHosdykgc3BhY2VcbiAgICAgIHZhciBZMCA9IGogLSB0O1xuICAgICAgdmFyIFowID0gayAtIHQ7XG4gICAgICB2YXIgVzAgPSBsIC0gdDtcbiAgICAgIHZhciB4MCA9IHggLSBYMDsgLy8gVGhlIHgseSx6LHcgZGlzdGFuY2VzIGZyb20gdGhlIGNlbGwgb3JpZ2luXG4gICAgICB2YXIgeTAgPSB5IC0gWTA7XG4gICAgICB2YXIgejAgPSB6IC0gWjA7XG4gICAgICB2YXIgdzAgPSB3IC0gVzA7XG4gICAgICAvLyBGb3IgdGhlIDREIGNhc2UsIHRoZSBzaW1wbGV4IGlzIGEgNEQgc2hhcGUgSSB3b24ndCBldmVuIHRyeSB0byBkZXNjcmliZS5cbiAgICAgIC8vIFRvIGZpbmQgb3V0IHdoaWNoIG9mIHRoZSAyNCBwb3NzaWJsZSBzaW1wbGljZXMgd2UncmUgaW4sIHdlIG5lZWQgdG9cbiAgICAgIC8vIGRldGVybWluZSB0aGUgbWFnbml0dWRlIG9yZGVyaW5nIG9mIHgwLCB5MCwgejAgYW5kIHcwLlxuICAgICAgLy8gU2l4IHBhaXItd2lzZSBjb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIGJldHdlZW4gZWFjaCBwb3NzaWJsZSBwYWlyXG4gICAgICAvLyBvZiB0aGUgZm91ciBjb29yZGluYXRlcywgYW5kIHRoZSByZXN1bHRzIGFyZSB1c2VkIHRvIHJhbmsgdGhlIG51bWJlcnMuXG4gICAgICB2YXIgcmFua3ggPSAwO1xuICAgICAgdmFyIHJhbmt5ID0gMDtcbiAgICAgIHZhciByYW5reiA9IDA7XG4gICAgICB2YXIgcmFua3cgPSAwO1xuICAgICAgaWYgKHgwID4geTApIHJhbmt4Kys7XG4gICAgICBlbHNlIHJhbmt5Kys7XG4gICAgICBpZiAoeDAgPiB6MCkgcmFua3grKztcbiAgICAgIGVsc2UgcmFua3orKztcbiAgICAgIGlmICh4MCA+IHcwKSByYW5reCsrO1xuICAgICAgZWxzZSByYW5rdysrO1xuICAgICAgaWYgKHkwID4gejApIHJhbmt5Kys7XG4gICAgICBlbHNlIHJhbmt6Kys7XG4gICAgICBpZiAoeTAgPiB3MCkgcmFua3krKztcbiAgICAgIGVsc2UgcmFua3crKztcbiAgICAgIGlmICh6MCA+IHcwKSByYW5reisrO1xuICAgICAgZWxzZSByYW5rdysrO1xuICAgICAgdmFyIGkxLCBqMSwgazEsIGwxOyAvLyBUaGUgaW50ZWdlciBvZmZzZXRzIGZvciB0aGUgc2Vjb25kIHNpbXBsZXggY29ybmVyXG4gICAgICB2YXIgaTIsIGoyLCBrMiwgbDI7IC8vIFRoZSBpbnRlZ2VyIG9mZnNldHMgZm9yIHRoZSB0aGlyZCBzaW1wbGV4IGNvcm5lclxuICAgICAgdmFyIGkzLCBqMywgazMsIGwzOyAvLyBUaGUgaW50ZWdlciBvZmZzZXRzIGZvciB0aGUgZm91cnRoIHNpbXBsZXggY29ybmVyXG4gICAgICAvLyBzaW1wbGV4W2NdIGlzIGEgNC12ZWN0b3Igd2l0aCB0aGUgbnVtYmVycyAwLCAxLCAyIGFuZCAzIGluIHNvbWUgb3JkZXIuXG4gICAgICAvLyBNYW55IHZhbHVlcyBvZiBjIHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIGUuZy4geD55Pno+dyBtYWtlcyB4PHosIHk8dyBhbmQgeDx3XG4gICAgICAvLyBpbXBvc3NpYmxlLiBPbmx5IHRoZSAyNCBpbmRpY2VzIHdoaWNoIGhhdmUgbm9uLXplcm8gZW50cmllcyBtYWtlIGFueSBzZW5zZS5cbiAgICAgIC8vIFdlIHVzZSBhIHRocmVzaG9sZGluZyB0byBzZXQgdGhlIGNvb3JkaW5hdGVzIGluIHR1cm4gZnJvbSB0aGUgbGFyZ2VzdCBtYWduaXR1ZGUuXG4gICAgICAvLyBSYW5rIDMgZGVub3RlcyB0aGUgbGFyZ2VzdCBjb29yZGluYXRlLlxuICAgICAgaTEgPSByYW5reCA+PSAzID8gMSA6IDA7XG4gICAgICBqMSA9IHJhbmt5ID49IDMgPyAxIDogMDtcbiAgICAgIGsxID0gcmFua3ogPj0gMyA/IDEgOiAwO1xuICAgICAgbDEgPSByYW5rdyA+PSAzID8gMSA6IDA7XG4gICAgICAvLyBSYW5rIDIgZGVub3RlcyB0aGUgc2Vjb25kIGxhcmdlc3QgY29vcmRpbmF0ZS5cbiAgICAgIGkyID0gcmFua3ggPj0gMiA/IDEgOiAwO1xuICAgICAgajIgPSByYW5reSA+PSAyID8gMSA6IDA7XG4gICAgICBrMiA9IHJhbmt6ID49IDIgPyAxIDogMDtcbiAgICAgIGwyID0gcmFua3cgPj0gMiA/IDEgOiAwO1xuICAgICAgLy8gUmFuayAxIGRlbm90ZXMgdGhlIHNlY29uZCBzbWFsbGVzdCBjb29yZGluYXRlLlxuICAgICAgaTMgPSByYW5reCA+PSAxID8gMSA6IDA7XG4gICAgICBqMyA9IHJhbmt5ID49IDEgPyAxIDogMDtcbiAgICAgIGszID0gcmFua3ogPj0gMSA/IDEgOiAwO1xuICAgICAgbDMgPSByYW5rdyA+PSAxID8gMSA6IDA7XG4gICAgICAvLyBUaGUgZmlmdGggY29ybmVyIGhhcyBhbGwgY29vcmRpbmF0ZSBvZmZzZXRzID0gMSwgc28gbm8gbmVlZCB0byBjb21wdXRlIHRoYXQuXG4gICAgICB2YXIgeDEgPSB4MCAtIGkxICsgRzQ7IC8vIE9mZnNldHMgZm9yIHNlY29uZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xuICAgICAgdmFyIHkxID0geTAgLSBqMSArIEc0O1xuICAgICAgdmFyIHoxID0gejAgLSBrMSArIEc0O1xuICAgICAgdmFyIHcxID0gdzAgLSBsMSArIEc0O1xuICAgICAgdmFyIHgyID0geDAgLSBpMiArIDIuMCAqIEc0OyAvLyBPZmZzZXRzIGZvciB0aGlyZCBjb3JuZXIgaW4gKHgseSx6LHcpIGNvb3Jkc1xuICAgICAgdmFyIHkyID0geTAgLSBqMiArIDIuMCAqIEc0O1xuICAgICAgdmFyIHoyID0gejAgLSBrMiArIDIuMCAqIEc0O1xuICAgICAgdmFyIHcyID0gdzAgLSBsMiArIDIuMCAqIEc0O1xuICAgICAgdmFyIHgzID0geDAgLSBpMyArIDMuMCAqIEc0OyAvLyBPZmZzZXRzIGZvciBmb3VydGggY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcbiAgICAgIHZhciB5MyA9IHkwIC0gajMgKyAzLjAgKiBHNDtcbiAgICAgIHZhciB6MyA9IHowIC0gazMgKyAzLjAgKiBHNDtcbiAgICAgIHZhciB3MyA9IHcwIC0gbDMgKyAzLjAgKiBHNDtcbiAgICAgIHZhciB4NCA9IHgwIC0gMS4wICsgNC4wICogRzQ7IC8vIE9mZnNldHMgZm9yIGxhc3QgY29ybmVyIGluICh4LHkseix3KSBjb29yZHNcbiAgICAgIHZhciB5NCA9IHkwIC0gMS4wICsgNC4wICogRzQ7XG4gICAgICB2YXIgejQgPSB6MCAtIDEuMCArIDQuMCAqIEc0O1xuICAgICAgdmFyIHc0ID0gdzAgLSAxLjAgKyA0LjAgKiBHNDtcbiAgICAgIC8vIFdvcmsgb3V0IHRoZSBoYXNoZWQgZ3JhZGllbnQgaW5kaWNlcyBvZiB0aGUgZml2ZSBzaW1wbGV4IGNvcm5lcnNcbiAgICAgIHZhciBpaSA9IGkgJiAyNTU7XG4gICAgICB2YXIgamogPSBqICYgMjU1O1xuICAgICAgdmFyIGtrID0gayAmIDI1NTtcbiAgICAgIHZhciBsbCA9IGwgJiAyNTU7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmaXZlIGNvcm5lcnNcbiAgICAgIHZhciB0MCA9IDAuNiAtIHgwICogeDAgLSB5MCAqIHkwIC0gejAgKiB6MCAtIHcwICogdzA7XG4gICAgICBpZiAodDAgPCAwKSBuMCA9IDAuMDtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgZ2kwID0gKHBlcm1baWkgKyBwZXJtW2pqICsgcGVybVtrayArIHBlcm1bbGxdXV1dICUgMzIpICogNDtcbiAgICAgICAgdDAgKj0gdDA7XG4gICAgICAgIG4wID0gdDAgKiB0MCAqIChncmFkNFtnaTBdICogeDAgKyBncmFkNFtnaTAgKyAxXSAqIHkwICsgZ3JhZDRbZ2kwICsgMl0gKiB6MCArIGdyYWQ0W2dpMCArIDNdICogdzApO1xuICAgICAgfVxuICAgICAgdmFyIHQxID0gMC42IC0geDEgKiB4MSAtIHkxICogeTEgLSB6MSAqIHoxIC0gdzEgKiB3MTtcbiAgICAgIGlmICh0MSA8IDApIG4xID0gMC4wO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBnaTEgPSAocGVybVtpaSArIGkxICsgcGVybVtqaiArIGoxICsgcGVybVtrayArIGsxICsgcGVybVtsbCArIGwxXV1dXSAlIDMyKSAqIDQ7XG4gICAgICAgIHQxICo9IHQxO1xuICAgICAgICBuMSA9IHQxICogdDEgKiAoZ3JhZDRbZ2kxXSAqIHgxICsgZ3JhZDRbZ2kxICsgMV0gKiB5MSArIGdyYWQ0W2dpMSArIDJdICogejEgKyBncmFkNFtnaTEgKyAzXSAqIHcxKTtcbiAgICAgIH1cbiAgICAgIHZhciB0MiA9IDAuNiAtIHgyICogeDIgLSB5MiAqIHkyIC0gejIgKiB6MiAtIHcyICogdzI7XG4gICAgICBpZiAodDIgPCAwKSBuMiA9IDAuMDtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgZ2kyID0gKHBlcm1baWkgKyBpMiArIHBlcm1bamogKyBqMiArIHBlcm1ba2sgKyBrMiArIHBlcm1bbGwgKyBsMl1dXV0gJSAzMikgKiA0O1xuICAgICAgICB0MiAqPSB0MjtcbiAgICAgICAgbjIgPSB0MiAqIHQyICogKGdyYWQ0W2dpMl0gKiB4MiArIGdyYWQ0W2dpMiArIDFdICogeTIgKyBncmFkNFtnaTIgKyAyXSAqIHoyICsgZ3JhZDRbZ2kyICsgM10gKiB3Mik7XG4gICAgICB9XG4gICAgICB2YXIgdDMgPSAwLjYgLSB4MyAqIHgzIC0geTMgKiB5MyAtIHozICogejMgLSB3MyAqIHczO1xuICAgICAgaWYgKHQzIDwgMCkgbjMgPSAwLjA7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGdpMyA9IChwZXJtW2lpICsgaTMgKyBwZXJtW2pqICsgajMgKyBwZXJtW2trICsgazMgKyBwZXJtW2xsICsgbDNdXV1dICUgMzIpICogNDtcbiAgICAgICAgdDMgKj0gdDM7XG4gICAgICAgIG4zID0gdDMgKiB0MyAqIChncmFkNFtnaTNdICogeDMgKyBncmFkNFtnaTMgKyAxXSAqIHkzICsgZ3JhZDRbZ2kzICsgMl0gKiB6MyArIGdyYWQ0W2dpMyArIDNdICogdzMpO1xuICAgICAgfVxuICAgICAgdmFyIHQ0ID0gMC42IC0geDQgKiB4NCAtIHk0ICogeTQgLSB6NCAqIHo0IC0gdzQgKiB3NDtcbiAgICAgIGlmICh0NCA8IDApIG40ID0gMC4wO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBnaTQgPSAocGVybVtpaSArIDEgKyBwZXJtW2pqICsgMSArIHBlcm1ba2sgKyAxICsgcGVybVtsbCArIDFdXV1dICUgMzIpICogNDtcbiAgICAgICAgdDQgKj0gdDQ7XG4gICAgICAgIG40ID0gdDQgKiB0NCAqIChncmFkNFtnaTRdICogeDQgKyBncmFkNFtnaTQgKyAxXSAqIHk0ICsgZ3JhZDRbZ2k0ICsgMl0gKiB6NCArIGdyYWQ0W2dpNCArIDNdICogdzQpO1xuICAgICAgfVxuICAgICAgLy8gU3VtIHVwIGFuZCBzY2FsZSB0aGUgcmVzdWx0IHRvIGNvdmVyIHRoZSByYW5nZSBbLTEsMV1cbiAgICAgIHJldHVybiAyNy4wICogKG4wICsgbjEgKyBuMiArIG4zICsgbjQpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBidWlsZFBlcm11dGF0aW9uVGFibGUocmFuZG9tKSB7XG4gICAgdmFyIGk7XG4gICAgdmFyIHAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgcFtpXSA9IGk7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykge1xuICAgICAgdmFyIHIgPSBpICsgfn4ocmFuZG9tKCkgKiAoMjU2IC0gaSkpO1xuICAgICAgdmFyIGF1eCA9IHBbaV07XG4gICAgICBwW2ldID0gcFtyXTtcbiAgICAgIHBbcl0gPSBhdXg7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9XG4gIFNpbXBsZXhOb2lzZS5fYnVpbGRQZXJtdXRhdGlvblRhYmxlID0gYnVpbGRQZXJtdXRhdGlvblRhYmxlO1xuXG4gIGZ1bmN0aW9uIGFsZWEoKSB7XG4gICAgLy8gSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4gICAgdmFyIHMwID0gMDtcbiAgICB2YXIgczEgPSAwO1xuICAgIHZhciBzMiA9IDA7XG4gICAgdmFyIGMgPSAxO1xuXG4gICAgdmFyIG1hc2ggPSBtYXNoZXIoKTtcbiAgICBzMCA9IG1hc2goJyAnKTtcbiAgICBzMSA9IG1hc2goJyAnKTtcbiAgICBzMiA9IG1hc2goJyAnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzMCAtPSBtYXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICBpZiAoczAgPCAwKSB7XG4gICAgICAgIHMwICs9IDE7XG4gICAgICB9XG4gICAgICBzMSAtPSBtYXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICBpZiAoczEgPCAwKSB7XG4gICAgICAgIHMxICs9IDE7XG4gICAgICB9XG4gICAgICBzMiAtPSBtYXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICBpZiAoczIgPCAwKSB7XG4gICAgICAgIHMyICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIG1hc2ggPSBudWxsO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0ID0gMjA5MTYzOSAqIHMwICsgYyAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gICAgICBzMCA9IHMxO1xuICAgICAgczEgPSBzMjtcbiAgICAgIHJldHVybiBzMiA9IHQgLSAoYyA9IHQgfCAwKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1hc2hlcigpIHtcbiAgICB2YXIgbiA9IDB4ZWZjODI0OWQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbiArPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgICBoIC09IG47XG4gICAgICAgIGggKj0gbjtcbiAgICAgICAgbiA9IGggPj4+IDA7XG4gICAgICAgIGggLT0gbjtcbiAgICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICAgIH1cbiAgICAgIHJldHVybiAobiA+Pj4gMCkgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIH07XG4gIH1cblxuICAvLyBhbWRcbiAgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIGRlZmluZShmdW5jdGlvbigpIHtyZXR1cm4gU2ltcGxleE5vaXNlO30pO1xuICAvLyBjb21tb24ganNcbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykgZXhwb3J0cy5TaW1wbGV4Tm9pc2UgPSBTaW1wbGV4Tm9pc2U7XG4gIC8vIGJyb3dzZXJcbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHdpbmRvdy5TaW1wbGV4Tm9pc2UgPSBTaW1wbGV4Tm9pc2U7XG4gIC8vIG5vZGVqc1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IFNpbXBsZXhOb2lzZTtcbiAgfVxuXG59KSgpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgd2luZG93ID0gcmVxdWlyZShcImdsb2JhbC93aW5kb3dcIilcbnZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZShcImlzLWZ1bmN0aW9uXCIpXG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZShcInBhcnNlLWhlYWRlcnNcIilcbnZhciB4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZFwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVhIUlxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlWEhSO1xuY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0ID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0IHx8IG5vb3BcbmNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKSkgPyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxuZm9yRWFjaEFycmF5KFtcImdldFwiLCBcInB1dFwiLCBcInBvc3RcIiwgXCJwYXRjaFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIl0sIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGNyZWF0ZVhIUlttZXRob2QgPT09IFwiZGVsZXRlXCIgPyBcImRlbFwiIDogbWV0aG9kXSA9IGZ1bmN0aW9uKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmope1xuICAgIGZvcih2YXIgaSBpbiBvYmope1xuICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gdXJpXG5cbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zID0geHRlbmQob3B0aW9ucywge3VyaTogdXJpfSlcbiAgICB9XG5cbiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVYSFIob3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FsbGJhY2sgYXJndW1lbnQgbWlzc2luZ1wiKVxuICAgIH1cblxuICAgIHZhciBjYWxsZWQgPSBmYWxzZVxuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNiT25jZShlcnIsIHJlc3BvbnNlLCBib2R5KXtcbiAgICAgICAgaWYoIWNhbGxlZCl7XG4gICAgICAgICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKGVyciwgcmVzcG9uc2UsIGJvZHkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkeXN0YXRlY2hhbmdlKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQobG9hZEZ1bmMsIDApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICAgICAgICAvLyBDaHJvbWUgd2l0aCByZXF1ZXN0VHlwZT1ibG9iIHRocm93cyBlcnJvcnMgYXJyb3VuZCB3aGVuIGV2ZW4gdGVzdGluZyBhY2Nlc3MgdG8gcmVzcG9uc2VUZXh0XG4gICAgICAgIHZhciBib2R5ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHhoci5yZXNwb25zZSkge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVRleHQgfHwgZ2V0WG1sKHhocilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0pzb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9keVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yRnVuYyhldnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYoIShldnQgaW5zdGFuY2VvZiBFcnJvcikpe1xuICAgICAgICAgICAgZXZ0ID0gbmV3IEVycm9yKFwiXCIgKyAoZXZ0IHx8IFwiVW5rbm93biBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKSApXG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0YXR1c0NvZGUgPSAwXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhldnQsIGZhaWx1cmVSZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyB3aWxsIGxvYWQgdGhlIGRhdGEgJiBwcm9jZXNzIHRoZSByZXNwb25zZSBpbiBhIHNwZWNpYWwgcmVzcG9uc2Ugb2JqZWN0XG4gICAgZnVuY3Rpb24gbG9hZEZ1bmMoKSB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm5cbiAgICAgICAgdmFyIHN0YXR1c1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZihvcHRpb25zLnVzZVhEUiAmJiB4aHIuc3RhdHVzPT09dW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL0lFOCBDT1JTIEdFVCBzdWNjZXNzZnVsIHJlc3BvbnNlIGRvZXNuJ3QgaGF2ZSBhIHN0YXR1cyBmaWVsZCwgYnV0IGJvZHkgaXMgZmluZVxuICAgICAgICAgICAgc3RhdHVzID0gMjAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXMpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gZmFpbHVyZVJlc3BvbnNlXG4gICAgICAgIHZhciBlcnIgPSBudWxsXG5cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMCl7XG4gICAgICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBib2R5OiBnZXRCb2R5KCksXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogc3RhdHVzLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyl7IC8vcmVtZW1iZXIgeGhyIGNhbiBpbiBmYWN0IGJlIFhEUiBmb3IgQ09SUyBpbiBJRVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKFwiSW50ZXJuYWwgWE1MSHR0cFJlcXVlc3QgRXJyb3JcIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbFxuXG4gICAgaWYgKCF4aHIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29ycyB8fCBvcHRpb25zLnVzZVhEUikge1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCgpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5XG4gICAgdmFyIGFib3J0ZWRcbiAgICB2YXIgdXJpID0geGhyLnVybCA9IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMudXJsXG4gICAgdmFyIG1ldGhvZCA9IHhoci5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiXG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhXG4gICAgdmFyIGhlYWRlcnMgPSB4aHIuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxuICAgIHZhciBzeW5jID0gISFvcHRpb25zLnN5bmNcbiAgICB2YXIgaXNKc29uID0gZmFsc2VcbiAgICB2YXIgdGltZW91dFRpbWVyXG4gICAgdmFyIGZhaWx1cmVSZXNwb25zZSA9IHtcbiAgICAgICAgYm9keTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIHVybDogdXJpLFxuICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICB9XG5cbiAgICBpZiAoXCJqc29uXCIgaW4gb3B0aW9ucyAmJiBvcHRpb25zLmpzb24gIT09IGZhbHNlKSB7XG4gICAgICAgIGlzSnNvbiA9IHRydWVcbiAgICAgICAgaGVhZGVyc1tcImFjY2VwdFwiXSB8fCBoZWFkZXJzW1wiQWNjZXB0XCJdIHx8IChoZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgIGlmIChtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgICAgICAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSB8fCBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdIHx8IChoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5qc29uID09PSB0cnVlID8gYm9keSA6IG9wdGlvbnMuanNvbilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZWFkeXN0YXRlY2hhbmdlXG4gICAgeGhyLm9ubG9hZCA9IGxvYWRGdW5jXG4gICAgeGhyLm9uZXJyb3IgPSBlcnJvckZ1bmNcbiAgICAvLyBJRTkgbXVzdCBoYXZlIG9ucHJvZ3Jlc3MgYmUgc2V0IHRvIGEgdW5pcXVlIGZ1bmN0aW9uLlxuICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJRSBtdXN0IGRpZVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZXJyb3JGdW5jXG4gICAgeGhyLm9wZW4obWV0aG9kLCB1cmksICFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkKVxuICAgIC8vaGFzIHRvIGJlIGFmdGVyIG9wZW5cbiAgICBpZighc3luYykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRpb25zLndpdGhDcmVkZW50aWFsc1xuICAgIH1cbiAgICAvLyBDYW5ub3Qgc2V0IHRpbWVvdXQgd2l0aCBzeW5jIHJlcXVlc3RcbiAgICAvLyBub3Qgc2V0dGluZyB0aW1lb3V0IG9uIHRoZSB4aHIgb2JqZWN0LCBiZWNhdXNlIG9mIG9sZCB3ZWJraXRzIGV0Yy4gbm90IGhhbmRsaW5nIHRoYXQgY29ycmVjdGx5XG4gICAgLy8gYm90aCBucG0ncyByZXF1ZXN0IGFuZCBqcXVlcnkgMS54IHVzZSB0aGlzIGtpbmQgb2YgdGltZW91dCwgc28gdGhpcyBpcyBiZWluZyBjb25zaXN0ZW50XG4gICAgaWYgKCFzeW5jICYmIG9wdGlvbnMudGltZW91dCA+IDAgKSB7XG4gICAgICAgIHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm5cbiAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlLy9JRTkgbWF5IHN0aWxsIGNhbGwgcmVhZHlzdGF0ZWNoYW5nZVxuICAgICAgICAgICAgeGhyLmFib3J0KFwidGltZW91dFwiKVxuICAgICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoXCJYTUxIdHRwUmVxdWVzdCB0aW1lb3V0XCIpXG4gICAgICAgICAgICBlLmNvZGUgPSBcIkVUSU1FRE9VVFwiXG4gICAgICAgICAgICBlcnJvckZ1bmMoZSlcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0IClcbiAgICB9XG5cbiAgICBpZiAoeGhyLnNldFJlcXVlc3RIZWFkZXIpIHtcbiAgICAgICAgZm9yKGtleSBpbiBoZWFkZXJzKXtcbiAgICAgICAgICAgIGlmKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSl7XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaGVhZGVycyAmJiAhaXNFbXB0eShvcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBpZiAoXCJyZXNwb25zZVR5cGVcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZVxuICAgIH1cblxuICAgIGlmIChcImJlZm9yZVNlbmRcIiBpbiBvcHRpb25zICYmXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmJlZm9yZVNlbmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgICBvcHRpb25zLmJlZm9yZVNlbmQoeGhyKVxuICAgIH1cblxuICAgIC8vIE1pY3Jvc29mdCBFZGdlIGJyb3dzZXIgc2VuZHMgXCJ1bmRlZmluZWRcIiB3aGVuIHNlbmQgaXMgY2FsbGVkIHdpdGggdW5kZWZpbmVkIHZhbHVlLlxuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IHNwZWMgc2F5cyB0byBwYXNzIG51bGwgYXMgYm9keSB0byBpbmRpY2F0ZSBubyBib2R5XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXVndHVyL3hoci9pc3N1ZXMvMTAwLlxuICAgIHhoci5zZW5kKGJvZHkgfHwgbnVsbClcblxuICAgIHJldHVybiB4aHJcblxuXG59XG5cbmZ1bmN0aW9uIGdldFhtbCh4aHIpIHtcbiAgICAvLyB4aHIucmVzcG9uc2VYTUwgd2lsbCB0aHJvdyBFeGNlcHRpb24gXCJJbnZhbGlkU3RhdGVFcnJvclwiIG9yIFwiRE9NRXhjZXB0aW9uXCJcbiAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L3Jlc3BvbnNlWE1MLlxuICAgIHRyeSB7XG4gICAgICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcImRvY3VtZW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VYTUxcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmlyZWZveEJ1Z1Rha2VuRWZmZWN0ID0geGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiAmJiAhZmlyZWZveEJ1Z1Rha2VuRWZmZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlWE1MXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiXG5nbG9iYWwuQ0FOVkFTX1NLRVRDSF9ERUZBVUxUX1NUT1JBR0VfS0VZID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4iXX0=</script>