@ -1,4 +1,4 @@
var mxClient = { VERSION : "4.1. 0 ", IS _IE : 0 <= navigator . userAgent . indexOf ( "MSIE" ) , IS _IE6 : 0 <= navigator . userAgent . indexOf ( "MSIE 6" ) , IS _IE11 : ! ! navigator . userAgent . match ( /Trident\/7\./ ) , IS _EDGE : ! ! navigator . userAgent . match ( /Edge\// ) , IS _QUIRKS : 0 <= navigator . userAgent . indexOf ( "MSIE" ) && ( null == document . documentMode || 5 == document . documentMode ) , IS _EM : "spellcheck" in document . createElement ( "textarea" ) && 8 == document . documentMode , VML _PREFIX : "v" , OFFICE _PREFIX : "o" , IS _NS : 0 <= navigator . userAgent . indexOf ( "Mozilla/" ) && 0 > navigator . userAgent . indexOf ( "MSIE" ) &&
var mxClient = { VERSION : "4.1. 1 ", IS _IE : 0 <= navigator . userAgent . indexOf ( "MSIE" ) , IS _IE6 : 0 <= navigator . userAgent . indexOf ( "MSIE 6" ) , IS _IE11 : ! ! navigator . userAgent . match ( /Trident\/7\./ ) , IS _EDGE : ! ! navigator . userAgent . match ( /Edge\// ) , IS _QUIRKS : 0 <= navigator . userAgent . indexOf ( "MSIE" ) && ( null == document . documentMode || 5 == document . documentMode ) , IS _EM : "spellcheck" in document . createElement ( "textarea" ) && 8 == document . documentMode , VML _PREFIX : "v" , OFFICE _PREFIX : "o" , IS _NS : 0 <= navigator . userAgent . indexOf ( "Mozilla/" ) && 0 > navigator . userAgent . indexOf ( "MSIE" ) &&
0 > navigator . userAgent . indexOf ( "Edge/" ) , IS _OP : 0 <= navigator . userAgent . indexOf ( "Opera/" ) || 0 <= navigator . userAgent . indexOf ( "OPR/" ) , IS _OT : 0 <= navigator . userAgent . indexOf ( "Presto/" ) && 0 > navigator . userAgent . indexOf ( "Presto/2.4." ) && 0 > navigator . userAgent . indexOf ( "Presto/2.3." ) && 0 > navigator . userAgent . indexOf ( "Presto/2.2." ) && 0 > navigator . userAgent . indexOf ( "Presto/2.1." ) && 0 > navigator . userAgent . indexOf ( "Presto/2.0." ) && 0 > navigator . userAgent . indexOf ( "Presto/1." ) , IS _SF : 0 <= navigator . userAgent . indexOf ( "AppleWebKit/" ) &&
0 > navigator . userAgent . indexOf ( "Chrome/" ) && 0 > navigator . userAgent . indexOf ( "Edge/" ) , IS _ANDROID : 0 <= navigator . userAgent . indexOf ( "Android" ) , IS _IOS : /iP(hone|od|ad)/ . test ( navigator . platform ) , IOS _VERSION : function ( ) { if ( /iP(hone|od|ad)/ . test ( navigator . platform ) ) { var a = navigator . appVersion . match ( /OS (\d+)_(\d+)_?(\d+)?/ ) ; if ( null != a && 0 < a . length ) return parseInt ( a [ 1 ] ) } return 0 } ( ) , IS _GC : 0 <= navigator . userAgent . indexOf ( "Chrome/" ) && 0 > navigator . userAgent . indexOf ( "Edge/" ) , IS _CHROMEAPP : null != window . chrome && null != chrome . app &&
null != chrome . app . runtime , IS _FF : 0 <= navigator . userAgent . indexOf ( "Firefox/" ) , IS _MT : 0 <= navigator . userAgent . indexOf ( "Firefox/" ) && 0 > navigator . userAgent . indexOf ( "Firefox/1." ) && 0 > navigator . userAgent . indexOf ( "Firefox/2." ) || 0 <= navigator . userAgent . indexOf ( "Iceweasel/" ) && 0 > navigator . userAgent . indexOf ( "Iceweasel/1." ) && 0 > navigator . userAgent . indexOf ( "Iceweasel/2." ) || 0 <= navigator . userAgent . indexOf ( "SeaMonkey/" ) && 0 > navigator . userAgent . indexOf ( "SeaMonkey/1." ) || 0 <= navigator . userAgent . indexOf ( "Iceape/" ) && 0 > navigator . userAgent . indexOf ( "Iceape/1." ) ,
@ -42,72 +42,72 @@ if(c&&b.childNodes&&0<b.childNodes.length)for(e=0;e<b.childNodes.length;e++)d.ap
new ActiveXObject ( "Microsoft.XMLDOM" ) ; a . async = ! 1 ; a . validateOnParse = ! 1 ; a . resolveExternals = ! 1 ; return a } , parseXml : function ( ) { return window . DOMParser ? function ( a ) { return ( new DOMParser ) . parseFromString ( a , "text/xml" ) } : function ( a ) { var b = mxUtils . createMsXmlDocument ( ) ; b . loadXML ( a ) ; return b } } ( ) , clearSelection : function ( ) { return document . selection ? function ( ) { document . selection . empty ( ) } : window . getSelection ? function ( ) { window . getSelection ( ) . empty ? window . getSelection ( ) . empty ( ) : window . getSelection ( ) . removeAllRanges &&
window . getSelection ( ) . removeAllRanges ( ) } : function ( ) { } } ( ) , removeWhitespace : function ( a , b ) { for ( var c = b ? a . previousSibling : a . nextSibling ; null != c && c . nodeType == mxConstants . NODETYPE _TEXT ; ) { var d = b ? c . previousSibling : c . nextSibling , e = mxUtils . getTextContent ( c ) ; 0 == mxUtils . trim ( e ) . length && c . parentNode . removeChild ( c ) ; c = d } } , htmlEntities : function ( a , b ) { a = String ( a || "" ) ; a = a . replace ( /&/g , "&" ) ; a = a . replace ( /"/g , """ ) ; a = a . replace ( /\'/g , "'" ) ; a = a . replace ( /</g , "<" ) ; a = a . replace ( />/g , ">" ) ; if ( null == b || b ) a = a . replace ( /\n/g ,
"
" ) ; return a } , isVml : function ( a ) { return null != a && "urn:schemas-microsoft-com:vml" == a . tagUrn } , getXml : function ( a , b ) { var c = "" ; mxClient . IS _IE || mxClient . IS _IE11 ? c = mxUtils . getPrettyXml ( a , "" , "" , "" ) : null != window . XMLSerializer ? c = ( new XMLSerializer ) . serializeToString ( a ) : null != a . xml && ( c = a . xml . replace ( /\r\n\t[\t]*/g , "" ) . replace ( />\r\n/g , ">" ) . replace ( /\r\n/g , "\n" ) ) ; return c = c . replace ( /\n/g , b || "
" ) } , getPrettyXml : function ( a , b , c , d , e ) { var f = [ ] ; if ( null != a ) if ( b = null != b ? b : " " , c = null != c ? c : "" , d = null != d ? d : "\n" ,
null != a . namespaceURI && a . namespaceURI != e && ( e = a . namespaceURI , null == a . getAttribute ( "xmlns" ) && a . setAttribute ( "xmlns" , a . namespaceURI ) ) , a . nodeType == mxConstants . NODETYPE _TEXT ) a = mxUtils . getTextContent ( a ) , 0 < a . length && f . push ( c + mxUtils . htmlEntities ( a) + d ) ; else { f . push ( c + "<" + a . nodeName ) ; var g = a . attributes ; if ( null != g ) for ( var k = 0 ; k < g . length ; k ++ ) { var l = mxUtils . htmlEntities ( g [ k ] . value ) ; f . push ( " " + g [ k ] . nodeName + '="' + l + '"' ) } g = a . firstChild ; if ( null != g ) { for ( f . push ( ">" + d ) ; null != g ; ) f . push ( mxUtils . getPrettyXml ( g , b , c + b , d , e ) ) ,
g = g . nextSibling ; f . push ( c + "</" + a . nodeName + ">" + d ) } else f . push ( "/>" + d ) } return f . join ( "" ) } , extractTextWithWhitespace : function ( a ) { function b ( a ) { if ( 1 != a . length || "BR" != a [ 0 ] . nodeName && "\n" != a [ 0 ] . innerHTML ) for ( var e = 0 ; e < a . length ; e ++ ) { var g = a [ e ] ; "BR" == g . nodeName || "\n" == g . innerHTML || ( 1 == a . length || 0 == e ) && "DIV" == g . nodeName && "<br>" == g . innerHTML . toLowerCase ( ) ? d . push ( "\n" ) : ( 3 === g . nodeType || 4 === g . nodeType ? 0 < g . nodeValue . length && d . push ( g . nodeValue ) : 8 !== g . nodeType && 0 < g . childNodes . length && b ( g . childNodes ) , e < a . length - 1 &&
0 <= mxUtils . indexOf ( c , a [ e + 1 ] . nodeName ) && d . push ( "\n" ) ) } } var c = "BLOCKQUOTE DIV H1 H2 H3 H4 H5 H6 OL P PRE TABLE UL" . split ( " " ) , d = [ ] ; b ( a ) ; return d . join ( "" ) } , replaceTrailingNewlines : function ( a , b ) { for ( var c = "" ; 0 < a . length && "\n" == a . charAt ( a . length - 1 ) ; ) a = a . substring ( 0 , a . length - 1 ) , c += b ; return a + c } , getTextContent : function ( a ) { return mxClient . IS _IE && void 0 !== a . innerText ? a . innerText : null != a ? a [ void 0 === a . textContent ? "text" : "textContent" ] : "" } , setTextContent : function ( a , b ) { void 0 !== a . innerText ? a . innerText = b : a [ void 0 ===
a . textContent ? "text" : "textContent" ] = b } , getInnerHtml : function ( ) { return mxClient . IS _IE ? function ( a ) { return null != a ? a . innerHTML : "" } : function ( a ) { return null != a ? ( new XMLSerializer ) . serializeToString ( a ) : "" } } ( ) , getOuterHtml : function ( ) { return mxClient . IS _IE ? function ( a ) { if ( null != a ) { if ( null != a . outerHTML ) return a . outerHTML ; var b = [ ] ; b . push ( "<" + a . nodeName ) ; var c = a . attributes ; if ( null != c ) for ( var d = 0 ; d < c . length ; d ++ ) { var e = c [ d ] . value ; null != e && 0 < e . length && ( b . push ( " " ) , b . push ( c [ d ] . nodeName ) , b . push ( '="' ) , b . push ( e ) , b . push ( '"' ) ) } 0 ==
a . innerHTML . length ? b . push ( "/>" ) : ( b . push ( ">" ) , b . push ( a . innerHTML ) , b . push ( "</" + a . nodeName + ">" ) ) ; return b . join ( "" ) } return "" } : function ( a ) { return null != a ? ( new XMLSerializer ) . serializeToString ( a ) : "" } } ( ) , write : function ( a , b ) { var c = a . ownerDocument . createTextNode ( b ) ; null != a && a . appendChild ( c ) ; return c } , writeln : function ( a , b ) { var c = a . ownerDocument . createTextNode ( b ) ; null != a && ( a . appendChild ( c ) , a . appendChild ( document . createElement ( "br" ) ) ) ; return c } , br : function ( a , b ) { b = b || 1 ; for ( var c = null , d = 0 ; d < b ; d ++ ) null != a && ( c = a . ownerDocument . createElement ( "br" ) ,
a . appendChild ( c ) ) ; return c } , button : function ( a , b , c ) { c = null != c ? c : document ; c = c . createElement ( "button" ) ; mxUtils . write ( c , a ) ; mxEvent . addListener ( c , "click" , function ( a ) { b ( a ) } ) ; return c } , para : function ( a , b ) { var c = document . createElement ( "p" ) ; mxUtils . write ( c , b ) ; null != a && a . appendChild ( c ) ; return c } , addTransparentBackgroundFilter : function ( a ) { a . style . filter += "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + mxClient . imageBasePath + "/transparent.gif', sizingMethod='scale')" } , linkAction : function ( a , b , c , d , e ) { return mxUtils . link ( a ,
b , function ( ) { c . execute ( d ) } , e ) } , linkInvoke : function ( a , b , c , d , e , f ) { return mxUtils . link ( a , b , function ( ) { c [ d ] ( e ) } , f ) } , link : function ( a , b , c , d ) { var e = document . createElement ( "span" ) ; e . style . color = "blue" ; e . style . textDecoration = "underline" ; e . style . cursor = "pointer" ; null != d && ( e . style . paddingLeft = d + "px" ) ; mxEvent . addListener ( e , "click" , c ) ; mxUtils . write ( e , b ) ; null != a && a . appendChild ( e ) ; return e } , getDocumentSize : function ( ) { var a = document . body , b = document . documentElement ; try { return new mxRectangle ( 0 , 0 , a . clientWidth || b . clientWidth ,
Math . max ( a . clientHeight || 0 , b . clientHeight ) ) } catch ( c ) { return new mxRectangle } } , fit : function ( a ) { var b = mxUtils . getDocumentSize ( ) , c = parseInt ( a . offsetLeft ) , d = parseInt ( a . offsetWidth ) , e = mxUtils . getDocumentScrollOrigin ( a . ownerDocument ) , f = e . x , e = e . y , g = f + b . width ; c + d > g && ( a . style . left = Math . max ( f , g - d ) + "px" ) ; c = parseInt ( a . offsetTop ) ; d = parseInt ( a . offsetHeight ) ; b = e + b . height ; c + d > b && ( a . style . top = Math . max ( e , b - d ) + "px" ) } , load : function ( a ) { a = new mxXmlRequest ( a , null , "GET" , ! 1 ) ; a . send ( ) ; return a } , get : function ( a , b , c , d , e , f ) { a =
new mxXmlRequest ( a , null , "GET" ) ; null != d && a . setBinary ( d ) ; a . send ( b , c , e , f ) ; return a } , getAll : function ( a , b , c ) { for ( var d = a . length , e = [ ] , f = 0 , g = function ( ) { 0 == f && null != c && c ( ) ; f ++ } , k = 0 ; k < a . length ; k ++ ) ( function ( a , c ) { mxUtils . get ( a , function ( a ) { var f = a . getStatus ( ) ; 200 > f || 299 < f ? g ( ) : ( e [ c ] = a , d -- , 0 == d && b ( e ) ) } , g ) } ) ( a [ k ] , k ) ; 0 == d && b ( e ) } , post : function ( a , b , c , d ) { return ( new mxXmlRequest ( a , b ) ) . send ( c , d ) } , submit : function ( a , b , c , d ) { return ( new mxXmlRequest ( a , b ) ) . simulate ( c , d ) } , loadInto : function ( a , b , c ) { mxClient . IS _IE ? b . onreadystatechange =
function ( ) { 4 == b . readyState && c ( ) } : b . addEventListener ( "load" , c , ! 1 ) ; b . load ( a ) } , getValue : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a && ( a = c ) ; return a } , getNumber : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a && ( a = c || 0 ) ; return Number ( a ) } , getColor : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a ? a = c : a == mxConstants . NONE && ( a = null ) ; return a } , clone : function ( a , b , c ) { c = null != c ? c : ! 1 ; var d = null ; if ( null != a && "function" == typeof a . constructor ) { var d = new a . constructor , e ; for ( e in a ) e != mxObjectIdentity . FIELD _NAME && ( null == b || 0 > mxUtils . indexOf ( b ,
e ) ) && ( d [ e ] = c || "object" != typeof a [ e ] ? a [ e ] : mxUtils . clone ( a [ e ] ) ) } return d } , equalPoints : function ( a , b ) { if ( null == a && null != b || null != a && null == b || null != a && null != b && a . length != b . length ) return ! 1 ; if ( null != a && null != b ) for ( var c = 0 ; c < a . length ; c ++ ) if ( null != a [ c ] && null == b [ c ] || null == a [ c ] && null != b [ c ] || null != a [ c ] && null != b [ c ] && ( a [ c ] . x != b [ c ] . x || a [ c ] . y != b [ c ] . y ) ) return ! 1 ; return ! 0 } , equalEntries : function ( a , b ) { var c = 0 ; if ( null == a && null != b || null != a && null == b || null != a && null != b && a . length != b . length ) return ! 1 ; if ( null != a && null != b ) { for ( var d in b ) c ++ ;
for ( d in a ) if ( c -- , ! ( mxUtils . isNaN ( a [ d ] ) && mxUtils . isNaN ( b [ d ] ) || a [ d ] == b [ d ] ) ) return ! 1 } return 0 == c } , removeDuplicates : function ( a ) { for ( var b = new mxDictionary , c = [ ] , d = 0 ; d < a . length ; d ++ ) b . get ( a [ d ] ) || ( c . push ( a [ d ] ) , b . put ( a [ d ] , ! 0 ) ) ; return c } , isNaN : function ( a ) { return "number" == typeof a && isNaN ( a ) } , extend : function ( a , b ) { var c = function ( ) { } ; c . prototype = b . prototype ; a . prototype = new c ; a . prototype . constructor = a } , toString : function ( a ) { var b = "" , c ; for ( c in a ) try { if ( null == a [ c ] ) b += c + " = [null]\n" ; else if ( "function" == typeof a [ c ] ) b +=
c + " => [Function]\n" ; else if ( "object" == typeof a [ c ] ) var d = mxUtils . getFunctionName ( a [ c ] . constructor ) , b = b + ( c + " => [" + d + "]\n" ) ; else b += c + " = " + a [ c ] + "\n" } catch ( e ) { b += c + "=" + e . message } return b } , toRadians : function ( a ) { return Math . PI * a / 180 } , toDegree : function ( a ) { return 180 * a / Math . PI } , arcToCurves : function ( a , b , c , d , e , f , g , k , l ) { k -= a ; l -= b ; if ( 0 === c || 0 === d ) return q ; c = Math . abs ( c ) ; d = Math . abs ( d ) ; var m = - k / 2 , n = - l / 2 , p = Math . cos ( e * Math . PI / 180 ) , q = Math . sin ( e * Math . PI / 180 ) ; e = p * m + q * n ; var m = - 1 * q * m + p * n , n = e * e , r = m * m , t = c * c , u = d * d , x = n /
t + r / u ; 1 < x ? ( c *= Math . sqrt ( x ) , d *= Math . sqrt ( x ) , f = 0 ) : ( x = 1 , f === g && ( x = - 1 ) , f = x * Math . sqrt ( ( t * u - t * r - u * n ) / ( t * r + u * n ) ) ) ; n = f * c * m / d ; r = - 1 * f * d * e / c ; k = p * n - q * r + k / 2 ; l = q * n + p * r + l / 2 ; t = Math . atan2 ( ( m - r ) / d , ( e - n ) / c ) - Math . atan2 ( 0 , 1 ) ; f = 0 <= t ? t : 2 * Math . PI + t ; t = Math . atan2 ( ( - m - r ) / d , ( - e - n ) / c ) - Math . atan2 ( ( m - r ) / d , ( e - n ) / c ) ; e = 0 <= t ? t : 2 * Math . PI + t ; 0 == g && 0 < e ? e -= 2 * Math . PI : 0 != g && 0 > e && ( e += 2 * Math . PI ) ; g = 2 * e / Math . PI ; g = Math . ceil ( 0 > g ? - 1 * g : g ) ; e /= g ; m = 8 / 3 * Math . sin ( e / 4 ) * Math . sin ( e / 4 ) / Math . sin ( e / 2 ) ; n = p * c ; p *= d ; c *= q ; d *= q ; for ( var y = Math . cos ( f ) , A = Math . sin ( f ) ,
r = - m * ( n * A + d * y ) , t = - m * ( c * A - p * y ) , q = [ ] , z = 0 ; z < g ; ++ z ) { f += e ; var y = Math . cos ( f ) , A = Math . sin ( f ) , u = n * y - d * A + k , x = c * y + p * A + l , v = - m * ( n * A + d * y ) , y = - m * ( c * A - p * y ) , A = 6 * z ; q [ A ] = Number ( r + a ) ; q [ A + 1 ] = Number ( t + b ) ; q [ A + 2 ] = Number ( u - v + a ) ; q [ A + 3 ] = Number ( x - y + b ) ; q [ A + 4 ] = Number ( u + a ) ; q [ A + 5 ] = Number ( x + b ) ; r = u + v ; t = x + y } return q } , getBoundingBox : function ( a , b , c ) { var d = null ; if ( null != a && null != b && 0 != b ) { b = mxUtils . toRadians ( b ) ; var d = Math . cos ( b ) , e = Math . sin ( b ) ; c = null != c ? c : new mxPoint ( a . x + a . width / 2 , a . y + a . height / 2 ) ; var f = new mxPoint ( a . x , a . y ) ; b = new mxPoint ( a . x +
a . width , a . y ) ; var g = new mxPoint ( b . x , a . y + a . height ) ; a = new mxPoint ( a . x , g . y ) ; f = mxUtils . getRotatedPoint ( f , d , e , c ) ; b = mxUtils . getRotatedPoint ( b , d , e , c ) ; g = mxUtils . getRotatedPoint ( g , d , e , c ) ; a = mxUtils . getRotatedPoint ( a , d , e , c ) ; d = new mxRectangle ( f . x , f . y , 0 , 0 ) ; d . add ( new mxRectangle ( b . x , b . y , 0 , 0 ) ) ; d . add ( new mxRectangle ( g . x , g . y , 0 , 0 ) ) ; d . add ( new mxRectangle ( a . x , a . y , 0 , 0 ) ) } return d } , getRotatedPoint : function ( a , b , c , d ) { d = null != d ? d : new mxPoint ; var e = a . x - d . x ; a = a . y - d . y ; return new mxPoint ( e * b - a * c + d . x , a * b + e * c + d . y ) } , getPortConstraints : function ( a ,
b , c , d ) { b = mxUtils . getValue ( a . style , mxConstants . STYLE _PORT _CONSTRAINT , mxUtils . getValue ( b . style , c ? mxConstants . STYLE _SOURCE _PORT _CONSTRAINT : mxConstants . STYLE _TARGET _PORT _CONSTRAINT , null ) ) ; if ( null == b ) return d ; d = b . toString ( ) ; b = mxConstants . DIRECTION _MASK _NONE ; c = 0 ; 1 == mxUtils . getValue ( a . style , mxConstants . STYLE _PORT _CONSTRAINT _ROTATION , 0 ) && ( c = mxUtils . getValue ( a . style , mxConstants . STYLE _ROTATION , 0 ) ) ; a = 0 ; 45 < c ? ( a = 1 , 135 <= c && ( a = 2 ) ) : - 45 > c && ( a = 3 , - 135 >= c && ( a = 2 ) ) ; if ( 0 <= d . indexOf ( mxConstants . DIRECTION _NORTH ) ) switch ( a ) { case 0 : b |=
mxConstants . DIRECTION _MASK _NORTH ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _SOUTH ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _WEST } if ( 0 <= d . indexOf ( mxConstants . DIRECTION _WEST ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _NORTH ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _SOUTH } if ( 0 <= d . indexOf ( mxConstants . DIRECTION _SOUTH ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _SOUTH ;
break ; case 1 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _NORTH ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _EAST } if ( 0 <= d . indexOf ( mxConstants . DIRECTION _EAST ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _SOUTH ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _NORTH } return b } , reversePortConstraints : function ( a ) { var b ; b = ( a & mxConstants . DIRECTION _MASK _WEST ) << 3 ; b |= ( a & mxConstants . DIRECTION _MASK _NORTH ) <<
1 ; b |= ( a & mxConstants . DIRECTION _MASK _SOUTH ) >> 1 ; return b |= ( a & mxConstants . DIRECTION _MASK _EAST ) >> 3 } , findNearestSegment : function ( a , b , c ) { var d = - 1 ; if ( 0 < a . absolutePoints . length ) for ( var e = a . absolutePoints [ 0 ] , f = null , g = 1 ; g < a . absolutePoints . length ; g ++ ) { var k = a . absolutePoints [ g ] , e = mxUtils . ptSegDistSq ( e . x , e . y , k . x , k . y , b , c ) ; if ( null == f || e < f ) f = e , d = g - 1 ; e = k } return d } , getDirectedBounds : function ( a , b , c , d , e ) { var f = mxUtils . getValue ( c , mxConstants . STYLE _DIRECTION , mxConstants . DIRECTION _EAST ) ; d = null != d ? d : mxUtils . getValue ( c , mxConstants . STYLE _FLIPH ,
! 1 ) ; e = null != e ? e : mxUtils . getValue ( c , mxConstants . STYLE _FLIPV , ! 1 ) ; b . x = Math . round ( Math . max ( 0 , Math . min ( a . width , b . x ) ) ) ; b . y = Math . round ( Math . max ( 0 , Math . min ( a . height , b . y ) ) ) ; b . width = Math . round ( Math . max ( 0 , Math . min ( a . width , b . width ) ) ) ; b . height = Math . round ( Math . max ( 0 , Math . min ( a . height , b . height ) ) ) ; if ( e && ( f == mxConstants . DIRECTION _SOUTH || f == mxConstants . DIRECTION _NORTH ) || d && ( f == mxConstants . DIRECTION _EAST || f == mxConstants . DIRECTION _WEST ) ) c = b . x , b . x = b . width , b . width = c ; if ( d && ( f == mxConstants . DIRECTION _SOUTH || f == mxConstants . DIRECTION _NORTH ) ||
e && ( f == mxConstants . DIRECTION _EAST || f == mxConstants . DIRECTION _WEST ) ) c = b . y , b . y = b . height , b . height = c ; d = mxRectangle . fromRectangle ( b ) ; f == mxConstants . DIRECTION _SOUTH ? ( d . y = b . x , d . x = b . height , d . width = b . y , d . height = b . width ) : f == mxConstants . DIRECTION _WEST ? ( d . y = b . height , d . x = b . width , d . width = b . x , d . height = b . y ) : f == mxConstants . DIRECTION _NORTH && ( d . y = b . width , d . x = b . y , d . width = b . height , d . height = b . x ) ; return new mxRectangle ( a . x + d . x , a . y + d . y , a . width - d . width - d . x , a . height - d . height - d . y ) } , getPerimeterPoint : function ( a , b , c ) { for ( var d =
null , e = 0 ; e < a . length - 1 ; e ++ ) { var f = mxUtils . intersection ( a [ e ] . x , a [ e ] . y , a [ e + 1 ] . x , a [ e + 1 ] . y , b . x , b . y , c . x , c . y ) ; if ( null != f ) { var g = c . x - f . x , k = c . y - f . y , f = { p : f , distSq : k * k + g * g } ; null != f && ( null == d || d . distSq > f . distSq ) && ( d = f ) } } return null != d ? d . p : null } , rectangleIntersectsSegment : function ( a , b , c ) { var d = a . y , e = a . x , f = d + a . height , g = e + a . width ; a = b . x ; var k = c . x ; b . x > c . x && ( a = c . x , k = b . x ) ; k > g && ( k = g ) ; a < e && ( a = e ) ; if ( a > k ) return ! 1 ; var e = b . y , g = c . y , l = c . x - b . x ; 1E-7 < Math . abs ( l ) && ( c = ( c . y - b . y ) / l , b = b . y - c * b . x , e = c * a + b , g = c * k + b ) ; e > g && ( b = g , g = e , e = b ) ;
g > f && ( g = f ) ; e < d && ( e = d ) ; return e > g ? ! 1 : ! 0 } , contains : function ( a , b , c ) { return a . x <= b && a . x + a . width >= b && a . y <= c && a . y + a . height >= c } , intersects : function ( a , b ) { var c = a . width , d = a . height , e = b . width , f = b . height ; if ( 0 >= e || 0 >= f || 0 >= c || 0 >= d ) return ! 1 ; var g = a . x , k = a . y , l = b . x , m = b . y , e = e + l , f = f + m , c = c + g , d = d + k ; return ( e < l || e > g ) && ( f < m || f > k ) && ( c < g || c > l ) && ( d < k || d > m ) } , intersectsHotspot : function ( a , b , c , d , e , f ) { d = null != d ? d : 1 ; e = null != e ? e : 0 ; f = null != f ? f : 0 ; if ( 0 < d ) { var g = a . getCenterX ( ) , k = a . getCenterY ( ) , l = a . width , m = a . height , n = mxUtils . getValue ( a . style ,
mxConstants . STYLE _STARTSIZE ) * a . view . scale ; 0 < n && ( mxUtils . getValue ( a . style , mxConstants . STYLE _HORIZONTAL , ! 0 ) ? ( k = a . y + n / 2 , m = n ) : ( g = a . x + n / 2 , l = n ) ) ; l = Math . max ( e , l * d ) ; m = Math . max ( e , m * d ) ; 0 < f && ( l = Math . min ( l , f ) , m = Math . min ( m , f ) ) ; d = new mxRectangle ( g - l / 2 , k - m / 2 , l , m ) ; g = mxUtils . toRadians ( mxUtils . getValue ( a . style , mxConstants . STYLE _ROTATION ) || 0 ) ; 0 != g && ( e = Math . cos ( - g ) , f = Math . sin ( - g ) , g = new mxPoint ( a . getCenterX ( ) , a . getCenterY ( ) ) , a = mxUtils . getRotatedPoint ( new mxPoint ( b , c ) , e , f , g ) , b = a . x , c = a . y ) ; return mxUtils . contains ( d , b , c ) } return ! 0 } ,
getOffset : function ( a , b ) { for ( var c = 0 , d = 0 , e = ! 1 , f = a , g = document . body , k = document . documentElement ; null != f && f != g && f != k && ! e ; ) { var l = mxUtils . getCurrentStyle ( f ) ; null != l && ( e = e || "fixed" == l . position ) ; f = f . parentNode } b || e || ( e = mxUtils . getDocumentScrollOrigin ( a . ownerDocument ) , c += e . x , d += e . y ) ; e = a . getBoundingClientRect ( ) ; null != e && ( c += e . left , d += e . top ) ; return new mxPoint ( c , d ) } , getDocumentScrollOrigin : function ( a ) { if ( mxClient . IS _QUIRKS ) return new mxPoint ( a . body . scrollLeft , a . body . scrollTop ) ; a = a . defaultView || a . parentWindow ;
return new mxPoint ( null != a && void 0 !== window . pageXOffset ? window . pageXOffset : ( document . documentElement || document . body . parentNode || document . body ) . scrollLeft , null != a && void 0 !== window . pageYOffset ? window . pageYOffset : ( document . documentElement || document . body . parentNode || document . body ) . scrollTop ) } , getScrollOrigin : function ( a , b , c ) { b = null != b ? b : ! 1 ; c = null != c ? c : ! 0 ; for ( var d = null != a ? a . ownerDocument : document , e = d . body , f = d . documentElement , g = new mxPoint , k = ! 1 ; null != a && a != e && a != f ; ) { isNaN ( a . scrollLeft ) || isNaN ( a . scrollTop ) ||
( g . x += a . scrollLeft , g . y += a . scrollTop ) ; var l = mxUtils . getCurrentStyle ( a ) ; null != l && ( k = k || "fixed" == l . position ) ; a = b ? a . parentNode : null } ! k && c && ( a = mxUtils . getDocumentScrollOrigin ( d ) , g . x += a . x , g . y += a . y ) ; return g } , convertPoint : function ( a , b , c ) { var d = mxUtils . getScrollOrigin ( a , ! 1 ) ; a = mxUtils . getOffset ( a ) ; a . x -= d . x ; a . y -= d . y ; return new mxPoint ( b - a . x , c - a . y ) } , ltrim : function ( a , b ) { return null != a ? a . replace ( new RegExp ( "^[" + ( b || "\\s" ) + "]+" , "g" ) , "" ) : null } , rtrim : function ( a , b ) { return null != a ? a . replace ( new RegExp ( "[" + ( b || "\\s" ) +
"]+$" , "g" ) , "" ) : null } , trim : function ( a , b ) { return mxUtils . ltrim ( mxUtils . rtrim ( a , b ) , b ) } , isNumeric : function ( a ) { return ! isNaN ( parseFloat ( a ) ) && isFinite ( a ) && ( "string" != typeof a || 0 > a . toLowerCase ( ) . indexOf ( "0x" ) ) } , isInteger : function ( a ) { return String ( parseInt ( a ) ) === String ( a ) } , mod : function ( a , b ) { return ( a % b + b ) % b } , intersection : function ( a , b , c , d , e , f , g , k ) { var l = ( k - f ) * ( c - a ) - ( g - e ) * ( d - b ) ; g = ( ( g - e ) * ( b - f ) - ( k - f ) * ( a - e ) ) / l ; e = ( ( c - a ) * ( b - f ) - ( d - b ) * ( a - e ) ) / l ; return 0 <= g && 1 >= g && 0 <= e && 1 >= e ? new mxPoint ( a + g * ( c - a ) , b + g * ( d - b ) ) : null } , ptSegDistSq : function ( a ,
b , c , d , e , f ) { c -= a ; d -= b ; e -= a ; f -= b ; 0 >= e * c + f * d ? c = 0 : ( e = c - e , f = d - f , a = e * c + f * d , c = 0 >= a ? 0 : a * a / ( c * c + d * d ) ) ; e = e * e + f * f - c ; 0 > e && ( e = 0 ) ; return e } , ptLineDist : function ( a , b , c , d , e , f ) { return Math . abs ( ( d - b ) * e - ( c - a ) * f + c * b - d * a ) / Math . sqrt ( ( d - b ) * ( d - b ) + ( c - a ) * ( c - a ) ) } , relativeCcw : function ( a , b , c , d , e , f ) { c -= a ; d -= b ; e -= a ; f -= b ; a = e * d - f * c ; 0 == a && ( a = e * c + f * d , 0 < a && ( a = ( e - c ) * c + ( f - d ) * d , 0 > a && ( a = 0 ) ) ) ; return 0 > a ? - 1 : 0 < a ? 1 : 0 } , animateChanges : function ( a , b ) { mxEffects . animateChanges . apply ( this , arguments ) } , cascadeOpacity : function ( a , b , c ) { mxEffects . cascadeOpacity . apply ( this ,
arguments ) } , fadeOut : function ( a , b , c , d , e , f ) { mxEffects . fadeOut . apply ( this , arguments ) } , setOpacity : function ( a , b ) { mxUtils . isVml ( a ) ? a . style . filter = 100 <= b ? "" : "alpha(opacity=" + b / 5 + ")" : mxClient . IS _IE && ( "undefined" === typeof document . documentMode || 9 > document . documentMode ) ? a . style . filter = 100 <= b ? "" : "alpha(opacity=" + b + ")" : a . style . opacity = b / 100 } , createImage : function ( a ) { var b ; mxClient . IS _IE6 && "CSS1Compat" != document . compatMode ? ( b = document . createElement ( mxClient . VML _PREFIX + ":image" ) , b . setAttribute ( "src" , a ) , b . style . borderStyle =
"none" ) : ( b = document . createElement ( "img" ) , b . setAttribute ( "src" , a ) , b . setAttribute ( "border" , "0" ) ) ; return b } , sortCells : function ( a , b ) { b = null != b ? b : ! 0 ; var c = new mxDictionary ; a . sort ( function ( a , e ) { var d = c . get ( a ) ; null == d && ( d = mxCellPath . create ( a ) . split ( mxCellPath . PATH _SEPARATOR ) , c . put ( a , d ) ) ; var g = c . get ( e ) ; null == g && ( g = mxCellPath . create ( e ) . split ( mxCellPath . PATH _SEPARATOR ) , c . put ( e , g ) ) ; d = mxCellPath . compare ( d , g ) ; return 0 == d ? 0 : 0 < d == b ? 1 : - 1 } ) ; return a } , getStylename : function ( a ) { return null != a && ( a = a . split ( ";" ) [ 0 ] , 0 > a . indexOf ( "=" ) ) ?
a : "" } , getStylenames : function ( a ) { var b = [ ] ; if ( null != a ) { a = a . split ( ";" ) ; for ( var c = 0 ; c < a . length ; c ++ ) 0 > a [ c ] . indexOf ( "=" ) && b . push ( a [ c ] ) } return b } , indexOfStylename : function ( a , b ) { if ( null != a && null != b ) for ( var c = a . split ( ";" ) , d = 0 , e = 0 ; e < c . length ; e ++ ) { if ( c [ e ] == b ) return d ; d += c [ e ] . length + 1 } return - 1 } , addStylename : function ( a , b ) { 0 > mxUtils . indexOfStylename ( a , b ) && ( null == a ? a = "" : 0 < a . length && ";" != a . charAt ( a . length - 1 ) && ( a += ";" ) , a += b ) ; return a } , removeStylename : function ( a , b ) { var c = [ ] ; if ( null != a ) for ( var d = a . split ( ";" ) , e = 0 ; e <
d . length ; e ++ ) d [ e ] != b && c . push ( d [ e ] ) ; return c . join ( ";" ) } , removeAllStylenames : function ( a ) { var b = [ ] ; if ( null != a ) { a = a . split ( ";" ) ; for ( var c = 0 ; c < a . length ; c ++ ) 0 <= a [ c ] . indexOf ( "=" ) && b . push ( a [ c ] ) } return b . join ( ";" ) } , setCellStyles : function ( a , b , c , d ) { if ( null != b && 0 < b . length ) { a . beginUpdate ( ) ; try { for ( var e = 0 ; e < b . length ; e ++ ) if ( null != b [ e ] ) { var f = mxUtils . setStyle ( a . getStyle ( b [ e ] ) , c , d ) ; a . setStyle ( b [ e ] , f ) } } finally { a . endUpdate ( ) } } } , setStyle : function ( a , b , c ) { var d = null != c && ( "undefined" == typeof c . length || 0 < c . length ) ; if ( null ==
a || 0 == a . length ) d && ( a = b + "=" + c + ";" ) ; else if ( a . substring ( 0 , b . length + 1 ) == b + "=" ) { var e = a . indexOf ( ";" ) ; a = d ? b + "=" + c + ( 0 > e ? ";" : a . substring ( e ) ) : 0 > e || e == a . length - 1 ? "" : a . substring ( e + 1 ) } else { var f = a . indexOf ( ";" + b + "=" ) ; 0 > f ? d && ( d = ";" == a . charAt ( a . length - 1 ) ? "" : ";" , a = a + d + b + "=" + c + ";" ) : ( e = a . indexOf ( ";" , f + 1 ) , a = d ? a . substring ( 0 , f + 1 ) + b + "=" + c + ( 0 > e ? ";" : a . substring ( e ) ) : a . substring ( 0 , f ) + ( 0 > e ? ";" : a . substring ( e ) ) ) } return a } , setCellStyleFlags : function ( a , b , c , d , e ) { if ( null != b && 0 < b . length ) { a . beginUpdate ( ) ; try { for ( var f = 0 ; f < b . length ; f ++ ) if ( null !=
b [ f ] ) { var g = mxUtils . setStyleFlag ( a . getStyle ( b [ f ] ) , c , d , e ) ; a . setStyle ( b [ f ] , g ) } } finally { a . endUpdate ( ) } } } , setStyleFlag : function ( a , b , c , d ) { if ( null == a || 0 == a . length ) a = d || null == d ? b + "=" + c : b + "=0" ; else { var e = a . indexOf ( b + "=" ) ; if ( 0 > e ) e = ";" == a . charAt ( a . length - 1 ) ? "" : ";" , a = d || null == d ? a + e + b + "=" + c : a + e + b + "=0" ; else { var f = a . indexOf ( ";" , e ) , g ; g = 0 > f ? a . substring ( e + b . length + 1 ) : a . substring ( e + b . length + 1 , f ) ; g = null == d ? parseInt ( g ) ^ c : d ? parseInt ( g ) | c : parseInt ( g ) & ~ c ; a = a . substring ( 0 , e ) + b + "=" + g + ( 0 <= f ? a . substring ( f ) : "" ) } } return a } , getAlignmentAsPoint : function ( a ,
b ) { var c = - . 5 , d = - . 5 ; a == mxConstants . ALIGN _LEFT ? c = 0 : a == mxConstants . ALIGN _RIGHT && ( c = - 1 ) ; b == mxConstants . ALIGN _TOP ? d = 0 : b == mxConstants . ALIGN _BOTTOM && ( d = - 1 ) ; return new mxPoint ( c , d ) } , getSizeForString : function ( a , b , c , d , e ) { b = null != b ? b : mxConstants . DEFAULT _FONTSIZE ; c = null != c ? c : mxConstants . DEFAULT _FONTFAMILY ; var f = document . createElement ( "div" ) ; f . style . fontFamily = c ; f . style . fontSize = Math . round ( b ) + "px" ; f . style . lineHeight = Math . round ( b * mxConstants . LINE _HEIGHT ) + "px" ; null != e && ( ( e & mxConstants . FONT _BOLD ) == mxConstants . FONT _BOLD &&
( f . style . fontWeight = "bold" ) , ( e & mxConstants . FONT _ITALIC ) == mxConstants . FONT _ITALIC && ( f . style . fontStyle = "italic" ) , b = [ ] , ( e & mxConstants . FONT _UNDERLINE ) == mxConstants . FONT _UNDERLINE && b . push ( "underline" ) , ( e & mxConstants . FONT _STRIKETHROUGH ) == mxConstants . FONT _STRIKETHROUGH && b . push ( "line-through" ) , 0 < b . length && ( f . style . textDecoration = b . join ( " " ) ) ) ; f . style . position = "absolute" ; f . style . visibility = "hidden" ; f . style . display = mxClient . IS _QUIRKS ? "inline" : "inline-block" ; f . style . zoom = "1" ; null != d ? ( f . style . width = d + "px" , f . style . whiteSpace =
"normal" ) : f . style . whiteSpace = "nowrap" ; f . innerHTML = a ; document . body . appendChild ( f ) ; a = new mxRectangle ( 0 , 0 , f . offsetWidth , f . offsetHeight ) ; document . body . removeChild ( f ) ; return a } , getViewXml : function ( a , b , c , d , e ) { d = null != d ? d : 0 ; e = null != e ? e : 0 ; b = null != b ? b : 1 ; null == c && ( c = [ a . getModel ( ) . getRoot ( ) ] ) ; var f = a . getView ( ) , g = null , k = f . isEventsEnabled ( ) ; f . setEventsEnabled ( ! 1 ) ; var l = f . drawPane , m = f . overlayPane ; a . dialect == mxConstants . DIALECT _SVG ? ( f . drawPane = document . createElementNS ( mxConstants . NS _SVG , "g" ) , f . canvas . appendChild ( f . drawPane ) ,
f . overlayPane = document . createElementNS ( mxConstants . NS _SVG , "g" ) ) : ( f . drawPane = f . drawPane . cloneNode ( ! 1 ) , f . canvas . appendChild ( f . drawPane ) , f . overlayPane = f . overlayPane . cloneNode ( ! 1 ) ) ; f . canvas . appendChild ( f . overlayPane ) ; var n = f . getTranslate ( ) ; f . translate = new mxPoint ( d , e ) ; b = new mxTemporaryCellStates ( a . getView ( ) , b , c ) ; try { g = ( new mxCodec ) . encode ( a . getView ( ) ) } finally { b . destroy ( ) , f . translate = n , f . canvas . removeChild ( f . drawPane ) , f . canvas . removeChild ( f . overlayPane ) , f . drawPane = l , f . overlayPane = m , f . setEventsEnabled ( k ) } return g } ,
getScaleForPageCount : function ( a , b , c , d ) { if ( 1 > a ) return 1 ; c = null != c ? c : mxConstants . PAGE _FORMAT _A4 _PORTRAIT ; d = null != d ? d : 0 ; var e = c . width - 2 * d ; c = c . height - 2 * d ; d = b . getGraphBounds ( ) . clone ( ) ; b = b . getView ( ) . getScale ( ) ; d . width /= b ; d . height /= b ; b = d . width ; var f = Math . sqrt ( a ) ; d = Math . sqrt ( b / d . height / ( e / c ) ) ; c = f * d ; d = f / d ; if ( 1 > c && d > a ) { var g = d / a ; d = a ; c /= g } 1 > d && c > a && ( g = c / a , c = a , d /= g ) ; g = Math . ceil ( c ) * Math . ceil ( d ) ; for ( f = 0 ; g > a ; ) { var g = Math . floor ( c ) / c , k = Math . floor ( d ) / d ; 1 == g && ( g = Math . floor ( c - 1 ) / c ) ; 1 == k && ( k = Math . floor ( d - 1 ) / d ) ; g = g > k ?
g : k ; c *= g ; d *= g ; g = Math . ceil ( c ) * Math . ceil ( d ) ; f ++ ; if ( 10 < f ) break } return e * c / b * . 99999 } , show : function ( a , b , c , d , e , f ) { c = null != c ? c : 0 ; d = null != d ? d : 0 ; null == b ? b = window . open ( ) . document : b . open ( ) ; 9 == document . documentMode && b . writeln ( '\x3c!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=9"><![endif]--\x3e' ) ; var g = a . getGraphBounds ( ) , k = Math . ceil ( c - g . x ) , l = Math . ceil ( d - g . y ) ; null == e && ( e = Math . ceil ( g . width + c ) + Math . ceil ( Math . ceil ( g . x ) - g . x ) ) ; null == f && ( f = Math . ceil ( g . height + d ) + Math . ceil ( Math . ceil ( g . y ) - g . y ) ) ; if ( mxClient . IS _IE ||
11 == document . documentMode ) { d = "<html><head>" ; g = document . getElementsByTagName ( "base" ) ; for ( c = 0 ; c < g . length ; c ++ ) d += g [ c ] . outerHTML ; d += "<style>" ; for ( c = 0 ; c < document . styleSheets . length ; c ++ ) try { d += document . styleSheets [ c ] . cssText } catch ( m ) { } d = d + '</style></head><body style="margin:0px;">' + ( '<div style="position:absolute;overflow:hidden;width:' + e + "px;height:" + f + 'px;"><div style="position:relative;left:' + k + "px;top:" + l + 'px;">' ) + a . container . innerHTML ; b . writeln ( d + "</div></div></body><html>" ) ; b . close ( ) } else { b . writeln ( "<html><head>" ) ;
g = document . getElementsByTagName ( "base" ) ; for ( c = 0 ; c < g . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( g [ c ] ) ) ; d = document . getElementsByTagName ( "link" ) ; for ( c = 0 ; c < d . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( d [ c ] ) ) ; d = document . getElementsByTagName ( "style" ) ; for ( c = 0 ; c < d . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( d [ c ] ) ) ; b . writeln ( '</head><body style="margin:0px;"></body></html>' ) ; b . close ( ) ; c = b . createElement ( "div" ) ; c . position = "absolute" ; c . overflow = "hidden" ; c . style . width = e + "px" ; c . style . height = f + "px" ; e = b . createElement ( "div" ) ;
e . style . position = "absolute" ; e . style . left = k + "px" ; e . style . top = l + "px" ; f = a . container . firstChild ; for ( d = null ; null != f ; ) g = f . cloneNode ( ! 0 ) , f == a . view . drawPane . ownerSVGElement ? ( c . appendChild ( g ) , d = g ) : e . appendChild ( g ) , f = f . nextSibling ; b . body . appendChild ( c ) ; null != e . firstChild && b . body . appendChild ( e ) ; null != d && ( d . style . minWidth = "" , d . style . minHeight = "" , d . firstChild . setAttribute ( "transform" , "translate(" + k + "," + l + ")" ) ) } mxUtils . removeCursors ( b . body ) ; return b } , printScreen : function ( a ) { var b = window . open ( ) ; a . getGraphBounds ( ) ;
mxUtils . show ( a , b . document ) ; a = function ( ) { b . focus ( ) ; b . print ( ) ; b . close ( ) } ; mxClient . IS _GC ? b . setTimeout ( a , 500 ) : a ( ) } , popup : function ( a , b ) { if ( b ) { var c = document . createElement ( "div" ) ; c . style . overflow = "scroll" ; c . style . width = "636px" ; c . style . height = "460px" ; var d = document . createElement ( "pre" ) ; d . innerHTML = mxUtils . htmlEntities ( a , ! 1 ) . replace ( /\n/g , "<br>" ) . replace ( / /g , " " ) ; c . appendChild ( d ) ; c = new mxWindow ( "Popup Window" , c , document . body . clientWidth / 2 - 320 , Math . max ( document . body . clientHeight || 0 , document . documentElement . clientHeight ) /
2 - 240 , 640 , 480 , ! 1 , ! 0 ) ; c . setClosable ( ! 0 ) ; c . setVisible ( ! 0 ) } else mxClient . IS _NS ? ( c = window . open ( ) , c . document . writeln ( "<pre>" + mxUtils . htmlEntities ( a ) + "</pre" ) , c . document . close ( ) ) : ( c = window . open ( ) , d = c . document . createElement ( "pre" ) , d . innerHTML = mxUtils . htmlEntities ( a , ! 1 ) . replace ( /\n/g , "<br>" ) . replace ( / /g , " " ) , c . document . body . appendChild ( d ) ) } , alert : function ( a ) { alert ( a ) } , prompt : function ( a , b ) { return prompt ( a , null != b ? b : "" ) } , confirm : function ( a ) { return confirm ( a ) } , error : function ( a , b , c , d ) { var e = document . createElement ( "div" ) ;
e . style . padding = "20px" ; var f = document . createElement ( "img" ) ; f . setAttribute ( "src" , d || mxUtils . errorImage ) ; f . setAttribute ( "valign" , "bottom" ) ; f . style . verticalAlign = "middle" ; e . appendChild ( f ) ; e . appendChild ( document . createTextNode ( " " ) ) ; e . appendChild ( document . createTextNode ( " " ) ) ; e . appendChild ( document . createTextNode ( " " ) ) ; mxUtils . write ( e , a ) ; a = document . body . clientWidth ; d = document . body . clientHeight || document . documentElement . clientHeight ; var g = new mxWindow ( mxResources . get ( mxUtils . errorResource ) || mxUtils . errorResource ,
e , ( a - b ) / 2 , d / 4 , b , null , ! 1 , ! 0 ) ; c && ( mxUtils . br ( e ) , b = document . createElement ( "p" ) , c = document . createElement ( "button" ) , mxClient . IS _IE ? c . style . cssText = "float:right" : c . setAttribute ( "style" , "float:right" ) , mxEvent . addListener ( c , "click" , function ( a ) { g . destroy ( ) } ) , mxUtils . write ( c , mxResources . get ( mxUtils . closeResource ) || mxUtils . closeResource ) , b . appendChild ( c ) , e . appendChild ( b ) , mxUtils . br ( e ) , g . setClosable ( ! 0 ) ) ; g . setVisible ( ! 0 ) ; return g } , makeDraggable : function ( a , b , c , d , e , f , g , k , l , m ) { a = new mxDragSource ( a , c ) ; a . dragOffset =
new mxPoint ( null != e ? e : 0 , null != f ? f : mxConstants . TOOLTIP _VERTICAL _OFFSET ) ; a . autoscroll = g ; a . setGuidesEnabled ( ! 1 ) ; null != l && ( a . highlightDropTargets = l ) ; null != m && ( a . getDropTarget = m ) ; a . getGraphForEvent = function ( a ) { return "function" == typeof b ? b ( a ) : b } ; null != d && ( a . createDragElement = function ( ) { return d . cloneNode ( ! 0 ) } , k && ( a . createPreviewElement = function ( a ) { var b = d . cloneNode ( ! 0 ) , c = parseInt ( b . style . width ) , e = parseInt ( b . style . height ) ; b . style . width = Math . round ( c * a . view . scale ) + "px" ; b . style . height = Math . round ( e * a . view . scale ) +
"px" ; return b } ) ) ; return a } } , mxConstants = { DEFAULT _HOTSPOT : . 3 , MIN _HOTSPOT _SIZE : 8 , MAX _HOTSPOT _SIZE : 0 , RENDERING _HINT _EXACT : "exact" , RENDERING _HINT _FASTER : "faster" , RENDERING _HINT _FASTEST : "fastest" , DIALECT _SVG : "svg" , DIALECT _VML : "vml" , DIALECT _MIXEDHTML : "mixedHtml" , DIALECT _PREFERHTML : "preferHtml" , DIALECT _STRICTHTML : "strictHtml" , NS _SVG : "http://www.w3.org/2000/svg" , NS _XHTML : "http://www.w3.org/1999/xhtml" , NS _XLINK : "http://www.w3.org/1999/xlink" , SHADOWCOLOR : "gray" , VML _SHADOWCOLOR : "gray" , SHADOW _OFFSET _X : 2 , SHADOW _OFFSET _Y : 3 ,
SHADOW _OPACITY : 1 , NODETYPE _ELEMENT : 1 , NODETYPE _ATTRIBUTE : 2 , NODETYPE _TEXT : 3 , NODETYPE _CDATA : 4 , NODETYPE _ENTITY _REFERENCE : 5 , NODETYPE _ENTITY : 6 , NODETYPE _PROCESSING _INSTRUCTION : 7 , NODETYPE _COMMENT : 8 , NODETYPE _DOCUMENT : 9 , NODETYPE _DOCUMENTTYPE : 10 , NODETYPE _DOCUMENT _FRAGMENT : 11 , NODETYPE _NOTATION : 12 , TOOLTIP _VERTICAL _OFFSET : 16 , DEFAULT _VALID _COLOR : "#00FF00" , DEFAULT _INVALID _COLOR : "#FF0000" , OUTLINE _HIGHLIGHT _COLOR : "#00FF00" , OUTLINE _HIGHLIGHT _STROKEWIDTH : 5 , HIGHLIGHT _STROKEWIDTH : 3 , HIGHLIGHT _SIZE : 2 , HIGHLIGHT _OPACITY : 100 ,
CURSOR _MOVABLE _VERTEX : "move" , CURSOR _MOVABLE _EDGE : "move" , CURSOR _LABEL _HANDLE : "default" , CURSOR _TERMINAL _HANDLE : "pointer" , CURSOR _BEND _HANDLE : "crosshair" , CURSOR _VIRTUAL _BEND _HANDLE : "crosshair" , CURSOR _CONNECT : "pointer" , HIGHLIGHT _COLOR : "#00FF00" , CONNECT _TARGET _COLOR : "#0000FF" , INVALID _CONNECT _TARGET _COLOR : "#FF0000" , DROP _TARGET _COLOR : "#0000FF" , VALID _COLOR : "#00FF00" , INVALID _COLOR : "#FF0000" , EDGE _SELECTION _COLOR : "#00FF00" , VERTEX _SELECTION _COLOR : "#00FF00" , VERTEX _SELECTION _STROKEWIDTH : 1 , EDGE _SELECTION _STROKEWIDTH : 1 ,
VERTEX _SELECTION _DASHED : ! 0 , EDGE _SELECTION _DASHED : ! 0 , GUIDE _COLOR : "#FF0000" , GUIDE _STROKEWIDTH : 1 , OUTLINE _COLOR : "#0099FF" , OUTLINE _STROKEWIDTH : mxClient . IS _IE ? 2 : 3 , HANDLE _SIZE : 6 , LABEL _HANDLE _SIZE : 4 , HANDLE _FILLCOLOR : "#00FF00" , HANDLE _STROKECOLOR : "black" , LABEL _HANDLE _FILLCOLOR : "yellow" , CONNECT _HANDLE _FILLCOLOR : "#0000FF" , LOCKED _HANDLE _FILLCOLOR : "#FF0000" , OUTLINE _HANDLE _FILLCOLOR : "#00FFFF" , OUTLINE _HANDLE _STROKECOLOR : "#0033FF" , DEFAULT _FONTFAMILY : "Arial,Helvetica" , DEFAULT _FONTSIZE : 11 , DEFAULT _TEXT _DIRECTION : "" ,
LINE _HEIGHT : 1.2 , WORD _WRAP : "normal" , ABSOLUTE _LINE _HEIGHT : ! 1 , DEFAULT _FONTSTYLE : 0 , DEFAULT _STARTSIZE : 40 , DEFAULT _MARKERSIZE : 6 , DEFAULT _IMAGESIZE : 24 , ENTITY _SEGMENT : 30 , RECTANGLE _ROUNDING _FACTOR : . 15 , LINE _ARCSIZE : 20 , ARROW _SPACING : 0 , ARROW _WIDTH : 30 , ARROW _SIZE : 30 , PAGE _FORMAT _A4 _PORTRAIT : new mxRectangle ( 0 , 0 , 827 , 1169 ) , PAGE _FORMAT _A4 _LANDSCAPE : new mxRectangle ( 0 , 0 , 1169 , 827 ) , PAGE _FORMAT _LETTER _PORTRAIT : new mxRectangle ( 0 , 0 , 850 , 1100 ) , PAGE _FORMAT _LETTER _LANDSCAPE : new mxRectangle ( 0 , 0 , 1100 , 850 ) , NONE : "none" , STYLE _PERIMETER : "perimeter" ,
STYLE _SOURCE _PORT : "sourcePort" , STYLE _TARGET _PORT : "targetPort" , STYLE _PORT _CONSTRAINT : "portConstraint" , STYLE _PORT _CONSTRAINT _ROTATION : "portConstraintRotation" , STYLE _SOURCE _PORT _CONSTRAINT : "sourcePortConstraint" , STYLE _TARGET _PORT _CONSTRAINT : "targetPortConstraint" , STYLE _OPACITY : "opacity" , STYLE _FILL _OPACITY : "fillOpacity" , STYLE _STROKE _OPACITY : "strokeOpacity" , STYLE _TEXT _OPACITY : "textOpacity" , STYLE _TEXT _DIRECTION : "textDirection" , STYLE _OVERFLOW : "overflow" , STYLE _ORTHOGONAL : "orthogonal" , STYLE _EXIT _X : "exitX" ,
STYLE _EXIT _Y : "exitY" , STYLE _EXIT _DX : "exitDx" , STYLE _EXIT _DY : "exitDy" , STYLE _EXIT _PERIMETER : "exitPerimeter" , STYLE _ENTRY _X : "entryX" , STYLE _ENTRY _Y : "entryY" , STYLE _ENTRY _DX : "entryDx" , STYLE _ENTRY _DY : "entryDy" , STYLE _ENTRY _PERIMETER : "entryPerimeter" , STYLE _WHITE _SPACE : "whiteSpace" , STYLE _ROTATION : "rotation" , STYLE _FILLCOLOR : "fillColor" , STYLE _POINTER _EVENTS : "pointerEvents" , STYLE _SWIMLANE _FILLCOLOR : "swimlaneFillColor" , STYLE _MARGIN : "margin" , STYLE _GRADIENTCOLOR : "gradientColor" , STYLE _GRADIENT _DIRECTION : "gradientDirection" ,
STYLE _STROKECOLOR : "strokeColor" , STYLE _SEPARATORCOLOR : "separatorColor" , STYLE _STROKEWIDTH : "strokeWidth" , STYLE _ALIGN : "align" , STYLE _VERTICAL _ALIGN : "verticalAlign" , STYLE _LABEL _WIDTH : "labelWidth" , STYLE _LABEL _POSITION : "labelPosition" , STYLE _VERTICAL _LABEL _POSITION : "verticalLabelPosition" , STYLE _IMAGE _ASPECT : "imageAspect" , STYLE _IMAGE _ALIGN : "imageAlign" , STYLE _IMAGE _VERTICAL _ALIGN : "imageVerticalAlign" , STYLE _GLASS : "glass" , STYLE _IMAGE : "image" , STYLE _IMAGE _WIDTH : "imageWidth" , STYLE _IMAGE _HEIGHT : "imageHeight" , STYLE _IMAGE _BACKGROUND : "imageBackground" ,
STYLE _IMAGE _BORDER : "imageBorder" , STYLE _FLIPH : "flipH" , STYLE _FLIPV : "flipV" , STYLE _NOLABEL : "noLabel" , STYLE _NOEDGESTYLE : "noEdgeStyle" , STYLE _LABEL _BACKGROUNDCOLOR : "labelBackgroundColor" , STYLE _LABEL _BORDERCOLOR : "labelBorderColor" , STYLE _LABEL _PADDING : "labelPadding" , STYLE _INDICATOR _SHAPE : "indicatorShape" , STYLE _INDICATOR _IMAGE : "indicatorImage" , STYLE _INDICATOR _COLOR : "indicatorColor" , STYLE _INDICATOR _STROKECOLOR : "indicatorStrokeColor" , STYLE _INDICATOR _GRADIENTCOLOR : "indicatorGradientColor" , STYLE _INDICATOR _SPACING : "indicatorSpacing" ,
STYLE _INDICATOR _WIDTH : "indicatorWidth" , STYLE _INDICATOR _HEIGHT : "indicatorHeight" , STYLE _INDICATOR _DIRECTION : "indicatorDirection" , STYLE _SHADOW : "shadow" , STYLE _SEGMENT : "segment" , STYLE _ENDARROW : "endArrow" , STYLE _STARTARROW : "startArrow" , STYLE _ENDSIZE : "endSize" , STYLE _STARTSIZE : "startSize" , STYLE _SWIMLANE _LINE : "swimlaneLine" , STYLE _ENDFILL : "endFill" , STYLE _STARTFILL : "startFill" , STYLE _DASHED : "dashed" , STYLE _DASH _PATTERN : "dashPattern" , STYLE _FIX _DASH : "fixDash" , STYLE _ROUNDED : "rounded" , STYLE _CURVED : "curved" , STYLE _ARCSIZE : "arcSize" ,
STYLE _ABSOLUTE _ARCSIZE : "absoluteArcSize" , STYLE _SOURCE _PERIMETER _SPACING : "sourcePerimeterSpacing" , STYLE _TARGET _PERIMETER _SPACING : "targetPerimeterSpacing" , STYLE _PERIMETER _SPACING : "perimeterSpacing" , STYLE _SPACING : "spacing" , STYLE _SPACING _TOP : "spacingTop" , STYLE _SPACING _LEFT : "spacingLeft" , STYLE _SPACING _BOTTOM : "spacingBottom" , STYLE _SPACING _RIGHT : "spacingRight" , STYLE _HORIZONTAL : "horizontal" , STYLE _DIRECTION : "direction" , STYLE _ANCHOR _POINT _DIRECTION : "anchorPointDirection" , STYLE _ELBOW : "elbow" , STYLE _FONTCOLOR : "fontColor" ,
STYLE _FONTFAMILY : "fontFamily" , STYLE _FONTSIZE : "fontSize" , STYLE _FONTSTYLE : "fontStyle" , STYLE _ASPECT : "aspect" , STYLE _AUTOSIZE : "autosize" , STYLE _FOLDABLE : "foldable" , STYLE _EDITABLE : "editable" , STYLE _BACKGROUND _OUTLINE : "backgroundOutline" , STYLE _BENDABLE : "bendable" , STYLE _MOVABLE : "movable" , STYLE _RESIZABLE : "resizable" , STYLE _RESIZE _WIDTH : "resizeWidth" , STYLE _RESIZE _HEIGHT : "resizeHeight" , STYLE _ROTATABLE : "rotatable" , STYLE _CLONEABLE : "cloneable" , STYLE _DELETABLE : "deletable" , STYLE _SHAPE : "shape" , STYLE _EDGE : "edgeStyle" ,
STYLE _JETTY _SIZE : "jettySize" , STYLE _SOURCE _JETTY _SIZE : "sourceJettySize" , STYLE _TARGET _JETTY _SIZE : "targetJettySize" , STYLE _LOOP : "loopStyle" , STYLE _ORTHOGONAL _LOOP : "orthogonalLoop" , STYLE _ROUTING _CENTER _X : "routingCenterX" , STYLE _ROUTING _CENTER _Y : "routingCenterY" , FONT _BOLD : 1 , FONT _ITALIC : 2 , FONT _UNDERLINE : 4 , FONT _STRIKETHROUGH : 8 , SHAPE _RECTANGLE : "rectangle" , SHAPE _ELLIPSE : "ellipse" , SHAPE _DOUBLE _ELLIPSE : "doubleEllipse" , SHAPE _RHOMBUS : "rhombus" , SHAPE _LINE : "line" , SHAPE _IMAGE : "image" , SHAPE _ARROW : "arrow" , SHAPE _ARROW _CONNECTOR : "arrowConnector" ,
SHAPE _LABEL : "label" , SHAPE _CYLINDER : "cylinder" , SHAPE _SWIMLANE : "swimlane" , SHAPE _CONNECTOR : "connector" , SHAPE _ACTOR : "actor" , SHAPE _CLOUD : "cloud" , SHAPE _TRIANGLE : "triangle" , SHAPE _HEXAGON : "hexagon" , ARROW _CLASSIC : "classic" , ARROW _CLASSIC _THIN : "classicThin" , ARROW _BLOCK : "block" , ARROW _BLOCK _THIN : "blockThin" , ARROW _OPEN : "open" , ARROW _OPEN _THIN : "openThin" , ARROW _OVAL : "oval" , ARROW _DIAMOND : "diamond" , ARROW _DIAMOND _THIN : "diamondThin" , ALIGN _LEFT : "left" , ALIGN _CENTER : "center" , ALIGN _RIGHT : "right" , ALIGN _TOP : "top" , ALIGN _MIDDLE : "middle" ,
ALIGN _BOTTOM : "bottom" , DIRECTION _NORTH : "north" , DIRECTION _SOUTH : "south" , DIRECTION _EAST : "east" , DIRECTION _WEST : "west" , TEXT _DIRECTION _DEFAULT : "" , TEXT _DIRECTION _AUTO : "auto" , TEXT _DIRECTION _LTR : "ltr" , TEXT _DIRECTION _RTL : "rtl" , DIRECTION _MASK _NONE : 0 , DIRECTION _MASK _WEST : 1 , DIRECTION _MASK _NORTH : 2 , DIRECTION _MASK _SOUTH : 4 , DIRECTION _MASK _EAST : 8 , DIRECTION _MASK _ALL : 15 , ELBOW _VERTICAL : "vertical" , ELBOW _HORIZONTAL : "horizontal" , EDGESTYLE _ELBOW : "elbowEdgeStyle" , EDGESTYLE _ENTITY _RELATION : "entityRelationEdgeStyle" , EDGESTYLE _LOOP : "loopEdgeStyle" ,
EDGESTYLE _SIDETOSIDE : "sideToSideEdgeStyle" , EDGESTYLE _TOPTOBOTTOM : "topToBottomEdgeStyle" , EDGESTYLE _ORTHOGONAL : "orthogonalEdgeStyle" , EDGESTYLE _SEGMENT : "segmentEdgeStyle" , PERIMETER _ELLIPSE : "ellipsePerimeter" , PERIMETER _RECTANGLE : "rectanglePerimeter" , PERIMETER _RHOMBUS : "rhombusPerimeter" , PERIMETER _HEXAGON : "hexagonPerimeter" , PERIMETER _TRIANGLE : "trianglePerimeter" } ;
null != a . namespaceURI && a . namespaceURI != e && ( e = a . namespaceURI , null == a . getAttribute ( "xmlns" ) && a . setAttribute ( "xmlns" , a . namespaceURI ) ) , a . nodeType == mxConstants . NODETYPE _TEXT ) a = mxUtils . getTextContent ( a ) , 0 < a . length && f . push ( c + mxUtils . htmlEntities ( mxUtils. trim ( a ) , ! 1 ) ) ; else { f . push ( c + "<" + a . nodeName ) ; var g = a . attributes ; if ( null != g ) for ( var k = 0 ; k < g . length ; k ++ ) { var l = mxUtils . htmlEntities ( g [ k ] . value ) ; f . push ( " " + g [ k ] . nodeName + '="' + l + '"' ) } g = a . firstChild ; if ( null != g ) { for ( f . push ( ">" + d ) ; null != g ; ) f . push ( mxUtils . getPrettyXml ( g ,
b , c + b , d , e ) ) , g = g . nextSibling ; f . push ( c + "</" + a . nodeName + ">" + d ) } else f . push ( "/>" + d ) } return f . join ( "" ) } , extractTextWithWhitespace : function ( a ) { function b ( a ) { if ( 1 != a . length || "BR" != a [ 0 ] . nodeName && "\n" != a [ 0 ] . innerHTML ) for ( var e = 0 ; e < a . length ; e ++ ) { var g = a [ e ] ; "BR" == g . nodeName || "\n" == g . innerHTML || ( 1 == a . length || 0 == e ) && "DIV" == g . nodeName && "<br>" == g . innerHTML . toLowerCase ( ) ? d . push ( "\n" ) : ( 3 === g . nodeType || 4 === g . nodeType ? 0 < g . nodeValue . length && d . push ( g . nodeValue ) : 8 !== g . nodeType && 0 < g . childNodes . length && b ( g . childNodes ) ,
e < a . length - 1 && 0 <= mxUtils . indexOf ( c , a [ e + 1 ] . nodeName ) && d . push ( "\n" ) ) } } var c = "BLOCKQUOTE DIV H1 H2 H3 H4 H5 H6 OL P PRE TABLE UL" . split ( " " ) , d = [ ] ; b ( a ) ; return d . join ( "" ) } , replaceTrailingNewlines : function ( a , b ) { for ( var c = "" ; 0 < a . length && "\n" == a . charAt ( a . length - 1 ) ; ) a = a . substring ( 0 , a . length - 1 ) , c += b ; return a + c } , getTextContent : function ( a ) { return mxClient . IS _IE && void 0 !== a . innerText ? a . innerText : null != a ? a [ void 0 === a . textContent ? "text" : "textContent" ] : "" } , setTextContent : function ( a , b ) { void 0 !== a . innerText ? a . innerText =
b : a [ void 0 === a . textContent ? "text" : "textContent" ] = b } , getInnerHtml : function ( ) { return mxClient . IS _IE ? function ( a ) { return null != a ? a . innerHTML : "" } : function ( a ) { return null != a ? ( new XMLSerializer ) . serializeToString ( a ) : "" } } ( ) , getOuterHtml : function ( ) { return mxClient . IS _IE ? function ( a ) { if ( null != a ) { if ( null != a . outerHTML ) return a . outerHTML ; var b = [ ] ; b . push ( "<" + a . nodeName ) ; var c = a . attributes ; if ( null != c ) for ( var d = 0 ; d < c . length ; d ++ ) { var e = c [ d ] . value ; null != e && 0 < e . length && ( b . push ( " " ) , b . push ( c [ d ] . nodeName ) , b . push ( '="' ) ,
b . push ( e ) , b . push ( '"' ) ) } 0 == a . innerHTML . length ? b . push ( "/>" ) : ( b . push ( ">" ) , b . push ( a . innerHTML ) , b . push ( "</" + a . nodeName + ">" ) ) ; return b . join ( "" ) } return "" } : function ( a ) { return null != a ? ( new XMLSerializer ) . serializeToString ( a ) : "" } } ( ) , write : function ( a , b ) { var c = a . ownerDocument . createTextNode ( b ) ; null != a && a . appendChild ( c ) ; return c } , writeln : function ( a , b ) { var c = a . ownerDocument . createTextNode ( b ) ; null != a && ( a . appendChild ( c ) , a . appendChild ( document . createElement ( "br" ) ) ) ; return c } , br : function ( a , b ) { b = b || 1 ; for ( var c = null ,
d = 0 ; d < b ; d ++ ) null != a && ( c = a . ownerDocument . createElement ( "br" ) , a . appendChild ( c ) ) ; return c } , button : function ( a , b , c ) { c = null != c ? c : document ; c = c . createElement ( "button" ) ; mxUtils . write ( c , a ) ; mxEvent . addListener ( c , "click" , function ( a ) { b ( a ) } ) ; return c } , para : function ( a , b ) { var c = document . createElement ( "p" ) ; mxUtils . write ( c , b ) ; null != a && a . appendChild ( c ) ; return c } , addTransparentBackgroundFilter : function ( a ) { a . style . filter += "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + mxClient . imageBasePath + "/transparent.gif', sizingMethod='scale')" } ,
linkAction : function ( a , b , c , d , e ) { return mxUtils . link ( a , b , function ( ) { c . execute ( d ) } , e ) } , linkInvoke : function ( a , b , c , d , e , f ) { return mxUtils . link ( a , b , function ( ) { c [ d ] ( e ) } , f ) } , link : function ( a , b , c , d ) { var e = document . createElement ( "span" ) ; e . style . color = "blue" ; e . style . textDecoration = "underline" ; e . style . cursor = "pointer" ; null != d && ( e . style . paddingLeft = d + "px" ) ; mxEvent . addListener ( e , "click" , c ) ; mxUtils . write ( e , b ) ; null != a && a . appendChild ( e ) ; return e } , getDocumentSize : function ( ) { var a = document . body , b = document . documentElement ;
try { return new mxRectangle ( 0 , 0 , a . clientWidth || b . clientWidth , Math . max ( a . clientHeight || 0 , b . clientHeight ) ) } catch ( c ) { return new mxRectangle } } , fit : function ( a ) { var b = mxUtils . getDocumentSize ( ) , c = parseInt ( a . offsetLeft ) , d = parseInt ( a . offsetWidth ) , e = mxUtils . getDocumentScrollOrigin ( a . ownerDocument ) , f = e . x , e = e . y , g = f + b . width ; c + d > g && ( a . style . left = Math . max ( f , g - d ) + "px" ) ; c = parseInt ( a . offsetTop ) ; d = parseInt ( a . offsetHeight ) ; b = e + b . height ; c + d > b && ( a . style . top = Math . max ( e , b - d ) + "px" ) } , load : function ( a ) { a = new mxXmlRequest ( a , null ,
"GET" , ! 1 ) ; a . send ( ) ; return a } , get : function ( a , b , c , d , e , f ) { a = new mxXmlRequest ( a , null , "GET" ) ; null != d && a . setBinary ( d ) ; a . send ( b , c , e , f ) ; return a } , getAll : function ( a , b , c ) { for ( var d = a . length , e = [ ] , f = 0 , g = function ( ) { 0 == f && null != c && c ( ) ; f ++ } , k = 0 ; k < a . length ; k ++ ) ( function ( a , c ) { mxUtils . get ( a , function ( a ) { var f = a . getStatus ( ) ; 200 > f || 299 < f ? g ( ) : ( e [ c ] = a , d -- , 0 == d && b ( e ) ) } , g ) } ) ( a [ k ] , k ) ; 0 == d && b ( e ) } , post : function ( a , b , c , d ) { return ( new mxXmlRequest ( a , b ) ) . send ( c , d ) } , submit : function ( a , b , c , d ) { return ( new mxXmlRequest ( a , b ) ) . simulate ( c ,
d ) } , loadInto : function ( a , b , c ) { mxClient . IS _IE ? b . onreadystatechange = function ( ) { 4 == b . readyState && c ( ) } : b . addEventListener ( "load" , c , ! 1 ) ; b . load ( a ) } , getValue : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a && ( a = c ) ; return a } , getNumber : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a && ( a = c || 0 ) ; return Number ( a ) } , getColor : function ( a , b , c ) { a = null != a ? a [ b ] : null ; null == a ? a = c : a == mxConstants . NONE && ( a = null ) ; return a } , clone : function ( a , b , c ) { c = null != c ? c : ! 1 ; var d = null ; if ( null != a && "function" == typeof a . constructor ) { var d = new a . constructor ,
e ; for ( e in a ) e != mxObjectIdentity . FIELD _NAME && ( null == b || 0 > mxUtils . indexOf ( b , e ) ) && ( d [ e ] = c || "object" != typeof a [ e ] ? a [ e ] : mxUtils . clone ( a [ e ] ) ) } return d } , equalPoints : function ( a , b ) { if ( null == a && null != b || null != a && null == b || null != a && null != b && a . length != b . length ) return ! 1 ; if ( null != a && null != b ) for ( var c = 0 ; c < a . length ; c ++ ) if ( null != a [ c ] && null == b [ c ] || null == a [ c ] && null != b [ c ] || null != a [ c ] && null != b [ c ] && ( a [ c ] . x != b [ c ] . x || a [ c ] . y != b [ c ] . y ) ) return ! 1 ; return ! 0 } , equalEntries : function ( a , b ) { var c = 0 ; if ( null == a && null != b || null != a && null ==
b || null != a && null != b && a . length != b . length ) return ! 1 ; if ( null != a && null != b ) { for ( var d in b ) c ++ ; for ( d in a ) if ( c -- , ! ( mxUtils . isNaN ( a [ d ] ) && mxUtils . isNaN ( b [ d ] ) || a [ d ] == b [ d ] ) ) return ! 1 } return 0 == c } , removeDuplicates : function ( a ) { for ( var b = new mxDictionary , c = [ ] , d = 0 ; d < a . length ; d ++ ) b . get ( a [ d ] ) || ( c . push ( a [ d ] ) , b . put ( a [ d ] , ! 0 ) ) ; return c } , isNaN : function ( a ) { return "number" == typeof a && isNaN ( a ) } , extend : function ( a , b ) { var c = function ( ) { } ; c . prototype = b . prototype ; a . prototype = new c ; a . prototype . constructor = a } , toString : function ( a ) { var b =
"" , c ; for ( c in a ) try { if ( null == a [ c ] ) b += c + " = [null]\n" ; else if ( "function" == typeof a [ c ] ) b += c + " => [Function]\n" ; else if ( "object" == typeof a [ c ] ) var d = mxUtils . getFunctionName ( a [ c ] . constructor ) , b = b + ( c + " => [" + d + "]\n" ) ; else b += c + " = " + a [ c ] + "\n" } catch ( e ) { b += c + "=" + e . message } return b } , toRadians : function ( a ) { return Math . PI * a / 180 } , toDegree : function ( a ) { return 180 * a / Math . PI } , arcToCurves : function ( a , b , c , d , e , f , g , k , l ) { k -= a ; l -= b ; if ( 0 === c || 0 === d ) return q ; c = Math . abs ( c ) ; d = Math . abs ( d ) ; var m = - k / 2 , n = - l / 2 , p = Math . cos ( e * Math . PI /
180 ) , q = Math . sin ( e * Math . PI / 180 ) ; e = p * m + q * n ; var m = - 1 * q * m + p * n , n = e * e , r = m * m , t = c * c , u = d * d , x = n / t + r / u ; 1 < x ? ( c *= Math . sqrt ( x ) , d *= Math . sqrt ( x ) , f = 0 ) : ( x = 1 , f === g && ( x = - 1 ) , f = x * Math . sqrt ( ( t * u - t * r - u * n ) / ( t * r + u * n ) ) ) ; n = f * c * m / d ; r = - 1 * f * d * e / c ; k = p * n - q * r + k / 2 ; l = q * n + p * r + l / 2 ; t = Math . atan2 ( ( m - r ) / d , ( e - n ) / c ) - Math . atan2 ( 0 , 1 ) ; f = 0 <= t ? t : 2 * Math . PI + t ; t = Math . atan2 ( ( - m - r ) / d , ( - e - n ) / c ) - Math . atan2 ( ( m - r ) / d , ( e - n ) / c ) ; e = 0 <= t ? t : 2 * Math . PI + t ; 0 == g && 0 < e ? e -= 2 * Math . PI : 0 != g && 0 > e && ( e += 2 * Math . PI ) ; g = 2 * e / Math . PI ; g = Math . ceil ( 0 > g ? - 1 * g : g ) ; e /= g ; m = 8 / 3 * Math . sin ( e /
4 ) * Math . sin ( e / 4 ) / Math . sin ( e / 2 ) ; n = p * c ; p *= d ; c *= q ; d *= q ; for ( var y = Math . cos ( f ) , A = Math . sin ( f ) , r = - m * ( n * A + d * y ) , t = - m * ( c * A - p * y ) , q = [ ] , z = 0 ; z < g ; ++ z ) { f += e ; var y = Math . cos ( f ) , A = Math . sin ( f ) , u = n * y - d * A + k , x = c * y + p * A + l , v = - m * ( n * A + d * y ) , y = - m * ( c * A - p * y ) , A = 6 * z ; q [ A ] = Number ( r + a ) ; q [ A + 1 ] = Number ( t + b ) ; q [ A + 2 ] = Number ( u - v + a ) ; q [ A + 3 ] = Number ( x - y + b ) ; q [ A + 4 ] = Number ( u + a ) ; q [ A + 5 ] = Number ( x + b ) ; r = u + v ; t = x + y } return q } , getBoundingBox : function ( a , b , c ) { var d = null ; if ( null != a && null != b && 0 != b ) { b = mxUtils . toRadians ( b ) ; var d = Math . cos ( b ) , e = Math . sin ( b ) ; c = null !=
c ? c : new mxPoint ( a . x + a . width / 2 , a . y + a . height / 2 ) ; var f = new mxPoint ( a . x , a . y ) ; b = new mxPoint ( a . x + a . width , a . y ) ; var g = new mxPoint ( b . x , a . y + a . height ) ; a = new mxPoint ( a . x , g . y ) ; f = mxUtils . getRotatedPoint ( f , d , e , c ) ; b = mxUtils . getRotatedPoint ( b , d , e , c ) ; g = mxUtils . getRotatedPoint ( g , d , e , c ) ; a = mxUtils . getRotatedPoint ( a , d , e , c ) ; d = new mxRectangle ( f . x , f . y , 0 , 0 ) ; d . add ( new mxRectangle ( b . x , b . y , 0 , 0 ) ) ; d . add ( new mxRectangle ( g . x , g . y , 0 , 0 ) ) ; d . add ( new mxRectangle ( a . x , a . y , 0 , 0 ) ) } return d } , getRotatedPoint : function ( a , b , c , d ) { d = null != d ? d : new mxPoint ;
var e = a . x - d . x ; a = a . y - d . y ; return new mxPoint ( e * b - a * c + d . x , a * b + e * c + d . y ) } , getPortConstraints : function ( a , b , c , d ) { b = mxUtils . getValue ( a . style , mxConstants . STYLE _PORT _CONSTRAINT , mxUtils . getValue ( b . style , c ? mxConstants . STYLE _SOURCE _PORT _CONSTRAINT : mxConstants . STYLE _TARGET _PORT _CONSTRAINT , null ) ) ; if ( null == b ) return d ; d = b . toString ( ) ; b = mxConstants . DIRECTION _MASK _NONE ; c = 0 ; 1 == mxUtils . getValue ( a . style , mxConstants . STYLE _PORT _CONSTRAINT _ROTATION , 0 ) && ( c = mxUtils . getValue ( a . style , mxConstants . STYLE _ROTATION , 0 ) ) ; a = 0 ; 45 < c ? ( a =
1 , 135 <= c && ( a = 2 ) ) : - 45 > c && ( a = 3 , - 135 >= c && ( a = 2 ) ) ; if ( 0 <= d . indexOf ( mxConstants . DIRECTION _NORTH ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _NORTH ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _SOUTH ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _WEST } if ( 0 <= d . indexOf ( mxConstants . DIRECTION _WEST ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _NORTH ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _SOUTH } if ( 0 <=
d . indexOf ( mxConstants . DIRECTION _SOUTH ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _SOUTH ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _NORTH ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _EAST } if ( 0 <= d . indexOf ( mxConstants . DIRECTION _EAST ) ) switch ( a ) { case 0 : b |= mxConstants . DIRECTION _MASK _EAST ; break ; case 1 : b |= mxConstants . DIRECTION _MASK _SOUTH ; break ; case 2 : b |= mxConstants . DIRECTION _MASK _WEST ; break ; case 3 : b |= mxConstants . DIRECTION _MASK _NORTH } return b } , reversePortConstraints : function ( a ) { var b ;
b = ( a & mxConstants . DIRECTION _MASK _WEST ) << 3 ; b |= ( a & mxConstants . DIRECTION _MASK _NORTH ) << 1 ; b |= ( a & mxConstants . DIRECTION _MASK _SOUTH ) >> 1 ; return b |= ( a & mxConstants . DIRECTION _MASK _EAST ) >> 3 } , findNearestSegment : function ( a , b , c ) { var d = - 1 ; if ( 0 < a . absolutePoints . length ) for ( var e = a . absolutePoints [ 0 ] , f = null , g = 1 ; g < a . absolutePoints . length ; g ++ ) { var k = a . absolutePoints [ g ] , e = mxUtils . ptSegDistSq ( e . x , e . y , k . x , k . y , b , c ) ; if ( null == f || e < f ) f = e , d = g - 1 ; e = k } return d } , getDirectedBounds : function ( a , b , c , d , e ) { var f = mxUtils . getValue ( c , mxConstants . STYLE _DIRECTION ,
mxConstants . DIRECTION _EAST ) ; d = null != d ? d : mxUtils . getValue ( c , mxConstants . STYLE _FLIPH , ! 1 ) ; e = null != e ? e : mxUtils . getValue ( c , mxConstants . STYLE _FLIPV , ! 1 ) ; b . x = Math . round ( Math . max ( 0 , Math . min ( a . width , b . x ) ) ) ; b . y = Math . round ( Math . max ( 0 , Math . min ( a . height , b . y ) ) ) ; b . width = Math . round ( Math . max ( 0 , Math . min ( a . width , b . width ) ) ) ; b . height = Math . round ( Math . max ( 0 , Math . min ( a . height , b . height ) ) ) ; if ( e && ( f == mxConstants . DIRECTION _SOUTH || f == mxConstants . DIRECTION _NORTH ) || d && ( f == mxConstants . DIRECTION _EAST || f == mxConstants . DIRECTION _WEST ) ) c =
b . x , b . x = b . width , b . width = c ; if ( d && ( f == mxConstants . DIRECTION _SOUTH || f == mxConstants . DIRECTION _NORTH ) || e && ( f == mxConstants . DIRECTION _EAST || f == mxConstants . DIRECTION _WEST ) ) c = b . y , b . y = b . height , b . height = c ; d = mxRectangle . fromRectangle ( b ) ; f == mxConstants . DIRECTION _SOUTH ? ( d . y = b . x , d . x = b . height , d . width = b . y , d . height = b . width ) : f == mxConstants . DIRECTION _WEST ? ( d . y = b . height , d . x = b . width , d . width = b . x , d . height = b . y ) : f == mxConstants . DIRECTION _NORTH && ( d . y = b . width , d . x = b . y , d . width = b . height , d . height = b . x ) ; return new mxRectangle ( a . x +
d . x , a . y + d . y , a . width - d . width - d . x , a . height - d . height - d . y ) } , getPerimeterPoint : function ( a , b , c ) { for ( var d = null , e = 0 ; e < a . length - 1 ; e ++ ) { var f = mxUtils . intersection ( a [ e ] . x , a [ e ] . y , a [ e + 1 ] . x , a [ e + 1 ] . y , b . x , b . y , c . x , c . y ) ; if ( null != f ) { var g = c . x - f . x , k = c . y - f . y , f = { p : f , distSq : k * k + g * g } ; null != f && ( null == d || d . distSq > f . distSq ) && ( d = f ) } } return null != d ? d . p : null } , rectangleIntersectsSegment : function ( a , b , c ) { var d = a . y , e = a . x , f = d + a . height , g = e + a . width ; a = b . x ; var k = c . x ; b . x > c . x && ( a = c . x , k = b . x ) ; k > g && ( k = g ) ; a < e && ( a = e ) ; if ( a > k ) return ! 1 ; var e = b . y ,
g = c . y , l = c . x - b . x ; 1E-7 < Math . abs ( l ) && ( c = ( c . y - b . y ) / l , b = b . y - c * b . x , e = c * a + b , g = c * k + b ) ; e > g && ( b = g , g = e , e = b ) ; g > f && ( g = f ) ; e < d && ( e = d ) ; return e > g ? ! 1 : ! 0 } , contains : function ( a , b , c ) { return a . x <= b && a . x + a . width >= b && a . y <= c && a . y + a . height >= c } , intersects : function ( a , b ) { var c = a . width , d = a . height , e = b . width , f = b . height ; if ( 0 >= e || 0 >= f || 0 >= c || 0 >= d ) return ! 1 ; var g = a . x , k = a . y , l = b . x , m = b . y , e = e + l , f = f + m , c = c + g , d = d + k ; return ( e < l || e > g ) && ( f < m || f > k ) && ( c < g || c > l ) && ( d < k || d > m ) } , intersectsHotspot : function ( a , b , c , d , e , f ) { d = null != d ? d : 1 ; e = null != e ? e : 0 ; f = null !=
f ? f : 0 ; if ( 0 < d ) { var g = a . getCenterX ( ) , k = a . getCenterY ( ) , l = a . width , m = a . height , n = mxUtils . getValue ( a . style , mxConstants . STYLE _STARTSIZE ) * a . view . scale ; 0 < n && ( mxUtils . getValue ( a . style , mxConstants . STYLE _HORIZONTAL , ! 0 ) ? ( k = a . y + n / 2 , m = n ) : ( g = a . x + n / 2 , l = n ) ) ; l = Math . max ( e , l * d ) ; m = Math . max ( e , m * d ) ; 0 < f && ( l = Math . min ( l , f ) , m = Math . min ( m , f ) ) ; d = new mxRectangle ( g - l / 2 , k - m / 2 , l , m ) ; g = mxUtils . toRadians ( mxUtils . getValue ( a . style , mxConstants . STYLE _ROTATION ) || 0 ) ; 0 != g && ( e = Math . cos ( - g ) , f = Math . sin ( - g ) , g = new mxPoint ( a . getCenterX ( ) , a . getCenterY ( ) ) ,
a = mxUtils . getRotatedPoint ( new mxPoint ( b , c ) , e , f , g ) , b = a . x , c = a . y ) ; return mxUtils . contains ( d , b , c ) } return ! 0 } , getOffset : function ( a , b ) { for ( var c = 0 , d = 0 , e = ! 1 , f = a , g = document . body , k = document . documentElement ; null != f && f != g && f != k && ! e ; ) { var l = mxUtils . getCurrentStyle ( f ) ; null != l && ( e = e || "fixed" == l . position ) ; f = f . parentNode } b || e || ( e = mxUtils . getDocumentScrollOrigin ( a . ownerDocument ) , c += e . x , d += e . y ) ; e = a . getBoundingClientRect ( ) ; null != e && ( c += e . left , d += e . top ) ; return new mxPoint ( c , d ) } , getDocumentScrollOrigin : function ( a ) { if ( mxClient . IS _QUIRKS ) return new mxPoint ( a . body . scrollLeft ,
a . body . scrollTop ) ; a = a . defaultView || a . parentWindow ; return new mxPoint ( null != a && void 0 !== window . pageXOffset ? window . pageXOffset : ( document . documentElement || document . body . parentNode || document . body ) . scrollLeft , null != a && void 0 !== window . pageYOffset ? window . pageYOffset : ( document . documentElement || document . body . parentNode || document . body ) . scrollTop ) } , getScrollOrigin : function ( a , b , c ) { b = null != b ? b : ! 1 ; c = null != c ? c : ! 0 ; for ( var d = null != a ? a . ownerDocument : document , e = d . body , f = d . documentElement , g = new mxPoint , k = ! 1 ; null != a &&
a != e && a != f ; ) { isNaN ( a . scrollLeft ) || isNaN ( a . scrollTop ) || ( g . x += a . scrollLeft , g . y += a . scrollTop ) ; var l = mxUtils . getCurrentStyle ( a ) ; null != l && ( k = k || "fixed" == l . position ) ; a = b ? a . parentNode : null } ! k && c && ( a = mxUtils . getDocumentScrollOrigin ( d ) , g . x += a . x , g . y += a . y ) ; return g } , convertPoint : function ( a , b , c ) { var d = mxUtils . getScrollOrigin ( a , ! 1 ) ; a = mxUtils . getOffset ( a ) ; a . x -= d . x ; a . y -= d . y ; return new mxPoint ( b - a . x , c - a . y ) } , ltrim : function ( a , b ) { return null != a ? a . replace ( new RegExp ( "^[" + ( b || "\\s" ) + "]+" , "g" ) , "" ) : null } , rtrim : function ( a ,
b ) { return null != a ? a . replace ( new RegExp ( "[" + ( b || "\\s" ) + "]+$" , "g" ) , "" ) : null } , trim : function ( a , b ) { return mxUtils . ltrim ( mxUtils . rtrim ( a , b ) , b ) } , isNumeric : function ( a ) { return ! isNaN ( parseFloat ( a ) ) && isFinite ( a ) && ( "string" != typeof a || 0 > a . toLowerCase ( ) . indexOf ( "0x" ) ) } , isInteger : function ( a ) { return String ( parseInt ( a ) ) === String ( a ) } , mod : function ( a , b ) { return ( a % b + b ) % b } , intersection : function ( a , b , c , d , e , f , g , k ) { var l = ( k - f ) * ( c - a ) - ( g - e ) * ( d - b ) ; g = ( ( g - e ) * ( b - f ) - ( k - f ) * ( a - e ) ) / l ; e = ( ( c - a ) * ( b - f ) - ( d - b ) * ( a - e ) ) / l ; return 0 <= g && 1 >= g &&
0 <= e && 1 >= e ? new mxPoint ( a + g * ( c - a ) , b + g * ( d - b ) ) : null } , ptSegDistSq : function ( a , b , c , d , e , f ) { c -= a ; d -= b ; e -= a ; f -= b ; 0 >= e * c + f * d ? c = 0 : ( e = c - e , f = d - f , a = e * c + f * d , c = 0 >= a ? 0 : a * a / ( c * c + d * d ) ) ; e = e * e + f * f - c ; 0 > e && ( e = 0 ) ; return e } , ptLineDist : function ( a , b , c , d , e , f ) { return Math . abs ( ( d - b ) * e - ( c - a ) * f + c * b - d * a ) / Math . sqrt ( ( d - b ) * ( d - b ) + ( c - a ) * ( c - a ) ) } , relativeCcw : function ( a , b , c , d , e , f ) { c -= a ; d -= b ; e -= a ; f -= b ; a = e * d - f * c ; 0 == a && ( a = e * c + f * d , 0 < a && ( a = ( e - c ) * c + ( f - d ) * d , 0 > a && ( a = 0 ) ) ) ; return 0 > a ? - 1 : 0 < a ? 1 : 0 } , animateChanges : function ( a , b ) { mxEffects . animateChanges . apply ( this ,
arguments ) } , cascadeOpacity : function ( a , b , c ) { mxEffects . cascadeOpacity . apply ( this , arguments ) } , fadeOut : function ( a , b , c , d , e , f ) { mxEffects . fadeOut . apply ( this , arguments ) } , setOpacity : function ( a , b ) { mxUtils . isVml ( a ) ? a . style . filter = 100 <= b ? "" : "alpha(opacity=" + b / 5 + ")" : mxClient . IS _IE && ( "undefined" === typeof document . documentMode || 9 > document . documentMode ) ? a . style . filter = 100 <= b ? "" : "alpha(opacity=" + b + ")" : a . style . opacity = b / 100 } , createImage : function ( a ) { var b ; mxClient . IS _IE6 && "CSS1Compat" != document . compatMode ? ( b = document . createElement ( mxClient . VML _PREFIX +
":image" ) , b . setAttribute ( "src" , a ) , b . style . borderStyle = "none" ) : ( b = document . createElement ( "img" ) , b . setAttribute ( "src" , a ) , b . setAttribute ( "border" , "0" ) ) ; return b } , sortCells : function ( a , b ) { b = null != b ? b : ! 0 ; var c = new mxDictionary ; a . sort ( function ( a , e ) { var d = c . get ( a ) ; null == d && ( d = mxCellPath . create ( a ) . split ( mxCellPath . PATH _SEPARATOR ) , c . put ( a , d ) ) ; var g = c . get ( e ) ; null == g && ( g = mxCellPath . create ( e ) . split ( mxCellPath . PATH _SEPARATOR ) , c . put ( e , g ) ) ; d = mxCellPath . compare ( d , g ) ; return 0 == d ? 0 : 0 < d == b ? 1 : - 1 } ) ; return a } , getStylename : function ( a ) { return null !=
a && ( a = a . split ( ";" ) [ 0 ] , 0 > a . indexOf ( "=" ) ) ? a : "" } , getStylenames : function ( a ) { var b = [ ] ; if ( null != a ) { a = a . split ( ";" ) ; for ( var c = 0 ; c < a . length ; c ++ ) 0 > a [ c ] . indexOf ( "=" ) && b . push ( a [ c ] ) } return b } , indexOfStylename : function ( a , b ) { if ( null != a && null != b ) for ( var c = a . split ( ";" ) , d = 0 , e = 0 ; e < c . length ; e ++ ) { if ( c [ e ] == b ) return d ; d += c [ e ] . length + 1 } return - 1 } , addStylename : function ( a , b ) { 0 > mxUtils . indexOfStylename ( a , b ) && ( null == a ? a = "" : 0 < a . length && ";" != a . charAt ( a . length - 1 ) && ( a += ";" ) , a += b ) ; return a } , removeStylename : function ( a , b ) { var c = [ ] ;
if ( null != a ) for ( var d = a . split ( ";" ) , e = 0 ; e < d . length ; e ++ ) d [ e ] != b && c . push ( d [ e ] ) ; return c . join ( ";" ) } , removeAllStylenames : function ( a ) { var b = [ ] ; if ( null != a ) { a = a . split ( ";" ) ; for ( var c = 0 ; c < a . length ; c ++ ) 0 <= a [ c ] . indexOf ( "=" ) && b . push ( a [ c ] ) } return b . join ( ";" ) } , setCellStyles : function ( a , b , c , d ) { if ( null != b && 0 < b . length ) { a . beginUpdate ( ) ; try { for ( var e = 0 ; e < b . length ; e ++ ) if ( null != b [ e ] ) { var f = mxUtils . setStyle ( a . getStyle ( b [ e ] ) , c , d ) ; a . setStyle ( b [ e ] , f ) } } finally { a . endUpdate ( ) } } } , setStyle : function ( a , b , c ) { var d = null != c && ( "undefined" ==
typeof c . length || 0 < c . length ) ; if ( null == a || 0 == a . length ) d && ( a = b + "=" + c + ";" ) ; else if ( a . substring ( 0 , b . length + 1 ) == b + "=" ) { var e = a . indexOf ( ";" ) ; a = d ? b + "=" + c + ( 0 > e ? ";" : a . substring ( e ) ) : 0 > e || e == a . length - 1 ? "" : a . substring ( e + 1 ) } else { var f = a . indexOf ( ";" + b + "=" ) ; 0 > f ? d && ( d = ";" == a . charAt ( a . length - 1 ) ? "" : ";" , a = a + d + b + "=" + c + ";" ) : ( e = a . indexOf ( ";" , f + 1 ) , a = d ? a . substring ( 0 , f + 1 ) + b + "=" + c + ( 0 > e ? ";" : a . substring ( e ) ) : a . substring ( 0 , f ) + ( 0 > e ? ";" : a . substring ( e ) ) ) } return a } , setCellStyleFlags : function ( a , b , c , d , e ) { if ( null != b && 0 < b . length ) { a . beginUpdate ( ) ;
try { for ( var f = 0 ; f < b . length ; f ++ ) if ( null != b [ f ] ) { var g = mxUtils . setStyleFlag ( a . getStyle ( b [ f ] ) , c , d , e ) ; a . setStyle ( b [ f ] , g ) } } finally { a . endUpdate ( ) } } } , setStyleFlag : function ( a , b , c , d ) { if ( null == a || 0 == a . length ) a = d || null == d ? b + "=" + c : b + "=0" ; else { var e = a . indexOf ( b + "=" ) ; if ( 0 > e ) e = ";" == a . charAt ( a . length - 1 ) ? "" : ";" , a = d || null == d ? a + e + b + "=" + c : a + e + b + "=0" ; else { var f = a . indexOf ( ";" , e ) , g ; g = 0 > f ? a . substring ( e + b . length + 1 ) : a . substring ( e + b . length + 1 , f ) ; g = null == d ? parseInt ( g ) ^ c : d ? parseInt ( g ) | c : parseInt ( g ) & ~ c ; a = a . substring ( 0 , e ) + b + "=" +
g + ( 0 <= f ? a . substring ( f ) : "" ) } } return a } , getAlignmentAsPoint : function ( a , b ) { var c = - . 5 , d = - . 5 ; a == mxConstants . ALIGN _LEFT ? c = 0 : a == mxConstants . ALIGN _RIGHT && ( c = - 1 ) ; b == mxConstants . ALIGN _TOP ? d = 0 : b == mxConstants . ALIGN _BOTTOM && ( d = - 1 ) ; return new mxPoint ( c , d ) } , getSizeForString : function ( a , b , c , d , e ) { b = null != b ? b : mxConstants . DEFAULT _FONTSIZE ; c = null != c ? c : mxConstants . DEFAULT _FONTFAMILY ; var f = document . createElement ( "div" ) ; f . style . fontFamily = c ; f . style . fontSize = Math . round ( b ) + "px" ; f . style . lineHeight = Math . round ( b * mxConstants . LINE _HEIGHT ) +
"px" ; null != e && ( ( e & mxConstants . FONT _BOLD ) == mxConstants . FONT _BOLD && ( f . style . fontWeight = "bold" ) , ( e & mxConstants . FONT _ITALIC ) == mxConstants . FONT _ITALIC && ( f . style . fontStyle = "italic" ) , b = [ ] , ( e & mxConstants . FONT _UNDERLINE ) == mxConstants . FONT _UNDERLINE && b . push ( "underline" ) , ( e & mxConstants . FONT _STRIKETHROUGH ) == mxConstants . FONT _STRIKETHROUGH && b . push ( "line-through" ) , 0 < b . length && ( f . style . textDecoration = b . join ( " " ) ) ) ; f . style . position = "absolute" ; f . style . visibility = "hidden" ; f . style . display = mxClient . IS _QUIRKS ? "inline" :
"inline-block" ; f . style . zoom = "1" ; null != d ? ( f . style . width = d + "px" , f . style . whiteSpace = "normal" ) : f . style . whiteSpace = "nowrap" ; f . innerHTML = a ; document . body . appendChild ( f ) ; a = new mxRectangle ( 0 , 0 , f . offsetWidth , f . offsetHeight ) ; document . body . removeChild ( f ) ; return a } , getViewXml : function ( a , b , c , d , e ) { d = null != d ? d : 0 ; e = null != e ? e : 0 ; b = null != b ? b : 1 ; null == c && ( c = [ a . getModel ( ) . getRoot ( ) ] ) ; var f = a . getView ( ) , g = null , k = f . isEventsEnabled ( ) ; f . setEventsEnabled ( ! 1 ) ; var l = f . drawPane , m = f . overlayPane ; a . dialect == mxConstants . DIALECT _SVG ?
( f . drawPane = document . createElementNS ( mxConstants . NS _SVG , "g" ) , f . canvas . appendChild ( f . drawPane ) , f . overlayPane = document . createElementNS ( mxConstants . NS _SVG , "g" ) ) : ( f . drawPane = f . drawPane . cloneNode ( ! 1 ) , f . canvas . appendChild ( f . drawPane ) , f . overlayPane = f . overlayPane . cloneNode ( ! 1 ) ) ; f . canvas . appendChild ( f . overlayPane ) ; var n = f . getTranslate ( ) ; f . translate = new mxPoint ( d , e ) ; b = new mxTemporaryCellStates ( a . getView ( ) , b , c ) ; try { g = ( new mxCodec ) . encode ( a . getView ( ) ) } finally { b . destroy ( ) , f . translate = n , f . canvas . removeChild ( f . drawPane ) ,
f . canvas . removeChild ( f . overlayPane ) , f . drawPane = l , f . overlayPane = m , f . setEventsEnabled ( k ) } return g } , getScaleForPageCount : function ( a , b , c , d ) { if ( 1 > a ) return 1 ; c = null != c ? c : mxConstants . PAGE _FORMAT _A4 _PORTRAIT ; d = null != d ? d : 0 ; var e = c . width - 2 * d ; c = c . height - 2 * d ; d = b . getGraphBounds ( ) . clone ( ) ; b = b . getView ( ) . getScale ( ) ; d . width /= b ; d . height /= b ; b = d . width ; var f = Math . sqrt ( a ) ; d = Math . sqrt ( b / d . height / ( e / c ) ) ; c = f * d ; d = f / d ; if ( 1 > c && d > a ) { var g = d / a ; d = a ; c /= g } 1 > d && c > a && ( g = c / a , c = a , d /= g ) ; g = Math . ceil ( c ) * Math . ceil ( d ) ; for ( f = 0 ; g > a ; ) { var g =
Math . floor ( c ) / c , k = Math . floor ( d ) / d ; 1 == g && ( g = Math . floor ( c - 1 ) / c ) ; 1 == k && ( k = Math . floor ( d - 1 ) / d ) ; g = g > k ? g : k ; c *= g ; d *= g ; g = Math . ceil ( c ) * Math . ceil ( d ) ; f ++ ; if ( 10 < f ) break } return e * c / b * . 99999 } , show : function ( a , b , c , d , e , f ) { c = null != c ? c : 0 ; d = null != d ? d : 0 ; null == b ? b = window . open ( ) . document : b . open ( ) ; 9 == document . documentMode && b . writeln ( '\x3c!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=9"><![endif]--\x3e' ) ; var g = a . getGraphBounds ( ) , k = Math . ceil ( c - g . x ) , l = Math . ceil ( d - g . y ) ; null == e && ( e = Math . ceil ( g . width + c ) + Math . ceil ( Math . ceil ( g . x ) -
g . x ) ) ; null == f && ( f = Math . ceil ( g . height + d ) + Math . ceil ( Math . ceil ( g . y ) - g . y ) ) ; if ( mxClient . IS _IE || 11 == document . documentMode ) { d = "<html><head>" ; g = document . getElementsByTagName ( "base" ) ; for ( c = 0 ; c < g . length ; c ++ ) d += g [ c ] . outerHTML ; d += "<style>" ; for ( c = 0 ; c < document . styleSheets . length ; c ++ ) try { d += document . styleSheets [ c ] . cssText } catch ( m ) { } d = d + '</style></head><body style="margin:0px;">' + ( '<div style="position:absolute;overflow:hidden;width:' + e + "px;height:" + f + 'px;"><div style="position:relative;left:' + k + "px;top:" + l + 'px;">' ) +
a . container . innerHTML ; b . writeln ( d + "</div></div></body><html>" ) ; b . close ( ) } else { b . writeln ( "<html><head>" ) ; g = document . getElementsByTagName ( "base" ) ; for ( c = 0 ; c < g . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( g [ c ] ) ) ; d = document . getElementsByTagName ( "link" ) ; for ( c = 0 ; c < d . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( d [ c ] ) ) ; d = document . getElementsByTagName ( "style" ) ; for ( c = 0 ; c < d . length ; c ++ ) b . writeln ( mxUtils . getOuterHtml ( d [ c ] ) ) ; b . writeln ( '</head><body style="margin:0px;"></body></html>' ) ; b . close ( ) ; c = b . createElement ( "div" ) ;
c . position = "absolute" ; c . overflow = "hidden" ; c . style . width = e + "px" ; c . style . height = f + "px" ; e = b . createElement ( "div" ) ; e . style . position = "absolute" ; e . style . left = k + "px" ; e . style . top = l + "px" ; f = a . container . firstChild ; for ( d = null ; null != f ; ) g = f . cloneNode ( ! 0 ) , f == a . view . drawPane . ownerSVGElement ? ( c . appendChild ( g ) , d = g ) : e . appendChild ( g ) , f = f . nextSibling ; b . body . appendChild ( c ) ; null != e . firstChild && b . body . appendChild ( e ) ; null != d && ( d . style . minWidth = "" , d . style . minHeight = "" , d . firstChild . setAttribute ( "transform" , "translate(" + k + "," +
l + ")" ) ) } mxUtils . removeCursors ( b . body ) ; return b } , printScreen : function ( a ) { var b = window . open ( ) ; a . getGraphBounds ( ) ; mxUtils . show ( a , b . document ) ; a = function ( ) { b . focus ( ) ; b . print ( ) ; b . close ( ) } ; mxClient . IS _GC ? b . setTimeout ( a , 500 ) : a ( ) } , popup : function ( a , b ) { if ( b ) { var c = document . createElement ( "div" ) ; c . style . overflow = "scroll" ; c . style . width = "636px" ; c . style . height = "460px" ; var d = document . createElement ( "pre" ) ; d . innerHTML = mxUtils . htmlEntities ( a , ! 1 ) . replace ( /\n/g , "<br>" ) . replace ( / /g , " " ) ; c . appendChild ( d ) ; c = new mxWindow ( "Popup Window" ,
c , document . body . clientWidth / 2 - 320 , Math . max ( document . body . clientHeight || 0 , document . documentElement . clientHeight ) / 2 - 240 , 640 , 480 , ! 1 , ! 0 ) ; c . setClosable ( ! 0 ) ; c . setVisible ( ! 0 ) } else mxClient . IS _NS ? ( c = window . open ( ) , c . document . writeln ( "<pre>" + mxUtils . htmlEntities ( a ) + "</pre" ) , c . document . close ( ) ) : ( c = window . open ( ) , d = c . document . createElement ( "pre" ) , d . innerHTML = mxUtils . htmlEntities ( a , ! 1 ) . replace ( /\n/g , "<br>" ) . replace ( / /g , " " ) , c . document . body . appendChild ( d ) ) } , alert : function ( a ) { alert ( a ) } , prompt : function ( a , b ) { return prompt ( a ,
null != b ? b : "" ) } , confirm : function ( a ) { return confirm ( a ) } , error : function ( a , b , c , d ) { var e = document . createElement ( "div" ) ; e . style . padding = "20px" ; var f = document . createElement ( "img" ) ; f . setAttribute ( "src" , d || mxUtils . errorImage ) ; f . setAttribute ( "valign" , "bottom" ) ; f . style . verticalAlign = "middle" ; e . appendChild ( f ) ; e . appendChild ( document . createTextNode ( " " ) ) ; e . appendChild ( document . createTextNode ( " " ) ) ; e . appendChild ( document . createTextNode ( " " ) ) ; mxUtils . write ( e , a ) ; a = document . body . clientWidth ; d = document . body . clientHeight ||
document . documentElement . clientHeight ; var g = new mxWindow ( mxResources . get ( mxUtils . errorResource ) || mxUtils . errorResource , e , ( a - b ) / 2 , d / 4 , b , null , ! 1 , ! 0 ) ; c && ( mxUtils . br ( e ) , b = document . createElement ( "p" ) , c = document . createElement ( "button" ) , mxClient . IS _IE ? c . style . cssText = "float:right" : c . setAttribute ( "style" , "float:right" ) , mxEvent . addListener ( c , "click" , function ( a ) { g . destroy ( ) } ) , mxUtils . write ( c , mxResources . get ( mxUtils . closeResource ) || mxUtils . closeResource ) , b . appendChild ( c ) , e . appendChild ( b ) , mxUtils . br ( e ) , g . setClosable ( ! 0 ) ) ;
g . setVisible ( ! 0 ) ; return g } , makeDraggable : function ( a , b , c , d , e , f , g , k , l , m ) { a = new mxDragSource ( a , c ) ; a . dragOffset = new mxPoint ( null != e ? e : 0 , null != f ? f : mxConstants . TOOLTIP _VERTICAL _OFFSET ) ; a . autoscroll = g ; a . setGuidesEnabled ( ! 1 ) ; null != l && ( a . highlightDropTargets = l ) ; null != m && ( a . getDropTarget = m ) ; a . getGraphForEvent = function ( a ) { return "function" == typeof b ? b ( a ) : b } ; null != d && ( a . createDragElement = function ( ) { return d . cloneNode ( ! 0 ) } , k && ( a . createPreviewElement = function ( a ) { var b = d . cloneNode ( ! 0 ) , c = parseInt ( b . style . width ) , e =
parseInt ( b . style . height ) ; b . style . width = Math . round ( c * a . view . scale ) + "px" ; b . style . height = Math . round ( e * a . view . scale ) + "px" ; return b } ) ) ; return a } } , mxConstants = { DEFAULT _HOTSPOT : . 3 , MIN _HOTSPOT _SIZE : 8 , MAX _HOTSPOT _SIZE : 0 , RENDERING _HINT _EXACT : "exact" , RENDERING _HINT _FASTER : "faster" , RENDERING _HINT _FASTEST : "fastest" , DIALECT _SVG : "svg" , DIALECT _VML : "vml" , DIALECT _MIXEDHTML : "mixedHtml" , DIALECT _PREFERHTML : "preferHtml" , DIALECT _STRICTHTML : "strictHtml" , NS _SVG : "http://www.w3.org/2000/svg" , NS _XHTML : "http://www.w3.org/1999/xhtml" ,
NS _XLINK : "http://www.w3.org/1999/xlink" , SHADOWCOLOR : "gray" , VML _SHADOWCOLOR : "gray" , SHADOW _OFFSET _X : 2 , SHADOW _OFFSET _Y : 3 , SHADOW _OPACITY : 1 , NODETYPE _ELEMENT : 1 , NODETYPE _ATTRIBUTE : 2 , NODETYPE _TEXT : 3 , NODETYPE _CDATA : 4 , NODETYPE _ENTITY _REFERENCE : 5 , NODETYPE _ENTITY : 6 , NODETYPE _PROCESSING _INSTRUCTION : 7 , NODETYPE _COMMENT : 8 , NODETYPE _DOCUMENT : 9 , NODETYPE _DOCUMENTTYPE : 10 , NODETYPE _DOCUMENT _FRAGMENT : 11 , NODETYPE _NOTATION : 12 , TOOLTIP _VERTICAL _OFFSET : 16 , DEFAULT _VALID _COLOR : "#00FF00" , DEFAULT _INVALID _COLOR : "#FF0000" , OUTLINE _HIGHLIGHT _COLOR : "#00FF00" ,
OUTLINE _HIGHLIGHT _STROKEWIDTH : 5 , HIGHLIGHT _STROKEWIDTH : 3 , HIGHLIGHT _SIZE : 2 , HIGHLIGHT _OPACITY : 100 , CURSOR _MOVABLE _VERTEX : "move" , CURSOR _MOVABLE _EDGE : "move" , CURSOR _LABEL _HANDLE : "default" , CURSOR _TERMINAL _HANDLE : "pointer" , CURSOR _BEND _HANDLE : "crosshair" , CURSOR _VIRTUAL _BEND _HANDLE : "crosshair" , CURSOR _CONNECT : "pointer" , HIGHLIGHT _COLOR : "#00FF00" , CONNECT _TARGET _COLOR : "#0000FF" , INVALID _CONNECT _TARGET _COLOR : "#FF0000" , DROP _TARGET _COLOR : "#0000FF" , VALID _COLOR : "#00FF00" , INVALID _COLOR : "#FF0000" , EDGE _SELECTION _COLOR : "#00FF00" ,
VERTEX _SELECTION _COLOR : "#00FF00" , VERTEX _SELECTION _STROKEWIDTH : 1 , EDGE _SELECTION _STROKEWIDTH : 1 , VERTEX _SELECTION _DASHED : ! 0 , EDGE _SELECTION _DASHED : ! 0 , GUIDE _COLOR : "#FF0000" , GUIDE _STROKEWIDTH : 1 , OUTLINE _COLOR : "#0099FF" , OUTLINE _STROKEWIDTH : mxClient . IS _IE ? 2 : 3 , HANDLE _SIZE : 6 , LABEL _HANDLE _SIZE : 4 , HANDLE _FILLCOLOR : "#00FF00" , HANDLE _STROKECOLOR : "black" , LABEL _HANDLE _FILLCOLOR : "yellow" , CONNECT _HANDLE _FILLCOLOR : "#0000FF" , LOCKED _HANDLE _FILLCOLOR : "#FF0000" , OUTLINE _HANDLE _FILLCOLOR : "#00FFFF" , OUTLINE _HANDLE _STROKECOLOR : "#0033FF" ,
DEFAULT _FONTFAMILY : "Arial,Helvetica" , DEFAULT _FONTSIZE : 11 , DEFAULT _TEXT _DIRECTION : "" , LINE _HEIGHT : 1.2 , WORD _WRAP : "normal" , ABSOLUTE _LINE _HEIGHT : ! 1 , DEFAULT _FONTSTYLE : 0 , DEFAULT _STARTSIZE : 40 , DEFAULT _MARKERSIZE : 6 , DEFAULT _IMAGESIZE : 24 , ENTITY _SEGMENT : 30 , RECTANGLE _ROUNDING _FACTOR : . 15 , LINE _ARCSIZE : 20 , ARROW _SPACING : 0 , ARROW _WIDTH : 30 , ARROW _SIZE : 30 , PAGE _FORMAT _A4 _PORTRAIT : new mxRectangle ( 0 , 0 , 827 , 1169 ) , PAGE _FORMAT _A4 _LANDSCAPE : new mxRectangle ( 0 , 0 , 1169 , 827 ) , PAGE _FORMAT _LETTER _PORTRAIT : new mxRectangle ( 0 , 0 , 850 , 1100 ) ,
PAGE _FORMAT _LETTER _LANDSCAPE : new mxRectangle ( 0 , 0 , 1100 , 850 ) , NONE : "none" , STYLE _PERIMETER : "perimeter" , STYLE _SOURCE _PORT : "sourcePort" , STYLE _TARGET _PORT : "targetPort" , STYLE _PORT _CONSTRAINT : "portConstraint" , STYLE _PORT _CONSTRAINT _ROTATION : "portConstraintRotation" , STYLE _SOURCE _PORT _CONSTRAINT : "sourcePortConstraint" , STYLE _TARGET _PORT _CONSTRAINT : "targetPortConstraint" , STYLE _OPACITY : "opacity" , STYLE _FILL _OPACITY : "fillOpacity" , STYLE _STROKE _OPACITY : "strokeOpacity" , STYLE _TEXT _OPACITY : "textOpacity" , STYLE _TEXT _DIRECTION : "textDirection" ,
STYLE _OVERFLOW : "overflow" , STYLE _ORTHOGONAL : "orthogonal" , STYLE _EXIT _X : "exitX" , STYLE _EXIT _Y : "exitY" , STYLE _EXIT _DX : "exitDx" , STYLE _EXIT _DY : "exitDy" , STYLE _EXIT _PERIMETER : "exitPerimeter" , STYLE _ENTRY _X : "entryX" , STYLE _ENTRY _Y : "entryY" , STYLE _ENTRY _DX : "entryDx" , STYLE _ENTRY _DY : "entryDy" , STYLE _ENTRY _PERIMETER : "entryPerimeter" , STYLE _WHITE _SPACE : "whiteSpace" , STYLE _ROTATION : "rotation" , STYLE _FILLCOLOR : "fillColor" , STYLE _POINTER _EVENTS : "pointerEvents" , STYLE _SWIMLANE _FILLCOLOR : "swimlaneFillColor" , STYLE _MARGIN : "margin" ,
STYLE _GRADIENTCOLOR : "gradientColor" , STYLE _GRADIENT _DIRECTION : "gradientDirection" , STYLE _STROKECOLOR : "strokeColor" , STYLE _SEPARATORCOLOR : "separatorColor" , STYLE _STROKEWIDTH : "strokeWidth" , STYLE _ALIGN : "align" , STYLE _VERTICAL _ALIGN : "verticalAlign" , STYLE _LABEL _WIDTH : "labelWidth" , STYLE _LABEL _POSITION : "labelPosition" , STYLE _VERTICAL _LABEL _POSITION : "verticalLabelPosition" , STYLE _IMAGE _ASPECT : "imageAspect" , STYLE _IMAGE _ALIGN : "imageAlign" , STYLE _IMAGE _VERTICAL _ALIGN : "imageVerticalAlign" , STYLE _GLASS : "glass" , STYLE _IMAGE : "image" ,
STYLE _IMAGE _WIDTH : "imageWidth" , STYLE _IMAGE _HEIGHT : "imageHeight" , STYLE _IMAGE _BACKGROUND : "imageBackground" , STYLE _IMAGE _BORDER : "imageBorder" , STYLE _FLIPH : "flipH" , STYLE _FLIPV : "flipV" , STYLE _NOLABEL : "noLabel" , STYLE _NOEDGESTYLE : "noEdgeStyle" , STYLE _LABEL _BACKGROUNDCOLOR : "labelBackgroundColor" , STYLE _LABEL _BORDERCOLOR : "labelBorderColor" , STYLE _LABEL _PADDING : "labelPadding" , STYLE _INDICATOR _SHAPE : "indicatorShape" , STYLE _INDICATOR _IMAGE : "indicatorImage" , STYLE _INDICATOR _COLOR : "indicatorColor" , STYLE _INDICATOR _STROKECOLOR : "indicatorStrokeColor" ,
STYLE _INDICATOR _GRADIENTCOLOR : "indicatorGradientColor" , STYLE _INDICATOR _SPACING : "indicatorSpacing" , STYLE _INDICATOR _WIDTH : "indicatorWidth" , STYLE _INDICATOR _HEIGHT : "indicatorHeight" , STYLE _INDICATOR _DIRECTION : "indicatorDirection" , STYLE _SHADOW : "shadow" , STYLE _SEGMENT : "segment" , STYLE _ENDARROW : "endArrow" , STYLE _STARTARROW : "startArrow" , STYLE _ENDSIZE : "endSize" , STYLE _STARTSIZE : "startSize" , STYLE _SWIMLANE _LINE : "swimlaneLine" , STYLE _ENDFILL : "endFill" , STYLE _STARTFILL : "startFill" , STYLE _DASHED : "dashed" , STYLE _DASH _PATTERN : "dashPattern" ,
STYLE _FIX _DASH : "fixDash" , STYLE _ROUNDED : "rounded" , STYLE _CURVED : "curved" , STYLE _ARCSIZE : "arcSize" , STYLE _ABSOLUTE _ARCSIZE : "absoluteArcSize" , STYLE _SOURCE _PERIMETER _SPACING : "sourcePerimeterSpacing" , STYLE _TARGET _PERIMETER _SPACING : "targetPerimeterSpacing" , STYLE _PERIMETER _SPACING : "perimeterSpacing" , STYLE _SPACING : "spacing" , STYLE _SPACING _TOP : "spacingTop" , STYLE _SPACING _LEFT : "spacingLeft" , STYLE _SPACING _BOTTOM : "spacingBottom" , STYLE _SPACING _RIGHT : "spacingRight" , STYLE _HORIZONTAL : "horizontal" , STYLE _DIRECTION : "direction" ,
STYLE _ANCHOR _POINT _DIRECTION : "anchorPointDirection" , STYLE _ELBOW : "elbow" , STYLE _FONTCOLOR : "fontColor" , STYLE _FONTFAMILY : "fontFamily" , STYLE _FONTSIZE : "fontSize" , STYLE _FONTSTYLE : "fontStyle" , STYLE _ASPECT : "aspect" , STYLE _AUTOSIZE : "autosize" , STYLE _FOLDABLE : "foldable" , STYLE _EDITABLE : "editable" , STYLE _BACKGROUND _OUTLINE : "backgroundOutline" , STYLE _BENDABLE : "bendable" , STYLE _MOVABLE : "movable" , STYLE _RESIZABLE : "resizable" , STYLE _RESIZE _WIDTH : "resizeWidth" , STYLE _RESIZE _HEIGHT : "resizeHeight" , STYLE _ROTATABLE : "rotatable" ,
STYLE _CLONEABLE : "cloneable" , STYLE _DELETABLE : "deletable" , STYLE _SHAPE : "shape" , STYLE _EDGE : "edgeStyle" , STYLE _JETTY _SIZE : "jettySize" , STYLE _SOURCE _JETTY _SIZE : "sourceJettySize" , STYLE _TARGET _JETTY _SIZE : "targetJettySize" , STYLE _LOOP : "loopStyle" , STYLE _ORTHOGONAL _LOOP : "orthogonalLoop" , STYLE _ROUTING _CENTER _X : "routingCenterX" , STYLE _ROUTING _CENTER _Y : "routingCenterY" , FONT _BOLD : 1 , FONT _ITALIC : 2 , FONT _UNDERLINE : 4 , FONT _STRIKETHROUGH : 8 , SHAPE _RECTANGLE : "rectangle" , SHAPE _ELLIPSE : "ellipse" , SHAPE _DOUBLE _ELLIPSE : "doubleEllipse" ,
SHAPE _RHOMBUS : "rhombus" , SHAPE _LINE : "line" , SHAPE _IMAGE : "image" , SHAPE _ARROW : "arrow" , SHAPE _ARROW _CONNECTOR : "arrowConnector" , SHAPE _LABEL : "label" , SHAPE _CYLINDER : "cylinder" , SHAPE _SWIMLANE : "swimlane" , SHAPE _CONNECTOR : "connector" , SHAPE _ACTOR : "actor" , SHAPE _CLOUD : "cloud" , SHAPE _TRIANGLE : "triangle" , SHAPE _HEXAGON : "hexagon" , ARROW _CLASSIC : "classic" , ARROW _CLASSIC _THIN : "classicThin" , ARROW _BLOCK : "block" , ARROW _BLOCK _THIN : "blockThin" , ARROW _OPEN : "open" , ARROW _OPEN _THIN : "openThin" , ARROW _OVAL : "oval" , ARROW _DIAMOND : "diamond" ,
ARROW _DIAMOND _THIN : "diamondThin" , ALIGN _LEFT : "left" , ALIGN _CENTER : "center" , ALIGN _RIGHT : "right" , ALIGN _TOP : "top" , ALIGN _MIDDLE : "middle" , ALIGN _BOTTOM : "bottom" , DIRECTION _NORTH : "north" , DIRECTION _SOUTH : "south" , DIRECTION _EAST : "east" , DIRECTION _WEST : "west" , TEXT _DIRECTION _DEFAULT : "" , TEXT _DIRECTION _AUTO : "auto" , TEXT _DIRECTION _LTR : "ltr" , TEXT _DIRECTION _RTL : "rtl" , DIRECTION _MASK _NONE : 0 , DIRECTION _MASK _WEST : 1 , DIRECTION _MASK _NORTH : 2 , DIRECTION _MASK _SOUTH : 4 , DIRECTION _MASK _EAST : 8 , DIRECTION _MASK _ALL : 15 , ELBOW _VERTICAL : "vertical" ,
ELBOW _HORIZONTAL : "horizontal" , EDGESTYLE _ELBOW : "elbowEdgeStyle" , EDGESTYLE _ENTITY _RELATION : "entityRelationEdgeStyle" , EDGESTYLE _LOOP : "loopEdgeStyle" , EDGESTYLE _SIDETOSIDE : "sideToSideEdgeStyle" , EDGESTYLE _TOPTOBOTTOM : "topToBottomEdgeStyle" , EDGESTYLE _ORTHOGONAL : "orthogonalEdgeStyle" , EDGESTYLE _SEGMENT : "segmentEdgeStyle" , PERIMETER _ELLIPSE : "ellipsePerimeter" , PERIMETER _RECTANGLE : "rectanglePerimeter" , PERIMETER _RHOMBUS : "rhombusPerimeter" , PERIMETER _HEXAGON : "hexagonPerimeter" , PERIMETER _TRIANGLE : "trianglePerimeter" } ;
function mxEventObject ( a ) { this . name = a ; this . properties = [ ] ; for ( var b = 1 ; b < arguments . length ; b += 2 ) null != arguments [ b + 1 ] && ( this . properties [ arguments [ b ] ] = arguments [ b + 1 ] ) } mxEventObject . prototype . name = null ; mxEventObject . prototype . properties = null ; mxEventObject . prototype . consumed = ! 1 ; mxEventObject . prototype . getName = function ( ) { return this . name } ; mxEventObject . prototype . getProperties = function ( ) { return this . properties } ; mxEventObject . prototype . getProperty = function ( a ) { return this . properties [ a ] } ;
mxEventObject . prototype . isConsumed = function ( ) { return this . consumed } ; mxEventObject . prototype . consume = function ( ) { this . consumed = ! 0 } ; function mxMouseEvent ( a , b ) { this . evt = a ; this . sourceState = this . state = b } mxMouseEvent . prototype . consumed = ! 1 ; mxMouseEvent . prototype . evt = null ; mxMouseEvent . prototype . graphX = null ; mxMouseEvent . prototype . graphY = null ; mxMouseEvent . prototype . state = null ; mxMouseEvent . prototype . sourceState = null ; mxMouseEvent . prototype . getEvent = function ( ) { return this . evt } ;
mxMouseEvent . prototype . getSource = function ( ) { return mxEvent . getSource ( this . evt ) } ; mxMouseEvent . prototype . isSource = function ( a ) { return null != a ? mxUtils . isAncestorNode ( a . node , this . getSource ( ) ) : ! 1 } ; mxMouseEvent . prototype . getX = function ( ) { return mxEvent . getClientX ( this . getEvent ( ) ) } ; mxMouseEvent . prototype . getY = function ( ) { return mxEvent . getClientY ( this . getEvent ( ) ) } ; mxMouseEvent . prototype . getGraphX = function ( ) { return this . graphX } ; mxMouseEvent . prototype . getGraphY = function ( ) { return this . graphY } ;
@ -436,8 +436,8 @@ function mxStencil(a){this.desc=a;this.parseDescription();this.parseConstraints(
mxStencil . prototype . parseDescription = function ( ) { this . fgNode = this . desc . getElementsByTagName ( "foreground" ) [ 0 ] ; this . bgNode = this . desc . getElementsByTagName ( "background" ) [ 0 ] ; this . w0 = Number ( this . desc . getAttribute ( "w" ) || 100 ) ; this . h0 = Number ( this . desc . getAttribute ( "h" ) || 100 ) ; var a = this . desc . getAttribute ( "aspect" ) ; this . aspect = null != a ? a : "variable" ; a = this . desc . getAttribute ( "strokewidth" ) ; this . strokewidth = null != a ? a : "1" } ;
mxStencil . prototype . parseConstraints = function ( ) { var a = this . desc . getElementsByTagName ( "connections" ) [ 0 ] ; if ( null != a && ( a = mxUtils . getChildNodes ( a ) , null != a && 0 < a . length ) ) { this . constraints = [ ] ; for ( var b = 0 ; b < a . length ; b ++ ) this . constraints . push ( this . parseConstraint ( a [ b ] ) ) } } ; mxStencil . prototype . parseConstraint = function ( a ) { var b = Number ( a . getAttribute ( "x" ) ) , c = Number ( a . getAttribute ( "y" ) ) , d = "1" == a . getAttribute ( "perimeter" ) ; a = a . getAttribute ( "name" ) ; return new mxConnectionConstraint ( new mxPoint ( b , c ) , d , a ) } ;
mxStencil . prototype . evaluateTextAttribute = function ( a , b , c ) { b = this . evaluateAttribute ( a , b , c ) ; a = a . getAttribute ( "localized" ) ; if ( mxStencil . defaultLocalized && null == a || "1" == a ) b = mxResources . get ( b ) ; return b } ; mxStencil . prototype . evaluateAttribute = function ( a , b , c ) { b = a . getAttribute ( b ) ; null == b && ( a = mxUtils . getTextContent ( a ) , null != a && mxStencil . allowEval && ( a = mxUtils . eval ( a ) , "function" == typeof a && ( b = a ( c ) ) ) ) ; return b } ;
mxStencil . prototype . drawShape = function ( a , b , c , d , e , f ) { var g = mxUtils. getValue ( b . style , mxConstants . STYLE _DIRECTION , null ) , g = this . computeAspect ( b . style , c , d , e , f , g) , k = Math . min ( g . width , g . height ) , k = "inherit" == this . strokewidth ? Number ( mxUtils . getNumber ( b . style , mxConstants . STYLE _STROKEWIDTH , 1 ) ) : Number ( this . strokewidth ) * k; a . setStrokeWidth ( k ) ; null != b . style && "1" == mxUtils . getValue ( b . style , mxConstants . STYLE _POINTER _EVENTS , "0" ) && ( a . setStrokeColor ( mxConstants . NONE ) , a . rect ( c , d , e , f ) , a . stroke ( ) , a . setStrokeColor ( b . stroke ) ) ;
this . drawChildren ( a , b , c , d , e , f , this . bgNode , g , ! 1 , ! 0 ) ; this . drawChildren ( a , b , c , d , e , f , this . fgNode , g , ! 0 , ! b . outline || null == b . style || 0 == mxUtils . getValue ( b . style , mxConstants . STYLE _BACKGROUND _OUTLINE , 0 ) ) }; mxStencil . prototype . drawChildren = function ( a , b , c , d , e , f , g , k , l , m ) { if ( null != g && 0 < e && 0 < f ) for ( c = g . firstChild ; null != c ; ) c . nodeType == mxConstants . NODETYPE _ELEMENT && this . drawNode ( a , b , c , k , l , m ) , c = c . nextSibling } ;
mxStencil . prototype . drawShape = function ( a , b , c , d , e , f ) { var g = a. states . slice ( ) , k = mxUtils. getValue ( b . style , mxConstants . STYLE _DIRECTION , null ) , k = this . computeAspect ( b . style , c , d , e , f , k) , l = Math . min ( k . width , k . height ) , l = "inherit" == this . strokewidth ? Number ( mxUtils . getNumber ( b . style , mxConstants . STYLE _STROKEWIDTH , 1 ) ) : Number ( this . strokewidth ) * l; a . setStrokeWidth ( l ) ; null != b . style && "1" == mxUtils . getValue ( b . style , mxConstants . STYLE _POINTER _EVENTS , "0" ) && ( a . setStrokeColor ( mxConstants . NONE ) , a . rect ( c , d , e , f ) , a . stroke ( ) , a . setStrokeColor ( b . stroke ) ) ;
this . drawChildren ( a , b , c , d , e , f , this . bgNode , k , ! 1 , ! 0 ) ; this . drawChildren ( a , b , c , d , e , f , this . fgNode , k , ! 0 , ! b . outline || null == b . style || 0 == mxUtils . getValue ( b . style , mxConstants . STYLE _BACKGROUND _OUTLINE , 0 ) ) ;a . states . length != g . length && ( a . states = g ) }; mxStencil . prototype . drawChildren = function ( a , b , c , d , e , f , g , k , l , m ) { if ( null != g && 0 < e && 0 < f ) for ( c = g . firstChild ; null != c ; ) c . nodeType == mxConstants . NODETYPE _ELEMENT && this . drawNode ( a , b , c , k , l , m ) , c = c . nextSibling } ;
mxStencil . prototype . computeAspect = function ( a , b , c , d , e , f ) { a = b ; b = d / this . w0 ; var g = e / this . h0 ; if ( f = f == mxConstants . DIRECTION _NORTH || f == mxConstants . DIRECTION _SOUTH ) { g = d / this . h0 ; b = e / this . w0 ; var k = ( d - e ) / 2 ; a += k ; c -= k } "fixed" == this . aspect && ( b = g = Math . min ( b , g ) , f ? ( a += ( e - this . w0 * b ) / 2 , c += ( d - this . h0 * g ) / 2 ) : ( a += ( d - this . w0 * b ) / 2 , c += ( e - this . h0 * g ) / 2 ) ) ; return new mxRectangle ( a , c , b , g ) } ;
mxStencil . prototype . drawNode = function ( a , b , c , d , e , f ) { var g = c . nodeName , k = d . x , l = d . y , m = d . width , n = d . height , p = Math . min ( m , n ) ; if ( "save" == g ) a . save ( ) ; else if ( "restore" == g ) a . restore ( ) ; else if ( f ) { if ( "path" == g ) { a . begin ( ) ; p = ! 0 ; if ( "1" == c . getAttribute ( "rounded" ) ) { for ( var p = ! 1 , q = Number ( c . getAttribute ( "arcSize" ) ) , r = 0 , t = [ ] , u = c . firstChild ; null != u ; ) { if ( u . nodeType == mxConstants . NODETYPE _ELEMENT ) { var x = u . nodeName ; if ( "move" == x || "line" == x ) "move" != x && 0 != t . length || t . push ( [ ] ) , t [ t . length - 1 ] . push ( new mxPoint ( k + Number ( u . getAttribute ( "x" ) ) *
m , l + Number ( u . getAttribute ( "y" ) ) * n ) ) , r ++ ; else { p = ! 0 ; break } } u = u . nextSibling } if ( ! p && 0 < r ) for ( m = 0 ; m < t . length ; m ++ ) n = ! 1 , l = t [ m ] [ 0 ] , k = t [ m ] [ t [ m ] . length - 1 ] , l . x == k . x && l . y == k . y && ( t [ m ] . pop ( ) , n = ! 0 ) , this . addPoints ( a , t [ m ] , ! 0 , q , n ) ; else p = ! 0 } if ( p ) for ( u = c . firstChild ; null != u ; ) u . nodeType == mxConstants . NODETYPE _ELEMENT && this . drawNode ( a , b , u , d , e , f ) , u = u . nextSibling } else if ( "close" == g ) a . close ( ) ; else if ( "move" == g ) a . moveTo ( k + Number ( c . getAttribute ( "x" ) ) * m , l + Number ( c . getAttribute ( "y" ) ) * n ) ; else if ( "line" == g ) a . lineTo ( k + Number ( c . getAttribute ( "x" ) ) *
@ -1245,19 +1245,20 @@ mxGraph.prototype.isHtmlLabels=function(){return this.htmlLabels};mxGraph.protot
mxGraph . prototype . getTooltip = function ( a , b , c , d ) { var e = null ; null != a && ( null == a . control || b != a . control . node && b . parentNode != a . control . node || ( e = this . collapseExpandResource , e = mxUtils . htmlEntities ( mxResources . get ( e ) || e ) . replace ( /\\n/g , "<br>" ) ) , null == e && null != a . overlays && a . overlays . visit ( function ( a , c ) { null != e || b != c . node && b . parentNode != c . node || ( e = c . overlay . toString ( ) ) } ) , null == e && ( c = this . selectionCellsHandler . getHandler ( a . cell ) , null != c && "function" == typeof c . getTooltipForNode && ( e = c . getTooltipForNode ( b ) ) ) , null ==
e && ( e = this . getTooltipForCell ( a . cell ) ) ) ; return e } ; mxGraph . prototype . getTooltipForCell = function ( a ) { return null != a && null != a . getTooltip ? a . getTooltip ( ) : this . convertValueToString ( a ) } ; mxGraph . prototype . getLinkForCell = function ( a ) { return null } ; mxGraph . prototype . getCursorForMouseEvent = function ( a ) { return this . getCursorForCell ( a . getCell ( ) ) } ; mxGraph . prototype . getCursorForCell = function ( a ) { return null } ;
mxGraph . prototype . getStartSize = function ( a ) { var b = new mxRectangle , c = this . view . getState ( a ) ; a = null != c ? c . style : this . getCellStyle ( a ) ; null != a && ( c = parseInt ( mxUtils . getValue ( a , mxConstants . STYLE _STARTSIZE , mxConstants . DEFAULT _STARTSIZE ) ) , mxUtils . getValue ( a , mxConstants . STYLE _HORIZONTAL , ! 0 ) ? b . height = c : b . width = c ) ; return b } ; mxGraph . prototype . getImage = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _IMAGE ] : null } ;
mxGraph . prototype . getVerticalAlign = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _VERTICAL _ALIGN ] || mxConstants . ALIGN _MIDDLE : null } ; mxGraph . prototype . getIndicatorColor = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _COLOR ] : null } ; mxGraph . prototype . getIndicatorGradientColor = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _GRADIENTCOLOR ] : null } ;
mxGraph . prototype . getIndicatorShape = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _SHAPE ] : null } ; mxGraph . prototype . getIndicatorImage = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _IMAGE ] : null } ; mxGraph . prototype . getBorder = function ( ) { return this . border } ; mxGraph . prototype . setBorder = function ( a ) { this . border = a } ;
mxGraph . prototype . isSwimlane = function ( a ) { if ( null != a && this . model . getParent ( a ) != this . model . getRoot ( ) ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; if ( null != b && ! this . model . isEdge ( a ) ) return b [ mxConstants . STYLE _SHAPE ] == mxConstants . SHAPE _SWIMLANE } return ! 1 } ; mxGraph . prototype . isResizeContainer = function ( ) { return this . resizeContainer } ; mxGraph . prototype . setResizeContainer = function ( a ) { this . resizeContainer = a } ; mxGraph . prototype . isEnabled = function ( ) { return this . enabled } ;
mxGraph . prototype . setEnabled = function ( a ) { this . enabled = a } ; mxGraph . prototype . isEscapeEnabled = function ( ) { return this . escapeEnabled } ; mxGraph . prototype . setEscapeEnabled = function ( a ) { this . escapeEnabled = a } ; mxGraph . prototype . isInvokesStopCellEditing = function ( ) { return this . invokesStopCellEditing } ; mxGraph . prototype . setInvokesStopCellEditing = function ( a ) { this . invokesStopCellEditing = a } ; mxGraph . prototype . isEnterStopsCellEditing = function ( ) { return this . enterStopsCellEditing } ;
mxGraph . prototype . setEnterStopsCellEditing = function ( a ) { this . enterStopsCellEditing = a } ; mxGraph . prototype . isCellLocked = function ( a ) { var b = this . model . getGeometry ( a ) ; return this . isCellsLocked ( ) || null != b && this . model . isVertex ( a ) && b . relative } ; mxGraph . prototype . isCellsLocked = function ( ) { return this . cellsLocked } ; mxGraph . prototype . setCellsLocked = function ( a ) { this . cellsLocked = a } ; mxGraph . prototype . getCloneableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellCloneable ( a ) } ) ) } ;
mxGraph . prototype . isCellCloneable = function ( a ) { var b = this . view . getState ( a ) ; a = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsCloneable ( ) && 0 != a [ mxConstants . STYLE _CLONEABLE ] } ; mxGraph . prototype . isCellsCloneable = function ( ) { return this . cellsCloneable } ; mxGraph . prototype . setCellsCloneable = function ( a ) { this . cellsCloneable = a } ; mxGraph . prototype . getExportableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . canExportCell ( a ) } ) ) } ;
mxGraph . prototype . canExportCell = function ( a ) { return this . exportEnabled } ; mxGraph . prototype . getImportableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . canImportCell ( a ) } ) ) } ; mxGraph . prototype . canImportCell = function ( a ) { return this . importEnabled } ; mxGraph . prototype . isCellSelectable = function ( a ) { return this . isCellsSelectable ( ) } ; mxGraph . prototype . isCellsSelectable = function ( ) { return this . cellsSelectable } ;
mxGraph . prototype . setCellsSelectable = function ( a ) { this . cellsSelectable = a } ; mxGraph . prototype . getDeletableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellDeletable ( a ) } ) ) } ; mxGraph . prototype . isCellDeletable = function ( a ) { var b = this . view . getState ( a ) ; a = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsDeletable ( ) && 0 != a [ mxConstants . STYLE _DELETABLE ] } ; mxGraph . prototype . isCellsDeletable = function ( ) { return this . cellsDeletable } ;
mxGraph . prototype . setCellsDeletable = function ( a ) { this . cellsDeletable = a } ; mxGraph . prototype . isLabelMovable = function ( a ) { return ! this . isCellLocked ( a ) && ( this . model . isEdge ( a ) && this . edgeLabelsMovable || this . model . isVertex ( a ) && this . vertexLabelsMovable ) } ; mxGraph . prototype . isCellRotatable = function ( a ) { var b = this . view . getState ( a ) ; return 0 != ( null != b ? b . style : this . getCellStyle ( a ) ) [ mxConstants . STYLE _ROTATABLE ] } ; mxGraph . prototype . getMovableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellMovable ( a ) } ) ) } ;
mxGraph . prototype . isCellMovable = function ( a ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsMovable ( ) && ! this . isCellLocked ( a ) && 0 != b [ mxConstants . STYLE _MOVABLE ] } ; mxGraph . prototype . isCellsMovable = function ( ) { return this . cellsMovable } ; mxGraph . prototype . setCellsMovable = function ( a ) { this . cellsMovable = a } ; mxGraph . prototype . isGridEnabled = function ( ) { return this . gridEnabled } ; mxGraph . prototype . setGridEnabled = function ( a ) { this . gridEnabled = a } ; mxGraph . prototype . isPortsEnabled = function ( ) { return this . portsEnabled } ;
mxGraph . prototype . setPortsEnabled = function ( a ) { this . portsEnabled = a } ; mxGraph . prototype . getGridSize = function ( ) { return this . gridSize } ; mxGraph . prototype . setGridSize = function ( a ) { this . gridSize = a } ; mxGraph . prototype . getTolerance = function ( ) { return this . tolerance } ; mxGraph . prototype . setTolerance = function ( a ) { this . tolerance = a } ; mxGraph . prototype . isVertexLabelsMovable = function ( ) { return this . vertexLabelsMovable } ; mxGraph . prototype . setVertexLabelsMovable = function ( a ) { this . vertexLabelsMovable = a } ;
mxGraph . prototype . isEdgeLabelsMovable = function ( ) { return this . edgeLabelsMovable } ; mxGraph . prototype . setEdgeLabelsMovable = function ( a ) { this . edgeLabelsMovable = a } ; mxGraph . prototype . isSwimlaneNesting = function ( ) { return this . swimlaneNesting } ; mxGraph . prototype . setSwimlaneNesting = function ( a ) { this . swimlaneNesting = a } ; mxGraph . prototype . isSwimlaneSelectionEnabled = function ( ) { return this . swimlaneSelectionEnabled } ; mxGraph . prototype . setSwimlaneSelectionEnabled = function ( a ) { this . swimlaneSelectionEnabled = a } ;
mxGraph . prototype . isMultigraph = function ( ) { return this . multigraph } ; mxGraph . prototype . setMultigraph = function ( a ) { this . multigraph = a } ; mxGraph . prototype . isAllowLoops = function ( ) { return this . allowLoops } ; mxGraph . prototype . setAllowDanglingEdges = function ( a ) { this . allowDanglingEdges = a } ; mxGraph . prototype . isAllowDanglingEdges = function ( ) { return this . allowDanglingEdges } ; mxGraph . prototype . setConnectableEdges = function ( a ) { this . connectableEdges = a } ; mxGraph . prototype . isConnectableEdges = function ( ) { return this . connectableEdges } ;
mxGraph . prototype . isTransparentState = function ( a ) { var b = ! 1 ; if ( null != a ) var b = mxUtils . getValue ( a . style , mxConstants . STYLE _STROKECOLOR , mxConstants . NONE ) , c = mxUtils . getValue ( a . style , mxConstants . STYLE _FILLCOLOR , mxConstants . NONE ) , b = b == mxConstants . NONE && c == mxConstants . NONE && null == this . getImage ( a ) ; return b } ; mxGraph . prototype . getVerticalAlign = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _VERTICAL _ALIGN ] || mxConstants . ALIGN _MIDDLE : null } ;
mxGraph . prototype . getIndicatorColor = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _COLOR ] : null } ; mxGraph . prototype . getIndicatorGradientColor = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _GRADIENTCOLOR ] : null } ; mxGraph . prototype . getIndicatorShape = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _SHAPE ] : null } ;
mxGraph . prototype . getIndicatorImage = function ( a ) { return null != a && null != a . style ? a . style [ mxConstants . STYLE _INDICATOR _IMAGE ] : null } ; mxGraph . prototype . getBorder = function ( ) { return this . border } ; mxGraph . prototype . setBorder = function ( a ) { this . border = a } ; mxGraph . prototype . isSwimlane = function ( a ) { if ( null != a && this . model . getParent ( a ) != this . model . getRoot ( ) ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; if ( null != b && ! this . model . isEdge ( a ) ) return b [ mxConstants . STYLE _SHAPE ] == mxConstants . SHAPE _SWIMLANE } return ! 1 } ;
mxGraph . prototype . isResizeContainer = function ( ) { return this . resizeContainer } ; mxGraph . prototype . setResizeContainer = function ( a ) { this . resizeContainer = a } ; mxGraph . prototype . isEnabled = function ( ) { return this . enabled } ; mxGraph . prototype . setEnabled = function ( a ) { this . enabled = a } ; mxGraph . prototype . isEscapeEnabled = function ( ) { return this . escapeEnabled } ; mxGraph . prototype . setEscapeEnabled = function ( a ) { this . escapeEnabled = a } ; mxGraph . prototype . isInvokesStopCellEditing = function ( ) { return this . invokesStopCellEditing } ;
mxGraph . prototype . setInvokesStopCellEditing = function ( a ) { this . invokesStopCellEditing = a } ; mxGraph . prototype . isEnterStopsCellEditing = function ( ) { return this . enterStopsCellEditing } ; mxGraph . prototype . setEnterStopsCellEditing = function ( a ) { this . enterStopsCellEditing = a } ; mxGraph . prototype . isCellLocked = function ( a ) { var b = this . model . getGeometry ( a ) ; return this . isCellsLocked ( ) || null != b && this . model . isVertex ( a ) && b . relative } ; mxGraph . prototype . isCellsLocked = function ( ) { return this . cellsLocked } ;
mxGraph . prototype . setCellsLocked = function ( a ) { this . cellsLocked = a } ; mxGraph . prototype . getCloneableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellCloneable ( a ) } ) ) } ; mxGraph . prototype . isCellCloneable = function ( a ) { var b = this . view . getState ( a ) ; a = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsCloneable ( ) && 0 != a [ mxConstants . STYLE _CLONEABLE ] } ; mxGraph . prototype . isCellsCloneable = function ( ) { return this . cellsCloneable } ;
mxGraph . prototype . setCellsCloneable = function ( a ) { this . cellsCloneable = a } ; mxGraph . prototype . getExportableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . canExportCell ( a ) } ) ) } ; mxGraph . prototype . canExportCell = function ( a ) { return this . exportEnabled } ; mxGraph . prototype . getImportableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . canImportCell ( a ) } ) ) } ; mxGraph . prototype . canImportCell = function ( a ) { return this . importEnabled } ;
mxGraph . prototype . isCellSelectable = function ( a ) { return this . isCellsSelectable ( ) } ; mxGraph . prototype . isCellsSelectable = function ( ) { return this . cellsSelectable } ; mxGraph . prototype . setCellsSelectable = function ( a ) { this . cellsSelectable = a } ; mxGraph . prototype . getDeletableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellDeletable ( a ) } ) ) } ;
mxGraph . prototype . isCellDeletable = function ( a ) { var b = this . view . getState ( a ) ; a = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsDeletable ( ) && 0 != a [ mxConstants . STYLE _DELETABLE ] } ; mxGraph . prototype . isCellsDeletable = function ( ) { return this . cellsDeletable } ; mxGraph . prototype . setCellsDeletable = function ( a ) { this . cellsDeletable = a } ; mxGraph . prototype . isLabelMovable = function ( a ) { return ! this . isCellLocked ( a ) && ( this . model . isEdge ( a ) && this . edgeLabelsMovable || this . model . isVertex ( a ) && this . vertexLabelsMovable ) } ;
mxGraph . prototype . isCellRotatable = function ( a ) { var b = this . view . getState ( a ) ; return 0 != ( null != b ? b . style : this . getCellStyle ( a ) ) [ mxConstants . STYLE _ROTATABLE ] } ; mxGraph . prototype . getMovableCells = function ( a ) { return this . model . filterCells ( a , mxUtils . bind ( this , function ( a ) { return this . isCellMovable ( a ) } ) ) } ; mxGraph . prototype . isCellMovable = function ( a ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsMovable ( ) && ! this . isCellLocked ( a ) && 0 != b [ mxConstants . STYLE _MOVABLE ] } ;
mxGraph . prototype . isCellsMovable = function ( ) { return this . cellsMovable } ; mxGraph . prototype . setCellsMovable = function ( a ) { this . cellsMovable = a } ; mxGraph . prototype . isGridEnabled = function ( ) { return this . gridEnabled } ; mxGraph . prototype . setGridEnabled = function ( a ) { this . gridEnabled = a } ; mxGraph . prototype . isPortsEnabled = function ( ) { return this . portsEnabled } ; mxGraph . prototype . setPortsEnabled = function ( a ) { this . portsEnabled = a } ; mxGraph . prototype . getGridSize = function ( ) { return this . gridSize } ;
mxGraph . prototype . setGridSize = function ( a ) { this . gridSize = a } ; mxGraph . prototype . getTolerance = function ( ) { return this . tolerance } ; mxGraph . prototype . setTolerance = function ( a ) { this . tolerance = a } ; mxGraph . prototype . isVertexLabelsMovable = function ( ) { return this . vertexLabelsMovable } ; mxGraph . prototype . setVertexLabelsMovable = function ( a ) { this . vertexLabelsMovable = a } ; mxGraph . prototype . isEdgeLabelsMovable = function ( ) { return this . edgeLabelsMovable } ;
mxGraph . prototype . setEdgeLabelsMovable = function ( a ) { this . edgeLabelsMovable = a } ; mxGraph . prototype . isSwimlaneNesting = function ( ) { return this . swimlaneNesting } ; mxGraph . prototype . setSwimlaneNesting = function ( a ) { this . swimlaneNesting = a } ; mxGraph . prototype . isSwimlaneSelectionEnabled = function ( ) { return this . swimlaneSelectionEnabled } ; mxGraph . prototype . setSwimlaneSelectionEnabled = function ( a ) { this . swimlaneSelectionEnabled = a } ; mxGraph . prototype . isMultigraph = function ( ) { return this . multigraph } ;
mxGraph . prototype . setMultigraph = function ( a ) { this . multigraph = a } ; mxGraph . prototype . isAllowLoops = function ( ) { return this . allowLoops } ; mxGraph . prototype . setAllowDanglingEdges = function ( a ) { this . allowDanglingEdges = a } ; mxGraph . prototype . isAllowDanglingEdges = function ( ) { return this . allowDanglingEdges } ; mxGraph . prototype . setConnectableEdges = function ( a ) { this . connectableEdges = a } ; mxGraph . prototype . isConnectableEdges = function ( ) { return this . connectableEdges } ;
mxGraph . prototype . setCloneInvalidEdges = function ( a ) { this . cloneInvalidEdges = a } ; mxGraph . prototype . isCloneInvalidEdges = function ( ) { return this . cloneInvalidEdges } ; mxGraph . prototype . setAllowLoops = function ( a ) { this . allowLoops = a } ; mxGraph . prototype . isDisconnectOnMove = function ( ) { return this . disconnectOnMove } ; mxGraph . prototype . setDisconnectOnMove = function ( a ) { this . disconnectOnMove = a } ; mxGraph . prototype . isDropEnabled = function ( ) { return this . dropEnabled } ;
mxGraph . prototype . setDropEnabled = function ( a ) { this . dropEnabled = a } ; mxGraph . prototype . isSplitEnabled = function ( ) { return this . splitEnabled } ; mxGraph . prototype . setSplitEnabled = function ( a ) { this . splitEnabled = a } ; mxGraph . prototype . isCellResizable = function ( a ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsResizable ( ) && ! this . isCellLocked ( a ) && "0" != mxUtils . getValue ( b , mxConstants . STYLE _RESIZABLE , "1" ) } ; mxGraph . prototype . isCellsResizable = function ( ) { return this . cellsResizable } ;
mxGraph . prototype . setCellsResizable = function ( a ) { this . cellsResizable = a } ; mxGraph . prototype . isTerminalPointMovable = function ( a , b ) { return ! 0 } ; mxGraph . prototype . isCellBendable = function ( a ) { var b = this . view . getState ( a ) , b = null != b ? b . style : this . getCellStyle ( a ) ; return this . isCellsBendable ( ) && ! this . isCellLocked ( a ) && 0 != b [ mxConstants . STYLE _BENDABLE ] } ; mxGraph . prototype . isCellsBendable = function ( ) { return this . cellsBendable } ; mxGraph . prototype . setCellsBendable = function ( a ) { this . cellsBendable = a } ;
@ -1370,12 +1371,13 @@ mxCellStatePreview.prototype.translateState=function(a,b,c){if(null!=a){var d=th
mxCellStatePreview . prototype . revalidateState = function ( a , b , c , d ) { if ( null != a ) { var e = this . graph . getModel ( ) ; e . isEdge ( a . cell ) && a . view . updateCellState ( a ) ; var f = this . graph . getCellGeometry ( a . cell ) , g = a . view . getState ( e . getParent ( a . cell ) ) ; 0 == b && 0 == c || null == f || ! f . relative || ! e . isVertex ( a . cell ) || null != g && ! e . isVertex ( g . cell ) && null == this . deltas . get ( a . cell ) || ( a . x += b , a . y += c ) ; this . graph . cellRenderer . redraw ( a ) ; null != d && d ( a ) ; f = e . getChildCount ( a . cell ) ; for ( g = 0 ; g < f ; g ++ ) this . revalidateState ( this . graph . view . getState ( e . getChildAt ( a . cell ,
g ) ) , b , c , d ) } } ; mxCellStatePreview . prototype . addEdges = function ( a ) { for ( var b = this . graph . getModel ( ) , c = b . getEdgeCount ( a . cell ) , d = 0 ; d < c ; d ++ ) { var e = a . view . getState ( b . getEdgeAt ( a . cell , d ) ) ; null != e && this . moveState ( e , 0 , 0 ) } } ; function mxConnectionConstraint ( a , b , c , d , e ) { this . point = a ; this . perimeter = null != b ? b : ! 0 ; this . name = c ; this . dx = d ? d : 0 ; this . dy = e ? e : 0 } mxConnectionConstraint . prototype . point = null ; mxConnectionConstraint . prototype . perimeter = null ; mxConnectionConstraint . prototype . name = null ;
mxConnectionConstraint . prototype . dx = null ; mxConnectionConstraint . prototype . dy = null ;
function mxGraphHandler ( a ) { this . graph = a ; this . graph . addMouseListener ( this ) ; this . panHandler = mxUtils . bind ( this , function ( ) { this . suspended || ( this . updatePreview ( ) , this . updateHint ( ) ) } ) ; this . graph . addListener ( mxEvent . PAN , this . panHandler ) ; this . escapeHandler = mxUtils . bind ( this , function ( a , c ) { this . reset ( ) } ) ; this . graph . addListener ( mxEvent . ESCAPE , this . escapeHandler ) ; this . refreshHandler = mxUtils . bind ( this , function ( a , c ) { if ( null != this . first && ! this . suspended ) try { this . bounds = this . graph . getView ( ) . getBounds ( this . cells ) ,
this . pBounds = this . getPreviewBounds ( this . cells ) , this . updatePreview ( ! 0 ) , window . setTimeout ( mxUtils . bind ( this , function ( ) { this . livePreviewUsed && ( this . setHandlesVisibleForCells ( this . cells , ! 1 ) , this . updatePreview ( ) ) } ) , 0 ) } catch ( d ) { this . reset ( ) } } ) ; this . graph . getModel ( ) . addListener ( mxEvent . CHANGE , this . refreshHandler ) } mxGraphHandler . prototype . graph = null ; mxGraphHandler . prototype . maxCells = mxClient . IS _IE ? 20 : 50 ; mxGraphHandler . prototype . enabled = ! 0 ; mxGraphHandler . prototype . highlightEnabled = ! 0 ;
mxGraphHandler . prototype . cloneEnabled = ! 0 ; mxGraphHandler . prototype . moveEnabled = ! 0 ; mxGraphHandler . prototype . guidesEnabled = ! 1 ; mxGraphHandler . prototype . guide = null ; mxGraphHandler . prototype . currentDx = null ; mxGraphHandler . prototype . currentDy = null ; mxGraphHandler . prototype . updateCursor = ! 0 ; mxGraphHandler . prototype . selectEnabled = ! 0 ; mxGraphHandler . prototype . removeCellsFromParent = ! 0 ; mxGraphHandler . prototype . removeEmptyParents = ! 1 ; mxGraphHandler . prototype . connectOnDrop = ! 1 ; mxGraphHandler . prototype . scrollOnMove = ! 0 ;
mxGraphHandler . prototype . minimumSize = 6 ; mxGraphHandler . prototype . previewColor = "black" ; mxGraphHandler . prototype . htmlPreview = ! 1 ; mxGraphHandler . prototype . shape = null ; mxGraphHandler . prototype . scaleGrid = ! 1 ; mxGraphHandler . prototype . rotationEnabled = ! 0 ; mxGraphHandler . prototype . maxLivePreview = 0 ; mxGraphHandler . prototype . allowLivePreview = mxClient . IS _SVG ; mxGraphHandler . prototype . isEnabled = function ( ) { return this . enabled } ; mxGraphHandler . prototype . setEnabled = function ( a ) { this . enabled = a } ;
mxGraphHandler . prototype . isCloneEnabled = function ( ) { return this . cloneEnabled } ; mxGraphHandler . prototype . setCloneEnabled = function ( a ) { this . cloneEnabled = a } ; mxGraphHandler . prototype . isMoveEnabled = function ( ) { return this . moveEnabled } ; mxGraphHandler . prototype . setMoveEnabled = function ( a ) { this . moveEnabled = a } ; mxGraphHandler . prototype . isSelectEnabled = function ( ) { return this . selectEnabled } ; mxGraphHandler . prototype . setSelectEnabled = function ( a ) { this . selectEnabled = a } ;
mxGraphHandler . prototype . isRemoveCellsFromParent = function ( ) { return this . removeCellsFromParent } ; mxGraphHandler . prototype . setRemoveCellsFromParent = function ( a ) { this . removeCellsFromParent = a } ; mxGraphHandler . prototype . getInitialCellForEvent = function ( a ) { return a . getCell ( ) } ; mxGraphHandler . prototype . isDelayedSelection = function ( a , b ) { return this . graph . isCellSelected ( a ) } ; mxGraphHandler . prototype . consumeMouseEvent = function ( a , b ) { b . consume ( ) } ;
function mxGraphHandler ( a ) { this . graph = a ; this . graph . addMouseListener ( this ) ; this . panHandler = mxUtils . bind ( this , function ( ) { this . suspended || ( this . updatePreview ( ) , this . updateHint ( ) ) } ) ; this . graph . addListener ( mxEvent . PAN , this . panHandler ) ; this . escapeHandler = mxUtils . bind ( this , function ( a , c ) { this . reset ( ) } ) ; this . graph . addListener ( mxEvent . ESCAPE , this . escapeHandler ) ; this . refreshHandler = mxUtils . bind ( this , function ( a , c ) { window . setTimeout ( mxUtils . bind ( this , function ( ) { if ( null != this . first && ! this . suspended ) { var a = this . currentDx ,
b = this . currentDy ; this . currentDy = this . currentDx = 0 ; this . updatePreview ( ) ; this . bounds = this . graph . getView ( ) . getBounds ( this . cells ) ; this . pBounds = this . getPreviewBounds ( this . cells ) ; null == this . pBounds ? this . reset ( ) : ( this . currentDx = a , this . currentDy = b , this . updatePreview ( ) , this . updateHint ( ) , this . livePreviewUsed && this . setHandlesVisibleForCells ( this . graph . getSelectionCells ( ) , ! 1 ) ) } } ) , 0 ) } ) ; this . graph . getModel ( ) . addListener ( mxEvent . CHANGE , this . refreshHandler ) } mxGraphHandler . prototype . graph = null ;
mxGraphHandler . prototype . maxCells = mxClient . IS _IE ? 20 : 50 ; mxGraphHandler . prototype . enabled = ! 0 ; mxGraphHandler . prototype . highlightEnabled = ! 0 ; mxGraphHandler . prototype . cloneEnabled = ! 0 ; mxGraphHandler . prototype . moveEnabled = ! 0 ; mxGraphHandler . prototype . guidesEnabled = ! 1 ; mxGraphHandler . prototype . guide = null ; mxGraphHandler . prototype . currentDx = null ; mxGraphHandler . prototype . currentDy = null ; mxGraphHandler . prototype . updateCursor = ! 0 ; mxGraphHandler . prototype . selectEnabled = ! 0 ;
mxGraphHandler . prototype . removeCellsFromParent = ! 0 ; mxGraphHandler . prototype . removeEmptyParents = ! 1 ; mxGraphHandler . prototype . connectOnDrop = ! 1 ; mxGraphHandler . prototype . scrollOnMove = ! 0 ; mxGraphHandler . prototype . minimumSize = 6 ; mxGraphHandler . prototype . previewColor = "black" ; mxGraphHandler . prototype . htmlPreview = ! 1 ; mxGraphHandler . prototype . shape = null ; mxGraphHandler . prototype . scaleGrid = ! 1 ; mxGraphHandler . prototype . rotationEnabled = ! 0 ; mxGraphHandler . prototype . maxLivePreview = 0 ;
mxGraphHandler . prototype . allowLivePreview = mxClient . IS _SVG ; mxGraphHandler . prototype . isEnabled = function ( ) { return this . enabled } ; mxGraphHandler . prototype . setEnabled = function ( a ) { this . enabled = a } ; mxGraphHandler . prototype . isCloneEnabled = function ( ) { return this . cloneEnabled } ; mxGraphHandler . prototype . setCloneEnabled = function ( a ) { this . cloneEnabled = a } ; mxGraphHandler . prototype . isMoveEnabled = function ( ) { return this . moveEnabled } ; mxGraphHandler . prototype . setMoveEnabled = function ( a ) { this . moveEnabled = a } ;
mxGraphHandler . prototype . isSelectEnabled = function ( ) { return this . selectEnabled } ; mxGraphHandler . prototype . setSelectEnabled = function ( a ) { this . selectEnabled = a } ; mxGraphHandler . prototype . isRemoveCellsFromParent = function ( ) { return this . removeCellsFromParent } ; mxGraphHandler . prototype . setRemoveCellsFromParent = function ( a ) { this . removeCellsFromParent = a } ; mxGraphHandler . prototype . getInitialCellForEvent = function ( a ) { return a . getCell ( ) } ; mxGraphHandler . prototype . isDelayedSelection = function ( a , b ) { return this . graph . isCellSelected ( a ) } ;
mxGraphHandler . prototype . consumeMouseEvent = function ( a , b ) { b . consume ( ) } ;
mxGraphHandler . prototype . mouseDown = function ( a , b ) { if ( ! b . isConsumed ( ) && this . isEnabled ( ) && this . graph . isEnabled ( ) && null != b . getState ( ) && ! mxEvent . isMultiTouchEvent ( b . getEvent ( ) ) ) { var c = this . getInitialCellForEvent ( b ) ; this . delayedSelection = this . isDelayedSelection ( c , b ) ; this . cell = null ; this . isSelectEnabled ( ) && ! this . delayedSelection && this . graph . selectCellForEvent ( c , b . getEvent ( ) ) ; if ( this . isMoveEnabled ( ) ) { var d = this . graph . model , e = d . getGeometry ( c ) ; this . graph . isCellMovable ( c ) && ( ! d . isEdge ( c ) || 1 < this . graph . getSelectionCount ( ) ||
null != e . points && 0 < e . points . length || null == d . getTerminal ( c , ! 0 ) || null == d . getTerminal ( c , ! 1 ) || this . graph . allowDanglingEdges || this . graph . isCloneEvent ( b . getEvent ( ) ) && this . graph . isCellsCloneable ( ) ) ? this . start ( c , b . getX ( ) , b . getY ( ) ) : this . delayedSelection && ( this . cell = c ) ; this . cellWasClicked = ! 0 ; this . consumeMouseEvent ( mxEvent . MOUSE _DOWN , b ) } } } ;
mxGraphHandler . prototype . getGuideStates = function ( ) { var a = this . graph . getDefaultParent ( ) , b = this . graph . getModel ( ) , c = mxUtils . bind ( this , function ( a ) { return null != this . graph . view . getState ( a ) && b . isVertex ( a ) && null != b . getGeometry ( a ) && ! b . getGeometry ( a ) . relative } ) ; return this . graph . view . getCellStates ( b . filterDescendants ( c , a ) ) } ; mxGraphHandler . prototype . getCells = function ( a ) { return ! this . delayedSelection && this . graph . isCellMovable ( a ) ? [ a ] : this . graph . getMovableCells ( this . graph . getSelectionCells ( ) ) } ;
@ -1390,24 +1392,24 @@ mxGraphHandler.prototype.roundLength=function(a){return Math.round(100*a)/100};
mxGraphHandler . prototype . mouseMove = function ( a , b ) { var c = this . graph ; if ( b . isConsumed ( ) || ! c . isMouseDown || null == this . cell || null == this . first || null == this . bounds || this . suspended ) ! this . isMoveEnabled ( ) && ! this . isCloneEnabled ( ) || ! this . updateCursor || b . isConsumed ( ) || null == b . getState ( ) && null == b . sourceState || c . isMouseDown || ( d = c . getCursorForMouseEvent ( b ) , null == d && c . isEnabled ( ) && c . isCellMovable ( b . getCell ( ) ) && ( d = c . getModel ( ) . isEdge ( b . getCell ( ) ) ? mxConstants . CURSOR _MOVABLE _EDGE : mxConstants . CURSOR _MOVABLE _VERTEX ) , null !=
d && null != b . sourceState && b . sourceState . setCursor ( d ) ) ; else if ( mxEvent . isMultiTouchEvent ( b . getEvent ( ) ) ) this . reset ( ) ; else { var d = this . getDelta ( b ) , e = c . tolerance ; if ( null != this . shape || this . livePreviewActive || Math . abs ( d . x ) > e || Math . abs ( d . y ) > e ) { null == this . highlight && ( this . highlight = new mxCellHighlight ( this . graph , mxConstants . DROP _TARGET _COLOR , 3 ) ) ; var e = c . isCloneEvent ( b . getEvent ( ) ) && c . isCellsCloneable ( ) && this . isCloneEnabled ( ) , f = c . isGridEnabledEvent ( b . getEvent ( ) ) , g = b . getCell ( ) , k = ! 0 , l = null ; this . cloning = e ; c . isDropEnabled ( ) &&
this . highlightEnabled && ( l = c . getDropTarget ( this . cells , b . getEvent ( ) , g , e ) ) ; var m = c . getView ( ) . getState ( l ) , n = ! 1 ; null == m || c . model . getParent ( this . cell ) == l && ! e ? ( this . target = null , this . connectOnDrop && null != g && 1 == this . cells . length && c . getModel ( ) . isVertex ( g ) && c . isCellConnectable ( g ) && ( m = c . getView ( ) . getState ( g ) , null != m && ( g = null == c . getEdgeValidationError ( null , this . cell , g ) ? mxConstants . VALID _COLOR : mxConstants . INVALID _CONNECT _TARGET _COLOR , this . setHighlightColor ( g ) , n = ! 0 ) ) ) : ( this . target != l && ( this . target = l , this . setHighlightColor ( mxConstants . DROP _TARGET _COLOR ) ) ,
n = ! 0 ) ; null != m && n ? this . highlight . highlight ( m ) : this . highlight . hide ( ) ; this . livePreviewActive && e ? ( this . resetLivePreview ( ) , this . livePreviewActive = ! 1 ) : this . maxLivePreview >= this . cellCount && ! this . livePreviewActive && this . allowLivePreview ? e && this . livePreviewActive || ( this . setHandlesVisibleForCells ( this . cells , ! 1 ) , this . livePreviewUsed = this . livePreviewActive = ! 0 ) : this . livePreviewUsed || null != this . shape || ( this . shape = this . createPreviewShape ( this . bounds ) ) ; null != this . guide && this . useGuidesForEvent ( b ) ? ( d = this . guide . move ( this . bounds ,
d , f , e ) , k = ! 1 ) : d = this . graph . snapDelta ( d , this . bounds , ! f , ! 1 , ! 1 ) ; null != this . guide && k && this . guide . hide ( ) ; c . isConstrainedEvent ( b . getEvent ( ) ) && ( Math . abs ( d . x ) > Math . abs ( d . y ) ? d . y = 0 : d . x = 0 ) ; if ( this . currentDx != d . x || this . currentDy != d . y ) this . currentDx = d . x , this . currentDy = d . y , this . updatePreview ( ) } this . updateHint ( b ) ; this . consumeMouseEvent ( mxEvent . MOUSE _MOVE , b ) ; mxEvent . consume ( b . getEvent ( ) ) } } ;
n = ! 0 ) ; null != m && n ? this . highlight . highlight ( m ) : this . highlight . hide ( ) ; this . livePreviewActive && e ? ( this . resetLivePreview ( ) , this . livePreviewActive = ! 1 ) : this . maxLivePreview >= this . cellCount && ! this . livePreviewActive && this . allowLivePreview ? e && this . livePreviewActive || ( this . setHandlesVisibleForCells ( this . graph. getSelectionCells ( ) , ! 1 ) , this . livePreviewUsed = this . livePreviewActive = ! 0 ) : this . livePreviewUsed || null != this . shape || ( this . shape = this . createPreviewShape ( this . bounds ) ) ; null != this . guide && this . useGuidesForEvent ( b ) ?
( d = this . guide . move ( this . bounds , d , f , e ) , k = ! 1 ) : d = this . graph . snapDelta ( d , this . bounds , ! f , ! 1 , ! 1 ) ; null != this . guide && k && this . guide . hide ( ) ; c . isConstrainedEvent ( b . getEvent ( ) ) && ( Math . abs ( d . x ) > Math . abs ( d . y ) ? d . y = 0 : d . x = 0 ) ; if ( this . currentDx != d . x || this . currentDy != d . y ) this . currentDx = d . x , this . currentDy = d . y , this . updatePreview ( ) } this . updateHint ( b ) ; this . consumeMouseEvent ( mxEvent . MOUSE _MOVE , b ) ; mxEvent . consume ( b . getEvent ( ) ) } } ;
mxGraphHandler . prototype . updatePreview = function ( a ) { this . livePreviewUsed && ! a ? null != this . cells && this . updateLivePreview ( this . currentDx , this . currentDy ) : this . updatePreviewShape ( ) } ; mxGraphHandler . prototype . updatePreviewShape = function ( ) { null != this . shape && ( this . shape . bounds = new mxRectangle ( Math . round ( this . pBounds . x + this . currentDx ) , Math . round ( this . pBounds . y + this . currentDy ) , this . pBounds . width , this . pBounds . height ) , this . shape . redraw ( ) ) } ;
mxGraphHandler . prototype . updateLivePreview = function ( a , b ) { if ( ! this . suspended ) { var c = [ ] ; null != this . allCells && this . allCells . visit ( mxUtils . bind ( this , function ( d , e ) { var f = e . clone ( ) ; c . push ( [ e , f ] ) ; null != e . shape && ( null == e . shape . originalPointerEvents && ( e . shape . originalPointerEvents = e . shape . pointerEvents ) , e . shape . pointerEvents = ! 1 , null != e . text && ( null == e . text . originalPointerEvents && ( e . text . originalPointerEvents = e . text . pointerEvents ) , e . text . pointerEvents = ! 1 ) ) ; this . graph . model . isVertex ( e . cell ) && ( e . x += a , e . y += b , this . cloning ||
( e . view . graph . cellRenderer . redraw ( e , ! 0 ) , e . view . invalidate ( e . cell ) , e . invalid = ! 1 , null != e . control && null != e . control . node && ( e . control . node . style . visibility = "hidden" ) ) ) } )) ; for( var d = this . graph . view . scale , e = 0 ; e < c . length ; e ++ ) { var f = c [ e ] [ 0 ] ; if ( this . graph . model . isEdge ( f . cell ) ) { var g = this . graph . getCellGeometry ( f . cell ) , k = [ ] ; if ( null != g && null != g . points ) for ( var l = 0 ; l < g . points . length ; l ++ ) null != g . points [ l ] && k . push ( new mxPoint ( g . points [ l ] . x + a / d , g . points [ l ] . y + b / d ) ) ; var g = f . visibleSourceState , l = f . visibleTargetState ,
m = c [ e ] [ 1 ] . absolutePoints ; null != g && this . isCellMoving ( g . cell ) ? f . view . updateFixedTerminalPoint ( f , g , ! 0 , this . graph . getConnectionConstraint ( f , g , ! 0 ) ) : ( g = m [ 0 ] , f . setAbsoluteTerminalPoint ( new mxPoint ( g . x + a , g . y + b ) , ! 0 ) , g = null ) ; null != l && this . isCellMoving ( l . cell ) ? f . view . updateFixedTerminalPoint ( f , l , ! 1 , this . graph . getConnectionConstraint ( f , l , ! 1 ) ) : ( l = m [ m . length - 1 ] , f . setAbsoluteTerminalPoint ( new mxPoint ( l . x + a , l . y + b ) , ! 1 ) , l = null ) ; f . view . updatePoints ( f , k , g , l ) ; f . view . updateFloatingTerminalPoints ( f , g , l ) ; f . view . updateEdgeLabelOffset ( f ) ;
f . invalid = ! 1 ; this . cloning || f . view . graph . cellRenderer . redraw ( f , ! 0 ) } } this . graph . view . validate ( ) ; this . redrawHandles ( c ) ; this . resetPreviewStates ( c ) } } ;mxGraphHandler . prototype . redrawHandles = function ( a ) { for ( var b = 0 ; b < a . length ; b ++ ) { var c = this . graph . selectionCellsHandler . getHandler ( a [ b ] [ 0 ] . cell ) ; null != c && c . redraw ( ! 0 ) } } ; mxGraphHandler . prototype . resetPreviewStates = function ( a ) { for ( var b = 0 ; b < a . length ; b ++ ) a [ b ] [ 0 ] . setState ( a [ b ] [ 1 ] ) } ;
mxGraphHandler . prototype . updateLivePreview = function ( a , b ) { if ( ! this . suspended ) { var c = [ ] ; null != this . allCells && this . allCells . visit ( mxUtils . bind ( this , function ( d , e ) { if ( null == this . graph . view . getState ( e . cell ) ) e . destroy ( ) ; else { var f = e . clone ( ) ; c . push ( [ e , f ] ) ; null != e . shape && ( null == e . shape . originalPointerEvents && ( e . shape . originalPointerEvents = e . shape . pointerEvents ) , e . shape . pointerEvents = ! 1 , null != e . text && ( null == e . text . originalPointerEvents && ( e . text . originalPointerEvents = e . text . pointerEvents ) , e . text . pointerEvents =
! 1 ) ) ; this . graph . model . isVertex ( e . cell ) && ( e . x += a , e . y += b , this . cloning || ( e . view . graph . cellRenderer . redraw ( e , ! 0 ) , e . view . invalidate ( e . cell ) , e . invalid = ! 1 , null != e . control && null != e . control . node && ( e . control . node . style . visibility = "hidden" ) ) ) } } )) ; if( 0 == c . length ) this . reset ( ) ; else { for( var d = this . graph . view . scale , e = 0 ; e < c . length ; e ++ ) { var f = c [ e ] [ 0 ] ; if ( this . graph . model . isEdge ( f . cell ) ) { var g = this . graph . getCellGeometry ( f . cell ) , k = [ ] ; if ( null != g && null != g . points ) for ( var l = 0 ; l < g . points . length ; l ++ ) null != g . points [ l ] && k . push ( new mxPoint ( g . points [ l ] . x +
a / d , g . points [ l ] . y + b / d ) ) ; var g = f . visibleSourceState , l = f . visibleTargetState , m = c [ e ] [ 1 ] . absolutePoints ; null != g && this . isCellMoving ( g . cell ) ? f . view . updateFixedTerminalPoint ( f , g , ! 0 , this . graph . getConnectionConstraint ( f , g , ! 0 ) ) : ( g = m [ 0 ] , f . setAbsoluteTerminalPoint ( new mxPoint ( g . x + a , g . y + b ) , ! 0 ) , g = null ) ; null != l && this . isCellMoving ( l . cell ) ? f . view . updateFixedTerminalPoint ( f , l , ! 1 , this . graph . getConnectionConstraint ( f , l , ! 1 ) ) : ( l = m [ m . length - 1 ] , f . setAbsoluteTerminalPoint ( new mxPoint ( l . x + a , l . y + b ) , ! 1 ) , l = null ) ; f . view . updatePoints ( f ,
k , g , l ) ; f . view . updateFloatingTerminalPoints ( f , g , l ) ; f . view . updateEdgeLabelOffset ( f ) ; f . invalid = ! 1 ; this . cloning || f . view . graph . cellRenderer . redraw ( f , ! 0 ) } } this . graph . view . validate ( ) ; this . redrawHandles ( c ) ; this . resetPreviewStates ( c ) } } } ;mxGraphHandler . prototype . redrawHandles = function ( a ) { for ( var b = 0 ; b < a . length ; b ++ ) { var c = this . graph . selectionCellsHandler . getHandler ( a [ b ] [ 0 ] . cell ) ; null != c && c . redraw ( ! 0 ) } } ; mxGraphHandler . prototype . resetPreviewStates = function ( a ) { for ( var b = 0 ; b < a . length ; b ++ ) a [ b ] [ 0 ] . setState ( a [ b ] [ 1 ] ) } ;
mxGraphHandler . prototype . suspend = function ( ) { this . suspended || ( this . livePreviewUsed && this . updateLivePreview ( 0 , 0 ) , null != this . shape && ( this . shape . node . style . visibility = "hidden" ) , null != this . guide && this . guide . setVisible ( ! 1 ) , this . suspended = ! 0 ) } ; mxGraphHandler . prototype . resume = function ( ) { this . suspended && ( this . suspended = null , this . livePreviewUsed && ( this . livePreviewActive = ! 0 ) , null != this . shape && ( this . shape . node . style . visibility = "visible" ) , null != this . guide && this . guide . setVisible ( ! 0 ) ) } ;
mxGraphHandler . prototype . resetLivePreview = function ( ) { null != this . allCells && ( this . allCells . visit ( mxUtils . bind ( this , function ( a , b ) { null != b . shape && null != b . shape . originalPointerEvents && ( b . shape . pointerEvents = b . shape . originalPointerEvents , b . shape . originalPointerEvents = null , null != b . text && ( b . text . pointerEvents = b . text . originalPointerEvents , b . text . originalPointerEvents = null ) ) ; null != b . control && null != b . control . node && "hidden" == b . control . node . style . visibility && ( b . control . node . style . visibility = "" ) ; b . view . invalidate ( b . cell ) } ) ) ,
this . graph . view . validate ( ) ) } ; mxGraphHandler . prototype . setHandlesVisibleForCells = function ( a , b ) { for ( var c = 0 ; c < a . length ; c ++ ) { var d = this . graph . selectionCellsHandler . getHandler ( a [ c ] ) ; null != d && ( d . setHandlesVisible ( b ) , b && d . redraw ( ) ) } } ; mxGraphHandler . prototype . setHighlightColor = function ( a ) { null != this . highlight && this . highlight . setHighlightColor ( a ) } ;
mxGraphHandler . prototype . mouseUp = function ( a , b ) { if ( ! b . isConsumed ( ) ) if ( this . livePreviewUsed && this . resetLivePreview ( ) , null == this . cell || null == this . first || null == this . shape && ! this . livePreviewUsed || null == this . currentDx || null == this . currentDy ) this . isSelectEnabled ( ) && this . delayedSelection && null != this . cell && this . selectDelayed ( b ) ; else { var c = this . graph , d = b . getCell ( ) ; if ( this . connectOnDrop && null == this . target && null != d && c . getModel ( ) . isVertex ( d ) && c . isCellConnectable ( d ) && c . isEdgeValid ( null , this . cell , d ) ) c . connectionHandler . connect ( this . cell ,
d , b . getEvent ( ) ) ; else { var d = c . isCloneEvent ( b . getEvent ( ) ) && c . isCellsCloneable ( ) && this . isCloneEnabled ( ) , e = c . getView ( ) . scale , f = this . roundLength ( this . currentDx / e ) , e = this . roundLength ( this . currentDy / e ) , g = this . target ; c . isSplitEnabled ( ) && c . isSplitTarget ( g , this . cells , b . getEvent ( ) ) ? c . splitEdge ( g , this . cells , null , f , e ) : this . moveCells ( this . cells , f , e , d , this . target , b . getEvent ( ) ) } } this . cellWasClicked && this . consumeMouseEvent ( mxEvent . MOUSE _UP , b ) ; this . reset ( ) } ;
mxGraphHandler . prototype . selectDelayed = function ( a ) { this . graph . isCellSelected ( this . cell ) && this . graph . popupMenuHandler . isPopupTrigger ( a ) || this . graph . selectCellForEvent ( this . cell , a . getEvent ( ) ) } ;
mxGraphHandler . prototype . reset = function ( ) { this . livePreviewUsed && ( this . resetLivePreview ( ) , this . setHandlesVisibleForCells ( this . cells , ! 0 ) ) ; this . destroyShapes ( ) ; this . removeHint ( ) ; this . delayedSelection = ! 1 ; this . livePreviewUsed = this . livePreviewActive = null ; this . cellWasClicked = ! 1 ; this . cellCount = this . currentDy = this . currentDx = this . suspended = null ; this . cloning = ! 1 ; this . cell = this . cells = this . first = this . target = this . guides = this . pBounds = this . allCells = null } ;
mxGraphHandler . prototype . reset = function ( ) { this . livePreviewUsed && ( this . resetLivePreview ( ) , this . setHandlesVisibleForCells ( this . graph. getSelectionCells ( ) , ! 0 ) ) ; this . destroyShapes ( ) ; this . removeHint ( ) ; this . delayedSelection = ! 1 ; this . livePreviewUsed = this . livePreviewActive = null ; this . cellWasClicked = ! 1 ; this . cellCount = this . currentDy = this . currentDx = this . suspended = null ; this . cloning = ! 1 ; this . cell = this . cells = this . first = this . target = this . guides = this . pBounds = this . allCells = null } ;
mxGraphHandler . prototype . shouldRemoveCellsFromParent = function ( a , b , c ) { if ( this . graph . getModel ( ) . isVertex ( a ) && ( a = this . graph . getView ( ) . getState ( a ) , null != a ) ) { c = mxUtils . convertPoint ( this . graph . container , mxEvent . getClientX ( c ) , mxEvent . getClientY ( c ) ) ; var d = mxUtils . toRadians ( mxUtils . getValue ( a . style , mxConstants . STYLE _ROTATION ) || 0 ) ; if ( 0 != d ) { b = Math . cos ( - d ) ; var d = Math . sin ( - d ) , e = new mxPoint ( a . getCenterX ( ) , a . getCenterY ( ) ) ; c = mxUtils . getRotatedPoint ( c , b , d , e ) } return ! mxUtils . contains ( a , c . x , c . y ) } return ! 1 } ;
mxGraphHandler . prototype . moveCells = function ( a , b , c , d , e , f ) { d && ( a = this . graph . getCloneableCells ( a ) ) ; var g = this . graph . getModel ( ) . getParent ( this . cell ) ; null == e && this . isRemoveCellsFromParent ( ) && this . shouldRemoveCellsFromParent ( g , a , f ) && ( e = this . graph . getDefaultParent ( ) ) ; d = d && ! this . graph . isCellLocked ( e || this . graph . getDefaultParent ( ) ) ; this . graph . getModel ( ) . beginUpdate ( ) ; try { g = [ ] ; if ( ! d && null != e && this . removeEmptyParents ) { for ( var k = new mxDictionary , l = 0 ; l < a . length ; l ++ ) k . put ( a [ l ] , ! 0 ) ; for ( l = 0 ; l < a . length ; l ++ ) { var m =
this . graph . model . getParent ( a [ l ] ) ; null == m || k . get ( m ) || ( k . put ( m , ! 0 ) , g . push ( m ) ) } } a = this . graph . moveCells ( a , b , c , d , e , f ) ; b = [ ] ; for ( l = 0 ; l < g . length ; l ++ ) this . shouldRemoveParent ( g [ l ] ) && b . push ( g [ l ] ) ; this . graph . removeCells ( b , ! 1 ) } finally { this . graph . getModel ( ) . endUpdate ( ) } d && this . graph . setSelectionCells ( a ) ; this . isSelectEnabled ( ) && this . scrollOnMove && this . graph . scrollCellToVisible ( a [ 0 ] ) } ;
mxGraphHandler . prototype . shouldRemoveParent = function ( a ) { var b = this . graph . view . getState ( a ) ; return null != b && ( this . graph . model . isEdge ( b . cell ) || this . graph . model . isVertex ( b . cell ) ) && this . graph . isCellDeletable ( b . cell ) && 0 == this . graph . model . getChildCount ( b. cell ) ? ( a = mxUtils . getValue ( b . style , mxConstants . STYLE _STROKECOLOR , mxConstants . NONE ) , b = mxUtils . getValue ( b . style , mxConstants . STYLE _FILLCOLOR , mxConstants . NONE ) , a == mxConstants . NONE && b == mxConstants . NONE ) : ! 1 } ;
mxGraphHandler . prototype . shouldRemoveParent = function ( a ) { a = this . graph . view . getState ( a ) ; return null != a && ( this . graph . model . isEdge ( a . cell ) || this . graph . model . isVertex ( a . cell ) ) && this . graph . isCellDeletable ( a . cell ) && 0 == this . graph . model . getChildCount ( a. cell ) && this . graph . isTransparentState ( a ) } ;
mxGraphHandler . prototype . destroyShapes = function ( ) { null != this . shape && ( this . shape . destroy ( ) , this . shape = null ) ; null != this . guide && ( this . guide . destroy ( ) , this . guide = null ) ; null != this . highlight && ( this . highlight . destroy ( ) , this . highlight = null ) } ;
mxGraphHandler . prototype . destroy = function ( ) { this . graph . removeMouseListener ( this ) ; this . graph . removeListener ( this . panHandler ) ; null != this . escapeHandler && ( this . graph . removeListener ( this . escapeHandler ) , this . escapeHandler = null ) ; null != this . refreshHandler && ( this . graph . getModel ( ) . removeListener ( this . refreshHandler ) , this . refreshHandler = null ) ; this . destroyShapes ( ) ; this . removeHint ( ) } ;
function mxPanningHandler ( a ) { null != a && ( this . graph = a , this . graph . addMouseListener ( this ) , this . forcePanningHandler = mxUtils . bind ( this , function ( a , c ) { var b = c . getProperty ( "eventName" ) , e = c . getProperty ( "event" ) ; b == mxEvent . MOUSE _DOWN && this . isForcePanningEvent ( e ) && ( this . start ( e ) , this . active = ! 0 , this . fireEvent ( new mxEventObject ( mxEvent . PAN _START , "event" , e ) ) , e . consume ( ) ) } ) , this . graph . addListener ( mxEvent . FIRE _MOUSE _EVENT , this . forcePanningHandler ) , this . gestureHandler = mxUtils . bind ( this , function ( a , c ) { if ( this . isPinchEnabled ( ) ) { var b =
@ -1464,10 +1466,10 @@ mxConnectionHandler.prototype.isImmediateConnectSource=function(a){return!this.g
mxConnectionHandler . prototype . isOutlineConnectEvent = function ( a ) { var b = mxUtils . getOffset ( this . graph . container ) , c = a . getEvent ( ) , d = mxEvent . getClientX ( c ) , c = mxEvent . getClientY ( c ) , e = document . documentElement , f = this . currentPoint . x - this . graph . container . scrollLeft + b . x - ( ( window . pageXOffset || e . scrollLeft ) - ( e . clientLeft || 0 ) ) , b = this . currentPoint . y - this . graph . container . scrollTop + b . y - ( ( window . pageYOffset || e . scrollTop ) - ( e . clientTop || 0 ) ) ; return this . outlineConnect && ! mxEvent . isShiftDown ( a . getEvent ( ) ) && ( a . isSource ( this . marker . highlight . shape ) ||
mxEvent . isAltDown ( a . getEvent ( ) ) && null != a . getState ( ) || this . marker . highlight . isHighlightAt ( d , c ) || ( f != d || b != c ) && null == a . getState ( ) && this . marker . highlight . isHighlightAt ( f , b ) ) } ;
mxConnectionHandler . prototype . updateCurrentState = function ( a , b ) { this . constraintHandler . update ( a , null == this . first , ! 1 , null == this . first || a . isSource ( this . marker . highlight . shape ) ? null : b ) ; if ( null != this . constraintHandler . currentFocus && null != this . constraintHandler . currentConstraint ) null != this . marker . highlight && null != this . marker . highlight . state && this . marker . highlight . state . cell == this . constraintHandler . currentFocus . cell ? "transparent" != this . marker . highlight . shape . stroke && ( this . marker . highlight . shape . stroke = "transparent" ,
this . marker . highlight . repaint ( ) ) : this . marker . markCell ( this . constraintHandler . currentFocus . cell , "transparent" ) , null != this . previous && ( this . error = this . validateConnection ( this . previous . cell , this . constraintHandler . currentFocus . cell ) , null == this . error ? this . currentState = this . constraintHandler . currentFocus : this . constraintHandler . reset ( ) ) ; else { this . graph . isIgnoreTerminalEvent ( a . getEvent ( ) ) ? ( this . marker . reset ( ) , this . currentState = null ) : ( this . marker . process ( a ) , this . currentState = this . marker . getValidState ( ) , null ==
this . currentState || this . isCellEnabled ( this . currentState . cell ) || ( this . currentState= null ) ) ;var c = this . isOutlineConnectEvent ( a ) ; null != this . currentState && c && ( a . isSource ( this . marker . highlight . shape ) && ( b = new mxPoint ( a . getGraphX ( ) , a . getGraphY ( ) ) ) , c = this . graph . getOutlineConstraint ( b , this . currentState , a ) , this . constraintHandler . setFocus ( a , this . currentState , ! 1 ) , this . constraintHandler . currentConstraint = c , this . constraintHandler . currentPoint = b ) ; this . outlineConnect && null != this . marker . highlight && null != this . marker . highlight . shape &&
( c = this . graph . view . scale , null != this . constraintHandler . currentConstraint && null != this . constraintHandler . currentFocus ? ( this . marker . highlight . shape . stroke = mxConstants . OUTLINE _HIGHLIGHT _COLOR , this . marker . highlight . shape . strokewidth = mxConstants . OUTLINE _HIGHLIGHT _STROKEWIDTH / c / c , this . marker . highlight . repaint ( ) ) : this . marker . hasValidState ( ) && ( this . marker . getValidState ( ) != a . getState ( ) ? ( this . marker . highlight . shape . stroke = "transparent" , this . currentState = null ) : this . marker . highlight . shape . stroke = mxConstants . DEFAULT _VALID _COLOR ,
this . marker . highlight . shape . strokewidth = mxConstants . HIGHLIGHT _STROKEWIDTH / c / c , this . marker . highlight . repaint ( ) ) ) } } ; mxConnectionHandler . prototype . isCellEnabled = function ( a ) { return ! 0 } ; mxConnectionHandler . prototype . convertWaypoint = function ( a ) { var b = this . graph . getView ( ) . getScale ( ) , c = this . graph . getView ( ) . getTranslate ( ) ; a . x = a . x / b - c . x ; a . y = a . y / b - c . y } ;
this . marker . highlight . repaint ( ) ) : this . marker . markCell ( this . constraintHandler . currentFocus . cell , "transparent" ) , null != this . previous && ( this . error = this . validateConnection ( this . previous . cell , this . constraintHandler . currentFocus . cell ) , null == this . error &&( this . currentState = this . constraintHandler . currentFocus ) , ( null != this . error || null != this . currentState && ! this . isCellEnabled ( this . currentState . cell ) ) && this . constraintHandler . reset ( ) ) ; else { this . graph . isIgnoreTerminalEvent ( a . getEvent ( ) ) ? ( this . marker . reset ( ) , this . currentState =
null ) : ( this . marker . process ( a ) , this . currentState = this . marker . getValidState ( ) ) ; null == this . currentState || this . isCellEnabled ( this . currentState . cell ) || ( this . constraintHandler. reset ( ) , this . marker . reset ( ) , this . currentState= null ) ;var c = this . isOutlineConnectEvent ( a ) ; null != this . currentState && c && ( a . isSource ( this . marker . highlight . shape ) && ( b = new mxPoint ( a . getGraphX ( ) , a . getGraphY ( ) ) ) , c = this . graph . getOutlineConstraint ( b , this . currentState , a ) , this . constraintHandler . setFocus ( a , this . currentState , ! 1 ) , this . constraintHandler . currentConstraint =
c , this . constraintHandler . currentPoint = b ) ; this . outlineConnect && null != this . marker . highlight && null != this . marker . highlight . shape && ( c = this . graph . view . scale , null != this . constraintHandler . currentConstraint && null != this . constraintHandler . currentFocus ? ( this . marker . highlight . shape . stroke = mxConstants . OUTLINE _HIGHLIGHT _COLOR , this . marker . highlight . shape . strokewidth = mxConstants . OUTLINE _HIGHLIGHT _STROKEWIDTH / c / c , this . marker . highlight . repaint ( ) ) : this . marker . hasValidState ( ) && ( this . marker . getValidState ( ) != a . getState ( ) ?
( this . marker . highlight . shape . stroke = "transparent" , this . currentState = null ) : this . marker . highlight . shape . stroke = mxConstants . DEFAULT _VALID _COLOR , this . marker . highlight . shape . strokewidth = mxConstants . HIGHLIGHT _STROKEWIDTH / c / c , this . marker . highlight . repaint ( ) ) ) } } ; mxConnectionHandler . prototype . isCellEnabled = function ( a ) { return ! 0 } ; mxConnectionHandler . prototype . convertWaypoint = function ( a ) { var b = this . graph . getView ( ) . getScale ( ) , c = this . graph . getView ( ) . getTranslate ( ) ; a . x = a . x / b - c . x ; a . y = a . y / b - c . y } ;
mxConnectionHandler . prototype . snapToPreview = function ( a , b ) { if ( ! mxEvent . isAltDown ( a . getEvent ( ) ) && null != this . previous ) { var c = this . graph . gridSize * this . graph . view . scale / 2 , d = null != this . sourceConstraint ? this . first : new mxPoint ( this . previous . getCenterX ( ) , this . previous . getCenterY ( ) ) ; Math . abs ( d . x - a . getGraphX ( ) ) < c && ( b . x = d . x ) ; Math . abs ( d . y - a . getGraphY ( ) ) < c && ( b . y = d . y ) } } ;
mxConnectionHandler . prototype . mouseMove = function ( a , b ) { if ( b . isConsumed ( ) || ! this . ignoreMouseDown && null == this . first && this . graph . isMouseDown ) this . constraintHandler . reset ( ) ; else { this . isEnabled ( ) || null == this . currentState || ( this . destroyIcons ( ) , this . currentState = null ) ; var c = this . graph . getView ( ) , d = c . scale , e = c . translate , c = new mxPoint ( b . getGraphX ( ) , b . getGraphY ( ) ) ; this . error = null ; this . graph . isGridEnabledEvent ( b . getEvent ( ) ) && ( c = new mxPoint ( ( this . graph . snap ( c . x / d - e . x ) + e . x ) * d , ( this . graph . snap ( c . y / d - e . y ) + e . y ) * d ) ) ;
this . snapToPreview ( b , c ) ; this . currentPoint = c ; ( null != this . first || this . isEnabled ( ) && this . graph . isEnabled ( ) ) && ( null != this . shape || null == this . first || Math . abs ( b . getGraphX ( ) - this . first . x ) > this . graph . tolerance || Math . abs ( b . getGraphY ( ) - this . first . y ) > this . graph . tolerance ) && this . updateCurrentState ( b , c ) ; if ( null != this . first ) { var f = null , d = c ; null != this . constraintHandler . currentConstraint && null != this . constraintHandler . currentFocus && null != this . constraintHandler . currentPoint ? ( f = this . constraintHandler . currentConstraint ,
@ -1584,8 +1586,8 @@ if(d.isVertex(a)&&!e.relative||d.isEdge(a))for(c=d.getChildCount(a),e=0;e<c;e++)
mxVertexHandler . prototype . reset = function ( ) { null != this . sizers && null != this . index && null != this . sizers [ this . index ] && "none" == this . sizers [ this . index ] . node . style . display && ( this . sizers [ this . index ] . node . style . display = "" ) ; this . index = this . inTolerance = this . currentAlpha = null ; null != this . preview && ( this . preview . destroy ( ) , this . preview = null ) ; if ( this . livePreviewActive && null != this . sizers ) { for ( var a = 0 ; a < this . sizers . length ; a ++ ) null != this . sizers [ a ] && ( this . sizers [ a ] . node . style . display = "" ) ; null != this . state . control && null !=
this . state . control . node && ( this . state . control . node . style . visibility = "" ) } if ( null != this . customHandles ) for ( a = 0 ; a < this . customHandles . length ; a ++ ) this . customHandles [ a ] . active ? ( this . customHandles [ a ] . active = ! 1 , this . customHandles [ a ] . reset ( ) ) : this . customHandles [ a ] . setVisible ( ! 0 ) ; null != this . selectionBorder && ( this . selectionBorder . node . style . display = "inline" , this . selectionBounds = this . getSelectionBounds ( this . state ) , this . bounds = new mxRectangle ( this . selectionBounds . x , this . selectionBounds . y , this . selectionBounds . width ,
this . selectionBounds . height ) , this . drawPreview ( ) ) ; this . removeHint ( ) ; this . redrawHandles ( ) ; this . livePreviewActive = this . unscaledBounds = this . edgeHandlers = null } ;
mxVertexHandler . prototype . resizeCell = function ( a , b , c , d , e , f , g ) { e = this . graph . model . getGeometry ( a ) ; null != e && ( d == mxEvent . LABEL _HANDLE ? ( c = this . graph . view . scale , b= Math . round ( ( this . labelShape . bounds . getCenterX ( ) - this . startX ) / c) , c = Math . round ( ( this . labelShape . bounds . getCenterY ( ) - this . startY ) / c) , e = e . clone ( ) , null == e . offset ? e . offset = new mxPoint ( b , c ) : ( e . offset . x += b , e . offset . y += c ) , this . graph . model . setGeometry ( a , e ) ) : null != this . unscaledBounds && ( c = this . graph . view . scale , 0 == this . childOffsetX && 0 == this . childOffsetY || this . moveChildren ( a ,
Math . round ( this . childOffsetX / c ) , Math . round ( this . childOffsetY / c ) ) , this . graph . resizeCell ( a , this . unscaledBounds , g ) ) ) } ; mxVertexHandler . prototype . moveChildren = function ( a , b , c ) { for ( var d = this . graph . getModel ( ) , e = d . getChildCount ( a ) , f = 0 ; f < e ; f ++ ) { var g = d . getChildAt ( a , f ) , k = this . graph . getCellGeometry ( g ) ; null != k && ( k = k . clone ( ) , k . translate ( b , c ) , d . setGeometry ( g , k ) ) } } ;
mxVertexHandler . prototype . resizeCell = function ( a , b , c , d , e , f , g ) { b = this . graph . model . getGeometry ( a ) ; null != b && ( d == mxEvent . LABEL _HANDLE ? ( d= - mxUtils . toRadians ( this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) , g = Math . cos ( d ) , c = Math . sin ( d ) , d = this . graph . view . scale , g= mxUtils . getRotatedPoint ( new mxPoint ( Math . round ( ( this . labelShape . bounds . getCenterX ( ) - this . startX ) / d) , Math . round ( ( this . labelShape . bounds . getCenterY ( ) - this . startY ) / d) ) , g , c ) , b = b . clone ( ) , null == b . offset ? b . offset = g : ( b . offset . x += g . x , b . offset . y += g . y ) , this . graph . model . setGeometry ( a ,
b ) ) : null != this . unscaledBounds && ( d = this . graph . view . scale , 0 == this . childOffsetX && 0 == this . childOffsetY || this . moveChildren ( a , Math . round ( this . childOffsetX / d ) , Math . round ( this . childOffsetY / d ) ) , this . graph . resizeCell ( a , this . unscaledBounds , g ) ) ) } ; mxVertexHandler . prototype . moveChildren = function ( a , b , c ) { for ( var d = this . graph . getModel ( ) , e = d . getChildCount ( a ) , f = 0 ; f < e ; f ++ ) { var g = d . getChildAt ( a , f ) , k = this . graph . getCellGeometry ( g ) ; null != k && ( k = k . clone ( ) , k . translate ( b , c ) , d . setGeometry ( g , k ) ) } } ;
mxVertexHandler . prototype . union = function ( a , b , c , d , e , f , g , k , l ) { e = null != e ? e && this . graph . gridEnabled : this . graph . gridEnabled ; if ( this . singleSizer ) return d = a . x + a . width + b , g = a . y + a . height + c , e && ( d = this . graph . snap ( d / f ) * f , g = this . graph . snap ( g / f ) * f ) , f = new mxRectangle ( a . x , a . y , 0 , 0 ) , f . add ( new mxRectangle ( d , g , 0 , 0 ) ) , f ; var m = a . width , n = a . height , p = a . x - g . x * f , q = p + m ; a = a . y - g . y * f ; var r = a + n , t = p + m / 2 , u = a + n / 2 ; 4 < d ? ( r += c , r = e ? this . graph . snap ( r / f ) * f : Math . round ( r / f ) * f ) : 3 > d && ( a += c , a = e ? this . graph . snap ( a / f ) * f : Math . round ( a / f ) * f ) ; if ( 0 == d ||
3 == d || 5 == d ) p += b , p = e ? this . graph . snap ( p / f ) * f : Math . round ( p / f ) * f ; else if ( 2 == d || 4 == d || 7 == d ) q += b , q = e ? this . graph . snap ( q / f ) * f : Math . round ( q / f ) * f ; e = q - p ; c = r - a ; k && ( k = this . graph . getCellGeometry ( this . state . cell ) , null != k && ( k = k . width / k . height , 1 == d || 2 == d || 7 == d || 6 == d ? e = c * k : c = e / k , 0 == d && ( p = q - e , a = r - c ) ) ) ; l && ( e += e - m , c += c - n , p += t - ( p + e / 2 ) , a += u - ( a + c / 2 ) ) ; 0 > e && ( p += e , e = Math . abs ( e ) ) ; 0 > c && ( a += c , c = Math . abs ( c ) ) ; d = new mxRectangle ( p + g . x * f , a + g . y * f , e , c ) ; null != this . minBounds && ( d . width = Math . max ( d . width , this . minBounds . x * f + this . minBounds . width *
f + Math . max ( 0 , this . x0 * f - d . x ) ) , d . height = Math . max ( d . height , this . minBounds . y * f + this . minBounds . height * f + Math . max ( 0 , this . y0 * f - d . y ) ) ) ; return d } ; mxVertexHandler . prototype . redraw = function ( a ) { this . selectionBounds = this . getSelectionBounds ( this . state ) ; this . bounds = new mxRectangle ( this . selectionBounds . x , this . selectionBounds . y , this . selectionBounds . width , this . selectionBounds . height ) ; this . drawPreview ( ) ; a || this . redrawHandles ( ) } ;
@ -1594,10 +1596,10 @@ mxVertexHandler.prototype.redrawHandles=function(){var a=this.tolerance;this.ver
this . verticalOffset / 2 , b . height += this . verticalOffset ; 8 <= this . sizers . length && ( b . width < 2 * this . sizers [ 0 ] . bounds . width + 2 * a || b . height < 2 * this . sizers [ 0 ] . bounds . height + 2 * a ? ( this . sizers [ 0 ] . node . style . display = "none" , this . sizers [ 2 ] . node . style . display = "none" , this . sizers [ 5 ] . node . style . display = "none" , this . sizers [ 7 ] . node . style . display = "none" ) : ( this . sizers [ 0 ] . node . style . display = "" , this . sizers [ 2 ] . node . style . display = "" , this . sizers [ 5 ] . node . style . display = "" , this . sizers [ 7 ] . node . style . display = "" ) ) } a = b . x + b . width ; c = b . y + b . height ;
if ( this . singleSizer ) this . moveSizerTo ( this . sizers [ 0 ] , a , c ) ; else { var d = b . x + b . width / 2 , e = b . y + b . height / 2 ; if ( 8 <= this . sizers . length ) { var f = "nw-resize n-resize ne-resize e-resize se-resize s-resize sw-resize w-resize" . split ( " " ) , g = mxUtils . toRadians ( this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) , k = Math . cos ( g ) , l = Math . sin ( g ) , g = Math . round ( 4 * g / Math . PI ) , m = new mxPoint ( b . getCenterX ( ) , b . getCenterY ( ) ) , n = mxUtils . getRotatedPoint ( new mxPoint ( b . x , b . y ) , k , l , m ) ; this . moveSizerTo ( this . sizers [ 0 ] , n . x , n . y ) ; this . sizers [ 0 ] . setCursor ( f [ mxUtils . mod ( 0 +
g , f . length ) ] ) ; n . x = d ; n . y = b . y ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 1 ] , n . x , n . y ) ; this . sizers [ 1 ] . setCursor ( f [ mxUtils . mod ( 1 + g , f . length ) ] ) ; n . x = a ; n . y = b . y ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 2 ] , n . x , n . y ) ; this . sizers [ 2 ] . setCursor ( f [ mxUtils . mod ( 2 + g , f . length ) ] ) ; n . x = b . x ; n . y = e ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 3 ] , n . x , n . y ) ; this . sizers [ 3 ] . setCursor ( f [ mxUtils . mod ( 7 + g , f . length ) ] ) ; n . x = a ; n . y = e ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 4 ] ,
n . x , n . y ) ; this . sizers [ 4 ] . setCursor ( f [ mxUtils . mod ( 3 + g , f . length ) ] ) ; n . x = b . x ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 5 ] , n . x , n . y ) ; this . sizers [ 5 ] . setCursor ( f [ mxUtils . mod ( 6 + g , f . length ) ] ) ; n . x = d ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 6 ] , n . x , n . y ) ; this . sizers [ 6 ] . setCursor ( f [ mxUtils . mod ( 5 + g , f . length ) ] ) ; n . x = a ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 7 ] , n . x , n . y ) ; this . sizers [ 7 ] . setCursor ( f [ mxUtils . mod ( 4 + g , f . length ) ] ) ; this . moveSizerTo ( this . sizers [ 8 ] ,
d + this . state . absoluteOffset . x , e + this . state . absoluteOffset . y )} else 2 <= this . state . width && 2 <= this . state . height ? this . moveSizerTo ( this . sizers [ 0 ] , d + this . state . absoluteOffset . x , e + this . state . absoluteOffset . y ) : this . moveSizerTo ( this . sizers [ 0 ] , this . state . x , this . state . y ) } } null != this . rotationShape && ( g = mxUtils . toRadians ( null != this . currentAlpha ? this . currentAlpha : this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) , k = Math . cos ( g ) , l = Math . sin ( g ) , m = new mxPoint ( this . state . getCenterX ( ) , this . state . getCenterY ( ) ) , n = mxUtils . getRotatedPoint ( this . getRotationHandlePosition ( ) ,
k , l , m ) , null != this . rotationShape . node && ( this . moveSizerTo ( this . rotationShape , n . x , n . y ) , this . rotationShape . node . style . visibility = this . state . view . graph . isEditing ( ) ? "hidden" : "" ) ) ; null != this . selectionBorder && ( this . selectionBorder . rotation = Number ( this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) ) ; if ( null != this . edgeHandlers ) for ( b = 0 ; b < this . edgeHandlers . length ; b ++ ) this . edgeHandlers [ b ] . redraw ( ) ; if ( null != this . customHandles ) for ( b = 0 ; b < this . customHandles . length ; b ++ ) a = this . customHandles [ b ] . shape . node . style . display ,
this . customHandles [ b ] . redraw ( ) , this . customHandles [ b ] . shape . node . style . display = a , this . customHandles [ b ] . shape . node . style . visibility = this . graph . isEditing ( ) ? "hidden" : "" ; this . updateParentHighlight ( ) } ; mxVertexHandler . prototype . getRotationHandlePosition = function ( ) { return new mxPoint ( this . bounds . x + this . bounds . width / 2 , this . bounds . y + this . rotationHandleVSpacing ) } ;
n . x , n . y ) ; this . sizers [ 4 ] . setCursor ( f [ mxUtils . mod ( 3 + g , f . length ) ] ) ; n . x = b . x ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 5 ] , n . x , n . y ) ; this . sizers [ 5 ] . setCursor ( f [ mxUtils . mod ( 6 + g , f . length ) ] ) ; n . x = d ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 6 ] , n . x , n . y ) ; this . sizers [ 6 ] . setCursor ( f [ mxUtils . mod ( 5 + g , f . length ) ] ) ; n . x = a ; n . y = c ; n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 7 ] , n . x , n . y ) ; this . sizers [ 7 ] . setCursor ( f [ mxUtils . mod ( 4 + g , f . length ) ] ) ; n . x = d +
this . state . absoluteOffset . x ;n . y = e + this . state . absoluteOffset . y ;n = mxUtils . getRotatedPoint ( n , k , l , m ) ; this . moveSizerTo ( this . sizers [ 8 ] , n . x , n . y )} else 2 <= this . state . width && 2 <= this . state . height ? this . moveSizerTo ( this . sizers [ 0 ] , d + this . state . absoluteOffset . x , e + this . state . absoluteOffset . y ) : this . moveSizerTo ( this . sizers [ 0 ] , this . state . x , this . state . y ) } } null != this . rotationShape && ( g = mxUtils . toRadians ( null != this . currentAlpha ? this . currentAlpha : this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) , k = Math . cos ( g ) , l = Math . sin ( g ) ,
m = new mxPoint ( this . state . getCenterX ( ) , this . state . getCenterY ( ) ) , n = mxUtils . getRotatedPoint ( this . getRotationHandlePosition ( ) , k , l , m ) , null != this . rotationShape . node && ( this . moveSizerTo ( this . rotationShape , n . x , n . y ) , this . rotationShape . node . style . visibility = this . state . view . graph . isEditing ( ) ? "hidden" : "" ) ) ; null != this . selectionBorder && ( this . selectionBorder . rotation = Number ( this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) ) ; if ( null != this . edgeHandlers ) for ( b = 0 ; b < this . edgeHandlers . length ; b ++ ) this . edgeHandlers [ b ] . redraw ( ) ;
if ( null != this . customHandles ) for ( b = 0 ; b < this . customHandles . length ; b ++ ) a = this . customHandles [ b ] . shape . node . style . display , this . customHandles [ b ] . redraw ( ) , this . customHandles [ b ] . shape . node . style . display = a , this . customHandles [ b ] . shape . node . style . visibility = this . graph . isEditing ( ) ? "hidden" : "" ; this . updateParentHighlight ( ) } ; mxVertexHandler . prototype . getRotationHandlePosition = function ( ) { return new mxPoint ( this . bounds . x + this . bounds . width / 2 , this . bounds . y + this . rotationHandleVSpacing ) } ;
mxVertexHandler . prototype . updateParentHighlight = function ( ) { if ( null != this . selectionBorder ) if ( null != this . parentHighlight ) { var a = this . graph . model . getParent ( this . state . cell ) ; if ( this . graph . model . isVertex ( a ) ) { var a = this . graph . view . getState ( a ) , b = this . parentHighlight . bounds ; null == a || b . x == a . x && b . y == a . y && b . width == a . width && b . height == a . height || ( this . parentHighlight . bounds = a , this . parentHighlight . redraw ( ) ) } else this . parentHighlight . destroy ( ) , this . parentHighlight = null } else this . parentHighlightEnabled && ( a = this . graph . model . getParent ( this . state . cell ) ,
this . graph . model . isVertex ( a ) && ( a = this . graph . view . getState ( a ) , null != a && ( this . parentHighlight = this . createParentHighlightShape ( a ) , this . parentHighlight . dialect = this . graph . dialect != mxConstants . DIALECT _SVG ? mxConstants . DIALECT _VML : mxConstants . DIALECT _SVG , this . parentHighlight . pointerEvents = ! 1 , this . parentHighlight . rotation = Number ( a . style [ mxConstants . STYLE _ROTATION ] || "0" ) , this . parentHighlight . init ( this . graph . getView ( ) . getOverlayPane ( ) ) ) ) ) } ;
mxVertexHandler . prototype . drawPreview = function ( ) { null != this . preview && ( this . preview . bounds = this . bounds , this . preview . node . parentNode == this . graph . container && ( this . preview . bounds . width = Math . max ( 0 , this . preview . bounds . width - 1 ) , this . preview . bounds . height = Math . max ( 0 , this . preview . bounds . height - 1 ) ) , this . preview . rotation = Number ( this . state . style [ mxConstants . STYLE _ROTATION ] || "0" ) , this . preview . redraw ( ) ) ; this . selectionBorder . bounds = this . bounds ; this . selectionBorder . redraw ( ) ; null != this . parentHighlight && this . parentHighlight . redraw ( ) } ;
@ -1609,9 +1611,10 @@ mxEdgeHandler.prototype.init=function(){this.graph=this.state.view.graph;this.ma
mxEvent . redirectMouseEvents ( this . shape . node , this . graph , this . state ) ; this . preferHtml = null != this . state . text && this . state . text . node . parentNode == this . graph . container ; if ( ! this . preferHtml ) { var a = this . state . getVisibleTerminalState ( ! 0 ) ; null != a && ( this . preferHtml = null != a . text && a . text . node . parentNode == this . graph . container ) ; this . preferHtml || ( a = this . state . getVisibleTerminalState ( ! 1 ) , null != a && ( this . preferHtml = null != a . text && a . text . node . parentNode == this . graph . container ) ) } this . parentHighlightEnabled && ( a = this . graph . model . getParent ( this . state . cell ) ,
this . graph . model . isVertex ( a ) && ( a = this . graph . view . getState ( a ) , null != a && ( this . parentHighlight = this . createParentHighlightShape ( a ) , this . parentHighlight . dialect = this . graph . dialect != mxConstants . DIALECT _SVG ? mxConstants . DIALECT _VML : mxConstants . DIALECT _SVG , this . parentHighlight . pointerEvents = ! 1 , this . parentHighlight . rotation = Number ( a . style [ mxConstants . STYLE _ROTATION ] || "0" ) , this . parentHighlight . init ( this . graph . getView ( ) . getOverlayPane ( ) ) ) ) ) ; if ( this . graph . getSelectionCount ( ) < mxGraphHandler . prototype . maxCells ||
0 >= mxGraphHandler . prototype . maxCells ) this . bends = this . createBends ( ) , this . isVirtualBendsEnabled ( ) && ( this . virtualBends = this . createVirtualBends ( ) ) ; this . label = new mxPoint ( this . state . absoluteOffset . x , this . state . absoluteOffset . y ) ; this . labelShape = this . createLabelHandleShape ( ) ; this . initBend ( this . labelShape ) ; this . labelShape . setCursor ( mxConstants . CURSOR _LABEL _HANDLE ) ; this . customHandles = this . createCustomHandles ( ) ; this . redraw ( ) } ; mxEdgeHandler . prototype . createCustomHandles = function ( ) { return null } ;
mxEdgeHandler . prototype . isVirtualBendsEnabled = function ( a ) { return this . virtualBendsEnabled && ( null == this . state . style [ mxConstants . STYLE _EDGE ] || this . state . style [ mxConstants . STYLE _EDGE ] == mxConstants . NONE || 1 == this . state . style [ mxConstants . STYLE _NOEDGESTYLE ] ) && "arrow" != mxUtils . getValue ( this . state . style , mxConstants . STYLE _SHAPE , null ) } ; mxEdgeHandler . prototype . isAddPointEvent = function ( a ) { return mxEvent . isShiftDown ( a ) } ; mxEdgeHandler . prototype . isRemovePointEvent = function ( a ) { return mxEvent . isShiftDown ( a ) } ;
mxEdgeHandler . prototype . getSelectionPoints = function ( a ) { return a . absolutePoints } ; mxEdgeHandler . prototype . createParentHighlightShape = function ( a ) { a = new mxRectangleShape ( a , null , this . getSelectionColor ( ) ) ; a . strokewidth = this . getSelectionStrokeWidth ( ) ; a . isDashed = this . isSelectionDashed ( ) ; return a } ; mxEdgeHandler . prototype . createSelectionShape = function ( a ) { a = new this . state . shape . constructor ; a . outline = ! 0 ; a . apply ( this . state ) ; a . isDashed = this . isSelectionDashed ( ) ; a . stroke = this . getSelectionColor ( ) ; a . isShadow = ! 1 ; return a } ;
mxEdgeHandler . prototype . getSelectionColor = function ( ) { return mxConstants . EDGE _SELECTION _COLOR } ; mxEdgeHandler . prototype . getSelectionStrokeWidth = function ( ) { return mxConstants . EDGE _SELECTION _STROKEWIDTH } ; mxEdgeHandler . prototype . isSelectionDashed = function ( ) { return mxConstants . EDGE _SELECTION _DASHED } ; mxEdgeHandler . prototype . isConnectableCell = function ( a ) { return ! 0 } ; mxEdgeHandler . prototype . getCellAt = function ( a , b ) { return this . outlineConnect ? null : this . graph . getCellAt ( a , b ) } ;
mxEdgeHandler . prototype . isVirtualBendsEnabled = function ( a ) { return this . virtualBendsEnabled && ( null == this . state . style [ mxConstants . STYLE _EDGE ] || this . state . style [ mxConstants . STYLE _EDGE ] == mxConstants . NONE || 1 == this . state . style [ mxConstants . STYLE _NOEDGESTYLE ] ) && "arrow" != mxUtils . getValue ( this . state . style , mxConstants . STYLE _SHAPE , null ) } ; mxEdgeHandler . prototype . isCellEnabled = function ( a ) { return ! 0 } ; mxEdgeHandler . prototype . isAddPointEvent = function ( a ) { return mxEvent . isShiftDown ( a ) } ;
mxEdgeHandler . prototype . isRemovePointEvent = function ( a ) { return mxEvent . isShiftDown ( a ) } ; mxEdgeHandler . prototype . getSelectionPoints = function ( a ) { return a . absolutePoints } ; mxEdgeHandler . prototype . createParentHighlightShape = function ( a ) { a = new mxRectangleShape ( a , null , this . getSelectionColor ( ) ) ; a . strokewidth = this . getSelectionStrokeWidth ( ) ; a . isDashed = this . isSelectionDashed ( ) ; return a } ;
mxEdgeHandler . prototype . createSelectionShape = function ( a ) { a = new this . state . shape . constructor ; a . outline = ! 0 ; a . apply ( this . state ) ; a . isDashed = this . isSelectionDashed ( ) ; a . stroke = this . getSelectionColor ( ) ; a . isShadow = ! 1 ; return a } ; mxEdgeHandler . prototype . getSelectionColor = function ( ) { return mxConstants . EDGE _SELECTION _COLOR } ; mxEdgeHandler . prototype . getSelectionStrokeWidth = function ( ) { return mxConstants . EDGE _SELECTION _STROKEWIDTH } ; mxEdgeHandler . prototype . isSelectionDashed = function ( ) { return mxConstants . EDGE _SELECTION _DASHED } ;
mxEdgeHandler . prototype . isConnectableCell = function ( a ) { return ! 0 } ; mxEdgeHandler . prototype . getCellAt = function ( a , b ) { return this . outlineConnect ? null : this . graph . getCellAt ( a , b ) } ;
mxEdgeHandler . prototype . createMarker = function ( ) { var a = new mxCellMarker ( this . graph ) , b = this ; a . getCell = function ( a ) { var c = mxCellMarker . prototype . getCell . apply ( this , arguments ) ; c != b . state . cell && null != c || null == b . currentPoint || ( c = b . graph . getCellAt ( b . currentPoint . x , b . currentPoint . y ) ) ; if ( null != c && ! this . graph . isCellConnectable ( c ) ) { var e = this . graph . getModel ( ) . getParent ( c ) ; this . graph . getModel ( ) . isVertex ( e ) && this . graph . isCellConnectable ( e ) && ( c = e ) } e = b . graph . getModel ( ) ; if ( this . graph . isSwimlane ( c ) && null != b . currentPoint &&
this . graph . hitsSwimlaneContent ( c , b . currentPoint . x , b . currentPoint . y ) || ! b . isConnectableCell ( c ) || c == b . state . cell || null != c && ! b . graph . connectableEdges && e . isEdge ( c ) || e . isAncestor ( b . state . cell , c ) ) c = null ; this . graph . isCellConnectable ( c ) || ( c = null ) ; return c } ; a . isValidState = function ( a ) { var c = b . graph . getModel ( ) , c = b . graph . view . getTerminalPort ( a , b . graph . view . getState ( c . getTerminal ( b . state . cell , ! b . isSource ) ) , ! b . isSource ) , c = null != c ? c . cell : null ; b . error = b . validateConnection ( b . isSource ? a . cell : c , b . isSource ? c : a . cell ) ;
return null == b . error } ; return a } ; mxEdgeHandler . prototype . validateConnection = function ( a , b ) { return this . graph . getEdgeValidationError ( this . state . cell , a , b ) } ;
@ -1633,8 +1636,8 @@ mxEdgeHandler.prototype.isSnapToTerminalsEvent=function(a){return this.snapToTer
mxEdgeHandler . prototype . getPointForEvent = function ( a ) { var b = this . graph . getView ( ) , c = b . scale , d = new mxPoint ( this . roundLength ( a . getGraphX ( ) / c ) * c , this . roundLength ( a . getGraphY ( ) / c ) * c ) , e = this . getSnapToTerminalTolerance ( ) , f = ! 1 , g = ! 1 ; if ( 0 < e && this . isSnapToTerminalsEvent ( a ) ) { var k = function ( a ) { null != a && l . call ( this , new mxPoint ( b . getRoutingCenterX ( a ) , b . getRoutingCenterY ( a ) ) ) } , l = function ( a ) { if ( null != a ) { var b = a . x ; Math . abs ( d . x - b ) < e && ( d . x = b , f = ! 0 ) ; a = a . y ; Math . abs ( d . y - a ) < e && ( d . y = a , g = ! 0 ) } } ; k . call ( this , this . state . getVisibleTerminalState ( ! 0 ) ) ;
k . call ( this , this . state . getVisibleTerminalState ( ! 1 ) ) ; if ( null != this . state . absolutePoints ) for ( k = 0 ; k < this . state . absolutePoints . length ; k ++ ) l . call ( this , this . state . absolutePoints [ k ] ) } this . graph . isGridEnabledEvent ( a . getEvent ( ) ) && ( a = b . translate , f || ( d . x = ( this . graph . snap ( d . x / c - a . x ) + a . x ) * c ) , g || ( d . y = ( this . graph . snap ( d . y / c - a . y ) + a . y ) * c ) ) ; return d } ;
mxEdgeHandler . prototype . getPreviewTerminalState = function ( a ) { this . constraintHandler . update ( a , this . isSource , ! 0 , a . isSource ( this . marker . highlight . shape ) ? null : this . currentPoint ) ; if ( null != this . constraintHandler . currentFocus && null != this . constraintHandler . currentConstraint ) return null != this . marker . highlight && null != this . marker . highlight . state && this . marker . highlight . state . cell == this . constraintHandler . currentFocus . cell ? "transparent" != this . marker . highlight . shape . stroke && ( this . marker . highlight . shape . stroke = "transparent" ,
this . marker . highlight . repaint ( ) ) : this . marker . markCell ( this . constraintHandler . currentFocus . cell , "transparent" ) , a = this . graph . getModel ( ) , a = this . graph . view . getTerminalPort ( this . state , this . graph . view . getState ( a . getTerminal ( this . state . cell , ! this . isSource ) ) , ! this . isSource ) , a = null != a ? a . cell : null , this . error = this . validateConnection ( this . isSource ? this . constraintHandler . currentFocus . cell : a , this . isSource ? a : this . constraintHandler . currentFocus . cell ) , a = null , null == this . error ?a = this . constraintHandler . currentFocus :
this . constraintHandler . reset ( ) , a ; if ( this . graph . isIgnoreTerminalEvent ( a . getEvent ( ) ) ) return this . marker . reset ( ) , null ; this . marker . process ( a ) ; a = this . marker . getValidState ( ) ; null !=a && this . graph . isCellLocked ( a . cell ) && this . marker . reset ( ) ;return this . marker . getValidState ( ) } ;
this . marker . highlight . repaint ( ) ) : this . marker . markCell ( this . constraintHandler . currentFocus . cell , "transparent" ) , a = this . graph . getModel ( ) , a = this . graph . view . getTerminalPort ( this . state , this . graph . view . getState ( a . getTerminal ( this . state . cell , ! this . isSource ) ) , ! this . isSource ) , a = null != a ? a . cell : null , this . error = this . validateConnection ( this . isSource ? this . constraintHandler . currentFocus . cell : a , this . isSource ? a : this . constraintHandler . currentFocus . cell ) , a = null , null == this . error &&( a = this . constraintHandler . currentFocus ) ,
( null != this . error || null != a && ! this . isCellEnabled ( a . cell ) ) && this . constraintHandler . reset ( ) , a ; if ( this . graph . isIgnoreTerminalEvent ( a . getEvent ( ) ) ) return this . marker . reset ( ) , null ; this . marker . process ( a ) ; a = this . marker . getValidState ( ) ; null ==a || this . isCellEnabled ( a . cell ) || ( this . constraintHandler . reset ( ) , this . marker . reset ( ) ) ;return this . marker . getValidState ( ) } ;
mxEdgeHandler . prototype . getPreviewPoints = function ( a , b ) { var c = this . graph . getCellGeometry ( this . state . cell ) , c = null != c . points ? c . points . slice ( ) : null , d = new mxPoint ( a . x , a . y ) , e = null ; if ( this . isSource || this . isTarget ) this . graph . resetEdgesOnConnect && ( c = null ) ; else if ( this . convertPoint ( d , ! 1 ) , null == c ) c = [ d ] ; else { this . index <= mxEvent . VIRTUAL _HANDLE && c . splice ( mxEvent . VIRTUAL _HANDLE - this . index , 0 , d ) ; if ( ! this . isSource && ! this . isTarget ) { for ( var f = 0 ; f < this . bends . length ; f ++ ) if ( f != this . index ) { var g = this . bends [ f ] ; null != g && mxUtils . contains ( g . bounds ,
a . x , a . y ) && ( this . index <= mxEvent . VIRTUAL _HANDLE ? c . splice ( mxEvent . VIRTUAL _HANDLE - this . index , 1 ) : c . splice ( this . index - 1 , 1 ) , e = c ) } if ( null == e && this . straightRemoveEnabled && ( null == b || ! mxEvent . isAltDown ( b . getEvent ( ) ) ) ) { f = this . graph . tolerance * this . graph . tolerance ; g = this . state . absolutePoints . slice ( ) ; g [ this . index ] = a ; var k = this . state . getVisibleTerminalState ( ! 0 ) ; if ( null != k ) { var l = this . graph . getConnectionConstraint ( this . state , k , ! 0 ) ; if ( null == l || null == this . graph . getConnectionPoint ( k , l ) ) g [ 0 ] = new mxPoint ( k . view . getRoutingCenterX ( k ) ,
k . view . getRoutingCenterY ( k ) ) } k = this . state . getVisibleTerminalState ( ! 1 ) ; null != k && ( l = this . graph . getConnectionConstraint ( this . state , k , ! 1 ) , null == l || null == this . graph . getConnectionPoint ( k , l ) ) && ( g [ g . length - 1 ] = new mxPoint ( k . view . getRoutingCenterX ( k ) , k . view . getRoutingCenterY ( k ) ) ) ; l = this . index ; 0 < l && l < g . length - 1 && mxUtils . ptSegDistSq ( g [ l - 1 ] . x , g [ l - 1 ] . y , g [ l + 1 ] . x , g [ l + 1 ] . y , a . x , a . y ) < f && ( c . splice ( l - 1 , 1 ) , e = c ) } } null == e && this . index > mxEvent . VIRTUAL _HANDLE && ( c [ this . index - 1 ] = d ) } return null != e ? e : c } ;
@ -1647,7 +1650,7 @@ m.point.y):(delete a.style[this.isSource?mxConstants.STYLE_EXIT_X:mxConstants.ST
this . graph . allowDanglingEdges ? null : "" ) ) ; a . view . updatePoints ( a , this . points , f , g ) ; a . view . updateFloatingTerminalPoints ( a , f , g ) } ;
mxEdgeHandler . prototype . mouseMove = function ( a , b ) { if ( null != this . index && null != this . marker ) { this . currentPoint = this . getPointForEvent ( b ) ; this . error = null ; ! this . graph . isIgnoreTerminalEvent ( b . getEvent ( ) ) && mxEvent . isShiftDown ( b . getEvent ( ) ) && null != this . snapPoint && ( Math . abs ( this . snapPoint . x - this . currentPoint . x ) < Math . abs ( this . snapPoint . y - this . currentPoint . y ) ? this . currentPoint . x = this . snapPoint . x : this . currentPoint . y = this . snapPoint . y ) ; if ( this . index <= mxEvent . CUSTOM _HANDLE && this . index > mxEvent . VIRTUAL _HANDLE ) null !=
this . customHandles && this . customHandles [ mxEvent . CUSTOM _HANDLE - this . index ] . processEvent ( b ) ; else if ( this . isLabel ) this . label . x = this . currentPoint . x , this . label . y = this . currentPoint . y ; else { this . points = this . getPreviewPoints ( this . currentPoint , b ) ; var c = this . isSource || this . isTarget ? this . getPreviewTerminalState ( b ) : null ; if ( null != this . constraintHandler . currentConstraint && null != this . constraintHandler . currentFocus && null != this . constraintHandler . currentPoint ) this . currentPoint = this . constraintHandler . currentPoint . clone ( ) ;
else if ( this . outlineConnect ) { var d = this . isSource || this . isTarget ? this . isOutlineConnectEvent ( b ) : ! 1 ; d ? c = this . marker . highlight . state : null != c && c != b . getState ( ) && null != this . marker . highlight . shape && ( this . marker . highlight . shape . stroke = "transparent" , this . marker . highlight . repaint ( ) , c = null ) } null !=c && this . graph . isCellLocked ( c . cell ) && ( c = null , this . marker . reset ( ) ) ; var e = this . clonePreviewState ( this . currentPoint , null != c ? c . cell : null ) ; this . updatePreviewState ( e , this . currentPoint , c , b , d ) ; this . setPreviewColor ( null == this . error ?
else if ( this . outlineConnect ) { var d = this . isSource || this . isTarget ? this . isOutlineConnectEvent ( b ) : ! 1 ; d ? c = this . marker . highlight . state : null != c && c != b . getState ( ) && null != this . marker . highlight . shape && ( this . marker . highlight . shape . stroke = "transparent" , this . marker . highlight . repaint ( ) , c = null ) } null ==c || this . isCellEnabled ( c . cell ) || ( c = null , this . marker . reset ( ) ) ; var e = this . clonePreviewState ( this . currentPoint , null != c ? c . cell : null ) ; this . updatePreviewState ( e , this . currentPoint , c , b , d ) ; this . setPreviewColor ( null == this . error ?
this . marker . validColor : this . marker . invalidColor ) ; this . abspoints = e . absolutePoints ; this . active = ! 0 } this . updateHint ( b , this . currentPoint ) ; this . drawPreview ( ) ; mxEvent . consume ( b . getEvent ( ) ) ; b . consume ( ) } else mxClient . IS _IE && null != this . getHandleForEvent ( b ) && b . consume ( ! 1 ) } ;
mxEdgeHandler . prototype . mouseUp = function ( a , b ) { if ( null != this . index && null != this . marker ) { var c = this . state . cell , d = this . index ; this . index = null ; if ( b . getX ( ) != this . startX || b . getY ( ) != this . startY ) { var e = ! this . graph . isIgnoreTerminalEvent ( b . getEvent ( ) ) && this . graph . isCloneEvent ( b . getEvent ( ) ) && this . cloneEnabled && this . graph . isCellsCloneable ( ) ; if ( null != this . error ) 0 < this . error . length && this . graph . validationAlert ( this . error ) ; else if ( d <= mxEvent . CUSTOM _HANDLE && d > mxEvent . VIRTUAL _HANDLE ) { if ( null != this . customHandles ) { var f =
this . graph . getModel ( ) ; f . beginUpdate ( ) ; try { this . customHandles [ mxEvent . CUSTOM _HANDLE - d ] . execute ( ) } finally { f . endUpdate ( ) } } } else if ( this . isLabel ) this . moveLabel ( this . state , this . label . x , this . label . y ) ; else if ( this . isSource || this . isTarget ) if ( d = null , null != this . constraintHandler . currentConstraint && null != this . constraintHandler . currentFocus && ( d = this . constraintHandler . currentFocus . cell ) , null == d && this . marker . hasValidState ( ) && null != this . marker . highlight && null != this . marker . highlight . shape && "transparent" != this . marker . highlight . shape . stroke &&