/** * Copyright (c) 2016-2019, The Cytoscape Consortium. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the “Software”), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is furnished to do * so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.cytoscape=t()}(this,function(){"use strict";function E(e){return(E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;n>>0},oe=function(e){return(33*(1>>0},se=function(e,t){var n={value:0,done:!1},r=0,i=e.length;return ie({next:function(){return r>1])<0;)e[n]=a,n=o;return e[n]=i},h=function(e,t,n){var r,i,a,o,s;for(null==n&&(n=d),i=e.length,a=e[s=t],r=2*t+1;rD&&(p[S]=D,y[S]=C,m[S]=x),!r){var T=C*u+k;!r&&p[T]>D&&(p[T]=D,y[T]=k,m[T]=x)}}}for(var P=0;P=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&0<=e.w&&0<=e.h)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},ot=function(e){var t=1t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},ct=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},ht=function(e,t){return ct(e,t.x1,t.y1)&&ct(e,t.x2,t.y2)},dt=function(e,t,n,r,i,a,o){var s,l=Tt(i,a),u=i/2,c=a/2,h=r-c-o;if(0<(s=wt(e,t,n,r,n-u+l-o,h,n+u-l+o,h,!1)).length)return s;var d=n+u+o;if(0<(s=wt(e,t,n,r,d,r-c+l-o,d,r+c-l+o,!1)).length)return s;var p=r+c+o;if(0<(s=wt(e,t,n,r,n-u+l-o,p,n+u-l+o,p,!1)).length)return s;var f,g=n-u-o;if(0<(s=wt(e,t,n,r,g,r-c+l-o,g,r+c-l+o,!1)).length)return s;var v=n-u+l,y=r-c+l;if(0<(f=bt(e,t,n,r,v,y,l+o)).length&&f[0]<=v&&f[1]<=y)return[f[0],f[1]];var m=n+u-l,b=r-c+l;if(0<(f=bt(e,t,n,r,m,b,l+o)).length&&f[0]>=m&&f[1]<=b)return[f[0],f[1]];var x=n+u-l,w=r+c-l;if(0<(f=bt(e,t,n,r,x,w,l+o)).length&&f[0]>=x&&f[1]>=w)return[f[0],f[1]];var E=n-u+l,k=r+c-l;return 0<(f=bt(e,t,n,r,E,k,l+o)).length&&f[0]<=E&&f[1]>=k?[f[0],f[1]]:[]},pt=function(e,t,n,r,i,a,o,s){var l,u,c,h,d,p,f,g,v,y,m,b,x,w=[];u=9*n*i-3*n*n-3*n*o-6*i*i+3*i*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,c=3*n*n-6*n*i+n*o-n*e+2*i*i+2*i*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,h=1*n*i-n*n+n*e-i*e+r*a-r*r+r*t-a*t,g=-27*(h/=l=1*n*n-4*n*i+2*n*o+4*i*i-4*i*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s)+(u/=l)*(9*(c/=l)-u*u*2),p=(f=(3*c-u*u)/9)*f*f+(g/=54)*g,b=u/3,((d=w)[1]=0)a[u]+f&&(a[h]=a[u]+f,o.nodes.indexOf(h)<0?o.push(h):o.updateItem(h),i[h]=0,r[h]=[]),a[h]==a[u]+f&&(i[h]=i[h]+i[u],r[h].push(u))}else for(var g=0;gi&&(i=t[l][u],a=u);o[a].push(e[l])}for(var c=0;c=i.threshold||"dendrogram"===i.mode&&1===e.length)return!1;var p,f=t[o],g=t[r[o]];p="dendrogram"===i.mode?{left:f,right:g,key:f.key}:{value:f.value.concat(g.value),key:f.key},e[f.index]=p,e.splice(g.index,1),t[f.key]=p;for(var v=0;vn[g.key][y.key]&&(a=n[g.key][y.key])):"max"===i.linkage?(a=n[f.key][y.key],n[f.key][y.key]o&&(o=t[i*e+(a=l)])}0=u.minIterations-1||E==u.maxIterations-1)){for(var F=0,V=0;V\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:'"(?:\\\\"|[^"])*"|'+"'(?:\\\\'|[^'])*'",number:W,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};jn.variable="(?:[\\w-]|(?:\\\\"+jn.metaChar+"))+",jn.value=jn.string+"|"+jn.number,jn.className=jn.variable,jn.id=jn.variable,function(){var e,t,n;for(e=jn.comparatorOp.split("|"),n=0;n")+v(e.child,t);case ur:case sr:return v(e.ancestor,t)+" "+v(e.descendant,t);case cr:var c=v(e.left,t),h=v(e.subject,t),d=v(e.right,t);return c+(0":h=!0,r=n=":h=!0,r=n<=e;break;case"<":h=!0,r=ee.x2?r:e.x2,e.y1=ne.y2?i:e.y2)},Gr=function(e,t){return Kr(e,t.x1,t.y1,t.x2,t.y2)},Zr=function(e,t,n){return De(e,t,n)},Ur=function(e,t,n){if(!t.cy().headless()){var r,i,a=t._private,o=a.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){i="source"===n?(r=o.srcX,o.srcY):"target"===n?(r=o.tgtX,o.tgtY):(r=o.midX,o.midY);var l=a.arrowBounds=a.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=i-s,u.x2=r+s,u.y2=i+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,ot(u,1),Kr(e,u.x1,u.y1,u.x2,u.y2)}}},$r=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var i=t._private,a=i.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),h=t.pstyle("text-valign"),d=Zr(a,"labelWidth",n),p=Zr(a,"labelHeight",n),f=Zr(a,"labelX",n),g=Zr(a,"labelY",n),v=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,k=p+2*E,C=d+2*E,S=C/2,D=k/2;if(m)o=f-S,s=f+S,l=g-D,u=g+D;else{switch(c.value){case"left":o=f-C,s=f;break;case"center":o=f-S,s=f+S;break;case"right":s=(o=f)+C}switch(h.value){case"top":l=g-k,u=g;break;case"center":l=g-D,u=g+D;break;case"bottom":u=(l=g)+k}}o+=v-Math.max(x,w),s+=v+Math.max(x,w),l+=y-Math.max(x,w),u+=y+Math.max(x,w);var T=n||"main",P=i.labelBounds,M=P[T]=P[T]||{};M.x1=o,M.y1=l,M.x2=s,M.y2=u,M.w=s-o,M.h=u-l,ot(M,1);var _=m&&"autorotate"===b.strValue,B=null!=b.pfValue&&0!==b.pfValue;if(_||B){var N=_?Zr(i.rstyle,"labelAngle",n):b.pfValue,I=Math.cos(N),A=Math.sin(N),L=(o+s)/2,z=(l+u)/2;if(!m){switch(c.value){case"left":L=s;break;case"right":L=o}switch(h.value){case"top":z=u;break;case"bottom":z=l}}var O=function(e,t){return{x:(e-=L)*I-(t-=z)*A+L,y:e*A+t*I+z}},R=O(o,l),F=O(o,u),V=O(s,l),q=O(s,u);o=Math.min(R.x,F.x,V.x,q.x),s=Math.max(R.x,F.x,V.x,q.x),l=Math.min(R.y,F.y,V.y,q.y),u=Math.max(R.y,F.y,V.y,q.y)}Kr(e,o,l,s,u),Kr(i.labelBounds.all,o,l,s,u)}return e}},Qr=function(e){var t=0,n=function(e){return(e?1:0)<u&&++at.length?i.substr(t.length):""}function o(){n=n.length>r.length?n.substr(r.length):""}for(i=i.replace(/[/][*](\s|.)+?[*][/]/g,"");;){if(i.match(/^\s*$/))break;var s=i.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!s){be("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+i);break}t=s[0];var l=s[1];if("core"!==l)if(new Cr(l).invalid){be("Skipping parsing of block: Invalid selector found in string stylesheet: "+l),a();continue}var u=s[2],c=!1;n=u;for(var h=[];;){if(n.match(/^\s*$/))break;var d=n.match(/^\s*(.+?)\s*:\s*(.+?)\s*;/);if(!d){be("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+u),c=!0;break}r=d[0];var p=d[1],f=d[2];if(this.properties[p])this.parse(p,f)?h.push({name:p,val:f}):be("Skipping property: Invalid property definition in: "+r),o();else be("Skipping property: Invalid property name in: "+r),o()}if(c){a();break}this.selector(l);for(var g=0;gc.max||c.strictMax&&n===c.max))return null;var N={name:t,value:n,strValue:""+n+(P||""),units:P,bypass:r};return c.unitless||"px"!==P&&"em"!==P?N.pfValue=n:N.pfValue="px"!==P&&P?this.getEmSizeInPixels()*n:n,"ms"!==P&&"s"!==P||(N.pfValue="ms"===P?n:1e3*n),"deg"!==P&&"rad"!==P||(N.pfValue="rad"===P?n:(S=n,Math.PI*S/180)),"%"===P&&(N.pfValue=n/100),N}if(c.propList){var I=[],A=""+n;if("none"===A);else{for(var L=A.split(/\s*,\s*|\s+/),z=0;zthis._private.maxZoom?this._private.maxZoom:o)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,i=r.pan,a=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),$t(e)?n=e:B(e)&&(n=e.level,null!=e.position?t=Ze(e.position,a,i):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?a=!0:(t.zoom=s,i.push("zoom"))}if(r&&(!a||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;$t(l.x)&&(t.pan.x=l.x,o=!1),$t(l.y)&&(t.pan.y=l.y,o=!1),o||i.push("pan")}return 0i.maxX)&&(i.maxX=t.maxX+i.padRight,a=!0),(null==i.minX||t.minX-i.padLefti.maxY)&&(i.maxY=t.maxY+i.padBottom,a=!0),(null==i.minY||t.minY-i.padTop(g=ee,v=te,y=K[G],m=K[G+1],b=K[G+2],x=K[G+3],void 0,C=(w=[g-y,v-m])[0]*w[0]+w[1]*w[1],D=(S=w[0]*(E=[b-y,x-m])[0]+w[1]*E[1])*S/(k=E[0]*E[0]+E[1]*E[1]),t=S<0?C:k(t=pt(ee,te,K[G],K[G+1],K[G+2],K[G+3],K[G+4],K[G+5])))return se(e,t),!0;W=W||R.source,H=H||R.target;var Z=ne.getArrowWidth(V,q),U=[{name:"source",x:F.arrowStartX,y:F.arrowStartY,angle:F.srcArrowAngle},{name:"target",x:F.arrowEndX,y:F.arrowEndY,angle:F.tgtArrowAngle},{name:"mid-source",x:F.midX,y:F.midY,angle:F.midsrcArrowAngle},{name:"mid-target",x:F.midX,y:F.midY,angle:F.midtgtArrowAngle}];for(G=0;Gr.id()){var B=n;n=r,r=B}i=n.position(),a=r.position(),o=n.outerWidth(),s=n.outerHeight(),l=r.outerWidth(),u=r.outerHeight(),c=this.nodeShapes[this.getNodeShape(n)],h=this.nodeShapes[this.getNodeShape(r)],p=!1;var N={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0},I=i.x,A=i.y,L=o,z=s,O=a.x,R=a.y,F=l,V=u,q=M.length;for(b=0;b=q.desktopTapThreshold2}var b=B(e);c&&(q.hoverData.tapholdCancelled=!0);t=!0,Y(u,["mousemove","vmousemove","tapdrag"],e,{x:a[0],y:a[1]});var x,w=function(){q.data.bgActivePosistion=void 0,q.hoverData.selecting||n.emit({originalEvent:e,type:"boxstart",position:{x:a[0],y:a[1]}}),l[4]=1,q.hoverData.selecting=!0,q.redrawHint("select",!0),q.redraw()};if(3===q.hoverData.which){if(c){var E={originalEvent:e,type:"cxtdrag",position:{x:a[0],y:a[1]}};d?d.emit(E):n.emit(E),q.hoverData.cxtDragged=!0,q.hoverData.cxtOver&&u===q.hoverData.cxtOver||(q.hoverData.cxtOver&&q.hoverData.cxtOver.emit({originalEvent:e,type:"cxtdragout",position:{x:a[0],y:a[1]}}),(q.hoverData.cxtOver=u)&&u.emit({originalEvent:e,type:"cxtdragover",position:{x:a[0],y:a[1]}}))}}else if(q.hoverData.dragging){if(t=!0,n.panningEnabled()&&n.userPanningEnabled()){var k;if(q.hoverData.justStartedPan){var C=q.hoverData.mdownPos;k={x:(a[0]-C[0])*r,y:(a[1]-C[1])*r},q.hoverData.justStartedPan=!1}else k={x:p[0]*r,y:p[1]*r};n.panBy(k),q.hoverData.dragged=!0}a=q.projectIntoViewport(e.clientX,e.clientY)}else if(1!=l[4]||null!=d&&!d.isEdge()){if(d&&d.isEdge()&&d.active()&&d.unactivate(),d&&d.grabbed()||u==h||(h&&Y(h,["mouseout","tapdragout"],e,{x:a[0],y:a[1]}),u&&Y(u,["mouseover","tapdragover"],e,{x:a[0],y:a[1]}),q.hoverData.last=u),d)if(c){if(n.boxSelectionEnabled()&&b)d&&d.grabbed()&&(W(f),d.emit("freeon"),f.emit("free"),q.dragData.didDrag&&(d.emit("dragfreeon"),f.emit("dragfree"))),w();else if(d&&d.grabbed()&&q.nodeIsDraggable(d)){var S=!q.dragData.didDrag;S&&q.redrawHint("eles",!0),q.dragData.didDrag=!0;var D=n.collection();q.hoverData.draggingEles||j(f,{inDragLayer:!0});var T={x:0,y:0};if($t(p[0])&&$t(p[1])&&(T.x+=p[0],T.y+=p[1],S)){var P=q.hoverData.dragDelta;P&&$t(P[0])&&$t(P[1])&&(T.x+=P[0],T.y+=P[1])}for(var M=0;M=q.touchTapThreshold2}if(t&&q.touchData.cxt){e.preventDefault();var g=e.touches[0].clientX-ee,v=e.touches[0].clientY-te,y=e.touches[1].clientX-ee,m=e.touches[1].clientY-te,b=ie(g,v,y,m);if(2.25<=b/Q||22500<=b){q.touchData.cxt=!1,q.data.bgActivePosistion=void 0,q.redrawHint("select",!0);var x={originalEvent:e,type:"cxttapend",position:{x:i[0],y:i[1]}};q.touchData.start?(q.touchData.start.unactivate().emit(x),q.touchData.start=null):r.emit(x)}}if(t&&q.touchData.cxt){x={originalEvent:e,type:"cxtdrag",position:{x:i[0],y:i[1]}};q.data.bgActivePosistion=void 0,q.redrawHint("select",!0),q.touchData.start?q.touchData.start.emit(x):r.emit(x),q.touchData.start&&(q.touchData.start._private.grabbed=!1),q.touchData.cxtDragged=!0;var w=q.findNearestElement(i[0],i[1],!0,!0);q.touchData.cxtOver&&w===q.touchData.cxtOver||(q.touchData.cxtOver&&q.touchData.cxtOver.emit({originalEvent:e,type:"cxtdragout",position:{x:i[0],y:i[1]}}),(q.touchData.cxtOver=w)&&w.emit({originalEvent:e,type:"cxtdragover",position:{x:i[0],y:i[1]}}))}else if(t&&e.touches[2]&&r.boxSelectionEnabled())e.preventDefault(),q.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,q.touchData.selecting||r.emit({originalEvent:e,type:"boxstart",position:{x:i[0],y:i[1]}}),q.touchData.selecting=!0,q.redrawHint("select",!0),n&&0!==n.length&&void 0!==n[0]?(n[2]=(i[0]+i[2]+i[4])/3,n[3]=(i[1]+i[3]+i[5])/3):(n[0]=(i[0]+i[2]+i[4])/3,n[1]=(i[1]+i[3]+i[5])/3,n[2]=(i[0]+i[2]+i[4])/3+1,n[3]=(i[1]+i[3]+i[5])/3+1),n[4]=1,q.touchData.selecting=!0,q.redraw();else if(t&&e.touches[1]&&r.zoomingEnabled()&&r.panningEnabled()&&r.userZoomingEnabled()&&r.userPanningEnabled()){if(e.preventDefault(),q.data.bgActivePosistion=void 0,q.redrawHint("select",!0),L=q.dragData.touchDragEles){q.redrawHint("drag",!0);for(var E=0;E=y.deqFastCost*h)break}else if(e){if(u>=y.deqCost*i||u>=y.deqAvgCost*r)break}else if(c>=y.deqNoDrawCost*Lo)break;var d=y.deq(f,s,o);if(!(0=.2*e.width&&this.retireTexture(e)},qo.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);.8=t)return a.retired=!1,a.usedWidth=0,a.invalidatedWidth=0,a.fullnessChecks=0,Qt(a.eleCaches),a.context.setTransform(1,0,0,1,0,0),a.context.clearRect(0,0,a.width,a.height),Se(r,a),n.push(a),a}},qo.queueElement=function(e,t){var n=this.getElementQueue(),r=this.getElementKeyToQueue(),i=this.getKey(e),a=r[i];if(a)a.level=Math.max(a.level,t),a.eles.merge(e),a.reqs++,n.updateItem(a);else{var o={eles:e.spawn().merge(e),level:t,reqs:1,key:i};n.push(o),r[i]=o}},qo.dequeue=function(e){for(var t=this.getElementQueue(),n=this.getElementKeyToQueue(),r=[],i=this.lookup,a=0;a<1&&0=p||!ht(d.bb,v.boundingBox()))&&!(d=r({insert:!0,after:d})))return null;l||f?o.queueLayer(d,v):o.drawEleInLayer(d,v,a,e),d.eles.push(v),m[a]=d}}return l||(f?null:h)},Xo.getEleLevelForLayerLevel=function(e,t){return e},Xo.drawEleInLayer=function(e,t,n,r){var i=this.renderer,a=e.context,o=t.boundingBox();0!==o.w&&0!==o.h&&t.visible()&&(n=this.getEleLevelForLayerLevel(n,r),i.setImgSmoothing(a,!1),i.drawCachedElement(a,t,null,null,n,!0),i.setImgSmoothing(a,!0))},Xo.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,i=0;ic.minMbLowQualFrames&&(c.motionBlurPxRatio=c.mbPxRBlurry)),c.clearingMotionBlur&&(c.motionBlurPxRatio=1),c.textureDrawLastFrame&&!a&&(i[c.NODE]=!0,i[c.SELECT_BOX]=!0);var m=r.style(),b=r.zoom(),x=void 0!==l?l:b,w=r.pan(),E={x:w.x,y:w.y},k={zoom:b,pan:{x:w.x,y:w.y}},C=c.prevViewport;void 0===C||k.zoom!==C.zoom||k.pan.x!==C.pan.x||k.pan.y!==C.pan.y||g&&!f||(c.motionBlurPxRatio=1),u&&(E=u),x*=n,E.x*=n,E.y*=n;var S=c.getCachedZSortedEles();function D(e,t,n,r,i){var a=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",c.colorFillStyle(e,255,255,255,c.motionBlurTransparency),e.fillRect(t,n,r,i),e.globalCompositeOperation=a}function T(e,t){var n,r,i,a;a=c.clearingMotionBlur||e!==h.bufferContexts[c.MOTIONBLUR_BUFFER_NODE]&&e!==h.bufferContexts[c.MOTIONBLUR_BUFFER_DRAG]?(n=E,r=x,i=c.canvasWidth,c.canvasHeight):(n={x:w.x*p,y:w.y*p},r=b*p,i=c.canvasWidth*p,c.canvasHeight*p),e.setTransform(1,0,0,1,0,0),"motionBlur"===t?D(e,0,0,i,a):o||void 0!==t&&!t||e.clearRect(0,0,i,a),s||(e.translate(n.x,n.y),e.scale(r,r)),u&&e.translate(u.x,u.y),l&&e.scale(l,l)}if(a||(c.textureDrawLastFrame=!1),a){if(c.textureDrawLastFrame=!0,!c.textureCache){c.textureCache={},c.textureCache.bb=r.mutableElements().boundingBox(),c.textureCache.texture=c.data.bufferCanvases[c.TEXTURE_BUFFER];var P=c.data.bufferContexts[c.TEXTURE_BUFFER];P.setTransform(1,0,0,1,0,0),P.clearRect(0,0,c.canvasWidth*c.textureMult,c.canvasHeight*c.textureMult),c.render({forcedContext:P,drawOnlyNodeLayer:!0,forcedPxRatio:n*c.textureMult}),(k=c.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:c.canvasWidth,height:c.canvasHeight}).mpan={x:(0-k.pan.x)/k.zoom,y:(0-k.pan.y)/k.zoom}}i[c.DRAG]=!1,i[c.NODE]=!1;var M=h.contexts[c.NODE],_=c.textureCache.texture;k=c.textureCache.viewport;M.setTransform(1,0,0,1,0,0),d?D(M,0,0,k.width,k.height):M.clearRect(0,0,k.width,k.height);var B=m.core("outside-texture-bg-color").value,N=m.core("outside-texture-bg-opacity").value;c.colorFillStyle(M,B[0],B[1],B[2],N),M.fillRect(0,0,k.width,k.height);b=r.zoom();T(M,!1),M.clearRect(k.mpan.x,k.mpan.y,k.width/k.zoom/n,k.height/k.zoom/n),M.drawImage(_,k.mpan.x,k.mpan.y,k.width/k.zoom/n,k.height/k.zoom/n)}else c.textureOnViewport&&!o&&(c.textureCache=null);var I=r.extent(),A=c.pinching||c.hoverData.dragging||c.swipePanning||c.data.wheelZooming||c.hoverData.draggingEles,L=c.hideEdgesOnViewport&&A,z=[];if(z[c.NODE]=!i[c.NODE]&&d&&!c.clearedForMotionBlur[c.NODE]||c.clearingMotionBlur,z[c.NODE]&&(c.clearedForMotionBlur[c.NODE]=!0),z[c.DRAG]=!i[c.DRAG]&&d&&!c.clearedForMotionBlur[c.DRAG]||c.clearingMotionBlur,z[c.DRAG]&&(c.clearedForMotionBlur[c.DRAG]=!0),i[c.NODE]||s||t||z[c.NODE]){var O=d&&!z[c.NODE]&&1!==p;T(M=o||(O?c.data.bufferContexts[c.MOTIONBLUR_BUFFER_NODE]:h.contexts[c.NODE]),d&&!O?"motionBlur":void 0),L?c.drawCachedNodes(M,S.nondrag,n,I):c.drawLayeredElements(M,S.nondrag,n,I),c.debug&&c.drawDebugPoints(M,S.nondrag),s||d||(i[c.NODE]=!1)}if(!t&&(i[c.DRAG]||s||z[c.DRAG])){O=d&&!z[c.DRAG]&&1!==p;T(M=o||(O?c.data.bufferContexts[c.MOTIONBLUR_BUFFER_DRAG]:h.contexts[c.DRAG]),d&&!O?"motionBlur":void 0),L?c.drawCachedNodes(M,S.drag,n,I):c.drawCachedElements(M,S.drag,n,I),c.debug&&c.drawDebugPoints(M,S.drag),s||d||(i[c.DRAG]=!1)}if(c.showFps||!t&&i[c.SELECT_BOX]&&!s){if(T(M=o||h.contexts[c.SELECT_BOX]),1==c.selection[4]&&(c.hoverData.selecting||c.touchData.selecting)){b=c.cy.zoom();var R=m.core("selection-box-border-width").value/b;M.lineWidth=R,M.fillStyle="rgba("+m.core("selection-box-color").value[0]+","+m.core("selection-box-color").value[1]+","+m.core("selection-box-color").value[2]+","+m.core("selection-box-opacity").value+")",M.fillRect(c.selection[0],c.selection[1],c.selection[2]-c.selection[0],c.selection[3]-c.selection[1]),0