2015-11-19 17:20:22 +01:00
// rev 452
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Author : Angus Johnson *
* Version : 6.1 . 3 a *
* Date : 22 January 2014 *
* Website : http : //www.angusj.com *
* Copyright : Angus Johnson 2010 - 2014 *
* *
* License : *
* Use , modification & distribution is subject to Boost Software License Ver 1. *
* http : //www.boost.org/LICENSE_1_0.txt *
* *
* Attributions : *
* The code in this library is an extension of Bala Vatti ' s clipping algorithm : *
* "A generic solution to polygon clipping" *
* Communications of the ACM , Vol 35 , Issue 7 ( July 1992 ) pp 56 - 63. *
* http : //portal.acm.org/citation.cfm?id=129906 *
* *
* Computer graphics and geometric modeling : implementation and algorithms *
* By Max K . Agoston *
* Springer ; 1 edition ( January 4 , 2005 ) *
* http : //books.google.com/books?q=vatti+clipping+agoston *
* *
* See also : *
* "Polygon Offsetting by Computing Winding Numbers" *
* Paper no . DETC2005 - 85513 pp . 565 - 575 *
* ASME 2005 International Design Engineering Technical Conferences *
* and Computers and Information in Engineering Conference ( IDETC / CIE2005 ) *
* September 24 - 28 , 2005 , Long Beach , California , USA *
* http : //www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Author : Timo *
* Version : 6.1 . 3.2 *
* Date : 1 February 2014 *
* *
* This is a translation of the C # Clipper library to Javascript . *
* Int128 struct of C # is implemented using JSBN of Tom Wu . *
* Because Javascript lacks support for 64 - bit integers , the space *
* is a little more restricted than in C # version . *
* *
* C # version has support for coordinate space : *
* + - 4611686018427387903 ( sqrt ( 2 ^ 127 - 1 ) / 2 ) *
* while Javascript version has support for space : *
* + - 4503599627370495 ( sqrt ( 2 ^ 106 - 1 ) / 2 ) *
* *
* Tom Wu ' s JSBN proved to be the fastest big integer library : *
* http : //jsperf.com/big-integer-library-test *
* *
* This class can be made simpler when ( if ever ) 64 - bit integer support comes . *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Basic JavaScript BN library - subset useful for RSA encryption . *
* http : //www-cs-students.stanford.edu/~tjw/jsbn/ *
* Copyright ( c ) 2005 Tom Wu *
* All Rights Reserved . *
* See "LICENSE" for details : *
* http : //www-cs-students.stanford.edu/~tjw/jsbn/LICENSE *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
( function ( ) { function k ( a , b , c ) { d . biginteger _used = 1 ; null != a && ( "number" == typeof a && "undefined" == typeof b ? this . fromInt ( a ) : "number" == typeof a ? this . fromNumber ( a , b , c ) : null == b && "string" != typeof a ? this . fromString ( a , 256 ) : this . fromString ( a , b ) ) } function q ( ) { return new k ( null ) } function Q ( a , b , c , e , d , g ) { for ( ; 0 <= -- g ; ) { var h = b * this [ a ++ ] + c [ e ] + d ; d = Math . floor ( h / 67108864 ) ; c [ e ++ ] = h & 67108863 } return d } function R ( a , b , c , e , d , g ) { var h = b & 32767 ; for ( b >>= 15 ; 0 <= -- g ; ) { var l = this [ a ] & 32767 , k = this [ a ++ ] >> 15 , n = b * l + k * h , l = h * l + ( ( n & 32767 ) <<
15 ) + c [ e ] + ( d & 1073741823 ) ; d = ( l >>> 30 ) + ( n >>> 15 ) + b * k + ( d >>> 30 ) ; c [ e ++ ] = l & 1073741823 } return d } function S ( a , b , c , e , d , g ) { var h = b & 16383 ; for ( b >>= 14 ; 0 <= -- g ; ) { var l = this [ a ] & 16383 , k = this [ a ++ ] >> 14 , n = b * l + k * h , l = h * l + ( ( n & 16383 ) << 14 ) + c [ e ] + d ; d = ( l >> 28 ) + ( n >> 14 ) + b * k ; c [ e ++ ] = l & 268435455 } return d } function L ( a , b ) { var c = B [ a . charCodeAt ( b ) ] ; return null == c ? - 1 : c } function v ( a ) { var b = q ( ) ; b . fromInt ( a ) ; return b } function C ( a ) { var b = 1 , c ; 0 != ( c = a >>> 16 ) && ( a = c , b += 16 ) ; 0 != ( c = a >> 8 ) && ( a = c , b += 8 ) ; 0 != ( c = a >> 4 ) && ( a = c , b += 4 ) ; 0 != ( c = a >> 2 ) && ( a = c , b += 2 ) ; 0 !=
a >> 1 && ( b += 1 ) ; return b } function x ( a ) { this . m = a } function y ( a ) { this . m = a ; this . mp = a . invDigit ( ) ; this . mpl = this . mp & 32767 ; this . mph = this . mp >> 15 ; this . um = ( 1 << a . DB - 15 ) - 1 ; this . mt2 = 2 * a . t } function T ( a , b ) { return a & b } function I ( a , b ) { return a | b } function M ( a , b ) { return a ^ b } function N ( a , b ) { return a & ~ b } function A ( ) { } function O ( a ) { return a } function w ( a ) { this . r2 = q ( ) ; this . q3 = q ( ) ; k . ONE . dlShiftTo ( 2 * a . t , this . r2 ) ; this . mu = this . r2 . divide ( a ) ; this . m = a } var d = { } , D = ! 1 ; "undefined" !== typeof module && module . exports ? ( module . exports = d , D = ! 0 ) :
"undefined" !== typeof document ? window . ClipperLib = d : self . ClipperLib = d ; var r ; if ( D ) p = "chrome" , r = "Netscape" ; else { var p = navigator . userAgent . toString ( ) . toLowerCase ( ) ; r = navigator . appName } var E , J , F , G , H , P ; E = - 1 != p . indexOf ( "chrome" ) && - 1 == p . indexOf ( "chromium" ) ? 1 : 0 ; D = - 1 != p . indexOf ( "chromium" ) ? 1 : 0 ; J = - 1 != p . indexOf ( "safari" ) && - 1 == p . indexOf ( "chrome" ) && - 1 == p . indexOf ( "chromium" ) ? 1 : 0 ; F = - 1 != p . indexOf ( "firefox" ) ? 1 : 0 ; p . indexOf ( "firefox/17" ) ; p . indexOf ( "firefox/15" ) ; p . indexOf ( "firefox/3" ) ; G = - 1 != p . indexOf ( "opera" ) ? 1 : 0 ; p . indexOf ( "msie 10" ) ;
p . indexOf ( "msie 9" ) ; H = - 1 != p . indexOf ( "msie 8" ) ? 1 : 0 ; P = - 1 != p . indexOf ( "msie 7" ) ? 1 : 0 ; p = - 1 != p . indexOf ( "msie " ) ? 1 : 0 ; d . biginteger _used = null ; "Microsoft Internet Explorer" == r ? ( k . prototype . am = R , r = 30 ) : "Netscape" != r ? ( k . prototype . am = Q , r = 26 ) : ( k . prototype . am = S , r = 28 ) ; k . prototype . DB = r ; k . prototype . DM = ( 1 << r ) - 1 ; k . prototype . DV = 1 << r ; k . prototype . FV = Math . pow ( 2 , 52 ) ; k . prototype . F1 = 52 - r ; k . prototype . F2 = 2 * r - 52 ; var B = [ ] , u ; r = 48 ; for ( u = 0 ; 9 >= u ; ++ u ) B [ r ++ ] = u ; r = 97 ; for ( u = 10 ; 36 > u ; ++ u ) B [ r ++ ] = u ; r = 65 ; for ( u = 10 ; 36 > u ; ++ u ) B [ r ++ ] = u ; x . prototype . convert =
function ( a ) { return 0 > a . s || 0 <= a . compareTo ( this . m ) ? a . mod ( this . m ) : a } ; x . prototype . revert = function ( a ) { return a } ; x . prototype . reduce = function ( a ) { a . divRemTo ( this . m , null , a ) } ; x . prototype . mulTo = function ( a , b , c ) { a . multiplyTo ( b , c ) ; this . reduce ( c ) } ; x . prototype . sqrTo = function ( a , b ) { a . squareTo ( b ) ; this . reduce ( b ) } ; y . prototype . convert = function ( a ) { var b = q ( ) ; a . abs ( ) . dlShiftTo ( this . m . t , b ) ; b . divRemTo ( this . m , null , b ) ; 0 > a . s && 0 < b . compareTo ( k . ZERO ) && this . m . subTo ( b , b ) ; return b } ; y . prototype . revert = function ( a ) { var b = q ( ) ; a . copyTo ( b ) ;
this . reduce ( b ) ; return b } ; y . prototype . reduce = function ( a ) { for ( ; a . t <= this . mt2 ; ) a [ a . t ++ ] = 0 ; for ( var b = 0 ; b < this . m . t ; ++ b ) { var c = a [ b ] & 32767 , e = c * this . mpl + ( ( c * this . mph + ( a [ b ] >> 15 ) * this . mpl & this . um ) << 15 ) & a . DM , c = b + this . m . t ; for ( a [ c ] += this . m . am ( 0 , e , a , b , 0 , this . m . t ) ; a [ c ] >= a . DV ; ) a [ c ] -= a . DV , a [ ++ c ] ++ } a . clamp ( ) ; a . drShiftTo ( this . m . t , a ) ; 0 <= a . compareTo ( this . m ) && a . subTo ( this . m , a ) } ; y . prototype . mulTo = function ( a , b , c ) { a . multiplyTo ( b , c ) ; this . reduce ( c ) } ; y . prototype . sqrTo = function ( a , b ) { a . squareTo ( b ) ; this . reduce ( b ) } ; k . prototype . copyTo =
function ( a ) { for ( var b = this . t - 1 ; 0 <= b ; -- b ) a [ b ] = this [ b ] ; a . t = this . t ; a . s = this . s } ; k . prototype . fromInt = function ( a ) { this . t = 1 ; this . s = 0 > a ? - 1 : 0 ; 0 < a ? this [ 0 ] = a : - 1 > a ? this [ 0 ] = a + this . DV : this . t = 0 } ; k . prototype . fromString = function ( a , b ) { var c ; if ( 16 == b ) c = 4 ; else if ( 8 == b ) c = 3 ; else if ( 256 == b ) c = 8 ; else if ( 2 == b ) c = 1 ; else if ( 32 == b ) c = 5 ; else if ( 4 == b ) c = 2 ; else { this . fromRadix ( a , b ) ; return } this . s = this . t = 0 ; for ( var e = a . length , d = ! 1 , g = 0 ; 0 <= -- e ; ) { var h = 8 == c ? a [ e ] & 255 : L ( a , e ) ; 0 > h ? "-" == a . charAt ( e ) && ( d = ! 0 ) : ( d = ! 1 , 0 == g ? this [ this . t ++ ] = h : g + c > this . DB ?
( this [ this . t - 1 ] |= ( h & ( 1 << this . DB - g ) - 1 ) << g , this [ this . t ++ ] = h >> this . DB - g ) : this [ this . t - 1 ] |= h << g , g += c , g >= this . DB && ( g -= this . DB ) ) } 8 == c && 0 != ( a [ 0 ] & 128 ) && ( this . s = - 1 , 0 < g && ( this [ this . t - 1 ] |= ( 1 << this . DB - g ) - 1 << g ) ) ; this . clamp ( ) ; d && k . ZERO . subTo ( this , this ) } ; k . prototype . clamp = function ( ) { for ( var a = this . s & this . DM ; 0 < this . t && this [ this . t - 1 ] == a ; ) -- this . t } ; k . prototype . dlShiftTo = function ( a , b ) { var c ; for ( c = this . t - 1 ; 0 <= c ; -- c ) b [ c + a ] = this [ c ] ; for ( c = a - 1 ; 0 <= c ; -- c ) b [ c ] = 0 ; b . t = this . t + a ; b . s = this . s } ; k . prototype . drShiftTo = function ( a , b ) { for ( var c =
a ; c < this . t ; ++ c ) b [ c - a ] = this [ c ] ; b . t = Math . max ( this . t - a , 0 ) ; b . s = this . s } ; k . prototype . lShiftTo = function ( a , b ) { var c = a % this . DB , e = this . DB - c , d = ( 1 << e ) - 1 , g = Math . floor ( a / this . DB ) , h = this . s << c & this . DM , l ; for ( l = this . t - 1 ; 0 <= l ; -- l ) b [ l + g + 1 ] = this [ l ] >> e | h , h = ( this [ l ] & d ) << c ; for ( l = g - 1 ; 0 <= l ; -- l ) b [ l ] = 0 ; b [ g ] = h ; b . t = this . t + g + 1 ; b . s = this . s ; b . clamp ( ) } ; k . prototype . rShiftTo = function ( a , b ) { b . s = this . s ; var c = Math . floor ( a / this . DB ) ; if ( c >= this . t ) b . t = 0 ; else { var e = a % this . DB , d = this . DB - e , g = ( 1 << e ) - 1 ; b [ 0 ] = this [ c ] >> e ; for ( var h = c + 1 ; h < this . t ; ++ h ) b [ h -
c - 1 ] |= ( this [ h ] & g ) << d , b [ h - c ] = this [ h ] >> e ; 0 < e && ( b [ this . t - c - 1 ] |= ( this . s & g ) << d ) ; b . t = this . t - c ; b . clamp ( ) } } ; k . prototype . subTo = function ( a , b ) { for ( var c = 0 , e = 0 , d = Math . min ( a . t , this . t ) ; c < d ; ) e += this [ c ] - a [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; if ( a . t < this . t ) { for ( e -= a . s ; c < this . t ; ) e += this [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; e += this . s } else { for ( e += this . s ; c < a . t ; ) e -= a [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; e -= a . s } b . s = 0 > e ? - 1 : 0 ; - 1 > e ? b [ c ++ ] = this . DV + e : 0 < e && ( b [ c ++ ] = e ) ; b . t = c ; b . clamp ( ) } ; k . prototype . multiplyTo = function ( a , b ) { var c = this . abs ( ) , e =
a . abs ( ) , d = c . t ; for ( b . t = d + e . t ; 0 <= -- d ; ) b [ d ] = 0 ; for ( d = 0 ; d < e . t ; ++ d ) b [ d + c . t ] = c . am ( 0 , e [ d ] , b , d , 0 , c . t ) ; b . s = 0 ; b . clamp ( ) ; this . s != a . s && k . ZERO . subTo ( b , b ) } ; k . prototype . squareTo = function ( a ) { for ( var b = this . abs ( ) , c = a . t = 2 * b . t ; 0 <= -- c ; ) a [ c ] = 0 ; for ( c = 0 ; c < b . t - 1 ; ++ c ) { var e = b . am ( c , b [ c ] , a , 2 * c , 0 , 1 ) ; ( a [ c + b . t ] += b . am ( c + 1 , 2 * b [ c ] , a , 2 * c + 1 , e , b . t - c - 1 ) ) >= b . DV && ( a [ c + b . t ] -= b . DV , a [ c + b . t + 1 ] = 1 ) } 0 < a . t && ( a [ a . t - 1 ] += b . am ( c , b [ c ] , a , 2 * c , 0 , 1 ) ) ; a . s = 0 ; a . clamp ( ) } ; k . prototype . divRemTo = function ( a , b , c ) { var e = a . abs ( ) ; if ( ! ( 0 >= e . t ) ) { var d = this . abs ( ) ; if ( d . t <
e . t ) null != b && b . fromInt ( 0 ) , null != c && this . copyTo ( c ) ; else { null == c && ( c = q ( ) ) ; var g = q ( ) , h = this . s ; a = a . s ; var l = this . DB - C ( e [ e . t - 1 ] ) ; 0 < l ? ( e . lShiftTo ( l , g ) , d . lShiftTo ( l , c ) ) : ( e . copyTo ( g ) , d . copyTo ( c ) ) ; e = g . t ; d = g [ e - 1 ] ; if ( 0 != d ) { var z = d * ( 1 << this . F1 ) + ( 1 < e ? g [ e - 2 ] >> this . F2 : 0 ) , n = this . FV / z , z = ( 1 << this . F1 ) / z , U = 1 << this . F2 , m = c . t , p = m - e , s = null == b ? q ( ) : b ; g . dlShiftTo ( p , s ) ; 0 <= c . compareTo ( s ) && ( c [ c . t ++ ] = 1 , c . subTo ( s , c ) ) ; k . ONE . dlShiftTo ( e , s ) ; for ( s . subTo ( g , g ) ; g . t < e ; ) g [ g . t ++ ] = 0 ; for ( ; 0 <= -- p ; ) { var r = c [ -- m ] == d ? this . DM : Math . floor ( c [ m ] * n + ( c [ m -
1 ] + U ) * z ) ; if ( ( c [ m ] += g . am ( 0 , r , c , p , 0 , e ) ) < r ) for ( g . dlShiftTo ( p , s ) , c . subTo ( s , c ) ; c [ m ] < -- r ; ) c . subTo ( s , c ) } null != b && ( c . drShiftTo ( e , b ) , h != a && k . ZERO . subTo ( b , b ) ) ; c . t = e ; c . clamp ( ) ; 0 < l && c . rShiftTo ( l , c ) ; 0 > h && k . ZERO . subTo ( c , c ) } } } } ; k . prototype . invDigit = function ( ) { if ( 1 > this . t ) return 0 ; var a = this [ 0 ] ; if ( 0 == ( a & 1 ) ) return 0 ; var b = a & 3 , b = b * ( 2 - ( a & 15 ) * b ) & 15 , b = b * ( 2 - ( a & 255 ) * b ) & 255 , b = b * ( 2 - ( ( a & 65535 ) * b & 65535 ) ) & 65535 , b = b * ( 2 - a * b % this . DV ) % this . DV ; return 0 < b ? this . DV - b : - b } ; k . prototype . isEven = function ( ) { return 0 == ( 0 < this . t ? this [ 0 ] & 1 : this . s ) } ;
k . prototype . exp = function ( a , b ) { if ( 4294967295 < a || 1 > a ) return k . ONE ; var c = q ( ) , e = q ( ) , d = b . convert ( this ) , g = C ( a ) - 1 ; for ( d . copyTo ( c ) ; 0 <= -- g ; ) if ( b . sqrTo ( c , e ) , 0 < ( a & 1 << g ) ) b . mulTo ( e , d , c ) ; else var h = c , c = e , e = h ; return b . revert ( c ) } ; k . prototype . toString = function ( a ) { if ( 0 > this . s ) return "-" + this . negate ( ) . toString ( a ) ; if ( 16 == a ) a = 4 ; else if ( 8 == a ) a = 3 ; else if ( 2 == a ) a = 1 ; else if ( 32 == a ) a = 5 ; else if ( 4 == a ) a = 2 ; else return this . toRadix ( a ) ; var b = ( 1 << a ) - 1 , c , e = ! 1 , d = "" , g = this . t , h = this . DB - g * this . DB % a ; if ( 0 < g -- ) for ( h < this . DB && 0 < ( c = this [ g ] >>
h ) && ( e = ! 0 , d = "0123456789abcdefghijklmnopqrstuvwxyz" . charAt ( c ) ) ; 0 <= g ; ) h < a ? ( c = ( this [ g ] & ( 1 << h ) - 1 ) << a - h , c |= this [ -- g ] >> ( h += this . DB - a ) ) : ( c = this [ g ] >> ( h -= a ) & b , 0 >= h && ( h += this . DB , -- g ) ) , 0 < c && ( e = ! 0 ) , e && ( d += "0123456789abcdefghijklmnopqrstuvwxyz" . charAt ( c ) ) ; return e ? d : "0" } ; k . prototype . negate = function ( ) { var a = q ( ) ; k . ZERO . subTo ( this , a ) ; return a } ; k . prototype . abs = function ( ) { return 0 > this . s ? this . negate ( ) : this } ; k . prototype . compareTo = function ( a ) { var b = this . s - a . s ; if ( 0 != b ) return b ; var c = this . t , b = c - a . t ; if ( 0 != b ) return 0 > this . s ?
- b : b ; for ( ; 0 <= -- c ; ) if ( 0 != ( b = this [ c ] - a [ c ] ) ) return b ; return 0 } ; k . prototype . bitLength = function ( ) { return 0 >= this . t ? 0 : this . DB * ( this . t - 1 ) + C ( this [ this . t - 1 ] ^ this . s & this . DM ) } ; k . prototype . mod = function ( a ) { var b = q ( ) ; this . abs ( ) . divRemTo ( a , null , b ) ; 0 > this . s && 0 < b . compareTo ( k . ZERO ) && a . subTo ( b , b ) ; return b } ; k . prototype . modPowInt = function ( a , b ) { var c ; c = 256 > a || b . isEven ( ) ? new x ( b ) : new y ( b ) ; return this . exp ( a , c ) } ; k . ZERO = v ( 0 ) ; k . ONE = v ( 1 ) ; A . prototype . convert = O ; A . prototype . revert = O ; A . prototype . mulTo = function ( a , b , c ) { a . multiplyTo ( b ,
c ) } ; A . prototype . sqrTo = function ( a , b ) { a . squareTo ( b ) } ; w . prototype . convert = function ( a ) { if ( 0 > a . s || a . t > 2 * this . m . t ) return a . mod ( this . m ) ; if ( 0 > a . compareTo ( this . m ) ) return a ; var b = q ( ) ; a . copyTo ( b ) ; this . reduce ( b ) ; return b } ; w . prototype . revert = function ( a ) { return a } ; w . prototype . reduce = function ( a ) { a . drShiftTo ( this . m . t - 1 , this . r2 ) ; a . t > this . m . t + 1 && ( a . t = this . m . t + 1 , a . clamp ( ) ) ; this . mu . multiplyUpperTo ( this . r2 , this . m . t + 1 , this . q3 ) ; for ( this . m . multiplyLowerTo ( this . q3 , this . m . t + 1 , this . r2 ) ; 0 > a . compareTo ( this . r2 ) ; ) a . dAddOffset ( 1 ,
this . m . t + 1 ) ; for ( a . subTo ( this . r2 , a ) ; 0 <= a . compareTo ( this . m ) ; ) a . subTo ( this . m , a ) } ; w . prototype . mulTo = function ( a , b , c ) { a . multiplyTo ( b , c ) ; this . reduce ( c ) } ; w . prototype . sqrTo = function ( a , b ) { a . squareTo ( b ) ; this . reduce ( b ) } ; var t = [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 , 101 , 103 , 107 , 109 , 113 , 127 , 131 , 137 , 139 , 149 , 151 , 157 , 163 , 167 , 173 , 179 , 181 , 191 , 193 , 197 , 199 , 211 , 223 , 227 , 229 , 233 , 239 , 241 , 251 , 257 , 263 , 269 , 271 , 277 , 281 , 283 , 293 , 307 , 311 , 313 , 317 , 331 , 337 , 347 , 349 , 353 , 359 , 367 , 373 , 379 , 383 , 389 , 397 , 401 ,
409 , 419 , 421 , 431 , 433 , 439 , 443 , 449 , 457 , 461 , 463 , 467 , 479 , 487 , 491 , 499 , 503 , 509 , 521 , 523 , 541 , 547 , 557 , 563 , 569 , 571 , 577 , 587 , 593 , 599 , 601 , 607 , 613 , 617 , 619 , 631 , 641 , 643 , 647 , 653 , 659 , 661 , 673 , 677 , 683 , 691 , 701 , 709 , 719 , 727 , 733 , 739 , 743 , 751 , 757 , 761 , 769 , 773 , 787 , 797 , 809 , 811 , 821 , 823 , 827 , 829 , 839 , 853 , 857 , 859 , 863 , 877 , 881 , 883 , 887 , 907 , 911 , 919 , 929 , 937 , 941 , 947 , 953 , 967 , 971 , 977 , 983 , 991 , 997 ] , V = 67108864 / t [ t . length - 1 ] ; k . prototype . chunkSize = function ( a ) { return Math . floor ( Math . LN2 * this . DB / Math . log ( a ) ) } ; k . prototype . toRadix = function ( a ) { null ==
a && ( a = 10 ) ; if ( 0 == this . signum ( ) || 2 > a || 36 < a ) return "0" ; var b = this . chunkSize ( a ) , b = Math . pow ( a , b ) , c = v ( b ) , e = q ( ) , d = q ( ) , g = "" ; for ( this . divRemTo ( c , e , d ) ; 0 < e . signum ( ) ; ) g = ( b + d . intValue ( ) ) . toString ( a ) . substr ( 1 ) + g , e . divRemTo ( c , e , d ) ; return d . intValue ( ) . toString ( a ) + g } ; k . prototype . fromRadix = function ( a , b ) { this . fromInt ( 0 ) ; null == b && ( b = 10 ) ; for ( var c = this . chunkSize ( b ) , e = Math . pow ( b , c ) , d = ! 1 , g = 0 , h = 0 , l = 0 ; l < a . length ; ++ l ) { var z = L ( a , l ) ; 0 > z ? "-" == a . charAt ( l ) && 0 == this . signum ( ) && ( d = ! 0 ) : ( h = b * h + z , ++ g >= c && ( this . dMultiply ( e ) , this . dAddOffset ( h ,
0 ) , h = g = 0 ) ) } 0 < g && ( this . dMultiply ( Math . pow ( b , g ) ) , this . dAddOffset ( h , 0 ) ) ; d && k . ZERO . subTo ( this , this ) } ; k . prototype . fromNumber = function ( a , b , c ) { if ( "number" == typeof b ) if ( 2 > a ) this . fromInt ( 1 ) ; else for ( this . fromNumber ( a , c ) , this . testBit ( a - 1 ) || this . bitwiseTo ( k . ONE . shiftLeft ( a - 1 ) , I , this ) , this . isEven ( ) && this . dAddOffset ( 1 , 0 ) ; ! this . isProbablePrime ( b ) ; ) this . dAddOffset ( 2 , 0 ) , this . bitLength ( ) > a && this . subTo ( k . ONE . shiftLeft ( a - 1 ) , this ) ; else { c = [ ] ; var e = a & 7 ; c . length = ( a >> 3 ) + 1 ; b . nextBytes ( c ) ; c [ 0 ] = 0 < e ? c [ 0 ] & ( 1 << e ) - 1 : 0 ; this . fromString ( c ,
256 ) } } ; k . prototype . bitwiseTo = function ( a , b , c ) { var e , d , g = Math . min ( a . t , this . t ) ; for ( e = 0 ; e < g ; ++ e ) c [ e ] = b ( this [ e ] , a [ e ] ) ; if ( a . t < this . t ) { d = a . s & this . DM ; for ( e = g ; e < this . t ; ++ e ) c [ e ] = b ( this [ e ] , d ) ; c . t = this . t } else { d = this . s & this . DM ; for ( e = g ; e < a . t ; ++ e ) c [ e ] = b ( d , a [ e ] ) ; c . t = a . t } c . s = b ( this . s , a . s ) ; c . clamp ( ) } ; k . prototype . changeBit = function ( a , b ) { var c = k . ONE . shiftLeft ( a ) ; this . bitwiseTo ( c , b , c ) ; return c } ; k . prototype . addTo = function ( a , b ) { for ( var c = 0 , e = 0 , d = Math . min ( a . t , this . t ) ; c < d ; ) e += this [ c ] + a [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; if ( a . t <
this . t ) { for ( e += a . s ; c < this . t ; ) e += this [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; e += this . s } else { for ( e += this . s ; c < a . t ; ) e += a [ c ] , b [ c ++ ] = e & this . DM , e >>= this . DB ; e += a . s } b . s = 0 > e ? - 1 : 0 ; 0 < e ? b [ c ++ ] = e : - 1 > e && ( b [ c ++ ] = this . DV + e ) ; b . t = c ; b . clamp ( ) } ; k . prototype . dMultiply = function ( a ) { this [ this . t ] = this . am ( 0 , a - 1 , this , 0 , 0 , this . t ) ; ++ this . t ; this . clamp ( ) } ; k . prototype . dAddOffset = function ( a , b ) { if ( 0 != a ) { for ( ; this . t <= b ; ) this [ this . t ++ ] = 0 ; for ( this [ b ] += a ; this [ b ] >= this . DV ; ) this [ b ] -= this . DV , ++ b >= this . t && ( this [ this . t ++ ] = 0 ) , ++ this [ b ] } } ; k . prototype . multiplyLowerTo =
function ( a , b , c ) { var e = Math . min ( this . t + a . t , b ) ; c . s = 0 ; for ( c . t = e ; 0 < e ; ) c [ -- e ] = 0 ; var d ; for ( d = c . t - this . t ; e < d ; ++ e ) c [ e + this . t ] = this . am ( 0 , a [ e ] , c , e , 0 , this . t ) ; for ( d = Math . min ( a . t , b ) ; e < d ; ++ e ) this . am ( 0 , a [ e ] , c , e , 0 , b - e ) ; c . clamp ( ) } ; k . prototype . multiplyUpperTo = function ( a , b , c ) { -- b ; var e = c . t = this . t + a . t - b ; for ( c . s = 0 ; 0 <= -- e ; ) c [ e ] = 0 ; for ( e = Math . max ( b - this . t , 0 ) ; e < a . t ; ++ e ) c [ this . t + e - b ] = this . am ( b - e , a [ e ] , c , 0 , 0 , this . t + e - b ) ; c . clamp ( ) ; c . drShiftTo ( 1 , c ) } ; k . prototype . modInt = function ( a ) { if ( 0 >= a ) return 0 ; var b = this . DV % a , c = 0 > this . s ? a -
1 : 0 ; if ( 0 < this . t ) if ( 0 == b ) c = this [ 0 ] % a ; else for ( var e = this . t - 1 ; 0 <= e ; -- e ) c = ( b * c + this [ e ] ) % a ; return c } ; k . prototype . millerRabin = function ( a ) { var b = this . subtract ( k . ONE ) , c = b . getLowestSetBit ( ) ; if ( 0 >= c ) return ! 1 ; var e = b . shiftRight ( c ) ; a = a + 1 >> 1 ; a > t . length && ( a = t . length ) ; for ( var d = q ( ) , g = 0 ; g < a ; ++ g ) { d . fromInt ( t [ Math . floor ( Math . random ( ) * t . length ) ] ) ; var h = d . modPow ( e , this ) ; if ( 0 != h . compareTo ( k . ONE ) && 0 != h . compareTo ( b ) ) { for ( var l = 1 ; l ++ < c && 0 != h . compareTo ( b ) ; ) if ( h = h . modPowInt ( 2 , this ) , 0 == h . compareTo ( k . ONE ) ) return ! 1 ; if ( 0 != h . compareTo ( b ) ) return ! 1 } } return ! 0 } ;
k . prototype . clone = function ( ) { var a = q ( ) ; this . copyTo ( a ) ; return a } ; k . prototype . intValue = function ( ) { if ( 0 > this . s ) { if ( 1 == this . t ) return this [ 0 ] - this . DV ; if ( 0 == this . t ) return - 1 } else { if ( 1 == this . t ) return this [ 0 ] ; if ( 0 == this . t ) return 0 } return ( this [ 1 ] & ( 1 << 32 - this . DB ) - 1 ) << this . DB | this [ 0 ] } ; k . prototype . byteValue = function ( ) { return 0 == this . t ? this . s : this [ 0 ] << 24 >> 24 } ; k . prototype . shortValue = function ( ) { return 0 == this . t ? this . s : this [ 0 ] << 16 >> 16 } ; k . prototype . signum = function ( ) { return 0 > this . s ? - 1 : 0 >= this . t || 1 == this . t && 0 >= this [ 0 ] ?
0 : 1 } ; k . prototype . toByteArray = function ( ) { var a = this . t , b = [ ] ; b [ 0 ] = this . s ; var c = this . DB - a * this . DB % 8 , e , d = 0 ; if ( 0 < a -- ) for ( c < this . DB && ( e = this [ a ] >> c ) != ( this . s & this . DM ) >> c && ( b [ d ++ ] = e | this . s << this . DB - c ) ; 0 <= a ; ) if ( 8 > c ? ( e = ( this [ a ] & ( 1 << c ) - 1 ) << 8 - c , e |= this [ -- a ] >> ( c += this . DB - 8 ) ) : ( e = this [ a ] >> ( c -= 8 ) & 255 , 0 >= c && ( c += this . DB , -- a ) ) , 0 != ( e & 128 ) && ( e |= - 256 ) , 0 == d && ( this . s & 128 ) != ( e & 128 ) && ++ d , 0 < d || e != this . s ) b [ d ++ ] = e ; return b } ; k . prototype . equals = function ( a ) { return 0 == this . compareTo ( a ) } ; k . prototype . min = function ( a ) { return 0 > this . compareTo ( a ) ?
this : a } ; k . prototype . max = function ( a ) { return 0 < this . compareTo ( a ) ? this : a } ; k . prototype . and = function ( a ) { var b = q ( ) ; this . bitwiseTo ( a , T , b ) ; return b } ; k . prototype . or = function ( a ) { var b = q ( ) ; this . bitwiseTo ( a , I , b ) ; return b } ; k . prototype . xor = function ( a ) { var b = q ( ) ; this . bitwiseTo ( a , M , b ) ; return b } ; k . prototype . andNot = function ( a ) { var b = q ( ) ; this . bitwiseTo ( a , N , b ) ; return b } ; k . prototype . not = function ( ) { for ( var a = q ( ) , b = 0 ; b < this . t ; ++ b ) a [ b ] = this . DM & ~ this [ b ] ; a . t = this . t ; a . s = ~ this . s ; return a } ; k . prototype . shiftLeft = function ( a ) { var b =
q ( ) ; 0 > a ? this . rShiftTo ( - a , b ) : this . lShiftTo ( a , b ) ; return b } ; k . prototype . shiftRight = function ( a ) { var b = q ( ) ; 0 > a ? this . lShiftTo ( - a , b ) : this . rShiftTo ( a , b ) ; return b } ; k . prototype . getLowestSetBit = function ( ) { for ( var a = 0 ; a < this . t ; ++ a ) if ( 0 != this [ a ] ) { var b = a * this . DB ; a = this [ a ] ; if ( 0 == a ) a = - 1 ; else { var c = 0 ; 0 == ( a & 65535 ) && ( a >>= 16 , c += 16 ) ; 0 == ( a & 255 ) && ( a >>= 8 , c += 8 ) ; 0 == ( a & 15 ) && ( a >>= 4 , c += 4 ) ; 0 == ( a & 3 ) && ( a >>= 2 , c += 2 ) ; 0 == ( a & 1 ) && ++ c ; a = c } return b + a } return 0 > this . s ? this . t * this . DB : - 1 } ; k . prototype . bitCount = function ( ) { for ( var a = 0 , b = this . s &
this . DM , c = 0 ; c < this . t ; ++ c ) { for ( var e = this [ c ] ^ b , d = 0 ; 0 != e ; ) e &= e - 1 , ++ d ; a += d } return a } ; k . prototype . testBit = function ( a ) { var b = Math . floor ( a / this . DB ) ; return b >= this . t ? 0 != this . s : 0 != ( this [ b ] & 1 << a % this . DB ) } ; k . prototype . setBit = function ( a ) { return this . changeBit ( a , I ) } ; k . prototype . clearBit = function ( a ) { return this . changeBit ( a , N ) } ; k . prototype . flipBit = function ( a ) { return this . changeBit ( a , M ) } ; k . prototype . add = function ( a ) { var b = q ( ) ; this . addTo ( a , b ) ; return b } ; k . prototype . subtract = function ( a ) { var b = q ( ) ; this . subTo ( a , b ) ; return b } ;
k . prototype . multiply = function ( a ) { var b = q ( ) ; this . multiplyTo ( a , b ) ; return b } ; k . prototype . divide = function ( a ) { var b = q ( ) ; this . divRemTo ( a , b , null ) ; return b } ; k . prototype . remainder = function ( a ) { var b = q ( ) ; this . divRemTo ( a , null , b ) ; return b } ; k . prototype . divideAndRemainder = function ( a ) { var b = q ( ) , c = q ( ) ; this . divRemTo ( a , b , c ) ; return [ b , c ] } ; k . prototype . modPow = function ( a , b ) { var c = a . bitLength ( ) , e , d = v ( 1 ) , g ; if ( 0 >= c ) return d ; e = 18 > c ? 1 : 48 > c ? 3 : 144 > c ? 4 : 768 > c ? 5 : 6 ; g = 8 > c ? new x ( b ) : b . isEven ( ) ? new w ( b ) : new y ( b ) ; var h = [ ] , l = 3 , k = e - 1 , n = ( 1 <<
e ) - 1 ; h [ 1 ] = g . convert ( this ) ; if ( 1 < e ) for ( c = q ( ) , g . sqrTo ( h [ 1 ] , c ) ; l <= n ; ) h [ l ] = q ( ) , g . mulTo ( c , h [ l - 2 ] , h [ l ] ) , l += 2 ; for ( var m = a . t - 1 , p , r = ! 0 , s = q ( ) , c = C ( a [ m ] ) - 1 ; 0 <= m ; ) { c >= k ? p = a [ m ] >> c - k & n : ( p = ( a [ m ] & ( 1 << c + 1 ) - 1 ) << k - c , 0 < m && ( p |= a [ m - 1 ] >> this . DB + c - k ) ) ; for ( l = e ; 0 == ( p & 1 ) ; ) p >>= 1 , -- l ; 0 > ( c -= l ) && ( c += this . DB , -- m ) ; if ( r ) h [ p ] . copyTo ( d ) , r = ! 1 ; else { for ( ; 1 < l ; ) g . sqrTo ( d , s ) , g . sqrTo ( s , d ) , l -= 2 ; 0 < l ? g . sqrTo ( d , s ) : ( l = d , d = s , s = l ) ; g . mulTo ( s , h [ p ] , d ) } for ( ; 0 <= m && 0 == ( a [ m ] & 1 << c ) ; ) g . sqrTo ( d , s ) , l = d , d = s , s = l , 0 > -- c && ( c = this . DB - 1 , -- m ) } return g . revert ( d ) } ; k . prototype . modInverse =
function ( a ) { var b = a . isEven ( ) ; if ( this . isEven ( ) && b || 0 == a . signum ( ) ) return k . ZERO ; for ( var c = a . clone ( ) , e = this . clone ( ) , d = v ( 1 ) , g = v ( 0 ) , h = v ( 0 ) , l = v ( 1 ) ; 0 != c . signum ( ) ; ) { for ( ; c . isEven ( ) ; ) c . rShiftTo ( 1 , c ) , b ? ( d . isEven ( ) && g . isEven ( ) || ( d . addTo ( this , d ) , g . subTo ( a , g ) ) , d . rShiftTo ( 1 , d ) ) : g . isEven ( ) || g . subTo ( a , g ) , g . rShiftTo ( 1 , g ) ; for ( ; e . isEven ( ) ; ) e . rShiftTo ( 1 , e ) , b ? ( h . isEven ( ) && l . isEven ( ) || ( h . addTo ( this , h ) , l . subTo ( a , l ) ) , h . rShiftTo ( 1 , h ) ) : l . isEven ( ) || l . subTo ( a , l ) , l . rShiftTo ( 1 , l ) ; 0 <= c . compareTo ( e ) ? ( c . subTo ( e , c ) , b && d . subTo ( h , d ) ,
g . subTo ( l , g ) ) : ( e . subTo ( c , e ) , b && h . subTo ( d , h ) , l . subTo ( g , l ) ) } if ( 0 != e . compareTo ( k . ONE ) ) return k . ZERO ; if ( 0 <= l . compareTo ( a ) ) return l . subtract ( a ) ; if ( 0 > l . signum ( ) ) l . addTo ( a , l ) ; else return l ; return 0 > l . signum ( ) ? l . add ( a ) : l } ; k . prototype . pow = function ( a ) { return this . exp ( a , new A ) } ; k . prototype . gcd = function ( a ) { var b = 0 > this . s ? this . negate ( ) : this . clone ( ) ; a = 0 > a . s ? a . negate ( ) : a . clone ( ) ; if ( 0 > b . compareTo ( a ) ) { var c = b , b = a ; a = c } var c = b . getLowestSetBit ( ) , e = a . getLowestSetBit ( ) ; if ( 0 > e ) return b ; c < e && ( e = c ) ; 0 < e && ( b . rShiftTo ( e , b ) ,
a . rShiftTo ( e , a ) ) ; for ( ; 0 < b . signum ( ) ; ) 0 < ( c = b . getLowestSetBit ( ) ) && b . rShiftTo ( c , b ) , 0 < ( c = a . getLowestSetBit ( ) ) && a . rShiftTo ( c , a ) , 0 <= b . compareTo ( a ) ? ( b . subTo ( a , b ) , b . rShiftTo ( 1 , b ) ) : ( a . subTo ( b , a ) , a . rShiftTo ( 1 , a ) ) ; 0 < e && a . lShiftTo ( e , a ) ; return a } ; k . prototype . isProbablePrime = function ( a ) { var b , c = this . abs ( ) ; if ( 1 == c . t && c [ 0 ] <= t [ t . length - 1 ] ) { for ( b = 0 ; b < t . length ; ++ b ) if ( c [ 0 ] == t [ b ] ) return ! 0 ; return ! 1 } if ( c . isEven ( ) ) return ! 1 ; for ( b = 1 ; b < t . length ; ) { for ( var e = t [ b ] , d = b + 1 ; d < t . length && e < V ; ) e *= t [ d ++ ] ; for ( e = c . modInt ( e ) ; b < d ; ) if ( 0 == e %
t [ b ++ ] ) return ! 1 } return c . millerRabin ( a ) } ; k . prototype . square = function ( ) { var a = q ( ) ; this . squareTo ( a ) ; return a } ; var m = k ; m . prototype . IsNegative = function ( ) { return - 1 == this . compareTo ( m . ZERO ) ? ! 0 : ! 1 } ; m . op _Equality = function ( a , b ) { return 0 == a . compareTo ( b ) ? ! 0 : ! 1 } ; m . op _Inequality = function ( a , b ) { return 0 != a . compareTo ( b ) ? ! 0 : ! 1 } ; m . op _GreaterThan = function ( a , b ) { return 0 < a . compareTo ( b ) ? ! 0 : ! 1 } ; m . op _LessThan = function ( a , b ) { return 0 > a . compareTo ( b ) ? ! 0 : ! 1 } ; m . op _Addition = function ( a , b ) { return ( new m ( a ) ) . add ( new m ( b ) ) } ; m . op _Subtraction =
function ( a , b ) { return ( new m ( a ) ) . subtract ( new m ( b ) ) } ; m . Int128Mul = function ( a , b ) { return ( new m ( a ) ) . multiply ( new m ( b ) ) } ; m . op _Division = function ( a , b ) { return a . divide ( b ) } ; m . prototype . ToDouble = function ( ) { return parseFloat ( this . toString ( ) ) } ; if ( "undefined" == typeof K ) var K = function ( a , b ) { var c ; if ( "undefined" == typeof Object . getOwnPropertyNames ) for ( c in b . prototype ) { if ( "undefined" == typeof a . prototype [ c ] || a . prototype [ c ] == Object . prototype [ c ] ) a . prototype [ c ] = b . prototype [ c ] } else for ( var e = Object . getOwnPropertyNames ( b . prototype ) ,
d = 0 ; d < e . length ; d ++ ) "undefined" == typeof Object . getOwnPropertyDescriptor ( a . prototype , e [ d ] ) && Object . defineProperty ( a . prototype , e [ d ] , Object . getOwnPropertyDescriptor ( b . prototype , e [ d ] ) ) ; for ( c in b ) "undefined" == typeof a [ c ] && ( a [ c ] = b [ c ] ) ; a . $baseCtor = b } ; d . Path = function ( ) { return [ ] } ; d . Paths = function ( ) { return [ ] } ; d . DoublePoint = function ( ) { var a = arguments ; this . Y = this . X = 0 ; 1 == a . length ? ( this . X = a [ 0 ] . X , this . Y = a [ 0 ] . Y ) : 2 == a . length && ( this . X = a [ 0 ] , this . Y = a [ 1 ] ) } ; d . DoublePoint0 = function ( ) { this . Y = this . X = 0 } ; d . DoublePoint1 = function ( a ) { this . X =
a . X ; this . Y = a . Y } ; d . DoublePoint2 = function ( a , b ) { this . X = a ; this . Y = b } ; d . PolyNode = function ( ) { this . m _Parent = null ; this . m _polygon = new d . Path ; this . m _endtype = this . m _jointype = this . m _Index = 0 ; this . m _Childs = [ ] ; this . IsOpen = ! 1 } ; d . PolyNode . prototype . IsHoleNode = function ( ) { for ( var a = ! 0 , b = this . m _Parent ; null !== b ; ) a = ! a , b = b . m _Parent ; return a } ; d . PolyNode . prototype . ChildCount = function ( ) { return this . m _Childs . length } ; d . PolyNode . prototype . Contour = function ( ) { return this . m _polygon } ; d . PolyNode . prototype . AddChild = function ( a ) { var b =
this . m _Childs . length ; this . m _Childs . push ( a ) ; a . m _Parent = this ; a . m _Index = b } ; d . PolyNode . prototype . GetNext = function ( ) { return 0 < this . m _Childs . length ? this . m _Childs [ 0 ] : this . GetNextSiblingUp ( ) } ; d . PolyNode . prototype . GetNextSiblingUp = function ( ) { return null === this . m _Parent ? null : this . m _Index == this . m _Parent . m _Childs . length - 1 ? this . m _Parent . GetNextSiblingUp ( ) : this . m _Parent . m _Childs [ this . m _Index + 1 ] } ; d . PolyNode . prototype . Childs = function ( ) { return this . m _Childs } ; d . PolyNode . prototype . Parent = function ( ) { return this . m _Parent } ;
d . PolyNode . prototype . IsHole = function ( ) { return this . IsHoleNode ( ) } ; d . PolyTree = function ( ) { this . m _AllPolys = [ ] ; d . PolyNode . call ( this ) } ; d . PolyTree . prototype . Clear = function ( ) { for ( var a = 0 , b = this . m _AllPolys . length ; a < b ; a ++ ) this . m _AllPolys [ a ] = null ; this . m _AllPolys . length = 0 ; this . m _Childs . length = 0 } ; d . PolyTree . prototype . GetFirst = function ( ) { return 0 < this . m _Childs . length ? this . m _Childs [ 0 ] : null } ; d . PolyTree . prototype . Total = function ( ) { return this . m _AllPolys . length } ; K ( d . PolyTree , d . PolyNode ) ; d . Math _Abs _Int64 = d . Math _Abs _Int32 =
d . Math _Abs _Double = function ( a ) { return Math . abs ( a ) } ; d . Math _Max _Int32 _Int32 = function ( a , b ) { return Math . max ( a , b ) } ; d . Cast _Int32 = p || G || J ? function ( a ) { return a | 0 } : function ( a ) { return ~ ~ a } ; d . Cast _Int64 = E ? function ( a ) { return - 2147483648 > a || 2147483647 < a ? 0 > a ? Math . ceil ( a ) : Math . floor ( a ) : ~ ~ a } : F && "function" == typeof Number . toInteger ? function ( a ) { return Number . toInteger ( a ) } : P || H ? function ( a ) { return parseInt ( a , 10 ) } : p ? function ( a ) { return - 2147483648 > a || 2147483647 < a ? 0 > a ? Math . ceil ( a ) : Math . floor ( a ) : a | 0 } : function ( a ) { return 0 > a ? Math . ceil ( a ) :
Math . floor ( a ) } ; d . Clear = function ( a ) { a . length = 0 } ; d . PI = 3.141592653589793 ; d . PI2 = 6.283185307179586 ; d . IntPoint = function ( ) { var a ; a = arguments ; var b = a . length ; this . Y = this . X = 0 ; 2 == b ? ( this . X = a [ 0 ] , this . Y = a [ 1 ] ) : 1 == b ? a [ 0 ] instanceof d . DoublePoint ? ( a = a [ 0 ] , this . X = d . Clipper . Round ( a . X ) , this . Y = d . Clipper . Round ( a . Y ) ) : ( a = a [ 0 ] , this . X = a . X , this . Y = a . Y ) : this . Y = this . X = 0 } ; d . IntPoint . op _Equality = function ( a , b ) { return a . X == b . X && a . Y == b . Y } ; d . IntPoint . op _Inequality = function ( a , b ) { return a . X != b . X || a . Y != b . Y } ; d . IntPoint0 = function ( ) { this . Y =
this . X = 0 } ; d . IntPoint1 = function ( a ) { this . X = a . X ; this . Y = a . Y } ; d . IntPoint1dp = function ( a ) { this . X = d . Clipper . Round ( a . X ) ; this . Y = d . Clipper . Round ( a . Y ) } ; d . IntPoint2 = function ( a , b ) { this . X = a ; this . Y = b } ; d . IntRect = function ( ) { var a = arguments , b = a . length ; 4 == b ? ( this . left = a [ 0 ] , this . top = a [ 1 ] , this . right = a [ 2 ] , this . bottom = a [ 3 ] ) : 1 == b ? ( this . left = ir . left , this . top = ir . top , this . right = ir . right , this . bottom = ir . bottom ) : this . bottom = this . right = this . top = this . left = 0 } ; d . IntRect0 = function ( ) { this . bottom = this . right = this . top = this . left = 0 } ; d . IntRect1 =
function ( a ) { this . left = a . left ; this . top = a . top ; this . right = a . right ; this . bottom = a . bottom } ; d . IntRect4 = function ( a , b , c , e ) { this . left = a ; this . top = b ; this . right = c ; this . bottom = e } ; d . ClipType = { ctIntersection : 0 , ctUnion : 1 , ctDifference : 2 , ctXor : 3 } ; d . PolyType = { ptSubject : 0 , ptClip : 1 } ; d . PolyFillType = { pftEvenOdd : 0 , pftNonZero : 1 , pftPositive : 2 , pftNegative : 3 } ; d . JoinType = { jtSquare : 0 , jtRound : 1 , jtMiter : 2 } ; d . EndType = { etOpenSquare : 0 , etOpenRound : 1 , etOpenButt : 2 , etClosedLine : 3 , etClosedPolygon : 4 } ; d . EdgeSide = { esLeft : 0 , esRight : 1 } ; d . Direction =
{ dRightToLeft : 0 , dLeftToRight : 1 } ; d . TEdge = function ( ) { this . Bot = new d . IntPoint ; this . Curr = new d . IntPoint ; this . Top = new d . IntPoint ; this . Delta = new d . IntPoint ; this . Dx = 0 ; this . PolyTyp = d . PolyType . ptSubject ; this . Side = d . EdgeSide . esLeft ; this . OutIdx = this . WindCnt2 = this . WindCnt = this . WindDelta = 0 ; this . PrevInSEL = this . NextInSEL = this . PrevInAEL = this . NextInAEL = this . NextInLML = this . Prev = this . Next = null } ; d . IntersectNode = function ( ) { this . Edge2 = this . Edge1 = null ; this . Pt = new d . IntPoint } ; d . MyIntersectNodeSort = function ( ) { } ; d . MyIntersectNodeSort . Compare =
function ( a , b ) { return b . Pt . Y - a . Pt . Y } ; d . LocalMinima = function ( ) { this . Y = 0 ; this . Next = this . RightBound = this . LeftBound = null } ; d . Scanbeam = function ( ) { this . Y = 0 ; this . Next = null } ; d . OutRec = function ( ) { this . Idx = 0 ; this . IsOpen = this . IsHole = ! 1 ; this . PolyNode = this . BottomPt = this . Pts = this . FirstLeft = null } ; d . OutPt = function ( ) { this . Idx = 0 ; this . Pt = new d . IntPoint ; this . Prev = this . Next = null } ; d . Join = function ( ) { this . OutPt2 = this . OutPt1 = null ; this . OffPt = new d . IntPoint } ; d . ClipperBase = function ( ) { this . m _CurrentLM = this . m _MinimaList = null ; this . m _edges =
[ ] ; this . PreserveCollinear = this . m _HasOpenPaths = this . m _UseFullRange = ! 1 ; this . m _CurrentLM = this . m _MinimaList = null ; this . m _HasOpenPaths = this . m _UseFullRange = ! 1 } ; d . ClipperBase . horizontal = - 9007199254740992 ; d . ClipperBase . Skip = - 2 ; d . ClipperBase . Unassigned = - 1 ; d . ClipperBase . tolerance = 1E-20 ; d . ClipperBase . loRange = 47453132 ; d . ClipperBase . hiRange = 0xfffffffffffff ; d . ClipperBase . near _zero = function ( a ) { return a > - d . ClipperBase . tolerance && a < d . ClipperBase . tolerance } ; d . ClipperBase . IsHorizontal = function ( a ) { return 0 === a . Delta . Y } ;
d . ClipperBase . prototype . PointIsVertex = function ( a , b ) { var c = b ; do { if ( d . IntPoint . op _Equality ( c . Pt , a ) ) return ! 0 ; c = c . Next } while ( c != b ) ; return ! 1 } ; d . ClipperBase . prototype . PointOnLineSegment = function ( a , b , c , e ) { return e ? a . X == b . X && a . Y == b . Y || a . X == c . X && a . Y == c . Y || a . X > b . X == a . X < c . X && a . Y > b . Y == a . Y < c . Y && m . op _Equality ( m . Int128Mul ( a . X - b . X , c . Y - b . Y ) , m . Int128Mul ( c . X - b . X , a . Y - b . Y ) ) : a . X == b . X && a . Y == b . Y || a . X == c . X && a . Y == c . Y || a . X > b . X == a . X < c . X && a . Y > b . Y == a . Y < c . Y && ( a . X - b . X ) * ( c . Y - b . Y ) == ( c . X - b . X ) * ( a . Y - b . Y ) } ; d . ClipperBase . prototype . PointOnPolygon =
function ( a , b , c ) { for ( var e = b ; ; ) { if ( this . PointOnLineSegment ( a , e . Pt , e . Next . Pt , c ) ) return ! 0 ; e = e . Next ; if ( e == b ) break } return ! 1 } ; d . ClipperBase . prototype . SlopesEqual = d . ClipperBase . SlopesEqual = function ( ) { var a = arguments , b = a . length , c , e , f ; if ( 3 == b ) return b = a [ 0 ] , c = a [ 1 ] , ( a = a [ 2 ] ) ? m . op _Equality ( m . Int128Mul ( b . Delta . Y , c . Delta . X ) , m . Int128Mul ( b . Delta . X , c . Delta . Y ) ) : d . Cast _Int64 ( b . Delta . Y * c . Delta . X ) == d . Cast _Int64 ( b . Delta . X * c . Delta . Y ) ; if ( 4 == b ) return b = a [ 0 ] , c = a [ 1 ] , e = a [ 2 ] , ( a = a [ 3 ] ) ? m . op _Equality ( m . Int128Mul ( b . Y - c . Y , c . X - e . X ) ,
m . Int128Mul ( b . X - c . X , c . Y - e . Y ) ) : 0 === d . Cast _Int64 ( ( b . Y - c . Y ) * ( c . X - e . X ) ) - d . Cast _Int64 ( ( b . X - c . X ) * ( c . Y - e . Y ) ) ; b = a [ 0 ] ; c = a [ 1 ] ; e = a [ 2 ] ; f = a [ 3 ] ; return ( a = a [ 4 ] ) ? m . op _Equality ( m . Int128Mul ( b . Y - c . Y , e . X - f . X ) , m . Int128Mul ( b . X - c . X , e . Y - f . Y ) ) : 0 === d . Cast _Int64 ( ( b . Y - c . Y ) * ( e . X - f . X ) ) - d . Cast _Int64 ( ( b . X - c . X ) * ( e . Y - f . Y ) ) } ; d . ClipperBase . SlopesEqual3 = function ( a , b , c ) { return c ? m . op _Equality ( m . Int128Mul ( a . Delta . Y , b . Delta . X ) , m . Int128Mul ( a . Delta . X , b . Delta . Y ) ) : d . Cast _Int64 ( a . Delta . Y * b . Delta . X ) == d . Cast _Int64 ( a . Delta . X * b . Delta . Y ) } ; d . ClipperBase . SlopesEqual4 =
function ( a , b , c , e ) { return e ? m . op _Equality ( m . Int128Mul ( a . Y - b . Y , b . X - c . X ) , m . Int128Mul ( a . X - b . X , b . Y - c . Y ) ) : 0 === d . Cast _Int64 ( ( a . Y - b . Y ) * ( b . X - c . X ) ) - d . Cast _Int64 ( ( a . X - b . X ) * ( b . Y - c . Y ) ) } ; d . ClipperBase . SlopesEqual5 = function ( a , b , c , e , f ) { return f ? m . op _Equality ( m . Int128Mul ( a . Y - b . Y , c . X - e . X ) , m . Int128Mul ( a . X - b . X , c . Y - e . Y ) ) : 0 === d . Cast _Int64 ( ( a . Y - b . Y ) * ( c . X - e . X ) ) - d . Cast _Int64 ( ( a . X - b . X ) * ( c . Y - e . Y ) ) } ; d . ClipperBase . prototype . Clear = function ( ) { this . DisposeLocalMinimaList ( ) ; for ( var a = 0 , b = this . m _edges . length ; a < b ; ++ a ) { for ( var c = 0 ,
e = this . m _edges [ a ] . length ; c < e ; ++ c ) this . m _edges [ a ] [ c ] = null ; d . Clear ( this . m _edges [ a ] ) } d . Clear ( this . m _edges ) ; this . m _HasOpenPaths = this . m _UseFullRange = ! 1 } ; d . ClipperBase . prototype . DisposeLocalMinimaList = function ( ) { for ( ; null !== this . m _MinimaList ; ) { var a = this . m _MinimaList . Next ; this . m _MinimaList = null ; this . m _MinimaList = a } this . m _CurrentLM = null } ; d . ClipperBase . prototype . RangeTest = function ( a , b ) { if ( b . Value ) ( a . X > d . ClipperBase . hiRange || a . Y > d . ClipperBase . hiRange || - a . X > d . ClipperBase . hiRange || - a . Y > d . ClipperBase . hiRange ) &&
d . Error ( "Coordinate outside allowed range in RangeTest()." ) ; else if ( a . X > d . ClipperBase . loRange || a . Y > d . ClipperBase . loRange || - a . X > d . ClipperBase . loRange || - a . Y > d . ClipperBase . loRange ) b . Value = ! 0 , this . RangeTest ( a , b ) } ; d . ClipperBase . prototype . InitEdge = function ( a , b , c , e ) { a . Next = b ; a . Prev = c ; a . Curr . X = e . X ; a . Curr . Y = e . Y ; a . OutIdx = - 1 } ; d . ClipperBase . prototype . InitEdge2 = function ( a , b ) { a . Curr . Y >= a . Next . Curr . Y ? ( a . Bot . X = a . Curr . X , a . Bot . Y = a . Curr . Y , a . Top . X = a . Next . Curr . X , a . Top . Y = a . Next . Curr . Y ) : ( a . Top . X = a . Curr . X , a . Top . Y = a . Curr . Y ,
a . Bot . X = a . Next . Curr . X , a . Bot . Y = a . Next . Curr . Y ) ; this . SetDx ( a ) ; a . PolyTyp = b } ; d . ClipperBase . prototype . FindNextLocMin = function ( a ) { for ( var b ; ; ) { for ( ; d . IntPoint . op _Inequality ( a . Bot , a . Prev . Bot ) || d . IntPoint . op _Equality ( a . Curr , a . Top ) ; ) a = a . Next ; if ( a . Dx != d . ClipperBase . horizontal && a . Prev . Dx != d . ClipperBase . horizontal ) break ; for ( ; a . Prev . Dx == d . ClipperBase . horizontal ; ) a = a . Prev ; for ( b = a ; a . Dx == d . ClipperBase . horizontal ; ) a = a . Next ; if ( a . Top . Y != a . Prev . Bot . Y ) { b . Prev . Bot . X < a . Bot . X && ( a = b ) ; break } } return a } ; d . ClipperBase . prototype . ProcessBound =
function ( a , b ) { var c = a , e = a , f ; a . Dx == d . ClipperBase . horizontal && ( f = b ? a . Prev . Bot . X : a . Next . Bot . X , a . Bot . X != f && this . ReverseHorizontal ( a ) ) ; if ( e . OutIdx != d . ClipperBase . Skip ) if ( b ) { for ( ; e . Top . Y == e . Next . Bot . Y && e . Next . OutIdx != d . ClipperBase . Skip ; ) e = e . Next ; if ( e . Dx == d . ClipperBase . horizontal && e . Next . OutIdx != d . ClipperBase . Skip ) { for ( f = e ; f . Prev . Dx == d . ClipperBase . horizontal ; ) f = f . Prev ; f . Prev . Top . X == e . Next . Top . X ? b || ( e = f . Prev ) : f . Prev . Top . X > e . Next . Top . X && ( e = f . Prev ) } for ( ; a != e ; ) a . NextInLML = a . Next , a . Dx == d . ClipperBase . horizontal &&
a != c && a . Bot . X != a . Prev . Top . X && this . ReverseHorizontal ( a ) , a = a . Next ; a . Dx == d . ClipperBase . horizontal && a != c && a . Bot . X != a . Prev . Top . X && this . ReverseHorizontal ( a ) ; e = e . Next } else { for ( ; e . Top . Y == e . Prev . Bot . Y && e . Prev . OutIdx != d . ClipperBase . Skip ; ) e = e . Prev ; if ( e . Dx == d . ClipperBase . horizontal && e . Prev . OutIdx != d . ClipperBase . Skip ) { for ( f = e ; f . Next . Dx == d . ClipperBase . horizontal ; ) f = f . Next ; f . Next . Top . X == e . Prev . Top . X ? b || ( e = f . Next ) : f . Next . Top . X > e . Prev . Top . X && ( e = f . Next ) } for ( ; a != e ; ) a . NextInLML = a . Prev , a . Dx == d . ClipperBase . horizontal &&
a != c && a . Bot . X != a . Next . Top . X && this . ReverseHorizontal ( a ) , a = a . Prev ; a . Dx == d . ClipperBase . horizontal && a != c && a . Bot . X != a . Next . Top . X && this . ReverseHorizontal ( a ) ; e = e . Prev } if ( e . OutIdx == d . ClipperBase . Skip ) { a = e ; if ( b ) { for ( ; a . Top . Y == a . Next . Bot . Y ; ) a = a . Next ; for ( ; a != e && a . Dx == d . ClipperBase . horizontal ; ) a = a . Prev } else { for ( ; a . Top . Y == a . Prev . Bot . Y ; ) a = a . Prev ; for ( ; a != e && a . Dx == d . ClipperBase . horizontal ; ) a = a . Next } a == e ? e = b ? a . Next : a . Prev : ( a = b ? e . Next : e . Prev , c = new d . LocalMinima , c . Next = null , c . Y = a . Bot . Y , c . LeftBound = null , c . RightBound =
a , c . RightBound . WindDelta = 0 , e = this . ProcessBound ( c . RightBound , b ) , this . InsertLocalMinima ( c ) ) } return e } ; d . ClipperBase . prototype . AddPath = function ( a , b , c ) { c || b != d . PolyType . ptClip || d . Error ( "AddPath: Open paths must be subject." ) ; var e = a . length - 1 ; if ( c ) for ( ; 0 < e && d . IntPoint . op _Equality ( a [ e ] , a [ 0 ] ) ; ) -- e ; for ( ; 0 < e && d . IntPoint . op _Equality ( a [ e ] , a [ e - 1 ] ) ; ) -- e ; if ( c && 2 > e || ! c && 1 > e ) return ! 1 ; for ( var f = [ ] , g = 0 ; g <= e ; g ++ ) f . push ( new d . TEdge ) ; var h = ! 0 ; f [ 1 ] . Curr . X = a [ 1 ] . X ; f [ 1 ] . Curr . Y = a [ 1 ] . Y ; var l = { Value : this . m _UseFullRange } ; this . RangeTest ( a [ 0 ] ,
l ) ; this . m _UseFullRange = l . Value ; l . Value = this . m _UseFullRange ; this . RangeTest ( a [ e ] , l ) ; this . m _UseFullRange = l . Value ; this . InitEdge ( f [ 0 ] , f [ 1 ] , f [ e ] , a [ 0 ] ) ; this . InitEdge ( f [ e ] , f [ 0 ] , f [ e - 1 ] , a [ e ] ) ; for ( g = e - 1 ; 1 <= g ; -- g ) l . Value = this . m _UseFullRange , this . RangeTest ( a [ g ] , l ) , this . m _UseFullRange = l . Value , this . InitEdge ( f [ g ] , f [ g + 1 ] , f [ g - 1 ] , a [ g ] ) ; for ( g = a = e = f [ 0 ] ; ; ) if ( d . IntPoint . op _Equality ( a . Curr , a . Next . Curr ) ) { if ( a == a . Next ) break ; a == e && ( e = a . Next ) ; g = a = this . RemoveEdge ( a ) } else { if ( a . Prev == a . Next ) break ; else if ( c && d . ClipperBase . SlopesEqual ( a . Prev . Curr ,
a . Curr , a . Next . Curr , this . m _UseFullRange ) && ( ! this . PreserveCollinear || ! this . Pt2IsBetweenPt1AndPt3 ( a . Prev . Curr , a . Curr , a . Next . Curr ) ) ) { a == e && ( e = a . Next ) ; a = this . RemoveEdge ( a ) ; g = a = a . Prev ; continue } a = a . Next ; if ( a == g ) break } if ( ! c && a == a . Next || c && a . Prev == a . Next ) return ! 1 ; c || ( this . m _HasOpenPaths = ! 0 , e . Prev . OutIdx = d . ClipperBase . Skip ) ; a = e ; do this . InitEdge2 ( a , b ) , a = a . Next , h && a . Curr . Y != e . Curr . Y && ( h = ! 1 ) ; while ( a != e ) ; if ( h ) { if ( c ) return ! 1 ; a . Prev . OutIdx = d . ClipperBase . Skip ; a . Prev . Bot . X < a . Prev . Top . X && this . ReverseHorizontal ( a . Prev ) ;
b = new d . LocalMinima ; b . Next = null ; b . Y = a . Bot . Y ; b . LeftBound = null ; b . RightBound = a ; b . RightBound . Side = d . EdgeSide . esRight ; for ( b . RightBound . WindDelta = 0 ; a . Next . OutIdx != d . ClipperBase . Skip ; ) a . NextInLML = a . Next , a . Bot . X != a . Prev . Top . X && this . ReverseHorizontal ( a ) , a = a . Next ; this . InsertLocalMinima ( b ) ; this . m _edges . push ( f ) ; return ! 0 } this . m _edges . push ( f ) ; for ( h = null ; ; ) { a = this . FindNextLocMin ( a ) ; if ( a == h ) break ; else null == h && ( h = a ) ; b = new d . LocalMinima ; b . Next = null ; b . Y = a . Bot . Y ; a . Dx < a . Prev . Dx ? ( b . LeftBound = a . Prev , b . RightBound = a , f = ! 1 ) :
( b . LeftBound = a , b . RightBound = a . Prev , f = ! 0 ) ; b . LeftBound . Side = d . EdgeSide . esLeft ; b . RightBound . Side = d . EdgeSide . esRight ; b . LeftBound . WindDelta = c ? b . LeftBound . Next == b . RightBound ? - 1 : 1 : 0 ; b . RightBound . WindDelta = - b . LeftBound . WindDelta ; a = this . ProcessBound ( b . LeftBound , f ) ; e = this . ProcessBound ( b . RightBound , ! f ) ; b . LeftBound . OutIdx == d . ClipperBase . Skip ? b . LeftBound = null : b . RightBound . OutIdx == d . ClipperBase . Skip && ( b . RightBound = null ) ; this . InsertLocalMinima ( b ) ; f || ( a = e ) } return ! 0 } ; d . ClipperBase . prototype . AddPaths = function ( a , b ,
c ) { for ( var e = ! 1 , d = 0 , g = a . length ; d < g ; ++ d ) this . AddPath ( a [ d ] , b , c ) && ( e = ! 0 ) ; return e } ; d . ClipperBase . prototype . Pt2IsBetweenPt1AndPt3 = function ( a , b , c ) { return d . IntPoint . op _Equality ( a , c ) || d . IntPoint . op _Equality ( a , b ) || d . IntPoint . op _Equality ( c , b ) ? ! 1 : a . X != c . X ? b . X > a . X == b . X < c . X : b . Y > a . Y == b . Y < c . Y } ; d . ClipperBase . prototype . RemoveEdge = function ( a ) { a . Prev . Next = a . Next ; a . Next . Prev = a . Prev ; var b = a . Next ; a . Prev = null ; return b } ; d . ClipperBase . prototype . SetDx = function ( a ) { a . Delta . X = a . Top . X - a . Bot . X ; a . Delta . Y = a . Top . Y - a . Bot . Y ; a . Dx =
0 === a . Delta . Y ? d . ClipperBase . horizontal : a . Delta . X / a . Delta . Y } ; d . ClipperBase . prototype . InsertLocalMinima = function ( a ) { if ( null === this . m _MinimaList ) this . m _MinimaList = a ; else if ( a . Y >= this . m _MinimaList . Y ) a . Next = this . m _MinimaList , this . m _MinimaList = a ; else { for ( var b = this . m _MinimaList ; null !== b . Next && a . Y < b . Next . Y ; ) b = b . Next ; a . Next = b . Next ; b . Next = a } } ; d . ClipperBase . prototype . PopLocalMinima = function ( ) { null !== this . m _CurrentLM && ( this . m _CurrentLM = this . m _CurrentLM . Next ) } ; d . ClipperBase . prototype . ReverseHorizontal = function ( a ) { var b =
a . Top . X ; a . Top . X = a . Bot . X ; a . Bot . X = b } ; d . ClipperBase . prototype . Reset = function ( ) { this . m _CurrentLM = this . m _MinimaList ; if ( null != this . m _CurrentLM ) for ( var a = this . m _MinimaList ; null != a ; ) { var b = a . LeftBound ; null != b && ( b . Curr . X = b . Bot . X , b . Curr . Y = b . Bot . Y , b . Side = d . EdgeSide . esLeft , b . OutIdx = d . ClipperBase . Unassigned ) ; b = a . RightBound ; null != b && ( b . Curr . X = b . Bot . X , b . Curr . Y = b . Bot . Y , b . Side = d . EdgeSide . esRight , b . OutIdx = d . ClipperBase . Unassigned ) ; a = a . Next } } ; d . Clipper = function ( a ) { "undefined" == typeof a && ( a = 0 ) ; this . m _PolyOuts = null ; this . m _ClipType =
d . ClipType . ctIntersection ; this . m _IntersectNodeComparer = this . m _IntersectList = this . m _SortedEdges = this . m _ActiveEdges = this . m _Scanbeam = null ; this . m _ExecuteLocked = ! 1 ; this . m _SubjFillType = this . m _ClipFillType = d . PolyFillType . pftEvenOdd ; this . m _GhostJoins = this . m _Joins = null ; this . StrictlySimple = this . ReverseSolution = this . m _UsingPolyTree = ! 1 ; d . ClipperBase . call ( this ) ; this . m _SortedEdges = this . m _ActiveEdges = this . m _Scanbeam = null ; this . m _IntersectList = [ ] ; this . m _IntersectNodeComparer = d . MyIntersectNodeSort . Compare ; this . m _UsingPolyTree =
this . m _ExecuteLocked = ! 1 ; this . m _PolyOuts = [ ] ; this . m _Joins = [ ] ; this . m _GhostJoins = [ ] ; this . ReverseSolution = 0 !== ( 1 & a ) ; this . StrictlySimple = 0 !== ( 2 & a ) ; this . PreserveCollinear = 0 !== ( 4 & a ) } ; d . Clipper . ioReverseSolution = 1 ; d . Clipper . ioStrictlySimple = 2 ; d . Clipper . ioPreserveCollinear = 4 ; d . Clipper . prototype . Clear = function ( ) { 0 !== this . m _edges . length && ( this . DisposeAllPolyPts ( ) , d . ClipperBase . prototype . Clear . call ( this ) ) } ; d . Clipper . prototype . DisposeScanbeamList = function ( ) { for ( ; null !== this . m _Scanbeam ; ) { var a = this . m _Scanbeam . Next ;
this . m _Scanbeam = null ; this . m _Scanbeam = a } } ; d . Clipper . prototype . Reset = function ( ) { d . ClipperBase . prototype . Reset . call ( this ) ; this . m _SortedEdges = this . m _ActiveEdges = this . m _Scanbeam = null ; for ( var a = this . m _MinimaList ; null !== a ; ) this . InsertScanbeam ( a . Y ) , a = a . Next } ; d . Clipper . prototype . InsertScanbeam = function ( a ) { if ( null === this . m _Scanbeam ) this . m _Scanbeam = new d . Scanbeam , this . m _Scanbeam . Next = null , this . m _Scanbeam . Y = a ; else if ( a > this . m _Scanbeam . Y ) { var b = new d . Scanbeam ; b . Y = a ; b . Next = this . m _Scanbeam ; this . m _Scanbeam = b } else { for ( var c =
this . m _Scanbeam ; null !== c . Next && a <= c . Next . Y ; ) c = c . Next ; a != c . Y && ( b = new d . Scanbeam , b . Y = a , b . Next = c . Next , c . Next = b ) } } ; d . Clipper . prototype . Execute = function ( ) { var a = arguments , b = a . length , c = a [ 1 ] instanceof d . PolyTree ; if ( 4 != b || c ) { if ( 4 == b && c ) { var b = a [ 0 ] , e = a [ 1 ] , c = a [ 2 ] , a = a [ 3 ] ; if ( this . m _ExecuteLocked ) return ! 1 ; this . m _ExecuteLocked = ! 0 ; this . m _SubjFillType = c ; this . m _ClipFillType = a ; this . m _ClipType = b ; this . m _UsingPolyTree = ! 0 ; try { ( f = this . ExecuteInternal ( ) ) && this . BuildResult2 ( e ) } finally { this . DisposeAllPolyPts ( ) , this . m _ExecuteLocked =
! 1 } return f } if ( 2 == b && ! c || 2 == b && c ) return b = a [ 0 ] , e = a [ 1 ] , this . Execute ( b , e , d . PolyFillType . pftEvenOdd , d . PolyFillType . pftEvenOdd ) } else { b = a [ 0 ] ; e = a [ 1 ] ; c = a [ 2 ] ; a = a [ 3 ] ; if ( this . m _ExecuteLocked ) return ! 1 ; this . m _HasOpenPaths && d . Error ( "Error: PolyTree struct is need for open path clipping." ) ; this . m _ExecuteLocked = ! 0 ; d . Clear ( e ) ; this . m _SubjFillType = c ; this . m _ClipFillType = a ; this . m _ClipType = b ; this . m _UsingPolyTree = ! 1 ; try { var f = this . ExecuteInternal ( ) ; f && this . BuildResult ( e ) } finally { this . DisposeAllPolyPts ( ) , this . m _ExecuteLocked =
! 1 } return f } } ; d . Clipper . prototype . FixHoleLinkage = function ( a ) { if ( null !== a . FirstLeft && ( a . IsHole == a . FirstLeft . IsHole || null === a . FirstLeft . Pts ) ) { for ( var b = a . FirstLeft ; null !== b && ( b . IsHole == a . IsHole || null === b . Pts ) ; ) b = b . FirstLeft ; a . FirstLeft = b } } ; d . Clipper . prototype . ExecuteInternal = function ( ) { try { this . Reset ( ) ; if ( null === this . m _CurrentLM ) return ! 1 ; var a = this . PopScanbeam ( ) ; do { this . InsertLocalMinimaIntoAEL ( a ) ; d . Clear ( this . m _GhostJoins ) ; this . ProcessHorizontals ( ! 1 ) ; if ( null === this . m _Scanbeam ) break ; var b = this . PopScanbeam ( ) ;
if ( ! this . ProcessIntersections ( a , b ) ) return ! 1 ; this . ProcessEdgesAtTopOfScanbeam ( b ) ; a = b } while ( null !== this . m _Scanbeam || null !== this . m _CurrentLM ) ; for ( var a = 0 , c = this . m _PolyOuts . length ; a < c ; a ++ ) { var e = this . m _PolyOuts [ a ] ; null === e . Pts || e . IsOpen || ( e . IsHole ^ this . ReverseSolution ) == 0 < this . Area ( e ) && this . ReversePolyPtLinks ( e . Pts ) } this . JoinCommonEdges ( ) ; a = 0 ; for ( c = this . m _PolyOuts . length ; a < c ; a ++ ) e = this . m _PolyOuts [ a ] , null === e . Pts || e . IsOpen || this . FixupOutPolygon ( e ) ; this . StrictlySimple && this . DoSimplePolygons ( ) ; return ! 0 } finally { d . Clear ( this . m _Joins ) ,
d . Clear ( this . m _GhostJoins ) } } ; d . Clipper . prototype . PopScanbeam = function ( ) { var a = this . m _Scanbeam . Y ; this . m _Scanbeam = this . m _Scanbeam . Next ; return a } ; d . Clipper . prototype . DisposeAllPolyPts = function ( ) { for ( var a = 0 , b = this . m _PolyOuts . length ; a < b ; ++ a ) this . DisposeOutRec ( a ) ; d . Clear ( this . m _PolyOuts ) } ; d . Clipper . prototype . DisposeOutRec = function ( a ) { var b = this . m _PolyOuts [ a ] ; null !== b . Pts && this . DisposeOutPts ( b . Pts ) ; this . m _PolyOuts [ a ] = null } ; d . Clipper . prototype . DisposeOutPts = function ( a ) { if ( null !== a ) for ( a . Prev . Next = null ; null !==
a ; ) a = a . Next } ; d . Clipper . prototype . AddJoin = function ( a , b , c ) { var e = new d . Join ; e . OutPt1 = a ; e . OutPt2 = b ; e . OffPt . X = c . X ; e . OffPt . Y = c . Y ; this . m _Joins . push ( e ) } ; d . Clipper . prototype . AddGhostJoin = function ( a , b ) { var c = new d . Join ; c . OutPt1 = a ; c . OffPt . X = b . X ; c . OffPt . Y = b . Y ; this . m _GhostJoins . push ( c ) } ; d . Clipper . prototype . InsertLocalMinimaIntoAEL = function ( a ) { for ( ; null !== this . m _CurrentLM && this . m _CurrentLM . Y == a ; ) { var b = this . m _CurrentLM . LeftBound , c = this . m _CurrentLM . RightBound ; this . PopLocalMinima ( ) ; var e = null ; null === b ? ( this . InsertEdgeIntoAEL ( c ,
null ) , this . SetWindingCount ( c ) , this . IsContributing ( c ) && ( e = this . AddOutPt ( c , c . Bot ) ) ) : ( null == c ? ( this . InsertEdgeIntoAEL ( b , null ) , this . SetWindingCount ( b ) , this . IsContributing ( b ) && ( e = this . AddOutPt ( b , b . Bot ) ) ) : ( this . InsertEdgeIntoAEL ( b , null ) , this . InsertEdgeIntoAEL ( c , b ) , this . SetWindingCount ( b ) , c . WindCnt = b . WindCnt , c . WindCnt2 = b . WindCnt2 , this . IsContributing ( b ) && ( e = this . AddLocalMinPoly ( b , c , b . Bot ) ) ) , this . InsertScanbeam ( b . Top . Y ) ) ; null != c && ( d . ClipperBase . IsHorizontal ( c ) ? this . AddEdgeToSEL ( c ) : this . InsertScanbeam ( c . Top . Y ) ) ;
if ( null != b && null != c ) { if ( null !== e && d . ClipperBase . IsHorizontal ( c ) && 0 < this . m _GhostJoins . length && 0 !== c . WindDelta ) for ( var f = 0 , g = this . m _GhostJoins . length ; f < g ; f ++ ) { var h = this . m _GhostJoins [ f ] ; this . HorzSegmentsOverlap ( h . OutPt1 . Pt , h . OffPt , c . Bot , c . Top ) && this . AddJoin ( h . OutPt1 , e , h . OffPt ) } 0 <= b . OutIdx && null !== b . PrevInAEL && b . PrevInAEL . Curr . X == b . Bot . X && 0 <= b . PrevInAEL . OutIdx && d . ClipperBase . SlopesEqual ( b . PrevInAEL , b , this . m _UseFullRange ) && 0 !== b . WindDelta && 0 !== b . PrevInAEL . WindDelta && ( f = this . AddOutPt ( b . PrevInAEL , b . Bot ) ,
this . AddJoin ( e , f , b . Top ) ) ; if ( b . NextInAEL != c && ( 0 <= c . OutIdx && 0 <= c . PrevInAEL . OutIdx && d . ClipperBase . SlopesEqual ( c . PrevInAEL , c , this . m _UseFullRange ) && 0 !== c . WindDelta && 0 !== c . PrevInAEL . WindDelta && ( f = this . AddOutPt ( c . PrevInAEL , c . Bot ) , this . AddJoin ( e , f , c . Top ) ) , e = b . NextInAEL , null !== e ) ) for ( ; e != c ; ) this . IntersectEdges ( c , e , b . Curr , ! 1 ) , e = e . NextInAEL } } } ; d . Clipper . prototype . InsertEdgeIntoAEL = function ( a , b ) { if ( null === this . m _ActiveEdges ) a . PrevInAEL = null , a . NextInAEL = null , this . m _ActiveEdges = a ; else if ( null === b && this . E2InsertsBeforeE1 ( this . m _ActiveEdges ,
a ) ) a . PrevInAEL = null , a . NextInAEL = this . m _ActiveEdges , this . m _ActiveEdges = this . m _ActiveEdges . PrevInAEL = a ; else { null === b && ( b = this . m _ActiveEdges ) ; for ( ; null !== b . NextInAEL && ! this . E2InsertsBeforeE1 ( b . NextInAEL , a ) ; ) b = b . NextInAEL ; a . NextInAEL = b . NextInAEL ; null !== b . NextInAEL && ( b . NextInAEL . PrevInAEL = a ) ; a . PrevInAEL = b ; b . NextInAEL = a } } ; d . Clipper . prototype . E2InsertsBeforeE1 = function ( a , b ) { return b . Curr . X == a . Curr . X ? b . Top . Y > a . Top . Y ? b . Top . X < d . Clipper . TopX ( a , b . Top . Y ) : a . Top . X > d . Clipper . TopX ( b , a . Top . Y ) : b . Curr . X < a . Curr . X } ; d . Clipper . prototype . IsEvenOddFillType =
function ( a ) { return a . PolyTyp == d . PolyType . ptSubject ? this . m _SubjFillType == d . PolyFillType . pftEvenOdd : this . m _ClipFillType == d . PolyFillType . pftEvenOdd } ; d . Clipper . prototype . IsEvenOddAltFillType = function ( a ) { return a . PolyTyp == d . PolyType . ptSubject ? this . m _ClipFillType == d . PolyFillType . pftEvenOdd : this . m _SubjFillType == d . PolyFillType . pftEvenOdd } ; d . Clipper . prototype . IsContributing = function ( a ) { var b , c ; a . PolyTyp == d . PolyType . ptSubject ? ( b = this . m _SubjFillType , c = this . m _ClipFillType ) : ( b = this . m _ClipFillType , c = this . m _SubjFillType ) ;
switch ( b ) { case d . PolyFillType . pftEvenOdd : if ( 0 === a . WindDelta && 1 != a . WindCnt ) return ! 1 ; break ; case d . PolyFillType . pftNonZero : if ( 1 != Math . abs ( a . WindCnt ) ) return ! 1 ; break ; case d . PolyFillType . pftPositive : if ( 1 != a . WindCnt ) return ! 1 ; break ; default : if ( - 1 != a . WindCnt ) return ! 1 } switch ( this . m _ClipType ) { case d . ClipType . ctIntersection : switch ( c ) { case d . PolyFillType . pftEvenOdd : case d . PolyFillType . pftNonZero : return 0 !== a . WindCnt2 ; case d . PolyFillType . pftPositive : return 0 < a . WindCnt2 ; default : return 0 > a . WindCnt2 } case d . ClipType . ctUnion : switch ( c ) { case d . PolyFillType . pftEvenOdd : case d . PolyFillType . pftNonZero : return 0 ===
a . WindCnt2 ; case d . PolyFillType . pftPositive : return 0 >= a . WindCnt2 ; default : return 0 <= a . WindCnt2 } case d . ClipType . ctDifference : if ( a . PolyTyp == d . PolyType . ptSubject ) switch ( c ) { case d . PolyFillType . pftEvenOdd : case d . PolyFillType . pftNonZero : return 0 === a . WindCnt2 ; case d . PolyFillType . pftPositive : return 0 >= a . WindCnt2 ; default : return 0 <= a . WindCnt2 } else switch ( c ) { case d . PolyFillType . pftEvenOdd : case d . PolyFillType . pftNonZero : return 0 !== a . WindCnt2 ; case d . PolyFillType . pftPositive : return 0 < a . WindCnt2 ; default : return 0 >
a . WindCnt2 } case d . ClipType . ctXor : if ( 0 === a . WindDelta ) switch ( c ) { case d . PolyFillType . pftEvenOdd : case d . PolyFillType . pftNonZero : return 0 === a . WindCnt2 ; case d . PolyFillType . pftPositive : return 0 >= a . WindCnt2 ; default : return 0 <= a . WindCnt2 } } return ! 0 } ; d . Clipper . prototype . SetWindingCount = function ( a ) { for ( var b = a . PrevInAEL ; null !== b && ( b . PolyTyp != a . PolyTyp || 0 === b . WindDelta ) ; ) b = b . PrevInAEL ; if ( null === b ) a . WindCnt = 0 === a . WindDelta ? 1 : a . WindDelta , a . WindCnt2 = 0 , b = this . m _ActiveEdges ; else { if ( 0 === a . WindDelta && this . m _ClipType !=
d . ClipType . ctUnion ) a . WindCnt = 1 ; else if ( this . IsEvenOddFillType ( a ) ) if ( 0 === a . WindDelta ) { for ( var c = ! 0 , e = b . PrevInAEL ; null !== e ; ) e . PolyTyp == b . PolyTyp && 0 !== e . WindDelta && ( c = ! c ) , e = e . PrevInAEL ; a . WindCnt = c ? 0 : 1 } else a . WindCnt = a . WindDelta ; else 0 > b . WindCnt * b . WindDelta ? 1 < Math . abs ( b . WindCnt ) ? a . WindCnt = 0 > b . WindDelta * a . WindDelta ? b . WindCnt : b . WindCnt + a . WindDelta : a . WindCnt = 0 === a . WindDelta ? 1 : a . WindDelta : a . WindCnt = 0 === a . WindDelta ? 0 > b . WindCnt ? b . WindCnt - 1 : b . WindCnt + 1 : 0 > b . WindDelta * a . WindDelta ? b . WindCnt : b . WindCnt + a . WindDelta ;
a . WindCnt2 = b . WindCnt2 ; b = b . NextInAEL } if ( this . IsEvenOddAltFillType ( a ) ) for ( ; b != a ; ) 0 !== b . WindDelta && ( a . WindCnt2 = 0 === a . WindCnt2 ? 1 : 0 ) , b = b . NextInAEL ; else for ( ; b != a ; ) a . WindCnt2 += b . WindDelta , b = b . NextInAEL } ; d . Clipper . prototype . AddEdgeToSEL = function ( a ) { null === this . m _SortedEdges ? ( this . m _SortedEdges = a , a . PrevInSEL = null , a . NextInSEL = null ) : ( a . NextInSEL = this . m _SortedEdges , a . PrevInSEL = null , this . m _SortedEdges = this . m _SortedEdges . PrevInSEL = a ) } ; d . Clipper . prototype . CopyAELToSEL = function ( ) { var a = this . m _ActiveEdges ; for ( this . m _SortedEdges =
a ; null !== a ; ) a . PrevInSEL = a . PrevInAEL , a = a . NextInSEL = a . NextInAEL } ; d . Clipper . prototype . SwapPositionsInAEL = function ( a , b ) { if ( a . NextInAEL != a . PrevInAEL && b . NextInAEL != b . PrevInAEL ) { if ( a . NextInAEL == b ) { var c = b . NextInAEL ; null !== c && ( c . PrevInAEL = a ) ; var e = a . PrevInAEL ; null !== e && ( e . NextInAEL = b ) ; b . PrevInAEL = e ; b . NextInAEL = a ; a . PrevInAEL = b ; a . NextInAEL = c } else b . NextInAEL == a ? ( c = a . NextInAEL , null !== c && ( c . PrevInAEL = b ) , e = b . PrevInAEL , null !== e && ( e . NextInAEL = a ) , a . PrevInAEL = e , a . NextInAEL = b , b . PrevInAEL = a , b . NextInAEL = c ) : ( c = a . NextInAEL ,
e = a . PrevInAEL , a . NextInAEL = b . NextInAEL , null !== a . NextInAEL && ( a . NextInAEL . PrevInAEL = a ) , a . PrevInAEL = b . PrevInAEL , null !== a . PrevInAEL && ( a . PrevInAEL . NextInAEL = a ) , b . NextInAEL = c , null !== b . NextInAEL && ( b . NextInAEL . PrevInAEL = b ) , b . PrevInAEL = e , null !== b . PrevInAEL && ( b . PrevInAEL . NextInAEL = b ) ) ; null === a . PrevInAEL ? this . m _ActiveEdges = a : null === b . PrevInAEL && ( this . m _ActiveEdges = b ) } } ; d . Clipper . prototype . SwapPositionsInSEL = function ( a , b ) { if ( null !== a . NextInSEL || null !== a . PrevInSEL ) if ( null !== b . NextInSEL || null !== b . PrevInSEL ) { if ( a . NextInSEL ==
b ) { var c = b . NextInSEL ; null !== c && ( c . PrevInSEL = a ) ; var e = a . PrevInSEL ; null !== e && ( e . NextInSEL = b ) ; b . PrevInSEL = e ; b . NextInSEL = a ; a . PrevInSEL = b ; a . NextInSEL = c } else b . NextInSEL == a ? ( c = a . NextInSEL , null !== c && ( c . PrevInSEL = b ) , e = b . PrevInSEL , null !== e && ( e . NextInSEL = a ) , a . PrevInSEL = e , a . NextInSEL = b , b . PrevInSEL = a , b . NextInSEL = c ) : ( c = a . NextInSEL , e = a . PrevInSEL , a . NextInSEL = b . NextInSEL , null !== a . NextInSEL && ( a . NextInSEL . PrevInSEL = a ) , a . PrevInSEL = b . PrevInSEL , null !== a . PrevInSEL && ( a . PrevInSEL . NextInSEL = a ) , b . NextInSEL = c , null !== b . NextInSEL &&
( b . NextInSEL . PrevInSEL = b ) , b . PrevInSEL = e , null !== b . PrevInSEL && ( b . PrevInSEL . NextInSEL = b ) ) ; null === a . PrevInSEL ? this . m _SortedEdges = a : null === b . PrevInSEL && ( this . m _SortedEdges = b ) } } ; d . Clipper . prototype . AddLocalMaxPoly = function ( a , b , c ) { this . AddOutPt ( a , c ) ; 0 == b . WindDelta && this . AddOutPt ( b , c ) ; a . OutIdx == b . OutIdx ? ( a . OutIdx = - 1 , b . OutIdx = - 1 ) : a . OutIdx < b . OutIdx ? this . AppendPolygon ( a , b ) : this . AppendPolygon ( b , a ) } ; d . Clipper . prototype . AddLocalMinPoly = function ( a , b , c ) { var e , f ; d . ClipperBase . IsHorizontal ( b ) || a . Dx > b . Dx ? ( e = this . AddOutPt ( a ,
c ) , b . OutIdx = a . OutIdx , a . Side = d . EdgeSide . esLeft , b . Side = d . EdgeSide . esRight , f = a , a = f . PrevInAEL == b ? b . PrevInAEL : f . PrevInAEL ) : ( e = this . AddOutPt ( b , c ) , a . OutIdx = b . OutIdx , a . Side = d . EdgeSide . esRight , b . Side = d . EdgeSide . esLeft , f = b , a = f . PrevInAEL == a ? a . PrevInAEL : f . PrevInAEL ) ; null !== a && 0 <= a . OutIdx && d . Clipper . TopX ( a , c . Y ) == d . Clipper . TopX ( f , c . Y ) && d . ClipperBase . SlopesEqual ( f , a , this . m _UseFullRange ) && 0 !== f . WindDelta && 0 !== a . WindDelta && ( c = this . AddOutPt ( a , c ) , this . AddJoin ( e , c , f . Top ) ) ; return e } ; d . Clipper . prototype . CreateOutRec = function ( ) { var a =
new d . OutRec ; a . Idx = - 1 ; a . IsHole = ! 1 ; a . IsOpen = ! 1 ; a . FirstLeft = null ; a . Pts = null ; a . BottomPt = null ; a . PolyNode = null ; this . m _PolyOuts . push ( a ) ; a . Idx = this . m _PolyOuts . length - 1 ; return a } ; d . Clipper . prototype . AddOutPt = function ( a , b ) { var c = a . Side == d . EdgeSide . esLeft ; if ( 0 > a . OutIdx ) { var e = this . CreateOutRec ( ) ; e . IsOpen = 0 === a . WindDelta ; var f = new d . OutPt ; e . Pts = f ; f . Idx = e . Idx ; f . Pt . X = b . X ; f . Pt . Y = b . Y ; f . Next = f ; f . Prev = f ; e . IsOpen || this . SetHoleState ( a , e ) ; a . OutIdx = e . Idx } else { var e = this . m _PolyOuts [ a . OutIdx ] , g = e . Pts ; if ( c && d . IntPoint . op _Equality ( b ,
g . Pt ) ) return g ; if ( ! c && d . IntPoint . op _Equality ( b , g . Prev . Pt ) ) return g . Prev ; f = new d . OutPt ; f . Idx = e . Idx ; f . Pt . X = b . X ; f . Pt . Y = b . Y ; f . Next = g ; f . Prev = g . Prev ; f . Prev . Next = f ; g . Prev = f ; c && ( e . Pts = f ) } return f } ; d . Clipper . prototype . SwapPoints = function ( a , b ) { var c = new d . IntPoint ( a . Value ) ; a . Value . X = b . Value . X ; a . Value . Y = b . Value . Y ; b . Value . X = c . X ; b . Value . Y = c . Y } ; d . Clipper . prototype . HorzSegmentsOverlap = function ( a , b , c , e ) { return a . X > c . X == a . X < e . X ? ! 0 : b . X > c . X == b . X < e . X ? ! 0 : c . X > a . X == c . X < b . X ? ! 0 : e . X > a . X == e . X < b . X ? ! 0 : a . X == c . X && b . X == e . X ? ! 0 : a . X ==
e . X && b . X == c . X ? ! 0 : ! 1 } ; d . Clipper . prototype . InsertPolyPtBetween = function ( a , b , c ) { var e = new d . OutPt ; e . Pt . X = c . X ; e . Pt . Y = c . Y ; b == a . Next ? ( a . Next = e , b . Prev = e , e . Next = b , e . Prev = a ) : ( b . Next = e , a . Prev = e , e . Next = a , e . Prev = b ) ; return e } ; d . Clipper . prototype . SetHoleState = function ( a , b ) { for ( var c = ! 1 , e = a . PrevInAEL ; null !== e ; ) 0 <= e . OutIdx && 0 != e . WindDelta && ( c = ! c , null === b . FirstLeft && ( b . FirstLeft = this . m _PolyOuts [ e . OutIdx ] ) ) , e = e . PrevInAEL ; c && ( b . IsHole = ! 0 ) } ; d . Clipper . prototype . GetDx = function ( a , b ) { return a . Y == b . Y ? d . ClipperBase . horizontal :
( b . X - a . X ) / ( b . Y - a . Y ) } ; d . Clipper . prototype . FirstIsBottomPt = function ( a , b ) { for ( var c = a . Prev ; d . IntPoint . op _Equality ( c . Pt , a . Pt ) && c != a ; ) c = c . Prev ; for ( var e = Math . abs ( this . GetDx ( a . Pt , c . Pt ) ) , c = a . Next ; d . IntPoint . op _Equality ( c . Pt , a . Pt ) && c != a ; ) c = c . Next ; for ( var f = Math . abs ( this . GetDx ( a . Pt , c . Pt ) ) , c = b . Prev ; d . IntPoint . op _Equality ( c . Pt , b . Pt ) && c != b ; ) c = c . Prev ; for ( var g = Math . abs ( this . GetDx ( b . Pt , c . Pt ) ) , c = b . Next ; d . IntPoint . op _Equality ( c . Pt , b . Pt ) && c != b ; ) c = c . Next ; c = Math . abs ( this . GetDx ( b . Pt , c . Pt ) ) ; return e >= g && e >= c || f >= g && f >=
c } ; d . Clipper . prototype . GetBottomPt = function ( a ) { for ( var b = null , c = a . Next ; c != a ; ) c . Pt . Y > a . Pt . Y ? ( a = c , b = null ) : c . Pt . Y == a . Pt . Y && c . Pt . X <= a . Pt . X && ( c . Pt . X < a . Pt . X ? ( b = null , a = c ) : c . Next != a && c . Prev != a && ( b = c ) ) , c = c . Next ; if ( null !== b ) for ( ; b != c ; ) for ( this . FirstIsBottomPt ( c , b ) || ( a = b ) , b = b . Next ; d . IntPoint . op _Inequality ( b . Pt , a . Pt ) ; ) b = b . Next ; return a } ; d . Clipper . prototype . GetLowermostRec = function ( a , b ) { null === a . BottomPt && ( a . BottomPt = this . GetBottomPt ( a . Pts ) ) ; null === b . BottomPt && ( b . BottomPt = this . GetBottomPt ( b . Pts ) ) ; var c = a . BottomPt ,
e = b . BottomPt ; return c . Pt . Y > e . Pt . Y ? a : c . Pt . Y < e . Pt . Y ? b : c . Pt . X < e . Pt . X ? a : c . Pt . X > e . Pt . X ? b : c . Next == c ? b : e . Next == e ? a : this . FirstIsBottomPt ( c , e ) ? a : b } ; d . Clipper . prototype . Param1RightOfParam2 = function ( a , b ) { do if ( a = a . FirstLeft , a == b ) return ! 0 ; while ( null !== a ) ; return ! 1 } ; d . Clipper . prototype . GetOutRec = function ( a ) { for ( a = this . m _PolyOuts [ a ] ; a != this . m _PolyOuts [ a . Idx ] ; ) a = this . m _PolyOuts [ a . Idx ] ; return a } ; d . Clipper . prototype . AppendPolygon = function ( a , b ) { var c = this . m _PolyOuts [ a . OutIdx ] , e = this . m _PolyOuts [ b . OutIdx ] , f ; f = this . Param1RightOfParam2 ( c ,
e ) ? e : this . Param1RightOfParam2 ( e , c ) ? c : this . GetLowermostRec ( c , e ) ; var g = c . Pts , h = g . Prev , l = e . Pts , k = l . Prev ; a . Side == d . EdgeSide . esLeft ? ( b . Side == d . EdgeSide . esLeft ? ( this . ReversePolyPtLinks ( l ) , l . Next = g , g . Prev = l , h . Next = k , k . Prev = h , c . Pts = k ) : ( k . Next = g , g . Prev = k , l . Prev = h , h . Next = l , c . Pts = l ) , g = d . EdgeSide . esLeft ) : ( b . Side == d . EdgeSide . esRight ? ( this . ReversePolyPtLinks ( l ) , h . Next = k , k . Prev = h , l . Next = g , g . Prev = l ) : ( h . Next = l , l . Prev = h , g . Prev = k , k . Next = g ) , g = d . EdgeSide . esRight ) ; c . BottomPt = null ; f == e && ( e . FirstLeft != c && ( c . FirstLeft = e . FirstLeft ) ,
c . IsHole = e . IsHole ) ; e . Pts = null ; e . BottomPt = null ; e . FirstLeft = c ; f = a . OutIdx ; h = b . OutIdx ; a . OutIdx = - 1 ; b . OutIdx = - 1 ; for ( l = this . m _ActiveEdges ; null !== l ; ) { if ( l . OutIdx == h ) { l . OutIdx = f ; l . Side = g ; break } l = l . NextInAEL } e . Idx = c . Idx } ; d . Clipper . prototype . ReversePolyPtLinks = function ( a ) { if ( null !== a ) { var b , c ; b = a ; do c = b . Next , b . Next = b . Prev , b = b . Prev = c ; while ( b != a ) } } ; d . Clipper . SwapSides = function ( a , b ) { var c = a . Side ; a . Side = b . Side ; b . Side = c } ; d . Clipper . SwapPolyIndexes = function ( a , b ) { var c = a . OutIdx ; a . OutIdx = b . OutIdx ; b . OutIdx = c } ; d . Clipper . prototype . IntersectEdges =
function ( a , b , c , e ) { var f = ! e && null === a . NextInLML && a . Top . X == c . X && a . Top . Y == c . Y ; e = ! e && null === b . NextInLML && b . Top . X == c . X && b . Top . Y == c . Y ; var g = 0 <= a . OutIdx , h = 0 <= b . OutIdx ; if ( 0 === a . WindDelta || 0 === b . WindDelta ) 0 === a . WindDelta && 0 === b . WindDelta ? ( f || e ) && g && h && this . AddLocalMaxPoly ( a , b , c ) : a . PolyTyp == b . PolyTyp && a . WindDelta != b . WindDelta && this . m _ClipType == d . ClipType . ctUnion ? 0 === a . WindDelta ? h && ( this . AddOutPt ( a , c ) , g && ( a . OutIdx = - 1 ) ) : g && ( this . AddOutPt ( b , c ) , h && ( b . OutIdx = - 1 ) ) : a . PolyTyp != b . PolyTyp && ( 0 !== a . WindDelta || 1 != Math . abs ( b . WindCnt ) ||
this . m _ClipType == d . ClipType . ctUnion && 0 !== b . WindCnt2 ? 0 !== b . WindDelta || 1 != Math . abs ( a . WindCnt ) || this . m _ClipType == d . ClipType . ctUnion && 0 !== a . WindCnt2 || ( this . AddOutPt ( b , c ) , h && ( b . OutIdx = - 1 ) ) : ( this . AddOutPt ( a , c ) , g && ( a . OutIdx = - 1 ) ) ) , f && ( 0 > a . OutIdx ? this . DeleteFromAEL ( a ) : d . Error ( "Error intersecting polylines" ) ) , e && ( 0 > b . OutIdx ? this . DeleteFromAEL ( b ) : d . Error ( "Error intersecting polylines" ) ) ; else { if ( a . PolyTyp == b . PolyTyp ) if ( this . IsEvenOddFillType ( a ) ) { var l = a . WindCnt ; a . WindCnt = b . WindCnt ; b . WindCnt = l } else a . WindCnt =
0 === a . WindCnt + b . WindDelta ? - a . WindCnt : a . WindCnt + b . WindDelta , b . WindCnt = 0 === b . WindCnt - a . WindDelta ? - b . WindCnt : b . WindCnt - a . WindDelta ; else this . IsEvenOddFillType ( b ) ? a . WindCnt2 = 0 === a . WindCnt2 ? 1 : 0 : a . WindCnt2 += b . WindDelta , this . IsEvenOddFillType ( a ) ? b . WindCnt2 = 0 === b . WindCnt2 ? 1 : 0 : b . WindCnt2 -= a . WindDelta ; var k , n , m ; a . PolyTyp == d . PolyType . ptSubject ? ( k = this . m _SubjFillType , m = this . m _ClipFillType ) : ( k = this . m _ClipFillType , m = this . m _SubjFillType ) ; b . PolyTyp == d . PolyType . ptSubject ? ( n = this . m _SubjFillType , l = this . m _ClipFillType ) :
( n = this . m _ClipFillType , l = this . m _SubjFillType ) ; switch ( k ) { case d . PolyFillType . pftPositive : k = a . WindCnt ; break ; case d . PolyFillType . pftNegative : k = - a . WindCnt ; break ; default : k = Math . abs ( a . WindCnt ) } switch ( n ) { case d . PolyFillType . pftPositive : n = b . WindCnt ; break ; case d . PolyFillType . pftNegative : n = - b . WindCnt ; break ; default : n = Math . abs ( b . WindCnt ) } if ( g && h ) f || e || 0 !== k && 1 != k || 0 !== n && 1 != n || a . PolyTyp != b . PolyTyp && this . m _ClipType != d . ClipType . ctXor ? this . AddLocalMaxPoly ( a , b , c ) : ( this . AddOutPt ( a , c ) , this . AddOutPt ( b , c ) , d . Clipper . SwapSides ( a ,
b ) , d . Clipper . SwapPolyIndexes ( a , b ) ) ; else if ( g ) { if ( 0 === n || 1 == n ) this . AddOutPt ( a , c ) , d . Clipper . SwapSides ( a , b ) , d . Clipper . SwapPolyIndexes ( a , b ) } else if ( h ) { if ( 0 === k || 1 == k ) this . AddOutPt ( b , c ) , d . Clipper . SwapSides ( a , b ) , d . Clipper . SwapPolyIndexes ( a , b ) } else if ( ! ( 0 !== k && 1 != k || 0 !== n && 1 != n || f || e ) ) { switch ( m ) { case d . PolyFillType . pftPositive : g = a . WindCnt2 ; break ; case d . PolyFillType . pftNegative : g = - a . WindCnt2 ; break ; default : g = Math . abs ( a . WindCnt2 ) } switch ( l ) { case d . PolyFillType . pftPositive : h = b . WindCnt2 ; break ; case d . PolyFillType . pftNegative : h =
- b . WindCnt2 ; break ; default : h = Math . abs ( b . WindCnt2 ) } if ( a . PolyTyp != b . PolyTyp ) this . AddLocalMinPoly ( a , b , c ) ; else if ( 1 == k && 1 == n ) switch ( this . m _ClipType ) { case d . ClipType . ctIntersection : 0 < g && 0 < h && this . AddLocalMinPoly ( a , b , c ) ; break ; case d . ClipType . ctUnion : 0 >= g && 0 >= h && this . AddLocalMinPoly ( a , b , c ) ; break ; case d . ClipType . ctDifference : ( a . PolyTyp == d . PolyType . ptClip && 0 < g && 0 < h || a . PolyTyp == d . PolyType . ptSubject && 0 >= g && 0 >= h ) && this . AddLocalMinPoly ( a , b , c ) ; break ; case d . ClipType . ctXor : this . AddLocalMinPoly ( a , b , c ) } else d . Clipper . SwapSides ( a ,
b ) } f != e && ( f && 0 <= a . OutIdx || e && 0 <= b . OutIdx ) && ( d . Clipper . SwapSides ( a , b ) , d . Clipper . SwapPolyIndexes ( a , b ) ) ; f && this . DeleteFromAEL ( a ) ; e && this . DeleteFromAEL ( b ) } } ; d . Clipper . prototype . DeleteFromAEL = function ( a ) { var b = a . PrevInAEL , c = a . NextInAEL ; if ( null !== b || null !== c || a == this . m _ActiveEdges ) null !== b ? b . NextInAEL = c : this . m _ActiveEdges = c , null !== c && ( c . PrevInAEL = b ) , a . NextInAEL = null , a . PrevInAEL = null } ; d . Clipper . prototype . DeleteFromSEL = function ( a ) { var b = a . PrevInSEL , c = a . NextInSEL ; if ( null !== b || null !== c || a == this . m _SortedEdges ) null !==
b ? b . NextInSEL = c : this . m _SortedEdges = c , null !== c && ( c . PrevInSEL = b ) , a . NextInSEL = null , a . PrevInSEL = null } ; d . Clipper . prototype . UpdateEdgeIntoAEL = function ( a ) { null === a . NextInLML && d . Error ( "UpdateEdgeIntoAEL: invalid call" ) ; var b = a . PrevInAEL , c = a . NextInAEL ; a . NextInLML . OutIdx = a . OutIdx ; null !== b ? b . NextInAEL = a . NextInLML : this . m _ActiveEdges = a . NextInLML ; null !== c && ( c . PrevInAEL = a . NextInLML ) ; a . NextInLML . Side = a . Side ; a . NextInLML . WindDelta = a . WindDelta ; a . NextInLML . WindCnt = a . WindCnt ; a . NextInLML . WindCnt2 = a . WindCnt2 ; a = a . NextInLML ;
a . Curr . X = a . Bot . X ; a . Curr . Y = a . Bot . Y ; a . PrevInAEL = b ; a . NextInAEL = c ; d . ClipperBase . IsHorizontal ( a ) || this . InsertScanbeam ( a . Top . Y ) ; return a } ; d . Clipper . prototype . ProcessHorizontals = function ( a ) { for ( var b = this . m _SortedEdges ; null !== b ; ) this . DeleteFromSEL ( b ) , this . ProcessHorizontal ( b , a ) , b = this . m _SortedEdges } ; d . Clipper . prototype . GetHorzDirection = function ( a , b ) { a . Bot . X < a . Top . X ? ( b . Left = a . Bot . X , b . Right = a . Top . X , b . Dir = d . Direction . dLeftToRight ) : ( b . Left = a . Top . X , b . Right = a . Bot . X , b . Dir = d . Direction . dRightToLeft ) } ; d . Clipper . prototype . PrepareHorzJoins =
function ( a , b ) { var c = this . m _PolyOuts [ a . OutIdx ] . Pts ; a . Side != d . EdgeSide . esLeft && ( c = c . Prev ) ; b && ( d . IntPoint . op _Equality ( c . Pt , a . Top ) ? this . AddGhostJoin ( c , a . Bot ) : this . AddGhostJoin ( c , a . Top ) ) } ; d . Clipper . prototype . ProcessHorizontal = function ( a , b ) { var c = { Dir : null , Left : null , Right : null } ; this . GetHorzDirection ( a , c ) ; for ( var e = c . Dir , f = c . Left , g = c . Right , h = a , l = null ; null !== h . NextInLML && d . ClipperBase . IsHorizontal ( h . NextInLML ) ; ) h = h . NextInLML ; for ( null === h . NextInLML && ( l = this . GetMaximaPair ( h ) ) ; ; ) { for ( var k = a == h , n = this . GetNextInAEL ( a ,
e ) ; null !== n && ! ( n . Curr . X == a . Top . X && null !== a . NextInLML && n . Dx < a . NextInLML . Dx ) ; ) { c = this . GetNextInAEL ( n , e ) ; if ( e == d . Direction . dLeftToRight && n . Curr . X <= g || e == d . Direction . dRightToLeft && n . Curr . X >= f ) { 0 <= a . OutIdx && 0 != a . WindDelta && this . PrepareHorzJoins ( a , b ) ; if ( n == l && k ) { e == d . Direction . dLeftToRight ? this . IntersectEdges ( a , n , n . Top , ! 1 ) : this . IntersectEdges ( n , a , n . Top , ! 1 ) ; 0 <= l . OutIdx && d . Error ( "ProcessHorizontal error" ) ; return } if ( e == d . Direction . dLeftToRight ) { var m = new d . IntPoint ( n . Curr . X , a . Curr . Y ) ; this . IntersectEdges ( a ,
n , m , ! 0 ) } else m = new d . IntPoint ( n . Curr . X , a . Curr . Y ) , this . IntersectEdges ( n , a , m , ! 0 ) ; this . SwapPositionsInAEL ( a , n ) } else if ( e == d . Direction . dLeftToRight && n . Curr . X >= g || e == d . Direction . dRightToLeft && n . Curr . X <= f ) break ; n = c } 0 <= a . OutIdx && 0 !== a . WindDelta && this . PrepareHorzJoins ( a , b ) ; if ( null !== a . NextInLML && d . ClipperBase . IsHorizontal ( a . NextInLML ) ) a = this . UpdateEdgeIntoAEL ( a ) , 0 <= a . OutIdx && this . AddOutPt ( a , a . Bot ) , c = { Dir : e , Left : f , Right : g } , this . GetHorzDirection ( a , c ) , e = c . Dir , f = c . Left , g = c . Right ; else break } null !== a . NextInLML ?
0 <= a . OutIdx ? ( e = this . AddOutPt ( a , a . Top ) , a = this . UpdateEdgeIntoAEL ( a ) , 0 !== a . WindDelta && ( f = a . PrevInAEL , c = a . NextInAEL , null !== f && f . Curr . X == a . Bot . X && f . Curr . Y == a . Bot . Y && 0 !== f . WindDelta && 0 <= f . OutIdx && f . Curr . Y > f . Top . Y && d . ClipperBase . SlopesEqual ( a , f , this . m _UseFullRange ) ? ( c = this . AddOutPt ( f , a . Bot ) , this . AddJoin ( e , c , a . Top ) ) : null !== c && c . Curr . X == a . Bot . X && c . Curr . Y == a . Bot . Y && 0 !== c . WindDelta && 0 <= c . OutIdx && c . Curr . Y > c . Top . Y && d . ClipperBase . SlopesEqual ( a , c , this . m _UseFullRange ) && ( c = this . AddOutPt ( c , a . Bot ) , this . AddJoin ( e , c ,
a . Top ) ) ) ) : this . UpdateEdgeIntoAEL ( a ) : null !== l ? 0 <= l . OutIdx ? ( e == d . Direction . dLeftToRight ? this . IntersectEdges ( a , l , a . Top , ! 1 ) : this . IntersectEdges ( l , a , a . Top , ! 1 ) , 0 <= l . OutIdx && d . Error ( "ProcessHorizontal error" ) ) : ( this . DeleteFromAEL ( a ) , this . DeleteFromAEL ( l ) ) : ( 0 <= a . OutIdx && this . AddOutPt ( a , a . Top ) , this . DeleteFromAEL ( a ) ) } ; d . Clipper . prototype . GetNextInAEL = function ( a , b ) { return b == d . Direction . dLeftToRight ? a . NextInAEL : a . PrevInAEL } ; d . Clipper . prototype . IsMinima = function ( a ) { return null !== a && a . Prev . NextInLML != a && a . Next . NextInLML !=
a } ; d . Clipper . prototype . IsMaxima = function ( a , b ) { return null !== a && a . Top . Y == b && null === a . NextInLML } ; d . Clipper . prototype . IsIntermediate = function ( a , b ) { return a . Top . Y == b && null !== a . NextInLML } ; d . Clipper . prototype . GetMaximaPair = function ( a ) { var b = null ; d . IntPoint . op _Equality ( a . Next . Top , a . Top ) && null === a . Next . NextInLML ? b = a . Next : d . IntPoint . op _Equality ( a . Prev . Top , a . Top ) && null === a . Prev . NextInLML && ( b = a . Prev ) ; return null === b || - 2 != b . OutIdx && ( b . NextInAEL != b . PrevInAEL || d . ClipperBase . IsHorizontal ( b ) ) ? b : null } ; d . Clipper . prototype . ProcessIntersections =
function ( a , b ) { if ( null == this . m _ActiveEdges ) return ! 0 ; try { this . BuildIntersectList ( a , b ) ; if ( 0 == this . m _IntersectList . length ) return ! 0 ; if ( 1 == this . m _IntersectList . length || this . FixupIntersectionOrder ( ) ) this . ProcessIntersectList ( ) ; else return ! 1 } catch ( c ) { this . m _SortedEdges = null , this . m _IntersectList . length = 0 , d . Error ( "ProcessIntersections error" ) } this . m _SortedEdges = null ; return ! 0 } ; d . Clipper . prototype . BuildIntersectList = function ( a , b ) { if ( null !== this . m _ActiveEdges ) { var c = this . m _ActiveEdges ; for ( this . m _SortedEdges = c ; null !==
c ; ) c . PrevInSEL = c . PrevInAEL , c . NextInSEL = c . NextInAEL , c . Curr . X = d . Clipper . TopX ( c , b ) , c = c . NextInAEL ; for ( var e = ! 0 ; e && null !== this . m _SortedEdges ; ) { e = ! 1 ; for ( c = this . m _SortedEdges ; null !== c . NextInSEL ; ) { var f = c . NextInSEL , g = new d . IntPoint ; c . Curr . X > f . Curr . X ? ( ! this . IntersectPoint ( c , f , g ) && c . Curr . X > f . Curr . X + 1 && d . Error ( "Intersection error" ) , g . Y > a && ( g . Y = a , Math . abs ( c . Dx ) > Math . abs ( f . Dx ) ? g . X = d . Clipper . TopX ( f , a ) : g . X = d . Clipper . TopX ( c , a ) ) , e = new d . IntersectNode , e . Edge1 = c , e . Edge2 = f , e . Pt . X = g . X , e . Pt . Y = g . Y , this . m _IntersectList . push ( e ) ,
this . SwapPositionsInSEL ( c , f ) , e = ! 0 ) : c = f } if ( null !== c . PrevInSEL ) c . PrevInSEL . NextInSEL = null ; else break } this . m _SortedEdges = null } } ; d . Clipper . prototype . EdgesAdjacent = function ( a ) { return a . Edge1 . NextInSEL == a . Edge2 || a . Edge1 . PrevInSEL == a . Edge2 } ; d . Clipper . IntersectNodeSort = function ( a , b ) { return b . Pt . Y - a . Pt . Y } ; d . Clipper . prototype . FixupIntersectionOrder = function ( ) { this . m _IntersectList . sort ( this . m _IntersectNodeComparer ) ; this . CopyAELToSEL ( ) ; for ( var a = this . m _IntersectList . length , b = 0 ; b < a ; b ++ ) { if ( ! this . EdgesAdjacent ( this . m _IntersectList [ b ] ) ) { for ( var c =
b + 1 ; c < a && ! this . EdgesAdjacent ( this . m _IntersectList [ c ] ) ; ) c ++ ; if ( c == a ) return ! 1 ; var e = this . m _IntersectList [ b ] ; this . m _IntersectList [ b ] = this . m _IntersectList [ c ] ; this . m _IntersectList [ c ] = e } this . SwapPositionsInSEL ( this . m _IntersectList [ b ] . Edge1 , this . m _IntersectList [ b ] . Edge2 ) } return ! 0 } ; d . Clipper . prototype . ProcessIntersectList = function ( ) { for ( var a = 0 , b = this . m _IntersectList . length ; a < b ; a ++ ) { var c = this . m _IntersectList [ a ] ; this . IntersectEdges ( c . Edge1 , c . Edge2 , c . Pt , ! 0 ) ; this . SwapPositionsInAEL ( c . Edge1 , c . Edge2 ) } this . m _IntersectList . length =
0 } ; E = function ( a ) { return 0 > a ? Math . ceil ( a - 0.5 ) : Math . round ( a ) } ; F = function ( a ) { return 0 > a ? Math . ceil ( a - 0.5 ) : Math . floor ( a + 0.5 ) } ; G = function ( a ) { return 0 > a ? - Math . round ( Math . abs ( a ) ) : Math . round ( a ) } ; H = function ( a ) { if ( 0 > a ) return a -= 0.5 , - 2147483648 > a ? Math . ceil ( a ) : a | 0 ; a += 0.5 ; return 2147483647 < a ? Math . floor ( a ) : a | 0 } ; d . Clipper . Round = p ? E : D ? G : J ? H : F ; d . Clipper . TopX = function ( a , b ) { return b == a . Top . Y ? a . Top . X : a . Bot . X + d . Clipper . Round ( a . Dx * ( b - a . Bot . Y ) ) } ; d . Clipper . prototype . IntersectPoint = function ( a , b , c ) { c . X = 0 ; c . Y = 0 ; var e , f ; if ( d . ClipperBase . SlopesEqual ( a ,
b , this . m _UseFullRange ) || a . Dx == b . Dx ) return b . Bot . Y > a . Bot . Y ? ( c . X = b . Bot . X , c . Y = b . Bot . Y ) : ( c . X = a . Bot . X , c . Y = a . Bot . Y ) , ! 1 ; if ( 0 === a . Delta . X ) c . X = a . Bot . X , d . ClipperBase . IsHorizontal ( b ) ? c . Y = b . Bot . Y : ( f = b . Bot . Y - b . Bot . X / b . Dx , c . Y = d . Clipper . Round ( c . X / b . Dx + f ) ) ; else if ( 0 === b . Delta . X ) c . X = b . Bot . X , d . ClipperBase . IsHorizontal ( a ) ? c . Y = a . Bot . Y : ( e = a . Bot . Y - a . Bot . X / a . Dx , c . Y = d . Clipper . Round ( c . X / a . Dx + e ) ) ; else { e = a . Bot . X - a . Bot . Y * a . Dx ; f = b . Bot . X - b . Bot . Y * b . Dx ; var g = ( f - e ) / ( a . Dx - b . Dx ) ; c . Y = d . Clipper . Round ( g ) ; Math . abs ( a . Dx ) < Math . abs ( b . Dx ) ?
c . X = d . Clipper . Round ( a . Dx * g + e ) : c . X = d . Clipper . Round ( b . Dx * g + f ) } if ( c . Y < a . Top . Y || c . Y < b . Top . Y ) { if ( a . Top . Y > b . Top . Y ) return c . Y = a . Top . Y , c . X = d . Clipper . TopX ( b , a . Top . Y ) , c . X < a . Top . X ; c . Y = b . Top . Y ; Math . abs ( a . Dx ) < Math . abs ( b . Dx ) ? c . X = d . Clipper . TopX ( a , c . Y ) : c . X = d . Clipper . TopX ( b , c . Y ) } return ! 0 } ; d . Clipper . prototype . ProcessEdgesAtTopOfScanbeam = function ( a ) { for ( var b = this . m _ActiveEdges ; null !== b ; ) { var c = this . IsMaxima ( b , a ) ; c && ( c = this . GetMaximaPair ( b ) , c = null === c || ! d . ClipperBase . IsHorizontal ( c ) ) ; if ( c ) { var e = b . PrevInAEL ; this . DoMaxima ( b ) ;
b = null === e ? this . m _ActiveEdges : e . NextInAEL } else this . IsIntermediate ( b , a ) && d . ClipperBase . IsHorizontal ( b . NextInLML ) ? ( b = this . UpdateEdgeIntoAEL ( b ) , 0 <= b . OutIdx && this . AddOutPt ( b , b . Bot ) , this . AddEdgeToSEL ( b ) ) : ( b . Curr . X = d . Clipper . TopX ( b , a ) , b . Curr . Y = a ) , this . StrictlySimple && ( e = b . PrevInAEL , 0 <= b . OutIdx && 0 !== b . WindDelta && null !== e && 0 <= e . OutIdx && e . Curr . X == b . Curr . X && 0 !== e . WindDelta && ( c = this . AddOutPt ( e , b . Curr ) , e = this . AddOutPt ( b , b . Curr ) , this . AddJoin ( c , e , b . Curr ) ) ) , b = b . NextInAEL } this . ProcessHorizontals ( ! 0 ) ; for ( b = this . m _ActiveEdges ; null !==
b ; ) { if ( this . IsIntermediate ( b , a ) ) { c = null ; 0 <= b . OutIdx && ( c = this . AddOutPt ( b , b . Top ) ) ; var b = this . UpdateEdgeIntoAEL ( b ) , e = b . PrevInAEL , f = b . NextInAEL ; null !== e && e . Curr . X == b . Bot . X && e . Curr . Y == b . Bot . Y && null !== c && 0 <= e . OutIdx && e . Curr . Y > e . Top . Y && d . ClipperBase . SlopesEqual ( b , e , this . m _UseFullRange ) && 0 !== b . WindDelta && 0 !== e . WindDelta ? ( e = this . AddOutPt ( e , b . Bot ) , this . AddJoin ( c , e , b . Top ) ) : null !== f && f . Curr . X == b . Bot . X && f . Curr . Y == b . Bot . Y && null !== c && 0 <= f . OutIdx && f . Curr . Y > f . Top . Y && d . ClipperBase . SlopesEqual ( b , f , this . m _UseFullRange ) &&
0 !== b . WindDelta && 0 !== f . WindDelta && ( e = this . AddOutPt ( f , b . Bot ) , this . AddJoin ( c , e , b . Top ) ) } b = b . NextInAEL } } ; d . Clipper . prototype . DoMaxima = function ( a ) { var b = this . GetMaximaPair ( a ) ; if ( null === b ) 0 <= a . OutIdx && this . AddOutPt ( a , a . Top ) , this . DeleteFromAEL ( a ) ; else { for ( var c = a . NextInAEL ; null !== c && c != b ; ) this . IntersectEdges ( a , c , a . Top , ! 0 ) , this . SwapPositionsInAEL ( a , c ) , c = a . NextInAEL ; - 1 == a . OutIdx && - 1 == b . OutIdx ? ( this . DeleteFromAEL ( a ) , this . DeleteFromAEL ( b ) ) : 0 <= a . OutIdx && 0 <= b . OutIdx ? this . IntersectEdges ( a , b , a . Top , ! 1 ) : 0 === a . WindDelta ?
( 0 <= a . OutIdx && ( this . AddOutPt ( a , a . Top ) , a . OutIdx = - 1 ) , this . DeleteFromAEL ( a ) , 0 <= b . OutIdx && ( this . AddOutPt ( b , a . Top ) , b . OutIdx = - 1 ) , this . DeleteFromAEL ( b ) ) : d . Error ( "DoMaxima error" ) } } ; d . Clipper . ReversePaths = function ( a ) { for ( var b = 0 , c = a . length ; b < c ; b ++ ) a [ b ] . reverse ( ) } ; d . Clipper . Orientation = function ( a ) { return 0 <= d . Clipper . Area ( a ) } ; d . Clipper . prototype . PointCount = function ( a ) { if ( null === a ) return 0 ; var b = 0 , c = a ; do b ++ , c = c . Next ; while ( c != a ) ; return b } ; d . Clipper . prototype . BuildResult = function ( a ) { d . Clear ( a ) ; for ( var b = 0 , c =
this . m _PolyOuts . length ; b < c ; b ++ ) { var e = this . m _PolyOuts [ b ] ; if ( null !== e . Pts ) { var e = e . Pts . Prev , f = this . PointCount ( e ) ; if ( ! ( 2 > f ) ) { for ( var g = Array ( f ) , h = 0 ; h < f ; h ++ ) g [ h ] = e . Pt , e = e . Prev ; a . push ( g ) } } } } ; d . Clipper . prototype . BuildResult2 = function ( a ) { a . Clear ( ) ; for ( var b = 0 , c = this . m _PolyOuts . length ; b < c ; b ++ ) { var e = this . m _PolyOuts [ b ] , f = this . PointCount ( e . Pts ) ; if ( ! ( e . IsOpen && 2 > f || ! e . IsOpen && 3 > f ) ) { this . FixHoleLinkage ( e ) ; var g = new d . PolyNode ; a . m _AllPolys . push ( g ) ; e . PolyNode = g ; g . m _polygon . length = f ; for ( var e = e . Pts . Prev , h = 0 ; h <
f ; h ++ ) g . m _polygon [ h ] = e . Pt , e = e . Prev } } b = 0 ; for ( c = this . m _PolyOuts . length ; b < c ; b ++ ) e = this . m _PolyOuts [ b ] , null !== e . PolyNode && ( e . IsOpen ? ( e . PolyNode . IsOpen = ! 0 , a . AddChild ( e . PolyNode ) ) : null !== e . FirstLeft && null != e . FirstLeft . PolyNode ? e . FirstLeft . PolyNode . AddChild ( e . PolyNode ) : a . AddChild ( e . PolyNode ) ) } ; d . Clipper . prototype . FixupOutPolygon = function ( a ) { var b = null ; a . BottomPt = null ; for ( var c = a . Pts ; ; ) { if ( c . Prev == c || c . Prev == c . Next ) { this . DisposeOutPts ( c ) ; a . Pts = null ; return } if ( d . IntPoint . op _Equality ( c . Pt , c . Next . Pt ) || d . IntPoint . op _Equality ( c . Pt ,
c . Prev . Pt ) || d . ClipperBase . SlopesEqual ( c . Prev . Pt , c . Pt , c . Next . Pt , this . m _UseFullRange ) && ( ! this . PreserveCollinear || ! this . Pt2IsBetweenPt1AndPt3 ( c . Prev . Pt , c . Pt , c . Next . Pt ) ) ) b = null , c . Prev . Next = c . Next , c = c . Next . Prev = c . Prev ; else if ( c == b ) break ; else null === b && ( b = c ) , c = c . Next } a . Pts = c } ; d . Clipper . prototype . DupOutPt = function ( a , b ) { var c = new d . OutPt ; c . Pt . X = a . Pt . X ; c . Pt . Y = a . Pt . Y ; c . Idx = a . Idx ; b ? ( c . Next = a . Next , c . Prev = a , a . Next . Prev = c , a . Next = c ) : ( c . Prev = a . Prev , c . Next = a , a . Prev . Next = c , a . Prev = c ) ; return c } ; d . Clipper . prototype . GetOverlap =
function ( a , b , c , e , d ) { a < b ? c < e ? ( d . Left = Math . max ( a , c ) , d . Right = Math . min ( b , e ) ) : ( d . Left = Math . max ( a , e ) , d . Right = Math . min ( b , c ) ) : c < e ? ( d . Left = Math . max ( b , c ) , d . Right = Math . min ( a , e ) ) : ( d . Left = Math . max ( b , e ) , d . Right = Math . min ( a , c ) ) ; return d . Left < d . Right } ; d . Clipper . prototype . JoinHorz = function ( a , b , c , e , f , g ) { var h = a . Pt . X > b . Pt . X ? d . Direction . dRightToLeft : d . Direction . dLeftToRight ; e = c . Pt . X > e . Pt . X ? d . Direction . dRightToLeft : d . Direction . dLeftToRight ; if ( h == e ) return ! 1 ; if ( h == d . Direction . dLeftToRight ) { for ( ; a . Next . Pt . X <= f . X && a . Next . Pt . X >=
a . Pt . X && a . Next . Pt . Y == f . Y ; ) a = a . Next ; g && a . Pt . X != f . X && ( a = a . Next ) ; b = this . DupOutPt ( a , ! g ) ; d . IntPoint . op _Inequality ( b . Pt , f ) && ( a = b , a . Pt . X = f . X , a . Pt . Y = f . Y , b = this . DupOutPt ( a , ! g ) ) } else { for ( ; a . Next . Pt . X >= f . X && a . Next . Pt . X <= a . Pt . X && a . Next . Pt . Y == f . Y ; ) a = a . Next ; g || a . Pt . X == f . X || ( a = a . Next ) ; b = this . DupOutPt ( a , g ) ; d . IntPoint . op _Inequality ( b . Pt , f ) && ( a = b , a . Pt . X = f . X , a . Pt . Y = f . Y , b = this . DupOutPt ( a , g ) ) } if ( e == d . Direction . dLeftToRight ) { for ( ; c . Next . Pt . X <= f . X && c . Next . Pt . X >= c . Pt . X && c . Next . Pt . Y == f . Y ; ) c = c . Next ; g && c . Pt . X != f . X && ( c = c . Next ) ;
e = this . DupOutPt ( c , ! g ) ; d . IntPoint . op _Inequality ( e . Pt , f ) && ( c = e , c . Pt . X = f . X , c . Pt . Y = f . Y , e = this . DupOutPt ( c , ! g ) ) } else { for ( ; c . Next . Pt . X >= f . X && c . Next . Pt . X <= c . Pt . X && c . Next . Pt . Y == f . Y ; ) c = c . Next ; g || c . Pt . X == f . X || ( c = c . Next ) ; e = this . DupOutPt ( c , g ) ; d . IntPoint . op _Inequality ( e . Pt , f ) && ( c = e , c . Pt . X = f . X , c . Pt . Y = f . Y , e = this . DupOutPt ( c , g ) ) } h == d . Direction . dLeftToRight == g ? ( a . Prev = c , c . Next = a , b . Next = e , e . Prev = b ) : ( a . Next = c , c . Prev = a , b . Prev = e , e . Next = b ) ; return ! 0 } ; d . Clipper . prototype . JoinPoints = function ( a , b , c ) { var e = a . OutPt1 , f = new d . OutPt ,
g = a . OutPt2 , h = new d . OutPt ; if ( ( h = a . OutPt1 . Pt . Y == a . OffPt . Y ) && d . IntPoint . op _Equality ( a . OffPt , a . OutPt1 . Pt ) && d . IntPoint . op _Equality ( a . OffPt , a . OutPt2 . Pt ) ) { for ( f = a . OutPt1 . Next ; f != e && d . IntPoint . op _Equality ( f . Pt , a . OffPt ) ; ) f = f . Next ; f = f . Pt . Y > a . OffPt . Y ; for ( h = a . OutPt2 . Next ; h != g && d . IntPoint . op _Equality ( h . Pt , a . OffPt ) ; ) h = h . Next ; if ( f == h . Pt . Y > a . OffPt . Y ) return ! 1 ; f ? ( f = this . DupOutPt ( e , ! 1 ) , h = this . DupOutPt ( g , ! 0 ) , e . Prev = g , g . Next = e , f . Next = h , h . Prev = f ) : ( f = this . DupOutPt ( e , ! 0 ) , h = this . DupOutPt ( g , ! 1 ) , e . Next = g , g . Prev = e , f . Prev = h ,
h . Next = f ) ; a . OutPt1 = e ; a . OutPt2 = f ; return ! 0 } if ( h ) { for ( f = e ; e . Prev . Pt . Y == e . Pt . Y && e . Prev != f && e . Prev != g ; ) e = e . Prev ; for ( ; f . Next . Pt . Y == f . Pt . Y && f . Next != e && f . Next != g ; ) f = f . Next ; if ( f . Next == e || f . Next == g ) return ! 1 ; for ( h = g ; g . Prev . Pt . Y == g . Pt . Y && g . Prev != h && g . Prev != f ; ) g = g . Prev ; for ( ; h . Next . Pt . Y == h . Pt . Y && h . Next != g && h . Next != e ; ) h = h . Next ; if ( h . Next == g || h . Next == e ) return ! 1 ; c = { Left : null , Right : null } ; if ( ! this . GetOverlap ( e . Pt . X , f . Pt . X , g . Pt . X , h . Pt . X , c ) ) return ! 1 ; b = c . Left ; var l = c . Right ; c = new d . IntPoint ; e . Pt . X >= b && e . Pt . X <= l ? ( c . X = e . Pt . X ,
c . Y = e . Pt . Y , b = e . Pt . X > f . Pt . X ) : g . Pt . X >= b && g . Pt . X <= l ? ( c . X = g . Pt . X , c . Y = g . Pt . Y , b = g . Pt . X > h . Pt . X ) : f . Pt . X >= b && f . Pt . X <= l ? ( c . X = f . Pt . X , c . Y = f . Pt . Y , b = f . Pt . X > e . Pt . X ) : ( c . X = h . Pt . X , c . Y = h . Pt . Y , b = h . Pt . X > g . Pt . X ) ; a . OutPt1 = e ; a . OutPt2 = g ; return this . JoinHorz ( e , f , g , h , c , b ) } for ( f = e . Next ; d . IntPoint . op _Equality ( f . Pt , e . Pt ) && f != e ; ) f = f . Next ; if ( l = f . Pt . Y > e . Pt . Y || ! d . ClipperBase . SlopesEqual ( e . Pt , f . Pt , a . OffPt , this . m _UseFullRange ) ) { for ( f = e . Prev ; d . IntPoint . op _Equality ( f . Pt , e . Pt ) && f != e ; ) f = f . Prev ; if ( f . Pt . Y > e . Pt . Y || ! d . ClipperBase . SlopesEqual ( e . Pt ,
f . Pt , a . OffPt , this . m _UseFullRange ) ) return ! 1 } for ( h = g . Next ; d . IntPoint . op _Equality ( h . Pt , g . Pt ) && h != g ; ) h = h . Next ; var k = h . Pt . Y > g . Pt . Y || ! d . ClipperBase . SlopesEqual ( g . Pt , h . Pt , a . OffPt , this . m _UseFullRange ) ; if ( k ) { for ( h = g . Prev ; d . IntPoint . op _Equality ( h . Pt , g . Pt ) && h != g ; ) h = h . Prev ; if ( h . Pt . Y > g . Pt . Y || ! d . ClipperBase . SlopesEqual ( g . Pt , h . Pt , a . OffPt , this . m _UseFullRange ) ) return ! 1 } if ( f == e || h == g || f == h || b == c && l == k ) return ! 1 ; l ? ( f = this . DupOutPt ( e , ! 1 ) , h = this . DupOutPt ( g , ! 0 ) , e . Prev = g , g . Next = e , f . Next = h , h . Prev = f ) : ( f = this . DupOutPt ( e , ! 0 ) ,
h = this . DupOutPt ( g , ! 1 ) , e . Next = g , g . Prev = e , f . Prev = h , h . Next = f ) ; a . OutPt1 = e ; a . OutPt2 = f ; return ! 0 } ; d . Clipper . GetBounds = function ( a ) { for ( var b = 0 , c = a . length ; b < c && 0 == a [ b ] . length ; ) b ++ ; if ( b == c ) return new d . IntRect ( 0 , 0 , 0 , 0 ) ; var e = new d . IntRect ; e . left = a [ b ] [ 0 ] . X ; e . right = e . left ; e . top = a [ b ] [ 0 ] . Y ; for ( e . bottom = e . top ; b < c ; b ++ ) for ( var f = 0 , g = a [ b ] . length ; f < g ; f ++ ) a [ b ] [ f ] . X < e . left ? e . left = a [ b ] [ f ] . X : a [ b ] [ f ] . X > e . right && ( e . right = a [ b ] [ f ] . X ) , a [ b ] [ f ] . Y < e . top ? e . top = a [ b ] [ f ] . Y : a [ b ] [ f ] . Y > e . bottom && ( e . bottom = a [ b ] [ f ] . Y ) ; return e } ; d . Clipper . prototype . GetBounds2 =
function ( a ) { var b = a , c = new d . IntRect ; c . left = a . Pt . X ; c . right = a . Pt . X ; c . top = a . Pt . Y ; c . bottom = a . Pt . Y ; for ( a = a . Next ; a != b ; ) a . Pt . X < c . left && ( c . left = a . Pt . X ) , a . Pt . X > c . right && ( c . right = a . Pt . X ) , a . Pt . Y < c . top && ( c . top = a . Pt . Y ) , a . Pt . Y > c . bottom && ( c . bottom = a . Pt . Y ) , a = a . Next ; return c } ; d . Clipper . PointInPolygon = function ( a , b ) { var c = 0 , e = b . length ; if ( 3 > e ) return 0 ; for ( var d = b [ 0 ] , g = 1 ; g <= e ; ++ g ) { var h = g == e ? b [ 0 ] : b [ g ] ; if ( h . Y == a . Y && ( h . X == a . X || d . Y == a . Y && h . X > a . X == d . X < a . X ) ) return - 1 ; if ( d . Y < a . Y != h . Y < a . Y ) if ( d . X >= a . X ) if ( h . X > a . X ) c = 1 - c ; else { var l =
( d . X - a . X ) * ( h . Y - a . Y ) - ( h . X - a . X ) * ( d . Y - a . Y ) ; if ( 0 == l ) return - 1 ; 0 < l == h . Y > d . Y && ( c = 1 - c ) } else if ( h . X > a . X ) { l = ( d . X - a . X ) * ( h . Y - a . Y ) - ( h . X - a . X ) * ( d . Y - a . Y ) ; if ( 0 == l ) return - 1 ; 0 < l == h . Y > d . Y && ( c = 1 - c ) } d = h } return c } ; d . Clipper . prototype . PointInPolygon = function ( a , b ) { for ( var c = 0 , e = b ; ; ) { var d = b . Pt . X , g = b . Pt . Y , h = b . Next . Pt . X , l = b . Next . Pt . Y ; if ( l == a . Y && ( h == a . X || g == a . Y && h > a . X == d < a . X ) ) return - 1 ; if ( g < a . Y != l < a . Y ) if ( d >= a . X ) if ( h > a . X ) c = 1 - c ; else { d = ( d - a . X ) * ( l - a . Y ) - ( h - a . X ) * ( g - a . Y ) ; if ( 0 == d ) return - 1 ; 0 < d == l > g && ( c = 1 - c ) } else if ( h > a . X ) { d = ( d - a . X ) * ( l -
a . Y ) - ( h - a . X ) * ( g - a . Y ) ; if ( 0 == d ) return - 1 ; 0 < d == l > g && ( c = 1 - c ) } b = b . Next ; if ( e == b ) break } return c } ; d . Clipper . prototype . Poly2ContainsPoly1 = function ( a , b ) { var c = a ; do { var e = this . PointInPolygon ( c . Pt , b ) ; if ( 0 <= e ) return 0 != e ; c = c . Next } while ( c != a ) ; return ! 0 } ; d . Clipper . prototype . FixupFirstLefts1 = function ( a , b ) { for ( var c = 0 , e = this . m _PolyOuts . length ; c < e ; c ++ ) { var d = this . m _PolyOuts [ c ] ; null !== d . Pts && d . FirstLeft == a && this . Poly2ContainsPoly1 ( d . Pts , b . Pts ) && ( d . FirstLeft = b ) } } ; d . Clipper . prototype . FixupFirstLefts2 = function ( a , b ) { for ( var c =
0 , e = this . m _PolyOuts , d = e . length , g = e [ c ] ; c < d ; c ++ , g = e [ c ] ) g . FirstLeft == a && ( g . FirstLeft = b ) } ; d . Clipper . ParseFirstLeft = function ( a ) { for ( ; null != a && null == a . Pts ; ) a = a . FirstLeft ; return a } ; d . Clipper . prototype . JoinCommonEdges = function ( ) { for ( var a = 0 , b = this . m _Joins . length ; a < b ; a ++ ) { var c = this . m _Joins [ a ] , e = this . GetOutRec ( c . OutPt1 . Idx ) , f = this . GetOutRec ( c . OutPt2 . Idx ) ; if ( null != e . Pts && null != f . Pts ) { var g ; g = e == f ? e : this . Param1RightOfParam2 ( e , f ) ? f : this . Param1RightOfParam2 ( f , e ) ? e : this . GetLowermostRec ( e , f ) ; if ( this . JoinPoints ( c ,
e , f ) ) if ( e == f ) { e . Pts = c . OutPt1 ; e . BottomPt = null ; f = this . CreateOutRec ( ) ; f . Pts = c . OutPt2 ; this . UpdateOutPtIdxs ( f ) ; if ( this . m _UsingPolyTree ) { g = 0 ; for ( var h = this . m _PolyOuts . length ; g < h - 1 ; g ++ ) { var l = this . m _PolyOuts [ g ] ; null != l . Pts && d . Clipper . ParseFirstLeft ( l . FirstLeft ) == e && l . IsHole != e . IsHole && this . Poly2ContainsPoly1 ( l . Pts , c . OutPt2 ) && ( l . FirstLeft = f ) } } this . Poly2ContainsPoly1 ( f . Pts , e . Pts ) ? ( f . IsHole = ! e . IsHole , f . FirstLeft = e , this . m _UsingPolyTree && this . FixupFirstLefts2 ( f , e ) , ( f . IsHole ^ this . ReverseSolution ) == 0 < this . Area ( f ) &&
this . ReversePolyPtLinks ( f . Pts ) ) : this . Poly2ContainsPoly1 ( e . Pts , f . Pts ) ? ( f . IsHole = e . IsHole , e . IsHole = ! f . IsHole , f . FirstLeft = e . FirstLeft , e . FirstLeft = f , this . m _UsingPolyTree && this . FixupFirstLefts2 ( e , f ) , ( e . IsHole ^ this . ReverseSolution ) == 0 < this . Area ( e ) && this . ReversePolyPtLinks ( e . Pts ) ) : ( f . IsHole = e . IsHole , f . FirstLeft = e . FirstLeft , this . m _UsingPolyTree && this . FixupFirstLefts1 ( e , f ) ) } else f . Pts = null , f . BottomPt = null , f . Idx = e . Idx , e . IsHole = g . IsHole , g == f && ( e . FirstLeft = f . FirstLeft ) , f . FirstLeft = e , this . m _UsingPolyTree && this . FixupFirstLefts2 ( f ,
e ) } } } ; d . Clipper . prototype . UpdateOutPtIdxs = function ( a ) { var b = a . Pts ; do b . Idx = a . Idx , b = b . Prev ; while ( b != a . Pts ) } ; d . Clipper . prototype . DoSimplePolygons = function ( ) { for ( var a = 0 ; a < this . m _PolyOuts . length ; ) { var b = this . m _PolyOuts [ a ++ ] , c = b . Pts ; if ( null !== c ) { do { for ( var e = c . Next ; e != b . Pts ; ) { if ( d . IntPoint . op _Equality ( c . Pt , e . Pt ) && e . Next != c && e . Prev != c ) { var f = c . Prev , g = e . Prev ; c . Prev = g ; g . Next = c ; e . Prev = f ; f . Next = e ; b . Pts = c ; f = this . CreateOutRec ( ) ; f . Pts = e ; this . UpdateOutPtIdxs ( f ) ; this . Poly2ContainsPoly1 ( f . Pts , b . Pts ) ? ( f . IsHole = ! b . IsHole ,
f . FirstLeft = b ) : this . Poly2ContainsPoly1 ( b . Pts , f . Pts ) ? ( f . IsHole = b . IsHole , b . IsHole = ! f . IsHole , f . FirstLeft = b . FirstLeft , b . FirstLeft = f ) : ( f . IsHole = b . IsHole , f . FirstLeft = b . FirstLeft ) ; e = c } e = e . Next } c = c . Next } while ( c != b . Pts ) } } } ; d . Clipper . Area = function ( a ) { var b = a . length ; if ( 3 > b ) return 0 ; for ( var c = 0 , e = 0 , d = b - 1 ; e < b ; ++ e ) c += ( a [ d ] . X + a [ e ] . X ) * ( a [ d ] . Y - a [ e ] . Y ) , d = e ; return 0.5 * - c } ; d . Clipper . prototype . Area = function ( a ) { var b = a . Pts ; if ( null == b ) return 0 ; var c = 0 ; do c += ( b . Prev . Pt . X + b . Pt . X ) * ( b . Prev . Pt . Y - b . Pt . Y ) , b = b . Next ; while ( b != a . Pts ) ;
return 0.5 * c } ; d . Clipper . SimplifyPolygon = function ( a , b ) { var c = [ ] , e = new d . Clipper ( 0 ) ; e . StrictlySimple = ! 0 ; e . AddPath ( a , d . PolyType . ptSubject , ! 0 ) ; e . Execute ( d . ClipType . ctUnion , c , b , b ) ; return c } ; d . Clipper . SimplifyPolygons = function ( a , b ) { "undefined" == typeof b && ( b = d . PolyFillType . pftEvenOdd ) ; var c = [ ] , e = new d . Clipper ( 0 ) ; e . StrictlySimple = ! 0 ; e . AddPaths ( a , d . PolyType . ptSubject , ! 0 ) ; e . Execute ( d . ClipType . ctUnion , c , b , b ) ; return c } ; d . Clipper . DistanceSqrd = function ( a , b ) { var c = a . X - b . X , e = a . Y - b . Y ; return c * c + e * e } ; d . Clipper . DistanceFromLineSqrd =
function ( a , b , c ) { var e = b . Y - c . Y ; c = c . X - b . X ; b = e * b . X + c * b . Y ; b = e * a . X + c * a . Y - b ; return b * b / ( e * e + c * c ) } ; d . Clipper . SlopesNearCollinear = function ( a , b , c , e ) { return d . Clipper . DistanceFromLineSqrd ( b , a , c ) < e } ; d . Clipper . PointsAreClose = function ( a , b , c ) { var e = a . X - b . X ; a = a . Y - b . Y ; return e * e + a * a <= c } ; d . Clipper . ExcludeOp = function ( a ) { var b = a . Prev ; b . Next = a . Next ; a . Next . Prev = b ; b . Idx = 0 ; return b } ; d . Clipper . CleanPolygon = function ( a , b ) { "undefined" == typeof b && ( b = 1.415 ) ; var c = a . length ; if ( 0 == c ) return [ ] ; for ( var e = Array ( c ) , f = 0 ; f < c ; ++ f ) e [ f ] =
new d . OutPt ; for ( f = 0 ; f < c ; ++ f ) e [ f ] . Pt = a [ f ] , e [ f ] . Next = e [ ( f + 1 ) % c ] , e [ f ] . Next . Prev = e [ f ] , e [ f ] . Idx = 0 ; f = b * b ; for ( e = e [ 0 ] ; 0 == e . Idx && e . Next != e . Prev ; ) d . Clipper . PointsAreClose ( e . Pt , e . Prev . Pt , f ) ? ( e = d . Clipper . ExcludeOp ( e ) , c -- ) : d . Clipper . PointsAreClose ( e . Prev . Pt , e . Next . Pt , f ) ? ( d . Clipper . ExcludeOp ( e . Next ) , e = d . Clipper . ExcludeOp ( e ) , c -= 2 ) : d . Clipper . SlopesNearCollinear ( e . Prev . Pt , e . Pt , e . Next . Pt , f ) ? ( e = d . Clipper . ExcludeOp ( e ) , c -- ) : ( e . Idx = 1 , e = e . Next ) ; 3 > c && ( c = 0 ) ; for ( var g = Array ( c ) , f = 0 ; f < c ; ++ f ) g [ f ] = new d . IntPoint ( e . Pt ) , e = e . Next ;
return g } ; d . Clipper . CleanPolygons = function ( a , b ) { for ( var c = Array ( a . length ) , e = 0 , f = a . length ; e < f ; e ++ ) c [ e ] = d . Clipper . CleanPolygon ( a [ e ] , b ) ; return c } ; d . Clipper . Minkowski = function ( a , b , c , e ) { var f = e ? 1 : 0 , g = a . length , h = b . length ; e = [ ] ; if ( c ) for ( c = 0 ; c < h ; c ++ ) { for ( var l = Array ( g ) , k = 0 , n = a . length , m = a [ k ] ; k < n ; k ++ , m = a [ k ] ) l [ k ] = new d . IntPoint ( b [ c ] . X + m . X , b [ c ] . Y + m . Y ) ; e . push ( l ) } else for ( c = 0 ; c < h ; c ++ ) { l = Array ( g ) ; k = 0 ; n = a . length ; for ( m = a [ k ] ; k < n ; k ++ , m = a [ k ] ) l [ k ] = new d . IntPoint ( b [ c ] . X - m . X , b [ c ] . Y - m . Y ) ; e . push ( l ) } a = [ ] ; for ( c = 0 ; c < h - 1 + f ; c ++ ) for ( k =
0 ; k < g ; k ++ ) b = [ ] , b . push ( e [ c % h ] [ k % g ] ) , b . push ( e [ ( c + 1 ) % h ] [ k % g ] ) , b . push ( e [ ( c + 1 ) % h ] [ ( k + 1 ) % g ] ) , b . push ( e [ c % h ] [ ( k + 1 ) % g ] ) , d . Clipper . Orientation ( b ) || b . reverse ( ) , a . push ( b ) ; f = new d . Clipper ( 0 ) ; f . AddPaths ( a , d . PolyType . ptSubject , ! 0 ) ; f . Execute ( d . ClipType . ctUnion , e , d . PolyFillType . pftNonZero , d . PolyFillType . pftNonZero ) ; return e } ; d . Clipper . MinkowskiSum = function ( ) { var a = arguments , b = a . length ; if ( 3 == b ) { var c = a [ 0 ] , e = a [ 2 ] ; return d . Clipper . Minkowski ( c , a [ 1 ] , ! 0 , e ) } if ( 4 == b ) { for ( var c = a [ 0 ] , f = a [ 1 ] , b = a [ 2 ] , e = a [ 3 ] , a = new d . Clipper , g ,
h = 0 , l = f . length ; h < l ; ++ h ) g = d . Clipper . Minkowski ( c , f [ h ] , ! 0 , e ) , a . AddPaths ( g , d . PolyType . ptSubject , ! 0 ) ; e && a . AddPaths ( f , d . PolyType . ptClip , ! 0 ) ; c = new d . Paths ; a . Execute ( d . ClipType . ctUnion , c , b , b ) ; return c } } ; d . Clipper . MinkowskiDiff = function ( a , b , c ) { return d . Clipper . Minkowski ( a , b , ! 1 , c ) } ; d . Clipper . PolyTreeToPaths = function ( a ) { var b = [ ] ; d . Clipper . AddPolyNodeToPaths ( a , d . Clipper . NodeType . ntAny , b ) ; return b } ; d . Clipper . AddPolyNodeToPaths = function ( a , b , c ) { var e = ! 0 ; switch ( b ) { case d . Clipper . NodeType . ntOpen : return ; case d . Clipper . NodeType . ntClosed : e =
! a . IsOpen } 0 < a . m _polygon . length && e && c . push ( a . m _polygon ) ; e = 0 ; a = a . Childs ( ) ; for ( var f = a . length , g = a [ e ] ; e < f ; e ++ , g = a [ e ] ) d . Clipper . AddPolyNodeToPaths ( g , b , c ) } ; d . Clipper . OpenPathsFromPolyTree = function ( a ) { for ( var b = new d . Paths , c = 0 , e = a . ChildCount ( ) ; c < e ; c ++ ) a . Childs ( ) [ c ] . IsOpen && b . push ( a . Childs ( ) [ c ] . m _polygon ) ; return b } ; d . Clipper . ClosedPathsFromPolyTree = function ( a ) { var b = new d . Paths ; d . Clipper . AddPolyNodeToPaths ( a , d . Clipper . NodeType . ntClosed , b ) ; return b } ; K ( d . Clipper , d . ClipperBase ) ; d . Clipper . NodeType = { ntAny : 0 , ntOpen : 1 ,
ntClosed : 2 } ; d . ClipperOffset = function ( a , b ) { "undefined" == typeof a && ( a = 2 ) ; "undefined" == typeof b && ( b = d . ClipperOffset . def _arc _tolerance ) ; this . m _destPolys = new d . Paths ; this . m _srcPoly = new d . Path ; this . m _destPoly = new d . Path ; this . m _normals = [ ] ; this . m _StepsPerRad = this . m _miterLim = this . m _cos = this . m _sin = this . m _sinA = this . m _delta = 0 ; this . m _lowest = new d . IntPoint ; this . m _polyNodes = new d . PolyNode ; this . MiterLimit = a ; this . ArcTolerance = b ; this . m _lowest . X = - 1 } ; d . ClipperOffset . two _pi = 6.28318530717959 ; d . ClipperOffset . def _arc _tolerance =
0.25 ; d . ClipperOffset . prototype . Clear = function ( ) { d . Clear ( this . m _polyNodes . Childs ( ) ) ; this . m _lowest . X = - 1 } ; d . ClipperOffset . Round = d . Clipper . Round ; d . ClipperOffset . prototype . AddPath = function ( a , b , c ) { var e = a . length - 1 ; if ( ! ( 0 > e ) ) { var f = new d . PolyNode ; f . m _jointype = b ; f . m _endtype = c ; if ( c == d . EndType . etClosedLine || c == d . EndType . etClosedPolygon ) for ( ; 0 < e && d . IntPoint . op _Equality ( a [ 0 ] , a [ e ] ) ; ) e -- ; f . m _polygon . push ( a [ 0 ] ) ; var g = 0 ; b = 0 ; for ( var h = 1 ; h <= e ; h ++ ) d . IntPoint . op _Inequality ( f . m _polygon [ g ] , a [ h ] ) && ( g ++ , f . m _polygon . push ( a [ h ] ) ,
a [ h ] . Y > f . m _polygon [ b ] . Y || a [ h ] . Y == f . m _polygon [ b ] . Y && a [ h ] . X < f . m _polygon [ b ] . X ) && ( b = g ) ; if ( ! ( c == d . EndType . etClosedPolygon && 2 > g || c != d . EndType . etClosedPolygon && 0 > g ) && ( this . m _polyNodes . AddChild ( f ) , c == d . EndType . etClosedPolygon ) ) if ( 0 > this . m _lowest . X ) this . m _lowest = new d . IntPoint ( 0 , b ) ; else if ( a = this . m _polyNodes . Childs ( ) [ this . m _lowest . X ] . m _polygon [ this . m _lowest . Y ] , f . m _polygon [ b ] . Y > a . Y || f . m _polygon [ b ] . Y == a . Y && f . m _polygon [ b ] . X < a . X ) this . m _lowest = new d . IntPoint ( this . m _polyNodes . ChildCount ( ) - 1 , b ) } } ; d . ClipperOffset . prototype . AddPaths =
function ( a , b , c ) { for ( var e = 0 , d = a . length ; e < d ; e ++ ) this . AddPath ( a [ e ] , b , c ) } ; d . ClipperOffset . prototype . FixOrientations = function ( ) { if ( 0 <= this . m _lowest . X && ! d . Clipper . Orientation ( this . m _polyNodes . Childs ( ) [ this . m _lowest . X ] . m _polygon ) ) for ( var a = 0 ; a < this . m _polyNodes . ChildCount ( ) ; a ++ ) { var b = this . m _polyNodes . Childs ( ) [ a ] ; ( b . m _endtype == d . EndType . etClosedPolygon || b . m _endtype == d . EndType . etClosedLine && d . Clipper . Orientation ( b . m _polygon ) ) && b . m _polygon . reverse ( ) } else for ( a = 0 ; a < this . m _polyNodes . ChildCount ( ) ; a ++ ) b = this . m _polyNodes . Childs ( ) [ a ] ,
b . m _endtype != d . EndType . etClosedLine || d . Clipper . Orientation ( b . m _polygon ) || b . m _polygon . reverse ( ) } ; d . ClipperOffset . GetUnitNormal = function ( a , b ) { var c = b . X - a . X , e = b . Y - a . Y ; if ( 0 == c && 0 == e ) return new d . DoublePoint ( 0 , 0 ) ; var f = 1 / Math . sqrt ( c * c + e * e ) ; return new d . DoublePoint ( e * f , - ( c * f ) ) } ; d . ClipperOffset . prototype . DoOffset = function ( a ) { this . m _destPolys = [ ] ; this . m _delta = a ; if ( d . ClipperBase . near _zero ( a ) ) for ( var b = 0 ; b < this . m _polyNodes . ChildCount ( ) ; b ++ ) { var c = this . m _polyNodes . Childs ( ) [ b ] ; c . m _endtype == d . EndType . etClosedPolygon &&
this . m _destPolys . push ( c . m _polygon ) } else { this . m _miterLim = 2 < this . MiterLimit ? 2 / ( this . MiterLimit * this . MiterLimit ) : 0.5 ; var b = 0 >= this . ArcTolerance ? d . ClipperOffset . def _arc _tolerance : this . ArcTolerance > Math . abs ( a ) * d . ClipperOffset . def _arc _tolerance ? Math . abs ( a ) * d . ClipperOffset . def _arc _tolerance : this . ArcTolerance , e = 3.14159265358979 / Math . acos ( 1 - b / Math . abs ( a ) ) ; this . m _sin = Math . sin ( d . ClipperOffset . two _pi / e ) ; this . m _cos = Math . cos ( d . ClipperOffset . two _pi / e ) ; this . m _StepsPerRad = e / d . ClipperOffset . two _pi ; 0 > a && ( this . m _sin =
- this . m _sin ) ; for ( b = 0 ; b < this . m _polyNodes . ChildCount ( ) ; b ++ ) { c = this . m _polyNodes . Childs ( ) [ b ] ; this . m _srcPoly = c . m _polygon ; var f = this . m _srcPoly . length ; if ( ! ( 0 == f || 0 >= a && ( 3 > f || c . m _endtype != d . EndType . etClosedPolygon ) ) ) { this . m _destPoly = [ ] ; if ( 1 == f ) if ( c . m _jointype == d . JoinType . jtRound ) for ( var c = 1 , f = 0 , g = 1 ; g <= e ; g ++ ) { this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . X + c * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . Y + f * a ) ) ) ; var h = c , c = c * this . m _cos - this . m _sin * f , f = h * this . m _sin + f * this . m _cos } else for ( f =
c = - 1 , g = 0 ; 4 > g ; ++ g ) this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . X + c * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . Y + f * a ) ) ) , 0 > c ? c = 1 : 0 > f ? f = 1 : c = - 1 ; else { for ( g = this . m _normals . length = 0 ; g < f - 1 ; g ++ ) this . m _normals . push ( d . ClipperOffset . GetUnitNormal ( this . m _srcPoly [ g ] , this . m _srcPoly [ g + 1 ] ) ) ; c . m _endtype == d . EndType . etClosedLine || c . m _endtype == d . EndType . etClosedPolygon ? this . m _normals . push ( d . ClipperOffset . GetUnitNormal ( this . m _srcPoly [ f - 1 ] , this . m _srcPoly [ 0 ] ) ) : this . m _normals . push ( new d . DoublePoint ( this . m _normals [ f -
2 ] ) ) ; if ( c . m _endtype == d . EndType . etClosedPolygon ) for ( h = f - 1 , g = 0 ; g < f ; g ++ ) h = this . OffsetPoint ( g , h , c . m _jointype ) ; else if ( c . m _endtype == d . EndType . etClosedLine ) { h = f - 1 ; for ( g = 0 ; g < f ; g ++ ) h = this . OffsetPoint ( g , h , c . m _jointype ) ; this . m _destPolys . push ( this . m _destPoly ) ; this . m _destPoly = [ ] ; h = this . m _normals [ f - 1 ] ; for ( g = f - 1 ; 0 < g ; g -- ) this . m _normals [ g ] = new d . DoublePoint ( - this . m _normals [ g - 1 ] . X , - this . m _normals [ g - 1 ] . Y ) ; this . m _normals [ 0 ] = new d . DoublePoint ( - h . X , - h . Y ) ; h = 0 ; for ( g = f - 1 ; 0 <= g ; g -- ) h = this . OffsetPoint ( g , h , c . m _jointype ) } else { h =
0 ; for ( g = 1 ; g < f - 1 ; ++ g ) h = this . OffsetPoint ( g , h , c . m _jointype ) ; c . m _endtype == d . EndType . etOpenButt ? ( g = f - 1 , h = new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ g ] . X + this . m _normals [ g ] . X * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ g ] . Y + this . m _normals [ g ] . Y * a ) ) , this . m _destPoly . push ( h ) , h = new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ g ] . X - this . m _normals [ g ] . X * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ g ] . Y - this . m _normals [ g ] . Y * a ) ) , this . m _destPoly . push ( h ) ) : ( g = f - 1 , h = f - 2 , this . m _sinA = 0 , this . m _normals [ g ] = new d . DoublePoint ( - this . m _normals [ g ] . X ,
- this . m _normals [ g ] . Y ) , c . m _endtype == d . EndType . etOpenSquare ? this . DoSquare ( g , h ) : this . DoRound ( g , h ) ) ; for ( g = f - 1 ; 0 < g ; g -- ) this . m _normals [ g ] = new d . DoublePoint ( - this . m _normals [ g - 1 ] . X , - this . m _normals [ g - 1 ] . Y ) ; this . m _normals [ 0 ] = new d . DoublePoint ( - this . m _normals [ 1 ] . X , - this . m _normals [ 1 ] . Y ) ; h = f - 1 ; for ( g = h - 1 ; 0 < g ; -- g ) h = this . OffsetPoint ( g , h , c . m _jointype ) ; c . m _endtype == d . EndType . etOpenButt ? ( h = new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . X - this . m _normals [ 0 ] . X * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . Y - this . m _normals [ 0 ] . Y *
a ) ) , this . m _destPoly . push ( h ) , h = new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . X + this . m _normals [ 0 ] . X * a ) , d . ClipperOffset . Round ( this . m _srcPoly [ 0 ] . Y + this . m _normals [ 0 ] . Y * a ) ) , this . m _destPoly . push ( h ) ) : ( this . m _sinA = 0 , c . m _endtype == d . EndType . etOpenSquare ? this . DoSquare ( 0 , 1 ) : this . DoRound ( 0 , 1 ) ) } } this . m _destPolys . push ( this . m _destPoly ) } } } } ; d . ClipperOffset . prototype . Execute = function ( ) { var a = arguments ; if ( a [ 0 ] instanceof d . PolyTree ) if ( b = a [ 0 ] , c = a [ 1 ] , b . Clear ( ) , this . FixOrientations ( ) , this . DoOffset ( c ) , a = new d . Clipper ( 0 ) ,
a . AddPaths ( this . m _destPolys , d . PolyType . ptSubject , ! 0 ) , 0 < c ) a . Execute ( d . ClipType . ctUnion , b , d . PolyFillType . pftPositive , d . PolyFillType . pftPositive ) ; else if ( c = d . Clipper . GetBounds ( this . m _destPolys ) , e = new d . Path , e . push ( new d . IntPoint ( c . left - 10 , c . bottom + 10 ) ) , e . push ( new d . IntPoint ( c . right + 10 , c . bottom + 10 ) ) , e . push ( new d . IntPoint ( c . right + 10 , c . top - 10 ) ) , e . push ( new d . IntPoint ( c . left - 10 , c . top - 10 ) ) , a . AddPath ( e , d . PolyType . ptSubject , ! 0 ) , a . ReverseSolution = ! 0 , a . Execute ( d . ClipType . ctUnion , b , d . PolyFillType . pftNegative , d . PolyFillType . pftNegative ) ,
1 == b . ChildCount ( ) && 0 < b . Childs ( ) [ 0 ] . ChildCount ( ) ) for ( a = b . Childs ( ) [ 0 ] , b . Childs ( ) [ 0 ] = a . Childs ( ) [ 0 ] , c = 1 ; c < a . ChildCount ( ) ; c ++ ) b . AddChild ( a . Childs ( ) [ c ] ) ; else b . Clear ( ) ; else { var b = a [ 0 ] , c = a [ 1 ] ; d . Clear ( b ) ; this . FixOrientations ( ) ; this . DoOffset ( c ) ; a = new d . Clipper ( 0 ) ; a . AddPaths ( this . m _destPolys , d . PolyType . ptSubject , ! 0 ) ; if ( 0 < c ) a . Execute ( d . ClipType . ctUnion , b , d . PolyFillType . pftPositive , d . PolyFillType . pftPositive ) ; else { var c = d . Clipper . GetBounds ( this . m _destPolys ) , e = new d . Path ; e . push ( new d . IntPoint ( c . left - 10 , c . bottom +
10 ) ) ; e . push ( new d . IntPoint ( c . right + 10 , c . bottom + 10 ) ) ; e . push ( new d . IntPoint ( c . right + 10 , c . top - 10 ) ) ; e . push ( new d . IntPoint ( c . left - 10 , c . top - 10 ) ) ; a . AddPath ( e , d . PolyType . ptSubject , ! 0 ) ; a . ReverseSolution = ! 0 ; a . Execute ( d . ClipType . ctUnion , b , d . PolyFillType . pftNegative , d . PolyFillType . pftNegative ) ; 0 < b . length && b . splice ( 0 , 1 ) } } } ; d . ClipperOffset . prototype . OffsetPoint = function ( a , b , c ) { this . m _sinA = this . m _normals [ b ] . X * this . m _normals [ a ] . Y - this . m _normals [ a ] . X * this . m _normals [ b ] . Y ; if ( 5E-5 > this . m _sinA && - 5E-5 < this . m _sinA ) return b ;
1 < this . m _sinA ? this . m _sinA = 1 : - 1 > this . m _sinA && ( this . m _sinA = - 1 ) ; if ( 0 > this . m _sinA * this . m _delta ) this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X + this . m _normals [ b ] . X * this . m _delta ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + this . m _normals [ b ] . Y * this . m _delta ) ) ) , this . m _destPoly . push ( new d . IntPoint ( this . m _srcPoly [ a ] ) ) , this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X + this . m _normals [ a ] . X * this . m _delta ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + this . m _normals [ a ] . Y *
this . m _delta ) ) ) ; else switch ( c ) { case d . JoinType . jtMiter : c = 1 + ( this . m _normals [ a ] . X * this . m _normals [ b ] . X + this . m _normals [ a ] . Y * this . m _normals [ b ] . Y ) ; c >= this . m _miterLim ? this . DoMiter ( a , b , c ) : this . DoSquare ( a , b ) ; break ; case d . JoinType . jtSquare : this . DoSquare ( a , b ) ; break ; case d . JoinType . jtRound : this . DoRound ( a , b ) } return a } ; d . ClipperOffset . prototype . DoSquare = function ( a , b ) { var c = Math . tan ( Math . atan2 ( this . m _sinA , this . m _normals [ b ] . X * this . m _normals [ a ] . X + this . m _normals [ b ] . Y * this . m _normals [ a ] . Y ) / 4 ) ; this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X +
this . m _delta * ( this . m _normals [ b ] . X - this . m _normals [ b ] . Y * c ) ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + this . m _delta * ( this . m _normals [ b ] . Y + this . m _normals [ b ] . X * c ) ) ) ) ; this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X + this . m _delta * ( this . m _normals [ a ] . X + this . m _normals [ a ] . Y * c ) ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + this . m _delta * ( this . m _normals [ a ] . Y - this . m _normals [ a ] . X * c ) ) ) ) } ; d . ClipperOffset . prototype . DoMiter = function ( a , b , c ) { c = this . m _delta / c ; this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X +
( this . m _normals [ b ] . X + this . m _normals [ a ] . X ) * c ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + ( this . m _normals [ b ] . Y + this . m _normals [ a ] . Y ) * c ) ) ) } ; d . ClipperOffset . prototype . DoRound = function ( a , b ) { for ( var c = Math . atan2 ( this . m _sinA , this . m _normals [ b ] . X * this . m _normals [ a ] . X + this . m _normals [ b ] . Y * this . m _normals [ a ] . Y ) , c = d . Cast _Int32 ( d . ClipperOffset . Round ( this . m _StepsPerRad * Math . abs ( c ) ) ) , e = this . m _normals [ b ] . X , f = this . m _normals [ b ] . Y , g , h = 0 ; h < c ; ++ h ) this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X +
e * this . m _delta ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + f * this . m _delta ) ) ) , g = e , e = e * this . m _cos - this . m _sin * f , f = g * this . m _sin + f * this . m _cos ; this . m _destPoly . push ( new d . IntPoint ( d . ClipperOffset . Round ( this . m _srcPoly [ a ] . X + this . m _normals [ a ] . X * this . m _delta ) , d . ClipperOffset . Round ( this . m _srcPoly [ a ] . Y + this . m _normals [ a ] . Y * this . m _delta ) ) ) } ; d . Error = function ( a ) { try { throw Error ( a ) ; } catch ( b ) { alert ( b . message ) } } ; d . JS = { } ; d . JS . AreaOfPolygon = function ( a , b ) { b || ( b = 1 ) ; return d . Clipper . Area ( a ) / ( b * b ) } ; d . JS . AreaOfPolygons = function ( a ,
b ) { b || ( b = 1 ) ; for ( var c = 0 , e = 0 ; e < a . length ; e ++ ) c += d . Clipper . Area ( a [ e ] ) ; return c / ( b * b ) } ; d . JS . BoundsOfPath = function ( a , b ) { return d . JS . BoundsOfPaths ( [ a ] , b ) } ; d . JS . BoundsOfPaths = function ( a , b ) { b || ( b = 1 ) ; var c = d . Clipper . GetBounds ( a ) ; c . left /= b ; c . bottom /= b ; c . right /= b ; c . top /= b ; return c } ; d . JS . Clean = function ( a , b ) { if ( ! ( a instanceof Array ) ) return [ ] ; var c = a [ 0 ] instanceof Array ; a = d . JS . Clone ( a ) ; if ( "number" != typeof b || null === b ) return d . Error ( "Delta is not a number in Clean()." ) , a ; if ( 0 === a . length || 1 == a . length && 0 === a [ 0 ] . length ||
0 > b ) return a ; c || ( a = [ a ] ) ; for ( var e = a . length , f , g , h , l , k , n , m , p = [ ] , q = 0 ; q < e ; q ++ ) if ( g = a [ q ] , f = g . length , 0 !== f ) if ( 3 > f ) h = g , p . push ( h ) ; else { h = g ; l = b * b ; k = g [ 0 ] ; for ( m = n = 1 ; m < f ; m ++ ) ( g [ m ] . X - k . X ) * ( g [ m ] . X - k . X ) + ( g [ m ] . Y - k . Y ) * ( g [ m ] . Y - k . Y ) <= l || ( h [ n ] = g [ m ] , k = g [ m ] , n ++ ) ; k = g [ n - 1 ] ; ( g [ 0 ] . X - k . X ) * ( g [ 0 ] . X - k . X ) + ( g [ 0 ] . Y - k . Y ) * ( g [ 0 ] . Y - k . Y ) <= l && n -- ; n < f && h . splice ( n , f - n ) ; h . length && p . push ( h ) } ! c && p . length ? p = p [ 0 ] : c || 0 !== p . length ? c && 0 === p . length && ( p = [ [ ] ] ) : p = [ ] ; return p } ; d . JS . Clone = function ( a ) { if ( ! ( a instanceof Array ) || 0 === a . length ) return [ ] ; if ( 1 ==
a . length && 0 === a [ 0 ] . length ) return [ [ ] ] ; var b = a [ 0 ] instanceof Array ; b || ( a = [ a ] ) ; var c = a . length , e , d , g , h , l = Array ( c ) ; for ( d = 0 ; d < c ; d ++ ) { e = a [ d ] . length ; h = Array ( e ) ; for ( g = 0 ; g < e ; g ++ ) h [ g ] = { X : a [ d ] [ g ] . X , Y : a [ d ] [ g ] . Y } ; l [ d ] = h } b || ( l = l [ 0 ] ) ; return l } ; d . JS . Lighten = function ( a , b ) { if ( ! ( a instanceof Array ) ) return [ ] ; if ( "number" != typeof b || null === b ) return d . Error ( "Tolerance is not a number in Lighten()." ) , d . JS . Clone ( a ) ; if ( 0 === a . length || 1 == a . length && 0 === a [ 0 ] . length || 0 > b ) return d . JS . Clone ( a ) ; a [ 0 ] instanceof Array || ( a = [ a ] ) ; var c , e ,
f , g , h , l , k , m , p , q , r , s , t , u , v , x = a . length , y = b * b , w = [ ] ; for ( c = 0 ; c < x ; c ++ ) if ( f = a [ c ] , l = f . length , 0 != l ) { for ( g = 0 ; 1E6 > g ; g ++ ) { h = [ ] ; l = f . length ; f [ l - 1 ] . X != f [ 0 ] . X || f [ l - 1 ] . Y != f [ 0 ] . Y ? ( r = 1 , f . push ( { X : f [ 0 ] . X , Y : f [ 0 ] . Y } ) , l = f . length ) : r = 0 ; q = [ ] ; for ( e = 0 ; e < l - 2 ; e ++ ) { k = f [ e ] ; p = f [ e + 1 ] ; m = f [ e + 2 ] ; u = k . X ; v = k . Y ; k = m . X - u ; s = m . Y - v ; if ( 0 !== k || 0 !== s ) t = ( ( p . X - u ) * k + ( p . Y - v ) * s ) / ( k * k + s * s ) , 1 < t ? ( u = m . X , v = m . Y ) : 0 < t && ( u += k * t , v += s * t ) ; k = p . X - u ; s = p . Y - v ; m = k * k + s * s ; m <= y && ( q [ e + 1 ] = 1 , e ++ ) } h . push ( { X : f [ 0 ] . X , Y : f [ 0 ] . Y } ) ; for ( e = 1 ; e < l - 1 ; e ++ ) q [ e ] || h . push ( { X : f [ e ] . X , Y : f [ e ] . Y } ) ;
h . push ( { X : f [ l - 1 ] . X , Y : f [ l - 1 ] . Y } ) ; r && f . pop ( ) ; if ( q . length ) f = h ; else break } l = h . length ; h [ l - 1 ] . X == h [ 0 ] . X && h [ l - 1 ] . Y == h [ 0 ] . Y && h . pop ( ) ; 2 < h . length && w . push ( h ) } ! a [ 0 ] instanceof Array && ( w = w [ 0 ] ) ; "undefined" == typeof w && ( w = [ [ ] ] ) ; return w } ; d . JS . PerimeterOfPath = function ( a , b , c ) { if ( "undefined" == typeof a ) return 0 ; var e = Math . sqrt , d = 0 , g , h , k = 0 , m = g = 0 ; h = 0 ; var n = a . length ; if ( 2 > n ) return 0 ; b && ( a [ n ] = a [ 0 ] , n ++ ) ; for ( ; -- n ; ) g = a [ n ] , k = g . X , g = g . Y , h = a [ n - 1 ] , m = h . X , h = h . Y , d += e ( ( k - m ) * ( k - m ) + ( g - h ) * ( g - h ) ) ; b && a . pop ( ) ; return d / c } ; d . JS . PerimeterOfPaths =
function ( a , b , c ) { c || ( c = 1 ) ; for ( var e = 0 , f = 0 ; f < a . length ; f ++ ) e += d . JS . PerimeterOfPath ( a [ f ] , b , c ) ; return e } ; d . JS . ScaleDownPath = function ( a , b ) { var c , d ; b || ( b = 1 ) ; for ( c = a . length ; c -- ; ) d = a [ c ] , d . X /= b , d . Y /= b } ; d . JS . ScaleDownPaths = function ( a , b ) { var c , d , f ; b || ( b = 1 ) ; for ( c = a . length ; c -- ; ) for ( d = a [ c ] . length ; d -- ; ) f = a [ c ] [ d ] , f . X /= b , f . Y /= b } ; d . JS . ScaleUpPath = function ( a , b ) { var c , d , f = Math . round ; b || ( b = 1 ) ; for ( c = a . length ; c -- ; ) d = a [ c ] , d . X = f ( d . X * b ) , d . Y = f ( d . Y * b ) } ; d . JS . ScaleUpPaths = function ( a , b ) { var c , d , f , g = Math . round ; b || ( b = 1 ) ; for ( c = a . length ; c -- ; ) for ( d =
a [ c ] . length ; d -- ; ) f = a [ c ] [ d ] , f . X = g ( f . X * b ) , f . Y = g ( f . Y * b ) } ; d . ExPolygons = function ( ) { return [ ] } ; d . ExPolygon = function ( ) { this . holes = this . outer = null } ; d . JS . AddOuterPolyNodeToExPolygons = function ( a , b ) { var c = new d . ExPolygon ; c . outer = a . Contour ( ) ; var e = a . Childs ( ) , f = e . length ; c . holes = Array ( f ) ; var g , h , k , m , n ; for ( h = 0 ; h < f ; h ++ ) for ( g = e [ h ] , c . holes [ h ] = g . Contour ( ) , k = 0 , m = g . Childs ( ) , n = m . length ; k < n ; k ++ ) g = m [ k ] , d . JS . AddOuterPolyNodeToExPolygons ( g , b ) ; b . push ( c ) } ; d . JS . ExPolygonsToPaths = function ( a ) { var b , c , e , f , g = new d . Paths ; b = 0 ; for ( e =
2017-04-04 15:27:04 +02:00
a . length ; b < e ; b ++ ) for ( g . push ( a [ b ] . outer ) , c = 0 , f = a [ b ] . holes . length ; c < f ; c ++ ) g . push ( a [ b ] . holes [ c ] ) ; return g } ; d . JS . PolyTreeToExPolygons = function ( a ) { var b = new d . ExPolygons , c , e , f ; c = 0 ; e = a . Childs ( ) ; for ( f = e . length ; c < f ; c ++ ) a = e [ c ] , d . JS . AddOuterPolyNodeToExPolygons ( a , b ) ; return b } } ) ( ) ;