@arcgis/core 4.32.0-next.20250102 → 4.32.0-next.20250104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/Color.js +1 -1
  2. package/PopupTemplate.js +1 -1
  3. package/arcade/functions/date.js +1 -1
  4. package/arcade/functions/featuresetbase.js +1 -1
  5. package/arcade/functions/featuresetstats.js +1 -1
  6. package/arcade/functions/featuresetstring.js +1 -1
  7. package/arcade/functions/geomasync.js +1 -1
  8. package/arcade/functions/geometry.js +1 -1
  9. package/arcade/functions/geomsync.js +1 -1
  10. package/arcade/functions/knowledgegraph.js +1 -1
  11. package/arcade/functions/string.js +1 -1
  12. package/arcade/geometry/extendedUnitData.js +5 -0
  13. package/arcade/geometry/functions.js +5 -0
  14. package/arcade/geometry/operators.js +5 -0
  15. package/arcade/geometry/unitConversion.js +5 -0
  16. package/arcade/geometry/wkt.js +5 -0
  17. package/arcade/languageUtils.js +1 -1
  18. package/assets/esri/core/workers/RemoteClient.js +1 -1
  19. package/assets/esri/core/workers/chunks/{e371f4f0eb3c22f222df.js → 005727711cca0614c2ab.js} +2 -2
  20. package/assets/esri/core/workers/chunks/{e371f4f0eb3c22f222df.js.LICENSE.txt → 005727711cca0614c2ab.js.LICENSE.txt} +1 -1
  21. package/assets/esri/core/workers/chunks/{2d908c115ea18e813b95.js → 00c0fbe19c12691cf2c3.js} +1 -1
  22. package/assets/esri/core/workers/chunks/08e28328385066c519c2.js +1 -0
  23. package/assets/esri/core/workers/chunks/{0e735d01296d340b393e.js → 0b95ec12218f3c04df18.js} +1 -1
  24. package/assets/esri/core/workers/chunks/{59bf879b4802a5ba431e.js → 0ee669947c23f469e357.js} +1 -1
  25. package/assets/esri/core/workers/chunks/116103ecec27cce47a2f.js +1 -0
  26. package/assets/esri/core/workers/chunks/11f00218905f0db447ff.js +1 -0
  27. package/assets/esri/core/workers/chunks/14b87f3dd9942e6b19d0.js +1 -0
  28. package/assets/esri/core/workers/chunks/16d7c07e1c11b88dae84.js +1 -0
  29. package/assets/esri/core/workers/chunks/1d04fe800cb98e4d6bc4.js +1 -0
  30. package/assets/esri/core/workers/chunks/{71f6e5742cf0c482066b.js → 1dc6b5b177022b80c473.js} +1 -1
  31. package/assets/esri/core/workers/chunks/{59455e2dd44b4c01cc76.js → 2586741c359057b3f626.js} +1 -1
  32. package/assets/esri/core/workers/chunks/{250a810dd4e1ff293564.js → 318a39b56851e707edad.js} +1 -1
  33. package/assets/esri/core/workers/chunks/{648d7d8fa19a2e772c89.js → 3582836342fa78873fe4.js} +1 -1
  34. package/assets/esri/core/workers/chunks/{b1e4813f0c73fc2a483c.js → 370b230fd2d7703d0698.js} +2 -2
  35. package/assets/esri/core/workers/chunks/{b1e4813f0c73fc2a483c.js.LICENSE.txt → 370b230fd2d7703d0698.js.LICENSE.txt} +1 -1
  36. package/assets/esri/core/workers/chunks/{ebf9caf2dc8af89afec2.js → 42aa697b4718b75b8cb2.js} +2 -2
  37. package/assets/esri/core/workers/chunks/{ebf9caf2dc8af89afec2.js.LICENSE.txt → 42aa697b4718b75b8cb2.js.LICENSE.txt} +1 -1
  38. package/assets/esri/core/workers/chunks/44cc3ea8cec8ddd1e3ab.js +1 -0
  39. package/assets/esri/core/workers/chunks/{801dbea20966806db1c9.js → 53cd990b2c988518de6d.js} +1 -1
  40. package/assets/esri/core/workers/chunks/5a1eb0d1e25ff5574c43.js +1 -0
  41. package/assets/esri/core/workers/chunks/6157c49e7431f5868c77.js +1 -0
  42. package/assets/esri/core/workers/chunks/{eef2d94a73064f9bc085.js → 61d64f163840563017d5.js} +1 -1
  43. package/assets/esri/core/workers/chunks/6ed57d01be6bc054c7cd.js +1 -0
  44. package/assets/esri/core/workers/chunks/7254956381e823219db0.js +1 -0
  45. package/assets/esri/core/workers/chunks/740e6bdb3b76f2ea6d61.js +1 -0
  46. package/assets/esri/core/workers/chunks/756c2f7c8659deab6c96.js.LICENSE.txt +1 -1
  47. package/assets/esri/core/workers/chunks/{56fc353421252f2d0a99.js → 75e8ba7e02647b7216ae.js} +1 -1
  48. package/assets/esri/core/workers/chunks/89d7eec47e5b29935d92.js +1 -0
  49. package/assets/esri/core/workers/chunks/8cd2c9ec1e541836b81c.js +1 -0
  50. package/assets/esri/core/workers/chunks/{0b3e1e903120da297641.js → 932375de79e3d33bc4d7.js} +1 -1
  51. package/assets/esri/core/workers/chunks/{263adfd1c2641ef5c0f5.js → 95f23bd17ce9e07fc8ef.js} +1 -1
  52. package/assets/esri/core/workers/chunks/{7de9c01849c4aa1940e7.js → 986889cea53c4a470347.js} +1 -1
  53. package/assets/esri/core/workers/chunks/{cc6160e8ab3cea4040c2.js → 9e9b2fd958e816b1b5f6.js} +1 -1
  54. package/assets/esri/core/workers/chunks/a57cead317eb2fc9afd8.js +1 -0
  55. package/assets/esri/core/workers/chunks/acec58a7f23b2cc938ee.js +1 -0
  56. package/assets/esri/core/workers/chunks/b0f4254d8a32dd713009.js +1 -0
  57. package/assets/esri/core/workers/chunks/b277b8c2f556918e4f9a.js +1 -0
  58. package/assets/esri/core/workers/chunks/{deffd56e39ce725ce377.js → b30046a40bcfbec8abe4.js} +1 -1
  59. package/assets/esri/core/workers/chunks/{5c11e2e65b97565e5003.js → b7db64b07edb0b37ece1.js} +1 -1
  60. package/assets/esri/core/workers/chunks/bd1fb82e8bac439d05ea.js +1 -0
  61. package/assets/esri/core/workers/chunks/bf0a0ca7fdac98f06a89.js.LICENSE.txt +1 -1
  62. package/assets/esri/core/workers/chunks/c44ce0302dc82fb66ada.js +1 -0
  63. package/assets/esri/core/workers/chunks/c52872a50a5989121388.js +1 -0
  64. package/assets/esri/core/workers/chunks/c8cd6ba5600d8ff8db0b.js +2 -0
  65. package/assets/esri/core/workers/chunks/{a100fb789d72410f8d4f.js.LICENSE.txt → c8cd6ba5600d8ff8db0b.js.LICENSE.txt} +1 -1
  66. package/assets/esri/core/workers/chunks/{57c1370b310768c0790a.js → ca1e186f136abb23ae4b.js} +1 -1
  67. package/assets/esri/core/workers/chunks/{d14e4fc82ad772899336.js → ca4a37bdc0f7fb705146.js} +1 -1
  68. package/assets/esri/core/workers/chunks/cb94fc9b0f613ad50b3f.js +1 -0
  69. package/assets/esri/core/workers/chunks/d20764cc99fcabcb7cbf.js +1 -0
  70. package/assets/esri/core/workers/chunks/df18a72e3625cbe31935.js +1 -0
  71. package/assets/esri/core/workers/chunks/eff8fcb6393cd1193cbc.js +1 -0
  72. package/assets/esri/core/workers/chunks/f19d3c855f6e93544918.js +1 -0
  73. package/assets/esri/core/workers/chunks/f4e3db71d1adae717535.js +2 -0
  74. package/assets/esri/core/workers/chunks/{d82b3e2905cab511ff3a.js.LICENSE.txt → f4e3db71d1adae717535.js.LICENSE.txt} +1 -1
  75. package/assets/esri/core/workers/chunks/{60b40b2319d1651dd150.js → f7e50a8284d12da21355.js} +1 -1
  76. package/assets/esri/core/workers/chunks/f9c0d571f62e611ffe2b.js +1 -0
  77. package/assets/esri/core/workers/chunks/fdfe8e0d942b78f08191.js +1 -0
  78. package/assets/esri/core/workers/chunks/ff21207f46a354786eed.js +1 -0
  79. package/assets/esri/libs/parquet/pkg/arcgis_parquet_bg.wasm +0 -0
  80. package/chunks/Bufferer-BiY2mtjI.js +1 -1
  81. package/chunks/Centroid-DZi-eb9F.js +1 -1
  82. package/chunks/Clipper-a9xfvRaw.js +1 -1
  83. package/chunks/CrackAndCluster-CfzXpEle.js +1 -1
  84. package/chunks/Distance2DCalculator-eS0piaux.js +1 -1
  85. package/chunks/GeodeticDistanceCalculator-bNilDneE.js +1 -1
  86. package/chunks/Geometry.js +1 -1
  87. package/chunks/GeometryCleaner-DVgW95-D.js +1 -1
  88. package/chunks/Intersector-K1VmdfQW.js +1 -1
  89. package/chunks/LineSeries.js +1 -1
  90. package/chunks/OperatorClip.js +1 -1
  91. package/chunks/OperatorCrosses.js +1 -1
  92. package/chunks/OperatorCut.js +1 -1
  93. package/chunks/OperatorDensify.js +1 -1
  94. package/chunks/OperatorDifference.js +1 -1
  95. package/chunks/OperatorGeneralize.js +1 -1
  96. package/chunks/OperatorGeodesicBuffer.js +1 -1
  97. package/chunks/OperatorGeodeticArea.js +1 -1
  98. package/chunks/OperatorGeodeticDensifyByLength.js +1 -1
  99. package/chunks/OperatorGeodeticDistance.js +1 -1
  100. package/chunks/OperatorGeodeticLength.js +1 -1
  101. package/chunks/OperatorIntersection.js +1 -1
  102. package/chunks/OperatorIntersects.js +1 -1
  103. package/chunks/OperatorMultiPartToSinglePart.js +1 -1
  104. package/chunks/OperatorOverlaps.js +1 -1
  105. package/chunks/OperatorProject.js +1 -1
  106. package/chunks/OperatorProximity.js +1 -1
  107. package/chunks/OperatorProximityGeodesic.js +1 -1
  108. package/chunks/OperatorShapePreservingDensify.js +1 -1
  109. package/chunks/OperatorShapePreservingLength.js +1 -1
  110. package/chunks/OperatorSimplify.js +1 -1
  111. package/chunks/OperatorTouches.js +1 -1
  112. package/chunks/OperatorUnion.js +1 -1
  113. package/chunks/OperatorWithin.js +1 -1
  114. package/chunks/QuadraticBezier.js +1 -1
  115. package/chunks/SideCalculator2D-Bf4QCxCR.js +1 -1
  116. package/chunks/Theme.js +1 -1
  117. package/chunks/Tick.js +1 -1
  118. package/chunks/Transformation2D.js +1 -1
  119. package/chunks/arcade.js +1 -1
  120. package/chunks/areaOperator.js +5 -0
  121. package/chunks/array.js +1 -1
  122. package/chunks/bufferOperator.js +5 -0
  123. package/chunks/centroidOperator.js +5 -0
  124. package/chunks/chartUtilsAm5.js +1 -1
  125. package/chunks/clipOperator.js +5 -0
  126. package/chunks/containsOperator.js +5 -0
  127. package/chunks/convexHullOperator.js +5 -0
  128. package/chunks/crossesOperator.js +5 -0
  129. package/chunks/cutOperator.js +5 -0
  130. package/chunks/densifyOperator.js +5 -0
  131. package/chunks/differenceOperator.js +5 -0
  132. package/chunks/disjointOperator.js +5 -0
  133. package/chunks/distanceOperator.js +5 -0
  134. package/chunks/equalsOperator.js +5 -0
  135. package/chunks/generalizeOperator.js +5 -0
  136. package/chunks/geodesicBufferOperator.js +5 -0
  137. package/chunks/geodeticAreaOperator.js +5 -0
  138. package/chunks/geodeticDensifyOperator.js +5 -0
  139. package/chunks/geodeticLengthOperator.js +5 -0
  140. package/chunks/i3s.js +1 -1
  141. package/chunks/intersectionOperator.js +5 -0
  142. package/chunks/intersectsOperator.js +5 -0
  143. package/chunks/languageUtils.js +1 -1
  144. package/chunks/lclayout.js +1 -1
  145. package/chunks/lengthOperator.js +5 -0
  146. package/chunks/lyr3DMain.js +1 -1
  147. package/chunks/lyr3DWorker.js +1 -1
  148. package/chunks/offsetOperator.js +5 -0
  149. package/chunks/overlapsOperator.js +5 -0
  150. package/chunks/pe-wasm.js +1 -1
  151. package/chunks/proximityOperator.js +5 -0
  152. package/chunks/relateOperator.js +5 -0
  153. package/chunks/simplifyOperator.js +5 -0
  154. package/chunks/symmetricDifferenceOperator.js +5 -0
  155. package/chunks/touchesOperator.js +5 -0
  156. package/chunks/unionOperator.js +5 -0
  157. package/chunks/vxlLayer.js +1 -1
  158. package/chunks/withinOperator.js +5 -0
  159. package/copyright.txt +2 -2
  160. package/core/Evented.js +1 -1
  161. package/geometry/operators/areaOperator.js +1 -1
  162. package/geometry/operators/bufferOperator.js +1 -1
  163. package/geometry/operators/centroidOperator.js +1 -1
  164. package/geometry/operators/clipOperator.js +1 -1
  165. package/geometry/operators/containsOperator.js +1 -1
  166. package/geometry/operators/convexHullOperator.js +1 -1
  167. package/geometry/operators/crossesOperator.js +1 -1
  168. package/geometry/operators/cutOperator.js +1 -1
  169. package/geometry/operators/densifyOperator.js +1 -1
  170. package/geometry/operators/differenceOperator.js +1 -1
  171. package/geometry/operators/disjointOperator.js +1 -1
  172. package/geometry/operators/distanceOperator.js +1 -1
  173. package/geometry/operators/equalsOperator.js +1 -1
  174. package/geometry/operators/extendOperator.js +1 -1
  175. package/geometry/operators/generalizeOperator.js +1 -1
  176. package/geometry/operators/geodesicBufferOperator.js +1 -1
  177. package/geometry/operators/geodeticAreaOperator.js +1 -1
  178. package/geometry/operators/geodeticDensifyOperator.js +1 -1
  179. package/geometry/operators/geodeticLengthOperator.js +1 -1
  180. package/geometry/operators/gx/operatorAffineTransform.js +1 -1
  181. package/geometry/operators/gx/operatorAlphaShape.js +1 -1
  182. package/geometry/operators/gx/operatorAutoComplete.js +1 -1
  183. package/geometry/operators/gx/operatorBoundary.js +1 -1
  184. package/geometry/operators/gx/operatorBuffer.js +1 -1
  185. package/geometry/operators/gx/operatorConvexHull.js +1 -1
  186. package/geometry/operators/gx/operatorGraphicBuffer.js +1 -1
  187. package/geometry/operators/gx/operatorIntegrate.js +1 -1
  188. package/geometry/operators/gx/operatorLabelPoint.js +1 -1
  189. package/geometry/operators/gx/operatorLinesToPolygons.js +1 -1
  190. package/geometry/operators/gx/operatorLocateBetween.js +1 -1
  191. package/geometry/operators/gx/operatorMinimumBoundingCircle.js +1 -1
  192. package/geometry/operators/gx/operatorOffset.js +1 -1
  193. package/geometry/operators/gx/operatorPolygonOverlay.js +1 -1
  194. package/geometry/operators/gx/operatorPolygonSlicer.js +1 -1
  195. package/geometry/operators/gx/operatorSinglePartToMultiPart.js +1 -1
  196. package/geometry/operators/gx/operatorSymmetricDifference.js +1 -1
  197. package/geometry/operators/intersectionOperator.js +1 -1
  198. package/geometry/operators/intersectsOperator.js +1 -1
  199. package/geometry/operators/isNearOperator.js +1 -1
  200. package/geometry/operators/json/disjointOperator.js +1 -1
  201. package/geometry/operators/lengthOperator.js +1 -1
  202. package/geometry/operators/offsetOperator.js +1 -1
  203. package/geometry/operators/overlapsOperator.js +1 -1
  204. package/geometry/operators/proximityOperator.js +1 -1
  205. package/geometry/operators/relateOperator.js +1 -1
  206. package/geometry/operators/reshapeOperator.js +1 -1
  207. package/geometry/operators/simplifyOperator.js +1 -1
  208. package/geometry/operators/support/apiConverter.js +1 -1
  209. package/geometry/operators/support/jsonConverter.js +1 -1
  210. package/geometry/operators/symmetricDifferenceOperator.js +1 -1
  211. package/geometry/operators/touchesOperator.js +1 -1
  212. package/geometry/operators/unionOperator.js +1 -1
  213. package/geometry/operators/withinOperator.js +1 -1
  214. package/geometry/support/contains.js +1 -1
  215. package/interfaces.d.ts +56 -0
  216. package/kernel.js +1 -1
  217. package/layers/KMLLayer.js +1 -1
  218. package/layers/WCSLayer.js +1 -1
  219. package/layers/graphics/sources/ParquetSource.js +1 -1
  220. package/layers/support/parquetLayerUtils.js +1 -1
  221. package/layers/support/rasterDatasets/WCSRaster.js +1 -1
  222. package/layers/support/rasterFormats/RasterCodec.js +1 -1
  223. package/layers/support/rasterFormats/TiffDecoder.js +1 -1
  224. package/layers/support/wmtsUtils.js +1 -1
  225. package/libs/parquet/parquet.js +1 -1
  226. package/package.json +3 -3
  227. package/smartMapping/renderers/support/utils.js +1 -1
  228. package/smartMapping/symbology/support/Theme.js +1 -1
  229. package/support/revision.js +1 -1
  230. package/views/2d/layers/features/FeatureContainer.js +1 -1
  231. package/views/2d/layers/features/FeaturePipelineWorker.js +1 -1
  232. package/views/2d/layers/features/Processor.js +1 -1
  233. package/views/2d/layers/features/sources/FeatureSource.js +1 -1
  234. package/views/2d/layers/features/sources/strategies/ParquetLoadStrategy.js +1 -1
  235. package/views/2d/layers/features/sources/strategies/chunks/SourceChunkStore.js +1 -1
  236. package/views/3d/interactive/measurementTools/areaMeasurement3D/AreaMeasurement3DView.js +1 -1
  237. package/views/3d/support/DisplayQualityProfile.js +1 -1
  238. package/views/3d/webgl-engine/core/shaderModules/interfaces.js +1 -1
  239. package/views/3d/webgl-engine/lib/Octree.js +1 -1
  240. package/views/SelectionManager.js +1 -1
  241. package/widgets/BatchAttributeForm.js +1 -1
  242. package/widgets/Feature/support/featureUtils.js +1 -1
  243. package/widgets/LayerList/LayerListItem.js +1 -1
  244. package/widgets/LayerList/support/layerListUtils.js +1 -1
  245. package/widgets/Legend/support/heatmapRampUtils.js +1 -1
  246. package/widgets/OrientedImageryViewer/OrientedImageryViewerVisibleElements.js +1 -1
  247. package/widgets/OrientedImageryViewer.js +1 -1
  248. package/widgets/support/widgetUtils.js +1 -1
  249. package/assets/esri/core/workers/chunks/015285436ca965f94e17.js +0 -1
  250. package/assets/esri/core/workers/chunks/048d296efa26ccd79056.js +0 -1
  251. package/assets/esri/core/workers/chunks/0e0b978459d70b15acb5.js +0 -1
  252. package/assets/esri/core/workers/chunks/10fa211987b16fd71a1a.js +0 -1
  253. package/assets/esri/core/workers/chunks/200a5f1864c2c2f7536c.js +0 -1
  254. package/assets/esri/core/workers/chunks/23a697d48f6e45cc033e.js +0 -1
  255. package/assets/esri/core/workers/chunks/29b610ff44708e044cbd.js +0 -1
  256. package/assets/esri/core/workers/chunks/3600125c58d5d04c515a.js +0 -1
  257. package/assets/esri/core/workers/chunks/457d4abc938d14f28e31.js +0 -1
  258. package/assets/esri/core/workers/chunks/4b5dbdcad438cb2dd4bf.js +0 -1
  259. package/assets/esri/core/workers/chunks/69efc716991a407c3d23.js +0 -1
  260. package/assets/esri/core/workers/chunks/6e254e846e284223ef63.js +0 -1
  261. package/assets/esri/core/workers/chunks/785610aa615198fd3815.js +0 -1
  262. package/assets/esri/core/workers/chunks/7bf7aace72f81f5de4e4.js +0 -1
  263. package/assets/esri/core/workers/chunks/7ea3d652536e1d79dfc6.js +0 -1
  264. package/assets/esri/core/workers/chunks/816c9c81352cd0ca8ce8.js +0 -1
  265. package/assets/esri/core/workers/chunks/9291508232b23f030178.js +0 -1
  266. package/assets/esri/core/workers/chunks/9fc49968dea8e2b64f3e.js +0 -1
  267. package/assets/esri/core/workers/chunks/a0b3d70a1b0360084593.js +0 -1
  268. package/assets/esri/core/workers/chunks/a100fb789d72410f8d4f.js +0 -2
  269. package/assets/esri/core/workers/chunks/b4d76d46661aba356ea3.js +0 -1
  270. package/assets/esri/core/workers/chunks/cb3af81e1fe6405c4885.js +0 -1
  271. package/assets/esri/core/workers/chunks/cbf57abb537e86c1dd7f.js +0 -1
  272. package/assets/esri/core/workers/chunks/cebdf2f88c4d2ad8baab.js +0 -1
  273. package/assets/esri/core/workers/chunks/d56d77125798beb7e493.js +0 -1
  274. package/assets/esri/core/workers/chunks/d82b3e2905cab511ff3a.js +0 -2
  275. package/assets/esri/core/workers/chunks/e2f91098793b8742fae6.js +0 -1
  276. package/assets/esri/core/workers/chunks/f25c04cf1a4bc1d2636a.js +0 -1
@@ -2,4 +2,4 @@
2
2
  All material copyright ESRI, All Rights Reserved, unless otherwise specified.
3
3
  See https://js.arcgis.com/4.32/esri/copyright.txt for details.
4
4
  */
5
- import{a as e,S as t,ac as s,q as n,P as i,T as r,n as h,A as a,b as o,ad as m,ae as l,af as g,ag as u,a3 as c,ah as _,ai as d,aj as p,L as f,k as S,u as x,C,c as E,w as I,ak as w,z as b,al as N,am as P,an as v,ao as y,ap as k,aq as V,h as T,ar as B,as as q,at as F,au as X,av as Y}from"./QuadraticBezier.js";import{G as D,u as A,g as R,d as M,a as O,e as L,k as z,s as H,f as W,v as G,t as U}from"./Geometry.js";import{m as Q,a as j,P as Z,E as J,T as K,A as $,v as ee,b as te,f as se,o as ne,B as ie,n as re,M as he,C as ae,q as oe,D as me,K as le,j as ge,e as ue,t as ce,F as _e,k as de,G as pe,i as fe,H as Se,I as xe,l as Ce,J as Ee}from"./Transformation2D.js";import{b as Ie,c as we}from"./tslib.es6.js";class be{assign(e){this.m_reason=e.m_reason,this.m_vertexIndex1=e.m_vertexIndex1,this.m_vertexIndex2=e.m_vertexIndex2}constructor(e,t,s){void 0!==e?(this.m_reason=e,this.m_vertexIndex1=t,this.m_vertexIndex2=s):(this.m_reason=0,this.m_vertexIndex1=-1,this.m_vertexIndex2=-2)}clear(){this.m_reason=0,this.m_vertexIndex1=-1,this.m_vertexIndex2=-1}}class Ne{constructor(e,s){this.m_monotoneParts=Q(t,16),this.m_xOrds=j(16,Number.NaN),this.m_inputPoint=Z.getNAN(),this.m_miny=0,this.m_maxy=0,this.m_windnum=0,this.m_bAlternate=e,this.m_tolerance=s,this.m_toleranceSqr=s*s,this.m_bTestBorder=!!s,this.m_bBreak=!1}_DoOne(e){if(!this.m_bTestBorder&&(this.m_bAlternate&&this.m_inputPoint.equals(e.getStartXY())||this.m_inputPoint.equals(e.getEndXY())))return void(this.m_bBreak=!0);if(e.getStartY()===this.m_inputPoint.y&&e.getStartY()===e.getEndY()){if(this.m_bAlternate&&!this.m_bTestBorder){const t=Math.min(e.getStartX(),e.getEndX()),s=Math.max(e.getStartX(),e.getEndX());this.m_inputPoint.x>t&&this.m_inputPoint.x<s&&(this.m_bBreak=!0)}return}let t=!1;const s=Math.max(e.getStartX(),e.getEndX());if(this.m_inputPoint.x>s)t=!0;else if(this.m_inputPoint.x>=Math.min(e.getStartX(),e.getEndX())){const n=e.intersectionOfYMonotonicWithAxisX(this.m_inputPoint.y,s);t=!Number.isNaN(n)&&n<=this.m_inputPoint.x}if(t){if(this.m_inputPoint.y===e.getStartY()){if(this.m_inputPoint.y<e.getEndY())return}else if(this.m_inputPoint.y===e.getEndY()&&this.m_inputPoint.y<e.getStartY())return;this.m_bAlternate?this.m_windnum^=1:this.m_windnum+=e.getStartY()>e.getEndY()?1:-1}}_Result(){return!!this.m_windnum}testBorder(e){const t=e.getClosestCoordinate(this.m_inputPoint,!1),s=e.getCoord2D(t);return Z.sqrDistance(s,this.m_inputPoint)<=this.m_toleranceSqr}setInputPoint(e){this.m_inputPoint.setCoordsPoint2D(e),this.m_miny=e.y-this.m_tolerance,this.m_maxy=e.y+this.m_tolerance}processSegment(e){const t=e.queryInterval(0,1);if(t.vmin>this.m_maxy||t.vmax<this.m_miny)return!1;if(this.m_bTestBorder&&this.testBorder(e))return!0;if(t.vmin>this.m_inputPoint.y||t.vmax<this.m_inputPoint.y)return!1;let s=0;if(e.isCurve()&&(0===this.m_monotoneParts.length&&(this.m_monotoneParts.length=128),s=e.getMonotonicParts(this.m_monotoneParts,!0),R(this.m_monotoneParts.length>=s)),s>0)for(let n=0;n<s;n++){const e=this.m_monotoneParts[n].get(),t=J.construct(e.getStartY(),e.getEndY());if(!(t.vmin>this.m_inputPoint.y||t.vmax<this.m_inputPoint.y)&&(this._DoOne(e),this.m_bBreak))return!0}else if(this._DoOne(e),this.m_bBreak)return!0;return!1}result(){return R(0),2}}function Pe(t,s,n,i){const r=new e;t.queryLooseEnvelope(r),r.inflateCoords(i,i);const h=0===t.getFillRule(),a=new Ne(h,i);a.setInputPoint(n);const o=r.clone();o.xmax=n.x+i,o.ymin=n.y-i,o.ymax=n.y+i;const m=t.getImpl().querySegmentIterator(),l=s.getIterator(o,i);for(let e=l.next();-1!==e;e=l.next())if(m.resetToVertex(s.getElement(e),-1),m.hasNextSegment()){const e=m.nextSegment();if(a.processSegment(e))return-1}return a._Result()?1:0}function ve(e,t,s){const n=0===e.getFillRule(),i=new Ne(n,s);i.setInputPoint(t);const r=e.getImpl().querySegmentIterator();for(;r.nextPath();)for(;r.hasNextSegment();){const e=r.nextSegment();if(i.processSegment(e))return-1}return i._Result()?1:0}function ye(e,t,s){return t.isEmpty()?0:ke(e,t.getXY(),s)}function ke(t,s,n){if(t.isEmpty())return 0;const i=e.constructEmpty();if(t.queryLooseEnvelope(i),i.inflateCoords(n,n),!i.contains(s))return 0;const r=t.getImpl().getAccelerators();if(r){r.getRasterizedGeometry()&&R(0);const e=r.getQuadTree();if(e)return Pe(t,e,s,n)}return ve(t,s,n)}function Ve(e,t){const s=e.getPointCount();if(s<16)return!1;const n=1;return 2*s+1*(Math.log(s)/Math.log(2))*t<n*s*t}function Te(e,t,s){const n=ye(e,t,s);return n?1===n?1:2:0}function Be(e,t,s){const n=ke(e,t,s);return n?1===n?1:2:0}function qe(e,t,s,n,i){for(let r=0;r<s;r++)i[r]=Be(e,t[r],n)}function Fe(t,s,n,i,r){if(t.getGeometryType()===D.enumPolygon)qe(t,s,n,i,r);else if(t.getGeometryType()===D.enumEnvelope){const h=e.constructEmpty();t.queryEnvelope(h),Ye(h,s,n,i,r)}else A("")}function Xe(e,t,s,n,i){const r=e.getGeometryType();r===D.enumPolyline?Me(e,t,s,n,i):M(r)?Re():A("")}function Ye(e,t,s,n,i){if(e.isEmpty()){for(let e=0;e<s;e++)i[e]=0;return}const r=e.clone();r.inflateCoords(.5*-n,.5*-n);const h=e.clone();h.inflateCoords(.5*n,.5*n);for(let a=0;a<s;a++)r.contains(t[a])?i[a]=1:h.contains(t[a])?i[a]=2:i[a]=0}function De(e){if(e.isEmpty())return 0;switch(e.getGeometryType()){case D.enumMultiPoint:return e.getImpl().getPointCount();case D.enumPolyline:return e.getImpl().getPathCount();case D.enumPolygon:return e.getImpl().getOGCPolygonCount();case D.enumGeometryCollection:return e.getGeometryCount()}return 1}function Ae(e,t,s){if(s.reset(),t<3)return;const n=e[0].clone(),i=n.x,r=n.y,h=e[1].clone(),a=new Z;for(let o=2;o<t;o++)a.assign(e[o]),s.pe((a.x-n.x)*(h.y-r)),n.assign(h),h.assign(a);s.pe((i-n.x)*(h.y-r))}function Re(e,t,s,n,i){R(0)}function Me(t,n,i,r,h){const a=t.getImpl(),o=a.getAccelerators();let m=null;o&&(m=o.getRasterizedGeometry());let l=i;for(let e=0;e<i;e++)h[e]=1,m&&R(0);if(l){if(o){let t=null;null!==o&&null!==o.getQuadTree()&&(t=o.getQuadTree());const m=a.getPointCount();if(null===t&&m>20&&m*i>4*m+Math.log(m)*i&&(t=s(a)),t){let s=null;const o=a.querySegmentIterator(),m=new e;for(let e=0;e<i&&l;e++)if(1===h[e]){m.setCoords(n[e]),null===s?s=t.getIterator(m,r):s.resetIterator(m,r);let i=-1;for(let a=s.next();-1!==a;a=s.next()){o.resetToVertex(t.getElement(a),i),i=o.getPathIndex();if(o.nextSegment().isIntersectingPoint(n[e],r)){h[e]=2,l--;break}h[e]=0}}return}}const t=a.querySegmentIterator();for(;t.nextPath()&&l;)for(;t.hasNextSegment()&&l;){const e=t.nextSegment();for(let t=0;t<i&&l;t++)1===h[t]&&e.isIntersectingPoint(n[t],r)&&(h[t]=2,l--)}}for(let e=0;e<i;e++)1===h[e]&&(h[e]=0)}class Oe{freeNode_(e){this.m_listNodes.deleteElement(e)}newNode_(){return this.m_listNodes.newElement()}freeList_(e){this.m_lists.deleteElement(e)}newList_(){return this.m_lists.newElement()}Init_(e){R(0)}constructor(e){this.m_listNodes=new n(2),this.m_listOfLists=Oe.st_nullNode(),this.m_bAllowNavigationBetweenLists=!0,void 0===e&&(e=!0),this.m_bAllowNavigationBetweenLists=e,this.m_lists=new n(this.m_bAllowNavigationBetweenLists?4:2)}createList(){const e=this.newList_();return this.m_bAllowNavigationBetweenLists&&(this.m_lists.setField(e,3,this.m_listOfLists),this.m_listOfLists!==Oe.st_nullNode()&&this.m_lists.setField(this.m_listOfLists,2,e),this.m_listOfLists=e),e}deleteList(e){let t=this.getFirst(e);for(;t!==Oe.st_nullNode();){const e=t;t=this.getNext(t),this.freeNode_(e)}if(this.m_bAllowNavigationBetweenLists){const t=this.m_lists.getField(e,2),s=this.m_lists.getField(e,3);t!==Oe.st_nullNode()?this.m_lists.setField(t,3,s):this.m_listOfLists=s,s!==Oe.st_nullNode()&&this.m_lists.setField(s,2,t)}this.freeList_(e)}reserveLists(e){this.m_lists.setCapacity(e)}addElement(e,t){this.m_lists.getField(e,0);const s=this.m_lists.getField(e,1),n=this.newNode_();return s!==Oe.st_nullNode()?(this.m_listNodes.setField(s,1,n),this.m_lists.setField(e,1,n)):(this.m_lists.setField(e,0,n),this.m_lists.setField(e,1,n)),this.m_listNodes.setField(n,0,t),n}reserveNodes(e){this.m_listNodes.setCapacity(e)}deleteElementDirect(e,t,s){t!==Oe.st_nullNode()?(this.m_listNodes.setField(t,1,this.m_listNodes.getField(s,1)),this.m_lists.getField(e,1)===s&&this.m_lists.setField(e,1,t)):(this.m_lists.setField(e,0,this.m_listNodes.getField(s,1)),this.m_lists.getField(e,1)===s&&this.m_lists.setField(e,1,Oe.st_nullNode())),this.freeNode_(s)}deleteElementSearch(e,t){let s=-1,n=this.getFirst(e);for(;n!==t;)s=n,n=this.getNext(n);this.deleteElementDirect(e,s,t)}concatenateLists(e,t){const s=this.m_lists.getField(e,1),n=this.m_lists.getField(t,0);if(n!==Oe.st_nullNode()&&(s!==Oe.st_nullNode()?(this.m_listNodes.setField(s,1,n),this.m_lists.setField(e,1,this.m_lists.getField(t,1))):(this.m_lists.setField(e,0,n),this.m_lists.setField(e,1,this.m_lists.getField(t,1)))),this.m_bAllowNavigationBetweenLists){const e=this.m_lists.getField(t,2),s=this.m_lists.getField(t,3);e!==Oe.st_nullNode()?this.m_lists.setField(e,3,s):this.m_listOfLists=s,s!==Oe.st_nullNode()&&this.m_lists.setField(s,2,e)}return this.freeList_(t),e}getElement(e){return this.m_listNodes.getField(e,0)}getData(e){return this.getElement(e)}setElement(e,t){R(0)}getNext(e){return this.m_listNodes.getField(e,1)}getFirst(e){return this.m_lists.getField(e,0)}getFirstElement(e){const t=this.getFirst(e);return this.getElement(t)}static st_nullNode(){return-1}clear(){this.m_listNodes.deleteAll(!0),this.m_lists.deleteAll(!0),this.m_listOfLists=Oe.st_nullNode()}isEmpty(e){return R(0),!1}getNodeCount(){return this.m_listNodes.size()}getListCount(){return this.m_lists.size()}getFirstList(){return this.m_listOfLists}getNextList(e){return this.m_lists.getField(e,3)}}function Le(e=-1){return{m_value:e,m_line:new f,m_segment:null,m_segmentInfo:new Y(-1),m_env:new J(0,0),m_dxdy:55555555,m_bHorizontal:!1,m_bCurve:!1}}const ze=67;class He extends b{constructor(e,t,s){super(!0),this.m_bIntersectionDetected=!1,this.m_nonSimpleResult=new be,this.m_tempSimpleEdge1=Le(),this.m_tempSimpleEdge2=Le(),this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h,this.m_currentNode=-1,this.m_prevX1=Number.NaN,this.m_prevX2=Number.NaN,this.m_prevY=Number.NaN,this.m_prevX=0,this.m_sweepY=Number.NaN,this.m_sweepX=0,this.m_ptSweep=new Z,this.m_simpleEdgesCache=[],this.m_simpleEdgesRecycle=[],this.m_cOutstandingConstructedEdges=0,this.m_shape=e,this.m_bShapeHasSegments=this.m_shape.hasCurves(),this.m_tolerance=t,this.m_tolerance10=10*t,this.m_bIsSimple=s;const n=Math.trunc(Math.min(3*e.getTotalPointCount()/2,ze)),i=Math.min(7,n);this.m_simpleEdgesCache.length=i}tryGetCachedEdge_(e){const t=this.m_simpleEdgesCache[(e&ge())%this.m_simpleEdgesCache.length];return t&&t.m_value===e?t:null}tryDeleteCachedEdge_(e){const t=(e&ge())%this.m_simpleEdgesCache.length,s=this.m_simpleEdgesCache[t];s&&s.m_value===e&&(this.m_simpleEdgesRecycle.push(s),this.m_simpleEdgesCache[t]=null)}tryCreateCachedEdge_(e){const t=(e&ge())%this.m_simpleEdgesCache.length;let s=this.m_simpleEdgesCache[t];return s?null:(0===this.m_simpleEdgesRecycle.length?(s=Le(),this.m_cOutstandingConstructedEdges++):s=this.m_simpleEdgesRecycle.pop(),s.m_value=e,this.m_simpleEdgesCache[t]=s,s)}initSimpleEdge_(e,t){this.m_bShapeHasSegments&&this.initSimpleEdgeHelper_(e,t)||e.m_bCurve||(this.m_shape.queryLineConnector(t,e.m_line,!0),e.m_segment=e.m_line,e.m_env.setCoordsNoNAN(e.m_line.getStartX(),e.m_line.getEndX()),e.m_env.vmax+=this.m_tolerance,e.m_line.orientBottomUp(),e.m_bHorizontal=e.m_line.getEndY()===e.m_line.getStartY(),e.m_bHorizontal||(e.m_dxdy=(e.m_line.getEndX()-e.m_line.getStartX())/(e.m_line.getEndY()-e.m_line.getStartY())))}initSimpleEdgeHelper_(e,t){if(e.m_segment=this.m_shape.getSegment(t),e.m_segmentInfo=this.m_shape.getOriginalSegmentInfo(t),e.m_bCurve=null!==e.m_segment,e.m_bCurve){const t=e.m_segment.clone();return t.orientBottomUp(),e.m_segment=t,e.m_env=e.m_segment.queryInterval(0,0),e.m_env.vmax+=this.m_tolerance,!0}return!1}compareTwoSegments_(e,t){const s=e.getStartXY(),n=e.getEndXY(),i=t.getStartXY(),r=t.getEndXY();if(this.m_ptSweep.setCoords(this.m_sweepX,this.m_sweepY),s.isEqualPoint2D(i)&&this.m_sweepY===s.y){this.m_ptSweep.assign(n.compare(r)<0?n:r);const s=e.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),i=t.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x);if(Math.abs(s-i)>this.m_tolerance)return s<i?-1:1}const h=s.compare(i)<0?i:s,a=n.compare(r)<0?n:r;let o=0,m=0;for(let l=1;l<5;l++){ie(h,a,l/5,this.m_ptSweep);const s=e.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),n=t.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),i=Math.abs(s-n);i>o&&(o=i,m=s<n?-1:1)}return 0===m?this.errorCracking():m}compareNonHorizontal_(e,t){if(e.m_line.getStartY()===t.m_line.getStartY()&&e.m_line.getStartX()===t.m_line.getStartX())return e.m_line.getEndY()===t.m_line.getEndY()&&e.m_line.getEndX()===t.m_line.getEndX()?this.m_bIsSimple?this.errorCoincident():0:this.compareNonHorizontalUpperEnd_(e,t);if(e.m_line.getEndY()===t.m_line.getEndY()&&e.m_line.getEndX()===t.m_line.getEndX())return this.compareNonHorizontalLowerEnd_(e,t);const s=this.compareNonHorizontalLowerEnd_(e,t),n=this.compareNonHorizontalUpperEnd_(e,t);return s<0&&n<0?-1:s>0&&n>0?1:this.errorCracking()}compareHorizontal1Case1_(e,t){if(e.getEndX()>t.getEndX()){if(t.getEndX()>t.getStartX()&&t.getEndY()-t.getStartY()<2*this.m_tolerance&&e.isIntersectingPoint(t.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}else{if((t.getEndY()-t.getStartY())/(t.getEndX()-t.getStartX())*(e.getEndX()-e.getStartX())<this.m_tolerance10&&t.isIntersectingPoint(e.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}return 1}compareHorizontal1Case2_(e,t){if(e.getStartX()<t.getStartX()){if(t.getEndX()>t.getStartX()&&t.getEndY()-t.getStartY()<2*this.m_tolerance&&e.isIntersectingPoint(t.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}else{if((t.getEndY()-t.getStartY())/(t.getEndX()-t.getStartX())*(e.getStartX()-e.getEndX())<this.m_tolerance10&&t.isIntersectingPoint(e.getStartXY(),this.m_tolerance,!0))return this.errorCracking()}return-1}compareHorizontal1Case3_(e,t){const s=Z.getNAN();s.setSub(t.getEndXY(),t.getStartXY()),s.rightPerpendicularThis(),s.normalize();const n=Z.getNAN();n.setSub(e.getStartXY(),t.getStartXY());const i=Z.getNAN();i.setSub(e.getEndXY(),t.getStartXY());const r=n.dotProduct(s),h=i.dotProduct(s),a=Math.abs(r),o=Math.abs(h);if(a<o){if(a<this.m_tolerance10&&t.isIntersectingPoint(e.getStartXY(),this.m_tolerance,!0))return this.errorCracking()}else if(o<this.m_tolerance10&&t.isIntersectingPoint(e.getEndXY(),this.m_tolerance,!0))return this.errorCracking();return r<0&&h<0?-1:r>0&&h>0?1:this.errorCracking()}compareHorizontal1_(e,t){return e.getStartY()===t.getStartY()&&e.getStartX()===t.getStartX()?this.compareHorizontal1Case1_(e,t):e.getEndY()===t.getEndY()&&e.getEndX()===t.getEndX()?this.compareHorizontal1Case2_(e,t):this.compareHorizontal1Case3_(e,t)}compareHorizontal2_(e,t){return e.getEndY()===t.getEndY()&&e.getEndX()===t.getEndX()&&e.getStartY()===t.getStartY()&&e.getStartX()===t.getStartX()?this.m_bIsSimple?this.errorCoincident():0:this.errorCracking()}compareNonHorizontalLowerEnd_(e,t){let s=1;if(e.m_line.getStartY()<t.m_line.getStartY()){s=-1;const n=e;e=t,t=n}const n=e.m_line,i=t.m_line,r=n.getStartX()-i.getStartX(),h=t.m_dxdy*(n.getStartY()-i.getStartY()),a=this.m_tolerance10;return r<h-a?-s:r>h+a?s:i.isIntersectingPoint(n.getStartXY(),this.m_tolerance,!0)?this.errorCracking():r<h?-s:s}compareNonHorizontalUpperEnd_(e,t){let s=1;if(t.m_line.getEndY()<e.m_line.getEndY()){s=-1;const n=e;e=t,t=n}const n=e.m_line,i=t.m_line,r=n.getEndX()-i.getStartX(),h=t.m_dxdy*(n.getEndY()-i.getStartY()),a=this.m_tolerance10;return r<h-a?-s:r>h+a?s:i.isIntersectingPoint(n.getEndXY(),this.m_tolerance,!0)?this.errorCracking():r<h?-s:s}errorCoincident(){this.m_bIntersectionDetected=!0;const e=7;return this.m_nonSimpleResult=new be(e,this.m_vertex1,this.m_vertex2),-1}errorCracking(){if(this.m_bIntersectionDetected=!0,this.m_bIsSimple){const e=6;this.m_nonSimpleResult=new be(e,this.m_vertex1,this.m_vertex2)}else this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h;return-1}compareSegments_(e,t,s,n){if(s.m_env.vmax<n.m_env.vmin)return-1;if(n.m_env.vmax<s.m_env.vmin)return 1;if(!s.m_bCurve&&!n.m_bCurve){let e=s.m_bHorizontal?1:0;return e|=n.m_bHorizontal?2:0,0===e?this.compareNonHorizontal_(s,n):1===e?this.compareHorizontal1_(s.m_line,n.m_line):2===e?-1*this.compareHorizontal1_(n.m_line,s.m_line):this.compareHorizontal2_(s.m_line,n.m_line)}if(this.m_bIntersectionDetected)return-1;const i=this.m_prevY===this.m_sweepY&&this.m_prevX===this.m_sweepX;let r,a;if(i&&e===this.m_prev1?r=this.m_prevX1:(r=Number.NaN,this.m_prev1=h),i&&t===this.m_prev2?a=this.m_prevX2:(a=Number.NaN,this.m_prev2=h),this.m_prevY=this.m_sweepY,this.m_prevX=this.m_sweepX,Number.isNaN(r)){this.m_prev1=e;const t=s.m_segment.intersectionOfYMonotonicWithAxisX(this.m_sweepY,this.m_sweepX);r=t,this.m_prevX1=t}if(Number.isNaN(a)){this.m_prev2=t;const e=n.m_segment.intersectionOfYMonotonicWithAxisX(this.m_sweepY,this.m_sweepX);a=e,this.m_prevX2=e}const o=P(!0,!0,s.m_segment,n.m_segment,this.m_tolerance,!0);return 0!==o?2===o?this.m_bIsSimple?this.errorCoincident():s.m_segmentInfo.equals(n.m_segmentInfo)?0:this.errorCracking():this.errorCracking():Math.abs(r-a)<=this.m_tolerance?this.compareTwoSegments_(s.m_segment,n.m_segment):r<a?-1:r>a?1:0}clearIntersectionDetectedFlag(){this.m_bIntersectionDetected=!1}intersectionDetected(){return this.m_bIntersectionDetected}getLastComparedNode(){return this.m_currentNode}getResult(){return this.m_nonSimpleResult}setSweepY(e,t){this.m_sweepY=e,this.m_sweepX=t,this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h}compare(e,t,s){if(this.m_bIntersectionDetected)return-1;const n=e.getElement(s),i=t;return this.m_currentNode=s,this.compareSegments(i,i,n,n)}compareSegments(e,t,s,n){let i=this.tryGetCachedEdge_(e);null===i?this.m_vertex1===t?i=this.m_tempSimpleEdge1:(this.m_vertex1=t,i=this.tryCreateCachedEdge_(e),null===i&&(i=this.m_tempSimpleEdge1,this.m_tempSimpleEdge1.m_value=e),this.initSimpleEdge_(i,t)):this.m_vertex1=t;let r=this.tryGetCachedEdge_(s);return null===r?this.m_vertex2===n?r=this.m_tempSimpleEdge2:(this.m_vertex2=n,r=this.tryCreateCachedEdge_(s),null===r&&(r=this.m_tempSimpleEdge2,this.m_tempSimpleEdge2.m_value=s),this.initSimpleEdge_(r,n)):this.m_vertex2=n,this.compareSegments_(t,n,i,r)}onDelete(e){this.tryDeleteCachedEdge_(e)}onSet(e){this.tryDeleteCachedEdge_(e)}onEndSearch(e){this.tryDeleteCachedEdge_(e)}onAddUniqueElementFailed(e){this.tryDeleteCachedEdge_(e)}}class We{constructor(e,t){this.m_bIntersectionDetected=!1,this.m_pointOfInterest=Z.getNAN(),this.m_line1=new f,this.m_seg1=null,this.m_env=J.constructEmpty(),this.m_vertex1=-1,this.m_currentNode=-1,this.m_minDist=Number.MAX_VALUE,this.m_shape=e,this.m_tolerance=t}getCurrentNode(){return this.m_currentNode}clearIntersectionDetectedFlag(){this.m_bIntersectionDetected=!1,this.m_minDist=Number.MAX_VALUE}intersectionDetected(){return this.m_bIntersectionDetected}setPoint(e){this.m_pointOfInterest.assign(e)}compare(e,t){const s=e.getElement(t);return this.compareVertex(e,t,s)}compareVertex(t,s,n){let i,r=this.m_shape.getSegment(n),h=!0;if(null==r)this.m_shape.queryLineConnector(n,this.m_line1,!0),this.m_env.setCoordsNoNAN(this.m_line1.getStartX(),this.m_line1.getEndX()),r=this.m_line1,i=this.m_line1.getStartY()===this.m_line1.getEndY();else{const t=e.constructEmpty();r.queryLooseEnvelope(t),t.queryIntervalX(this.m_env),i=0===t.height(),h=!1}if(this.m_pointOfInterest.x+this.m_tolerance<this.m_env.vmin)return-1;if(this.m_pointOfInterest.x-this.m_tolerance>this.m_env.vmax)return 1;if(i)return this.m_currentNode=s,this.m_bIntersectionDetected=!0,0;let a=0;if(h){B(this.m_line1);const e=this.m_line1.getStartXY(),t=new Z;t.setSub(this.m_line1.getEndXY(),e),t.rightPerpendicularThis();const s=new Z;s.setSub(this.m_pointOfInterest,e),a=t.dotProduct(s),a/=t.length()}else{a=r.intersectionOfYMonotonicWithAxisX(this.m_pointOfInterest.y,this.m_pointOfInterest.x)-this.m_pointOfInterest.x}if(a<10*-this.m_tolerance)return-1;if(a>10*this.m_tolerance)return 1;if(r.isIntersectingPoint(this.m_pointOfInterest,this.m_tolerance)){Math.abs(a)<this.m_minDist&&(this.m_currentNode=s,this.m_minDist=a),this.m_bIntersectionDetected=!0}return a<0?-1:a>0?1:0}}class Ge{constructor(e,t){this.m_lists=new Oe(!1),this.m_hash=t,this.m_hashBuckets=new Int32Array(e),this.m_hashBuckets.fill(Ge.st_nullNode()),this.m_bitFilter=new Int32Array(10*e+31>>5)}reserveElements(e){this.m_lists.reserveLists(Math.min(this.m_hashBuckets.length,e)),this.m_lists.reserveNodes(e)}addElement(e,t){void 0===t&&(t=this.m_hash.getHash(e));const s=t%(this.m_bitFilter.length<<5);this.m_bitFilter[s>>5]|=1<<(31&s);const n=t%this.m_hashBuckets.length;let i=this.m_hashBuckets[n];i===Oe.st_nullNode()&&(i=this.m_lists.createList(),this.m_hashBuckets[n]=i);return this.m_lists.addElement(i,e)}deleteElement(e,t){void 0===t&&(t=this.m_hash.getHash(e));const s=t%this.m_hashBuckets.length,n=this.m_hashBuckets[s];n===Oe.st_nullNode()&&U("");let i=this.m_lists.getFirst(n),r=Oe.st_nullNode();for(;i!==Oe.st_nullNode();){const t=this.m_lists.getData(i),h=this.m_lists.getNext(i);t===e?(this.m_lists.deleteElementDirect(n,r,i),this.m_lists.getFirst(n)===Oe.st_nullNode()&&(this.m_lists.deleteList(n),this.m_hashBuckets[s]=Oe.st_nullNode())):r=i,i=h}}getFirstInBucket(e){const t=e%(this.m_bitFilter.length<<5);if(!(this.m_bitFilter[t>>5]&1<<(31&t)))return Oe.st_nullNode();const s=e%this.m_hashBuckets.length,n=this.m_hashBuckets[s];return n===Oe.st_nullNode()?Oe.st_nullNode():this.m_lists.getFirst(n)}getNextInBucket(e){return this.m_lists.getNext(e)}findNode(e){const t=this.m_hash.getHash(e);let s=this.getFirstInBucket(t);for(;s!==Oe.st_nullNode();){const t=this.m_lists.getData(s);if(this.m_hash.equal(t,e))return s;s=this.m_lists.getNext(s)}return Oe.st_nullNode()}deleteNode(e){const t=this.getElement(e),s=this.m_hash.getHash(t)%this.m_hashBuckets.length,n=this.m_hashBuckets[s];n===Oe.st_nullNode()&&U(""),this.m_lists.deleteElementSearch(n,e),this.m_lists.getFirst(n)===Oe.st_nullNode()&&(this.m_lists.deleteList(n),this.m_hashBuckets[s]=Oe.st_nullNode())}getElement(e){return this.m_lists.getData(e)}static st_nullNode(){return Oe.st_nullNode()}clear(){R(0)}size(){return this.m_lists.getNodeCount()}dbgPrintBucketHistogram(){}}function Ue(e,t,s,n,i){const r=new tt(i);return r.m_shape=e,r.m_sqrTolerance=t*t,r.m_cellSize=2*t,r.m_invCellSize=1/r.m_cellSize,r.m_geometry=s,r.m_bTrackChanges=n,r.m_bHasSegmentParentage=e.hasSegmentParentage(),r.clusterNonReciprocal()}function Qe(e,t,s,n,i){const r=e-s,h=t-n;return r*r+h*h<=i}function je(){return{pt:new Z,weight:0,rank:0,bMerged:!1}}function Ze(e,t,s,n,i,r){const h=je(),a=s+i;let o=!1,m=e.x;e.x!==t.x&&(n===r&&(m=(e.x*s+t.x*i)/a),o=!0);let l=e.y;return e.y!==t.y&&(n===r&&(l=(e.y*s+t.y*i)/a),o=!0),n!==r?n>r?(h.rank=n,h.weight=s,h.pt=e):(h.rank=r,h.weight=i,h.pt=t):(h.pt.setCoords(m,l),h.weight=a,h.rank=n),h.bMerged=o,h}function Je(e,t,s,n,i,r,h,a,o){const m=e.equals(t);if(n>r)return h.assignCopy(e),o[0]=n,a[0]=s,m;if(r>n)return h=t,o[0]=r,a[0]=i,m;h.assignCopy(e);const l=Ze(e.getXY(),t.getXY(),s,n,i,r);return h.setXY(l.pt),a[0]=l.weight,o[0]=l.rank,m}function Ke(e,t,s,n,i){const r=new tt(i);return r.m_shape=e,r.m_sqrTolerance=t*t,r.m_cellSize=2*t,r.m_invCellSize=1/r.m_cellSize,r.m_geometry=s,r.m_bTrackChanges=!1,r.needsClustering()}function $e(e,t){const s=Ee(e);return xe(s,t)}class et{constructor(e,t,s,n,i){this.m_workPt=new Z,this.m_shape=e,this.m_sqrTolerance=s,this.m_invCellSize=n,this.m_origin=t.clone(),this.m_hashValues=i}getHash(e){return this.m_shape.getUserIndex(e,this.m_hashValues)}calculateHashFromVertex(e){this.m_shape.queryXY(e,this.m_workPt);const t=this.m_workPt.x-this.m_origin.x,s=Math.trunc(t*this.m_invCellSize+.5),n=this.m_workPt.y-this.m_origin.y;return $e(s,Math.trunc(n*this.m_invCellSize+.5))}equal(e,t){return R(0),!1}}class tt{constructor(e){this.m_origin=Z.getNAN(),this.m_sqrTolerance=0,this.m_cellSize=0,this.m_invCellSize=0,this.m_geometry=h,this.m_bucketArray=new Array(4),this.m_bucketHash=new Array(4),this.m_dbgCandidateCheckCount=0,this.m_nsr=new be,this.m_hashValues=-1,this.m_newClusters=-1,this.m_bTrackChanges=!1,this.m_bHasSegmentParentage=!1,this.m_shape=null,this.m_clusters=new Oe,this.m_hashFunction=null,this.m_hashTable=null,this.m_progressCounter=0,this.m_progressTracker=e}progress_(){}collectClusterCandidates(e,t){const s=Z.getNAN();this.m_shape.queryXY(e,s);const n=(s.x-this.m_origin.x)*this.m_invCellSize,i=(s.y-this.m_origin.y)*this.m_invCellSize,r=Math.trunc(n),h=Math.trunc(i);let a=0;for(let o=0;o<=1;o+=1)for(let e=0;e<=1;e+=1){const t=$e(r+o,h+e),s=this.m_hashTable.getFirstInBucket(t);s!==Ge.st_nullNode()&&(this.m_bucketArray[a]=s,this.m_bucketHash[a]=t,a++)}for(let o=a-1;o>=1;o--){const e=this.m_bucketArray[o];for(let t=o-1;t>=0;t--)if(e===this.m_bucketArray[t]){this.m_bucketHash[t]=-1,a--,o!==a&&(this.m_bucketHash[o]=this.m_bucketHash[a],this.m_bucketArray[o]=this.m_bucketArray[a]);break}}for(let o=0;o<a;o++)this.collectNearestNeighbourCandidates(e,this.m_bucketHash[o],s,this.m_bucketArray[o],t)}collectNearestNeighbourCandidates(e,t,s,n,i){const r=Z.getNAN();for(let h=n;h!==Ge.st_nullNode();h=this.m_hashTable.getNextInBucket(h)){const n=this.m_hashTable.getElement(h);e===n||-1!==t&&this.m_shape.getUserIndex(n,this.m_hashValues)!==t||(this.m_shape.queryXY(n,r),Qe(s.x,s.y,r.x,r.y,this.m_sqrTolerance)&&i.push(h))}}mergeClusters(e,t,s){let i=this.m_shape.getUserIndex(e,this.m_newClusters);const r=this.m_shape.getUserIndex(t,this.m_newClusters);-1===i&&(i=this.m_clusters.createList(),this.m_clusters.addElement(i,e),this.m_shape.setUserIndex(e,this.m_newClusters,i)),-1===r?this.m_clusters.addElement(i,t):this.m_clusters.concatenateLists(i,r),this.m_shape.setUserIndex(t,this.m_newClusters,n.impossibleIndex2());const h=this.mergeVertices(e,t);if(s){const t=this.m_hashFunction.calculateHashFromVertex(e);this.m_shape.setUserIndex(e,this.m_hashValues,t)}return h}mergeVertices(e,t){const s=Z.getNAN();this.m_shape.queryXY(e,s);const n=Z.getNAN();this.m_shape.queryXY(t,n);const i=this.m_shape.getRank(e),r=this.m_shape.getRank(t),h=this.m_shape.getWeight(e),a=this.m_shape.getWeight(t);let o,m,l,g,u=!1;if(i===r?(o=i,m=h+a,l=s.x,s.x!==n.x&&(l=(s.x*h+n.x*a)/m,u=!0),g=s.y,s.y!==n.y&&(g=(s.y*h+n.y*a)/m,u=!0)):(i>r?(l=s.x,g=s.y,m=h,o=i):(l=n.x,g=n.y,m=a,o=r),u=!s.equals(n)),u&&(this.m_shape.setXYMonotonic(e,l,g),this.m_bTrackChanges&&this.m_shape.setGeometryModifiedWithVertex(e,!0),this.m_bHasSegmentParentage)){const s=this.m_shape.getSegmentParentageBreakVertex(e)||this.m_shape.getSegmentParentageBreakVertex(t);this.m_shape.setSegmentParentageBreakVertex(e,s),this.m_shape.setSegmentParentageBreakVertex(t,s)}return this.m_shape.setWeight(e,m),this.m_shape.setRank(e,o),u}needsClustering(){const e={stack:[],error:void 0,hasError:!1};try{Ie(e,se((()=>{this.m_hashTable=null,this.m_hashFunction=null,this.m_shape.removeUserIndex(this.m_hashValues),this.m_shape.removeUserIndex(this.m_newClusters)})),!1);const t=this.m_shape.getSelectedCount(),s=this.m_shape.getEnvelope2D(this.m_progressTracker);this.m_origin.assign(s.getLowerLeft());const i=Math.max(s.height(),s.width())/(ne()-1);this.m_cellSize<i&&(this.m_cellSize=i,this.m_invCellSize=1/this.m_cellSize),this.m_clusters.clear(),this.m_clusters.reserveLists(this.m_shape.getSelectedCount()/3+1),this.m_clusters.reserveNodes(this.m_shape.getSelectedCount()/3+1),this.m_hashValues=this.m_shape.createUserIndex(),this.m_newClusters=this.m_shape.createUserIndex(),this.m_hashFunction=new et(this.m_shape,this.m_origin,this.m_sqrTolerance,this.m_invCellSize,this.m_hashValues),this.m_hashTable=new Ge(4*t/3,this.m_hashFunction),this.m_hashTable.reserveElements(this.m_shape.getSelectedCount());let r=!1;for(let e=0;e<2;e++){const t=[],s=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let i=s.next();i!==h;i=s.next()){if(this.progress_(),e>0&&this.m_shape.getUserIndex(i,this.m_newClusters)===n.impossibleIndex2())continue;let s;if(0===e?(s=this.m_hashFunction.calculateHashFromVertex(i),this.m_shape.setUserIndex(i,this.m_hashValues,s)):s=this.m_shape.getUserIndex(i,this.m_hashValues),this.collectClusterCandidates(i,t),0!==t.length){for(let e=0,s=t.length;e<s;e++){this.progress_();const s=t[e],n=this.m_hashTable.getElement(s);if(this.m_hashTable.deleteNode(s),!this.m_shape.isEqualXY(i,n))return this.m_nsr=new be(5,this.m_shape.getVertexIndex(i),this.m_shape.getVertexIndex(n)),r=!0,r;this.mergeClusters(i,n,!1)}t.length=0}0===e&&this.m_hashTable.addElement(i,s)}}return r}catch(t){e.error=t,e.hasError=!0}finally{we(e)}}clusterNonReciprocal(){const e=this.m_shape.getSelectedCount(),t=this.m_shape.getEnvelope2D(this.m_progressTracker);this.m_origin=t.getLowerLeft();const s=Math.max(t.height(),t.width())/(ne()-1);this.m_cellSize<s&&(this.m_cellSize=s,this.m_invCellSize=1/this.m_cellSize),this.m_clusters.clear(),this.m_clusters.reserveLists(Math.trunc(this.m_shape.getSelectedCount()/3+1)),this.m_clusters.reserveNodes(Math.trunc(this.m_shape.getSelectedCount()/3+1)),this.m_hashValues=this.m_shape.createUserIndex(),this.m_newClusters=this.m_shape.createUserIndex(),this.m_hashFunction=new et(this.m_shape,this.m_origin,this.m_sqrTolerance,this.m_invCellSize,this.m_hashValues),this.m_hashTable=new Ge(Math.trunc(4*e/3),this.m_hashFunction),this.m_hashTable.reserveElements(this.m_shape.getSelectedCount());let i=!1;{const e=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let t=e.next();t!==h;t=e.next()){this.progress_();const e=this.m_hashFunction.calculateHashFromVertex(t);this.m_shape.setUserIndex(t,this.m_hashValues,e),this.m_hashTable.addElement(t,e)}}{const e=[],t=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let s=t.next();s!==h;s=t.next()){if(this.m_shape.getUserIndex(s,this.m_newClusters)===n.impossibleIndex2())continue;let t=this.m_shape.getUserIndex(s,this.m_hashValues);this.m_hashTable.deleteElement(s,t);let r=!1;for(;this.collectClusterCandidates(s,e),0!==e.length;){let t=0;for(let n=0,i=e.length;n<i;n++){this.progress_();const r=e[n],h=this.m_hashTable.getElement(r);this.m_hashTable.deleteNode(r);const a=n+1===i;t|=this.mergeClusters(s,h,a)?1:0}if(r||=0!==t,i||=0!==t,e.length=0,!t)break}r&&(t=this.m_shape.getUserIndex(s,this.m_hashValues)),this.m_hashTable.addElement(s,t)}e.length=0}return i&&this.applyClusterPositions_(),this.m_hashTable=null,this.m_hashFunction=null,this.m_shape.removeUserIndex(this.m_hashValues),this.m_shape.removeUserIndex(this.m_newClusters),i}applyClusterPositions_(){const e=Z.getNAN();for(let t=this.m_clusters.getFirstList();t!==Oe.st_nullNode();t=this.m_clusters.getNextList(t)){let s=this.m_clusters.getFirst(t);const n=this.m_clusters.getElement(s);this.m_shape.queryXY(n,e);const i=this.m_shape.getRank(n),r=this.m_shape.getWeight(n);for(s=this.m_clusters.getNext(s);s!==Oe.st_nullNode();s=this.m_clusters.getNext(s)){const t=this.m_clusters.getElement(s);if(this.m_bTrackChanges?this.m_shape.isEqualXYPoint2D(t,e)||(this.m_shape.setXYMonotonicPoint2D(t,e),this.m_shape.setGeometryModifiedWithVertex(t,!0)):this.m_shape.setXYMonotonicPoint2D(t,e),this.m_bHasSegmentParentage){const e=this.m_shape.getSegmentParentageBreakVertex(n)||this.m_shape.getSegmentParentageBreakVertex(t);this.m_shape.setSegmentParentageBreakVertex(n,e),this.m_shape.setSegmentParentageBreakVertex(t,e)}this.m_shape.setWeight(t,r),this.m_shape.setRank(t,i)}}}}class st{constructor(){this.m_inputParts=[],this.m_resultParts1=[],this.m_resultParts2=[],this.m_resultSegments=[],this.m_freeSegments=[],this.m_inputSegments=[],this.m_param1=[],this.m_param2=[],this.m_tolerance=0,this.m_toleranceZ=0,this.m_point=new i,this.m_pointWeight=1,this.m_maxDensifyLimit=0,this.m_pointRank=0,this.m_changed1=!1,this.m_changed2=!1,this.m_adaptiveDensify=!1}clear(){this.freeAllResultSegments(),this.m_inputSegments.length=0,this.m_inputParts.length=0,this.m_resultParts1.length=0,this.m_resultParts2.length=0,this.m_param1.length=0,this.m_param2.length=0,this.m_adaptiveDensify=!1,this.m_changed1=!1,this.m_changed2=!1}newIntersectionPart_(e,t,s,n,i,r,h,a,o,m){return it(e,t,s,n,i,r,h,a,o,m)}pushSegment(e,t,s,n,i,r,h,a,o,m){return this.m_inputParts.push(this.newIntersectionPart_(this.m_inputSegments.length,t,s,n,i,r,h,a,o,m)),this.m_inputSegments.push(e),this.m_inputParts.length-1}getResultSegmentCount(e){return this.m_adaptiveDensify?0===e?this.m_param1.length-1:this.m_param2.length-1:0===e?this.m_resultParts1.length:this.m_resultParts2.length}getResultPart_(e,t){return 0===e?this.m_resultParts1[t]:this.m_resultParts2[t]}getResultSegment(e,t){return this.m_resultSegments[this.getResultPart_(e,t).segmentIndex].get()}getSegmentChanged(e){return 0===e?this.m_changed1:this.m_changed2}getResultSegmentStartPointWeight(e,t){return this.getResultPart_(e,t).weightStart}getResultSegmentStartPointRank(e,t){return this.getResultPart_(e,t).rankStart}getResultSegmentSegmentParentage(e,t){return this.getResultPart_(e,t).segmentParentage}getResultSegmentStartPointIsBreak(e,t){return this.getResultPart_(e,t).u.bBreakStart}getResultSegmentEndPointWeight(e,t){return this.getResultPart_(e,t).weightEnd}getResultSegmentEndPointRank(e,t){return this.getResultPart_(e,t).rankEnd}getResultSegmentEndPointIsBreak(e,t){return this.getResultPart_(e,t).u.bBreakEnd}getResultSegmentInteriorRank(e,t){return this.getResultPart_(e,t).rankInterior}getResultSegmentInteriorWeight(e,t){return this.getResultPart_(e,t).weightInterior}getResultPoint(){return this.m_point}getResultPointWeight(){return this.m_pointWeight}getResultPointRank(){return this.m_pointRank}getResultPointChanged(){return this.m_changed2}intersectLines(e,t){2!==this.m_inputSegments.length&&O(""),this.m_changed1=!1,this.m_changed2=!1,this.m_tolerance=e;const s=ue(e*st.c_smallToleranceFactor);let n=!1;const i=this.m_inputParts[0],r=this.m_inputParts[1],h=this.m_inputSegments[i.segmentIndex],a=this.m_inputSegments[r.segmentIndex];if(t||5&I(!0,h,a,e,!0)){const t=w(!0,h,a,null,this.m_param1,this.m_param2,e);0===t&&O("");const o=new Array(t);for(let e=0;e<t;++e)o[e]=Z.getNAN();const m=new Float64Array(t),l=new Int32Array(t),g=new Array(t),u=new Array(t);for(let e=0;e<t;++e)g[e]=rt(),u[e]=rt();for(let e=0;e<t;e++){const t=this.m_param1[e],c=this.m_param2[e];let _,d=i.rankInterior,p=i.weightInterior;0===t?(d=i.rankStart,p=i.weightStart,_=i.u.bBreakStart):1===t?(d=i.rankEnd,p=i.weightEnd,_=i.u.bBreakEnd):(this.m_changed1=!0,_=!1);let f,S=r.rankInterior,x=r.weightInterior;0===c?(S=r.rankStart,x=r.weightStart,f=r.u.bBreakStart):1===c?(S=r.rankEnd,x=r.weightEnd,f=r.u.bBreakEnd):(this.m_changed2=!0,f=!1);const C=d,E=S;let I=1,w=0,b=Z.getNAN();if(C===E){const n=h.getCoord2D(t),i=a.getCoord2D(c);I=p+x;w=d,ie(n,i,x/I,b);const r=Z.sqrDistance(b,n),o=Z.sqrDistance(b,i);g[e].bBigMove=r>s,u[e].bBigMove=o>s,this.m_changed1||n.equals(b)||(this.m_changed1=!0),this.m_changed2||i.equals(b)||(this.m_changed2=!0)}else if(C>E){b=h.getCoord2D(t);const n=a.getCoord2D(c);I=p,w=d;const i=Z.sqrDistance(b,n);g[e].bBigMove=!1,u[e].bBigMove=i>s,this.m_changed2||n.equals(b)||(this.m_changed2=!0)}else{b=a.getCoord2D(c),I=x,w=S;const n=h.getCoord2D(t),i=Z.sqrDistance(b,n);g[e].bBigMove=i>s,u[e].bBigMove=!1,this.m_changed1||n.equals(b)||(this.m_changed1=!0)}o[e].assign(b),m[e]=I,l[e]=w,g[e].bIsBreak=_||f,u[e].bIsBreak=_||f,n||=g[e].bBigMove||u[e].bBigMove}const c=i.rankInterior,_=i.weightInterior;let d=0,p=-1;for(let s=0;s<=t;s++){const n=s<t?this.m_param1[s]:1;if(n!==d){const r=this.allocResultSegment(),a=this.m_resultSegments[r];let u,f,S,x;h.queryCut(d,n,a,!1),a.get().snapControlPoints(e*e);let C=!1,E=!1,I=!1,w=!1,b=!1,N=Z.getNAN(),P=Z.getNAN();-1!==p?(f=l[p],u=m[p],C=g[p].bBigMove,N.assign(o[p]),I=g[p].bIsBreak,b=!0):(u=i.weightStart,f=i.rankStart,N=a.get().getStartXY(),I=i.u.bBreakStart),s<t?(x=l[s],S=m[s],E=g[s].bBigMove,P.assign(o[s]),w=g[s].bIsBreak,b=!0):(S=i.weightEnd,x=i.rankEnd,P=a.get().getEndXY(),w=i.u.bBreakEnd),b&&a.get().setCoordsForIntersector(N,P,!0),this.m_resultParts1.push(this.newIntersectionPart_(r,u,f,S,x,_,c,I,w,i.segmentParentage));const v=this.m_resultParts1.at(-1);v.u.bBigMoveStart=C,v.u.bBigMoveEnd=E,d=n,p=s}else-1===p&&(p=s)}const f=new Array(t);for(let e=0;e<t;e++)f[e]=e;t>2?(f.sort(((e,t)=>this.m_param2[e]<this.m_param2[t]?-1:this.m_param2[e]>this.m_param2[t]?1:0)),re(this.m_param2)):2===t&&this.m_param2[0]>this.m_param2[1]&&(this.m_param2[1]=te(this.m_param2[0],this.m_param2[0]=this.m_param2[1]),f[1]=te(f[0],f[0]=f[1]));const S=r.rankInterior,x=r.weightInterior;d=0,p=-1;for(let s=0;s<=t;s++){const n=s<t?this.m_param2[s]:1;if(n!==d){const i=this.allocResultSegment(),h=this.m_resultSegments[i];let g,c,_,C;a.queryCut(d,n,h,!1),h.get().snapControlPoints(e*e);let E=Z.getNAN(),I=Z.getNAN(),w=!1,b=!1,N=!1,P=!1,v=!1;if(-1!==p){const e=f[p];g=m[e],c=l[e],E.assign(o[e]),N=u[e].bBigMove,w=u[e].bIsBreak,v=!0}else g=r.weightStart,c=r.rankStart,E=h.get().getStartXY(),w=r.u.bBreakStart;if(s!==t){const e=f[s];_=m[e],C=l[e],I.assign(o[e]),P=u[e].bBigMove,b=u[e].bIsBreak,v=!0}else _=r.weightEnd,C=r.rankEnd,I=h.get().getEndXY(),b=r.u.bBreakEnd;v&&h.get().setCoordsForIntersector(E,I,!0),this.m_resultParts2.push(this.newIntersectionPart_(i,g,c,_,C,x,S,w,b,r.segmentParentage));const y=this.m_resultParts2.at(-1);y.u.bBigMoveStart=N,y.u.bBigMoveEnd=P,d=n,p=s}else-1===p&&(p=s)}return n?3:2}return 0}intersectLines3D(e,t,s,n){return R(0),1}intersect2D(e,t){const s=this.m_inputParts[0],n=this.m_inputParts[1],i=this.m_inputSegments[s.segmentIndex].getGeometryType(),r=this.m_inputSegments[n.segmentIndex].getGeometryType();if(i!==D.enumLine||r!==D.enumLine){return new mt(this).intersectCurves(e,t)}return this.intersectLines(e,t)}intersect2DEx(e,t,s,n,i){this.m_point.assignCopy(t),1!==this.m_inputSegments.length&&O(""),this.m_tolerance=e,this.m_changed1=!1,this.m_changed2=!1;const r=ue(e*st.c_smallToleranceFactor);let h=!1;const a=this.m_inputParts[0],o=this.m_inputSegments[a.segmentIndex];if(i||o.isIntersectingPoint(t.getXY(),e,!0)){this.m_param1=j(16,Number.NaN);const i=o.getClosestCoordinate(t.getXY(),!1);this.m_param1[0]=i;let m=a.rankInterior,l=a.weightInterior;0===i?(m=a.rankStart,l=a.weightStart):1===i?(m=a.rankEnd,l=a.weightEnd):this.m_changed1=!0;let g=m;const u=s,c=n;g===u&&o.isCurve()&&(g=u+1);let _=1,d=0;const p=new Z;if(g===u){const e=o.getCoord2D(i),s=t.getXY();_=l+c,d=m;ie(e,s,c/_,p),this.m_changed1||e.equals(p)||(this.m_changed1=!0),this.m_changed2||s.equals(p)||(this.m_changed2=!0);h=Z.sqrDistance(p,e)>r}else if(g>u)p.assign(o.getCoord2D(i)),_=l,d=m,this.m_changed2||p.equals(t.getXY())||(this.m_changed2=!0);else{p.assign(o.getCoord2D(i)),_=c,d=u,this.m_changed1||p.equals(t.getXY())||(this.m_changed1=!0);h=Z.sqrDistance(p,t.getXY())>r}let f=0,S=-1;const x=1;for(let t=0;t<=x;t++){const s=t<x?this.m_param1[0]:1;if(s!==f){const n=this.allocResultSegment(),i=this.m_resultSegments[n];o.queryCut(f,s,i),i.get().snapControlPoints(e*e);let r=a.weightStart,h=a.weightEnd,m=a.rankStart,l=a.rankEnd;const g=a.rankInterior,u=a.weightInterior;let c=a.u.bBreakStart,C=a.u.bBreakEnd;-1!==S&&(r=_,m=d,c=!0,i.get().setCoordsForIntersector(p,i.get().getEndXY(),!0)),t!==x&&(h=_,l=d,C=!0,i.get().setCoordsForIntersector(i.get().getStartXY(),p,!0)),f=s,this.m_resultParts1.push(this.newIntersectionPart_(n,r,m,h,l,u,g,c,C,a.segmentParentage))}S=t}return this.m_point.setXY(p),this.m_pointWeight=_,this.m_pointRank=d,h?3:2}return 0}intersect3D(e,t,s,n){return R(0),1}intersect3DEx(e,t,s,n,i,r,h){return R(0),1}getTolerance(){return this.m_tolerance}freeAllResultSegments(){this.m_resultSegments.length=0,this.m_freeSegments.length=0}freeResultSegment(e){this.m_freeSegments.push(e)}allocResultSegment(){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const e=new t,s=this.m_resultSegments.length;return this.m_resultSegments.push(e),s}allocResultSegmentFromBuffer(e){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const s=new t({copy:e}),n=this.m_resultSegments.length;return this.m_resultSegments.push(s),n}allocResultSegmentFromSegment(e){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const s=new t({segment:e}),n=this.m_resultSegments.length;return this.m_resultSegments.push(s),n}}function nt(e,t){return{bBigMoveStart:!1,bBigMoveEnd:!1,bBreakStart:e,bBreakEnd:t}}function it(e,t,s,n,i,r,h,a,o,m){return{segmentIndex:e,weightStart:t,rankStart:s,weightEnd:n,rankEnd:i,weightInterior:r,rankInterior:h,segmentParentage:m,u:nt(a,o)}}function rt(){return{bBigMove:!1,bIsBreak:!1}}st.maxWeight=.1*Number.MAX_VALUE,st.c_smallToleranceFactor=.01,st.c_maxGeometryTypeToRankDelta=8;class ht{constructor(){this.start=null,this.end=null,this.equalEdge=null,this.segmentIndex=-1,this.segmentParentage=-1,this.weight=0,this.rank=0}hasSegment(){return this.segmentIndex>=0}transferAttributes(e,t,s){if(1===t.getDescription().getAttributeCount())return;const n=e.parent.m_resultSegments[this.segmentIndex].get().getStartXY(),r=e.parent.m_resultSegments[this.segmentIndex].get().getEndXY(),h=new i;t.queryStart(h),s?(h.setXY(n),e.parent.m_resultSegments[this.segmentIndex].get().setStart(h)):(h.setXY(r),e.parent.m_resultSegments[this.segmentIndex].get().setEnd(h)),t.queryEnd(h),s?(h.setXY(r),e.parent.m_resultSegments[this.segmentIndex].get().setEnd(h)):(h.setXY(n),e.parent.m_resultSegments[this.segmentIndex].get().setStart(h))}copyFromWhenOverlap(e,t,s){this.equalEdge=t,t.equalEdge=this,this.segmentIndex=e.parent.allocResultSegmentFromBuffer(e.parent.m_resultSegments[t.segmentIndex]),this.segmentParentage=t.segmentParentage,this.weight=t.weight,this.rank=t.rank,s?(this.start.copyFrom(t.start),this.end.copyFrom(t.end)):(this.start.copyFrom(t.end),this.end.copyFrom(t.start),e.parent.m_resultSegments[this.segmentIndex].get().reverse())}getEnd(){return this.end}getNextInChain(){return this.end.nextInChain}getPrevInChain(){return this.start.prevInChain}}class at{constructor(){this.hash=0,this.pt=new Z,this.prevInChain=null,this.nextInChain=null,this.prevInHash=null,this.nextInHash=null,this.prevEqual=null,this.nextEqual=null,this.weight=0,this.rank=0,this.bBigMove=!1,this.bIsBreak=!1}copyFrom(e){this.pt.assign(e.pt),this.weight=e.weight,this.rank=e.rank,this.bBigMove=e.bBigMove,this.bIsBreak=e.bIsBreak}nextNode(){return this.nextInChain?this.nextInChain.end:null}prevNode(){return this.prevInChain?this.prevInChain.start:null}equalListHead(){let e=this;for(;null!==e.prevEqual;e=e.prevEqual);return e}}function ot(e,t,s,n){return{edge1:e,edge2:t,recursion:s,bIsIntersecting:n}}class mt{constructor(e){this.m_pairs=[],this.m_chainOrigin1=null,this.m_chainOrigin2=null,this.m_newNodes=[],this.m_hashTableOfEquals=[],this.m_hashTableOfEqualsSize=0,this.m_origin=new Z,this.m_cell=new Z,this.parent=e}addSegment(e,t,s,n,i,r,h,a,o,m,l){const g=this.newNode(this.parent.m_resultSegments[e].get().getStartXY(),s,n,o),u=this.newNode(this.parent.m_resultSegments[e].get().getEndXY(),i,r,m);this.newEdge(g,u,e,h,a,l),null===this.m_chainOrigin1?this.m_chainOrigin1=g:null===this.m_chainOrigin2?this.m_chainOrigin2=g:R(0)}intersectCurvesHelper(e,t,s,n,i){const r=this.getSegment(e).get(),h=this.getSegment(t).get();if(r.isDegenerate(0)||h.isDegenerate(0))return 0;const a=this.tryOverlapIntersectCurves(e,t,s,n);if(0!==a)return a;const o=ue(.01*s);let m=!1,l=this.processSharpCorners(r,h,s,i>4);const g=l>0;if(!g){if(!(n||5&P(!0,!1,r,h,s,!0)))return 0;l=w(!0,r,h,null,this.parent.m_param1,this.parent.m_param2,s)}0===l&&O("");const u=r.getGeometryType(),c=h.getGeometryType(),_=Q(Z,l),d=Q(Z,l),p=new Array(l),f=new Array(l),S=new Array(l),x=new Array(l),C=ce(rt,l),E=ce(rt,l);let I=!1,b=!1;for(let w=0;w<l;w++){const n=this.parent.m_param1[w],i=this.parent.m_param2[w];let a=e.rank,l=e.weight,N=!0,P=!1;0===n?(a=e.start.rank,l=e.start.weight,P=e.start.bIsBreak):1===n?(a=e.end.rank,l=e.end.weight,P=e.end.bIsBreak):(I=!0,N=!1);let v=t.rank,y=t.weight,k=!1,V=!0;0===i?(v=t.start.rank,y=t.start.weight,k=t.start.bIsBreak):1===i?(v=t.end.rank,y=t.end.weight,k=t.end.bIsBreak):(b=!0,V=!1);let T=a,B=v;if(T===B&&(T*=st.c_maxGeometryTypeToRankDelta,B*=st.c_maxGeometryTypeToRankDelta,T+=lt(u,r,!1),B+=lt(c,h,!1)),N&&V&&B===T){const e=r.getCoord2D(n),t=h.getCoord2D(i);e.equals(t)&&(B=T-1)}let q=1,F=0,X=1,Y=0;const D=new Z,A=new Z,R=r.getCoord2D(n),M=h.getCoord2D(i);if(g&&Z.distance(R,M)>s)D.setCoordsPoint2D(R),A.setCoordsPoint2D(M),q=l,X=y,F=a,Y=v,C[w].bBigMove=!1,E[w].bBigMove=!1,P=!0,k=!0;else if(T===B){X=q=l+y,Y=F=a;ie(R,M,y/q,D),A.setCoordsPoint2D(D);const e=Z.sqrDistance(D,R),t=Z.sqrDistance(D,M);C[w].bBigMove=e>o,E[w].bBigMove=t>o,I||R.equals(D)||(I=!0),b||M.equals(A)||(b=!0)}else if(T>B){D.setCoordsPoint2D(R),A.setCoordsPoint2D(D),X=q=l,Y=F=a;const e=Z.sqrDistance(D,M);C[w].bBigMove=!1,E[w].bBigMove=e>o,b||M.equals(A)||(b=!0)}else{A.setCoordsPoint2D(M),D.setCoordsPoint2D(A),X=q=y,Y=F=v;const e=Z.sqrDistance(D,R);C[w].bBigMove=e>o,E[w].bBigMove=!1,I||R.equals(D)||(I=!0)}_[w].assign(D),d[w].assign(A),p[w]=q,f[w]=X,S[w]=F,x[w]=Y,C[w].bIsBreak=P||k,E[w].bIsBreak=P||k,m||=C[w].bBigMove||E[w].bBigMove,w>0&&(n!==this.parent.m_param1[w-1]&&i!==this.parent.m_param2[w-1]||(S[w]<=S[w-1]?(_[w].assign(d[w-1]),p[w]=f[w-1],S[w]=x[w-1],d[w].assign(d[w-1]),f[w]=f[w-1],x[w]=x[w-1],C[w].bBigMove||=C[w-1].bBigMove,E[w].bBigMove||=E[w-1].bBigMove,C[w].bIsBreak||=C[w-1].bIsBreak,E[w].bIsBreak||=E[w-1].bIsBreak):(_[w-1].assign(_[w]),p[w-1]=p[w],S[w-1]=S[w],d[w-1].assign(d[w]),f[w-1]=f[w],x[w-1]=x[w],C[w-1].bBigMove||=C[w].bBigMove,E[w-1].bBigMove||=E[w].bBigMove,C[w-1].bIsBreak||=C[w].bIsBreak,E[w-1].bIsBreak||=E[w].bIsBreak)))}if(!(I||b||2!==l||u===D.enumLine&&c===D.enumLine)){if(this.processDoublyConnectedEdges(e,t,i+1,s))return this.parent.m_changed1=!0,this.parent.m_changed2=!0,2;R(0)}this.parent.m_changed1||=I,this.parent.m_changed2||=b;let N=e,v=e.end.weight,y=e.end.rank,k=e.end.bBigMove,V=e.end.bIsBreak,T=0,B=-1;for(let w=0;w<=l;w++){const t=w<l?this.parent.m_param1[w]:1;if(t!==T){const n=this.parent.allocResultSegment(),i=this.parent.m_resultSegments[n];let h,a,o,m;r.queryCut(T,t,i,!1),i.get().snapControlPoints(s*s);let g=!1,u=!1,c=!1,d=!1;const f=new Z,x=new Z;-1!==B?(a=S[B],h=p[B],c=C[B].bBigMove,g=C[B].bIsBreak,f.assign(_[B])):(h=e.start.weight,a=e.start.rank,c=e.start.bBigMove,g=e.start.bIsBreak,f.assign(i.get().getStartXY())),w<l?(m=S[w],o=p[w],d=C[w].bBigMove,u=C[w].bIsBreak,x.assign(_[w])):(o=v,m=y,d=k,u=V,x.assign(i.get().getEndXY()));let E=N;t<1&&(this.splitEdgeInPlace(N),E=N.getNextInChain()),this.updateSegmentOnly(N,n),0===N.start.hash||N.start.pt.equals(f)||(this.m_newNodes.push(N.start),this.removeNodeFromHash(N.start),N.start.hash=0),0===N.end.hash||N.end.pt.equals(x)||(this.m_newNodes.push(N.end),this.removeNodeFromHash(N.end),N.end.hash=0),N.start.pt.assign(f),N.end.pt.assign(x),N.start.bBigMove||=c,N.end.bBigMove||=d,N.start.bIsBreak||=g,N.end.bIsBreak||=u,N.start.weight=h,N.start.rank=a,N.end.weight=o,N.end.rank=m,N=E,T=t,B=w}else-1===B&&(B=w)}const q=N.getNextInChain(),F=[];F.length=l;for(let w=0;w<l;w++)F[w]=w;l>2?(F.sort(((e,t)=>_e(this.parent.m_param2[e],this.parent.m_param2[t]))),this.parent.m_param2.sort(_e)):2===l&&this.parent.m_param2[0]>this.parent.m_param2[1]&&(this.parent.m_param2[1]=te(this.parent.m_param2[0],this.parent.m_param2[0]=this.parent.m_param2[1]),F[1]=te(F[0],F[0]=F[1])),N=t,v=t.end.weight,y=t.end.rank,k=t.end.bBigMove,V=t.end.bIsBreak,T=0,B=-1;for(let w=0;w<=l;w++){const e=w<l?this.parent.m_param2[w]:1;if(e!==T){const n=this.parent.allocResultSegment(),i=this.parent.m_resultSegments[n];let r,a,o,m;h.queryCut(T,e,i,!1),i.get().snapControlPoints(s*s);const g=new Z,u=new Z;let c=!1,_=!1,p=!1,S=!1;if(-1!==B){const e=F[B];r=f[e],a=x[e],g.assign(d[e]),p=E[e].bBigMove,c=E[e].bIsBreak}else r=t.start.weight,a=t.start.rank,p=t.start.bBigMove,c=t.start.bIsBreak,g.assign(i.get().getStartXY());if(w!==l){const e=F[w];o=f[e],m=x[e],u.assign(d[e]),S=E[e].bBigMove,_=E[e].bIsBreak}else o=v,m=y,S=k,_=V,u.assign(i.get().getEndXY());let C=N;e<1&&(this.splitEdgeInPlace(N),C=N.getNextInChain()),this.updateSegmentOnly(N,n),0===N.start.hash||N.start.pt.equals(g)||(this.m_newNodes.push(N.start),this.removeNodeFromHash(N.start),N.start.hash=0),0===N.end.hash||N.end.pt.equals(u)||(this.m_newNodes.push(N.end),this.removeNodeFromHash(N.end),N.end.hash=0),N.start.pt.assign(g),N.end.pt.assign(u),N.start.bBigMove||=p,N.end.bBigMove||=S,N.start.bIsBreak||=c,N.end.bIsBreak||=_,N.start.weight=r,N.start.rank=a,N.end.weight=o,N.end.rank=m,N=C,T=e,B=w}else-1===B&&(B=w)}const X=N.getNextInChain();return this.postProcessResultPartsForCurves(e,q,t,X,i+1),m?3:2}intersectCurves(t,s){2!==this.parent.m_inputSegments.length&&O(""),this.parent.m_changed1=!1,this.parent.m_changed2=!1,this.parent.m_tolerance=t,this.m_hashTableOfEqualsSize=0,this.m_hashTableOfEquals=de(16);const n=e.constructEmpty();for(let h=0;h<2;h++){const t=this.parent.allocResultSegmentFromSegment(this.parent.m_inputSegments[this.parent.m_inputParts[h].segmentIndex]),s=e.constructEmpty();this.parent.m_inputSegments[this.parent.m_inputParts[h].segmentIndex].queryLooseEnvelope(s),n.mergeEnvelope2D(s);const i=this.parent.m_inputParts[h];this.addSegment(t,0,i.weightStart,i.rankStart,i.weightEnd,i.rankEnd,i.weightInterior,i.rankInterior,i.u.bBreakStart,i.u.bBreakEnd,i.segmentParentage)}n.inflateCoords(100*t,100*t),this.m_origin.assign(n.getLowerLeft()),this.m_cell.setCoords(2*t,2*t),this.m_pairs.push(ot(this.m_chainOrigin1.nextInChain,this.m_chainOrigin2.nextInChain,0,s));let i=0,r=!0;for(;this.m_pairs.length;){const e=this.m_pairs.at(-1);this.m_pairs.pop(),R(e.recursion>=0),R(e.recursion<=256),this.clusterNodes(t);const s=this.intersectCurvesHelper(e.edge1,e.edge2,t,e.bIsIntersecting,e.recursion);r&&(r=!1,i=s)}for(let e=0;e<2;e++){const t=0===e?this.parent.m_resultParts1:this.parent.m_resultParts2;for(let s=(0===e?this.m_chainOrigin1:this.m_chainOrigin2).nextInChain;null!=s;s=s.getNextInChain())t.push(this.parent.newIntersectionPart_(s.segmentIndex,s.start.weight,s.start.rank,s.end.weight,s.end.rank,s.weight,s.rank,s.start.bIsBreak,s.end.bIsBreak,s.segmentParentage)),t.at(-1).u.bBigMoveStart=s.start.bBigMove,t.at(-1).u.bBigMoveEnd=s.end.bBigMove}return i}tryOverlapIntersectCurves(e,s,n,i){const r=this.parent.m_resultSegments[e.segmentIndex].get(),h=this.parent.m_resultSegments[s.segmentIndex].get(),a=r.getStartXY().equals(h.getStartXY())&&r.getEndXY().equals(h.getEndXY()),o=r.getStartXY().equals(h.getEndXY())&&r.getEndXY().equals(h.getStartXY());if(!a&&!o)return 0;const m=q(r,h,!0);if(0!==m&&F(r,h)&&e.segmentParentage===s.segmentParentage){let e=!1;if(m>0)e=r.equals(h);else{R(-1===m);const s=new t({segment:h});s.get().reverse(),e=r.equals(s.get())}if(e)return 1}const l=n*st.c_smallToleranceFactor;let g=!1;if(0===m){const e=[.5,.25,.75,.125,.375,.625,.875,.5625,.3125];for(let t=0,s=e.length;t<s;++t){const s=e[t],i=new Z;r.queryCoord2D(s,i);const a=h.getClosestCoordinate(i,!1),o=new Z;h.queryCoord2D(a,o);const m=Z.distance(i,o);if(m>n)return 0;g||=m>l}for(let t=0,s=e.length;t<s;++t){const s=e[t],i=new Z;h.queryCoord2D(s,i);const a=r.getClosestCoordinate(i,!1),o=new Z;r.queryCoord2D(a,o);const m=Z.distance(i,o);if(m>n)return 0;g||=m>l}}let u=e.rank,c=s.rank;return u===c&&(u*=st.c_maxGeometryTypeToRankDelta,c*=st.c_maxGeometryTypeToRankDelta,u+=lt(r.getGeometryType(),r,!0),c+=lt(h.getGeometryType(),h,!0)),u>c?(s.copyFromWhenOverlap(this,e,a),s.transferAttributes(this,r,a)):c>u?(e.copyFromWhenOverlap(this,s,a),e.transferAttributes(this,h,a)):e.segmentParentage<=s.segmentParentage?(e.weight=e.weight+s.weight,s.copyFromWhenOverlap(this,e,a),s.transferAttributes(this,r,a)):(s.weight=e.weight+s.weight,e.copyFromWhenOverlap(this,s,a),e.transferAttributes(this,h,a)),g?3:2}postProcessResultPartsForCurves(e,t,s,n,i){i===pe()&&O("curve_helper");for(let r=e;r!==t;r=r.getNextInChain())this.updateSegmentToNodes(r);for(let r=s;r!==n;r=r.getNextInChain())this.updateSegmentToNodes(r);for(let r=e;r!==t;r=r.getNextInChain()){const e=r.end.pt.sub(r.start.pt);for(let t=s;t!==n;t=t.getNextInChain()){let s=0;if(r.start.pt.equals(t.start.pt)&&r.end.pt.equals(t.end.pt)?s=1:r.start.pt.equals(t.end.pt)&&r.end.pt.equals(t.start.pt)&&(s=-1),!s){let s=r.start.pt.equals(t.start.pt)?1:0;if(s||(s=r.end.pt.equals(t.end.pt)?2:0,s||(s=r.end.pt.equals(t.start.pt)?3:0,s||(s=r.start.pt.equals(t.end.pt)?4:0))),s){const n=t.end.pt.sub(t.start.pt),h=e.dotProduct(n);let a;switch(s){case 1:case 2:a=h>0;break;case 3:case 4:a=h<0;break;default:O("post_process_result_parts_for_curves_")}a&&this.m_pairs.push(ot(r,t,i,!1))}continue}const n=this.parent.m_resultSegments[r.segmentIndex],h=this.parent.m_resultSegments[t.segmentIndex],a=[.5,.25,.75];for(let e=0,t=a.length;e<t;++e){const t=a[e],i=new Z;n.get().queryCoord2D(t,i);const r=h.get().getClosestCoordinate(i,!1),o=new Z;h.get().queryCoord2D(r,o);if(Z.distance(i,o)>this.parent.m_tolerance){s=0;break}}if(!s){this.m_pairs.push(ot(r,t,i,!1));continue}for(let e=0,t=a.length;e<t;++e){const t=a[e],i=new Z;h.get().queryCoord2D(t,i);const r=n.get().getClosestCoordinate(i,!1),o=new Z;n.get().queryCoord2D(r,o);if(Z.distance(i,o)>this.parent.m_tolerance){s=0;break}}if(!s){this.m_pairs.push(ot(r,t,i,!1));continue}r.equalEdge=t,t.equalEdge=r;let o=r.rank,m=t.rank;o===m&&(o*=st.c_maxGeometryTypeToRankDelta,m*=st.c_maxGeometryTypeToRankDelta,o+=lt(n.get().getGeometryType(),n.get(),!0),m+=lt(h.get().getGeometryType(),h.get(),!0)),o>m||o===m&&r.segmentParentage<=t.segmentParentage?(n.copyTo(h,!1),t.segmentParentage=r.segmentParentage,-1===s&&h.get().reverse()):(h.copyTo(n,!1),r.segmentParentage=t.segmentParentage,-1===s&&n.get().reverse());break}}this.updateAttachedEdgesAfterNodeChange(e.start),t&&this.updateAttachedEdgesAfterNodeChange(t.start),this.updateAttachedEdgesAfterNodeChange(s.start),n&&this.updateAttachedEdgesAfterNodeChange(n.start)}processDoublyConnectedEdges(e,s,n,i){n===pe()&&O("curve_helper");const r=this.getSegment(e).get(),h=this.getSegment(s).get(),a=r.getStartXY().equals(h.getStartXY())&&r.getEndXY().equals(h.getEndXY())?1:r.getEndXY().equals(h.getStartXY())&&r.getStartXY().equals(h.getEndXY())?-1:0;if(0!==a){const o=new t;r.queryCut(0,.5,o),o.get().snapControlPoints(i*i);const m=new t;r.queryCut(.5,1,m),m.get().snapControlPoints(i*i),this.splitEdgeInPlace(e),e.end.pt=o.get().getEndXY(),e.segmentIndex=this.parent.allocResultSegmentFromBuffer(o),e.getNextInChain().segmentIndex=this.parent.allocResultSegmentFromBuffer(m);let l=h.getClosestCoordinate(e.end.pt,!1);return Math.abs(l-.5)>.2&&(l=.5),h.queryCut(0,l,o),o.get().snapControlPoints(i*i),h.queryCut(l,1,m),m.get().snapControlPoints(i*i),this.splitEdgeInPlace(s),s.end.pt=o.get().getEndXY(),s.segmentIndex=this.parent.allocResultSegmentFromBuffer(o),s.getNextInChain().segmentIndex=this.parent.allocResultSegmentFromBuffer(m),a>0?(this.m_pairs.push(ot(e,s,n,!1)),this.m_pairs.push(ot(e.getNextInChain(),s.getNextInChain(),n,!1))):(this.m_pairs.push(ot(e,s.getNextInChain(),n,!1)),this.m_pairs.push(ot(e.getNextInChain(),s,n,!1))),!0}return!1}newNode(e,t,s,n){const i=new at;return this.m_newNodes.push(i),i.pt=e,i.rank=s,i.weight=t,i.bIsBreak=n,i}newEdge(e,t,s,n,i,r){const h=new ht;return h.start=e,h.end=t,e.nextInChain=h,t.prevInChain=h,h.segmentIndex=s,h.segmentParentage=r,h.rank=i,h.weight=n,h}splitEdgeInPlace(e){e.segmentIndex=-1;const t=new ht,s=new at;this.m_newNodes.push(s),s.pt.setNAN(),s.nextInChain=t,s.prevInChain=e,s.prevInHash=null,s.nextInHash=null,s.prevEqual=null,s.nextEqual=null,s.weight=e.weight,s.rank=e.rank,s.bIsBreak=!1,s.bBigMove=!1,t.start=s,t.segmentIndex=-1,t.end=e.end,t.end.prevInChain=t,t.rank=e.rank,t.weight=e.weight,t.segmentParentage=e.segmentParentage,e.end=s,e.equalEdge&&(e.equalEdge.equalEdge=null),e.equalEdge=null}updateSegmentOnly(e,t){e.segmentIndex=t}updateAttachedEdgesAfterNodeChange(e){for(let t=e.equalListHead();null!==t;t=t.nextEqual)this.updateAttachedEdgesAfterNodeChangeImpl(t)}updateAttachedEdgesAfterNodeChangeImpl(e){const t=e.prevInChain;if(t&&t.hasSegment()){const s=this.getSegment(t).get();e.pt.equals(s.getEndXY())||(s.setCoordsForIntersector(t.start.pt,t.end.pt,!1),s.ensureXYMonotone())}const s=e.nextInChain;if(s&&s.hasSegment()){const t=this.getSegment(s).get();e.pt.equals(t.getStartXY())||(t.setCoordsForIntersector(s.start.pt,s.end.pt,!1),t.ensureXYMonotone())}}updateSegmentToNodes(e){const t=this.getSegment(e).get();e.start.pt.equals(t.getStartXY())&&e.end.pt.equals(t.getEndXY())||(t.setCoordsForIntersector(e.start.pt,e.end.pt,!1),t.ensureXYMonotone()),this.updateAttachedEdgesAfterNodeChange(e.start),this.updateAttachedEdgesAfterNodeChange(e.end)}getSegment(e){return this.parent.m_resultSegments[e.segmentIndex]}clusterNodes(e){let t=!1;const s=[],n=[],i=[];for(let r=0,h=this.m_newNodes.length;r<h;r++){const e=this.m_newNodes[r];if(null===e)continue;let t=e;for(let s=r+1;s<h;s++){const n=this.m_newNodes[s];null!==n&&(e.pt.equals(n.pt)&&(t.nextInHash=n,n.prevInHash=t,t=n,this.m_newNodes[s]=null))}}for(let r=0,h=this.m_newNodes.length;r<h;r++){const h=this.m_newNodes[r];if(null==h)continue;for(h.hash=this.calculateHash(h.pt);;){const r=de(4),a=this.hashTableBinsToCheck(h,r);for(let t=0;t<a;t++)if(null!==r[t])for(let a=r[t];null!==a;){const t=a.nextInHash;Z.distance(h.pt,a.pt)<=e&&(s.push(a),this.removeNodeFromHash(a),a.hash=0,i.push(a),n.push(a)),a=t}let o=!1;for(const e of s)if(!h.pt.equals(e.pt)){const s=Ze(h.pt,e.pt,h.weight,h.rank,e.weight,e.rank);h.pt.assign(s.pt),h.weight=s.weight,h.rank=s.rank,o=!0,t=!0}if(s.length=0,!o)break;h.hash=this.calculateHash(h.pt)}i.push(h),n.push(h);for(let e=h.nextInHash;null!==e;){e.prevInHash=null;const t=e.nextInHash;e.nextInHash=null,i.push(e),n.push(e),e=t}const a=h.hash;let o=null,m=null;for(const e of n)h!==e&&(e.hash=a,e.pt.assign(h.pt),e.rank=h.rank,e.weight=h.weight),e.prevInHash=o,o&&(o.nextInHash=e),e.prevEqual=m,e.nextEqual=null,m&&(m.nextEqual=e),m=e,o=e;const l=a%this.m_hashTableOfEquals.length;o.nextInHash=this.m_hashTableOfEquals[l],null!==this.m_hashTableOfEquals[l]&&(this.m_hashTableOfEquals[l].prevInHash=o),this.m_hashTableOfEquals[l]=n[0],this.m_hashTableOfEqualsSize+=n.length,n.length=0,this.rehashIfNeeded()}if(this.m_newNodes.length=0,t)for(const r of i)this.updateAttachedEdgesAfterNodeChange(r)}rehashIfNeeded(){if(2*this.m_hashTableOfEqualsSize>this.m_hashTableOfEquals.length){const e=this.m_hashTableOfEquals;this.m_hashTableOfEquals=de(2*e.length),this.m_hashTableOfEqualsSize=0;for(const t of e){let e=t;for(;e;){const t=e.nextInHash;e.nextInHash=null,e.prevInHash=null,this.addNodeToHashImpl(e),e=t}}}}addNodeToHashImpl(e){const t=e.hash%this.m_hashTableOfEquals.length,s=this.m_hashTableOfEquals[t];e.nextInHash=s,null!==s&&(s.prevInHash=e),this.m_hashTableOfEquals[t]=e,this.m_hashTableOfEqualsSize++}removeNodeFromHash(e){const t=e.hash%this.m_hashTableOfEquals.length,s=e.prevInHash,n=e.nextInHash;s?s.nextInHash=n:this.m_hashTableOfEquals[t]=n,n&&(n.prevInHash=s),this.m_hashTableOfEqualsSize--,e.prevInHash=null,e.nextInHash=null}hashTableBinsToCheck(e,t){const s=(e.pt.x-this.m_origin.x)/this.m_cell.x,n=(e.pt.y-this.m_origin.y)/this.m_cell.y,i=ne()-1,r=Math.round(Ce(s,-i,i)),h=Math.round(Ce(n,-i,i));let a=r|h<<32;a=fe(a),t[0]=this.m_hashTableOfEquals[a%this.m_hashTableOfEquals.length];let o=r+1|h<<32;o=fe(o);let m=1;t[1]=this.m_hashTableOfEquals[o%this.m_hashTableOfEquals.length],t[1]!==t[0]&&(m=2);let l=r+1|h+1<<32;l=fe(l),t[m]=this.m_hashTableOfEquals[l%this.m_hashTableOfEquals.length];for(let u=0;u<m;u++)if(t[m]===t[u]){m--;break}m++;let g=r|h+1<<32;g=fe(g),t[m]=this.m_hashTableOfEquals[g%this.m_hashTableOfEquals.length];for(let u=0;u<m;u++)if(t[m]===t[u]){m--;break}return m++,m}calculateHash(e){const t=(e.x-this.m_origin.x)/this.m_cell.x,s=(e.y-this.m_origin.y)/this.m_cell.y,n=ne()-1;let i=Math.round(Ce(t,-n,n))|Math.round(Ce(s,-n,n))<<32;return i=fe(i),0===i&&(i=1),i}processSharpCorners(e,t,s,n){if(this.parent.m_param1.length=0,this.parent.m_param2.length=0,e.getStartXY().equals(t.getStartXY())){const i=[0,0],r=[0,0],h=X(e,t,0,0,s,2,i,r,n);if(h){this.parent.m_param1.push(0),this.parent.m_param2.push(0);for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return h+1}}if(e.getEndXY().equals(t.getEndXY())){const i=[0,0],r=[0,0],h=X(e,t,1,1,s,2,i,r,n);if(h){for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return this.parent.m_param1.push(1),this.parent.m_param2.push(1),h+1}}if(e.getStartXY().equals(t.getEndXY())){const i=[0,0],r=[0,0],h=X(e,t,0,1,s,2,i,r,n);if(h){this.parent.m_param1.push(0),this.parent.m_param2.push(1);for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return h+1}}if(e.getEndXY().equals(t.getStartXY())){const i=[0,0],r=[0,0],h=X(e,t,1,0,s,2,i,r,n);if(h){for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return this.parent.m_param1.push(1),this.parent.m_param2.push(0),h+1}}return 0}}function lt(e,t,s){let n=0;switch(e){case D.enumLine:n=0;break;case D.enumBezier:n=2;break;case D.enumRationalBezier2:n=3;break;case D.enumBezier2:n=1;break;case D.enumEllipticArc:n=0===t.projectionBehavior()?5:4;break;default:O("")}return s?5-n:n}class gt extends He{constructor(e){super(e.m_shape,e.m_tolerance,!1),this.m_parent=e}compare(e,t,s){if(this.m_bIntersectionDetected)return-1;const n=e.getElement(s),i=this.m_parent.getEdgeOriginVertices(t),r=this.m_parent.m_edgeVertices.getFirstElement(i),h=this.m_parent.getEdgeOriginVertices(n),a=this.m_parent.m_edgeVertices.getFirstElement(h);return this.m_currentNode=s,this.compareSegments(t,r,n,a)}}class ut extends We{constructor(e){super(e.m_shape,e.m_tolerance),this.m_parent=e}compare(e,t){if(this.m_bIntersectionDetected)return-1;const s=e.getElement(t),n=this.m_parent.getEdgeOriginVertices(s),i=this.m_parent.m_edgeVertices.getFirstElement(n);return this.m_currentNode=t,this.compareVertex(e,t,i)}}class ct extends b{constructor(e){super(),this.pt1=Z.getNAN(),this.pt2=Z.getNAN(),this.m_shape=e}compare(e,t,s){this.m_shape.queryXY(t,this.pt1);const n=e.getElement(s);return this.m_shape.queryXY(n,this.pt2),this.pt1.compare(this.pt2)}}class _t{constructor(e){this.m_point=Z.getNAN(),this.m_pt=Z.getNAN(),this.m_shape=e}setPoint(e){this.m_point.setCoordsPoint2D(e)}compare(e,t){const s=e.getElement(t);return this.m_shape.queryXY(s,this.m_pt),this.m_point.compare(this.m_pt)}}class dt{constructor(e,s){this.m_shape=null,this.m_progressTracker=null,this.m_edges=new n(8),this.m_clusters=new n(5),this.m_clusterVertices=new Oe(!1),this.m_edgeVertices=new Oe(!1),this.m_helperPoint=new i,this.m_eventQ=new r,this.m_sweepStructure=new r,this.m_bComplications=!1,this.m_sweepComparator=null,this.m_tempEdgeBuffer=[],this.m_modifiedClusters=[],this.m_edgesToInsertInSweepStructure=[],this.m_prevNeighbour=-1,this.m_nextNeighbour=-1,this.m_bContinuingSegmentChainOptimization=!1,this.m_progressCounter=0,this.m_segmentIntersector=new st,this.m_segBuf1=new t,this.m_segBuf2=new t,this.m_sweepPoint=new Z(0,0),this.m_tolerance=0,this.m_toleranceSqr=0,this.m_sweepPointCluster=-1,this.m_vertexClusterIndex=-1,this.m_bCracked=!1,this.m_bSweepPointClusterWasModified=!1,this.m_progressTracker=e,this.m_bTrackChanges=s}hadComplications(){return this.m_bComplications}sweep(e,t){const s=new K;s.setSwapCoordinates(),e.applyTransformation(s),this.setEditShape_(e),this.m_bCracked=!1,this.m_tolerance=t,this.m_toleranceSqr=t*t;let n=this.sweepImpl_();return e.applyTransformation(s),n||(this.fillEventQueuePass2(),n=this.sweepImpl_()||n),this.m_shape.removeUserIndex(this.m_vertexClusterIndex),this.m_shape=null,this.m_bCracked}sweepVertical(e,t){this.setEditShape_(e),this.m_bCracked=!1,this.m_tolerance=t,this.m_toleranceSqr=t*t,this.m_bComplications=!1;let s=this.sweepImpl_();if(!this.m_bComplications){const n=e.filterClosePoints(t,!0,!1,this.m_bTrackChanges,h);this.m_bComplications=1===n,s||=1===n}return-1!==this.m_vertexClusterIndex&&(this.m_shape.removeUserIndex(this.m_vertexClusterIndex),this.m_vertexClusterIndex=-1),this.m_shape=null,s}getEdgeCluster(e,t){return this.m_edges.getField(e,0+t)}setEdgeCluster_(e,t,s){this.m_edges.setField(e,0+t,s)}getEdgeOriginVertices(e){return this.m_edges.getField(e,2)}setEdgeOriginVertices_(e,t){this.m_edges.setField(e,2,t)}getNextEdgeEx(e,t){return this.m_edges.getField(e,3+t)}setNextEdgeEx_(e,t,s){this.m_edges.setField(e,3+t,s)}getEdgeSweepNode(e){return this.m_edges.getField(e,7)}setEdgeSweepNode_(e,t){this.m_edges.setField(e,7,t)}getNextEdge(e,t){const s=this.getEdgeEnd(e,t);return this.m_edges.getField(e,3+s)}setNextEdge_(e,t,s){const n=this.getEdgeEnd(e,t);this.m_edges.setField(e,3+n,s)}getPrevEdge(e,t){const s=this.getEdgeEnd(e,t);return this.m_edges.getField(e,5+s)}setPrevEdge_(e,t,s){const n=this.getEdgeEnd(e,t);this.m_edges.setField(e,5+n,s)}getClusterVertices(e){return this.m_clusters.getField(e,0)}setClusterVertices_(e,t){this.m_clusters.setField(e,0,t)}getClusterSweepEdgeList(e){return this.m_clusters.getField(e,2)}setClusterSweepEdgeList_(e,t){this.m_clusters.setField(e,2,t)}getClusterFirstEdge(e){return this.m_clusters.getField(e,1)}setClusterFirstEdge_(e,t){this.m_clusters.setField(e,1,t)}getClusterEventQNode(e){return this.m_clusters.getField(e,3)}setClusterEventQNode_(e,t){this.m_clusters.setField(e,3,t)}newCluster_(e){const t=this.m_clusters.newElement(),s=this.m_clusterVertices.createList();return this.setClusterVertices_(t,s),e!==h&&(this.m_clusterVertices.addElement(s,e),this.m_shape.setUserIndex(e,this.m_vertexClusterIndex,t)),t}deleteCluster_(e){this.m_clusters.deleteElement(e)}addVertexToCluster_(e,t){const s=this.getClusterVertices(e);this.m_clusterVertices.addElement(s,t),this.m_shape.setUserIndex(t,this.m_vertexClusterIndex,e)}newEdge_(e){const t=this.m_edges.newElement(),s=this.m_edgeVertices.createList();return this.setEdgeOriginVertices_(t,s),-1!==e&&this.m_edgeVertices.addElement(s,e),t}addVertexToEdge_(e,t){const s=this.getEdgeOriginVertices(e);this.m_edgeVertices.addElement(s,t)}deleteEdge_(e){this.m_edges.deleteElement(e);const t=this.m_edgesToInsertInSweepStructure.findIndex((t=>t===e));t>=0&&$(this.m_edgesToInsertInSweepStructure,t)}addEdgeToCluster(e,t){-1===this.getEdgeCluster(e,0)?this.setEdgeCluster_(e,0,t):-1===this.getEdgeCluster(e,1)?this.setEdgeCluster_(e,1,t):O(""),this.addEdgeToClusterImpl_(e,t)}addEdgeToClusterImpl_(e,t){const s=this.getClusterFirstEdge(t);if(-1!==s){const n=this.getNextEdge(s,t);this.setPrevEdge_(n,t,e),this.setNextEdge_(e,t,n),this.setNextEdge_(s,t,e),this.setPrevEdge_(e,t,s)}else this.setPrevEdge_(e,t,e),this.setNextEdge_(e,t,e),this.setClusterFirstEdge_(t,e)}getEdgeEnd(e,t){return this.getEdgeCluster(e,0)===t?0:1}mergeClusters_(e,t){this.dbgCheckCluster_(e),this.dbgCheckCluster_(t);const s=this.getClusterEventQNode(t);-1!==s&&(this.m_eventQ.deleteNode(s),this.setClusterEventQNode_(t,-1));let n=this.getClusterFirstEdge(e),i=this.getClusterFirstEdge(t);if(-1!==i){let s=i,r=i,h=!1;do{this.dbgCheckEdge_(s),h=!1;const n=this.getEdgeEnd(s,t),a=this.getNextEdgeEx(s,n);if(this.getEdgeCluster(s,n+1&1)===e){this.disconnectEdge_(s);const e=this.getEdgeOriginVertices(s);if(this.m_edgeVertices.deleteList(e),this.deleteEdge_(s),s===a){i=-1;break}i===s&&(i=this.getClusterFirstEdge(t),r=a,h=!0)}s=a}while(s!==r||h);if(-1!==i){do{const n=this.getEdgeEnd(s,t),i=this.getNextEdgeEx(s,n);this.setEdgeCluster_(s,n,e),s=i}while(s!==r);if(n=this.getClusterFirstEdge(e),-1!==n){const t=this.getNextEdge(n,e),s=this.getNextEdge(i,e);t===n?(this.setClusterFirstEdge_(e,i),this.addEdgeToClusterImpl_(n,e),this.setClusterFirstEdge_(e,n)):s===i&&this.addEdgeToClusterImpl_(i,e),this.setNextEdge_(i,e,t),this.setPrevEdge_(t,e,i),this.setNextEdge_(n,e,s),this.setPrevEdge_(s,e,n)}else this.setClusterFirstEdge_(e,i)}}const r=this.getClusterVertices(e),h=this.getClusterVertices(t);for(let a=this.m_clusterVertices.getFirst(h);-1!==a;a=this.m_clusterVertices.getNext(a)){const t=this.m_clusterVertices.getElement(a);this.m_shape.setUserIndex(t,this.m_vertexClusterIndex,e)}this.m_clusterVertices.concatenateLists(r,h),this.deleteCluster_(t),this.dbgCheckCluster_(e)}mergeEdges_(e,t){this.dbgCheckEdge_(e),this.dbgCheckEdge_(t);const s=this.getEdgeCluster(e,0),n=this.getEdgeCluster(e,1),i=this.getEdgeCluster(t,0),r=this.getEdgeCluster(t,1),h=this.getEdgeOriginVertices(e),a=this.getEdgeOriginVertices(t);if(this.m_edgeVertices.concatenateLists(h,a),t===this.getClusterFirstEdge(s)&&this.setClusterFirstEdge_(s,e),t===this.getClusterFirstEdge(n)&&this.setClusterFirstEdge_(n,e),this.disconnectEdge_(t),this.deleteEdge_(t),!(s===i&&n===r||n===i&&s===r)){const e=this.getClusterXY(s),t=this.getClusterXY(i);e.isEqualPoint2D(t)?(s!==i&&this.mergeClusters_(s,i),n!==r&&this.mergeClusters_(n,r)):(n!==i&&this.mergeClusters_(n,i),s!==r&&this.mergeClusters_(s,r))}this.dbgCheckEdge_(e)}disconnectEdge_(e){const t=this.getEdgeCluster(e,0),s=this.getEdgeCluster(e,1);this.disconnectEdgeFromCluster_(e,t),this.disconnectEdgeFromCluster_(e,s)}disconnectEdgeFromCluster_(e,t){const s=this.getNextEdge(e,t),n=this.getPrevEdge(e,t),i=this.getClusterFirstEdge(t);s!==e?(this.setNextEdge_(n,t,s),this.setPrevEdge_(s,t,n),i===e&&this.setClusterFirstEdge_(t,s)):this.setClusterFirstEdge_(t,-1)}applyIntersectorToEditShape_(e,t,s){let n=this.m_edgeVertices.getFirst(e);const i=this.m_edgeVertices.getElement(n),r=this.getClusterFromVertex(i),h=this.m_shape.getNextVertex(i),a=this.getClusterFromVertex(h),o=this.m_shape.getXY(i),m=this.m_shape.getXY(h);let l=!1,g=!1;const u=t.getResultSegment(s,0).getStartXY(),c=t.getResultSegment(s,t.getResultSegmentCount(s)-1).getEndXY();o.equals(u)||(l=!0),m.equals(c)||(g=!0),this.m_shape.splitSegmentWithIntersector(i,t,s,!0,!0);const _=this.m_bTrackChanges&&t.getSegmentChanged(s);for(_&&this.m_shape.setGeometryModifiedWithVertex(i,!0),n=this.m_edgeVertices.getNext(n);-1!==n;n=this.m_edgeVertices.getNext(n)){const e=this.m_edgeVertices.getElement(n),i=this.getClusterFromVertex(e)===r;this.m_shape.splitSegmentWithIntersector(e,t,s,i,!0),_&&this.m_shape.setGeometryModifiedWithVertex(e,!0)}if(l&&this.updateClusterXY(!0,r,u,t.getResultSegmentStartPointWeight(s,0),t.getResultSegmentStartPointRank(s,0)),g){const e=t.getResultSegmentCount(s)-1;this.updateClusterXY(!0,a,c,t.getResultSegmentEndPointWeight(s,e),t.getResultSegmentEndPointRank(s,e))}}createEdgesAndClustersFromSplitEdge_(e,t,s){this.dbgCheckNewEdgesArray_();const i=this.getEdgeOriginVertices(e),r=this.getEdgeCluster(e,0),h=this.getEdgeCluster(e,1);let a=this.newEdge_(-1);this.m_edgesToInsertInSweepStructure.push(a);const o=n.impossibleIndex3();this.setEdgeSweepNode_(a,o),this.m_tempEdgeBuffer.push(a),this.addEdgeToCluster(a,r);const m=t.getResultSegmentCount(s);for(let n=1;n<m;n++){const e=this.newCluster_(-1);this.m_modifiedClusters.push(e),this.m_tempEdgeBuffer.push(e),this.addEdgeToCluster(a,e);const t=this.newEdge_(-1);this.m_edgesToInsertInSweepStructure.push(t),this.setEdgeSweepNode_(t,o),this.m_tempEdgeBuffer.push(t),this.addEdgeToCluster(t,e),a=t}this.addEdgeToCluster(a,h);for(let n=this.m_edgeVertices.getFirst(i);-1!==n;n=this.m_edgeVertices.getNext(n)){let e=this.m_edgeVertices.getElement(n);if(this.getClusterFromVertex(e)===r){let t=0;const s=this.m_tempEdgeBuffer.length;do{if(t>0){const s=this.m_tempEdgeBuffer[t-1];this.addVertexToCluster_(s,e)}const s=this.m_tempEdgeBuffer[t];t+=2,this.addVertexToEdge_(s,e),e=this.m_shape.getNextVertex(e)}while(t<s)}else{let t=this.m_tempEdgeBuffer.length-1;do{if(t<this.m_tempEdgeBuffer.length-2){const s=this.m_tempEdgeBuffer[t+1];this.addVertexToCluster_(s,e)}const s=this.m_tempEdgeBuffer[t];t-=2,this.addVertexToEdge_(s,e),e=this.m_shape.getNextVertex(e)}while(t>=0)}}this.m_tempEdgeBuffer.length=0,this.dbgCheckNewEdgesArray_()}getVertexFromClusterIndex(e){const t=this.getClusterVertices(e);return this.m_clusterVertices.getFirstElement(t)}getClusterFromVertex(e){return this.m_shape.getUserIndex(e,this.m_vertexClusterIndex)}processSplitHelper1_(e,t,s){const i=this.getEdgeCluster(t,0),r=this.getClusterXY(i),h=this.getEdgeCluster(t,1),a=this.getClusterXY(h),o=s.getResultSegmentCount(e);let m=s.getResultSegment(e,0);const l=m.getStartXY();if(!r.isEqualPoint2D(l)){if(!this.m_bComplications){r.compare(this.m_sweepPoint)*l.compare(this.m_sweepPoint)<0&&(this.m_bComplications=!0)}this.getAffectedEdges(i,this.m_tempEdgeBuffer),this.m_modifiedClusters.push(i)}if(!this.m_bComplications&&o>1){const e=r.compare(a),t=m.getEndXY();(r.compare(t)!==e||t.compare(a)!==e||t.compare(this.m_sweepPoint)<0)&&(this.m_bComplications=!0)}m=s.getResultSegment(e,o-1);const g=m.getEndXY();if(!a.isEqualPoint2D(g)){if(!this.m_bComplications){a.compare(this.m_sweepPoint)*g.compare(this.m_sweepPoint)<0&&(this.m_bComplications=!0)}this.getAffectedEdges(h,this.m_tempEdgeBuffer),this.m_modifiedClusters.push(h)}this.m_tempEdgeBuffer.push(t);for(let u=0,c=this.m_tempEdgeBuffer.length;u<c;u++){const e=this.m_tempEdgeBuffer[u],s=this.getEdgeSweepNode(e);n.isValidElement(s)&&(this.m_sweepStructure.deleteNode(s),this.setEdgeSweepNode_(e,-1));const i=n.impossibleIndex3();e!==t&&this.getEdgeSweepNode(e)!==i&&(this.m_edgesToInsertInSweepStructure.push(e),this.setEdgeSweepNode_(e,i))}this.m_tempEdgeBuffer.length=0}checkAndFixIntersection_(e,t){const s=this.m_sweepStructure.getElement(e);return this.m_sweepComparator.compare(this.m_sweepStructure,s,t),!!this.m_sweepComparator.intersectionDetected()&&(this.m_sweepComparator.clearIntersectionDetectedFlag(),this.fixIntersection_(e,t),!0)}fixIntersection_(e,t){this.m_bCracked=!0;const s=this.m_sweepStructure.getElement(e),n=this.m_sweepStructure.getElement(t);let i=null,r=null;const h=this.getEdgeOriginVertices(s),a=this.m_edgeVertices.getFirstElement(h),o=this.getEdgeOriginVertices(n),m=this.m_edgeVertices.getFirstElement(o),l=this.m_shape.querySegment(a,this.m_segBuf1,!1,!1);R(l),i=this.m_segBuf1.get();const g=this.m_shape.getNextVertex(a),u=this.m_shape.getWeight(a),c=this.m_shape.getSegmentParentageBreakVertex(a),_=this.m_shape.getWeight(g),d=this.m_shape.getSegmentParentageBreakVertex(g),p=this.m_shape.getSegmentWeight(a),f=this.m_shape.getRank(a),S=this.m_shape.getRank(g),x=this.m_shape.getSegmentRank(a),C=this.m_shape.getSegmentParentage(a),E=this.m_shape.querySegment(m,this.m_segBuf2,!1,!1);R(E),r=this.m_segBuf2.get();const I=this.m_shape.getNextVertex(m),w=this.m_shape.getWeight(m),b=this.m_shape.getSegmentParentageBreakVertex(m),N=this.m_shape.getWeight(I),P=this.m_shape.getSegmentParentageBreakVertex(I),v=this.m_shape.getSegmentWeight(m),y=this.m_shape.getRank(m),k=this.m_shape.getRank(I),V=this.m_shape.getSegmentRank(m),T=this.m_shape.getSegmentParentage(m);this.m_segmentIntersector.pushSegment(i,u,f,_,S,p,x,c,d,C),this.m_segmentIntersector.pushSegment(r,w,y,N,k,v,V,b,P,T),3===this.m_segmentIntersector.intersect2D(this.m_tolerance,!0)&&(this.m_bComplications=!0),this.splitEdge_(s,n,-1,this.m_segmentIntersector),this.m_segmentIntersector.clear()}fixIntersectionPointSegment_(e,t){this.m_bCracked=!0;const s=this.m_sweepStructure.getElement(t);let n=null;const i=this.getEdgeOriginVertices(s),r=this.m_edgeVertices.getFirstElement(i),h=this.m_shape.querySegment(r,this.m_segBuf1,!1,!1);R(h),n=this.m_segBuf1.get();const a=this.m_shape.getNextVertex(r),o=this.m_shape.getWeight(r),m=this.m_shape.getSegmentParentageBreakVertex(r),l=this.m_shape.getWeight(a),g=this.m_shape.getSegmentParentageBreakVertex(a),u=this.m_shape.getSegmentWeight(r),c=this.m_shape.getRank(r),_=this.m_shape.getRank(a),d=this.m_shape.getSegmentRank(r),p=this.m_shape.getSegmentParentage(r),f=this.getClusterFirstVertex(e);this.m_segmentIntersector.pushSegment(n,o,c,l,_,u,d,m,g,p),this.m_shape.queryPoint(f,this.m_helperPoint);const S=this.m_shape.getWeight(f),x=this.m_shape.getRank(f);this.m_segmentIntersector.intersect2DEx(this.m_tolerance,this.m_helperPoint,x,S,!0),this.splitEdge_(s,-1,e,this.m_segmentIntersector),this.m_segmentIntersector.clear()}insertNewEdges_(){if(0===this.m_edgesToInsertInSweepStructure.length)return!0;this.dbgCheckNewEdgesArray_();let e=!0,t=0;const s=this.m_edgesToInsertInSweepStructure.length,i=Math.max(2*s+200,this.m_sweepStructure.size()+200);for(;this.m_edgesToInsertInSweepStructure.length;){if(this.m_edgesToInsertInSweepStructure.length>Math.max(100,this.m_shape.getTotalPointCount())||t>i){this.m_edgesToInsertInSweepStructure.length=0,this.m_bComplications=!0,e=!1;break}const s=this.m_edgesToInsertInSweepStructure.at(-1);this.m_edgesToInsertInSweepStructure.pop(),this.setEdgeSweepNode_(s,-1);const r=this.isEdgeOnSweepLine_(s);n.isValidElement(r)?(this.insertNewEdgeToSweepStructure_(s,r),t++):r!==n.impossibleIndex2()&&(e=!1),this.m_bContinuingSegmentChainOptimization=!1}return e}insertNewEdgeToSweepStructure_(e,t){let s;if(this.m_bContinuingSegmentChainOptimization?(s=this.m_sweepStructure.addElementAtPosition(this.m_prevNeighbour,this.m_nextNeighbour,e,!0,!0),this.m_bContinuingSegmentChainOptimization=!1):s=this.m_sweepStructure.addUniqueElement(e),-1===s){const t=this.m_sweepStructure.getDuplicateElement(),s=this.m_sweepStructure.getElement(t);return this.mergeEdges_(s,e),!1}if(this.setEdgeSweepNode_(e,s),this.m_sweepComparator.intersectionDetected()){this.m_sweepComparator.clearIntersectionDetectedFlag();const e=this.m_sweepComparator.getLastComparedNode();return this.m_prevNeighbour===e&&(this.m_prevNeighbour=-1),this.m_nextNeighbour===e&&(this.m_nextNeighbour=-1),this.fixIntersection_(e,s),!0}return!1}isEdgeOnSweepLine_(e){const t=this.getEdgeCluster(e,0),s=this.getEdgeCluster(e,1),i=this.getClusterXY(t),r=this.getClusterXY(s);if(Z.sqrDistance(i,r)<=this.m_toleranceSqr)return this.m_bComplications=!0,-1;const h=i.compare(this.m_sweepPoint),a=r.compare(this.m_sweepPoint);return h<=0&&a>0?s:a<=0&&h>0?t:h>0&&a>0?n.impossibleIndex2():-1}fillEventQueue(){const e=new a(0),t=this.m_shape.queryVertexIteratorOnSelection();for(let i=t.next();i!==h;i=t.next())-1!==this.m_shape.getUserIndex(i,this.m_vertexClusterIndex)&&e.add(i);this.m_shape.sortVerticesSimpleByY(e,0,e.size()),this.progress_(!0),this.m_eventQ.clear(),this.m_eventQ.setCapacity(e.size()),this.m_eventQ.setComparator(new ct(this.m_shape));const s=Z.getNAN();s.setNAN();let n=-1;for(let i=0,r=e.size();i<r;i++){const t=e.read(i);if(this.m_shape.getXY(t).isEqualPoint2D(s)){const e=this.m_shape.getUserIndex(t,this.m_vertexClusterIndex);this.mergeClusters_(n,e);continue}n=this.getClusterFromVertex(t),this.m_shape.queryXY(t,s);const r=this.m_eventQ.addBiggestElement(t);this.setClusterEventQNode_(n,r)}}fillEventQueuePass2(){const e=new a(0);for(let t=this.m_eventQ.getFirst();-1!==t;t=this.m_eventQ.getNext(t)){const s=this.m_eventQ.getElement(t);e.add(s)}this.m_eventQ.clear(),this.m_shape.sortVerticesSimpleByY(e,0,e.size()),this.progress_(!0);for(let t=0,s=e.size();t<s;t++){const s=e.read(t),n=this.getClusterFromVertex(s),i=this.m_eventQ.addBiggestElement(s);this.setClusterEventQNode_(n,i)}}getAffectedEdges(e,t){const s=this.getClusterFirstEdge(e);if(-1===s)return;let i=s;do{const s=this.getEdgeSweepNode(i);n.isValidElement(s)&&t.push(i),i=this.getNextEdge(i,e)}while(i!==s)}updateClusterXY(e,t,s,n,i){const r=this.getClusterVertices(t);for(let h=this.m_clusterVertices.getFirst(r);-1!==h;h=this.m_clusterVertices.getNext(h)){const t=this.m_clusterVertices.getElement(h);this.m_shape.setXYMonotonicPoint2D(t,s),this.m_shape.setWeight(t,n),this.m_shape.setRank(t,i),e&&this.m_bTrackChanges&&this.m_shape.setGeometryModifiedWithVertex(t,!0),this.m_shape.setSegmentParentageBreakVertex(t,!0)}}splitEdge_(e,t,s,n){this.dbgCheckEdge_(e),-1!==t&&this.dbgCheckEdge_(t),this.disconnectEdge_(e),-1!==t&&this.disconnectEdge_(t),this.processSplitHelper1_(0,e,n),-1!==t&&this.processSplitHelper1_(1,t,n),-1!==s&&n.getResultPointChanged()&&this.m_modifiedClusters.push(s);for(let h=0,a=this.m_modifiedClusters.length;h<a;h++){const e=this.m_modifiedClusters[h],t=this.getClusterEventQNode(e);-1!==t&&(this.m_eventQ.deleteNode(t),this.setClusterEventQNode_(e,-1))}const i=this.getEdgeOriginVertices(e),r=-1!==t?this.getEdgeOriginVertices(t):-1;if(this.applyIntersectorToEditShape_(i,n,0),-1!==r)this.applyIntersectorToEditShape_(r,n,1);else{const e=n.getResultPoint().getXY();this.updateClusterXY(n.getResultPointChanged(),s,e,n.getResultPointWeight(),n.getResultPointRank())}this.createEdgesAndClustersFromSplitEdge_(e,n,0),-1!==t&&this.createEdgesAndClustersFromSplitEdge_(t,n,1),this.m_edgeVertices.deleteList(i),this.deleteEdge_(e),-1!==t&&(this.m_edgeVertices.deleteList(r),this.deleteEdge_(t));for(let h=0,a=this.m_modifiedClusters.length;h<a;h++){const e=this.m_modifiedClusters[h];e===this.m_sweepPointCluster&&(this.m_bSweepPointClusterWasModified=!0);let t=this.getClusterEventQNode(e);if(-1===t){const s=this.getClusterFirstVertex(e);if(t=this.m_eventQ.addUniqueElement(s),-1===t){const t=this.m_eventQ.getDuplicateElement(),s=this.m_eventQ.getElement(t),n=this.getClusterFromVertex(s);this.mergeClusters_(n,e)}else this.setClusterEventQNode_(e,t)}}this.m_modifiedClusters.length=0}getClusterXY(e){const t=this.getClusterFirstVertex(e);return this.m_shape.getXY(t)}getClusterFirstVertex(e){const t=this.getClusterVertices(e);return this.m_clusterVertices.getFirstElement(t)}dbgCheckEdge_(e){}dbgCheckCluster_(e){}dbgCheckNewEdgesArray_(){}dbgSaveSweepStructure_(e){}sweepImpl_(){this.progress_(!0),this.m_bSweepPointClusterWasModified=!1,this.m_sweepPointCluster=-1,null===this.m_sweepComparator&&(this.m_sweepStructure.disableBalancing(),this.m_sweepComparator=new gt(this),this.m_sweepStructure.setComparator(this.m_sweepComparator));const e=[];let t=null,s=null;this.m_prevNeighbour=-1,this.m_nextNeighbour=-1,this.m_bContinuingSegmentChainOptimization=!1;const i=n.impossibleIndex2(),r=n.impossibleIndex3();for(let n=this.m_eventQ.getFirst();-1!==n;){this.progress_(),this.dbgCheckSweepStructure_(),this.m_bContinuingSegmentChainOptimization=!1,this.m_prevNeighbour=-1,this.m_nextNeighbour=-1;const h=this.m_eventQ.getElement(n);this.m_sweepPointCluster=this.getClusterFromVertex(h),this.m_shape.queryXY(h,this.m_sweepPoint),this.m_sweepComparator.setSweepY(this.m_sweepPoint.y,this.m_sweepPoint.x);let a=!1;{const t=this.getClusterFirstEdge(this.m_sweepPointCluster);if(a=-1===t,!a){let s=t;do{const t=this.getEdgeSweepNode(s);-1===t?(this.m_edgesToInsertInSweepStructure.push(s),this.setEdgeSweepNode_(s,r)):t!==r&&e.push(t),s=this.getNextEdge(s,this.m_sweepPointCluster)}while(s!==t)}}if(!this.m_sweepStructure.isAutoBalancing()&&(this.m_sweepStructure.getMaxDepthEver()>4||this.m_edgesToInsertInSweepStructure.length>10)&&this.m_sweepStructure.enableBalancing(),e.length>0){this.m_bContinuingSegmentChainOptimization=1===e.length&&1===this.m_edgesToInsertInSweepStructure.length;for(let n=0,r=e.length;n<r;n++){const t=this.m_sweepStructure.getElement(e[n]);this.setEdgeSweepNode_(t,i)}let t=i,s=i;for(let n=0,r=e.length;n<r;n++){const r=e[n];if(t===i){const e=this.m_sweepStructure.getPrev(r);if(-1!==e){const s=this.m_sweepStructure.getElement(e);this.getEdgeSweepNode(s)!==i&&(t=e)}else t=-1}if(s===i){const e=this.m_sweepStructure.getNext(r);if(-1!==e){const t=this.m_sweepStructure.getElement(e);this.getEdgeSweepNode(t)!==i&&(s=e)}else s=-1}if(t!==i&&s!==i)break}for(let n=0,i=e.length;n<i;n++){const t=e[n],s=this.m_sweepStructure.getElement(t);this.m_sweepStructure.deleteNode(t),this.setEdgeSweepNode_(s,-1)}e.length=0,this.m_prevNeighbour=t,this.m_nextNeighbour=s,-1!==t&&-1!==s?this.m_bContinuingSegmentChainOptimization||this.checkAndFixIntersection_(t,s):-1===t&&-1===s&&(this.m_bContinuingSegmentChainOptimization=!1)}else a&&(null===t&&(t=new ut(this)),t.setPoint(this.m_sweepPoint),this.m_sweepStructure.searchUpperBound(t),t.intersectionDetected()&&(t.clearIntersectionDetectedFlag(),this.fixIntersectionPointSegment_(this.m_sweepPointCluster,t.getCurrentNode())));const o=this.m_bContinuingSegmentChainOptimization;!this.insertNewEdges_()&&o&&-1!==this.m_prevNeighbour&&-1!==this.m_nextNeighbour&&this.checkAndFixIntersection_(this.m_prevNeighbour,this.m_nextNeighbour),this.m_bSweepPointClusterWasModified?(this.m_bSweepPointClusterWasModified=!1,null===s&&(s=new _t(this.m_shape)),s.setPoint(this.m_sweepPoint),n=this.m_eventQ.searchUpperBound(s)):n=this.m_eventQ.getNext(n)}return this.m_bCracked}setEditShape_(e){this.m_shape=e,this.m_vertexClusterIndex=this.m_shape.createUserIndex(),this.m_edges.setCapacity(e.getSelectedCount()+32),this.m_clusters.setCapacity(e.getSelectedCount()),this.m_clusterVertices.reserveLists(e.getSelectedCount()),this.m_clusterVertices.reserveNodes(e.getSelectedCount()),this.m_edgeVertices.reserveLists(e.getSelectedCount()+32),this.m_edgeVertices.reserveNodes(e.getSelectedCount()+32);for(let t=this.m_shape.getFirstGeometry();t!==h;t=this.m_shape.getNextGeometry(t)){if(L(this.m_shape.getGeometryType(t)))for(let s=this.m_shape.getFirstPath(t);s!==h;s=this.m_shape.getNextPath(s)){const t=this.m_shape.getPathSize(s),n=this.m_shape.getFirstVertex(s);if(n===h)continue;let i=this.m_shape.getNextVertex(n);if(i===h||i===n)continue;let r=-1;e.selected(n)&&(r=this.newCluster_(n));let a=-1;-1!==r&&e.selected(i)&&(a=this.newEdge_(n),this.addEdgeToCluster(a,r));let o=a;for(let e=0,s=t-2;e<s;e++){const e=this.m_shape.getNextVertex(i);let t=-1;if(this.m_shape.selected(i)){const s=this.newCluster_(i);-1!==o&&this.addEdgeToCluster(o,s),this.m_shape.selected(e)&&(t=this.newEdge_(i),this.addEdgeToCluster(t,s))}o=t,i=e}if(this.m_shape.isClosedPath(s)){const e=this.m_shape.getNextVertex(i);if(this.m_shape.selected(i)){const t=this.newCluster_(i);if(-1!==o&&this.addEdgeToCluster(o,t),this.m_shape.selected(e)){const e=this.newEdge_(i);this.addEdgeToCluster(e,t),this.addEdgeToCluster(e,r)}}}else{let e=-1;this.m_shape.selected(i)&&(e=this.newCluster_(i),-1!==o&&this.addEdgeToCluster(o,e))}}else for(let e=this.m_shape.getFirstPath(t);e!==h;e=this.m_shape.getNextPath(e)){let t=this.m_shape.getFirstVertex(e);for(let s=0,n=this.m_shape.getPathSize(e);s<n;s++)this.m_shape.selected(t)&&this.newCluster_(t),t=this.m_shape.getNextVertex(t)}}this.fillEventQueue()}progress_(e=!1){}dbgCheckSweepStructure_(){}}function pt(e){for(let t=e.getFirstGeometry();t!==h;t=e.getNextGeometry(t))if(L(e.getGeometryType(t)))return!0;return!1}function ft(e,t,s,n){if(!pt(e))return!1;const i=new Et(n);i.m_shape=e,i.m_tolerance=t,i.m_bTrackChanges=s;let r=!1;const h=e.hasCurves()?5:15;return r=e.getTotalPointCount()<h?i.crackBruteForce_():i.crackerPlaneSweep_(),r}function St(e,t,s,n,i){if(!pt(t))return!1;let r=new Et(i);if(r.m_shape=t,r.m_tolerance=s,r.m_bAllowCoincident=e,r.m_bNeedsNonSimpleResult=null!==n,r.needsCrackingImpl_())return n&&n.assign(r.m_nonSimpleResult),!0;const h=new K;h.setSwapCoordinates(),t.applyTransformation(h),r=new Et(i),r.m_shape=t,r.m_tolerance=s,r.m_bAllowCoincident=e,r.m_bNeedsNonSimpleResult=null!==n;const a=r.needsCrackingImpl_();return t.applyTransformation(h),!!a&&(n&&n.assign(r.m_nonSimpleResult),!0)}function xt(e,t,s,n){const i=t.getGeometryType();if(L(i)){return new Et(n).crackAWithBMultiPath_(e,t,s)}z("crack_A_with_B")}function Ct(e,t){return{t:e,index:t}}class Et{crackBruteForce_(){let e=this.crackBruteForceImpl_();if(!e&&this.m_shape.hasCurves()){const t=new K;t.setSwapCoordinates(),this.m_shape.applyTransformation(t),e=this.crackBruteForceImpl_(),this.m_shape.applyTransformation(t)}return e}crackBruteForceImpl_(){let s=!1;const n=new t,r=new t,a=e.constructEmpty(),o=e.constructEmpty(),m=!1,l=new i,g=new st,u=this.m_shape.getTotalPointCount(),c=u*u*2,_=this.m_shape.queryVertexIteratorOnSelection();for(let e=_.next();e!==h;e=_.next()){const t=this.m_shape.getGeometryType(_.currentGeometry());let i=1,u=1,d=1,p=0,f=0,S=0;const x=this.m_shape.getSegmentParentage(e);let C=!1,E=!1,I=null,w=!1;if(W(t))i=this.m_shape.getWeight(e),p=this.m_shape.getRank(e);else{if(I=this.getSegment_(e,n),null===I)continue;const t=this.m_shape.getVertexIndex(e);i=this.m_shape.getWeightWithIndex(t),p=this.m_shape.getRankWithIndex(t),d=this.m_shape.getSegmentWeightWithIndex(t),S=this.m_shape.getSegmentRankWithIndex(t),C=this.m_shape.getSegmentParentageBreakVertex(e);{const t=this.m_shape.getNextVertex(e);u=this.m_shape.getWeight(t),f=this.m_shape.getRank(t),E=this.m_shape.getSegmentParentageBreakVertex(t)}if(I.queryLooseEnvelope(a),a.inflateCoords(this.m_tolerance,this.m_tolerance),I.isDegenerate(this.m_tolerance)){if(!I.isDegenerate(0))continue;w=!0,I=null}}const b=new N({copy:_});let v=b.next();v!==h&&(v=b.next());let y=0;for(;v!==h;v=b.next()){if(0!==y){y--;continue}if(this.m_shape.getTotalPointCount()>c)return s;this.progress_();const t=this.m_shape.getGeometryType(b.currentGeometry());let N=null,k=!1,V=0,T=0,B=0,q=0,F=0,X=0,Y=!1,D=!1;const A=this.m_shape.getSegmentParentage(v);if(W(t))V=this.m_shape.getWeight(v),q=this.m_shape.getRank(v);else{if(N=this.getSegment_(v,r),null===N)continue;const e=this.m_shape.getVertexIndex(v);V=this.m_shape.getWeightWithIndex(e),q=this.m_shape.getRankWithIndex(e),B=this.m_shape.getSegmentWeightWithIndex(e),X=this.m_shape.getSegmentRankWithIndex(e),Y=this.m_shape.getSegmentParentageBreakVertex(v);{const e=this.m_shape.getNextVertex(v);T=this.m_shape.getWeight(e),F=this.m_shape.getRank(e),D=this.m_shape.getSegmentParentageBreakVertex(e)}if(N.queryLooseEnvelope(o),N.isDegenerate(this.m_tolerance)){if(!N.isDegenerate(0))continue;k=!0,N=null}}let M=0,O=0;if(null!==I&&null!==N){if(a.isIntersectingNe(o)){0!==P(!0,!0,I,N,this.m_tolerance,!0)&&(g.pushSegment(I,i,p,u,f,d,S,C,E,x),g.pushSegment(N,V,q,T,F,B,X,Y,D,A),g.intersect2D(this.m_tolerance,!0),s||=g.getSegmentChanged(0)||g.getSegmentChanged(1),M=g.getResultSegmentCount(0),O=g.getResultSegmentCount(1),M+O>0&&(this.m_shape.splitSegmentWithIntersector(e,g,0,!0,!0),this.m_shape.splitSegmentWithIntersector(v,g,1,!0,!0),this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(e,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(v,!0))),O>1&&(y+=O-1),g.clear())}}else if(null!==I){const t=this.m_shape.getXY(v);if(a.contains(t)){if(g.pushSegment(I,i,p,u,f,d,S,C,E,x),this.m_shape.queryPoint(v,l),g.intersect2DEx(this.m_tolerance,l,q,V,m),s||=g.getSegmentChanged(0)||g.getResultPointChanged(),M=g.getResultSegmentCount(0),M>0)if(this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(e,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(v,!0)),this.m_shape.splitSegmentWithIntersector(e,g,0,!0,!0),k){let e=h;for(let t=this.m_shape.getNextVertex(v);t!==h&&t!==v&&(N=this.getSegment_(t,r),e=t,null!=N&&N.isDegenerate(0));t=this.m_shape.getNextVertex(t));for(let t=v;t!==h&&(this.m_shape.setPoint(t,g.getResultPoint(),!0),t!==e);t=this.m_shape.getNextVertex(t));}else this.m_shape.setPoint(v,g.getResultPoint(),!0);g.clear()}}else{if(null===N)continue;{const t=this.m_shape.getXY(e);if(o.inflateCoords(this.m_tolerance,this.m_tolerance),o.contains(t)){if(g.pushSegment(N,V,q,T,F,B,X,Y,D,A),this.m_shape.queryPoint(e,l),g.intersect2DEx(this.m_tolerance,l,p,i,m),s||=g.getSegmentChanged(0)||g.getResultPointChanged(),O=g.getResultSegmentCount(0),O>0)if(this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(v,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(e,!0)),this.m_shape.splitSegmentWithIntersector(v,g,0,!0,!0),y+=O-1,w){let t=h;for(let s=this.m_shape.getNextVertex(e);s!==h&&s!==e&&(N=this.getSegment_(s,r),t=s,null!=N&&N.isDegenerate(0));s=this.m_shape.getNextVertex(s));for(let s=e;s!==h&&(this.m_shape.setPoint(s,g.getResultPoint(),!0),s!==t);s=this.m_shape.getNextVertex(s));}else this.m_shape.setPoint(e,g.getResultPoint(),!0);g.clear()}}}if(M+O!==0&&0!==M){let t=!1;for(;I=this.getSegment_(e,n),null!=I&&(I.queryEnvelope(a),I.isDegenerate(this.m_tolerance));){if(!(M>1)){t=!0;break}e=_.next(),M--,R(e!==h)}if(t)break}}}return s}crackerPlaneSweep_(){return this.planesweep_()}planesweep_(){return new dt(this.m_progressTracker,this.m_bTrackChanges).sweep(this.m_shape,this.m_tolerance)}needsCrackingImpl_(){let e=!1;const t=new a(0);t.resize(this.m_shape.getSelectedCount());const s=this.m_shape.queryVertexIteratorOnSelection();for(let a=0,u=s.next();u!==h;++a,u=s.next())t.write(a,u);this.m_shape.sortVerticesSimpleByY(t,0,t.size()),t.add(h);const n=this.m_shape.createUserIndex(),i=this.m_shape.createUserIndex();this.m_sweepComparator=new He(this.m_shape,this.m_tolerance,!this.m_bAllowCoincident),this.m_sweepStructure.setComparator(this.m_sweepComparator);let r=null;const o=[],m=[];let l=0;const g=new Z;for(let a=t.read(l++);a!==h;){this.m_shape.queryXY(a,g);let s=!1;do{let e=this.m_shape.getNextVertex(a),r=this.m_shape.getPrevVertex(a);s||=e!==h||r!==h,e===h||this.m_shape.selected(e)||(e=h),r===h||this.m_shape.selected(r)||(r=h),e!==h&&this.m_shape.compareVerticesSimpleY(a,e)<0&&(m.push(a),m.push(e)),r!==h&&this.m_shape.compareVerticesSimpleY(a,r)<0&&(m.push(r),m.push(r));const g=this.m_shape.getUserIndex(a,n);-1!==g&&(o.push(g),this.m_shape.setUserIndex(a,n,-1));const u=this.m_shape.getUserIndex(a,i);-1!==u&&(o.push(u),this.m_shape.setUserIndex(a,i,-1)),a=t.read(l++)}while(a!==h&&this.m_shape.isEqualXYPoint2D(a,g));if(!s&&(null===r&&(r=new We(this.m_shape,this.m_tolerance)),r.setPoint(g),this.m_sweepStructure.searchUpperBound(r),r.intersectionDetected())){e=!0,this.m_bNeedsNonSimpleResult&&(O("needsCrackingIMpl_"),this.m_nonSimpleResult=new be(6,-1,-1));break}let u=1===o.length&&2===m.length;const c=32;o.length>c&&re(o);let _=-1,d=-1;if(!u)for(let t=0,n=o.length;t<n;t++){const s=o[t],n=this.m_sweepStructure.getPrev(s);if(-1!==n&&-1===o.indexOf(n))if(-1===_)_=n;else{if(e=!0,!this.m_bNeedsNonSimpleResult)break;this.m_nonSimpleResult=new be(6,-1,-1)}const i=this.m_sweepStructure.getNext(s);if(-1!==i&&-1===o.indexOf(i))if(-1===d)d=i;else{if(e=!0,!this.m_bNeedsNonSimpleResult)break;this.m_nonSimpleResult=new be(6,-1,-1)}if(-1!==_&&-1!==d)break}if(e&&!this.m_bNeedsNonSimpleResult)break;if(this.m_sweepComparator.setSweepY(g.y,g.x),!u){for(let e=0,t=o.length;e<t;e++){const t=o[e];this.m_sweepStructure.deleteNode(t)}o.length=0}if(!u&&-1!==_&&-1!==d&&this.checkForIntersections_(_,d)){e=!0,this.m_bNeedsNonSimpleResult&&(this.m_nonSimpleResult=this.m_sweepComparator.getResult());break}for(let t=0,r=m.length;t<r;t+=2){const s=m[t],r=m[t+1];let h;if(u?(h=this.m_sweepStructure.replaceElementAtPosition(o[0],s,!0,!0),o.length=0,u=!1):h=this.m_sweepStructure.addElement(s),this.m_sweepComparator.intersectionDetected()){this.m_bNeedsNonSimpleResult&&(this.m_nonSimpleResult=this.m_sweepComparator.getResult()),e=!0;break}-1===this.m_shape.getUserIndex(r,n)?this.m_shape.setUserIndex(r,n,h):this.m_shape.setUserIndex(r,i,h)}if(e)break;m.length=0}return this.m_shape.removeUserIndex(n),this.m_shape.removeUserIndex(i),e}checkForIntersections_(e,t){const s=this.m_sweepStructure.getElement(e);this.m_sweepComparator.compare(this.m_sweepStructure,s,t);const n=this.m_sweepComparator.intersectionDetected();return this.m_sweepComparator.clearIntersectionDetectedFlag(),n}getSegment_(e,t){return Et.st_getSegment(this.m_shape,e,t)}static st_getSegment(e,t,s){return e.querySegment(t,s,!1,!1)?s.get():null}dbgPrintSweepEdge(e){}dbgPrintSweepStructure(){}dbgSaveSweepStructure(e=null){}dbgCheckSweepStructure(){}progress_(e=!1){this.m_progressCounter++}crackAWithBMultiPath_(n,i,r){const h=e.constructEmpty();n.queryLooseEnvelope(h);const a=e.constructEmpty();if(i.queryLooseEnvelope(a),a.inflateCoords(r,r),!a.isIntersecting(h))return n;const o=n.getImpl(),m=o.getAccelerators();let l=null,g=null;m&&(g=m.getQuadTree()),It(n,G(i))&&(l=s(o,a),g=l);const u=g?g.getIteratorForQT():null,c=i.querySegmentIterator(),_=n.querySegmentIterator(),d=new Array(15),p=[];for(;c.nextPath();)for(;c.hasNextSegment();){const t=c.nextSegment();if(g){u.resetIterator(t,r);for(let e=u.next();-1!==e;e=u.next()){this.progress_();const s=g.getElement(e);if(_.resetToVertex(s,-1),_.hasNextSegment()){const e=_.nextSegment().intersect(t,null,d,null,r);for(let t=0;t<e;t++){const e=d[t];if(0===e||1===e)continue;const s=Ct(e,_.getStartPointIndex());p.push(s)}}}}else{const s=e.constructEmpty();if(t.queryLooseEnvelope(s),s.inflateCoords(r,r),!h.isIntersecting(s))continue;for(_.resetToFirstPath();_.nextPath();)for(;_.hasNextSegment();){const n=_.nextSegment(),i=e.constructEmpty();if(n.queryLooseEnvelope(i),!i.isIntersecting(s))continue;const h=n.intersect(t,null,d,null,r);for(let e=0;e<h;e++){const t=d[e];if(0===t||1===t)continue;const s=Ct(t,_.getStartPointIndex());p.push(s)}}}}if(0===p.length)return n;p.sort(((e,t)=>e.index<t.index?-1:e.index>t.index?1:e.t<t.t?-1:e.t>t.t?1:0));const f=n.createInstance();if(f.getGeometryType()===D.enumPolygon){f.setFillRule(n.getFillRule())}for(_.resetToFirstPath();_.nextPath()&&!_.hasNextSegment(););R(_.hasNextSegment());let S=_.nextSegment();const x=new t;let C=-1;for(let e=0,t=p.length;e<t;){const s=p[e].index;let n=e+1;for(;n<t&&p[n].index===s;)++n;for(;_.getStartPointIndex()<s;){this.progress_();const e=_.hasNextSegment(),t=_.getPathIndex();if((e||!_.isClosingSegment()||_.isCurve())&&(R(null!==S),f.addSegment(S,C!==t)),C=t,!e){for(_.isPathClosed();_.nextPath()&&!_.hasNextSegment(););R(_.hasNextSegment())}S=_.nextSegment()}let i=0;for(let t=e;t<n;t++){const e=p[t].t;if(e===i)continue;R(null!==S),S.queryCut(i,e,x),i=e;const s=_.getPathIndex();f.addSegment(x.get(),C!==s),C=s}const r=_.hasNextSegment();if((r||!_.isClosingSegment()||_.isCurve())&&(R(null!=S),S.queryCut(i,1,x),f.addSegment(x.get(),!1)),r)S=_.nextSegment();else{for(;_.nextPath()&&!_.hasNextSegment(););S=_.hasNextSegment()?_.nextSegment():null}e=n}if(null!==S){const e=_.getPathIndex();(_.hasNextSegment()||!_.isClosingSegment()||_.isCurve())&&f.addSegment(S,C!==e),C=e}let E=_.hasNextSegment();for(;;){if(!E){for(;_.nextPath()&&(E=_.hasNextSegment(),!E););if(!E)break}S=_.nextSegment();const e=_.getPathIndex();E=_.hasNextSegment();(E||!_.isClosingSegment()||_.isCurve())&&f.addSegment(S,C!==e),C=e}return f}constructor(e){this.m_shape=null,this.m_progressTracker=null,this.m_nonSimpleResult=new be,this.m_tolerance=0,this.m_sweepComparator=null,this.m_progressCounter=0,this.m_bTrackChanges=!1,this.m_bNeedsNonSimpleResult=!1,this.m_bAllowCoincident=!0,this.m_sweepStructure=new r,this.m_progressTracker=e}}function It(e,t){const s=e.getPointCount();if(s<16)return!1;const n=1;return 2*s+1*(Math.log(s)/Math.log(2))*t<n*s*t}function wt(e,t,s,n,i){const r=v(t),h=Math.max(4*r,s);return new kt(t,null,h,Number.NaN,i).approximateWithCirclesImpl(e,n)}function bt(){return Number.isNaN(this.radius.value())}function Nt(){return{ptStart:new Z,ptEnd:new Z,center:new k,radius:new Se,fcenter:new y,fradius2:new he,maxError:Number.NaN,isLine:bt}}Et.s_bForceBruteForce=!0;const Pt=5,vt=1/8;function yt(e,t,s,n){return{pt:e.clone(),t,err:s,checkCount:n}}class kt{constructor(e,t,s,n,i){this.m_left=e,this.m_tracker=i,this.m_eps=s,this.m_trackerCounter=0,this.m_tolerance=n,this.m_circleCheckCounter=0,this.m_bReversedLeft=!1,this.m_leftArc=Nt()}closeToCircularArc(e,t,s,n,i,r){if(this.m_circleCheckCounter++,r.maxError=0,!kt.checkSweepAngle(e,t))return!1;if(r.ptStart.setCoordsPoint2D(s),r.ptEnd.setCoordsPoint2D(i),e.isCircular()){const t=e;return r.fradius2=he.constructDouble(t.getSemiMajorAxis()).mulDouble(t.getSemiMajorAxis()),r.radius.set(t.getSemiMajorAxis()),r.fcenter.assignPoint2D(t.getCenter()),r.center.set(t.getCenter()),!0}const h=r.ptEnd.sub(r.ptStart).clone();h.leftPerpendicularThis(),h.normalize();if(Math.abs(h.dotProduct(n.sub(r.ptStart)))<=this.m_eps)return!!this.confirmIsLine(r,h)&&(r.radius.set(Number.NaN),r.center.setCoords(0,0),!0);{const s=r.ptEnd.sub(r.ptStart),i=n.sub(r.ptStart),h=s.crossProduct(i);if(0===h)return!1;const a=.5*s.sqrLength(),o=.5*i.sqrLength();let m=a*i.y-o*s.y;m/=h;let l=s.x*o-i.x*a;l/=h;const g=Math.sqrt(m*m+l*l);if(4*Number.EPSILON*g>this.m_eps)return!1;const u=m+r.ptStart.x,c=l+r.ptStart.y;r.radius.set(g),r.center.setCoords(u,c);const _=this.maxCircleApproximationError(e,t,r);if(_>this.m_eps)return r.maxError=_,!1}const a=(new y).assignPoint2D(r.ptStart),o=(new y).assignPoint2D(r.ptEnd).sub(a),m=(new y).assignPoint2D(n).sub(a),l=o.crossProduct(m);if(l.isZero())return!1;const g=o.sqrLength().mulDouble(.5),u=m.sqrLength().mulDouble(.5),c=g.mul(m.y).sub(u.mul(o.y)),_=o.x.mul(u).sub(m.x.mul(g)),d=c.mul(c).add(_.mul(_)),p=l.clone();p.invertThis(),r.fradius2=d.mul(p).mul(p),r.fcenter.setCoords(c.mul(p).add(a.x),_.mul(p).add(a.y)),r.center.setWithEps(r.fcenter.asPoint2D()),r.radius.setWithEps(Math.sqrt(r.fradius2.toDouble()));const f=k.constructPoint2D(r.ptStart).subE(r.center),S=k.constructPoint2D(r.ptEnd).subE(r.center);if(!f.dotProduct(S).gt(ae))return!1;const x=this.maxCircleApproximationError(e,t,r);return r.maxError=x,x<=this.m_eps}static checkSweepAngle(e,t){if(e.getGeometryType()===D.enumEllipticArc){const s=e,n=V(s,t.vmin),i=V(s,t.vmax);return!(Math.abs(i-n)>.5*oe)}return!0}confirmIsLine(e,t){const s=e.ptEnd.sub(e.ptStart);return!(Math.abs(t.dotProduct(s.mul(.25)))>this.m_eps)&&!(Math.abs(t.dotProduct(s.mul(.75)))>this.m_eps)}maxCircleApproximationError(e,t,s){const n=[.25,.75],i=[.1,.25,.75,.9];let r,h;e.getGeometryType()===D.enumEllipticArc?(r=n,h=n.length):(r=i,h=i.length);let a=0;for(let o=0;o<h;++o){const n=new Z;e.queryCoord2D(ee(t.vmin,t.vmax,r[o]),n);const i=n.sub(s.center.value()).length(),h=Math.abs(i-s.radius.value());h>a&&(a=h)}return a}approximateWithCirclesImpl(e,t){let s=1;t&&t.push(0);const n=j(9,Number.NaN);let i;e?i=this.m_left.getMonotonicPartParams(n.length,n):(n[0]=0,n[1]=1,i=2);const r=[],h=[],a=new Z(0,0);for(let o=1;o<i;o++){const e=new J(n[o-1],n[o]);for(this.m_bReversedLeft=!kt.goodOrientation(this.m_left,e),this.m_bReversedLeft?(r.push(yt(a,e.vmin,0,0)),r.push(yt(a,e.vmax,0,0))):(r.push(yt(a,e.vmax,0,0)),r.push(yt(a,e.vmin,0,0))),r[0].pt=this.m_left.getCoord2D(r[0].t),r[1].pt=this.m_left.getCoord2D(r[1].t);r.length>1;){this.progress_();const e=r.at(-1);let n=e.checkCount,i=e.err;const a=e.pt.clone(),o=e.t,m=r[r.length-2].t,l=.5*(o+m),g=this.m_left.getCoord2D(l);if(i<=this.m_eps||n>=Pt){const e=new J;if(e.setCoords(o,m),this.closeToCircularArc(this.m_left,e,a,g,r[r.length-2].pt,this.m_leftArc)){t&&(this.m_bReversedLeft?h.push(o):t.push(m)),s++,r.pop();continue}n=0,i=this.m_leftArc.maxError}e.t=l,e.pt.setCoordsPoint2D(g),i*=vt,n++,e.err=i,e.checkCount=n,r.push(yt(a,o,i,n))}this.m_bReversedLeft&&t&&(t.length=t.length+h.length,me(t,h.reverse(),t.length-h.length,0,h.length),h.length=0),r.length=0}return s}approximateWithCirclesImplPolyline(e){const t=new T,s=[];if(!this.approximateWithCirclesImpl(!0,s))return t;let n=0;const i=this.m_left.getStartXY();t.startPath(i);for(let r=1;r<s.length;++r)if(e)t.lineTo(this.m_left.getCoord2D(s[r]));else{const e=new Z;this.m_left.queryCoord2D(s[r],e);const h=new Z;this.m_left.queryCoord2D(.5*(s[r]+n),h);const a=new c;a.constructCircularArcThreePoint(i,e,h),t.addSegment(a,!1),i.assign(e),n=s[r]}return t}static goodOrientation(e,t){const s=e.getCoord2D(t.vmin),n=e.getCoord2D(t.vmax);return s.compare(n)<0}progress_(e=!1){}}function Vt(e,t,s,n,i,r,h){Bt(e,t,s,i,r,h)}function Tt(e,s,n,r){if(!L(e.getGeometryType()))return e;const h=e.getImpl();if(!h.hasNonLinearSegments())return e;const a=e.createInstance();if(a.getGeometryType()===D.enumPolygon){a.setFillRule(e.getFillRule())}new o;const g=new i,u=new t,c=[],_=[],d=[],p=e.getDescription().getAttributeCount()>1,f=h.querySegmentIterator();for(;f.nextPath();){let e=!0;for(;f.hasNextSegment();){const t=f.isClosingSegment(),i=f.nextSegment();if(!i.isCurve()){a.addSegment(i,e,t),e=!1;continue}let r,h=!1;const o=!0,S=!0;switch(i.getGeometryType()){case D.enumEllipticArc:case D.enumRationalBezier2:r=l(i,s,n,o,S,_,d,c),h=!0;break;default:r=m(i,s,n,!0,o,_,c)}const x=h?2:3;_[1].isNAN()?(u.createLine(),u.get().construct(_[0],_[x])):h?(u.createQuadraticRationalBezier(),u.get().constructArrayWeights(_,d)):(u.createCubicBezier(),u.get().constructPoints(_)),p&&e&&(i.queryCoord(c[0],g),u.get().setStart(g)),p&&(i.queryCoord(c[1],g),u.get().setEnd(g)),a.addSegment(u.get(),e,t&&1===r),e=!1;for(let e=1,s=r,n=x;e<s;++e,n+=x)_[n+1].isNAN()?(u.createLine(),u.get().construct(_[n],_[n+x])):h?(u.createQuadraticRationalBezier(),u.get().constructArrayWeights(_.slice(n),d.slice(n))):(u.createCubicBezier(),u.get().constructPoints(_.slice(n))),p&&(i.queryCoord(c[e+1],g),u.get().setEnd(g)),a.addSegment(u.get(),!1,t&&e+1===s)}}return a}function Bt(e,t,s,n,i,r){e.hasCurves()?(e.setCurveStitcherPointer(n),n.m_impl=new Mt(r,!1,null),n.m_impl.buildMonotonicCurveParentage(e,t,s,i)):n.m_impl=null}function qt(e,t,s,n,i,r,h,a){e.hasCurves()?(e.setCurveStitcherPointer(r),r.m_impl=new Mt(a,!0,i),r.m_impl.buildMonotonicCurveParentage(e,t,s,h),Wt(e,s,a)):r.m_impl=null}function Ft(e){if(!e.hasSegmentParentage())return;const t=new a(0),s=e.queryVertexIteratorOnSelection();for(let a=s.next();a!==h;a=s.next())t.add(a);if(0===t.size())return;e.sortVerticesSimpleByY(t,0,t.size()),t.add(h);const n=Z.getNAN();e.queryXY(t.read(0),n);let i=0;const r=Z.getNAN();for(let a=1,o=t.size();a<o;a++){{const s=t.read(a);s!==h?e.queryXY(s,r):r.setNAN()}if(!r.isEqualPoint2D(n)){let s=!1,o=-2;for(let n=i;n<a;++n){const i=t.read(n);if(e.getSegmentParentageBreakVertex(i)){s=!0;break}let r=e.getSegmentParentage(i);const a=e.getPrevVertex(i);if(a!==h){let t=e.getSegmentParentage(a);if(-1===r&&(r=t),-1===t&&(t=r),r!==t){s=!0;break}}if(-2!==o&&r!==o){s=!0;break}o=r}if(s)for(let n=i;n<a;++n)e.setSegmentParentageBreakVertex(t.read(n),!0);n.setCoordsPoint2D(r),i=a}}}function Xt(e,t){let s=t.isEmpty()?e:E(null,t,!0).total();return s>e&&(s=e),.125*s}function Yt(t,s){return s||(s=e.constructEmpty()),Xt(t,s)}function Dt(e,t){return.125*e}function At(e,t){return 3*e+3*t}class Rt{constructor(){this.m_impl=null}stitchCurves(e,t,s,n){this.m_impl&&(this.m_impl.stitchCurves(e,t,s),n&&this.clearStitcher(e))}clearStitcher(e){this.m_impl&&(this.m_impl.clearStitcher(e),this.m_impl=null)}getOriginalVertexIndex(e,t){return this.m_impl.getOriginalVertexIndex(e,t)}getOriginalSegmentTypeInfo(e){return this.m_impl.getOriginalSegmentTypeInfo(e)}}class Mt{constructor(e,t,s){this.m_originalPlanarSegments=[],this.m_progressTracker=null,this.m_nsr=null,this.m_progressTracker=e,this.m_nsr=s,this.m_tolerance=0,this.m_originalVertexIndex=-1,this.m_type=0,this.m_progressCounter=0,this.m_bIsSimple=t}buildMonotonicCurveParentage(e,s,n,r){const a=!1,o=!0;if(!e.hasCurves())return;R(!e.hasSegmentParentage()),this.m_type=1,this.m_originalPlanarSegments.length=0,this.m_bIsSimple&&(this.m_originalVertexIndex=e.createUserIndex()),this.m_tolerance=n;const c=new i,_=new t,d=[],p=[],f=[];for(let t=e.getFirstGeometry();t!==h;t=e.getNextGeometry(t))for(let i=e.getFirstPath(t);i!==h;i=e.getNextPath(i)){let t=e.getPathSize(i),r=e.getFirstVertex(i),h=0,S=-1;for(let x=0;x<t;x++){let C=e.getNextVertex(r);if(!e.querySegment(r,_,!0,!1)){r=C;continue}if(0===h){S=e.getVertexIndex(r);const s=Mt.regularizeCurve(e,_.get(),r,n);if(s>=0){this.m_nsr&&0===this.m_nsr.m_reason&&this.m_nsr.assign(new be(13,S,-1)),h=s,t=e.getPathSize(i),C=e.getNextVertex(r);const n=e.querySegment(r,_,!0,!1);R(n)}}else h--;const E=e.getVertexIndex(r);let I;-1!==this.m_originalVertexIndex&&e.setUserIndex(r,this.m_originalVertexIndex,S),e.setSegmentToIndex(E,null);let w=!1;switch(_.get().getGeometryType()){case D.enumEllipticArc:case D.enumRationalBezier2:I=l(_.get(),s,n,a,o,p,f,d),w=!0;break;default:{const e=!this.m_bIsSimple||!_.get().isMonotoneQuickAndDirty();I=m(_.get(),s,n,e,a,p,d)}}const b=this.m_originalPlanarSegments.length;if(e.setSegmentParentageAndBreak(r,b,!0),!p[1].isNAN()){let t=null;t=w?new u({points:p,weights:f}):new g({cp:p}),t.snapControlPoints(n*n),e.setSegmentToIndex(E,t)}const N=w?2:3;for(let t=1,s=I,r=N;t<s;++t,r+=N){_.get().queryCoord(d[t],c);const s=e.insertVertex(i,C,c);if(-1!==this.m_originalVertexIndex&&e.setUserIndex(s,this.m_originalVertexIndex,S),!p[r+1].isNAN())if(w){const t=new u({points:p.slice(r),weights:f.slice(r)});t.snapControlPoints(n*n),e.setSegmentToIndex(e.getVertexIndex(s),t)}else{const t=new g({cp:p.slice(r)});t.snapControlPoints(n*n),e.setSegmentToIndex(e.getVertexIndex(s),t)}e.setSegmentParentageAndBreak(s,b,!1)}I>1&&(x+=I-1,t=e.getPathSize(i)),this.m_originalPlanarSegments.push(_.releaseSegment()),r=C}}}stitchCurves(e,t,s){Mt.st_stitchCurvesImpl(this,e,t,s,!1)}clearStitcher(e){this.m_originalPlanarSegments.length=0,-1!==this.m_originalVertexIndex&&(e.removeUserIndex(this.m_originalVertexIndex),this.m_originalVertexIndex=-1),e.deleteSegmentParentage()}static st_verifyParentage(e){Mt.st_stitchCurvesImpl(null,e,h,0,!0)}getOriginalVertexIndex(e,t){return-1!==this.m_originalVertexIndex&&t!==h?e.getUserIndex(t,this.m_originalVertexIndex):-1}getOriginalSegmentTypeInfo(e){if(-1!==e){const t=this.m_originalPlanarSegments[e];switch(t.getGeometryType()){case D.enumEllipticArc:return 0===t.projectionBehavior()?0:1;case D.enumBezier:return 2;case D.enumBezier2:return 3;case D.enumLine:return-1;case D.enumRationalBezier2:return 4;default:z("")}}return-1}progress_(e=!1){this.m_progressCounter++}processSpan_(e,t,s,n,i,r,a){if(t===s&&0===n)return R(e.getNextVertex(t)===h),e.setSegmentToIndex(e.getVertexIndex(t),null),void e.setSegmentParentageAndBreak(t,-1);const o=e.getNextVertex(t);{let t=2;for(let n=o;n!==s;n=e.getNextVertex(n))t++;R(t===n)}if(null===i){e.setSegmentToIndex(e.getVertexIndex(t),null);for(let t=o;t!==s;)t=e.removeVertex(t,!0);return}const m=e.getXY(t),l=e.getXY(s);if(i.isClosed()){if(m.isEqualPoint2D(l)&&m.isEqualPoint2D(i.getStartXY())){let h;if(h=this.verifySegmentFitness(e,t,s,n,i,r,a)){const n=i.clone();return n.dropAllAttributes(),h<0&&n.reverse(),this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),n)}}}else if(m.isEqualPoint2D(i.getStartXY())){if(l.isEqualPoint2D(i.getEndXY())){const h=i.clone();if(h.dropAllAttributes(),this.verifySegmentFitness(e,t,s,n,h,r,a))return this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),h)}}else if(l.isEqualPoint2D(i.getStartXY())&&m.isEqualPoint2D(i.getEndXY())){const h=i.getReversed();if(h.dropAllAttributes(),this.verifySegmentFitness(e,t,s,n,h,r,a))return this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),h)}this.processSpanSplitSegment(e,t,s,n,i,r,a)}processSpanSplitSegment(e,t,s,n,i,r,h){if(i.isLine())return;if(this.fitSegmentToSpan(e,t,s,n,i,r,h))return;const a=h*h;let o=n,m=t;const l=e.getXY(t);let g=i.getClosestCoordinate(l,!1);const u=i.getCoord2D(g);let c=!1;const _=Z.sqrDistance(l,u);if(_>a){const n=e.getNextVertex(t);if(this.approximateSpanSection(e,t,i,r,h),n===s)return;m=n,c=!0,o-=1}let d=s;const p=e.getXY(s);g=i.getClosestCoordinate(p,!1);const f=i.getCoord2D(g);let S=!1;const x=Z.sqrDistance(p,f);if(x>a){const t=e.getPrevVertex(s);if(this.approximateSpanSection(e,t,i,r,h),t===m)return;d=t,S=!0,o-=1}if((c||S)&&this.fitSegmentToSpan(e,m,d,o,i,r,h))return;let C=!1;if(!c&&_>0){const s=e.getNextVertex(t);if(this.approximateSpanSection(e,t,i,r,h),s===d)return;m=s,c=!0,C=!0,o-=1}if(!S&&x>0){const t=e.getPrevVertex(s);if(this.approximateSpanSection(e,t,i,r,h),t===m)return;d=t,S=!0,C=!0,o-=1}if(C&&this.fitSegmentToSpan(e,m,d,o,i,r,h))return;let E=m;for(;;){const t=e.getNextVertex(E);if(this.approximateSpanSection(e,E,i,r,h),E=t,E===d)return}}fitSegmentToSpan(e,s,n,i,r,h,a){const o=0===this.m_type,m=[];if(m.push(e.getXY(s)),o){let t=s;const r=32;if(i>r){const s=BigInt(i-1),h=BigInt(r-1);let a=h,o=0n;for(let n=1;n<i;n++,a+=h)if(t=e.getNextVertex(t),a>=o+s){o+=s;const n=e.getXY(t);m.push(n)}R(t===n)}else{for(let s=1;s<i;s++){t=e.getNextVertex(t);const s=e.getXY(t);m.push(s)}R(t===n)}}else{let r=s;const h=new t;for(;;){e.querySegment(r,h,!1,!0);const t=[.1,.25,.4,.5,.6,.75,.9,1];let s=0;for(const e of t){(2===i||1&s)&&m.push(h.get().getCoord2D(e)),s++}if(r=e.getNextVertex(r),r===n)break}}const l=(()=>{let e=m[0].compare(m.at(-1));if(0===e){const t=new le(0);Ae(m,m.length,t),e=t.getResult()>=0?-1:1}return e>0})();l&&m.reverse();const g=r.clone();if(g.dropAllAttributes(),g.setSegmentFromCoords(m,m.length),l&&g.reverse(),g.snapControlPoints(this.m_tolerance*this.m_tolerance),this.verifySegmentFitness(e,s,n,i,g,h,a)){this.removeSpan(e,s,n);const t=e.getVertexIndex(s);return e.setSegmentToIndex(t,g),!0}return!1}approximateSpanSection(e,s,n,r,a){const o=new t;if(!e.querySegment(s,o,!0,!1))return;const m=n.getGeometryType();if(m!==o.get().getGeometryType()){if(m===D.enumEllipticArc){if(o.get().getGeometryType()!==D.enumRationalBezier2)return;if(0===n.projectionBehavior()){const t=[];wt(!1,o.get(),a,t,this.m_progressTracker);const n=e.getNextVertex(s),r=e.getPathFromVertex(s),m=new i;let l=s;for(let s=1,i=t.length;s<i;s++){const i=t[s],a=o.get().getCoord2D(t[s-1]),g=o.get().getCoord2D(ee(t[s-1],i,.5));o.get().queryCoord(i,m);const u=m.getXY(),_=new c;_.constructCircularArcThreePoint(a,u,g);let d=h;i<1&&(d=e.insertVertex(r,n,m)),e.setSegmentToIndex(e.getVertexIndex(l),_),l=d}return}{const t=Q(Z,3);o.get().queryControlPoints(t);const n=[0,0,0];o.get().queryWeights(n);const i=_(n),r=new c;return d(t,i*i,null,!1,r),void e.setSegmentToIndex(e.getVertexIndex(s),r)}}O("approximate_span_section_")}}verifySegmentFitness(e,t,s,n,i,r,h){return 0===this.m_type?this.verifySegmentFitnessLines(e,t,s,n,i,r,h):this.verifySegmentFitnessCurves(e,t,s,n,i,r,h)}verifySegmentFitnessCurves(e,t,s,n,i,r,h){const a=e.getXY(t),o=e.getXY(s);if(!a.isEqualPoint2D(i.getStartXY())||!o.isEqualPoint2D(i.getEndXY()))return 0;let m=0;if(i.isClosed()){const e=i.getCoord2D(.1).sub(a);m=i.getCoord2D(.7).sub(a).crossProduct(e)>=0?1:-1}const l=new Array(p.s_maxMonotonicPartParams);let g=i.getMonotonicPartParams(l.length,l);g--;const u=new f,c=[1,.5,.75,.25];let _=0,d=t;const S=a.clone();for(;;){const t=e.getNextVertex(d);let n=e.getSegment(d);null===n&&(e.queryLineConnector(d,u,!0),n=u);for(let e=t===s?1:0;e<c.length;e++){const t=n.getCoord2D(c[e]);if(!i.isCloserThanDistance(t,J.unit(),h))return 0}if(g>1)for(let e=1;e<g;){const t=i.getCoord2D(l[e]);n.isCloserThanDistance(t,J.unit(),h)?(l[g-1]=te(l[e],l[e]=l[g-1]),g--):e++}if(m){const e=n.getCoord2D(.25);_+=e.sub(a).crossProduct(S.sub(a)),S.assign(e),e.assign(n.getCoord2D(.75)),_+=e.sub(a).crossProduct(S.sub(a)),S.assign(e)}if(d=t,d===s)return g>1?0:m?_<0?-m:m:1}}verifySegmentFitnessLines(e,t,s,n,i,r,h){return R(0),0}removeSpan(e,t,s){e.setSegmentToIndex(e.getVertexIndex(t),null);const n=e.getNextVertex(t);n!==s&&e.removeVertices(n,s)}static st_stitchCurvesImpl(e,t,s,n,i){if(t.hasSegmentParentage())return t.hasCurves()?Mt.st_stitchCurvesFromCurvesImpl(e,t,s,n,i):Mt.st_stitchCurvesFromLinesImpl(e,t,s,n,i)}static st_stitchCurvesFromLinesImpl(e,t,s,n,i){let r=s===h?t.getFirstGeometry():s;for(;r!==h;){for(let s=t.getFirstPath(r);s!==h;s=t.getNextPath(s)){let r=t.getPathSize(s);t.isClosedPath(s)&&(r+=1);let a=!0,o=!1;const m=t.getFirstVertex(s);let l=m;for(let s=0;s<r&&l!==h;){let g=t.getSegmentParentage(l);if(-1===g||a){a=!1,s++,l=t.getNextVertex(l),o=!0;continue}let u,c,_=0;if(o?(u=t.getPrevVertex(l),c=l,R(u!==h),R(c!==u),R(-1===t.getSegmentParentage(u)||m===u)):(u=l,c=t.getNextVertex(u),s++,R(c!==h),R(c!==u),g=t.getSegmentParentage(c)),_=2,o=!1,-1===g||t.getSegmentParentageBreakVertex(c)){l=c;continue}let d=t.getNextVertex(c);for(s++;s<r&&d!==h;){c=d,_++;const e=t.getSegmentParentage(d);if(-1===e||t.getSegmentParentageBreakVertex(d))break;R(e===g),s++,d=t.getNextVertex(d)}if(!i){const s=e.m_originalPlanarSegments[g];e.processSpan_(t,u,c,_,s,g,n)}l=c}}if(s!==h)break;r=t.getNextGeometry(r)}}static st_stitchCurvesFromCurvesImpl(e,t,s,n,i){let r=s===h?t.getFirstGeometry():s;for(;r!==h;)if(H(t.getGeometryType(r))){for(let s=t.getFirstPath(r);s!==h;s=t.getNextPath(s)){let r=t.getPathSize(s);const a=t.isClosedPath(s);a&&(r+=1);let o=t.getFirstVertex(s);if(a){if(-1!==t.getSegmentParentage(o)){let e=o;for(let n=0;!t.getSegmentParentageBreakVertex(e);n++){if(n===r){o=t.getFirstVertex(s),t.setSegmentParentageBreakVertex(e,!0);break}e=t.getPrevVertex(e)}}}else R(-1===t.getSegmentParentage(o)||t.getSegmentParentageBreakVertex(o));let m=o;for(let s=0;s<r&&m!==h;){const a=t.getSegmentParentage(m);if(-1===a){s++,m=t.getNextVertex(m);continue}let o=0,l=h;const g=m;o=1;let u=t.getNextVertex(g);for(;s<r&&u!==h;){s++,l=u,o++;const e=t.getSegmentParentage(u);if(-1===e||t.getSegmentParentageBreakVertex(u))break;R(e===a),u=t.getNextVertex(u)}if(l===h)break;if(!i){const s=e.m_originalPlanarSegments[a];e.processSpan_(t,g,l,o,s,a,n)}m=l}}if(s!==h)break;r=t.getNextGeometry(r)}else r=s===h?t.getNextGeometry(r):h}static regularizeCurve(e,t,s,n){let i=t.snapControlPoints(n*n);if(i){const n=e.getVertexIndex(s),i=t.clone();e.setSegmentToIndex(n,i)}if(t.getGeometryType()===g.type){const r=[],h=t.calculateSpecialPointsForCracking(n,r);if(h>0){e.splitSegment(s,r,h),i=e.snapControlPoints(s,h+1,n*n)||i;for(let t=0;t<h;t++)s=e.getNextVertex(s),e.setSegmentParentageBreakVertex(s,!0);return h}}return i?0:-1}}function Ot(e,t,s,n,i){return new Ut(e,s,t,n,i).do_()}function Lt(e,t,s){const n=S(e);return Qe(t.getX(),t.getY(),s.getX(),s.getY(),ue(n))}function zt(e,t,s=1,n=1,r=1,h=1){if(n>h)return e;if(h>n)return t;const a=[0],o=[0],m=new i;return Je(e,t,s,n,r,h,m,o,a),m}function Ht(e,t,s){const n=S(t),i=x(t);return!!Ke(e,n,h,null,s)||St(!0,e,i,null,s)}function Wt(e,t,s){return Ut.fixCurveTwoPointLoops(e,t,s)}function Gt(e){return S(e)}class Ut{constructor(e,t,s,n,i){this.m_shape=e,this.m_progressTracker=t,this.m_tolerance=s,this.m_bFilterDegenerateSegments=n,this.m_bTrackChanges=i,this.m_progressCounter=0}do_(){const e=new C(this.m_tolerance.tolerance,this.m_tolerance.resolution),t=1e-5,s=1e-6,n=Gt(e);let i=x(e);const r=i*(1+t);i*=1+s;let a=!1;const o=this.m_shape.getTotalPointCount()+10>30?1e3:(this.m_shape.getTotalPointCount()+10)*(this.m_shape.getTotalPointCount()+10),m=this.m_shape.hasPointFeatures();for(let l=0;;l++){this.m_shape.dbgCheckSelection(),l>o&&O("crack_and_cluster_iteration_exceeded"),this.m_shape.dbgVerifyMonotone();let e=-1;0===l&&(e=this.firstCrack_(),a||=e>0);const t=this.cluster_(n);if(this.m_shape.dbgVerifyMonotone(),a||=t,this.m_bFilterDegenerateSegments){const e=0!==this.m_shape.filterClosePoints(n,!0,!1,this.m_bTrackChanges,h);a||=e,this.m_shape.dbgVerifyMonotone()}const s=this.m_shape.snapControlPointsOnSelection(r*r);a||=s,this.m_shape.dbgCheckSelection();let g=!1;if((0===l&&-1===e||m||St(!0,this.m_shape,i,null,this.m_progressTracker))&&(g=this.crack_(r),a||=g,this.m_shape.dbgVerifyMonotone()),!g&&!Ut.fixCurveTwoPointLoops(this.m_shape,n,this.m_progressTracker)){this.m_shape.dbgVerifyMonotone();break}}return a&&Ft(this.m_shape),a}cluster_(e){return Ue(this.m_shape,e,h,this.m_bTrackChanges,this.m_progressTracker)}crack_(e){return ft(this.m_shape,e,this.m_bTrackChanges,this.m_progressTracker)}static fixCurveTwoPointLoops(e,t,s){if(!e.hasCurves())return!1;e.dbgVerifyCurves();const n=e.createUserIndexUninitialized(),i=new a(0),r=e.queryVertexIteratorOnSelection();for(let a=r.next();a!==h;a=r.next())i.add(a),e.setUserIndex(a,n,-1);if(0===i.size())return!1;i.add(h),e.sortVerticesSimpleByY(i,0,i.size()-1);let o=0;const m=e.getXY(i.read(o)),l=new Z(Number.NaN,Number.NaN),g=[];for(let a=1,u=i.size();a<u;++a){const t=i.read(a),s=t!==h?e.getXY(t):l;if(s.equals(m))continue;const r=[];for(let l=o;l<a;l++){const t=i.read(l),s=e.getPrevVertex(t);if(s!==h&&-1===e.getUserIndex(s,n)){const t=Qt(e.getXY(s),e.getSegment(s));0!==Z.sqrDistance(m,t.otherPt)&&(t.vert=s,t.dir=-1,r.push(t)),e.setUserIndex(s,n,1)}const a=e.getNextVertex(t);if(a!==h&&-1===e.getUserIndex(t,n)){const s=Qt(e.getXY(a),e.getSegment(t));0!==Z.sqrDistance(m,s.otherPt)&&(s.vert=t,s.dir=1,r.push(s)),e.setUserIndex(t,n,1)}}if(r.length>1){r.sort(((e,t)=>Jt(e,t)));const e=Qt(l.clone(),null);r.push(e);let t=0;for(let s=1,n=r.length;s<n;s++)if(!r[s].otherPt.equals(r[s-1].otherPt)){if(s-t>1&&null!==r[t].seg){let e=!1;const n=t;for(let i=t+1;i<s;i++)if(!jt(r[n],r[i])){e=!0;break}if(e)for(let i=t;i<s&&null!==r[i].seg;i++)g.push(r[i].vert)}t=s}}o=a,m.setCoordsPoint2D(s)}for(const h of g){const s=e.getSegment(h);R(null!==s);const n=e.getXY(h),i=e.getXY(e.getNextVertex(h));if(Z.distance(n,i)<3*t)e.setSegmentToIndex(e.getVertexIndex(h),null);else{const t=s.lengthToT(.5*s.calculateLength2D());e.splitSegment(h,[t],1)}}return e.removeUserIndex(n),g.length>0}firstCrack_(){const e=this.m_shape.getEnvelope2D(this.m_progressTracker),t=E(null,e,!0).total();if(4*t<this.m_tolerance.total()){let e=!1;const s=1.1*t,n=t,i=this.cluster_(s);e||=i;let r=0;this.m_bFilterDegenerateSegments&&(r=this.m_shape.filterClosePoints(0,!0,!1,this.m_bTrackChanges,h));const a=this.crack_(n);return e||=a,e?1:r?2:0}return-1}progress_(e=!1){this.m_progressCounter++,!e&&4095&this.m_progressCounter||(this.m_progressCounter=0)}}function Qt(e,t){return{otherPt:e,seg:t,vert:-1,dir:0}}function jt(e,t){if(R(e.otherPt.equals(t.otherPt)),null===e.seg)return null===t.seg;if(null===t.seg)return!1;const s=e.seg.getGeometryType();if(s!==t.seg.getGeometryType())return!1;if(s===D.enumBezier){const s=e.seg,n=t.seg;let i=s.getControlPoint1(),r=s.getControlPoint2();-1===e.dir&&(r=te(i,i=r));let h=n.getControlPoint1(),a=n.getControlPoint2();return-1===t.dir&&(a=te(h,h=a)),i.equals(h)&&r.equals(a)}if(s===D.enumRationalBezier2){const s=e.seg,n=t.seg,i=s.getControlPoint1(),r=n.getControlPoint1();if(!i.equals(r))return!1;const h=[0,0,0];s.queryWeights(h),-1===e.dir&&(h[2]=te(h[0],h[0]=h[2]));const a=[0,0,0];return n.queryWeights(a),-1===t.dir&&(a[2]=te(a[0],a[0]=a[2])),h[0]===a[0]&&h[1]===a[1]&&h[2]===a[2]}O("")}function Zt(e,t){if(null===e.seg||null===t.seg)return null!==e.seg?-1:null!==t.seg?1:0;const s=e.seg.getGeometryType(),n=t.seg.getGeometryType();return s<n?-1:s>n?1:0}function Jt(e,t){const s=e.otherPt.compare(t.otherPt);return 0!==s?s:Zt(e,t)}export{Rt as C,Oe as I,be as N,dt as P,Ue as a,Vt as b,Gt as c,Yt as d,Ot as e,At as f,qt as g,Lt as h,Qe as i,zt as j,Xe as k,Te as l,Be as m,St as n,Ht as o,Tt as p,De as q,Ve as r,Dt as s,Fe as t,ke as u,xt as v};
5
+ import{a as e,S as t,ac as s,r as n,P as i,T as r,n as h,A as a,d as o,ad as m,ae as l,af as g,ag as u,a3 as c,ah as _,ai as d,aj as p,L as f,l as S,v as x,C,b as E,x as I,ak as w,F as b,al as N,am as P,an as v,ao as y,ap as k,aq as V,i as T,ar as B,as as q,at as F,au as X,av as Y}from"./QuadraticBezier.js";import{G as D,u as A,g as R,e as M,b as O,f as L,a as z,s as H,h as W,v as G,t as U}from"./Geometry.js";import{m as Q,a as j,P as Z,E as J,T as K,A as $,w as ee,b as te,f as se,o as ne,B as ie,n as re,M as he,C as ae,q as oe,D as me,K as le,j as ge,e as ue,t as ce,F as _e,k as de,G as pe,i as fe,H as Se,I as xe,l as Ce,J as Ee}from"./Transformation2D.js";import{b as Ie,c as we}from"./tslib.es6.js";class be{assign(e){this.m_reason=e.m_reason,this.m_vertexIndex1=e.m_vertexIndex1,this.m_vertexIndex2=e.m_vertexIndex2}constructor(e,t,s){void 0!==e?(this.m_reason=e,this.m_vertexIndex1=t,this.m_vertexIndex2=s):(this.m_reason=0,this.m_vertexIndex1=-1,this.m_vertexIndex2=-2)}clear(){this.m_reason=0,this.m_vertexIndex1=-1,this.m_vertexIndex2=-1}}class Ne{constructor(e,s){this.m_monotoneParts=Q(t,16),this.m_xOrds=j(16,Number.NaN),this.m_inputPoint=Z.getNAN(),this.m_miny=0,this.m_maxy=0,this.m_windnum=0,this.m_bAlternate=e,this.m_tolerance=s,this.m_toleranceSqr=s*s,this.m_bTestBorder=!!s,this.m_bBreak=!1}_DoOne(e){if(!this.m_bTestBorder&&(this.m_bAlternate&&this.m_inputPoint.equals(e.getStartXY())||this.m_inputPoint.equals(e.getEndXY())))return void(this.m_bBreak=!0);if(e.getStartY()===this.m_inputPoint.y&&e.getStartY()===e.getEndY()){if(this.m_bAlternate&&!this.m_bTestBorder){const t=Math.min(e.getStartX(),e.getEndX()),s=Math.max(e.getStartX(),e.getEndX());this.m_inputPoint.x>t&&this.m_inputPoint.x<s&&(this.m_bBreak=!0)}return}let t=!1;const s=Math.max(e.getStartX(),e.getEndX());if(this.m_inputPoint.x>s)t=!0;else if(this.m_inputPoint.x>=Math.min(e.getStartX(),e.getEndX())){const n=e.intersectionOfYMonotonicWithAxisX(this.m_inputPoint.y,s);t=!Number.isNaN(n)&&n<=this.m_inputPoint.x}if(t){if(this.m_inputPoint.y===e.getStartY()){if(this.m_inputPoint.y<e.getEndY())return}else if(this.m_inputPoint.y===e.getEndY()&&this.m_inputPoint.y<e.getStartY())return;this.m_bAlternate?this.m_windnum^=1:this.m_windnum+=e.getStartY()>e.getEndY()?1:-1}}_Result(){return!!this.m_windnum}testBorder(e){const t=e.getClosestCoordinate(this.m_inputPoint,!1),s=e.getCoord2D(t);return Z.sqrDistance(s,this.m_inputPoint)<=this.m_toleranceSqr}setInputPoint(e){this.m_inputPoint.setCoordsPoint2D(e),this.m_miny=e.y-this.m_tolerance,this.m_maxy=e.y+this.m_tolerance}processSegment(e){const t=e.queryInterval(0,1);if(t.vmin>this.m_maxy||t.vmax<this.m_miny)return!1;if(this.m_bTestBorder&&this.testBorder(e))return!0;if(t.vmin>this.m_inputPoint.y||t.vmax<this.m_inputPoint.y)return!1;let s=0;if(e.isCurve()&&(0===this.m_monotoneParts.length&&(this.m_monotoneParts.length=128),s=e.getMonotonicParts(this.m_monotoneParts,!0),R(this.m_monotoneParts.length>=s)),s>0)for(let n=0;n<s;n++){const e=this.m_monotoneParts[n].get(),t=J.construct(e.getStartY(),e.getEndY());if(!(t.vmin>this.m_inputPoint.y||t.vmax<this.m_inputPoint.y)&&(this._DoOne(e),this.m_bBreak))return!0}else if(this._DoOne(e),this.m_bBreak)return!0;return!1}result(){return R(0),2}}function Pe(t,s,n,i){const r=new e;t.queryLooseEnvelope(r),r.inflateCoords(i,i);const h=0===t.getFillRule(),a=new Ne(h,i);a.setInputPoint(n);const o=r.clone();o.xmax=n.x+i,o.ymin=n.y-i,o.ymax=n.y+i;const m=t.getImpl().querySegmentIterator(),l=s.getIterator(o,i);for(let e=l.next();-1!==e;e=l.next())if(m.resetToVertex(s.getElement(e),-1),m.hasNextSegment()){const e=m.nextSegment();if(a.processSegment(e))return-1}return a._Result()?1:0}function ve(e,t,s){const n=0===e.getFillRule(),i=new Ne(n,s);i.setInputPoint(t);const r=e.getImpl().querySegmentIterator();for(;r.nextPath();)for(;r.hasNextSegment();){const e=r.nextSegment();if(i.processSegment(e))return-1}return i._Result()?1:0}function ye(e,t,s){return t.isEmpty()?0:ke(e,t.getXY(),s)}function ke(t,s,n){if(t.isEmpty())return 0;const i=e.constructEmpty();if(t.queryLooseEnvelope(i),i.inflateCoords(n,n),!i.contains(s))return 0;const r=t.getImpl().getAccelerators();if(r){r.getRasterizedGeometry()&&R(0);const e=r.getQuadTree();if(e)return Pe(t,e,s,n)}return ve(t,s,n)}function Ve(e,t){const s=e.getPointCount();if(s<16)return!1;const n=1;return 2*s+1*(Math.log(s)/Math.log(2))*t<n*s*t}function Te(e,t,s){const n=ye(e,t,s);return n?1===n?1:2:0}function Be(e,t,s){const n=ke(e,t,s);return n?1===n?1:2:0}function qe(e,t,s,n,i){for(let r=0;r<s;r++)i[r]=Be(e,t[r],n)}function Fe(t,s,n,i,r){if(t.getGeometryType()===D.enumPolygon)qe(t,s,n,i,r);else if(t.getGeometryType()===D.enumEnvelope){const h=e.constructEmpty();t.queryEnvelope(h),Ye(h,s,n,i,r)}else A("")}function Xe(e,t,s,n,i){const r=e.getGeometryType();r===D.enumPolyline?Me(e,t,s,n,i):M(r)?Re():A("")}function Ye(e,t,s,n,i){if(e.isEmpty()){for(let e=0;e<s;e++)i[e]=0;return}const r=e.clone();r.inflateCoords(.5*-n,.5*-n);const h=e.clone();h.inflateCoords(.5*n,.5*n);for(let a=0;a<s;a++)r.contains(t[a])?i[a]=1:h.contains(t[a])?i[a]=2:i[a]=0}function De(e){if(e.isEmpty())return 0;switch(e.getGeometryType()){case D.enumMultiPoint:return e.getImpl().getPointCount();case D.enumPolyline:return e.getImpl().getPathCount();case D.enumPolygon:return e.getImpl().getOGCPolygonCount();case D.enumGeometryCollection:return e.getGeometryCount()}return 1}function Ae(e,t,s){if(s.reset(),t<3)return;const n=e[0].clone(),i=n.x,r=n.y,h=e[1].clone(),a=new Z;for(let o=2;o<t;o++)a.assign(e[o]),s.pe((a.x-n.x)*(h.y-r)),n.assign(h),h.assign(a);s.pe((i-n.x)*(h.y-r))}function Re(e,t,s,n,i){R(0)}function Me(t,n,i,r,h){const a=t.getImpl(),o=a.getAccelerators();let m=null;o&&(m=o.getRasterizedGeometry());let l=i;for(let e=0;e<i;e++)h[e]=1,m&&R(0);if(l){if(o){let t=null;null!==o&&null!==o.getQuadTree()&&(t=o.getQuadTree());const m=a.getPointCount();if(null===t&&m>20&&m*i>4*m+Math.log(m)*i&&(t=s(a)),t){let s=null;const o=a.querySegmentIterator(),m=new e;for(let e=0;e<i&&l;e++)if(1===h[e]){m.setCoords(n[e]),null===s?s=t.getIterator(m,r):s.resetIterator(m,r);let i=-1;for(let a=s.next();-1!==a;a=s.next()){o.resetToVertex(t.getElement(a),i),i=o.getPathIndex();if(o.nextSegment().isIntersectingPoint(n[e],r)){h[e]=2,l--;break}h[e]=0}}return}}const t=a.querySegmentIterator();for(;t.nextPath()&&l;)for(;t.hasNextSegment()&&l;){const e=t.nextSegment();for(let t=0;t<i&&l;t++)1===h[t]&&e.isIntersectingPoint(n[t],r)&&(h[t]=2,l--)}}for(let e=0;e<i;e++)1===h[e]&&(h[e]=0)}class Oe{freeNode_(e){this.m_listNodes.deleteElement(e)}newNode_(){return this.m_listNodes.newElement()}freeList_(e){this.m_lists.deleteElement(e)}newList_(){return this.m_lists.newElement()}Init_(e){R(0)}constructor(e){this.m_listNodes=new n(2),this.m_listOfLists=Oe.st_nullNode(),this.m_bAllowNavigationBetweenLists=!0,void 0===e&&(e=!0),this.m_bAllowNavigationBetweenLists=e,this.m_lists=new n(this.m_bAllowNavigationBetweenLists?4:2)}createList(){const e=this.newList_();return this.m_bAllowNavigationBetweenLists&&(this.m_lists.setField(e,3,this.m_listOfLists),this.m_listOfLists!==Oe.st_nullNode()&&this.m_lists.setField(this.m_listOfLists,2,e),this.m_listOfLists=e),e}deleteList(e){let t=this.getFirst(e);for(;t!==Oe.st_nullNode();){const e=t;t=this.getNext(t),this.freeNode_(e)}if(this.m_bAllowNavigationBetweenLists){const t=this.m_lists.getField(e,2),s=this.m_lists.getField(e,3);t!==Oe.st_nullNode()?this.m_lists.setField(t,3,s):this.m_listOfLists=s,s!==Oe.st_nullNode()&&this.m_lists.setField(s,2,t)}this.freeList_(e)}reserveLists(e){this.m_lists.setCapacity(e)}addElement(e,t){this.m_lists.getField(e,0);const s=this.m_lists.getField(e,1),n=this.newNode_();return s!==Oe.st_nullNode()?(this.m_listNodes.setField(s,1,n),this.m_lists.setField(e,1,n)):(this.m_lists.setField(e,0,n),this.m_lists.setField(e,1,n)),this.m_listNodes.setField(n,0,t),n}reserveNodes(e){this.m_listNodes.setCapacity(e)}deleteElementDirect(e,t,s){t!==Oe.st_nullNode()?(this.m_listNodes.setField(t,1,this.m_listNodes.getField(s,1)),this.m_lists.getField(e,1)===s&&this.m_lists.setField(e,1,t)):(this.m_lists.setField(e,0,this.m_listNodes.getField(s,1)),this.m_lists.getField(e,1)===s&&this.m_lists.setField(e,1,Oe.st_nullNode())),this.freeNode_(s)}deleteElementSearch(e,t){let s=-1,n=this.getFirst(e);for(;n!==t;)s=n,n=this.getNext(n);this.deleteElementDirect(e,s,t)}concatenateLists(e,t){const s=this.m_lists.getField(e,1),n=this.m_lists.getField(t,0);if(n!==Oe.st_nullNode()&&(s!==Oe.st_nullNode()?(this.m_listNodes.setField(s,1,n),this.m_lists.setField(e,1,this.m_lists.getField(t,1))):(this.m_lists.setField(e,0,n),this.m_lists.setField(e,1,this.m_lists.getField(t,1)))),this.m_bAllowNavigationBetweenLists){const e=this.m_lists.getField(t,2),s=this.m_lists.getField(t,3);e!==Oe.st_nullNode()?this.m_lists.setField(e,3,s):this.m_listOfLists=s,s!==Oe.st_nullNode()&&this.m_lists.setField(s,2,e)}return this.freeList_(t),e}getElement(e){return this.m_listNodes.getField(e,0)}getData(e){return this.getElement(e)}setElement(e,t){R(0)}getNext(e){return this.m_listNodes.getField(e,1)}getFirst(e){return this.m_lists.getField(e,0)}getFirstElement(e){const t=this.getFirst(e);return this.getElement(t)}static st_nullNode(){return-1}clear(){this.m_listNodes.deleteAll(!0),this.m_lists.deleteAll(!0),this.m_listOfLists=Oe.st_nullNode()}isEmpty(e){return R(0),!1}getNodeCount(){return this.m_listNodes.size()}getListCount(){return this.m_lists.size()}getFirstList(){return this.m_listOfLists}getNextList(e){return this.m_lists.getField(e,3)}}function Le(e=-1){return{m_value:e,m_line:new f,m_segment:null,m_segmentInfo:new Y(-1),m_env:new J(0,0),m_dxdy:55555555,m_bHorizontal:!1,m_bCurve:!1}}const ze=67;class He extends b{constructor(e,t,s){super(!0),this.m_bIntersectionDetected=!1,this.m_nonSimpleResult=new be,this.m_tempSimpleEdge1=Le(),this.m_tempSimpleEdge2=Le(),this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h,this.m_currentNode=-1,this.m_prevX1=Number.NaN,this.m_prevX2=Number.NaN,this.m_prevY=Number.NaN,this.m_prevX=0,this.m_sweepY=Number.NaN,this.m_sweepX=0,this.m_ptSweep=new Z,this.m_simpleEdgesCache=[],this.m_simpleEdgesRecycle=[],this.m_cOutstandingConstructedEdges=0,this.m_shape=e,this.m_bShapeHasSegments=this.m_shape.hasCurves(),this.m_tolerance=t,this.m_tolerance10=10*t,this.m_bIsSimple=s;const n=Math.trunc(Math.min(3*e.getTotalPointCount()/2,ze)),i=Math.min(7,n);this.m_simpleEdgesCache.length=i}tryGetCachedEdge_(e){const t=this.m_simpleEdgesCache[(e&ge())%this.m_simpleEdgesCache.length];return t&&t.m_value===e?t:null}tryDeleteCachedEdge_(e){const t=(e&ge())%this.m_simpleEdgesCache.length,s=this.m_simpleEdgesCache[t];s&&s.m_value===e&&(this.m_simpleEdgesRecycle.push(s),this.m_simpleEdgesCache[t]=null)}tryCreateCachedEdge_(e){const t=(e&ge())%this.m_simpleEdgesCache.length;let s=this.m_simpleEdgesCache[t];return s?null:(0===this.m_simpleEdgesRecycle.length?(s=Le(),this.m_cOutstandingConstructedEdges++):s=this.m_simpleEdgesRecycle.pop(),s.m_value=e,this.m_simpleEdgesCache[t]=s,s)}initSimpleEdge_(e,t){this.m_bShapeHasSegments&&this.initSimpleEdgeHelper_(e,t)||e.m_bCurve||(this.m_shape.queryLineConnector(t,e.m_line,!0),e.m_segment=e.m_line,e.m_env.setCoordsNoNAN(e.m_line.getStartX(),e.m_line.getEndX()),e.m_env.vmax+=this.m_tolerance,e.m_line.orientBottomUp(),e.m_bHorizontal=e.m_line.getEndY()===e.m_line.getStartY(),e.m_bHorizontal||(e.m_dxdy=(e.m_line.getEndX()-e.m_line.getStartX())/(e.m_line.getEndY()-e.m_line.getStartY())))}initSimpleEdgeHelper_(e,t){if(e.m_segment=this.m_shape.getSegment(t),e.m_segmentInfo=this.m_shape.getOriginalSegmentInfo(t),e.m_bCurve=null!==e.m_segment,e.m_bCurve){const t=e.m_segment.clone();return t.orientBottomUp(),e.m_segment=t,e.m_env=e.m_segment.queryInterval(0,0),e.m_env.vmax+=this.m_tolerance,!0}return!1}compareTwoSegments_(e,t){const s=e.getStartXY(),n=e.getEndXY(),i=t.getStartXY(),r=t.getEndXY();if(this.m_ptSweep.setCoords(this.m_sweepX,this.m_sweepY),s.isEqualPoint2D(i)&&this.m_sweepY===s.y){this.m_ptSweep.assign(n.compare(r)<0?n:r);const s=e.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),i=t.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x);if(Math.abs(s-i)>this.m_tolerance)return s<i?-1:1}const h=s.compare(i)<0?i:s,a=n.compare(r)<0?n:r;let o=0,m=0;for(let l=1;l<5;l++){ie(h,a,l/5,this.m_ptSweep);const s=e.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),n=t.intersectionOfYMonotonicWithAxisX(this.m_ptSweep.y,this.m_ptSweep.x),i=Math.abs(s-n);i>o&&(o=i,m=s<n?-1:1)}return 0===m?this.errorCracking():m}compareNonHorizontal_(e,t){if(e.m_line.getStartY()===t.m_line.getStartY()&&e.m_line.getStartX()===t.m_line.getStartX())return e.m_line.getEndY()===t.m_line.getEndY()&&e.m_line.getEndX()===t.m_line.getEndX()?this.m_bIsSimple?this.errorCoincident():0:this.compareNonHorizontalUpperEnd_(e,t);if(e.m_line.getEndY()===t.m_line.getEndY()&&e.m_line.getEndX()===t.m_line.getEndX())return this.compareNonHorizontalLowerEnd_(e,t);const s=this.compareNonHorizontalLowerEnd_(e,t),n=this.compareNonHorizontalUpperEnd_(e,t);return s<0&&n<0?-1:s>0&&n>0?1:this.errorCracking()}compareHorizontal1Case1_(e,t){if(e.getEndX()>t.getEndX()){if(t.getEndX()>t.getStartX()&&t.getEndY()-t.getStartY()<2*this.m_tolerance&&e.isIntersectingPoint(t.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}else{if((t.getEndY()-t.getStartY())/(t.getEndX()-t.getStartX())*(e.getEndX()-e.getStartX())<this.m_tolerance10&&t.isIntersectingPoint(e.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}return 1}compareHorizontal1Case2_(e,t){if(e.getStartX()<t.getStartX()){if(t.getEndX()>t.getStartX()&&t.getEndY()-t.getStartY()<2*this.m_tolerance&&e.isIntersectingPoint(t.getEndXY(),this.m_tolerance,!0))return this.errorCracking()}else{if((t.getEndY()-t.getStartY())/(t.getEndX()-t.getStartX())*(e.getStartX()-e.getEndX())<this.m_tolerance10&&t.isIntersectingPoint(e.getStartXY(),this.m_tolerance,!0))return this.errorCracking()}return-1}compareHorizontal1Case3_(e,t){const s=Z.getNAN();s.setSub(t.getEndXY(),t.getStartXY()),s.rightPerpendicularThis(),s.normalize();const n=Z.getNAN();n.setSub(e.getStartXY(),t.getStartXY());const i=Z.getNAN();i.setSub(e.getEndXY(),t.getStartXY());const r=n.dotProduct(s),h=i.dotProduct(s),a=Math.abs(r),o=Math.abs(h);if(a<o){if(a<this.m_tolerance10&&t.isIntersectingPoint(e.getStartXY(),this.m_tolerance,!0))return this.errorCracking()}else if(o<this.m_tolerance10&&t.isIntersectingPoint(e.getEndXY(),this.m_tolerance,!0))return this.errorCracking();return r<0&&h<0?-1:r>0&&h>0?1:this.errorCracking()}compareHorizontal1_(e,t){return e.getStartY()===t.getStartY()&&e.getStartX()===t.getStartX()?this.compareHorizontal1Case1_(e,t):e.getEndY()===t.getEndY()&&e.getEndX()===t.getEndX()?this.compareHorizontal1Case2_(e,t):this.compareHorizontal1Case3_(e,t)}compareHorizontal2_(e,t){return e.getEndY()===t.getEndY()&&e.getEndX()===t.getEndX()&&e.getStartY()===t.getStartY()&&e.getStartX()===t.getStartX()?this.m_bIsSimple?this.errorCoincident():0:this.errorCracking()}compareNonHorizontalLowerEnd_(e,t){let s=1;if(e.m_line.getStartY()<t.m_line.getStartY()){s=-1;const n=e;e=t,t=n}const n=e.m_line,i=t.m_line,r=n.getStartX()-i.getStartX(),h=t.m_dxdy*(n.getStartY()-i.getStartY()),a=this.m_tolerance10;return r<h-a?-s:r>h+a?s:i.isIntersectingPoint(n.getStartXY(),this.m_tolerance,!0)?this.errorCracking():r<h?-s:s}compareNonHorizontalUpperEnd_(e,t){let s=1;if(t.m_line.getEndY()<e.m_line.getEndY()){s=-1;const n=e;e=t,t=n}const n=e.m_line,i=t.m_line,r=n.getEndX()-i.getStartX(),h=t.m_dxdy*(n.getEndY()-i.getStartY()),a=this.m_tolerance10;return r<h-a?-s:r>h+a?s:i.isIntersectingPoint(n.getEndXY(),this.m_tolerance,!0)?this.errorCracking():r<h?-s:s}errorCoincident(){this.m_bIntersectionDetected=!0;const e=7;return this.m_nonSimpleResult=new be(e,this.m_vertex1,this.m_vertex2),-1}errorCracking(){if(this.m_bIntersectionDetected=!0,this.m_bIsSimple){const e=6;this.m_nonSimpleResult=new be(e,this.m_vertex1,this.m_vertex2)}else this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h;return-1}compareSegments_(e,t,s,n){if(s.m_env.vmax<n.m_env.vmin)return-1;if(n.m_env.vmax<s.m_env.vmin)return 1;if(!s.m_bCurve&&!n.m_bCurve){let e=s.m_bHorizontal?1:0;return e|=n.m_bHorizontal?2:0,0===e?this.compareNonHorizontal_(s,n):1===e?this.compareHorizontal1_(s.m_line,n.m_line):2===e?-1*this.compareHorizontal1_(n.m_line,s.m_line):this.compareHorizontal2_(s.m_line,n.m_line)}if(this.m_bIntersectionDetected)return-1;const i=this.m_prevY===this.m_sweepY&&this.m_prevX===this.m_sweepX;let r,a;if(i&&e===this.m_prev1?r=this.m_prevX1:(r=Number.NaN,this.m_prev1=h),i&&t===this.m_prev2?a=this.m_prevX2:(a=Number.NaN,this.m_prev2=h),this.m_prevY=this.m_sweepY,this.m_prevX=this.m_sweepX,Number.isNaN(r)){this.m_prev1=e;const t=s.m_segment.intersectionOfYMonotonicWithAxisX(this.m_sweepY,this.m_sweepX);r=t,this.m_prevX1=t}if(Number.isNaN(a)){this.m_prev2=t;const e=n.m_segment.intersectionOfYMonotonicWithAxisX(this.m_sweepY,this.m_sweepX);a=e,this.m_prevX2=e}const o=P(!0,!0,s.m_segment,n.m_segment,this.m_tolerance,!0);return 0!==o?2===o?this.m_bIsSimple?this.errorCoincident():s.m_segmentInfo.equals(n.m_segmentInfo)?0:this.errorCracking():this.errorCracking():Math.abs(r-a)<=this.m_tolerance?this.compareTwoSegments_(s.m_segment,n.m_segment):r<a?-1:r>a?1:0}clearIntersectionDetectedFlag(){this.m_bIntersectionDetected=!1}intersectionDetected(){return this.m_bIntersectionDetected}getLastComparedNode(){return this.m_currentNode}getResult(){return this.m_nonSimpleResult}setSweepY(e,t){this.m_sweepY=e,this.m_sweepX=t,this.m_prev1=h,this.m_prev2=h,this.m_vertex1=h,this.m_vertex2=h}compare(e,t,s){if(this.m_bIntersectionDetected)return-1;const n=e.getElement(s),i=t;return this.m_currentNode=s,this.compareSegments(i,i,n,n)}compareSegments(e,t,s,n){let i=this.tryGetCachedEdge_(e);null===i?this.m_vertex1===t?i=this.m_tempSimpleEdge1:(this.m_vertex1=t,i=this.tryCreateCachedEdge_(e),null===i&&(i=this.m_tempSimpleEdge1,this.m_tempSimpleEdge1.m_value=e),this.initSimpleEdge_(i,t)):this.m_vertex1=t;let r=this.tryGetCachedEdge_(s);return null===r?this.m_vertex2===n?r=this.m_tempSimpleEdge2:(this.m_vertex2=n,r=this.tryCreateCachedEdge_(s),null===r&&(r=this.m_tempSimpleEdge2,this.m_tempSimpleEdge2.m_value=s),this.initSimpleEdge_(r,n)):this.m_vertex2=n,this.compareSegments_(t,n,i,r)}onDelete(e){this.tryDeleteCachedEdge_(e)}onSet(e){this.tryDeleteCachedEdge_(e)}onEndSearch(e){this.tryDeleteCachedEdge_(e)}onAddUniqueElementFailed(e){this.tryDeleteCachedEdge_(e)}}class We{constructor(e,t){this.m_bIntersectionDetected=!1,this.m_pointOfInterest=Z.getNAN(),this.m_line1=new f,this.m_seg1=null,this.m_env=J.constructEmpty(),this.m_vertex1=-1,this.m_currentNode=-1,this.m_minDist=Number.MAX_VALUE,this.m_shape=e,this.m_tolerance=t}getCurrentNode(){return this.m_currentNode}clearIntersectionDetectedFlag(){this.m_bIntersectionDetected=!1,this.m_minDist=Number.MAX_VALUE}intersectionDetected(){return this.m_bIntersectionDetected}setPoint(e){this.m_pointOfInterest.assign(e)}compare(e,t){const s=e.getElement(t);return this.compareVertex(e,t,s)}compareVertex(t,s,n){let i,r=this.m_shape.getSegment(n),h=!0;if(null==r)this.m_shape.queryLineConnector(n,this.m_line1,!0),this.m_env.setCoordsNoNAN(this.m_line1.getStartX(),this.m_line1.getEndX()),r=this.m_line1,i=this.m_line1.getStartY()===this.m_line1.getEndY();else{const t=e.constructEmpty();r.queryLooseEnvelope(t),t.queryIntervalX(this.m_env),i=0===t.height(),h=!1}if(this.m_pointOfInterest.x+this.m_tolerance<this.m_env.vmin)return-1;if(this.m_pointOfInterest.x-this.m_tolerance>this.m_env.vmax)return 1;if(i)return this.m_currentNode=s,this.m_bIntersectionDetected=!0,0;let a=0;if(h){B(this.m_line1);const e=this.m_line1.getStartXY(),t=new Z;t.setSub(this.m_line1.getEndXY(),e),t.rightPerpendicularThis();const s=new Z;s.setSub(this.m_pointOfInterest,e),a=t.dotProduct(s),a/=t.length()}else{a=r.intersectionOfYMonotonicWithAxisX(this.m_pointOfInterest.y,this.m_pointOfInterest.x)-this.m_pointOfInterest.x}if(a<10*-this.m_tolerance)return-1;if(a>10*this.m_tolerance)return 1;if(r.isIntersectingPoint(this.m_pointOfInterest,this.m_tolerance)){Math.abs(a)<this.m_minDist&&(this.m_currentNode=s,this.m_minDist=a),this.m_bIntersectionDetected=!0}return a<0?-1:a>0?1:0}}class Ge{constructor(e,t){this.m_lists=new Oe(!1),this.m_hash=t,this.m_hashBuckets=new Int32Array(e),this.m_hashBuckets.fill(Ge.st_nullNode()),this.m_bitFilter=new Int32Array(10*e+31>>5)}reserveElements(e){this.m_lists.reserveLists(Math.min(this.m_hashBuckets.length,e)),this.m_lists.reserveNodes(e)}addElement(e,t){void 0===t&&(t=this.m_hash.getHash(e));const s=t%(this.m_bitFilter.length<<5);this.m_bitFilter[s>>5]|=1<<(31&s);const n=t%this.m_hashBuckets.length;let i=this.m_hashBuckets[n];i===Oe.st_nullNode()&&(i=this.m_lists.createList(),this.m_hashBuckets[n]=i);return this.m_lists.addElement(i,e)}deleteElement(e,t){void 0===t&&(t=this.m_hash.getHash(e));const s=t%this.m_hashBuckets.length,n=this.m_hashBuckets[s];n===Oe.st_nullNode()&&U("");let i=this.m_lists.getFirst(n),r=Oe.st_nullNode();for(;i!==Oe.st_nullNode();){const t=this.m_lists.getData(i),h=this.m_lists.getNext(i);t===e?(this.m_lists.deleteElementDirect(n,r,i),this.m_lists.getFirst(n)===Oe.st_nullNode()&&(this.m_lists.deleteList(n),this.m_hashBuckets[s]=Oe.st_nullNode())):r=i,i=h}}getFirstInBucket(e){const t=e%(this.m_bitFilter.length<<5);if(!(this.m_bitFilter[t>>5]&1<<(31&t)))return Oe.st_nullNode();const s=e%this.m_hashBuckets.length,n=this.m_hashBuckets[s];return n===Oe.st_nullNode()?Oe.st_nullNode():this.m_lists.getFirst(n)}getNextInBucket(e){return this.m_lists.getNext(e)}findNode(e){const t=this.m_hash.getHash(e);let s=this.getFirstInBucket(t);for(;s!==Oe.st_nullNode();){const t=this.m_lists.getData(s);if(this.m_hash.equal(t,e))return s;s=this.m_lists.getNext(s)}return Oe.st_nullNode()}deleteNode(e){const t=this.getElement(e),s=this.m_hash.getHash(t)%this.m_hashBuckets.length,n=this.m_hashBuckets[s];n===Oe.st_nullNode()&&U(""),this.m_lists.deleteElementSearch(n,e),this.m_lists.getFirst(n)===Oe.st_nullNode()&&(this.m_lists.deleteList(n),this.m_hashBuckets[s]=Oe.st_nullNode())}getElement(e){return this.m_lists.getData(e)}static st_nullNode(){return Oe.st_nullNode()}clear(){R(0)}size(){return this.m_lists.getNodeCount()}dbgPrintBucketHistogram(){}}function Ue(e,t,s,n,i){const r=new tt(i);return r.m_shape=e,r.m_sqrTolerance=t*t,r.m_cellSize=2*t,r.m_invCellSize=1/r.m_cellSize,r.m_geometry=s,r.m_bTrackChanges=n,r.m_bHasSegmentParentage=e.hasSegmentParentage(),r.clusterNonReciprocal()}function Qe(e,t,s,n,i){const r=e-s,h=t-n;return r*r+h*h<=i}function je(){return{pt:new Z,weight:0,rank:0,bMerged:!1}}function Ze(e,t,s,n,i,r){const h=je(),a=s+i;let o=!1,m=e.x;e.x!==t.x&&(n===r&&(m=(e.x*s+t.x*i)/a),o=!0);let l=e.y;return e.y!==t.y&&(n===r&&(l=(e.y*s+t.y*i)/a),o=!0),n!==r?n>r?(h.rank=n,h.weight=s,h.pt=e):(h.rank=r,h.weight=i,h.pt=t):(h.pt.setCoords(m,l),h.weight=a,h.rank=n),h.bMerged=o,h}function Je(e,t,s,n,i,r,h,a,o){const m=e.equals(t);if(n>r)return h.assignCopy(e),o[0]=n,a[0]=s,m;if(r>n)return h=t,o[0]=r,a[0]=i,m;h.assignCopy(e);const l=Ze(e.getXY(),t.getXY(),s,n,i,r);return h.setXY(l.pt),a[0]=l.weight,o[0]=l.rank,m}function Ke(e,t,s,n,i){const r=new tt(i);return r.m_shape=e,r.m_sqrTolerance=t*t,r.m_cellSize=2*t,r.m_invCellSize=1/r.m_cellSize,r.m_geometry=s,r.m_bTrackChanges=!1,r.needsClustering()}function $e(e,t){const s=Ee(e);return xe(s,t)}class et{constructor(e,t,s,n,i){this.m_workPt=new Z,this.m_shape=e,this.m_sqrTolerance=s,this.m_invCellSize=n,this.m_origin=t.clone(),this.m_hashValues=i}getHash(e){return this.m_shape.getUserIndex(e,this.m_hashValues)}calculateHashFromVertex(e){this.m_shape.queryXY(e,this.m_workPt);const t=this.m_workPt.x-this.m_origin.x,s=Math.trunc(t*this.m_invCellSize+.5),n=this.m_workPt.y-this.m_origin.y;return $e(s,Math.trunc(n*this.m_invCellSize+.5))}equal(e,t){return R(0),!1}}class tt{constructor(e){this.m_origin=Z.getNAN(),this.m_sqrTolerance=0,this.m_cellSize=0,this.m_invCellSize=0,this.m_geometry=h,this.m_bucketArray=new Array(4),this.m_bucketHash=new Array(4),this.m_dbgCandidateCheckCount=0,this.m_nsr=new be,this.m_hashValues=-1,this.m_newClusters=-1,this.m_bTrackChanges=!1,this.m_bHasSegmentParentage=!1,this.m_shape=null,this.m_clusters=new Oe,this.m_hashFunction=null,this.m_hashTable=null,this.m_progressCounter=0,this.m_progressTracker=e}progress_(){}collectClusterCandidates(e,t){const s=Z.getNAN();this.m_shape.queryXY(e,s);const n=(s.x-this.m_origin.x)*this.m_invCellSize,i=(s.y-this.m_origin.y)*this.m_invCellSize,r=Math.trunc(n),h=Math.trunc(i);let a=0;for(let o=0;o<=1;o+=1)for(let e=0;e<=1;e+=1){const t=$e(r+o,h+e),s=this.m_hashTable.getFirstInBucket(t);s!==Ge.st_nullNode()&&(this.m_bucketArray[a]=s,this.m_bucketHash[a]=t,a++)}for(let o=a-1;o>=1;o--){const e=this.m_bucketArray[o];for(let t=o-1;t>=0;t--)if(e===this.m_bucketArray[t]){this.m_bucketHash[t]=-1,a--,o!==a&&(this.m_bucketHash[o]=this.m_bucketHash[a],this.m_bucketArray[o]=this.m_bucketArray[a]);break}}for(let o=0;o<a;o++)this.collectNearestNeighbourCandidates(e,this.m_bucketHash[o],s,this.m_bucketArray[o],t)}collectNearestNeighbourCandidates(e,t,s,n,i){const r=Z.getNAN();for(let h=n;h!==Ge.st_nullNode();h=this.m_hashTable.getNextInBucket(h)){const n=this.m_hashTable.getElement(h);e===n||-1!==t&&this.m_shape.getUserIndex(n,this.m_hashValues)!==t||(this.m_shape.queryXY(n,r),Qe(s.x,s.y,r.x,r.y,this.m_sqrTolerance)&&i.push(h))}}mergeClusters(e,t,s){let i=this.m_shape.getUserIndex(e,this.m_newClusters);const r=this.m_shape.getUserIndex(t,this.m_newClusters);-1===i&&(i=this.m_clusters.createList(),this.m_clusters.addElement(i,e),this.m_shape.setUserIndex(e,this.m_newClusters,i)),-1===r?this.m_clusters.addElement(i,t):this.m_clusters.concatenateLists(i,r),this.m_shape.setUserIndex(t,this.m_newClusters,n.impossibleIndex2());const h=this.mergeVertices(e,t);if(s){const t=this.m_hashFunction.calculateHashFromVertex(e);this.m_shape.setUserIndex(e,this.m_hashValues,t)}return h}mergeVertices(e,t){const s=Z.getNAN();this.m_shape.queryXY(e,s);const n=Z.getNAN();this.m_shape.queryXY(t,n);const i=this.m_shape.getRank(e),r=this.m_shape.getRank(t),h=this.m_shape.getWeight(e),a=this.m_shape.getWeight(t);let o,m,l,g,u=!1;if(i===r?(o=i,m=h+a,l=s.x,s.x!==n.x&&(l=(s.x*h+n.x*a)/m,u=!0),g=s.y,s.y!==n.y&&(g=(s.y*h+n.y*a)/m,u=!0)):(i>r?(l=s.x,g=s.y,m=h,o=i):(l=n.x,g=n.y,m=a,o=r),u=!s.equals(n)),u&&(this.m_shape.setXYMonotonic(e,l,g),this.m_bTrackChanges&&this.m_shape.setGeometryModifiedWithVertex(e,!0),this.m_bHasSegmentParentage)){const s=this.m_shape.getSegmentParentageBreakVertex(e)||this.m_shape.getSegmentParentageBreakVertex(t);this.m_shape.setSegmentParentageBreakVertex(e,s),this.m_shape.setSegmentParentageBreakVertex(t,s)}return this.m_shape.setWeight(e,m),this.m_shape.setRank(e,o),u}needsClustering(){const e={stack:[],error:void 0,hasError:!1};try{Ie(e,se((()=>{this.m_hashTable=null,this.m_hashFunction=null,this.m_shape.removeUserIndex(this.m_hashValues),this.m_shape.removeUserIndex(this.m_newClusters)})),!1);const t=this.m_shape.getSelectedCount(),s=this.m_shape.getEnvelope2D(this.m_progressTracker);this.m_origin.assign(s.getLowerLeft());const i=Math.max(s.height(),s.width())/(ne()-1);this.m_cellSize<i&&(this.m_cellSize=i,this.m_invCellSize=1/this.m_cellSize),this.m_clusters.clear(),this.m_clusters.reserveLists(this.m_shape.getSelectedCount()/3+1),this.m_clusters.reserveNodes(this.m_shape.getSelectedCount()/3+1),this.m_hashValues=this.m_shape.createUserIndex(),this.m_newClusters=this.m_shape.createUserIndex(),this.m_hashFunction=new et(this.m_shape,this.m_origin,this.m_sqrTolerance,this.m_invCellSize,this.m_hashValues),this.m_hashTable=new Ge(4*t/3,this.m_hashFunction),this.m_hashTable.reserveElements(this.m_shape.getSelectedCount());let r=!1;for(let e=0;e<2;e++){const t=[],s=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let i=s.next();i!==h;i=s.next()){if(this.progress_(),e>0&&this.m_shape.getUserIndex(i,this.m_newClusters)===n.impossibleIndex2())continue;let s;if(0===e?(s=this.m_hashFunction.calculateHashFromVertex(i),this.m_shape.setUserIndex(i,this.m_hashValues,s)):s=this.m_shape.getUserIndex(i,this.m_hashValues),this.collectClusterCandidates(i,t),0!==t.length){for(let e=0,s=t.length;e<s;e++){this.progress_();const s=t[e],n=this.m_hashTable.getElement(s);if(this.m_hashTable.deleteNode(s),!this.m_shape.isEqualXY(i,n))return this.m_nsr=new be(5,this.m_shape.getVertexIndex(i),this.m_shape.getVertexIndex(n)),r=!0,r;this.mergeClusters(i,n,!1)}t.length=0}0===e&&this.m_hashTable.addElement(i,s)}}return r}catch(t){e.error=t,e.hasError=!0}finally{we(e)}}clusterNonReciprocal(){const e=this.m_shape.getSelectedCount(),t=this.m_shape.getEnvelope2D(this.m_progressTracker);this.m_origin=t.getLowerLeft();const s=Math.max(t.height(),t.width())/(ne()-1);this.m_cellSize<s&&(this.m_cellSize=s,this.m_invCellSize=1/this.m_cellSize),this.m_clusters.clear(),this.m_clusters.reserveLists(Math.trunc(this.m_shape.getSelectedCount()/3+1)),this.m_clusters.reserveNodes(Math.trunc(this.m_shape.getSelectedCount()/3+1)),this.m_hashValues=this.m_shape.createUserIndex(),this.m_newClusters=this.m_shape.createUserIndex(),this.m_hashFunction=new et(this.m_shape,this.m_origin,this.m_sqrTolerance,this.m_invCellSize,this.m_hashValues),this.m_hashTable=new Ge(Math.trunc(4*e/3),this.m_hashFunction),this.m_hashTable.reserveElements(this.m_shape.getSelectedCount());let i=!1;{const e=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let t=e.next();t!==h;t=e.next()){this.progress_();const e=this.m_hashFunction.calculateHashFromVertex(t);this.m_shape.setUserIndex(t,this.m_hashValues,e),this.m_hashTable.addElement(t,e)}}{const e=[],t=this.m_shape.queryVertexIteratorOnSelection(this.m_geometry);for(let s=t.next();s!==h;s=t.next()){if(this.m_shape.getUserIndex(s,this.m_newClusters)===n.impossibleIndex2())continue;let t=this.m_shape.getUserIndex(s,this.m_hashValues);this.m_hashTable.deleteElement(s,t);let r=!1;for(;this.collectClusterCandidates(s,e),0!==e.length;){let t=0;for(let n=0,i=e.length;n<i;n++){this.progress_();const r=e[n],h=this.m_hashTable.getElement(r);this.m_hashTable.deleteNode(r);const a=n+1===i;t|=this.mergeClusters(s,h,a)?1:0}if(r||=0!==t,i||=0!==t,e.length=0,!t)break}r&&(t=this.m_shape.getUserIndex(s,this.m_hashValues)),this.m_hashTable.addElement(s,t)}e.length=0}return i&&this.applyClusterPositions_(),this.m_hashTable=null,this.m_hashFunction=null,this.m_shape.removeUserIndex(this.m_hashValues),this.m_shape.removeUserIndex(this.m_newClusters),i}applyClusterPositions_(){const e=Z.getNAN();for(let t=this.m_clusters.getFirstList();t!==Oe.st_nullNode();t=this.m_clusters.getNextList(t)){let s=this.m_clusters.getFirst(t);const n=this.m_clusters.getElement(s);this.m_shape.queryXY(n,e);const i=this.m_shape.getRank(n),r=this.m_shape.getWeight(n);for(s=this.m_clusters.getNext(s);s!==Oe.st_nullNode();s=this.m_clusters.getNext(s)){const t=this.m_clusters.getElement(s);if(this.m_bTrackChanges?this.m_shape.isEqualXYPoint2D(t,e)||(this.m_shape.setXYMonotonicPoint2D(t,e),this.m_shape.setGeometryModifiedWithVertex(t,!0)):this.m_shape.setXYMonotonicPoint2D(t,e),this.m_bHasSegmentParentage){const e=this.m_shape.getSegmentParentageBreakVertex(n)||this.m_shape.getSegmentParentageBreakVertex(t);this.m_shape.setSegmentParentageBreakVertex(n,e),this.m_shape.setSegmentParentageBreakVertex(t,e)}this.m_shape.setWeight(t,r),this.m_shape.setRank(t,i)}}}}class st{constructor(){this.m_inputParts=[],this.m_resultParts1=[],this.m_resultParts2=[],this.m_resultSegments=[],this.m_freeSegments=[],this.m_inputSegments=[],this.m_param1=[],this.m_param2=[],this.m_tolerance=0,this.m_toleranceZ=0,this.m_point=new i,this.m_pointWeight=1,this.m_maxDensifyLimit=0,this.m_pointRank=0,this.m_changed1=!1,this.m_changed2=!1,this.m_adaptiveDensify=!1}clear(){this.freeAllResultSegments(),this.m_inputSegments.length=0,this.m_inputParts.length=0,this.m_resultParts1.length=0,this.m_resultParts2.length=0,this.m_param1.length=0,this.m_param2.length=0,this.m_adaptiveDensify=!1,this.m_changed1=!1,this.m_changed2=!1}newIntersectionPart_(e,t,s,n,i,r,h,a,o,m){return it(e,t,s,n,i,r,h,a,o,m)}pushSegment(e,t,s,n,i,r,h,a,o,m){return this.m_inputParts.push(this.newIntersectionPart_(this.m_inputSegments.length,t,s,n,i,r,h,a,o,m)),this.m_inputSegments.push(e),this.m_inputParts.length-1}getResultSegmentCount(e){return this.m_adaptiveDensify?0===e?this.m_param1.length-1:this.m_param2.length-1:0===e?this.m_resultParts1.length:this.m_resultParts2.length}getResultPart_(e,t){return 0===e?this.m_resultParts1[t]:this.m_resultParts2[t]}getResultSegment(e,t){return this.m_resultSegments[this.getResultPart_(e,t).segmentIndex].get()}getSegmentChanged(e){return 0===e?this.m_changed1:this.m_changed2}getResultSegmentStartPointWeight(e,t){return this.getResultPart_(e,t).weightStart}getResultSegmentStartPointRank(e,t){return this.getResultPart_(e,t).rankStart}getResultSegmentSegmentParentage(e,t){return this.getResultPart_(e,t).segmentParentage}getResultSegmentStartPointIsBreak(e,t){return this.getResultPart_(e,t).u.bBreakStart}getResultSegmentEndPointWeight(e,t){return this.getResultPart_(e,t).weightEnd}getResultSegmentEndPointRank(e,t){return this.getResultPart_(e,t).rankEnd}getResultSegmentEndPointIsBreak(e,t){return this.getResultPart_(e,t).u.bBreakEnd}getResultSegmentInteriorRank(e,t){return this.getResultPart_(e,t).rankInterior}getResultSegmentInteriorWeight(e,t){return this.getResultPart_(e,t).weightInterior}getResultPoint(){return this.m_point}getResultPointWeight(){return this.m_pointWeight}getResultPointRank(){return this.m_pointRank}getResultPointChanged(){return this.m_changed2}intersectLines(e,t){2!==this.m_inputSegments.length&&O(""),this.m_changed1=!1,this.m_changed2=!1,this.m_tolerance=e;const s=ue(e*st.c_smallToleranceFactor);let n=!1;const i=this.m_inputParts[0],r=this.m_inputParts[1],h=this.m_inputSegments[i.segmentIndex],a=this.m_inputSegments[r.segmentIndex];if(t||5&I(!0,h,a,e,!0)){const t=w(!0,h,a,null,this.m_param1,this.m_param2,e);0===t&&O("");const o=new Array(t);for(let e=0;e<t;++e)o[e]=Z.getNAN();const m=new Float64Array(t),l=new Int32Array(t),g=new Array(t),u=new Array(t);for(let e=0;e<t;++e)g[e]=rt(),u[e]=rt();for(let e=0;e<t;e++){const t=this.m_param1[e],c=this.m_param2[e];let _,d=i.rankInterior,p=i.weightInterior;0===t?(d=i.rankStart,p=i.weightStart,_=i.u.bBreakStart):1===t?(d=i.rankEnd,p=i.weightEnd,_=i.u.bBreakEnd):(this.m_changed1=!0,_=!1);let f,S=r.rankInterior,x=r.weightInterior;0===c?(S=r.rankStart,x=r.weightStart,f=r.u.bBreakStart):1===c?(S=r.rankEnd,x=r.weightEnd,f=r.u.bBreakEnd):(this.m_changed2=!0,f=!1);const C=d,E=S;let I=1,w=0,b=Z.getNAN();if(C===E){const n=h.getCoord2D(t),i=a.getCoord2D(c);I=p+x;w=d,ie(n,i,x/I,b);const r=Z.sqrDistance(b,n),o=Z.sqrDistance(b,i);g[e].bBigMove=r>s,u[e].bBigMove=o>s,this.m_changed1||n.equals(b)||(this.m_changed1=!0),this.m_changed2||i.equals(b)||(this.m_changed2=!0)}else if(C>E){b=h.getCoord2D(t);const n=a.getCoord2D(c);I=p,w=d;const i=Z.sqrDistance(b,n);g[e].bBigMove=!1,u[e].bBigMove=i>s,this.m_changed2||n.equals(b)||(this.m_changed2=!0)}else{b=a.getCoord2D(c),I=x,w=S;const n=h.getCoord2D(t),i=Z.sqrDistance(b,n);g[e].bBigMove=i>s,u[e].bBigMove=!1,this.m_changed1||n.equals(b)||(this.m_changed1=!0)}o[e].assign(b),m[e]=I,l[e]=w,g[e].bIsBreak=_||f,u[e].bIsBreak=_||f,n||=g[e].bBigMove||u[e].bBigMove}const c=i.rankInterior,_=i.weightInterior;let d=0,p=-1;for(let s=0;s<=t;s++){const n=s<t?this.m_param1[s]:1;if(n!==d){const r=this.allocResultSegment(),a=this.m_resultSegments[r];let u,f,S,x;h.queryCut(d,n,a,!1),a.get().snapControlPoints(e*e);let C=!1,E=!1,I=!1,w=!1,b=!1,N=Z.getNAN(),P=Z.getNAN();-1!==p?(f=l[p],u=m[p],C=g[p].bBigMove,N.assign(o[p]),I=g[p].bIsBreak,b=!0):(u=i.weightStart,f=i.rankStart,N=a.get().getStartXY(),I=i.u.bBreakStart),s<t?(x=l[s],S=m[s],E=g[s].bBigMove,P.assign(o[s]),w=g[s].bIsBreak,b=!0):(S=i.weightEnd,x=i.rankEnd,P=a.get().getEndXY(),w=i.u.bBreakEnd),b&&a.get().setCoordsForIntersector(N,P,!0),this.m_resultParts1.push(this.newIntersectionPart_(r,u,f,S,x,_,c,I,w,i.segmentParentage));const v=this.m_resultParts1.at(-1);v.u.bBigMoveStart=C,v.u.bBigMoveEnd=E,d=n,p=s}else-1===p&&(p=s)}const f=new Array(t);for(let e=0;e<t;e++)f[e]=e;t>2?(f.sort(((e,t)=>this.m_param2[e]<this.m_param2[t]?-1:this.m_param2[e]>this.m_param2[t]?1:0)),re(this.m_param2)):2===t&&this.m_param2[0]>this.m_param2[1]&&(this.m_param2[1]=te(this.m_param2[0],this.m_param2[0]=this.m_param2[1]),f[1]=te(f[0],f[0]=f[1]));const S=r.rankInterior,x=r.weightInterior;d=0,p=-1;for(let s=0;s<=t;s++){const n=s<t?this.m_param2[s]:1;if(n!==d){const i=this.allocResultSegment(),h=this.m_resultSegments[i];let g,c,_,C;a.queryCut(d,n,h,!1),h.get().snapControlPoints(e*e);let E=Z.getNAN(),I=Z.getNAN(),w=!1,b=!1,N=!1,P=!1,v=!1;if(-1!==p){const e=f[p];g=m[e],c=l[e],E.assign(o[e]),N=u[e].bBigMove,w=u[e].bIsBreak,v=!0}else g=r.weightStart,c=r.rankStart,E=h.get().getStartXY(),w=r.u.bBreakStart;if(s!==t){const e=f[s];_=m[e],C=l[e],I.assign(o[e]),P=u[e].bBigMove,b=u[e].bIsBreak,v=!0}else _=r.weightEnd,C=r.rankEnd,I=h.get().getEndXY(),b=r.u.bBreakEnd;v&&h.get().setCoordsForIntersector(E,I,!0),this.m_resultParts2.push(this.newIntersectionPart_(i,g,c,_,C,x,S,w,b,r.segmentParentage));const y=this.m_resultParts2.at(-1);y.u.bBigMoveStart=N,y.u.bBigMoveEnd=P,d=n,p=s}else-1===p&&(p=s)}return n?3:2}return 0}intersectLines3D(e,t,s,n){return R(0),1}intersect2D(e,t){const s=this.m_inputParts[0],n=this.m_inputParts[1],i=this.m_inputSegments[s.segmentIndex].getGeometryType(),r=this.m_inputSegments[n.segmentIndex].getGeometryType();if(i!==D.enumLine||r!==D.enumLine){return new mt(this).intersectCurves(e,t)}return this.intersectLines(e,t)}intersect2DEx(e,t,s,n,i){this.m_point.assignCopy(t),1!==this.m_inputSegments.length&&O(""),this.m_tolerance=e,this.m_changed1=!1,this.m_changed2=!1;const r=ue(e*st.c_smallToleranceFactor);let h=!1;const a=this.m_inputParts[0],o=this.m_inputSegments[a.segmentIndex];if(i||o.isIntersectingPoint(t.getXY(),e,!0)){this.m_param1=j(16,Number.NaN);const i=o.getClosestCoordinate(t.getXY(),!1);this.m_param1[0]=i;let m=a.rankInterior,l=a.weightInterior;0===i?(m=a.rankStart,l=a.weightStart):1===i?(m=a.rankEnd,l=a.weightEnd):this.m_changed1=!0;let g=m;const u=s,c=n;g===u&&o.isCurve()&&(g=u+1);let _=1,d=0;const p=new Z;if(g===u){const e=o.getCoord2D(i),s=t.getXY();_=l+c,d=m;ie(e,s,c/_,p),this.m_changed1||e.equals(p)||(this.m_changed1=!0),this.m_changed2||s.equals(p)||(this.m_changed2=!0);h=Z.sqrDistance(p,e)>r}else if(g>u)p.assign(o.getCoord2D(i)),_=l,d=m,this.m_changed2||p.equals(t.getXY())||(this.m_changed2=!0);else{p.assign(o.getCoord2D(i)),_=c,d=u,this.m_changed1||p.equals(t.getXY())||(this.m_changed1=!0);h=Z.sqrDistance(p,t.getXY())>r}let f=0,S=-1;const x=1;for(let t=0;t<=x;t++){const s=t<x?this.m_param1[0]:1;if(s!==f){const n=this.allocResultSegment(),i=this.m_resultSegments[n];o.queryCut(f,s,i),i.get().snapControlPoints(e*e);let r=a.weightStart,h=a.weightEnd,m=a.rankStart,l=a.rankEnd;const g=a.rankInterior,u=a.weightInterior;let c=a.u.bBreakStart,C=a.u.bBreakEnd;-1!==S&&(r=_,m=d,c=!0,i.get().setCoordsForIntersector(p,i.get().getEndXY(),!0)),t!==x&&(h=_,l=d,C=!0,i.get().setCoordsForIntersector(i.get().getStartXY(),p,!0)),f=s,this.m_resultParts1.push(this.newIntersectionPart_(n,r,m,h,l,u,g,c,C,a.segmentParentage))}S=t}return this.m_point.setXY(p),this.m_pointWeight=_,this.m_pointRank=d,h?3:2}return 0}intersect3D(e,t,s,n){return R(0),1}intersect3DEx(e,t,s,n,i,r,h){return R(0),1}getTolerance(){return this.m_tolerance}freeAllResultSegments(){this.m_resultSegments.length=0,this.m_freeSegments.length=0}freeResultSegment(e){this.m_freeSegments.push(e)}allocResultSegment(){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const e=new t,s=this.m_resultSegments.length;return this.m_resultSegments.push(e),s}allocResultSegmentFromBuffer(e){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const s=new t({copy:e}),n=this.m_resultSegments.length;return this.m_resultSegments.push(s),n}allocResultSegmentFromSegment(e){if(this.m_freeSegments.length){return this.m_freeSegments.pop()}const s=new t({segment:e}),n=this.m_resultSegments.length;return this.m_resultSegments.push(s),n}}function nt(e,t){return{bBigMoveStart:!1,bBigMoveEnd:!1,bBreakStart:e,bBreakEnd:t}}function it(e,t,s,n,i,r,h,a,o,m){return{segmentIndex:e,weightStart:t,rankStart:s,weightEnd:n,rankEnd:i,weightInterior:r,rankInterior:h,segmentParentage:m,u:nt(a,o)}}function rt(){return{bBigMove:!1,bIsBreak:!1}}st.maxWeight=.1*Number.MAX_VALUE,st.c_smallToleranceFactor=.01,st.c_maxGeometryTypeToRankDelta=8;class ht{constructor(){this.start=null,this.end=null,this.equalEdge=null,this.segmentIndex=-1,this.segmentParentage=-1,this.weight=0,this.rank=0}hasSegment(){return this.segmentIndex>=0}transferAttributes(e,t,s){if(1===t.getDescription().getAttributeCount())return;const n=e.parent.m_resultSegments[this.segmentIndex].get().getStartXY(),r=e.parent.m_resultSegments[this.segmentIndex].get().getEndXY(),h=new i;t.queryStart(h),s?(h.setXY(n),e.parent.m_resultSegments[this.segmentIndex].get().setStart(h)):(h.setXY(r),e.parent.m_resultSegments[this.segmentIndex].get().setEnd(h)),t.queryEnd(h),s?(h.setXY(r),e.parent.m_resultSegments[this.segmentIndex].get().setEnd(h)):(h.setXY(n),e.parent.m_resultSegments[this.segmentIndex].get().setStart(h))}copyFromWhenOverlap(e,t,s){this.equalEdge=t,t.equalEdge=this,this.segmentIndex=e.parent.allocResultSegmentFromBuffer(e.parent.m_resultSegments[t.segmentIndex]),this.segmentParentage=t.segmentParentage,this.weight=t.weight,this.rank=t.rank,s?(this.start.copyFrom(t.start),this.end.copyFrom(t.end)):(this.start.copyFrom(t.end),this.end.copyFrom(t.start),e.parent.m_resultSegments[this.segmentIndex].get().reverse())}getEnd(){return this.end}getNextInChain(){return this.end.nextInChain}getPrevInChain(){return this.start.prevInChain}}class at{constructor(){this.hash=0,this.pt=new Z,this.prevInChain=null,this.nextInChain=null,this.prevInHash=null,this.nextInHash=null,this.prevEqual=null,this.nextEqual=null,this.weight=0,this.rank=0,this.bBigMove=!1,this.bIsBreak=!1}copyFrom(e){this.pt.assign(e.pt),this.weight=e.weight,this.rank=e.rank,this.bBigMove=e.bBigMove,this.bIsBreak=e.bIsBreak}nextNode(){return this.nextInChain?this.nextInChain.end:null}prevNode(){return this.prevInChain?this.prevInChain.start:null}equalListHead(){let e=this;for(;null!==e.prevEqual;e=e.prevEqual);return e}}function ot(e,t,s,n){return{edge1:e,edge2:t,recursion:s,bIsIntersecting:n}}class mt{constructor(e){this.m_pairs=[],this.m_chainOrigin1=null,this.m_chainOrigin2=null,this.m_newNodes=[],this.m_hashTableOfEquals=[],this.m_hashTableOfEqualsSize=0,this.m_origin=new Z,this.m_cell=new Z,this.parent=e}addSegment(e,t,s,n,i,r,h,a,o,m,l){const g=this.newNode(this.parent.m_resultSegments[e].get().getStartXY(),s,n,o),u=this.newNode(this.parent.m_resultSegments[e].get().getEndXY(),i,r,m);this.newEdge(g,u,e,h,a,l),null===this.m_chainOrigin1?this.m_chainOrigin1=g:null===this.m_chainOrigin2?this.m_chainOrigin2=g:R(0)}intersectCurvesHelper(e,t,s,n,i){const r=this.getSegment(e).get(),h=this.getSegment(t).get();if(r.isDegenerate(0)||h.isDegenerate(0))return 0;const a=this.tryOverlapIntersectCurves(e,t,s,n);if(0!==a)return a;const o=ue(.01*s);let m=!1,l=this.processSharpCorners(r,h,s,i>4);const g=l>0;if(!g){if(!(n||5&P(!0,!1,r,h,s,!0)))return 0;l=w(!0,r,h,null,this.parent.m_param1,this.parent.m_param2,s)}0===l&&O("");const u=r.getGeometryType(),c=h.getGeometryType(),_=Q(Z,l),d=Q(Z,l),p=new Array(l),f=new Array(l),S=new Array(l),x=new Array(l),C=ce(rt,l),E=ce(rt,l);let I=!1,b=!1;for(let w=0;w<l;w++){const n=this.parent.m_param1[w],i=this.parent.m_param2[w];let a=e.rank,l=e.weight,N=!0,P=!1;0===n?(a=e.start.rank,l=e.start.weight,P=e.start.bIsBreak):1===n?(a=e.end.rank,l=e.end.weight,P=e.end.bIsBreak):(I=!0,N=!1);let v=t.rank,y=t.weight,k=!1,V=!0;0===i?(v=t.start.rank,y=t.start.weight,k=t.start.bIsBreak):1===i?(v=t.end.rank,y=t.end.weight,k=t.end.bIsBreak):(b=!0,V=!1);let T=a,B=v;if(T===B&&(T*=st.c_maxGeometryTypeToRankDelta,B*=st.c_maxGeometryTypeToRankDelta,T+=lt(u,r,!1),B+=lt(c,h,!1)),N&&V&&B===T){const e=r.getCoord2D(n),t=h.getCoord2D(i);e.equals(t)&&(B=T-1)}let q=1,F=0,X=1,Y=0;const D=new Z,A=new Z,R=r.getCoord2D(n),M=h.getCoord2D(i);if(g&&Z.distance(R,M)>s)D.setCoordsPoint2D(R),A.setCoordsPoint2D(M),q=l,X=y,F=a,Y=v,C[w].bBigMove=!1,E[w].bBigMove=!1,P=!0,k=!0;else if(T===B){X=q=l+y,Y=F=a;ie(R,M,y/q,D),A.setCoordsPoint2D(D);const e=Z.sqrDistance(D,R),t=Z.sqrDistance(D,M);C[w].bBigMove=e>o,E[w].bBigMove=t>o,I||R.equals(D)||(I=!0),b||M.equals(A)||(b=!0)}else if(T>B){D.setCoordsPoint2D(R),A.setCoordsPoint2D(D),X=q=l,Y=F=a;const e=Z.sqrDistance(D,M);C[w].bBigMove=!1,E[w].bBigMove=e>o,b||M.equals(A)||(b=!0)}else{A.setCoordsPoint2D(M),D.setCoordsPoint2D(A),X=q=y,Y=F=v;const e=Z.sqrDistance(D,R);C[w].bBigMove=e>o,E[w].bBigMove=!1,I||R.equals(D)||(I=!0)}_[w].assign(D),d[w].assign(A),p[w]=q,f[w]=X,S[w]=F,x[w]=Y,C[w].bIsBreak=P||k,E[w].bIsBreak=P||k,m||=C[w].bBigMove||E[w].bBigMove,w>0&&(n!==this.parent.m_param1[w-1]&&i!==this.parent.m_param2[w-1]||(S[w]<=S[w-1]?(_[w].assign(d[w-1]),p[w]=f[w-1],S[w]=x[w-1],d[w].assign(d[w-1]),f[w]=f[w-1],x[w]=x[w-1],C[w].bBigMove||=C[w-1].bBigMove,E[w].bBigMove||=E[w-1].bBigMove,C[w].bIsBreak||=C[w-1].bIsBreak,E[w].bIsBreak||=E[w-1].bIsBreak):(_[w-1].assign(_[w]),p[w-1]=p[w],S[w-1]=S[w],d[w-1].assign(d[w]),f[w-1]=f[w],x[w-1]=x[w],C[w-1].bBigMove||=C[w].bBigMove,E[w-1].bBigMove||=E[w].bBigMove,C[w-1].bIsBreak||=C[w].bIsBreak,E[w-1].bIsBreak||=E[w].bIsBreak)))}if(!(I||b||2!==l||u===D.enumLine&&c===D.enumLine)){if(this.processDoublyConnectedEdges(e,t,i+1,s))return this.parent.m_changed1=!0,this.parent.m_changed2=!0,2;R(0)}this.parent.m_changed1||=I,this.parent.m_changed2||=b;let N=e,v=e.end.weight,y=e.end.rank,k=e.end.bBigMove,V=e.end.bIsBreak,T=0,B=-1;for(let w=0;w<=l;w++){const t=w<l?this.parent.m_param1[w]:1;if(t!==T){const n=this.parent.allocResultSegment(),i=this.parent.m_resultSegments[n];let h,a,o,m;r.queryCut(T,t,i,!1),i.get().snapControlPoints(s*s);let g=!1,u=!1,c=!1,d=!1;const f=new Z,x=new Z;-1!==B?(a=S[B],h=p[B],c=C[B].bBigMove,g=C[B].bIsBreak,f.assign(_[B])):(h=e.start.weight,a=e.start.rank,c=e.start.bBigMove,g=e.start.bIsBreak,f.assign(i.get().getStartXY())),w<l?(m=S[w],o=p[w],d=C[w].bBigMove,u=C[w].bIsBreak,x.assign(_[w])):(o=v,m=y,d=k,u=V,x.assign(i.get().getEndXY()));let E=N;t<1&&(this.splitEdgeInPlace(N),E=N.getNextInChain()),this.updateSegmentOnly(N,n),0===N.start.hash||N.start.pt.equals(f)||(this.m_newNodes.push(N.start),this.removeNodeFromHash(N.start),N.start.hash=0),0===N.end.hash||N.end.pt.equals(x)||(this.m_newNodes.push(N.end),this.removeNodeFromHash(N.end),N.end.hash=0),N.start.pt.assign(f),N.end.pt.assign(x),N.start.bBigMove||=c,N.end.bBigMove||=d,N.start.bIsBreak||=g,N.end.bIsBreak||=u,N.start.weight=h,N.start.rank=a,N.end.weight=o,N.end.rank=m,N=E,T=t,B=w}else-1===B&&(B=w)}const q=N.getNextInChain(),F=[];F.length=l;for(let w=0;w<l;w++)F[w]=w;l>2?(F.sort(((e,t)=>_e(this.parent.m_param2[e],this.parent.m_param2[t]))),this.parent.m_param2.sort(_e)):2===l&&this.parent.m_param2[0]>this.parent.m_param2[1]&&(this.parent.m_param2[1]=te(this.parent.m_param2[0],this.parent.m_param2[0]=this.parent.m_param2[1]),F[1]=te(F[0],F[0]=F[1])),N=t,v=t.end.weight,y=t.end.rank,k=t.end.bBigMove,V=t.end.bIsBreak,T=0,B=-1;for(let w=0;w<=l;w++){const e=w<l?this.parent.m_param2[w]:1;if(e!==T){const n=this.parent.allocResultSegment(),i=this.parent.m_resultSegments[n];let r,a,o,m;h.queryCut(T,e,i,!1),i.get().snapControlPoints(s*s);const g=new Z,u=new Z;let c=!1,_=!1,p=!1,S=!1;if(-1!==B){const e=F[B];r=f[e],a=x[e],g.assign(d[e]),p=E[e].bBigMove,c=E[e].bIsBreak}else r=t.start.weight,a=t.start.rank,p=t.start.bBigMove,c=t.start.bIsBreak,g.assign(i.get().getStartXY());if(w!==l){const e=F[w];o=f[e],m=x[e],u.assign(d[e]),S=E[e].bBigMove,_=E[e].bIsBreak}else o=v,m=y,S=k,_=V,u.assign(i.get().getEndXY());let C=N;e<1&&(this.splitEdgeInPlace(N),C=N.getNextInChain()),this.updateSegmentOnly(N,n),0===N.start.hash||N.start.pt.equals(g)||(this.m_newNodes.push(N.start),this.removeNodeFromHash(N.start),N.start.hash=0),0===N.end.hash||N.end.pt.equals(u)||(this.m_newNodes.push(N.end),this.removeNodeFromHash(N.end),N.end.hash=0),N.start.pt.assign(g),N.end.pt.assign(u),N.start.bBigMove||=p,N.end.bBigMove||=S,N.start.bIsBreak||=c,N.end.bIsBreak||=_,N.start.weight=r,N.start.rank=a,N.end.weight=o,N.end.rank=m,N=C,T=e,B=w}else-1===B&&(B=w)}const X=N.getNextInChain();return this.postProcessResultPartsForCurves(e,q,t,X,i+1),m?3:2}intersectCurves(t,s){2!==this.parent.m_inputSegments.length&&O(""),this.parent.m_changed1=!1,this.parent.m_changed2=!1,this.parent.m_tolerance=t,this.m_hashTableOfEqualsSize=0,this.m_hashTableOfEquals=de(16);const n=e.constructEmpty();for(let h=0;h<2;h++){const t=this.parent.allocResultSegmentFromSegment(this.parent.m_inputSegments[this.parent.m_inputParts[h].segmentIndex]),s=e.constructEmpty();this.parent.m_inputSegments[this.parent.m_inputParts[h].segmentIndex].queryLooseEnvelope(s),n.mergeEnvelope2D(s);const i=this.parent.m_inputParts[h];this.addSegment(t,0,i.weightStart,i.rankStart,i.weightEnd,i.rankEnd,i.weightInterior,i.rankInterior,i.u.bBreakStart,i.u.bBreakEnd,i.segmentParentage)}n.inflateCoords(100*t,100*t),this.m_origin.assign(n.getLowerLeft()),this.m_cell.setCoords(2*t,2*t),this.m_pairs.push(ot(this.m_chainOrigin1.nextInChain,this.m_chainOrigin2.nextInChain,0,s));let i=0,r=!0;for(;this.m_pairs.length;){const e=this.m_pairs.at(-1);this.m_pairs.pop(),R(e.recursion>=0),R(e.recursion<=256),this.clusterNodes(t);const s=this.intersectCurvesHelper(e.edge1,e.edge2,t,e.bIsIntersecting,e.recursion);r&&(r=!1,i=s)}for(let e=0;e<2;e++){const t=0===e?this.parent.m_resultParts1:this.parent.m_resultParts2;for(let s=(0===e?this.m_chainOrigin1:this.m_chainOrigin2).nextInChain;null!=s;s=s.getNextInChain())t.push(this.parent.newIntersectionPart_(s.segmentIndex,s.start.weight,s.start.rank,s.end.weight,s.end.rank,s.weight,s.rank,s.start.bIsBreak,s.end.bIsBreak,s.segmentParentage)),t.at(-1).u.bBigMoveStart=s.start.bBigMove,t.at(-1).u.bBigMoveEnd=s.end.bBigMove}return i}tryOverlapIntersectCurves(e,s,n,i){const r=this.parent.m_resultSegments[e.segmentIndex].get(),h=this.parent.m_resultSegments[s.segmentIndex].get(),a=r.getStartXY().equals(h.getStartXY())&&r.getEndXY().equals(h.getEndXY()),o=r.getStartXY().equals(h.getEndXY())&&r.getEndXY().equals(h.getStartXY());if(!a&&!o)return 0;const m=q(r,h,!0);if(0!==m&&F(r,h)&&e.segmentParentage===s.segmentParentage){let e=!1;if(m>0)e=r.equals(h);else{R(-1===m);const s=new t({segment:h});s.get().reverse(),e=r.equals(s.get())}if(e)return 1}const l=n*st.c_smallToleranceFactor;let g=!1;if(0===m){const e=[.5,.25,.75,.125,.375,.625,.875,.5625,.3125];for(let t=0,s=e.length;t<s;++t){const s=e[t],i=new Z;r.queryCoord2D(s,i);const a=h.getClosestCoordinate(i,!1),o=new Z;h.queryCoord2D(a,o);const m=Z.distance(i,o);if(m>n)return 0;g||=m>l}for(let t=0,s=e.length;t<s;++t){const s=e[t],i=new Z;h.queryCoord2D(s,i);const a=r.getClosestCoordinate(i,!1),o=new Z;r.queryCoord2D(a,o);const m=Z.distance(i,o);if(m>n)return 0;g||=m>l}}let u=e.rank,c=s.rank;return u===c&&(u*=st.c_maxGeometryTypeToRankDelta,c*=st.c_maxGeometryTypeToRankDelta,u+=lt(r.getGeometryType(),r,!0),c+=lt(h.getGeometryType(),h,!0)),u>c?(s.copyFromWhenOverlap(this,e,a),s.transferAttributes(this,r,a)):c>u?(e.copyFromWhenOverlap(this,s,a),e.transferAttributes(this,h,a)):e.segmentParentage<=s.segmentParentage?(e.weight=e.weight+s.weight,s.copyFromWhenOverlap(this,e,a),s.transferAttributes(this,r,a)):(s.weight=e.weight+s.weight,e.copyFromWhenOverlap(this,s,a),e.transferAttributes(this,h,a)),g?3:2}postProcessResultPartsForCurves(e,t,s,n,i){i===pe()&&O("curve_helper");for(let r=e;r!==t;r=r.getNextInChain())this.updateSegmentToNodes(r);for(let r=s;r!==n;r=r.getNextInChain())this.updateSegmentToNodes(r);for(let r=e;r!==t;r=r.getNextInChain()){const e=r.end.pt.sub(r.start.pt);for(let t=s;t!==n;t=t.getNextInChain()){let s=0;if(r.start.pt.equals(t.start.pt)&&r.end.pt.equals(t.end.pt)?s=1:r.start.pt.equals(t.end.pt)&&r.end.pt.equals(t.start.pt)&&(s=-1),!s){let s=r.start.pt.equals(t.start.pt)?1:0;if(s||(s=r.end.pt.equals(t.end.pt)?2:0,s||(s=r.end.pt.equals(t.start.pt)?3:0,s||(s=r.start.pt.equals(t.end.pt)?4:0))),s){const n=t.end.pt.sub(t.start.pt),h=e.dotProduct(n);let a;switch(s){case 1:case 2:a=h>0;break;case 3:case 4:a=h<0;break;default:O("post_process_result_parts_for_curves_")}a&&this.m_pairs.push(ot(r,t,i,!1))}continue}const n=this.parent.m_resultSegments[r.segmentIndex],h=this.parent.m_resultSegments[t.segmentIndex],a=[.5,.25,.75];for(let e=0,t=a.length;e<t;++e){const t=a[e],i=new Z;n.get().queryCoord2D(t,i);const r=h.get().getClosestCoordinate(i,!1),o=new Z;h.get().queryCoord2D(r,o);if(Z.distance(i,o)>this.parent.m_tolerance){s=0;break}}if(!s){this.m_pairs.push(ot(r,t,i,!1));continue}for(let e=0,t=a.length;e<t;++e){const t=a[e],i=new Z;h.get().queryCoord2D(t,i);const r=n.get().getClosestCoordinate(i,!1),o=new Z;n.get().queryCoord2D(r,o);if(Z.distance(i,o)>this.parent.m_tolerance){s=0;break}}if(!s){this.m_pairs.push(ot(r,t,i,!1));continue}r.equalEdge=t,t.equalEdge=r;let o=r.rank,m=t.rank;o===m&&(o*=st.c_maxGeometryTypeToRankDelta,m*=st.c_maxGeometryTypeToRankDelta,o+=lt(n.get().getGeometryType(),n.get(),!0),m+=lt(h.get().getGeometryType(),h.get(),!0)),o>m||o===m&&r.segmentParentage<=t.segmentParentage?(n.copyTo(h,!1),t.segmentParentage=r.segmentParentage,-1===s&&h.get().reverse()):(h.copyTo(n,!1),r.segmentParentage=t.segmentParentage,-1===s&&n.get().reverse());break}}this.updateAttachedEdgesAfterNodeChange(e.start),t&&this.updateAttachedEdgesAfterNodeChange(t.start),this.updateAttachedEdgesAfterNodeChange(s.start),n&&this.updateAttachedEdgesAfterNodeChange(n.start)}processDoublyConnectedEdges(e,s,n,i){n===pe()&&O("curve_helper");const r=this.getSegment(e).get(),h=this.getSegment(s).get(),a=r.getStartXY().equals(h.getStartXY())&&r.getEndXY().equals(h.getEndXY())?1:r.getEndXY().equals(h.getStartXY())&&r.getStartXY().equals(h.getEndXY())?-1:0;if(0!==a){const o=new t;r.queryCut(0,.5,o),o.get().snapControlPoints(i*i);const m=new t;r.queryCut(.5,1,m),m.get().snapControlPoints(i*i),this.splitEdgeInPlace(e),e.end.pt=o.get().getEndXY(),e.segmentIndex=this.parent.allocResultSegmentFromBuffer(o),e.getNextInChain().segmentIndex=this.parent.allocResultSegmentFromBuffer(m);let l=h.getClosestCoordinate(e.end.pt,!1);return Math.abs(l-.5)>.2&&(l=.5),h.queryCut(0,l,o),o.get().snapControlPoints(i*i),h.queryCut(l,1,m),m.get().snapControlPoints(i*i),this.splitEdgeInPlace(s),s.end.pt=o.get().getEndXY(),s.segmentIndex=this.parent.allocResultSegmentFromBuffer(o),s.getNextInChain().segmentIndex=this.parent.allocResultSegmentFromBuffer(m),a>0?(this.m_pairs.push(ot(e,s,n,!1)),this.m_pairs.push(ot(e.getNextInChain(),s.getNextInChain(),n,!1))):(this.m_pairs.push(ot(e,s.getNextInChain(),n,!1)),this.m_pairs.push(ot(e.getNextInChain(),s,n,!1))),!0}return!1}newNode(e,t,s,n){const i=new at;return this.m_newNodes.push(i),i.pt=e,i.rank=s,i.weight=t,i.bIsBreak=n,i}newEdge(e,t,s,n,i,r){const h=new ht;return h.start=e,h.end=t,e.nextInChain=h,t.prevInChain=h,h.segmentIndex=s,h.segmentParentage=r,h.rank=i,h.weight=n,h}splitEdgeInPlace(e){e.segmentIndex=-1;const t=new ht,s=new at;this.m_newNodes.push(s),s.pt.setNAN(),s.nextInChain=t,s.prevInChain=e,s.prevInHash=null,s.nextInHash=null,s.prevEqual=null,s.nextEqual=null,s.weight=e.weight,s.rank=e.rank,s.bIsBreak=!1,s.bBigMove=!1,t.start=s,t.segmentIndex=-1,t.end=e.end,t.end.prevInChain=t,t.rank=e.rank,t.weight=e.weight,t.segmentParentage=e.segmentParentage,e.end=s,e.equalEdge&&(e.equalEdge.equalEdge=null),e.equalEdge=null}updateSegmentOnly(e,t){e.segmentIndex=t}updateAttachedEdgesAfterNodeChange(e){for(let t=e.equalListHead();null!==t;t=t.nextEqual)this.updateAttachedEdgesAfterNodeChangeImpl(t)}updateAttachedEdgesAfterNodeChangeImpl(e){const t=e.prevInChain;if(t&&t.hasSegment()){const s=this.getSegment(t).get();e.pt.equals(s.getEndXY())||(s.setCoordsForIntersector(t.start.pt,t.end.pt,!1),s.ensureXYMonotone())}const s=e.nextInChain;if(s&&s.hasSegment()){const t=this.getSegment(s).get();e.pt.equals(t.getStartXY())||(t.setCoordsForIntersector(s.start.pt,s.end.pt,!1),t.ensureXYMonotone())}}updateSegmentToNodes(e){const t=this.getSegment(e).get();e.start.pt.equals(t.getStartXY())&&e.end.pt.equals(t.getEndXY())||(t.setCoordsForIntersector(e.start.pt,e.end.pt,!1),t.ensureXYMonotone()),this.updateAttachedEdgesAfterNodeChange(e.start),this.updateAttachedEdgesAfterNodeChange(e.end)}getSegment(e){return this.parent.m_resultSegments[e.segmentIndex]}clusterNodes(e){let t=!1;const s=[],n=[],i=[];for(let r=0,h=this.m_newNodes.length;r<h;r++){const e=this.m_newNodes[r];if(null===e)continue;let t=e;for(let s=r+1;s<h;s++){const n=this.m_newNodes[s];null!==n&&(e.pt.equals(n.pt)&&(t.nextInHash=n,n.prevInHash=t,t=n,this.m_newNodes[s]=null))}}for(let r=0,h=this.m_newNodes.length;r<h;r++){const h=this.m_newNodes[r];if(null==h)continue;for(h.hash=this.calculateHash(h.pt);;){const r=de(4),a=this.hashTableBinsToCheck(h,r);for(let t=0;t<a;t++)if(null!==r[t])for(let a=r[t];null!==a;){const t=a.nextInHash;Z.distance(h.pt,a.pt)<=e&&(s.push(a),this.removeNodeFromHash(a),a.hash=0,i.push(a),n.push(a)),a=t}let o=!1;for(const e of s)if(!h.pt.equals(e.pt)){const s=Ze(h.pt,e.pt,h.weight,h.rank,e.weight,e.rank);h.pt.assign(s.pt),h.weight=s.weight,h.rank=s.rank,o=!0,t=!0}if(s.length=0,!o)break;h.hash=this.calculateHash(h.pt)}i.push(h),n.push(h);for(let e=h.nextInHash;null!==e;){e.prevInHash=null;const t=e.nextInHash;e.nextInHash=null,i.push(e),n.push(e),e=t}const a=h.hash;let o=null,m=null;for(const e of n)h!==e&&(e.hash=a,e.pt.assign(h.pt),e.rank=h.rank,e.weight=h.weight),e.prevInHash=o,o&&(o.nextInHash=e),e.prevEqual=m,e.nextEqual=null,m&&(m.nextEqual=e),m=e,o=e;const l=a%this.m_hashTableOfEquals.length;o.nextInHash=this.m_hashTableOfEquals[l],null!==this.m_hashTableOfEquals[l]&&(this.m_hashTableOfEquals[l].prevInHash=o),this.m_hashTableOfEquals[l]=n[0],this.m_hashTableOfEqualsSize+=n.length,n.length=0,this.rehashIfNeeded()}if(this.m_newNodes.length=0,t)for(const r of i)this.updateAttachedEdgesAfterNodeChange(r)}rehashIfNeeded(){if(2*this.m_hashTableOfEqualsSize>this.m_hashTableOfEquals.length){const e=this.m_hashTableOfEquals;this.m_hashTableOfEquals=de(2*e.length),this.m_hashTableOfEqualsSize=0;for(const t of e){let e=t;for(;e;){const t=e.nextInHash;e.nextInHash=null,e.prevInHash=null,this.addNodeToHashImpl(e),e=t}}}}addNodeToHashImpl(e){const t=e.hash%this.m_hashTableOfEquals.length,s=this.m_hashTableOfEquals[t];e.nextInHash=s,null!==s&&(s.prevInHash=e),this.m_hashTableOfEquals[t]=e,this.m_hashTableOfEqualsSize++}removeNodeFromHash(e){const t=e.hash%this.m_hashTableOfEquals.length,s=e.prevInHash,n=e.nextInHash;s?s.nextInHash=n:this.m_hashTableOfEquals[t]=n,n&&(n.prevInHash=s),this.m_hashTableOfEqualsSize--,e.prevInHash=null,e.nextInHash=null}hashTableBinsToCheck(e,t){const s=(e.pt.x-this.m_origin.x)/this.m_cell.x,n=(e.pt.y-this.m_origin.y)/this.m_cell.y,i=ne()-1,r=Math.round(Ce(s,-i,i)),h=Math.round(Ce(n,-i,i));let a=r|h<<32;a=fe(a),t[0]=this.m_hashTableOfEquals[a%this.m_hashTableOfEquals.length];let o=r+1|h<<32;o=fe(o);let m=1;t[1]=this.m_hashTableOfEquals[o%this.m_hashTableOfEquals.length],t[1]!==t[0]&&(m=2);let l=r+1|h+1<<32;l=fe(l),t[m]=this.m_hashTableOfEquals[l%this.m_hashTableOfEquals.length];for(let u=0;u<m;u++)if(t[m]===t[u]){m--;break}m++;let g=r|h+1<<32;g=fe(g),t[m]=this.m_hashTableOfEquals[g%this.m_hashTableOfEquals.length];for(let u=0;u<m;u++)if(t[m]===t[u]){m--;break}return m++,m}calculateHash(e){const t=(e.x-this.m_origin.x)/this.m_cell.x,s=(e.y-this.m_origin.y)/this.m_cell.y,n=ne()-1;let i=Math.round(Ce(t,-n,n))|Math.round(Ce(s,-n,n))<<32;return i=fe(i),0===i&&(i=1),i}processSharpCorners(e,t,s,n){if(this.parent.m_param1.length=0,this.parent.m_param2.length=0,e.getStartXY().equals(t.getStartXY())){const i=[0,0],r=[0,0],h=X(e,t,0,0,s,2,i,r,n);if(h){this.parent.m_param1.push(0),this.parent.m_param2.push(0);for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return h+1}}if(e.getEndXY().equals(t.getEndXY())){const i=[0,0],r=[0,0],h=X(e,t,1,1,s,2,i,r,n);if(h){for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return this.parent.m_param1.push(1),this.parent.m_param2.push(1),h+1}}if(e.getStartXY().equals(t.getEndXY())){const i=[0,0],r=[0,0],h=X(e,t,0,1,s,2,i,r,n);if(h){this.parent.m_param1.push(0),this.parent.m_param2.push(1);for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return h+1}}if(e.getEndXY().equals(t.getStartXY())){const i=[0,0],r=[0,0],h=X(e,t,1,0,s,2,i,r,n);if(h){for(let e=0;e<h;e++)this.parent.m_param1.push(i[e]),this.parent.m_param2.push(r[e]);return this.parent.m_param1.push(1),this.parent.m_param2.push(0),h+1}}return 0}}function lt(e,t,s){let n=0;switch(e){case D.enumLine:n=0;break;case D.enumBezier:n=2;break;case D.enumRationalBezier2:n=3;break;case D.enumBezier2:n=1;break;case D.enumEllipticArc:n=0===t.projectionBehavior()?5:4;break;default:O("")}return s?5-n:n}class gt extends He{constructor(e){super(e.m_shape,e.m_tolerance,!1),this.m_parent=e}compare(e,t,s){if(this.m_bIntersectionDetected)return-1;const n=e.getElement(s),i=this.m_parent.getEdgeOriginVertices(t),r=this.m_parent.m_edgeVertices.getFirstElement(i),h=this.m_parent.getEdgeOriginVertices(n),a=this.m_parent.m_edgeVertices.getFirstElement(h);return this.m_currentNode=s,this.compareSegments(t,r,n,a)}}class ut extends We{constructor(e){super(e.m_shape,e.m_tolerance),this.m_parent=e}compare(e,t){if(this.m_bIntersectionDetected)return-1;const s=e.getElement(t),n=this.m_parent.getEdgeOriginVertices(s),i=this.m_parent.m_edgeVertices.getFirstElement(n);return this.m_currentNode=t,this.compareVertex(e,t,i)}}class ct extends b{constructor(e){super(),this.pt1=Z.getNAN(),this.pt2=Z.getNAN(),this.m_shape=e}compare(e,t,s){this.m_shape.queryXY(t,this.pt1);const n=e.getElement(s);return this.m_shape.queryXY(n,this.pt2),this.pt1.compare(this.pt2)}}class _t{constructor(e){this.m_point=Z.getNAN(),this.m_pt=Z.getNAN(),this.m_shape=e}setPoint(e){this.m_point.setCoordsPoint2D(e)}compare(e,t){const s=e.getElement(t);return this.m_shape.queryXY(s,this.m_pt),this.m_point.compare(this.m_pt)}}class dt{constructor(e,s){this.m_shape=null,this.m_progressTracker=null,this.m_edges=new n(8),this.m_clusters=new n(5),this.m_clusterVertices=new Oe(!1),this.m_edgeVertices=new Oe(!1),this.m_helperPoint=new i,this.m_eventQ=new r,this.m_sweepStructure=new r,this.m_bComplications=!1,this.m_sweepComparator=null,this.m_tempEdgeBuffer=[],this.m_modifiedClusters=[],this.m_edgesToInsertInSweepStructure=[],this.m_prevNeighbour=-1,this.m_nextNeighbour=-1,this.m_bContinuingSegmentChainOptimization=!1,this.m_progressCounter=0,this.m_segmentIntersector=new st,this.m_segBuf1=new t,this.m_segBuf2=new t,this.m_sweepPoint=new Z(0,0),this.m_tolerance=0,this.m_toleranceSqr=0,this.m_sweepPointCluster=-1,this.m_vertexClusterIndex=-1,this.m_bCracked=!1,this.m_bSweepPointClusterWasModified=!1,this.m_progressTracker=e,this.m_bTrackChanges=s}hadComplications(){return this.m_bComplications}sweep(e,t){const s=new K;s.setSwapCoordinates(),e.applyTransformation(s),this.setEditShape_(e),this.m_bCracked=!1,this.m_tolerance=t,this.m_toleranceSqr=t*t;let n=this.sweepImpl_();return e.applyTransformation(s),n||(this.fillEventQueuePass2(),n=this.sweepImpl_()||n),this.m_shape.removeUserIndex(this.m_vertexClusterIndex),this.m_shape=null,this.m_bCracked}sweepVertical(e,t){this.setEditShape_(e),this.m_bCracked=!1,this.m_tolerance=t,this.m_toleranceSqr=t*t,this.m_bComplications=!1;let s=this.sweepImpl_();if(!this.m_bComplications){const n=e.filterClosePoints(t,!0,!1,this.m_bTrackChanges,h);this.m_bComplications=1===n,s||=1===n}return-1!==this.m_vertexClusterIndex&&(this.m_shape.removeUserIndex(this.m_vertexClusterIndex),this.m_vertexClusterIndex=-1),this.m_shape=null,s}getEdgeCluster(e,t){return this.m_edges.getField(e,0+t)}setEdgeCluster_(e,t,s){this.m_edges.setField(e,0+t,s)}getEdgeOriginVertices(e){return this.m_edges.getField(e,2)}setEdgeOriginVertices_(e,t){this.m_edges.setField(e,2,t)}getNextEdgeEx(e,t){return this.m_edges.getField(e,3+t)}setNextEdgeEx_(e,t,s){this.m_edges.setField(e,3+t,s)}getEdgeSweepNode(e){return this.m_edges.getField(e,7)}setEdgeSweepNode_(e,t){this.m_edges.setField(e,7,t)}getNextEdge(e,t){const s=this.getEdgeEnd(e,t);return this.m_edges.getField(e,3+s)}setNextEdge_(e,t,s){const n=this.getEdgeEnd(e,t);this.m_edges.setField(e,3+n,s)}getPrevEdge(e,t){const s=this.getEdgeEnd(e,t);return this.m_edges.getField(e,5+s)}setPrevEdge_(e,t,s){const n=this.getEdgeEnd(e,t);this.m_edges.setField(e,5+n,s)}getClusterVertices(e){return this.m_clusters.getField(e,0)}setClusterVertices_(e,t){this.m_clusters.setField(e,0,t)}getClusterSweepEdgeList(e){return this.m_clusters.getField(e,2)}setClusterSweepEdgeList_(e,t){this.m_clusters.setField(e,2,t)}getClusterFirstEdge(e){return this.m_clusters.getField(e,1)}setClusterFirstEdge_(e,t){this.m_clusters.setField(e,1,t)}getClusterEventQNode(e){return this.m_clusters.getField(e,3)}setClusterEventQNode_(e,t){this.m_clusters.setField(e,3,t)}newCluster_(e){const t=this.m_clusters.newElement(),s=this.m_clusterVertices.createList();return this.setClusterVertices_(t,s),e!==h&&(this.m_clusterVertices.addElement(s,e),this.m_shape.setUserIndex(e,this.m_vertexClusterIndex,t)),t}deleteCluster_(e){this.m_clusters.deleteElement(e)}addVertexToCluster_(e,t){const s=this.getClusterVertices(e);this.m_clusterVertices.addElement(s,t),this.m_shape.setUserIndex(t,this.m_vertexClusterIndex,e)}newEdge_(e){const t=this.m_edges.newElement(),s=this.m_edgeVertices.createList();return this.setEdgeOriginVertices_(t,s),-1!==e&&this.m_edgeVertices.addElement(s,e),t}addVertexToEdge_(e,t){const s=this.getEdgeOriginVertices(e);this.m_edgeVertices.addElement(s,t)}deleteEdge_(e){this.m_edges.deleteElement(e);const t=this.m_edgesToInsertInSweepStructure.findIndex((t=>t===e));t>=0&&$(this.m_edgesToInsertInSweepStructure,t)}addEdgeToCluster(e,t){-1===this.getEdgeCluster(e,0)?this.setEdgeCluster_(e,0,t):-1===this.getEdgeCluster(e,1)?this.setEdgeCluster_(e,1,t):O(""),this.addEdgeToClusterImpl_(e,t)}addEdgeToClusterImpl_(e,t){const s=this.getClusterFirstEdge(t);if(-1!==s){const n=this.getNextEdge(s,t);this.setPrevEdge_(n,t,e),this.setNextEdge_(e,t,n),this.setNextEdge_(s,t,e),this.setPrevEdge_(e,t,s)}else this.setPrevEdge_(e,t,e),this.setNextEdge_(e,t,e),this.setClusterFirstEdge_(t,e)}getEdgeEnd(e,t){return this.getEdgeCluster(e,0)===t?0:1}mergeClusters_(e,t){this.dbgCheckCluster_(e),this.dbgCheckCluster_(t);const s=this.getClusterEventQNode(t);-1!==s&&(this.m_eventQ.deleteNode(s),this.setClusterEventQNode_(t,-1));let n=this.getClusterFirstEdge(e),i=this.getClusterFirstEdge(t);if(-1!==i){let s=i,r=i,h=!1;do{this.dbgCheckEdge_(s),h=!1;const n=this.getEdgeEnd(s,t),a=this.getNextEdgeEx(s,n);if(this.getEdgeCluster(s,n+1&1)===e){this.disconnectEdge_(s);const e=this.getEdgeOriginVertices(s);if(this.m_edgeVertices.deleteList(e),this.deleteEdge_(s),s===a){i=-1;break}i===s&&(i=this.getClusterFirstEdge(t),r=a,h=!0)}s=a}while(s!==r||h);if(-1!==i){do{const n=this.getEdgeEnd(s,t),i=this.getNextEdgeEx(s,n);this.setEdgeCluster_(s,n,e),s=i}while(s!==r);if(n=this.getClusterFirstEdge(e),-1!==n){const t=this.getNextEdge(n,e),s=this.getNextEdge(i,e);t===n?(this.setClusterFirstEdge_(e,i),this.addEdgeToClusterImpl_(n,e),this.setClusterFirstEdge_(e,n)):s===i&&this.addEdgeToClusterImpl_(i,e),this.setNextEdge_(i,e,t),this.setPrevEdge_(t,e,i),this.setNextEdge_(n,e,s),this.setPrevEdge_(s,e,n)}else this.setClusterFirstEdge_(e,i)}}const r=this.getClusterVertices(e),h=this.getClusterVertices(t);for(let a=this.m_clusterVertices.getFirst(h);-1!==a;a=this.m_clusterVertices.getNext(a)){const t=this.m_clusterVertices.getElement(a);this.m_shape.setUserIndex(t,this.m_vertexClusterIndex,e)}this.m_clusterVertices.concatenateLists(r,h),this.deleteCluster_(t),this.dbgCheckCluster_(e)}mergeEdges_(e,t){this.dbgCheckEdge_(e),this.dbgCheckEdge_(t);const s=this.getEdgeCluster(e,0),n=this.getEdgeCluster(e,1),i=this.getEdgeCluster(t,0),r=this.getEdgeCluster(t,1),h=this.getEdgeOriginVertices(e),a=this.getEdgeOriginVertices(t);if(this.m_edgeVertices.concatenateLists(h,a),t===this.getClusterFirstEdge(s)&&this.setClusterFirstEdge_(s,e),t===this.getClusterFirstEdge(n)&&this.setClusterFirstEdge_(n,e),this.disconnectEdge_(t),this.deleteEdge_(t),!(s===i&&n===r||n===i&&s===r)){const e=this.getClusterXY(s),t=this.getClusterXY(i);e.isEqualPoint2D(t)?(s!==i&&this.mergeClusters_(s,i),n!==r&&this.mergeClusters_(n,r)):(n!==i&&this.mergeClusters_(n,i),s!==r&&this.mergeClusters_(s,r))}this.dbgCheckEdge_(e)}disconnectEdge_(e){const t=this.getEdgeCluster(e,0),s=this.getEdgeCluster(e,1);this.disconnectEdgeFromCluster_(e,t),this.disconnectEdgeFromCluster_(e,s)}disconnectEdgeFromCluster_(e,t){const s=this.getNextEdge(e,t),n=this.getPrevEdge(e,t),i=this.getClusterFirstEdge(t);s!==e?(this.setNextEdge_(n,t,s),this.setPrevEdge_(s,t,n),i===e&&this.setClusterFirstEdge_(t,s)):this.setClusterFirstEdge_(t,-1)}applyIntersectorToEditShape_(e,t,s){let n=this.m_edgeVertices.getFirst(e);const i=this.m_edgeVertices.getElement(n),r=this.getClusterFromVertex(i),h=this.m_shape.getNextVertex(i),a=this.getClusterFromVertex(h),o=this.m_shape.getXY(i),m=this.m_shape.getXY(h);let l=!1,g=!1;const u=t.getResultSegment(s,0).getStartXY(),c=t.getResultSegment(s,t.getResultSegmentCount(s)-1).getEndXY();o.equals(u)||(l=!0),m.equals(c)||(g=!0),this.m_shape.splitSegmentWithIntersector(i,t,s,!0,!0);const _=this.m_bTrackChanges&&t.getSegmentChanged(s);for(_&&this.m_shape.setGeometryModifiedWithVertex(i,!0),n=this.m_edgeVertices.getNext(n);-1!==n;n=this.m_edgeVertices.getNext(n)){const e=this.m_edgeVertices.getElement(n),i=this.getClusterFromVertex(e)===r;this.m_shape.splitSegmentWithIntersector(e,t,s,i,!0),_&&this.m_shape.setGeometryModifiedWithVertex(e,!0)}if(l&&this.updateClusterXY(!0,r,u,t.getResultSegmentStartPointWeight(s,0),t.getResultSegmentStartPointRank(s,0)),g){const e=t.getResultSegmentCount(s)-1;this.updateClusterXY(!0,a,c,t.getResultSegmentEndPointWeight(s,e),t.getResultSegmentEndPointRank(s,e))}}createEdgesAndClustersFromSplitEdge_(e,t,s){this.dbgCheckNewEdgesArray_();const i=this.getEdgeOriginVertices(e),r=this.getEdgeCluster(e,0),h=this.getEdgeCluster(e,1);let a=this.newEdge_(-1);this.m_edgesToInsertInSweepStructure.push(a);const o=n.impossibleIndex3();this.setEdgeSweepNode_(a,o),this.m_tempEdgeBuffer.push(a),this.addEdgeToCluster(a,r);const m=t.getResultSegmentCount(s);for(let n=1;n<m;n++){const e=this.newCluster_(-1);this.m_modifiedClusters.push(e),this.m_tempEdgeBuffer.push(e),this.addEdgeToCluster(a,e);const t=this.newEdge_(-1);this.m_edgesToInsertInSweepStructure.push(t),this.setEdgeSweepNode_(t,o),this.m_tempEdgeBuffer.push(t),this.addEdgeToCluster(t,e),a=t}this.addEdgeToCluster(a,h);for(let n=this.m_edgeVertices.getFirst(i);-1!==n;n=this.m_edgeVertices.getNext(n)){let e=this.m_edgeVertices.getElement(n);if(this.getClusterFromVertex(e)===r){let t=0;const s=this.m_tempEdgeBuffer.length;do{if(t>0){const s=this.m_tempEdgeBuffer[t-1];this.addVertexToCluster_(s,e)}const s=this.m_tempEdgeBuffer[t];t+=2,this.addVertexToEdge_(s,e),e=this.m_shape.getNextVertex(e)}while(t<s)}else{let t=this.m_tempEdgeBuffer.length-1;do{if(t<this.m_tempEdgeBuffer.length-2){const s=this.m_tempEdgeBuffer[t+1];this.addVertexToCluster_(s,e)}const s=this.m_tempEdgeBuffer[t];t-=2,this.addVertexToEdge_(s,e),e=this.m_shape.getNextVertex(e)}while(t>=0)}}this.m_tempEdgeBuffer.length=0,this.dbgCheckNewEdgesArray_()}getVertexFromClusterIndex(e){const t=this.getClusterVertices(e);return this.m_clusterVertices.getFirstElement(t)}getClusterFromVertex(e){return this.m_shape.getUserIndex(e,this.m_vertexClusterIndex)}processSplitHelper1_(e,t,s){const i=this.getEdgeCluster(t,0),r=this.getClusterXY(i),h=this.getEdgeCluster(t,1),a=this.getClusterXY(h),o=s.getResultSegmentCount(e);let m=s.getResultSegment(e,0);const l=m.getStartXY();if(!r.isEqualPoint2D(l)){if(!this.m_bComplications){r.compare(this.m_sweepPoint)*l.compare(this.m_sweepPoint)<0&&(this.m_bComplications=!0)}this.getAffectedEdges(i,this.m_tempEdgeBuffer),this.m_modifiedClusters.push(i)}if(!this.m_bComplications&&o>1){const e=r.compare(a),t=m.getEndXY();(r.compare(t)!==e||t.compare(a)!==e||t.compare(this.m_sweepPoint)<0)&&(this.m_bComplications=!0)}m=s.getResultSegment(e,o-1);const g=m.getEndXY();if(!a.isEqualPoint2D(g)){if(!this.m_bComplications){a.compare(this.m_sweepPoint)*g.compare(this.m_sweepPoint)<0&&(this.m_bComplications=!0)}this.getAffectedEdges(h,this.m_tempEdgeBuffer),this.m_modifiedClusters.push(h)}this.m_tempEdgeBuffer.push(t);for(let u=0,c=this.m_tempEdgeBuffer.length;u<c;u++){const e=this.m_tempEdgeBuffer[u],s=this.getEdgeSweepNode(e);n.isValidElement(s)&&(this.m_sweepStructure.deleteNode(s),this.setEdgeSweepNode_(e,-1));const i=n.impossibleIndex3();e!==t&&this.getEdgeSweepNode(e)!==i&&(this.m_edgesToInsertInSweepStructure.push(e),this.setEdgeSweepNode_(e,i))}this.m_tempEdgeBuffer.length=0}checkAndFixIntersection_(e,t){const s=this.m_sweepStructure.getElement(e);return this.m_sweepComparator.compare(this.m_sweepStructure,s,t),!!this.m_sweepComparator.intersectionDetected()&&(this.m_sweepComparator.clearIntersectionDetectedFlag(),this.fixIntersection_(e,t),!0)}fixIntersection_(e,t){this.m_bCracked=!0;const s=this.m_sweepStructure.getElement(e),n=this.m_sweepStructure.getElement(t);let i=null,r=null;const h=this.getEdgeOriginVertices(s),a=this.m_edgeVertices.getFirstElement(h),o=this.getEdgeOriginVertices(n),m=this.m_edgeVertices.getFirstElement(o),l=this.m_shape.querySegment(a,this.m_segBuf1,!1,!1);R(l),i=this.m_segBuf1.get();const g=this.m_shape.getNextVertex(a),u=this.m_shape.getWeight(a),c=this.m_shape.getSegmentParentageBreakVertex(a),_=this.m_shape.getWeight(g),d=this.m_shape.getSegmentParentageBreakVertex(g),p=this.m_shape.getSegmentWeight(a),f=this.m_shape.getRank(a),S=this.m_shape.getRank(g),x=this.m_shape.getSegmentRank(a),C=this.m_shape.getSegmentParentage(a),E=this.m_shape.querySegment(m,this.m_segBuf2,!1,!1);R(E),r=this.m_segBuf2.get();const I=this.m_shape.getNextVertex(m),w=this.m_shape.getWeight(m),b=this.m_shape.getSegmentParentageBreakVertex(m),N=this.m_shape.getWeight(I),P=this.m_shape.getSegmentParentageBreakVertex(I),v=this.m_shape.getSegmentWeight(m),y=this.m_shape.getRank(m),k=this.m_shape.getRank(I),V=this.m_shape.getSegmentRank(m),T=this.m_shape.getSegmentParentage(m);this.m_segmentIntersector.pushSegment(i,u,f,_,S,p,x,c,d,C),this.m_segmentIntersector.pushSegment(r,w,y,N,k,v,V,b,P,T),3===this.m_segmentIntersector.intersect2D(this.m_tolerance,!0)&&(this.m_bComplications=!0),this.splitEdge_(s,n,-1,this.m_segmentIntersector),this.m_segmentIntersector.clear()}fixIntersectionPointSegment_(e,t){this.m_bCracked=!0;const s=this.m_sweepStructure.getElement(t);let n=null;const i=this.getEdgeOriginVertices(s),r=this.m_edgeVertices.getFirstElement(i),h=this.m_shape.querySegment(r,this.m_segBuf1,!1,!1);R(h),n=this.m_segBuf1.get();const a=this.m_shape.getNextVertex(r),o=this.m_shape.getWeight(r),m=this.m_shape.getSegmentParentageBreakVertex(r),l=this.m_shape.getWeight(a),g=this.m_shape.getSegmentParentageBreakVertex(a),u=this.m_shape.getSegmentWeight(r),c=this.m_shape.getRank(r),_=this.m_shape.getRank(a),d=this.m_shape.getSegmentRank(r),p=this.m_shape.getSegmentParentage(r),f=this.getClusterFirstVertex(e);this.m_segmentIntersector.pushSegment(n,o,c,l,_,u,d,m,g,p),this.m_shape.queryPoint(f,this.m_helperPoint);const S=this.m_shape.getWeight(f),x=this.m_shape.getRank(f);this.m_segmentIntersector.intersect2DEx(this.m_tolerance,this.m_helperPoint,x,S,!0),this.splitEdge_(s,-1,e,this.m_segmentIntersector),this.m_segmentIntersector.clear()}insertNewEdges_(){if(0===this.m_edgesToInsertInSweepStructure.length)return!0;this.dbgCheckNewEdgesArray_();let e=!0,t=0;const s=this.m_edgesToInsertInSweepStructure.length,i=Math.max(2*s+200,this.m_sweepStructure.size()+200);for(;this.m_edgesToInsertInSweepStructure.length;){if(this.m_edgesToInsertInSweepStructure.length>Math.max(100,this.m_shape.getTotalPointCount())||t>i){this.m_edgesToInsertInSweepStructure.length=0,this.m_bComplications=!0,e=!1;break}const s=this.m_edgesToInsertInSweepStructure.at(-1);this.m_edgesToInsertInSweepStructure.pop(),this.setEdgeSweepNode_(s,-1);const r=this.isEdgeOnSweepLine_(s);n.isValidElement(r)?(this.insertNewEdgeToSweepStructure_(s,r),t++):r!==n.impossibleIndex2()&&(e=!1),this.m_bContinuingSegmentChainOptimization=!1}return e}insertNewEdgeToSweepStructure_(e,t){let s;if(this.m_bContinuingSegmentChainOptimization?(s=this.m_sweepStructure.addElementAtPosition(this.m_prevNeighbour,this.m_nextNeighbour,e,!0,!0),this.m_bContinuingSegmentChainOptimization=!1):s=this.m_sweepStructure.addUniqueElement(e),-1===s){const t=this.m_sweepStructure.getDuplicateElement(),s=this.m_sweepStructure.getElement(t);return this.mergeEdges_(s,e),!1}if(this.setEdgeSweepNode_(e,s),this.m_sweepComparator.intersectionDetected()){this.m_sweepComparator.clearIntersectionDetectedFlag();const e=this.m_sweepComparator.getLastComparedNode();return this.m_prevNeighbour===e&&(this.m_prevNeighbour=-1),this.m_nextNeighbour===e&&(this.m_nextNeighbour=-1),this.fixIntersection_(e,s),!0}return!1}isEdgeOnSweepLine_(e){const t=this.getEdgeCluster(e,0),s=this.getEdgeCluster(e,1),i=this.getClusterXY(t),r=this.getClusterXY(s);if(Z.sqrDistance(i,r)<=this.m_toleranceSqr)return this.m_bComplications=!0,-1;const h=i.compare(this.m_sweepPoint),a=r.compare(this.m_sweepPoint);return h<=0&&a>0?s:a<=0&&h>0?t:h>0&&a>0?n.impossibleIndex2():-1}fillEventQueue(){const e=new a(0),t=this.m_shape.queryVertexIteratorOnSelection();for(let i=t.next();i!==h;i=t.next())-1!==this.m_shape.getUserIndex(i,this.m_vertexClusterIndex)&&e.add(i);this.m_shape.sortVerticesSimpleByY(e,0,e.size()),this.progress_(!0),this.m_eventQ.clear(),this.m_eventQ.setCapacity(e.size()),this.m_eventQ.setComparator(new ct(this.m_shape));const s=Z.getNAN();s.setNAN();let n=-1;for(let i=0,r=e.size();i<r;i++){const t=e.read(i);if(this.m_shape.getXY(t).isEqualPoint2D(s)){const e=this.m_shape.getUserIndex(t,this.m_vertexClusterIndex);this.mergeClusters_(n,e);continue}n=this.getClusterFromVertex(t),this.m_shape.queryXY(t,s);const r=this.m_eventQ.addBiggestElement(t);this.setClusterEventQNode_(n,r)}}fillEventQueuePass2(){const e=new a(0);for(let t=this.m_eventQ.getFirst();-1!==t;t=this.m_eventQ.getNext(t)){const s=this.m_eventQ.getElement(t);e.add(s)}this.m_eventQ.clear(),this.m_shape.sortVerticesSimpleByY(e,0,e.size()),this.progress_(!0);for(let t=0,s=e.size();t<s;t++){const s=e.read(t),n=this.getClusterFromVertex(s),i=this.m_eventQ.addBiggestElement(s);this.setClusterEventQNode_(n,i)}}getAffectedEdges(e,t){const s=this.getClusterFirstEdge(e);if(-1===s)return;let i=s;do{const s=this.getEdgeSweepNode(i);n.isValidElement(s)&&t.push(i),i=this.getNextEdge(i,e)}while(i!==s)}updateClusterXY(e,t,s,n,i){const r=this.getClusterVertices(t);for(let h=this.m_clusterVertices.getFirst(r);-1!==h;h=this.m_clusterVertices.getNext(h)){const t=this.m_clusterVertices.getElement(h);this.m_shape.setXYMonotonicPoint2D(t,s),this.m_shape.setWeight(t,n),this.m_shape.setRank(t,i),e&&this.m_bTrackChanges&&this.m_shape.setGeometryModifiedWithVertex(t,!0),this.m_shape.setSegmentParentageBreakVertex(t,!0)}}splitEdge_(e,t,s,n){this.dbgCheckEdge_(e),-1!==t&&this.dbgCheckEdge_(t),this.disconnectEdge_(e),-1!==t&&this.disconnectEdge_(t),this.processSplitHelper1_(0,e,n),-1!==t&&this.processSplitHelper1_(1,t,n),-1!==s&&n.getResultPointChanged()&&this.m_modifiedClusters.push(s);for(let h=0,a=this.m_modifiedClusters.length;h<a;h++){const e=this.m_modifiedClusters[h],t=this.getClusterEventQNode(e);-1!==t&&(this.m_eventQ.deleteNode(t),this.setClusterEventQNode_(e,-1))}const i=this.getEdgeOriginVertices(e),r=-1!==t?this.getEdgeOriginVertices(t):-1;if(this.applyIntersectorToEditShape_(i,n,0),-1!==r)this.applyIntersectorToEditShape_(r,n,1);else{const e=n.getResultPoint().getXY();this.updateClusterXY(n.getResultPointChanged(),s,e,n.getResultPointWeight(),n.getResultPointRank())}this.createEdgesAndClustersFromSplitEdge_(e,n,0),-1!==t&&this.createEdgesAndClustersFromSplitEdge_(t,n,1),this.m_edgeVertices.deleteList(i),this.deleteEdge_(e),-1!==t&&(this.m_edgeVertices.deleteList(r),this.deleteEdge_(t));for(let h=0,a=this.m_modifiedClusters.length;h<a;h++){const e=this.m_modifiedClusters[h];e===this.m_sweepPointCluster&&(this.m_bSweepPointClusterWasModified=!0);let t=this.getClusterEventQNode(e);if(-1===t){const s=this.getClusterFirstVertex(e);if(t=this.m_eventQ.addUniqueElement(s),-1===t){const t=this.m_eventQ.getDuplicateElement(),s=this.m_eventQ.getElement(t),n=this.getClusterFromVertex(s);this.mergeClusters_(n,e)}else this.setClusterEventQNode_(e,t)}}this.m_modifiedClusters.length=0}getClusterXY(e){const t=this.getClusterFirstVertex(e);return this.m_shape.getXY(t)}getClusterFirstVertex(e){const t=this.getClusterVertices(e);return this.m_clusterVertices.getFirstElement(t)}dbgCheckEdge_(e){}dbgCheckCluster_(e){}dbgCheckNewEdgesArray_(){}dbgSaveSweepStructure_(e){}sweepImpl_(){this.progress_(!0),this.m_bSweepPointClusterWasModified=!1,this.m_sweepPointCluster=-1,null===this.m_sweepComparator&&(this.m_sweepStructure.disableBalancing(),this.m_sweepComparator=new gt(this),this.m_sweepStructure.setComparator(this.m_sweepComparator));const e=[];let t=null,s=null;this.m_prevNeighbour=-1,this.m_nextNeighbour=-1,this.m_bContinuingSegmentChainOptimization=!1;const i=n.impossibleIndex2(),r=n.impossibleIndex3();for(let n=this.m_eventQ.getFirst();-1!==n;){this.progress_(),this.dbgCheckSweepStructure_(),this.m_bContinuingSegmentChainOptimization=!1,this.m_prevNeighbour=-1,this.m_nextNeighbour=-1;const h=this.m_eventQ.getElement(n);this.m_sweepPointCluster=this.getClusterFromVertex(h),this.m_shape.queryXY(h,this.m_sweepPoint),this.m_sweepComparator.setSweepY(this.m_sweepPoint.y,this.m_sweepPoint.x);let a=!1;{const t=this.getClusterFirstEdge(this.m_sweepPointCluster);if(a=-1===t,!a){let s=t;do{const t=this.getEdgeSweepNode(s);-1===t?(this.m_edgesToInsertInSweepStructure.push(s),this.setEdgeSweepNode_(s,r)):t!==r&&e.push(t),s=this.getNextEdge(s,this.m_sweepPointCluster)}while(s!==t)}}if(!this.m_sweepStructure.isAutoBalancing()&&(this.m_sweepStructure.getMaxDepthEver()>4||this.m_edgesToInsertInSweepStructure.length>10)&&this.m_sweepStructure.enableBalancing(),e.length>0){this.m_bContinuingSegmentChainOptimization=1===e.length&&1===this.m_edgesToInsertInSweepStructure.length;for(let n=0,r=e.length;n<r;n++){const t=this.m_sweepStructure.getElement(e[n]);this.setEdgeSweepNode_(t,i)}let t=i,s=i;for(let n=0,r=e.length;n<r;n++){const r=e[n];if(t===i){const e=this.m_sweepStructure.getPrev(r);if(-1!==e){const s=this.m_sweepStructure.getElement(e);this.getEdgeSweepNode(s)!==i&&(t=e)}else t=-1}if(s===i){const e=this.m_sweepStructure.getNext(r);if(-1!==e){const t=this.m_sweepStructure.getElement(e);this.getEdgeSweepNode(t)!==i&&(s=e)}else s=-1}if(t!==i&&s!==i)break}for(let n=0,i=e.length;n<i;n++){const t=e[n],s=this.m_sweepStructure.getElement(t);this.m_sweepStructure.deleteNode(t),this.setEdgeSweepNode_(s,-1)}e.length=0,this.m_prevNeighbour=t,this.m_nextNeighbour=s,-1!==t&&-1!==s?this.m_bContinuingSegmentChainOptimization||this.checkAndFixIntersection_(t,s):-1===t&&-1===s&&(this.m_bContinuingSegmentChainOptimization=!1)}else a&&(null===t&&(t=new ut(this)),t.setPoint(this.m_sweepPoint),this.m_sweepStructure.searchUpperBound(t),t.intersectionDetected()&&(t.clearIntersectionDetectedFlag(),this.fixIntersectionPointSegment_(this.m_sweepPointCluster,t.getCurrentNode())));const o=this.m_bContinuingSegmentChainOptimization;!this.insertNewEdges_()&&o&&-1!==this.m_prevNeighbour&&-1!==this.m_nextNeighbour&&this.checkAndFixIntersection_(this.m_prevNeighbour,this.m_nextNeighbour),this.m_bSweepPointClusterWasModified?(this.m_bSweepPointClusterWasModified=!1,null===s&&(s=new _t(this.m_shape)),s.setPoint(this.m_sweepPoint),n=this.m_eventQ.searchUpperBound(s)):n=this.m_eventQ.getNext(n)}return this.m_bCracked}setEditShape_(e){this.m_shape=e,this.m_vertexClusterIndex=this.m_shape.createUserIndex(),this.m_edges.setCapacity(e.getSelectedCount()+32),this.m_clusters.setCapacity(e.getSelectedCount()),this.m_clusterVertices.reserveLists(e.getSelectedCount()),this.m_clusterVertices.reserveNodes(e.getSelectedCount()),this.m_edgeVertices.reserveLists(e.getSelectedCount()+32),this.m_edgeVertices.reserveNodes(e.getSelectedCount()+32);for(let t=this.m_shape.getFirstGeometry();t!==h;t=this.m_shape.getNextGeometry(t)){if(L(this.m_shape.getGeometryType(t)))for(let s=this.m_shape.getFirstPath(t);s!==h;s=this.m_shape.getNextPath(s)){const t=this.m_shape.getPathSize(s),n=this.m_shape.getFirstVertex(s);if(n===h)continue;let i=this.m_shape.getNextVertex(n);if(i===h||i===n)continue;let r=-1;e.selected(n)&&(r=this.newCluster_(n));let a=-1;-1!==r&&e.selected(i)&&(a=this.newEdge_(n),this.addEdgeToCluster(a,r));let o=a;for(let e=0,s=t-2;e<s;e++){const e=this.m_shape.getNextVertex(i);let t=-1;if(this.m_shape.selected(i)){const s=this.newCluster_(i);-1!==o&&this.addEdgeToCluster(o,s),this.m_shape.selected(e)&&(t=this.newEdge_(i),this.addEdgeToCluster(t,s))}o=t,i=e}if(this.m_shape.isClosedPath(s)){const e=this.m_shape.getNextVertex(i);if(this.m_shape.selected(i)){const t=this.newCluster_(i);if(-1!==o&&this.addEdgeToCluster(o,t),this.m_shape.selected(e)){const e=this.newEdge_(i);this.addEdgeToCluster(e,t),this.addEdgeToCluster(e,r)}}}else{let e=-1;this.m_shape.selected(i)&&(e=this.newCluster_(i),-1!==o&&this.addEdgeToCluster(o,e))}}else for(let e=this.m_shape.getFirstPath(t);e!==h;e=this.m_shape.getNextPath(e)){let t=this.m_shape.getFirstVertex(e);for(let s=0,n=this.m_shape.getPathSize(e);s<n;s++)this.m_shape.selected(t)&&this.newCluster_(t),t=this.m_shape.getNextVertex(t)}}this.fillEventQueue()}progress_(e=!1){}dbgCheckSweepStructure_(){}}function pt(e){for(let t=e.getFirstGeometry();t!==h;t=e.getNextGeometry(t))if(L(e.getGeometryType(t)))return!0;return!1}function ft(e,t,s,n){if(!pt(e))return!1;const i=new Et(n);i.m_shape=e,i.m_tolerance=t,i.m_bTrackChanges=s;let r=!1;const h=e.hasCurves()?5:15;return r=e.getTotalPointCount()<h?i.crackBruteForce_():i.crackerPlaneSweep_(),r}function St(e,t,s,n,i){if(!pt(t))return!1;let r=new Et(i);if(r.m_shape=t,r.m_tolerance=s,r.m_bAllowCoincident=e,r.m_bNeedsNonSimpleResult=null!==n,r.needsCrackingImpl_())return n&&n.assign(r.m_nonSimpleResult),!0;const h=new K;h.setSwapCoordinates(),t.applyTransformation(h),r=new Et(i),r.m_shape=t,r.m_tolerance=s,r.m_bAllowCoincident=e,r.m_bNeedsNonSimpleResult=null!==n;const a=r.needsCrackingImpl_();return t.applyTransformation(h),!!a&&(n&&n.assign(r.m_nonSimpleResult),!0)}function xt(e,t,s,n){const i=t.getGeometryType();if(L(i)){return new Et(n).crackAWithBMultiPath_(e,t,s)}z("crack_A_with_B")}function Ct(e,t){return{t:e,index:t}}class Et{crackBruteForce_(){let e=this.crackBruteForceImpl_();if(!e&&this.m_shape.hasCurves()){const t=new K;t.setSwapCoordinates(),this.m_shape.applyTransformation(t),e=this.crackBruteForceImpl_(),this.m_shape.applyTransformation(t)}return e}crackBruteForceImpl_(){let s=!1;const n=new t,r=new t,a=e.constructEmpty(),o=e.constructEmpty(),m=!1,l=new i,g=new st,u=this.m_shape.getTotalPointCount(),c=u*u*2,_=this.m_shape.queryVertexIteratorOnSelection();for(let e=_.next();e!==h;e=_.next()){const t=this.m_shape.getGeometryType(_.currentGeometry());let i=1,u=1,d=1,p=0,f=0,S=0;const x=this.m_shape.getSegmentParentage(e);let C=!1,E=!1,I=null,w=!1;if(W(t))i=this.m_shape.getWeight(e),p=this.m_shape.getRank(e);else{if(I=this.getSegment_(e,n),null===I)continue;const t=this.m_shape.getVertexIndex(e);i=this.m_shape.getWeightWithIndex(t),p=this.m_shape.getRankWithIndex(t),d=this.m_shape.getSegmentWeightWithIndex(t),S=this.m_shape.getSegmentRankWithIndex(t),C=this.m_shape.getSegmentParentageBreakVertex(e);{const t=this.m_shape.getNextVertex(e);u=this.m_shape.getWeight(t),f=this.m_shape.getRank(t),E=this.m_shape.getSegmentParentageBreakVertex(t)}if(I.queryLooseEnvelope(a),a.inflateCoords(this.m_tolerance,this.m_tolerance),I.isDegenerate(this.m_tolerance)){if(!I.isDegenerate(0))continue;w=!0,I=null}}const b=new N({copy:_});let v=b.next();v!==h&&(v=b.next());let y=0;for(;v!==h;v=b.next()){if(0!==y){y--;continue}if(this.m_shape.getTotalPointCount()>c)return s;this.progress_();const t=this.m_shape.getGeometryType(b.currentGeometry());let N=null,k=!1,V=0,T=0,B=0,q=0,F=0,X=0,Y=!1,D=!1;const A=this.m_shape.getSegmentParentage(v);if(W(t))V=this.m_shape.getWeight(v),q=this.m_shape.getRank(v);else{if(N=this.getSegment_(v,r),null===N)continue;const e=this.m_shape.getVertexIndex(v);V=this.m_shape.getWeightWithIndex(e),q=this.m_shape.getRankWithIndex(e),B=this.m_shape.getSegmentWeightWithIndex(e),X=this.m_shape.getSegmentRankWithIndex(e),Y=this.m_shape.getSegmentParentageBreakVertex(v);{const e=this.m_shape.getNextVertex(v);T=this.m_shape.getWeight(e),F=this.m_shape.getRank(e),D=this.m_shape.getSegmentParentageBreakVertex(e)}if(N.queryLooseEnvelope(o),N.isDegenerate(this.m_tolerance)){if(!N.isDegenerate(0))continue;k=!0,N=null}}let M=0,O=0;if(null!==I&&null!==N){if(a.isIntersectingNe(o)){0!==P(!0,!0,I,N,this.m_tolerance,!0)&&(g.pushSegment(I,i,p,u,f,d,S,C,E,x),g.pushSegment(N,V,q,T,F,B,X,Y,D,A),g.intersect2D(this.m_tolerance,!0),s||=g.getSegmentChanged(0)||g.getSegmentChanged(1),M=g.getResultSegmentCount(0),O=g.getResultSegmentCount(1),M+O>0&&(this.m_shape.splitSegmentWithIntersector(e,g,0,!0,!0),this.m_shape.splitSegmentWithIntersector(v,g,1,!0,!0),this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(e,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(v,!0))),O>1&&(y+=O-1),g.clear())}}else if(null!==I){const t=this.m_shape.getXY(v);if(a.contains(t)){if(g.pushSegment(I,i,p,u,f,d,S,C,E,x),this.m_shape.queryPoint(v,l),g.intersect2DEx(this.m_tolerance,l,q,V,m),s||=g.getSegmentChanged(0)||g.getResultPointChanged(),M=g.getResultSegmentCount(0),M>0)if(this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(e,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(v,!0)),this.m_shape.splitSegmentWithIntersector(e,g,0,!0,!0),k){let e=h;for(let t=this.m_shape.getNextVertex(v);t!==h&&t!==v&&(N=this.getSegment_(t,r),e=t,null!=N&&N.isDegenerate(0));t=this.m_shape.getNextVertex(t));for(let t=v;t!==h&&(this.m_shape.setPoint(t,g.getResultPoint(),!0),t!==e);t=this.m_shape.getNextVertex(t));}else this.m_shape.setPoint(v,g.getResultPoint(),!0);g.clear()}}else{if(null===N)continue;{const t=this.m_shape.getXY(e);if(o.inflateCoords(this.m_tolerance,this.m_tolerance),o.contains(t)){if(g.pushSegment(N,V,q,T,F,B,X,Y,D,A),this.m_shape.queryPoint(e,l),g.intersect2DEx(this.m_tolerance,l,p,i,m),s||=g.getSegmentChanged(0)||g.getResultPointChanged(),O=g.getResultSegmentCount(0),O>0)if(this.m_bTrackChanges&&(g.getSegmentChanged(0)&&this.m_shape.setGeometryModifiedWithVertex(v,!0),g.getSegmentChanged(1)&&this.m_shape.setGeometryModifiedWithVertex(e,!0)),this.m_shape.splitSegmentWithIntersector(v,g,0,!0,!0),y+=O-1,w){let t=h;for(let s=this.m_shape.getNextVertex(e);s!==h&&s!==e&&(N=this.getSegment_(s,r),t=s,null!=N&&N.isDegenerate(0));s=this.m_shape.getNextVertex(s));for(let s=e;s!==h&&(this.m_shape.setPoint(s,g.getResultPoint(),!0),s!==t);s=this.m_shape.getNextVertex(s));}else this.m_shape.setPoint(e,g.getResultPoint(),!0);g.clear()}}}if(M+O!==0&&0!==M){let t=!1;for(;I=this.getSegment_(e,n),null!=I&&(I.queryEnvelope(a),I.isDegenerate(this.m_tolerance));){if(!(M>1)){t=!0;break}e=_.next(),M--,R(e!==h)}if(t)break}}}return s}crackerPlaneSweep_(){return this.planesweep_()}planesweep_(){return new dt(this.m_progressTracker,this.m_bTrackChanges).sweep(this.m_shape,this.m_tolerance)}needsCrackingImpl_(){let e=!1;const t=new a(0);t.resize(this.m_shape.getSelectedCount());const s=this.m_shape.queryVertexIteratorOnSelection();for(let a=0,u=s.next();u!==h;++a,u=s.next())t.write(a,u);this.m_shape.sortVerticesSimpleByY(t,0,t.size()),t.add(h);const n=this.m_shape.createUserIndex(),i=this.m_shape.createUserIndex();this.m_sweepComparator=new He(this.m_shape,this.m_tolerance,!this.m_bAllowCoincident),this.m_sweepStructure.setComparator(this.m_sweepComparator);let r=null;const o=[],m=[];let l=0;const g=new Z;for(let a=t.read(l++);a!==h;){this.m_shape.queryXY(a,g);let s=!1;do{let e=this.m_shape.getNextVertex(a),r=this.m_shape.getPrevVertex(a);s||=e!==h||r!==h,e===h||this.m_shape.selected(e)||(e=h),r===h||this.m_shape.selected(r)||(r=h),e!==h&&this.m_shape.compareVerticesSimpleY(a,e)<0&&(m.push(a),m.push(e)),r!==h&&this.m_shape.compareVerticesSimpleY(a,r)<0&&(m.push(r),m.push(r));const g=this.m_shape.getUserIndex(a,n);-1!==g&&(o.push(g),this.m_shape.setUserIndex(a,n,-1));const u=this.m_shape.getUserIndex(a,i);-1!==u&&(o.push(u),this.m_shape.setUserIndex(a,i,-1)),a=t.read(l++)}while(a!==h&&this.m_shape.isEqualXYPoint2D(a,g));if(!s&&(null===r&&(r=new We(this.m_shape,this.m_tolerance)),r.setPoint(g),this.m_sweepStructure.searchUpperBound(r),r.intersectionDetected())){e=!0,this.m_bNeedsNonSimpleResult&&(O("needsCrackingIMpl_"),this.m_nonSimpleResult=new be(6,-1,-1));break}let u=1===o.length&&2===m.length;const c=32;o.length>c&&re(o);let _=-1,d=-1;if(!u)for(let t=0,n=o.length;t<n;t++){const s=o[t],n=this.m_sweepStructure.getPrev(s);if(-1!==n&&-1===o.indexOf(n))if(-1===_)_=n;else{if(e=!0,!this.m_bNeedsNonSimpleResult)break;this.m_nonSimpleResult=new be(6,-1,-1)}const i=this.m_sweepStructure.getNext(s);if(-1!==i&&-1===o.indexOf(i))if(-1===d)d=i;else{if(e=!0,!this.m_bNeedsNonSimpleResult)break;this.m_nonSimpleResult=new be(6,-1,-1)}if(-1!==_&&-1!==d)break}if(e&&!this.m_bNeedsNonSimpleResult)break;if(this.m_sweepComparator.setSweepY(g.y,g.x),!u){for(let e=0,t=o.length;e<t;e++){const t=o[e];this.m_sweepStructure.deleteNode(t)}o.length=0}if(!u&&-1!==_&&-1!==d&&this.checkForIntersections_(_,d)){e=!0,this.m_bNeedsNonSimpleResult&&(this.m_nonSimpleResult=this.m_sweepComparator.getResult());break}for(let t=0,r=m.length;t<r;t+=2){const s=m[t],r=m[t+1];let h;if(u?(h=this.m_sweepStructure.replaceElementAtPosition(o[0],s,!0,!0),o.length=0,u=!1):h=this.m_sweepStructure.addElement(s),this.m_sweepComparator.intersectionDetected()){this.m_bNeedsNonSimpleResult&&(this.m_nonSimpleResult=this.m_sweepComparator.getResult()),e=!0;break}-1===this.m_shape.getUserIndex(r,n)?this.m_shape.setUserIndex(r,n,h):this.m_shape.setUserIndex(r,i,h)}if(e)break;m.length=0}return this.m_shape.removeUserIndex(n),this.m_shape.removeUserIndex(i),e}checkForIntersections_(e,t){const s=this.m_sweepStructure.getElement(e);this.m_sweepComparator.compare(this.m_sweepStructure,s,t);const n=this.m_sweepComparator.intersectionDetected();return this.m_sweepComparator.clearIntersectionDetectedFlag(),n}getSegment_(e,t){return Et.st_getSegment(this.m_shape,e,t)}static st_getSegment(e,t,s){return e.querySegment(t,s,!1,!1)?s.get():null}dbgPrintSweepEdge(e){}dbgPrintSweepStructure(){}dbgSaveSweepStructure(e=null){}dbgCheckSweepStructure(){}progress_(e=!1){this.m_progressCounter++}crackAWithBMultiPath_(n,i,r){const h=e.constructEmpty();n.queryLooseEnvelope(h);const a=e.constructEmpty();if(i.queryLooseEnvelope(a),a.inflateCoords(r,r),!a.isIntersecting(h))return n;const o=n.getImpl(),m=o.getAccelerators();let l=null,g=null;m&&(g=m.getQuadTree()),It(n,G(i))&&(l=s(o,a),g=l);const u=g?g.getIteratorForQT():null,c=i.querySegmentIterator(),_=n.querySegmentIterator(),d=new Array(15),p=[];for(;c.nextPath();)for(;c.hasNextSegment();){const t=c.nextSegment();if(g){u.resetIterator(t,r);for(let e=u.next();-1!==e;e=u.next()){this.progress_();const s=g.getElement(e);if(_.resetToVertex(s,-1),_.hasNextSegment()){const e=_.nextSegment().intersect(t,null,d,null,r);for(let t=0;t<e;t++){const e=d[t];if(0===e||1===e)continue;const s=Ct(e,_.getStartPointIndex());p.push(s)}}}}else{const s=e.constructEmpty();if(t.queryLooseEnvelope(s),s.inflateCoords(r,r),!h.isIntersecting(s))continue;for(_.resetToFirstPath();_.nextPath();)for(;_.hasNextSegment();){const n=_.nextSegment(),i=e.constructEmpty();if(n.queryLooseEnvelope(i),!i.isIntersecting(s))continue;const h=n.intersect(t,null,d,null,r);for(let e=0;e<h;e++){const t=d[e];if(0===t||1===t)continue;const s=Ct(t,_.getStartPointIndex());p.push(s)}}}}if(0===p.length)return n;p.sort(((e,t)=>e.index<t.index?-1:e.index>t.index?1:e.t<t.t?-1:e.t>t.t?1:0));const f=n.createInstance();if(f.getGeometryType()===D.enumPolygon){f.setFillRule(n.getFillRule())}for(_.resetToFirstPath();_.nextPath()&&!_.hasNextSegment(););R(_.hasNextSegment());let S=_.nextSegment();const x=new t;let C=-1;for(let e=0,t=p.length;e<t;){const s=p[e].index;let n=e+1;for(;n<t&&p[n].index===s;)++n;for(;_.getStartPointIndex()<s;){this.progress_();const e=_.hasNextSegment(),t=_.getPathIndex();if((e||!_.isClosingSegment()||_.isCurve())&&(R(null!==S),f.addSegment(S,C!==t)),C=t,!e){for(_.isPathClosed();_.nextPath()&&!_.hasNextSegment(););R(_.hasNextSegment())}S=_.nextSegment()}let i=0;for(let t=e;t<n;t++){const e=p[t].t;if(e===i)continue;R(null!==S),S.queryCut(i,e,x),i=e;const s=_.getPathIndex();f.addSegment(x.get(),C!==s),C=s}const r=_.hasNextSegment();if((r||!_.isClosingSegment()||_.isCurve())&&(R(null!=S),S.queryCut(i,1,x),f.addSegment(x.get(),!1)),r)S=_.nextSegment();else{for(;_.nextPath()&&!_.hasNextSegment(););S=_.hasNextSegment()?_.nextSegment():null}e=n}if(null!==S){const e=_.getPathIndex();(_.hasNextSegment()||!_.isClosingSegment()||_.isCurve())&&f.addSegment(S,C!==e),C=e}let E=_.hasNextSegment();for(;;){if(!E){for(;_.nextPath()&&(E=_.hasNextSegment(),!E););if(!E)break}S=_.nextSegment();const e=_.getPathIndex();E=_.hasNextSegment();(E||!_.isClosingSegment()||_.isCurve())&&f.addSegment(S,C!==e),C=e}return f}constructor(e){this.m_shape=null,this.m_progressTracker=null,this.m_nonSimpleResult=new be,this.m_tolerance=0,this.m_sweepComparator=null,this.m_progressCounter=0,this.m_bTrackChanges=!1,this.m_bNeedsNonSimpleResult=!1,this.m_bAllowCoincident=!0,this.m_sweepStructure=new r,this.m_progressTracker=e}}function It(e,t){const s=e.getPointCount();if(s<16)return!1;const n=1;return 2*s+1*(Math.log(s)/Math.log(2))*t<n*s*t}function wt(e,t,s,n,i){const r=v(t),h=Math.max(4*r,s);return new kt(t,null,h,Number.NaN,i).approximateWithCirclesImpl(e,n)}function bt(){return Number.isNaN(this.radius.value())}function Nt(){return{ptStart:new Z,ptEnd:new Z,center:new k,radius:new Se,fcenter:new y,fradius2:new he,maxError:Number.NaN,isLine:bt}}Et.s_bForceBruteForce=!0;const Pt=5,vt=1/8;function yt(e,t,s,n){return{pt:e.clone(),t,err:s,checkCount:n}}class kt{constructor(e,t,s,n,i){this.m_left=e,this.m_tracker=i,this.m_eps=s,this.m_trackerCounter=0,this.m_tolerance=n,this.m_circleCheckCounter=0,this.m_bReversedLeft=!1,this.m_leftArc=Nt()}closeToCircularArc(e,t,s,n,i,r){if(this.m_circleCheckCounter++,r.maxError=0,!kt.checkSweepAngle(e,t))return!1;if(r.ptStart.setCoordsPoint2D(s),r.ptEnd.setCoordsPoint2D(i),e.isCircular()){const t=e;return r.fradius2=he.constructDouble(t.getSemiMajorAxis()).mulDouble(t.getSemiMajorAxis()),r.radius.set(t.getSemiMajorAxis()),r.fcenter.assignPoint2D(t.getCenter()),r.center.set(t.getCenter()),!0}const h=r.ptEnd.sub(r.ptStart).clone();h.leftPerpendicularThis(),h.normalize();if(Math.abs(h.dotProduct(n.sub(r.ptStart)))<=this.m_eps)return!!this.confirmIsLine(r,h)&&(r.radius.set(Number.NaN),r.center.setCoords(0,0),!0);{const s=r.ptEnd.sub(r.ptStart),i=n.sub(r.ptStart),h=s.crossProduct(i);if(0===h)return!1;const a=.5*s.sqrLength(),o=.5*i.sqrLength();let m=a*i.y-o*s.y;m/=h;let l=s.x*o-i.x*a;l/=h;const g=Math.sqrt(m*m+l*l);if(4*Number.EPSILON*g>this.m_eps)return!1;const u=m+r.ptStart.x,c=l+r.ptStart.y;r.radius.set(g),r.center.setCoords(u,c);const _=this.maxCircleApproximationError(e,t,r);if(_>this.m_eps)return r.maxError=_,!1}const a=(new y).assignPoint2D(r.ptStart),o=(new y).assignPoint2D(r.ptEnd).sub(a),m=(new y).assignPoint2D(n).sub(a),l=o.crossProduct(m);if(l.isZero())return!1;const g=o.sqrLength().mulDouble(.5),u=m.sqrLength().mulDouble(.5),c=g.mul(m.y).sub(u.mul(o.y)),_=o.x.mul(u).sub(m.x.mul(g)),d=c.mul(c).add(_.mul(_)),p=l.clone();p.invertThis(),r.fradius2=d.mul(p).mul(p),r.fcenter.setCoords(c.mul(p).add(a.x),_.mul(p).add(a.y)),r.center.setWithEps(r.fcenter.asPoint2D()),r.radius.setWithEps(Math.sqrt(r.fradius2.toDouble()));const f=k.constructPoint2D(r.ptStart).subE(r.center),S=k.constructPoint2D(r.ptEnd).subE(r.center);if(!f.dotProduct(S).gt(ae))return!1;const x=this.maxCircleApproximationError(e,t,r);return r.maxError=x,x<=this.m_eps}static checkSweepAngle(e,t){if(e.getGeometryType()===D.enumEllipticArc){const s=e,n=V(s,t.vmin),i=V(s,t.vmax);return!(Math.abs(i-n)>.5*oe)}return!0}confirmIsLine(e,t){const s=e.ptEnd.sub(e.ptStart);return!(Math.abs(t.dotProduct(s.mul(.25)))>this.m_eps)&&!(Math.abs(t.dotProduct(s.mul(.75)))>this.m_eps)}maxCircleApproximationError(e,t,s){const n=[.25,.75],i=[.1,.25,.75,.9];let r,h;e.getGeometryType()===D.enumEllipticArc?(r=n,h=n.length):(r=i,h=i.length);let a=0;for(let o=0;o<h;++o){const n=new Z;e.queryCoord2D(ee(t.vmin,t.vmax,r[o]),n);const i=n.sub(s.center.value()).length(),h=Math.abs(i-s.radius.value());h>a&&(a=h)}return a}approximateWithCirclesImpl(e,t){let s=1;t&&t.push(0);const n=j(9,Number.NaN);let i;e?i=this.m_left.getMonotonicPartParams(n.length,n):(n[0]=0,n[1]=1,i=2);const r=[],h=[],a=new Z(0,0);for(let o=1;o<i;o++){const e=new J(n[o-1],n[o]);for(this.m_bReversedLeft=!kt.goodOrientation(this.m_left,e),this.m_bReversedLeft?(r.push(yt(a,e.vmin,0,0)),r.push(yt(a,e.vmax,0,0))):(r.push(yt(a,e.vmax,0,0)),r.push(yt(a,e.vmin,0,0))),r[0].pt=this.m_left.getCoord2D(r[0].t),r[1].pt=this.m_left.getCoord2D(r[1].t);r.length>1;){this.progress_();const e=r.at(-1);let n=e.checkCount,i=e.err;const a=e.pt.clone(),o=e.t,m=r[r.length-2].t,l=.5*(o+m),g=this.m_left.getCoord2D(l);if(i<=this.m_eps||n>=Pt){const e=new J;if(e.setCoords(o,m),this.closeToCircularArc(this.m_left,e,a,g,r[r.length-2].pt,this.m_leftArc)){t&&(this.m_bReversedLeft?h.push(o):t.push(m)),s++,r.pop();continue}n=0,i=this.m_leftArc.maxError}e.t=l,e.pt.setCoordsPoint2D(g),i*=vt,n++,e.err=i,e.checkCount=n,r.push(yt(a,o,i,n))}this.m_bReversedLeft&&t&&(t.length=t.length+h.length,me(t,h.reverse(),t.length-h.length,0,h.length),h.length=0),r.length=0}return s}approximateWithCirclesImplPolyline(e){const t=new T,s=[];if(!this.approximateWithCirclesImpl(!0,s))return t;let n=0;const i=this.m_left.getStartXY();t.startPath(i);for(let r=1;r<s.length;++r)if(e)t.lineTo(this.m_left.getCoord2D(s[r]));else{const e=new Z;this.m_left.queryCoord2D(s[r],e);const h=new Z;this.m_left.queryCoord2D(.5*(s[r]+n),h);const a=new c;a.constructCircularArcThreePoint(i,e,h),t.addSegment(a,!1),i.assign(e),n=s[r]}return t}static goodOrientation(e,t){const s=e.getCoord2D(t.vmin),n=e.getCoord2D(t.vmax);return s.compare(n)<0}progress_(e=!1){}}function Vt(e,t,s,n,i,r,h){Bt(e,t,s,i,r,h)}function Tt(e,s,n,r){if(!L(e.getGeometryType()))return e;const h=e.getImpl();if(!h.hasNonLinearSegments())return e;const a=e.createInstance();if(a.getGeometryType()===D.enumPolygon){a.setFillRule(e.getFillRule())}new o;const g=new i,u=new t,c=[],_=[],d=[],p=e.getDescription().getAttributeCount()>1,f=h.querySegmentIterator();for(;f.nextPath();){let e=!0;for(;f.hasNextSegment();){const t=f.isClosingSegment(),i=f.nextSegment();if(!i.isCurve()){a.addSegment(i,e,t),e=!1;continue}let r,h=!1;const o=!0,S=!0;switch(i.getGeometryType()){case D.enumEllipticArc:case D.enumRationalBezier2:r=l(i,s,n,o,S,_,d,c),h=!0;break;default:r=m(i,s,n,!0,o,_,c)}const x=h?2:3;_[1].isNAN()?(u.createLine(),u.get().construct(_[0],_[x])):h?(u.createQuadraticRationalBezier(),u.get().constructArrayWeights(_,d)):(u.createCubicBezier(),u.get().constructPoints(_)),p&&e&&(i.queryCoord(c[0],g),u.get().setStart(g)),p&&(i.queryCoord(c[1],g),u.get().setEnd(g)),a.addSegment(u.get(),e,t&&1===r),e=!1;for(let e=1,s=r,n=x;e<s;++e,n+=x)_[n+1].isNAN()?(u.createLine(),u.get().construct(_[n],_[n+x])):h?(u.createQuadraticRationalBezier(),u.get().constructArrayWeights(_.slice(n),d.slice(n))):(u.createCubicBezier(),u.get().constructPoints(_.slice(n))),p&&(i.queryCoord(c[e+1],g),u.get().setEnd(g)),a.addSegment(u.get(),!1,t&&e+1===s)}}return a}function Bt(e,t,s,n,i,r){e.hasCurves()?(e.setCurveStitcherPointer(n),n.m_impl=new Mt(r,!1,null),n.m_impl.buildMonotonicCurveParentage(e,t,s,i)):n.m_impl=null}function qt(e,t,s,n,i,r,h,a){e.hasCurves()?(e.setCurveStitcherPointer(r),r.m_impl=new Mt(a,!0,i),r.m_impl.buildMonotonicCurveParentage(e,t,s,h),Wt(e,s,a)):r.m_impl=null}function Ft(e){if(!e.hasSegmentParentage())return;const t=new a(0),s=e.queryVertexIteratorOnSelection();for(let a=s.next();a!==h;a=s.next())t.add(a);if(0===t.size())return;e.sortVerticesSimpleByY(t,0,t.size()),t.add(h);const n=Z.getNAN();e.queryXY(t.read(0),n);let i=0;const r=Z.getNAN();for(let a=1,o=t.size();a<o;a++){{const s=t.read(a);s!==h?e.queryXY(s,r):r.setNAN()}if(!r.isEqualPoint2D(n)){let s=!1,o=-2;for(let n=i;n<a;++n){const i=t.read(n);if(e.getSegmentParentageBreakVertex(i)){s=!0;break}let r=e.getSegmentParentage(i);const a=e.getPrevVertex(i);if(a!==h){let t=e.getSegmentParentage(a);if(-1===r&&(r=t),-1===t&&(t=r),r!==t){s=!0;break}}if(-2!==o&&r!==o){s=!0;break}o=r}if(s)for(let n=i;n<a;++n)e.setSegmentParentageBreakVertex(t.read(n),!0);n.setCoordsPoint2D(r),i=a}}}function Xt(e,t){let s=t.isEmpty()?e:E(null,t,!0).total();return s>e&&(s=e),.125*s}function Yt(t,s){return s||(s=e.constructEmpty()),Xt(t,s)}function Dt(e,t){return.125*e}function At(e,t){return 3*e+3*t}class Rt{constructor(){this.m_impl=null}stitchCurves(e,t,s,n){this.m_impl&&(this.m_impl.stitchCurves(e,t,s),n&&this.clearStitcher(e))}clearStitcher(e){this.m_impl&&(this.m_impl.clearStitcher(e),this.m_impl=null)}getOriginalVertexIndex(e,t){return this.m_impl.getOriginalVertexIndex(e,t)}getOriginalSegmentTypeInfo(e){return this.m_impl.getOriginalSegmentTypeInfo(e)}}class Mt{constructor(e,t,s){this.m_originalPlanarSegments=[],this.m_progressTracker=null,this.m_nsr=null,this.m_progressTracker=e,this.m_nsr=s,this.m_tolerance=0,this.m_originalVertexIndex=-1,this.m_type=0,this.m_progressCounter=0,this.m_bIsSimple=t}buildMonotonicCurveParentage(e,s,n,r){const a=!1,o=!0;if(!e.hasCurves())return;R(!e.hasSegmentParentage()),this.m_type=1,this.m_originalPlanarSegments.length=0,this.m_bIsSimple&&(this.m_originalVertexIndex=e.createUserIndex()),this.m_tolerance=n;const c=new i,_=new t,d=[],p=[],f=[];for(let t=e.getFirstGeometry();t!==h;t=e.getNextGeometry(t))for(let i=e.getFirstPath(t);i!==h;i=e.getNextPath(i)){let t=e.getPathSize(i),r=e.getFirstVertex(i),h=0,S=-1;for(let x=0;x<t;x++){let C=e.getNextVertex(r);if(!e.querySegment(r,_,!0,!1)){r=C;continue}if(0===h){S=e.getVertexIndex(r);const s=Mt.regularizeCurve(e,_.get(),r,n);if(s>=0){this.m_nsr&&0===this.m_nsr.m_reason&&this.m_nsr.assign(new be(13,S,-1)),h=s,t=e.getPathSize(i),C=e.getNextVertex(r);const n=e.querySegment(r,_,!0,!1);R(n)}}else h--;const E=e.getVertexIndex(r);let I;-1!==this.m_originalVertexIndex&&e.setUserIndex(r,this.m_originalVertexIndex,S),e.setSegmentToIndex(E,null);let w=!1;switch(_.get().getGeometryType()){case D.enumEllipticArc:case D.enumRationalBezier2:I=l(_.get(),s,n,a,o,p,f,d),w=!0;break;default:{const e=!this.m_bIsSimple||!_.get().isMonotoneQuickAndDirty();I=m(_.get(),s,n,e,a,p,d)}}const b=this.m_originalPlanarSegments.length;if(e.setSegmentParentageAndBreak(r,b,!0),!p[1].isNAN()){let t=null;t=w?new u({points:p,weights:f}):new g({cp:p}),t.snapControlPoints(n*n),e.setSegmentToIndex(E,t)}const N=w?2:3;for(let t=1,s=I,r=N;t<s;++t,r+=N){_.get().queryCoord(d[t],c);const s=e.insertVertex(i,C,c);if(-1!==this.m_originalVertexIndex&&e.setUserIndex(s,this.m_originalVertexIndex,S),!p[r+1].isNAN())if(w){const t=new u({points:p.slice(r),weights:f.slice(r)});t.snapControlPoints(n*n),e.setSegmentToIndex(e.getVertexIndex(s),t)}else{const t=new g({cp:p.slice(r)});t.snapControlPoints(n*n),e.setSegmentToIndex(e.getVertexIndex(s),t)}e.setSegmentParentageAndBreak(s,b,!1)}I>1&&(x+=I-1,t=e.getPathSize(i)),this.m_originalPlanarSegments.push(_.releaseSegment()),r=C}}}stitchCurves(e,t,s){Mt.st_stitchCurvesImpl(this,e,t,s,!1)}clearStitcher(e){this.m_originalPlanarSegments.length=0,-1!==this.m_originalVertexIndex&&(e.removeUserIndex(this.m_originalVertexIndex),this.m_originalVertexIndex=-1),e.deleteSegmentParentage()}static st_verifyParentage(e){Mt.st_stitchCurvesImpl(null,e,h,0,!0)}getOriginalVertexIndex(e,t){return-1!==this.m_originalVertexIndex&&t!==h?e.getUserIndex(t,this.m_originalVertexIndex):-1}getOriginalSegmentTypeInfo(e){if(-1!==e){const t=this.m_originalPlanarSegments[e];switch(t.getGeometryType()){case D.enumEllipticArc:return 0===t.projectionBehavior()?0:1;case D.enumBezier:return 2;case D.enumBezier2:return 3;case D.enumLine:return-1;case D.enumRationalBezier2:return 4;default:z("")}}return-1}progress_(e=!1){this.m_progressCounter++}processSpan_(e,t,s,n,i,r,a){if(t===s&&0===n)return R(e.getNextVertex(t)===h),e.setSegmentToIndex(e.getVertexIndex(t),null),void e.setSegmentParentageAndBreak(t,-1);const o=e.getNextVertex(t);{let t=2;for(let n=o;n!==s;n=e.getNextVertex(n))t++;R(t===n)}if(null===i){e.setSegmentToIndex(e.getVertexIndex(t),null);for(let t=o;t!==s;)t=e.removeVertex(t,!0);return}const m=e.getXY(t),l=e.getXY(s);if(i.isClosed()){if(m.isEqualPoint2D(l)&&m.isEqualPoint2D(i.getStartXY())){let h;if(h=this.verifySegmentFitness(e,t,s,n,i,r,a)){const n=i.clone();return n.dropAllAttributes(),h<0&&n.reverse(),this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),n)}}}else if(m.isEqualPoint2D(i.getStartXY())){if(l.isEqualPoint2D(i.getEndXY())){const h=i.clone();if(h.dropAllAttributes(),this.verifySegmentFitness(e,t,s,n,h,r,a))return this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),h)}}else if(l.isEqualPoint2D(i.getStartXY())&&m.isEqualPoint2D(i.getEndXY())){const h=i.getReversed();if(h.dropAllAttributes(),this.verifySegmentFitness(e,t,s,n,h,r,a))return this.removeSpan(e,t,s),void e.setSegmentToIndex(e.getVertexIndex(t),h)}this.processSpanSplitSegment(e,t,s,n,i,r,a)}processSpanSplitSegment(e,t,s,n,i,r,h){if(i.isLine())return;if(this.fitSegmentToSpan(e,t,s,n,i,r,h))return;const a=h*h;let o=n,m=t;const l=e.getXY(t);let g=i.getClosestCoordinate(l,!1);const u=i.getCoord2D(g);let c=!1;const _=Z.sqrDistance(l,u);if(_>a){const n=e.getNextVertex(t);if(this.approximateSpanSection(e,t,i,r,h),n===s)return;m=n,c=!0,o-=1}let d=s;const p=e.getXY(s);g=i.getClosestCoordinate(p,!1);const f=i.getCoord2D(g);let S=!1;const x=Z.sqrDistance(p,f);if(x>a){const t=e.getPrevVertex(s);if(this.approximateSpanSection(e,t,i,r,h),t===m)return;d=t,S=!0,o-=1}if((c||S)&&this.fitSegmentToSpan(e,m,d,o,i,r,h))return;let C=!1;if(!c&&_>0){const s=e.getNextVertex(t);if(this.approximateSpanSection(e,t,i,r,h),s===d)return;m=s,c=!0,C=!0,o-=1}if(!S&&x>0){const t=e.getPrevVertex(s);if(this.approximateSpanSection(e,t,i,r,h),t===m)return;d=t,S=!0,C=!0,o-=1}if(C&&this.fitSegmentToSpan(e,m,d,o,i,r,h))return;let E=m;for(;;){const t=e.getNextVertex(E);if(this.approximateSpanSection(e,E,i,r,h),E=t,E===d)return}}fitSegmentToSpan(e,s,n,i,r,h,a){const o=0===this.m_type,m=[];if(m.push(e.getXY(s)),o){let t=s;const r=32;if(i>r){const s=BigInt(i-1),h=BigInt(r-1);let a=h,o=0n;for(let n=1;n<i;n++,a+=h)if(t=e.getNextVertex(t),a>=o+s){o+=s;const n=e.getXY(t);m.push(n)}R(t===n)}else{for(let s=1;s<i;s++){t=e.getNextVertex(t);const s=e.getXY(t);m.push(s)}R(t===n)}}else{let r=s;const h=new t;for(;;){e.querySegment(r,h,!1,!0);const t=[.1,.25,.4,.5,.6,.75,.9,1];let s=0;for(const e of t){(2===i||1&s)&&m.push(h.get().getCoord2D(e)),s++}if(r=e.getNextVertex(r),r===n)break}}const l=(()=>{let e=m[0].compare(m.at(-1));if(0===e){const t=new le(0);Ae(m,m.length,t),e=t.getResult()>=0?-1:1}return e>0})();l&&m.reverse();const g=r.clone();if(g.dropAllAttributes(),g.setSegmentFromCoords(m,m.length),l&&g.reverse(),g.snapControlPoints(this.m_tolerance*this.m_tolerance),this.verifySegmentFitness(e,s,n,i,g,h,a)){this.removeSpan(e,s,n);const t=e.getVertexIndex(s);return e.setSegmentToIndex(t,g),!0}return!1}approximateSpanSection(e,s,n,r,a){const o=new t;if(!e.querySegment(s,o,!0,!1))return;const m=n.getGeometryType();if(m!==o.get().getGeometryType()){if(m===D.enumEllipticArc){if(o.get().getGeometryType()!==D.enumRationalBezier2)return;if(0===n.projectionBehavior()){const t=[];wt(!1,o.get(),a,t,this.m_progressTracker);const n=e.getNextVertex(s),r=e.getPathFromVertex(s),m=new i;let l=s;for(let s=1,i=t.length;s<i;s++){const i=t[s],a=o.get().getCoord2D(t[s-1]),g=o.get().getCoord2D(ee(t[s-1],i,.5));o.get().queryCoord(i,m);const u=m.getXY(),_=new c;_.constructCircularArcThreePoint(a,u,g);let d=h;i<1&&(d=e.insertVertex(r,n,m)),e.setSegmentToIndex(e.getVertexIndex(l),_),l=d}return}{const t=Q(Z,3);o.get().queryControlPoints(t);const n=[0,0,0];o.get().queryWeights(n);const i=_(n),r=new c;return d(t,i*i,null,!1,r),void e.setSegmentToIndex(e.getVertexIndex(s),r)}}O("approximate_span_section_")}}verifySegmentFitness(e,t,s,n,i,r,h){return 0===this.m_type?this.verifySegmentFitnessLines(e,t,s,n,i,r,h):this.verifySegmentFitnessCurves(e,t,s,n,i,r,h)}verifySegmentFitnessCurves(e,t,s,n,i,r,h){const a=e.getXY(t),o=e.getXY(s);if(!a.isEqualPoint2D(i.getStartXY())||!o.isEqualPoint2D(i.getEndXY()))return 0;let m=0;if(i.isClosed()){const e=i.getCoord2D(.1).sub(a);m=i.getCoord2D(.7).sub(a).crossProduct(e)>=0?1:-1}const l=new Array(p.s_maxMonotonicPartParams);let g=i.getMonotonicPartParams(l.length,l);g--;const u=new f,c=[1,.5,.75,.25];let _=0,d=t;const S=a.clone();for(;;){const t=e.getNextVertex(d);let n=e.getSegment(d);null===n&&(e.queryLineConnector(d,u,!0),n=u);for(let e=t===s?1:0;e<c.length;e++){const t=n.getCoord2D(c[e]);if(!i.isCloserThanDistance(t,J.unit(),h))return 0}if(g>1)for(let e=1;e<g;){const t=i.getCoord2D(l[e]);n.isCloserThanDistance(t,J.unit(),h)?(l[g-1]=te(l[e],l[e]=l[g-1]),g--):e++}if(m){const e=n.getCoord2D(.25);_+=e.sub(a).crossProduct(S.sub(a)),S.assign(e),e.assign(n.getCoord2D(.75)),_+=e.sub(a).crossProduct(S.sub(a)),S.assign(e)}if(d=t,d===s)return g>1?0:m?_<0?-m:m:1}}verifySegmentFitnessLines(e,t,s,n,i,r,h){return R(0),0}removeSpan(e,t,s){e.setSegmentToIndex(e.getVertexIndex(t),null);const n=e.getNextVertex(t);n!==s&&e.removeVertices(n,s)}static st_stitchCurvesImpl(e,t,s,n,i){if(t.hasSegmentParentage())return t.hasCurves()?Mt.st_stitchCurvesFromCurvesImpl(e,t,s,n,i):Mt.st_stitchCurvesFromLinesImpl(e,t,s,n,i)}static st_stitchCurvesFromLinesImpl(e,t,s,n,i){let r=s===h?t.getFirstGeometry():s;for(;r!==h;){for(let s=t.getFirstPath(r);s!==h;s=t.getNextPath(s)){let r=t.getPathSize(s);t.isClosedPath(s)&&(r+=1);let a=!0,o=!1;const m=t.getFirstVertex(s);let l=m;for(let s=0;s<r&&l!==h;){let g=t.getSegmentParentage(l);if(-1===g||a){a=!1,s++,l=t.getNextVertex(l),o=!0;continue}let u,c,_=0;if(o?(u=t.getPrevVertex(l),c=l,R(u!==h),R(c!==u),R(-1===t.getSegmentParentage(u)||m===u)):(u=l,c=t.getNextVertex(u),s++,R(c!==h),R(c!==u),g=t.getSegmentParentage(c)),_=2,o=!1,-1===g||t.getSegmentParentageBreakVertex(c)){l=c;continue}let d=t.getNextVertex(c);for(s++;s<r&&d!==h;){c=d,_++;const e=t.getSegmentParentage(d);if(-1===e||t.getSegmentParentageBreakVertex(d))break;R(e===g),s++,d=t.getNextVertex(d)}if(!i){const s=e.m_originalPlanarSegments[g];e.processSpan_(t,u,c,_,s,g,n)}l=c}}if(s!==h)break;r=t.getNextGeometry(r)}}static st_stitchCurvesFromCurvesImpl(e,t,s,n,i){let r=s===h?t.getFirstGeometry():s;for(;r!==h;)if(H(t.getGeometryType(r))){for(let s=t.getFirstPath(r);s!==h;s=t.getNextPath(s)){let r=t.getPathSize(s);const a=t.isClosedPath(s);a&&(r+=1);let o=t.getFirstVertex(s);if(a){if(-1!==t.getSegmentParentage(o)){let e=o;for(let n=0;!t.getSegmentParentageBreakVertex(e);n++){if(n===r){o=t.getFirstVertex(s),t.setSegmentParentageBreakVertex(e,!0);break}e=t.getPrevVertex(e)}}}else R(-1===t.getSegmentParentage(o)||t.getSegmentParentageBreakVertex(o));let m=o;for(let s=0;s<r&&m!==h;){const a=t.getSegmentParentage(m);if(-1===a){s++,m=t.getNextVertex(m);continue}let o=0,l=h;const g=m;o=1;let u=t.getNextVertex(g);for(;s<r&&u!==h;){s++,l=u,o++;const e=t.getSegmentParentage(u);if(-1===e||t.getSegmentParentageBreakVertex(u))break;R(e===a),u=t.getNextVertex(u)}if(l===h)break;if(!i){const s=e.m_originalPlanarSegments[a];e.processSpan_(t,g,l,o,s,a,n)}m=l}}if(s!==h)break;r=t.getNextGeometry(r)}else r=s===h?t.getNextGeometry(r):h}static regularizeCurve(e,t,s,n){let i=t.snapControlPoints(n*n);if(i){const n=e.getVertexIndex(s),i=t.clone();e.setSegmentToIndex(n,i)}if(t.getGeometryType()===g.type){const r=[],h=t.calculateSpecialPointsForCracking(n,r);if(h>0){e.splitSegment(s,r,h),i=e.snapControlPoints(s,h+1,n*n)||i;for(let t=0;t<h;t++)s=e.getNextVertex(s),e.setSegmentParentageBreakVertex(s,!0);return h}}return i?0:-1}}function Ot(e,t,s,n,i){return new Ut(e,s,t,n,i).do_()}function Lt(e,t,s){const n=S(e);return Qe(t.getX(),t.getY(),s.getX(),s.getY(),ue(n))}function zt(e,t,s=1,n=1,r=1,h=1){if(n>h)return e;if(h>n)return t;const a=[0],o=[0],m=new i;return Je(e,t,s,n,r,h,m,o,a),m}function Ht(e,t,s){const n=S(t),i=x(t);return!!Ke(e,n,h,null,s)||St(!0,e,i,null,s)}function Wt(e,t,s){return Ut.fixCurveTwoPointLoops(e,t,s)}function Gt(e){return S(e)}class Ut{constructor(e,t,s,n,i){this.m_shape=e,this.m_progressTracker=t,this.m_tolerance=s,this.m_bFilterDegenerateSegments=n,this.m_bTrackChanges=i,this.m_progressCounter=0}do_(){const e=new C(this.m_tolerance.tolerance,this.m_tolerance.resolution),t=1e-5,s=1e-6,n=Gt(e);let i=x(e);const r=i*(1+t);i*=1+s;let a=!1;const o=this.m_shape.getTotalPointCount()+10>30?1e3:(this.m_shape.getTotalPointCount()+10)*(this.m_shape.getTotalPointCount()+10),m=this.m_shape.hasPointFeatures();for(let l=0;;l++){this.m_shape.dbgCheckSelection(),l>o&&O("crack_and_cluster_iteration_exceeded"),this.m_shape.dbgVerifyMonotone();let e=-1;0===l&&(e=this.firstCrack_(),a||=e>0);const t=this.cluster_(n);if(this.m_shape.dbgVerifyMonotone(),a||=t,this.m_bFilterDegenerateSegments){const e=0!==this.m_shape.filterClosePoints(n,!0,!1,this.m_bTrackChanges,h);a||=e,this.m_shape.dbgVerifyMonotone()}const s=this.m_shape.snapControlPointsOnSelection(r*r);a||=s,this.m_shape.dbgCheckSelection();let g=!1;if((0===l&&-1===e||m||St(!0,this.m_shape,i,null,this.m_progressTracker))&&(g=this.crack_(r),a||=g,this.m_shape.dbgVerifyMonotone()),!g&&!Ut.fixCurveTwoPointLoops(this.m_shape,n,this.m_progressTracker)){this.m_shape.dbgVerifyMonotone();break}}return a&&Ft(this.m_shape),a}cluster_(e){return Ue(this.m_shape,e,h,this.m_bTrackChanges,this.m_progressTracker)}crack_(e){return ft(this.m_shape,e,this.m_bTrackChanges,this.m_progressTracker)}static fixCurveTwoPointLoops(e,t,s){if(!e.hasCurves())return!1;e.dbgVerifyCurves();const n=e.createUserIndexUninitialized(),i=new a(0),r=e.queryVertexIteratorOnSelection();for(let a=r.next();a!==h;a=r.next())i.add(a),e.setUserIndex(a,n,-1);if(0===i.size())return!1;i.add(h),e.sortVerticesSimpleByY(i,0,i.size()-1);let o=0;const m=e.getXY(i.read(o)),l=new Z(Number.NaN,Number.NaN),g=[];for(let a=1,u=i.size();a<u;++a){const t=i.read(a),s=t!==h?e.getXY(t):l;if(s.equals(m))continue;const r=[];for(let l=o;l<a;l++){const t=i.read(l),s=e.getPrevVertex(t);if(s!==h&&-1===e.getUserIndex(s,n)){const t=Qt(e.getXY(s),e.getSegment(s));0!==Z.sqrDistance(m,t.otherPt)&&(t.vert=s,t.dir=-1,r.push(t)),e.setUserIndex(s,n,1)}const a=e.getNextVertex(t);if(a!==h&&-1===e.getUserIndex(t,n)){const s=Qt(e.getXY(a),e.getSegment(t));0!==Z.sqrDistance(m,s.otherPt)&&(s.vert=t,s.dir=1,r.push(s)),e.setUserIndex(t,n,1)}}if(r.length>1){r.sort(((e,t)=>Jt(e,t)));const e=Qt(l.clone(),null);r.push(e);let t=0;for(let s=1,n=r.length;s<n;s++)if(!r[s].otherPt.equals(r[s-1].otherPt)){if(s-t>1&&null!==r[t].seg){let e=!1;const n=t;for(let i=t+1;i<s;i++)if(!jt(r[n],r[i])){e=!0;break}if(e)for(let i=t;i<s&&null!==r[i].seg;i++)g.push(r[i].vert)}t=s}}o=a,m.setCoordsPoint2D(s)}for(const h of g){const s=e.getSegment(h);R(null!==s);const n=e.getXY(h),i=e.getXY(e.getNextVertex(h));if(Z.distance(n,i)<3*t)e.setSegmentToIndex(e.getVertexIndex(h),null);else{const t=s.lengthToT(.5*s.calculateLength2D());e.splitSegment(h,[t],1)}}return e.removeUserIndex(n),g.length>0}firstCrack_(){const e=this.m_shape.getEnvelope2D(this.m_progressTracker),t=E(null,e,!0).total();if(4*t<this.m_tolerance.total()){let e=!1;const s=1.1*t,n=t,i=this.cluster_(s);e||=i;let r=0;this.m_bFilterDegenerateSegments&&(r=this.m_shape.filterClosePoints(0,!0,!1,this.m_bTrackChanges,h));const a=this.crack_(n);return e||=a,e?1:r?2:0}return-1}progress_(e=!1){this.m_progressCounter++,!e&&4095&this.m_progressCounter||(this.m_progressCounter=0)}}function Qt(e,t){return{otherPt:e,seg:t,vert:-1,dir:0}}function jt(e,t){if(R(e.otherPt.equals(t.otherPt)),null===e.seg)return null===t.seg;if(null===t.seg)return!1;const s=e.seg.getGeometryType();if(s!==t.seg.getGeometryType())return!1;if(s===D.enumBezier){const s=e.seg,n=t.seg;let i=s.getControlPoint1(),r=s.getControlPoint2();-1===e.dir&&(r=te(i,i=r));let h=n.getControlPoint1(),a=n.getControlPoint2();return-1===t.dir&&(a=te(h,h=a)),i.equals(h)&&r.equals(a)}if(s===D.enumRationalBezier2){const s=e.seg,n=t.seg,i=s.getControlPoint1(),r=n.getControlPoint1();if(!i.equals(r))return!1;const h=[0,0,0];s.queryWeights(h),-1===e.dir&&(h[2]=te(h[0],h[0]=h[2]));const a=[0,0,0];return n.queryWeights(a),-1===t.dir&&(a[2]=te(a[0],a[0]=a[2])),h[0]===a[0]&&h[1]===a[1]&&h[2]===a[2]}O("")}function Zt(e,t){if(null===e.seg||null===t.seg)return null!==e.seg?-1:null!==t.seg?1:0;const s=e.seg.getGeometryType(),n=t.seg.getGeometryType();return s<n?-1:s>n?1:0}function Jt(e,t){const s=e.otherPt.compare(t.otherPt);return 0!==s?s:Zt(e,t)}export{Rt as C,Oe as I,be as N,dt as P,Ue as a,Vt as b,Gt as c,Yt as d,Ot as e,At as f,Qe as g,qt as h,Be as i,Lt as j,zt as k,Xe as l,Te as m,St as n,Ht as o,Tt as p,De as q,Ve as r,Dt as s,Fe as t,ke as u,xt as v};