UNPKG

px-brush

Version:

Pixelated Brush/Eraser on HTML5 Canvas

2 lines 32.2 kB
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("px-brush",[],e):"object"==typeof exports?exports["px-brush"]=e():t["px-brush"]=e()}("undefined"!=typeof self?self:this,(function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var a=e[n]={i:n,l:!1,exports:{}};return t[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)r.d(n,a,function(e){return t[e]}.bind(null,a));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";function n(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(!(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t)))return;var r=[],n=!0,a=!1,o=void 0;try{for(var i,c=t[Symbol.iterator]();!(n=(i=c.next()).done)&&(r.push(i.value),!e||r.length!==e);n=!0);}catch(t){a=!0,o=t}finally{try{n||null==c.return||c.return()}finally{if(a)throw o}}return r}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(t){return function(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e<t.length;e++)r[e]=t[e];return r}}(t)||function(t){if(Symbol.iterator in Object(t)||"[object Arguments]"===Object.prototype.toString.call(t))return Array.from(t)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function o(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}r.r(e);var i=/^#?[0-9A-Fa-f]{1,2}[0-9A-Fa-f]{1,2}[0-9A-Fa-f]{1,2}$/,c=/^rgb\((\s+)?[0-9]{1,3},(\s+)?[0-9]{1,3},(\s+)?[0-9]{1,3}(\s+)?\)$/,s=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.canvases={}}var e,r,s;return e=t,(r=[{key:"parseColor",value:function(t){var e=i.test(t),r=c.test(t);if(!e&&!r)throw new Error("Color is not correct format. #123123 or rgb(123, 123, 123) format required.");if(e){var o="#"===t[0]?t.slice(1):t;return o=3===o.length?o.split("").reduce((function(t,e){return[].concat(a(t),[e,e])}),[]).join(""):o,{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16)}}if(r){var s=n(t.replace(/rgb|\s+|\(|\)/g,"").split(",").map((function(t){return parseInt(t)})),3),u=s[0],l=s[1],f=s[2];return{r:u=u>255?255:u,g:l=l>255?255:l,b:f=f>255?255:f}}}},{key:"make",value:function(t){var e=t.size,r=t.color;try{e*=window.devicePixelRatio;var n=this.parseColor(r),a=JSON.stringify(n);if(this.canvases[a]=this.canvases[a]||{},null!=this.canvases[a][e])return this.canvases[a][e];var o=document.createElement("canvas");e+=e%2,o.width=e,o.height=e;for(var i=o.getContext("2d"),c=i.createImageData(e,e),s=0;s<c.data.length;s+=4)c.data[s]=255,c.data[s+1]=255,c.data[s+2]=255,c.data[s+3]=0;return this.plotCircle(2*e,4*e*(e/2),e/2,c,e,n),this.fillCircle(c,n),i.putImageData(c,0,0),this.canvases[a][e]=o,o}catch(t){console.error(t)}}},{key:"plotCircle",value:function(t,e,r,n,a,o){var i=-r,c=0,s=2-2*r;do{var u=t-4*(i+1)+(e+4*a*(c-1));n.data[u+0]=o.r,n.data[u+1]=o.g,n.data[u+2]=o.b,n.data[u+3]=255;var l=t-c*(4*a)+(e-4*(i+1));n.data[l+0]=o.r,n.data[l+1]=o.g,n.data[l+2]=o.b,n.data[l+3]=255;var f=t+4*i+(e-c*(4*a));n.data[f+0]=o.r,n.data[f+1]=o.g,n.data[f+2]=o.b,n.data[f+3]=255;var d=t+4*a*(c-1)+(e+4*i);n.data[d+0]=o.r,n.data[d+1]=o.g,n.data[d+2]=o.b,n.data[d+3]=255,(r=s)<=c&&(s+=2*++c+1),(r>i||s>c)&&(s+=2*++i+1)}while(i<0)}},{key:"fillCircle",value:function(t,e){for(var r=4*t.width,n=1;n<t.height-1;n+=1)for(var a=!1,o=!1,i=!1,c=0;c<r;c+=4){var s=r*n+c,u=t.data[s+3],l=255===u;l&&!a?a=!0:0===u&&a?o=!0:l&&a&&o&&(i=!0),a&&o&&!i&&(t.data[s]=e.r,t.data[s+1]=e.g,t.data[s+2]=e.b,t.data[s+3]=255)}}}])&&o(e.prototype,r),s&&o(e,s),t}();function u(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.canvas=e,this.context=e.getContext("2d"),this.stampMaker=new s,this.configPixelRatio()}var e,r,n;return e=t,(r=[{key:"configPixelRatio",value:function(){var t=this.canvas,e=t.width,r=t.height;this.canvas.width=e*this.dpr,this.canvas.height=r*this.dpr,this.canvas.style.width="".concat(e,"px"),this.canvas.style.height="".concat(r,"px"),this.context.scale(this.dpr,this.dpr),this.context.imageSmoothingEnabled=!1}},{key:"exportAsPNG",value:function(t){var e=this;return new Promise((function(r){var n=document.createElement("canvas"),a=n.getContext("2d"),o=e.canvas,i=o.width,c=o.height,s=i/e.dpr,u=c/e.dpr;n.width=s,n.height=u,a.imageSmoothingEnabled=!1,a.drawImage(e.canvas,0,0,i,c,0,0,s,u),n.toBlob((function(e){e.lastModifedDate=new Date,e.name=t,r(e)}))}))}},{key:"distanceBetween",value:function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}},{key:"angleBetween",value:function(t,e){return Math.atan2(e.x-t.x,e.y-t.y)}},{key:"draw",value:function(t){var e=t.from,r=t.to,n=t.size,a=t.color;this.context.globalCompositeOperation="source-over",this.brush({from:e,to:r,size:n,color:a})}},{key:"erase",value:function(t){var e=t.from,r=t.to,n=t.size;this.context.globalCompositeOperation="destination-out",this.brush({from:e,to:r,size:n,color:"#000000"})}},{key:"brush",value:function(t){var e=this,r=t.from,n=t.to,a=t.size,o=t.color,i=(a-a%2)/2,c=this.stampMaker.make({size:a,color:o});if(r.x!==n.x||r.y!==n.y)for(var s=this.distanceBetween(r,n),u=this.angleBetween(r,n),l=function(t){var n=r.x+Math.sin(u)*t-i,o=r.y+Math.cos(u)*t-i;window.requestAnimationFrame((function(){e.context.drawImage(c,Math.round(n),Math.round(o),a,a)}))},f=0;f<s;f+=1)l(f);else{var d=r.x-i,h=r.y-i;this.context.drawImage(c,Math.round(d),Math.round(h),a,a)}}},{key:"dpr",get:function(){return window.devicePixelRatio||1}}])&&u(e.prototype,r),n&&u(e,n),t}();e.default=l}])})); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9weC1icnVzaC93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vcHgtYnJ1c2gvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcHgtYnJ1c2gvLi9zcmMvU3RhbXBNYWtlci5qcyIsIndlYnBhY2s6Ly9weC1icnVzaC8uL3NyYy9QeEJydXNoLmpzIiwid2VicGFjazovL3B4LWJydXNoLy4vc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJ0aGlzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkhleFBhdHRlcm4iLCJSR0JQYXR0ZXJuIiwiU3RhbXBNYWtlciIsImNhbnZhc2VzIiwiY29sb3IiLCJpc0hleCIsInRlc3QiLCJpc1JHQiIsIkVycm9yIiwic2xpY2UiLCJsZW5ndGgiLCJzcGxpdCIsInJlZHVjZSIsImFjYyIsIml0Iiwiam9pbiIsInBhcnNlSW50IiwiZyIsImIiLCJyZXBsYWNlIiwibWFwIiwic2l6ZSIsIndpbmRvdyIsImRldmljZVBpeGVsUmF0aW8iLCJfY29sb3IiLCJwYXJzZUNvbG9yIiwiX3N0ckNvbG9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImNhbnZhcyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIndpZHRoIiwiaGVpZ2h0IiwiY29udGV4dCIsImdldENvbnRleHQiLCJpbWFnZURhdGEiLCJjcmVhdGVJbWFnZURhdGEiLCJkYXRhIiwicGxvdENpcmNsZSIsImZpbGxDaXJjbGUiLCJwdXRJbWFnZURhdGEiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJ4bSIsInltIiwieCIsInkiLCJpaSIsImlpaSIsIml2IiwiY29scyIsInJvdyIsImlzSGl0Q29sb3IiLCJpc0hpdENsZWFyIiwiaXNFbmRlZCIsImNvbCIsImluZGV4IiwiYWxwaGEiLCJpc0NvbG9yIiwiUHhCcnVzaCIsInN0YW1wTWFrZXIiLCJjb25maWdQaXhlbFJhdGlvIiwiZHByIiwic3R5bGUiLCJzY2FsZSIsImltYWdlU21vb3RoaW5nRW5hYmxlZCIsImZpbGVOYW1lIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXN1bHRDYW52YXMiLCJyZXN1bHRDb250ZXh0IiwicmVkdWNlZFdpZHRoIiwicmVkdWNlZEhlaWdodCIsImRyYXdJbWFnZSIsInRvQmxvYiIsImJsb2IiLCJsYXN0TW9kaWZlZERhdGUiLCJEYXRlIiwicG9pbnQxIiwicG9pbnQyIiwiTWF0aCIsInNxcnQiLCJwb3ciLCJhdGFuMiIsImZyb20iLCJ0byIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsImJydXNoIiwiaGFsZlNpemUiLCJzdGFtcCIsIm1ha2UiLCJkaXN0IiwiZGlzdGFuY2VCZXR3ZWVuIiwiYW5nbGUiLCJhbmdsZUJldHdlZW4iLCJzaW4iLCJjb3MiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJyb3VuZCJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBMkNBLEVBQU1DLEdBQzFCLGlCQUFaQyxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxXQUFZLEdBQUlILEdBQ0csaUJBQVpDLFFBQ2RBLFFBQVEsWUFBY0QsSUFFdEJELEVBQUssWUFBY0MsSUFSckIsQ0FTbUIsb0JBQVRL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dkMsRUFBSTJDLEVBQ2IxQyxFQUFJc0MsRUFBS3RDLEVBQUkwQyxFQUNuQjlILEtBQUtzRSxRQUFReUMsVUFBVWdCLEVBQU9ULEtBQUtrQixNQUFNckQsR0FBSW1DLEtBQUtrQixNQUFNcEQsR0FBSTNCLEVBQU1BLE0sMEJBNURwRSxPQUFPQyxPQUFPQyxrQkFBb0IsTyxnQ0NWdkJzQyIsImZpbGUiOiJweC1icnVzaC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInB4LWJydXNoXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInB4LWJydXNoXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInB4LWJydXNoXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbiIsImNvbnN0IEhleFBhdHRlcm4gPSAvXiM/WzAtOUEtRmEtZl17MSwyfVswLTlBLUZhLWZdezEsMn1bMC05QS1GYS1mXXsxLDJ9JC9cbmNvbnN0IFJHQlBhdHRlcm4gPSAvXnJnYlxcKChcXHMrKT9bMC05XXsxLDN9LChcXHMrKT9bMC05XXsxLDN9LChcXHMrKT9bMC05XXsxLDN9KFxccyspP1xcKSQvXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YW1wTWFrZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5jYW52YXNlcyA9IHt9XG4gIH1cblxuICBwYXJzZUNvbG9yIChjb2xvcikge1xuICAgIGNvbnN0IGlzSGV4ID0gSGV4UGF0dGVybi50ZXN0KGNvbG9yKVxuICAgIGNvbnN0IGlzUkdCID0gUkdCUGF0dGVybi50ZXN0KGNvbG9yKVxuICAgIGlmICghaXNIZXggJiYgIWlzUkdCKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yIGlzIG5vdCBjb3JyZWN0IGZvcm1hdC4gIzEyMzEyMyBvciByZ2IoMTIzLCAxMjMsIDEyMykgZm9ybWF0IHJlcXVpcmVkLicpXG4gICAgfVxuICAgIGlmIChpc0hleCkge1xuICAgICAgbGV0IGMgPSBjb2xvclswXSA9PT0gJyMnID8gY29sb3Iuc2xpY2UoMSkgOiBjb2xvclxuICAgICAgYyA9IGMubGVuZ3RoID09PSAzXG4gICAgICAgID8gYy5zcGxpdCgnJykucmVkdWNlKChhY2MsIGl0KSA9PiBbLi4uYWNjLCBpdCwgaXRdLCBbXSkuam9pbignJylcbiAgICAgICAgOiBjXG4gICAgICBjb25zdCByID0gcGFyc2VJbnQoYy5zbGljZSgwLCAyKSwgMTYpXG4gICAgICBjb25zdCBnID0gcGFyc2VJbnQoYy5zbGljZSgyLCA0KSwgMTYpXG4gICAgICBjb25zdCBiID0gcGFyc2VJbnQoYy5zbGljZSg0LCA2KSwgMTYpXG4gICAgICByZXR1cm4geyByLCBnLCBiIH1cbiAgICB9XG4gICAgaWYgKGlzUkdCKSB7XG4gICAgICBsZXQgW3IsIGcsIGJdID0gY29sb3JcbiAgICAgICAgLnJlcGxhY2UoL3JnYnxcXHMrfFxcKHxcXCkvZywgJycpXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoaXQgPT4gcGFyc2VJbnQoaXQpKVxuICAgICAgciA9IHIgPiAyNTUgPyAyNTUgOiByXG4gICAgICBnID0gZyA+IDI1NSA/IDI1NSA6IGdcbiAgICAgIGIgPSBiID4gMjU1ID8gMjU1IDogYlxuICAgICAgcmV0dXJuIHsgciwgZywgYiB9XG4gICAgfVxuICB9XG5cbiAgbWFrZSAoeyBzaXplLCBjb2xvciB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIHNpemUgPSBzaXplICogd2luZG93LmRldmljZVBpeGVsUmF0aW9cbiAgICAgIGNvbnN0IF9jb2xvciA9IHRoaXMucGFyc2VDb2xvcihjb2xvcilcbiAgICAgIGNvbnN0IF9zdHJDb2xvciA9IEpTT04uc3RyaW5naWZ5KF9jb2xvcilcbiAgICAgIHRoaXMuY2FudmFzZXNbX3N0ckNvbG9yXSA9IHRoaXMuY2FudmFzZXNbX3N0ckNvbG9yXSB8fCB7fVxuXG4gICAgICBpZiAodGhpcy5jYW52YXNlc1tfc3RyQ29sb3JdW3NpemVdICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzZXNbX3N0ckNvbG9yXVtzaXplXVxuICAgICAgfVxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgIHNpemUgPSBzaXplICsgKHNpemUgJSAyKVxuICAgICAgY2FudmFzLndpZHRoID0gc2l6ZVxuICAgICAgY2FudmFzLmhlaWdodCA9IHNpemVcblxuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjb250ZXh0LmNyZWF0ZUltYWdlRGF0YShzaXplLCBzaXplKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpbWFnZURhdGEuZGF0YVtpXSA9IDI1NVxuICAgICAgICBpbWFnZURhdGEuZGF0YVtpICsgMV0gPSAyNTVcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGFbaSArIDJdID0gMjU1XG4gICAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAzXSA9IDBcbiAgICAgIH1cbiAgICAgIHRoaXMucGxvdENpcmNsZShzaXplICogMiwgKHNpemUgKiA0KSAqIChzaXplIC8gMiksIHNpemUgLyAyLCBpbWFnZURhdGEsIHNpemUsIF9jb2xvcilcbiAgICAgIHRoaXMuZmlsbENpcmNsZShpbWFnZURhdGEsIF9jb2xvcilcbiAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMClcbiAgICAgIHRoaXMuY2FudmFzZXNbX3N0ckNvbG9yXVtzaXplXSA9IGNhbnZhc1xuICAgICAgcmV0dXJuIGNhbnZhc1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICB9XG5cbiAgcGxvdENpcmNsZSAoeG0sIHltLCByLCBpbWFnZURhdGEsIHNpemUsIGNvbG9yKSB7XG4gICAgbGV0IHggPSAtclxuICAgIGxldCB5ID0gMFxuICAgIGxldCBlcnIgPSAyIC0gMiAqIHIgLyogYm90dG9tIGxlZnQgdG8gdG9wIHJpZ2h0ICovXG5cbiAgICBkbyB7XG4gICAgICAvKiAgIEkuIFF1YWRyYW50ICt4ICt5ICovXG4gICAgICBjb25zdCBpID0geG0gLSAoKHggKyAxKSAqIDQpICsgKHltICsgKCh5IC0gMSkgKiAoc2l6ZSAqIDQpKSlcbiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAwXSA9IGNvbG9yLnJcbiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAxXSA9IGNvbG9yLmdcbiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAyXSA9IGNvbG9yLmJcbiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAzXSA9IDI1NVxuICAgICAgLyogIElJLiBRdWFkcmFudCAteCAreSAqL1xuICAgICAgY29uc3QgaWkgPSB4bSAtICh5ICogKHNpemUgKiA0KSkgKyAoeW0gLSAoKHggKyAxKSAqIDQpKVxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaWkgKyAwXSA9IGNvbG9yLnJcbiAgICAgIGltYWdlRGF0YS5kYXRhW2lpICsgMV0gPSBjb2xvci5nXG4gICAgICBpbWFnZURhdGEuZGF0YVtpaSArIDJdID0gY29sb3IuYlxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaWkgKyAzXSA9IDI1NVxuICAgICAgLyogSUlJLiBRdWFkcmFudCAteCAteSAqL1xuICAgICAgY29uc3QgaWlpID0gKHhtICsgKHggKiA0KSkgKyAoeW0gLSAoeSAqIChzaXplICogNCkpKVxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaWlpICsgMF0gPSBjb2xvci5yXG4gICAgICBpbWFnZURhdGEuZGF0YVtpaWkgKyAxXSA9IGNvbG9yLmdcbiAgICAgIGltYWdlRGF0YS5kYXRhW2lpaSArIDJdID0gY29sb3IuYlxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaWlpICsgM10gPSAyNTVcbiAgICAgIC8qICBJVi4gUXVhZHJhbnQgK3ggLXkgKi9cbiAgICAgIGNvbnN0IGl2ID0gKHhtICsgKCh5IC0gMSkgKiAoc2l6ZSAqIDQpKSkgKyAoeW0gKyAoeCAqIDQpKVxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaXYgKyAwXSA9IGNvbG9yLnJcbiAgICAgIGltYWdlRGF0YS5kYXRhW2l2ICsgMV0gPSBjb2xvci5nXG4gICAgICBpbWFnZURhdGEuZGF0YVtpdiArIDJdID0gY29sb3IuYlxuICAgICAgaW1hZ2VEYXRhLmRhdGFbaXYgKyAzXSA9IDI1NVxuICAgICAgciA9IGVyclxuICAgICAgaWYgKHIgPD0geSkge1xuICAgICAgICBlcnIgKz0gKyt5ICogMiArIDEgLyogeSBzdGVwICovXG4gICAgICB9XG4gICAgICBpZiAociA+IHggfHwgZXJyID4geSkge1xuICAgICAgICBlcnIgKz0gKyt4ICogMiArIDEgLyogeCBzdGVwICovXG4gICAgICB9XG4gICAgfSB3aGlsZSAoeCA8IDApXG4gIH1cblxuICBmaWxsQ2lyY2xlIChpbWFnZURhdGEsIGNvbG9yKSB7XG4gICAgY29uc3QgY29scyA9IGltYWdlRGF0YS53aWR0aCAqIDRcbiAgICBmb3IgKGxldCByb3cgPSAxOyByb3cgPCBpbWFnZURhdGEuaGVpZ2h0IC0gMTsgcm93ICs9IDEpIHtcbiAgICAgIGxldCBpc0hpdENvbG9yID0gZmFsc2VcbiAgICAgIGxldCBpc0hpdENsZWFyID0gZmFsc2VcbiAgICAgIGxldCBpc0VuZGVkID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCArPSA0KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29scyAqIHJvdyArIGNvbFxuICAgICAgICBjb25zdCBhbHBoYSA9IGltYWdlRGF0YS5kYXRhW2luZGV4ICsgM11cbiAgICAgICAgY29uc3QgaXNDb2xvciA9IGFscGhhID09PSAyNTVcbiAgICAgICAgY29uc3QgaXNDbGVhciA9IGFscGhhID09PSAwXG4gICAgICAgIGlmIChpc0NvbG9yICYmICFpc0hpdENvbG9yKSB7XG4gICAgICAgICAgaXNIaXRDb2xvciA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChpc0NsZWFyICYmIGlzSGl0Q29sb3IpIHtcbiAgICAgICAgICBpc0hpdENsZWFyID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKGlzQ29sb3IgJiYgaXNIaXRDb2xvciAmJiBpc0hpdENsZWFyKSB7XG4gICAgICAgICAgaXNFbmRlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNIaXRDb2xvciAmJiBpc0hpdENsZWFyICYmICFpc0VuZGVkKSB7XG4gICAgICAgICAgaW1hZ2VEYXRhLmRhdGFbaW5kZXhdID0gY29sb3IuclxuICAgICAgICAgIGltYWdlRGF0YS5kYXRhW2luZGV4ICsgMV0gPSBjb2xvci5nXG4gICAgICAgICAgaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAyXSA9IGNvbG9yLmJcbiAgICAgICAgICBpbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID0gMjU1XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBTdGFtcE1ha2VyIGZyb20gJy4vU3RhbXBNYWtlcidcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHhCcnVzaCB7XG4gIGNvbnN0cnVjdG9yIChjYW52YXMpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhc1xuICAgIHRoaXMuY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgdGhpcy5zdGFtcE1ha2VyID0gbmV3IFN0YW1wTWFrZXIoKVxuICAgIHRoaXMuY29uZmlnUGl4ZWxSYXRpbygpXG4gIH1cblxuICBnZXQgZHByICgpIHtcbiAgICByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMVxuICB9XG5cbiAgY29uZmlnUGl4ZWxSYXRpbyAoKSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNhbnZhc1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGggKiB0aGlzLmRwclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHRoaXMuZHByXG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGBcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgXG4gICAgdGhpcy5jb250ZXh0LnNjYWxlKHRoaXMuZHByLCB0aGlzLmRwcilcbiAgICB0aGlzLmNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2VcbiAgfVxuXG4gIGV4cG9ydEFzUE5HIChmaWxlTmFtZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICBjb25zdCByZXN1bHRDb250ZXh0ID0gcmVzdWx0Q2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNcbiAgICAgIGNvbnN0IHJlZHVjZWRXaWR0aCA9IHdpZHRoIC8gdGhpcy5kcHJcbiAgICAgIGNvbnN0IHJlZHVjZWRIZWlnaHQgPSBoZWlnaHQgLyB0aGlzLmRwclxuICAgICAgcmVzdWx0Q2FudmFzLndpZHRoID0gcmVkdWNlZFdpZHRoXG4gICAgICByZXN1bHRDYW52YXMuaGVpZ2h0ID0gcmVkdWNlZEhlaWdodFxuICAgICAgcmVzdWx0Q29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuICAgICAgcmVzdWx0Q29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAwLCAwLCByZWR1Y2VkV2lkdGgsIHJlZHVjZWRIZWlnaHRcbiAgICAgIClcbiAgICAgIHJlc3VsdENhbnZhcy50b0Jsb2IoYmxvYiA9PiB7XG4gICAgICAgIGJsb2IubGFzdE1vZGlmZWREYXRlID0gbmV3IERhdGUoKVxuICAgICAgICBibG9iLm5hbWUgPSBmaWxlTmFtZVxuICAgICAgICByZXNvbHZlKGJsb2IpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBkaXN0YW5jZUJldHdlZW4gKHBvaW50MSwgcG9pbnQyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwb2ludDIueCAtIHBvaW50MS54LCAyKSArIE1hdGgucG93KHBvaW50Mi55IC0gcG9pbnQxLnksIDIpKVxuICB9XG5cbiAgYW5nbGVCZXR3ZWVuIChwb2ludDEsIHBvaW50Mikge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHBvaW50Mi54IC0gcG9pbnQxLngsIHBvaW50Mi55IC0gcG9pbnQxLnkpXG4gIH1cblxuICBkcmF3ICh7IGZyb20sIHRvLCBzaXplLCBjb2xvciB9KSB7XG4gICAgdGhpcy5jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3ZlcidcbiAgICB0aGlzLmJydXNoKHsgZnJvbSwgdG8sIHNpemUsIGNvbG9yIH0pXG4gIH1cblxuICBlcmFzZSAoeyBmcm9tLCB0bywgc2l6ZSB9KSB7XG4gICAgdGhpcy5jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnXG4gICAgdGhpcy5icnVzaCh7IGZyb20sIHRvLCBzaXplLCBjb2xvcjogJyMwMDAwMDAnIH0pXG4gIH1cblxuICBicnVzaCAoeyBmcm9tLCB0bywgc2l6ZSwgY29sb3IgfSkge1xuICAgIGNvbnN0IGhhbGZTaXplID0gKHNpemUgLSAoc2l6ZSAlIDIpKSAvIDJcbiAgICBjb25zdCBzdGFtcCA9IHRoaXMuc3RhbXBNYWtlci5tYWtlKHsgc2l6ZSwgY29sb3IgfSlcbiAgICBpZiAoZnJvbS54ID09PSB0by54ICYmIGZyb20ueSA9PT0gdG8ueSkge1xuICAgICAgY29uc3QgeCA9IGZyb20ueCAtIGhhbGZTaXplXG4gICAgICBjb25zdCB5ID0gZnJvbS55IC0gaGFsZlNpemVcbiAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2Uoc3RhbXAsIE1hdGgucm91bmQoeCksIE1hdGgucm91bmQoeSksIHNpemUsIHNpemUpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZGlzdCA9IHRoaXMuZGlzdGFuY2VCZXR3ZWVuKGZyb20sIHRvKVxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5hbmdsZUJldHdlZW4oZnJvbSwgdG8pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXN0OyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHggPSBmcm9tLnggKyAoTWF0aC5zaW4oYW5nbGUpICogaSkgLSBoYWxmU2l6ZVxuICAgICAgY29uc3QgeSA9IGZyb20ueSArIChNYXRoLmNvcyhhbmdsZSkgKiBpKSAtIGhhbGZTaXplXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmRyYXdJbWFnZShzdGFtcCwgTWF0aC5yb3VuZCh4KSwgTWF0aC5yb3VuZCh5KSwgc2l6ZSwgc2l6ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUHhCcnVzaCBmcm9tICcuL1B4QnJ1c2gnXG5leHBvcnQgZGVmYXVsdCBQeEJydXNoIl0sInNvdXJjZVJvb3QiOiIifQ==