Last active
July 23, 2018 17:53
-
-
Save Anish-Agnihotri/47e76d3e8699b315f739c0ebecb3746a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function() { | |
| // Hungarian notation | |
| // (http://en.wikipedia.org/wiki/Hungarian_notation) | |
| // n - HTML-Node | |
| // o - object | |
| // s - string | |
| // i - integer | |
| // a - array | |
| // b - boolean | |
| // f - float | |
| // p - Particle | |
| // fn - function | |
| // ctx - 2D Context | |
| // General Functions | |
| var app, fnAddEventListener, fnRequestAnimationFrame; | |
| fnRequestAnimationFrame = function(fnCallback) { | |
| var fnAnimFrame; | |
| fnAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(fnCallback) { | |
| window.setTimeOut(fnCallback, 1000 / 60); | |
| }; | |
| fnAnimFrame(fnCallback); | |
| }; | |
| // Add Event Listener | |
| fnAddEventListener = function(o, sEvent, fn) { | |
| if (o.addEventListener) { | |
| o.addEventListener(sEvent, fn, false); | |
| } else { | |
| o['on' + sEvent] = fn; | |
| } | |
| }; | |
| app = function() { | |
| var Particle, ctxRender, fAngle, fCosAngle, fMaxAX, fMaxAY, fMaxAZ, fPI, fSinAngle, fStartVX, fStartVY, fStartVZ, fVX, fnACos, fnCos, fnMax, fnMin, fnNextFrame, fnRender, fnRnd, fnRnd2, fnSetSize, fnSin, fnSwapList, gui, h, iProjSphereX, iProjSphereY, iRadiusSphere, nBody, oBuffer, oDoc, oRadGrad, oRender, oStats, w; | |
| oStats = new Stats(); | |
| oStats.setMode(0); | |
| oStats.domElement.style.position = 'absolute'; | |
| oStats.domElement.style.left = '0px'; | |
| oStats.domElement.style.top = '0px'; | |
| document.body.appendChild(oStats.domElement); | |
| // General Elements | |
| oDoc = document; | |
| nBody = oDoc.body; | |
| // Shortcuts | |
| fPI = Math.PI; | |
| fnMax = Math.max; | |
| fnMin = Math.min; | |
| fnRnd = Math.random; | |
| fnRnd2 = function() { | |
| return 2.0 * fnRnd() - 1.0; | |
| }; | |
| fnCos = Math.cos; | |
| fnACos = Math.acos; | |
| fnSin = Math.sin; | |
| // Sphere Settings | |
| iRadiusSphere = 150; | |
| iProjSphereX = 0; | |
| iProjSphereY = 0; | |
| // Particle Settings | |
| fMaxAX = 0.1; | |
| fMaxAY = 0.1; | |
| fMaxAZ = 0.1; | |
| fStartVX = 0.001; | |
| fStartVY = 0.001; | |
| fStartVZ = 0.001; | |
| fAngle = 0.0; | |
| fSinAngle = 0.0; | |
| fCosAngle = 0.0; | |
| window.iFramesToRotate = 2100.0; | |
| window.iPerspective = 220; | |
| window.iNewParticlePerFrame = 4; | |
| window.fGrowDuration = 120.0; | |
| window.fWaitDuration = 340.0; | |
| window.fShrinkDuration = 430.0; | |
| window.aColor = [0, 126, 255]; | |
| window.bgColor = [255, 255, 255]; | |
| fVX = (2.0 * fPI) / window.iFramesToRotate; | |
| oRadGrad = null; | |
| ctxRender = nCanvasRender.getContext('2d'); | |
| oRender = { | |
| pFirst: null | |
| }; | |
| oBuffer = { | |
| pFirst: null | |
| }; | |
| w = h = 0; | |
| // gets/sets size | |
| fnSetSize = function() { | |
| nCanvasRender.width = w = window.innerWidth; | |
| nCanvasRender.height = h = window.innerHeight; | |
| iProjSphereX = w / 2; | |
| iProjSphereY = h / 2; | |
| return { | |
| w: w, | |
| h: h | |
| }; | |
| }; | |
| fnSetSize(); | |
| // window.onresize | |
| fnAddEventListener(window, 'resize', fnSetSize); | |
| fnSwapList = function(p, oSrc, oDst) { | |
| if (p != null) { | |
| // remove p from oSrc | |
| if (oSrc.pFirst === p) { | |
| oSrc.pFirst = p.pNext; | |
| if (p.pNext != null) { | |
| p.pNext.pPrev = null; | |
| } | |
| } else { | |
| p.pPrev.pNext = p.pNext; | |
| if (p.pNext != null) { | |
| p.pNext.pPrev = p.pPrev; | |
| } | |
| } | |
| } else { | |
| // create new p | |
| p = new Particle(); | |
| } | |
| p.pNext = oDst.pFirst; | |
| if (oDst.pFirst != null) { | |
| oDst.pFirst.pPrev = p; | |
| } | |
| oDst.pFirst = p; | |
| p.pPrev = null; | |
| return p; | |
| }; | |
| Particle = (function() { | |
| // Particle | |
| class Particle { | |
| fnInit() { | |
| this.fAngle = fnRnd() * fPI * 2; | |
| this.fForce = fnACos(fnRnd2()); | |
| this.fAlpha = 0; | |
| this.bIsDead = false; | |
| this.iFramesAlive = 0; | |
| this.fX = iRadiusSphere * fnSin(this.fForce) * fnCos(this.fAngle); | |
| this.fY = iRadiusSphere * fnSin(this.fForce) * fnSin(this.fAngle); | |
| this.fZ = iRadiusSphere * fnCos(this.fForce); | |
| this.fVX = fStartVX * this.fX; | |
| this.fVY = fStartVY * this.fY; | |
| this.fVZ = fStartVZ * this.fZ; | |
| this.fGrowDuration = window.fGrowDuration + fnRnd2() * (window.fGrowDuration / 4.0); | |
| this.fWaitDuration = window.fWaitDuration + fnRnd2() * (window.fWaitDuration / 4.0); | |
| this.fShrinkDuration = window.fShrinkDuration + fnRnd2() * (window.fShrinkDuration / 4.0); | |
| this.fAX = 0.0; | |
| this.fAY = 0.0; | |
| this.fAZ = 0.0; | |
| } | |
| fnUpdate() { | |
| if (this.iFramesAlive > this.fGrowDuration + this.fWaitDuration) { | |
| this.fVX += this.fAX + fMaxAX * fnRnd2(); | |
| this.fVY += this.fAY + fMaxAY * fnRnd2(); | |
| this.fVZ += this.fAZ + fMaxAZ * fnRnd2(); | |
| this.fX += this.fVX; | |
| this.fY += this.fVY; | |
| this.fZ += this.fVZ; | |
| } | |
| this.fRotX = fCosAngle * this.fX + fSinAngle * this.fZ; | |
| this.fRotZ = -fSinAngle * this.fX + fCosAngle * this.fZ; | |
| this.fRadiusCurrent = Math.max(0.01, window.iPerspective / (window.iPerspective - this.fRotZ)); | |
| this.fProjX = this.fRotX * this.fRadiusCurrent + iProjSphereX; | |
| this.fProjY = this.fY * this.fRadiusCurrent + iProjSphereY; | |
| this.iFramesAlive += 1; | |
| if (this.iFramesAlive < this.fGrowDuration) { | |
| this.fAlpha = this.iFramesAlive * 1.0 / this.fGrowDuration; | |
| } else if (this.iFramesAlive < this.fGrowDuration + this.fWaitDuration) { | |
| this.fAlpha = 1.0; | |
| } else if (this.iFramesAlive < this.fGrowDuration + this.fWaitDuration + this.fShrinkDuration) { | |
| this.fAlpha = (this.fGrowDuration + this.fWaitDuration + this.fShrinkDuration - this.iFramesAlive) * 1.0 / this.fShrinkDuration; | |
| } else { | |
| this.bIsDead = true; | |
| } | |
| if (this.bIsDead === true) { | |
| fnSwapList(this, oRender, oBuffer); | |
| } | |
| this.fAlpha *= fnMin(1.0, fnMax(0.5, this.fRotZ / iRadiusSphere)); | |
| this.fAlpha = fnMin(1.0, fnMax(0.0, this.fAlpha)); | |
| } | |
| }; | |
| // Current Position | |
| Particle.prototype.fX = 0.0; | |
| Particle.prototype.fY = 0.0; | |
| Particle.prototype.fZ = 0.0; | |
| // Current Velocity | |
| Particle.prototype.fVX = 0.0; | |
| Particle.prototype.fVY = 0.0; | |
| Particle.prototype.fVZ = 0.0; | |
| // Current Acceleration | |
| Particle.prototype.fAX = 0.0; | |
| Particle.prototype.fAY = 0.0; | |
| Particle.prototype.fAZ = 0.0; | |
| // Projection Position | |
| Particle.prototype.fProjX = 0.0; | |
| Particle.prototype.fProjY = 0.0; | |
| // Rotation | |
| Particle.prototype.fRotX = 0.0; | |
| Particle.prototype.fRotZ = 0.0; | |
| // double linked list | |
| Particle.prototype.pPrev = null; | |
| Particle.prototype.pNext = null; | |
| Particle.prototype.fAngle = 0.0; | |
| Particle.prototype.fForce = 0.0; | |
| Particle.prototype.fGrowDuration = 0.0; | |
| Particle.prototype.fWaitDuration = 0.0; | |
| Particle.prototype.fShrinkDuration = 0.0; | |
| Particle.prototype.fRadiusCurrent = 0.0; | |
| Particle.prototype.iFramesAlive = 0; | |
| Particle.prototype.bIsDead = false; | |
| return Particle; | |
| }).call(this); | |
| fnRender = function() { | |
| var iCount, p; | |
| ctxRender.fillStyle = "rgb(" + window.bgColor.join(',') + ")"; | |
| ctxRender.fillRect(0, 0, w, h); | |
| p = oRender.pFirst; | |
| iCount = 0; | |
| while (p != null) { | |
| ctxRender.fillStyle = "rgba(" + window.aColor.join(',') + ',' + p.fAlpha.toFixed(4) + ")"; | |
| ctxRender.beginPath(); | |
| ctxRender.arc(p.fProjX, p.fProjY, p.fRadiusCurrent, 0, 2 * fPI, false); | |
| ctxRender.closePath(); | |
| ctxRender.fill(); | |
| p = p.pNext; | |
| iCount += 1; | |
| } | |
| }; | |
| fnNextFrame = function() { | |
| var iAddParticle, iCount, p, pNext; | |
| oStats.begin(); | |
| fAngle = (fAngle + fVX) % (2.0 * fPI); | |
| fSinAngle = fnSin(fAngle); | |
| fCosAngle = fnCos(fAngle); | |
| iAddParticle = 0; | |
| iCount = 0; | |
| while (iAddParticle++ < window.iNewParticlePerFrame) { | |
| p = fnSwapList(oBuffer.pFirst, oBuffer, oRender); | |
| p.fnInit(); | |
| } | |
| p = oRender.pFirst; | |
| while (p != null) { | |
| pNext = p.pNext; | |
| p.fnUpdate(); | |
| p = pNext; | |
| iCount++; | |
| } | |
| fnRender(); | |
| oStats.end(); | |
| return fnRequestAnimationFrame(function() { | |
| return fnNextFrame(); | |
| }); | |
| }; | |
| fnNextFrame(); | |
| gui = new dat.GUI(); | |
| gui.add(window, 'fGrowDuration').min(10).max(500).step(1); | |
| gui.add(window, 'fWaitDuration').min(10).max(500).step(1); | |
| gui.add(window, 'fShrinkDuration').min(10).max(500).step(1); | |
| gui.add(window, 'iPerspective').min(150).max(1000).step(1); | |
| gui.add(window, 'iNewParticlePerFrame').min(1).max(20).step(1); | |
| gui.add(window, 'iFramesToRotate').min(50).max(2500).step(50).onChange(function() { | |
| return fVX = (2.0 * fPI) / window.iFramesToRotate; | |
| }); | |
| gui.addColor(window, 'aColor').onChange(function() { | |
| window.aColor[0] = ~~window.aColor[0]; | |
| window.aColor[1] = ~~window.aColor[1]; | |
| return window.aColor[2] = ~~window.aColor[2]; | |
| }); | |
| gui.addColor(window, 'bgColor').onChange(function() { | |
| window.bgColor[0] = ~~window.bgColor[0]; | |
| window.bgColor[1] = ~~window.bgColor[1]; | |
| return window.bgColor[2] = ~~window.bgColor[2]; | |
| }); | |
| if (window.innerWidth < 1000) { | |
| gui.close(); | |
| window.iNewParticlePerFrame = 5; | |
| } | |
| window.app = this; | |
| }; | |
| fnAddEventListener(window, 'load', app); | |
| }).call(this); | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiPGFub255bW91cz4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFBLEdBQUEsRUFBQSxrQkFBQSxFQUFBOztFQWNBLHVCQUFBLEdBQTBCLFFBQUEsQ0FBQyxVQUFELENBQUE7QUFDeEIsUUFBQTtJQUFBLFdBQUEsR0FDRSxNQUFNLENBQUMscUJBQVAsSUFDQSxNQUFNLENBQUMsMkJBRFAsSUFFQSxNQUFNLENBQUMsd0JBRlAsSUFHQSxNQUFNLENBQUMsc0JBSFAsSUFJQSxNQUFNLENBQUMsdUJBSlAsSUFLQSxRQUFBLENBQUMsVUFBRCxDQUFBO01BQ0UsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsVUFBbEIsRUFBOEIsSUFBQSxHQUFPLEVBQXJDO0lBREY7SUFHRixXQUFBLENBQVksVUFBWjtFQVZ3QixFQWQxQjs7O0VBNEJBLGtCQUFBLEdBQXFCLFFBQUEsQ0FBQyxDQUFELEVBQUksTUFBSixFQUFZLEVBQVosQ0FBQTtJQUNuQixJQUFHLENBQUMsQ0FBQyxnQkFBTDtNQUNFLENBQUMsQ0FBQyxnQkFBRixDQUFtQixNQUFuQixFQUEyQixFQUEzQixFQUErQixLQUEvQixFQURGO0tBQUEsTUFBQTtNQUdFLENBQUUsQ0FBQSxJQUFBLEdBQU8sTUFBUCxDQUFGLEdBQW1CLEdBSHJCOztFQURtQjs7RUFPckIsR0FBQSxHQUFNLFFBQUEsQ0FBQSxDQUFBO0FBRUosUUFBQSxRQUFBLEVBQUEsU0FBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEsRUFBQSxRQUFBLEVBQUEsUUFBQSxFQUFBLFFBQUEsRUFBQSxHQUFBLEVBQUEsTUFBQSxFQUFBLEtBQUEsRUFBQSxLQUFBLEVBQUEsS0FBQSxFQUFBLFdBQUEsRUFBQSxRQUFBLEVBQUEsS0FBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsS0FB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Q0FBQSxDQUFBO0lBSEUsQ0FBekM7SUFLQSxJQUFHLE1BQU0sQ0FBQyxVQUFQLEdBQW9CLElBQXZCO01BQ0UsR0FBRyxDQUFDLEtBQUosQ0FBQTtNQUNBLE1BQU0sQ0FBQyxvQkFBUCxHQUE4QixFQUZoQzs7SUFJQSxNQUFNLENBQUMsR0FBUCxHQUFhO0VBalBUOztFQW9QTixrQkFBQSxDQUFtQixNQUFuQixFQUEyQixNQUEzQixFQUFtQyxHQUFuQztBQXZSQSIsInNvdXJjZXNDb250ZW50IjpbIiMgSHVuZ2FyaWFuIG5vdGF0aW9uXG4jIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1bmdhcmlhbl9ub3RhdGlvbilcbiMgbiAtIEhUTUwtTm9kZVxuIyBvIC0gb2JqZWN0XG4jIHMgLSBzdHJpbmdcbiMgaSAtIGludGVnZXJcbiMgYSAtIGFycmF5XG4jIGIgLSBib29sZWFuXG4jIGYgLSBmbG9hdFxuIyBwIC0gUGFydGljbGVcbiMgZm4gLSBmdW5jdGlvblxuIyBjdHggLSAyRCBDb250ZXh0XG5cbiMgR2VuZXJhbCBGdW5jdGlvbnNcbmZuUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKGZuQ2FsbGJhY2spIC0+XG4gIGZuQW5pbUZyYW1lID1cbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9yXG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb3JcbiAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSBvclxuICAgIChmbkNhbGxiYWNrKSAtPlxuICAgICAgd2luZG93LnNldFRpbWVPdXQoZm5DYWxsYmFjaywgMTAwMCAvIDYwKVxuICAgICAgcmV0dXJuXG4gIGZuQW5pbUZyYW1lIGZuQ2FsbGJhY2tcbiAgcmV0dXJuXG5cbiMgQWRkIEV2ZW50IExpc3RlbmVyXG5mbkFkZEV2ZW50TGlzdGVuZXIgPSAobywgc0V2ZW50LCBmbikgLT5cbiAgaWYgby5hZGRFdmVudExpc3RlbmVyXG4gICAgby5hZGRFdmVudExpc3RlbmVyKHNFdmVudCwgZm4sIGZhbHNlKVxuICBlbHNlXG4gICAgb1snb24nICsgc0V2ZW50XSA9IGZuXG4gIHJldHVyblxuXG5hcHAgPSAoKSAtPlxuXG4gIG9TdGF0cyA9IG5ldyBTdGF0cygpXG4gIG9TdGF0cy5zZXRNb2RlKDApXG4gIG9TdGF0cy5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBvU3RhdHMuZG9tRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzBweCdcbiAgb1N0YXRzLmRvbUVsZW1lbnQuc3R5bGUudG9wID0gJzBweCdcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvU3RhdHMuZG9tRWxlbWVudClcblxuICAjIEdlbmVyYWwgRWxlbWVudHNcbiAgb0RvYyA9IGRvY3VtZW50XG4gIG5Cb2R5ID0gb0RvYy5ib2R5XG4gICMgU2hvcnRjdXRzXG4gIGZQSSA9IE1hdGguUElcbiAgZm5NYXggPSBNYXRoLm1heFxuICBmbk1pbiA9IE1hdGgubWluXG4gIGZuUm5kID0gTWF0aC5yYW5kb21cbiAgZm5SbmQyID0gKCkgLT4gMi4wICogZm5SbmQoKSAtIDEuMFxuICBmbkNvcyA9IE1hdGguY29zXG4gIGZuQUNvcyA9IE1hdGguYWNvc1xuICBmblNpbiA9IE1hdGguc2luXG4gICMgU3BoZXJlIFNldHRpbmdzXG4gIGlSYWRpdXNTcGhlcmUgPSAxNTBcbiAgaVByb2pTcGhlcmVYID0gMFxuICBpUHJvalNwaGVyZVkgPSAwXG4gICMgUGFydGljbGUgU2V0dGluZ3NcbiAgZk1heEFYID0gMC4xXG4gIGZNYXhBWSA9IDAuMVxuICBmTWF4QVogPSAwLjFcbiAgZlN0YXJ0VlggPSAwLjAwMVxuICBmU3RhcnRWWSA9IDAuMDAxXG4gIGZTdGFydFZaID0gMC4wMDFcbiAgZkFuZ2xlID0gMC4wXG4gIGZTaW5BbmdsZSA9IDAuMFxuICBmQ29zQW5nbGUgPSAwLjBcblxuICB3aW5kb3cuaUZyYW1lc1RvUm90YXRlID0gMjEwMC4wXG4gIHdpbmRvdy5pUGVyc3BlY3RpdmUgPSAyMjBcbiAgd2luZG93LmlOZXdQYXJ0aWNsZVBlckZyYW1lID0gNFxuICB3aW5kb3cuZkdyb3dEdXJhdGlvbiA9IDEyMC4wXG4gIHdpbmRvdy5mV2FpdER1cmF0aW9uID0gMzQwLjBcbiAgd2luZG93LmZTaHJpbmtEdXJhdGlvbiA9IDQzMC4wXG4gIHdpbmRvdy5hQ29sb3IgPSBbMCwgMTI2LCAyNTVdXG4gIHdpbmRvdy5iZ0NvbG9yID0gWzI1NSwgMjU1LCAyNTVdXG5cbiAgZlZYID0gKDIuMCAqIGZQSSkgLyB3aW5kb3cuaUZyYW1lc1RvUm90YXRlXG5cbiAgb1JhZEdyYWQgPSBudWxsXG4gIGN0eFJlbmRlciA9IG5DYW52YXNSZW5kZXIuZ2V0Q29udGV4dCAnMmQnXG5cblxuICBvUmVuZGVyID0ge3BGaXJzdDogbnVsbH1cbiAgb0J1ZmZlciA9IHtwRmlyc3Q6IG51bGx9XG4gIFxuICB3ID0gaCA9IDBcblxuICAjIGdldHMvc2V0cyBzaXplXG4gIGZuU2V0U2l6ZSA9ICgpIC0+XG4gICAgbkNhbnZhc1JlbmRlci53aWR0aCA9IHcgPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIG5DYW52YXNSZW5kZXIuaGVpZ2h0ID0gaCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGlQcm9qU3BoZXJlWCA9IHcgLyAyXG4gICAgaVByb2pTcGhlcmVZID0gaCAvIDJcbiAgICB7dzogdywgaDogaH1cblxuICBmblNldFNpemUoKVxuICBcbiAgIyB3aW5kb3cub25yZXNpemVcbiAgZm5BZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGZuU2V0U2l6ZSlcblxuICBmblN3YXBMaXN0ID0gKHAsIG9TcmMsIG9Ec3QpIC0+XG4gICAgaWYgcD9cbiAgICAgICMgcmVtb3ZlIHAgZnJvbSBvU3JjXG4gICAgICBpZiBvU3JjLnBGaXJzdCBpcyBwXG4gICAgICAgIG9TcmMucEZpcnN0ID0gcC5wTmV4dFxuICAgICAgICBwLnBOZXh0LnBQcmV2ID0gbnVsbCBpZiBwLnBOZXh0P1xuICAgICAgZWxzZVxuICAgICAgICBwLnBQcmV2LnBOZXh0ID0gcC5wTmV4dFxuICAgICAgICBwLnBOZXh0LnBQcmV2ID0gcC5wUHJldiBpZiBwLnBOZXh0P1xuICAgIGVsc2VcbiAgICAgICMgY3JlYXRlIG5ldyBwXG4gICAgICBwID0gbmV3IFBhcnRpY2xlKClcbiAgXG4gICAgcC5wTmV4dCA9IG9Ec3QucEZpcnN0XG4gICAgb0RzdC5wRmlyc3QucFByZXYgPSBwIGlmIG9Ec3QucEZpcnN0P1xuICAgIG9Ec3QucEZpcnN0ID0gcFxuICAgIHAucFByZXYgPSBudWxsXG4gICAgcFxuICBcbiAgIyBQYXJ0aWNsZVxuICBjbGFzcyBQYXJ0aWNsZVxuICAgICMgQ3VycmVudCBQb3NpdGlvblxuICAgIGZYOiAwLjBcbiAgICBmWTogMC4wXG4gICAgZlo6IDAuMFxuICAgICMgQ3VycmVudCBWZWxvY2l0eVxuICAgIGZWWDogMC4wXG4gICAgZlZZOiAwLjBcbiAgICBmVlo6IDAuMFxuICAgICMgQ3VycmVudCBBY2NlbGVyYXRpb25cbiAgICBmQVg6IDAuMFxuICAgIGZBWTogMC4wXG4gICAgZkFaOiAwLjBcbiAgICAjIFByb2plY3Rpb24gUG9zaXRpb25cbiAgICBmUHJvalg6IDAuMFxuICAgIGZQcm9qWTogMC4wXG4gICAgIyBSb3RhdGlvblxuICAgIGZSb3RYOiAwLjBcbiAgICBmUm90WjogMC4wXG4gICAgIyBkb3VibGUgbGlua2VkIGxpc3RcbiAgICBwUHJldjogbnVsbFxuICAgIHBOZXh0OiBudWxsXG4gICAgXG4gICAgZkFuZ2xlOiAwLjBcbiAgICBmRm9yY2U6IDAuMFxuXG4gICAgZkdyb3dEdXJhdGlvbjogMC4wXG4gICAgZldhaXREdXJhdGlvbjogMC4wXG4gICAgZlNocmlua0R1cmF0aW9uOiAwLjBcbiAgICBcbiAgICBmUmFkaXVzQ3VycmVudDogMC4wXG4gICAgXG4gICAgaUZyYW1lc0FsaXZlOiAwXG4gICAgYklzRGVhZDogZmFsc2VcbiAgICAgIFxuICAgIGZuSW5pdDogKCkgLT5cbiAgICAgIEBmQW5nbGUgPSBmblJuZCgpICogZlBJICogMlxuICAgICAgQGZGb3JjZSA9IGZuQUNvcyhmblJuZDIoKSlcbiAgICAgIEBmQWxwaGEgPSAwXG4gICAgICBAYklzRGVhZCA9IGZhbHNlO1xuICAgICAgQGlGcmFtZXNBbGl2ZSA9IDA7XG4gICAgICBAZlggPSBpUmFkaXVzU3BoZXJlICogZm5TaW4oQGZGb3JjZSkgKiBmbkNvcyhAZkFuZ2xlKVxuICAgICAgQGZZID0gaVJhZGl1c1NwaGVyZSAqIGZuU2luKEBmRm9yY2UpICogZm5TaW4oQGZBbmdsZSlcbiAgICAgIEBmWiA9IGlSYWRpdXNTcGhlcmUgKiBmbkNvcyhAZkZvcmNlKVxuICAgICAgQGZWWCA9IGZTdGFydFZYICogQGZYXG4gICAgICBAZlZZID0gZlN0YXJ0VlkgKiBAZllcbiAgICAgIEBmVlogPSBmU3RhcnRWWiAqIEBmWlxuICAgICAgQGZHcm93RHVyYXRpb24gPSB3aW5kb3cuZkdyb3dEdXJhdGlvbiArIGZuUm5kMigpICogKHdpbmRvdy5mR3Jvd0R1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZXYWl0RHVyYXRpb24gPSB3aW5kb3cuZldhaXREdXJhdGlvbiArIGZuUm5kMigpICogKHdpbmRvdy5mV2FpdER1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZTaHJpbmtEdXJhdGlvbiA9IHdpbmRvdy5mU2hyaW5rRHVyYXRpb24gKyBmblJuZDIoKSAqICh3aW5kb3cuZlNocmlua0R1cmF0aW9uIC8gNC4wKVxuICAgICAgQGZBWCA9IDAuMFxuICAgICAgQGZBWSA9IDAuMFxuICAgICAgQGZBWiA9IDAuMFxuICAgICAgcmV0dXJuXG4gIFxuICAgIGZuVXBkYXRlOiAoKSAtPlxuICAgICAgaWYgQGlGcmFtZXNBbGl2ZSA+IEBmR3Jvd0R1cmF0aW9uICsgQGZXYWl0RHVyYXRpb25cbiAgICAgICAgQGZWWCArPSBAZkFYICsgZk1heEFYICogZm5SbmQyKClcbiAgICAgICAgQGZWWSArPSBAZkFZICsgZk1heEFZICogZm5SbmQyKClcbiAgICAgICAgQGZWWiArPSBAZkFaICsgZk1heEFaICogZm5SbmQyKClcbiAgICAgICAgQGZYICs9IEBmVlhcbiAgICAgICAgQGZZICs9IEBmVllcbiAgICAgICAgQGZaICs9IEBmVlpcblxuICAgICAgQGZSb3RYID0gZkNvc0FuZ2xlICogQGZYICsgZlNpbkFuZ2xlICogQGZaXG4gICAgICBAZlJvdFogPSAtZlNpbkFuZ2xlICogQGZYICsgZkNvc0FuZ2xlICogQGZaXG4gICAgICBAZlJhZGl1c0N1cnJlbnQgPSBNYXRoLm1heCgwLjAxLCB3aW5kb3cuaVBlcnNwZWN0aXZlIC8gKHdpbmRvdy5pUGVyc3BlY3RpdmUgLSBAZlJvdFopKVxuICAgICAgQGZQcm9qWCA9IEBmUm90WCAqIEBmUmFkaXVzQ3VycmVudCArIGlQcm9qU3BoZXJlWCBcbiAgICAgIEBmUHJvalkgPSBAZlkgKiBAZlJhZGl1c0N1cnJlbnQgKyBpUHJvalNwaGVyZVkgXG5cbiAgICAgIEBpRnJhbWVzQWxpdmUgKz0gMVxuXG4gICAgICBpZiBAaUZyYW1lc0FsaXZlIDwgQGZHcm93RHVyYXRpb25cbiAgICAgICAgQGZBbHBoYSA9IEBpRnJhbWVzQWxpdmUgKiAxLjAgLyBAZkdyb3dEdXJhdGlvblxuICAgICAgZWxzZSBpZiBAaUZyYW1lc0FsaXZlIDwgQGZHcm93RHVyYXRpb24gKyBAZldhaXREdXJhdGlvblxuICAgICAgICBAZkFscGhhID0gMS4wXG4gICAgICBlbHNlIGlmIEBpRnJhbWVzQWxpdmUgPCBAZkdyb3dEdXJhdGlvbiArIEBmV2FpdER1cmF0aW9uICsgQGZTaHJpbmtEdXJhdGlvblxuICAgICAgICBAZkFscGhhID0gKEBmR3Jvd0R1cmF0aW9uICsgQGZXYWl0RHVyYXRpb24gKyBAZlNocmlua0R1cmF0aW9uIC0gQGlGcmFtZXNBbGl2ZSkgKiAxLjAgLyBAZlNocmlua0R1cmF0aW9uXG4gICAgICBlbHNlXG4gICAgICAgIEBiSXNEZWFkID0gdHJ1ZVxuXG4gICAgICBpZiBAYklzRGVhZCBpcyB0cnVlXG4gICAgICAgIGZuU3dhcExpc3QoQCwgb1JlbmRlciwgb0J1ZmZlcilcblxuICAgICAgQGZBbHBoYSAqPSBmbk1pbigxLjAsIGZuTWF4KDAuNSwgQGZSb3RaIC8gaVJhZGl1c1NwaGVyZSkpXG4gICAgICBAZkFscGhhID0gZm5NaW4oMS4wLCBmbk1heCgwLjAsIEBmQWxwaGEpKVxuICAgICAgcmV0dXJuXG4gICAgICBcbiAgZm5SZW5kZXIgPSAoKSAtPlxuICAgIGN0eFJlbmRlci5maWxsU3R5bGUgPSBcInJnYihcIiArIHdpbmRvdy5iZ0NvbG9yLmpvaW4oJywnKSArIFwiKVwiXG4gICAgY3R4UmVuZGVyLmZpbGxSZWN0KDAsIDAsIHcsIGgpXG5cbiAgICBwID0gb1JlbmRlci5wRmlyc3RcbiAgICBpQ291bnQgPSAwXG4gICAgd2hpbGUgcD9cbiAgICAgIGN0eFJlbmRlci5maWxsU3R5bGUgPSBcInJnYmEoXCIgKyB3aW5kb3cuYUNvbG9yLmpvaW4oJywnKSArICcsJyArIHAuZkFscGhhLnRvRml4ZWQoNCkgKyBcIilcIlxuICAgICAgY3R4UmVuZGVyLmJlZ2luUGF0aCgpXG4gICAgICBjdHhSZW5kZXIuYXJjKHAuZlByb2pYLCBwLmZQcm9qWSwgcC5mUmFkaXVzQ3VycmVudCwgMCwgMiAqIGZQSSwgZmFsc2UpXG4gICAgICBjdHhSZW5kZXIuY2xvc2VQYXRoKClcbiAgICAgIGN0eFJlbmRlci5maWxsKClcbiAgICAgIHAgPSBwLnBOZXh0XG4gICAgICBpQ291bnQgKz0gMVxuICAgIHJldHVyblxuICBcbiAgZm5OZXh0RnJhbWUgPSAoKSAtPlxuICAgIG9TdGF0cy5iZWdpbigpXG4gICAgZkFuZ2xlID0gKGZBbmdsZSArIGZWWCkgJSAoMi4wICogZlBJKVxuICAgIGZTaW5BbmdsZSA9IGZuU2luKGZBbmdsZSlcbiAgICBmQ29zQW5nbGUgPSBmbkNvcyhmQW5nbGUpXG5cbiAgICBpQWRkUGFydGljbGUgPSAwXG4gICAgaUNvdW50ID0gMFxuICAgIHdoaWxlIGlBZGRQYXJ0aWNsZSsrIDwgd2luZG93LmlOZXdQYXJ0aWNsZVBlckZyYW1lXG4gICAgICBwID0gZm5Td2FwTGlzdChvQnVmZmVyLnBGaXJzdCwgb0J1ZmZlciwgb1JlbmRlcilcbiAgICAgIHAuZm5Jbml0KClcbiAgXG4gICAgcCA9IG9SZW5kZXIucEZpcnN0XG4gICAgd2hpbGUgcD9cbiAgICAgIHBOZXh0ID0gcC5wTmV4dFxuICAgICAgcC5mblVwZGF0ZSgpXG4gICAgICBwID0gcE5leHRcbiAgICAgIGlDb3VudCsrXG4gICAgZm5SZW5kZXIoKVxuXG4gICAgb1N0YXRzLmVuZCgpXG4gICAgZm5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKCkgLT4gZm5OZXh0RnJhbWUoKSBcbiAgICBcbiAgZm5OZXh0RnJhbWUoKSAgXG5cbiAgZ3VpID0gbmV3IGRhdC5HVUkoKTtcbiAgZ3VpLmFkZCh3aW5kb3csICdmR3Jvd0R1cmF0aW9uJykubWluKDEwKS5tYXgoNTAwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnZldhaXREdXJhdGlvbicpLm1pbigxMCkubWF4KDUwMCkuc3RlcCgxKVxuICBndWkuYWRkKHdpbmRvdywgJ2ZTaHJpbmtEdXJhdGlvbicpLm1pbigxMCkubWF4KDUwMCkuc3RlcCgxKVxuICBndWkuYWRkKHdpbmRvdywgJ2lQZXJzcGVjdGl2ZScpLm1pbigxNTApLm1heCgxMDAwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnaU5ld1BhcnRpY2xlUGVyRnJhbWUnKS5taW4oMSkubWF4KDIwKS5zdGVwKDEpXG4gIGd1aS5hZGQod2luZG93LCAnaUZyYW1lc1RvUm90YXRlJykubWluKDUwKS5tYXgoMjUwMCkuc3RlcCg1MCkub25DaGFuZ2UoKCkgLT5cbiAgICBmVlggPSAoMi4wICogZlBJKSAvIHdpbmRvdy5pRnJhbWVzVG9Sb3RhdGVcbiAgKVxuICBndWkuYWRkQ29sb3Iod2luZG93LCAnYUNvbG9yJykub25DaGFuZ2UoKCkgLT5cbiAgICB3aW5kb3cuYUNvbG9yWzBdID0gfn53aW5kb3cuYUNvbG9yWzBdXG4gICAgd2luZG93LmFDb2xvclsxXSA9IH5+d2luZG93LmFDb2xvclsxXVxuICAgIHdpbmRvdy5hQ29sb3JbMl0gPSB+fndpbmRvdy5hQ29sb3JbMl1cbiAgKVxuICBndWkuYWRkQ29sb3Iod2luZG93LCAnYmdDb2xvcicpLm9uQ2hhbmdlKCgpIC0+XG4gICAgd2luZG93LmJnQ29sb3JbMF0gPSB+fndpbmRvdy5iZ0NvbG9yWzBdXG4gICAgd2luZG93LmJnQ29sb3JbMV0gPSB+fndpbmRvdy5iZ0NvbG9yWzFdXG4gICAgd2luZG93LmJnQ29sb3JbMl0gPSB+fndpbmRvdy5iZ0NvbG9yWzJdXG4gIClcbiAgaWYgd2luZG93LmlubmVyV2lkdGggPCAxMDAwXG4gICAgZ3VpLmNsb3NlKClcbiAgICB3aW5kb3cuaU5ld1BhcnRpY2xlUGVyRnJhbWUgPSA1XG5cbiAgd2luZG93LmFwcCA9IEBcbiAgcmV0dXJuXG4gIFxuZm5BZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ2xvYWQnLCBhcHApIl19 | |
| //# sourceURL=coffeescript |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment