https://arcgisportal.sipoo.fi/portal/apps/storymaps/_next/static/chunks/2cf070c9.7a3ba68449e212a0.js
1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[20185],{592368:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval(__webpack_require__.ts('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ $: () => (/* binding */ rs),\n/* harmony export */ A: () => (/* binding */ zu),\n/* harmony export */ B: () => (/* binding */ Iu),\n/* harmony export */ C: () => (/* binding */ Ar),\n/* harmony export */ D: () => (/* binding */ Zh),\n/* harmony export */ E: () => (/* binding */ yr),\n/* harmony export */ F: () => (/* binding */ au),\n/* harmony export */ H: () => (/* binding */ Gs),\n/* harmony export */ I: () => (/* binding */ Rs),\n/* harmony export */ J: () => (/* binding */ zs),\n/* harmony export */ K: () => (/* binding */ Ks),\n/* harmony export */ L: () => (/* binding */ fm),\n/* harmony export */ M: () => (/* binding */ De),\n/* harmony export */ N: () => (/* binding */ Gh),\n/* harmony export */ O: () =>
1 (/* binding */ jh),\n/* harmony export */ P: () => (/* binding */ mr),\n/* harmony export */ Q: () => (/* binding */ om),\n/* harmony export */ R: () => (/* binding */ Be),\n/* harmony export */ S: () => (/* binding */ Pm),\n/* harmony export */ T: () => (/* binding */ Dn),\n/* harmony export */ U: () => (/* binding */ Ph),\n/* harmony export */ V: () => (/* binding */ Wu),\n/* harmony export */ W: () => (/* binding */ ms),\n/* harmony export */ X: () => (/* binding */ fr),\n/* harmony export */ Y: () => (/* binding */ am),\n/* harmony export */ Z: () => (/* binding */ mm),\n/* harmony export */ _: () => (/* binding */ Ne),\n/* harmony export */ a: () => (/* binding */ Qs),\n/* harmony export */ a0: () => (/* binding */ Es),\n/* harmony export */ a1: () => (/* binding */ hm),\n/* harmony export */ a2: () => (/* binding */ um),\n/* harmony export */ a3: () => (/* binding */ dm),\n/* harmony export */ a4: () => (/* binding */ Nh),\n/* harmony export */ a5: () => (/* binding */ qe),\n/* harmony export */ a6: () => (/* binding */ gu),\n/* harmony export */ a7: () => (/* binding */ Pr),\n/* harmony export */ a8: () => (/* binding */ Ih),\n/* harmony export */ a9: () => (/* binding */ pe),\n/* harmony export */ b: () => (/* binding */ Th),\n/* harmony export */ c: () => (/* binding */ $s),\n/* harmony export */ d: () => (/* binding */ Bh),\n/* harmony export */ e: () => (/* binding */ Er),\n/* harmony export */ f: () => (/* binding */ xr),\n/* harmony export */ g: () => (/* binding */ gs),\n/* harmony export */ i: () => (/* binding */ br),\n/* harmony export */ l: () => (/* binding */ qh),\n/* harmony export */ n: () => (/* binding */ gr),\n/* harmony export */ s: () => (/* binding */ fe),\n/* harmony export */ x: () => (/* binding */ Kn),\n/* harmony export */ y: () => (/* binding */ ra),\n/* harmony export */ z: () => (/* binding */ Ru)\n/* harmony export */ });\n/* unused harmony exports G, h, j, k, m, o, p, q, r, t, u, v, w */\n/* harmony import */ var _Geometry_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(791684);\n/* harmony import */ var _Envelope_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(331552);\n/* harmony import */ var _Point2D_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(614320);\n/* harmony import */ var _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(297314);\n/* harmony import */ var _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(768763);\n/* harmony import */ var _GeometryCursor_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(38122);\n/* COPYRIGHT Esri - https://js.arcgis.com/5.0.17/LICENSE.txt */\nclass de{constructor(){this.posStream=null,this.streams=null}get(t){return t>0?this.streams[t-1]:this.posStream}set(t,e){t>0?this.streams[t-1]=e:this.posStream=e}destroyAndSetSize(t){if(this.streams=null,t>1){this.streams=new Array(t-1);for(let e=0;e<t-1;++e)this.streams[e]=null}this.posStream=null}swap(t){[this.streams,t.streams]=[t.streams,this.streams],[this.posStream,t.posStream]=[t.posStream,this.posStream]}empty(){return null===this.posStream&&null===this.streams}}function _e(t,s,n,i,r){(s<0||n<0||i<1||s+i*(n-1)+1>t.size())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Index out of bound");for(let e=s,o=s+i*(n-1)+1;e<o;e+=i)t.writeAsDbl(e,r(t.readAsDbl(e)))}function pe(t,e,s){if(t)for(let n=e.length-1;n>=0;--n)s(e[n]);else e.forEach(s)}function fe(t,e){let s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.B)(t);const n=e.length/(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)();for(let i=0;i<e.length;++i){const t=Math.trunc(s*n);s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.B)(s);const i=Math.trunc(s*n),r=e[t];e[t]=e[i],e[i]=r}}function Pe(t,e,s){if(0===t.length)return;let n=0,i=0;for(++i;i!==t.length;++i)e(t[n],t[i])||(s(n,i),n=i);s(n,i)}function ye(t,e,s,n,i){et(t,e,n-e,(t,e)=>i(t,e)?-1:1)}function xe(t,e,s){if(!(s<=e))for(;e<s;)t[s]=st(t[e],t[e]=t[s]),e++,s--}function Ce(t,e,s,n){xe(t,e,s-1),xe(t,s,n-1),t.reverse()}function ve(t,e,s){const n=t.getDescription().getTotalComponentCount();t.setX(e[0]),t.setY(e[1]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(t.getAttributeArray(),e,0,2,n-2)}var be=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;const Se="can not assign an empty point to a vertex";class Ee{constructor(t){if(this.m_accelerators=null,void 0!==t&&t.move)this.m_description=t.move.m_description,t.move.m_description=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)(),this.m_vertexAttributes=t.move.m_vertexAttributes,t.move.m_vertexAttributes=new de,this.m_envelopeData=t.move.m_envelopeData,t.move.m_envelopeData=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.m,this.m_pointCount=t.move.m_pointCount,this.m_reservedPointCount=t.move.m_reservedPointCount,this.m_flags=t.move.m_flags,this.m_bFillRule=t.move.m_bFillRule,this.m_bPathStarted=t.move.m_bPathStarted,this.m_bPolygon=t.move.m_bPolygon,this.m_simpleTolerance=t.move.m_simpleTolerance;else{const e=void 0!==t&&t.vd?t.vd:(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)();this.m_description=e,this.m_vertexAttributes=new de,this.m_envelopeData=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.m,this.m_pointCount=0,this.m_reservedPointCount=-1,this.m_flags=4063,this.m_bFillRule=this.m_bPathStarted=this.m_bPolygon=!1,this.m_simpleTolerance=0,void 0!==t&&t.copy&&t.copy.copyTo(this)}}equalsBase(e,s){if(!(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.i)(e.getGeometryType()))return!1;const n=e;if(this===n)return!0;
1if(!this.m_description.equals(n.getDescription()))return!1;if(this.isEmptyImpl()!==n.isEmptyImpl())return!1;if(this.isEmptyImpl())return!0;const i=this.getPointCount();if(i!==n.getPointCount())return!1;for(let t=0;t<this.m_description.getAttributeCount();t++){const e=this.m_description.getSemantics(t),r=this.getAttributeStreamRef(e),o=n.getAttributeStreamRef(e),a=be.getComponentCount(e);if(!r.equals(o,0,i*a,s))return!1}if(s){if(!this.equalsImplTol(e,s))return!1}else if(!this.equalsImpl(e))return!1;return!0}transformAttribute(t,s,n,i,r){if(this.addAttribute(t),!this.isEmpty()&&(0!==n||1!==i)){if(0===t){const t=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;return 0===r?0===s?(t.setShiftCoords(n,0),t.scale(i,1)):1===s?(t.setShiftCoords(0,n),t.scale(1,i)):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""):0===s?(t.setScaleCoords(1/i,1),t.shiftCoords(-n,0)):1===s?(t.setScaleCoords(1,1/i),t.shiftCoords(0,-n)):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),void this.applyTransformation(t)}_e(this.getAttributeStreamRef(t),s,this.getPointCount(),be.getComponentCount(t),(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.x)(n,i,r)),this.notifyModified()}}getDescription(){return this.m_description}assignVertexDescription(t){this.m_description!==t&&this.assignVertexDescriptionImpl(t)}mergeVertexDescriptionImpl(t){const e=this.getDescription(),s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.n)(e,t);this.assignVertexDescription(s)}mergeVertexDescription(t){this.m_description!==t&&(this.m_description.hasAttributesFrom(t)||this.mergeVertexDescriptionImpl(t))}hasAttribute(t){return this.m_description.hasAttribute(t)}addAttribute(t){if(this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.o)(this.m_description,t);this.assignVertexDescription(e)}dropAttribute(t){if(!this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.r)(this.m_description,t);this.assignVertexDescription(e)}dropAllAttributes(){const t=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)();t!==this.m_description&&this.assignVertexDescription(t)}getAttributeStreamRef(t){this.throwIfEmpty(),this.m_description.hasAttribute(t)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("AttributeStream : Geometry does not have the attribute");const s=this.m_description.getAttributeIndex(t);return this.m_vertexAttributes.get(s)}setAttributeStreamRef(t,s){s||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("stream"),s&&be.getPersistence(t)!==s.getPersistence()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.addAttribute(t);const n=this.m_description.getAttributeIndex(t);this.m_vertexAttributes.empty()&&this.m_vertexAttributes.destroyAndSetSize(this.m_description.getAttributeCount()),this.m_vertexAttributes.set(n,s),this.notifyModifiedFlags(2001)}notifyModifiedFlags(t){65535===t&&(this.m_reservedPointCount=-1,this.notifyModifiedAllImpl()),this.setDirtyFlagProtected(t,!0),this.clearAccelerators(),32&t&&this.verifyAllStreamsAfterSizeChange()}notifyModified(){this.notifyModifiedFlags(2001)}getPointCount(){return this.m_pointCount}getPointByVal(t,e){const s=e;s.assignVertexDescription(this.m_description);for(let n=0;n<this.m_description.getAttributeCount();n++){const e=this.m_description.getSemantics(n);for(let i=0,r=be.getComponentCount(e);i<r;i++){const o=this.m_vertexAttributes.get(n).readAsDbl(r*t+i);s.setAttributeBasic(e,i,o)}}}setPointByValNoCurves(t,s){const n=s;n.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(Se);const i=n.getDescription();i!==this.m_description&&this.mergeVertexDescription(i);const r=this.m_vertexAttributes.get(0);r.write(2*t,n.getX()),r.write(2*t+1,n.getY());for(let e=1,o=this.m_description.getAttributeCount();e<o;e++){const s=this.m_description.getSemantics(e),i=be.getComponentCount(s);for(let r=0;r<i;r++){const o=n.getAttributeAsDbl(s,r);this.m_vertexAttributes.get(e).writeAsDbl(t*i+r,o)}}this.notifyModifiedFlags(2001)}setPointByValFromArrayNoCurves(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getPointByValAsArray(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}isEmpty(){return this.isEmptyImpl()}isEmptyImpl(){return 0===this.m_pointCount}getAttributeAsDbl(t,e,s){const i=be.getComponentCount(t);s>=i&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const r=this.m_description.getAttributeIndex(t);return r>=0?this.m_vertexAttributes.get(r).readAsDbl(e*i+s):be.getDefaultValue(t)}queryAttributeAsDbl(t,e,s,i){const r=be.getComponentCount(t);i<r&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const o=this.m_description.getAttributeIndex(t);if(o>=0){const t=e*r,n=this.m_vertexAttributes.get(o);for(let e=0;e<r;e++)s[e]=n.readAsDbl(t+e)}else{const e=be.getDefaultValue(t);for(let t=0;t<r;t++)s[t]=e}}getAttributeAsInt(t,e,s){return Math.trunc(this.getAttributeAsDbl(t,e,s))}queryAttributeAsInt(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setAttributeNoCurves(t,e,s,i){const r=be.getComponentCount(t);s>=r&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.addAttribute(t);const o=this.m_description.getAttributeIndex(t);this.notifyModifiedFlags(2001),this.m_vertexAttributes.get(o).writeAsDbl(e*r+s,i)}setAttributeFromArrayNoCurves(t,e,s,i){(e<0||e>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const r=be.getComponentCount(t);i<r&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.addAttribute(t);const o=this.m_description.getAttributeIndex(t);this.notifyModifiedFlags(2001);const a=this.m_vertexAttributes.get(o);for(let n=0;n<r;++n)a.writeAsDbl(e*r+n,s[n])}getXY(t){return this.m_vertexAttributes.get(0).readPoint2D(2*t)}queryXY(t,e){return this.m_vertexAttributes.get(0).queryPoint2D(2*t,e)}
1setXYNoCurves(t,e){this.m_vertexAttributes.get(0).writePoint2D(2*t,e),this.notifyModifiedFlags(2001)}setXYCoordsNoCurves(t,e,s){const n=this.m_vertexAttributes.get(0);n.write(2*t,e),n.write(2*t+1,s),this.notifyModifiedFlags(2001)}getXYZ(t){const e=this.m_vertexAttributes.get(0),s=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f.getNAN();return s.x=e.read(2*t),s.y=e.read(2*t+1),this.m_description.hasAttribute(1)?s.z=this.m_vertexAttributes.get(1).read(t):s.z=be.getDefaultValue(1),s}setXYZNoCurves(t,e){this.addAttribute(1),this.notifyModifiedFlags(2001);const s=this.m_vertexAttributes.get(0);s.write(2*t,e.x),s.write(2*t+1,e.y);this.m_vertexAttributes.get(1).write(t,e.z)}queryEnvelope(t){t instanceof _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D||t instanceof _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.p?this.updateEnvelope(t):(this.updateAllDirtyIntervals(!0),this.m_envelopeData.copyTo(this.m_description,t))}queryLooseEnvelope(t){this.updateLooseEnvelope(t)}queryInterval(t,e){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();return this.isEmptyImpl()||(this.updateAllDirtyIntervals(!0),this.m_envelopeData.queryInterval(this.m_description,t,e,s)),s}setAttributeBasic(t,e,s){this.setAttributeImpl(t,e,s)}setAttributeImpl(t,e,s){if(this.addAttribute(t),this.isEmpty())return;let n=!1;const i=be.getComponentCount(t),r=this.getAttributeStreamRef(t),o=Number.isNaN(s);if(1===r.getPersistence()){const t=r;for(let r=e,a=this.m_pointCount*i;r<a;r+=i){const e=t.read(r);(o||e===s)&&Number.isNaN(e)||(t.write(r,s),n=!0)}}else for(let a=e,h=this.m_pointCount*i;a<h;a+=i){r.readAsDbl(a)!==s&&(r.writeAsDbl(a,s),n=!0)}n&&this.notifyModifiedFlags(2001)}replaceNaNs(t,e){if(this.addAttribute(t),this.isEmpty())return;let s=!1;const n=be.getComponentCount(t),i=this.getAttributeStreamRef(t);for(let r=0;r<n;r++)if(1===i.getPersistence()){const t=i;for(let i=0,r=this.m_pointCount*n;i<r;i++){const n=t.read(i);Number.isNaN(n)&&(t.write(i,e),s=!0)}}else for(let t=0,o=this.m_pointCount*n;t<o;t++){const n=i.readAsDbl(t);Number.isNaN(n)&&(i.writeAsDbl(t,e),s=!0)}s&&this.notifyModifiedFlags(2001)}calculateLength3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}setEnvelopeForImport(t){this.m_description.equals(t.getDescription())||
1(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.m_envelopeData=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.m({moveEnv:t}),this.setDirtyFlagProtected(192,!1)}copyTo(t){t.getGeometryType()!==this.getGeometryType()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this!==t&&this.copyToUnchecked(t,!1)}queryCoordinates(t,s,n,i){let r=i<0?this.m_pointCount:i;if(r=Math.min(r,n+s),(n<0||r<n||this.m_pointCount>0&&n>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),0===this.m_pointCount)return r;const o=this.getAttributeStreamRef(0);for(let e=2*n,a=2*r,h=0;e<a;e+=2,h++)o.queryPoint2D(e,t[h]);return r}queryCoordinates3D(t,s,n,i){let r=i<0?this.m_pointCount:i;if(r=Math.min(r,n+s),(n<0||r<n||this.m_pointCount>0&&n>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),0===this.m_pointCount)return r;const o=this.getAttributeStreamRef(0);let a=null;const h=be.getDefaultValue(1),u=this.m_description.hasAttribute(1);u&&(a=this.getAttributeStreamRef(1));let m=0;for(let e=n;e<r;e++,m++)t[m].x=o.read(2*e),t[m].y=o.read(2*e+1),t[m].z=u?a.read(e):h;return r}clearAndSetDirtyFlagProtected(t,e){let s=0;const n=t&~e,i=e|n;s=this.m_flags,(s&i)!==e&&(this.m_flags=s&~n|e)}getIsSimple(t,e){e[0]=0;let s=-1;const n=this.m_flags,i=this.m_simpleTolerance;if(!(1&n)){s=(14&n)>>1,e[0]=i,i<t&&(s=-1)}return s}setIsSimple(t,e,n=!1){if(2===t?(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline):1===t?(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint||this.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline):3===t&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon),-1===t)this.setDirtyFlagProtected(17,!0);else{let s=t<<1;n||(s|=16);const i=31;this.clearAndSetDirtyFlagProtected(i,s),this.m_simpleTolerance!==e&&(this.m_simpleTolerance=e)}}attributeStreamIsAllocated(t){this.throwIfEmpty();const e=this.m_description.getAttributeIndex(t);return e>=0&&null!==this.m_vertexAttributes.get(e)}capacity(){return-1===this.m_reservedPointCount&&0===this.m_pointCount?0:this.m_reservedPointCount}getDescriptionImpl(){return this.m_description}copyToUnchecked(t,e=!1){e&&this.hasDirtyFlag(32)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.s)("Cannot do shallow clone on unprepared geometry");const n=t,o=this.getGeometryType(),a=n.getGeometryType();(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(o===a||o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon&&a===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline,"failure in copyToUnchcked"),n.clearAccelerators(),n.m_description=this.m_description,n.m_vertexAttributes.destroyAndSetSize(0),n.m_envelopeData.releaseAttributes();const h=this.m_description.getAttributeCount(),u=new de;if(!this.m_vertexAttributes.empty()){u.destroyAndSetSize(h);for(let t=0;t<h;t++)if(this.m_vertexAttributes.get(t))if(e)u.set(t,this.m_vertexAttributes.get(t));else{const e=be.getComponentCount(this.m_description.getSemantics(t));u.set(t,this.m_vertexAttributes.get(t).restrictedClone(this.getPointCount()*e))}}if(this.m_envelopeData.copyToIfNotNull(this.m_description,n.m_envelopeData),n.m_flags=this.m_flags,n.m_simpleTolerance=this.m_simpleTolerance,o!==a){const t=[Number.NaN];n.getIsSimple(0,t)>=3?n.setIsSimple(1,t[0]):n.setIsSimple(-1,0)}n.m_vertexAttributes.swap(u),u.destroyAndSetSize(0),n.m_pointCount=this.m_pointCount,n.hasDirtyFlag(32)||n.m_vertexAttributes.empty()?((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!e||0===n.m_pointCount),n.m_reservedPointCount=-1):n.m_reservedPointCount=n.m_pointCount;try{this.copyToImpl(n,e)}catch(m){throw n.setEmpty(),m}n.verifyAllStreamsAfterSizeChange()}buildRasterizedGeometryAccelerator(t,e){return!1}getAccelerators(){return this.m_accelerators}clearAccelerators(){this.m_accelerators&&this.m_accelerators.release(),this.m_accelerators=null}ensureUniqueAccelerators(){if(this.m_accelerators&&!this.m_accelerators.uniqueUse()){const t=this.m_accelerators.clone();this.m_accelerators.release(),this.m_accelerators=t}}interpolateTwoVertices(t,e,i,r){(t<0||t>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),(e<0||e>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),r.assignVertexDescription(this.m_description);const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(be.maxComponentCount(),Number.NaN),a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(be.maxComponentCount(),Number.NaN),h=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)();let u=0;for(let n=0;n<this.m_description.getAttributeCount();n++){const r=this.m_description.getSemantics(n),m=be.getInterpolation(r),l=be.getComponentCount(r),c=be.getDefaultValue(r);this.queryAttributeAsDbl(r,t,o,l),this.queryAttributeAsDbl(r,e,a,l),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(u+l<=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.O),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.A)(m,o,a,h,u,l,i,c),u+=l}ve(r,h)}getShortestDistance(t,e){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getXY(t),this.getXY(e))}getShortestSqrDistance(t,e){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(this.getXY(t),this.getXY(e))}resizeImpl(t){if(t<0&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(),(t=Math.ceil(t))===this.m_pointCount)return;this.m_pointCount=t;const s=this.m_pointCount<=this.m_reservedPointCount?2001:4095;this.notifyModifiedFlags(s)}assignVertexDescriptionImpl(t){if(!this.m_vertexAttributes.empty()){const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.t)();(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.u)(t,this.m_description,e);const s=new de;s.destroyAndSetSize(t.getAttributeCount());for(let n=0;n<t.getAttributeCount();
1n++){const t=e[n];-1!==t?s.set(n,this.m_vertexAttributes.get(t)):this.m_reservedPointCount=-1}s.swap(this.m_vertexAttributes)}this.m_description=t,this.m_envelopeData.releaseAttributes(),this.notifyModifiedFlags(4095)}hasDirtyFlag(t){return 0!==(this.m_flags&t)}setDirtyFlagProtected(t,e){e?this.m_flags|=t:this.m_flags&=~t}notifyModifiedAllImpl(){}verifyAllStreamsAfterSizeChange(){this.hasDirtyFlag(32)&&this.verifyAllStreamsAfterSizeChangeImpl()}verifyAllStreamsAfterSizeChangeImpl(){if(this.hasDirtyFlag(32)){if(this.m_reservedPointCount<this.m_pointCount){this.m_vertexAttributes.empty()&&this.m_vertexAttributes.destroyAndSetSize(this.m_description.getAttributeCount()),this.m_reservedPointCount=-1;let t=Number.MAX_SAFE_INTEGER,e=0;e=this.m_pointCount<4?3:this.m_pointCount<=128?2*this.m_pointCount:Math.trunc((4*this.m_pointCount+2)/3);for(let s=0;s<this.m_description.getAttributeCount();s++){const n=this.m_description.getSemantics(s);let i=0;if(null!==this.m_vertexAttributes.get(s)){const t=be.getComponentCount(n);i=this.m_vertexAttributes.get(s).size()/t,i<this.m_pointCount&&(this.m_vertexAttributes.get(s).resize(e*t,be.getDefaultValue(n)),i=e)}else this.m_vertexAttributes.set(s,(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.v)(n,e)),i=e;i<t&&(t=i)}this.m_reservedPointCount=t}this.verifyStreamsAfterSizeChangeExtraImpl(),this.setDirtyFlagProtected(32,!1)}}verifyStreamsAfterSizeChangeExtraImpl(){}updateAllDirtyIntervals(t){if(t?this.hasDirtyFlag(192):this.hasDirtyFlag(128)){if(this.isEmpty())return this.hasDirtyFlag(192)&&this.m_envelopeData.setEmpty(this.m_description),void this.setDirtyFlagProtected(192,!1);const e=this.updateXYImpl(t),s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.E({vd:this.m_description});s.setEnvelope(e);for(let t=1;t<this.m_description.getAttributeCount();t++){const e=this.m_description.getSemantics(t),n=be.getComponentCount(e),i=this.m_vertexAttributes.get(t);for(let t=0;t<n;t++){const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;r.setEmpty();for(let e=0;e<this.m_pointCount;e++){const s=i.readAsDbl(e*n+t);r.mergeCoordinate(s)}s.setIntervalEnvelope(e,t,r)}}(t?this.hasDirtyFlag(192):this.hasDirtyFlag(128))&&(this.m_envelopeData=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.m({moveEnv:s}),this.clearDirtyIntervalsFlag(t))}}updateXYImpl(t){const e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty(),s=this.m_vertexAttributes.get(0);return e.mergePointsInterleaved(s,0,this.m_pointCount),e}updateEnvelope3D(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}updateLooseEnvelope(t){this.updateAllDirtyIntervals(!1),t instanceof _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D?t.assign(this.m_envelopeData.m_envelope2D):this.m_envelopeData.queryEnvelope3D(this.m_description,t)}updateEnvelope(t){this.updateAllDirtyIntervals(!0),t.assign(this.m_envelopeData.m_envelope2D)}setEmptyImpl(){this.m_pointCount=0,this.m_reservedPointCount=-1,this.m_vertexAttributes.destroyAndSetSize(0),this.notifyModifiedFlags(4095)}clearDirtyIntervalsFlag(t){this.setDirtyFlagProtected(192,!1)}reserveImpl(t,s){if(t<0&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),0===t)return;let n=t=Math.ceil(t);if(this.m_reservedPointCount<n){this.m_vertexAttributes.empty()&&this.m_vertexAttributes.destroyAndSetSize(this.m_description.getAttributeCount()),s?(null===this.m_vertexAttributes.get(0)&&this.m_vertexAttributes.set(0,(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.w)(0,0)),this.m_vertexAttributes.get(0).resizeRounded(2*n),n=this.m_vertexAttributes.get(0).size()>>1):null===this.m_vertexAttributes.get(0)?this.m_vertexAttributes.set(0,(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.w)(0,n)):this.m_vertexAttributes.get(0).resize(2*n);for(let t=1;t<this.m_description.getAttributeCount();t++){const e=this.m_description.getSemantics(t),s=be.getComponentCount(e);null!==this.m_vertexAttributes.get(t)?this.m_vertexAttributes.get(t).resize(n*s):this.m_vertexAttributes.set(t,(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.w)(e,n))}this.reserveImplImpl(n,s),this.m_reservedPointCount=n}}reserveRounded(t){t<0&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(),t=Math.ceil(t),this.reserveImpl(t,!0)}reserveImplImpl(t,e){}throwIfEmpty(){this.isEmptyImpl()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.u)("")}exportVertexAttributes(){const t=this.getPointCount(),e=this.m_description.getAttributeIndex(1),s=this.m_description.getAttributeIndex(2),n=this.m_vertexAttributes.posStream,i=e>0?this.m_vertexAttributes.get(e):void 0,r=s>0?this.m_vertexAttributes.get(s):void 0,o=n?.getArray()??new Float64Array,a=i?.getArray(),h=r?.getArray();return{vertexCount:t,vertexXY:o,vertexZ:a,vertexM:h}}}
vendor: 6,317 bytes, line 1
1class De extends Ee{constructor(t){super(t),t&&(t.points?this.addPoints2D(t.points,t.pointsSize,0,-1):t.point&&this.add(t.point))}assignCopy(t){return t.copyTo(this),this}assignMove(t){return t.copyTo(this),t.setEmpty(),this}insertPoint2D(t,s){t>this.getPointCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("invalid point index"),t<0&&(t=this.getPointCount());const n=this.m_pointCount;this.resizeNoInit(this.m_pointCount+1);for(let e=0,i=this.m_description.getAttributeCount();e<i;e++){const i=this.m_description.getSemantics(e),r=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(i);if(0===i)this.m_vertexAttributes.get(e).insert(r*t,s,r*n);else{const s=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(i);this.m_vertexAttributes.get(e).insertRange(r*t,s,r,r*n)}}this.notifyModifiedFlags(2001)}insertPoint(t,s){s.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(Se),t<0&&(t=this.getPointCount()),this.mergeVertexDescription(s.getDescription());const n=this.m_pointCount;this.resizeNoInit(this.m_pointCount+1);for(let e=0,i=this.m_description.getAttributeCount();e<i;e++){const i=this.m_description.getSemantics(e),r=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(i);if(s.hasAttribute(i))this.m_vertexAttributes.get(e).insertAttributes(r*t,s,i,r*n);else{const s=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(i);this.m_vertexAttributes.get(e).insertRange(r*t,s,r,r*n)}}this.notifyModifiedFlags(2001)}insertPoints(t,e,s){if((t>this.getPointCount()||s<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),t<0&&(t=this.getPointCount()),0===s)return;const i=e[0].getDescription();this.mergeVertexDescription(i);const r=this.m_pointCount;this.resizeNoInit(this.m_pointCount+s);for(let n=0,o=this.m_description.getAttributeCount();n<o;n++){const o=this.m_description.getSemantics(n),a=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(o);if(this.m_vertexAttributes.get(n))if(i.hasAttribute(o))this.m_vertexAttributes.get(n).insertAttributesFromPoints(t*a,e,s,o,r*a);else{const e=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(o);this.m_vertexAttributes.get(n).insertRange(a*t,e,a*s,a*r)}}this.notifyModifiedFlags(2001)}insertPoints2D(t,s,n){if((t>this.getPointCount()||n<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("invalid point index"),t<0&&(t=this.getPointCount()),0===n)return;const i=this.m_pointCount;this.resizeNoInit(this.m_pointCount+n);for(let e=0,r=this.m_description.getAttributeCount();e<r;e++){const r=this.m_description.getSemantics(e),o=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(r);if(this.m_vertexAttributes.get(e))if(0===r)this.m_vertexAttributes.get(e).insertRangeFromPoints(o*t,s,0,n,!0,o*i);else{const s=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(r);this.m_vertexAttributes.get(e).insertRange(o*t,s,o,o*i)}}this.notifyModifiedFlags(2001)}removePoints(t,e){if((t<0||e<0||t+e>this.getPointCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("remove_points"),0!==e){for(let s=0,n=this.m_description.getAttributeCount();s<n;s++)if(this.m_vertexAttributes.get(s)){const n=this.m_description.getSemantics(s),i=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(n);this.m_vertexAttributes.get(s).eraseRange(i*t,i*e,i*this.m_pointCount)}this.m_pointCount-=e,this.m_reservedPointCount>0&&(this.m_reservedPointCount-=e),this.notifyModifiedFlags(2001)}}removePoint(t){for(let e=0,s=this.m_description.getAttributeCount();e<s;e++)if(this.m_vertexAttributes.get(e)){const s=this.m_description.getSemantics(e),n=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(s);this.m_vertexAttributes.get(e).eraseRange(n*t,n,n*this.m_pointCount)}this.m_pointCount--,this.m_reservedPointCount>0&&this.m_reservedPointCount--,this.notifyModifiedFlags(2001)}calculateEnvelope2D(){return this.updateXYImpl(!0)}resizeNoInit(t){this.resizeImpl(t)}resizeAndInitNonPositionAttributes(t){const e=this.m_pointCount;if(this.resizeImpl(t),this.m_pointCount>e)for(let s=1,n=this.m_description.getAttributeCount();s<n;s++){const t=this.m_description.getSemantics(s),n=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(t),i=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(t);this.m_vertexAttributes.get(s).insertRange(i*e,n,i*(this.m_pointCount-e),i*e)}}queryCoordinates3D(t,s,n,i){let r=i<0?this.m_pointCount:i;if(r=Math.min(r,n+s),(n<0||r<n||this.m_pointCount>0&&n>=this.m_pointCount)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),0===this.m_pointCount)return r;const o=this.getAttributeStreamRef(0);let a=null;const h=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(1),u=this.m_description.hasAttribute(1);u&&(a=this.getAttributeStreamRef(1));let m=0;for(let e=n;e<r;e++,m++)t[m].x=o.read(2*e),t[m].y=o.read(2*e+1),t[m].z=u?a.read(e):h;return r}queryAttributeAsInt(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}add(t){t.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(Se),this.resizeAndInitNonPositionAttributes(this.m_pointCount+1),this.setPointByValNoCurves(this.m_pointCount-1,t)}addXY(t,e){this.resizeAndInitNonPositionAttributes(this.m_pointCount+1);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t,e);this.setXYNoCurves(this.m_pointCount-1,s)}addXYZ(t,e,s){this.resizeAndInitNonPositionAttributes(this.m_pointCount+1);const n=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f;n.setCoords(t,e,s),this.setXYZNoCurves(this.m_pointCount-1,n)}addPoint2D(t){this.addXY(t.x,t.y)}addPoint3D(t){this.addXYZ(t.x,t.y,t.z)}addPoints(t,s,n){this===t&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_point_impl.add");const i=n<0?t.getPointCount():n;if((s<0||s>t.getPointCount()||i<s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),s===i)return;const r=t.getDescription();this.mergeVertexDescription(r);const o=i-s,a=this.m_pointCount;this.resizeNoInit(this.m_pointCount+o);for(let e=0,h=this.m_description.getAttributeCount();e<h;e++){const n=this.m_description.getSemantics(e),i=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getComponentCount(n),h=this.getAttributeStreamRef(n);if(r.hasAttribute(n)){const e=t.getAttributeStreamRef(n);h.insertRangeFromStream(a*i,e,s*i,o*i,!0,1,a*i)}else{const t=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V.getDefaultValue(n);h.insertRange(a*i,t,o*i,a*i)}}}
1addPoints2D(t,s,n,i){let r=s;const o=i<0?r:i;if((r<0||n<0||n>r||o<n)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),n===o)return;r=o-n;const a=this.m_pointCount;this.resizeAndInitNonPositionAttributes(this.m_pointCount+r);const h=this.getAttributeStreamRef(0);for(let e=0;e<r;++e)h.writePoint2D(2*(a+e),t[n+e]);this.notifyModifiedFlags(2001)}addPoints3D(t,s,n,i){let r=s;const o=i<0?r:i;if((r<0||n<0||n>r||o<n)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.addAttribute(1),n===o)return;r=o-n;const a=this.m_pointCount;this.resizeAndInitNonPositionAttributes(this.m_pointCount+r);const h=this.getAttributeStreamRef(0),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let e=0;e<r;e++)u.x=t[n+e].x,u.y=t[n+e].y,h.writePoint2D(2*(a+e),u);const m=this.getAttributeStreamRef(1);for(let e=0;e<r;e++)m.write(a+e,t[n+e].z);this.notifyModifiedFlags(2001)}setPointByVal(t,e){this.setPointByValNoCurves(t,e)}setXY(t,e){this.setXYNoCurves(t,e)}setXYCoords(t,e,s){this.setXYCoordsNoCurves(t,e,s)}setXYZ(t,e){this.setXYZNoCurves(t,e)}setAttribute(t,e,s,n){this.setAttributeNoCurves(t,e,s,n)}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint}getDimension(){return 0}createInstance(){return new De({vd:this.getDescription()})}setEmpty(){this.setEmptyImpl()}applyTransformation(t){if(this.isEmpty())return;if(t.isIdentity())return;const e=this.m_vertexAttributes.get(0);1===t.m_TransformationType?e.applyTransformation(t,0,this.m_pointCount):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d xform not impl"),this.notifyModifiedFlags(2001)}calculateArea2D(){return 0}calculateLength2D(){return 0}calculateLength3D(t){return 0}equals(t,e){return t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint&&this.equalsBase(t,e)}queryEnvelope(t){4===t.m_EnvelopeType?(this.updateAllDirtyIntervals(!0),this.m_envelopeData.copyTo(this.m_description,t)):2===t.m_EnvelopeType?this.updateEnvelope(t):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}getImpl(){return this}getBoundary(){return null}reserve(t){this.reserveImpl(t)}clone(){const t=this.createInstance();return this.copyTo(t),t}swap(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}buildQuadTreeAccelerator(t){return!1}getHashCodeImpl(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}equalsImpl(t){return!0}equalsImplTol(t,e){return!0}copyToImpl(t,e){}toFlatGeometry(){return{type:"multipoint",...this.exportVertexAttributes(),..._Envelope_js__WEBPACK_IMPORTED_MODULE_1__.y}}}De.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint;class we{constructor(){this.m_EnvelopeType=5,this.envAabb=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty(),this.envRot=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty()}static constructEmpty(){return new we}width(){return this.envAabb.width()}height(){return this.envAabb.height()}maxDim(){return Math.max(this.width(),this.height())}setEmpty(){this.envAabb.setEmpty(),this.envRot.setEmpty()}setCoords(t){this.envAabb.setCoords(t),this.envRot.setCoords({x:Ie(t),y:Me(t)})}setFromPoints(t,e){this.setEmpty(),this.mergePoints(t,e)}mergeNe(t){this.envAabb.mergeNe(t),this.envRot.mergeNeCoords(Ie(t),Me(t))}mergePoints(t,e){this.envAabb.mergePoints(t,e);for(let s=0;s<e;){if(!this.envRot.isEmpty()){for(let n=s;n<e;n++){const e=Ie(t[n]),s=Me(t[n]);this.envRot.mergeNeCoords(e,s)}break}{const e=Ie(t[s]),n=Me(t[s]);this.envRot.setCoords({x:e,y:n}),s++}}}isIntersectingPoint2D(t){return!(!this.envAabb.contains(t)||!this.envRot.containsCoords(Ie(t),Me(t)))}isIntersectingW(t){return this.envAabb.isIntersecting(t.envAabb)&&this.envRot.isIntersecting(t.envRot)}containsW(t){return!(!this.envAabb.containsEnvelope(t.envAabb)||!this.envRot.containsEnvelope(t.envRot))}containsPoint2D(t){return this.isIntersectingPoint2D(t)}intersectW(t){const e=this.envAabb.intersect(t.envAabb),s=this.envRot.intersect(t.envRot);return e&&!s&&this.envAabb.setEmpty(),s&&!e&&this.envRot.setEmpty(),e&&s}inflate(t){this.envAabb.inflateCoords(t,t);const e=t*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.D)();this.envRot.inflateCoords(e,e),e<0&&we.st_reduceEmpty(this)}static st_reduceEmpty(t){const e=t.envAabb.isEmpty(),s=t.envRot.isEmpty();e&&!s?t.envRot.setEmpty():s&&!e&&t.envAabb.setEmpty()}sqrMaxMinDistance(t){const e=this.envAabb.sqrMaxMinDistance(t),s=this.envRot.sqrMaxMinDistance(Ye(t))/2;return Math.max(e,s)}sqrMinDistance(t){const e=this.envAabb.sqrMinDistance(t),s=this.envRot.sqrMinDistance(Ye(t))/2;return Math.max(e,s)}sqrMaxDistance(t){const e=this.envAabb.sqrMaxDistance(t),s=this.envRot.sqrMaxDistance(Ye(t))/2;return Math.max(e,s)}getEnvelope2D(){return this.envAabb}getRotatedEnvelope2D(){return this.envRot}xyRot(t,e){const s=Ae(t.x,t.y),n=Te(t.x,t.y);e.setCoords(s,n)}}function Ae(t,e){return t-e}function Te(t,e){return t+e}function Ie(t){return t.x-t.y}function Me(t){return t.x+t.y}function Ye(t){return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(Ie(t),Me(t))}class Ne{constructor(){this.x=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.getNAN(),this.y=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.getNAN()}static getNAN(){return new Ne}static constructPoint2D(t){const e=new Ne;return e.x.set(t.x),e.y.set(t.y),e}static constructCoords(t,e){const s=new Ne;return s.x.set(t),s.y.set(e),s}static constructCoordsE(t,e){const s=new Ne;
vendor: 4,440 bytes, line 1
1return s.setCoordsE(t,e),s}get 0(){return this.x.clone()}set 0(t){this.x.setE(t)}get 1(){return this.y.clone()}set 1(t){this.y.setE(t)}clone(){return(new Ne).setE(this)}scaleThis(t){return this.x.mulThisE(t),this.y.mulThisE(t),this}setCoords(t,e){return this.x.set(t),this.y.set(e),this}setCoordsE(t,e){return this.x.setE(t),this.y.setE(e),this}set(t){return this.x.set(t.x),this.y.set(t.y),this}setE(t){return this.x.setE(t.x),this.y.setE(t.y),this}setWithEps(t,e){return this.x.setWithEps(t.x,e),this.y.setWithEps(t.y,e),this}getUnitVector(){const t=this.clone();return t.normalize(),t}sqrLength(){return this.x.sqr().addE(this.y.sqr())}length(){return this.sqrLength().sqrt()}mulE(t){const e=new Ne;return e.setCoordsE(this.x.mulE(t),this.y.mulE(t)),e}mul(t){const e=new Ne;return e.setCoordsE(this.x.mul(t),this.y.mul(t)),e}mulThis(t){return this.x.mulThis(t),this.y.mulThis(t),this}mulThisE(t){return this.x.mulThisE(t),this.y.mulThisE(t),this}divE(t){return this.clone().divThisE(t)}divThisE(t){return this.x.divThisE(t),this.y.divThisE(t),this}normalize(){const t=this.length();0===t.value()?(this.x=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.I.clone(),this.y=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.J.clone()):(this.x.divThisE(t),this.y.divThisE(t))}addE(t){return this.clone().addThisE(t)}addThisE(t){return this.x.addThisE(t.x),this.y.addThisE(t.y),this}subE(t){return this.clone().subThisE(t)}subThisE(t){return this.x.subThisE(t.x),this.y.subThisE(t.y),this}static distance(t,e){return t.subE(e).length()}negateThis(){return this.x.negateThis(),this.y.negateThis(),this}eq(t){return this.x.eq(t.x)&&this.y.eq(t.y)}isZero(){return this.x.isZero()&&this.y.isZero()}isTrueZero(){return!this.x.value()&&!this.y.value()}rotateDirect(t,e){const s=this.x.mulE(t).subThisE(this.y.mulE(e)),n=this.x.mulE(e).addThisE(this.y.mulE(t));return this.x.setE(s),this.y.setE(n),this}rotateReverse(t,e){const s=this.x.mulE(t).addThisE(this.y.mulE(e)),n=this.x.negate().mulThisE(e).addThisE(this.y.mulE(t));return this.x.setE(s),this.y.setE(n),this}dotProduct(t){return this.x.mulE(t.x).addE(this.y.mulE(t.y))}crossProduct(t){return this.x.mulE(t.y).subE(this.y.mulE(t.x))}value(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.construct(this.x.value(),this.y.value())}}class Xe{constructor(){this.a11=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1),this.a12=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0),this.a21=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0),this.a22=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1)}clone(){const t=new Xe;return t.a11.setE(this.a11),t.a12.setE(this.a12),t.a21.setE(this.a21),t.a22.setE(this.a22),t}assign(t){return this.a11.setE(t.a11),this.a12.setE(t.a12),this.a21.setE(t.a21),this.a22.setE(t.a22),this}mulThis(t){const e=this.a11.mulE(t.a11).addThisE(this.a12.mulE(t.a21)),s=this.a11.mulE(t.a12).addThisE(this.a12.mulE(t.a22)),n=this.a21.mulE(t.a11).addThisE(this.a22.mulE(t.a21)),i=this.a21.mulE(t.a12).addThisE(this.a22.mulE(t.a22));return this.a11=e,this.a12=s,this.a21=n,this.a22=i,this}mulLeftThis(t){const e=t.clone();return this.assign(e.mulThis(this)),this}det(){return this.a11.mulE(this.a22).subThisE(this.a12.mulE(this.a21))}invertThis(){const t=this.det();if(0!==t.value()){const e=this.a22.divE(t),s=this.a12.negate().divThisE(t),n=this.a21.negate().divThisE(t),i=this.a11.divE(t);this.a11=e,this.a12=s,this.a21=n,this.a22=i}else this.setZero();return!t.isZero()}transposeThis(){return this.a21=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.a12,this.a12=this.a21),this}eigenSymmetric(t,e){const s=this.a12.clone();s.addThisE(this.a21),s.mulThisByPower2(.5);let n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0);if(s.isZero())t[0].setE(this.a11),t[1].setE(this.a22);else{const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1);if(this.a11.ne(this.a22)){const r=this.a11.subE(this.a22).divE(s);r.mulThisByPower2(.5);const o=r.sqr();e.setE(r),e.absThis(),e.subThisE(o.add(1).sqrtThis()),r.gt(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.J)&&e.negateThis();const a=e.sqr().addThis(1).sqrtThis().invThis();i=e.mulE(a),n.setE(a);const h=e.mulE(s);t[0]=this.a11.addE(h),t[1]=this.a22.subE(h)}else n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1/Math.sqrt(2)),i=n.clone(),t[0]=this.a11.addE(s),t[1]=this.a22.subE(s)}e[0].x=n.toDouble(),e[0].y=i.toDouble(),e[1].x=i.negate().toDouble(),e[1].y=n.toDouble(),Math.abs(t[0].toDouble())>
1Math.abs(t[1].toDouble())&&(t[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t[0],t[0]=t[1]),e[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[0],e[0]=e[1]))}setZero(){this.a11.set(0),this.a21.set(0),this.a12.set(0),this.a22.set(0)}}class qe{static constructPoint2D(t){return new qe(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(t.x),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(t.y))}constructor(t,e){if(void 0===t)return this.x=(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M).setNAN(),void(this.y=(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M).setNAN());this.x=t.clone(),this.y=e.clone()}assignPoint2D(t){return this.x.setDouble(t.x),this.y.setDouble(t.y),this}setCoords(t,e){return this.x.setThis(t),this.y.setThis(e),this}asPoint2D(){return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(this.x.value(),this.y.value())}crossProduct(t){return this.x.mul(t.y).sub(this.y.mul(t.x))}leftPerpendicularThis(){const t=this.x.clone();this.x=this.y.clone().negate(),this.y=t}clone(){return new qe(this.x,this.y)}dotProduct(t){return this.x.mul(t.x).add(this.y.mul(t.y))}add(t){return new qe(this.x.add(t.x),this.y.add(t.y))}sub(t){return new qe(this.x.sub(t.x),this.y.sub(t.y))}sqrLength(){return this.x.sqr().addThis(this.y.sqr())}mulThis(t){return this.x.mulThis(t),this.y.mulThis(t),this}mul(t){return this.clone().mulThis(t)}subThis(t){return this.x.subThis(t.x),this.y.subThis(t.y),this}addThis(t){return this.x.addThis(t.x),this.y.addThis(t.y),this}}var Fe=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;function Ve(t){let e=!1;for(let s=0;s<2;s++){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[3][s]);n>0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])<0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[3][s])<0&&(t[1][s]=t[3][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[2][s])<0&&(t[2][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[2][s],t[3][s])<0&&(t[2][s]=t[3][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])<0&&(t[2][s]=t[1][s],e=!0)):n<0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])>0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[3][s])>0&&(t[1][s]=t[3][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[2][s])>0&&(t[2][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[2][s],t[3][s])>0&&(t[2][s]=t[3][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])>0&&(t[2][s]=t[1][s],e=!0)):t[1][s]===t[0][s]&&t[2][s]===t[0][s]||(t[1][s]=t[0][s],t[2][s]=t[0][s],e=!0)}return e}function Le(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0].y,t[1].y),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1].y,t[2].y),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[2].y,t[3].y);if(e>=0&&s>=0&&n>=0||e<=0&&s<=0&&n<=0){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0].x,t[1].x),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1].x,t[2].x),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[2].x,t[3].x);if(e>=0&&s>=0&&n>=0||e<=0&&s<=0&&n<=0)return!0}return!1}function Re(t,e){const s=t.getStartXY();if(s.equals(e.getStartXY()))return!0;if(s.equals(e.getEndXY()))return!0;const n=t.getEndXY();return!!n.equals(e.getStartXY())||!!n.equals(e.getEndXY())}function ze(t,e){let s=t.calculateLowerLength2D();return!(s>e)&&(!!t.isLine()||(s=t.calculateUpperLength2D(),s<=e||0!==e&&t.calculateLength2D()<=e))}function Be(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);let r=t.queryControlPointsHelper(n);const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);let a=e.queryControlPointsHelper(o);n[0].equals(o[0])||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.w)("");const h=t.getGeometryType();if(h===e.getGeometryType()&&n.map((t,e)=>o[e].equals(t)).reduce((t,e)=>t&&e)){if(h!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2)return 0;{const s=e,n=[0,0,0],i=[0,0,0];if(t.queryWeights(n),s.queryWeights(i),n.map((t,e)=>i[e]===t).reduce((t,e)=>t&&e))return 0}}for(;r>2&&n[1].equals(n[0]);)n.splice(1,1),r--;for(;a>2&&o[1].equals(o[0]);)o.splice(1,1),a--;(n[1].equals(n[0])||o[1].equals(n[0]))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.w)("");const m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.compareVectorsOrigin(n[0],n[1],o[1]);if(0===m){const s=qe.constructPoint2D(n[0]),i=new qe;t.queryCoord2DMP(1e-16,i),i.sub(s);const r=new qe;e.queryCoord2DMP(1e-16,r),r.sub(s);return r.crossProduct(i).sign()}return m}function ke(t,e,n,i,r,o,a,h){let u=t.calculateUpperLength2D(),m=e.calculateUpperLength2D(),l=t,c=e,g=!1;u>m&&(c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(l,l=c),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n,n=i),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(u,u=m),g=!0);const d=0===n;{a[0]=d?1:0;const t=l.getCoord2D(a[0]);h[0]=c.getClosestCoordinate(t,!1);const e=c.getCoord2D(h[0]);if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e)<=r){const e=[.5,.75,.25,.1,.9];let s=!0;for(let n=0;n<e.length;n++)if(t.assign(l.getCoord2D(e[n])),!c.isCloserThanDistance(t,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),r)){s=!1;break}if(s)return g&&(h[0]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a[0],a[0]=h[0])),1}}if(u<=3*r)return 0;let _=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(Math.max(r/u,.1),0,.5),p=.01*r,f=0,P=0,y=_,x=-1,C=0,v=1/32;for(let b=0;;b++){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(b<4095);const t=d?_:1-_,e=l.getCoord2D(t),n=c.getClosestCoordinate(e,!1);if(n===i)return C;const u=c.getCoord2D(n),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,u);if(0===b&&(x=m),m<=p?(v=.5,P=m,f=_):(y=_,x=m),Math.abs(P-x)>.1*p&&y-f>1e-16)_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(f,y,v);else{if(a[C]=t,h[C]=n,g&&(h[C]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a[C],a[C]=h[C])),1===o||1===C)return 1===C&&a[0]>a[1]&&(a[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a[0],a[0]=a[1]),h[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(h[0],h[0]=h[1])),C+1;C++,f=y,P=x,y=.8,x=-1,_=.8,v=1/32,p=10*r,b=0}}}function Ge(t,e,s,n,i,r,o,a,h){if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(s,0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n,0,1)){if(0===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getCoord2D(s),e.getCoord2D(n))){const h=1e-12,u=new Ne,m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)();if(t.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s,m),u),u.isTrueZero()){const e=1===s?-h:h;t.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s,m).add(e),u)}1===s&&u.negateThis();const l=new Ne;if(e.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(n,m),l),l.isTrueZero()){const t=1===s?-h:h;e.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(n,m).add(t),l)}1===n&&l.negateThis(),u.isZero()||u.normalize(),l.isZero()||l.normalize();const c=u.dotProduct(l),g=u.crossProduct(l);g.scaleError(3);const d=()=>{{const s=t.calculateUpperLength2D(),n=e.calculateUpperLength2D();return Math.min(.01*i/Math.min(s,n),1e-10)}};if(c.ge(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.J)&&(g.isZero()||Math.abs(g.value())<d())){return ke(t,e,s,n,i,r,o,a)}}}return 0}function We(t,e,n){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.isCurve()||e.isCurve()),t.getStartXY().equals(e.getStartXY())){if(Ge(t,e,0,0,n,2,[0,0],[0,0]))return!0}if(t.getEndXY().equals(e.getEndXY())){if(Ge(t,e,1,1,n,2,[0,0],[0,0]))return!0}if(t.getStartXY().equals(e.getEndXY())){if(Ge(t,e,0,1,n,2,[0,0],[0,0]))return!0}if(t.getEndXY().equals(e.getStartXY())){if(Ge(t,e,1,0,n,2,[0,0],[0,0]))return!0}return!1}function je(t,e){t.m_XStart=e.x,t.m_YStart=e.y}function Ze(t,e,s){t.m_XStart=e,t.m_YStart=s}function He(t,e){t.m_XEnd=e.x,t.m_YEnd=e.y}function Ue(t,e,s){t.m_XEnd=e,t.m_YEnd=s}function Oe(t,e,s){e?t.m_XEnd===s.x&&t.m_YEnd===s.y||(t.m_XEnd=s.x,t.m_YEnd=s.y,t.endPointModified()):t.m_XStart===s.x&&t.m_YStart===s.y||(t.m_XStart=s.x,t.m_YStart=s.y,t.endPointModified())}function Qe(t,e){const s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f;return e?(s.x=t.m_XEnd,s.y=t.m_YEnd):(s.x=t.m_XStart,s.y=t.m_YStart),s.z=Je(t,e),s}function Je(t,e){return t.m_description.hasZ()?t.m_attributes[e*(t.m_description.getTotalComponentCount()-2)]:Fe.getDefaultValue(1)}function Ke(t,e,s){t.m_description.hasZ()||t.addAttribute(1),e?t.m_XEnd===s.x&&t.m_YEnd===s.y||(t.m_XEnd=s.x,t.m_YEnd=s.y,t.endPointModified()):t.m_XStart===s.x&&t.m_YStart===s.y||(t.m_XStart=s.x,t.m_YStart=s.y,t.endPointModified()),t.m_attributes[(t.m_description.getTotalComponentCount()-2)*e]=s.z}function $e(t,e,s){s.assignVertexDescription(t.m_description);const n=0===e?t.m_XStart:t.m_XEnd,i=0===e?t.m_YStart:t.m_YEnd;s.setXYCoords(n,i);for(let r=1;r<t.m_description.getAttributeCount();r++){const n=t.m_description.getSemantics(r);for(let i=0,r=Fe.getComponentCount(n);i<r;i++){const r=es(t,e,n,i);s.setAttributeBasic(n,i,r)}}}function ts(t,e,s){s.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.u)(""),Oe(t,e,s.getXY());const n=s.getDescription();n!==t.m_description&&t.mergeVertexDescription(n);for(let i=1,r=n.getAttributeCount();i<r;i++){const r=n.getSemantics(i),o=Fe.getComponentCount(r);for(let n=0;n<o;n++){ss(t,e,r,n,s.getAttributeAsDbl(r,n))}}}function es(t,e,s,i){if((e<0||e>1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),0===s)return(i<0||i>=2)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),0===e?0===i?t.m_XStart:t.m_YStart:0===i?t.m_XEnd:t.m_YEnd;const r=Fe.getComponentCount(s);(i<0||i>=r)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const o=t.m_description.getAttributeIndex(s);return o>=0?t.m_attributes[e*(t.m_description.getTotalComponentCount()-2)+t.m_description.getPointAttributeOffset(o)-2+i]:Fe.getDefaultValue(s)}function ss(t,e,s,i,r){if((e<0||e>1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),0===s)return 0===e?0===i?t.m_XStart=r:1===i?t.m_YStart=r:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""):1===e?0===i?t.m_XEnd=r:1===i?t.m_YEnd=r:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),void t.endPointModified();const o=Fe.getComponentCount(s);(i<0||i>=o)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");let a=t.m_description.getAttributeIndex(s);a<0&&(t.addAttribute(s),a=t.m_description.getAttributeIndex(s)),t.m_attributes[e*(t.m_description.getTotalComponentCount()-2)+t.m_description.getPointAttributeOffset(a)-2+i]=r}function ns(t,e){if(t===e)return;e.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.u)("");const s=e.getDescription();s!==t.m_description&&t.mergeVertexDescription(s);for(let n=1,i=s.getAttributeCount();n<i;n++){const i=s.getSemantics(n),r=Fe.getComponentCount(i);for(let s=0;s<r;s++){let n=es(e,0,i,s);ss(t,0,i,s,n),n=es(e,1,i,s),ss(t,1,i,s,n)}}}function is(t,e){const s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.t)();(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.u)(e,t.m_description,s);let n=null;const i=e.getTotalComponentCount()-2,r=t.m_description?t.m_description.getTotalComponentCount()-2:0;if(i>0&&(n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(2*i,Number.NaN),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(n,e.getDefaultPointAttributes(),0,2,i),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(n,e.getDefaultPointAttributes(),i,2,i),null!==t.m_description))for(let o=1;o<e.getAttributeCount();o++){const a=s[o];if(-1!==a){const s=t.m_description.getPointAttributeOffset(a)-2,h=e.getPointAttributeOffset(o)-2,u=Fe.getComponentCount(e.getSemantics(o));for(let e=0;e<u;++e)n[h]=t.m_attributes[s],n[i+h]=t.m_attributes[r+s]}}t.m_attributes=n,t.m_description=e}function rs(t){return t.absNorm()*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.g)()}function os(t,e){return Math.max(t.absNorm(),e.absNorm())*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.g)()}function as(t,e,s){const n=new we;t.queryEnvelopeW(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),n);const i=new we;return e.queryEnvelopeW(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),i),i.inflate(s),!n.isIntersectingW(i)}function hs(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.L)(t,
1s),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.L)(e,s);n.sort((t,e)=>t.compare(e)),i.sort((t,e)=>t.compare(e));for(let r=0;r<3;r++){if(n[r].compare(i[r])<0)return-1;if(0!==n[r].compare(i[r]))return 1}return 0}var us=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class ms{constructor(t){if(t.copy){if(this.m_XStart=t.copy.m_XStart,this.m_YStart=t.copy.m_YStart,this.m_XEnd=t.copy.m_XEnd,this.m_YEnd=t.copy.m_YEnd,this.m_description=t.copy.m_description,this.m_attributes=null,this.m_description){this.m_description.getTotalComponentCount()-2&&(this.m_attributes=t.copy.m_attributes.slice())}}else{if(t.move)return this.m_description=t.move.m_description,t.move.m_description=null,this.m_attributes=t.move.m_attributes,t.move.m_attributes=null,this.m_XStart=t.move.m_XStart,this.m_YStart=t.move.m_YStart,this.m_XEnd=t.move.m_XEnd,void(this.m_YEnd=t.move.m_YEnd);if(void 0!==t.XStart)return this.m_XStart=t.XStart,this.m_YStart=t.YStart,this.m_XEnd=t.XEnd,this.m_YEnd=t.YEnd,this.m_attributes=null,this.m_description=t.vd?t.vd:(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)(),void(t.vd&&this.setDefaultAttributeValues());if(void 0!==t.ZStart)return this.m_XStart=t.XStart,this.m_YStart=t.YStart,this.m_XEnd=t.XEnd,this.m_YEnd=t.YEnd,this.m_description=t.vd?t.vd:(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.z)(),void(t.vd?(this.setDefaultAttributeValues(),this.addAttribute(1),this.m_attributes[0]=t.ZStart,this.m_attributes[this.m_description.getTotalComponentCount()-2]=t.ZEnd):this.m_attributes=[t.ZStart,t.ZEnd]);if(t.start)return this.m_XStart=t.start.x,this.m_YStart=t.start.y,this.m_XEnd=t.end.x,this.m_YEnd=t.end.y,this.m_attributes=null,void(this.m_description=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)());if(t.start3D)return this.m_XStart=t.start3D.x,this.m_YStart=t.start3D.y,this.m_XEnd=t.end3D.x,this.m_YEnd=t.end3D.y,this.m_description=t.vd?t.vd:(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.z)(),void(t.vd?(this.setDefaultAttributeValues(),this.addAttribute(1),this.m_attributes[0]=t.start3D.z,this.m_attributes[this.m_description.getTotalComponentCount()-2]=t.end3D.z):this.m_attributes=[t.start3D.z,t.end3D.z]);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("bad constructor params"),this.m_XStart=this.m_YStart=this.m_XEnd=this.m_YEnd=Number.NaN}}setDefaultAttributeValues(){const t=this.m_description.getTotalComponentCount()-2;t>0&&(null===this.m_attributes&&(this.m_attributes=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(2*t,Number.NaN)),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(this.m_attributes,this.m_description.getDefaultPointAttributes(),0,2,t),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(this.m_attributes,this.m_description.getDefaultPointAttributes(),t,2,t))}absNormXYZ(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("not implemented"),0}queryWeights(t){}snapControlPoints3D(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("not implemented"),!1}setCoordsForIntersector3D(t,e,s){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("not implemented")}transformAttribute(t,e,s,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}mergeVertexDescriptionImpl(t){const e=this.getDescription(),s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.n)(e,t);this.assignVertexDescription(s)}changeEndPoints(t,e){const s=t.getXY(),n=e.getXY();this.changeEndPoints2D(s,n);let i=t.getDescription();i!==this.getDescription()&&this.mergeVertexDescription(i),i=e.getDescription(),i!==this.getDescription()&&this.mergeVertexDescription(i);for(let r=1,o=i.getAttributeCount();r<o;r++){const s=i.getSemantics(r),n=us.getComponentCount(s);for(let i=0;i<n;i++){ss(this,0,s,i,t.getAttributeAsDbl(s,i));ss(this,1,s,i,e.getAttributeAsDbl(s,i))}}}getStartXY(){return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(this.m_XStart,this.m_YStart)}setStartXY(t){this.m_XStart=t.x,this.m_YStart=t.y,this.endPointModified()}setStartXYCoords(t,e){this.m_XStart=t,this.m_YStart=e,this.endPointModified()}getStartXYZ(){return Qe(this,0)}setStartXYZ(t){Ke(this,0,t)}setStartXYZCoords(t,e,s){Ke(this,0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f.construct(t,e,s))}queryStart(t){$e(this,0,t)}setStart(t){ts(this,0,t)}setStart2D(t){this.setStartXY(t)}getStartAttributeAsDbl(t,e){return es(this,0,t,e)}getStartAttributeAsInt(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}setStartAttribute(t,e,s){ss(this,0,t,e,s)}setStartAttributesFromPoint(t,e){const s=t.getDescription();for(let n=e&&s.hasZ()?2:1,i=s.getAttributeCount();n<i;++n){const e=s.getSemantics(n),i=us.getComponentCount(e);for(let s=0;s<i;++s){const n=t.getAttributeAsDbl(e,s);this.setStartAttribute(e,s,n)}}}setEndAttributesFromPoint(t,e){const s=t.getDescription();for(let n=e&&s.hasZ()?2:1,i=s.getAttributeCount();n<i;++n){const e=s.getSemantics(n),i=us.getComponentCount(e);for(let s=0;s<i;++s){const n=t.getAttributeAsDbl(e,s);this.setEndAttribute(e,s,n)}}}getStartX(){return this.m_XStart}getStartY(){return this.m_YStart}getStartZ(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getEndX(){return this.m_XEnd}getEndY(){return this.m_YEnd}getEndZ(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getEndXY(){return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(this.m_XEnd,this.m_YEnd)}setEndXY(t){this.m_XEnd=t.x,this.m_YEnd=t.y,this.endPointModified()}setEndXYCoords(t,e){this.m_XEnd=t,this.m_YEnd=e,this.endPointModified()}getEndXYZ(){return Qe(this,1)}setEndXYZ(t){Ke(this,1,t)}setEndXYZCoords(t,e,s){Ke(this,1,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f.construct(t,e,s))}queryEnd(t){$e(this,1,t)}setEnd(t){ts(this,1,t)}setEnd2D(t){this.setEndXY(t)}getEndAttributeAsDbl(t,e){return es(this,1,t,e)}getEndAttributeAsInt(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),Math.trunc(0)}setEndAttribute(t,e,s){ss(this,1,t,e,s)}getDimension(){return 1}copyTo(t){if(this===t)return;t.getGeometryType()!==this.getGeometryType()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const s=t;s.assignVertexDescription(this.m_description),s.m_attributes&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(s.m_attributes,this.m_attributes,0,0,2*(this.m_description.getTotalComponentCount()-2)),s.m_XStart=this.m_XStart,s.m_YStart=this.m_YStart,s.m_XEnd=this.m_XEnd,s.m_YEnd=this.m_YEnd,this.copyToImpl(s)}isEmpty(){return this.isEmptyImpl()}isClosed(){return this.m_XStart===this.m_XEnd&&this.m_YStart===this.m_YEnd}setEmpty(){}calculateArea2D(){return 0}queryInterval(t,e){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();return s.vmin=es(this,0,t,e),s.vmax=s.vmin,s.mergeNeCoordinate(es(this,1,t,e)),s}calculateLength3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getCoord3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),{}}getCoord2D(t){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();return this.queryCoord2D(t,e),e}queryCoord3D(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getCoordZ(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}queryCoord(t,e){e.assignVertexDescription(this.m_description),e.setXY(this.getCoord2D(t));for(let s=1,n=this.m_description.getAttributeCount();s<n;s++){const n=this.m_description.getSemantics(s),i=us.getComponentCount(n);for(let s=0;s<i;s++){const i=this.getAttributeAsDbl(t,n,s);e.setAttributeBasic(n,s,i)}}}isCloserThanDistance(t,e,s){const n=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();this.queryLooseEnvelopeOnInterval(e,n);if(n.distance(t)>s)return!1;const i=this.getClosestCoordinateOnInterval(t,e,s);return!Number.isNaN(i)&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,this.getCoord2D(i))<=s}isMonotoneQuickAndDirty(){return!1}isTrue3D(){return!1}getReversed(){const t=this.clone();return t.reverse(),t}reverse(){this.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=this.m_XEnd),this.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=this.m_YEnd),this.reverseImpl();for(let t=1,e=this.m_description.getAttributeCount();t<e;t++){const e=this.m_description.getSemantics(t);for(let t=0,s=us.getComponentCount(e);t<s;t++){const s=es(this,0,e,t);ss(this,0,e,t,es(this,1,e,t)),ss(this,1,e,t,s)}}return this.afterCompletedModification(),this}isEmptyImpl(){return!1}isCircular(){return!1}distance(t,e,n,i){if(!e&&this.isIntersecting(t,0,!1)){if(null!==n||null!==i){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(9,Number.NaN),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(9,Number.NaN),o=this.intersect(t,null,e,r,0);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(o<=9),0===o&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),null!==n&&(n[0]=e[0]),null!==i&&(i[0]=r[0])}return 0}let r,o=Number.MAX_VALUE,a=-1,u=o;return r=this.getStartXY(),a=t.getClosestCoordinate(r,!1),r.subThis(t.getCoord2D(a)),u=r.length(),u<o&&(o=u,null!==i&&(i[0]=a),null!==n&&(n[0]=0)),r=this.getEndXY(),a=t.getClosestCoordinate(r,!1),r.subThis(t.getCoord2D(a)),u=r.length(),u<o&&(o=u,null!==i&&(i[0]=a),null!==n&&(n[0]=1)),r=t.getStartXY(),a=this.getClosestCoordinate(r,!1),r.subThis(this.getCoord2D(a)),u=r.length(),u<o&&(o=u,null!==n&&(n[0]=a),null!==i&&(i[0]=0)),r=t.getEndXY(),a=this.getClosestCoordinate(r,!1),r.subThis(this.getCoord2D(a)),u=r.length(),u<o&&(o=u,null!==n&&(n[0]=a),null!==i&&(i[0]=1)),o}calculateSubLengthFromStart(t){return this.tToLength(t)}calculateSubLength(t,e){return e===t?0:this.tToLength(e)-this.tToLength(t)}static recalculateParentT(t,e,s){return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t,e,s)}moveTo(t){const e=this.isClosed(),s=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;s.setShift(t.sub(this.getStartXY())),this.applyTransformation(s),e?this.changeEndPoints2D(t,t):this.changeEndPoints2D(t,this.getEndXY())}moveTo3D(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getDescription(){return this.m_description}assignVertexDescription(t){is(this,t)}mergeVertexDescription(t){this.m_description!==t&&(this.m_description.hasAttributesFrom(t)||this.mergeVertexDescriptionImpl(t))}hasAttribute(t){return this.m_description.hasAttribute(t)}addAttribute(t){if(this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.o)(this.m_description,t);this.assignVertexDescription(e)}dropAttribute(t){if(!this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.r)(this.m_description,t);this.assignVertexDescription(e)}dropAllAttributes(){const t=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)();t!==this.m_description&&this.assignVertexDescription(t)}swap(t){if(this===t)return;t.getGeometryType()!==this.getGeometryType()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("wrong geometry type");const s=t;s.m_description=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_description,this.m_description=s.m_description),s.m_XStart=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=s.m_XStart),s.m_YStart=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=s.m_YStart),s.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XEnd,this.m_XEnd=s.m_XEnd),s.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YEnd,this.m_YEnd=s.m_YEnd),s.m_attributes=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_attributes,this.m_attributes=s.m_attributes),this.swapImpl(s)}equals(t,e){if(this.getGeometryType()!==t.getGeometryType())return!1;const s=void 0===e;s&&(e=0);const n=t;if(this===n)return!0;
1if(this.m_description!==n.m_description)return!1;if(Math.abs(this.m_XStart-n.m_XStart)>e||Math.abs(this.m_XEnd-n.m_XEnd)>e||Math.abs(this.m_YStart-n.m_YStart)>e||Math.abs(this.m_YEnd-n.m_YEnd)>e)return!1;for(let i=0,r=2*(this.m_description.getTotalComponentCount()-2);i<r;i++)if(!(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.G)(this.m_attributes[i],n.m_attributes[i],e))return!1;return s?this.equalsImpl(n):this.equalsImplTol(n,e)}getImpl(){return this}setAttributeBasic(t,s,n){if(this.addAttribute(t),0===t&&this.isCurve()){(s<0||s>1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const t=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T,i=0===s?n:0,r=1===s?n:0;t.setShiftCoords(i,r),0===s?t.xx=0:t.yy=0,this.applyTransformation(t)}else this.setStartAttribute(t,s,n),this.setEndAttribute(t,s,n)}replaceNaNs(t,e){if(this.addAttribute(t),this.isEmpty())return;const s=us.getComponentCount(t);for(let n=0;n<s;n++){const s=this.getStartAttributeAsDbl(t,n);Number.isNaN(s)&&this.setStartAttribute(t,n,e);const i=this.getEndAttributeAsDbl(t,n);Number.isNaN(i)&&this.setEndAttribute(t,n,e)}}}ms.s_maxMonotonicPartParams=8;class ls extends _GeometryCursor_js__WEBPACK_IMPORTED_MODULE_5__.G{constructor(t,e){super(),this.m_index=-1,this.gc=t,this.dim=e}next(){for(;;){if(this.m_index>=this.gc.getGeometryCount())return null;if(this.m_index++,this.m_index===this.gc.getGeometryCount())return null;const t=this.gc.getGeometry(this.m_index);if(-1===this.dim||1<<t.getDimension()&this.dim)return t}return null}getGeometryID(){return this.m_index}tock(){return!0}getRank(){return 1}}class cs{constructor(t){this.m_geoms=[],this.m_description=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)(),t&&(t.vd?this.m_description=t.vd:t.copy?t.copy.copyTo(this):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("constructor argument not recognized"))}getGeometryCount(){return this.m_geoms.length}reserve(t){}addGeometry(t){if(t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection){const e=t;for(let t=0,s=e.getGeometryCount();t<s;t++)this.addGeometry(e.getGeometry(t))}else this.m_geoms.push(t.clone()),this.mergeVertexDescription(t.getDescription())}addCursor(t){for(let e=t.next();null!==e;e=t.next())this.addGeometry(e)}getGeometry(t){return(t<0||t>=this.m_geoms.length)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Geometry_collection.get_geometry"),this.m_geoms[t]}modifiedElementIndex(t){this.mergeVertexDescription(this.getGeometry(t).getDescription())}modifiedElement(t){this.mergeVertexDescription(t.getDescription())}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection}getDimension(){let t=0;for(const e of this.m_geoms)t=Math.max(t,e.getDimension());return t}getDescription(){return this.m_description}assignVertexDescription(t){this.m_description!==t&&this.assignVertexDescriptionImpl(t)}assignVertexDescriptionImpl(t){for(const e of this.m_geoms)e.assignVertexDescription(t);this.m_description=t}mergeVertexDescription(t){this.m_description!==t&&(this.m_description.hasAttributesFrom(t)||this.mergeVertexDescriptionImpl(t))}hasAttribute(t){return this.m_description.hasAttribute(t)}addAttribute(t){if(this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.o)(this.m_description,t);this.assignVertexDescription(e)}dropAttribute(t){if(!this.m_description.hasAttribute(t))return;const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.r)(this.m_description,t);this.assignVertexDescription(e)}dropAllAttributes(){const t=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)();t!==this.m_description&&this.assignVertexDescription(t)}queryInterval(t,e){let s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;n.setEmpty();for(const i of this.m_geoms)s=i.queryInterval(t,e),n.merge(s);return n}queryEnvelope(t){if(4===t.m_EnvelopeType){const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.E;t.setEmpty(),t.assignVertexDescription(this.m_description);for(const s of this.m_geoms)s.queryEnvelope(e),t.merge(e)}else if(2===t.m_EnvelopeType){const e=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;t.setEmpty();for(const s of this.m_geoms)s.queryEnvelope(e),t.mergeEnvelope2D(e)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d envelope case not implemented")}queryLooseEnvelope(t){if(2===t.m_EnvelopeType){const e=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;t.setEmpty();for(const s of this.m_geoms)s.queryLooseEnvelope(e),t.mergeEnvelope2D(e)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d not impl")}isEmpty(){return 0===this.m_geoms.length}setEmpty(){this.m_geoms.length=0}applyTransformation(t){if(1===t.m_TransformationType)for(const e of this.m_geoms)e.applyTransformation(t);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d xform not impl")}transformAttribute(t,e,s,n,i){for(const r of this.m_geoms)r.transformAttribute(t,e,s,n,i)}createInstance(){return new cs({vd:this.getDescription()})}copyTo(t){t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const s=t;if(s!==this){s.m_geoms.length=0,s.assignVertexDescription(this.m_description);for(const t of this.m_geoms)s.m_geoms.push(t.clone())}}calculateArea2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(const e of this.m_geoms)t.pe(e.calculateArea2D());return t.getResult()}calculateLength2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(const e of this.m_geoms)t.pe(e.calculateLength2D());return t.getResult()}calculateLength3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getBoundary(){const t=this.createInstance(),e=t;for(const s of this.m_geoms){const t=s.getBoundary();t&&e.m_geoms.push(t)}return t}clone(){return new cs({copy:this})}equals(t,e){if(t===this)return!0;
1if(t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection)return!1;const s=t;if(this.m_description!==s.m_description)return!1;if(this.m_geoms.length!==s.m_geoms.length)return!1;for(let n=0;n<this.m_geoms.length;++n)if(!this.m_geoms[n].equals(s.m_geoms[n],e))return!1;return!0}swap(t){t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const s=t;s!==this&&(this.m_geoms=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s.m_geoms,s.m_geoms=this.m_geoms))}setAttributeBasic(t,e,s){for(const n of this.m_geoms)n.setAttributeBasic(t,e,s)}replaceNaNs(t,e){for(const s of this.m_geoms)s.replaceNaNs(t,e)}getImpl(){return this}mergeVertexDescriptionImpl(t){const e=this.getDescription(),s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.n)(e,t);this.assignVertexDescription(s)}}function gs(t,e=-1){return new ls(t,e)}cs.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection;class ds extends ms{constructor(t){super(t)}}class _s extends ds{isTrue3D(){return!0}constructor(t){super(t)}}function ps(t,e,s){fs(e,t.getStartXY(),t.getEndXY(),s)}function fs(t,e,s,n){(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e,s,t,n)}function Ps(t,e){return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t.m_XStart,t.m_XEnd,e)}function ys(t,e){return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t.m_YStart,t.m_YEnd,e)}function xs(t,e){const s=t.getStartZ(),n=t.getEndZ();return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,n,e)}function Cs(t,e,s){const n=Ne.constructPoint2D(t.getStartXY()),i=Ne.constructPoint2D(t.getEndXY());s.setCoordsE(i.x.subE(n.x),i.y.subE(n.y))}function vs(t,e,s){e.value()<=.5?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,Ne.constructPoint2D(t.getStartXY()),Ne.constructPoint2D(t.getEndXY()),e,s):(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,Ne.constructPoint2D(t.getStartXY()),Ne.constructPoint2D(t.getEndXY()),e,s)}function bs(t,e,s){t.m_XStart=e.x,t.m_YStart=e.y,t.m_XEnd=s.x,t.m_YEnd=s.y,t.afterCompletedModification()}function Ss(t,e){const s=t.getStartXYZ();s.z*=e;const n=t.getEndXYZ();return n.z*=e,s.norm(1)+n.norm(1)}function Es(t){if(t.m_YEnd<t.m_YStart||t.m_YEnd===t.m_YStart&&t.m_XEnd<t.m_XStart){t.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_XStart,t.m_XStart=t.m_XEnd),t.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_YStart,t.m_YStart=t.m_YEnd);for(let e=0,s=t.m_description.getTotalComponentCount()-2;e<s;e++)t.m_attributes[e+s]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_attributes[e],t.m_attributes[e]=t.m_attributes[e+s])}}function Ds(t,e,s,n){let i=0;if((t.m_XStart===e.m_XStart&&t.m_YStart===e.m_YStart||t.m_XStart===e.m_XEnd&&t.m_YStart===e.m_YEnd)&&(i++,!n))return 1;if(t.m_XEnd===e.m_XStart&&t.m_YEnd===e.m_YStart||t.m_XEnd===e.m_XEnd&&t.m_YEnd===e.m_YEnd){if(i++,2===i)return 2;if(!n)return 1}return e.isIntersectingPoint(t.getStartXY(),s,!0)||e.isIntersectingPoint(t.getEndXY(),s,!0)||t.isIntersectingPoint(e.getStartXY(),s,!0)||t.isIntersectingPoint(e.getEndXY(),s,!0)?4:n&&i?0:Ts(t,e)?4:0}function ws(t,e,s,n,i,r,o,a){null!==n&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.w)(n,2,Number.NaN),null!==i&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.w)(i,2,Number.NaN),null!==s&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ac)(s,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2);const h=As(t,e,2,s,n,i,r,o,a);return n&&(n.length=h),i&&(i.length=h),s&&(s.length=h),h}function As(t,e,s,n,i,r,o,a,h){const u=Ms(t,e.getStartXY(),o,!1),m=Ms(t,e.getEndXY(),o,!1),l=Ms(e,t.getStartXY(),o,!1),c=Ms(e,t.getEndXY(),o,!1);let g=0,d=0;if(!Number.isNaN(u)){let s=!1;a&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(u,0,1)&&t.getCoord2D(u).isEqualPoint2D(e.getStartXY())&&(g++,s=!0),s||(i&&(i[d]=u),r&&(r[d]=0),n&&n[d].setCoords(e.m_XStart,e.m_YStart),d++)}if(!Number.isNaN(m)){let o=!1;a&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(m,0,1)&&t.getCoord2D(m).isEqualPoint2D(e.getEndXY())&&(g++,o=!0),o||(s>d&&(i&&(i[d]=m),r&&(r[d]=1),n&&n[d].setCoords(e.m_XEnd,e.m_YEnd)),d++)}if(2!==d&&!Number.isNaN(l)&&!(0===u&&0===l||0===m&&1===l)){let o=!1;a&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(l,0,1)&&e.getCoord2D(l).isEqualPoint2D(t.getStartXY())&&(g++,o=!0),o||(s>
1d&&(i&&(i[d]=0),r&&(r[d]=l),n&&n[d].setCoords(t.m_XStart,t.m_YStart)),d++)}if(2!==d&&!Number.isNaN(c)&&!(1===u&&0===c||1===m&&1===c)){let o=!1;a&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(c,0,1)&&e.getCoord2D(c).isEqualPoint2D(t.getEndXY())&&(g++,o=!0),o||(s>d&&(i&&(i[d]=1),r&&(r[d]=c),n&&n[d].setCoords(e.m_XEnd,e.m_YEnd)),d++)}if(d>0)return h&&(r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(i,i=r)),2===d&&s>=2&&i&&i[0]>i[1]&&(i[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(i[0],i[0]=i[1]),r&&(r[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(r[0],r[0]=r[1])),n&&(n[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[1]))),d;if(g>0)return 0;const _=Fs(t,e,o);return Number.isNaN(_.x)?0:(n&&(n[0]=t.getCoord2D(_.x)),i&&(i[0]=_.x),r&&(r[0]=_.y),1)}function Ts(t,e){const s=Ys(t,e.m_XStart,e.m_YStart),n=Ys(t,e.m_XEnd,e.m_YEnd);if(s<0&&n<0||s>0&&n>0)return!1;const i=Ys(e,t.m_XStart,t.m_YStart),r=Ys(e,t.m_XEnd,t.m_YEnd);if(i<0&&r<0||i>0&&r>0)return!1;return qs(t)>qs(e)?Xs(t,e):Xs(e,t)}function Is(t,e){const s={bIntersect:!1,t1:Number.NaN,t2:Number.NaN},n=t.m_XEnd-t.m_XStart,i=t.m_YEnd-t.m_YStart,r=e.m_XEnd-e.m_XStart,o=e.m_YEnd-e.m_YStart,a=r*i-n*o;if(0===a)return s;const h=e.m_XStart-t.m_XStart,u=e.m_YStart-t.m_YStart,m=r*u-h*o,l=n*u-h*i,c=1/a;return s.t1=m*c,s.t2=l*c,s.bIntersect=!0,s}function Ms(t,e,s,n){const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();let o=!1;t.m_YEnd<t.m_YStart||t.m_YEnd===t.m_YStart&&t.m_XEnd<t.m_XStart?(i.setCoords(t.m_XEnd,t.m_YEnd),r.setCoords(t.m_XStart,t.m_YStart),o=!0):(i.setCoords(t.m_XStart,t.m_YStart),r.setCoords(t.m_XEnd,t.m_YEnd));const a=o?1:0,h=o?0:1,u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();u.setSub(e,i);let m=u.length(),l=3*m*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)();if(m<=Math.max(s,l))return n&&0===m?Number.NaN:a;if(u.setSub(e,r),m=u.length(),l=3*m*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)(),m<=Math.max(s,l))return n&&0===m?Number.NaN:h;u.setCoords(r.x-i.x,r.y-i.y);const c=u.length();if(c>0){const t=1/c;u.scale(t);const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();n.setSub(e,i);const m=n.dotProduct(u),l=8*n.dotProductAbs(u)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)();u.leftPerpendicularThis();const g=n.dotProduct(u),d=8*n.dotProductAbs(u)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)(),_=Math.max(s,l);if(m<-_||m>c+_)return Number.NaN;const p=Math.max(s,d);if(Math.abs(g)<=p){let n=m*t;n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(n,0,1);const u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(fs(n,i,r,u),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e)<=s){if(n<.5){if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,i)<=s&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,i)<=s)return a}else if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,r)<=s&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,r)<=s)return h;return o?1-n:n}}}return Number.NaN}function Ys(t,e,s){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();n.setCoords(e,s),n.subThis(t.getStartXY());const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();i.setSub(t.getEndXY(),t.getStartXY());const r=i.crossProduct(n),o=4*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*(Math.abs(i.x*n.y)+Math.abs(i.y*n.x));return r>o?-1:r<-o?1:0}function Ns(t,e,s,n){const i=n?t.m_XStart:t.m_XEnd,r=n?t.m_YStart:t.m_YEnd,o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();o.x=e.getEndX()-i,o.y=e.getEndY()-r;if(s.dotProduct(o)>3*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*s.dotProductAbs(o)){o.x=e.getStartX()-i,o.y=e.getStartY()-r;return s.dotProduct(o)<=3*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*s.dotProductAbs(o)}return!0}function Xs(t,e){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();return s.x=t.m_XEnd-t.m_XStart,s.y=t.m_YEnd-t.m_YStart,!!Ns(t,e,s,!1)&&(s.negateThis(),!!Ns(t,e,s,!0))}function qs(t){const e=t.m_XStart-t.m_XEnd,s=t.m_YStart-t.m_YEnd;return e*e+s*s}function Fs(t,e,s){const n=t.m_XEnd-t.m_XStart,i=t.m_YEnd-t.m_YStart,r=e.m_XEnd-e.m_XStart,o=e.m_YEnd-e.m_YStart,a=r*i-n*o;if(0===a)return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();const h=4*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*(Math.abs(r*i)+Math.abs(n*o)),u=e.m_XStart-t.m_XStart,m=e.m_YStart-t.m_YStart,l=r*m-u*o,c=4*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*(Math.abs(r*m)+Math.abs(u*o)),g=l/a,d=Math.abs(a),_=(c*d+h*Math.abs(l))/(a*a)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*Math.abs(g);if(g<-_||g>1+_)return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();const p=n*m-u*i,f=p/a,P=(4*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*(Math.abs(n*m)+Math.abs(u*i))*d+h*Math.abs(p))/(a*a)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*Math.abs(f);if(f<-P||f>1+P)return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();let y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(g,0,1),x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(f,0,1);const C=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();ps(t,y,C);const v=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(ps(e,x,v),!s||_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(C,v)>s){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(C,v,.5,n),y=t.getClosestCoordinate(n,!1),x=e.getClosestCoordinate(n,!1);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();ps(t,y,i);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();ps(e,x,r),i.subThis(r);const o=i.length(),a=(t.absNorm()+e.absNorm())*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.g)();if(o>Math.max(s,a))return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()}return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(y,x)}class Vs{constructor(t){if(this.m_segFlagStream=null,this.m_xyStream
vendor: 9,950 bytes, line 1
1=null,this.m_bCirculator=!1,this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=0,this.m_nextPathIndex=0,this.m_currentPathIndex=-1,this.m_parent=t.parent,this.m_buffer=new this.m_parent.m_segmentBufferCTor,this.m_description=t.parent.getDescription(),this.m_segmentCount=this.getSegmentCount(this.m_nextPathIndex),void 0!==t.pointIndex){(t.pointIndex<0||t.pointIndex>=t.parent.getPointCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const e=t.parent.getPathIndexFromPointIndex(t.pointIndex);this.m_currentPathIndex=e,this.m_nextPathIndex=e+1,this.m_nextSegmentIndex=t.pointIndex-t.parent.getPathStart(e),this.m_segmentCount=this.getSegmentCount(this.m_currentPathIndex)}else if(void 0!==t.pathIndex){(t.pathIndex<0||t.pathIndex>=t.parent.getPathCount()||t.segmentIndex<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const e=t.parent.isClosedPath(t.pathIndex)?0:1;t.segmentIndex>=t.parent.getPathSize(t.pathIndex)-e&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.m_nextSegmentIndex=t.segmentIndex,this.m_currentPathIndex=t.pathIndex,this.m_nextPathIndex=this.m_nextSegmentIndex+1,this.m_segmentCount=this.getSegmentCount(this.m_nextPathIndex)}this.prepare(),this.m_pathBegin=-1,this.m_bCurrentPathClosed=!1,this.m_bStripAttributes=!1,this.m_prevPathIndex=-1,this.m_prevSegmentIndex=-1,this.m_bNeedsUpdate=!1,this.m_currentPathIndex>-1&&(this.m_pathBegin=this.m_parent.getPathStart(this.m_currentPathIndex),this.m_bCurrentPathClosed=this.m_parent.isClosedPath(this.m_currentPathIndex))}stripAttributes(){this.m_bStripAttributes=!0}prepare(){this.m_bCirculator=!1,this.m_parent.isEmptyImpl()?(this.m_segFlagStream=null,this.m_xyStream=null):(this.m_segFlagStream=this.m_parent.getSegmentFlagsStreamRef(),this.m_xyStream=this.m_parent.getAttributeStreamRef(0))}nextPath(){return this.m_currentPathIndex=this.m_nextPathIndex,!(this.m_currentPathIndex>=this.m_parent.getPathCount())&&(this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=0,this.m_segmentCount=this.getSegmentCount(this.m_currentPathIndex),this.m_pathBegin=this.m_parent.getPathStart(this.m_currentPathIndex),this.m_bCurrentPathClosed=this.m_parent.isClosedPath(this.m_currentPathIndex),this.m_nextPathIndex++,!0)}previousPath(){return 0!==this.m_nextPathIndex&&(this.m_nextPathIndex--,this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=0,this.m_segmentCount=this.getSegmentCount(this.m_nextPathIndex),this.m_currentPathIndex=this.m_nextPathIndex,this.m_pathBegin=this.m_parent.getPathStart(this.m_currentPathIndex),this.m_bCurrentPathClosed=this.m_parent.isClosedPath(this.m_currentPathIndex),this.resetToLastSegment(),!0)}getSegmentCount(t){return this.m_parent.isEmptyImpl()?0:this.m_parent.getSegmentCountPath(t)}resetToFirstPath(){this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=-1,this.m_segmentCount=-1,this.m_nextPathIndex=0,this.m_currentPathIndex=-1,this.m_pathBegin=-1,this.m_bCurrentPathClosed=!1}resetToLastPath(){this.m_nextPathIndex=this.m_parent.getPathCount(),this.m_currentPathIndex=-1,this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=-1,this.m_segmentCount=-1,this.m_pathBegin=-1}resetToPath(t){(t<0||t>this.m_parent.getPathCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.m_nextPathIndex=t,this.m_currentPathIndex=-1,this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=-1,this.m_segmentCount=-1,this.m_pathBegin=-1,this.m_bCurrentPathClosed=!1}isLastPath(){return this.m_currentPathIndex===this.m_parent.getPathCount()-1}isFirstSegmentInPath(){return 0===this.m_currentSegmentIndex}isLastSegmentInPath(){return this.m_currentSegmentIndex===this.m_segmentCount-1}resetToFirstSegment(){this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=0}resetToLastSegment(){this.m_nextSegmentIndex=this.m_segmentCount,this.m_currentSegmentIndex=-1}resetTo(t){this.m_parent!==t.m_parent&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.q)(""),this.m_currentSegmentIndex=t.m_currentSegmentIndex,this.m_nextSegmentIndex=t.m_nextSegmentIndex,this.m_currentPathIndex=t.m_currentPathIndex,this.m_nextPathIndex=t.m_nextPathIndex,this.m_segmentCount=t.m_segmentCount,this.m_bCirculator=t.m_bCirculator,this.m_pathBegin=t.m_pathBegin,this.m_bCurrentPathClosed=t.m_bCurrentPathClosed,this.m_bStripAttributes=t.m_bStripAttributes,this.m_description=t.m_description}resetToVertex(t,e){if(this.m_currentPathIndex>=0&&this.m_currentPathIndex<this.m_parent.getPathCount()){const e=this.getPathBegin();if(t>=e&&t<this.m_parent.getPathEnd(this.m_currentPathIndex))return this.m_currentSegmentIndex=-1,void(this.m_nextSegmentIndex=t-e)}let s;s=e>=0&&e<this.m_parent.getPathCount()&&t>=this.m_parent.getPathStart(e)&&t<this.m_parent.getPathEnd(e)?e:this.m_parent.getPathIndexFromPointIndex(t),this.m_nextPathIndex=s+1,this.m_currentPathIndex=s,this.m_currentSegmentIndex=-1,this.m_nextSegmentIndex=t-this.m_parent.getPathStart(s),this.m_segmentCount=this.getSegmentCount(s),this.m_pathBegin=this.m_parent.getPathStart(this.m_currentPathIndex),this.m_bCurrentPathClosed=this.m_parent.isClosedPath(this.m_currentPathIndex)}hasNextSegment(){return this.m_nextSegmentIndex<this.m_segmentCount}hasPreviousSegment(){return this.m_nextSegmentIndex>0}nextSegment(){return this.m_currentSegmentIndex!==this.m_nextSegmentIndex&&this.updateSegment(),this.m_bCirculator?this.m_nextSegmentIndex=(this.m_nextSegmentIndex+1)%this.m_segmentCount:(this.m_nextSegmentIndex===this.m_segmentCount&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("Segment_iterator_impl::next_segment"),this.m_nextSegmentIndex++),this.m_buffer.get()}previousSegment(){return this.m_bCirculator?this.m_nextSegmentIndex=(this.m_segmentCount+this.m_nextSegmentIndex-1)%this.m_segmentCount:(0===this.m_nextSegmentIndex&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.m_nextSegmentIndex--),this.m_nextSegmentIndex!==this.m_currentSegmentIndex&&this.updateSegment(),this.m_buffer.get()}nextCurve(){if(!this.m_parent.hasNonLinearSegments())return this.resetToLastSegment(),null;let t=0;for(;;){if(this.m_nextSegmentIndex===this.m_segmentCount||t===this.m_segmentCount)return null;const e=this.getPathBegin()+this.m_nextSegmentIndex;if(1!==(31&this.m_segFlagStream.read(e))){this.updateSegment();break}this.m_bCirculator?this.m_nextSegmentIndex=(this.m_nextSegmentIndex+1)%this.m_segmentCount:this.m_nextSegmentIndex++,t++}return this.m_currentSegmentIndex!==this.m_nextSegmentIndex&&this.updateSegment(),this.m_bCirculator?this.m_nextSegmentIndex=(this.m_nextSegmentIndex+1)%this.m_segmentCount:(this.m_nextSegmentIndex===this.m_segmentCount&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.m_nextSegmentIndex++),this.m_buffer.get()}getPathBegin(){return this.m_pathBegin}getPathIndex(){return this.m_currentPathIndex}getStartPointIndex(){return this.getPathBegin()+this.m_currentSegmentIndex}getEndPointIndex(){return this.isClosingSegment()?this.getPathBegin():this.getStartPointIndex()+1}updateSegment(){(this.m_nextSegmentIndex<0||this.m_nextSegmentIndex>=this.m_segmentCount||this.m_currentPathIndex<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),this.m_currentSegmentIndex=this.m_nextSegmentIndex,this.m_parent.getSegmentFromPath(this.m_currentPathIndex,this.m_currentSegmentIndex,this.m_buffer,this.m_bStripAttributes)}isClosingSegment(){return this.m_bCurrentPathClosed&&this.m_currentSegmentIndex===this.m_segmentCount-1}isCurve(){if(null!==this.m_segFlagStream){return 1!==(31&this.m_segFlagStream.read(this.m_currentSegmentIndex))}return!1}isPathClosed(){return this.m_bCurrentPathClosed}setCirculator(t){this.m_bCirculator=t}getImpl(){return this}}class Ls{constructor(t){this.m_rasterizedGeometry=null,this.m_quadTree=null,this.m_quadTreeForPaths=null,this.m_refCount=1,t&&t.copyTo(this)}getRasterizedGeometry(){return this.m_rasterizedGeometry}copyTo(t){t!==this&&((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.uniqueUse()),t.m_quadTree=this.m_quadTree,t.m_quadTreeForPaths=this.m_quadTreeForPaths,t.m_rasterizedGeometry=this.m_rasterizedGeometry)}clone(){const t=new Ls;return this.copyTo(t),t}uniqueUse(){return 1===this.m_refCount}addRef(){++this.m_refCount}release(){0===--this.m_refCount&&(this.m_rasterizedGeometry=null,this.m_quadTree=null,this.m_quadTreeForPaths=null)}setRasterizedGeometry(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.uniqueUse())}setQuadTree(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.uniqueUse()),this.m_quadTree=t}setQuadTreeForPaths(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.uniqueUse()),this.m_quadTreeForPaths=t}getQuadTree(){return this.m_quadTree}getQuadTreeForPaths(){return this.m_quadTreeForPaths}}function Rs(t){return!(t.isEmpty()||t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline&&t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon)&&!(t.getPointCount()<20)}function zs(t){return!(t.isEmpty()||t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline&&t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon)&&!(t.getPointCount()<20)}function Bs(t,e){return t.readPoint2D(e+4)}function ks(t){const e=t.getGeometryType();return e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc?10:e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier?4:e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2?5:e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2?2:void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}function Gs(t){const e=31&t;return 4===e?10:2===e?4:8===e?5:16===e?2:0}function Ws(t,e,s,n){const i=t.getPathStart(e),r=t.getPathEnd(e);if(r-i<3)return;const o=2*i,a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();s.queryPoint2D(o,a);const h=a.x,u=a.y,m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();s.queryPoint2D(o+2,m);const l=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();for(let c=o+4,g=2*r;c<g;c+=2)s.queryPoint2D(c,l),n.pe((l.x-a.x)*(m.y-u)),a.setCoordsPoint2D(m),m.setCoordsPoint2D(l);
1n.pe((h-a.x)*(m.y-u))}function js(t,e,s){for(;e.hasNextSegment();){const t=e.nextCurve();if(null===t)break;s.pe(2*t.calculateArea2DHelper())}}var Zs=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class Hs{static toSegType(t){let e=0;switch(t){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:e=1;break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:e=2;break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:e=4;break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:e=8;break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:e=16;break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}return e}constructor(){this.m_segmentFlags=null,this.m_segmentParamIndex=null,this.m_segmentParams=null,this.m_curveCount=0,this.m_bezierCount=0,this.m_arcCount=0,this.m_rbezier2Count=0,this.m_bezier2Count=0,this.m_curveParamWritePoint=0}assignCopy(t){return this.m_segmentFlags=t.m_segmentFlags,this.m_segmentParamIndex=t.m_segmentParamIndex,this.m_segmentParams=t.m_segmentParams,this.m_curveCount=t.m_curveCount,this.m_bezierCount=t.m_bezierCount,this.m_arcCount=t.m_arcCount,this.m_rbezier2Count=t.m_rbezier2Count,this.m_bezier2Count=t.m_bezier2Count,this.m_curveParamWritePoint=t.m_curveParamWritePoint,this}}
vendor: 4,482 bytes, line 1
1class Us extends Ee{constructor(t){super(t),this.m_cachedRingAreas2D=null,this.m_paths=null,this.m_pathFlags=null,this.m_curveData=null,t.move?(this.m_bPolygon=t.move.m_bPolygon,this.m_cachedLength2D=t.move.m_cachedLength2D,this.m_cachedArea2D=t.move.m_cachedArea2D,this.m_currentPathIndex=t.move.m_currentPathIndex,this.m_cachedRingAreas2D=t.move.m_cachedRingAreas2D,this.m_paths=t.move.m_paths,this.m_pathFlags=t.move.m_pathFlags,this.m_curveData=t.move.m_curveData,t.move.m_curveData=null,t.move.setEmpty()):(this.m_bPolygon=t.bPolygon,this.m_cachedLength2D=0,this.m_cachedArea2D=0,this.m_currentPathIndex=0)}getGeometryType(){return this.m_bPolygon?_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon:_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline}getDimension(){return this.m_bPolygon?2:1}changeRingStartPoint(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.m_bPolygon);const n=this.getPathIndexFromPointIndex(t),i=this.getPathStart(n);if(i===t)return;const r=this.getPathEnd(n);(t>=r||t<i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("change_ring_start_point");for(let e=0,s=this.m_description.getAttributeCount();e<s;e++){const s=this.m_description.getSemantics(e),n=Zs.getComponentCount(s);this.m_vertexAttributes.get(e).rotate(i*n,t*n,r*n)}this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.rotate(i,t,r),this.m_curveData.m_segmentParamIndex.rotate(i,t,r))}setFillRule(t){this.m_bFillRule=1===t}getFillRule(){return this.m_bFillRule?1:0}isExteriorRingOGC(t){return!!this.m_bPolygon&&(this.updateOGCFlagsProtected(),!!(8&this.m_pathFlags.read(t)))}isExteriorRing(t){return this.calculateRingArea2D(t)>0}calculateRingArea2D(t){return this.m_bPolygon?(this.updateRingAreas2DProtected(),this.m_cachedRingAreas2D.read(t)):0}updateRingAreas2DProtected(){if(!this.hasDirtyFlag(1024))return;const t=this.getPathCount();if(0===t)return this.hasDirtyFlag(1024)&&(this.m_cachedArea2D=0),void this.setDirtyFlagProtected(1024,!1);const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.A(t),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);if(0!==this.m_pointCount){const i=this.getAttributeStreamRef(0);if(this.hasNonLinearSegments()){const t=new Vs({parent:this});for(t.stripAttributes();t.nextPath();){n.reset();const r=t.getPathIndex();Ws(this,r,i,n),js(this,t,n);const o=.5*n.getResult();s.add(o),e.write(r,o)}}else for(let r=0;r<t;r++){n.reset(),Ws(this,r,i,n);const t=.5*n.getResult();s.add(t),e.write(r,t)}}this.hasDirtyFlag(1024)&&(this.m_cachedArea2D=s.getResult(),this.m_cachedRingAreas2D=e,this.setDirtyFlagProtected(1024,!1))}getOGCPolygonCount(){if(!this.m_bPolygon)return 0;this.updateOGCFlagsProtected();let t=0;const e=this.getPathCount();for(let s=0;s<e;s++)8&this.m_pathFlags.read(s)&&t++;return t}getHashCodeImpl(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}equalsImpl(t){const e=t,s=this.getPathCount();if(s!==e.getPathCount())return!1;const n=this.hasNonLinearSegments();if(n!==e.hasNonLinearSegments())return!1;if(n){if(this.m_curveData.m_curveCount!==e.m_curveData.m_curveCount)return!1;if(this.m_curveData.m_bezierCount!==e.m_curveData.m_bezierCount)return!1}if(this.m_paths&&!this.m_paths.equals(e.m_paths,0,s+1))return!1;if(this.m_bFillRule!==e.m_bFillRule)return!1;if(!this.m_bPolygon&&this.m_pathFlags&&!this.m_pathFlags.equals(e.m_pathFlags,0,s))return!1;if(this.hasNonLinearSegments()){if(!this.m_curveData.m_segmentFlags.equals(e.m_curveData.m_segmentFlags,0,this.getPointCount()))return!1;for(let t=0,s=this.getPointCount();t<s;t++){const s=this.m_curveData.m_segmentFlags.read(t);if(!Us.isNonLinearSegmentFlag(s))continue;const n=this.m_curveData.m_segmentParamIndex.read(t),i=e.m_curveData.m_segmentParamIndex.read(t),r=Gs(s);for(let t=0;t<r;t++){const s=this.m_curveData.m_segmentParams.read(n+t),r=e.m_curveData.m_segmentParams.read(i+t);if(!(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Q)(s,r))return!1}}}return!0}equalsImplTol(t,e){const s=t,n=this.getPathCount();if(n!==s.getPathCount())return!1;const i=this.hasNonLinearSegments();if(i!==s.hasNonLinearSegments())return!1;if(i){if(this.m_curveData.m_curveCount!==s.m_curveData.m_curveCount)return!1;if(this.m_curveData.m_bezierCount!==s.m_curveData.m_bezierCount)return!1}if(this.m_paths&&!this.m_paths.equals(s.m_paths,0,n+1))return!1;if(this.m_bFillRule!==s.m_bFillRule)return!1;if(!this.m_bPolygon&&this.m_pathFlags&&!this.m_pathFlags.equals(s.m_pathFlags,0,n))return!1;if(!i)return!0;
1if(!this.m_curveData.m_segmentFlags.equals(s.m_curveData.m_segmentFlags,0,this.getPointCount()))return!1;const r=this.querySegmentIterator(),o=s.querySegmentIterator();for(;r.nextPath();){if(!o.nextPath())return!1;for(;r.hasNextSegment();){const t=r.nextCurve(),s=o.nextCurve();if(!(t&&s&&t.equals(s,e))){if(!t&&!s)break;return!1}}}return!0}reserveImplImpl(t,e){this.m_curveData&&this.m_curveData.m_segmentFlags&&(this.m_curveData.m_segmentFlags.resize(t,1),this.m_curveData.m_segmentParamIndex.resize(t,-1),this.checkCompactSegmentParams())}verifyStreamsAfterSizeChangeExtraImpl(){this.m_paths||(this.m_paths=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(1,0),this.m_pathFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(1,0)),this.m_curveData&&this.m_curveData.m_segmentFlags&&(this.m_curveData.m_segmentFlags.resize(this.m_reservedPointCount,1),this.m_curveData.m_segmentParamIndex.resize(this.m_reservedPointCount,-1),this.checkCompactSegmentParams())}copyToImpl(t,e){const s=t;s.m_bPathStarted=!1,s.m_bFillRule=this.m_bFillRule,this.m_paths?s.m_paths=e?this.m_paths:this.m_paths.clone():s.m_paths=null,this.m_pathFlags?s.m_pathFlags=e?this.m_pathFlags:this.m_pathFlags.clone():s.m_pathFlags=null,this.m_curveData&&(s.m_curveData||(s.m_curveData=new Hs),s.m_curveData.assignCopy(this.m_curveData),s.m_curveData.m_curveCount=0,s.updateCurveCounter(this.m_curveData.m_curveCount),e||(this.m_curveData.m_segmentParamIndex?s.m_curveData.m_segmentParamIndex=this.m_curveData.m_segmentParamIndex.clone():s.m_curveData.m_segmentParamIndex=null,this.m_curveData.m_segmentFlags?s.m_curveData.m_segmentFlags=this.m_curveData.m_segmentFlags.clone():s.m_curveData.m_segmentFlags=null,this.m_curveData.m_segmentParams?s.m_curveData.m_segmentParams=this.m_curveData.m_segmentParams.clone():s.m_curveData.m_segmentParams=null)),s.hasDirtyFlag(512)||(s.m_cachedLength2D=this.m_cachedLength2D),s.m_cachedRingAreas2D=null,s.hasDirtyFlag(1024)||(s.m_cachedArea2D=this.m_cachedArea2D,null!==this.m_cachedRingAreas2D&&(s.m_cachedRingAreas2D=e?this.m_cachedRingAreas2D:this.m_cachedRingAreas2D.clone()))}calculateArea2D(){return this.m_bPolygon?(this.updateRingAreas2DProtected(),this.m_cachedArea2D):0}calculateLength2D(){if(!this.hasDirtyFlag(512))return this.m_cachedLength2D;const t=this.querySegmentIterator(),e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(;t.nextPath();)for(;t.hasNextSegment();)e.add(t.nextSegment().calculateLength2D());return this.hasDirtyFlag(512)&&(this.m_cachedLength2D=e.getResult()),this.setDirtyFlagProtected(512,!1),e.getResult()}calculatePathLength2D(t){const e=this.querySegmentIteratorAtVertex(this.getPathStart(t)),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(;e.hasNextSegment();)s.add(e.nextSegment().calculateLength2D());return s.getResult()}calculateLength3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}calculatePathLength3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}copyTo(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(t.getGeometryType())||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this!==t&&super.copyTo(t)}swap(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setPointByVal(t,e){this.setPointByValWithCurves(t,e)}setPointByValWithCurves(t,e){if(this.hasNonLinearSegments()){const s=e.getXY();if(this.setXYCoordsWithCurves(t,s.x,s.y),1===this.m_description.getAttributeCount())return}this.setPointByValNoCurves(t,e)}setXYCoordsWithCurves(t,e,s){if(this.hasNonLinearSegments()){const n=Us.getPathIndexFromPointIndexImpl(this.m_paths,this.getPathCount(),t,this.m_currentPathIndex);this.m_currentPathIndex=n;const i=this.getPrevSegmentTypeFromPath(n,t),r=this.getNextSegmentType(t);if(1!==i||1!==r){let o=t-1;const a=new Pm;if(1!==i){if(this.isClosedPath(n)&&t===this.getPathStart(n)){o=this.getPathEnd(n)-1}this.getSegmentBuffer(o,a,!0)}const h=new Pm;1!==r&&this.getSegmentBuffer(t,h,!0);const u=t+1;this.setXYCoordsNoCurves(t,e,s);const m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(e,s);return 1!==i&&(a.get().changeEndPoints2D(a.get().getStartXY(),m),this.replaceSegmentImpl(o,t,a.get(),!0)),void(1!==r&&(h.get().changeEndPoints2D(m,h.get().getEndXY()),this.replaceSegmentImpl(t,u,h.get(),!0)))}}this.setXYCoordsNoCurves(t,e,s)}setXYZWithCurves(t,e){this.hasNonLinearSegments()?(this.setXYCoordsWithCurves(t,e.x,e.y),this.setAttributeNoCurves(1,t,0,e.z)):this.setXYZNoCurves(t,e)}setAttributeWithCurves(t,e,s,n){if(0===t&&this.hasNonLinearSegments()){const t=this.getXY(e);0===s?t.x=n:t.y=n,this.setXYCoordsWithCurves(e,t.x,t.y)}else this.setAttributeNoCurves(t,e,s,n)}setXY(t,e){this.setXYCoordsWithCurves(t,e.x,e.y)}setXYCoords(t,e,s){this.setXYCoordsWithCurves(t,e,s)}setXYZ(t,e){this.setXYZWithCurves(t,e)}setAttribute(t,e,s,n){this.setAttributeWithCurves(t,e,s,n)}setAttributeWithCurvesFromArray(t,e,s,i){if(0===t&&this.hasNonLinearSegments()){i<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const t=this.getXY(e);t.x=s[0],t.y=s[1],this.setXYCoordsWithCurves(e,t.x,t.y)}else this.setAttributeFromArrayNoCurves(t,e,s,i)}setAttributeFromArray(t,e,s,n){this.setAttributeWithCurvesFromArray(t,e,s,n)}hasNonLinearSegments(){return 0!==this.getCurveCount()}getSegmentCount(){let t=this.getPointCount();if(!this.m_bPolygon){t-=this.getPathCount();for(let e=0,s=this.getPathCount();e<s;e++)this.isClosedPath(e)&&t++}return t}getSegmentCountPath(t){let e=this.getPathSize(t);return!this.isClosedPath(t)&&e>0&&e--,e}
vendor: 30,884 bytes, line 1
1add(t,s){this===t&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl::add");for(let e=0,n=t.getPathCount();e<n;e++)this.addPath(t,e,!s)}addPath(t,e,s){this.insertPath(-1,t,e,s)}addPathPoint2D(t,e,s){this.insertPath2D(-1,t,0,e,s)}addPathMultiPoint(t,e,s,n){s<0&&(s=t.getPointCount()-e),this.insertPointsFromMultipoint(-1,0,t,e,s,n)}addSegmentsFromPath(t,s,i,r,o){if(this===t&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl.add_segments_from_path"),o||0!==this.getPathCount()||(o=!0),s<0&&(s=t.getPathCount()-1),(s>=t.getPathCount()||i<0||r<0||i+r>t.getSegmentCountPath(s))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("add_segments_from_path"),0===r)return;const a=t.getPathStart(s),h=t.isClosedPath(s)&&i+r===t.getSegmentCountPath(s);this.m_bPathStarted=!1,this.mergeVertexDescription(t.getDescription());let u=r;const m=a+i;let l=m+1;o&&(u++,l--),!o&&t.hasNonLinearSegments()&&1!==t.m_curveData.m_segmentFlags.read(m)&&(t.getXY(m).equals(this.getXY(this.m_pointCount-1))||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("add_segments_from_path: start point mismatch"));const c=this.m_pointCount;if(this.resizeImpl(this.m_pointCount+u),this.verifyAllStreamsAfterSizeChange(),o){if(0===u)return;this.m_paths.add(this.m_pointCount);let e=t.m_pathFlags.read(s);this.m_bPolygon&&(e|=1),this.m_pathFlags.write(this.m_pathFlags.size()-1,e),this.m_pathFlags.add(0)}else this.m_paths.write(this.m_pathFlags.size()-1,this.m_pointCount);const g=h?u-1:u;for(let e=0,n=this.m_description.getAttributeCount();e<n;e++){const s=this.m_description.getSemantics(e),n=Zs.getComponentCount(s),i=t.m_description.getAttributeIndex(s);if(g>0){if(i<0||!t.m_vertexAttributes.get(i)){const t=Zs.getDefaultValue(s);this.m_vertexAttributes.get(e).insertRange(n*c,t,g*n,n*c),h&&this.m_vertexAttributes.get(e).insertRange(n*c+g*n,t,n,n*c);continue}this.m_vertexAttributes.get(e).insertRangeFromStream(n*c,t.m_vertexAttributes.get(i),n*l,g*n,!0,n,n*c)}h&&this.m_vertexAttributes.get(e).insertRangeFromStream(n*(c+g),t.m_vertexAttributes.get(i),n*a,n,!0,n,n*(c+g))}if(this.hasNonLinearSegments()&&this.initSegmentData(0),t.hasNonLinearSegments()){let e=0;for(let s=0,n=m;s<r;s++){e+=Gs(t.m_curveData.m_segmentFlags.read(n)),n++}if(e>0){this.initSegmentData(e);let s=m,n=c-(o?0:1),i=0;for(let e=0;e<r;e++){const e=t.m_curveData.m_segmentFlags.read(s);if(this.m_curveData.m_segmentFlags.write(n,e),Us.isNonLinearSegmentFlag(e)){i++;let r=t.m_curveData.m_segmentParamIndex.read(s);const o=Gs(e);this.m_curveData.m_segmentParamIndex.write(n,this.m_curveData.m_curveParamWritePoint);for(let e=0;e<o;e++){const e=t.m_curveData.m_segmentParams.read(r);this.m_curveData.m_segmentParams.write(this.m_curveData.m_curveParamWritePoint,e),this.m_curveData.m_curveParamWritePoint++,r++}this.incCurveType(e,1)}else this.m_curveData.m_segmentParamIndex.write(n,-1);n++,s++}this.modifyCurveCounter(i)}}if(h){const t=this.getPathCount()-1,e=this.getPathStart(t),s=this.getPathEnd(t)-1,n=this.getXY(e),i=this.getXY(s);n.isEqualPoint2D(i)&&(--this.m_pointCount,this.m_paths.write(t+1,this.m_pointCount))}this.notifyModifiedFlags(2001)}reverseAllPaths(){for(let t=0,e=this.getPathCount();t<e;t++)this.reversePath(t)}reversePath(t){t>=this.getPathCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const s=this.getPathSize(t);if(0===s)return;const n=this.getPathStart(t),i=this.isClosedPath(t);if(this.hasNonLinearSegments()){let t=n;const e=new this.m_segmentBufferCTor;let r=!1;for(let n=0;n<s;n++,t++){const s=this.m_curveData.m_segmentFlags.read(t);if(!Us.isNonLinearSegmentFlag(s))continue;r=!0,this.querySegment(t,e,!0),e.get().reverse();const n=this.m_curveData.m_segmentParamIndex.read(t);e.get().writeInBufferStream(this.m_curveData.m_segmentParams,n)}if(r){const t=i?0:1;this.m_curveData.m_segmentFlags.reverseRange(n,s-t,1),this.m_curveData.m_segmentParamIndex.reverseRange(n,s-t,1)}}const r=i?1:0;for(let e=0,a=this.m_description.getAttributeCount();e<a;e++)if(this.m_vertexAttributes.get(e)){const t=this.m_description.getSemantics(e),i=Zs.getComponentCount(t);this.m_vertexAttributes.get(e).reverseRange(i*(n+r),i*(s-r),i)}const o=6&this.m_pathFlags.read(t);if(o){let e=0;4&o&&(e|=2),2&o&&(e|=4),this.m_pathFlags.clearBits(t,6),this.m_pathFlags.setBits(t,e)}this.notifyModifiedFlags(1233)}removePath(t){const s=this.getPathCount();t<0&&(t=s-1),t>=s&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const n=this.getPathStart(t),i=this.getPathSize(t);for(let e=0,r=this.m_description.getAttributeCount();e<r;e++)if(this.m_vertexAttributes.get(e)){const t=this.m_description.getSemantics(e),s=Zs.getComponentCount(t);this.m_vertexAttributes.get(e).eraseRange(s*n,s*i,s*this.m_pointCount)}if(this.hasNonLinearSegments()){let t=0;for(let e=n,s=n+i;e<s;e++){const s=this.m_curveData.m_segmentFlags.read(e);Us.isNonLinearSegmentFlag(s)&&(this.incCurveType(s,-1),t++)}this.modifyCurveCounter(-t),this.m_curveData.m_segmentFlags.eraseRange(n,i,this.m_pointCount),this.m_curveData.m_segmentParamIndex.eraseRange(n,i,this.m_pointCount)}for(let e=t+1;e<=s;e++){const t=this.m_paths.read(e);this.m_paths.write(e-1,t-i)}if(this.m_pathFlags)for(let e=t+1;e<=s;e++){const t=this.m_pathFlags.read(e);this.m_pathFlags.write(e-1,t)}this.m_paths.resize(s),this.m_pathFlags.resize(s),this.m_pointCount-=i,this.m_reservedPointCount-=i,t===s-1&&(this.m_bPathStarted=!1),this.notifyModifiedFlags(2001),this.checkCompactSegmentParams(),this.dbgVerifyCurves()}dbgVerifyCurves(){}insertPath(t,s,n,i){this===s&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl::insert_path");const r=this.getPathCount();if(!i&&s.hasNonLinearSegmentsPath(n))return t=this.insertPath(t,s,n,!0),this.reversePath(t),t;n>=s.getPathCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),t>r&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),t<0&&(t=r),n<0&&(n=s.getPathCount()-1),this.m_bPathStarted=!1,this.mergeVertexDescription(s.getDescription());const o=s.getPathStart(n),a=s.getPathSize(n);if(0===a)return this.insertPath2D(t,null,0,0,!0);const h=this.m_pointCount,u=s.isClosedPath(n)&&!i?1:0;this.resizeImpl(this.m_pointCount+a),this.verifyAllStreamsAfterSizeChange();const m=t<r?this.getPathStart(t):h;for(let e=0,g=this.m_description.getAttributeCount();e<g;e++){const t=this.m_description.getSemantics(e),n=s.getDescription().getAttributeIndex(t),r=Zs.getComponentCount(t);if(n>=0&&s.m_vertexAttributes.get(n))0!==u&&this.m_vertexAttributes.get(e).insertRangeFromStream(m*r,s.m_vertexAttributes.get(n),r*o,r,!0,r,r*h),this.m_vertexAttributes.get(e).insertRangeFromStream((m+u)*r,s.m_vertexAttributes.get(n),r*(o+u),r*(a-u),i,r,r*(h+u));else{const s=Zs.getDefaultValue(t);this.m_vertexAttributes.get(e).insertRange(m*r,s,r*a,r*h)}}const l=h+a;this.m_paths.add(l);for(let e=r;e>=t+1;e--){const t=this.m_paths.read(e-1);this.m_paths.write(e,t+a)}this.m_pathFlags.add(0);for(let e=r-1;e>=t+1;e--){let t=this.m_pathFlags.read(e);t&=-9,this.m_pathFlags.write(e+1,t)}let c=s.getPathFlagsStreamRef().read(n);if(c&=-9,this.m_bPolygon&&(c|=1),this.m_pathFlags.write(t,c),s.hasNonLinearSegments()){this.initSegmentData(0);let t=o,e=0;for(let n=0;n<a;n++){e+=Gs(s.m_curveData.m_segmentFlags.read(t)),t++}if(e>0){null===this.m_curveData.m_segmentFlags?(this.m_curveData.m_segmentFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(this.m_pointCount,1),this.m_curveData.m_segmentParamIndex=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(this.m_pointCount,-1)):(this.m_curveData.m_segmentFlags.insertRange(m,1,a,h),this.m_curveData.m_segmentParamIndex.insertRange(m,-1,a,h)),this.m_curveData.m_segmentParams?this.m_curveData.m_segmentParams.resize(this.m_curveData.m_curveParamWritePoint+e):this.m_curveData.m_segmentParams=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(e),t=o;let n=m,i=0;for(let e=0;e<a;e++){const e=s.m_curveData.m_segmentFlags.read(t);if(Us.isNonLinearSegmentFlag(e)){this.m_curveData.m_segmentFlags.write(n,e),this.m_curveData.m_segmentParamIndex.write(n,this.m_curveData.m_curveParamWritePoint);const r=Gs(e);let o=s.m_curveData.m_segmentParamIndex.read(t);for(let t=0;t<r;t++){const t=s.m_curveData.m_segmentParams.read(o);this.m_curveData.m_segmentParams.write(this.m_curveData.m_curveParamWritePoint,t),this.m_curveData.m_curveParamWritePoint++,o++}i++,this.incCurveType(e,1)}t++,n++}this.modifyCurveCounter(i)}}return this.notifyModifiedFlags(2001),t}insertPath2D(t,s,n,i,r){const o=this.getPathCount();(t>o||n<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),t<0&&(t=o),this.m_bPathStarted=!1;const a=this.m_pointCount;this.resizeImpl(this.m_pointCount+i),0===i&&this.notifyModifiedFlags(32),this.verifyAllStreamsAfterSizeChange();const h=t<o?this.getPathStart(t):a;if(s)this.m_vertexAttributes.get(0).insertRangeFromPoints(2*h,s,n,i,r,2*a);else{const t=Zs.getDefaultValue(0);this.m_vertexAttributes.get(0).insertRange(2*h,t,2*i,2*a)}for(let e=1,u=this.m_description.getAttributeCount();e<u;e++){const t=this.m_description.getSemantics(e),s=Zs.getComponentCount(t),n=Zs.getDefaultValue(t);this.m_vertexAttributes.get(e).insertRange(h*s,n,s*i,s*a)}this.m_paths.add(this.m_pointCount);for(let e=o;e>=t+1;e--){const t=this.m_paths.read(e-1);this.m_paths.write(e,t+i)}this.m_pathFlags.add(0);for(let e=o-1;e>=t+1;e--){let t=this.m_pathFlags.read(e);t&=-9,this.m_pathFlags.write(e+1,t)}return this.m_bPolygon&&this.m_pathFlags.write(t,1),this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.insertRange(h,1,i,a),this.m_curveData.m_segmentParamIndex.insertRange(h,-1,i,a)),this.notifyModifiedFlags(2001),t}insertPathFromMultipoint(t,s,n,i,r){const o=s.getImpl(),a=this.getPathCount();(t>a||n<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const h=i<0?o.getPointCount()-n:i;if(h>o.getPointCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),n>=o.getPointCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("pointsOffset"),t<0&&(t=a),this.m_bPathStarted=!1,this.mergeVertexDescription(o.getDescription()),0===h)return void this.insertPath2D(t,null,0,0,!0);const u=this.m_pointCount,m=n;this.resizeImpl(this.m_pointCount+h),this.verifyAllStreamsAfterSizeChange();const l=t<a?this.getPathStart(t):u;for(let e=0,d=this.m_description.getAttributeCount();e<d;e++){const t=this.m_description.getSemantics(e),s=o.getDescription().getAttributeIndex(t),n=Zs.getComponentCount(t);if(s>=0){const s=o.getAttributeStreamRef(t);this.m_vertexAttributes.get(e).insertRangeFromStream(l*n,s,n*m,n*h,r,n,n*u)}else{const s=Zs.getDefaultValue(t);this.m_vertexAttributes.get(e).insertRange(l*n,s,n*h,n*u)}}const c=u+h;this.m_paths.add(c);for(let e=a;e>=t+1;e--){const t=this.m_paths.read(e-1);this.m_paths.write(e,t+h)}this.m_pathFlags.add(0);for(let e=a-1;e>=t+1;e--){let t=this.m_pathFlags.read(e);t&=-9,this.m_pathFlags.write(e+1,t)}let g=0;this.m_bPolygon&&(g|=1),this.m_pathFlags.write(t,g),this.notifyModifiedFlags(2001)}insertPoints(t,s,i,r,o,a,h){if(this===i&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl.insert_points"),t<0&&(t=this.getPathCount()),r<0&&(r=i.getPathCount()-1),(t>this.getPathCount()||s>=0&&s>this.getPathSize(t)||r>=i.getPathCount()||a>i.getPathSize(r))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),!a)return;if(this.mergeVertexDescription(i.m_description),t===this.getPathCount()){this.m_paths.add(this.m_pointCount);let t=i.m_pathFlags.read(r);t&=-9,this.m_bPolygon?this.m_pathFlags.add(1|t):this.m_pathFlags.add(t)}s<0&&(s=this.getPathSize(t));const u=this.m_pointCount;this.resizeImpl(this.m_pointCount+a),this.verifyAllStreamsAfterSizeChange();const m=this.getPathStart(t),l=m+s;a<0&&(a=i.getPathSize(r));const c=i.getPathStart(r),g=c+a;for(let e=0,n=this.m_description.getAttributeCount();e<n;e++){const t=this.m_description.getSemantics(e),n=Zs.getComponentCount(t),r=i.m_description.getAttributeIndex(t);if(r<0||!i.m_vertexAttributes.get(r)){const s=Zs.getDefaultValue(t);this.m_vertexAttributes.get(e).insertRange(n*l,s,g*n,n*u);continue}this.m_vertexAttributes.get(e)?.insertRangeFromStream(n*(m+s),i.m_vertexAttributes.get(r),n*(c+o),a*n,h,n,n*u)}this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.insertRange(m+s,1,a,u),this.m_curveData.m_segmentParamIndex.insertRange(m+s,-1,a,u),s>0&&this.isNonLinearSegment(m+s-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(m+s-1),-1),this.m_curveData.m_segmentFlags.write(m+s-1,1),this.m_curveData.m_segmentParamIndex.write(m+s-1,-1),this.modifyCurveCounter(-1)));for(let e=t+1,n=this.getPathCount();e<=n;e++){const t=this.m_paths.read(e);this.m_paths.write(e,t+a)}this.notifyModifiedFlags(2001)}insertPointsFromPoints(t,e,s,i,r,o){if(t<0&&(t=this.getPathCount()),(t>this.getPathCount()||e>this.getPathSize(t)||i<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),!r)return;t===this.getPathCount()&&(this.m_paths.add(this.m_pointCount),this.m_bPolygon?this.m_pathFlags.add(1):this.m_pathFlags.add(0)),e<0&&(e=this.getPathSize(t));const a=this.m_pointCount;this.resizeImpl(this.m_pointCount+r),this.verifyAllStreamsAfterSizeChange();const h=this.getPathStart(t);this.m_vertexAttributes.get(0).insertRangeFromPoints(2*(h+e),s,i,r,o,2*a);for(let n=1,u=this.m_description.getAttributeCount();n<u;n++){const t=this.m_description.getSemantics(n),s=Zs.getComponentCount(t),i=Zs.getDefaultValue(t);this.m_vertexAttributes.get(n).insertRange((h+e)*s,i,s*r,s*a)}this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.insertRange(h+e,1,r,a),this.m_curveData.m_segmentParamIndex.insertRange(h+e,-1,r,a),e>0&&this.isNonLinearSegment(h+e-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(h+e-1),-1),this.m_curveData.m_segmentFlags.write(h+e-1,1),this.m_curveData.m_segmentParamIndex.write(h+e-1,-1),this.modifyCurveCounter(-1)));for(let n=t+1,u=this.getPathCount();n<=u;n++)this.m_paths.write(n,this.m_paths.read(n)+r);this.notifyModifiedFlags(2001)}insertPointsFromMultipoint(t,e,s,i,r,o){const a=s.getImpl(),h=this.getPathCount();t<0&&(t=this.getPathCount());const u=a.getPointCount();if((i<0||i>u)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),(r<0||i+r>u)&&(r=u-i),e<0&&(e=t<h?this.getPathSize(t):0),(t>h||t<h&&e>this.getPathSize(t)||t===h&&e>0||r<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),!r)return;if(this.mergeVertexDescription(a.getDescription()),t===h){this.m_paths.add(this.m_pointCount);const t=0;this.m_bPolygon?this.m_pathFlags.add(1|t):this.m_pathFlags.add(t)}e<0&&(e=this.getPathSize(t));const m=this.m_pointCount;this.resizeImpl(this.m_pointCount+r),this.verifyAllStreamsAfterSizeChange();const l=this.getPathStart(t),c=l+e,g=0,d=g+r;for(let n=0,_=this.m_description.getAttributeCount();n<_;n++){const t=this.m_description.getSemantics(n),s=Zs.getComponentCount(t);if(a.getDescription().getAttributeIndex(t)<0){const e=Zs.getDefaultValue(t);this.m_vertexAttributes.get(n).insertRange(s*c,e,d*s,s*m);continue}const h=a.getAttributeStreamRef(t);this.m_vertexAttributes.get(n).insertRangeFromStream(s*(l+e),h,s*(g+i),r*s,o,s,s*m)}this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.insertRange(l+e,1,r,m),this.m_curveData.m_segmentParamIndex.insertRange(l+e,-1,r,m),e>0&&this.isNonLinearSegment(l+e-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(l+e-1),-1),this.m_curveData.m_segmentFlags.write(l+e-1,1),this.m_curveData.m_segmentParamIndex.write(l+e-1,-1),this.modifyCurveCounter(-1)));for(let n=t+1,_=this.getPathCount();n<=_;n++){const t=this.m_paths.read(n);this.m_paths.write(n,t+r)}this.notifyModifiedFlags(2001)}insertPoint2D(t,e,s){const i=this.getPathCount();t<0&&(t=i),(t>i||t<i&&e>this.getPathSize(t))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),t===i&&this.addPathPoint2D(null,0,!0);const r=this.m_pointCount;this.resizeImpl(this.m_pointCount+1),this.verifyAllStreamsAfterSizeChange();const o=this.getPathStart(t),a=e<0?this.getPathSize(t)+o:e+o,h=this.m_vertexAttributes.get(0);if(a===r)this.m_paths.write(t+1,r+1),h.writePoint2D(2*a,s);else{h.insert(2*a,s,2*r);for(let t=1,e=this.m_description.getAttributeCount();t<e;t++){const e=this.m_description.getSemantics(t),s=Zs.getComponentCount(e),n=Zs.getDefaultValue(e);this.m_vertexAttributes.get(t).insertRange(s*a,n,s,s*r)}this.m_curveData&&this.m_curveData.m_segmentFlags&&(this.m_curveData.m_segmentFlags.insertRange(a,1,1,r),this.m_curveData.m_segmentParamIndex.insertRange(a,-1,1,r));for(let e=t+1,s=i;e<=s;e++)this.m_paths.write(e,this.m_paths.read(e)+1)}this.m_curveData&&this.m_curveData.m_segmentFlags&&a>o&&this.isNonLinearSegment(a-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(a-1),-1),this.modifyCurveCounter(-1),this.m_curveData.m_segmentFlags.write(a-1,1),this.m_curveData.m_segmentParamIndex.write(a-1,-1)),this.notifyModifiedFlags(2001)}insertPoint(t,e,s){const i=this.getPathCount();t<0&&(t=i),(t>i||t<i&&e>this.getPathSize(t))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),t===i&&this.addPathPoint2D(null,0,!0);const r=this.m_pointCount;this.resizeImpl(this.m_pointCount+1),this.verifyAllStreamsAfterSizeChange();const o=this.getPathStart(t),a=e<0?this.getPathSize(t)+o:e+o;if(a===r)this.m_paths.write(t+1,r+1),this.setPointByValNoCurves(a,s);else{const e=s.getDescription();this.m_description!==e&&this.mergeVertexDescription(e);for(let t=0,n=this.m_description.getAttributeCount();t<n;t++){const n=this.m_description.getSemantics(t),i=Zs.getComponentCount(n);if(e.hasAttribute(n))this.m_vertexAttributes.get(t).insertAttributes(i*a,s,n,i*r);else{const e=Zs.getDefaultValue(n);this.m_vertexAttributes.get(t).insertRange(i*a,e,i,i*r)}}this.m_curveData&&this.m_curveData.m_segmentFlags&&(this.m_curveData.m_segmentFlags.insertRange(a,1,1,r),this.m_curveData.m_segmentParamIndex.insertRange(a,-1,1,r));for(let s=t+1,n=i;s<=n;s++)this.m_paths.write(s,this.m_paths.read(s)+1)}this.m_curveData&&this.m_curveData.m_segmentFlags&&a>o&&this.isNonLinearSegment(a-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(a-1),-1),this.modifyCurveCounter(-1),this.m_curveData.m_segmentFlags.write(a-1,1),this.m_curveData.m_segmentParamIndex.write(a-1,-1)),this.notifyModifiedFlags(2001)}removePointFromPath(t,e){const s=this.getPathCount();t<0&&(t=s-1),(t>=s||e>=this.getPathSize(t))&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("Multi_path.remove_point");const i=this.getPathStart(t),r=this.isClosedPath(t);e<0&&(e=this.getPathSize(t)-1),e<0&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("Multi_path.remove_point");const o=i+e;for(let n=0,a=this.m_description.getAttributeCount();n<a;n++)if(this.m_vertexAttributes.get(n)){const t=this.m_description.getSemantics(n),e=Zs.getComponentCount(t);this.m_vertexAttributes.get(n).eraseRange(e*o,e,e*this.m_pointCount)}if(this.m_curveData&&this.m_curveData.m_segmentFlags){this.checkCompactSegmentParams();let e=0;if(o>i&&this.isNonLinearSegment(o-1))e+=1,this.incCurveType(this.m_curveData.m_segmentFlags.read(o-1),-1),this.m_curveData.m_segmentFlags.write(o-1,1),this.m_curveData.m_segmentParamIndex.write(o-1,-1);else{const s=this.getPathEnd(t);r&&i+1<s&&this.isNonLinearSegment(s-1)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(s-1),-1),this.m_curveData.m_segmentFlags.write(s-1,1),this.m_curveData.m_segmentParamIndex.write(s-1,-1),e+=1)}this.isNonLinearSegment(o)&&(this.incCurveType(this.m_curveData.m_segmentFlags.read(o),-1),e+=1),e>0&&this.modifyCurveCounter(-e),this.m_curveData.m_segmentFlags.eraseRange(o,1,this.m_pointCount),this.m_curveData.m_segmentParamIndex.eraseRange(o,1,this.m_pointCount)}for(let n=s;n>=t+1;n--){const t=this.m_paths.read(n);this.m_paths.write(n,t-1)}this.m_pointCount--,this.m_reservedPointCount--,this.notifyModifiedFlags(2001)}removePoint(t){let e;e=t<0?this.getPathCount()-1:this.getPathIndexFromPointIndex(t),this.removePointFromPath(e,t-this.getPathStart(e))}getNextSegmentType(t){return this.hasNonLinearSegments()?this.m_curveData.m_segmentFlags.read(t):1}getPrevSegmentTypeFromPath(t,e){if(!this.hasNonLinearSegments())return 1;const s=this.getPathStart(t);if(e>s)return this.m_curveData.m_segmentFlags.read(e-1);if(e===s){if(this.isClosedPath(t)){const e=this.getPathEnd(t);return this.m_curveData.m_segmentFlags.read(e-1)}return 1}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}getNumberOfCurves(t){if(!this.hasNonLinearSegments())return 0;let e=0;for(let s=this.getPathStart(t),n=this.getPathEnd(t);s<n;s++)Us.isNonLinearSegmentFlag(this.m_curveData.m_segmentFlags.read(s))&&++e;return e}getPathCount(){return this.m_paths?this.m_paths.size()-1:0}getPathSize(t){return this.m_paths.read(t+1)-this.m_paths.read(t)}getPathStart(t){return this.m_paths.read(t)}getPathEnd(t){return this.m_paths.read(t+1)}getPathIndexFromPointIndex(t,e=-1){-1===e&&(e=this.m_currentPathIndex);const s=this.getPathCount(),n=Us.getPathIndexFromPointIndexImpl(this.m_paths,s,t,e);return this.m_currentPathIndex=n,n}startPathCoords(t,e){this.startPathPoint(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({x:t,y:e}))}startPath(t){this.startPathPoint(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({pt:t}))}startPath3D(t){this.startPathPoint(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({x:t.x,y:t.y,z:t.z}))}startPath3DCoords(t,e,s){this.startPathPoint(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({x:t,y:e,z:s}))}startPathPoint(t){t.isEmpty()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const s=t.getDescription();let n;if(this.m_description!==s){this.mergeVertexDescription(s);const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.m_description});t.copyCommonAttributesTo(e),n=e}else n=t;this.m_bPathStarted?this.setPointByValNoCurves(this.m_pointCount-1,n):(this.insertPoint(-1,-1,n),this.m_bPathStarted=!0)}beforeNewSegmentHelper2(){this.m_paths=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(2),this.m_paths.write(0,0),this.m_pathFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(2,0),this.m_bPolygon&&this.m_pathFlags.write(0,1)}beforeNewSegmentHelper1(){null!==this.m_paths?(this.m_paths.add(0),this.m_pathFlags.add(0),this.m_bPolygon&&this.m_pathFlags.write(this.m_pathFlags.size()-2,1)):this.beforeNewSegmentHelper2()}beforeNewSegment(t){0!==this.m_pointCount||this.m_bPathStarted||this.startPathCoords(0,0);const e=this.m_pointCount,s=this.m_paths.size()-1,n=e+t;this.m_paths.write(s,n),this.resizeImpl(n),this.m_bPathStarted&&(this.m_bPathStarted=!1)}finishLineTo(){if(this.hasNonLinearSegments()){const t=this.m_curveData.m_segmentFlags.read(this.m_pointCount-1);1!==t&&(this.m_curveData.m_segmentFlags.write(this.m_pointCount-1,1),this.m_curveData.m_segmentParamIndex.write(this.m_pointCount-1,-1),this.modifyCurveCounter(-1),this.incCurveType(t,-1))}}lineToCoords(t,e){if(this.beforeNewSegment(1),1===this.m_description.getAttributeCount())this.setXYCoordsNoCurves(this.m_pointCount-1,t,e);else{const s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),n=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.m_description,attribBuffer:s,initDefaultValues:!0});n.setXYCoords(t,e),this.setPointByValNoCurves(this.m_pointCount-1,n)}this.finishLineTo()}lineTo(t){this.lineToCoords(t.x,t.y)}lineTo3D(t){this.beforeNewSegment(1);const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.n)(this.m_description,(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.z)()),s=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),n=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:e,attribBuffer:s,initDefaultValues:!0});n.setXYZ(t),this.setPointByValNoCurves(this.m_pointCount-1,n),this.finishLineTo()}lineTo3DCoords(t,e,s){this.lineTo3D(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f(t,e,s))}lineToPoint(t){if(this.beforeNewSegment(1),this.m_description===t.getDescription())this.setPointByValNoCurves(this.m_pointCount-1,t);else{this.mergeVertexDescription(t.getDescription());const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.m_description,attribBuffer:e,initDefaultValues:!1});t.copyCommonAttributesTo(s),this.setPointByValNoCurves(this.m_pointCount-1,s)}this.finishLineTo()}openPathAndDuplicateStartVertex(t){this.m_bPolygon&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("");const s=this.getPathCount();if(t>s&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),!this.isClosedPath(t))return;this.m_pathFlags||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("");const n=this.m_pointCount,i=this.getPathStart(t),r=this.getPathEnd(t);if(r-i!==0){this.resizeImpl(this.m_pointCount+1),this.verifyAllStreamsAfterSizeChange();for(let t=0,e=this.m_description.getAttributeCount();t<e;t++)if(this.m_vertexAttributes.get(t)){const e=this.m_description.getSemantics(t),s=Zs.getComponentCount(e);this.m_vertexAttributes.get(t).insertRangeFromStream(s*r,this.m_vertexAttributes.get(t),s*i,s,!0,1,s*n)}for(let e=s;e>t;e--){const t=this.m_paths.read(e);this.m_paths.write(e,t+1)}this.hasNonLinearSegments()&&(this.m_curveData.m_segmentFlags.insertRange(r,1,1,n),this.m_curveData.m_segmentParamIndex.insertRange(r,-1,1,n)),this.m_pathFlags.clearBits(t,1)}}openPath(t){this.m_bPolygon&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),t>this.getPathCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.m_pathFlags||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),this.m_pathFlags.clearBits(t,1)}isStrongPathStart(t){return!!(2&this.m_pathFlags.read(t))}setStrongPathStart(t,e){e?this.m_pathFlags.setBits(t,2):this.m_pathFlags.clearBits(t,2)}isStrongPathEnd(t){return!!(4&this.m_pathFlags.read(t))}setStrongPathEnd(t,e){e?this.m_pathFlags.setBits(t,4):this.m_pathFlags.clearBits(t,4)}clearStrongPathEnds(){for(let t=0,e=this.getPathCount();t<e;++t)this.m_pathFlags.clearBits(t,6)}openAllPathsAndDuplicateStartVertex(){if(this.m_bPolygon&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),this.isEmpty())return;this.m_pathFlags||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("");let t=0;const e=this.getPathCount();for(let h=0;h<e;h++)this.isClosedPath(h)&&(this.getPathSize(h)>0?t++:this.m_pathFlags.clearBits(h,1));if(0===t)return;const s=this.hasNonLinearSegments();let n=0;const i=this.getPathCount(),r=this.m_description.getAttributeCount(),o=new Array(r);let a=null,u=null;for(let h=0;h<i;++h){const e=this.getPathStart(h),i=this.getPathSize(h),m=this.isClosedPath(h);if(i>0){const h=e+n;for(let s=0;s<r;s++)if(this.m_vertexAttributes.get(s)){const n=this.m_description.getSemantics(s),r=Zs.getComponentCount(n);if(!o[s]){const e=r*(this.m_pointCount+t),i=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.w)(n,e);o[s]=i}o[s].writeRange(h*r,i*r,this.m_vertexAttributes.get(s),e*r,!0,1),m&&o[s].writeRange((h+i)*r,r,this.m_vertexAttributes.get(s),e*r,!0,1)}if(s){if(null===a){const e=this.m_pointCount+t;a=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(e),u=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(e)}a.writeRange(h,i,this.m_curveData.m_segmentFlags,e,!0,1),u.writeRange(h,i,this.m_curveData.m_segmentParamIndex,e,!0,1),m&&(a.write(h+i,1),u.write(h+i,-1))}}this.m_paths.write(h,e+n),m&&(this.m_pathFlags.clearBits(h,1),++n)}this.m_paths.write(i,this.m_pointCount+t),this.m_pathFlags.clearBits(i,1);for(let h=0;h<r;h++)this.m_vertexAttributes.get(h)&&this.m_vertexAttributes.set(h,o[h]);s&&(this.m_curveData.m_segmentFlags=a,this.m_curveData.m_segmentParamIndex=u),this.m_pointCount+=t,this.m_reservedPointCount>0&&(this.m_reservedPointCount=this.m_pointCount)}closePathWithLine(t){void 0===t&&(t=this.getPathCount()-1),this.throwIfEmpty(),(t<0||t>=this.getPathCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("close_path_with_line"),t===this.getPathCount()-1&&(this.m_bPathStarted=!1);const s=this.m_pathFlags.read(t);if(1&s||this.m_pathFlags.write(t,1|s),this.m_curveData&&this.m_curveData.m_segmentFlags){const e=this.getPathEnd(t)-1,s=this.m_curveData.m_segmentFlags.read(e);1!==s&&(this.m_curveData.m_segmentFlags.write(e,1),this.m_curveData.m_segmentParamIndex.write(e,-1),this.incCurveType(s,-1),this.modifyCurveCounter(-1))}this.notifyModifiedFlags(2001)}closeLastPathWithSegment(t){this.closePathWithSegment(this.getPathCount()-1,t)}closePathWithSegment(t,s){if(this.throwIfEmpty(),(t<0||t>=this.getPathCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("close_path_with_line"),s.getEndXY().equals(this.getXY(this.getPathStart(t)))||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("close_path_with_segment: end point mismatch"),t===this.getPathCount()-1)this.m_bPathStarted=!1,this.addSegment(s,!1),--this.m_pointCount,this.m_paths.write(t+1,this.m_pointCount);else{this.mergeVertexDescription(s.getDescription());const n=s.getStartXY(),r=this.getPathEnd(t)-1;n.equals(this.getXY(r))||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("close_path_with_segment: start point mismatch");const o=s.getGeometryType();if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)return void this.closePathWithLine(t);{const t=ks(s);this.initSegmentData(t);const e=Hs.toSegType(o),n=this.m_curveData.m_segmentFlags.read(r);if(n!==e)this.m_curveData.m_segmentParamIndex.write(r,this.m_curveData.m_curveParamWritePoint),s.writeInBufferStream(this.m_curveData.m_segmentParams,this.m_curveData.m_curveParamWritePoint),this.m_curveData.m_curveParamWritePoint+=t,this.incCurveType(e,1),1!==n?this.incCurveType(n,-1):this.modifyCurveCounter(1);else{const t=this.m_curveData.m_segmentParamIndex.read(r);s.writeInBufferStream(this.m_curveData.m_segmentParams,t)}this.m_curveData.m_segmentFlags.write(r,e)}}const n=this.m_pathFlags.read(t);1&n||this.m_pathFlags.write(t,1|n),this.notifyModifiedFlags(2001)}closeAllPaths(){if(this.m_bPolygon||this.isEmptyImpl())return;this.m_bPathStarted=!1;let t=!1;for(let e=0,s=this.m_paths.size()-1;e<s;e++){if(this.isClosedPath(e))continue;const s=this.m_pathFlags.read(e);this.m_pathFlags.write(e,1|s),t=!0}t&&this.notifyModifiedFlags(512)}isClosedPath(t){return!!(1&this.m_pathFlags.read(t))}isClosedPathInXYPlane(t){if(this.isClosedPath(t))return!0;const e=this.getPathStart(t),s=this.getPathEnd(t)-1;if(e>s)return!1;const n=this.getXY(e),i=this.getXY(s);return n.isEqualPoint2D(i)}isClosedPathIn3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}hasNonLinearSegmentsPath(t){if(!this.hasNonLinearSegments())return!1;for(let e=this.getPathStart(t),s=this.getPathEnd(t);e<s;e++)if(Us.isNonLinearSegmentFlag(this.m_curveData.m_segmentFlags.read(e)))return!0;return!1}isNonLinearSegment(t){return!(1&this.getSegmentFlags(t))}addEnvelope(t,e){if(t.isEmpty())return;const s=0===this.m_pointCount;if(t instanceof _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D)this.startPathCoords(t.xmin,t.ymin),e?(this.lineToCoords(t.xmax,t.ymin),this.lineToCoords(t.xmax,t.ymax),this.lineToCoords(t.xmin,t.ymax)):(this.lineToCoords(t.xmin,t.ymax),this.lineToCoords(t.xmax,t.ymax),this.lineToCoords(t.xmax,t.ymin));else{const s=t.getDescription(),n=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),i=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:s,attribBuffer:n,initDefaultValues:!1});for(let r=0,o=4;r<o;r++){const s=e?o-r-1:r;t.queryCornerByVal(s,i),0===r?this.startPathPoint(i):this.lineToPoint(i)}}
1this.closePathWithLine(),this.m_bPathStarted=!1,s&&!e&&(this.setDirtyFlagProtected(256,!1),this.m_bPolygon&&Math.min(t.width(),t.height())>0&&this.setIsSimple(3,0))}addPathFromClosedSegment(t,s){if(t.isClosed()||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("add_path_from_closedSegment: segment must be closed"),s){const e=t.getReversed(),s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;e.queryStart(s),this.startPathPoint(s),this.closeLastPathWithSegment(e)}else{const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;t.queryStart(e),this.startPathPoint(e),this.closeLastPathWithSegment(t)}}addSegment_(t,s){const n=t.getDescription();this.mergeVertexDescription(n);const r=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),o=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:n,attribBuffer:r,initDefaultValues:!1}),a=t.getGeometryType();if(a===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)(s||this.isEmptyImpl())&&(t.queryStart(o),this.startPathPoint(o)),t.queryEnd(o),this.lineToPoint(o);else{let n=!1;if((s||this.isEmptyImpl())&&(n=!0),!n){t.getStartXY().equals(this.getXY(this.m_pointCount-1))||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("add_segment: start point mismatch")}if(n&&(t.queryStart(o),this.startPathPoint(o)),this.beforeNewSegment(1),t.queryEnd(o),o.getDescription()===this.m_description)this.setPointByVal(this.m_pointCount-1,o);else{const t=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.q)(),e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.m_description,attribBuffer:t,initDefaultValues:!1});o.copyCommonAttributesTo(e),this.setPointByVal(this.m_pointCount-1,e)}const i=ks(t);this.initSegmentData(i),this.m_curveData.m_segmentParamIndex.write(this.m_pointCount-2,this.m_curveData.m_curveParamWritePoint),t.writeInBufferStream(this.m_curveData.m_segmentParams,this.m_curveData.m_curveParamWritePoint),this.m_curveData.m_curveParamWritePoint+=i;const r=Hs.toSegType(a);this.incCurveType(r,1),this.modifyCurveCounter(1),this.m_curveData.m_segmentFlags.write(this.m_pointCount-2,r)}}addSegment(t,e,s){s?e?this.addPathFromClosedSegment(t,!1):this.closeLastPathWithSegment(t):this.addSegment_(t,e)}interpolateAttributesRange(t,s,n,i){for(let a=t;a<n-1;a++)this.isClosedPath(a)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("cannot interpolate across closed paths");const r=this.m_description.getAttributeCount();if(1===r)return;const o=this.calculateSubLength2D(t,s,n,i);if(0!==o)for(let e=1;e<r;e++){const r=this.m_description.getSemantics(e);this.interpolateAttributesSemanticsImpl(r,t,s,n,i,o)}}interpolateAttributesSemantics(t,s,n,i,r){if(0===t)return;this.hasAttribute(t)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("does not have the given attribute");2===Zs.getInterpolation(t)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("angular interpolation");for(let a=s;a<i-1;a++)this.isClosedPath(a)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("cannot interpolate across closed paths");const o=this.calculateSubLength2D(s,n,i,r);0!==o&&this.interpolateAttributesSemanticsImpl(t,s,n,i,r,o)}interpolateAttributesPath(t,e,s){const n=this.m_description.getAttributeCount();if(1===n)return;if(e===s)return;const i=this.calculatePathSubLength2D(t,e,s);for(let r=1;r<n;r++){const n=this.m_description.getSemantics(r);this.interpolateAttributesSemanticsPathImpl(n,t,e,s,i)}}interpolateAttributesSemanticsPath(t,s,n,i){if(0===t)return;this.hasAttribute(t)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("does not have the given attribute");2===Zs.getInterpolation(t)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("angular interpolation");const r=this.calculatePathSubLength2D(s,n,i);0!==r&&this.interpolateAttributesSemanticsPathImpl(t,s,n,i,r)}interpolateAttributesSemanticsImpl(t,e,s,n,i,r){const o=this.querySegmentIterator(),a=this.getPathStart(e)+s,h=this.getPathStart(n)+i,u=Zs.getComponentCount(t),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);this.queryAttributeAsDbl(t,a,m,u);const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);this.queryAttributeAsDbl(t,h,l,u);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(c,m,0,0,u);let g=0;const d=Zs.getDefaultValue(t),_=Zs.getInterpolation(t);o.resetToVertex(a,e);
1do{if(o.hasNextSegment()){if(o.nextSegment(),o.getStartPointIndex()===h)return;this.setAttributeFromArray(t,o.getStartPointIndex(),c,u),o.previousSegment();do{const e=o.nextSegment();if(o.getEndPointIndex()===h)return;g+=e.calculateLength2D();(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.A)(_,m,l,c,0,u,g/r,d),o.isClosingSegment()||this.setAttributeFromArray(t,o.getEndPointIndex(),c,u)}while(o.hasNextSegment())}}while(o.nextPath())}interpolateAttributesSemanticsPathImpl(t,e,n,i,r){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0!==t);const o=this.querySegmentIterator(),a=Zs.getInterpolation(t),h=this.getPathStart(e)+n,u=this.getPathStart(e)+i;if(u===h)return;const m=Zs.getComponentCount(t),l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);this.queryAttributeAsDbl(t,h,l,m);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);this.queryAttributeAsDbl(t,u,c,m);const g=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);o.resetToVertex(h,e),o.setCirculator(this.isClosedPath(e));const d=Zs.getDefaultValue(t),_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(Zs.maxComponentCount(),Number.NaN);(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(_,l,0,0,m);const p=0===r;let f=.5;do{const e=o.nextSegment();if(this.setAttributeFromArrayNoCurves(t,o.getStartPointIndex(),_,m),!p){const t=e.calculateLength2D();g.pe(t),f=g.getResult()/r}(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.A)(a,l,c,_,0,m,f,d)}while(o.getEndPointIndex()!==u)}querySegment(t,s,n){const i=this.getPathIndexFromPointIndex(t),r=t-this.getPathStart(i);r>=this.getSegmentCountPath(i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("get_segment"),this.getSegmentFromPath(i,r,s,n)}getSegment(t,e){const s=new this.m_segmentBufferCTor;return this.getSegmentBuffer(t,s,e),s.releaseSegment()}getSegmentType(t){const s=this.getPathIndexFromPointIndex(t),n=t-this.getPathStart(s);return n>=this.getSegmentCountPath(s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("get_segment"),this.getSegmentTypeFromPath(s,n)}getSegmentFromPath(t,e,s,n){const i=this.getPathStart(t)+e,r=this.getSegmentFlagsStreamRef();let o=1;switch(r&&(o=31&r.read(i)),o){case 1:s.createLine();break;case 2:s.createCubicBezier();break;case 4:s.createEllipticArc();break;case 8:s.createQuadraticRationalBezier();break;case 16:s.createQuadraticBezier();break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}const a=s.get();let u,m=null;n?(m=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)(),a.assignVertexDescription(m)):a.assignVertexDescription(this.m_description),u=i===this.getPathEnd(t)-1&&this.isClosedPath(t)?this.getPathStart(t):i+1;je(a,this.getXY(i));if(He(a,this.getXY(u)),!n)for(let h=1,l=this.m_description.getAttributeCount();h<l;h++){const t=this.m_description.getSemantics(h),e=Zs.getComponentCount(t);for(let s=0;s<e;s++){const e=this.getAttributeAsDbl(t,i,s);a.setStartAttribute(t,s,e);const n=this.getAttributeAsDbl(t,u,s);a.setEndAttribute(t,s,n)}}if(Us.isNonLinearSegmentFlag(o)){const t=this.m_curveData.m_segmentParamIndex.read(i);a.readFromBufferStream(this.m_curveData.m_segmentParams,t)}}replaceLinearEllipticalArcsWithTrueLines(){if(!this.hasNonLinearSegments())return!1;if(0===this.m_curveData.m_arcCount)return!1;let t=!1;for(let e=0,s=this.getPointCount();e<s;e++){if(4===this.m_curveData.m_segmentFlags.read(e)){const s=this.m_curveData.m_segmentParamIndex.read(e);Bs(this.m_curveData.m_segmentParams,s).isNAN()&&(this.m_curveData.m_segmentFlags.write(e,1),this.m_curveData.m_segmentParamIndex.write(e,-1),this.incCurveType(4,-1),this.modifyCurveCounter(-1),t=!0)}}return t&&this.checkCompactSegmentParams(),t}queryPointAlongPath(t,s,n,i=!1){const r={iSegment:-1},o=i?r:{tSegment:0};if(n.setEmpty(),this.isEmpty())return r;if((t<0||t>=this.getPathCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("query_point_along_path"),s<0)return r;const a=this.getPathSize(t);if(0===a)return r;if(1===a)return this.getPointByVal(this.getPathStart(t),n),o.tSegment=0,r.iSegment=this.getPathStart(t),r;const h=this.querySegmentIteratorAtVertex(this.getPathStart(t)),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(;h.hasNextSegment();){const t=h.nextSegment(),e=t.calculateLength2D(),i=u.getResult();if(u.add(e),u.getResult()>=s){let a=s-i;a>e&&(a=e);const u=t.lengthToT(a);return t.queryCoord(u,n),o.tSegment=u,r.iSegment=h.getStartPointIndex(),r}}if(this.isClosedPath(t)){const e=this.getPathStart(t);return this.getPointByVal(e,n),o.tSegment=1,r.iSegment=this.getPathEnd(t)-1,r}{const e=this.getPathEnd(t)-1;return this.getPointByVal(e,n),this.getPathSize(t)>1?(o.tSegment=1,r.iSegment=this.getPathEnd(t)-2,r):(o.tSegment=0,r.iSegment=this.getPathStart(t),r)}}queryPointsAlongPath(t,s,n,i,r,o){{let t=0;for(let a=0;a<s;
vendor: 7,930 bytes, line 1
1++a)i&&i[a].setEmpty(),r&&(r[a]=-1),o&&(o[a]=0),t>n[a]&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("query_points_along"),t=n[a]}const a=this.getPathSize(t);if(0===s||0===a)return 0;if(1===a){const e=this.getPathStart(t);return i&&this.getPointByVal(e,i[0]),o&&(o[0]=0),r&&(r[0]=e),1}const h=this.getPathStart(t),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0),m=this.querySegmentIteratorAtVertex(h);let l=0,c=0,g=n[l];for(;m.hasNextSegment();){const t=m.nextSegment(),e=t.calculateLength2D(),a=u.getResult();for(u.add(e);u.getResult()>=g;){let h=g-a;h>e&&(h=e);const u=t.lengthToT(h);if(i&&t.queryCoord(u,i[c]),o&&(o[c]=u),r&&(r[c]=m.getStartPointIndex()),c++,l++,g=n[l],l===s)return c}}if(this.isClosedPath(t)){const e=this.getPathStart(t),s=0;i&&this.getPointByVal(e,i[c]),o&&(o[c]=s),r&&(r[c]=e),c++}else if(this.getPathSize(t)>1){const e=this.getPathEnd(t)-2,s=1;i&&this.getPointByVal(e+1,i[c]),o&&(o[c]=s),r&&(r[c]=e),c++}return c}queryPointsAlong(t,s,n,i,r){{let o=0;for(let a=0;a<t;++a)n&&n[a].setEmpty(),i&&(i[a]=-1),r&&(r[a]=0),o>s[a]&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("query_points_along"),o=s[a]}if(0===t)return 0;const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0),a=this.querySegmentIterator();let h=-1,u=0,m=0,l=s[u];for(;a.nextPath();)for(;a.hasNextSegment();){h=a.getPathIndex();const e=a.nextSegment(),c=e.calculateLength2D(),g=o.getResult();for(o.add(c);o.getResult()>=l;){let o=l-g;o>c&&(o=c);const h=e.lengthToT(o);if(n&&e.queryCoord(h,n[m]),r&&(r[m]=h),i&&(i[m]=a.getStartPointIndex()),m++,u++,l=s[u],u===t)return m}}if(h<0)return 0;if(this.isClosedPath(h)){const t=this.getPathStart(h),e=0;n&&this.getPointByVal(t,n[m]),r&&(r[m]=e),i&&(i[m]=t),m++}else if(this.getPathSize(h)>1){const t=this.getPathEnd(h)-2,e=1;n&&this.getPointByVal(t+1,n[m]),r&&(r[m]=e),i&&(i[m]=t),m++}return m}querySegmentIterator(){return new Vs({parent:this})}querySegmentIteratorAtVertex(t){return new Vs({parent:this,pointIndex:t})}queryPathEnvelope(t,e){this.queryPathEnvelopeImpl(t,e,!0)}queryLoosePathEnvelope(t,e){this.queryPathEnvelopeImpl(t,e,!1)}queryPathEnvelopeImpl(t,n,i){if(n instanceof _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.E&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0,"not implemented for Envelope"),n instanceof _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.p&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0,"not implemented for Envelope3D"),(t>=this.getPathCount()||t<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.isEmpty())return void n.setEmpty();const r=this.getAttributeStreamRef(0),o=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();o.setEmpty();for(let e=2*this.getPathStart(t),a=2*this.getPathEnd(t);e<a;){const t=a-e;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!(1&t)),o.mergePointsInterleaved(r,e/2,t/2),e+=t}if(n.setCoords({env2D:o}),this.hasNonLinearSegmentsPath(t)){const e=this.querySegmentIterator();if(e.resetToPath(t),e.nextPath())for(;e.hasNextSegment();){const t=e.nextCurve();if(!t)break;{const e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();i?t.queryEnvelope(e):t.queryLooseEnvelope(e),n.mergeEnvelope2D(e)}}else (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}}checkCompactSegmentParams(){if(!this.m_curveData||null===this.m_curveData.m_segmentParams)return!1;if(this.m_curveData.m_segmentParams.size()<=this.m_vertexAttributes.get(0).size())return!1;const t=10,e=Gs(4)*this.m_curveData.m_arcCount+Gs(2)*this.m_curveData.m_bezierCount+Gs(8)*this.m_curveData.m_rbezier2Count+Gs(16)*this.m_curveData.m_bezier2Count;return this.m_curveData.m_segmentParams.size()>Math.max(3*e>>1,t)?(this.forceCompactSegmentParams(),!0):(0===this.m_pointCount&&(this.m_curveData.m_curveParamWritePoint=0),!1)}forceCompactSegmentParams(){let t=0;for(let n=0,i=this.getPointCount();n<i;n++){const e=this.m_curveData.m_segmentFlags.read(n);if(Us.isNonLinearSegmentFlag(e)){t+=Gs(e)}}const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(t);let s=0;for(let n=0,i=this.getPointCount();n<i;n++){const t=this.m_curveData.m_segmentFlags.read(n);if(Us.isNonLinearSegmentFlag(t)){let i=this.m_curveData.m_segmentParamIndex.read(n);this.m_curveData.m_segmentParamIndex.write(n,s);const r=Gs(t);for(let t=0;t<r;t++)e.write(s,this.m_curveData.m_segmentParams.read(i)),s++,i++}}this.m_curveData.m_segmentParams=e,this.m_curveData.m_curveParamWritePoint=s}setEmpty(){this.m_curveData&&(this.removeAllCurvesFromGlobalCounter(),this.m_curveData=null),this.m_bPathStarted=!1,this.m_paths=null,this.m_pathFlags=null,this.setEmptyImpl()}applyTransformation(t){this.applyTransformationToPath(t,-1)}applyTransformation3D(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getImpl(){return this}reserve(t){this.reserveImpl(t),t>0&&!this.m_paths&&(this.m_paths=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0),this.m_pathFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(0),this.m_paths.reserve(2),this.m_pathFlags.reserve(2),this.m_paths.resize(1,0),this.m_pathFlags.resize(1,this.m_bPolygon?1:0))}reserveParts(t,e){this.reserveImpl(t),e>0&&(this.m_paths?(this.m_paths.reserve(e+1),this.m_pathFlags.reserve(e+1)):(this.m_paths=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0),this.m_pathFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(0),this.m_paths.reserve(e+1),this.m_pathFlags.reserve(e+1),this.m_paths.resize(1,0),this.m_pathFlags.resize(1,this.m_bPolygon?1:0)))}clone(){const t=this.createInstance();return this.copyTo(t),t}queryLimitedSegmentIterator(t){return new Os(this,t)}getPathStreamRef(){return this.throwIfEmpty(),this.m_paths}setPathStreamRef(t){this.m_paths=t}getSegmentFlagsStreamRef(){return this.throwIfEmpty(),null!=this.m_curveData?this.m_curveData.m_segmentFlags:null}getPathFlagsStreamRef(){return this.throwIfEmpty(),this.m_pathFlags}setPathFlagsStreamRef(t){this.m_pathFlags=t}getSegmentIndexStreamRef(){return this.throwIfEmpty(),null!==this.m_curveData?this.m_curveData.m_segmentParamIndex:null}getSegmentDataStreamRef(){return this.throwIfEmpty(),null!==this.m_curveData?this.m_curveData.m_segmentParams:null}setSegmentData(t,e,s,n){this.m_curveData||(this.m_curveData=new Hs),this.m_curveData.m_segmentFlags=s,this.m_curveData.m_segmentParams=e,this.m_curveData.m_segmentParamIndex=t,this.m_curveData.m_curveParamWritePoint=n}static getPathIndexFromPointIndexImpl(t,e,s,n){if(n>=0&&n<e){if(s>=t.read(n)){if(s<t.read(n+1))return n;n++}else n--;if(n>=0&&n<e&&s>=t.read(n)&&s<t.read(n+1))return n}if(e<5){for(let n=0;n<e;n++)if(s<t.read(n+1))return n;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.o)("")}let i=0,r=e-1;for(;r>i;){const e=i+(r-i>>1);if(s<t.read(e))r=e-1;else{if(!(s>=t.read(e+1)))return e;i=e+1}}return i}getHighestPointIndex(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<this.getPathCount());const e=this.getAttributeStreamRef(0),n=this.getPathEnd(t),i=this.getPathStart(t);let r=-1;const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;o.y=Number.NEGATIVE_INFINITY,o.x=Number.NEGATIVE_INFINITY;for(let s=i+0;s<n;s++){const t=e.readPoint2D(2*s);-1===o.compare(t)&&(r=s,o.setCoordsPoint2D(t))}return r}applyTransformationToPath(t,s){if(s>=this.getPathCount()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("apply_transformation"),this.isEmpty())return;if(t.isIdentity())return;const n=this.m_vertexAttributes.get(0);if(!(s<0?this.hasNonLinearSegments():this.hasNonLinearSegmentsPath(s))){let e,i;return s<0?(e=0,i=this.m_pointCount):(e=this.getPathStart(s),i=this.getPathEnd(s)),n.applyTransformation(t,2*e,i-e),void this.notifyModifiedFlags(2001)}const i=new this.m_segmentBufferCTor,r=this.getPathCount();let o=s<0?0:s;do{const e=this.getPathStart(o),r=this.getPathEnd(o),a=this.isClosedPath(o),h=n.readPoint2D(2*e);if(!this.hasNonLinearSegmentsPath(o)){n.applyTransformation(t,2*e,r-e);continue}const u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();for(let s=e;s<r;++s){if(1!==(31&this.m_curveData.m_segmentFlags.read(s))){const o=a&&s+1===r;
1o&&n.writePoint2D(2*e,h),this.getSegmentBuffer(s,i,!0),i.get().applyTransformation(t);const u=this.m_curveData.m_segmentParamIndex.read(s);i.get().writeInBufferStream(this.m_curveData.m_segmentParams,u),n.writePoint2D(2*s,i.get().getStartXY()),o&&n.writePoint2D(2*e,i.get().getEndXY());continue}const o=2*s;n.queryPoint2D(o,u),t.transformInPlace(u),n.writePoint2D(o,u)}if(o===s)break}while(++o<r);this.notifyModifiedFlags(2001)}calculateSubLength2D(t,e,s,n){const i=this.getPathStart(t)+e,r=this.getPathStart(s)+n;(r<i||i<0||r>this.getPointCount()-1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.q)("");const o=this.querySegmentIterator();let a=0;o.resetToVertex(i,t);do{for(;o.hasNextSegment();){const t=o.nextSegment();if(o.getStartPointIndex()===r)break;a+=t.calculateLength2D()}if(o.getStartPointIndex()===r)break}while(o.nextPath());return a}calculatePathSubLength2D(t,s,n){const i=this.getPathStart(t)+s,r=this.getPathStart(t)+n;(i<0||r>this.getPointCount()-1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.q)("");const o=this.querySegmentIterator();if(i>r&&(this.isClosedPath(t)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("cannot iterate across an open path"),o.setCirculator(!0)),i===r)return 0;let a=0,h=0;o.resetToVertex(i,t);do{h+=a;a=o.nextSegment().calculateLength2D()}while(o.getStartPointIndex()!==r);return h}calculateEnvelope2D(t){return this.updateXYImpl(t)}updateXYImpl(t){const e=super.updateXYImpl(t);if(this.hasNonLinearSegments()){const s=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty(),n=this.querySegmentIterator();for(;n.nextPath();)for(;n.hasNextSegment();){const i=n.nextCurve();if(!i)break;t?i.queryEnvelope(s):i.queryLooseEnvelope(s),e.mergeEnvelope2D(s)}}return e}notifyModifiedAllImpl(){null!==this.m_paths&&this.m_paths.size()?this.m_pointCount=this.m_paths.read(this.m_paths.size()-1):this.m_pointCount=0}setDirtyOGCFlags(t){this.setDirtyFlagProtected(16,t)}hasDirtyOGCStartFlags(){return this.hasDirtyFlag(16)}setDirtyRingAreas2D(t){this.setDirtyFlagProtected(1024,t)}hasDirtyRingAreas2D(){return this.hasDirtyFlag(1024)}static isNonLinearSegmentFlag(t){return!(1&t)}addAndExplicitlyOpenAllPaths(t,s){this===t&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl::add");let n=this.getPathCount();for(let e=0,i=t.getPathCount();e<i;e++)this.addPath(t,e,!s),this.openPathAndDuplicateStartVertex(n),n++}getSegmentFlags(t){return null!==this.m_curveData&&null!==this.m_curveData.m_segmentFlags?this.m_curveData.m_segmentFlags.read(t):1}getSegmentBuffer(t,s,n){const i=this.getPathIndexFromPointIndex(t),r=t-this.getPathStart(i);r>=this.getSegmentCountPath(i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("getSegmentBuffer"),this.getSegmentFromPath(i,r,s,n)}getSegmentTypeFromPath(t,e){const s=this.getPathStart(t)+e,n=this.getSegmentFlagsStreamRef();let r=1;switch(n&&(r=31&n.read(s)),r){case 1:return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine;case 2:return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier;case 4:return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc;case 8:return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2;case 16:return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}}ensureXYMonotoneSegments(){if(!this.m_curveData)return!1;let t=!1;for(let e=0,s=this.getPathCount();e<s;e++){const s=this.getPathStart(e),n=this.getPathEnd(e),i=n-s;for(let e=s;e<n;e++){const n=31&this.m_curveData.m_segmentFlags.read(e);if(1===n)continue;2!==n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("ensure_xy_monotone_segments");const r=(e-s+1)%i+s,o=this.m_curveData.m_segmentParamIndex.read(e),h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);h[0]=this.getXY(e),h[3]=this.getXY(r),h[1].x=this.m_curveData.m_segmentParams.read(o),h[1].y=this.m_curveData.m_segmentParams.read(o+1),h[2].x=this.m_curveData.m_segmentParams.read(o+2),h[2].y=this.m_curveData.m_segmentParams.read(o+3),Ve(h)&&(t=!0,this.m_curveData.m_segmentParams.write(o,h[1].x),this.m_curveData.m_segmentParam
vendor: 4,417 bytes, line 1
1s.write(o+1,h[1].y),this.m_curveData.m_segmentParams.write(o+2,h[2].x),this.m_curveData.m_segmentParams.write(o+3,h[2].y))}}return t&&this.notifyModifiedFlags(2001),t}buildRasterizedGeometryAccelerator(t,e){return!1}buildQuadTreeAccelerator(t){if(this.m_accelerators||(this.m_accelerators=new Ls),null!==this.m_accelerators.getQuadTree())return!0;this.ensureUniqueAccelerators(),this.m_accelerators.setQuadTree(null);const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.H)(this);return this.m_accelerators.setQuadTree(e),!0}buildQuadTreeForPathsAccelerator(t){if(this.m_accelerators||(this.m_accelerators=new Ls),null!==this.m_accelerators.getQuadTreeForPaths())return!0;this.ensureUniqueAccelerators(),this.m_accelerators.setQuadTreeForPaths(null);const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.I)(this);return this.m_accelerators.setQuadTreeForPaths(e),!0}updateCurveCounter(t){this.modifyCurveCounter(t-this.getCurveCount())}removeAllCurvesFromGlobalCounter(){this.m_curveData&&(Us.st_totalCurveCount-=this.m_curveData.m_curveCount,this.m_curveData.m_curveCount=0,this.m_curveData.m_bezierCount=0,this.m_curveData.m_arcCount=0,this.m_curveData.m_bezier2Count=0,this.m_curveData.m_rbezier2Count=0,this.m_curveData.m_curveParamWritePoint=0)}modifyCurveCounter(t){t&&(this.m_curveData||(this.m_curveData=new Hs),Us.st_totalCurveCount+=t,this.m_curveData.m_curveCount+=t)}getCurveCount(){return this.m_curveData?this.m_curveData.m_curveCount:0}incCurveType(t,e){this.m_curveData||(this.m_curveData=new Hs),2&t?this.m_curveData.m_bezierCount+=e:4&t?this.m_curveData.m_arcCount+=e:8&t?this.m_curveData.m_rbezier2Count+=e:16&t&&(this.m_curveData.m_bezier2Count+=e)}getCurveWritePoint(){return null!==this.m_curveData?this.m_curveData.m_curveParamWritePoint:0}initSegmentData(t){null===this.m_curveData&&(this.m_curveData=new Hs);const e=this.m_reservedPointCount>0?this.m_reservedPointCount:this.m_pointCount;null===this.m_curveData.m_segmentParamIndex&&(this.m_curveData.m_segmentFlags=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(e,1),this.m_curveData.m_segmentParamIndex=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(e,-1));const s=this.m_curveData.m_curveParamWritePoint+t;null===this.m_curveData.m_segmentParams?this.m_curveData.m_segmentParams=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(s):s!==this.m_curveData.m_segmentParams.size()&&this.m_curveData.m_segmentParams.resize(s,0),this.m_curveData.m_segmentFlags.size()<e&&(this.m_curveData.m_segmentFlags.resize(e,1),this.m_curveData.m_segmentParamIndex.resize(e,-1))}updateCurveWritePoint(t){null===this.m_curveData&&(this.m_curveData=new Hs),this.m_curveData.m_curveParamWritePoint=t}updateOGCFlagsHelper(){const t=this.getPathCount();if(0===t)return;const e=this.m_pathFlags;let s=0;for(let n=0;n<t;n++){const t=this.m_cachedRingAreas2D.read(n);0===s&&(s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(t)),t*s>0||0===s?e.setBits(n,8):e.clearBits(n,8)}}updateOGCFlagsProtected(){this.hasDirtyFlag(16)&&(this.updateRingAreas2DProtected(),this.updateOGCFlagsHelper(),this.setDirtyFlagProtected(16,!1))}replaceSegment(t,n,i){(t<0||t>=this.getPointCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Multi_path_impl.replace_segment"),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n.isCurve());const r=this.getPathIndexFromPointIndex(t),o=this.getPathStart(r),a=(t-o+1)%this.getPathSize(r)+o;{const e=this.getXY(t),i=this.getXY(a),r=!e.isEqualPoint2D(n.getStartXY())||!i.isEqualPoint2D(n.getEndXY());(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!r)}this.replaceSegmentImpl(t,a,n,i)}replaceSegmentImpl(t,e,n,i){const r=n.getDescription();this.mergeVertexDescription(r);const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(32,Number.NaN),a=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:r,attribBuffer:o,initDefaultValues:!1}),h=null===this.m_curveData?1:31&this.m_curveData.m_segmentFlags.read(t),u=Gs(h),m=ks(n);let l,c=!1;u>=m?((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(null!==this.m_curveData),c=!0,l=this.m_curveData.m_segmentParamIndex.read(t)):(this.initSegmentData(m),c=!1,l=this.m_curveData.m_curveParamWritePoint);const g=n.getGeometryType(),d=Hs.toSegType(g);i||(n.queryStart(a),this.setPointByValNoCurves(t,a),n.queryEnd(a),this.setPointByValNoCurves(e,a)),this.m_curveData.m_segmentParamIndex.write(t,1!==d?l:-1),this.m_curveData.m_segmentFlags.write(t,d),1!==d&&n.writeInBufferStream(this.m_curveData.m_segmentParam
1s,l),c||(this.m_curveData.m_curveParamWritePoint+=m),h!==d&&(this.incCurveType(h,-1),this.incCurveType(d,1),this.modifyCurveCounter(1===h?1:-1))}setAttributeImpl(t,s,n){if(this.addAttribute(t),!this.isEmpty())if(this.hasNonLinearSegments()&&0===t){(s<0||s>1)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const t=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T,i=0===s?n:0,r=0===s?0:1;t.setShiftCoords(i,r),0===s?t.xx=0:t.yy=0,this.applyTransformation(t)}else super.setAttributeImpl(t,s,n)}toFlatGeometry(){const t=this.m_bPolygon?"polygon":"polyline",e=this.getPathCount(),s=this.m_paths?this.m_paths.getArray():new Int32Array,n=this.m_paths?this.m_pathFlags.getArray():new Int8Array;let i,r,o,a=0,h=0;if(this.m_curveData){const{m_segmentFlags:t,m_segmentParamIndex:e,m_segmentParams:s}=this.m_curveData;i=t?.getArray()??new Int8Array,r=e?.getArray()??new Int32Array,o=s?.getArray()??new Float64Array,a=this.m_curveData.m_arcCount,h=this.m_curveData.m_bezierCount}return{type:t,...this.exportVertexAttributes(),partCount:e,partOffsets:s,partFlags:n,segmentFlags:i,segmentIndices:r,segmentParams:o,segmentCountArc:a,segmentCountBezier:h}}}Us.st_totalCurveCount=0;class Os{constructor(t,e){this.m_segIter=null,this.m_quadTree=null,this.m_qtIter=null,this.m_extentOfInterest=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D(e),this.m_bfirst=!0,this.m_prevIndex=-100,this.m_parent=t}nextSegment(){return this.m_bfirst&&this.prepare_(),this.m_quadTree?this.nextSegmentQt():this.nextSegmentNoQt()}getPathIndex(){return this.m_segIter.getPathIndex()}getStartPointIndex(){return this.m_segIter.getStartPointIndex()}getEndPointIndex(){return this.m_segIter.getEndPointIndex()}isClosingSegment(){return this.m_segIter.isClosingSegment()}isPathClosed(){return this.m_segIter.isPathClosed()}prepare_(){const t=this.m_parent.getAccelerators();t&&(this.m_quadTree=t.getQuadTree(),this.m_quadTree&&(this.m_qtIter=this.m_quadTree.getSortedIterator(this.m_extentOfInterest,0))),this.m_segIter=this.m_parent.querySegmentIterator()}nextSegmentQt(){this.m_bfirst=!1;const t=this.m_qtIter.next();if(-1===t)return null;const e=this.m_quadTree.getElement(t);(e!==this.m_prevIndex+1||this.m_segIter.isLastSegmentInPath())&&(this.m_segIter.resetToVertex(e,this.m_segIter.getPathIndex()),this.m_prevIndex=e);return this.m_segIter.nextSegment()}nextSegmentNoQt(){for(;;){if(!this.m_bfirst&&this.m_segIter.hasNextSegment()){const t=this.m_segIter.nextSegment(),e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();if(t.queryLooseEnvelope(e),!e.isIntersecting(this.m_extentOfInterest))continue;return t}if(this.m_bfirst=!1,!this.m_segIter.nextPath())return null}}}class Qs extends Us{constructor(t){t?t.vd?(super({vd:t.vd,bPolygon:!1}),this.m_segmentBufferCTor=Pm):t.copy?(super({vd:t.copy.getDescription(),bPolygon:!1}),this.m_segmentBufferCTor=Pm,t.copy.copyTo(this)):t.move?(super({move:t.move}),this.m_segmentBufferCTor=Pm):t.start?(super({vd:t.start.getDescription(),bPolygon:!1}),this.m_segmentBufferCTor=Pm,this.startPathPoint(t.start),this.lineToPoint(t.end)):t.path?(super({bPolygon:!1}),this.m_segmentBufferCTor=Pm,this.addPathPoint2D(t.path,t.pointCount,t.bForward)):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("bad constructor arg"):(super({bPolygon:!1}),this.m_segmentBufferCTor=Pm)}getBoundary(){return $s(this)}assignCopy(t){return this!==t&&t.copyTo(this),this}assignMove(t){return t.copyTo(this),this}getGeometryType(){return Qs.type}getDimension(){return 1}createInstance(){return new Qs({vd:this.getDescription()})}equals(t,e){return this.equalsBase(t,e)}}Qs.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline;var Js=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G;function Ks(t,e){if(t.isEmpty())return!1;const s=t.getGeometryType();if(s===Js.enumPolygon)return 0!==t.calculateArea2D();if(s===Js.enumPolyline)return tn(t.getImpl(),e,!0).bNotEmpty;if(s===Js.enumEnvelope)return!0;if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.f)(s))return!!t.isClosed();if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.e)(s))return!1;if(s===Js.enumGeometryCollection){const s=t;for(let t=0,n=s.getGeometryCount();t<n;t++)if(Ks(s.getGeometry(t),e))return!0;return!1}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}function $s(t,e){const s=t.getGeometryType();if(s===Js.enumPolygon){const e=new Qs({vd:t.getDescription()});return t.isEmpty()||t.copyToUnchecked(e),e}if(s===Js.enumPolyline)return tn(t.getImpl(),e,!1).boundary;if(s===Js.enumEnvelope){const e=new Qs({vd:t.getDescription()});return t.isEmpty()||e.addEnvelope(t,!1),e}if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.f)(s)){const e=new De({vd:t.getDescription()});if(!t.isEmpty()&&!t.isClosed()){const s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;e.reserve(2),t.queryStart(s),e.add(s),t.queryEnd(s),e.add(s)}return e}if(s===Js.enumGeometryCollection){const s=t;let n=null;for(let i=0,r=s.getGeometryCount();i<r;i++){const r=$s(s.getGeometry(i),e);if(null!==r){null===n&&(n=t.createInstance());const e=r;n.addGeometry(e)}}return n}if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.e)(s))return new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:t.getDescription()});(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}function tn(t,e,s){const n=!1,i=t;let r=null;if(s||(r=new De({vd:i.getDescription()})),!i.isEmpty()){const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.a(0);for(let e=0,s=i.getPathCount();e<s;e++){if(i.getPathSize(e)>0&&!i.isClosedPathInXYPlane(e)){const s=i.getPathStart(e);t.add(s);const n=i.getPathEnd(e)-1;t.add(n)}}if(t.size()>0){const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.B,n=i.getAttributeStreamRef(0),o={userSort(t,e,s){const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();s.sort(t,e,(t,e)=>(n.queryPoint2D(2*t,i),n.queryPoint2D(2*e,r),i.compare(r)))},getValue:t=>n.read(2*t+1)};e.sort(t,0,t.size(),o);let a=n.readPoint2D(2*t.read(0)),h=0,u=1;const m=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;for(let i=1,r=t.size();i<r;i++){const e=n.readPoint2D(2*t.read(i));if(e.isEqualPoint2D(a))t.read(h)>t.read(i)?(t.write(h,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)()),h=i):t.write(i,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)()),u++;else{if(1&u){if(s)return{bNotEmpty:!0,boundary:new De({})}}else t.write(h,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)());a=e,h=i,u=1}}if(1&u){if(s)return{bNotEmpty:!0,boundary:new De({})}}else t.write(h,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)());if(!s){t.sort(0,t.size());for(let e=0,s=t.size();e<s&&t.read(e)!==(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)();e++)i.getPointByVal(t.read(e),m),r.add(m)}}}return s?{bNotEmpty:n,boundary:new De({})}:{bNotEmpty:n,boundary:r}}function en(t,e,n,i){const r=4*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*(Math.abs(e.vmin)+Math.abs(e.vmax)),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)();if(1===t.getMaxDerivative()){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0);const o=un(t,0,e,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)(),r);return i[0]=o.root,o.cRoots}let a,h=[];const u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(e.vmin-r,e.vmax+r);h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(u.vmin,u.vmax));let m=0;for(let s=t.getMaxDerivative()-1;s>=0;s--){a=h,h=[];for(let u=0,l=a.length;u<l;u++){if(a[u][0]<a[u][1]){let l,c,g;if(s===t.getMaxDerivative()-1?({root:l,funcAtRoot:c,cRoots:g}
1=un(t,s,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(a[u][0],a[u][1]),o,.5*r)):({root:l,funcAtRoot:c,cRoots:g}=mn(t,s,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(a[u][0],a[u][1]),o,.5*r)),1===g){if(0===s){if(m<n){if(a[u][0]<=e.vmin&&a[u][1]>=e.vmin&&l!==e.vmin){0===t.getValue(0,e.vmin)&&(l=e.vmin)}if(a[u][0]<=e.vmax&&a[u][1]>=e.vmax&&l!==e.vmax){0===t.getValue(0,e.vmax)&&(l=e.vmax)}i[m]=e.snapClip(l),m>0?i[m]-i[m-1]>r&&m++:m++}}else{const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();t[0]=a[u][0],t[1]=l,h.push(t);const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();e[0]=l,e[1]=a[u][1],h.push(e)}continue}}h.push(a[u])}}return m}function sn(t,e,s,n){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,r=gn(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e),s,i);return n[0]=i.value(),r}function nn(t,e,s,n,i,r){const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),a=dn(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s),n,i,o);return r[0]=o[0].value(),r[1]=o[1].value(),a}function rn(t,e,s,n,i,r,o){const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3),h=_n(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(n),i,r,a);return o[0]=a[0].value(),o[1]=a[1].value(),o[2]=a[2].value(),h}function on(t,e,s,n,i,r,o,a){return hn(t,e,s,n,i,r,o,a)}function an(t,e,s,n,i,r){return cn(t,e,s,n,i,r)}function hn(t,e,s,n,i,r,o,a){const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(s*s,Number.NaN);h.fill(0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(a,n,0,0,s);const u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(s,Number.NaN),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(s,Number.NaN),l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(s,Number.NaN);let c=t(a,s,e);const g=100;let d=0;for(d=0;d<g;d++){const n=c;for(let t=0;t<s;++t)m[t]=a[t];if(d%s===0){h.fill(0);for(let t=0;t<s;t++)h[t*s+t]=1}let o=0,g=0;for(let m=0;m<s;++m){for(let t=0;t<s;++t)u[t]=h[m*s+t];const n=c;c=ln(t,e,a,u,i,r,s);const l=n-c;l>o&&(g=m,o=l)}for(let t=0;t<s;t++)u[t]=a[t]-m[t],l[t]=a[t]+(a[t]-m[t]);const _=t(l,s,e);if(_<n){if(2*(n-2*c+_)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(n-c-o)<(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(n-_)*o){c=ln(t,e,a,u,i,r,s);for(let t=0;t<s;++t)h[g*s+t]=h[(s-1)*s+t],h[(s-1)*s+t]=u[t]}}if(n<=c)return t(a,s,e)}return c}function un(t,e,s,n,i){const r={root:0,funcAtRoot:0,cRoots:0};let o=s.vmin,a=s.vmax,u=0,m=Number.MAX_VALUE,l=t.getValue(e,o),c=t.getValue(e,a),g=0,d=0,_=0;if(l>=0&&c>=0||l<=0&&c<=0)return Math.abs(l)<Math.abs(c)?(r.funcAtRoot=l,r.root=o,r.cRoots=0===l?1:0,r):(r.funcAtRoot=c,r.root=a,r.cRoots=0===c?1:0,r);Math.abs(l)<Math.abs(c)&&(a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o,o=a),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(l,l=c)),u=o,g=l;let p=!0,f=0;for(;0!==c&&Math.abs(o-a)>n*Math.abs(a)+i;f++){let s=f>64;if(!s){d=l!==g&&c!==g?o*c*g/((l-c)*(l-g))+a*l*g/((c-l)*(c-g))+u*l*c/((g-l)*(g-c)):a-c*(a-o)/(c-l);const t=(3*o+a)/4;if(s=!(d>t&&d<a||d>a&&d<t),!s){const t=n*Math.abs(a)+i;if(p){const e=Math.abs(a-u);s=Math.abs(d-a)>=.5*e||e<t}else{const e=Math.abs(u-m);s=Math.abs(d-a)>=.5*e||e<t}}}if(s?(d=(o+a)/2,p=!0):p=!1,_=t.getValue(e,d),0===_)return r.root=d,r.funcAtRoot=_,r.cRoots=1,r;if(!s){const s=o-d,n=d-a;if(Math.abs(s)>10*Math.abs(n)){let s=a+3*n;for(let n=0;n<2;n++){const n=t.getValue(e,s);(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(l)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(n)>0?(o=s,l=n):s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(o,a,.75)}}else if(Math.abs(n)>10*Math.abs(s)){let n=o-3*s;for(let s=0;s<2;++s){const s=t.getValue(e,n);(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(c)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(s)>0?(a=n,c=s):n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(o,a,.25)}}}m=u,u=a,g=c,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(l)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(_)<0?(a=d,c=_):(o=d,l=_),Math.abs(l)<Math.abs(c)&&(a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o,o=a),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(l,l=c)),128===f&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("Root_finder iterations exceeded")}return r.root=a,r.funcAtRoot=c,r.cRoots=1,r}function mn(t,e,s,n,i){const r={root:0,funcAtRoot:0,cRoots:0}
vendor: 8,676 bytes, line 1
1;let o=s.vmin,a=t.getValue(e,o),u=s.vmax,m=t.getValue(e,u);if(a>=0&&m>=0||a<=0&&m<=0)return Math.abs(a)<Math.abs(m)?(r.funcAtRoot=a,r.root=o,r.cRoots=0===a?1:0,r):(r.funcAtRoot=m,r.root=u,r.cRoots=0===m?1:0,r);m<0&&(m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a,a=m),u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o,o=u));let l=.5*(o+u),c=Math.abs(u-o),g=c,d=t.getValue(e,l),_=t.getValue(e+1,l);const p=1,f=4;let P=f;const y=2;let x=1,C=0,v=0,b=p;const S=32;let E=0;for(;++E<100;){let s;E>S||0===_||b===y&&C>1||b===p&&P<f?(b=p,x>1&&x--):(b=y,v>1&&Math.abs(2*d)>Math.abs(c*_)&&x++),c=g;let n=!1;if(b===p)do{if(v>2){const t=16*Math.abs(c);if(.5*Math.abs(o-u)>t){const e=Math.min(o,u),n=Math.max(o,u);if(l===e){s=l,l=e+t,g=l-s;break}if(l===n){s=l,l=n-t,g=l-s;break}}}g=.5*(u-o),s=l,l=o+g,n=o===l||u===l}while(0);else for(;;){g=x*d/_,s=l,l-=g,n=l===s;const t=Math.min(o,u),e=Math.max(o,u);if(l<t){if(x>1){l=s,x--;continue}g=s-t,l=t}else if(l>e){if(x>1){l=s,x--;continue}g=s-e,l=e}break}if(n||Math.abs(g)<i){s!==l&&(d=t.getValue(e,l));break}d=t.getValue(e,l),_=t.getValue(e+1,l);const r=o,h=u;d<0?(a=d,o=l):(m=d,u=l),b===y&&(o===r&&u===h||v>1&&Math.abs(g)>=.5001*Math.abs(c))?C++:C=0,b===p?(P++,v=0):(P=0,v++)}return 100===E&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("Root_finder iterations exceeded"),r.root=l,r.funcAtRoot=d,r.cRoots=1,r}function ln(t,e,s,n,i,r,o){const a=n.slice(0,o);let h=0;for(let f=0;f<o;f++)h+=n[f]*n[f];if(h=Math.sqrt(h),h>0)for(let f=0;f<o;f++)a[f]/=h;let u=Number.NEGATIVE_INFINITY,m=Number.POSITIVE_INFINITY;{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(o,0);for(let e=0;e<o;e++)t[e]=e;t.sort((t,e)=>{const s=Math.abs(a[t]),n=Math.abs(a[e]);return s<n?-1:s>n?1:0});for(let e=0;e<o;e++){const n=t[e];if(0===a[n])continue;let o=(i[n]-s[n])/a[n],h=(r[n]-s[n])/a[n];h<o&&(h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o,o=h)),o>u&&(u=o),h<m&&(m=h)}}let l=0;const c=(Math.abs(u)+Math.abs(m))*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*100,g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(o,Number.NaN),d=a.slice();function _(n,i){for(let t=0,e=o;t<e;t++)g[t]=s[t]+n*d[t];return t(g,o,e)}c>0&&(l=an(_,null,u,0,m,c));const p=_(l);for(let f=0,P=o;f<P;f++)s[f]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(g[f],i[f],r[f]);return p}function cn(t,e,s,n,i,r){const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.aq)();let a=n,h=t(a,e),u=s,m=i,l=t(u,e),c=t(m,e);h>l&&(h=l,a=u),h>c&&(h=c,a=m);let g=u,d=m,_=l,p=c;_>p&&(_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(p,p=_),d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(g,g=d));let f=a-g,P=g-d;const y=.5*Math.min(r,m-u),x=2*y,C=100;let v,b=0;for(v=0;v<C&&!(m-u<=x);++v){const s=u+.5*(m-u);let n=b>0;if(!n&&Math.abs(P)<=y&&(n=!0,b=3),!n){const t=a-g,e=a-d,s=t*(h-p);let i=e*(h-_),r=e*i-t*s;i=2*(i-s),i>0&&(r=-r),i=Math.abs(i),0===i||Math.abs(r)>=Math.abs(i*P/2)||r<=i*(u-a)||r>=i*(m-a)?(n=!0,b=3):(P=f,f=r/i)}n&&(P=a>=s?u-a:m-a,f=o*P,b--);let i=a+f;i<u+y?i=u+y:i>m-y&&(i=m-y);const r=t(i,e);r<h?(i>=a?(u=a,l=h):(m=a,c=h),d=g,g=a,a=i,p=_,_=h,h=r):(i<a?(u=i,l=r):(m=i,c=r),r<=_||g===a?(d=g,g=i,p=_,_=r):(r<=p||d===a||d===g)&&(d=i,p=r))}return a}function gn(t,e,s,n){return t.isZero()?e.isZero()?-1:0:(n.setE(e.clone().negateThis().divThisE(t)),s.containsCoordinate(n.value())?1:0)}function dn(t,e,s,n,i,r){if(0===t.value()){if(i)return r[0].set(1),n.containsCoordinate(r[0].value())?1:0;return gn(e,s,n,r[0])}if(i){let e=2;return r[0].set(1),r[1].setE(s).divThisE(t),r[1].eq(r[0])&&(r[1].set(1),e=1),n.containsCoordinate(r[1].value())||(e=1),n.containsCoordinate(r[0].value())||(e--,r[0].setE(r[1])),2===e&&r[0].value()>r[1].value()&&(r[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(r[0],r[0]=r[1])),e}const o=e.clone().sqrThis().subThisE(t.clone().mulThisE(s).mulThisE(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a5));if(o.lt(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.J))return 0;const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.value()>=0?1:-1),h=o.clone().sqrtThis(),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(-.5).mulThisE(e.clone().addThisE(a.clone().mulThisE(h)));let m=0;r[0].setE(u.divE(t));const l=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(r[0].value()),c=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.value()).mulE(l).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.value()).mulE(l).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s.value())));return c.isZero()||vn(r[0],t,e,s,r[0]),n.containsCoordinate(r[0].value())&&m++,0!==h.value()&&0!==u.value()?(r[m].assign(s.divE(u)),l.set(r[m].value()),c.assign(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.value()).mulE(l).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.value()).mulE(l).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s.value())))),c.isZero()||vn(r[m],t,e,s,r[m]),n.containsCoordinate(r[m].value())&&m++,2===m&&r[0].value()>r[1].value()&&(r[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(r[0],r[0]=r[1])),m):m}function _n(t,e,s,n,i,r,o){if(0===t.value()){return dn(e,s,n,i,r,o)}if(r){let s=1;o[0].set(1);const r=o.slice(s),a=dn(t,e.addE(t),n.negate(),i,!1,r);if(a>0){s+=a;for(let t=1;t<s;t++)o[t].eq(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.I)&&(o[s-1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[t],o[t]=o[s-1]),s--)}const h=o.slice(0,s);h.sort((t,e)=>t.value()<e.value()?-1:t.value()>e.value()?1:0);for(let t=0;t<s;++t)o[t]=h[t];return s}return bn(t,e,s,n,i,o)}function pn(t,s,n,i,r,o){return(o<s||s<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("nth_degree_real_roots"),Sn(t,s,n,i,r)}function fn(t,e,s,n){return{coef0:t.clone(),coef1:e.clone(),coef2:s.clone(),coef3:n.clone(),calcF(t){return this.coef0.clone().mulThis(t).addThisE(this.coef1).mulThis(t).addThisE(this.coef2).mulThis(t).addThisE(this.coef3)},calcDF(t){return this.coef0.clone().mulThis(3).mulThis(t).addThisE(this.coef1.clone().mulThisByPower2(2)).mulThis(t).addThisE(this.coef2)},estimateError(t){const e=Math.abs(t),s=((this.coef0.eps()*e+this.coef1.eps())*e+this.coef2.eps())*e+this.coef3.eps()+this.calcF(t).eps(),n=this.coef0.clone().mulThis(t).mulThis(3).addThisE(this.coef1.clone().mulThis(2)).mulThis(t).addThisE(this.coef2);if(n.isZero()){const e=this.coef0.clone().mulThis(t).mulThis(6).addThisE(this.coef1.clone().mulThis(2));if(e.isZero()){const t=this.coef0.clone().mulThis(6);return Math.pow(6*s/Math.abs(t.value()),1/3)}return Math.sqrt(2*s/Math.abs(e.value()))}return s/Math.abs(n.value())}}}class Pn{updateCoefs(t){if(this.lastDeriv1===t)return this.curCoefs=this.derivCoefs1,void(this.lastUsed=1);if(this.lastDeriv2===t)return this.curCoefs=this.derivCoefs2,void(this.lastUsed=2);let e;1===this.lastUsed?(e=this.derivCoefs2,this.lastDeriv2=t,this.lastUsed=2):(e=this.derivCoefs1,this.lastDeriv1=t,this.lastUsed=1),e.length=0;for(let s=0,n=this.truePower-t;s<=n;++s){e.push(this.coefs[s+t].clone());let n=s+t,i=n--;for(let e=1;e<t;e++)i*=n--;e[s].mulThis(i)}this.curCoefs=e}constructor(t,e,s,n){this.derivCoefs1=[],this.derivCoefs2=[],this.lastDeriv1=-1,this.lastDeriv2=-1,this.lastUsed=-1,this.curCoefs=null,this.coefs=t,this.power=e,this.truePower=0;for(let i=e;i>=1;i--)if(0!==this.coefs[i].value()){this.truePower=i;break}}getMaxDerivative(){return this.truePower+1}getValue(t,e){let s=this.coefs;0===t?s=this.coefs:(this.updateCoefs(t),s=this.curCoefs);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);let i=1;for(let r=0,o=this.truePower-t;r<=o;++r)n.pe(i*s[r].value()),i*=e;return n.getResult()}getError(t){const e=Math.abs(t),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0);for(let o=0,a=this.power;o<=a;++o)i.addThisE(this.coefs[o].mulE(n)),s.pe(n.value()*this.coefs[o].eps()),n.mulThis(e);s.pe(i.eps());let r=1;for(let o=1;o<=this.truePower;++o){r*=o,this.updateCoefs(o);const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0);for(let s=0,i=this.truePower-o;s<=i;++s)n.addThisE(this.curCoefs[s].mulE(e)),e.mulThis(t);if(!n.isZero())return Math.pow(r*s.getResult()/Math.abs(n.value()),1/o)}return 0}}function yn(t,e,s,n,i,r){let o=t,a=e,h=a-o;if(!r){let s=n.calcF(t).value(),i=n.calcF(e).value();if((s>0||s>i)&&(a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o,o=a),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s,s=i)),s>=0||i<=0)return!1}let u,m=!1,l=s,c=0;for(;c<100;c++){const t=n.calcF(l);if(u=n.calcDF(l),u.isZero())return!1;if(!t.value()||c>3&&t.isZero()){m=!0;break}r||(t.value()<0?o=l:a=l);const e=t.value()/u.value(),s=l-e;r||(s>=o&&s<=a||s>=a&&s<=o)&&Math.abs(e)<=.5*h?(l=s,h=Math.abs(e)):(h=Math.abs(.5*(a-o)),l=.5*(o+a))}return!!m&&(i.set(l,n.estimateError(l)),!0)}
1function xn(t,e,s,n,i,r,o,a){return yn(t,e,s.value(),fn(n,i,r,o),a,!1)}class Cn{constructor(t,e,s){this.coefs=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3),this.coefs[0].setE(t),this.coefs[1].setE(e),this.coefs[2].setE(s)}calcF(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t);return this.coefs[0].mulE(e).addE(this.coefs[1]).mulE(e).addE(this.coefs[2])}calcDF(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.st_mulByPower2(this.coefs[0],2).mulE(e).addE(this.coefs[1])}estimateError(t){const e=Math.abs(t),s=(this.coefs[0].eps()*e+this.coefs[1].eps())*e+this.coefs[2].eps()+this.calcF(t).eps(),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(2).mulE(this.coefs[0]).mul(t).addE(this.coefs[1]);if(n.isZero()){const t=this.coefs[0].value();return Math.sqrt(s/Math.abs(t))}return s/Math.abs(n.value())}}function vn(t,e,s,n,i){return yn(0,0,t.value(),new Cn(e,s,n),i,!0)}function bn(t,e,s,n,i,r){const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3);let a=0;const u=e.negate().divThisE(t.clone().mulThis(3));i.containsCoordinate(u.value())&&(o[0].setE(u),a=1);const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),l=dn(t.mul(3),e.mul(2),s,i,!1,m);if(l<0)return n.isZero()?-1:0;for(let h=0;h<l;
1h++)i.containsCoordinate(m[h].value())&&o[a++].setE(m[h]);(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(o,0,a,(t,e)=>t.value()<e.value()?-1:t.value()>e.value()?1:0);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,5);c[0].set(i.vmin);for(let h=0;h<a;h++)c[1+h].setE(o[h]);c[1+a].set(i.vmax);const g=a+2;let d=1,_=0;{const i=c[0].clone();if(t.clone().mulThisE(i).addThisE(e).mulThisE(i).addThisE(s).mulThisE(i).addThisE(n).isZero()){const o=fn(t,e,s,n);i.setError(o.estimateError(i.value())),r[_]=i,_++,d++}}for(let p=d;p<g;p++){const o=c[p].clone(),a=t.clone().mulThisE(o).addThisE(e).mulThisE(o).addThisE(s).mulThisE(o).addThisE(n).isZero();if(a||!c[p].eq(c[p-1])){if(a||xn(c[p-1].value(),c[p].value(),c[p-1].clone().addThisE(c[p]).divThisByPower2(2),t,e,s,n,o)){if(_>0&&o.eq(r[_-1]))continue;if(_>=3&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("cubic_polynomial_solver_too_many_roots"),a){const i=fn(t,e,s,n);o.setError(i.estimateError(o.value()))}r[_]=o,_++}if(c[p].value()===i.vmax)break;a&&p++}}return _}function Sn(t,e,s,n,i,r){const o=new Pn(t,e,s,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)());let a=0;if(2===o.truePower)a=dn(t[2],t[1],t[0],s,n,i);else if(1===o.truePower)a=gn(t[1],t[0],s,i[0]);else{if(0===o.truePower)return t[0].value()?0:-1;{const t=[];t.length=e,a=en(o,s,e,t);for(let e=0;e<a;e++)i[e].set(t[e])}}for(let h=0;h<a;h++)i[h].setError(o.getError(i[h].value()));return a}var En=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class Dn extends ds{constructor(t){return void 0===t||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.W)(t,"vd")?(super({vd:t?.vd,XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_cp=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),void(this.m_weights=[1,0,1])):(t.fromPoint&&t.weight?t={fromPoint:t.fromPoint,controlPoint1:t.controlPoint1,toPoint:t.toPoint,weight0:1,weight1:t.weight,weight2:1}:t.points&&t.weight?t={fromPoint:t.points[0],controlPoint1:t.points[1],toPoint:t.points[2],weight0:1,weight1:t.weight,weight2:1}:t.points&&t.weights&&(t={fromPoint:t.points[0],controlPoint1:t.points[1],toPoint:t.points[2],weight0:t.weights[0],weight1:t.weights[1],weight2:t.weights[2]}),t.fromPoint&&t.weight0?(super({start:t.fromPoint,end:t.toPoint}),(t.weight0<=0||t.weight1<0||t.weight2<=0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("weights"),this.m_cp=t.controlPoint1.clone(),void(this.m_weights=[t.weight0,t.weight1,t.weight2])):t.copy?(super(t),this.m_cp=t.copy.m_cp.clone(),void(this.m_weights=t.copy.m_weights.slice())):t.move?(super(t),this.m_cp=t.move.m_cp.clone(),void(this.m_weights=t.move.m_weights.slice())):void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("unexpected constructor param"))}getBoundary(){return $s(this)}assignMove(t){return this}assignCopy(t){return t.copyTo(this),this}construct(t,e,s,n){this.dropAllAttributes(),this.setCpsAndWeights(t,e,s,1,n,1),ca(this)}constructWeights(t,e,s,n,i,r){this.dropAllAttributes(),this.setCpsAndWeights(t,e,s,n,i,r),ca(this)}constructArray(t,e){this.construct(t[0],t[1],t[2],e)}constructArrayWeights(t,e){this.dropAllAttributes(),this.setCpsAndWeightsArray(t,e),ca(this)}convertToStandardForm(){}getStandardFormWeight(){return this.m_weights[1]/Math.sqrt(this.m_weights[0]*this.m_weights[2])}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2}queryEnvelope(t){if(t instanceof _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D){if(t.setCoords(this.getStartXY()),t.mergeNe(this.getEndXY()),t.contains(this.m_cp))return;const e=La(this);if(null!==e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(const n of e.specialPoints)this.queryCoord2D(n,s),t.mergeNe(s)}else{const e=[],s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(s),_a(s,this.m_weights,e);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(const i of e)this.queryCoord2D(i,n),t.mergeNe(n)}}}applyTransformation(t){if(t instanceof _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return this.queryControlPoints(e),t.transformPoints2D(e,3,e),this.setStartXY(e[0]),this.m_cp.assign(e[1]),this.setEndXY(e[2]),void this.afterCompletedModification()}}createInstance(){return new Dn({vd:this.m_description})}calculateLength2D(){return pa(this,1,!1)}calculateLowerLength2D(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY())}calculateUpperLength2D(){return this.calculateUpperLength2D_()}calculateUpperLength2D_(){if(this.m_weights[1]>0){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.m_cp)+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getEndXY(),this.m_cp)}return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY())}queryCoord2D(t,e){return this.queryCoord2DExtension(t,e,!0)}queryCoord2DE(t,e){ch(this,t,e)}queryCoord2DExtension(t,e,s){if(s){if(t<0){return void ps(new fm({
1start:this.getStartXY(),end:this.getStartXY().add(this.getTangent(0).getUnitVector())}),t,e)}if(t>1){return void ps(new fm({start:this.getEndXY(),end:this.getEndXY().add(this.getTangent(1).getUnitVector())}),t-1,e)}}const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(n),ph(n,this.m_weights,t,e)}getCoordX(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtension(t,e,!0),e.x}getCoordY(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtension(t,e,!0),e.y}cut(t,e,s){const n=new Pm;return this.queryCut(t,e,n,s),n.releaseSegment()}queryCut(t,e,s,n){const i=s.createQuadraticRationalBezier();if(this.cutBezierIgnoreAttributes(t,e,i),n)return;i.assignVertexDescription(this.m_description);const r=this.m_description.getAttributeCount();if(r>1){for(let e=1;e<r;e++){const s=this.m_description.getSemantics(e),n=En.getComponentCount(s);for(let e=0;e<n;e++){const n=this.getAttributeAsDbl(t,s,e);i.setStartAttribute(s,e,n)}}for(let t=1;t<r;t++){const s=this.m_description.getSemantics(t),n=En.getComponentCount(s);for(let t=0;t<n;t++){const n=this.getAttributeAsDbl(e,s,t);i.setEndAttribute(s,t,n)}}}}queryDerivative(t,e){Da(this,t,e)}cutBezierIgnoreAttributes(t,s,n){(t<0||s>1||t>s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Quadratic_rational_bezier.cut_bezier_ignore_attributes");const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(i);const r=[0,0,0];Ja(i,this.m_weights,t,s,i,r),n.setControlPointsAndWeights(i,r)}splitBezierIgnoreAttributes(t,e,s){}getAttributeAsDbl(t,e,s){if(0===e)return 0===s?this.getCoordX(t):this.getCoordY(t);const n=this.calculateLength2D(),i=n>0?this.tToLength(t)/n:0,r=En.getInterpolation(e),o=this.getStartAttributeAsDbl(e,s),a=this.getEndAttributeAsDbl(e,s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.V)(r,o,a,i,En.getDefaultValue(e))}getClosestCoordinate(t,e){return za(this,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),e,-1)}getClosestCoordinateOnInterval(t,e,s=-1){return za(this,t,e,!1,s)}getYMonotonicParts(t,e){return this.getMonotonicParts(t,e)}getMonotonicParts(t,n){t.length<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const i=da(this);let r=0;if(2===i.specialPointsCount())return 0;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=i.specialPointsCount()-1);for(let e=1,s=i.specialPointsCount();e<s;++e)this.queryCut(i.specialPoints[e-1],i.specialPoints[e],t[r],n),r++;for(let e=0;e<r;++e){Ha(t[e].get())}return r}intersectionWithAxis2D(t,e,s,n){s&&(s.length=9),n&&(n.length=9);const i=new Array(3),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);let a=0;const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);if(this.queryControlPoints(h),t){if(i[0]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[0].y).sub(e).mul(this.m_weights[0]),i[1]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[1].y).sub(e).mul(this.m_weights[1]),i[2]=i[0].subE(i[1].mul(2)).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[2].y).sub(e).mul(this.m_weights[2])),i[1]=i[1].subE(i[0]).mulThisByPower2(2),a=dn(i[2],i[1],i[0],o,!1,r),s)for(let u=0;u<a;u++)s[u]=this.getCoordX(r[u].value())}else if(i[0]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[0].x).sub(e).mul(this.m_weights[0]),i[1]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[1].x).sub(e).mul(this.m_weights[1]),i[2]=i[0].subE(i[1].mul(2)).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(h[2].x).sub(e).mul(this.m_weights[2])),i[1]=i[1].subE(i[0]).mulThisByPower2(2),a=dn(i[2],i[1],i[0],o,!1,r),s)for(let u=0;u<a;u++)s[u]=this.getCoordY(r[u].value());if(n)for(let u=0;u<a;u++)n[u]=r[u].value();else s&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(s,0,a,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7);return a}intersectionOfYMonotonicWithAxisX(t,e){if(this.m_YStart===this.m_YEnd)return t===this.m_YStart?e:Number.NaN;if(t===this.m_YStart)return this.m_XStart;if(t===this.m_YEnd)return this.m_XEnd;const n=[Number.NaN,Number.NaN],i=this.intersectionWithAxis2D(!0,t,n,null);return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(2!==i),-1===i?e:n[0]}isCurve(){return!0}isDegenerate(t){return ze(this,t)}isDegenerate3D(t,e){return!1}queryLooseEnvelope(t){if(t instanceof _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D)return t.setCoords({pt:this.getStartXY()}),t.mergeNe(this.m_cp),void t.mergeNe(this.getEndXY())}clone(t){const e=this.createInstance();return this.copyTo(e),e}queryInterval(t,e){if(0===t){const t=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();this.queryEnvelope(t);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();return 0===e?t.queryIntervalX(s):t.queryIntervalY(s),s}return super.queryInterval(t,e)}queryLooseEnvelopeOnInterval(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(s);const n=[0,0,0];Ja(s,this.m_weights,t.vmin,t.vmax,s,n),e.setFromPoints(s,3)}changeEndPoints2D(t,e){if(t.isEqual(this.m_XStart,this.m_YStart)&&e.isEqual(this.m_XEnd,this.m_YEnd))return;const s=this.m_cp.isEqual(this.m_XStart,this.m_YStart),n=this.m_cp.isEqual(this.m_XEnd,this.m_YEnd);this.setStartXY(t),this.setEndXY(e),s?this.m_cp.setCoordsPoint2D(t):n&&this.m_cp.setCoordsPoint2D(e),this.normalizeAfterEndpointChange()}tToLength(t){return pa(this,t,!0)}lengthToT(t){return Ia(this,t)}calculateWeightedAreaCentroid2D(t){const e=Xa(this),s=Ma(this);return e.x+=(this.getStartX()-t.x)*s,e.y+=(this.getStartY()-t.y)*s,e}calculateWeightedCentroid2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.isDegenerate(0)?(t.setCoords(0,0),t):Va(this)?(t.assign(this.getCoord2D(.5).mul(this.calculateLength2D())),t):(t.assign(Oa(this,1)),t)}getControlPoint1(){return this.m_cp.clone()}setControlPoint1(t){this.m_cp.setCoordsPoint2D(t),this.afterCompletedModification()}queryWeights(t){for(let e=0;e<3;++e)t[e]=this.m_weights[e]}queryCoord2DMP(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return this.queryControlPoints(s),dh(s.map(t=>qe.constructPoint2D(t)),this.m_weights.map(t=>_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(t)),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(t),e)}setWeights(t){}queryControlPoints(t){t[0].assign(this.getStartXY()),t[1].assign(this.m_cp),t[2].assign(this.getEndXY())}queryControlPointsHelper(t){return this.queryControlPoints(t),3}setControlPointsAndWeights(t,e){this.setCpsAndWeightsArray(t,e),this.afterCompletedModification()}getTangent(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return this.queryControlPoints(e),Aa(e,this.m_weights,t)}getDerivative(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(t,0,1),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return fa(this,1,e,s),s[1]}getCurvature(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);fa(this,2,t,e);const s=e[1].sqrLength();if(0===s)return Number.NaN;e[1].divThis(Math.sqrt(s));return e[1].crossProduct(e[2])/s}isIntersecting(t,e,s){return!1}isIntersectingPoint(t,e,s){return!1}isIntersectingPoint3D(t,e,s,n,i=1){return!1}isMonotoneQuickAndDirty(){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return this.queryControlPoints(t),Za(t)}getMonotonicPartParams(t,s){const n=da(this),i=n.specialPointsCount();if(!s)return n.specialPointsCount();t<i&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");for(let e=0;e<i;e++)s[e]=n.specialPoints[e];return i}normalizeAfterEndpointChange(){return!1}orientBottomUp(){if(this.m_YEnd<this.m_YStart||this.m_YEnd===this.m_YStart&&this.m_XEnd<this.m_XStart){this.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=this.m_XEnd),this.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=this.m_YEnd),this.m_weights[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_weights[0],this.m_weights[0]=this.m_weights[2]);for(let t=0,e=this.m_description.getTotalComponentCount()-2;t<e;t++)this.m_attributes[t+e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_attributes[t],this.m_attributes[t]=this.m_attributes[t+e]);this.m_cachedValues=null}}isLine(){return!1}isDegenerateToLineHelper(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e);const s=e[2].sub(e[0]),n=s.length();if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[2],e[1])-n>t)return!1;const i=t,r=e[1].clone();r.subThis(e[0]);return!(Math.abs(r.crossProduct(s))/n>i)}copyIgnoreAttributes(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e);const s=[0,0,0];this.queryWeights(s),t.setControlPointsAndWeights(e,s)}calculateArea2DHelper(){return Ma(this)}
1absNorm(){return this.getStartXY().norm(1)+this.getEndXY().norm(1)+this.m_cp.norm(1)}absNormXYZ(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}queryEnvelopeW(t,e){Wa(this,t,e)}setSegmentFromCoordsForStitcher(t,e){const s=[0,0,0];this.queryWeights(s),this.constructWeights(t[0],this.getControlPoint1(),t[e-1],s[0],s[1],s[2])}writeInBufferStream(t,e){const s=new Float64Array(5);return s[0]=this.m_cp.x,s[1]=this.m_cp.y,s[2]=this.m_weights[0],s[3]=this.m_weights[1],s[4]=this.m_weights[2],t.writeRangeFromArray(e,s.length,s,!0,1),e+s.length}readFromBufferStream(t,e){const s=new Float64Array(5);t.queryRange(e,s.length,s,!0,1),this.m_cp.x=s[0],this.m_cp.y=s[1],this.m_weights[0]=s[2],this.m_weights[1]=s[3],this.m_weights[2]=s[4],this.m_cachedValues=null}snapControlPoints(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e[1],e[0]),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e[1],e[2]);let i=e[0].clone(),r=s;s>n&&(i=e[2].clone(),r=n);let o=!1;return r<=t&&0!==r&&(o=!0,this.setControlPoint1(i)),o}needsSnapControlPoints(t){if(!t)return!1;const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e[1],e[0]),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e[1],e[2]);e[0].clone();let i=s;return s>n&&(e[2].clone(),i=n),i<=t&&0!==i}calculateSpecialPointsForCracking(t,e){return 0}ensureXYMonotone(){return Ha(this)}setCoordsForIntersector(t,e,s){$a(this,t,e,s)}copyToImpl(t){const e=t;e.m_cp.setCoordsPoint2D(this.m_cp),e.m_weights[0]=this.m_weights[0],e.m_weights[1]=this.m_weights[1],e.m_weights[2]=this.m_weights[2],Ra(e,La(this))}reverseImpl(){this.m_weights[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_weights[0],this.m_weights[0]=this.m_weights[2])}equalsImpl(t){const e=t;if(!this.m_cp.equals(e.m_cp))return!1;for(let s=0;s<3;s++)if(this.m_weights[s]!==e.m_weights[s])return!1;return!0}equalsImplTol(t,e){const s=t;if(!this.m_cp.isEqualPoint2D(s.m_cp,e))return!1;const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(n);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);s.queryControlPoints(i);const r=[s.m_weights[0],s.m_weights[1],s.m_weights[2]];for(let o=0;o<3;o++){const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f;t.setCoordsPoint2DZ(n[o].mul(this.m_weights[o]),this.m_weights[o]);const s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f;if(s.setCoordsPoint2DZ(i[o].mul(r[o]),r[o]),!t.isEqual(s,e))return!1}return!0}swapImpl(t){const e=t;e.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp,this.m_cp=e.m_cp),e.m_weights=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_weights,this.m_weights=e.m_weights),ga(this,e)}afterCompletedModification(){ca(this)}intersect(t,e,s,n,i){return mm(!1,this,t,e,s,n,i)}intersectPoint(t,e,s){return Ga(this,t,e,s)}endPointModified(){ca(this)}clearEndPointModified(){}setCpsAndWeights(t,s,n,i,r,o){(i<=0||o<=0||r<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("weights"),(t.isNAN()||s.isNAN()||n.isNAN())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("NAN control points in bezier are not supported"),this.setStartXY(t),this.m_cp.assign(s),this.m_weights[0]=i,this.m_weights[1]=r,this.m_weights[2]=o,this.setEndXY(n)}setCpsAndWeightsArray(t,e){this.setCpsAndWeights(t[0],t[1],t[2],e[0],e[1],e[2])}}Dn.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2;var wn=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class An extends ds{constructor(t){void 0===t||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.W)(t,"vd")?(super({vd:t?.vd,XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_cp=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0)):t.from?(super({XStart:t.from.x,YStart:t.from.y,XEnd:t.to.x,YEnd:t.to.y,...t.vd}),this.m_cp=t.cp.clone()):t.points?(super({XStart:t.points[0].x,YStart:t.points[0].y,XEnd:t.points[2].x,YEnd:t.points[2].y,...t.vd}),this.m_cp=t.points[1].clone()):t.copy?(super(t),this.m_cp=t.copy.m_cp.clone()):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("unexpected constructor args")}getBoundary(){return $s(this)}assignCopy(t){return this!==t&&t.copyTo(this),this}construct(t,e,s){this.setStartXY(t),this.m_cp.assign(e),this.setEndXY(s),ri(this)}constructPoints(t){this.setStartXY(t[0]),this.m_cp.assign(t[1]),this.setEndXY(t[2]),ri(this)}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2}queryEnvelope(t){if(2===t.m_EnvelopeType){if(t.setCoords(this.getStartXY()),t.mergeNe(this.getEndXY()),t.contains(this.m_cp))return;const e=xi(this);if(null!==e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(const n of e.specialPoints)this.queryCoord2D(n,s),t.mergeNe(s)}else{const e=[];hi(this,e);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(const n of e)this.queryCoord2D(n,s),t.mergeNe(s)}return}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("env type not impl")}applyTransformation(t){if(1===t.m_TransformationType){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return this.queryControlPoints(e),t.transformPoints2D(e,3,e),this.setStartXY(e[0]),this.m_cp.assign(e[1]),this.setEndXY(e[2]),void this.afterCompletedModification()}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}createInstance(){return new An({vd:this.m_description})}calculateLength2D(){return ui(this,1,!1)}calculateLowerLength2D(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY())}calculateUpperLength2D(){return this.calculateUpperLength2D_()}calculateUpperLength2D_(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.m_cp)+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getEndXY(),this.m_cp)}queryCoord2D(t,e){this.queryCoord2DExtended(t,e,!1)}queryCoord2DExtended(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(n),Zi(n,t,e,s)}queryCoord2DE(t,e){Hi(this,t,e)}queryCoord2DMP(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!1,"bernstein polynomials not ported")}getCoordX(t){if(t<0||t>1){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtended(t,e,!0),e.x}if(t<=.5){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(this.getStartX(),this.m_cp.x,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(this.m_cp.x,this.getEndX(),t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(e,s,t)}{const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(this.getStartX(),this.m_cp.x,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(this.m_cp.x,this.getEndX(),t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(e,s,t)}}getCoordY(t){if(t<0||t>1){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtended(t,e,!0),e.y}if(t<=.5){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(this.getStartX(),this.m_cp.x,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(this.m_cp.x,this.getEndX(),t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(e,s,t)}{const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(this.getStartY(),this.m_cp.y,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(this.m_cp.y,this.getEndY(),t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(e,s,t)}}cut(t,e,s){const n=new Pm;return this.queryCut(t,e,n,s),n.releaseSegment()}queryCut(t,e,s,n){const i=s.createQuadraticBezier();if(this.cutBezierIgnoreAttributes(t,e,i),n)return;i.assignVertexDescription(this.m_description);const r=this.m_description.getAttributeCount();if(r>1){for(let e=1;e<r;e++){const s=this.m_description.getSemantics(e),n=wn.getComponentCount(s);for(let e=0;e<n;e++){const n=this.getAttributeAsDbl(t,s,e);i.setStartAttribute(s,e,n)}}for(let t=1;t<r;t++){const s=this.m_description.getSemantics(t),n=wn.getComponentCount(s);for(let t=0;t<n;t++){const n=this.getAttributeAsDbl(e,s,t);i.setEndAttribute(s,t,n)}}}}queryDerivative(t,e){Oi(this,t,e)}cutBezierIgnoreAttributes(t,s,n){if((t<0||s>1||t>s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Quadratic_bezier.cut_bezier_ignore_attributes"),0===t&&1===s)return n.setStartXY(this.getStartXY()),n.m_cp.assign(this.m_cp),void n.setEndXY(this.getEndXY());const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(i),Yi(i,t,s,i),n.constructPoints(i)}splitBezierIgnoreAttributes(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getAttributeAsDbl(t,e,s){if(0===e)return 0===s?this.getCoordX(t):this.getCoordY(t);const n=this.calculateLength2D(),i=n>0?this.tToLength(t)/n:0,r=wn.getInterpolation(e),o=this.getStartAttributeAsDbl(e,s),a=this.getEndAttributeAsDbl(e,s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.V)(r,o,a,i,wn.getDefaultValue(e))}getClosestCoordinate(t,e){return vi(this,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),e)}getClosestCoordinateOnInterval(t,e,s=-1){return vi(this,t,e,!1)}getYMonotonicParts(t,e){return this.getMonotonicParts(t,e)}getMonotonicParts(t,n){t.length<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const i=ai(this);let r=0;if(2===i.specialPointsCount())return 0;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=i.specialPointsCount()-1);for(let e=1,s=i.specialPointsCount();e<s;++e)this.queryCut(i.specialPoints[e-1],i.specialPoints[e],t[r],n),r++;for(let e=0;e<r;++e){Ai(t[e].get())}return r}intersectionWithAxis2D(t,e,s,n){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);let a=0;if(t){if(i[0]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartY()).sub(e),i[1]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.m_cp.y).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartY())).mulThisByPower2(2),i[2]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartY()).add(this.getEndY()).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.m_cp.y).mulThisByPower2(2)),a=dn(i[2],i[1],i[0],o,!1,r),s)for(let h=0;h<a;
1h++)s[h]=this.getCoordX(r[h].value())}else if(i[0]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartX()).sub(e),i[1]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.m_cp.x).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartX())).mulThisByPower2(2),i[2]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.getStartX()).add(this.getEndX()).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(this.m_cp.x).mulThisByPower2(2)),a=dn(i[2],i[1],i[0],o,!1,r),s)for(let h=0;h<a;h++)s[h]=this.getCoordY(r[h].value());if(n)for(let h=0;h<a;h++)n[h]=r[h].value();else s&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Z)(s,a);return a}intersectionOfYMonotonicWithAxisX(t,e){if(this.m_YStart===this.m_YEnd)return t===this.m_YStart?e:Number.NaN;if(t===this.m_YStart)return this.m_XStart;if(t===this.m_YEnd)return this.m_XEnd;const n=[0,0],i=this.intersectionWithAxis2D(!0,t,n,null);return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(2!==i),-1===i?e:n[0]}isCurve(){return!0}isLine(){return!1}isDegenerate(t){return ze(this,t)}isDegenerate3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}queryLooseEnvelope(t){if(2===t.m_EnvelopeType)return t.setCoords(this.getStartXY()),t.mergeNe(this.m_cp),void t.mergeNe(this.getEndXY());(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}clone(t){const e=this.createInstance();return this.copyTo(e),e}queryInterval(t,e){if(0===t){const t=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;this.queryEnvelope(t);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;return 0===e?t.queryIntervalX(s):t.queryIntervalY(s),s}return super.queryInterval(t,e)}queryLooseEnvelopeOnInterval(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(s),Yi(s,t.vmin,t.vmax,s),e.setFromPoints(s,4)}changeEndPoints2D(t,e){if(t.isEqual(this.m_XStart,this.m_YStart)&&e.isEqual(this.m_XEnd,this.m_YEnd))return;const s=this.m_cp.isEqual(this.m_XStart,this.m_YStart),n=this.m_cp.isEqual(this.m_XEnd,this.m_YEnd);this.setStartXY(t),this.setEndXY(e),s?this.m_cp.setCoordsPoint2D(t):n&&this.m_cp.setCoordsPoint2D(e),this.normalizeAfterEndpointChange()}tToLength(t){return ui(this,t,!0)}lengthToT(t){return pi(this,t)}calculateWeightedAreaCentroid2D(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);ki(this,e);const s=e[2],n=e[1],i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,r=s.y*n.x-s.x*n.y;i.x=-(4*s.x+5*n.x)*r/60,i.y=-(4*s.y+5*n.y)*r/60;const o=fi(this);return i.x+=(e[0].x-t.x)*o,i.y+=(e[0].y-t.y)*o,i}calculateWeightedCentroid2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.isDegenerate(0)?(t.setCoords(0,0),t):yi(this)?(t.assign(this.getCoord2D(.5).mul(this.calculateLength2D())),t):(t.assign(Ii(this,1)),t)}getControlPoint1(){return this.m_cp.clone()}setControlPoint1(t){this.m_cp.setCoordsPoint2D(t),this.afterCompletedModification()}queryControlPoints(t){t[0].assign(this.getStartXY()),t[1].assign(this.m_cp),t[2].assign(this.getEndXY())}queryControlPointsHelper(t){return this.queryControlPoints(t),3}setControlPoints(t){for(let s=0;s<3;s++)t[s].isNAN()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("NaN control points in bezier are not supported");this.m_XStart=t[0].x,this.m_YStart=t[0].y,this.m_cp.setCoordsPoint2D(t[1]),this.m_XEnd=t[2].x,this.m_YEnd=t[2].y,this.afterCompletedModification()}getTangent(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(t,0,1);let s=gi(this,1,e);return s.isZero()&&(s=gi(this,2,e),1===e&&s.negateThis()),s}getDerivative(t){return gi(this,1,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(t,0,1))}getCurvature(t){const e=gi(this,1,t),s=gi(this,2,t),n=e.sqrLength();if(0===n)return Number.NaN;e.divThis(Math.sqrt(n));return e.crossProduct(s)/n}isIntersecting(t,e,s){return 0!==om(!1,this,t,e,s)}isIntersectingPoint(t,e,s){if(s&&(t.isEqualPoint2D(this.getStartXY())||t.isEqualPoint2D(this.getEndXY())))return!1;const n=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;if(this.queryLooseEnvelope(n),n.inflateCoords(e,e),!n.contains(t))return!1;const i=this.getClosestCoordinate(t,!1),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(i,r);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(r,t)<=e}isIntersectingPoint3D(t,e,n,i,r=1){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}isMonotoneQuickAndDirty(){return!1}getMonotonicPartParams(t,s){const n=ai(this),i=n.specialPointsCount();if(!s)return n.specialPointsCount();t<i&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");for(let e=0;e<i;e++)s[e]=n.specialPoints[e];return i}normalizeAfterEndpointChange(){return!1}orientBottomUp(){if(this.m_YEnd<this.m_YStart||this.m_YEnd===this.m_YStart&&this.m_XEnd<this.m_XStart){(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=this.m_XEnd),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=this.m_YEnd);for(let t=0,e=this.m_description.getTotalComponentCount()-2;t<e;t++)this.m_attributes[t+e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_attributes[t],this.m_attributes[t]=this.m_attributes[t+e]);this.m_cachedValues=null}}isDegenerateToLineHelper(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e);const s=e[2].sub(e[0]),n=s.length();if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[2],e[1])-n>t)return!1;const i=t,r=e[1].clone();r.subThis(e[0]);return!(Math.abs(r.crossProduct(s))/n>i)}copyIgnoreAttributes(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(e),t.setControlPoints(e)}calculateArea2DHelper(){return fi(this)}absNorm(){return Xi(this)}queryEnvelopeW(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);this.queryControlPoints(s),Di(s,t,e)}
vendor: 6,758 bytes, line 1
1setSegmentFromCoordsForStitcher(t,e){this.construct(t[0],this.getControlPoint1(),t[e-1])}snapControlPoints(t){return tr(this,t)}writeInBufferStream(t,e){const s=new Float64Array(2);return s[0]=this.m_cp.x,s[1]=this.m_cp.y,t.writeRangeFromArray(e,s.length,s,!0,1),e+s.length}readFromBufferStream(t,e){const s=new Float64Array(2);t.queryRange(e,s.length,s,!0,1),this.m_cp.x=s[0],this.m_cp.y=s[1],this.m_cachedValues=null}needsSnapControlPoints(t){return er(this,t)}calculateSpecialPointsForCracking(t,e){return 0}ensureXYMonotone(){return Ai(this)}setCoordsForIntersector(t,e,s){Ni(this,t,e,s)}copyToImpl(t){const e=t;e.m_cp.setCoordsPoint2D(this.m_cp),Ci(e,xi(this))}reverseImpl(){}equalsImplTol(t,e){const s=t;return!!this.m_cp.isEqualPoint2D(s.m_cp,e)}equalsImpl(t){const e=t;return!!this.m_cp.equals(e.m_cp)}swapImpl(t){const e=t;e.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp,this.m_cp=e.m_cp),oi(this,e)}afterCompletedModification(){ri(this)}intersect(t,e,s,n,i){return mm(!1,this,t,e,s,n,i)}intersectPoint(t,e,s){return Si(this,t,e.length,e,s)}endPointModified(){ri(this)}clearEndPointModified(){}}An.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2;class Tn{constructor(t){return t.coefsT?(this.m_zeroCtor=t.zeroCtor,this.m_elements=t.coefsT.map(t=>t.clone()),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.m_elements.length===t.power+1),void this.updatePower()):t.coef0?(this.m_zeroCtor=t.zeroCtor,void(this.m_elements=[t.coef0.clone()])):t.copy?(this.m_zeroCtor=t.copy.m_zeroCtor,void(this.m_elements=t.copy.m_elements.map(t=>t.clone()))):(this.m_zeroCtor=t.zeroCtor,void(this.m_elements=[new this.m_zeroCtor]))}construct(t,e){return this.m_elements=t.map(t=>t.clone()),this.updatePower(),this}construct0(t){return this.m_elements.length=0,this.m_elements.push(t.clone()),this.updatePower(),this}assignCopy(t){return this.m_elements=t.m_elements.map(t=>t.clone()),this.updatePower(),this}assignMove(t){return this.m_elements=t.m_elements,t.m_elements=[],this.updatePower(),this}power(){return this.m_elements.length-1}addElement(t){this.m_elements.push(t.clone())}scaleRangeToUnitInterval(t,e){const s=e;s.subThis(t);const n=this.power();for(let i=0;i<=n;i++){const e=new this.m_zeroCtor;for(let s=i;s<=n;s++){const n=this.m_elements[s];n.mulDoubleThis((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ao)(s,i));const r=t.pow(s-i);n.mulThis(r),e.addThis(n)}const r=s.pow(i);e.mulThis(r),this.m_elements[i]=e}}fmSubThis(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}addThis(t){const e=Math.min(this.power(),t.power());for(let n=0;n<=e;++n)this.m_elements[n].addThis(t.m_elements[n]);const s=t.power();this.m_elements.length=Math.max(this.power(),t.power())+1;for(let n=e+1;n<=s;++n)this.m_elements[n]=t.m_elements[n];return this.updatePower(),this}add0(t){return this.m_elements[0].addThis(t),this.updatePower(),this}addNumber0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}sub(t){const e=Math.min(this.power(),t.power());for(let n=0;n<=e;++n)this.m_elements[n].subThis(t.m_elements[n]);const s=t.power();this.m_elements.length=Math.max(this.power(),t.power())+1;for(let n=e+1;n<=s;++n)this.m_elements[n]=t.m_elements[n].clone(),this.m_elements[n].negateThis();return this.updatePower(),this}sub0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}subNumber0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}subShifted(t,e){const s=this.power(),n=t.power()+e,i=Math.min(this.power(),n);let r=0;for(let o=e;o<=i;++o)this.m_elements[o].subThis(t.m_elements[r]),r++;if(n<=s)return this.updatePower(),this;this.m_elements.length=n+1;for(let o=s+1;o<this.m_elements.length;++o)this.m_elements[o]=new this.m_zeroCtor;for(let o=i+1;o<=n;++o)this.m_elements[o].subThis(t.m_elements[r++]);return this.updatePower(),this}subShiftedWithCoef(t,e,s){const n=this.power(),i=t.power()+s,r=Math.min(this.power(),i);let o=0;for(let a=s;a<=r;++a)this.m_elements[a].fmSubThis(t.m_elements[o],e),o++;if(i<=n)return this.updatePower(),this;this.m_elements.length=i+1;for(let a=n+1;a<this.m_elements.length;++a)this.m_elements[a]=new this.m_zeroCtor;for(let a=r+1;a<=i;++a)this.m_elements[a].fmSubThis(t.m_elements[o++],e);return this.updatePower(),this}mulThis(t){if(this.constructor===t.constructor){const e=t,s=[];for(let t=0,n=this.power();t<=n;t++)for(let i=0,r=e.power();i<=r;i++){const n=this.m_elements[t].clone();n.mulThis(e.m_elements[i]),t+i<s.length?s[t+i].addThis(n):s.push(n)}this.m_elements=s}else for(let e=0,s=this.power();e<=s;e++)this.m_elements[e].mulThis(t);return this.updatePower(),this}mulElementThis(t){for(let e=0,s=this.power();e<=s;e++)this.m_elements[e].mulThis(t);return this.updatePower(),this}mulDoubleThis(t){for(let e=0,s=this.power();e<=s;e++)this.m_elements[e].mulDoubleThis(t);return this.updatePower(),this}mulNumber0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}mulBigint0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}mulBigIntThis(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}mulInt320(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}div0(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}absThis(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}div(t,e,s){if(this.power()<t.power())return s.assignCopy(this),void e.setZero();s.setZero(),e.setZero();const n=t.getElement(t.power()),i=this.clone();let r=i.power();const o=i.power()-t.power();let a=o;for(e.m_elements=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(e.m_zeroCtor,o+1);;){if(r<t.power()){s.assignMove(i);break}if(r===i.power()){const s=i.getElement(i.power());s.divThis(n),i.subShiftedWithCoef(t,s,i.power()-t.power()),e.m_elements[a]=s.clone()}a--,r--}s.updatePower(),e.updatePower()}divThis(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this}subThis(t){const e=Math.min(this.power(),t.power());for(let n=0;n<=e;++n)this.m_elements[n].subThis(t.m_elements[n]);const s=t.power();this.m_elements.length=Math.max(this.power(),t.power())+1;for(let n=e+1;n<=s;++n)this.m_elements[n]=t.m_elements[n].clone(),this.m_elements[n].negateThis();return this.updatePower(),this}sub0This(t){return this.m_elements[0].subThis(t),this.updatePower(),this}subFrom(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}isZero(){return 0===this.power()&&this.m_elements[0].isZero()}negateThis(){for(let t=this.m_elements.length-1;t>=0;t--)this.m_elements[t].negateThis();return this}getElement(t){return this.m_elements[t].clone()}setElement(t,e){return this.m_elements[t]=e.clone(),this}evaluate(t){const e=this.power(),s=this.m_elements[e].clone();for(let n=e-1;n>=0;--n)s.mulThis(t),s.addThis(this.m_elements[n]);return s}equals(t){if(this===t)return!0;
vendor: 23,581 bytes, line 1
1if(this.power()!==t.power())return!1;for(let e=this.m_elements.length-1;e>=0;e--)if(!this.m_elements[e].equals(t.m_elements[e]))return!1;return!0}updatePower(){for(let t=this.m_elements.length-1;t>0&&this.m_elements[t].isZero();t--)this.m_elements.pop();return this}setZero(){return this.m_elements.length=1,this.m_elements[0]=new this.m_zeroCtor,this.updatePower(),this}derivative(t){if(this.power()<t)return this.clone().setZero();if(0===t)return this.clone();const e=new this.constructor({coefsT:this.m_elements.slice(t),power:this.power()-t});for(let s=t,n=this.power();s<=n;s++){let n=BigInt(s);for(let e=s-1,i=s-t;e>i;--e)n*=BigInt(e);e.m_elements[s-t].mulBigIntThis(n)}return e.updatePower(),e}derivative1This(){if(this.m_elements.length>1){this.m_elements=this.m_elements.slice(1);for(let t=1,e=this.power();t<=e;t++)this.m_elements[t].mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(t+1))}else this.m_elements.length=0,this.m_elements.push(new this.m_zeroCtor);return this}limitPrecisionThis(t){for(let e=this.power();e>=0;--e)this.m_elements[e].limitPrecisionThis(t);return this.updatePower(),this}hiBitIndex(){return this.m_elements.reduce((t,e)=>{const s=e.hiBitIndex();return t<s?s:t},0)}shiftRight(t){return this.m_elements.splice(0,t),this.updatePower(),this}evaluateDerivative(t){const e=this.power(),s=this.m_elements[e];s.mulDoubleThis(e);for(let n=e-1;n>=1;--n){s.mulThis(t);const e=this.m_elements[n];e.mulDoubleThis(n),s.addThis(e)}return s}static evaluateCoefs(t,e,s){const n=t.power();s.construct0(t.getElement(0).evaluate(e));for(let i=1;i<=n;++i)s.addElement(t.getElement(i).evaluate(e));s.updatePower()}}class In extends Tn{constructor(t){super(void 0===t?{zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M}:{...t,zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M})}clone(){return new In({copy:this})}absEvaluate(t){const e=this.power(),s=this.m_elements[e].clone();s.absThis();const n=t.clone();n.absThis();for(let i=e-1;i>=0;--i)s.mulThis(n),s.addThis(this.m_elements[i].abs());return s}}class Mn extends Tn{constructor(t){super(void 0===t?{zeroCtor:In}:{...t,zeroCtor:In})}clone(){return new Mn({copy:this})}constructFromMPValues(t,e){this.m_elements.length=0;for(let s=0;s<=e;++s)this.m_elements.push(new In({coef0:t[s]}));return this.updatePower(),this}}function Yn(){return{polypoly1:new Mn,polypoly2:new Mn,polyX2:new In,polyY2:new In,polyX2Deriv:new In,polyY2Deriv:new In,polypolyX1:new Mn,polypolyY1:new Mn,polypolyX1Deriv:new Mn,polypolyY1Deriv:new Mn,lazyPolypolyD1:new Mn,lazyPolypolyD1Deriv:new Mn,lazyPolyD2:new In,lazyPolyD2Deriv:null,polypoly11:new Mn,polypoly12:new Mn,tempPp:new Mn,tempPp1:new Mn,tempPp2:new Mn,tempP:new In,tempP1:new In,tempP2:new In}}function Nn(t,e,n,i,r,o,a,u,m,l,c,g,d,_,p,f,P,y,x,C=!1){const v=Yn();v.polyX2.construct(a,u),v.polyY2.construct(m,l),v.polypolyX1.constructFromMPValues(t,e),v.polypolyY1.constructFromMPValues(n,i),v.polypoly11.assignCopy(v.polypolyX1),v.polypoly12.assignCopy(v.polypolyY1),c&&(v.lazyPolyD2.construct(c,g),v.polypoly11.mulElementThis(v.lazyPolyD2),v.polypoly12.mulElementThis(v.lazyPolyD2)),r?(v.lazyPolypolyD1.constructFromMPValues(r,o),v.lazyPolypolyD1Deriv=new Mn({copy:v.lazyPolypolyD1}),v.lazyPolypolyD1Deriv.derivative1This(),v.tempPp.assignCopy(v.lazyPolypolyD1),v.tempPp.mulElementThis(v.polyX2),v.polypoly11.subThis(v.tempPp),v.tempPp.assignCopy(v.lazyPolypolyD1),v.tempPp.mulElementThis(v.polyY2),v.polypoly12.subThis(v.tempPp)):(v.polypoly11.sub0This(v.polyX2),v.polypoly12.sub0This(v.polyY2)),v.polypolyX1Deriv.assignCopy(v.polypolyX1),v.polypolyX1Deriv.derivative1This(),v.polypolyY1Deriv.assignCopy(v.polypolyY1),v.polypolyY1Deriv.derivative1This(),r&&(v.polypolyX1Deriv.mulThis(v.lazyPolypolyD1),v.tempPp2.assignCopy(v.lazyPolypolyD1Deriv),v.tempPp2.mulThis(v.polypolyX1),v.polypolyX1Deriv.subThis(v.tempPp2),v.polypolyY1Deriv.mulThis(v.lazyPolypolyD1),v.tempPp2.assignCopy(v.lazyPolypolyD1Deriv),v.tempPp2.mulThis(v.polypolyY1),v.polypolyY1Deriv.subThis(v.tempPp2)),v.polyX2Deriv.assignCopy(v.polyX2),v.polyX2Deriv.derivative1This(),v.polyY2Deriv.assignCopy(v.polyY2),v.polyY2Deriv.derivative1This(),c&&((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(null===v.lazyPolyD2Deriv),v.lazyPolyD2Deriv=new In({copy:v.lazyPolyD2}),v.lazyPolyD2Deriv.derivative1This(),v.polyX2Deriv.mulThis(v.lazyPolyD2),v.tempP1.assignCopy(v.lazyPolyD2Deriv),v.tempP1.mulThis(v.polyX2),v.polyX2Deriv.subThis(v.tempP1),v.polyY2Deriv.mulThis(v.lazyPolyD2),v.tempP1.assignCopy(v.lazyPolyD2Deriv),v.tempP1.mulThis(v.polyY2),v.polyY2Deriv.subThis(v.tempP1)),v.polypoly1.assignCopy(v.polypoly11),v.polypoly1.mulElementThis(v.polyX2Deriv),v.tempPp.assignCopy(v.polypoly12),v.tempPp.mulElementThis(v.polyY2Deriv),v.polypoly1.addThis(v.tempPp),v.polypoly2.assignCopy(v.polypolyX1Deriv),v.polypoly2.mulElementThis(v.polyY2Deriv),v.tempPp.assignCopy(v.polypolyY1Deriv),v.tempPp.mulElementThis(v.polyX2Deriv),v.polypoly2.subThis(v.tempPp);let b=[];const S=[];P||(P=[]),f||(f=[]),Gn(v.polypoly11,v.polypoly12,v.tempP);const E=64,D=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai.ldexp(-59).toDouble(),w=[];let A=Wn(v.tempP,d,p,D,E,w,y,y);if(A<0)return-1;for(let Y=0;Y<A;Y++){const t=v.tempP1,e=v.tempP2;In.evaluateCoefs(v.polypoly11,w[Y],t);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.aj)(t.m_elements,t.power()+1);n.sort((t,e)=>t.compare(e)),In.evaluateCoefs(v.polypoly12,w[Y],e);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.aj)(e.m_elements,e.power()+1);i.sort((t,e)=>t.compare(e));const r=n[0],o=n.at(-1),a=i[0],u=i.at(-1);o.subThis(r),u.subThis(a);const m=o.subThis(u).GEZ(),l=58,c=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai.ldexp(-59).toDouble(),g=[];let p;if(p=Wn(m?t:e,d,_,c,l,g,y,y),p<0&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("mp_curve_proximity"),p>0){const n=m?e:t;for(let t=0;t<p;t++){let e;if(m){const s=v.tempP;In.evaluateCoefs(v.polypoly12,w[Y].addDouble(Number.EPSILON),s),e=s.evaluate(g[t])}else{const s=v.tempP;In.evaluateCoefs(v.polypoly11,w[Y].addDouble(Number.EPSILON),s),e=s.evaluate(g[t])}const i=n.evaluateDerivative(g[t]).abs().mulDoubleThis(Number.EPSILON),r=n.evaluate(g[t]);i.addThis(e.sub(r).absThis()),i.ldexpThis(3),r.absThis(),r.lt(i)?S.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(g[t].toDouble(),w[Y].toDouble())):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(r.gte(i))}}}A=S.length,Gn(v.polypoly1,v.polypoly2,v.tempP);const T=[];let I=Wn(v.tempP,d,p,D,E,T);I<0&&(I=0);for(let s=0;s<I;s++){In.evaluateCoefs(v.polypoly1,T[s],v.tempP1);const t=[];let e=Wn(v.tempP1,d,_,D,E,t);if(0!==e)if(In.evaluateCoefs(v.polypoly2,T[s],v.tempP2),e<0){if(e=Wn(v.tempP2,d,_,D,E,t),e<0)continue;for(let n=0;n<e;n++)b.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(t[n].toDouble(),T[s].toDouble()))}else{const n=v.tempP2.absEvaluate(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai);n.mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(1e-12));for(let i=0;i<e;i++){const e=v.tempP2.evaluate(t[i]);e.absThis(),e.lt(n)&&b.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(t[i].toDouble(),T[s].toDouble()))}}}if(I=b.length,0===A&&0===I)return 0;b=b.concat(S),b.sort((t,e)=>C?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t.second,e.second):(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t.first,e.first));const M=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.u)(b,(t,e)=>t.first===e.first&&t.second===e.second);b=b.slice(0,M),f.length=0,P.length=0;for(const s of b)f.push(s.first),P.push(s.second);return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(f.length===P.length),P.length}function Xn(t,e,s,n,i,r,o){if(0===t.power())return t.isZero()?-1:0;const a=t.evaluate(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(1)).isZero();if(1===t.power()){const s=Vn(t.getElement(1),t.getElement(0),e,r.at(0));return r[0].limitPrecisionThis(n),1!==s?0:(r[0].limitPrecisionThis(n),1)}if(2===t.power()){return Ln(t.getElement(2),t.getElement(1),t.getElement(0),n,e,a,r)}if(3===t.power()){return Rn(t.getElement(3),t.getElement(2),t.getElement(1),t.getElement(0),n,e,a,r)}if(4===t.power()){return zn(t.getElement(4),t.getElement(3),t.getElement(2),t.getElement(1),t.getElement(0),n,e,a,r)}return On(t,e,s,n,a,i,r,o)}function qn(){return{polyIntersect:new In,polyX1:new In,polyY1:new In,polyX1Deriv:new In,polyY1Deriv:new In,lazyPolyD1:new In,lazyPolyD1Deriv:new In,tempP:new In,tempP1:new In,tempP2:new In,polypoly1Proximity:new Mn,polypoly2Proximity:new Mn}}function Fn(t,e,s,n,i,r,o,a,h,u,m,l,c){const g=qn();g.polyX1.construct(t,e),g.polyY1.construct(s,n),g.polyX1Deriv.assignCopy(g.polyX1),g.polyX1Deriv.derivative1This(),g.polyY1Deriv.assignCopy(g.polyY1),g.polyY1Deriv.derivative1This(),g.polyIntersect.assignCopy(g.polyX1),g.polyIntersect.mulThis(g.polyX1),g.polyIntersect.mulElementThis(o[0]),g.tempP.assignCopy(g.polyY1),g.tempP.mulThis(g.polyY1),g.tempP.mulElementThis(o[1]),g.polyIntersect.addThis(g.tempP),i?(g.lazyPolyD1.construct(i,r),g.tempP.assignCopy(g.lazyPolyD1),g.tempP.mulThis(g.lazyPolyD1),g.tempP.mulElementThis(o[2]),g.polyIntersect.addThis(g.tempP)):g.polyIntersect.add0(o[2]);{const i=o[0].clone(),r=i.clone();r.sqrThis();const a=o[1].clone(),h=a.clone();h.sqrThis();const u=o[2].clone(),m=i.clone();m.subThis(a),g.polyX1.construct(t,e),g.polyX1Deriv.assignCopy(g.polyX1),g.polyX1Deriv.derivative1This(),g.polyY1.construct(s,n),g.polyY1Deriv.assignCopy(g.polyY1),g.polyY1Deriv.derivative1This(),g.tempP.assignCopy(g.polyX1),g.tempP.mulThis(g.polyX1),g.tempP.mulElementThis(h),g.tempP.mulElementThis(u),g.polypoly1Proximity.construct0(g.tempP),g.tempP.assignCopy(g.polyX1),g.tempP.mulThis(a.mul(m).mul(u).ldexpThis(1)),g.polypoly1Proximity.addElement(g.tempP),g.tempP.assignCopy(g.polyX1),g.tempP.mulThis(g.polyX1),g.tempP.mulElementThis(i.mul(h)),g.tempP1.assignCopy(g.polyY1),g.tempP1.mulThis(g.polyY1),g.tempP1.mulElementThis(r.mul(a)),g.tempP.addThis(g.tempP1),g.tempP.add0(m.mul(m).mul(u)),g.polypoly1Proximity.addElement(g.tempP),g.tempP.assignCopy(g.polyX1),g.tempP.mulElementThis(m.mul(i).mul(a).ldexpThis(1)),g.polypoly1Proximity.addElement(g.tempP),g.tempP.construct0(i.mul(m).mul(m)),g.polypoly1Proximity.addElement(g.tempP),g.polypoly1Proximity.updatePower(),g.tempP.construct0(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah),g.polypoly2Proximity.construct0(g.tempP),g.tempP.assignCopy(g.polyX1),g.tempP.mulThis(g.polyX1Deriv),g.tempP1.assignCopy(g.polyY1),g.tempP1.mulThis(g.polyY1Deriv),g.tempP.addThis(g.tempP1),g.tempP.mulElementThis(i.mul(a)),g.polypoly2Proximity.addElement(g.tempP),g.tempP.assignCopy(g.polyX1Deriv),g.tempP.mulElementThis(m.mul(i)),g.polypoly2Proximity.addElement(g.tempP),g.polypoly2Proximity.updatePower()}const d=[],_=[];null===m&&(m=[]);let p=2*g.polyIntersect.power()+58;const f=.5*Number.EPSILON,P=[],y=Wn(g.polyIntersect,a,h,f,p,P,l,l);if(y<0)return-1;for(const b of P)_.push(b.toDouble());Gn(g.polypoly1Proximity,g.polypoly2Proximity,g.tempP),p=2*g.tempP.power()+58,P.length=0;let x=Wn(g.tempP,a,h,f,p,P);if(x<0&&(x=0),0===y&&0===x)return 0;for(const b of P)d.push(b.toDouble());const C=d.concat(_);m.length=C.length,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(m,C,0,0,C.length),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.v)(m);const v=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.u)(m,(t,e)=>0===(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t,e));return m.length=v,m.length}function Vn(t,e,s,n){return t.isZero()?e.isZero()?-1:0:(n.setThis(e),n.negateThis(),n.divThis(t),s.isEmpty()||s.containsCoordinate(n.value())?1:0)}function Ln(t,e,s,n,i,r,o){if(t.isZero()){if(r)return o[0].setInt32(1),i.containsCoordinate(1)?1:0;return Vn(e,s,i,o[0])}if(r){let e=2;return o[0].setInt32(1),s.equals(t)?(o[1].setInt32(1),e=1):o[1].setThis(s.div(t)),i.containsCoordinate(o[1].value())||(e=1),i.containsCoordinate(o[0].value())||(e--,o[0].setThis(o[1])),2===e&&o[0].value()>o[1].value()&&(o[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[0],o[0]=o[1])),e}const a=e.clone();a.sqrThis();const h=t.clone();if(h.mulThis(s).ldexpThis(2).negateThis().addThis(a),h.LZ())return 0;const u=n+2,m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.sqrt(h,u),l=m.clone();e.LZ()&&l.negateThis(),l.addThis(e).limitPrecisionThis(u).ldexpThis(-1).negateThis();let c=0;return o[0].setThis(l).divThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructAssign(t,u)).limitPrecisionThis(n),(i.isEmpty()||i.containsCoordinate(o[0].value()))&&c++,m.isZero()||l.isZero()||(o[c].setThis(s).divThis(l).limitPrecisionThis(n),(i.isEmpty()||i.containsCoordinate(o[c].value()))&&c++,2===c&&o[0].gt(o[1])&&(o[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[0],o[0]=o[1]))),c}function Rn(t,e,n,i,r,o,a,h){if(t.isZero()){return Ln(e,n,i,r,o,a,h)}const u=(t,e)=>{if(t>0){let s=e+t;for(let t=1;t<s;t++)h[t].equals(h[0])&&(h[s-1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(h[t],h[t]=h[s-1]),s--);e=s}return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(h,0,e,(t,e)=>t.compare(e)),e};if(i.isZero()){let s=0;o.containsCoordinate(0)&&(h[0].setInt32(0),s=1);return u(Ln(t,e,n,r,o,a,h.slice(1)),s)}if(a){let s=0;o.containsCoordinate(1)&&(h[0].setInt32(1),s=1);const n=e.add(t),a=i.negate(),m=t.add(n).add(a).isZero();return u(Ln(t,n,a,r,o,m,h.slice(s)),s)}const m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,l=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,c=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,g=e.clone();if(g.isZero())l.setThis(n),l.divThis(t),c.setThis(i),c.divThis(t);else{g.divThis(t).divDoubleThis(3).negateThis();const s=e.clone();s.sqrThis();const r=t.clone();r.sqrThis(),l.setThis(t),l.mulThis(n).mulDoubleThis(3).subThis(s).divThis(r).divDoubleThis(3),c.setThis(s),c.mulThis(e),c.ldexpThis(1),m.setThis(t),m.mulThis(e).mulThis(n).mulDoubleThis(9),c.subThis(m),m.setThis(r),m.mulThis(i).mulDoubleThis(27),c.addThis(m),c.divThis(r).divThis(t).divDoubleThis(27)}if(l.isZero()){const t=c.clone();return t.negateThis(),t.isZero()?(h[0].setThis(g),Jn(o,r,h,1)):(h[0].setThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.cubicRoot(t,r).add(g)),Jn(o,r,h,1))}const d=c.clone();if(d.sqrThis().ldexpThis(-2),m.setThis(l.clone()),m.sqrThis().mulThis(l).divDoubleThis(27),d.addThis(m),d.isZero())return h[0].setThis(c),h[0].mulDoubleThis(3).divThis(l),h[1].setThis(h[0]),h[1].negateThis(),h[1].ldexpThis(-1),h[0].addThis(g),h[1].addThis(g),Jn(o,r,h,2);if(d.GZ())return d.setThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.sqrt(d,r+8)),m.setThis(c),m.ldexpThis(-1).negateThis(),m.addThis(d),h[0].setThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.cubicRoot(m,r+8)),m.setThis(c),m.ldexpThis(-1).negateThis(),m.subThis(d),h[0].addThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.cubicRoot(m,r+8)),h[0].addThis(g),Jn(o,r,h,1);m.setThis(l),m.divDoubleThis(3).negateThis(),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(m.GEZ());const _=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.sqrt(m,r+8),p=_.clone();p.negateThis(),p.addThis(g),_.addThis(g);const f=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(o.isEmpty()?-Number.MAX_VALUE:o.vmin),P=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(o.isEmpty()?Number.MAX_VALUE:o.vmax),y=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M});y.construct0(i),y.addElement(n),y.addElement(e),y.addElement(t);const x=new In({copy:y});x.derivative1This();let C=0;const v=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,4);v[C++].setThis(f),p.gt(f)&&p.lt(P)&&v[C++].setThis(p),_.gt(f)&&_.lt(P)&&v[C++].setThis(_),v[C++].setThis(P);const b=3*r;let S=52,E=Number.EPSILON;for(;S<b;)2*S<=b?(E*=E,S*=2):(E*=Number.EPSILON,S+=52);S+=2;let D=0,w=!1;for(let s=1;s<C;s++){if(Hn(y,x,v[s-1],v[s],E,S,h[0])){D=1,w=s+1<C;break}}if(!D)return 0;if(w){const t=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,coef0:h[0]});t.negateThis(),t.addElement(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai);const e=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M}),n=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M});y.div(t,e,n),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(2===e.power()),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0===n.power());const i=Ln(e.getElement(2),e.getElement(1),e.getElement(0),r,o,!1,h.slice(1));(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(i>=0&&i<=2),D+=i}return Jn(o,r,h,D)}function zn(t,e,s,n,i,r,o,a,h){if(t.isZero())return Rn(e,s,n,i,r,o,a,h);const u=(t,e)=>{if(t>0){let s=e+t;for(let t=1;t<s;t++)h[t].equals(h[0])&&(h[s-1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(h[t],h[t]=h[s-1]),s--);e=s}return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(h,0,e,(t,e)=>t.compare(e)),e};if(i.isZero()){let i=0;o.containsCoordinate(0)&&(h[0].setInt32(0),i=1);return u(Rn(t,e,s,n,r,o,a,h.slice(i)),i)}const m=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,coef0:i});if(m.addElement(n),m.addElement(s),m.addElement(e),m.addElement(t),a){let t=0;o.containsCoordinate(1)&&(h[0].setInt32(1),t=1);const e=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,coef0:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(-1)});e.addElement(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(1));const s=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M}),n=new In({zeroCtor:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M});m.div(e,s,n);return u(Rn(3===s.power()?s.getElement(3):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),s.power()>=2?s.getElement(2):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),s.power()>=1?s.getElement(1):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),s.getElement(0),r,o,s.evaluate(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai).isZero(),h.slice(t)),t)}if(m.getElement(0).isZero()){let t=0;for(o.containsCoordinate(0)&&(t=1,h[0].setDouble(0));m.getElement(0).isZero()&&m.power()>0;)m.shiftRight(1);const e=Rn(3===m.power()?m.getElement(3):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),m.power()>=2?m.getElement(2):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),m.power()>=1?m.getElement(1):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone(),m.getElement(0),r,o,!1,h.slice(t));return e>0&&(t+=e),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(h,0,t,(t,e)=>t.compare(e)),t}let l=52,c=Number.EPSILON;for(;l<r;)2*l<=r?(c*=c,l*=2):(c*=Number.EPSILON,l+=52);l+=2;const g=Qn(m),d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(Math.max(Math.abs(o.vmax),Math.abs(o.vmin)));return c=(g.lt(d)?g:d).mul(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(c)).toDouble(),On(m,o,c,l,a,!1,h,4)}function Bn(t,e){let s=t,n=e;n.power()>s.power()&&(n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s,s=n));const i=s.power()-n.power(),r=new In({copy:s.getElement(s.power())});s.mulThis(n.getElement(n.power()));for(let o=0,a=s.power();o<a;o++)if(o>=i){const t=new In({copy:n.getElement(o-i)});t.mulThis(r);const e=s.getElement(o).sub(t);s.setElement(o,e)}s.setElement(s.power(),s.getElement(s.power()).setZero()),s.updatePower(),kn(s)}function kn(t){let e=0;for(;e<t.power()&&t.getElement(e).isZero();)e++;return e>0&&(t.shiftRight(e),!0)}function Gn(t,e,s){const n=t.clone(),i=e.clone();for(kn(n),kn(i);0!==n.power()||0!==i.power();)Bn(n,i);s.assignMove(n.getElement(0))}function Wn(t,e,s,n,i,r,o=!1,a=!1){r.length=0;const h=t.power(),u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,2*h+4),m=Xn(t,s||_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),n,i,!1,u,u.length);if(m>0){r.length=0;for(let t=0;t<m;t++){const e=u[t];t>0&&e.lte(r.at(-1))||r.push(e.clone())}return r.length}return m}function jn(t,e,n){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>=1),0===t.power())return t.isZero()?-1:0;const i=t.getElement(0);return i.negateThis(),i.divThis(t.getElement(1)),e[0].setThis(i),1}function Zn(t,e,n,i){if(t.power()<2)return jn(t,n,i);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(i>=1);let r=t.getElement(1);r.mulThis(t.getElement(1));const o=t.getElement(0);if(o.mulThis(t.getElement(2)),o.ldexpThis(2),r.subThis(o),r.LZ())return 0;if(r.isZero()){const s=t.getElement(1);return s.negateThis(),s.divThis(t.getElement(2)),s.ldexpThis(-1),s.limitPrecisionThis(e),n[0].setThis(s),1}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(i>=2),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.sqrt(r,e+8);const a=t.getElement(1);a.negateThis();const h=a.clone();h.subThis(r),h.divThis(t.getElement(2)),h.ldexpThis(-1),h.limitPrecisionThis(e);const u=a.clone();return u.addThis(r),u.divThis(t.getElement(2)),u.ldexpThis(-1),u.limitPrecisionThis(e),h.lt(u)?(n[0].setThis(h),n[1].setThis(u)):(n[1].setThis(h),n[0].setThis(u)),2}function Hn(t,e,s,n,i,r,o){let a=s.clone(),u=n.clone();a.limitPrecisionThis(r),u.limitPrecisionThis(r);let m=t.evaluate(a);m.limitPrecisionThis(r+2);let l=t.evaluate(u);if(l.limitPrecisionThis(r+2),m.GEZ()&&l.GEZ()||m.LEZ()&&l.LEZ())return m.absLessAbs(l)?(o=a,m.isZero()):(o=u,l.isZero());const c=l.LZ();c&&(l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(m,m=l),u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a,a=u));const g=c?u:a,d=c?a:u,_=a.add(u).ldexpThis(-1);_.limitPrecisionThis(r);const p=u.sub(a);p.limitPrecisionThis(r),p.absThis();const f=p.clone();let P=t.evaluate(_),y=e.evaluate(_);const x=new In({copy:t}),C=new In({copy:e});{const s=Math.max(t.hiBitIndex(),e.hiBitIndex()),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai.clone();n.ldexpThis(-(r+2));for(let i=64;i<s;){x.limitPrecisionThis(i),C.limitPrecisionThis(i);const r=x.evaluate(_),o=C.evaluate(_),a=r.sub(P),h=o.sub(y);if(a.divThis(P).absThis().lt(n)&&(y.isZero()||h.divThis(y).absThis().lt(n)))break;x.assignCopy(t),C.assignCopy(e),i=Math.min(i+64,s)}P.limitPrecisionThis(r+2),y.limitPrecisionThis(r+2)}const v=1,b=4;let S=b;const E=2;let D=1,w=0,A=0,T=v;const I=32,M=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(.25*i),Y=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(.5001);let N=0;const X=300;for(;++N<X;){if(N>I&&w>0||y.isZero()||T===E&&w>1||T===v&&S<b)T=v,D>1&&D--;else if(T=E,A>1){const t=p.mul(y);t.absThis(),t.ldexpThis(-3),t.absLessAbs(P)&&D++}p.setThis(f);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M;let e=!1;if(T===v)do{if(A>2){const e=p.clone();if(e.absThis(),e.ldexpThis(4),d.sub(g).ldexpThis(-1).gt(e)){if(_.equals(g)){t.setThis(_),_.setThis(g.add(e)),_.limitPrecisionThis(r),f.setThis(_.sub(t));break}if(_.equals(d)){t.setThis(_),_.setThis(d.sub(e)),_.limitPrecisionThis(r),f.setThis(_.sub(t));break}}}f.setThis(u.sub(a)),f.ldexpThis(-1),f.limitPrecisionThis(r),t.setThis(_),_.setThis(a.add(f)),_.limitPrecisionThis(r),_.lt(g)?_.setThis(g):_.gt(d)&&_.setThis(d),e=a.equals(_)||u.equals(_)}while(0);else for(;;){if(f.setThis(P.div(y)),f.limitPrecisionThis(r),1!==D&&f.mulDoubleThis(D),t.setThis(_),_.subThis(f),_.limitPrecisionThis(r),e=_.equals(t),_.lt(g)){if(D>1){_.setThis(t),D--;continue}f.setThis(t.sub(g)),_.setThis(g)}else if(_.gt(d)){if(D>1){_.setThis(t),D--;continue}f.setThis(t.sub(d)),_.setThis(d)}break}if(e||f.absLessAbs(M)){t.equals(_)||(P=x.evaluate(_),P.limitPrecisionThis(r+2));break}P=x.evaluate(_),P.limitPrecisionThis(r+2),y=C.evaluate(_),y.limitPrecisionThis(r+2);const s=a.clone(),n=u.clone();P.LZ()?(m.setThis(P),a.setThis(_)):(l.setThis(P),u.setThis(_)),T===E&&(a.equals(s)&&u.equals(n)||A>1&&!f.absLessAbs(Y.mul(p)))?w++:w=0,T===v?(S++,A=0):(S=0,A++)}return N>=X&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("Root_finder iterations exceeded"),o.setThis(_),!0}function Un(t,e,s,n,i){const r=t.evaluate(s);if(r.isZero())return!0;const o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(.5*n),a=s.clone();a.subThis(o);const h=t.evaluate(a),u=s.clone();u.addThis(o);const m=t.evaluate(u);if(h.LZ()&&m.GZ()||h.GZ()&&m.LZ())return!0;
1if(r.GZ()?h.LEZ()||m.LEZ():h.GEZ()||m.GEZ())return!0;const l=h.LEZ()&&m.LEZ(),c=h.GEZ()&&m.GEZ();let g=!1;return l?r.gt(h)&&r.gt(m)&&(g=!0):c&&r.lt(h)&&r.lt(m)&&(g=!0),!!g&&r.absThis().lt(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(1e-17))}function On(t,e,n,i,r,o,a,h){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(h>=t.power());const u=a,m=[];let l=[];const c=new In({zeroCtor:t.m_zeroCtor}),g=new In({zeroCtor:t.m_zeroCtor}),d=new In({zeroCtor:t.m_zeroCtor}),_=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(n),p=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(e.vmin),f=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(e.vmax),P=p.sub(_),y=f.add(_),x=Qn(t),C=x.clone();if(C.negateThis(),P.lt(C))P.setThis(C.sub(_));else if(P.gt(x))return 0;if(y.gt(x))y.setThis(x.add(_));else if(y.lt(C))return 0;let v=t,b=null;if(r){const e=new In({coef0:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(-1)});e.addElement(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai),b=new In,v=b;const s=new In,n=new In;for(t.div(e,s,n),b.assignCopy(s);v.evaluate(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai).isZero();)v.div(e,s,n),b.assignCopy(s)}let S=!1;if(v.power()>0&&v.getElement(0).isZero())for(S=!0,b||(b=new In({copy:v}),v=b);v.getElement(0).isZero();)b.shiftRight(1);let E=i+2*v.power()+2,D=n/Math.pow(2,v.power()+2),w=E;if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.gt(P)&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.lt(y))for(let s=0,Y=v.power();s<Y;s++)if(v.getElement(s).isZero()){m.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone());break}for(let Y=v.power()-1;Y>0;Y--){if(D*=2,E-=2,w-=2,v.power()-Y===1){g.assignMove(v.derivative(Y));1===jn(g,u,h)&&(u[0].gt(P)&&u[0].lt(y)&&!u[0].isZero()&&m.push(u[0].clone()),c.assignMove(g),d.assignMove(v.derivative(Y-1)));continue}if(v.power()-Y===2){g.assignMove(v.derivative(Y));const t=Zn(g,E,u,h);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<=2);for(let e=0;e<t;e++)u[e].gt(P)&&u[e].lt(y)&&!u[e].isZero()&&m.push(u[e].clone());if(m.length>1&&m.sort((t,e)=>t.compare(e)),m.length>0){let t=m[0].sub(_);t.limitPrecisionThis(w),l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(P.clone(),t));let e=1===m.length?y.clone():m[1].sub(_);t=m[0].add(_),t.limitPrecisionThis(w),e.limitPrecisionThis(w),l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(t,e)),m.length>1&&(e=2===m.length?y.clone():m[2].sub(_),e.limitPrecisionThis(w),t=m[1].add(_),t.limitPrecisionThis(w),l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(t,e)),m.length>2&&(t=m[2].add(_),t.limitPrecisionThis(w),l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(t,y.clone()))))}else l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(P.clone(),y.clone()));c.assignCopy(g),d.assignMove(v.derivative(Y-1));continue}{g.assignMove(d),d.assignMove(v.derivative(Y-1));let t=[];for(let e=0,s=l.length;e<s;++e)if(l[e].first.lte(l[e].second)){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M;if(Hn(g,c,l[e].first,l[e].second,D,E,s)){m.push(s);let n=s.sub(_);n.limitPrecisionThis(w),t.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(l[e].first,n)),n=s.add(_),n.limitPrecisionThis(w),t.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(n,l[e].second))}else t.push(l[e])}l=t,t=[],c.assignMove(g)}}m.sort((t,e)=>t.compare(e)),0===l.length&&(c.assignMove(v.derivative(v.power())),c.isZero()||l.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(P.clone(),y.clone())));let A=0,T=0,I=0;const M=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M;for(;;){if(T<l.length){if(l[T].first.gt(l[T].second)){T++;continue}let t=!1;if(I<m.length&&m[I].lt(l[T].first)&&(t=!0),!t){Hn(v,c,l[T].first,l[T].second,n,i,M)&&(M.lt(p)?u[A++].setThis(p):M.gt(f)?u[A++].setThis(f):u[A++].setThis(M)),T++;continue}}if(!(I<m.length))break;0!==I&&m[I-1].equals(m[I])||Un(v,c,m[I],n)&&(M.setThis(m[I]),M.lt(p)?M.setThis(p):M.gt(f)&&M.setThis(f),0!==A&&u[A].equals(M)||u[A++].setThis(M)),I++}return S&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.gt(P)&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.lt(y)&&(u[A++].setThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(u,0,A,(t,e)=>t.compare(e))),r&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai.gt(P)&&_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai.lt(y)&&(u[A++].setThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(u,0,A,(t,e)=>t.compare(e))),A}function Qn(t){const e=t.getElement(t.power());e.limitPrecisionThis(53),e.absThis();const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah.clone();for(let n=0,i=t.power();n<i;n++){const e=t.getElement(n);e.limitPrecisionThis(53),e.gt(s)&&s.setThis(e)}return s.divThis(e),s.addThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ai),s.mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(1+100*Number.EPSILON)),s}function Jn(t,e,s,n){let i=n;if(!t.isEmpty()){i=0;for(let e=0;e<n;
1++e)t.containsCoordinate(s[e].value())&&(i!==e&&s[i].setThis(s[e]),i++)}i>1&&(s[0].gt(s[1])&&(s[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[1])),i>2&&(s[0].gt(s[2])&&(s[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[2])),s[1].gt(s[2])&&(s[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[1],s[1]=s[2]))));for(let r=0;r<i;++r)s[r].limitPrecisionThis(e);return i}function Kn(t,e,s,n,i,r){return ei(t,e,s,r,n,i)}function $n(t,e,s,n,i,r){let o=i;if(n)return r[0]=1,o=.5*(e-t)*(s(t)+s(e)),o;const a=r[0],h=(e-t)/a,u=t,m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(let l=1;l<=r[0];++l){const t=(l-.5)*h;m.add(s(u+t))}return o=.5*(o+(e-t)*m.getResult()/a),r[0]*=2,o}function ti(t,e,s,n,i,r,o){let a=0,h=Math.abs(i-s[t]);const u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(e,Number.NaN),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(e,Number.NaN);for(let d=0;d<e;++d){const e=Math.abs(i-s[t+d]);e<h&&(a=d,h=e),u[d]=n[t+d],m[d]=n[t+d]}let l=0,c=0,g=0;r[0]=n[t+a],a--;for(let d=1;d<e;d++){for(let n=0;n<e-d;n++){if(c=s[t+n]-i,g=s[t+n+d]-i,l=c-g,0===l)return!1;const e=(u[n+1]-m[n])/l;u[n]=c*e,m[n]=g*e}if(2*(a+1)<e-d){const t=a+1;o[0]=u[t]}else{const t=a;o[0]=m[t],a--}r[0]+=o[0]}return!0}function ei(t,s,n,i,r,o){if(n<s&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("xTo < xFrom"),n===s)return 0;const a=[0];let u=Number.MAX_VALUE;const m=[Number.MAX_VALUE];let l=0;const c=32,g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(c+1,Number.NaN),d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(c+1,Number.NaN),_=[0];g[0]=1;let p=0,f=0;for(let e=0;e<c;e++){if(l=$n(s,n,i,0===e,l,_),d[e]=l,e+1>=t){ti(e+1-t,t,g,d,0,a,m)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("polynomial_interpolation");const s=r*Math.abs(a[0])+o,n=Math.abs(u-a[0]);if(n<=s&&Math.abs(m[0])<=s){if(p++,p>1&&(n<=.1*f||0===f||p>2))return a[0]}else p=0;f=n,u=a[0]}d[e+1]=d[e],g[e+1]=.25*g[e]}return a[0]}class si{constructor(){this.area=Number.NaN,this.centroid_x=Number.NaN,this.centroid_y=0,this.specialPoints=[],this.specialPointsLength=[]}specialPointsCount(){return this.specialPoints.length}}let ni=class{constructor(t,e){this.b=t,this.len=e}getMaxDerivative(){return 1}getValue(t,e){return 0===t?this.len-ui(this.b,e,!1):0}getError(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}};function ii(t,e,s,n,i){let r=!0;const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(o);let a=r?0:1,h=o[1][a]-o[0][a],u=o[2][a]-o[0][a];const m=Kn(5,e,s,n,i,t=>{let e;if(t<=.5){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(0,h,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(h,u,t);e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(s,n,t)}else{const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(0,h,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(h,u,t);e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(s,n,t)}return e*di(o,1,t).length()});r=!1,a=r?0:1,h=o[1][a]-o[0][a],u=o[2][a]-o[0][a];const l=Kn(5,e,s,n,i,t=>{let e;if(t<=.5){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(0,h,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(h,u,t);e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(s,n,t)}else{const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(0,h,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(h,u,t);e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(s,n,t)}return e*di(o,1,t).length()});return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(m,l)}function ri(t){t.m_cachedValues=null}function oi(t,e){e.m_cachedValues=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_cachedValues,t.m_cachedValues=e.m_cachedValues)}function ai(t){if(t.m_cachedValues)return t.m_cachedValues;const e=new si;return hi(t,e.specialPoints),Ci(t,e),e}function hi(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(s);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,8);n[0].set(0);let i=1;{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3);Gi(s,t,!1);const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);let o=gn(t[2].mul(2),t[1],r,e[0]);o<0&&(o=0);for(let s=0;s<o;
1s++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(e[s].value(),0,1)||(n[i]=e[s],i++)}{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3);Wi(s,t,!1);const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);let o=gn(t[2].mul(2),t[1],r,e[0]);o<0&&(o=0);for(let s=0;s<o;s++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(e[s].value(),0,1)||(n[i]=e[s],i++)}if(n[i].set(1),i++,i>2){(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(n,0,i,(t,e)=>t.value()-e.value());let t=0,e=n[0].value(),s=1;for(let r=1;r<i;r++)n[r].eq(n[r-1])?(e+=n[r].value(),s++):(s>1&&(e/=s,n[t].set(e)),t++,n[t]=n[r],e=n[r].value(),s=1);t++,i=t}n[0].set(0),n[i-1].set(1),e.length=i;for(let r=0;r<i;r++)e[r]=n[r].value()}function ui(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return t.queryControlPoints(n),mi(n,e,s)}function mi(t,e,s){if(s){if(e<0)return e;if(e>1)return e-1+mi(t,1,!1)}if(1===e)return li(t);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return Mi(t,e,n,null),li(n)}function li(t){if(t[0].equals(t[1]))return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[2],t[0]);if(t[1].equals(t[2]))return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[0],t[2]);const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[0],t[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[2],t[1]),s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[0],t[2]);if(e-s<=e*Number.EPSILON)return s;const n=1,i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);Bi(t,i,!0);const r=4*((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(i[2].x)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(i[2].y)),o=2*(i[2].x*i[1].x+i[2].y*i[1].y),a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(i[1].x)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(i[1].y);if(1e-14*(Math.abs(o)+Math.abs(a))>=Math.abs(r)){if(1e-14*Math.abs(a)>=Math.abs(o)){return Math.sqrt(a)*n}return 2/(3*o)*(Math.pow(o*n+a,1.5)-Math.pow(a,1.5))}const h=o/r,u=a/r,m=u-h*h,l=n+h;if(0===m){if(h>=0&&l>=0||h<=0&&l<=0){return Math.abs(.5*Math.sqrt(r)*(l*l-h*h))}return.5*Math.sqrt(r)*(l*l+h*h)}const c=Math.sqrt(m+l*l),g=Math.sqrt(u);return.5*Math.sqrt(r)*(l*c-h*g+m*Math.log(Math.abs((l+c)/(h+g))))}function ci(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e,0,1);let n=di(t,1,s);return n.isZero()&&(n=di(t,2,s)),n}function gi(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return t.queryControlPoints(n),di(n,e,s)}function di(t,e,s){if(1===e){const e=t[1].sub(t[0]).mul(1-s).add(t[2].sub(t[1]).mul(s));return e.mulThis(2),e}return 2===e?t[2].sub(t[1]).sub(t[1].sub(t[0]).mul(2)):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.construct(0,0)}function _i(t,e,s){{const e=Ne.constructPoint2D(t[1]).subE(Ne.constructPoint2D(t[0])),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1).subE(s),i=Ne.constructPoint2D(t[2]).subE(Ne.constructPoint2D(t[1])),r=e.mulE(n).addE(i.mulE(s));return r.mulThisE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(2)),r}}function pi(t,e,s){const n=ui(t,1,!1);if(e<=0)return e;if(e>=n)return e-n+1;const i=[0];return 1!==en(new ni(t,e),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),1,i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),i[0]}function fi(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return t.queryControlPoints(e),Pi(e)}function Pi(t){return-t[1].sub(t[0]).crossProduct(t[2].sub(t[0]))/3}function yi(t){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),t.getEndXY()),s=t.calculateUpperLength2D();return s-e<=8*Number.EPSILON*s}function xi(t){return t.m_cachedValues}function Ci(t,e){t.m_cachedValues=e}function vi(t,e,s,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.x)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit().contains(s),"QuadraticBezierHelper::getClosestCoordinateSegment");const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(r);let o=Number.MAX_VALUE;const a=[0],h=bi(r,e,a);if(s.containsCoordinate(a[0]))o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,h);else{a[0]=s.vmin,Zi(r,a[0],h),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(h,e);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;Zi(r,s.vmax,t);const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e);o>n&&(h.setCoordsPoint2D(t),a[0]=s.vmax,o=n)}if(!n)return a[0];if(s.vmin<=0){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2DExtended(-1,n,!0);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2D(s.vmin,i);
1const r=new fm({start:n,end:i}),u=r.getClosestCoordinate(e,!0);if(u<1){const t=r.getCoord2D(u),s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e);s<o&&(o=s,a[0]=u-1,h.assign(t))}}if(s.vmin>=1){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2DExtended(2,n,!0);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2D(s.vmax,i);const r=new fm({start:i,end:n}),u=r.getClosestCoordinate(e,!0);if(u>0){const t=r.getCoord2D(u),s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e);s<o&&(o=s,a[0]=1+u,h.assign(t))}}return a[0]}function bi(t,e,s){const n=t[2].sub(t[1]).sub(t[1].sub(t[0])),i=t[1].sub(t[0]),r=t[0].sub(e),o=r.dotProduct(i),a=r.dotProduct(n)+2*i.dotProduct(i),h=3*i.dotProduct(n),u=n.dotProduct(n),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(3,Number.NaN),l=rn(u,h,a,o,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,m),c=t[0].clone();let g=0,d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(t[0],e),_=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(t[2],e);_<d&&(g=1,c.assign(t[2]),d=_);for(let p=0;p<l;p++){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;Zi(t,m[p],s),_=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s,e),_<d&&(d=_,c.assign(s),g=m[p])}return s&&(s[0]=g),c}function Si(t,e,s,n,i,r){const o=new we;if(Ei(t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),o),o.inflate(i),!o.isIntersectingPoint2D(e))return 0;const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,h=vi(t,e,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1);t.queryCoord2D(h,a);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(a,e)<=i?(n&&(n[0]=h),1):0}function Ei(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(n),Di(n,e,s)}function Di(t,e,s){if(e.equalsRange(0,1))return void s.setFromPoints(t,3);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);Yi(t,e.vmin,e.vmax,n),s.setFromPoints(n,3)}function wi(t,e,s){s.setEmpty();const n=[];n.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1));const i=.5*Math.max(e.width(),e.height());for(;n.length;){const r=n.at(-1);n.pop();const o=new we;if(Di(t,r,o),o.isIntersectingW(e)){const t=Math.max(o.width(),o.height());if(e.containsW(o)||t<=i||r.width()<1e-12)s.merge(r);else{const t=r.getCenter();n.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(r.vmin,t)),n.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(t,r.vmax))}}}}function Ai(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(e);const s=Ti(e);return s&&(t.m_cp.setCoordsPoint2D(e[1]),t.afterCompletedModification()),s}function Ti(t){let e=!1;for(let s=0;s<2;s++){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[2][s]);n>0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])<0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])<0&&(t[1][s]=t[2][s],e=!0)):n<0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])>0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])>0&&(t[1][s]=t[2][s],e=!0)):t[1][s]!==t[0][s]&&(t[1][s]=t[0][s],e=!0)}return e}function Ii(t,s,n){void 0===n&&(n=s,s=0);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(s<0||n>1)return i.setNAN(),i;if(s>n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("calculate_sub_weighted_centroid"),s===n||t.isDegenerate(0))return i.setCo
1ords(0,0),i;const r=ai(t),o=rs(t),a=Math.min(o/t.calculateUpperLength2D(),1e-7);let h=s,u=0;for(let e=1,m=r.specialPointsCount();e<m;e++)if(s<r.specialPoints[e]){u=e-1;break}i.setCoords(0,0);for(let e=u+1,m=r.specialPointsCount();e<m;e++){const s=Math.min(r.specialPoints[e],n),u=ii(t,h,s,a,o);if(i.addThis(u),h=s,n<=r.specialPoints[e])break}return i.add(t.getStartXY().mul(t.calculateLength2D()))}function Mi(t,e,s,n){(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P).setCoordsPoint2D(t[0]);(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P).setCoordsPoint2D(t[1]);(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P).setCoordsPoint2D(t[2]);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[0],t[1],e,i),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[1],t[2],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(i,r,e,o),s&&(s[0].assign(t[0]),s[1].assign(i),s[2].assign(o)),n){const e=t[2];n[0].assign(o),n[1].assign(r),n[2].assign(e)}}function Yi(t,e,s,n){if(e===s){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return Zi(t,e,s),n[0]=s,n[1]=s,void(n[2]=s)}const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);Mi(t,s,i,null),Mi(i,e/s,null,i),Zi(t,e,i[0]),Zi(t,s,i[2]),n[0].setCoordsPoint2D(i[0]),n[1].setCoordsPoint2D(i[1]),n[2].setCoordsPoint2D(i[2])}function Ni(t,e,s,n){if(e.isEqual(t.m_XStart,t.m_YStart)&&s.isEqual(t.m_XEnd,t.m_YEnd))return;const i=!!n&&t.isMonotoneQuickAndDirty(),r=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T,o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);o[0].setCoords(t.m_XStart,t.m_YStart),o[2].setCoords(t.m_XEnd,t.m_YEnd);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;a.setSub(o[2],o[0]),a.leftPerpendicularThis(),o[1].setAdd(o[0],a);const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);h[0].setCoordsPoint2D(e),h[2].setCoordsPoint2D(s),a.setSub(h[2],h[0]),a.leftPerpendicularThis(),h[1].setAdd(h[0],a),r.setFromTwoTriangles(o,h)?r.transformInPlace(t.m_cp):(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e,s,.5,t.m_cp),t.changeEndPoints2D(e,s),i&&Ai(t)}function Xi(t){return t.getStartXY().norm(1)+t.getEndXY().norm(1)+t.m_cp.norm(1)}function qi(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==Li(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function Fi(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==Ri(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function Vi(t,e,s,n,i){if(i){if(0!==hm(e,s))return 2}else if(Re(e,s))return 1;return 0!==zi(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function Li(t,e,n,i,r,o,a,h,u,m){if(null!=r&&(r.length=0),null!==o&&(o.length=0),null!==i&&(i.length=0),n.isDegenerate(0)){const t=[0,0],s=e.intersectPoint(n.getStartXY(),t,a);if(s>0){if(null!==r)for(let e=0;e<s;e++)r.push(t[e]);if(null!==o)for(let t=0;t<s;t++)o.push(0);if(null!==i)for(let n=0;n<s;n++){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(t[n],s),i.push(s)}}return s}const l=os(e,n);if(a=Math.max(a,l),e.isDegenerateToLineHelper(l)){const t=new fm({start:e.getStartXY(),end:e.getEndXY()}),s=ws(t,n,i,r,o,a,h,m);if(r)for(let n=0;n<s;++n){const s=t.getCoord2D(r[n]);r[n]=e.getClosestCoordinate(s,!1)}return s}if(as(e,n,a))return 0;const c=qe.constructPoint2D(n.getStartXY()),g=qe.constructPoint2D(n.getEndXY()).sub(c),d=g.clone();d.leftPerpendicularThis();const _=qe.constructPoint2D(e.m_cp).sub(qe.constructPoint2D(e.getStartXY())),p=qe.constructPoint2D(e.getEndXY()).sub(qe.constructPoint2D(e.m_cp));let f=_.dotProduct(d).toDouble(),P=p.sub(_).dotProduct(d).toDouble();const y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(12,Number.NaN),x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(12,Number.NaN);let C=sn(P,f,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),y);C<0&&(y[0]=0,y[1]=1,C=2);let v,b=0;for(let s=0,w=b;s<C;++s){const t=e.getCoord2D(y[s+w]);x[b]=n.getClosestCoordinate(t,!1),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n.getCoord2D(x[b]))<=a&&(y[b]=y[s+w],b++)}const S=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(S);{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);
1if(ji(S,t,!1),t[0]=t[0].sub(c),g.x.abs().gte(g.y.abs())){const e=g.y.div(g.x);P=t[2].y.sub(t[2].x.mul(e)).toDouble(),f=t[1].y.sub(t[1].x.mul(e)).toDouble(),v=t[0].y.sub(t[0].x.mul(e)).toDouble()}else{const e=g.x.div(g.y);P=t[2].x.sub(t[2].y.mul(e)).toDouble(),f=t[1].x.sub(t[1].y.mul(e)).toDouble(),v=t[0].x.sub(t[0].y.mul(e)).toDouble()}}const E=e.getEndXY().equals(n.getStartXY())||e.getEndXY().equals(n.getEndXY()),D=[0,0];C=nn(P,f,v,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),E,D);for(let s=0,w=b;s<C;++s){y[s+w]=D[s];const t=e.getCoord2D(y[s+w]);x[b]=n.getClosestCoordinate(t,!1),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n.getCoord2D(x[b]))<=a&&(y[b]=y[s+w],b++)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(b<y.length+4),C=e.intersectPoint(n.getStartXY(),D,a);for(let s=0;s<C;s++)y[b]=D[s],x[b++]=0;C=e.intersectPoint(n.getEndXY(),D,a);for(let s=0;s<C;s++)y[b]=D[s],x[b++]=1;C=n.intersectPoint(e.getStartXY(),D,a);for(let s=0;s<C;s++)x[b]=D[s],y[b++]=0;C=n.intersectPoint(e.getEndXY(),D,a);for(let s=0;s<C;s++)x[b]=D[s],y[b++]=0;return 0===b?0:gm(t,e,n,y,x,b,i,r,o,a,h,u,m)}function Ri(t,e,s,n,i,r,o,a,h,u){if(Eu(s)){return Li(t,e,new fm({start:s.getStartXY(),end:s.getEndXY()}),n,i,r,o,a,h,u)}const m=os(e,s);if(as(e,s,o=Math.max(o,m)))return 0;const l=[],c=[],g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);{e.queryControlPoints(g);const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),n=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;s.canonicToWorldTransformation(n);const i=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;i.setInvert(n),i.transformPoints2D(g,3,t);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);ji(t,r);const h=[r[0].x,r[1].x,r[2].x],u=[r[0].y,r[1].y,r[2].y],m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);m[0].setDouble(s.getSemiMinorAxis()),m[0].sqrThis(),m[1].setDouble(s.getSemiMajorAxis()),m[1].sqrThis(),m[2]=m[0],m[2].mul(m[1]),m[2].negate();const d=Fn(h,2,u,2,null,0,m,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),l,a);if(d>0){let t=0;for(let n=0;n<d;n++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(l[n],i);const r=s.getClosestCoordinate(i,!1),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(r,a),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,a)<=o&&(l[t]=l[n],c.push(r),t++)}l.length=t}}const d=[0,1];for(let _=0;_<2;_++){const t=0===_?s.getStartXY():s.getEndXY(),e=[0];bi(g,t,e);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;Zi(g,e[0],n),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n)<=o&&(l.push(e[0]),c.push(d[_]))}for(let _=0;_<2;_++){const t=[0,2];{const e=s.getClosestCoordinate(g[t[_]],!1),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(e,n),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(g[t[_]],n)<=o&&(l.push(d[_]),c.push(e))}}return gm(t,e,s,l,c,l.length,n,i,r,o,a,h,u)}function zi(t,e,s,n,i,r,o,a,h,u){const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(m);const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);if(s.queryControlPoints(l),hs(m,l,3)<0)return zi(t,s,e,n,r,i,o,a,h,!u);const c=os(e,s);if(as(e,s,o=Math.max(o,c)))return 0;if(sr(e,s,n,i,r,o,a,h,u))return 2;const g=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),d=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);{const t=new we;Di(m,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),t);const e=new we;Di(l,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),e);const s=Math.max(t.maxDim(),e.maxDim());if(t.inflate(3*o),e.inflate(3*o),!t.intersectW(e))return 0;if(t.maxDim()<.1*s){if(wi(m,t,g),wi(l,t,d),g.isEmpty()||d.isEmpty())return 0;Yi(m,g.vmin,g.vmax,m),Yi(l,d.vmin,d.vmax,l)}}const _=_m(m,2,l,2,o);if(0===_)return 0;const p=[],f=[];if(-1===_){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);ji(m,t);const e=[t[0].x,t[1].x,t[2].x],s=[t[0].y,t[1].y,t[2].y],n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);ji(l,n);const i=Nn(e,2,s,2,null,0,[n[0].x,n[1].x,n[2].x],2,[n[0].y,n[1].y,n[2].y],2,null,0,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),p,f,u,a,u);if(i>0){let t=0;for(let e=0;e<i;e++){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;Zi(l,f[e],n),Zi(m,p[e],s),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,n)<=o&&(p[t]=p[e],f[t]=f[e],t++)}p.length=t,f.length=t}}for(let P=0;P<2;P++){const t=0===P?m:l,e=0===P?l:m;for(let s=0;s<2;s++){const n=0===s?0:2,i=[0];bi(e,t[n],i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;Zi(e,i[0],r),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[n],r)<=o&&(0===P?(p.push(0===n?0:1),f.push(i[0])):(f.push(0===n?0:1),p.push(i[0])))}}if(0===p.length)return 0;if(!g.equalsRange(0,1))for(let P=0;P<p.length;++P)p[P]=An.recalculateParentT(g.vmin,g.vmax,p[P]);if(!d.equalsRange(0,1))for(let P=0;P<f.length;++P)f[P]=An.recalculateParentT(d.vmin,d.vmax,f[P]);return gm(t,e,s,p,f,p.length,n,i,r,o,a,h,u)}function Bi(t,e,s=!1){const n=t[1].sub(t[0]);e[1].assign(n.mul(2)),e[2].assign(t[2].sub(t[1]).sub(n)),s?e[0].setCoords(0,0):e[0].assign(t[0])}function ki(t,e,s=!1){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);
1t.queryControlPoints(n),Bi(n,e,s)}function Gi(t,e,s=!1){const n=0,i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1][n]).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[0][n]));e[1]=i.mul(2),e[2]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2][n]).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1][n])).subE(i),s?e[0].set(0):e[0].set(t[0][n])}function Wi(t,e,s=!1){const n=1,i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1][n]).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[0][n]));e[1]=i.mul(2),e[2]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2][n]).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1][n])).subE(i),s?e[0].set(0):e[0].set(t[0][n])}function ji(t,e,s=!1){const n=qe.constructPoint2D(t[1]),i=n.sub(qe.constructPoint2D(t[0]));e[1]=i.mul(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(2)),e[2]=qe.constructPoint2D(t[2]).sub(n).sub(i),e[0]=s?new qe(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah):qe.constructPoint2D(t[0])}function Zi(t,e,s,n){if(n){if(e<0){return void ps(new fm({start:t[0],end:t[0].add(ci(t,0).getUnitVector())}),e,s)}if(e>1){return void ps(new fm({start:t[2],end:t[2].add(ci(t,1).getUnitVector())}),e-1,s)}}if(e<=.5){const n=t[1].clone(),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[0],n,e,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,n,t[2],e,r);const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,i,r,e,o),s.assign(o)}else{const n=t[1].clone(),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[0],n,e,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,n,t[2],e,r);const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,i,r,e,o),s.assign(o)}}function Hi(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(n),Ui(n,e,s)}function Ui(t,e,s){if(e.value()<=.5){const n=Ne.constructPoint2D(t[1]),i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,Ne.constructPoint2D(t[0]),n,e,i);const r=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,n,Ne.constructPoint2D(t[2]),e,r);const o=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,i,r,e,o),s.setE(o)}else{const n=Ne.constructPoint2D(t[1]),i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,Ne.constructPoint2D(t[0]),n,e,i);const r=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,n,Ne.constructPoint2D(t[2]),e,r);const o=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,i,r,e,o),s.setE(o)}}function Oi(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),Qi(n,e,s)}function Qi(t,e,s){e.value()<0&&e.set(0,e.eps()),e.value()>1&&e.set(1,e.eps()),s.setE(_i(t,1,e))}function Ji(t,e){let s=1;t[1].isEqualPoint2D(t[0])&&(s=2,t[2].isEqualPoint2D(t[0])&&(s=3));let n=2;t[2].isEqualPoint2D(t[3])&&(n=1,t[1].isEqualPoint2D(t[3])&&(n=0)),e[0].assign(t[0]),e[2].assign(t[3]);const i=J.intersectLinesAtOnePoint(t[0],t[s],t[n],t[3]),r=new J;Ct(t[0],t[3],.5,r);const o=new J;yo(t,.5,o);const a=new J;e[1].assign(i),Zi(e,.5,a);const h=new J;e[1].assign(r),Zi(e,.5,h);const u=J.sqrDistance(o,a),m=J.sqrDistance(o,h);return u<m?(e[1].setCoordsPoint2D(i),Math.sqrt(u)):(e[1].setCoordsPoint2D(r),Math.sqrt(m))}function Ki(t,e,s){s[0].assign(t[0]),s[1].assign(t[1]),s[2].assign(t[2]);const n=new J;ph(t,e,.5,n);const i=new J;Zi(s,.5,i);const r=J.sqrDistance(n,i);return Math.sqrt(r)}function $i(t,e){e[0].assign(t[0]),e[3].assign(t[2]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[0],t[1],2/3,e[1]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[1],t[2],1/3,e[2])}function tr(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(s);const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s[1],s[0]),i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s[1],s[2]);let r=s[0].clone(),o=n;n>i&&(r=s[2].clone(),o=i);let a=!1;return o<=e&&0!==o&&(a=!0,t.setControlPoint1(r)),a}function er(t,e){if(!e)return!1;const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(s);const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s[1],s[0]),i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s[1],s[2]);s[0].clone();let r=n;return n>i&&(s[2].clone(),r=i),r<=e&&0!==r}function sr(t,e,s,n,i,r,o,a,h){const u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(u);const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);if(e.queryControlPoints(m),u[0].equals(m[0])){if(u[1].equals(m[1])&&u[2].equals(m[2]))return s&&(s.length=0,s.push(u[0]),s.push(u[2])),n&&(n.length=0,n.push(0),n.push(1)),i&&(i.length=0,i.push(0),i.push(1)),!0;if(!u[0].equals(m[2]))return!1}return!!(u[0].equals(m[2])&&u[1].equals(m[1])&&u[2].equals(m[0]))&&(n&&(n.length=0,n.push(0),n.push(1),h&&(n[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[1]))),i&&(i.length=0,i.push(1),i.push(0),h&&(i[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(i[0],i[0]=i[1]))),s&&(s.length=0,s.push(u[0]),s.push(u[2]),h&&(s[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[1]))),!0)}const nr=[[.33998104358485626,.6521451548625461],[.8611363115940526,.34785484513745385]],ir=[[.1834346424956498,.362683783378362],[.525532409916329,.31370664587788727],[.7966664774136267,.22238103445337448],[.9602898564975363,.10122853629037626]],rr=[[.09501250983763744,.1894506104550685],[.2816035507792589,.18260341504492358],[.45801677765722737,.16915651939500254],[.6178762444026438,.14959598881657674],[.755404408355003,.12462897125553388],[.8656312023878318,.09515851168249279],[.9445750230732326,.062253523938647894],[.9894009349916499,.027152459411754096]],or=[[.04830766568773832,.0965400885147278],[.1444719615827965,.09563872007927486],[.23928736225213706,.09384439908080457],[.33186860228212767,.09117387869576389],[.42135127613063533,.08765209300440381],[.5068999089322294,.08331192422694675],[.5877157572407623,.07819389578707031],[.6630442669302152,.0723457941088485],[.7321821187402897,.06582222277636185],[.7944837959679424,.058684093478535544],[.84936761373257,.050998059262376175],[.8963211557660521,.04283589802222668],[.9349060759377397,.03427386291302143],[.9647622555875064,.02539206530926206],[.9856115115452684,.01627439473090567],[.9972638618494816,.007018610009470096]],ar=[[.024350292663424433,.048690957009139724],[.07299312
vendor: 4,114 bytes, line 1
1178779904,.04857546744150343],[.12146281929612056,.048344762234802954],[.16964442042399283,.04799938859645831],[.21742364374000708,.04754016571483031],[.2646871622087674,.04696818281621002],[.31132287199021097,.046284796581314416],[.3572201583376681,.04549162792741814],[.4022701579639916,.044590558163756566],[.4463660172534641,.04358372452932345],[.48940314570705296,.04247351512365359],[.5312794640198946,.04126256324262353],[.571895646202634,.03995374113272034],[.6111553551723933,.038550153178615626],[.6489654712546573,.03705512854024005],[.6852363130542333,.035472213256882386],[.7198818501716109,.033805161837141606],[.7528199072605319,.03205792835485155],[.7839723589433414,.030234657072402478],[.8132653151227975,.028339672614259483],[.8406292962525803,.02637746971505466],[.8659993981540928,.024352702568710874],[.8893154459951141,.022270173808383253],[.9105221370785028,.02013482315353021],[.9295691721319396,.017951715775697343],[.9464113748584028,.015726030476024718],[.9610087996520538,.013463047896718643],[.973326827789911,.011168139460131128],[.983336253884626,.008846759826363947],[.9910133714767443,.006504457968978363],[.9963401167719553,.004147033260562468],[.9993050417357722,.001783280721696433]],hr=[[.012223698960615764,.024446180196262518],[.03666379096873349,.024431569097850044],[.06108196960413957,.02440235563384958],[.08546364050451549,.024358557264690626],[.10979423112764375,.024300200167971867],[.13405919946118777,.02422731922281525],[.15824404271422493,.024139957989019287],[.18233430598533718,.024038168681024052],[.2063155909020792,.023922012136703457],[.23017356422666,.023791557781003402],[.2538939664226943,.023646883584447616],[.2774626201779044,.02348807601653591],[.3008654388776772,.02331522999406276],[.32408843502441337,.023128448824387027],[.3471177285976355,.022927844143686846],[.369939555349859,.02271353585023646],[.39254027503326744,.022485652032744968],[.414906379552275,.022244328893799764],[.43702450103710416,.02198971066846049],[.4588814198335522,.021721949538052076],[.48046407240417205,.02144120553920846],[.5017595591361445,.02114764646822135],[.5227551520511755,.02084144778075115],[.5434383024128103,.02052279248696007],[.5637966482266181,.020191871042130043],[.5838180216287631,.01984888123283086],[.6034904561585486,.019494028058706602],[.6228021939105849,.019127523609950944],[.6417416925623075,.01874958694054471],[.660297632272646,.01836044393733134],[.6784589224477192,.017960327185008687],[.6962147083695144,.017549475827117706],[.7135543776835874,.01712813542311138],[.7304675667419088,.016696557801589205],[.746944166797062,.016255000909785187],[.7629743300440948,.015803728659399347],[.7785484755064119,.015343010768865144],[.7936572947621933,.014873122602147314],[.8082917575079137,.014394345004166847],[.8224431169556439,.013906964132951985],[.8361029150609068,.013411271288616333],[.8492629875779689,.012907562739267348],[.8619154689395485,.012396139543950923],[.8740527969580318,.01187730737274028],[.8856677173453972,.011351376324080417],[.8967532880491582,.010818660739503076],[.9073028834017568,.010279479015832158],[.9173101980809605,.009734153415006806],[.9267692508789478,.009183009871660874],[.9356743882779164,.00862637779861675],[.9440202878302202,.008064589890486059],[.9518019613412644,.0074979819256347285],[.9590147578536999,.006926892566898814],[.9656543664319652,.006351663161707189],[.9717168187471366,.005772637542865698],[.9771984914639074,.00519016183267633],[.9820961084357185,.004604584256702955],[.9864067427245862,.004016254983738642],[.9901278184917344,.0034255260409102157],[.9932571129002129,.0028327514714579912],[.9957927585349812,.0022382884309626186],[.997733248625514,.0016425030186690294],[.9990774599773758,.0010458126793403489],[.9998248879471319,.00044938096029209035]];function ur(t,e,s,n){const i=.5*(n-s),r=s+i,o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0);for(let a=0,h=Math.trunc(t/2);a<h;++a){let s,n;switch(t){case 4:s=nr[a][0],n=nr[a][1];break;case 8:s=ir[a][0],n=ir[a][1];break;case 16:s=rr[a][0],n=rr[a][1];break;case 32:s=or[a][0],n=or[a][1];break;case 64:s=ar[a][0],n=ar[a][1];break;
1case 128:s=hr[a][0],n=hr[a][1];break;default:throw new Error("Quadrature_integral: invalid n")}const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.am)(-i,s,r),u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.am)(i,s,r);o.pe(e(h)*n),o.pe(e(u)*n)}return o.getResult()*i}class mr extends Us{constructor(t){t?t.vd?(super({vd:t.vd,bPolygon:!0}),this.m_segmentBufferCTor=Pm):t.copy?(super({vd:t.copy.getDescription(),bPolygon:!0}),this.m_segmentBufferCTor=Pm,t.copy.copyTo(this)):t.move?(super({move:t.move}),this.m_segmentBufferCTor=Pm):t.envelope?(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("envelope constructor not impl"):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("bad arg to polygon constructor"):(super({bPolygon:!0}),this.m_segmentBufferCTor=Pm)}assignMove(t){return t.copyTo(this),this}assignCopy(t){return t.copyTo(this),this}getBoundary(){return $s(this)}getExteriorRingCount(){return this.getOGCPolygonCount()}getGeometryType(){return mr.type}getDimension(){return 2}createInstance(){return new mr({vd:this.getDescription()})}equals(t,e){return this.equalsBase(t,e)}}function lr(t,s){let n,r=s,o=null;switch(r||(o=(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.j)(t)?(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.z)():(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)(),r=o),t){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPoint:n=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:n=new fm({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:n=new ra({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:n=new qh({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:n=new Dn({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:n=new An({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEnvelope:n=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.E({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint:n=new De({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline:n=new Qs({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon:n=new mr({vd:r});break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultipatch:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("multipatch not impl");break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection:n=new cs({vd:r});break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Geometry.create")}return n}mr.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon;var cr=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;const gr=-1,dr=1;class _r{constructor(t){this.m_shape=t}userSort(t,e,s){this.m_shape.sortVerticesSimpleByYHelper(s,t,e)}getValue(t){return this.m_shape.getY(t)}}function pr(t){return void 0!==t.parent}
vendor: 18,779 bytes, line 1
1class fr{constructor(t){pr(t)?(this.m_parent=t.parent,this.m_geometry=t.geometry,this.m_path=t.path,this.m_vertex=t.vertex,this.m_firstVertex=t.firstVertex,this.m_index=t.selection?0:t.index,this.m_bSkipMultiPoints=t.bSkipMultiPoints,this.m_selection=t.selection,this.m_bOneGeom=t.bOneGeom,this.m_bFirst=!0):(this.m_parent=t.copy.m_parent,this.m_geometry=t.copy.m_geometry,this.m_path=t.copy.m_path,this.m_vertex=t.copy.m_vertex,this.m_index=t.copy.m_index,this.m_bSkipMultiPoints=t.copy.m_bSkipMultiPoints,this.m_firstVertex=t.copy.m_firstVertex,this.m_bFirst=!0,this.m_selection=t.copy.m_selection,this.m_bOneGeom=t.copy.m_bOneGeom)}moveToNextHelper(){for(this.m_path=this.m_parent.getNextPath(this.m_path),this.m_index=0;this.m_geometry!==gr;){for(;this.m_path!==gr;this.m_path=this.m_parent.getNextPath(this.m_path))if(this.m_vertex=this.m_parent.getFirstVertex(this.m_path),this.m_firstVertex=this.m_vertex,this.m_vertex!==gr)return this.m_vertex;if(this.m_bOneGeom)return gr;if(this.m_geometry=this.m_parent.getNextGeometry(this.m_geometry),this.m_geometry===gr)break;this.m_bSkipMultiPoints&&!(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(this.m_parent.getGeometryType(this.m_geometry))||(this.m_path=this.m_parent.getFirstPath(this.m_geometry))}return gr}nextSelection(){for(;this.m_index<this.m_parent.m_selectedVertices.length;){const t=this.m_parent.m_selectedVertices[this.m_index++];if(t!==gr&&(this.m_path=this.m_parent.getPathFromVertex(t),!this.m_bOneGeom||this.m_geometry===this.m_parent.getGeometryFromPath(this.m_path)))return this.m_geometry=this.m_parent.getGeometryFromPath(this.m_path),t}return gr}next(){return this.m_selection?this.nextSelection():this.m_bFirst?(this.m_bFirst=!1,this.m_vertex):this.m_vertex!==gr?(this.m_vertex=this.m_parent.getNextVertex(this.m_vertex),this.m_index++,this.m_vertex!==gr&&this.m_vertex!==this.m_firstVertex?this.m_vertex:this.moveToNextHelper()):gr}currentGeometry(){return this.m_geometry}currentPath(){return this.m_path}static create_(t,e,s,n,i,r,o,a,h){return new fr({parent:t,geometry:e,path:s,vertex:n,firstVertex:i,index:r,bSkipMultiPoints:o,selection:a,bOneGeom:h})}}class Pr{constructor(t){this.parentage=t}equals(t){return this.parentage===t.parentage}}class yr{setPrevPath(t,e){this.m_pathIndexList.setField(t,1,e)}setNextPath(t,e){this.m_pathIndexList.setField(t,2,e)}setPathFlags(t,e){this.m_pathIndexList.setField(t,6,e)}getPathFlags(t){return this.m_pathIndexList.getField(t,6)}setPathGeometry(t,e){this.m_pathIndexList.setField(t,7,e)}getPathIndex(t){return this.m_pathIndexList.getField(t,0)}setNextGeometry(t,e){this.m_geometryIndexList.setField(t,1,e)}setPrevGeometry(t,e){this.m_geometryIndexList.setField(t,0,e)}getGeometryIndex(t){return this.m_geometryIndexList.getField(t,7)}setFirstPath(t,e){this.m_geometryIndexList.setField(t,3,e)}setLastPath(t,e){this.m_geometryIndexList.setField(t,4,e)}newGeometry(t){const e=this.m_geometryIndexList.newElement();return this.m_geometryIndexList.setField(e,2,t),this.m_geometryIndexList.setField(e,5,0),this.m_geometryIndexList.setField(e,6,0),this.m_geometryIndexList.setField(e,7,this.m_geometryIndexList.elementToIndex(e)),e}freeGeometry(t){this.m_geometryIndexList.deleteElement(t)}newPath(t){const e=this.m_pathIndexList.newElement(),s=this.m_pathIndexList.elementToIndex(e);if(this.m_pathIndexList.setField(e,0,s),this.m_pathIndexList.setField(e,3,0),this.m_pathIndexList.setField(e,6,0),this.setPathGeometry(e,t),s>=this.m_pathAreas.length){const t=Math.trunc(s<16?16:3*s/2);this.m_pathAreas.length=t,this.m_pathLengths.length=t}return this.m_pathAreas[s]=0,this.m_pathLengths[s]=0,this.m_pathCount++,e}freePath(t){this.m_pathIndexList.deleteElement(t),this.m_pathCount--}newVertex(t){const e=this.m_vertexIndexList.newElement(),s=t>=0?t:this.m_vertexIndexList.elementToIndex(e);if(this.m_vertexIndexList.setField(e,0,s),t<0){if(s>=this.m_vertices.getPointCount()){const t=Math.trunc(s<16?16:3*s/2);this.m_vertices.reserveRounded(t),this.m_vertices.resizeNoInit(t),null!==this.m_segments&&(this.m_segments.length=t),this.m_xyStream=this.m_vertices.getAttributeStreamRef(0)}this.m_segments&&(this.m_segments[s]=null)}return this.m_pointCount++,e}freeVertex(t){this.unselect(t);const e=this.getVertexIndex(t);this.m_vertexIndexList.deleteElement(t),this.m_pointCount--;for(let s=0,n=this.m_indices.length;s<n;s++){if(s===this.m_selectionIndex)continue;const t=this.m_indices[s];null!==t&&t.size()>e&&t.write(e,-1)}this.m_weights&&this.m_weights.size()>e&&this.m_weights.write(e,1),this.m_ranks&&this.m_ranks.size()>e&&this.m_ranks.write(e,dr),this.m_segmentWeights&&this.m_segmentWeights.size()>e&&this.m_segmentWeights.write(e,1),this.m_segmentRanks&&this.m_segmentRanks.size()>e&&this.m_segmentRanks.write(e,dr),this.m_segments&&this.setSegmentToIndex(e,null)}insertVertex_(t,e,s,n){this.m_hasForceSetEnvelope=0;const i=e!==gr?this.getPrevVertex(e):this.getLastVertex(t),r=i!==gr?this.getNextVertex(i):gr,o=this.newVertex(null===s?this.m_pointCount:-1),a=this.getVertexIndex(o);null!==s&&this.m_vertices.setPointByValNoCurves(a,s),this.setPathToVertex(o,t),this.setNextVertex(o,r),this.setPrevVertex(o,i),r!==gr&&this.setPrevVertex(r,o),i!==gr&&this.setNextVertex(i,o);const h=this.isClosedPath(t),u=this.getFirstVertex(t);e===gr&&this.setLastVertex(t,o),e===u&&(h&&n&&u!==gr||this.setFirstVertex(t,o)),h&&r===gr&&(this.setNextVertex(o,o),this.setPrevVertex(o,o)),this.setPathSize(t,this.getPathSize(t)+1);const m=this.getGeometryFromPath(t);return this.setGeometryVertexCount(m,this.getPointCount(m)+1),o}getHelperPoint(){return this.m_helperPoint||(this.m_helperPoint=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.m_vertices.getDescription()}),this.m_helperPoint.setXYCoords(0,0)),this.m_helperPoint}addMultiPoint(t,e){const s=this.createGeometry(t.getGeometryType(),t.getDescription());return this.appendMultiPoint(s,t,e),s}addPoint_(t,e){const s=this.createGeometry(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint,t.getDescription());return this.appendPoint(s,t,e),s}appendMultiPath_(t,e){if(e.isEmpty())return;const s=e.getImpl();this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+s.getPointCount()),this.m_verticesMp.addPoints(e,0,s.getPointCount()),this.m_xyStream=this.m_vertices.getAttributeStreamRef(0);const n=null!==this.m_segments||null!==s.getSegmentFlagsStreamRef();this.m_vertexIndexList.setCapacity(this.m_vertexIndexList.size()+s.getPointCount()),this.m_pathIndexList.setCapacity(this.m_pathIndexList.size()+s.getPathCount());for(let i=0,r=s.getPathCount();i<r;i++){if(0===s.getPathSize(i))continue;const e=this.insertPath(t,gr);this.setClosedPath(e,s.isClosedPath(i));for(let t=s.getPathStart(i),r=s.getPathEnd(i);t<r;t++){const i=this.insertVertex_(e,gr,null,!1);if(n){const e=this.getVertexIndex(i);if(1&s.getSegmentFlags(t))this.setSegmentToIndex(e,null);else{const n=new Pm;s.querySegment(t,n,!0),this.setSegmentToIndex(e,n.releaseSegment())}}}s.isStrongPathStart(i)&&this.setStrongPathStart(e,!0),s.isStrongPathEnd(i)&&this.setStrongPathEnd(e,!0)}}addMultiPath(t,e){const s=this.createGeometry(t.getGeometryType(),t.getDescription());return t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon&&this.setFillRule(s,t.getFillRule()),this.appendMultiPath(s,t,e),s}appendMultiPathPolyline(t,e,s){const n=e.getImpl(),i=null!==this.m_segments||null!==n.getSegmentFlagsStreamRef(),r=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;e.queryEnvelope(r);{const r=s.clone();let o=n.getPointCount();const a=n.getAccelerators();if(a&&a.getQuadTree()){o=a.getQuadTree().getIntersectionCount(r,0,n.getPointCount()+1)}if(o<e.getPointCount()){if(0===o)return;const s=n.queryLimitedSegmentIterator(r);let a=-1,h=-100,u=-1,m=0,l=-1,c=gr,g=!1,d=s.nextSegment();if(null!==d)for(;;d=s.nextSegment()){let r=null===d;const o=null!==d?s.getPathIndex():a,_=null!==d?s.getStartPointIndex():h;if(r||(a===o&&h+1===_?m++:r=!0),r){if(-1!==l){let t=-1,s=-1;if(m===u){this.setClosedPath(c,g);const i=n.getPathEnd(a);this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+i-l),this.m_verticesMp.addPoints(e,l,i),s=n.getPathSize(a),t=i-1}else if(!g||h+1<n.getPathEnd(a))this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+h+2-l),this.m_verticesMp.addPoints(e,l,h+2),s=h-l+2,t=h;else{this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+h+2-l),this.m_verticesMp?.addPoints(e,l,h+1),t=h,s=h-l+1;const i=n.getPathStart(a);this.m_verticesMp.addPoints(e,i,i+1),s+=1}this.m_xyStream=this.m_vertices.getAttributeStreamRef(0);for(let e=0,r=l;e<s;e++,r++){const e=this.insertVertex_(c,gr,null,!1);if(i){const s=this.getVertexIndex(e);if(1&n.getSegmentFlags(r)||r>t)this.setSegmentToIndex(s,null);else{const t=new Pm;n.getSegmentBuffer(r,t,!0),this.setSegmentToIndex(s,t.releaseSegment())}}}}if(null===d)break;m=1,l=_,a!==o?(c=this.insertPath(t,gr),this.setClosedPath(c,!1),u=n.getSegmentCountPath(o),g=n.isClosedPath(o),a=o):c=this.insertPath(t,gr)}h=_}return}}this.appendMultiPath_(t,e)}appendMultiPathPolygon(t,e,n){const i=e.getImpl(),r=null!==this.m_segments||null!==i.getSegmentFlagsStreamRef(),o=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();e.queryEnvelope(o),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n.isIntersecting(o)&&!n.containsEnvelope(o));let a=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.construct(Number.NEGATIVE_INFINITY,n.ymin,Number.POSITIVE_INFINITY,n.ymax),h=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.construct(n.xmin,Number.NEGATIVE_INFINITY,n.xmax,Number.POSITIVE_INFINITY);const u=i.getAccelerators();if(u&&u.getQuadTree()){const t=u.getQuadTree(),e=t.getIntersectionCount(a,0,0);e>t.getIntersectionCount(h,0,e+1)&&(h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a,a=h))}else a.height()>h.width()&&(h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(a,a=h));const m=[],l=i.queryLimitedSegmentIterator(a);let c=-1,g=-100,d=-1,_=0,p=-1,f=-1,P=gr,y=!0,x=l.nextSegment();if(null!==x)for(;;x=l.nextSegment()){let n=null===x;const o=null!==x?l.getPathIndex():c,a=null!==x?l.getStartPointIndex():g;if(n||(o===c?g+1===a?_++:n=!0:(n=c>=0,c<0&&(c=o,d=i.getSegmentCountPath(c),p=a,P=gr,_=1))),n){if(!(0===m.length&&d===_)){0!==m.length&&m[0].first===p||(this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+1),this.m_verticesMp.addPoints(e,p,p+1),-1===f&&(f=p),P===gr&&(P=this.insertPath(t,gr),this.setClosedPath(P,!0)),this.m_xyStream=this.m_vertices.getAttributeStreamRef(0),this.insertVertex_(P,gr,null,!1));for(const{first:n,second:o}of m){-1===f&&(f=n);let a=-1,h=-1;const u=n+o-1;if(o===d){const t=u+1;h=t-n,this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+h),this.m_verticesMp.addPoints(e,n,t),a=u,(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===m.length)}else if(u+1<i.getPathEnd(c)){const t=u+2;h=t-n,this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+h),this.m_verticesMp.addPoints(e,n,t),a=u}else{const t=i.getPathStart(c),s=t!==f?1:0,r=u+1;h=r-n+s,this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+(r-n)+s),this.m_verticesMp.addPoints(e,n,r),a=u,s>0&&this.m_verticesMp?.addPoints(e,t,t+1)}this.m_xyStream=this.m_vertices.getAttributeStreamRef(0),P===gr&&(P=this.insertPath(t,gr),this.setClosedPath(P,!0));for(let t=0,e=n;t<h;t++,e++){const t=this.insertVertex_(P,gr,null,!1);if(r){const s=this.getVertexIndex(t);if(1&i.getSegmentFlags(e)||e>a)this.setSegmentToIndex(s,null);else{const t=new Pm;i.getSegmentBuffer(e,t,!0),this.setSegmentToIndex(s,t.releaseSegment())}}}}if(0===m.length||m.at(-1).first+m.at(-1).second!==p+_){let t=p+_;t===e.getPathEnd(c)&&(t=e.getPathStart(c)),f!==t&&(this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+1),this.m_verticesMp.addPoints(e,t,t+1),this.insertVertex_(P,gr,null,!1))}}m.length=0,y=!0,o!==c&&(c=o,d=i.getSegmentCountPath(c),P=gr,f=-1),p=a,_=1}if(!x)break;{const t=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();x.queryLooseEnvelope(t),h.isIntersecting(t)?(y?m.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(a,1)):m.at(-1).second++,y=!1):y=!0}g=a}}appendMultiPath(t,e,s){if(void 0===s)return void this.appendMultiPath_(t,e);if(e.isEmpty())return;const n=e.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon,r=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();e.queryEnvelope(r),s.isIntersecting(r)&&(!s.containsEnvelope(r)&&e.getPointCount()>10?n?this.appendMultiPathPolygon(t,e,s):this.appendMultiPathPolyline(t,e,s):this.appendMultiPath_(t,e))}appendPoint(t,e,s){if(e.isEmpty())return;if(void 0!==s&&!s.contains(e.getXY()))return;this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+1),this.m_verticesMp.add(e),this.m_xyStream=this.m_vertices.getAttributeStreamRef(0),this.m_vertexIndexList.setCapacity(this.m_vertexIndexList.size()+1);const n=this.insertPath(t,gr);this.insertVertex_(n,gr,null,!1)}appendMultiPoint_(t,e){this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+e.getPointCount()),this.m_verticesMp.addPoints(e,0,e.getPointCount()),this.m_xyStream=this.m_vertices.getAttributeStreamRef(0),this.m_vertexIndexList.setCapacity(this.m_vertexIndexList.size()+e.getPointCount());const s=this.insertPath(t,gr);for(let n=0,i=e.getPointCount();n<i;n++)this.insertVertex_(s,gr,null,!1)}appendMultiPoint(t,e,s){if(void 0===s)return void this.appendMultiPoint_(t,e);const n=e.getAttributeStreamRef(0);let i=0;for(let u=0,m=e.getPointCount();u<m;u++){const t=n.readPoint2D(2*u);s.contains(t)&&i++}this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+i);let r=-1,o=-1,a=0;for(let u=0,m=e.getPointCount();u<m;u++){const t=n.readPoint2D(2*u);s.contains(t)?(-1===r&&(r=u,o=u),o++):r>=0&&(this.m_verticesMp.addPoints(e,r,o-r),r=-1,a++)}if(r>0&&(this.m_verticesMp.addPoints(e,r,o-r),a++),!a)return;this.m_xyStream=this.m_vertices.getAttributeStreamRef(0),this.m_vertexIndexList.setCapacity(this.m_vertexIndexList.size()+i);const h=this.insertPath(t,gr);for(let u=0,m=e.getPointCount();u<m;u++){const t=n.readPoint2D(2*u);s.contains(t)&&this.insertVertex_(h,gr,null,!1)}}splitSegmentForward(t,s,n,r,o){const a=this.getNextVertex(t);a===gr&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Edit_shape.split_segment_forward_");const h=this.getHelperPoint(),u=this.getPathFromVertex(t);let m=t;const l=this.hasSegmentParentage();for(let e=0,c=s.getResultSegmentCount(n);e<c;e++){const t=this.getVertexIndex(m),r=this.getNextVertex(m),g=s.getResultSegment(n,e);let d=null;if(g.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine&&(d=g.clone(),d.dropAllAttributes()),0===e&&(g.queryStart(h),this.setSegmentToIndex(t,null),this.setPointEx(m,h,s.getResultSegmentStartPointRank(n,e),s.getResultSegmentStartPointWeight(n,e),o)),this.setSegmentRank(m,s.getResultSegmentInteriorRank(n,e)),this.setSegmentWeight(m,s.getResultSegmentInteriorWeight(n,e)),l){const t=s.getResultSegmentSegmentParentage(n,e),i=s.getResultSegmentStartPointIsBreak(n,e);this.setSegmentParentageAndBreak(m,t,i)}if(g.queryEnd(h),e<c-1){this.setSegmentToIndex(t,d);const i=this.insertVertex(u,r,h);this.setWeight(i,s.getResultSegmentEndPointWeight(n,e)),this.setRank(i,s.getResultSegmentEndPointRank(n,e)),this.select(i),m=i}else{this.setPointEx(a,h,s.getResultSegmentEndPointRank(n,e),s.getResultSegmentEndPointWeight(n,e),o);const i=s.getResultSegmentEndPointIsBreak(n,e);this.setSegmentParentageBreakVertex(a,i),this.setSegmentToIndex(t,d)}}}splitSegmentBackward(t,s,n,r,o){const a=this.getNextVertex(t);a===gr&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Edit_shape.split_segment_backward_");const h=this.getHelperPoint(),u=this.getPathFromVertex(t);let m=t;const l=this.hasSegmentParentage();for(let e=0,c=s.getResultSegmentCount(n);e<c;e++){const t=c-e-1,r=this.getVertexIndex(m),g=this.getNextVertex(m),d=s.getResultSegment(n,t);let _=null;if(d.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine&&(_=d.clone(),_.reverse(),_.dropAllAttributes()),0===e&&(d.queryEnd(h),this.setSegmentToIndex(r,null),this.setPointEx(m,h,s.getResultSegmentEndPointRank(n,t),s.getResultSegmentEndPointWeight(n,t),o),this.setSegmentParentageAndBreak(m,s.getResultSegmentSegmentParentage(n,t),s.getResultSegmentEndPointIsBreak(n,t))),d.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine?this.setSegmentToIndex(r,null):this.setSegmentToIndex(r,_),this.setSegmentRank(m,s.getResultSegmentInteriorRank(n,t)),this.setSegmentWeight(m,s.getResultSegmentInteriorWeight(n,t)),d.queryStart(h),e<c-1){const e=this.insertVertex(u,g,h);this.setWeight(e,s.getResultSegmentStartPointWeight(n,t)),this.setRank(e,s.getResultSegmentStartPointRank(n,t)),this.select(e),m=e,l&&this.setSegmentParentageAndBreak(e,s.getResultSegmentSegmentParentage(n,t),s.getResultSegmentEndPointIsBreak(n,t))}else this.setPointEx(a,h,s.getResultSegmentStartPointRank(n,t),s.getResultSegmentStartPointWeight(n,t),o)}}selected_(t){return this.getUserIndex(t,this.m_selectionIndex)>=0}allocateIndex(t=!0){if(this.m_deletedIndices.length){const e=this.m_deletedIndices.pop();return t&&e.setRange(-1,0,e.size()),e}return t?(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0,-1):(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0)}recycleUserIndex(t){this.m_deletedIndices.push(t)}allocatePathIndex(){if(this.m_deletedPathIndices.length){const t=this.m_deletedPathIndices.at(-1);return this.m_deletedPathIndices.pop(),t}return (0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0)}recyclePathUserIndex(t){this.m_deletedPathIndices.push(t)}peelALoop_(t,e,s){const n=this.getNextVertex(t),i=this.getNextVertex(e),r=this.getVertexIndex(t),o=this.getVertexIndex(e);if(this.setNextVertex(t,i),this.setPrevVertex(i,t),this.setNextVertex(e,n),this.setPrevVertex(n,e),this.m_segments){const t=this.getSegmentFromIndex(r),e=this.getSegmentFromIndex(o);this.setSegmentToIndex(o,null),this.setSegmentToIndex(r,e),this.setSegmentToIndex(o,t)}if(this.hasSegmentParentage()){let s=this.getSegmentParentage(e),n=this.getSegmentParentage(t);-1===s&&-1===n||(n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s,s=n),this.setSegmentParentageAndBreak(t,n),this.setSegmentParentageAndBreak(e,s))}if(s){const e=this.getPathFromVertex(t),s=this.getGeometryFromPath(e),r=[!1],o=this.insertClosedPath(s,gr,n,this.getFirstVertex(e),r);r[0]&&this.setFirstVertex(e,i);let a=this.getPathSize(e);return a-=this.getPathSize(o),this.setPathSize(e,a),o}return gr}sortVerticesSimpleByYHelper(t,e,s){t.sort(e,s,(t,e)=>{let s=this.compareVerticesSimpleY(t,e);if(0===s){const n=this.getPathInternalIndexFromVertex(t),i=this.getPathInternalIndexFromVertex(e);s=n<i?-1:n>i?1:0}return s})}sortVerticesSimpleByYHelper3D(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}constructor(){this.m_verticesMp=null,this.m_vertices=null,this.m_xyStream
1=null,this.m_vertexDescription=null,this.m_segments=null,this.m_weights=null,this.m_ranks=null,this.m_segmentWeights=null,this.m_segmentRanks=null,this.m_indices=[],this.m_deletedIndices=[],this.m_pathAreas=[],this.m_pathLengths=[],this.m_pathindices=[],this.m_deletedPathIndices=[],this.m_geometryIndices=[],this.m_selectedVertices=[],this.m_helperPoint=null,this.m_forceSetEnvelope=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.p.constructEmpty(),this.m_hasForceSetEnvelope=0,this.m_workPoint2D=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),this.m_workPoint2_2D=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),this.m_curveStitcher=null,this.m_pathCount=0,this.m_pointCount=0,this.m_firstGeometry=gr,this.m_lastGeometry=gr,this.m_vertexIndexList=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.S(5),this.m_pathIndexList=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.S(8),this.m_geometryIndexList=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.S(8),this.m_bHasAttributes=!1,this.m_selectedCount=0,this.m_selectionIndex=-1,this.m_selection=!1,this.m_bucketSort=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.B,this.m_segmentParentageIndex=-1}getTotalPointCount(){return this.m_pointCount}getEnvelope2D(t){if(0!==this.m_hasForceSetEnvelope)return new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D(this.m_forceSetEnvelope.xmin,this.m_forceSetEnvelope.ymin,this.m_forceSetEnvelope.xmax,this.m_forceSetEnvelope.ymax);const e=this.hasCurves(),s=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty(),n=this.queryVertexIterator();let i=!0;for(let r=n.next();r!==gr;r=n.next()){if(i?s.merge(this.getXY(r)):s.mergeNe(this.getXY(r)),e){const t=this.getSegment(r);if(null!==t){const e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();t.queryLooseEnvelope(e),s.mergeEnvelope2D(e)}}i=!1}return s}getEnvelope3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.p.constructEmpty()}forceSetEnvelope2D(t){this.m_hasForceSetEnvelope=1,this.m_forceSetEnvelope.setCoords(t.xmin,t.ymin,0,t.xmax,t.ymax,0)}forceSetEnvelope3D(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}forgetForceSetEnvelope(){this.m_hasForceSetEnvelope=0}getGeometryCount(){return this.m_geometryIndexList.size()}addGeometry(t,s){const n=t.getGeometryType();if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(n))return this.addMultiPath(t,s);if(n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint)return this.addMultiPoint(t,s);if(n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPoint)return this.addPoint_(t,s);if(n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEnvelope){const e=new mr;return e.addEnvelope(t,!1),this.addMultiPath(e,s)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("")}appendGeometry(t,s){this.mergeVertexDescription(s.getDescription());const n=s.getGeometryType();(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(n)?this.appendMultiPath(t,s):n!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint?(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""):this.appendMultiPoint(t,s)}assignRankToGeometryVertices(t,e){e<dr&&(e=dr);const s=this.queryVertexIterator();for(let n=s.next();n!==gr;n=s.next())this.setRank(n,e),this.setSegmentRank(n,e)}collapseAllGeometriesToFirst(){this.collapseGeometriesToFirst(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumUnknown)}collapseGeometriesToFirst(t){this.dbgVerifyVertexCounts();let e=gr,s=-1,n=-1;for(let r=this.getFirstGeometry();r!==gr;){if(t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumUnknown||this.getGeometryType(r)===t){if(e===gr){e=r,s=this.getPathCount(e),n=this.getPointCount(e),r=this.getNextGeometry(r);continue}for(let s=this.getFirstPath(r);s!==gr;s=this.getNextPath(s))this.setPathGeometry(s,e);s+=this.getPathCount(r),n+=this.getPointCount(r);const t=this.getLastPath(e),i=this.getFirstPath(r);t!==gr?this.setNextPath(t,i):this.setFirstPath(e,i),i!==gr&&(this.setPrevPath(i,t),this.setLastPath(e,this.getLastPath(r))),this.setFirstPath(r,gr),this.setLastPath(r,gr);const o=r;r=this.getNextGeometry(r),this.setGeometryVertexCount(o,0),this.removeGeometry(o);continue}r=this.getNextGeometry(r)}return e!==gr&&(this.setGeometryVertexCount(e,n),this.setGeometryPathCount(e,s),this.dbgVerifyVertexCounts()),e}setFillRule(t,e){let s=this.m_geometryIndexList.getField(t,2);s&=-134217729,s|=1===e?134217728:0,this.m_geometryIndexList.setField(t,2,s)}getFillRule(t){return 134217728&this.m_geometryIndexList.getField(t,2)?1:0}setGeometryModified(t,e){let s=this.m_geometryIndexList.getField(t,2);!!(67108864&s)!==e&&(s&=-67108865,s|=e?67108864:0,this.m_geometryIndexList.setField(t,2,s))}getGeometryModified(t){return!!(67108864&this.m_geometryIndexList.getField(t,2))}setGeometryModifiedWithVertex(t,e){const s=this.getPathFromVertex(t),n=this.getGeometryFromPath(s);this.setGeometryModified(n,e)}getGeometryModifiedWithVertex(t){const e=this.getPathFromVertex(t),s=this.getGeometryFromPath(e);return this.getGeometryModified(s)}swapGeometry(t,e){const s=this.getFirstPath(t),n=this.getFirstPath(e),i=this.getLastPath(t),r=this.getLastPath(e);for(let c=this.getFirstPath(t);c!==gr;c=this.getNextPath(c))this.setPathGeometry(c,e);for(let c=this.getFirstPath(e);c!==gr;c=this.getNextPath(c))this.setPathGeometry(c,t);this.setFirstPath(t,n),this.setFirstPath(e,s),this.setLastPath(t,r),this.setLastPath(e,i);const o=this.getPointCount(t),a=this.getPathCount(t),h=this.getPointCount(e),u=this.getPathCount(e);this.setGeometryVertexCount(t,h),this.setGeometryVertexCount(e,o),this.setGeometryPathCount(t,u),this.setGeometryPathCount(e,a);const m=this.m_geometryIndexList.getField(t,2),l=this.m_geometryIndexList.getField(e,2);this.m_geometryIndexList.setField(t,2,l),this.m_geometryIndexList.setField(e,2,m)}addPathFromMultiPath(t,e,s){const n=this.createGeometry(s?_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon:_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolyline,t.getDescription()),r=t.getImpl();if(t.getPathSize(e)<2)return n;this.m_vertices.reserveRounded(this.m_vertices.getPointCount()+t.getPathSize(e)),this.m_verticesMp.addPoints(t,t.getPathStart(e),r.getPathEnd(e)),this.m_xyStream
1=this.m_vertices.getAttributeStreamRef(0);const o=this.insertPath(n,gr);this.setClosedPath(o,r.isClosedPath(e)||s);const a=null!==this.m_segments||null!==r.getSegmentFlagsStreamRef();for(let i=r.getPathStart(e),h=r.getPathEnd(e);i<h;i++){const t=this.insertVertex_(o,gr,null,!1);if(a){const e=this.getVertexIndex(t);if(1&r.getSegmentFlags(i))this.setSegmentToIndex(e,null);else{const t=new Pm;r.querySegment(i,t,!0),this.setSegmentToIndex(e,t.releaseSegment())}}}return r.isStrongPathStart(e)&&this.setStrongPathStart(o,!0),r.isStrongPathEnd(e)&&this.setStrongPathEnd(o,!0),n}getGeometry(t){const e=this.getGeometryType(t),s=lr(e,this.m_verticesMp.getDescription()),n=this.getPointCount(t);if(0===n)return s;if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(e)){const e=s.getImpl(),i=this.getPathCount(t),r=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(i+1),o=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.F)(i+1,0),a=s.getDescription(),h=this.hasCurves();for(let s=0,u=a.getAttributeCount();s<u;s++){const h=a.getSemantics(s),u=cr.getComponentCount(h),m=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.v)(h,n),l=this.m_vertices.getAttributeStreamRef(h);let c=0,g=0,d=0;for(let e=this.getFirstPath(t);e!==gr;e=this.getNextPath(e)){let t=0;this.isClosedPath(e)&&(t|=1),this.isExterior(e)&&(t|=8),this.isStrongPathStart(e)&&(t|=2),this.isStrongPathEnd(e)&&(t|=4),t&&o.setBits(g,t);const s=this.getPathSize(e);if(r.write(g++,d),d+=s,0===h){const t=l,s=m;let n;for(let i=this.getFirstVertex(e);c<d;i=this.getNextVertex(i),c++){const e=this.getVertexIndex(i);n=t.readPoint2D(2*e),s.writePoint2D(2*c,n)}}else for(let n=this.getFirstVertex(e);c<d;n=this.getNextVertex(n),c++){const t=this.getVertexIndex(n);for(let e=0;e<u;e++){const s=l.readAsDbl(t*u+e);m.writeAsDbl(c*u+e,s)}}}e.setAttributeStreamRef(h,m),r.write(i,n)}if(e.setPathFlagsStreamRef(o),e.setPathStreamRef(r),e.notifyModifiedFlags(65535),h){let s=0,n=0;for(let i=this.getFirstPath(t);i!==gr;i=this.getNextPath(i)){s+=this.getPathSize(i);for(let t=this.getFirstVertex(i);n<s;t=this.getNextVertex(t)){const s=this.getSegment(t);null!==s&&s.isCurve()&&e.replaceSegment(n,s,!0),n++}}}}else if(e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint){const e=s.getImpl(),i=s.getDescription();e.reserve(n),e.resizeNoInit(n);for(let s=0,n=i.getAttributeCount();s<n;s++){const n=i.getSemantics(s),r=cr.getComponentCount(n),o=e.getAttributeStreamRef(n),a=this.m_vertices.getAttributeStreamRef(n);let h=0;const u=this.getFirstPath(t),m=this.getPathSize(u);for(let t=this.getFirstVertex(u);h<m;t=this.getNextVertex(t),h++){const e=this.getVertexIndex(t);for(let t=0;t<r;t++){const s=a.readAsDbl(e*r+t);o.writeAsDbl(h*r+t,s)}}e.setAttributeStreamRef(n,o)}e.notifyModifiedFlags(65535)}else (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("getGeometry");return s}queryPointGeometryOnly(t,s){this.getGeometryType(t)!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("get_point_geometry_only");const n=this.getPointCount(t);if(n>1&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("get_point_geometry_only"),0===n)return s.assignVertexDescription(this.m_vertexDescription),void s.setEmpty();const r=this.getFirstPath(t),o=this.getFirstVertex(r);this.queryPoint(o,s)}removeGeometry(t){for(let n=this.getFirstPath(t);n!==gr;n=this.removePath(n));const e=this.getPrevGeometry(t),s=this.getNextGeometry(t);return e!==gr?this.setNextGeometry(e,s):this.m_firstGeometry=s,s!==gr?this.setPrevGeometry(s,e):this.m_lastGeometry=e,this.freeGeometry(t),s}createGeometry(t,e){void 0===e&&(e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.l)());const s=this.newGeometry(t);return this.m_vertices||(this.m_verticesMp=new De({vd:e}),this.m_vertices=this.m_verticesMp.getImpl()),this.mergeVertexDescription(e),this.m_firstGeometry===gr?(this.m_firstGeometry=s,this.m_lastGeometry=s):(this.setPrevGeometry(s,this.m_lastGeometry),this.setNextGeometry(this.m_lastGeometry,s),this.m_lastGeometry=s),s}getFirstGeometry(){return this.m_firstGeometry}getLastGeometry(){return this.m_lastGeometry}getNextGeometry(t){return this.m_geometryIndexList.getField(t,1)}getPrevGeometry(t){return this.m_geometryIndexList.getField(t,0)}getGeometryType(t){return 16777215&this.m_geometryIndexList.getField(t,2)}setGeometryUserIndex(t,e,s){const n=this.m_geometryIndices[e],i=this.getGeometryIndex(t);i>=n.size()&&n.resize(Math.max(1.25*i,16),-1),n.write(i,s)}getGeometryUserIndex(t,e){const s=this.getGeometryIndex(t),n=this.m_geometryIndices[e];return s<n.size()?n.read(s):-1}createGeometryUserIndex(){for(let e=0;e<this.m_geometryIndices.length;e++)if(null===this.m_geometryIndices[e])return this.m_geometryIndices[e]=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0),e;this.m_geometryIndices.push((0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(0));const t=this.m_geometryIndices.length-1;return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<=Number.MAX_SAFE_INTEGER),t}removeGeometryUserIndex(t){for(this.m_geometryIndices[t]=null;this.m_geometryIndices.length>0&&null===this.m_geometryIndices.at(-1);)this.m_geometryIndices.pop()}getFirstPath(t){return this.m_geometryIndexList.getField(t,3)}getLastPath(t){return this.m_geometryIndexList.getField(t,4)}hasPointFeatures(){for(let t=this.getFirstGeometry();t!==gr;t=this.getNextGeometry(t))if(!(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(this.getGeometryType(t)))return!0;return!1}getPointCount(t){return this.m_geometryIndexList.getField(t,5)}getPathCount(t){return this.m_geometryIndexList.getField(t,6)}filterClosePoints(t,e,n,r,o){const a=t*t;let h=0;const u=this.hasCurves(),m=this.hasSegmentParentage(),l=!0;for(let g=o===gr?this.getFirstGeometry():o;g!==gr;g=o===gr?this.getNextGeometry(g):gr){const t=this.getGeometryType(g);if(!(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(t))continue;if(n&&t!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon)continue;const o=this.getGeometryType(g)===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon;let d=this.getGeometryModified(g);for(let n=this.getFirstPath(g);n!==gr;){let t=0;for(let e=this.getFirstVertex(n);t<Math.trunc(this.getPathSize(n)/2);){const i=this.getNextVertex(e);if(i===gr)break;const o=this.getXY(e),c=this.getXY(i);let _=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(o,c),p=!0;do{if(_<=a){if(u){const t=this.getSegment(e);
vendor: 7,019 bytes, line 1
1if(null!==t){const e=t.calculateLength2D();if(_=e*e,_>a)break}}if(0===_?0===h&&(h=-1):h=1,i!==this.getLastVertex(n)){const t=m&&(this.getSegmentParentageBreakVertex(e)||this.getSegmentParentageBreakVertex(i));if(this.transferAllDataToTheVertex(i,e,l),this.removeVertex(i,!1),r&&!d&&(this.setGeometryModified(g,!0),d=!0),m&&e!==i){this.setSegmentParentageBreakVertex(e,t);const n=this.getNextVertex(e);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n!==gr),this.isDiscontinuousSegmentParentage(n)&&this.setSegmentParentageBreakVertex(n,!0)}}p=!1}}while(0);p&&(e=this.getNextVertex(e)),t++}let i=this.getFirstVertex(n);for(let e=this.isClosedPath(n)?i:this.getLastVertex(n);this.getPathSize(n)>0;){const t=this.getPrevVertex(e);if(t===gr)break;{const o=this.getXY(t),c=this.getXY(e);let _=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(o,c),p=!0;do{if(_<=a){if(u){const e=this.getSegment(t);if(null!==e){const t=e.calculateLength2D();if(_=t*t,_>a)break}}if(0===_?0===h&&(h=-1):h=1,m){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(this.m_segmentParentageIndex>=0);const n=this.getUserIndex(e,this.m_segmentParentageIndex);this.transferAllDataToTheVertex(t,e,l),this.setUserIndex(e,this.m_segmentParentageIndex,n)}else this.transferAllDataToTheVertex(t,e,l);const o=m&&(this.getSegmentParentageBreakVertex(e)||this.getSegmentParentageBreakVertex(t));this.removeVertex(t,!0),r&&!d&&(this.setGeometryModified(g,!0),d=!0),m&&t!==e&&(o||this.isDiscontinuousSegmentParentage(e))&&this.setSegmentParentageBreakVertex(e,!0),i===t&&(i=this.getFirstVertex(n)),p=!1}}while(0);if(p&&(e=this.getPrevVertex(e),e===i))break}}const c=this.getPathSize(n);let _=e&&c<(o?3:2);_&&o&&2===c&&u&&(_=!this.pathHasCurves(n)),_?(n=this.removePath(n),0===h&&(h=-1),r&&!d&&(this.setGeometryModified(g,!0),d=!0)):n=this.getNextPath(n)}}return h}filterClosePoints3D(t,e,n,i,r,o){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}hasDegenerateSegments(t){for(let e=this.getFirstGeometry();e!==gr;e=this.getNextGeometry(e))if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(this.getGeometryType(e)))for(let s=this.getFirstPath(e);s!==gr;){const e=this.getPathSize(s);if(0===e)return!0;let n=this.getFirstVertex(s);for(let s=0;s<e;s++){const e=this.getNextVertex(n);if(e===gr)break;const s=this.getVertexIndex(n),i=this.getSegmentFromIndex(s);let r=0;if(null!==i){if(r=i.calculateLowerLength2D(),r<=t){if(r=i.calculateUpperLength2D(),r<=t)return!0;if(r=i.calculateLength2D(),r<=t)return!0}}else{const n=this.getVertexIndex(e);if(r=this.m_vertices.getShortestDistance(s,n),r<=t)return!0}n=e}s=this.getNextPath(s)}return!1}hasDegenerateSegments3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}transferAllDataToTheVertex(t,e,s=!1){const n=this.getVertexIndex(t),i=this.getVertexIndex(e);if(s){let t=1,e=1;if(this.m_ranks&&(t=this.getRankWithIndex(n),e=this.getRankWithIndex(i)),t>e&&this.setRankWithIndex(i,t),t>=e&&this.m_weights){const s=this.getWeightWithIndex(n),r=this.getWeightWithIndex(i);(t>e||s>r)&&this.setWeightWithIndex(i,s)}}else{if(this.m_weights){const t=this.getWeightWithIndex(n);this.setWeightWithIndex(i,t)}if(this.m_ranks){const t=this.getRankWithIndex(n);this.setRankWithIndex(i,t)}}if(this.m_segmentWeights){const t=this.getSegmentWeightWithIndex(n);this.setSegmentWeightWithIndex(i,t)}if(this.m_segmentRanks){const t=this.getSegmentRankWithIndex(n);this.setSegmentRankWithIndex(i,t)}for(let o=0,a=this.m_indices.length;o<a;o++)if(o!==this.m_selectionIndex&&null!==this.m_indices[o]){const s=this.getUserIndex(t,o);this.setUserIndex(e,o,s)}const r=this.selected(t);r!==this.selected(e)&&(r?this.select(e):this.unselect(e))}splitSegmentAxisAware(t,s,n,i,r){let o=0;const a=this.getNextVertex(t);a===gr&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const h=this.getVertexIndex(t),u=this.getVertexIndex(a),m=this.getSegmentFromIndex(h);let l=this.m_vertices.getShortestDistance(h,u);const c=this.getPathFromVertex(t),g=this.m_bHasAttributes;g&&m&&(l=m.calculateLength2D());const d=this.getSegmentParentage(t),_=this.getHelperPoint();if(m){let t=0,e=0,r=gr;for(let p=0;p<n;p++){const n=s[p];if(t<n&&n<1){const s=m.cut(t,n);if(null!==i&&(p>0&&s.setStartXY(i[p-1]),s.setEndXY(i[p]),s.normalizeAfterEndpointChange(),e=p),g){const t=l>0?m.calculateSubLengthFromStart(n)/l:0;this.m_vertices.interpolateTwoVertices(h,u,t,_)}_.setXY(s.getEndXY()),r=this.insertVertex(c,a,_),o++;const f=this.getPrevVertex(r),P=this.getVertexIndex(f);this.setSegmentToIndex(P,s),-1!==d&&this.setSegmentParentageAndBreak(r,d,!1),t=n}}if(r!==gr){const s=m.cut(t,1);null!==i&&(s.setStartXY(i[e]),s.normalizeAfterEndpointChange());const n=this.getVertexIndex(r);this.setSegmentToIndex(n,s)}}else{let t=0;for(let e=0;e<n;e++){const n=s[e];if(t<n&&n<1){this.m_vertices.interpolateTwoVertices(h,u,n,_);const t=this.insertVertex(c,a,_);o++,-1!==d&&this.setSegmentParentageAndBreak(t,d,!1)}t=n}}return o}splitSegment(t,e,s,n=null){return this.splitSegmentAxisAware(t,e,s,n,-1)}snapControlPoints(t,s,n){this.getNextVertex(t)===gr&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");let i=t,r=!1;for(let e=0;e<s;++e){const t=this.getVertexIndex(i),e=this.getSegmentFromIndex(t);if(e){const t=e.snapControlPoints(n);r||=t}i=this.getNextVertex(i)}return r}snapControlPointsOnSelection(t){if(!this.hasCurves())return!1;let e=0;const s=this.queryVertexIteratorOnSelection();for(let n=s.next();n!==gr;n=s.next()){const s=this.getVertexIndex(n),i=this.getSegmentFromIndex(s);i&&(e|=i.snapControlPoints(t)?1:0)}return 0!==e}calculateSubLength2D(t,e,n){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}setPoint(t,e,s){if(this.setPointOnly(t,e),null!==this.m_segments){const n=this.getVertexIndex(t),i=this.getSegmentFromIndex(n);null!==i&&(i.setStartXY(e.getXY()),i.normalizeAfterEndpointChange(),s&&i.ensureXYMonotone());const r=this.getPrevVertex(t);if(r!==gr){const t=this.getVertexIndex(r),n=this.getSegmentFromIndex(t);null!==n&&(n.setEndXY(e.getXY()),n.normalizeAfterEndpointChange(),s&&n.ensureXYMonotone())}}}setPointEx(t,e,s,n,i){this.setPoint(t,e,i);const r=this.getVertexIndex(t);this.setWeightWithIndex(r,n),this.setRankWithIndex(r,s)}setPointOnly(t,e){const s=this.getVertexIndex(t);this.m_vertices.setPointByValNoCurves(s,e)}setPointOnlyEx(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}queryPoint(t,e){const s=this.getVertexIndex(t);this.m_vertices.getPointByVal(s,e)}setXY(t,e){this.setXYCoords(t,e.x,e.y)}setXYCoords(t,e,s){const n=this.getVertexIndex(t);if(this.m_vertices?.setXYCoordsNoCurves(n,e,s),null!==this.m_segments){const i=this.getSegmentFromIndex(n);null!==i&&(i.setStartXYCoords(e,s),i.normalizeAfterEndpointChange());const r=this.getPrevVertex(t);if(r!==gr){const t=this.getVertexIndex(r),n=this.getSegmentFromIndex(t);null!=n&&(n.setEndXYCoords(e,s),n.normalizeAfterEndpointChange())}}}setXYMonotonic(t,e,s){const n=this.getVertexIndex(t);if(this.m_vertices.setXYCoordsNoCurves(n,e,s),null!==this.m_segments){const i=this.getSegmentFromIndex(n);if(null!==i){const t=i.getEndXY();
1i.setCoordsForIntersector(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(e,s),t,!1),i.ensureXYMonotone()}const r=this.getPrevVertex(t);if(r!==gr){const t=this.getVertexIndex(r),n=this.getSegmentFromIndex(t);if(null!==n){const t=n.getStartXY();n.setCoordsForIntersector(t,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(e,s),!1),n.ensureXYMonotone()}}}}setXYMonotonicPoint2D(t,e){this.setXYMonotonic(t,e.x,e.y)}queryXY(t,e){const s=this.getVertexIndex(t);return this.m_vertices.queryXY(s,e)}getXY(t){const e=this.getVertexIndex(t);return this.m_vertices.getXY(e)}getXYWithIndex(t){return this.m_xyStream.readPoint2D(2*t)}static setSegDefault(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setXYZ(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setXYZCoords(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}queryXYZ(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getXYZ(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f.getNAN()}getXYZWithIndex(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f.getNAN()}mergeVertexDescription(t){this.m_verticesMp.mergeVertexDescription(t),this.m_vertexDescription=this.m_verticesMp.getDescription(),this.m_bHasAttributes=this.m_vertexDescription.getAttributeCount()>1}addAttribute(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getAttributeAsDbl(t,e,s){return this.m_vertices.getAttributeAsDbl(t,this.getVertexIndex(e),s)}queryAttributeAsDbl(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setAttribute(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}setAttributeInt(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getVertexDescription(){return this.m_vertexDescription}getMinPathVertexY(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getVertexIndex(t){return this.m_vertexIndexList.getField(t,0)}getY(t){const e=this.getVertexIndex(t);return this.m_vertices.queryXY(e,this.m_workPoint2D),this.m_workPoint2D.y}getX(t){return this.getXY(t).x}isEqualXY(t,e){return this.queryXY(t,this.m_workPoint2D),this.queryXY(e,this.m_workPoint2_2D),this.m_workPoint2D.isEqualPoint2D(this.m_workPoint2_2D)}isEqualXYPoint2D(t,e){return this.queryXY(t,this.m_workPoint2D),this.m_workPoint2D.isEqualPoint2D(e)}isEqualXYZPoint3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}setWeight(t,e){e<1&&(e=1);const s=1===e;if(null==this.m_weights){if(s)return;this.m_weights=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(this.m_vertices.getPointCount(),1)}const n=this.getVertexIndex(t);if(n>=this.m_weights.size()){if(s)return;this.m_weights.resize(n+1,1)}this.m_weights.write(n,e)}setWeightWithIndex(t,e){e<1&&(e=1);const s=1===e;if(null===this.m_weights){if(s)return;this.m_weights=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(this.m_vertices.getPointCount(),1)}if(t>=this.m_weights.size()){if(s)return;this.m_weights.resize(t+1,1)}this.m_weights.write(t,e)}getWeight(t){if(null===this.m_weights)return 1;const e=this.getVertexIndex(t);return e>=this.m_weights.size()?1:this.m_weights.read(e)}getWeightWithIndex(t){return null===this.m_weights||t>=this.m_weights.size()?1:this.m_weights.read(t)}getRank(t){if(null===this.m_ranks)return dr;const e=this.getVertexIndex(t);return e>=this.m_ranks.size()?dr:this.m_ranks.read(e)}getRankWithIndex(t){return null===this.m_ranks||t>=this.m_ranks.size()?dr:this.m_ranks.read(t)}setRank(t,e){e<dr&&(e=dr);const s=e===dr;if(null===this.m_ranks){if(s)return;this.m_ranks=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(this.m_vertices.getPointCount(),dr)}const n=this.getVertexIndex(t);if(n>=this.m_ranks.size()){if(s)return;this.m_ranks.resize(n+1,dr)}this.m_ranks.write(n,e)}setRankWithIndex(t,e){e<dr&&(e=dr);const s=e===dr;if(null===this.m_ranks){if(s)return;this.m_ranks=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(this.m_vertices.getPointCount(),dr)}if(t>=this.m_ranks.size()){if(s)return;this.m_ranks.resize(t+1,dr)}this.m_ranks.write(t,e)}setSegmentWeight(t,e){e<1&&(e=1);const s=1===e;if(null===this.m_segmentWeights){if(s)return;this.m_segmentWeights=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(this.m_vertices.getPointCount(),1)}const n=this.getVertexIndex(t);if(n>=this.m_segmentWeights.size()){if(s)return;this.m_segmentWeights.resize(n+1,1)}this.m_segmentWeights.write(n,e)}setSegmentWeightWithIndex(t,e){e<1&&(e=1);const s=1===e;if(null==this.m_segmentWeights){if(s)return;this.m_segmentWeights=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.G)(this.m_vertices.getPointCount(),1)}if(t>=this.m_segmentWeights.size()){if(s)return;this.m_segmentWeights.resize(t+1,1)}this.m_segmentWeights.write(t,e)}getSegmentWeight(t){if(null===this.m_segmentWeights)return 1;const e=this.getVertexIndex(t);return e>=this.m_segmentWeights.size()?1:this.m_segmentWeights.read(e)}getSegmentWeightWithIndex(t){return null==this.m_segmentWeights||t>=this.m_segmentWeights.size()?1:this.m_segmentWeights.read(t)}getSegmentRank(t){if(null===this.m_segmentRanks)return yr.st_defaultRank;const e=this.getVertexIndex(t);return e>=this.m_segmentRanks.size()?yr.st_defaultRank:this.m_segmentRanks.read(e)}getSegmentRankWithIndex(t){return null===this.m_segmentRanks||t>=this.m_segmentRanks.size()?dr:this.m_segmentRanks.read(t)}setSegmentRank(t,e){e<dr&&(e=dr);const s=e===dr;if(null===this.m_segmentRanks){if(s)return;this.m_segmentRanks=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(this.m_vertices.getPointCount(),dr)}const n=this.getVertexIndex(t);if(n>=this.m_segmentRanks.size()){if(s)return;this.m_segmentRanks.resize(n+1,dr)}this.m_segmentRanks.write(n,e)}setSegmentRankWithIndex(t,e){e<dr&&(e=dr);const s=e===dr;if(null===this.m_segmentRanks){if(s)return;this.m_segmentRanks=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.D)(this.m_vertices.getPointCount(),dr)}if(t>=this.m_segmentRanks.size()){if(s)return;this.m_segmentRanks.resize(t+1,dr)}
vendor: 19,159 bytes, line 1
1this.m_segmentRanks.write(t,e)}removeWeights(){this.m_weights=null,this.m_segmentWeights=null}removeRanks(){this.m_ranks=null,this.m_segmentRanks=null}setUserIndex(t,e,s){const n=this.m_indices[e],i=this.getVertexIndex(t);if(n.size()<=i){if(-1===s)return;n.resize(this.m_vertices.getPointCount(),-1)}n.write(i,s)}getUserIndex(t,e){const s=this.getVertexIndex(t),n=this.m_indices[e];if(s<n.size()){return n.read(s)}return-1}addToUserIndex(t,e,s){const n=this.m_indices[e],i=this.getVertexIndex(t);n.size()<=i&&n.resize(this.m_vertices.getPointCount(),-1);const r=n.read(i);n.write(i,r+s)}createUserIndex(){for(let e=0;e<this.m_indices.length;e++)if(null===this.m_indices[e])return this.m_indices[e]=this.allocateIndex(),e;this.m_indices.push(this.allocateIndex());const t=this.m_indices.length-1;return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()),t}createUserIndexUninitialized(){for(let e=0;e<this.m_indices.length;e++)if(null===this.m_indices[e])return this.m_indices[e]=this.allocateIndex(!1),e;this.m_indices.push(this.allocateIndex(!1));const t=this.m_indices.length-1;return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<=Number.MAX_SAFE_INTEGER),t}fillUserIndexForGeometry(t,e,s){const n=this.m_indices[e],i=n.size();for(let r=this.getFirstPath(t);r!==gr;r=this.getNextPath(r)){let t=this.getFirstVertex(r);for(let e=0,o=this.getPathSize(r);e<o;e++,t=this.getNextVertex(t)){const e=this.getVertexIndex(t);e<i&&n.write(e,s)}}}fillUserIndexForSelection(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}removeUserIndex(t){for(this.recycleUserIndex(this.m_indices[t]),this.m_indices[t]=null;this.m_indices.length>0&&null===this.m_indices[this.m_indices.length-1];)this.m_indices.pop()}replaceCurveWithLine(t){if(null!==this.m_segments){const e=this.getVertexIndex(t);this.setSegmentToIndex(e,null)}}queryLineConnector(t,e,s=!1){const n=this.getNextVertex(t);if(n===gr)return!1;if(!this.m_bHasAttributes||s){const s=this.getXY(t);e.setStartXY(s);const i=this.getXY(n);e.setEndXY(i)}else{const s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:this.getVertexDescription()});this.queryPoint(t,s),e.setStart(s),this.queryPoint(n,s),e.setEnd(s)}return!0}queryLineConnector3D(t,e,n=!1){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}hasCurves(){return null!==this.m_segments}geometryHasCurves(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}pathHasCurves(t){if(!this.hasCurves())return!1;const e=this.getFirstVertex(t);if(e===gr)return!1;const s=this.getPathSize(t);let n=e;for(let r=0;r<s;r++,n=this.getNextVertex(n)){const t=this.getSegment(n);if(null!==t&&t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)return!0}return!1}insertPath(t,s){let n=gr;s!==gr?(t!==this.getGeometryFromPath(s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),n=this.getPrevPath(s)):n=this.getLastPath(t);const i=this.newPath(t);return s!==gr&&this.setPrevPath(s,i),this.setNextPath(i,s),this.setPrevPath(i,n),n!==gr?this.setNextPath(n,i):this.setFirstPath(t,i),s===gr&&this.setLastPath(t,i),this.setGeometryPathCount(t,this.getPathCount(t)+1),i}removePath(t){const e=this.getPrevPath(t),s=this.getNextPath(t),n=this.getGeometryFromPath(t);return e!==gr?this.setNextPath(e,s):this.setFirstPath(n,s),s!==gr?this.setPrevPath(s,e):this.setLastPath(n,e),this.clearPath(t),this.setGeometryPathCount(n,this.getPathCount(n)-1),this.freePath(t),s}clearPath(t){const e=this.getFirstVertex(t);if(e!==gr){let s=e;for(let e=0,i=this.getPathSize(t);e<i;e++){const t=s;s=this.getNextVertex(s),this.freeVertex(t)}const n=this.getGeometryFromPath(t);this.setGeometryVertexCount(n,this.getPointCount(n)-this.getPathSize(t))}this.setPathSize(t,0)}getNextPath(t){return this.m_pathIndexList.getField(t,2)}getPrevPath(t){return this.m_pathIndexList.getField(t,1)}getPathSize(t){return this.m_pathIndexList.getField(t,3)}isClosedPath(t){return!!(1&this.getPathFlags(t))}setClosedPath(t,e){if(this.isClosedPath(t)===e)return;if(this.getPathSize(t)>0){const s=this.getFirstVertex(t),n=this.getLastVertex(t);if(e){this.setNextVertex(n,s),this.setPrevVertex(s,n);const t=this.getVertexIndex(n);this.setSegmentToIndex(t,null)}else{this.setNextVertex(n,gr),this.setPrevVertex(s,gr);const t=this.getVertexIndex(n);this.setSegmentToIndex(t,null)}}const s=(1|this.getPathFlags(t))-1;this.setPathFlags(t,s|(e?1:0))}closeAllPaths(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}isStrongPathStart(t){return!!(8&this.getPathFlags(t))}isStrongPathEnd(t){return!!(16&this.getPathFlags(t))}setStrongPathStart(t,e){const s=(8|this.getPathFlags(t))-8;this.setPathFlags(t,s|(e?8:0))}setStrongPathEnd(t,e){const s=(16|this.getPathFlags(t))-16;this.setPathFlags(t,s|(e?16:0))}getGeometryFromPath(t){return this.m_pathIndexList.getField(t,7)}isExterior(t){return!!(2&this.getPathFlags(t))}setExterior(t,e){const s=(2|this.getPathFlags(t))-2;this.setPathFlags(t,s|(e?2:0))}getRingArea(t){if(this.isRingAreaValid(t))return this.m_pathAreas[this.getPathIndex(t)];const e=this.getFirstVertex(t);if(e===gr)return 0;const s=this.getXY(e),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.K(0),r=this.getPathSize(t);if(r>2){const t=s.clone(),i=t.x,o=t.y;let a=this.getNextVertex(e);const h=this.getXY(a);a=this.getNextVertex(a);const u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();for(let e=2;e<r;e++,a=this.getNextVertex(a))this.queryXY(a,u),n.pe((u.x-t.x)*(h.y-o)),t.setCoordsPoint2D(h),h.setCoordsPoint2D(u);n.pe((i-t.x)*(h.y-o))}if(this.hasCurves()){let t=e;for(let e=0;e<r;e++,t=this.getNextVertex(t)){const e=this.getSegment(t);if(null===e||e.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)continue;const s=2*e.calculateArea2DHelper();n.pe(s)}}this.setRingAreaValid(t,!0);const o=.5*n.getResult();return this.m_pathAreas[this.getPathIndex(t)]=o,o}getPathIndexInternal(t){return this.getPathIndex(t)}getPathInternalIndexFromVertex(t){return this.getPathIndex(this.getPathFromVertex(t))}setPathUserIndex(t,e,s){const n=this.m_pathindices[e],i=this.getPathIndex(t);n.size()<this.m_pathAreas.length&&n.resize(this.m_pathAreas.length,-1),n.write(i,s)}getPathUserIndex(t,e){const s=this.getPathIndex(t),n=this.m_pathindices[e];return s<n.size()?n.read(s):-1}createPathUserIndex(){for(let e=0;e<this.m_pathindices.length;e++)if(null===this.m_pathindices[e])return this.m_pathindices[e]=this.allocatePathIndex(),e;this.m_pathindices.push(this.allocatePathIndex());const t=this.m_pathindices.length-1;return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t>=0&&t<=Number.MAX_SAFE_INTEGER),t}fillPathUserIndexForGeometry(t,e,s){const n=this.m_pathindices[e],i=n.size();for(let r=this.getFirstPath(t);r!==gr;r=this.getNextPath(r)){const t=this.getPathIndex(r);t<i&&n.write(t,s)}}removePathUserIndex(t){for(this.recyclePathUserIndex(this.m_pathindices[t]),this.m_pathindices[t]=null;this.m_pathindices.length>0&&null===this.m_pathindices.at(-1);)this.m_pathindices.pop()}movePath(t,s,n){if(n===gr&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),s===n)return;const i=this.getNextPath(n);let r=this.getPrevPath(n);const o=this.getGeometryFromPath(n);r===gr?this.setFirstPath(o,i):this.setNextPath(r,i),i===gr?this.setLastPath(o,r):this.setPrevPath(i,r),this.setGeometryVertexCount(o,this.getPointCount(o)-this.getPathSize(n)),this.setGeometryPathCount(o,this.getPathCount(o)-1),r=s===gr?this.getLastPath(t):this.getPrevPath(s),this.setPrevPath(n,r),this.setNextPath(n,s),s===gr?this.setLastPath(t,n):this.setPrevPath(s,n),r===gr?this.setFirstPath(t,n):this.setNextPath(r,n),this.setGeometryVertexCount(t,this.getPointCount(t)+this.getPathSize(n)),this.setGeometryPathCount(t,this.getPathCount(t)+1),this.setPathGeometry(n,t)}addVertex(t,e){this.m_vertices.getPointByVal(this.getVertexIndex(e),this.getHelperPoint());return this.insertVertex_(t,gr,this.getHelperPoint(),!1)}insertVertex(t,e,s){return this.insertVertex_(t,e,s,!0)}removeVertex(t,e){const s=this.getPathFromVertex(t),n=this.getPrevVertex(t),i=this.getNextVertex(t);n!==gr&&this.setNextVertex(n,i);const r=this.getPathSize(s);t===this.getFirstVertex(s)&&this.setFirstVertex(s,r>1?i:gr),i!==gr&&this.setPrevVertex(i,n),t===this.getLastVertex(s)&&this.setLastVertex(s,r>1?n:gr);if(this.hasCurves()&&n!==gr&&i!==gr){const s=this.getVertexIndex(t),r=this.getVertexIndex(n),o=this.getVertexIndex(i);if(e){const t=this.getSegmentFromIndex(r);if(null!==t){const e=this.m_vertices.getXY(o);t.setEndXY(e),t.normalizeAfterEndpointChange()}this.setSegmentToIndex(s,null)}else{const t=this.getSegmentFromIndex(s);if(this.setSegmentToIndex(s,null),null!==t){const e=this.m_vertices.getXY(r);t.setStartXY(e),t.normalizeAfterEndpointChange()}this.setSegmentToIndex(r,t)}}this.setPathSize(s,r-1);const o=this.getGeometryFromPath(s);return this.setGeometryVertexCount(o,this.getPointCount(o)-1),this.freeVertex(t),i}removeVertices(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t!==e);const n=this.getPathFromVertex(t),i=this.getPrevVertex(t),r=this.getPrevVertex(e);i!==gr&&this.setNextVertex(i,e);let o=this.getPathSize(n);const a=this.getVertexIndex(t);this.setSegmentToIndex(a,null),this.setPrevVertex(e,i),this.setPrevVertex(t,gr),this.setNextVertex(r,gr);let h=0,u=t;const m=this.getFirstVertex(n);let l=!1;for(;;){const t=this.getNextVertex(u);if(l||=m===u,this.freeVertex(u),h++,u===r)break;u=t}o-=h,l&&this.setFirstVertex(n,o>0?e:gr),this.setPathSize(n,o);const c=this.getGeometryFromPath(n);this.setGeometryVertexCount(c,this.getPointCount(c)-h)}getFirstVertex(t){return this.m_pathIndexList.getField(t,4)}getLastVertex(t){return this.m_pathIndexList.getField(t,5)}getNextVertex(t){return this.m_vertexIndexList.getField(t,2)}getPrevVertex(t){return this.m_vertexIndexList.getField(t,1)}getNextVertexEx(t,e){return e>0?this.m_vertexIndexList.getField(t,2):this.m_vertexIndexList.getField(t,1)}getPrevVertexEx(t,e){return e>0?this.m_vertexIndexList.getField(t,1):this.m_vertexIndexList.getField(t,2)}getPathFromVertex(t){return this.m_vertexIndexList.getField(t,3)}addPoint(t,e){return this.insertVertex_(t,gr,e,!1)}getGeometryFromVertex(t){return this.getGeometryFromPath(this.getPathFromVertex(t))}replaceNaNs(t,e){this.m_vertexDescription.hasAttribute(t)||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),this.m_vertices.replaceNaNs(t,e)}removeNaNVertices(){for(let t=this.getFirstGeometry();t!==gr;t=this.getNextGeometry(t))for(let e=this.getFirstPath(t);e!==gr;e=this.getNextPath(e)){let t=this.getFirstVertex(e);for(let s=0,n=this.getPathSize(e);s<n;s++)t=this.getXY(t).isFinite()?this.getNextVertex(t):this.removeVertex(t,!0)}}queryVertexIterator(t=gr){return this.queryVertexIteratorEx(!1,t)}queryVertexIteratorEx(t,e=gr){let s=gr,n=gr,i=gr,r=gr,o=0,a=!1;for(s=e!==gr?e:this.getFirstGeometry();s!==gr;s=this.getNextGeometry(s))if(!t||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(this.getGeometryType(s))){for(n=this.getFirstPath(s);n!==gr;n=this.getNextPath(n))if(i=this.getFirstVertex(n),r=i,o=0,i!==gr){a=!0;break}if(a||e!==gr)break}return a||(s=gr),fr.create_(this,s,n,i,r,o,t,!1,e!==gr)}queryVertexIteratorOnSelection(t=gr){return this.m_selection?fr.create_(this,t,gr,gr,gr,-1,!1,!0,t!==gr):this.queryVertexIteratorEx(!1,t)}hasSelection(){return this.m_selection}createEmptySelection(){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}removeSelection(){this.m_selection&&(this.m_selectedVertices.length=0,this.removeUserIndex(this.m_selectionIndex),this.m_selectionIndex=-1,this.m_selection=!1,this.m_selectedCount=0)}select(t){return!!this.selected(t)||(this.setUserIndex(t,this.m_selectionIndex,this.m_selectedVertices.length),this.m_selectedVertices.push(t),this.m_selectedCount++,!1)}unselect(t){if(!this.m_selection)return;const e=this.getUserIndex(t,this.m_selectionIndex);e>=0&&(this.m_selectedVertices[e]=gr,this.setUserIndex(t,this.m_selectionIndex,-1),this.m_selectedCount--)}selected(t){return!this.m_selection||this.selected_(t)}getSelectedCount(){return this.m_selection?this.m_selectedCount:this.getTotalPointCount()}createSelectionForCrackingAndClustering(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}peelALoop(t,e){this.peelALoop_(t,e,!1)}peelALoopIntoAPath(t,e){return this.peelALoop_(t,e,!0)}applyTransformation(t){if(this.m_verticesMp.applyTransformation(t),null!==this.m_segments)for(let e=0,s=this.m_segments.length;e<s;e++)this.m_segments[e]&&this.m_segments[e].applyTransformation(t)}setGeometryType(t,e){this.m_geometryIndexList.setField(t,2,e)}splitSegmentWithIntersector(t,e,s,n,i){n?this.splitSegmentForward(t,e,s,!0,i):this.splitSegmentBackward(t,e,s,!0,i)}setPrevVertex(t,e){this.m_vertexIndexList.setField(t,1,e)}setNextVertex(t,e){this.m_vertexIndexList.setField(t,2,e)}setPathToVertex(t,e){this.m_vertexIndexList.setField(t,3,e)}setPathSize(t,e){this.m_pathIndexList.setField(t,3,e)}setFirstVertex(t,e){this.m_pathIndexList.setField(t,4,e)}setLastVertex(t,e){this.m_pathIndexList.setField(t,5,e)}getSegment(t){if(null!=this.m_segments){const e=this.getVertexIndex(t);return this.getSegmentFromIndex(e)}return null}isCurve(t){if(null===this.m_segments)return!1;const e=this.getVertexIndex(t);return this.m_segments.length>e&&null!==this.m_segments[e]}querySegment(t,e,s=!0,n=!1){const i=this.getNextVertex(t);if(i===gr)return!1;const r=this.getSegment(t);if(!r)return!s&&(this.queryLineConnector(t,e.createLine(),n),!0);if(e.copyFrom(r,!0),n)return!0;if(this.m_vertexDescription.getAttributeCount()>1){const s=this.getHelperPoint();this.queryPoint(t,s),e.get().setStart(s),this.queryPoint(i,s),e.get().setEnd(s)}return!0}getSegmentFromIndex(t){const e=null!==this.m_segments&&this.m_segments.length>t?this.m_segments[t]:null;return e||null}getAndClearSegmentFromIndex(t){const e=null!==this.m_segments&&this.m_segments.length>t?this.m_segments[t]:null;return e||null}setSegmentToIndex(t,e){if(this.m_hasForceSetEnvelope=0,null===this.m_segments){if(!e)return;this.m_segments=[],this.m_segments.length=this.m_vertices.getPointCount()}t>=this.m_segments.length&&(this.m_segments.length=t+1),this.m_segments[t]=e}setGeometryPathCount(t,e){this.m_geometryIndexList.setField(t,6,e)}setGeometryVertexCount(t,e){this.m_geometryIndexList.setField(t,5,e)}ringParentageCheckInternal(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}reverseRingInternal(t){const e=this.hasCurves(),s=this.hasSegmentParentage();let n=null,i=-1,r=t;if(e){const t=this.getVertexIndex(r);n=this.getAndClearSegmentFromIndex(t)}s&&(i=this.getSegmentParentage(r));do{const t=this.getPrevVertex(r),o=this.getNextVertex(r);if(this.setNextVertex(r,t),this.setPrevVertex(r,o),e){const t=this.getVertexIndex(o),e=this.getSegmentFromIndex(t);n&&n.reverse(),this.setSegmentToIndex(t,n),n=e}if(s){const t=this.getSegmentParentage(o);this.setSegmentParentagePreserveBreak(o,i),i=t}r=o}while(r!==t);this.dbgVerifyIntegrity(t)}setTotalPointCount(t){this.m_pointCount=t}removePathOnly(t){const e=this.getPrevPath(t),s=this.getNextPath(t),n=this.getGeometryFromPath(t);e!==gr?this.setNextPath(e,s):this.setFirstPath(n,s),s!==gr?this.setPrevPath(s,e):this.setLastPath(n,e),this.setFirstVertex(t,gr),this.setLastVertex(t,gr),this.freePath(t)}insertClosedPath(t,e,s,n,i){const r=this.insertPath(t,gr);let o=0,a=s;for(i[0]=!1;;){a===n&&(i[0]=!0),this.setPathToVertex(a,r),o++;const t=this.getNextVertex(a);if(t===s)break;a=t}return this.setClosedPath(r,!0),this.setPathSize(r,o),i[0]&&(s=n),this.setFirstVertex(r,s),this.setLastVertex(r,this.getPrevVertex(s)),this.setRingAreaValid(r,!1),r}findVertex2D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}findVertex3D(t,e,n){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}dbgVerifyMonotone(){}dbgCheckSelection(){}dbgVerifySegment(t){}dbgVerifyIntegrity(t,e=!0){}dbgVerifyVertexCounts(){}dbgVerifyCurves(){}dbgDumpGeometry(t,e){}getNextNthVertex(t,e){if(0===e)return t;let s=t;for(let n=0;n<e;++n)if(s=e>0?this.getNextVertex(s):this.getPrevVertex(s),s===gr)return gr;return s}removeVertexInternal(t,e){const s=this.getPrevVertex(t),n=this.getNextVertex(t);s!==gr&&this.setNextVertex(s,n),n!==gr&&this.setPrevVertex(n,s);if(this.hasCurves()&&s!==gr&&n!==gr){const i=this.getVertexIndex(t),r=this.getVertexIndex(s),o=this.getVertexIndex(n);if(e){const t=this.getSegmentFromIndex(r);if(null!==t){const e=this.m_vertices.getXY(o);t.setEndXY(e),t.normalizeAfterEndpointChange()}this.setSegmentToIndex(i,null)}else{const t=this.getSegmentFromIndex(i);if(this.setSegmentToIndex(i,null),null!==t){const e=this.m_vertices.getXY(r);t.setStartXY(e),t.normalizeAfterEndpointChange()}this.setSegmentToIndex(r,t)}}return this.freeVertex(t),n}isRingAreaValid(t){return!!(4&this.getPathFlags(t))}setRingAreaValid(t,e){const s=(4|this.getPathFlags(t))-4;this.setPathFlags(t,s|(e?4:0))}compareVerticesSimpleY(t,e){return this.queryXY(t,this.m_workPoint2D),this.queryXY(e,this.m_workPoint2_2D),this.m_workPoint2D.compare(this.m_workPoint2_2D)}compareVerticesSimpleY3D(t,e){return this.getXYZ(t).compare(this.getXYZ(e))}compareVerticesSimpleX(t,e){return this.getXY(t).compareX(this.getXY(e))}sortVerticesSimpleByYHeapMerge(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}sortVerticesSimpleByY(t,e,s){this.m_bucketSort.sort(t,e,s,new _r(this))}sortVerticesSimpleByX(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}sortVerticesSimpleByY3D(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}snapVertexForPoleClipping(t,e){const s=this.getPrevVertex(t);s!==gr&&this.replaceCurveWithLine(s);this.getNextVertex(t)!==gr&&this.replaceCurveWithLine(t);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryXY(t,n),n.y=e,this.setXY(t,n)}setSegmentParentageAndBreak(t,e,n=!0){if(-1===this.m_segmentParentageIndex){if(-1===e)return;this.m_segmentParentageIndex=this.createUserIndex()}e>=0&&((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e<=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)()>>1),e<<=1,e|=n?1:0),this.setUserIndex(t,this.m_segmentParentageIndex,e)}setSegmentParentagePreserveBreak(t,e){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e>=-1),-1===this.m_segmentParentageIndex){if(-1===e)return;this.m_segmentParentageIndex=this.createUserIndex()}if(e>=0){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e<=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)()>>1),e<<=1;e|=this.getSegmentParentageBreakVertex(t)?1:0}this.setUserIndex(t,this.m_segmentParentageIndex,e)}getSegmentParentage(t){if(-1===this.m_segmentParentageIndex)return-1;const e=this.getUserIndex(t,this.m_segmentParentageIndex);return e<0?e:e>>1}getOriginalSegmentInfo(t){if(-1!==this.m_segmentParentageIndex){const e=this.getSegmentParentage(t);return new Pr(e)}return new Pr(-1)}setSegmentParentageBreakVertex(t,e){if(-1===this.m_segmentParentageIndex)return;let s=this.getUserIndex(t,this.m_segmentParentageIndex);s<0||!!(1&s)!==e&&(e?s|=1:s&=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.j)()>>1<<1,this.setUserIndex(t,this.m_segmentParentageIndex,s))}getSegmentParentageBreakVertex(t){if(-1===this.m_segmentParentageIndex)return!0;const e=this.getUserIndex(t,this.m_segmentParentageIndex);return e<0||!!(1&e)}isDiscontinuousSegmentParentage(t){const e=this.getPrevVertex(t);if(e===gr)return!1;
1return this.getSegmentParentage(e)!==this.getSegmentParentage(t)}setCurveStitcherPointer(t){this.m_curveStitcher=t}hasSegmentParentage(){return-1!==this.m_segmentParentageIndex}deleteSegmentParentage(){-1!==this.m_segmentParentageIndex&&(this.removeUserIndex(this.m_segmentParentageIndex),this.m_segmentParentageIndex=-1),this.m_curveStitcher=null}clearSegments(){this.m_segments=null}}function xr(t){if(t.isEmpty())return new mr({vd:t.getDescription()});if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(t.getGeometryType())&&t.hasNonLinearSegments())return vr(t);const e=t.getImpl(),s=e.getPointCount();if(s<=2){if(1===s||e.getXY(0).equals(e.getXY(1))){const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:e.getDescription()});return e.getPointByVal(0,t),t}{const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,s=new Qs({vd:e.getDescription()});return e.getPointByVal(0,t),s.startPathPoint(t),e.getPointByVal(1,t),s.lineToPoint(t),s}}const n=e.getAttributeStreamRef(0),i=new Ar({stream:n,n:s});let r=0,o=1;const a=n.readPoint2D(r<<1),h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(;o<s&&n.queryPoint2D(o<<1,h).equals(a);)o++;if(i.m_treeHull.addElement(r),o<s){i.m_treeHull.addBiggestElement(o);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let s=o+1;s<e.getPointCount();s++){n.queryPoint2D(s<<1,t);const e=i.treeHull(t);-1!==e&&i.m_treeHull.setElement(e,s)}}const u=e.getDescription(),m=u.getAttributeCount()>1,l=i.m_treeHull.size();let g=null;if(l>=2){g=l>=3?new mr({vd:u}):new Qs({vd:u});const t=g.getImpl();t.reserve(i.m_treeHull.size()),t.addPathPoint2D(null,0,!0);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let r=i.m_treeHull.getFirst();-1!==r;r=i.m_treeHull.getNext(r))if(m){const s=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;e.getPointByVal(i.m_treeHull.getElement(r),s),t.insertPoint(0,-1,s)}else n.queryPoint2D(i.m_treeHull.getElement(r)<<1,s),t.insertPoint2D(0,-1,s)}else if(m){const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P({vd:u});e.getPointByVal(i.m_treeHull.getElement(i.m_treeHull.getFirst()),t),g=t}else{const t=n.readPoint2D(i.m_treeHull.getElement(i.m_treeHull.getFirst())<<1);g=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P(t)}return g}function Cr(t,e,s,n=!1){if(e<=262144)return Mr(t,e,s,n);const i=new Ar({points:t,n:e}),r=0;let o=1;const a=t[r];for(;o<e&&t[o].equals(a);)o++;if(i.m_treeHull.addElement(r),o<e){i.m_treeHull.addBiggestElement(o);for(let s=o+1;s<e;s++){const e=t[s],n=i.treeHull(e);-1!==n&&i.m_treeHull.setElement(n,s)}}let h=0;for(let u=i.m_treeHull.getFirst();-1!==u;u=i.m_treeHull.getNext(u))s[h++]=i.m_treeHull.getElement(u);return h}function vr(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.hasNonLinearSegments()&&!t.isEmpty());const e=new Ar;return e.addGeometry(t),e.getBoundingGeometry()}function br(t,s,n){if((s<0||s>=t.getPathCount())&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("path index"),t.hasNonLinearSegmentsPath(s))return!1;const i=t.getImpl(),r=i.getPathStart(s),o=i.getPathEnd(s),a=!i.isClosedPath(s)&&i.isClosedPathInXYPlane(s),h=i.getAttributeStreamRef(0),u=2*r;let m=2*o;if(a&&(m-=2),m-u<6)return!0;const l=h.readPoint2D(u),c=h.readPoint2D(u+2),g=h.readPoint2D(u+4);if(!Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(c,g,l)))return!1;const d=c.clone(),_=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let e=u+6;e<m;e+=2){_.assign(c),c.assign(g),h.queryPoint2D(e,g);if(!Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(c,g,l)))return!1;if(!Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(d,g,l)))return!1;if(!Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(c,g,_)))return!1}return!0}function Sr(t,e,s){t.setNAN(),e.setCoords(1,0),s.setCoords(0,0)}function Er(t,e,s,n,r){if(Sr(s,n,r),t.isEmpty())return;if(t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPoint)return void s.assign(t.getXY());const o=t,a=o.getPointCount();0!==a&&(1!==a?Dr(o,a,e,s,n,r):s.assign(o.getXY(0)))}function Dr(t,e,s,n,i,r){if(2===e){const e=t.getXY(0),s=t.getXY(1);n.assign(e.add(s).mul(.5));const o=s.sub(e);i=qr(o),r.setCoords(.5*o.length(),0)}else{let o=Number.MAX_VALUE;const a=[0,1,0,0],h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.R(4,2);for(h.set(0,0,0),h.set(0,1,1),h.set(1,0,1),h.set(1,1,2);a[0]<e;++a[0],Fr(h,0,e)){a[1]===a[0]&&(++a[1],Fr(h,1,e));for(let s=1;;++s){for(;;){const n=Vr(t.getXY(h.get(0,0)),t.getXY(h.get(0,1)),t.getXY(h.get(s,0)),t.getXY(h.get(s,1)),2^s);if(n>0)break;if(++a[s],Fr(h,s,e),0===n)break}if(3===s)break;a[s+1]<a[s]&&(a[s+1]=a[s],h.set(s+1,0,h.get(s,0)),h.set(s+1,1,h.get(s,1)))}const u=t.getXY(h.get(0,0)).add(t.getXY(h.get(2,0))).mul(.5),m=qr(t.getXY(h.get(0,1)).sub(t.getXY(h.get(0,0)))),l=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;let c,g;if(l.x=Math.max(0,m.dotProduct(t.getXY(h.get(1,0)).sub(t.getXY(h.get(3,0))))),l.y=Math.max(0,m.crossProduct(t.getXY(h.get(0,0)).sub(t.getXY(h.get(2,0))))),s?(c=l.x*l.y,g=c<o):(c=l.y,g=c<o),g){o=c;const e=t.getXY(h.get(1,0)),s=t.getXY(h.get(3,0)),a=e.add(s).mul(.5).sub(u);n.assign(u.add(m.mul(m.dotProduct(a)))),i.assign(m),r.assign(l)}}r.mulThis(.5),r.x<r.y&&(r.y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(r.x,r.x=r.y),i.leftPerpendicularThis())}i.y<0?i.negateThis():0===i.y&&(i.x=1)}yr.st_defaultRank=1;class wr{constructor(t){this.m_handleP=-1,this.m_handleQ=-1,this.m_currentSupport=-1,this.m_area=0,this.m_bDone=!0,(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),this.m_convexHull=t,this.m_function=this.done_}next(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}get_vertex_handle_p(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}get_vertex_handle_q(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}get_current_support(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getNext(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getPrev(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}intialize_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}increment_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}increment_q_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}increment_p_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}parallel_edge_with_q_support_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}parallel_edge_with_p_support_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}done_(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}}class Ar{nullGetXY(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("m_getXY is null"),{}}nullDeleteNode(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("m_deleteNode is null")}constructor(t){return this.m_treeHull=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.T,this.m_shape=null,this.m_stream=null,this.m_points=null,this.m_geometryHandle=-1,this.m_pathHandle=-1,this.m_getXY=this.nullGetXY,this.m_deleteNode=this.nullDeleteNode,t?t.stream?(this.m_treeHull.setCapacity(Math.min(20,t.n)),this.m_stream=t.stream,this.m_getXY=this.getXYStream,this.m_deleteNode=this.deleteNodeStream,this.m_points=null,this.m_geometryHandle=gr,void(this.m_pathHandle=gr)):t.points?(this.m_treeHull.setCapacity(Math.min(20,t.n)),this.m_points=t.points,this.m_getXY=this.getXYPoints,this.m_deleteNode=this.deleteNodePoints,this.m_stream=null,this.m_geometryHandle=gr,void(this.m_pathHandle=gr)):void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.q)("unrecognized constructor parameter"):(this.m_treeHull.setCapacity(20),this.m_shape=new yr,this.m_geometryHandle=this.m_shape.createGeometry(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumMultiPoint),this.m_pathHandle=this.m_shape.insertPath(this.m_geometryHandle,gr),this.m_getXY=this.getXYShape,this.m_deleteNode=this.deleteNodeShape,this.m_stream=null,void(this.m_points=null))}getXYShape(t){return this.m_shape.getXY(t)}getXYStream(t){return this.m_stream.readPoint2D(t<<1)}getXYPoints(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P}deleteNodeShape(t){const e=this.m_treeHull.getElement(t);this.m_treeHull.deleteNode(t),this.m_shape.removeVertex(e,!1)}deleteNodeStream(t){this.m_treeHull.deleteNode(t)}deleteNodePoints(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}
1addGeometry(s){if(s.isEmpty())return;const n=s.getGeometryType();if(n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumGeometryCollection){const t=s;for(let e=0,s=t.getGeometryCount();e<s;e++)this.addGeometry(t.getGeometry(e))}else (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.i)(n)?this.addMultiVertexGeometry(s):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.f)(n)?this.addSegment(s,!1):n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEnvelope?this.addEnvelope(s):n===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPoint?this.addPoint(s):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Convex_hull: geometry not supported")}getBoundingGeometry(){const t=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,e=this.m_treeHull.getFirst(),s=new mr({vd:this.m_shape.getVertexDescription()});if(0===this.m_treeHull.size())return s;s.reserve(this.m_treeHull.size()),this.m_shape.queryPoint(this.m_treeHull.getElement(e),t),s.startPathPoint(t);for(let n=this.m_treeHull.getNext(e);-1!==n;n=this.m_treeHull.getNext(n))this.m_shape.queryPoint(this.m_treeHull.getElement(n),t),s.lineToPoint(t);return s}getAntipodalPairsIterator(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),new wr(this)}getXY(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P}getXYWithIndex(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P}getFirst(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getLast(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getNext(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getPrev(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getVertexIndex(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getPointCount(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}addMultiVertexGeometry(t){const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,s=t.getImpl(),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let i=0;i<t.getPointCount();i++){s.queryXY(i,n);const r=this.addPoint2D(n);if(-1!==r){t.getPointByVal(i,e);const s=this.m_shape.addPoint(this.m_pathHandle,e);this.m_treeHull.setElement(r,s)}}if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(t.getGeometryType())){const e=t;if(e.hasNonLinearSegments()){const t=e.querySegmentIterator();for(;t.nextPath();)for(;t.hasNextSegment();){const e=t.nextCurve();null!==e&&this.addSegment(e,!0)}}}}
1addEnvelope(t){const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P;for(let s=0;s<4;s++){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCorner(s,n);const i=this.addPoint2D(n);if(-1!==i){t.queryCornerByVal(s,e);const n=this.m_shape.addPoint(this.m_pathHandle,e);this.m_treeHull.setElement(i,n)}}}static querySegmentControlPoints(t,n,r){const o=t.getGeometryType();if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(o!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine),o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const e=t,s=60*Math.PI/180,i=Math.abs(e.getSweepAngle());if(i>s){const t=Math.min(6,Math.ceil(i/s)),r=1/t,o=new Pm;e.queryStart(n[0]);let a=1;for(let s=0;s<t;s++){e.queryCut(s*r,(s+1)*r,o);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);ku(o.get(),i);const h=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(i,3),u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(i,2),m=h>0?u/h:.5;s<t-1?o.get().queryEnd(n[a+1]):e.queryEnd(n[a+1]),_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[a-1],n[a+1],m,n[a]),n[a].setXY(i[1]),a+=2}return a}{const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);ku(t,e);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(e,3);t.queryStart(n[0]),t.queryEnd(n[2]);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(e,2),r=s>0?i/s:.5;return _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[0],n[2],r,n[1]),n[1].setXY(e[1]),3}}if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier){const e=t,s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);e.queryControlPoints(s);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,4),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,2),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,3);t.queryStart(n[0]),t.queryEnd(n[3]);const a=i>0?r/i:.5;_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[0],n[3],a,n[1]),n[1].setXY(s[1]);const h=i>0?o/i:.5;return _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[0],n[3],h,n[2]),n[2].setXY(s[2]),4}if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2){const e=t,s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(s);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,3);t.queryStart(n[0]),t.queryEnd(n[2]);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,2),o=i>0?r/i:.5;return _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[0],n[2],o,n[1]),n[1].setXY(s[1]),3}if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2){const e=t,s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(s);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,3);t.queryStart(n[0]),t.queryEnd(n[2]);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateLength(s,2),o=i>0?r/i:.5;return _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P.lerp(n[0],n[2],o,n[1]),n[1].setXY(s[1]),3}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Convex_hull: segment type not supported")}addSegment(t,e){if(!e){const e=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,s=t.getStartXY(),n=this.addPoint2D(s);if(-1!==n){t.queryStart(e);const s=this.m_shape.addPoint(this.m_pathHandle,e);this.m_treeHull.setElement(n,s)}const i=t.getEndXY(),r=this.addPoint2D(i);if(-1!==r){t.queryEnd(e);const s=this.m_shape.addPoint(this.m_pathHandle,e);this.m_treeHull.setElement(r,s)}}if(t.isCurve()){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,13);for(let s=1,n=Ar.querySegmentControlPoints(t,e,e.length)-1;s<n;++s){const t=e[s].getXY(),n=this.addPoint2D(t);if(-1!==n){const t=this.m_shape.addPoint(this.m_pathHandle,e[s]);this.m_treeHull.setElement(n,t)}}}}addPoint(t){const e=t.getXY(),s=this.addPoint2D(e);if(-1!==s){const e=this.m_shape.addPoint(this.m_pathHandle,t);this.m_treeHull.setElement(s,e)}}addPoint2D(t){let e=-1;if(0===this.m_treeHull.size())return e=this.m_treeHull.addElement(-4),e;if(1===this.m_treeHull.size()){const s=this.m_treeHull.getElement(this.m_treeHull.getFirst()),n=this.m_shape.getXY(s);return t.equals(n)||(e=this.m_treeHull.addBiggestElement(-5)),e}return e=this.treeHull(t),e}treeHull(t){let e=-1;do{const s=this.m_treeHull.getFirst(),n=this.m_treeHull.getLast(),i=this.m_treeHull.getElement(s),r=this.m_treeHull.getElement(n),o=this.m_getXY(i),a=this.m_getXY(r),h=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust
vendor: 5,230 bytes, line 1
1(a,t,o);if(Yr(h)){e=this.m_treeHull.addBiggestElement(-1);const i=this.treeHullWalkBackward(t,n,s);i!==s&&this.treeHullWalkForward(t,s,this.m_treeHull.getPrev(i));break}if(Nr(h)){let i=this.m_treeHull.getRoot(),r=this.m_treeHull.getFirst(),a=this.m_treeHull.getLast(),h=-1,u=-1,m=-1;for(;r!==this.m_treeHull.getPrev(a);){u=this.m_treeHull.getElement(i);const e=this.m_getXY(u);Nr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(e,t,o))?(a=i,i=this.m_treeHull.getLeft(i)):(r=i,i=this.m_treeHull.getRight(i))}i=a,h=r,u=this.m_treeHull.getElement(i),m=this.m_treeHull.getElement(h);const l=this.m_getXY(u),c=this.m_getXY(m);if(h!==s){if(!Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(c,t,l)))break}e=this.m_treeHull.addElementAtPosition(h,i,-2,!0,!1),this.treeHullWalkForward(t,i,n),this.treeHullWalkBackward(t,h,s);break}{const i=Xr(t,a,o);if(-1===i){const i=this.m_treeHull.getPrev(n);this.m_treeHull.deleteNode(n),e=this.m_treeHull.addBiggestElement(-3),this.treeHullWalkBackward(t,i,s)}else if(1===i){const i=this.m_treeHull.getNext(s);this.m_treeHull.deleteNode(s),e=this.m_treeHull.addElementAtPosition(-1,i,-3,!0,!1),this.treeHullWalkForward(t,i,n)}break}}while(0);return e}treeHullWalkForward(t,e,s){if(e===s)return s;let n=e,i=this.m_treeHull.getElement(n),r=this.m_treeHull.getNext(n);const o=this.m_getXY(i);for(;n!==s&&this.m_treeHull.size()>2;){const e=this.m_treeHull.getElement(r),s=this.m_getXY(e);if(Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(s,t,o)))break;const a=n;n=r,i=e,o.assign(s),r=this.m_treeHull.getNext(n),this.m_deleteNode(a)}return n}treeHullWalkBackward(t,e,s){if(e===s)return s;let n=e,i=this.m_treeHull.getElement(n),r=this.m_treeHull.getPrev(n);const o=this.m_getXY(i);for(;n!==s&&this.m_treeHull.size()>2;){const e=this.m_treeHull.getElement(r),s=this.m_getXY(e);if(Yr(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(o,t,s)))break;const a=n;n=r,i=e,o.assign(s),r=this.m_treeHull.getPrev(n),this.m_deleteNode(a)}return n}}function Tr(t,e,s){const n=e.sub(t),i=s.sub(e);if(0===n.x)return i.x>0?-1:0;if(0===n.y)return i.y>0?1:i.y<0?-1:0;const r=n.crossProduct(i),o=4*Number.EPSILON*(Math.abs(i.x*n.y)+Math.abs(i.y*n.x));return r>o?1:r<-o?-1:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(t,e,s)}function Ir(t,e,s){const n=e.sub(t),i=s.sub(e);if(0===n.x)return i.x<0?-1:0;if(0===n.y)return i.y>0?-1:i.y<0?1:0;const r=n.crossProduct(i),o=4*Number.EPSILON*(Math.abs(i.x*n.y)+Math.abs(i.y*n.x));return r>o?1:r<-o?-1:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(t,e,s)}function Mr(t,e,s,n){const i=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.a(0);for(let h=0;h<e;h++)i.add(h);const r={userSort(e,s,n){n.sort(e,s,(e,s)=>t[e].compareX(t[s]))},getValue:e=>t[e].x};n||_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.B.sortEx(i,0,e,r);let o=0;t:for(let h=0;h<e;++h){const e=i.read(h);for(;o>=2;){const n=s[o-2],r=s[o-1];if(t[r].equals(t[e])){i.write(h,-1);continue t}if(!(Tr(t[n],t[r],t[e])>=0)){r===i.read(h-1)&&i.write(h-1,-1);break}o--}s[o++]=e,2===o&&t[e].equals(t[s[0]])&&(i.write(1,-1),o--)}const a=o+1;t:for(let h=e-2;h>=0;--h){const e=i.read(h);if(!(e<0)){for(;o>=a;){const n=s[o-2],i=s[o-1];if(t[i].equals(t[e]))continue t;if(!(Ir(t[n],t[i],t[e])>=0))break;o--}if(0!==h){const n=s[o-1];s[o++]=e,t[e].equals(t[n])&&o--}}}return o>1&&t[s[0]].equals(t[s[o-1]])&&o--,o}function Yr(t){return t<0}function Nr(t){return t>0}function Xr(t,e,s){let n=-1;if(e.y===s.y)n=0;else if(e.x===s.x)n=1;else{n=Math.abs(e.x-s.x)>=Math.abs(e.y-s.y)?0:1}let i=-1;return i=e[n]<s[n]?t[n]<e[n]?-1:s[n]<t[n]?1:0:e[n]<t[n]?-1:t[n]<s[n]?1:0,i}function qr(t){return(t=t.clone()).divThis(Math.max(Math.abs(t.x),Math.abs(t.y))),t.normalize(),t}function Fr(t,e,s){t.inc(e,0)===s&&t.set(e,0,0),t.inc(e,1)===s&&t.set(e,1,0)}function Vr(t,s,n,i,r){switch(r){case 0:break;case 1:s.rightPerpendicularThis(),t.rightPerpendicularThis();break;case 2:s.negateThis(),t.negateThis();break;case 3:s.leftPerpendicularThis(),t.leftPerpendicularThis();break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("")}return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobustEx(t,s,n,i)}class Lr{constructor(){this.length=Number.NaN,this.specialPoints=[]}specialPointsCount(){return this.specialPoints.length}}function Rr(t){return zr(t.calculateUpperLength2D())}function zr(t){return 256*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*t}function Br(t){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),t.getEndXY()),s=t.calculateUpperLength2D();return s-e<=8*Number.EPSILON*s}function kr(t,e,s=!1){e[1].setCoords(t.m_cp[0].x-t.getStartX(),t.m_cp[0].y-t.getStartY()),e[1].mulThis(3),e[2].setCoords(t.m_cp[1].x-t.m_cp[0].x,t.m_cp[1].y-t.m_cp[0].y),e[2].mulThis(3),e[3]=t.getEndXY().sub(t.getStartXY()),e[3].subThis(e[2]),e[2].subThis(e[1]),s?e[0].setCoords(0,0):e[0]=t.getStartXY()}function Gr(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),jr(n,e,s)}function Wr(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),Zr(n,e,s)}function jr(t,e,s){let n=t[1].x;
1n-=t[0].x,n*=3;let i=t[2].x;i-=t[1].x,i*=3;let r=t[3].x;r-=t[0].x,r-=i,i-=n,e[3].setWithEps(r),e[2].setWithEps(i),e[1].setWithEps(n),s?e[0].set(0):e[0].set(t[0].x)}function Zr(t,e,s){let n=t[1].y;n-=t[0].y,n*=3;let i=t[2].y;i-=t[1].y,i*=3;let r=t[3].y;r-=t[0].y,r-=i,i-=n,e[3].setWithEps(r),e[2].setWithEps(i),e[1].setWithEps(n),s?e[0].set(0):e[0].set(t[0].y)}function Hr(t,e,s=!1){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);n[0].assignPoint2D(t[0]),n[1].assignPoint2D(t[1]),n[2].assignPoint2D(t[2]),n[3].assignPoint2D(t[3]),e[1].setCoords(n[1].x.sub(n[0].x),n[1].y.sub(n[0].y)),e[1].mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(3)),e[2].setCoords(n[2].x.sub(n[1].x),n[2].y.sub(n[1].y)),e[2].mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructInt32(3)),e[3]=n[3].sub(n[0]),e[3]=e[3].sub(e[2]),e[2]=e[2].sub(e[1]),s?e[0].setCoords(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ah):e[0]=n[0].clone()}function Ur(t,e,s){if(s){if(e<0)return e;if(e>1)return e-1+Ur(t,1,!1)}if(t.isDegenerate(0))return 0;const n=1===e,i=Jr(t);if(n&&!Number.isNaN(i.length)&&!Number.isNaN(i.length))return i.length;const r=Rr(t),o=r/t.calculateUpperLength2D();let a=0,h=0;for(let u=1,m=i.specialPointsCount();u<m;u++){const s=i.specialPoints[u];if(a+=ta(t,h,Math.min(e,s),o,r),e<=s)break;h=s}return n&&(i.length=a),a}function Or(t,e,s){const n=Ur(t,1,!1);if(e<=0)return e;if(e>=n)return e-n+1;const i=[0];return 1!==en(new Ko(t,e),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),1,i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),i[0]}function Qr(t,s,n){void 0===n&&(n=s,s=0);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(s<0||n>1)return i.setNAN(),i;if(s>n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("calculate_sub_weightedCentroid"),s===n||t.isDegenerate(0))return i.setCo
1ords(0,0),i;const r=Jr(t),o=Rr(t),a=o/t.calculateUpperLength2D();let h=s,u=0;for(let e=1,m=r.specialPointsCount();e<m;e++)if(s<r.specialPoints[e]){u=e-1;break}i.setCoords(0,0);for(let e=u+1,m=r.specialPointsCount();e<m;e++){const s=Math.min(r.specialPoints[e],n),u=ea(t,h,s,a,o);if(i.addThis(u),h=s,n<=r.specialPoints[e])break}return i.add(t.getStartXY().mul(t.calculateLength2D()))}function Jr(t){if(t.m_cachedValues)return t.m_cachedValues;const e=new Lr,s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,8),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n);const i=Zo(n,s);e.specialPoints=[];for(let r=0;r<i;r++)e.specialPoints.push(s[r].value());return $r(t,e),e}function Kr(t){let e=null;return e=t.m_cachedValues,e}function $r(t,e){t.m_cachedValues=e}function to(t){t.m_cachedValues=null}function eo(t,e){e.m_cachedValues=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_cachedValues,t.m_cachedValues=e.m_cachedValues)}function so(t,e,s,n){if(e.isEqual(t.m_XStart,t.m_YStart)&&s.isEqual(t.m_XEnd,t.m_YEnd))return;const i=!!n&&t.isMonotoneQuickAndDirty(),r=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T,o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);o[0].setCoords(t.m_XStart,t.m_YStart),o[2].setCoords(t.m_XEnd,t.m_YEnd);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;a.setSub(o[2],o[0]),a.leftPerpendicularThis(),o[1].setAdd(o[0],a);const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);h[0].setCoordsPoint2D(e),h[2].setCoordsPoint2D(s),a.setSub(h[2],h[0]),a.leftPerpendicularThis(),h[1].setAdd(h[0],a),r.setFromTwoTriangles(o,h)?r.transformPoints2D(t.m_cp,2,t.m_cp):((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e,s,1/3,t.m_cp[0]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e,s,2/3,t.m_cp[1])),t.changeEndPoints2D(e,s),i&&co(t)}function no(t,e,s,n,i){return{tmin:t,tmax:e,t:s,d:n,pt:i.clone()}}function io(t,e,s,n){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(i);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(18,NaN),o=en(new Lo(i,e,NaN),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(s,n),18,r),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2D(s,a);let h=s,u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(a,e);const m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2D(n,m);const l=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(m,e);l<u&&(u=l,h=n,a.assign(m));for(let c=0;c<o;c++){t.queryCoord2D(r[c],m);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(m,e);s<u&&(u=s,h=r[c],a.assign(m))}return no(s,n,h,u,a)}function ro(t,e){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);Gr(t,n,!0);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);Wr(t,i,!0);const r=n[3].clone(),o=n[2].clone(),a=n[1].clone(),h=i[3].clone(),u=i[2].clone(),m=i[1].clone(),l=o.mulE(a).addE(u.mulE(m)).mul(4),c=o.mulE(o).mul(8).addE(r.mulE(a).mul(12)).addE(u.mulE(u).mul(8).addE(h.mulE(m).mul(12))),g=r.mulE(o).addE(h.mulE(u)).mul(36),d=r.mulE(r).addE(h.mulE(h)).mul(36),_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3),p=_n(d,g,c,l,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,_);if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(p<=3),p>0){const s=mo(t,1,0).sqrLength(),n=mo(t,1,1).sqrLength();let i=s;e.set(0),i<n&&(i=n,e.set(1));for(let r=0;r<p;r++){const s=mo(t,1,_[r].value()).sqrLength();s<i&&(i=s,e=_[r])}}}function oo(t,e,s,n){if(1===e){const e=1-s,i=e*e,r=s*s,o=t[1].sub(t[0]),a=t[2].sub(t[1]),h=t[3].sub(t[2]),u=o.mul(i).add(a.mul(2*e*s)).add(h.mul(r));n.assign(u.mul(3))}else if(2===e){const e=1-s,i=t[2].sub(t[1]).sub(t[1].sub(t[0])),r=t[3].sub(t[2]).sub(t[2].sub(t[1])),o=i.mul(e).add(r.mul(s));n.assign(o.mul(6))}else if(3===e){const e=t[2].sub(t[1]),s=t[3].sub(e.mul(3)).sub(t[0]);n.assign(s.mul(6))}else n.setCoords(0,0)}function ao(t,e,s,n){{const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.I.subE(s),i=e.sqr(),r=s.sqr(),o=t[1].subE(t[0]).mulE(i).addE(t[2].subE(t[1]).mulE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(2).mulE(e).mulE(s))).addE(t[3].subE(t[2]).mulE(r));n.setE(o.mulE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(3)))}}function ho(t,e,s){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return oo(t,e,s,n),n}function uo(t,e,s){const n=[Ne.constructPoint2D(t[0]),Ne.constructPoint2D(t[1]),Ne.constructPoint2D(t[2]),Ne.constructPoint2D(t[3])],i=new Ne;return ao(n,e,s,i),i}function mo(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return t.queryControlPoints(n),ho(n,e,s)}function lo(t){const e=t.m_cp[0].sub(t.getStartXY()),s=t.m_cp[1].sub(t.m_cp[0]),n=t.getEndXY().sub(t.getStartXY());e.mulThis(3),s.mulThis(3),n.subThis(s),s.subThis(e);return(3*n.x*(2*s.y+5*e.y)-3*n.y*(2*s.x+5*e.x)+10*(s.x*e.y-s.y*e.x))/60}function co(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(e);const s=go(e);return s&&(t.m_cp[0].setCoordsPoint2D(e[1]),t.m_cp[1].setCoordsPoint2D(e[2]),t.afterCompletedModification()),s}function go(t){return Ve(t)}function _o(t){return Le(t)}function po(t,e,s){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e<=.5?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[0],t[1],e,n),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[1],t[2],e,i),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[2],t[3],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,n,i,e,o),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,o,a,e,s)):((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[0],t[1],e,n),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[1],t[2],e,i),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[2],t[3],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,n,i,e,o),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,o,a,e,s))}function fo(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e>=0&&e<=1);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,u=ne
1w _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e<=.5?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[0],t[1],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[1],t[2],e,o),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[2],t[3],e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,r,o,e,h),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,o,a,e,u),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,h,u,e,m)):((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[0],t[1],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[1],t[2],e,o),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[2],t[3],e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,r,o,e,h),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,o,a,e,u),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,h,u,e,m));const l=t[3].clone();n&&(n[0].assign(t[0]),n[1].assign(r),n[2].assign(h),n[3].assign(m)),i&&(i[0].assign(m),i[1].assign(u),i[2].assign(a),i[3].assign(l))}function Po(t,e,n,i){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e>=0&&n<=1&&e<=n),e===n){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return yo(t,e,s),i[0].assign(s),i[1].assign(s),i[2].assign(s),void i[3].assign(s)}if(0===e&&1===n){for(let e=0;e<4;++e)i[e].assign(t[e]);return}const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);fo(t,n,r,null),fo(r,n>0?e/n:0,null,r),yo(t,e,r[0]),yo(t,n,r[3]),i[0].setCoordsPoint2D(r[0]),i[1].setCoordsPoint2D(r[1]),i[2].setCoordsPoint2D(r[2]),i[3].setCoordsPoint2D(r[3])}function yo(t,e,s,n){if(n){if(e<0){return void ps(new fm({start:t[0],end:t[0].add(vo(t,0).getUnitVector())}),e,s)}if(e>1){return void ps(new fm({start:t[3],end:t[3].add(vo(t,1).getUnitVector())}),e-1,s)}}if(e<=.5){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[0],t[1],e,n);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[1],t[2],e,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[2],t[3],e,r);const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,n,i,e,o);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,o,a,e,s)}else{const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[0],t[1],e,n);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[1],t[2],e,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[2],t[3],e,r);const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,n,i,e,o);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,o,a,e,s)}}function xo(t,e,s){if(e.value()<=.5){const n=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,Ne.constructPoint2D(t[0]),Ne.constructPoint2D(t[1]),e,n);const i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,Ne.constructPoint2D(t[1]),Ne.constructPoint2D(t[2]),e,i);const r=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,Ne.constructPoint2D(t[2]),Ne.constructPoint2D(t[3]),e,r);const o=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,n,i,e,o);const a=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,o,a,e,s)}else{const n=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,Ne.constructPoint2D(t[0]),Ne.constructPoint2D(t[1]),e,n);const i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,Ne.constructPoint2D(t[1]),Ne.constructPoint2D(t[2]),e,i);const r=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,Ne.constructPoint2D(t[2]),Ne.constructPoint2D(t[3]),e,r);const o=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,n,i,e,o);const a=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,i,r,e,a),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,o,a,e,s)}}function Co(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),xo(n,e,s)}function vo(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e,0,1);let n=ho(t,1,s);return n.isZero()&&(n=ho(t,2,s),n.isZero()?n=ho(t,3,s):1===s&&n.negateThis()),n}function bo(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),So(n,e,s)}function So(t,e,s){e.value()<0&&e.set(0,e.eps()),e.value()>1&&e.set(1,e.eps()),s.setE(uo(t,1,e))}function Eo(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==Io(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function Do(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==Mo(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function wo(t,e,s,n,i){if(i){if(0!==hm(e,s))return 2}else if(Re(e,s))return 1;return 0!==Yo(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function Ao(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==No(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function To(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==Xo(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function Io(t,e,s,n,i,r,o,a,h,u){if(null!==i&&(i.length=0),null!=r&&(r.length=0),null!==n&&(n.length=0),s.isDegenerate(0)){const t=[0,0,0],a=e.intersectPoint(s.getStartXY(),t,o);if(a>0){if(null!==i)for(let e=0;e<a;e++)i.push(t[e]);if(null!==r)for(let t=0;t<a;t++)r.push(0);if(null!=n)for(let s=0;s<a;s++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(t[s],i),n.push(i)}}return a}const m=os(e,s);if(as(e,s,o=Math.max(o,m)))return 0;const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);kr(e,l);const c=s.getEndXY();c.subThis(s.getStartXY());const g=c.clone();g.leftPerpendicularThis();let d=3*l[3].dotProduct(g),_=2*l[2].dotProduct(g),p=l[1].dotProduct(g);const f=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(15,Number.NaN),P=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(15,Number.NaN);let y=nn(d,_,p,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,f);y<0&&(f[0]=0,f[1]=1,y=2);let x,C=0;for(let S=0,E=C;S<y;++S){const t=e.getCoord2D(f[S+E]);P[C]=s.getClosestCoordinate(t,!1),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,s.getCoord2D(P[C]))<=o&&(f[C]=f[S+E],
1C++)}if(l[0].subThis(s.getStartXY()),Math.abs(c.x)>=Math.abs(c.y)){const t=c.y/c.x;d=l[3].y-l[3].x*t,_=l[2].y-l[2].x*t,p=l[1].y-l[1].x*t,x=l[0].y-l[0].x*t}else{const t=c.x/c.y;d=l[3].x-l[3].y*t,_=l[2].x-l[2].y*t,p=l[1].x-l[1].y*t,x=l[0].x-l[0].y*t}const v=e.getEndXY().equals(s.getStartXY())||e.getEndXY().equals(s.getEndXY()),b=[0,0,0];y=rn(d,_,p,x,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),v,b);for(let S=0,E=C;S<y;++S){f[S+E]=b[S];const t=e.getCoord2D(f[S+E]);P[C]=s.getClosestCoordinate(t,!1);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,s.getCoord2D(P[C]))<=o&&(f[C]=f[S+E],C++)}y=e.intersectPoint(s.getStartXY(),b,o);for(let S=0;S<y;S++)f[C]=b[S],P[C++]=0;y=e.intersectPoint(s.getEndXY(),b,o);for(let S=0;S<y;S++)f[C]=b[S],P[C++]=1;return 0!==s.intersectPoint(e.getStartXY(),b,o)&&(P[C]=b[0],f[C++]=0),0!==s.intersectPoint(e.getEndXY(),b,o)&&(P[C]=b[0],f[C++]=1),0===C?0:gm(t,e,s,f,P,C,n,i,r,o,a,h,u)}function Mo(t,e,s,n,i,r,o,a,h,u){if(Eu(s)){return Io(t,e,new fm({start:s.getStartXY(),end:s.getEndXY()}),n,i,r,o,a,h,u)}const m=os(e,s);if(as(e,s,o=Math.max(o,m)))return 0;const l=[],c=[],g=[],d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);{e.queryControlPoints(d);const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),n=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;s.canonicToWorldTransformation(n);const i=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;i.setInvert(n),i.transformPoints2D(d,4,t);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);Hr(t,r);const h=[r[0].x,r[1].x,r[2].x,r[3].x],u=[r[0].y,r[1].y,r[2].y,r[3].y],m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);m[0].setDouble(s.getSemiMinorAxis()),m[0].sqrThis(),m[1].setDouble(s.getSemiMajorAxis()),m[1].sqrThis(),m[2].setThis(m[0]),m[2].mulThis(m[1]),m[2].negateThis();const _=Fn(h,3,u,3,null,0,m,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),c,a);if(_>0){let t=0;for(let n=0;n<_;n++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(c[n],i);const r=s.getClosestCoordinate(i,!1),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(r,a);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,a)<=o&&(l.push(i.clone()),c[t]=c[n],g.push(r),t++)}c.length=t,l.length=t}}const _=[0,1];for(let p=0;p<2;p++){const t=0===p?s.getStartXY():s.getEndXY(),e=[0];Ro(d,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,e);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(d,e[0],n);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n)<=o&&(c.push(e[0]),g.push(_[p]),l.push(n.clone()))}for(let p=0;p<2;p++){const t=[0,3];{const e=s.getClosestCoordinate(d[t[p]],!1),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(e,n);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(d[t[p]],n)<=o&&(c.push(_[p]),g.push(e),l.push(n.clone()))}}return gm(t,e,s,c,g,c.length,n,i,r,o,a,h,u)}function Yo(t,e,n,i,r,o,a,h,u,m){const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);e.queryControlPoints(l);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);if(n.queryControlPoints(c),hs(l,c,4)<0)return Yo(t,n,e,i,o,r,a,h,u,!m);const g=os(e,n);if(as(e,n,a=Math.max(a,g)))return 0;if(sa(e,n,i,r,o,a,h,u,m))return 2;const d=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),_=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);{const t=new we;Vo(l,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),t);const e=new we;Vo(c,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),e);const s=Math.max(t.maxDim(),e.maxDim());if(t.inflate(3*a),e.inflate(3*a),!t.intersectW(e))return 0;if(t.maxDim()<.1*s){if(Qo(l,t,d),d.isEmpty())return 0;if(Qo(c,t,_),_.isEmpty())return 0;Po(l,d.vmin,d.vmax,l),Po(c,_.vmin,_.vmax,c)}}const p=_m(l,3,c,3,a);if(0===p)return 0;const f=[],P=[],y=[];let x=!1;if(-1===p){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);Hr(l,t);const e=[t[0].x,t[1].x,t[2].x,t[3].x],s=[t[0].y,t[1].y,t[2].y,t[3].y],n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);Hr(c,n);const i=[],r=[],o=Nn(e,3,s,3,null,0,[n[0].x,n[1].x,n[2].x,n[3].x],3,[n[0].y,n[1].y,n[2].y,n[3].y],3,null,0,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),i,r,u);if(o>0)for(let h=0;h<o;h++){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(c,r[h],t);const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(l,i[h],e);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,t)<=a&&(f.push(e.clone()),y.push(r[h]),P.push(i[h]))}else-1===o&&(x=!0)}for(let s=0;s<2;s++){const t=0===s?l:c,e=0===s?c:l;for(let n=0;n<2;n++){const i=0===n?0:3,r=[0];Ro(e,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,r);const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(e,r[0],o);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[i],o)<=a&&(0===s?(P.push(0===i?0:1),y.push(r[0])):(y.push(0===i?0:1),P.push(r[0])),f.pu
1sh(o.clone()))}}if(0===P.length&&x){const t=e.calculateUpperLength2D()>n.calculateUpperLength2D();{const i=[0,0];if(2===Wo(t?e:n,i,!0)&&((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit().containsCoordinate(i[0])),!_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit().containsCoordinate(i[1]))){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t?l:c,i[0],e);const s=[0,0];1===Ro(t?c:l,e,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,2,s)&&(f.push(e.clone()),P.push(t?i[0]:s[0]),y.push(t?s[0]:i[0]))}}}if(0===P.length)return 0;if(!d.equalsRange(0,1))for(let s=0;s<P.length;++s)P[s]=ra.recalculateParentT(d.vmin,d.vmax,P[s]);if(!_.equalsRange(0,1))for(let s=0;s<y.length;++s)y[s]=ra.recalculateParentT(_.vmin,_.vmax,y[s]);return gm(t,e,n,P,y,P.length,i,r,o,a,h,u,m)}function No(t,e,n,i,r,o,a,h,u,m){const l=os(e,n);if(n.isDegenerateToLineHelper(l)){const s=new fm({start:n.getStartXY(),end:n.getEndXY()}),l=Io(t,e,s,i,r,o,a,h,u,m);if(o)for(let t=0;t<l;++t){const e=s.getCoord2D(o[t]);o[t]=n.getClosestCoordinate(e,!1)}return l}if(as(e,n,a=Math.max(a,l)))return 0;const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);e.queryControlPoints(c);const g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);n.queryControlPoints(g);const d=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),_=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),p=[0,0,0];n.queryWeights(p);const f=[1,Ph(p),1];{const t=new we;Vo(c,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),t);const e=new we;ja(g,f,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),e);const s=Math.max(t.maxDim(),e.maxDim());if(t.inflate(3*a),e.inflate(3*a),!t.intersectW(e))return 0;if(t.maxDim()<.1*s){if(Qo(c,t,d),d.isEmpty())return 0;if(fh(g,f,t,_),_.isEmpty())return 0;Po(c,d.vmin,d.vmax,c),Ja(g,f,_.vmin,_.vmax,g,f)}}const P=_m(c,3,g,2,a);if(0===P)return 0;const y=[],x=[],C=[];if(-1===P){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);Hr(c,t);const e=[t[0].x,t[1].x,t[2].x,t[3].x],s=[t[0].y,t[1].y,t[2].y,t[3].y],n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);uh(g,f,n,i,r);const o=[],h=[],m=Nn(n,2,i,2,r,2,e,3,s,3,null,0,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),h,o,u);if(m>0)for(let u=0;u<m;u++){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(c,o[u],t);const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(g,f,h[u],e);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e)<=a&&(y.push(t.clone()),x.push(o[u]),C.push(h[u]))}}for(let v=0;v<2;v++){let t,e;0===v?(t=c,e=g):(e=c,t=g);for(let n=0;n<2;n++){const i=0===n?0:t.length-1,r=[0],o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(0===v){const n=Ba(e,f,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,r);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===n),ph(e,f,r[0],o)}else{const n=Ro(e,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,r);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===n),yo(e,r[0],o)}_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[i],o)<=a&&(0===v?(x.push(0===i?0:1),C.push(r[0])):(C.push(0===i?0:1),x.push(r[0])),y.push(o.clone()))}}if(0===x.length)return 0;if(!d.equalsRange(0,1))for(let s=0;s<x.length;++s)x[s]=ra.recalculateParentT(d.vmin,d.vmax,x[s]);if(!_.equalsRange(0,1))for(let s=0;s<C.length;++s)C[s]=Dn.recalculateParentT(_.vmin,_.vmax,C[s]);for(let s=0;s<C.length;++s)C[s]=yh(p,C[s]);return gm(t,e,n,x,C,x.length,i,r,o,a,h,u,m)}function Xo(t,e,n,i,r,o,a,h,u,m){const l=os(e,n);if(as(e,n,a=Math.max(a,l)))return 0;const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);e.queryControlPoints(c);const g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);n.queryControlPoints(g);const d=_m(c,3,g,2,a);if(0===d)return 0;const _=[],p=[],f=[];if(-1===d){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);Hr(c,t);const s=[t[0].x,t[1].x,t[2].x,t[3].x],i=[t[0].y,t[1].y,t[2].y,t[3].y],r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);ji(g,r);const o=Nn([r[0].x,r[1].x,r[2].x],2,[r[0].y,r[1].y,r[2].y],2,null,0,s,3,i,3,null,0,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),f,p,h);if(o>0){let t=0;for(let s=0;s<o;s++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(p[s],i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;n.queryCoord2D(f[s],r);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,r)<=a&&(_.push(i.clone()),p[t]=p[s],f[t]=f[s],t++)}p.length=t,_.length=t}}for(let P=0;P<2;P++){let t,e;0===P?(t=c,e=g):(e=c,t=g);for(let n=0;n<2;
1n++){const i=0===n?0:t.length-1,r=[0],o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(0===P)bi(e,t[i],r),Zi(e,r[0],o);else{const n=Ro(e,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,r);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===n),yo(e,r[0],o)}_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[i],o)<=a&&(0===P?(p.push(0===i?0:1),f.push(r[0])):(f.push(0===i?0:1),p.push(r[0])),_.push(o.clone()))}}return gm(t,e,n,p,f,p.length,i,r,o,a,h,u,m)}function qo(t,e,i,r,o){const a=new we;if(Fo(t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),a),a.inflate(r),!a.isIntersectingPoint2D(e))return 0;const h=Jr(t);let u=0,m=h.specialPoints[0];const l=[];for(let n=1,c=h.specialPoints.length;n<c;++n){const i=h.specialPoints[n],r=io(t,e,m,i);if(0===l.length)l.push(r);else if(r.t===r.tmin)(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(l.at(-1).d<=r.d),l.at(-1).tmax=r.tmax;else if(l.at(-1).t===l.at(-1).tmax){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(l.at(-1).d>=r.d);const t=l.at(-1).tmin;l[l.length-1]=r,l.at(-1).tmin=t}else l.push(r);m=i}for(const s of l)if(s.d<=r){const t=s.t;i?(u>=i.length&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),i[u]=t,u++):u++}return u}function Fo(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n),Vo(n,e,s)}function Vo(t,e,s){if(e.equalsRange(0,1))return void s.setFromPoints(t,4);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Po(t,e.vmin,e.vmax,n),s.setFromPoints(n,4)}let Lo=class{constructor(t,e,s){this.dbgCounter=0,this.controlPoints=t,this.point=e.clone(),this.maxDistance=s}getMaxDerivative(){return 6}getValue(t,e){switch(t){case 0:{const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(this.controlPoints,e,t);const s=ho(this.controlPoints,1,e);return 2*t.sub(this.point).dotProduct(s)}case 1:{const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(this.controlPoints,e,t);const s=ho(this.controlPoints,1,e),n=ho(this.controlPoints,2,e);return 2*(t.sub(this.point).dotProduct(n)+s.dotProduct(s))}case 2:{const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(this.controlPoints,e,t);const s=ho(this.controlPoints,1,e),n=ho(this.controlPoints,2,e),i=ho(this.controlPoints,3,e);return 2*(t.sub(this.point).dotProduct(i)+3*s.dotProduct(n))}case 3:{const t=ho(this.controlPoints,1,e),s=ho(this.controlPoints,2,e),n=ho(this.controlPoints,3,e);return 2*(4*t.dotProduct(n)+3*s.sqrLength())}case 4:{const t=ho(this.controlPoints,2,e),s=ho(this.controlPoints,3,e);return 2*(10*t.dotProduct(s))}case 5:{const t=ho(this.controlPoints,3,e);return 2*(10*t.dotProduct(t))}default:return 0}}getError(t){return 0}isInterestingInterval(t,e){if(t>=0&&e<=1){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Po(this.controlPoints,t,e,s);const n=new we;if(n.setFromPoints(s,4),Math.sqrt(n.sqrMinDistance(this.point))>this.maxDistance)return!1}return!0}};function Ro(t,e,n,i,r,o,a){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.x)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit().contains(n)&&o>0,"getClosestCoordinate"),(r<0||Number.isNaN(r))&&(r=Number.MAX_VALUE);const h=[],u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,n.vmin,u);let m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e);if(m<=r&&h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(n.vmin,m)),n.vmin!==n.vmax&&(yo(t,n.vmax,u),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e),m<=r&&h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(n.vmax,m))),n.width()>0){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(18,Number.NaN),i=en(new Lo(t,e,r),n,18,s);for(let n=0;n<i;n++)yo(t,s[n],u),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e),m>r||h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(s[n],m))}if(i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n.equals(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit()));{yo(t,-1,u,!0);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,0,s);const n=new fm({start:u,end:s}),i=n.getClosestCoordinate(e,!0);i<1&&(u.assign(n.getCoord2D(i)),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e),m<=r&&h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(i-1,m)))}{yo(t,2,u,!0);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,n.vmax,s);
1const i=new fm({start:s,end:u}),o=i.getClosestCoordinate(e,!0);o>0&&(u.assign(i.getCoord2D(o)),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,e),m<=r&&h.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(1+o,m)))}}if(!h.length)return 0;h.sort((t,e)=>t.compare(e));let l=0;const c=h[0].x;if(a[l++]=c,l<o){const e=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.J)(t,4,!1).total(),s=h[0].y;for(let t=1,n=h.length;t<n;t++)if(h[t].y>s+e){h.length=t;break}h.sort((t,e)=>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t.x,e.x)),l=0,a[l++]=h[0].x;for(let t=1,n=h.length;t<n;t++)h[t].x!==a[l-1]&&l<o&&(a[l++]=h[t].x)}return l}function zo(t,e,s,n,i,r,o){const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return t.queryControlPoints(a),Ro(a,e,s,n,i,r,o)}function Bo(t){return t.getStartXY().norm(1)+t.getEndXY().norm(1)+t.m_cp[0].norm(1)+t.m_cp[1].norm(1)}function ko(t){return t[0].norm(1)+t[1].norm(1)+t[2].norm(1)+t[3].norm(1)}function Go(t,e,n){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>=2),2===n){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e[0],e[n-1],1/3,s);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e[0],e[n-1],2/3,i),void t.construct(e[0],s,i,e[n-1])}const i=e[0],r=e[n-1],o=[0,0],a=zo(t,i,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,Number.NaN,2,o),h=[0,0],u=zo(t,r,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,Number.NaN,2,h),m=[];for(let s=0;s<a;s++)for(let a=0;a<u;a++){const u=o[s],l=h[a],c=u>l,g=(s,o)=>{const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(n-2,Number.NaN),h=()=>{let t=0;for(let s=1,i=n-1;s<i;s++){t+=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[s-1],e[s]);const n=t;a[s-1]=n}t+=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[n-2],e[n-1]),c&&a.reverse();for(let e=1,s=n-1;e<s;e++)a[e-1]/=t,c&&(a[e-1]=1-a[e-1])};let m=!1,g=!1;{const e=new Pm;c?(t.queryCut(l,u,e,!0),s.assign(e.get().getControlPoint2()),o.assign(e.get().getControlPoint1())):(t.queryCut(u,l,e,!0),s.assign(e.get().getControlPoint1()),o.assign(e.get().getControlPoint2())),i.equals(s)&&(m=!0),r.equals(o)&&(g=!0)}h();let d=Number.MAX_VALUE;const _=s.clone(),p=o.clone();for(let t=0;t<5;t++){d=na(!0,!1,i,_,p,r,m,g,a,n-2,e,n)}for(let t=0;t<30;t++){const t=_.clone();p.clone();const s=na(!0,!0,i,_,p,r,m,g,a,n-2,e,n);if(d<=s&&t.equals(_)&&t.equals(p))break;d=s}h();let f=!1,P=Number.MAX_VALUE;const y=s.clone(),x=o.clone();for(let t=0;t<30;t++){const t=y.clone();x.clone();const s=na(f,!0,i,y,x,r,m,g,a,n-2,e,n);if(P<=s&&t.equals(y)&&t.equals(x))break;f=!0,P=s}return P<d?(s.assign(y),o.assign(x)):(s.assign(_),o.assign(p),P=d),P},d=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,_=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,p=[g(d,_),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,d)+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(d,_)+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(_,r),d.x,d.y,_.x,_.y];m.splice(m.length,0,...p)}let l=m[0],c=m[1],g=0;for(let s=6;s<m.length;s+=6)m[s]<l&&(l=m[s],c=m[s+1],g=s);let d=g;for(let s=0;s<m.length;s+=6)s!==g&&m[s+1]<c&&Math.abs(l-m[s])<10*l&&(c=m[s+1],d=s);t.construct(i,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(m[d+2],m[d+3]),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(m[d+4],m[d+5]),r)}function Wo(t,e,s=!1){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(n);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,4);let r,o,a;Hr(n,i,!0);const h=i[3].x.isZero(),u=i[3].y.isZero();if(h||u)if(h&&!u){if(i[2].x.isZero())return 0;r=i[1].x.div(i[2].x).negate(),o=i[2].y.div(i[3].y),a=i[1].y.div(i[3].y)}else{if(h||!u)return 0;if(i[2].y.isZero())return 0;r=i[1].y.div(i[2].y).negate(),o=i[2].x.div(i[3].x),a=i[1].x.div(i[3].x)}else{i[2].x.divThis(i[3].x),i[1].x.divThis(i[3].x),i[2].y.divThis(i[3].y),i[1].y.divThis(i[3].y);const t=i[2].x.sub(i[2].y);if(t.isZero())return 0;r=i[1].x.sub(i[1].y).div(t).negate(),o=i[2].x.clone(),a=i[1].x.clone()}
1if(!s&&r.abs().value()>2)return 0;const m=[0,0],l=t.getStartXY().equals(t.getEndXY()),c=nn(1,-r.toDouble(),r.add(o).mul(r).add(a).toDouble(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),l,m);if(0===c)return 0;if(m[0]>=0&&m[0]<=1){const t=r.toDouble()-m[0];if(s||t>=0&&t<=1)return e[0]=m[0],e[1]=t,e[0]>e[1]&&(e[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[0],e[0]=e[1])),2}if(2===c&&m[1]>=0&&m[1]<=1){const t=r.toDouble()-m[1];if(s||t>=0&&t<=1)return e[0]=m[1],e[1]=t,e[0]>e[1]&&(e[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[0],e[0]=e[1])),2}return 0}function jo(t,e,s){const n=t[1].mulE(e[2]).subThisE(t[2].mulE(e[1])),i=t[1].mulE(e[3]).subThisE(t[3].mulE(e[1])).mulThis(3),r=t[2].mulE(e[3]).subThisE(t[3].mulE(e[2])).mulThis(3),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let a=dn(r,i,n,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,o);a<0&&(a=0);let h=0;for(let u=0;u<a;u++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(o[u].value(),0,1)||(s[h].setE(o[u]),h++);return h}function Zo(t,e){e[0].set(0);let n=1;const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);jr(t,i,!0);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);Zr(t,r,!0);{const t=i[3].mul(3),s=i[2].mul(2),r=i[1].clone(),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let a=dn(t,s,r,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,o);a<0&&(a=0);for(let i=0;i<a;i++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(o[i].value(),0,1)||(e[n]=o[i],n++)}{const t=r[3].mul(3),s=r[2].mul(2),i=r[1].clone(),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let a=dn(t,s,i,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,o);a<0&&(a=0);for(let r=0;r<a;r++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(o[r].value(),0,1)||(e[n]=o[r],n++)}if(n+=jo(i,r,e.slice(n)),e[n].set(1),n++,n>2){(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(e,0,n,(t,e)=>{const s=t.value(),n=e.value();return s<n?-1:s>n?1:0});let s=0;const i=e[0].clone();let r=0;const o=ko(t)*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)(),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;po(t,e[0].value(),a);for(let h=1;h<n;h++){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(po(t,e[h].value(),n),e[h].eq(i)||n.isEqualPoint2D(a,o)){if(0!==s){if(0===e[h].eps())i.setE(e[h]),r=0;else if(0!==r){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(1/e[h].eps()),s=1/r,n=t+s;i.set((e[h].value()*t+i.value()*s)/n),r=1/n,i.setError(Math.sqrt(r))}e[s].setE(i),po(t,i.value(),a)}}else s++,e[s].setE(e[h]),i.setE(e[h]),po(t,i.value(),a),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(e[h].eps())}s++,n=s}return 1===n&&(n=2,e[1].set(1)),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0===e[0].value()),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===e[n-1].value(
vendor: 10,550 bytes, line 1
1)),n}function Ho(t,e,s,n,i){const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,3),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);let h=0;if(e){if(Zr(t,r,!1),h=_n(r[3],r[2],r[1],r[0].sub(s),a,!1,o),n)for(let u=0;u<h;u++){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,o[u].value(),e),n[u]=e.x}}else if(jr(t,r,!1),h=_n(r[3],r[2],r[1],r[0].sub(s),a,!1,o),n)for(let u=0;u<h;u++){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,o[u].value(),e),n[u]=e.y}if(i)for(let u=0;u<h;u++)i[u]=o[u].value();else n&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(n,0,h,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7);return h}function Uo(t,e,s,n){const i=Oo(t,e,s,n.getEnvelope2D());if(i.isEmpty())return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(i);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,s);for(let a=0;a<s;++a)n.xyRot(t[a],r[a]);const o=Oo(r,e,s,n.getRotatedEnvelope2D());return i.intersect(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(o)),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(i)}function Oo(t,e,s,n){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,s);for(let a=0;a<s;++a)i[a]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(a/(s-1),0);const r=(t,e,s,n)=>{const i=.1,r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.x).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.x)).divE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.y).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.y))).mulE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s).subE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.y))).addE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.x));if(r.eps()>i){const n=(e.x-t.x)/(e.y-t.y)*(s-t.y)+t.x;r.set(n,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)())}if(r.lt(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(0))||r.gt(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1)))return!1;let o=r.value()-r.eps();o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(o,0,1);let a=r.value()+r.eps();return a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(a,0,1),n.mergeCoordinate(o),n.mergeCoordinate(a),!0},o=[];{const e=(t,e)=>{o.length=s;const n=Cr(i,s,o,!0),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;a.setEmpty();const h=s=>s.y<t?-1:s.y>e?1:0;let u=i[o[0]],m=h(u);0===m&&a.mergeCoordinate(u.x);for(let s=1;s<=n;++s){const l=i[o[s%n]],c=h(l);0===c&&a.mergeCoordinate(l.x);let g=0;c!==m&&(g=c*m===0?1===c||1===m?2:1:3,1&g&&r(u,l,t,a),2&g&&r(u,l,e,a)),u=l,m=c}return a};for(let n=0;n<s;++n)i[n].y=t[n].x;const a=e(n.xmin,n.xmax);if(a.isEmpty())return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(a);for(let n=0;n<s;++n)i[n].y=t[n].y;const h=e(n.ymin,n.ymax);return a.intersect(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(h)),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(a)}}function Qo(t,e,s){s.setEmpty(),s.merge(Uo(t,null,4,e))}function Jo(t,e,s){s.length=0;{const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;ro(t,e);const n=new Ne;if(bo(t,e,n),n.isZero())return e.isZero()||e.eq(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1))?0:(s.push(e.value()),1)}const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);Gr(t,n,!0);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);Wr(t,i,!0);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,6),o=n[3].negate().mulE(i[1]).addE(n[2].mulE(i[2]).mul(2)).addE(n[1].mulE(i[3])),a=n[3].negate().mulE(i[1]).subE(n[2].mulE(i[2]).mul(2)).addE(n[1].mulE(i[3])),h=n[2].mulE(n[2]).subE(i[2].mulE(i[2]));r[0]=i[1].mulE(i[1]).mulE(o).addE(n[1].mulE(n[1]).mulE(a)).addE(n[1].mulE(i[1]).mulE(h).mul(2)).mul(6),r[1]=n[2].mulE(i[1]).subE(n[1].mulE(i[2])).mulE(n[2].mulE(n[2]).addE(n[1].mulE(n[3]).mul(2)).addE(i[2].mulE(i[2])).addE(i[1].mulE(i[3]).mul(2))).mul(24);const u=n[1].mulE(i[2]).mulE(i[2]).mulE(i[3]),m=n[2].mulE(n[2]).mulE(n[3]).mulE(i[1]).subE(u).mul(156),l=n[3].mulE(i[1]).subE(n[1].mulE(i[3])),c=n[3].mulE(i[1]).subE(n[1].mulE(i[3])),g=n[1].mulE(n[3]).mulE(c).addE(i[1].mulE(i[3]).mulE(l)).mul(72),d=i[1].mulE(i[3]).subE(n[1].mulE(n[3])),_=n[2].mulE(i[2]).mulE(d).mul(120),p=n[1].mulE(n[2]).mulE(n[2]).mulE(i[3]),f=n[3].mulE(i[1]).mulE(i[2]).mulE(i[2]).subE(p).mul(36);r[2]=m.addE(g).addE(_).addE(f);const P=n[2].mulE(n[3]).mulE(n[3]).mulE(i[1]).subE(n[1].mulE(i[2]).mulE(i[3]).mulE(i[3])).mul(360),y=n[2].mulE(i[2]).mulE(n[2].mulE(n[3]).subE(i[2].mulE(i[3]))).addE(n[3].mulE(i[2]).mulE(i[2]).mulE(i[2])).subE(n[2].mulE(n[2]).mulE(n[2]).mulE(i[3])).mul(24),x=n[2].mulE(i[1]).mulE(i[3]).mulE(i[3]).subE(n[1].mulE(n[3]).mulE(n[3]).mulE(i[2])).mul(72),C=n[3].mulE(i[3]).mulE(i[1].mulE(i[2]).subE(n[1].mulE(n[2]))).mul(288);r[3]=P.addE(y).addE(x).addE(C),r[4]=i[3].mulE(i[3]).addE(n[3].mulE(n[3])).mulE(n[3].mulE(i[1]).subE(n[1].mulE(i[3]))).mul(270).addE(n[3].mulE(i[2]).subE(n[2].mulE(i[3]))).mulE(n[2].mulE(n[3]).addE(i[2].mulE(i[3]))).mul(180),r[5]=n[3].mulE(i[2]).subE(n[2].mulE(i[3])).mulE(n[3].mulE(n[3]).addE(i[3].mulE(i[3]))).mul(216);const v=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,5),b=pn(r,5,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,v,5);if(b>0){let n=Math.abs(t.getCurvature(0)),i=0;const r=Math.abs(t.getCurvature(1));(r>n||!Number.isFinite(r))&&(i=1);for(let e=0;e<b;e++){const s=Math.abs(t.getCurvature(v[e].value()));t.getCoord2D(v[e].value()),(s>n||!Number.isFinite(s))&&(n=s,i=v[e].value())}if((!Number.isFinite(n)||1/n<e)&&!(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(i,0,1)){const e=t.getCoord2D(i);if(!e.equals(t.getStartXY())&&!e.equals(t.getEndXY()))return s.push(i),1}}if(!t.isClosed()){const e=[0,0],n=Wo(t,e,!1);for(let t=0;t<n;t++)e[t]>0&&e[t]<1&&s.push(e[t]);return s.length}return 0}class Ko{constructor(t,e){this.b=t,this.len=e}getMaxDerivative(){return 1}getValue(t,e){return 0===t?this.len-Ur(this.b,e,!1):0}getError(t){return 0}}function $o(t,e,n,i,r,o,a){for(;;){const h=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[3]),u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[1],e[2])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[2],e[3]);if(u-h<=i+n*u)return t+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(h,u,.5);const m=t=>ho(e,1,t).length();{(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(a<12);let h=m(0),l=m(1);r[0]+=2,h>l&&(l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(h,h=l),e[3]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[0],e[0]=e[3]),e[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[1],e[1]=e[2]));let c=h/(h+l),g=1,d=u;for(;c<1/32&&d>=32*(i+n*d);){g/=4;const t=m(g);r[0]++,c=h/(t+h);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(yo(e,.5*g,s),d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,e[0]),d<=i){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(e,g,t),d+=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,s)}}if(1!==g){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);fo(e,g,e,s),t=$o(t,s,n,i,r,0,a+1),o++,a++;continue}}const l=8;r[0]+=l;const c=ur(l,m,0,1),g=16;r[0]+=g;const d=ur(g,m,0,1);let _=Math.abs(c-d)>i+n*u;if(!_)return t+d;if(o<3){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);fo(e,.5,e,s),t=$o(t,s,n,i,r,o+1,a+1),o++,a++;continue}const p=32;r[0]+=p;const f=ur(p,m,0,1);if(_=Math.abs(d-f)>i+n*u,!_)return t+f;const P=64;r[0]+=P;const y=ur(P,m,0,1);if(_=Math.abs(f-y)>i+n*u,!_)return t+y;const x=128;r[0]+=x;const C=ur(x,m,0,1);return _=Math.abs(y-C)>i+n*u,t+C}}function ta(t,e,s,n,i){if(s===e)return 0;const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(r);const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Po(r,e,s,o);return $o(0,o,n,i,[0],0,0)}function ea(t,e,s,n,i){let r=!0;const o=Kn(5,e,s,n,i,e=>{const s=mo(t,1,e);return(r?t.getCoordX(e)-t.getStartX():t.getCoordY(e)-t.getStartY())*s.length()});r=!1;const a=Kn(5,e,s,n,i,e=>{const s=mo(t,1,e);return(r?t.getCoordX(e)-t.getStartX():t.getCoordY(e)-t.getStartY())*s.length()});return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(o,a)}function sa(t,e,s,n,i,r,o,a,h){const u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(u);const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);if(e.queryControlPoints(m),u[0].equals(m[0])){if(u[1].equals(m[1])&&u[2].equals(m[2])&&u[3].equals(m[3]))return s&&(s.length=0,s.push(u[0]),s.push(u[3])),n&&(n.length=0,n.push(0),n.push(1)),i&&(i.length=0,i.push(0),i.push(1)),!0;if(!u[0].equals(m[3]))return!1}return!!(u[0].equals(m[3])&&u[1].equals(m[2])&&u[2].equals(m[1])&&u[3].equals(m[0]))&&(n&&(n.length=0,n.push(0),n.push(1),h&&(n[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[1]))),i&&(i.length=0,i.push(1),i.push(0),h&&(i[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(i[0],i[0]=i[1]))),s&&(s.length=0,s.push(u[0]),s.push(u[3]),h&&(s[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[1]))),!0)}function na(t,e,n,i,r,o,a,h,u,m,l,c){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(m+2===c);let g=0,d=0,_=0,p=0,f=0,P=0,y=0;const x=(t,e)=>{const s=1-e,a=n.mul((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.an)(s)),h=i.mul(3*e*s*s),u=r.mul(3*e*e*s),m=o.mul((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.an)(e));return a.add(h).add(u).add(m).sub(l[t]).sqrLength()};for(let s=1,v=c-1;s<v;s++){let e=u[s-1];if(t){s>2?(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(2*u[s-2]-u[s-3],0,1),u[s-1]=e):2===s&&(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(2*u[s-2],0,1),u[s-1]=e);const t=(t,e,s)=>{let a=-1;for(let h=0;!(Math.abs(e-a)<1e-12)&&10!==h;h++){const h=e*e,u=1-e,m=u*u,c=m*u,g=n.x-2*i.x+r.x,d=n.x-3*i.x+3*r.x-o.x,_=n.y-2*i.y+r.y,p=n.y-3*i.y+3*r.y-o.y,f=n.x-i.x-2*g*e+d*h,P=-l[t].x+n.x*c+e*(3*i.x*m+e*(3*r.x*u+o.x*e)),y=n.y-i.y-2*_*e+p*h,x=-l[t].y+n.y*c+e*(3*i.y*m+e*(3*r.y*u+o.y*e)),C=-6*(f*P+y*x),v=6*(3*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(f)-(-2*g+2*d*e)*P)+6*(3*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(y)-(-2*_+2*p*e)*x);if(a=e,0===v)break;e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e-C/v,s,1)}return a};
1{const e=x(s,u[s-1]);let n=t(s,u[s-1],0),i=x(s,n);if(1.01*e<i){const e=s>1?u[s-2]:0,r=t(s,.3*(u[s-1]-e)+e,0),o=x(s,r);o<i&&(i=o,n=r)}e>i&&(u[s-1]=n)}}const a=u[s-1],h=a*a,m=h*a,c=1-a,C=c*c,v=C*c;g+=3*h*C*C,d+=3*m*v,_+=3*h*h*C;const b=-(v*n.x+m*o.x-l[s].x);p+=b*a*C,f+=b*h*c;const S=-(v*n.y+m*o.y-l[s].y);P+=S*a*C,y+=S*h*c}if(e){const t=g*_-d*d;Math.abs(t)>=1e-12*(Math.abs(g*_)+Math.abs(d*d))+1e-10?(a||(i.x=(p*_-f*d)/t,i.y=(P*_-y*d)/t),h||(r.x=(g*f-d*p)/t,r.y=(g*y-d*P)/t)):((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(n,o,.3,i),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(n,o,.6,r))}let C=0;for(let s=1,v=c-1;s<v;s++)C+=x(s,u[s-1]);return C}var ia=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class ra extends ds{constructor(t){t&&t.cp?(super({start:t.cp[0],end:t.cp[3],vd:t.vd}),this.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2),this.m_cp[0].assign(t.cp[1]),this.m_cp[1].assign(t.cp[2])):void 0===t||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.W)(t,"vd")?(super({vd:t?.vd,XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2),this.m_cp[0].setCoords(0,0),this.m_cp[1].setCoords(0,0)):t.from?(super({start:t.from,end:t.to,vd:t.vd}),this.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2),this.m_cp[0].assign(t.cp1),this.m_cp[1].assign(t.cp2)):(super({XStart:0,YStart:0,XEnd:0,YEnd:0,vd:t.vd}),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("unrecognized constructor params"),this.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2),this.m_cp[0].setCoords(0,0),this.m_cp[1].setCoords(0,0)),this.m_cachedValues=0}getBoundary(){return $s(this)}construct(t,e,s,n){this.m_XStart=t.x,this.m_YStart=t.y,this.m_XEnd=n.x,this.m_YEnd=n.y,this.m_cp[0].assign(e),this.m_cp[1].assign(s),this.afterCompletedModification()}constructPoints(t){this.m_XStart=t[0].x,this.m_YStart=t[0].y,this.m_XEnd=t[3].x,this.m_YEnd=t[3].y,this.m_cp[0].assign(t[1]),this.m_cp[1].assign(t[2]),this.afterCompletedModification()}constructFromQuadratic(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);$i(t,e),this.constructPoints(e)}constructFromQuadraticSegment(t){this.dropAllAttributes(),this.assignVertexDescription(t.getDescription()),this.m_XStart=t.getStartX(),this.m_YStart=t.getStartY(),this.m_XEnd=t.getEndX(),this.m_YEnd=t.getEndY(),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__._)(2,t.getStartXY(),t.getControlPoint1(),2/3,this.m_cp[0]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__._)(2,t.getControlPoint1(),t.getEndXY(),1/3,this.m_cp[1]),this.afterCompletedModification(),ns(this,t)}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier}queryEnvelope(t){if(2!==t.m_EnvelopeType)return void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0);if(t.setCoords(this.getStartXY()),t.mergeNe(this.getEndXY()),t.contains(this.m_cp[0])&&t.contains(this.m_cp[1]))return;const e=Kr(this);if(null!==e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(const n of e.specialPoints)this.queryCoord2D(n,s),t.mergeNe(s);return}const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,8),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(i);const r=Zo(i,n),o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let s=1;s<r-1;s++)this.queryCoord2D(n[s].value(),o),t.mergeNe(o)}applyTransformation(t){if(1===t.m_TransformationType){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return this.queryControlPoints(e),t.transformPoints2D(e,4,e),this.setStartXY(e[0]),this.m_cp[0].assign(e[1]),this.m_cp[1].assign(e[2]),this.setEndXY(e[3]),void to(this)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}createInstance(){return new ra({vd:this.m_description})}calculateLength2D(){return Ur(this,1,!1)}calculateLowerLength2D(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY())}calculateUpperLength2D(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.m_cp[0])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.m_cp[0],this.m_cp[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getEndXY(),this.m_cp[1])}queryCoord2D(t,e){return this.queryCoord2DExtends(t,e,!0)}queryCoord2DMP(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}queryCoord2DExtends(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(n),yo(n,t,e,s)}queryCoord2DE(t,e){Co(this,t,e)}getCoordX(t){if(t<0||t>1){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtends(t,e,!0),e.x}const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.getStartX(),this.m_cp[0].x,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.m_cp[0].x,this.m_cp[1].x,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.m_cp[1].x,this.getEndX(),t),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(e,s,t),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,n,t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(i,r,t)}getCoordY(t){if(t<0||t>1){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2DExtends(t,e,!0),e.y}const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.getStartY(),this.m_cp[0].y,t),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.m_cp[0].y,this.m_cp[1].y,t),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(this.m_cp[1].y,this.getEndY(),t),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(e,s,t),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,n,t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(i,r,t)}cut(t,e,s){const n=new Pm;return this.queryCut(t,e,n,s),n.releaseSegment()}
1queryCut(t,e,s,n){const i=s.createCubicBezier();if(this.cutBezierIgnoreAttributes(t,e,i),n)return;i.assignVertexDescription(this.m_description);const r=this.m_description.getAttributeCount();if(r>1){for(let e=1;e<r;e++){const s=this.m_description.getSemantics(e),n=ia.getComponentCount(s);for(let e=0;e<n;e++){const n=this.getAttributeAsDbl(t,s,e);i.setStartAttribute(s,e,n)}}for(let t=1;t<r;t++){const s=this.m_description.getSemantics(t),n=ia.getComponentCount(s);for(let t=0;t<n;t++){const n=this.getAttributeAsDbl(e,s,t);i.setEndAttribute(s,t,n)}}}}queryDerivative(t,e){bo(this,t,e)}cutBezierIgnoreAttributes(t,s,n){(t<0||s>1||t>s)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Cubic_bezier.cut_bezier_ignore_attributes");const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(i);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Po(i,t,s,r),n.setControlPoints(r)}splitBezierIgnoreAttributes(t,s,n){this===s&&this===n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Cubic_bezier.split_bezier_ignore_attributes");const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(i);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);fo(i,t,r,o),s&&s.setControlPoints(r),n&&n.setControlPoints(o)}getAttributeAsDbl(t,e,s){if(0===e)return 0===s?this.getCoordX(t):this.getCoordY(t);if(0===t)return this.getStartAttributeAsDbl(e,s);if(1===t)return this.getEndAttributeAsDbl(e,s);const n=this.getStartAttributeAsDbl(e,s),i=this.getEndAttributeAsDbl(e,s),r=this.calculateLength2D(),o=r>0?this.tToLength(t)/r:0,a=ia.getInterpolation(e);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.V)(a,n,i,o,ia.getDefaultValue(e))}getClosestCoordinate(t,e){const s=[Number.NaN];return zo(this,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),e,-1,1,s),s[0]}getClosestCoordinateOnInterval(t,e,s=-1){const n=[Number.NaN];return 0===zo(this,t,e,!1,s,1,n)?Number.NaN:n[0]}getYMonotonicParts(t,e=!1){return this.getMonotonicParts(t,e)}getMonotonicParts(t,n){t.length<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const i=Jr(this);if(2===i.specialPointsCount()&&this.isMonotoneQuickAndDirty())return 0;let r=0;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=i.specialPointsCount()-1);for(let e=1,s=i.specialPointsCount();e<s;++e)this.queryCut(i.specialPoints[e-1],i.specialPoints[e],t[r],n),r++;for(let e=0;e<r;++e){co(t[e].get())}return r}intersectionWithAxis2D(t,e,s,n){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return this.queryControlPoints(i),Ho(i,t,e,s,n)}intersectionOfYMonotonicWithAxisX(t,e){if(this.m_YStart===this.m_YEnd)return t===this.m_YStart?e:Number.NaN;if(t===this.m_YStart)return this.m_XStart;if(t===this.m_YEnd)return this.m_XEnd;const n=[0,0],i=this.intersectionWithAxis2D(!0,t,n,null);return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(2!==i),-1===i?e:n[0]}isCurve(){return!0}isDegenerate(t){return ze(this,t)}isDegenerate3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}queryLooseEnvelope(t){if(2===t.m_EnvelopeType)return t.setCoords({pt:this.getStartXY()}),t.mergeNe(this.m_cp[0]),t.mergeNe(this.m_cp[1]),void t.mergeNe(this.getEndXY());(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}clone(t){const e=this.createInstance();return this.copyTo(e),e}queryInterval(t,e){if(0===t){const t=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();this.queryEnvelope(t);const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();return 0===e?t.queryIntervalX(s):t.queryIntervalY(s),s}return super.queryInterval(t,e)}queryLooseEnvelopeOnInterval(t,e){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(s),Po(s,t.vmin,t.vmax,s),e.setFromPoints(s,4)}changeEndPoints2D(t,e){if(t.isEqual(this.m_XStart,this.m_YStart)&&e.isEqual(this.m_XEnd,this.m_YEnd))return;const s=this.m_cp[0].isEqual(this.m_XStart,this.m_YStart),n=this.m_cp[0].isEqual(this.m_XEnd,this.m_YEnd),i=this.m_cp[1].isEqual(this.m_XStart,this.m_YStart),r=this.m_cp[1].isEqual(this.m_XEnd,this.m_YEnd);this.setStartXY(t),this.setEndXY(e),s?this.m_cp[0].setCoordsPoint2D(t):n&&this.m_cp[0].setCoordsPoint2D(e),r?this.m_cp[1].setCoordsPoint2D(e):i&&this.m_cp[1].setCoordsPoint2D(t),this.normalizeAfterEndpointChange()}tToLength(t){return Ur(this,t,!0)}lengthToT(t){return Or(this,t)}calculateWeightedAreaCentroid2D(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);kr(this,e);const s=e[3],n=e[2],i=e[1],r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;
1r.x=(5*s.x*s.x*(7*n.y+16*i.y)+s.x*(-35*s.y*n.x+40*n.x*n.y-80*s.y*i.x+140*n.x*i.y+112*i.x*i.y)-2*(s.y*(20*n.x*n.x+70*n.x*i.x+56*i.x*i.x)-7*(4*n.x+5*i.x)*(-n.y*i.x+n.x*i.y)))/840,r.y=(-5*s.y*s.y*(7*n.x+16*i.x)+s.y*(5*s.x*(7*n.y+16*i.y)-4*(10*n.x*n.y+35*n.y*i.x+28*i.x*i.y))+2*(-7*(4*n.y+5*i.y)*(n.y*i.x-n.x*i.y)+s.x*(20*n.y*n.y+70*n.y*i.y+56*i.y*i.y)))/840;const o=lo(this);return r.x+=(e[0].x-t.x)*o,r.y+=(e[0].y-t.y)*o,r}calculateWeightedCentroid2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.isDegenerate(0)?(t.setCoords(0,0),t):Br(this)?(t.assign(this.getCoord2D(.5).mul(this.calculateLength2D())),t):(t.assign(Qr(this,1)),t)}getControlPoint1(){return this.m_cp[0].clone()}setControlPoint1(t){this.m_cp[0].setCoordsPoint2D(t),this.afterCompletedModification()}getControlPoint2(){return this.m_cp[1].clone()}setControlPoint2(t){this.m_cp[1].setCoordsPoint2D(t),this.afterCompletedModification()}queryControlPoints(t){t[0].assign(this.getStartXY()),t[1].assign(this.m_cp[0]),t[2].assign(this.m_cp[1]),t[3].assign(this.getEndXY())}queryControlPointsHelper(t){return this.queryControlPoints(t),4}setControlPoints(t){for(let s=0;s<4;s++)t[s].isNAN()&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("NAN control points in bezier are not supported");this.m_XStart=t[0].x,this.m_YStart=t[0].y,this.m_cp[0].setCoordsPoint2D(t[1]),this.m_cp[1].setCoordsPoint2D(t[2]),this.m_XEnd=t[3].x,this.m_YEnd=t[3].y,this.afterCompletedModification()}getTangent(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return this.queryControlPoints(e),vo(e,t)}getDerivative(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return this.queryControlPoints(e),ho(e,1,t)}getCurvature(t){const e=mo(this,1,t),s=mo(this,2,t),n=e.sqrLength();if(0===n)return Number.NaN;e.divThis(Math.sqrt(n));return e.crossProduct(s)/n}isIntersectingPoint(t,e,s){if(s&&(t.equals(this.getStartXY())||t.equals(this.getEndXY())))return!1;const n=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;if(this.queryLooseEnvelope(n),n.inflateCoords(e,e),!n.contains(t))return!1;const i=this.getClosestCoordinate(t,!1),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(i,r);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(r,t)<=e}isIntersectingPoint3D(t,e,n,i,r=1){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}isMonotoneQuickAndDirty(){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);return this.queryControlPoints(t),_o(t)}getMonotonicPartParams(t,n){const i=Jr(this),r=i.specialPointsCount();if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(ms.s_maxMonotonicPartParams>=r),!n)return i.specialPointsCount();t<r&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");for(let e=0;e<r;e++)n[e]=i.specialPoints[e];return r}normalizeAfterEndpointChange(){return!1}orientBottomUp(){if(this.m_YEnd<this.m_YStart||this.m_YEnd===this.m_YStart&&this.m_XEnd<this.m_XStart){this.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=this.m_XEnd),this.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=this.m_YEnd);for(let t=0,e=this.m_description.getTotalComponentCount()-2;t<e;t++)this.m_attributes[t+e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_attributes[t],this.m_attributes[t]=this.m_attributes[t+e]);this.m_cp[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp[0],this.m_cp[0]=this.m_cp[1]),this.m_cachedValues=null}}findMinDeriv(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;return ro(this,t),t.value()}isLine(){return!1}isDegenerateToLineHelper(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(e);const s=e[3].sub(e[0]),n=s.length();if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[2],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[2],e[3])-n>t)return!1;const i=t;let r=e[1].clone();r.subThis(e[0]);let o=Math.abs(r.crossProduct(s))/n;return!(o>i)&&(r=e[2].clone(),r.subThis(e[1]),o=Math.abs(r.crossProduct(s))/n,!(o>i))}copyIgnoreAttributes(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(e),t.setControlPoints(e)}calculateArea2DHelper(){return lo(this)}absNorm(){return Bo(this)}queryEnvelopeW(t,e){Fo(this,t,e)}
1setSegmentFromCoordsForStitcher(t,e){Go(this,t,e)}writeInBufferStream(t,e){const s=new Float64Array(4);return this.writeInBuffer_(s),t.writeRangeFromArray(e,s.length,s,!0,1),e+s.length}writeInBuffer_(t){return t[0]=this.m_cp[0].x,t[1]=this.m_cp[0].y,t[2]=this.m_cp[1].x,t[3]=this.m_cp[1].y,4}readFromBufferStream(t,e){const s=new Float64Array(4);t.queryRange(e,s.length,s,!0,1),this.readFromBuffer_(s)}readFromBuffer_(t){this.m_cp=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,2),this.m_cp[0].x=t[0],this.m_cp[0].y=t[1],this.m_cp[1].x=t[2],this.m_cp[1].y=t[3],this.m_cachedValues=null}snapControlPoints(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(e);const s=(e,s,n)=>{let i=!1;if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,n)<=t){i=!e.equals(n),e.setCoordsPoint2D(n);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s,n)<=t&&(i||=!s.equals(n),s.setCoordsPoint2D(n))}return i},n=s(e[1],e[2],e[0]),i=s(e[2],e[1],e[3]);return(n||i)&&this.setControlPoints(e),n||i}needsSnapControlPoints(t){if(!t)return!1;const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);this.queryControlPoints(e);const s=(e,s,n)=>{let i=!1;if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,n)<=t){i=!e.equals(n),e.setCoordsPoint2D(n);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(s,n)<=t&&(i||=!s.equals(n),s.setCoordsPoint2D(n))}return i},n=s(e[1],e[2],e[0]),i=s(e[2],e[1],e[3]);return n||i}calculateSpecialPointsForCracking(t,e){return Jo(this,t,e)}ensureXYMonotone(){return co(this)}setCoordsForIntersector(t,e,s){so(this,t,e,s)}copyToImpl(t){const e=t;e.m_cp[0].assign(this.m_cp[0]),e.m_cp[1].assign(this.m_cp[1]),$r(e,Kr(this))}reverseImpl(){this.m_cp[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp[0],this.m_cp[0]=this.m_cp[1])}equalsImpl(t){const e=t,s=0,n=1;return!!this.m_cp[0].equals(e.m_cp[s])&&!!this.m_cp[1].equals(e.m_cp[n])}equalsImplTol(t,e){const s=t,n=0,i=1;return!!this.m_cp[0].isEqualPoint2D(s.m_cp[n],e)&&!!this.m_cp[1].isEqualPoint2D(s.m_cp[i],e)}swapImpl(t){const e=t;e.m_cp[0]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp[0],this.m_cp[0]=e.m_cp[0]),e.m_cp[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_cp[1],this.m_cp[1]=e.m_cp[1]),eo(this,e)}afterCompletedModification(){to(this)}isIntersecting(t,e,s){return 0!==om(!1,this,t,e,s)}intersect(t,e,s,n,i){return mm(!1,this,t,e,s,n,i)}intersectPoint(t,e,s){return qo(this,t,e,s)}endPointModified(){to(this)}clearEndPointModified(){}}ra.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier;class oa{constructor(){this.length=Number.NaN,this.area=Number.NaN,this.centroidX=Number.NaN,this.centroidY=0,this.specialPoints=[],this.specialPointsLength=[]}specialPointsCount(){return this.specialPoints.length}}function aa(t,e,n,i,r,o,a,h){for(;;){const u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[2]),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[0],e[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e[1],e[2]);if(m-u<=r+i*m)return t+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(u,m,.5);const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),c=t=>{Pa(e,n,1,t,l);return l[1].length()};if(0===a&&h<8){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(h<8);let u=c(0),l=c(1);o[0]+=2,u>l&&(l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(u,u=l),e[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[0],e[0]=e[2]),n[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[2]));let g=u/(u+l),d=1,_=m;for(;g<1/32&&_>=r+i*_;){d/=4;const t=c(d);o[0]++,g=u/(t+u);const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(ph(e,n,.5*d,s),_=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,e[0]),_<=r){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(e,n,d,t),_+=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,s)}}if(1!==d){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),u=[0,0,0];Qa(e,n,d,e,n,s,u),t=aa(t,s,u,i,r,o,0,h+1),a++,h++;continue}}let g=!1;const d=8;o[0]+=d;const _=ur(d,c,0,1),p=16;o[0]+=p;const f=ur(p,c,0,1);if(g=Math.abs(_-f)>r+i*m,!g)return t+f;if(a<8&&h<9){const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),u=[0,0,0];Qa(e,n,.5,e,n,s,u),t=aa(t,s,u,i,r,o,a+1,h+1),a++,h++;continue}const P=32;o[0]+=P;const y=ur(P,c,0,1);if(g=Math.abs(f-y)>r+i*m,!g)return t+y;const x=64;o[0]+=x;const C=ur(x,c,0,1);if(g=Math.abs(y-C)>r+i*m,!g)return t+C;const v=128;o[0]+=v;const b=ur(v,c,0,1);return g=Math.abs(C-b)>r+i*m,t+b}}function ha(t,e,s,n,i){if(s===e)return 0;const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),o=[0,0,0];t.queryControlPoints(r),t.queryWeights(o);const a=[0,0,0],h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);Ja(r,o,e,s,h,a);return aa(0,h,a,n,i,[0],0,0)}class ua{constructor(t,e,s){this.controlPoints=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.L)(t,3),this.weights=[0,0,0],(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(this.weights,e,0,0,3),this.point=s.clone()}getMaxDerivative(){return 3}getValue(t,e){if(0===t){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(this.controlPoints,this.weights,e,t);const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Pa(this.controlPoints,this.weights,1,e,s);return 2*t.sub(this.point).dotProduct(s[1])}if(1===t){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(this.controlPoints,this.weights,e,t);const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Pa(this.controlPoints,this.weights,2,e,s);return 2*(t.sub(this.point).dotProduct(s[2])+s[1].dotProduct(s[1]))}if(2===t){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(this.controlPoints,this.weights,e,t);const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);Pa(this.controlPoints,this.weights,3,e,s);return 2*(t.sub(this.point).dotProduct(s[3])+3*s[1].dotProduct(s[2]))}return 0}getError(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}}function ma(t,e,s,n){const i=ka(0,0,0,0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(18,Number.NaN),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(o),o[2].subThis(e),o[1].subThis(e),o[0].subThis(e);const a=[0,0,0];t.queryWeights(a);const h=[1,Ph(a),1],u=xh(a,s),m=xh(a,n),l=en(new ua(o,h,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0)),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(u,m),18,r);ph(o,h,u,i.pt),i.t=u,i.d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i.pt,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0));const c=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(o,h,m,c);const g=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(c,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0));g<i.d&&(i.d=g,i.t=m,i.pt.assign(c));for(let d=0;d<l;d++){ph(o,h,r[d],c);const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(c,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0));t<i.d&&(i.d=t,i.t=yh(a,r[d]),i.pt.assign(c))}return i}function la(t,e,s,n,i){let r=!0;const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),a=Kn(5,e,s,n,i,e=>{fa(t,1,e,o);return(r?t.getCoordX(e)-t.getStartX():t.getCoordY(e)-t.getStartY())*o[1].length()});r=!1;const h=Kn(5,e,s,n,i,e=>{fa(t,1,e,o);return(r?t.getCoordX(e)-t.getStartX():t.getCoordY(e)-t.getStartY())*o[1].length()});return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(a,h)}function ca(t){t.m_cachedValues=null}function ga(t,e){e.m_cachedValues=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_cachedValues,t.m_cachedValues=e.m_cachedValues)}function da(t){if(t.m_cachedValues)return t.m_cachedValues;const e=new oa,s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(s);const n=[0,0,0];return t.queryWeights(n),_a(s,n,e.specialPoints),Ra(t,e),e}function _a(t,e,s){if(0===e[1])return s.length=0,s.push(0),void s.push(1);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,8);n[0].set(0);let i=1;{const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1].x).subThis(t[0].x).mulThis(e[1]).mulThis(e[0]),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2].x).subThis(t[0].x).mulThis(e[2]).mulThis(e[0]),o=s.subE(r).addThisE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2].x).subThis(t[1].x).mulThis(e[2]).mulThis(e[1]));r.subThisE(s.mul(2));const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let h=dn(o,r,s,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,a);h<0&&(h=0);for(let t=0;t<h;t++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(a[t].value(),0,1)||(n[i]=a[t],i++)}{const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[1].y).subThis(t[0].y).mulThis(e[1]).mulThis(e[0]),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2].y).subThis(t[0].y).mulThis(e[2]).mulThis(e[0]),o=s.subE(r).addThisE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t[2].y).subThis(t[1].y).mulThis(e[2]).mulThis(e[1]));r.subThisE(s.mul(2));const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let h=dn(o,r,s,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),!1,a);h<0&&(h=0);for(let t=0;t<h;t++)(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(a[t].value(),0,1)||(n[i]=a[t],i++)}if(n[i].set(1),i++,i>2){(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.C)(n,0,i,(t,e)=>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t.value(),e.value()));
1let t=0,e=n[0].value(),s=1;for(let r=1;r<i;r++)n[r].eq(n[r-1])?(e+=n[r].value(),s++):(s>1&&(e/=s,n[t].set(e)),t++,n[t]=n[r],e=n[r].value(),s=1);t++,i=t}n[0].set(0),n[i-1].set(1),s.length=i;for(let r=0;r<i;r++)s[r]=n[r].value()}function pa(t,e,s){if(s){if(e<0)return e;if(e>1)return e-1+pa(t,1,!1)}if(t.isDegenerate(0))return 0;const n=1===e,i=da(t);if(n&&!Number.isNaN(i.length))return i.length;const r=qa(t),o=r/t.calculateUpperLength2D();let a=0,h=0;for(let u=1,m=i.specialPointsCount();u<m;u++){const s=i.specialPoints[u];if(a+=ha(t,h,Math.min(e,s),o,r),e<=s)break;h=s}return n&&(i.length=a),a}function fa(t,e,s,n){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(i);const r=[0,0,0];t.queryWeights(r),Pa(i,r,e,s,n)}function Pa(t,e,s,n,i){const r=[t[0],t[1],t[2]],o=[e[0],e[1],e[2]],a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);ya(r,o,s,n,a);for(let h=0;h<=s;h++)i[h].setCoords(a[h].x,a[h].y)}function ya(t,e,n,i,r){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0);const o=[t[0].clone(),t[1].clone(),t[2].clone()];if(!o[0].isZero()){for(let t=1;t<3;++t)o[t].subThis(o[0]);o[0].setCoords(0,0)}const a=xa(o,e,0,i),u=va(e,0,i),m=a.divide(u);if(r[0].assign(m),0===n)return;const l=[e[1]*e[0],e[2]*e[0]*.5,e[1]*e[2]],c=[t[1].sub(t[0]),t[2].sub(t[0]),t[2].sub(t[1])],g=u*u,d=xa(c,l,0,i).mul(2).divide(g);if(r[1].assign(d),1===n)return;const _=va(e,1,i),p=2*u*_,f=xa(c,l,1,i).mul(2).sub(d.mul(p)).divide(g);if(r[2].assign(f),2===n)return;const P=xa(c,l,2,i).mul(2),y=2*(_*_+u*va(e,2,i)),x=P.sub(f.mul(p).mul(2)).sub(d.mul(y)).divide(g);r[3].assign(x),3!==n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}function xa(t,e,s,n){if(0===s){if(n<=.5){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[0].mul(e[0]),t[1].mul(e[1]),n,s);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,t[1].mul(e[1]),t[2].mul(e[2]),n,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a1)(2,s,i,n,r),r}{const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[0].mul(e[0]),t[1].mul(e[1]),n,s);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,t[1].mul(e[1]),t[2].mul(e[2]),n,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a2)(2,s,i,n,r),r}}if(1===s){const s=t[1].mul(e[1]),i=s.sub(t[0].mul(e[0])).mul(1-n).add(t[2].mul(e[2]).sub(s).mul(n));return i.mulThis(2),i}if(2===s){const s=t[1].mul(e[1]),n=t[2].mul(e[2]).sub(s).sub(s.sub(t[0].mul(e[0])));return n.mulThis(2),n}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}function Ca(t,e,s,n){if(n.toDouble()<=.5){const s=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,t[0].mulE(e[0]),t[1].mulE(e[1]),n,s);const i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,t[1].mulE(e[1]),t[2].mulE(e[2]),n,i);const r=new Ne;return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a3)(2,s,i,n,r),r}{const s=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,t[0].mulE(e[0]),t[1].mulE(e[1]),n,s);const i=new Ne;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,t[1].mulE(e[1]),t[2].mulE(e[2]),n,i);const r=new Ne;return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a4)(2,s,i,n,r),r}}function va(t,e,s){if(0===e){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t[0],t[1],s),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t[1],t[2],s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(e,n,s)}if(1===e){return 2*((1-s)*(t[1]-t[0])+(t[2]-t[1])*s)}if(2===e){return 2*(t[2]-t[1]-(t[1]-t[0]))}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}function ba(t,e,s){if(s.toDouble()<=.5){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(t[0],t[1],s),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(t[1],t[2],s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(e,n,s)}{const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(t[0],t[1],s),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(t[1],t[2],s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(e,n,s)}}function Sa(t,e,s,n,i){const r=[Ne.constructPoint2D(t[0]),Ne.constructPoint2D(t[1]),Ne.constructPoint2D(t[2])];r[2].subThisE(r[0]),r[1].subThisE(r[0]),r[0].setCoords(0,0);Ea(r,[new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e[0]),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e[1]),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e[2])],s,n,i)}function Ea(t,e,n,i,r){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0);const o=[t[0].clone(),t[1].clone(),t[2].clone()];if(!o[0].isZero()){for(let t=1;t<3;++t)o[t].subThisE(o[0]);o[0]=Ne.constructCoords(0,0)}const a=Ca(o,e,0,i),h=ba(e,0,i),u=a.divE(h);r[0].setE(u);const m=[e[1].mulE(e[0]),e[2].mulE(e[0]).mul(.5),e[1].mulE(e[2])],l=Ca([t[1].subE(t[0]),t[2].subE(t[0]),t[2].subE(t[1])],m,0,i).mul(2),c=h.sqr(),g=l.divE(c);r[1].setE(g)}function Da(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(n);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(3,Number.NaN);t.queryWeights(i),wa(n,i,e,s)}
vendor: 5,225 bytes, line 1
1function wa(t,e,s,n){s.value()<0&&s.set(0,s.eps()),s.value()>1&&s.set(1,s.eps());const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(Ne,4);Sa(t,e,1,s,i),n.setE(i[1])}function Aa(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(s,0,1),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);if(Pa(t,e,3,n,i),i[1].isZero()){if(i[2].isZero())return i[3];{const t=i[2].clone();return 1===n&&t.negateThis(),t}}return i[1]}class Ta{constructor(t,e){this.len=0,this.b=t,this.len=e}getMaxDerivative(){return 1}getValue(t,e){return 0===t?this.len-pa(this.b,e,!1):0}getError(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}}function Ia(t,e,s){const n=pa(t,1,!1);if(e<=0)return e;if(e>=n)return e-n+1;const i=[0];return 1!==en(new Ta(t,e),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),1,i)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)(""),i[0]}function Ma(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),s=[0,0,0];return t.queryControlPoints(e),t.queryWeights(s),Ya(e,s)}function Ya(t,e){const n=Ph(e);if(1===n){return Pi(t)}if(0===n)return 0;const i=[new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),t[1].sub(t[0]),t[2].sub(t[0])],r=i[1].crossProduct(i[2]);if(n<1){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0);const t=1-n;let e;if(t<.01)e=-1/3+t*(2/15+t*(3/35+t*(16/315+t*(20/693+t*(16/1001+t*(56/6435))))));else{const s=t*(1+n),i=Math.atan2(Math.sqrt(t),Math.sqrt(1+n));e=n*(.5*n-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ap)(s)*i)/s}return r*e}{const t=(n-1)*(n+1);return.25*n/Math.pow(t,1.5)*(-2*n*Math.sqrt(t)*r-4*i[1].y*i[2].x*Math.atanh(Math.sqrt((n-1)/(n+1)))-i[1].x*i[2].y*Math.log(2*n*(n-Math.sqrt(t))-1))}}function Na(t,e){const n=Ph(e);if(1===n){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);Bi(t,e);const s=e[2].clone(),n=e[1].clone(),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,r=s.y*n.x-s.x*n.y;return i.x=-(4*s.x+5*n.x)*r/60,i.y=-(4*s.y+5*n.y)*r/60,i}if(0===n)return new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>0);const i=t[1].sub(t[0]),r=t[2].sub(t[0]);if(n<1){const t=Math.sqrt(1-n),e=Math.sqrt(1+n),s=(i.y*r.x-i.x*r.y)*n/Math.pow(t*e,5)/12,o=Math.atan2(t,e),a=n*t*e,h=n*n,u=i.mul(2*(2+h)),m=r.mul(2*h-5),l=u.add(m).mul(a),c=r.sub(i.mul(2*h)).mul(6*o);return l.add(c).mul(s)}{const t=Math.sqrt(n-1),e=Math.sqrt(n+1),s=(i.y*r.x-i.x*r.y)*n/Math.pow(t*e,5)/12,o=Math.atanh(t/e),a=n*t*e,h=n*n,u=i.mul(4).sub(r.mul(5)),m=i.add(r).mul(2*h),l=u.add(m).mul(a),c=r.sub(i.mul(2*h)).mul(6*o);return l.add(c).mul(s)}}function Xa(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),s=[0,0,0];return t.queryControlPoints(e),t.queryWeights(s),Na(e,s)}function qa(t){return Fa(t.calculateUpperLength2D())}function Fa(t){return 256*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.O)()*t}function Va(t){if(0===t.m_weights[1])return!0;const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),t.getEndXY()),s=t.calculateUpperLength2D();return s-e<=8*Number.EPSILON*s}function La(t){return t.m_cachedValues}function Ra(t,e){t.m_cachedValues=e}function za(t,e,s,n,i){const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(r);const o=[0,0,0];t.queryWeights(o);const a=[0];return 1===Ba(r,o,e,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),n,i,1,a)?a[0]:Number.NaN}function Ba(t,e,n,i,r,o,a,h){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.x)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit().contains(i)&&a>0,""),(o<0||Number.isNaN(o))&&(o=Number.MAX_VALUE);const u=new Array(3);for(let s=0;s<3;++s)u[s]=t[s].sub(n);const m=Ph(e),l=qe.constructPoint2D(u[0]),c=qe.constructPoint2D(u[1]),g=qe.constructPoint2D(u[2]),d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(m),p=d.clone();p.ldexpThis(1);const f=l.dotProduct(c.sub(l)).mul(d),P=d.mul(d.addDouble(2)),y=g.sub(c.mul(P.ldexp(1))),x=c.sqrLength().mul(d.mul(d).ldexp(1)).add(l.sqrLength().mul(d.ldexp(2).subDouble(1))).add(l.dotProduct(y)),C=g.sub(c.mul(p)).add(l.mul(p.subDouble(1))),v=c.mul(d).sub(l).dotProduct(C).mulDouble(3),b=c.dotProduct(g).mul(d.subDouble(3).mul(d)).ldexp(1),S=c.sqrLength().mul(d.mul(d).ldexp(2)),E=l.sqrLength().mul(d.ldexp(2).subDouble(3)),D=l.dotProduct(g.sub(c.mul(d.mulDouble(3).subDouble(1)).mul(d))).ldexp(1),w=g.sqrLength().addThis(b).addThis(S).addThis(E).addThis(D),A=l.add(g).sub(c.mul(p)),T=d.subDouble(1),I=g.sub(l).dotProduct(A).mul(T),M=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),Y=[];let N=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(u,e,i.vmin,N);let X=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(N,M);if(X<=o&&Y.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(i.vmin,X)),i.vmin!==i.vmax&&(ph(u,e,i.vmax,N),X=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(N,M),X<=o&&Y.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(i.vmax,X))),i.width()>0){const t=u[2].isZero(),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,4),n=zn(I,w,v,x,f,58,i,t,s);for(let r=0;r<n;
1r++){if(!i.containsExclusiveCoordinate(s[r].toDouble()))continue;let t=s[r].toDouble();t=yh(e,t);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(u,e,t,n),X=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(n,M),X<=o&&Y.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t,X))}}if(r){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(i.equals(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit()));{ph(u,e,-1,N,!0);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(u,e,0,t);const s=new fm({start:N,end:t}),n=s.getClosestCoordinate(M,!0);n<1&&(N=s.getCoord2D(n),X=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(N,M),X<=o&&Y.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(n-1,X)))}{ph(u,e,2,N,!0);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(u,e,i.vmax,t);const s=new fm({start:t,end:N}),n=s.getClosestCoordinate(M,!0);n>0&&(N=s.getCoord2D(n),X=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(N,M),X<=o&&Y.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(1+n,X)))}}if(!Y.length)return 0;Y.sort((t,e)=>t.compare(e));let q=0;const F=Y[0].x;if(h[q++]=F,q<a){const t=(0,_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.J)(u,4,!1).total(),e=Y[0].y;for(let s=1,n=Y.length;s<n;s++)if(Y[s].y>e+t){Y.length=s;break}Y.sort((t,e)=>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a7)(t.x,e.x)),q=0,h[q++]=Y[0].x;for(let s=1,n=Y.length;s<n;s++)Y[s].x!==h[q-1]&&q<a&&(h[q++]=Y[s].x)}return q}function ka(t,e,s,n,i){return{tmin:t,tmax:e,t:s,d:n,pt:i.clone()}}function Ga(t,e,n,i,r){const o=new we;if(Wa(t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),o),o.inflate(i),!o.isIntersectingPoint2D(e))return 0;const a=da(t);let h=0;const u=[];let m=a.specialPoints[0];for(let l=1,c=a.specialPoints.length;l<c;++l){const n=a.specialPoints[l],i=ma(t,e,m,n);if(0===u.length)u.push(i);else if(i.t===i.tmin)(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(u.at(-1).d<=i.d),u.at(-1).tmax=i.tmax;else if(u.at(-1).t===u.at(-1).tmax){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(u.at(-1).d>=i.d);const t=u.at(-1).tmin;u[u.length-1]=i,u.at(-1).tmin=t}else u.push(i);m=n}for(const s of u)if(s.d<=i){const t=s.t;n?(n[h]=t,h++):h++}return h}function Wa(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(n);const i=[0,0,0];t.queryWeights(i),ja(n,i,e,s)}function ja(t,e,s,n){if(s.equalsRange(0,1))return void n.setFromPoints(t,3);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),r=[0,0,0];Ja(t,e,s.vmin,s.vmax,i,r),n.setFromPoints(i,3)}function Za(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0].y,t[1].y),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1].y,t[2].y);if(e>=0&&s>=0||e<=0&&s<=0){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0].x,t[1].x),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1].x,t[2].x);if(e>=0&&s>=0||e<=0&&s<=0)return!0}return!1}function Ha(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(e);const s=Ua(e);return s&&(t.m_cp.setCoordsPoint2D(e[1]),t.afterCompletedModification()),s}function Ua(t){let e=!1;for(let s=0;s<2;s++){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[2][s]);n>0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])<0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])<0&&(t[1][s]=t[2][s],e=!0)):n<0?((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[0][s],t[1][s])>0&&(t[1][s]=t[0][s],e=!0),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.F)(t[1][s],t[2][s])>0&&(t[1][s]=t[2][s],e=!0)):t[1][s]!==t[0][s]&&(t[1][s]=t[0][s],e=!0)}return e}function Oa(t,s,n){void 0===n&&(n=s,s=0);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(s<0||n>1)return i.setNAN(),i;if(s>n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("calculate_sub_weighted_centroid"),s===n||t.isDegenerate(0))return i.setCo
1ords(0,0),i;const r=da(t),o=qa(t),a=o/t.calculateUpperLength2D();let h=s,u=0;for(let e=1,m=r.specialPointsCount();e<m;e++)if(s<r.specialPoints[e]){u=e-1;break}i.setCoords(0,0);for(let e=u+1,m=r.specialPointsCount();e<m;e++){const s=Math.min(r.specialPoints[e],n),u=la(t,h,s,a,o);if(i.addThis(u),h=s,n<=r.specialPoints[e])break}return i.add(t.getStartXY().mul(t.calculateLength2D()))}function Qa(t,e,n,i,r,o,a){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>=0&&n<=1&&i!==o&&r!==a),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e[0]>0&&e[2]>0&&e[1]>=0);const h=[1,Ph(e),1],u=xh(e,n),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.L)(t,3),l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,3);mh(m,h,l);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,3),g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,3);Ch(l,u,i?c:null,o?g:null),vh(e,n,r,a);const d=Za(m);if(i){for(let t=0;t<3;++t)_h(c[t],i[t]);Sh(m,i),d&&Ua(i)}if(o){for(let t=0;t<3;++t)_h(g[t],o[t]);Sh(m,o),d&&Ua(o)}}function Ja(t,e,n,i,r,o){if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(n>=0&&i<=1&&n<=i),n===i){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,i=lh(t,e,n,s);return bh(t,s),r[0].assign(s),r[1].assign(s),r[2].assign(s),o[0]=i,o[1]=i,void(o[2]=i)}if(0===n&&1===i)return r[0].assign(t[0]),r[1].assign(t[1]),r[2].assign(t[2]),o[0]=e[0],o[1]=e[1],void(o[2]=e[2]);const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,3);{const s=[1,Ph(e),1],r=xh(e,n),o=xh(e,i);mh(t,s,a),Ch(a,o,a,null);Ch(a,r>=o?1:r/o,null,a)}const h=[0,0,0];vh(e,i,h,null),vh(h,n/i,null,h);const u=Za(t),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);_h(a[1],m[1]),ph(t,e,n,m[0]),ph(t,e,i,m[2]),Sh(t,m);for(let s=0;s<3;++s)r[s].assign(m[s]),o[s]=h[s];u&&Ua(r)}function Ka(t,e,s){const n=Ph(e),i=[1,n,1],r=4*n/(3*(1+n));s[0].assign(t[0]),s[3].assign(t[2]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[0],t[1],r,s[1]),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t[2],t[1],r,s[2]),new ra({cp:s}),new Dn({points:t,weight:n});let o=0,a=.1,h=0;for(let u=0;u<9;u++,a+=.1){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(t,i,a,e);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(s,a,n);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,n);r>o&&(o=r,h=a)}{const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(t,i,h,e);const n=[0];Ro(s,e,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,n);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return yo(s,n[0],r),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,r),Math.sqrt(o)}}function $a(t,e,s,n){if(e.isEqual(t.m_XStart,t.m_YStart)&&s.isEqual(t.m_XEnd,t.m_YEnd))return;const i=!!n&&t.isMonotoneQuickAndDirty(),r=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T,o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);o[0].setCoords(t.m_XStart,t.m_YStart),o[2].setCoords(t.m_XEnd,t.m_YEnd);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;a.setSub(o[2],o[0]),a.leftPerpendicularThis(),o[1].setAdd(o[0],a);const h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);h[0].setCoordsPoint2D(e),h[2].setCoordsPoint2D(s),a.setSub(h[2],h[0]),a.leftPerpendicularThis(),h[1].setAdd(h[0],a),r.setFromTwoTriangles(o,h)?r.transformInPlace(t.m_cp):(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(e,s,.5,t.m_cp),t.changeEndPoints2D(e,s),i&&Ha(t)}function th(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==ih(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function eh(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==rh(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function sh(t,e,s,n,i){if(i){const n=hm(e,s);if(0!==n){if(t){if(1===n){if(e.m_weights[0]===s.m_weights[0]&&e.m_weights[1]===s.m_weights[1]&&e.m_weights[2]===s.m_weights[2])return 2}else if(e.m_weights[0]===s.m_weights[2]&&e.m_weights[1]===s.m_weights[1]&&e.m_weights[2]===s.m_weights[0])return 2;return 4}return 2}}else if(Re(e,s))return 1;return 0!==oh(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function nh(t,e,s,n,i){if(i){if(0!==hm(e,s))return t?4:2}else if(Re(e,s))return 1;return 0!==ah(t,e,s,null,null,null,n,i??!1,!0,!1)?4:0}function ih(t,e,n,i,r,o,a,h,u,m){if(null!==r&&(r.length=0),null!==o&&(o.length=0),null!==i&&(i.length=0),n.isDegenerate(0)){const t=[0,0],s=e.intersectPoint(n.getStartXY(),t,a);if(s>0){if(null!==r)for(let e=0;e<s;e++)r.push(t[e]);if(null!=o)for(let t=0;t<s;t++)o.push(0);if(null!=i)for(let n=0;n<s;n++){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(t[n],s),i.push(s)}}return s}const l=os(e,n);if(a=Math.max(a,l),e.isDegenerateToLineHelper(l)){const t=new fm({
1start:e.getStartXY(),end:e.getEndXY()}),s=ws(t,n,i,r,o,a,h,m);if(r)for(let n=0;n<s;++n){const s=t.getCoord2D(r[n]);r[n]=e.getClosestCoordinate(s,!1)}return s}if(as(e,n,a))return 0;const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(c);const g=[0,0,0];e.queryWeights(g);const d=[1,Ph(g),1],_=n.getEndXY().sub(n.getStartXY()),p=_.clone();p.leftPerpendicularThis();const f=c[0].clone(),P=c[1].clone(),y=c[2].clone(),x=P.sub(f),C=y.sub(f),v=y.sub(P),b=d[0],S=d[1],E=d[2],D=b*S,w=b*E,A=S*E,T=x.dotProduct(p)*D,I=C.dotProduct(p)*w;let M=T,Y=I-2*T,N=v.dotProduct(p)*A+I-I;const X=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(13,Number.NaN),q=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(13,Number.NaN);let F=nn(N,Y,M,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,X);F<0&&(X[0]=0,X[1]=1,F=2);let V=0;for(let s=0,k=V;s<F;++s){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(c,d,X[s+k],t),q[V]=n.getClosestCoordinate(t,!1);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n.getCoord2D(q[V]))<=a&&(X[V]=X[s+k],V++)}const L=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),R=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);if(e.queryControlPoints(R),R[0].subThis(n.getStartXY()),R[1].subThis(n.getStartXY()),R[2].subThis(n.getStartXY()),hh(R,d,L,!1),Math.abs(_.x)>=Math.abs(_.y)){const t=_.y/_.x;N=L[2].y-L[2].x*t,Y=L[1].y-L[1].x*t,M=L[0].y-L[0].x*t}else{const t=_.x/_.y;N=L[2].x-L[2].y*t,Y=L[1].x-L[1].y*t,M=L[0].x-L[0].y*t}const z=e.getEndXY().equals(n.getStartXY())||e.getEndXY().equals(n.getEndXY()),B=[0,0];F=nn(N,Y,M,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),z,B);for(let s=0,k=V;s<F;++s){X[s+k]=B[s];const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(c,d,X[s+k],t),q[V]=n.getClosestCoordinate(t,!1);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n.getCoord2D(q[V]))<=a&&(X[V]=X[s+k],V++)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(V<X.length+4);for(let s=0;s<V;s++)X[s]=yh(g,X[s]);F=e.intersectPoint(n.getStartXY(),B,a);for(let s=0;s<F;s++)X[V]=B[s],q[V++]=0;F=e.intersectPoint(n.getEndXY(),B,a);for(let s=0;s<F;s++)X[V]=B[s],q[V++]=1;F=n.intersectPoint(e.getStartXY(),B,a);for(let s=0;s<F;s++)q[V]=B[s],X[V++]=0;F=n.intersectPoint(e.getEndXY(),B,a);for(let s=0;s<F;s++)q[V]=B[s],X[V++]=1;return 0===V?0:gm(t,e,n,X,q,V,i,r,o,a,h,u,m)}function rh(t,e,s,n,i,r,o,a,h,u){if(Eu(s)){return ih(t,e,new fm({start:s.getStartXY(),end:s.getEndXY()}),n,i,r,o,a,h,u)}const m=os(e,s);if(as(e,s,o=Math.max(o,m)))return 0;const l=[],c=[],g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);{e.queryControlPoints(g);const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),n=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;s.canonicToWorldTransformation(n);const i=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;i.setInvert(n),i.transformPoints2D(g,4,t);const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),m=[0,0,0];e.queryWeights(m),uh(t,m,r,h,u);const d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);d[0].setDouble(s.getSemiMinorAxis()),d[0].sqrThis(),d[1].setDouble(s.getSemiMajorAxis()),d[1].sqrThis(),d[2].setThis(d[0]),d[2].mulThis(d[1]),d[2].negateThis();const _=Fn(r,2,h,2,u,2,d,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),l,a);if(_>0){let t=0;for(let n=0;n<_;n++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(l[n],i);const r=s.getClosestCoordinate(i,!1),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(r,a);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,a)<=o&&(l[t]=l[n],c.push(r),t++)}l.length=t}}const d=[0,1];for(let _=0;_<2;_++){const t=0===_?s.getStartXY():s.getEndXY(),n=za(e,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(n,i);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,i)<=o&&(l.push(n),c.push(d[_]))}for(let _=0;_<2;_++){const t=[0,3];{const e=s.getClosestCoordinate(g[t[_]],!1),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(e,n);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(g[t[_]],n)<=o&&(l.push(d[_]),c.push(e))}}return gm(t,e,s,l,c,l.length,n,i,r,o,a,h,u)}function oh(t,e,n,i,r,o,a,h,u,m){const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(l);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);if(n.queryControlPoints(c),hs(l,c,3)<0)return oh(t,n,e,i,o,r,a,h,u,!m);const g=os(e,n);
1if(e.isDegenerateToLineHelper(g)){const s=new fm({start:e.getStartXY(),end:e.getEndXY()}),l=ih(t,n,s,i,o,r,a,h,u,!m);if(r)for(let t=0;t<l;++t){const n=s.getCoord2D(r[t]);r[t]=e.getClosestCoordinate(n,!1)}return l}if(n.isDegenerateToLineHelper(g)){const s=new fm({start:n.getStartXY(),end:n.getEndXY()}),l=ih(t,e,s,i,r,o,a,h,u,m);if(o)for(let t=0;t<l;++t){const e=s.getCoord2D(o[t]);o[t]=n.getClosestCoordinate(e,!1)}return l}if(as(e,n,a=Math.max(a,g)))return 0;const d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(3,Number.NaN);e.queryWeights(d);const _=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(3,Number.NaN);n.queryWeights(_);const p=[1,Ph(d),1],f=[1,Ph(_),1],P=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),y=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);{const t=we.constructEmpty();ja(l,p,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),t);const e=we.constructEmpty();ja(c,f,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),e);const s=Math.max(t.maxDim(),e.maxDim());if(t.inflate(3*a),e.inflate(3*a),!t.intersectW(e))return 0;if(t.maxDim()<.1*s){if(fh(l,p,t,P),fh(c,f,t,y),P.isEmpty()||y.isEmpty())return 0;Ja(l,p,P.vmin,P.vmax,l,p),Ja(c,f,y.vmin,y.vmax,c,f)}}const x=_m(l,2,c,2,a);if(0===x)return 0;const C=[],v=[];if(-1===x){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);uh(l,p,t,e,s);const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3);uh(c,f,n,i,r);const o=[],g=[],d=Nn(t,2,e,2,s,2,n,2,i,2,r,2,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),o,g,h,u,m);if(d>0)for(let h=0;h<d;h++){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(c,f,g[h],t);const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;ph(l,p,o[h],e);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,t)<=a&&(C.push(o[h]),v.push(g[h]))}}for(let b=0;b<2;b++){let t,e,n;0===b?(t=l,e=c,n=f):(t=c,e=l,n=p);for(let i=0;i<2;i++){const r=0===i?0:t.length-1,o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,h=[0],u=Ba(e,n,t[r],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1,1,h);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===u),ph(e,n,h[0],o),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[r],o)<=a&&(0===b?(C.push(0===r?0:1),v.push(h[0])):(v.push(0===r?0:1),C.push(h[0])))}}if(0===C.length)return 0;if(!P.equalsRange(0,1))for(let s=0;s<C.length;++s)C[s]=Dn.recalculateParentT(P.vmin,P.vmax,C[s]);if(!y.equalsRange(0,1))for(let s=0;s<v.length;++s)v[s]=Dn.recalculateParentT(y.vmin,y.vmax,v[s]);for(let s=0;s<C.length;++s)C[s]=yh(d,C[s]);for(let s=0;s<v.length;++s)v[s]=yh(_,v[s]);return gm(t,e,n,C,v,C.length,i,r,o,a,h,u,m)}function ah(t,e,s,n,i,r,o,a,h,u){if(e.isLine()){return Li(t,s,new fm({start:e.getStartXY(),end:e.getEndXY()}),n,r,i,o,a,h,!u)}if(s.isLine()){return ih(t,e,new fm({start:s.getStartXY(),end:s.getEndXY()}),n,i,r,o,a,h,u)}const m=os(e,s);if(as(e,s,o=Math.max(o,m)))return 0;const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(l);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);s.queryControlPoints(c);const g=_m(l,2,c,2,o);if(0===g)return 0;const d=[],_=[];if(-1===g){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M,3),r=[0,0,0];e.queryWeights(r),uh(l,r,t,n,i);const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qe,3);ji(c,m);const g=Nn(t,2,n,2,i,2,[m[0].x,m[1].x,m[2].x],2,[m[0].y,m[1].y,m[2].y],2,null,0,!0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),d,_,a,h,u);if(g>0){let t=0;for(let n=0;n<g;n++){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(_[n],i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.queryCoord2D(d[n],r),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(r,i)<=o&&(d[t]=d[n],_[t]=_[n],t++)}d.length=t,_.length=t}}for(let p=0;p<2;p++){let t;t=0===p?l:c;for(let n=0;n<2;n++){const i=0===n?0:t.length-1;let r;const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;0===p?(r=vi(s,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1),s.queryCoord2D(r,a)):(r=za(e,t[i],_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,-1),e.queryCoord2D(r,a)),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[i],a)<=o&&(0===p?(d.push(0===i?0:1),_.push(r)):(_.push(0===i?0:1),d.push(r)))}}return gm(t,e,s,d,_,d.length,n,i,r,o,a,h,u)}function hh(t,e,s,n=!1){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);n?(i[0].setCoordsPoint2D(t[0]),i[1].setCoordsPoint2D(t[1]),i[1].subThis(i[0]),i[2].setCoordsPoint2D(t[2]),i[2].subThis(i[0]),i[0].setCoords(0,0)):(i[0].setCoordsPoint2D(t[0]),i[1].setCoordsPoint2D(t[1]),i[2].setCoordsPoint2D(t[2])),i[0].mulThis(e[0]),i[1].mulThis(e[1]),i[2].mulThis(e[2]),s[1].setCoords(i[1].x-i[0].x,i[1].y-i[0].y),s[2].setCoordsPoint2D(i[2].sub(i[1])),s[2].subThis(s[1]),s[1].x*=2,s[1].y*=2,s[0].setCoordsPoint2D(i[0])}function uh(t,e,s,n,i){const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(e[0]),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(e[1]),a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(e[2]);s[0].setDouble(t[0].x),s[0].mulThis(r),s[1].setDouble(t[1].x),s[1].mulThis(o),s[2].setDouble(t[2].x),s[2].mulThis(a),s[2].subThis(s[1]),s[1].subThis(s[0]),s[2].subThis(s[1]),s[1].ldexpThis(1),n[0].setDouble(t[0].y),n[0].mulThis(r),n[1].setDouble(t[1].y),n[1].mulThis(o),n[2].setDouble(t[2].y),n[2].mulThis(a),n[2].subThis(n[1]),n[1].subThis(n[0]),n[2].subThis(n[1]),n[1].ldexpThis(1),i[0].setDouble(e[0]),i[1].setDouble(e[1]),i[2].setThis(i[1]),i[2].ldexpThis(1),i[2].negateThis(),i[2].addThis(i[0]),i[2].addDoubleThis(e[2]),i[1].subThis(i[0]),i[1].ldexpThis(1)}function mh(t,e,s){for(let n=0;n<3;++n)s[n].setCoordsPoint2DZ(t[n].mul(e[n]),e[n])}function lh(t,e,s,n){if(0===s)return n.assign(t[0]),e[0];if(1===s)return n.assign(t[2]),e[2];const i=[t[0].x*e[0],t[1].x*e[1],t[2].x*e[2]],r=[t[0].y*e[0],t[1].y*e[1],t[2].y*e[2]],o=[e[0],e[1],e[2]],a=s;let h,u,m;if(s<=.5){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(i[0],i[1],a),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(i[1],i[2],a);h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t,e,a);const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(r[0],r[1],a),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(r[1],r[2],a);u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,n,a);const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(o[0],o[1],a),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(o[1],o[2],a);m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.X)(l,c,a)}else{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(i[0],i[1],a),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(i[1],i[2],a);h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(t,e,a);const s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(r[0],r[1],a),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(r[1],r[2],a);u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(s,n,a);const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(o[0],o[1],a),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(o[1],o[2],a);m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Y)(l,c,a)}
1return h/=m,u/=m,n.setCoords(h,u),bh(t,n),m}function ch(t,e,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);t.queryControlPoints(n);const i=[0,0,0];t.queryWeights(i);gh([Ne.constructPoint2D(n[0]),Ne.constructPoint2D(n[1]),Ne.constructPoint2D(n[2])],[new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(i[0]),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(i[1]),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(i[2])],e,s)}function gh(t,e,s,n){if(0===s.value())return void n.setE(t[0]);if(1===s.value())return void n.setE(t[2]);const i=[t[0].x.mulE(e[0]),t[1].x.mulE(e[1]),t[2].x.mulE(e[2])],r=[t[0].y.mulE(e[0]),t[1].y.mulE(e[1]),t[2].y.mulE(e[2])],o=[e[0].clone(),e[1].clone(),e[2].clone()],a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;if(s.value()<=.5){const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(i[0],i[1],s),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(i[1],i[2],s);a.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(t,e,s));const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(r[0],r[1],s),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(r[1],r[2],s);h.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(n,m,s));const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(o[0],o[1],s),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(o[1],o[2],s);u.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ad)(l,c,s))}else{const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(i[0],i[1],s),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(i[1],i[2],s);a.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(t,e,s));const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(r[0],r[1],s),m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(r[1],r[2],s);h.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(n,m,s));const l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(o[0],o[1],s),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(o[1],o[2],s);u.setE((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ae)(l,c,s))}a.divThisE(u),h.divThisE(u);const m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(a.value(),h.value());bh([t[0].value(),t[1].value(),t[2].value()],m),n.x.set(m.x,a.eps()),n.y.set(m.y,h.eps())}function dh(t,e,s,n){const i=s.lte(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a6)?_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.lerpLo:_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.lerpHi,[r,o,a]=[e.map((e,s)=>t[s].x.mul(e)),e.map((e,s)=>t[s].y.mul(e)),e].map(([t,e,n])=>i(i(t,e,s),i(e,n,s),s)),h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(r.divThis(a).value(),o.divThis(a).value());bh(t.map(t=>t.asPoint2D()),h),n.x=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(h.x),n.y=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(h.y)}function _h(t,e){return e.setCoords(t.x/t.z,t.y/t.z),t.z}function ph(t,e,s,n,i){if(i){if(s<0){return void ps(new fm({start:t[0],end:t[0].add(Aa(t,e,0).getUnitVector())}),s,n)}if(s>1){return void ps(new fm({start:t[2],end:t[2].add(Aa(t,e,1).getUnitVector())}),s-1,n)}}lh(t,e,s,n)}function fh(t,e,s,n){n.setEmpty();const i=[];i.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1));const r=.5*Math.max(s.width(),s.height());for(;i.length;){const o=i.at(-1);i.pop();const a=new we;if(ja(t,e,o,a),a.isIntersectingW(s)){const t=Math.max(a.width(),a.height());if(s.containsW(a)||t<=r||o.width()<1e-12)n.merge(o);else{const t=o.getCenter();i.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(o.vmin,t)),i.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(t,o.vmax))}}}}function Ph(t){return t[1]/Math.sqrt(t[0]*t[2])}function yh(t,e){const s=Math.sqrt(t[2]/t[0]);return e/(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,1,e)}function xh(t,e){const s=Math.sqrt(t[0]/t[2]);return e/(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(s,1,e)}function Ch(t,e,n,i){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e>=0&&e<=1);(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f).setCoordsPoint3D(t[0]);(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f).setCoordsPoint3D(t[1]);
1(new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f).setCoordsPoint3D(t[2]);const r=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,o=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f,a=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.f;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__._)(3,t[0],t[1],e,r),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__._)(3,t[1],t[2],e,o),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__._)(3,r,o,e,a);const h=t[2].clone();n&&(n[0].assign(t[0]),n[1].assign(r),n[2].assign(a)),i&&(i[0].assign(a),i[1].assign(o),i[2].assign(h))}function vh(t,e,n,i){const r=[t[0],t[1],t[2]];(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(e>=0&&e<=1&&n!==i);const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(r[0],r[1],e),a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(r[1],r[2],e),h=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(o,a,e);n&&(n[0]=r[0],n[1]=o,n[2]=h),i&&(i[0]=h,i[1]=a,i[2]=r[2])}function bh(t,e){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();s.vmin=s.vmax=t[0].x,s.mergeNeCoordinate(t[1].x),s.mergeNeCoordinate(t[2].x),e.x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e.x,s.vmin,s.vmax),s.vmin=s.vmax=t[0].y,s.mergeNeCoordinate(t[1].y),s.mergeNeCoordinate(t[2].y),e.y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e.y,s.vmin,s.vmax)}function Sh(t,e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;s.vmin=s.vmax=t[0].x,s.mergeNeCoordinate(t[1].x),s.mergeNeCoordinate(t[2].x),e[0].x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[0].x,s.vmin,s.vmax),e[1].x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[1].x,s.vmin,s.vmax),e[2].x=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[2].x,s.vmin,s.vmax),s.vmin=s.vmax=t[0].y,s.mergeNeCoordinate(t[1].y),s.mergeNeCoordinate(t[2].y),e[0].y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[0].y,s.vmin,s.vmax),e[1].y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[1].y,s.vmin,s.vmax),e[2].y=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(e[2].y,s.vmin,s.vmax)}const Eh=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ag/180,Dh=180/_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ag;function wh(t){let e=t;return e>=-360&&e<720?(e<0?e+=360:e>=360&&(e-=360),e):(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.n)(e,360),e<0&&(e+=360),e)}function Ah(t){let e=t;return e=wh(e),e>180&&(e-=360),e}function Th(t){return t*Eh}function Ih(t){return t*Dh}function Mh(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)();let s=t;return s>=-e&&s<2*e?(s<0&&(s+=e),s>=e&&(s-=e),s):(s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.n)(s,e),s<0&&(s+=e),s)}function Yh(t){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();let s=t;return s>-e&&s<=e||(s=Mh(s),s>e&&(s-=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)())),s}function Nh(t,e){return Ah(e-t)}var Xh=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class qh extends ds{constructor(t){if(void 0===t||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.W)(t,"vd"))return super({vd:t?.vd,XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_semiMajorAxis=0,this.m_minorMajorRatio=1,this.m_rotation=0,this.m_cosr=1,this.m_sinr=0,this.m_center=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),this.m_sweepAngle=0,this.m_startAngle=0,this.m_interior=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),void(this.m_bits=0);if(t.copy)return super(t),void(this!==t.copy&&(this.m_center=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),this.m_interior=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),t.copy.copyToImpl(this)));if(t.move)super(t),this.m_semiMajorAxis=t.move.m_semiMajorAxis,this.m_minorMajorRatio=t.move.m_minorMajorRatio,this.m_rotation=t.move.m_rotation,this.m_cosr=t.move.m_cosr,this.m_sinr=t.move.m_sinr,this.m_center=t.move.m_center.clone(),this.m_sweepAngle=t.move.m_sweepAngle,this.m_startAngle=t.move.m_startAngle,this.m_interior=t.move.m_interior.clone(),this.m_bits=t.move.m_bits,this.m_cachedValues=t.move.m_cachedValues,t.move.m_cachedValues=null;else{if(t.fromPoint)return super({XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_center=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),this.m_interior=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),void this.constructCircularArcThreePoint(t.fromPoint,t.toPoint,t.interiorPoint);if(t.center)return super({XStart:0,YStart:0,XEnd:0,YEnd:0}),this.m_center=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),this.m_interior=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),void this.constructCircleRadius(t.radius,t.center,t.bIsCounterClockwise);if(t.semiMajorAxis)return super({XStart:0,YStart:0,XEnd:0,YEnd:0}),void this.constructEllipticArcEndPoints(t.fromPoint,t.toPoint,t.semiMajorAxis,t.minorMajorRatio,t.axisXRotationRad,t.bBigArc,t.bIsCounterClockwise)}}getBoundary(){return $s(this)}assignCopy(t){return this!==t&&t.copyTo(this),this}constructCircleRadius(t,e,s=!1){return this.constructEllipse(t,1,e,0,s),this.setProjectionBehavior(0),this.afterCompletedModification(),this}constructCircleCenterAndPoint(t,e,s=!1){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e);
1return this.constructEllipticArcEndPointsCenter(e,e,n,1,0,!0,s,t),this.setProjectionBehavior(0),this.afterCompletedModification(),this}constructTwoPointCircle(t,e,s=!1){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(t,e,.5);return this.constructCircleCenterAndPoint(n,t,s),this}constructLineEllipticArc(t,e){return Su(this,t,e,1),this}constructLineCircularArc(t,e){return Su(this,t,e,0),this}constructEllipse(t,e,s,n,i=!1){this.m_semiMajorAxis=Math.abs(t),this.m_minorMajorRatio=Math.abs(e),this.m_minorMajorRatio>1&&(this.m_semiMajorAxis*=this.m_minorMajorRatio,this.m_minorMajorRatio=1/this.m_minorMajorRatio);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,this.m_minorMajorRatio*this.m_semiMajorAxis),o=Math.cos(n),a=Math.sin(n);return r.rotateDirect(o,a),r.addThis(s),this.constructEllipticArcEndPointsCenter(r,r,this.m_semiMajorAxis,this.m_minorMajorRatio,n,!0,i,s),this}inflate(t){if(this.isDegenerateToLine())return;let e=this.getSemiMinorAxis()+t;if(e=e<=0?0:(this.getSemiMajorAxis()+t)/this.getSemiMajorAxis(),this.isCircular()){const t=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;t.setShiftCoords(-this.m_center.x,-this.m_center.y),t.scale(e,e),t.shiftCoords(this.m_center.x,this.m_center.y),this.applyTransformation(t)}else{const t=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;this.canonicToWorldTransformation(t);const s=t.clone();s.invertPreciseThis(),s.scale(e,e),s.multiply(t),this.applyTransformation(s)}}constructEnclosingCircle(t,e,s=!1){return Zu(this,t,e,s),this}constructThreePointCircle(t,e,s,n=!1){if(t.equals(e)||e.equals(s)||t.equals(s)){const i=t.clone(),r=e.clone(),o=s.clone();return i.equals(r)&&r.assign(o),this.constructTwoPointCircle(i,r,n)}{const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateCircleCenterFromThreePoints(t,e,s);if(!i.isFinite()||!Number.isFinite(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,i))){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,e),i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,s);this.constructLineCircularArc(t,n>=i?e:s)}return this.constructCircleCenterAndPoint(i,t,n)}}constructCircularArcThreePoint(t,e,s){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.x),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.x),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s.x),o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.y),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e.y),h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s.y),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(.5),m=i.subE(n),l=a.subE(o),c=r.subE(n),g=h.subE(o),d=m.mulE(g).subThisE(l.mulE(c));if(d.scaleError(10),d.isZero()){if(!m.isZero()||!l.isZero())return Su(this,t,e,0),this;{const n=t.clone().addThis(e).mulThis(.5).addThis(s).mulThis(.5),i=s.sub(n).length();this.constructEllipticArcEndPointsCenter(t,e,i,1,0,!0,!1,n),this.m_interior.assign(s)}return this.setProjectionBehavior(0),this}const _=m.sqr().addThisE(l.sqr()).mulThisE(u),p=c.sqr().addThisE(g.sqr()).mulThisE(u),f=_.mulE(g).subThisE(p.mulE(l)),P=m.mulE(p).subThisE(c.mulE(_));f.divThisE(d),P.divThisE(d);const y=f.sqr().addThisE(P.sqr());y.sqrtThis();const x=f.addE(n),C=P.addE(o);let v=t.x-x.value(),b=t.y-C.value();const S=Math.atan2(b,v);v=e.x-x.value(),b=e.y-C.value();const E=Math.atan2(b,v);v=s.x-x.value(),b=s.y-C.value();const D=Math.atan2(b,v);let w=D-2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;w<S;)w+=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();let A=E-2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;A<w;)A+=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();let T=D+2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;T>S;)T-=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();let I,M=E+2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;M>T;)M-=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();I=A-S<S-M?A-S:M-S;const Y=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(x.value(),C.value());return this.constructEllipticArcEndPointsCenter(t,e,y.value(),1,0,Math.abs(I)>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),I>0,Y),this.m_interior.assign(s),this.setProjectionBehavior(0),this.afterCompletedModification(),this}constructCircularArc(t,e,s,n){return this.constructEllipticArcGeneral(t,1,e,s,n,0
1),this.setProjectionBehavior(0),this.afterCompletedModification(),this}constructEllipticArcEndPoints(t,e,s,n,i,r,o){return bu(this,t,e,s,n,i,r,o)}constructEllipticArcEndPointsCenter(t,e,s,n,i,r,o,a){return bu(this,t,e,s,n,i,r,o,a)}constructEllipticArcGeneral(t,e,s,n,i,r){this.m_semiMajorAxis=Math.abs(t),this.m_minorMajorRatio=Math.abs(e),this.m_minorMajorRatio>1&&(this.m_semiMajorAxis*=this.m_minorMajorRatio,this.m_minorMajorRatio=1/this.m_minorMajorRatio);const o=Yh(r),a=Math.cos(o),h=Math.sin(o),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(this.m_semiMajorAxis,this.m_minorMajorRatio*this.m_semiMajorAxis),m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),l=Yh(n);m.x=u.x*Math.cos(l),m.y=u.y*Math.sin(l),m.rotateDirect(a,h),m.addThis(s);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a8)(i,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)());let g=c;Math.abs(g)===(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()&&(g=0);const d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();return d.x=u.x*Math.cos(l+g),d.y=u.y*Math.sin(l+g),d.rotateDirect(a,h),d.addThis(s),this.constructEllipticArcEndPointsCenter(m,d,this.m_semiMajorAxis,this.m_minorMajorRatio,o,Math.abs(c)>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),c>0,s)}constructEllipticArcAsNURB(t,s,n,i){(i>=1||i<0)&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("construct_elliptic_arc_as_NURB: weight"),s.isFinite()||(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("construct_elliptic_arc_as_NURB: control_point");return Gu([t,s,n],i*i,null,!1,this),this}constructCanonic(t){return this.assignCopy(t),t.isDegenerateToLine()||t.m_center.isEqual(0,0)&&0===this.m_rotation||(this.m_XStart=t.getSemiMajorAxis()*Math.cos(t.m_startAngle),this.m_YStart=t.getSemiMinorAxis()*Math.sin(t.m_startAngle),this.m_XEnd=t.getSemiMajorAxis()*Math.cos(t.getEndAngle()),this.m_YEnd=t.getSemiMinorAxis()*Math.sin(t.getEndAngle()),this.m_center.setCoords(0,0),this.m_rotation=0,this.m_cosr=1,this.m_sinr=0,Uu(this),this.afterCompletedModification(),t!==this&&ns(this,t)),this}isCircular(){return 1===this.m_minorMajorRatio&&0===this.m_rotation&&!this.isDegenerateToLine()}isDegenerateToLineHelper(t){if(this.isLine())return!0;if(this.isMajor())return!1;const e=this.getEndXY().sub(this.getStartXY()).length();return!(this.calculateLength2D()-e>t)}isDegenerateToLine(){return Eu(this)}getCenter(){return this.m_center.clone()}setCenter(t){if(!this.m_center.isNAN()){const e=t.sub(this.m_center);this.m_XStart+=e.x,this.m_YStart+=e.y,this.m_XEnd+=e.x,this.m_YEnd+=e.y,this.m_interior.addThis(e),this.m_center.assign(t),this.endPointModified(),this.normalizeAfterEndpointChange()}}getAxisXRotation(){return this.m_rotation}getSemiAxes(){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.construct(this.m_semiMajorAxis,this.m_semiMajorAxis*this.m_minorMajorRatio)}getSemiMajorAxis(){return this.m_semiMajorAxis}getSemiMinorAxis(){return this.m_semiMajorAxis*this.m_minorMajorRatio}getMinorMajorRatio(){return this.m_minorMajorRatio}isClockwise(){return!qu(this)}isMajor(){return Vu(this)}getSweepAngle(){return this.m_sweepAngle}getStartAngle(){return this.m_startAngle}getEndAngle(){return this.m_startAngle+this.m_sweepAngle}getGeometryType(){return _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc}queryEnvelope(t){if(4===t.m_EnvelopeType){t.setEmpty(),t.assignVertexDescription(this.m_description);const e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();this.queryEnvelope(e),t.setEnvelope(e);for(let s=1,n=this.m_description.getAttributeCount();s<n;s++){const e=this.m_description.getSemantics(s);for(let n=0,i=Xh.getComponentCount(e);s<i;s++){const s=this.queryInterval(e,n);t.setIntervalEnvelope(e,n,s)}}}else 2===t.m_EnvelopeType?$u(this,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),t):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d not impl")}applyTransformation(t){Tu(this,t,!1,null,null)}createInstance(){return new qh}calculateLength2D(){return fu(this,0,1)}queryControlPointsHelper(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}queryCoord2D(t,e){if(Eu(this))fs(t,this.getStartXY(),this.getEndXY(),e);else if(0===t)e.assign(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.construct(this.m_XStart,this.m_YStart));else if(1===t)e.assign(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.construct(this.m_XEnd,this.m_YEnd));else{const s=gu(this,t),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(this.m_semiMajorAxis*Math.cos(s),this.get
1SemiMinorAxis()*Math.sin(s));n.rotateDirect(this.m_cosr,this.m_sinr),n.addThis(this.m_center),e.assign(n)}}queryCoord2DE(t,e){iu(this,t,e)}queryCoord2DMP(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}getCoordX(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2D(t,e),e.x}getCoordY(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2D(t,e),e.y}cut(t,e,s){const n=new Pm;return this.queryCut(t,e,n,s),n.releaseSegment()}queryCut(t,e,s,n){const i=s.createEllipticArc();n&&i.dropAllAttributes();let r=0===t&&1===e;if(r&&!n)return void this.copyTo(i);const o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();this.queryCoord2D(t,o);const a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(this.queryCoord2D(e,a),!r)if(o.equals(a))e-t>.5&&this.isMajor()&&this.isClosed()?(r=!0,t=0,e=1):1===e?t=e:e=t;else if(t>0&&o.isEqual(this.m_XStart,this.m_YStart)&&(t=0),e<1&&a.isEqual(this.m_XEnd,this.m_YEnd)&&(e=1),r=0===t&&1===e,r&&!n)return void this.copyTo(i);if(i.m_center.assign(this.m_center),i.m_semiMajorAxis=this.m_semiMajorAxis,i.m_minorMajorRatio=this.m_minorMajorRatio,i.m_interior.assign(this.m_interior),i.m_rotation=this.m_rotation,i.m_cosr=this.m_cosr,i.m_sinr=this.m_sinr,i.m_sweepAngle=this.m_sweepAngle,i.m_startAngle=this.m_startAngle,i.m_bits=this.m_bits,Ze(i,o.x,o.y),Ue(i,a.x,a.y),r)return void Mu(i,Pu(this));i.m_startAngle=gu(this,t),i.m_sweepAngle=gu(this,e)-i.m_startAngle,i.m_startAngle=hu(i.m_startAngle),Fu(i,Math.abs(i.m_sweepAngle)>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()),n&&i.assignVertexDescription(this.m_description),Uu(i),lu(i);const h=this.m_description.getAttributeCount();if(h>1&&!n){for(let e=1;e<h;e++){const s=this.m_description.getSemantics(e),n=Xh.getComponentCount(s);for(let e=0;e<n;e++){const n=this.getAttributeAsDbl(t,s,e);i.setStartAttribute(s,e,n)}}for(let t=1;t<h;t++){const s=this.m_description.getSemantics(t),n=Xh.getComponentCount(s);for(let t=0;t<n;t++){const n=this.getAttributeAsDbl(e,s,t);i.setEndAttribute(s,t,n)}}}i.afterCompletedModification()}queryDerivative(t,e){nm(this,t,e)}cutArcIgnoreAttributes(t,e,s){let n=0===t&&1===e;const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(t,i);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(e,r),n||(i.equals(r)?e-t>.5&&this.isMajor()&&this.isClosed()?(n=!0,t=0,e=1):1===e?t=e:e=t:(t>0&&i.isEqual(this.m_XStart,this.m_YStart)&&(t=0),e<1&&r.isEqual(this.m_XEnd,this.m_YEnd)&&(e=1),n=0===t&&1===e)),s.m_center.assign(this.m_center),s.m_semiMajorAxis=this.m_semiMajorAxis,s.m_minorMajorRatio=this.m_minorMajorRatio,s.m_interior.assign(this.m_interior),s.m_rotation=this.m_rotation,s.m_cosr=this.m_cosr,s.m_sinr=this.m_sinr,s.m_sweepAngle=this.m_sweepAngle,s.m_startAngle=this.m_startAngle,s.m_bits=this.m_bits,Ze(s,i.x,i.y),Ue(s,r.x,r.y),n?Mu(s,Pu(this)):(s.m_startAngle=gu(this,t),s.m_sweepAngle=gu(this,e)-s.m_startAngle,s.m_startAngle=hu(s.m_startAngle),Fu(s,Math.abs(s.m_sweepAngle)>Math.PI),Uu(s),s.afterCompletedModification())}changeEndPoints2D(t,e){xu(this,t,e,!1)}getAttributeAsDbl(t,e,s){if(0===e)return 0===s?this.getCoordX(t):this.getCoordY(t);if(0===t)return this.getStartAttributeAsDbl(e,s);if(1===t)return this.getEndAttributeAsDbl(e,s);const n=this.calculateLength2D(),i=n>0?this.tToLength(t)/n:0,r=Xh.getInterpolation(e),o=this.getStartAttributeAsDbl(e,s),a=this.getEndAttributeAsDbl(e,s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.V)(r,o,a,i,Xh.getDefaultValue(e))}getClosestCoordinate(t,e){return tm(this,t,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),e)}getClosestCoordinateOnInterval(t,e,s=-1){return tm(this,t,e,!1)}getYMonotonicParts(t,n=!1){t.length<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const i=this.getSemiAxes(),r=Math.atan2(i.y*this.m_cosr,i.x*this.m_sinr),o=r+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(3,Number.NaN);let h=0;if(a[0]=cu(this,r),a[0]>0&&a[0]<1&&h++,a[1]=cu(this,o),a[1]>0&&a[1]<1&&(a[h]=a[1],h++),0===h)return 0;a[h]=1,h++,(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=h);let u=0;for(let e=0;e<h;e++){const s=a[e];this.queryCut(u,s,t[e],n),u=s}return h}getMonotonicParts(t,n){if(t.length<4&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),this.isDegenerateToLine())return t[0].createEllipticArc().assignCopy(this),n&&t[0].get().dropAllAttributes(),1;const i=this.getSemiAxes(),r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(4,Number.NaN);r[0]=Math.atan2(i.y*this.m_cosr,i.x*this.m_sinr),r[1]=r[0]+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),r[2]=Math.atan2(-i.y*this.m_sinr,i.x*this.m_cosr),r[3]=r[2]+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();const o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(5,Number.NaN);let a=0;for(let e=0;e<4;e++)o[a]=cu(this,r[e]),o[a]>0&&o[a]<1&&a++;if(0===a)return 0;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Z)(o,a),o[a-1]<1&&(o[a]=1,a++),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=a);let h=0;for(let e=0;e<a;e++){const s=o[e];this.queryCut(h,s,t[e],n),h=s}return a}intersectionWithAxis2D(t,e,s,n){if(Eu(this)){return new fm({start:this.getStartXY(),end:this.getEndXY()}).intersectionWithAxis2D(t,e,s,n)}let i,r;const o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(e),a=this.getSemiAxes();if(t){if(e>this.m_center.y+a.x||e<this.m_center.y-a.x)return 0;i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(a.x).mulThis(this.m_sinr),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(a.y).mulThis(this.m_cosr),o.subThis(this.m_center.y)}else{if(e>this.m_center.x+a.x||e<this.m_center.x-a.x)return 0;i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(a.x).mulThis(this.m_cosr),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(a.y).mulThis(-this.m_sinr),o.subThis(this.m_center.x)}const h=i.sqr(),u=r.sqr(),m=h.addE(u),l=r.mulE(o).mulThis(-2),c=o.sqr().subThisE(h),g=l.sqr().subThisE(m.mulE(c).mulThis(4)),d=i.mulE(o).mulThis(-2),_=o.sqr().subThisE(u),p=d.sqr().subThisE(m.mulE(_).mulThis(4));
vendor: 5,983 bytes, line 1
1let f=g.eps()*Math.abs(p.value())<=p.eps()*Math.abs(g.value());f?i.isZero()&&(f=!1):r.isZero()&&(f=!0),f||(l.setE(d),c.setE(_));const P=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,2);let y=dn(m,l,c,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(-1,1),!1,P);if(0===y)return 0;const x=[0,0];let C=0;for(let v=0;v<y;v++){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;f?(t.setE(P[v]),e.setE(o.subE(r.mulE(P[v])).divThisE(i))):(e.setE(P[v]),t.setE(o.subE(i.mulE(P[v])).divThisE(r)));const s=cu(this,Math.atan2(t.value(),e.value()));s>=0&&s<=1&&(x[C]=s,C++)}return y=C,0===y?0:(2===y&&x[0]>x[1]&&(x[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(x[0],x[0]=x[1])),n&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(n,x,0,0,y),s&&(s[0]=t?this.getCoordX(x[0]):this.getCoordY(x[0]),y>1&&(s[1]=t?this.getCoordX(x[1]):this.getCoordY(x[1]),!n&&s[0]>s[1]&&(s[1]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[1])))),y)}intersectionOfYMonotonicWithAxisX(t,e){if(this.m_YStart===this.m_YEnd)return t===this.m_YStart?e:Number.NaN;if(t===this.m_YStart)return this.m_XStart;if(t===this.m_YEnd)return this.m_XEnd;const s=[0,0];return-1===this.intersectionWithAxis2D(!0,t,s,null)?e:s[0]}isCurve(){return!0}isDegenerate(t){return ze(this,t)}isDegenerate3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}queryLooseEnvelope(t){3!==t.m_EnvelopeType?this.queryLooseEnvelopeOnInterval(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1),t):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d not impl")}clone(t){const e=new qh;return this.copyTo(e),e}queryInterval(t,e){if(0===t){if(Eu(this))return 0===e?_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(this.getStartX(),this.getEndX()):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(this.getStartY(),this.getEndY());let t;const s=this.getSemiAxes();t=0===e?Math.atan2(-s.y*this.m_sinr,s.x*this.m_cosr):Math.atan2(s.y*this.m_cosr,s.x*this.m_sinr);const n=t+Math.PI,i=[0,0];i[0]=cu(this,t),i[1]=cu(this,n);const r=0===e?_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(this.getStartX(),this.getEndX()):_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(this.getStartY(),this.getEndY()),o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let a=0;a<2;a++){const t=i[a];t>0&&t<1&&(this.queryCoord2D(t,o),r.mergeNeCoordinate(0===e?o.x:o.y))}return r}return super.queryInterval(t,e)}queryLooseEnvelopeOnInterval(t,e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1);if(s.intersect(t),s.isEmpty())return void e.setEmpty();if(Eu(this))return e.setCoords(this.getCoord2D(s.vmin)),void e.mergeNe(this.getCoord2D(s.vmax));const n=this.getCoord2D(s.vmin),i=this.getCoord2D(s.vmax);if(1===this.m_minorMajorRatio&&Math.abs(this.m_sweepAngle)*s.width()<=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.o){let t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(n,i,.5);const s=t.sub(this.m_center);return s.normalize(),t=t.add(s.mul(.5*_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(n,i))),e.setCoords(n),e.mergeNe(i),void e.mergeNe(t)}$u(this,s,e)}tToLength(t){return Eu(this)?t*_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY()):1===this.m_minorMajorRatio?Math.abs(this.getSweepAngle()*t)*this.m_semiMajorAxis:Du(this,t)}parametricAngleToT(t){return cu(this,t)}tToParametricAngle(t){return gu(this,t)}lengthToT(t){if(Eu(this)){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY());return 0===e?0:t/e}if(1===this.m_minorMajorRatio){const e=Math.abs(this.getSweepAngle())*this.m_semiMajorAxis;return 0===e?0:t/e}return wu(this,t)}calculateWeightedAreaCentroid2D(t){if(Eu(this)){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return t.setCoords(0,0),t}const e=Hu(this),s=this.getStartXY().sub(this.m_center),n=this.getEndXY().sub(this.m_center),i=this.m_semiMajorAxis,r=this.getSemiMinorAxis(),o=this.m_startAngle+this.m_sweepAngle,a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;a.x=i*r*(i*this.m_cosr*(-Math.sin(o)+Math.sin(this.m_startAngle))+r*(-Math.cos(o)+Math.cos(this.m_startAngle))*this.m_sinr)/3,a.y=i*r*(r*(Math.cos(o)-Math.cos(this.m_startAngle))*this.m_cosr+i*(-Math.sin(o)+Math.sin(this.m_startAngle))*this.m_sinr)/3;const h=n.add(s).mul(n.crossProduct(s)/6);return a.x-=h.x,a.y-=h.y,a.add(this.m_center.sub(t).mul(e))}calculateWeightedCentroid2D(){const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(this.isDegenerate(0))return t.setCoords(0,0),t;if(Eu(this))return t.assign(this.getCoord2D(.5).mul(this.calculateLength2D())),t;let e=this.m_startAngle,s=this.m_startAngle+this.m_sweepAngle;if(s<e){const t=e;e=s,s=t}const n=Math.sin(e),i=Math.sin(s),r=Math.cos(e),o=Math.cos(s);if(1===this.m_minorMajorRatio){const e=this.getSemiMajorAxis(),s=e*e,a=s*(i-n),h=s*(r-o);t.setCoords(a,h)}else{const e=this.getSemiMajorAxis(),s=this.getSemiMinorAxis(),a=e*e,h=s*s,u=e*s,m=a-h,l=m/h,c=m/a,g=Math.sqrt(l),d=Math.sqrt(c),_=.5*u*(Math.asinh(g*i)/g+i*Math.sqrt(1+l*i*i))-.5*u*(Math.asinh(g*n)/g+n*Math.sqrt(1+l*n*n)),p=-.5*u*(Math.asin(d*o)/d+o*Math.sqrt(1-c*o*o))- -.5*u*(Math.asin(d*r)/d+r*Math.sqrt(1-c*r*r));t.setCoords(_,p)}return t.rotateDirect(this.m_cosr,this.m_sinr),t.assign(t.add(this.m_center.mul(this.calculateLength2D()))),t}isIntersectingPoint(t,e,s){if(s&&(t.isEqualPoint2D(this.getStartXY())||t.isEqualPoint2D(this.getEndXY())))return!1;if(!Eu(this)){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,this.m_center),n=this.getSemiAxes();if(s<n.x-e||s>n.y+e)return!1}const n=this.getClosestCoordinate(t,!1),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(n,i);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,t)<=e}isIntersectingPoint3D(t,e,n,i,r=1){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}getTangent(t){if(Eu(this))return this.getEndXY().sub(this.getStartXY());{const e=gu(this,t),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;
1return s.setCoords(-this.m_semiMajorAxis*Math.sin(e),this.getSemiMinorAxis()*Math.cos(e)),this.m_rotation&&s.rotateDirect(this.m_cosr,this.m_sinr),s.scale(this.getSweepAngle()),s}}getDerivative(t){if(Eu(this))return this.getEndXY().sub(this.getStartXY());{const e=gu(this,t),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return s.setCoords(-this.m_semiMajorAxis*Math.sin(e),this.getSemiMinorAxis()*Math.cos(e)),this.m_rotation&&s.rotateDirect(this.m_cosr,this.m_sinr),s.scale(this.getSweepAngle()),s}}normalizeAfterEndpointChange(){return!!Ru(this)&&(Eu(this)?(zu(this),!1):Bu(this,!1))}projectionBehavior(){return(4&this.m_bits)>>2}setProjectionBehavior(t){this.m_bits=-5&this.m_bits|t<<2}convertToCanonic(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.x,t.y);return e.subThis(this.m_center),e.rotateReverse(this.m_cosr,this.m_sinr),e}convertFromCanonic(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.x,t.y);return e.rotateDirect(this.m_cosr,this.m_sinr),e.addThis(this.m_center),e}canonicToWorldTransformation(t){t.setRotate(this.m_cosr,this.m_sinr),t.shiftCoords(this.m_center.x,this.m_center.y)}getCurvature(t){const e=gu(this,t),s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,n=this.getSemiMinorAxis();s.setCoords(-this.m_semiMajorAxis*Math.sin(e),n*Math.cos(e));const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;i.setCoords(-this.m_semiMajorAxis*Math.cos(e),-n*Math.sin(e)),this.m_rotation&&(s.rotateDirect(this.m_cosr,this.m_sinr),i.rotateDirect(this.m_cosr,this.m_sinr));const r=s.sqrLength();if(0===r)return Number.NaN;const o=Math.sqrt(r);s.divThis(o);return s.crossProduct(i)/r}getMonotonicPartParams(t,s){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(6,Number.NaN);n[0]=0;let i=1;if(this.isDegenerateToLine())n[1]=1,i=2;else{const t=this.getSemiAxes(),e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(4,Number.NaN);this.m_rotation?(e[0]=Math.atan2(t.y*this.m_cosr,t.x*this.m_sinr),e[1]=e[0]+Math.PI,e[2]=Math.atan2(-t.y*this.m_sinr,t.x*this.m_cosr),e[3]=e[2]+Math.PI):(e[0]=0,e[1]=Math.PI,e[2]=.5*Math.PI,e[3]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a0)());for(let s=0;s<4;s++){const t=cu(this,e[s]);t>0&&t<1&&(n[i]=t,i++)}i>2&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.Z)(n,i),n[i]=1,i++}if(s){t<i&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");for(let t=0;t<i;t++)s[t]=n[t]}return i}calculateLowerLength2D(){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY());if(this.isDegenerateToLine())return t;const e=Math.abs(this.m_sweepAngle)*this.getSemiMinorAxis();return Math.max(e,t)}calculateUpperLength2D(){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(this.getStartXY(),this.getEndXY());if(this.isDegenerateToLine())return t;const e=Math.abs(this.m_sweepAngle)*this.getSemiMajorAxis();return Math.max(e,t)}orientBottomUp(){if(this.m_YEnd<this.m_YStart||this.m_YEnd===this.m_YStart&&this.m_XEnd<this.m_XStart){this.m_XEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_XStart,this.m_XStart=this.m_XEnd),this.m_YEnd=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_YStart,this.m_YStart=this.m_YEnd);for(let t=0,e=this.m_description.getTotalComponentCount()-2;t<e;t++)this.m_attributes[t+e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(this.m_attributes[t],this.m_attributes[t]=this.m_attributes[t+e]);this.m_startAngle=this.m_startAngle+this.m_sweepAngle,this.m_sweepAngle=-this.m_sweepAngle}}isLine(){return Eu(this)}copyIgnoreAttributes(t){t.m_XStart=this.m_XStart,t.m_YStart=this.m_YStart,t.m_XEnd=this.m_XEnd,t.m_YEnd=this.m_YEnd,t.m_center.assign(this.m_center),t.m_semiMajorAxis=this.m_semiMajorAxis,t.m_minorMajorRatio=this.m_minorMajorRatio,t.m_interior.assign(this.m_interior),t.m_rotation=this.m_rotation,t.m_cosr=this.m_cosr,t.m_sinr=this.m_sinr,t.m_sweepAngle=this.m_sweepAngle,t.m_startAngle=this.m_startAngle,t.m_bits=this.m_bits,Yu(t)}
1calculateArea2DHelper(){return Hu(this)}absNorm(){let t=this.getStartXY().norm(1)+this.getEndXY().norm(1);return this.isDegenerateToLine()||(t+=this.m_center.norm(1),t+=this.m_semiMajorAxis),t}queryEnvelopeW(t,e){if(e.setCoords(this.getCoord2D(t.vmin)),e.mergeNe(this.getCoord2D(t.vmax)),Eu(this))return;const s=this.getSemiAxes(),n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(8,Number.NaN);{const t=Math.atan2(-s.y*this.m_sinr,s.x*this.m_cosr),e=t+Math.PI,i=Math.atan2(s.y*this.m_cosr,s.x*this.m_sinr),r=i+Math.PI;n[0]=cu(this,t),n[1]=cu(this,e),n[2]=cu(this,i),n[3]=cu(this,r)}{const t=this.m_cosr+this.m_sinr,e=this.m_cosr-this.m_sinr,i=Math.atan2(-s.y*t,s.x*e),r=i+Math.PI,o=Math.atan2(s.y*e,s.x*t),a=o+Math.PI;n[4]=cu(this,i),n[5]=cu(this,r),n[6]=cu(this,o),n[7]=cu(this,a)}const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();for(let r=0;r<8;r++){const s=n[r];t.containsExclusiveCoordinate(s)&&(this.queryCoord2D(s,i),e.mergeNe(i))}}setSegmentFromCoordsForStitcher(t,e){Cu(this,t,e)}writeInBufferStream(t,e){const s=new Float64Array(10);return s[0]=this.m_bits,s[1]=this.m_semiMajorAxis,s[2]=this.m_minorMajorRatio,s[3]=this.m_rotation,s[4]=this.m_center.x,s[5]=this.m_center.y,s[6]=this.m_sweepAngle,s[7]=this.m_startAngle,s[8]=this.m_interior.x,s[9]=this.m_interior.y,t.writeRangeFromArray(e,s.length,s,!0,1),e+s.length}readFromBufferStream(t,e){const s=new Float64Array(10);t.queryRange(e,s.length,s,!0,1),this.m_bits=s[0],this.m_semiMajorAxis=s[1],this.m_minorMajorRatio=s[2],this.m_rotation=s[3],this.m_center.x=s[4],this.m_center.y=s[5],this.m_sweepAngle=s[6],this.m_startAngle=s[7],this.m_interior.x=s[8],this.m_interior.y=s[9],this.m_cosr=Math.cos(this.m_rotation),this.m_sinr=Math.sin(this.m_rotation),this.m_cachedValues=null}snapControlPoints(t){return!1}needsSnapControlPoints(t){return!1}calculateSpecialPointsForCracking(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("should not1; be called"),0}ensureXYMonotone(){if(Eu(this))return!1;if(this.getStartXY().equals(this.getEndXY()))return Su(this,this.getStartXY(),this.getEndXY(),this.projectionBehavior()),!0;const t=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);let e=ku(this,t);if(Ua(t)){let s=!1;if(0===this.projectionBehavior()){const n=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;n.setCoords({pt:t[0]}),n.mergeNe(t[2]);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;i.setSub(t[2],t[0]),i.leftPerpendicularThis(),i.normalize(),i.scale(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[2],t[0]));const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(t[2],t[0],.5),o=r.sub(i),a=r.add(i);n.clipLine(o,a);const h=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getClosestCoordinate(o,a,t[1],!1);t[1]=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(o,a,h);const u=t[2].sub(t[1]),m=t[0].sub(t[1]),l=u.crossProduct(m),c=u.dotProduct(m);e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)()-Math.abs(.5*Math.atan2(l,c)),s=!0}return Gu(t,e*e,null,s,this),!0}return!1}setCoordsForIntersector(t,e,s){xu(this,t,e,s)}getInteriorPoint(){return this.m_interior.clone()}copyToImpl(t){const e=t;e.m_center.assign(this.m_center),e.m_semiMajorAxis=this.m_semiMajorAxis,e.m_minorMajorRatio=this.m_minorMajorRatio,e.m_interior.assign(this.m_interior),e.m_rotation=this.m_rotation,e.m_cosr=this.m_cosr,e.m_sinr=this.m_sinr,e.m_sweepAngle=this.m_sweepAngle,e.m_startAngle=this.m_startAngle,e.m_bits=this.m_bits,Mu(e,Pu(this))}reverseImpl(){Xu(this,!qu(this)),lu(this),(0!==this.projectionBehavior()||this.getStartXY().equals(this.getEndXY()))&&Uu(this)}equalsImpl(t){const e=t;if(this.m_bits!==e.m_bits)return!1;if(this.m_semiMajorAxis!==e.m_semiMajorAxis)return!1;if(this.m_minorMajorRatio!==e.m_minorMajorRatio)return!1;if(!(this.m_center.isEqualPoint2D(e.m_center)||this.m_center.isNAN()&&e.m_center.isNAN()))return!1;if(this.m_rotation!==e.m_rotation)return!1;if(!this.m_interior.equals(e.m_interior))return!1;const s=e.m_sweepAngle;if(this.m_sweepAngle!==s)return!1;const n=e.m_startAngle;return this.m_startAngle===n}equalsImplTol(t,e){const s=t;if(this.m_bits!==s.m_bits)return!1;if(this.m_center.isNAN()&&s.m_center.isNAN())return!0;
1if(this.m_center.isNAN()!==s.m_center.isNAN())return!1;if(!this.getSemiAxes().isEqualPoint2D(s.getSemiAxes(),e))return!1;if(!this.m_center.isEqualPoint2D(s.m_center,e))return!1;const n=Math.abs(Th(Ah(Ih(this.m_rotation-s.m_rotation)))),i=Math.abs((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()-n),r=Math.min(n,i);if(this.m_semiMajorAxis*Math.abs(r)>e)return!1;const o=this.getCoord2D(.5),a=s.getCoord2D(.5);return!!o.isEqualPoint2D(a,e)}swapImpl(t){const e=t;this.m_center=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_center,e.m_center=this.m_center),this.m_semiMajorAxis=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_semiMajorAxis,e.m_semiMajorAxis=this.m_semiMajorAxis),this.m_minorMajorRatio=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_minorMajorRatio,e.m_minorMajorRatio=this.m_minorMajorRatio),this.m_interior=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_interior,e.m_interior=this.m_interior),this.m_rotation=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_rotation,e.m_rotation=this.m_rotation),this.m_cosr=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_cosr,e.m_cosr=this.m_cosr),this.m_sinr=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_sinr,e.m_sinr=this.m_sinr),this.m_sweepAngle=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_sweepAngle,e.m_sweepAngle=this.m_sweepAngle),this.m_startAngle=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_startAngle,e.m_startAngle=this.m_startAngle),this.m_bits=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e.m_bits,e.m_bits=this.m_bits),Nu(this,e)}afterCompletedModification(){zu(this),Yu(this)}intersect(t,e,s,n,i){return mm(!1,this,t,e,s,n,i)}intersectPoint(t,e,s){if(e.length<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)(""),Eu(this)){return new fm({start:this.getStartXY(),end:this.getEndXY()}).intersectPoint(t,e,s)}{const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,this.m_center);if(e>this.m_semiMajorAxis+s||e<this.getSemiMinorAxis()-s)return 0}const i=this.getClosestCoordinate(t,!1),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();return this.queryCoord2D(i,r),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(r,t)<=s?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(i,0,1)&&(this.queryCoord2D(0===i?1:0,r),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(r,t)<=s)?(e&&(e[0]=0,e[1]=1),2):(e&&(e[0]=i),1):0}isIntersecting(t,e,s){return 0!==om(!1,this,t,e,s)}endPointModified(){this.m_bits|=8,Yu(this)}clearEndPointModified(){zu(this)}}function Fh(t,e,s){t.isEmpty()&&o(""),f(t);const n=t.getImpl(),i=[];return Rh(n.getPointCount(),i),zh(Lh(n),i,n.getPointCount(),e)}function Vh(t,e,s,n){const i=[];return Rh(e,i),zh(t,i,e,s)}function Lh(t){return{at:e=>t.getXY(e)}}function Rh(t,e){e.length=t;for(let s=0;s<e.length;++s)e[s]=s;t>3&&fe(t,e)}function zh(t,e,s,n,i){let r=0;const o=[0,0,0];let a=0;const h=3;let u=0;for(let m=0;m<h;++m){let i=!1;for(;u<s;){const s=t.at(e[u]);let l=1;if(3===r?l=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.inCircleRobust(t.at(n[0]),t.at(n[1]),t.at(n[2]),s):2===r?l=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.inCircleRobust3Point(t.at(n[0]),t.at(n[1]),s):1===r&&s.equals(t.at(n[0]))&&(l=0),l<=0){if(l<0&&m+1<h){e[a]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[u],e[u]=e[a]);for(let t=0;t<r;t++)if(n[t]===e[u]){o[t]=u;break}a++}u++;continue}i=!0;let c=0;for(let t=0;t<r;t++)o[t]>u&&(n[c]=n[t],o[c]=o[t],c++);r=c,n[r]=e[u],o[r]=u,r++,r<3?u=a:(1===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(t.at(n[0]),t.at(n[1]),t.at(n[2]))&&(n[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[2]),o[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[0],o[0]=o[2])),u++)}if(!i)break;if(m+1<h){a=0;let s=!1;for(let t=0;t<r;t++)for(let e=t+1;e<r;e++)o[t]>o[e]&&(o[e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[t],o[t]=o[e]),n[e]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[t],n[t]=n[e]),s=!0);for(let t=0;t<r;t++)e[o[t]]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e[t],e[t]=e[o[t]]),o[t]=t;s&&3===r&&1===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.orientationRobust(t.at(n[0]),t.at(n[1]),t.at(n[2]))&&(n[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(n[0],n[0]=n[2]),o[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(o[0],o[0]=o[2]))}u=r}return r}function Bh(t,e,s,n,i,r){return new Zh(0,0,0,null,!1,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()).densifyEx(t,e,s,n,!1,r)}function kh(t,s,n,r){return Number.isFinite(s)||e("replace_all_curves_with_beziers: maxDeviation"),Qh(i.enumBezier,t,s,n)}function Gh(t,e,n,r,o,h,u,m){h&&(h.length=0),u&&(u.length=0);const l=t.getGeometryType();if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)return h&&(h.push(t.getStartXY()),h.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),h.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),h.push(t.getEndXY())),u&&(u.push(0),u.push(1)),1;if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier){if(!r)return h&&(h.push(t.getStartXY()),h.push(t.getControlPoint1()),h.push(t.getControlPoint2()),h.push(t.getEndXY())),u&&(u.push(0),u.push(1)),1;const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(9,Number.NaN);let s=t.getMonotonicPartParams(e.length,e);if(e.length=s,s=Hh(t,n,e),2===s&&o&&(e[1]=.5,e.push(1),s=3),u&&u.splice(0,0,...e.slice(0,s)),h){const n=new Pm;for(let i=1;i<s;
1i++){const s=e[i-1],r=e[i];t.queryCut(s,r,n,!0);const o=n.get();co(o),1===i&&h.push(o.getStartXY()),h.push(o.getControlPoint1()),h.push(o.getControlPoint2()),h.push(o.getEndXY())}}return s-1}if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const i=t;if(i.isDegenerateToLine()||i.isDegenerate(0))return h&&(h.push(t.getStartXY()),h.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),h.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),h.push(t.getEndXY())),u&&(u.push(0),u.push(1)),1;if(r&&(o||!i.isMonotoneQuickAndDirty())){const a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(6,Number.NaN);let m=i.getMonotonicPartParams(a.length,a);a.length=m,m=Hh(t,n,a),2===m&&o&&(a[1]=.5,a.push(1),m=3);let l=0;if(m>2){const t=new Pm,o=u||[];let c=0;for(let g=1;g<m;g++){const d=a[c],_=a[g];if(i.queryCut(d,_,t,!0),t.get().isDegenerate(0))continue;const p=o.length,f=Jh(1===g,t.get(),e,n,r,h,u);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(f>0),l+=f;const P=g===m-1,y=a[c],x=t.get().getSweepAngle()/i.getSweepAngle();for(let t=p,e=o.length;t<e;t++)if(o[t]=!P||t+1<e?y+o[t]*x:1,h){const e=3*t,s=i.getCoord2D(o[t]);if(h[e].setCoordsPoint2D(s),e>0){go(h.slice(e-3))}}c=g}return l}}return Jh(!0,i,e,n,r,h,u)}if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2){const s=t;if(r&&(o||!s.isMonotoneQuickAndDirty())){const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(6,Number.NaN);let r=s.getMonotonicPartParams(i.length,i);i.length=r,r=Hh(t,n,i),2===r&&o&&(i[1]=.5,i.push(1),r=3);let a=0;if(r>2){const t=new Pm,o=u||[];for(let m=1;m<r;m++){const l=i[m-1],c=i[m];s.queryCut(l,c,t,!0);const g=o.length;a+=$h(1===m,t.get(),e,n,!1,h,u);const d=m===r-1,_=i[m-1];for(let t=g,e=o.length;t<e;t++)if(o[t]=!d||t+1<e?_+o[t]:1,h){const e=3*t,n=s.getCoord2D(o[t]);if(h[e].setCoordsPoint2D(n),e>0){Ti(h.slice(e-3))}}}return a}}return $h(!0,s,e,n,r,h,u)}if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2){const s=t,i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);s.queryControlPoints(i);const a=new ra;a.constructFromQuadratic(i);const m=Gh(a,e,n,r,o,h,u);if(null!=h&&null!=u){const t=3;for(let e=1,n=0;e<m;++e,n+=t){const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;s.queryCoord2D(u[e],i);const o=h[n+t];if(!i.equals(o)&&(h[n+t].setCoordsPoint2D(i),r)){go(h.slice(n,n+4))}}}return m}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}function Wh(t,e,s,n,r,o,h,u){o&&(o.length=0),h&&(h.length=0);const m=t.getGeometryType();if(m===i.enumLine)return o&&(o.push(t.getStartXY()),o.push(J.getNAN()),o.push(t.getEndXY())),h&&(h.push(0),h.push(1)),1;if(m===i.enumBezier2){const e=O(9,Number.NaN);let n=t.getMonotonicPartParams(e.length,e);if(e.length=n,n=Hh(t,s,e),h&&h.splice(0,0,...e.slice(0,n)),o){const s=new Pm;for(let i=1;i<n;i++){const n=e[i-1],r=e[i];t.queryCut(n,r,s,!0);const a=s.get();Ai(a),1===i&&o.push(a.getStartXY()),o.push(a.getControlPoint1()),o.push(a.getEndXY())}}return n-1}if(m===i.enumEllipticArc){const i=t;if(i.isDegenerateToLine()||i.isDegenerate(0))return o&&(o.push(t.getStartXY()),o.push(J.getNAN()),o.push(t.getEndXY())),h&&(h.push(0),h.push(1)),1;if(!i.isMonotoneQuickAndDirty()){const n=O(6,Number.NaN);let r=i.getMonotonicPartParams(n.length,n);n.length=r,r=Hh(t,s,n);let a=0;if(r>2){const t=new Pm,u=h||[];for(let m=1;m<r;m++){const l=n[m-1],c=n[m];i.queryCut(l,c,t,!0);const g=u.length;a+=tu(1===m,t.get(),e,s,!1,o,h);const d=m===r-1,_=n[m-1],p=t.get().getSweepAngle()/i.getSweepAngle();for(let t=g,e=u.length;t<e;t++)if(u[t]=!d||t+1<e?_+u[t]*p:1,o){const e=2*t,s=i.getCoord2D(u[t]);if(o[e].setCoordsPoint2D(s),e>0){Ti(o.slice(e-2))}}}return a}}return Jh(!0,i,e,s,n,o,h)}if(m===i.enumBezier){const i=t;if(!i.isMonotoneQuickAndDirty()){const n=O(6,Number.NaN);let r=i.getMonotonicPartParams(n.length,n);n.length=r,r=Hh(t,s,n);let a=0;if(r>2){const t=new Pm,u=h||[];for(let m=1;m<r;m++){const l=n[m-1],c=n[m];i.queryCut(l,c,t,!0);const g=u.length;a+=eu(1===m,t.get(),e,s,!1,o,h);const d=m===r-1,_=n[m-1];for(let t=g,e=u.length;t<e;t++)if(u[t]=!d||t+1<e?_+u[t]:1,o){const e=2*t,s=i.getCoord2D(u[t]);if(o[e].setCoordsPoint2D(s),e>0){Ti(o.slice(e-2))}}}return a}}return eu(!0,i,e,s,n,o,h)}if(m===i.enumRationalBezier2){const i=t;if(!i.isMonotoneQuickAndDirty()){const n=O(6,Number.NaN);let r=i.getMonotonicPartParams(n.length,n);n.length=r,r=Hh(t,s,n);let a=0;if(r>2){const t=new Pm,u=h||[];for(let m=1;m<r;m++){const l=n[m-1],c=n[m];i.queryCut(l,c,t,!0);const g=u.length;a+=Kh(1===m,t.get(),e,s,!1,o,h);const d=m===r-1,_=n[m-1];for(let t=g,e=u.length;t<e;t++)if(u[t]=!d||t+1<e?_+u[t]:1,o){const e=2*t,s=i.getCoord2D(u[t]);if(o[e].setCoordsPoint2D(s),e>0){Ti(o.slice(e-2))}}}return a}}return Kh(!0,i,e,s,n,o,h)}a("")}function jh(t,e,n,r,o,a,h,u,m){const l=t.getGeometryType();if(a&&(a.length=0,h.length=0),u&&(u.length=0),l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const e=t;if(e.isDegenerateToLine()||e.isDegenerate(0))return a&&(a.push(t.getStartXY()),a.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),a.push(t.getEndXY()),h.push(Number.NaN),h.push(Number.NaN),h.push(Number.NaN)),u&&(u.push(0),u.push(1)),1}const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(9,Number.NaN);let g;
1if(o)g=t.getMonotonicPartParams(c.length,c),c.length=g,g=Hh(t,n,c);else{if(g=2,c[0]=0,c[1]=1,l===qh.type){const e=t.getSweepAngle();if(e>.9*Math.PI){const t=2*Math.PI/3;Math.min(3,Math.trunc(e/t+.5))>2?(c[0]=0,c[1]=1/3,c[2]=2/3,c[3]=1,g=4):(c[0]=0,c[1]=.5,c[2]=1,g=3)}}else (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(l===Dn.type);c.length=g}if(2===g&&r&&(c[1]=.5,c.push(1),g=3),a){const e=new Pm;let s=1;for(;s<g;){const n=c[s-1],r=c[s];t.queryCut(n,r,e,!0);const u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),m=[1,1,1];if(l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const t=e.get();if(Math.abs(t.getSweepAngle())>.9*Math.PI){const t=(r-n)/3;c.splice(s,0,n+t),c.splice(s+1,0,n+2*t),g+=2;continue}m[1]=ku(t,u)}else{const t=e.get();t.queryControlPoints(u),t.queryWeights(m)}o&&Ua(u),1===s&&(a.push(u[0].clone()),h.push(m[0])),a.push(u[1].clone()),a.push(u[2].clone()),h.push(m[1]),h.push(m[2]),s++}}return u&&(u.length=g,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.b)(u,c,0,0,g)),g-1}qh.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc;class Zh{static constructDefault(t){return new Zh(0,0,0,t,!1,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)())}constructor(t,e,s,n,i,r){this.m_segmentBuffer=null,this.m_dummyPoint=new _Envelope_js__WEBPACK_IMPORTED_MODULE_1__.P,this.m_progressCounter=0,this.m_progressTracker=n,this.m_bSetDensifyFlag=i,this.m_maxLength=t,this.m_maxDeviation=e,this.m_maxAngle=s>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)()?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)():s,this.m_cosMaxAngle=Math.cos(this.m_maxAngle),this.m_bOnlyCurveDensify=this.m_maxAngle>0||this.m_maxDeviation>0,this.m_maxSegmentsPerCurve=r,(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.x)(this.m_maxSegmentsPerCurve>0,"this.m_maxSegmentsPerCurve > 0"),this.m_minStep=1/this.m_maxSegmentsPerCurve}densify(t){return this.densifyGeom(t)}densifySegment(t,e){this.densifySegmentEx(t,null,!0,!1,e)}densifyEx(t,e,s,n,i,r){return this.m_maxLength=e,this.m_maxDeviation=s,this.m_maxAngle=n>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)()?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)():n,this.m_cosMaxAngle=Math.cos(this.m_maxAngle),this.m_bOnlyCurveDensify=this.m_maxAngle>0||this.m_maxDeviation>0,this.m_bSetDensifyFlag=i,this.m_maxSegmentsPerCurve=r,(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.x)(this.m_maxSegmentsPerCurve>0,"this.m_maxSegmentsPerCurve > 0"),this.m_minStep=1/this.m_maxSegmentsPerCurve,this.densifyGeom(t)}densifyGeom(t){if(t.isEmpty()||t.getDimension()<1)return t;const e=t.getGeometryType();return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.j)(e)?t:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.h)(e)?this.densifyMultiPath(t):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.f)(e)?this.densifySegmentImpl(t):e===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEnvelope?this.densifyEnvelope(t):void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}densifySegmentEx(t,e,s,n,r){const o=t.getGeometryType();if(!(this.m_maxLength>0||this.m_bOnlyCurveDensify&&o!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)&&(!n||s))return void(e?o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine?e.addSegment(t,s):(s&&(t.queryStart(this.m_dummyPoint),e.startPathPoint(this.m_dummyPoint)),t.queryEnd(this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint)):(s&&r.push(0),r.push(1)));if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier)return void this.densifyCubicBezier(t,e,s,n,r);if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2)return void this.densifyRationalBezier2(t,e,s,n,r);if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2)return void this.densifyBezier2(t,e,s,n,r);if(o===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc&&
vendor: 6,825 bytes, line 1
1!t.isLine()&&t.getMinorMajorRatio()<.25)return void this.densifyEllipticArc(t,e,s,n,r);let a=1;this.m_maxLength>0&&(a=this.calculateLengthSubdivisionStep(t,this.m_maxLength)),this.m_maxDeviation>0&&(a=Math.min(a,this.calculateDeviationSubdivisionStep(t,this.m_maxDeviation))),this.m_maxAngle>0&&(a=Math.min(a,this.calculateAngularSubdivisionStep(t,this.m_maxAngle))),this.densifySegmentByLength(t,a,e,s,n,r)}densifyMultiPath(t){if(!t.hasNonLinearSegments()){if(1===t.getDescription().getAttributeCount())return this.densifyMultiPathLinear(t);if(!(this.m_maxLength>0))return t}const e=t.createInstance();if(e.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon){e.setFillRule(t.getFillRule())}e.reserve(t.getPointCount());const s=t.getImpl().querySegmentIterator();for(;s.nextPath();){let t=!0;for(;s.hasNextSegment();){const n=s.nextSegment(),i=s.isClosingSegment();this.densifySegmentEx(n,e,t,i,null),i&&e.closePathWithLine(),t=!1}}return e}densifySegmentImpl(t){const e=new Qs({vd:t.getDescription()}),s=[0];return this.densifySegmentEx(t,e,!0,!1,s),e}densifyEnvelope(t){const e=new mr({vd:t.getDescription()});e.addEnvelope(t,!1);const s=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();t.queryEnvelope(s);const n=s.width(),i=s.height();return!(this.m_maxLength>0)||n<=this.m_maxLength&&i<=this.m_maxLength?e:this.densifyMultiPath(e)}densifyMultiPathLinear(t){if(!(this.m_maxLength>0))return t;const e=t.createInstance();if(e.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumPolygon){e.setFillRule(t.getFillRule())}e.reserve(t.getPointCount());const s=e.getImpl(),n=t.getImpl(),r=n.getAttributeStreamRef(0),o=new fm;for(let i=0,a=n.getPathCount();i<a;i++){const t=n.isClosedPath(i);if(0===n.getPathSize(i))continue;const a=n.getPathStart(i),h=r.readPoint2D(2*a),u=h.clone();s.startPath(h);for(let m=a+1,l=n.getPathEnd(i);m<l;m++){const t=r.readPoint2D(2*m),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,t);if(n>this.m_maxLength){let e=Math.ceil(n/this.m_maxLength);e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()&&(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)());const i=1/e;let r,a,h;u.compare(t)<0?(o.setStartXY(u),o.setEndXY(t),r=0,a=1):(o.setStartXY(t),o.setEndXY(u),r=e-2,a=-1);for(let t=0,n=e-1;t<n;t++,r+=a){this.progress_(),h=i*(r+1);const t=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;o.queryCoord2D(h,t),s.lineTo(t),this.m_bSetDensifyFlag&&s.setAttributeNoCurves(10,s.getPointCount()-1,0,1)}}else this.progress_();e.lineTo(t),u.assign(t)}if(t){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(u,h);if(t>this.m_maxLength){const e=h;let n=Math.ceil(t/this.m_maxLength);n>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()&&(n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)());const i=1/n;let r,a;u.compare(e)<0?(o.setStartXY(u),o.setEndXY(e),r=0,a=1):(o.setStartXY(e),o.setEndXY(u),r=n-2,a=-1);const m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0);let l;for(let t=0,h=n-1;t<h;t++,r+=a)this.progress_(),l=i*(r+1),o.queryCoord2D(l,m),s.lineTo(m),this.m_bSetDensifyFlag&&s.setAttributeNoCurves(10,s.getPointCount()-1,0,1)}s.closePathWithLine()}}return e}densifySegmentByLength(t,e,n,r,o,h){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.getGeometryType()!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier);let u=t.getStartXY().compare(t.getEndXY());if(0===u&&e<1){t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc?u=t.getSweepAngle()<0?1:-1:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("densify segment by length")}let m=0;if(r&&(n?(t.queryStart(this.m_dummyPoint),n.startPathPoint(this.m_dummyPoint)):h.push(0),++m),e*this.m_maxSegmentsPerCurve<1&&(e=1/this.m_maxSegmentsPerCurve),e<1){this.m_segmentBuffer||(this.m_segmentBuffer=new Pm);let s=Math.ceil(1/e);s>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()&&(s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.i)()),e=1/s,this.m_segmentBuffer.create(t.getGeometryType());let i,r,o,a=t;u<0?(i=0,r=1):(t.copyTo(this.m_segmentBuffer.get()),this.m_segmentBuffer.get().reverse(),i=s-2,r=-1,a=this.m_segmentBuffer.get());const l=s-1;for(let t=0;t<l;t++,i+=r)o=e*(i+1),n?(a.queryCoord(o,this.m_dummyPoint),n.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==o&&0!==o&&n.setAttribute(10,n.getPointCount()-1,0,1)):h.push(u>0?1-o:o),this.progress_();o=1,m+=l}(!o||o&&r&&m<2)&&(n?(t.queryEnd(this.m_dummyPoint),n.lineToPoint(this.m_dummyPoint)):h.push(1))}densifyCubicBezier(t,e,s,n,i){const r=new ra;let o=t;const a=t.calculateUpperLength2D();let h=t.getStartXY().compare(t.getEndXY());if(0===h&&a>0){const e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);t.queryControlPoints(e),h=e[1].compare(e[2]),0===h&&(h=e[1].compare(e[0]))}h>0&&(t.copyTo(r),r.reverse(),o=r);let u=0;s&&(e?(t.queryStart(this.m_dummyPoint),e.startPathPoint(this.m_dummyPoint)):i.push(0),++u);const m=[],l=[],c=Math.trunc(Math.log2(this.m_maxSegmentsPerCurve));let g=!0,d=0;if(h>0)for(m.push([o.getStartXY(),o.getControlPoint1(),o.getControlPoint2(),o.getEndXY(),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,1)]),l.push(0);m.length;){this.progress_();const t=m.at(-1),r=l.at(-1),a=t[4].x,h=t[4].y;if(r<c&&this.bezierNeedsSplit(t)){g&&(d=o.findMinDeriv(),g=!1);let e=.5*(a+h);Math.abs(d-e)<.4*(h-a)&&(e=d);const s=(e-a)/(h-a),n=t[0].mul(1-s).add(t[1].mul(s)),i=t[1].mul(1-s).add(t[2].mul(s)),u=t[2].mul(1-s).add(t[3].mul(s)),c=n.mul(1-s).add(i.mul(s)),_=i.mul(1-s).add(u.mul(s)),p=c.mul(1-s).add(_.mul(s)),f=t[3];t[1]=n,t[2]=c,t[3]=p,t[4].setCoords(a,e);const P=[p,_,u,f,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(e,h)];m.push(P),l[l.length-1]=r+1,l.push(r+1);continue}m.pop(),l.pop(),(m.length>0||!n||n&&s&&u<2)&&(e?(o.queryCoord(a,this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==a&&0!==a&&e.setAttribute(10,e.getPointCount()-1,0,1)):i.push(1-a),++u)}else for(m.push([o.getStartXY(),o.getControlPoint1(),o.getControlPoint2(),o.getEndXY(),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,1)]),l.push(0);m.length;){this.progress_();const t=m.at(-1),r=l.at(-1),a=t[4].x,h=t[4].y;if(r<c&&this.bezierNeedsSplit(t)){g&&(d=o.findMinDeriv(),g=!1);let e=.5*(a+h);Math.abs(d-e)<.4*(h-a)&&(e=d);const s=(e-a)/(h-a),n=t[0].mul(1-s).add(t[1].mul(s)),i=t[1].mul(1-s).add(t[2].mul(s)),u=t[2].mul(1-s).add(t[3].mul(s)),c=n.mul(1-s).add(i.mul(s)),_=i.mul(1-s).add(u.mul(s)),p=c.mul(1-s).add(_.mul(s)),f=t[0];t[0]=p,t[1]=_,t[2]=u,t[4].setCoords(e,h);const P=[f,n,c,p,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(a,e)];m.push(P),l[l.length-1]=r+1,l.push(r+1);continue}m.pop(),l.pop(),(m.length>0||!n||n&&s&&u<2)&&(e?(o.queryCoord(h,this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==h&&0!==h&&e.setAttribute(10,e.getPointCount()-1,0,1)):i.push(h),++u)}}
1densifyRationalBezier2(t,e,s,n,i){const r=new Dn;let o=t;const a=t.calculateUpperLength2D();let h=t.getStartXY().compare(t.getEndXY());0===h&&a>0&&(h=0),h>0&&(t.copyTo(r),r.reverse(),o=r);let u=0;s&&(e?(t.queryStart(this.m_dummyPoint),e.startPathPoint(this.m_dummyPoint)):i.push(0),++u);const m=Math.trunc(Math.log2(this.m_maxSegmentsPerCurve)),l=new Dn,c=[],g=[];for(c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1)),g.push(0);c.length;){this.progress_();const t=c.at(-1).clone(),r=g.at(-1);if(r<m&&this.rationalBezier2NeedsSplit(o,l,t.vmin,t.vmax)){const e=t.getCenter();h>0?(c.at(-1).vmax=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(e,t.vmax))):(c.at(-1).vmin=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(t.vmin,e))),g[g.length-1]=r+1,g.push(r+1);continue}if(c.pop(),g.pop(),c.length>0||!n||n&&s&&u<2){const s=h>0?t.vmin:t.vmax;e?(o.queryCoord(s,this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==s&&0!==s&&e.setAttribute(10,e.getPointCount()-1,0,1)):i.push(h>0?1-s:s),++u}}}densifyBezier2(t,e,s,n,i){const r=new An;let o=t;const a=t.calculateUpperLength2D();let h=t.getStartXY().compare(t.getEndXY());0===h&&a>0&&(h=0),h>0&&(t.copyTo(r),r.reverse(),o=r);let u=0;s&&(e?(t.queryStart(this.m_dummyPoint),e.startPathPoint(this.m_dummyPoint)):i.push(0),++u);const m=Math.ceil(Math.log2(this.m_maxSegmentsPerCurve)),l=new An,c=[],g=[];for(c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1)),g.push(0);c.length;){this.progress_();const t=c.at(-1).clone(),r=g.at(-1);if(r<m&&this.bezier2NeedsSplit(o,l,t.vmin,t.vmax)){const e=t.getCenter();h>0?(c.at(-1).vmax=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(e,t.vmax))):(c.at(-1).vmin=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(t.vmin,e))),g[g.length-1]=r+1,g.push(r+1);continue}if(c.pop(),g.pop(),c.length>0||!n||n&&s&&u<2){const s=h>0?t.vmin:t.vmax;e?(o.queryCoord(s,this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==s&&0!==s&&e.setAttribute(10,e.getPointCount()-1,0,1)):i.push(h>0?1-s:s),++u}}}densifyEllipticArc(t,e,s,n,i){const r=new qh;let o=t;const a=t.calculateUpperLength2D();let h=t.getStartXY().compare(t.getEndXY());0===h&&a>0&&(h=t.isClockwise()?0:1),h>0&&(t.copyTo(r),r.reverse(),o=r);let u=0;s&&(e?(t.queryStart(this.m_dummyPoint),e.startPathPoint(this.m_dummyPoint)):i.push(0),++u);const m=Math.trunc(Math.log2(this.m_maxSegmentsPerCurve)),l=new qh,c=[],g=[];for(c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(0,1)),g.push(0);c.length;){this.progress_();const t=c.at(-1).clone(),r=g.at(-1);if(r<m&&this.ellipticArcNeedsSplit(o,l,t.vmin,t.vmax)){const e=t.getCenter();h>0?(c.at(-1).vmax=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(e,t.vmax))):(c.at(-1).vmin=e,c.push(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(t.vmin,e))),g[g.length-1]=r+1,g.push(r+1);continue}if(c.pop(),g.pop(),c.length>0||!n||n&&s&&u<2){const s=h>0?t.vmin:t.vmax;e?(o.queryCoord(s,this.m_dummyPoint),e.lineToPoint(this.m_dummyPoint),this.m_bSetDensifyFlag&&1!==s&&0!==s&&e.setAttribute(10,e.getPointCount()-1,0,1)):i.push(h>0?1-s:s),++u}}}calculateLengthSubdivisionStep(t,e){const s=t.calculateUpperLength2D();if(!t.isCurve())return s?e/s:1;if(t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const n=t;if(n.isCircular()||n.isDegenerate(0)||n.isDegenerateToLine()){let t=e/s;return t<this.m_minStep&&(t=this.m_minStep),t}return e/s*n.getSemiAxes().y/n.getSemiAxes().x}t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)(""),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}calculateDeviationSubdivisionStep(t,e){if(!t.isCurve())return 1;if(t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const s=t;if(s.isDegenerate(0)||s.isDegenerateToLine())return 1;{const n=s.getSemiMajorAxis(),i=1-e/n;let r=Math.PI/2;if(i>0){const t=4*Math.sqrt(e/n*.5);r=Math.min(Math.PI/2,Math.abs(t))}r=Math.max(r,2*Math.PI/this.m_maxSegmentsPerCurve);const o=r*n;return this.calculateLengthSubdivisionStep(t,o)}}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}calculateAngularSubdivisionStep(t,e){if(!t.isCurve())return 1;if(t.getGeometryType()===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){const s=t;return s.isDegenerate(0)||s.isDegenerateToLine()?1:this.calculateLengthSubdivisionStep(t,e*s.getSemiMinorAxis())}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("")}rationalBezier2NeedsSplit(t,e,s,n){t.cutBezierIgnoreAttributes(s,n,e);let i=!1;if(this.m_maxLength>0){if(e.calculateUpperLength2D()>this.m_maxLength)return i=!0,!0}const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(r);const o=[0,0,0];return e.queryWeights(o),!i&&this.m_maxDeviation>0&&(i=!Zh.checkRationalBezier2MaxDeviation(r,o,this.m_maxDeviation)),!i&&this.m_maxAngle>0&&(i=!Zh.checkRationalBezier2MaxAngle(r,o,this.m_cosMaxAngle)),i}bezier2NeedsSplit(t,e,s,n){t.cutBezierIgnoreAttributes(s,n,e);let i=!1;if(this.m_maxLength>0){if(e.calculateUpperLength2D()>this.m_maxLength)return i=!0,!0}const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);return e.queryControlPoints(r),!i&&this.m_maxDeviation>0&&(i=!Zh.checkBezier2MaxDeviation(r,this.m_maxDeviation)),!i&&this.m_maxAngle>0&&(i=!Zh.checkBezier2MaxAngle(r,this.m_cosMaxAngle)),i}ellipticArcNeedsSplit(t,e,s,n){t.cutArcIgnoreAttributes(s,n,e);let i=!1;if(this.m_maxLength>0){if(e.calculateUpperLength2D()>this.m_maxLength)return i=!0,!0}return!i&&this.m_maxDeviation>0&&(i=!Zh.checkEllipticArcMaxDeviation(e,this.m_maxDeviation)),!i&&this.m_maxAngle>0&&(i=!Zh.checkEllipticArcMaxAngle(e,this.m_cosMaxAngle)),i}bezierNeedsSplit(t){let e=!1;if(this.m_maxLength>0){if(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[0],t[1])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[1],t[2])+_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t[2],t[3])>this.m_maxLength)return e=!0,!0}return!e&&this.m_maxDeviation>0&&(e=!Zh.checkBezierMaxDeviation(t,this.m_maxDeviation)),!e&&this.m_maxAngle>0&&(e=!Zh.checkBezierMaxAngle(t,this.m_cosMaxAngle)),e}progress_(){}static checkBezierMaxDeviation(t,e){const s=t[3].sub(t[0]);if(s.sqrLength()>0){const n=s.clone();n.leftPerpendicularThis(),n.normalize();const i=n.dotProduct(t[0].sub(t[1])),r=n.dotProduct(t[0].sub(t[2]));if(Math.max(Math.abs(i),Math.abs(r))<=e){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;yo(t,.5,e,!1);const n=e.sub(t[0]).dotProduct(s);return n>=0&&n<=s.sqrLength()}return!1}return Math.max(t[0].sub(t[1]).sqrLength(),t[0].sub(t[2]).sqrLength())<=e*e}static checkBezierMaxAngle(t,e){if(t[0].equals(t[3]))return!(!t[0].equals(t[1])||!t[1].equals(t[2]));const s=t[3].sub(t[0]);s.normalize();{const n=t[1].sub(t[0]),i=n.dotProduct(s);if(i<0)return!1;if(n.length()*e>i)return!1}{const n=t[2].sub(t[0]),i=n.dotProduct(s);if(i<0)return!1;if(n.length()*e>i)return!1}{const n=t[2].sub(t[1]),i=n.dotProduct(s);if(i<0)return!1;if(n.length()*e>i)return!1}return!0}static checkRationalBezier2MaxDeviation(t,e,s){if(0===e[1])return!1;const n=t[2].sub(t[0]);if(n.sqrLength()>0){const e=n.clone();e.leftPerpendicularThis(),e.normalize();const i=e.dotProduct(t[0].sub(t[1]));if(Math.abs(i)<=s){const e=t[1].sub(t[0]).dotProduct(n);return e>=0&&e<=n.sqrLength()}return!1}return t[0].sub(t[1]).sqrLength()<=s*s}static checkRationalBezier2MaxAngle(t,e,s){if(0===e[1])return!1;if(t[0].equals(t[2]))return!!t[0].equals(t[1]);const n=t[2].sub(t[0]);n.normalize();{const e=t[1].sub(t[0]),i=e.dotProduct(n);if(i<0)return!1;if(e.length()*s>i)return!1}return!0}static checkBezier2MaxDeviation(t,e){const s=t[2].sub(t[0]);if(s.sqrLength()>0){const n=s.clone();n.leftPerpendicularThis(),n.normalize();const i=n.dotProduct(t[0].sub(t[1]));if(Math.abs(i)<=e){const e=t[1].sub(t[0]).dotProduct(s);return e>=0&&e<=s.sqrLength()}return!1}return t[0].sub(t[1]).sqrLength()<=e*e}static checkBezier2MaxAngle(t,e){if(t[0].equals(t[2]))return!!t[0].equals(t[1]);const s=t[2].sub(t[0]);s.normalize();{const n=t[1].sub(t[0]),i=n.dotProduct(s);if(i<0)return!1;if(n.length()*e>i)return!1}return!0}static checkEllipticArcMaxDeviation(t,e){if(Math.abs(t.getSweepAngle())<Math.PI){const s=t.getEndXY().sub(t.getStartXY()),n=[0,0];if(1===em(t,s,n)){const s=t.getCoord2D(n[0]),i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getClosestCoordinate(t.getStartXY(),t.getEndXY(),s),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t.getStartXY(),t.getEndXY(),i,r);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,r)<=e}}const s=t.getCoord2D(.5),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(t.getEndXY(),t.getStartXY(),.5,n);return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,n)<=e}static checkEllipticArcMaxAngle(t,e){const s=t.getTangent(0),n=t.getTangent(1),i=s.dotProduct(n);return!(i<0)&&!(s.length()*n.length()*e>i)}static checkTypeForReplace(t,e){return t.getGeometryType()===e&&(e!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc||t.isCircular())}}function Hh(t,e,s){const n=s.length;if(e<=0||n<=2)return n;let i=0;const r=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(n-1,Number.NaN);for(let o=1,a=n;o<a;o++){const e=t.tToLength(s[o]);r[o-1]=e-i,i=e}for(;r.length>1;){const t=r.findIndex(t=>t<=2*e);if(-1===t)break;let n=t+1,i=t+1;if(t>0){const e=t-1;(i===r.length||r[e]>r[i])&&(i=e,n--)}r[i]+=r[t],r.splice(t,1),s.splice(n,1)}return s.length}function Uh(t,e,s,n,i){const r=[],o=[],a=Gh(e,s,0,n,!1,r,o),h=new ra;let u=i;const m=e.getDescription();h.assignVertexDescription(m);const l=m.getAttributeCount()>1,c=new F,g=new fm;for(let d=0,_=0;d<a;d++){if(r[_+1].isNAN()){if(l){let t=o[d];e.queryCoord(t,c),g.setStart(c),t=o[d+1],e.queryCoord(t,c),g.setEnd(c)}g.setStartXY(r[_]),g.setEndXY(r[_+3]),t.addSegment(g,u)}else{if(l){let t=o[d];e.queryCoord(t,c),h.setStart(c),t=o[d+1],e.queryCoord(t,c),h.setEnd(c)}h.setStartXY(r[_]),h.setControlPoint1(r[_+1]),h.setControlPoint2(r[_+2]),h.setEndXY(r[_+3]),t.addSegment(h,u)}_+=3,u=!1}}function Oh(t,e,s,n,i){const r=[],o=[],a=Wh(e,s,0,n,!1,r,o),h=new An;let u=i;const m=e.getDescription();h.assignVertexDescription(m);const l=m.getAttributeCount()>1,c=new F,g=new fm;for(let d=0,_=0;d<a;d++){if(r[_+1].isNAN()){if(l){let t=o[d];e.queryCoord(t,c),g.setStart(c),t=o[d+1],e.queryCoord(t,c),g.setEnd(c)}g.setStartXY(r[_]),g.setEndXY(r[_+2]),t.addSegment(g,u)}else{if(l){let t=o[d];e.queryCoord(t,c),h.setStart(c),t=o[d+1],e.queryCoord(t,c),h.setEnd(c)}h.setStartXY(r[_]),h.setControlPoint1(r[_+1]),h.setEndXY(r[_+2]),t.addSegment(h,u)}_+=2,u=!1}}function Qh(t,e,n,r,o){s(t===i.enumBezier||t===i.enumEllipticArc||t===i.enumBezier2);const a=e.createInstance();a.getGeometryType()===i.enumPolygon&&a.setFillRule(e.getFillRule());const u=e.querySegmentIterator();for(let m=0,l=e.getPathCount();m<l;++m){if(!e.hasNonLinearSegmentsPath(m)){a.addPath(e,m,!0);continue}const o=e.getPathStart(m);let l=!0,c=0;for(u.resetToPath(m),s(u.nextPath());u.hasNextSegment();){const s=u.nextCurve();if(!s)break;{const g=u.getStartPointIndex()-o,d=g-c;d>0&&(a.addSegmentsFromPath(e,m,c,d,l),l=!1),c=g+1,t===i.enumBezier?Uh(a,s,n,r,l):t===i.enumBezier2?Oh(a,s,n,r,l):h(""),l=!1}}const g=e.getSegmentCountPath(m);g-c!==0&&a.addSegmentsFromPath(e,m,c,g-c,l)}return a}function Jh(t,e,s,n,i,r,o,a){const h=e.clone();h.dropAllAttributes();const u=(t,e,s,n)=>
1(e&&(t&&e.push(n.getStartXY()),e.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),e.push(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()),e.push(n.getEndXY())),s&&(t&&s.push(0),s.push(1)),1);if(h.isDegenerateToLine()||h.isDegenerate(0))return u(t,r,o,e);const m=h.getStartXY(),l=h.getEndXY(),c=h.getSemiAxes(),g=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;if(h.isCircular())g.setIdentity();else{const t=h.getAxisXRotation();g.setScaleCoords(1,h.getMinorMajorRatio()),g.rotateAngle(t)}const d=h.getCenter();g.shift(d);const _=g.clone();_.invertThis(),h.applyTransformation(_);const p=h.getSweepAngle();if(0===p)return u(t,r,o,e);const f=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();f.setCoords({center:d,width:2*c.x,height:2*c.x});const P=.05*f.calculateToleranceFromEnvelope(),y=Math.max(s/c.x,P/c.x);let x=4*Math.pow(y/.0741,1/6);x=Math.min(x,Math.PI/2);const C=Mh(h.getStartAngle());let v=p>0?Math.floor(C/x):Math.ceil(C/x);v*=x;const b=p>0?x:-x;v+b===C&&(v+=b);let S=4/3*Math.tan(Math.abs(x)/4);p>0&&(S=-S),o&&t&&o.push(0);const E=x/Math.abs(p);let D=(v-C)/p;const w=m.clone(),A=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;h.queryCoord2D(0,A);const T=A.clone(),I=1-.01*E;let M=0,Y=0;for(;D<1;){let s;if(D+=E,Y>0&&D<I)s=S;else{D>=I&&(D=1);const t=(D-Y)*p;s=4/3*Math.tan(Math.abs(t)/4),p>0&&(s=-s)}h.queryCoord2D(D,A);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;g.queryTransform(A,a);const u=e.getClosestCoordinate(a,!1);if(e.queryCoord2D(u,a),1!==D&&(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(w,a)<=2*n||_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(a,l)<=2*n))continue;w.setCoordsPoint2D(a);const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4);c[0].assign(T),c[3].assign(A),c[1].rightPerpendicularOther(T),c[1].scaleAddThis(s,T),c[2].leftPerpendicularOther(A),c[2].scaleAddThis(s,A),g.transformPoints2D(c,3,c),c[3].assign(a),0===Y&&c[0].setCoordsPoint2D(m),1===D&&c[3].setCoordsPoint2D(l),i&&go(c);let d=!0;for(let t=1;t<4;t++)if(!c[t].isEqualPoint2D(c[0])){d=!1;break}d||(o&&o.push(u),r&&(0===Y&&t&&r.push(c[0].clone()),r.push(c[1].clone()),r.push(c[2].clone()),r.push(c[3].clone())),M++),Y=D,T.setCoordsPoint2D(A)}return M}function Kh(t,e,s,n,i,r,o,a){e.clone().dropAllAttributes();const h=new le;e.queryLooseEnvelope(h);const u=.05*h.calculateToleranceFromEnvelope(),m=Math.max(s,u);o&&t&&o.push(0);let l=0;const c=ct(J,3);e.queryControlPoints(c);const g=[0,0,0];e.queryWeights(g);const d=[],_=O(9,Number.NaN);let p=e.getMonotonicPartParams(_.length,_);_.length=p,p=Hh(e,n,_);let f=0,P=t;for(let y=1;y<p;y++){const t=_[y];for(d.push(f),d.push(t);d.length>1;){const t=d.at(-1);d.pop();const e=d.at(-1),s=ct(J,3);Ja(c,g,t,e,s,[0,0,0]);const n=ct(J,3),i=Ki(s,g,n),a=16,h=d.length>a;m>=i||h?(o.push(e),r&&(P&&(r.push(n[0]),P=!1),r.push(n[1]),r.push(n[2])),l++):(d.push(.5*(t+e)),d.push(t))}f=t}return l}function $h(t,e,s,n,i,r,o,a){e.clone().dropAllAttributes();const h=new _Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D;e.queryLooseEnvelope(h);const u=.05*h.calculateToleranceFromEnvelope(),m=Math.max(s,u);o&&t&&o.push(0);let l=0;const c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3);e.queryControlPoints(c);const g=[0,0,0];e.queryWeights(g);const d=[],_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(9,Number.NaN);let p=0;i?(p=e.getMonotonicPartParams(_.length,_),_.length=p,p=Hh(e,n,_)):(_.length=2,p=2,_[0]=0,_[1]=1);let f=0,P=t;for(let y=1;y<p;y++){const t=_[y];for(d.length=0,d.push(t),d.push(f);d.length>1;){const t=d.at(-1);d.pop();const e=d.at(-1),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),n=[0,0,0];Ja(c,g,t,e,s,n);const i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,4),a=Ka(s,n,i),h=16,u=d.length>h;m>=a||u?(o.push(e),r&&(P&&(r.push(i[0]),P=!1),r.push(i[1]),r.push(i[2]),r.push(i[3])),l++):(d.push(.5*(t+e)),d.push(t))}f=t}return l}function tu(t,e,s,n,i,r,o,a){const h=e.clone();if(h.dropAllAttributes(),h.isDegenerateToLine()||0===h.getSweepAngle())return r&&(t&&r.push(e.getStartXY()),r.push(J.getNAN()),r.push(e.getEndXY())),o&&(t&&o.push(0),o.push(1)),1;const u=h.getStartXY(),m=h.getEndXY(),l=h.getSemiAxes(),c=new ce;if(h.isCircular())c.setIdentity();else{const t=h.getAxisXRotation();c.setScaleCoords(1,h.getMinorMajorRatio()),c.rotateAngle(t)}const g=h.getCenter();c.shift(g);const d=c.clone();d.invertThis(),h.applyTransformation(d);const _=le.constructEmpty();_.setCoords({center:g,width:2*l.x,height:2*l.x});const p=.05*_.calculateToleranceFromEnvelope(),f=Math.max(s/l.x,p/l.x),P=Math.sqrt(2*f+f*f);let y=2*Math.sqrt(2*P*(1+f-P));y=Math.min(y,Math.PI/2);const x=h.getSweepAngle(),C=Math.ceil(Math.abs(x)/y),v=Math.max(C,1);y=x/v;const b=1/v;let S=Math.tan(Math.abs(y)/2);x>0&&(S=-S),o&&t&&o.push(0);const E=new J;h.queryCoord2D(0,E);for(let D=0;D<v;D++){const e=E.clone(),s=(D+1)*b;if(o&&o.push(s),!r)continue;h.queryCoord2D(s,E);const n=ct(J,3);n[0].assign(e),n[2].assign(E),n[1].rightPerpendicularOther(n[0]),n[1].mulThis(S),n[1].addThis(n[0]),c.transformPoints2D(n,3,n),0===D&&n[0].setCoordsPoint2D(u),D===v-1&&n[2].setCoordsPoint2D(m),0===D&&t&&r.push(n[0]),r.push(n[1]),r.push(n[2])}return v}function eu(t,e,s,n,i,r,o,a){e.clone().dropAllAttributes();const h=new le;e.queryLooseEnvelope(h);const u=.05*h.calculateToleranceFromEnvelope(),m=Math.max(s,u);o&&t&&o.push(0);let l=0;const c=ct(J,4);e.queryControlPoints(c);const g=[],d=O(9,Number.NaN);let _=e.getMonotonicPartParams(d.length,d);d.length=_,_=Hh(e,n,d);let p=0,f=t;for(let P=1;P<_;P++){const t=d[P];for(g.push(p),g.push(t);g.length>1;){const t=g.at(-1);g.pop();const e=g.at(-1),s=ct(J,4);Po(c,t,e,s);const n=ct(J,3),i=Ji(s,n),a=16,h=g.length>a;m>=i||h?(o.push(e),r&&(f&&(r.push(n[0]),f=!1),r.push(n[1]),r.push(n[2])),l++):(g.push(.5*(t+e)),g.push(t))}p=t}return l}function su(){return{e2:0,completeE:0}}class nu{constructor(t,e){this.m_arc=t,this.m_sqrChordLength=e}getMaxDerivative(){return 1}getValue(t,e){return 0===t?_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(this.m_arc.getCoord2D(e),this.m_arc.getCoord2D(1-e))-this.m_sqrChordLength:0}getError(t){return 0}}
1function iu(t,e,s){if(Eu(t)){return void vs(new fm({start:t.getStartXY(),end:t.getEndXY()}),e,s)}if(0===e.value())s.set(t.getStartXY());else if(1===e.value())s.set(t.getEndXY());else{const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;du(t,e,n);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.st_cosAndSin(n,i,r);const o=Ne.constructCoordsE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_semiMajorAxis).mulThisE(i),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_semiMajorAxis).mulThis(t.m_minorMajorRatio).mulThisE(r)),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_rotation);_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.st_cosAndSin(a,i,r),o.rotateDirect(i,r),o.addThisE(Ne.constructPoint2D(t.m_center)),s.setE(o)}}function ru(t,e){return t.convertToCanonic(e)}function ou(t,e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(t.getStartAngle(),t.getEndAngle());s.normalize();const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)(),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.n)(e,n);if(i<s.vmin){let t=i+n;for(;t<s.vmin;)t+=n;return s.containsCoordinate(t)?t:s.vmin-i<t-s.vmax?i:t}if(i>s.vmax){let t=i-n;for(;t>s.vmax;)t-=n;return s.containsCoordinate(t)||s.vmin-t<i-s.vmax?t:i}return i}function au(t,e,s,n){let i=t.m_startAngle,r=t.m_sweepAngle;const o=1e-12;for(;i>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();)i-=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;i<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();)i+=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();if(!Number.isNaN(e)){for(;e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();)e-=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();for(;e<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();)e+=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();!s&&e>i&&(e-=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()),s&&e<i&&(e+=2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()),r=e-i,Math.abs(r)<o&&!n&&(r=s?2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)():-2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()),Math.abs(r)>2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()-o&&n&&(r=0)}Math.abs(r)>2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()-o&&(r=r>=0?2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)():-2*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),t.setEndXY(t.getStartXY())),Math.abs(r)<o&&(r=0,t.setEndXY(t.getStartXY())),n=Math.abs(r)<=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)(),r&&(s=r>0),t.m_startAngle=hu(i),t.m_sweepAngle=r,Fu(t,!n),Xu(t,s)}function hu(t){let e=t,s=!1;return e<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()?(e+=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)(),s=!0):e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()&&(e-=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)(),s=!0),e<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()?(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.n)(e,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()),e<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()&&(e+=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()),s=!0):e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()&&(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.n)(e,(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()),e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()&&(e-=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()),s=!0),s&&(e>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()||e<=-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)())&&(e=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)()),e}function uu(t,e,s){const n=s,i=n.getSemiAxes();let r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(i.x*Math.cos(t[0]),i.y*Math.sin(t[0]));return r=n.convertFromCanonic(r),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(r,n.getStartXY())}function mu(t,e,s){const n=s,i=n.getSemiAxes(),r=t[0]+n.getStartAngle();let o=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(i.x*Math.cos(r),i.y*Math.sin(r));return o=n.convertFromCanonic(o),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(o,n.getEndXY())}function lu(t){if(t.m_center.isNAN())return t.m_startAngle=0,void(t.m_sweepAngle=0);const e=t.getStartXY(),s=t.getEndXY(),n=e.equals(s),i=Vu(t),r=qu(t),o=t.projectionBehavior();if(n){const s=t.convertToCanonic(e),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_semiMajorAxis,t.m_semiMajorAxis*t.m_minorMajorRatio);s.x/=n.x,s.y/=n.y,t.m_startAngle=hu(Math.atan2(s.y,s.x)),t.m_sweepAngle=i?r?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)():-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)():0}else{const n=t.convertToCanonic(e),a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_semiMajorAxis,t.m_semiMajorAxis*t.m_minorMajorRatio);n.x/=a.x,n.y/=a.y;const h=t.convertToCanonic(s);h.x/=a.x,h.y/=a.y,t.m_startAngle=Math.atan2(n.y,n.x),t.m_sweepAngle=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateAngle(n,h),r?t.m_sweepAngle<0&&(t.m_sweepAngle+=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()):t.m_sweepAngle>0&&(t.m_sweepAngle-=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()),t.m_startAngle=hu(t.m_startAngle);let u=uu([t.m_startAngle],1,t);if(u=Math.sqrt(u),u>.25*rs(t)){const e=t.m_startAngle-1e-4,s=t.m_startAngle+1e-4,n=[0];on(uu,t,1,[t.m_startAngle],[e],[s],1e-14,n),t.m_startAngle=hu(n[0])}
1if(u=mu([t.m_sweepAngle],1,t),u=Math.sqrt(u),u>.25*rs(t)){const e=t.m_sweepAngle-1e-4,s=t.m_sweepAngle+1e-4,n=[0];on(mu,t,1,[t.m_sweepAngle],[e],[s],1e-14,n),t.m_sweepAngle=n[0]}const m=Math.abs(t.m_sweepAngle)>(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();if(Fu(t,m),i!==m&&!i&&Math.abs(t.m_sweepAngle)>1.5*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)())return void Su(t,e,s,o);if(0===t.m_sweepAngle||r!==t.m_sweepAngle>0)return void Su(t,e,s,o)}}function cu(t,e){return(ou(t,e)-t.getStartAngle())/t.getSweepAngle()}function gu(t,e){return t.m_startAngle+e*t.m_sweepAngle}function du(t,e,s){s.assign(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_startAngle).addE(e.mulE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_sweepAngle))))}function _u(t,e){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_cosr).sqrThis(),n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_sinr).sqrThis(),i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_minorMajorRatio),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(1/t.m_minorMajorRatio),o=i.mulE(s).addThisE(r.mulE(n)),a=i.subE(r).mulThis(2*t.m_cosr*t.m_sinr),h=i.mulE(n).addThisE(r.mulE(s));e[0]=o,e[1]=a,e[2]=h,e[3]=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(-t.m_semiMajorAxis).mulThis(t.m_semiMajorAxis).mulThis(t.m_minorMajorRatio)}function pu(t,e){const s=new Xe;s.a11.setE(t[0]),s.a12=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.st_mulByPower2(t[1],.5),s.a21.setE(s.a12),s.a22.setE(t[2]);const n=[_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()],i=[new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H];s.eigenSymmetric(i,n);const r=t[3].clone();r.negateThis(),r.invThis(),i[0].mulThisE(r),i[1].mulThisE(r),i[0].sqrtThis().invThis(),i[1].sqrtThis().invThis(),e.x=i[0].toDouble(),e.y=i[1].toDouble();return Math.atan2(n[0].y,n[0].x)}function fu(t,e,s){if(Eu(t))return(s-e)*_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),t.getEndXY());if(1===t.m_minorMajorRatio)return Math.abs(t.getSweepAngle()*(e-s))*t.m_semiMajorAxis;const n=Du(t,e);return Du(t,s)-n}function Pu(t){return t.m_cachedValues}function yu(t){if(t.m_cachedValues)return t.m_cachedValues;const e=su();return e.e2=vu(t),e.completeE=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.af)(e.e2),t.m_cachedValues=e,e}function xu(t,e,s,n){if(!e.isEqual(t.m_XStart,t.m_YStart)||!s.isEqual(t.m_XEnd,t.m_YEnd)){if(Eu(t))return t.m_XStart=e.x,t.m_YStart=e.y,t.m_XEnd=s.x,t.m_YEnd=s.y,Uu(t),void t.afterCompletedModification();if(n&&Math.abs(t.getSweepAngle())<=1.01*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)()){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P,3),i=ku(t,n);if(Za(n)){n[0].assign(e),n[2].assign(s),Ua(n);if(0===t.projectionBehavior()){let e=0,s=2;_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(n[1],n[0])<_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(n[1],n[2])&&(s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e,e=s));const i=n[s].sub(n[e]),r=i.length();i.divThis(r);const o=n[1].sub(n[e]),a=o.length(),h=o.dotProduct(i)/a,u=o.crossProduct(i)/a,m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(n[e],n[s],.5,m);const l=.5*r/u*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(1-h,0,1),c=n[1].side(n[e],n[s]),g=i.clone();c?g.leftPerpendicularThis():g.rightPerpendicularThis();const d=m.sub(g.mul(l));t.constructCircularArcThreePoint(n[0],n[2],d)}else Gu(n,i*i,null,!1,t);return}}0===t.projectionBehavior()?im(t,e,s):rm(t,e,s)}}function Cu(t,e,s){const n=0===t.projectionBehavior();if(s<=2)return void Su(t,e[0],e[s-1],n?0:1);if(n){t.constructCircularArcThreePoint(e[0],e[s-1],e[Math.trunc(s/2)]);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return t.queryCoord2D(.5,n),void t.m_interior.setCoordsPoint2D(n)}const i=t.getSemiMajorAxis(),r=t.getMinorMajorRatio(),o=t.getAxisXRotation(),a=t.getCenter(),h=new Array(4);h[0]=t.isMajor(),h[1]=!h[0],h[2]=h[0],h[3]=!h[0];const u=new Array(4);u[0]=t.isClockwise(),u[1]=u[0],u[2]=!u[0],u[3]=!u[0];const m=Math.trunc(s<5?1:(s+4)/5),l=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(qh,4),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(4,Number.NaN);let g=0;for(let d=0;d<4;
1d++){l[d].constructEllipticArcEndPointsCenter(e[0],e[s-1],i,r,o,h[d],u[d],a),c[d]=0;let t=0;for(let n=m;n<s-1;n+=m){const s=l[d].getClosestCoordinate(e[n],!1);c[d]+=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(l[d].getCoord2D(s),e[n]),t++}c[d]/=t,c[d]<c[g]&&(g=d)}t.assignCopy(l[g])}function vu(t){return 1-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(t.m_minorMajorRatio)}function bu(t,e,s,n,i,r,o,a,h){return t.m_bits=0,t.m_rotation=r,je(t,e),He(t,s),t.m_cosr=Math.cos(r),t.m_sinr=Math.sin(r),Fu(t,o),Xu(t,a),void 0!==h?t.m_center.assign(h):t.m_center.setNAN(),t.setProjectionBehavior(1),t.m_semiMajorAxis=n,t.m_minorMajorRatio=i,Bu(t,void 0===h)}function Su(t,e,s,n){t.m_bits=0,t.m_rotation=0,je(t,e),He(t,s),t.m_interior.assign(e.add(s).mul(.5)),t.m_startAngle=0,t.m_sweepAngle=0,t.m_cosr=1,t.m_sinr=0,Fu(t,!1),Xu(t,!1),t.m_center.setNAN(),t.m_semiMajorAxis=1,t.m_minorMajorRatio=0,t.setProjectionBehavior(n),t.afterCompletedModification()}function Eu(t){return t.m_center.isNAN()}function Du(t,e){if(0===e)return 0;const s=yu(t),n=gu(t,e),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)(),r=Au(t),o=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.aa)(n+i,s.e2,s.completeE),a=t.m_semiMajorAxis*(o-r);return Math.abs(a)}function wu(t,e){if(Eu(t)){const s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),t.getEndXY());return 0===s?0:e/s}if(1===t.m_minorMajorRatio){const s=Math.abs(t.getSweepAngle()*t.m_semiMajorAxis);return 0===s?0:e/s}if(0===e)return 0;const s=t.getSweepAngle();if(0===s)return.5;const n=yu(t),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)(),r=Au(t);s<0&&(e=-e);const o=e/t.m_semiMajorAxis+r;let a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ab)(o,n.e2,n.completeE);a-=i,a-=t.getStartAngle();return a/s}function Au(t){const e=yu(t);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.aa)(t.getStartAngle()+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.T)(),e.e2,e.completeE)}function Tu(t,e,n,i,r){if(2===e.m_TransformationType)return void (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0);if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!Ru(t)),e.isIdentity()&&(!i||i.equals(t.getStartXY())&&r.equals(t.getEndXY())))return;Yu(t);let o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(null===i?(o.x=t.m_XStart,o.y=t.m_YStart,e.transformInPlace(o),a.x=t.m_XEnd,a.y=t.m_YEnd,e.transformInPlace(a)):(o=i,a=r),Eu(t))return t.m_XStart=o.x,t.m_YStart=o.y,t.m_XEnd=a.x,void(t.m_YEnd=a.y);const h=t.m_center.clone();if(e.transformInPlace(h),n||e.isUniformNoRotation()){let s=qu(t);e.isReflective()&&(s=!s);if(0===t.projectionBehavior()){if(!o.equals(a)){const s=t.m_interior.clone();return e.transformInPlace(s),void t.constructCircularArcThreePoint(o,a,s)}return void Iu(t,o,a,h,s,!1)}const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_cosr,t.m_sinr);e.transformWithoutTranslateInPlace(n);const i=Math.atan2(n.y,n.x),r=t.getSemiAxes();e.transformWithoutTranslateInPlace(r);const u=t.m_center.clone();return e.transformInPlace(u),void t.constructEllipticArcEndPointsCenter(o,a,r.x,r.y/r.x,i,t.isMajor(),s,u)}{{const s=new Array(4);_u(t,s);const n=new Xe;n.a11.setE(s[0]),n.a12.setE(s[1]),n.a12.mulThisByPower2(.5),n.a21.setE(n.a12),n.a22.setE(s[2]);if(!n.det().isZero()){const i=new Xe;if(i.a11.set(e.xx),i.a12.set(e.xy),i.a21.set(e.yx),i.a22.set(e.yy),i.invertThis()){const r=i.clone();r.transposeThis();const u=n.clone();u.mulThis(i),u.mulLeftThis(r);if(!u.det().isZero()){const n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4);n[0].setE(u.a11),n[1].setE(u.a12),n[1].mulThisByPower2(2),n[2].setE(u.a22),n[3].setE(s[3]);const i=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),r=pu(n,i);let m=qu(t);return e.isReflective()&&(m=!m),void t.constructEllipticArcEndPointsCenter(o,a,i.x,i.y/i.x,r,t.isMajor(),m,h)}}}}const s=[_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN(),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN()];s[0].setCoords(t.getSemiMajorAxis(),0),s[0].rotateDirect(t.m_cosr,t.m_sinr),s[1].setCoords(t.getSemiMajorAxis(),t.getSemiMinorAxis()),s[1].rotateDirect(t.m_cosr,t.m_sinr),s[2].setCoords(0,t.getSemiMinorAxis()),s[2].rotateDirect(t.m_cosr,t.m_sinr);let n=t.isClockwise();n&&(s[2]=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(s[0],s[0]=s[2]));const i=.5;e.transformWithoutTranslateArray(s,3,s),e.isReflective()&&(n=!n);const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0),u=t.createInstance();
1Gu(s,i,r,!1,u),t.constructEllipticArcEndPointsCenter(o,a,u.getSemiMajorAxis(),u.getMinorMajorRatio(),u.getAxisXRotation(),t.isMajor(),!n,h)}}function Iu(t,e,s,n,i,r){const o=.5*(n.sub(e).length()+n.sub(s).length());t.m_center.assign(n),t.m_startAngle=Math.atan2(e.y-t.m_center.y,e.x-t.m_center.x);au(t,Math.atan2(s.y-t.m_center.y,s.x-t.m_center.x),i,r);const a=t.constructEllipticArcEndPointsCenter(e,s,o,1,0,Math.abs(t.m_sweepAngle)>Math.PI,t.m_sweepAngle>0,n);return t.setProjectionBehavior(0),a}function Mu(t,e){t.m_cachedValues=e}function Yu(t){t.m_cachedValues=null}function Nu(t,e){e.m_cachedValues=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(t.m_cachedValues,t.m_cachedValues=e.m_cachedValues)}function Xu(t,e){const s=e?1:0;t.m_bits=-2&t.m_bits|s}function qu(t){return!!(1&t.m_bits)}function Fu(t,e){const s=e?1:0;t.m_bits=-3&t.m_bits|s<<1}function Vu(t){return!!(2&t.m_bits)}function Lu(t){if(t.m_center.isNAN())return!1;const e=8,s=new Ne;s.setWithEps(t.getStartXY(),e),s.subThisE((new Ne).setWithEps(t.m_center,e));const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;n.setWithEps(t.m_rotation,e);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H.st_cosAndSin(n,i,r),s.rotateReverse(i,r);const o=new Ne;o.setWithEps(t.getEndXY()),o.subThisE(Ne.constructPoint2D(t.m_center)),o.rotateReverse(i,r);const a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;a.setWithEps(t.m_semiMajorAxis,e);const h=a.clone(),u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;u.setWithEps(t.m_minorMajorRatio),h.mulThisE(u),s.x.divThisE(a),s.y.divThisE(h),o.x.divThisE(a),o.y.divThisE(h);const m=s.x.sqr().addThisE(s.y.sqr()).subThisE(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.I),l=o.x.sqr().addThisE(o.y.sqr()).subThisE(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.I);return!m.isZero()||!l.isZero()}function Ru(t){return!!(8&t.m_bits)}function zu(t){t.m_bits&=-9}function Bu(t,e){zu(t);const n=t.getStartXY(),i=t.getEndXY();let r=!1;const o=Vu(t),a=qu(t),h=t.projectionBehavior(),u=n.equals(i);let m=0===t.m_minorMajorRatio||0===t.m_semiMajorAxis;if(Number.isNaN(t.m_minorMajorRatio)&&(0===t.m_semiMajorAxis?t.m_minorMajorRatio=1:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.o)("NAN minor major ratio and non-zero major axis")),m||=e?u:t.m_center.isNAN(),m)return Su(t,n,i,h),!0;t.m_semiMajorAxis=Math.abs(t.m_semiMajorAxis),t.m_minorMajorRatio=Math.abs(t.m_minorMajorRatio),t.m_minorMajorRatio>1&&(t.m_semiMajorAxis*=t.m_minorMajorRatio,t.m_minorMajorRatio=1/t.m_minorMajorRatio);const l=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_semiMajorAxis,t.m_semiMajorAxis*t.m_minorMajorRatio);if((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(l.y>0&&l.x>=l.y),u){const e=t.convertToCanonic(n);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!l.isZero()),e.x/=l.x,e.y/=l.y;const i=Math.sqrt((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(e.x)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(e.y));if(r=1!==i,t.m_semiMajorAxis*=i,l.mulThis(i),t.m_startAngle=hu(Math.atan2(e.y,e.x)),!o)return t.m_interior.assign(n),t.m_sweepAngle=0,t.afterCompletedModification(),r;t.m_sweepAngle=a?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)():-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()}else{let e=t.m_center.isNAN()||Lu(t);if(!e){const s=t.convertToCanonic(n);s.x/=l.x,s.y/=l.y;const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(1,0);t.m_startAngle=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateAngle(r,s);const o=t.convertToCanonic(i);o.x/=l.x,o.y/=l.y,t.m_sweepAngle=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateAngle(s,o),e=!ju(t)}if(e){r=!0;const e=n.sub(i).mulThis(.5);e.rotateReverse(t.m_cosr,t.m_sinr);let s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(e.x/l.x)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(e.y/l.y);s>1&&(s=Math.sqrt(s),t.m_semiMajorAxis*=s,l.mulThis(s));const h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(0,0);{const t=l.x*l.x,s=l.y*l.y,n=t*e.y*e.y+s*e.x*e.x,i=t*s-n;if(i>0){const t=Math.sqrt(i/n);h.setCoords(l.x*e.y/l.y,-l.y*e.x/l.x),h.mulThis(t),o===a&&h.negateThis()}}{const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(h.x,h.y);e.rotateDirect(t.m_cosr,t.m_sinr),e.addThis(n.add(i).mulThis(.5)),t.m_center.assign(e)}}if(lu(t),!ju(t))return Su(t,n,i,h),!0}return Uu(t),t.afterCompletedModification(),r}function ku(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(Math.abs(t.getSweepAngle())<15*Math.PI/16);const n=t.getSemiMajorAxis(),i=t.getSemiMinorAxis();let r;if(0===n)return e[0].setCoordsPoint2D(t.getStartXY()),e[1].setCoordsPoint2D(t.getStartXY()),e[2].setCoordsPoint2D(t.getStartXY()),r=1,r;if(0===i)return e[0].setCoordsPoint2D(t.getStartXY()),e[2].setCoordsPoint2D(t.getEndXY()),e[1]=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(e[0],e[2],.5),r=1,r;const o=t.getSweepAngle(),a=t.getStartAngle(),h=a+o,u=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(-n*Math.sin(a),i*Math.cos(a)),m=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(-n*Math.sin(h),i*Math.cos(h));u.normalize(),m.normalize(),u.rotateDirect(t.m_cosr,t.m_sinr),m.rotateDirect(t.m_cosr,t.m_sinr),e[0].setCoordsPoint2D(t.getStartXY()),e[2].setCoordsPoint2D(t.getEndXY()),e[1].setSub(e[2],e[0]);const l=u.crossProduct(m);e[1].assign(u.mul(e[1].crossProduct(m)/l)),e[1].addThis(e[0]);return r=Math.cos(.5*o),r}function Gu(t,e,n,i,r){if(i){const s=.5,n=Math.sqrt(e),i=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(1-s)+2*n*s*(1-s)+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(s),o=t[0].mul((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(1-s)).add(t[1].mul(2*n*s*(1-s))).add(t[2].mul((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(s))).divThis(i);return r.constructCircularArcThreePoint(t[0],t[2],o),!0}const o=t[0].sub(t[1]),a=t[2].sub(t[1]),h=o.crossProduct(a),u=o.dotProduct(a),m=e;(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(m<=1),(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(m>0);const l=.5/(1-m),c=o.sqrLength(),g=u,d=a.sqrLength(),_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(h),p=o.sub(a).sqrLength();if(0===_)return Su(r,t[0],t[2],1),!1;if(u<=-Math.sqrt(c)*Math.sqrt(d))return Su(r,t[0],t[2],1),!1;const f=[0,0],P=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E;P.setInfinite();const y=nn(2*_,-(p/m+4*g),2*(1-m)/m,P,!1,f);
vendor: 2,888 bytes, line 1
1if(0===y)return Su(r,t[0],t[2],1),!1;1===y&&(f[1]=f[0]);const x=Math.sqrt(l/f[0]),C=Math.sqrt(l/f[1]),v=.5/m;let b=v-d*f[0],S=v-c*f[0];Math.abs(b)>Math.abs(S)?S=g*f[0]-v+1:b=g*f[0]-v+1;const E=o.mul(b).add(a.mul(S)),D=E.norm(1)<1e-15*x?0:Math.atan2(E.y,E.x)+Math.PI,w=o.add(a),A=n?n.clone():t[1].add(w.mul(l)),T=t[0].sub(A),I=t[2].sub(A),M=T.crossProduct(I)<0,Y=!1;new qh;return r.constructEllipticArcEndPointsCenter(t[0],t[2],x,C/x,D,Y,!M,A)}function Wu(t,e,s,n,i){return Gu(t,e,s,n,i)}function ju(t){const e=rs(t);let s=!1;{const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_semiMajorAxis*Math.cos(t.m_startAngle),t.getSemiMinorAxis()*Math.sin(t.m_startAngle));n.rotateDirect(t.m_cosr,t.m_sinr),n.addThis(t.m_center);s=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getStartXY(),n)>e}let n=!1;if(!s){const s=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P(t.m_semiMajorAxis*Math.cos(t.m_startAngle+t.m_sweepAngle),t.getSemiMinorAxis()*Math.sin(t.m_startAngle+t.m_sweepAngle));s.rotateDirect(t.m_cosr,t.m_sinr),s.addThis(t.m_center);n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getEndXY(),s)>e}return!s&&!n}function Zu(t,s,n,i){0===n&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("construct_enclosing_circle");const r=[0,0,0],o=Vh(s,n,r);if(1===o)t.constructCircleRadius(0,s[r[0]],i);else if(2===o){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.lerp(s[r[0]],s[r[1]],.5),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s[r[0]],e),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s[r[1]],e);t.constructCircleRadius(Math.max(n,o),e,i)}else if(3===o){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.calculateCircleCenterFromThreePoints(s[r[0]],s[r[1]],s[r[2]]),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s[r[0]],e),o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s[r[1]],e),a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s[r[2]],e);t.constructCircleRadius(Math.max(n,o,a),e,i)}else (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("unexpected")}function Hu(t){if(Eu(t))return 0;if(t.isDegenerate(0))return 0;const e=t.m_semiMajorAxis,s=t.getSemiMinorAxis(),n=e*e+s*s,i=t.getStartAngle(),r=t.getEndAngle(),o=t.m_center.y-t.m_YStart,a=t.m_cosr,h=t.m_sinr;let u=1,m=0;t.m_rotation&&(u=(a-h)*(a+h),m=2*a*h);const l=((-.5*(r-i)+.25*u*(2*Math.cos(r+i)*Math.sin(r-i)))*s+-2*Math.sin(.5*(r+i))*Math.sin(.5*(r-i))*a*o)*e/n;let c=0;if(t.m_rotation){c=.125*(-2*Math.sin(r+i)*Math.sin(r-i))*m-s*o/n*(2*Math.cos(.5*(r+i))*Math.sin(.5*(r-i)))*h}return n*(l+c)+-.5*(t.m_XEnd-t.m_XStart)*(t.m_YEnd-t.m_YStart)}function Uu(t){t.queryCoord2D(.5,t.m_interior)}function Ou(t,e,s,n,i){if(i){if(0!==hm(e,s))return 2}else if(Re(e,s))return 1;return 0!==Ju(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}function Qu(t,e,s,n,i){if(i){if(0!==hm(e,s))return 2}else if(Re(e,s))return 1;return 0!==Ku(t,e,s,null,null,null,n,void 0!==i&&i,!0,!1)?4:0}
1function Ju(t,e,n,i,r,o,a,h,u,m){if(Eu(e)){return ws(new fm({start:e.getStartXY(),end:e.getEndXY()}),n,i,r,o,a,h,m)}null!==r&&(r.length=0),null!==o&&(o.length=0),null!==i&&(i.length=0);const l=os(e,n);if(as(e,n,a=Math.max(l,a)))return 0;const c=n.getStartXY();c.subThis(e.m_center);const g=n.getEndXY();g.subThis(e.m_center),c.rotateReverse(e.m_cosr,e.m_sinr),g.rotateReverse(e.m_cosr,e.m_sinr);const d=g.clone();d.subThis(c);const _=e.m_semiMajorAxis,p=1/_,f=e.getSemiMinorAxis(),P=1/f,y=d.clone();y.leftPerpendicularThis();const x=Math.atan2(f*y.y,_*y.x),C=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(16,Number.NaN),v=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(16,Number.NaN);let b=0;const S=[x,x+Math.PI];for(let s=0;s<2;++s){const t=cu(e,S[s]);if(t>=0&&t<=1){C[b]=t;const s=e.getCoord2D(C[b]);v[b]=n.getClosestCoordinate(s,!1),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(s,n.getCoord2D(v[b]))<=a&&b++}}const E=c.x*p,D=c.y*P,w=d.x*p,A=d.y*P;let T=nn(w*w+A*A,2*(E*w+D*A),E*E+D*D-1,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.unit(),!1,v);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(T>=0);for(let s=0;s<T;s++){const t=d.mul(v[s]).add(c);t.x*=p,t.y*=P;const i=cu(e,Math.atan2(t.y,t.x));if(i>=0&&i<=1){C[b]=i;const t=e.getCoord2D(i);v[b]=n.getClosestCoordinate(t,!1),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t,n.getCoord2D(v[b]))<=a&&b++}}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(b<C.length+4);const I=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(16,Number.NaN);T=e.intersectPoint(n.getStartXY(),I,a);for(let s=0;s<T;s++,b++)C[b]=I[s],v[b]=0;T=e.intersectPoint(n.getEndXY(),I,a);for(let s=0;s<T;s++,b++)C[b]=I[s],v[b]=1;T=n.intersectPoint(e.getStartXY(),I,a);for(let s=0;s<T;s++,b++)C[b]=0,v[b]=I[s];T=n.intersectPoint(e.getEndXY(),I,a);for(let s=0;s<T;s++,b++)C[b]=1,v[b]=I[s];return 0===b?0:gm(t,e,n,C,v,b,i,r,o,a,h,u,m)}function Ku(t,e,n,i,r,o,a,h,u,m){if(Eu(e)){const s=new fm({start:e.getStartXY(),end:e.getEndXY()});return Ju(t,n,s,i,o,r,a,h,u,!m)}if(Eu(n)){const s=new fm({start:n.getStartXY(),end:n.getEndXY()});return Ju(t,e,s,i,r,o,a,h,u,m)}const l=os(e,n);a=Math.max(a,l);let c=!1;{const t=e.getSemiAxes(),i=e.getCenter(),m=n.getSemiAxes(),l=n.getCenter(),g=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(l,i),d=t.x+m.x;if(g>d+a)return 0;if(t.y>m.x){if(g+m.x+a<t.y)return 0}else if(m.y>t.x&&g+t.x+a<m.y)return 0;if(u&&!h){const i=1===e.m_minorMajorRatio&&e.isClosed()&&e.isMajor(),a=1===n.m_minorMajorRatio&&n.isClosed()&&n.isMajor();if(i&&a&&(c=!0,g<=d)){if(Math.max(t.x,m.x)<=Math.min(t.x,m.x)+g)return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!r&&!o),1}}}if(!c&&as(e,n,a))return 0;const g=[],d=[],_=!1,p=!1,f=jh(e,0,0,_,p,g,d,null),P=[],y=[],x=jh(n,0,0,_,p,P,y,null);if(1===f&&1===x){const t=new Dn({points:g,weights:d}),s=new Dn({points:P,weights:y}),l=[],c=[],_=oh(!1,t,s,i,null===r?null:l,null===o?null:c,a,h,u,m);if(_>0&&null!==r||null!==o){r&&(r.length=0),o&&(o.length=0);for(let i=0;i<_;++i){if(r)if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(l[i],0,1))r.push(l[i]);else{const s=t.tToLength(l[i]),n=e.lengthToT(s);r.push(n)}if(o)if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(c[i],0,1))o.push(c[i]);else{const t=s.tToLength(c[i]),e=n.lengthToT(t);o.push(e)}}}return _}let C=[];const v=[];let b=0;const S=u&&!h;for(let s=0;s<f;s++){const t=new Dn({points:g.slice(2*s,2*s+3),weights:d.slice(2*s,2*s+3)});let i=0;for(let r=0;r<x;r++){v.length<=r&&v.push(new Dn({points:P.slice(2*r,2*r+3),weights:y.slice(2*r,2*r+3)}));const o=[],h=[],u=S?null:o,m=S?null:h,l=oh(!1,t,v[r],null,u,m,a,!1,S,!1);if(l>0&&S)return 1;for(let a=0;a<l;++a){if(0===o[a]&&0===s)o[a]=0;else if(1===o[a]&&s===f-1)o[a]=1;else{const s=t.tToLength(o[a])+b,n=e.lengthToT(s);o[a]=n}if(0===h[a]&&0===r)h[a]=0;else if(1===h[a]&&r===x-1)h[a]=1;else{const t=v[r].tToLength(h[a])+i,e=n.lengthToT(t);h[a]=e}C.push((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.l)(o[a],h[a]))}i+=v[r].calculateLength2D()}b+=t.calculateLength2D()}if(0===C.length)return 0;if(h&&(C=C.filter(t=>!(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(t.first,0,1)||!(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(t.second,0,1)||!e.getCoord2D(t.first).equals(n.getCoord2D(t.second)))),u)return C.length;const E=[],D=[];for(const s of C)E.push(s.first),D.push(s.second);return gm(t,e,n,E,D,E.length,i,r,o,a,h,u,m)}
1function $u(t,e,s){if(s.setCoords(t.getCoord2D(e.vmin)),s.mergeNe(t.getCoord2D(e.vmax)),Eu(t))return;const n=t.getSemiAxes(),i=[0,0,0,0];{const e=Math.atan2(-n.y*t.m_sinr,n.x*t.m_cosr),s=e+Math.PI,r=Math.atan2(n.y*t.m_cosr,n.x*t.m_sinr),o=r+Math.PI;i[0]=cu(t,e),i[1]=cu(t,s),i[2]=cu(t,r),i[3]=cu(t,o)}const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;for(let o=0;o<4;o++){const n=i[o];e.containsExclusiveCoordinate(n)&&(t.queryCoord2D(n,r),s.mergeNe(r))}}function tm(t,e,n,i,r){if(0===t.m_semiMajorAxis)return n.vmin;let o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();t.queryCoord2D(n.vmin,o);let a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(t.queryCoord2D(n.vmax,a),Eu(t)){return new fm({start:o,end:a}).getClosestCoordinate(e,i)}const h=ru(t,e);if(o=ru(t,o),a=ru(t,a),1===t.m_minorMajorRatio){if(h.isEqual(0,0))return n.vmin;const e=cu(t,Math.atan2(h.y,h.x));if(i||n.containsCoordinate(e))return e;return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(h,o)<=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(h,a)?n.vmin:n.vmax}const u=t.getSemiMajorAxis(),m=t.getSemiMinorAxis(),l=(u-m)*(u+m),c=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(l),g=h.x,d=h.y,_=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(m*d),p=m*l*d*2,f=[new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(_),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(p),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(c-(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a)(u*g)-_),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(-p),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(-c)],P=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.m)(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H,4),y=pn(f,4,new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(-1,1),!1,P,4);let x=n.vmin,C=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(h,o);{const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(h,a);t<C&&(x=n.vmax,C=t)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!i);let v=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(8,Number.NaN);for(let s=0;s<y;++s){const e=P[s].value(),n=Math.sqrt(1-e*e),i=Math.atan2(e,n),r=Math.atan2(e,-n);v[2*s]=cu(t,i),v[2*s+1]=cu(t,r)}v=v.slice(0,2*y),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.v)(v);for(let s=0,b=2*y;s<b;++s)if(v[s]>n.vmin&&v[s]<n.vmax){const n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,t.getCoord2D(v[s]));C>n&&(C=n,x=v[s])}return x}function em(t,e,n){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!Eu(t));const i=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;i.setRotateAngle(-t.getAxisXRotation());const r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;i.queryTransform(e,r);const o=Math.atan2(-r.x*t.getMinorMajorRatio(),r.y),a=o+(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.$)();let h=cu(t,o),u=cu(t,a);u<h&&(u=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(h,h=u));let m=0;return h>=0&&h<=1&&(n[m++]=h),u>=0&&u<=1&&(n[m++]=u),m}function sm(t,e,s){return t.m_semiMajorAxis===e.m_semiMajorAxis&&(t.isMajor()!==e.isMajor()&&(!!t.m_center.equals(e.m_center)&&(t.m_sinr===e.m_sinr&&(t.m_cosr===e.m_cosr&&(t.m_minorMajorRatio===e.m_minorMajorRatio&&(s?t.isClockwise()!==e.isClockwise():t.isClockwise()===e.isClockwise()))))))}function nm(t,e,s){if(Eu(t))s.setE(Ne.constructPoint2D(t.getEndXY()).subE(Ne.constructPoint2D(t.getStartXY())));else{const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;du(t,e,n);const i=new Ne;if(i.setCoordsE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_semiMajorAxis).negate().mulE((new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H).setSin(n)),new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.getSemiMinorAxis()).mulE((new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H).setCos(n))),t.m_rotation){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.m_rotation);i.rotateDirect((new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H).setCos(e),(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H).setSin(e))}i.scaleThis(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(t.getSweepAngle())),s.setE(i)}}function im(t,e,s,n){const i=t.getStartXY(),r=t.getEndXY(),o=i.equals(r),a=e.equals(s);if(!o&&!a){const n=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;n.setShiftCoords(-t.m_XStart,-t.m_YStart);const o=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,s),a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(i,r),h=o/a;n.scale(h,h);const u=r.sub(i);u.divThis(a);const m=s.sub(e);m.divThis(o);const l=u.crossProduct(m),c=m.dotProduct(u);return n.rotate(c,l),n.shiftCoords(e.x,e.y),void Tu(t,n,!0,e,s)}const h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;if(t.queryCoord2D(.5,h),a){if(o){const n=t.m_center.add(e.sub(i));
1t.constructEllipticArcEndPointsCenter(e,s,t.getSemiMajorAxis(),1,0,!0,!t.isClockwise(),n),t.setProjectionBehavior(0)}else if(t.isMajor()){const n=h.sub(e).getUnitVector().mul(2*t.getSemiMajorAxis()).add(e);t.constructCircularArcThreePoint(e,s,n)}else t.constructCircularArcThreePoint(e,s,e);return}const u=e.add(s).mul(.5),m=s.sub(e);m.rightPerpendicularThis();const l=u.add(m),c=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getClosestCoordinate(u,l,t.getCenter(),!0),g=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.U)(u,l,c,g);const d=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e,g);t.constructEllipticArcEndPointsCenter(e,s,d,1,0,!0,!t.isClockwise(),g),t.setProjectionBehavior(0)}function rm(t,e,n,i){const r=t.getStartXY(),o=t.getEndXY(),a=r.equals(o),h=e.equals(n);if(!a&&!h){const s=new _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T;return s.initializeFromTwoPoints(r,o,e,n),Tu(t,s,!0,e,n),t.endPointModified(),void t.normalizeAfterEndpointChange()}if(!t.isMajor())return void Su(t,e,n,1);if(a&&h){const s=t.m_center.add(e.sub(r));return void t.constructEllipticArcEndPointsCenter(e,n,t.getSemiMajorAxis(),t.getMinorMajorRatio(),t.getAxisXRotation(),!0,!t.isClockwise(),s)}if(!a){const s=.5*((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.a9)()-Math.abs(t.getSweepAngle())),i=(t.getSweepAngle()+s*(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.e)(t.getSweepAngle()))/t.getSweepAngle(),r=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;t.queryCoord2D(i,r),t.constructEllipticArcEndPointsCenter(r,r,t.getSemiMajorAxis(),t.getMinorMajorRatio(),t.getAxisXRotation(),!0,!t.isClockwise(),t.getCenter());const o=t.getCenter().add(e.sub(r));return void t.constructEllipticArcEndPointsCenter(e,n,t.getSemiMajorAxis(),t.getMinorMajorRatio(),t.getAxisXRotation(),!0,!t.isClockwise(),o)}const u=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(e,n);let m=.25,l=.75;if(u<_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.sqrDistance(t.getCoord2D(.25),t.getCoord2D(.75))){const e=[0],n=en(new nu(t,u),_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.construct(0,.25),1,e);n>0&&((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(1===n),m=e[0],l=1-e[0])}const c=t.getCoord2D(m),g=t.getCoord2D(l);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(!c.equals(g)),t.constructEllipticArcEndPointsCenter(c,g,t.getSemiMajorAxis(),t.getMinorMajorRatio(),t.getAxisXRotation(),!0,!t.isClockwise(),t.m_center),rm(t,e,n)}function om(t,e,s,n,i){return am(t,!1,e,s,n,i)}function am(t,e,s,n,r,o){const a=s.getGeometryType(),u=n.getGeometryType(),m=Math.max(r,os(s,n));if(a===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine&&u===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)return Ds(s,n,m,o);let l=s,c=n,g=s.getStartXY(),d=s.getEndXY();if(g.compare(d)>0&&(l=s.clone().reverse()),g=n.getStartXY(),d=n.getEndXY(),g.compare(d)>0&&(c=n.clone().reverse()),e){if(s.equals(n))return 2;if(We(s,n,m))return 4}switch(a){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:switch(u){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:return Ou(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:return Eo(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:return th(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:return qi(t,c,l,m,o);default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:switch(u){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:return Ou(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:return Qu(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:return Do(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:return eh(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:return Fi(t,c,l,m,o);default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:switch(u){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:return Eo(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:return Do(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:return wo(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:return Ao(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:return To(t,l,c,m,o);default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:switch(u){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:return th(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:return eh(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:return Ao(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:return sh(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:return nh(t,l,c,m,o);default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:switch(u){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:return qi(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:return Fi(t,l,c,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:return To(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:return nh(t,c,l,m,o);case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:return Vi(t,l,c,m,o);default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}}function hm(t,e,s=!0){if(!s&&!um(t,e))return 0;const n=t.isLine()&&e.isLine();if(t.getStartXY().equals(e.getStartXY())&&t.getEndXY().equals(e.getEndXY())){const s=1;if(n)return s;const r=t.getGeometryType();if(r!==e.getGeometryType())return 0;if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier){const n=t,i=e;return n.getControlPoint1().equals(i.getControlPoint1())&&n.getControlPoint2().equals(i.getControlPoint2())?s:0}if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){return sm(t,e,!1)?s:0}if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2){const n=t,i=e;if(n.getControlPoint1().equals(i.getControlPoint1())&&n.getStandardFormWeight()===i.get
1StandardFormWeight())return s}else if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2){const n=e;if(t.getControlPoint1().equals(n.getControlPoint1()))return s}return 0}if(t.getStartXY().equals(e.getEndXY())&&t.getEndXY().equals(e.getStartXY())){const s=-1;if(n)return s;const r=t.getGeometryType();if(r!==e.getGeometryType())return 0;if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier){const n=t,i=e;return n.getControlPoint1().equals(i.getControlPoint2())&&n.getControlPoint2().equals(i.getControlPoint1())?s:0}if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc){return sm(t,e,!0)?s:-1}if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2){const n=t,i=e;if(n.getControlPoint1().equals(i.getControlPoint1())&&n.getStandardFormWeight()===i.getStandardFormWeight())return s}else if(r===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2){const n=e;if(t.getControlPoint1().equals(n.getControlPoint1()))return s}return 0}return 0}function um(t,e){const s=t.getGeometryType();return s===e.getGeometryType()&&(s!==_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc||t.projectionBehavior()===e.projectionBehavior())}function mm(t,s,n,r,o,a,u){!o&&a&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("");const m=s.getGeometryType(),l=n.getGeometryType(),c=Math.max(u,os(s,n));if(r&&(r.length=0),o&&(o.length=0),a&&(a.length=0),m===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine&&l===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine)return ws(s,n,r,o,a,c,!1,!1);let g=s,d=n,_=s.getStartXY(),p=s.getEndXY(),f=!1,P=!1;_.compare(p)>0&&(g=s.clone(!0).reverse(),f=!0),_=n.getStartXY(),p=n.getEndXY(),_.compare(p)>0&&(d=n.clone(!0).reverse(),P=!0);let y=0;switch(m){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:switch(l){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:y=Ju(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:y=Io(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:y=ih(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:y=Li(t,d,g,r,a,o,c,!1,!1,!0);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:switch(l){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:y=Ju(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:y=Ku(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:y=Mo(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:y=rh(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:y=Ri(t,d,g,r,a,o,c,!1,!1,!0);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:switch(l){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:y=ih(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:y=rh(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:y=No(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:y=oh(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:y=ah(t,g,d,r,o,a,c,!1,!1,!1);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:switch(l){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:y=Li(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:y=Ri(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:y=Xo(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:y=ah(t,d,g,r,a,o,c,!1,!1,!0);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:y=zi(t,g,d,r,o,a,c,!1,!1,!1);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:switch(l){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:y=Io(t,g,d,r,o,a,c,!1,!1,
1!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:y=Mo(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:y=Yo(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:y=No(t,g,d,r,o,a,c,!1,!1,!1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:y=Xo(t,g,d,r,o,a,c,!1,!1,!1);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}if(f){if(o){for(let t=0;t<y;t++)o[t]=1-o[t];o.reverse()}r&&r.reverse(),a&&a.reverse()}if(P&&a)for(let e=0;e<y;e++)a[e]=1-a[e];return y}function lm(t,e,s){if(e===s)return 0;e>s&&(s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.c)(e,e=s));return t.cut(e,s,!0).calculateUpperLength2D()}function cm(t,e,s,n,i){const r=[],o=[],a=[];for(let u=0,m=i;u<m;u++)r.push(t.calculateSubLengthFromStart(s[u])),o.push(e.calculateSubLengthFromStart(n[u])),(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(s[u],0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n[u],0,1)&&t.getCoord2D(s[u]).equals(e.getCoord2D(n[u]))&&a.push(u);if(0===a.length||a.length===i)return;a.sort((t,e)=>s[t]<s[e]?-1:s[t]>s[e]?1:n[t]<n[e]?-1:n[t]>n[e]?1:0);let h=-1;for(const u of a){if(h>=0&&s[u]===s[h]&&s[u]===s[h]){h=u;continue}h=u;const a=[];a.length=i;for(let t=0;t<a.length;++t)a[t]=t;a.sort((t,e)=>{const s=r[u],n=o[u],i=r[t]-s,a=o[t]-n,h=i*i+a*a,m=r[e]-s,l=o[e]-n,c=m*m+l*l;return h<c?-1:h>c?1:0});for(let r=0;r<i;r++){const i=a[r];if(i===u||s[i]===s[u]&&n[i]===n[u]||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(s[i],0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n[i],0,1))continue;const o=(s,n,i,r)=>{const o=new Ne,a=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;a.setWithEps(1);const h=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H;h.set(n,a.eps()),t.queryCoord2DE(h,o);const u=new Ne;t.queryCoord2DE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s),u);let m=!1;return o.eq(u)&&(h.set(r,a.eps()),e.queryCoord2DE(h,o),e.queryCoord2DE(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(i),u),m=o.eq(u)),!m},h=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();t.queryCoord2D(s[i],h);const m=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();e.queryCoord2D(n[i],m);if(0===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(h,m)&&o(s[u],s[i],n[u],n[i]))break;const l=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(n[i],n[u]);l.normalizeNoNAN();const c=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E(s[i],s[u]);c.normalizeNoNAN();let g=-1,d=Number.POSITIVE_INFINITY,_=Number.POSITIVE_INFINITY,p=s[i];h.assign(t.getCoord2D(p));for(let r=0;r<5;r++){const r=e.getClosestCoordinateOnInterval(h,l,-1);m.assign(e.getCoord2D(r));const a=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(h,m);if(p=t.getClosestCoordinateOnInterval(m,c,-1),p===s[u]&&r===n[u]){g=1;break}h.assign(t.getCoord2D(p));const f=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(m,h);if(!(f<_&&a<d)){g=0;break}if(0===f&&0===a){o(s[u],s[i],n[u],n[i])?(s[i]=p,n[i]=r,g=0):g=1;break}_=f,d=a}if(-1===g&&(g=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(s[i],0,1)||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n[i],0,1)?0:1),1!==g)break;s[i]=s[u],n[i]=n[u]}}}function gm(t,e,s,n,i,r,o,a,h,u,m,l,c){if(!r)return 0;const g=(t,e)=>{for(let s=0;s<r;++s){let n=e[s];if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n,0,1)){n=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.ak)(n);continue}const i=t.getCoord2D(n);n<.5?i.equals(t.getStartXY())&&lm(t,0,n)<=rs(t)&&(e[s]=0):i.equals(t.getEndXY())&&lm(t,n,1)<=rs(t)&&(e[s]=1)}};g(e,n),g(s,i),cm(e,s,n,i,r);const d=[];for(let f=0,P=r;f<P;f++)d.push(f);const _=(t,e)=>c?(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.al)(i[t],n[t],i[e],n[e]):(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.al)(n[t],i[t],n[e],i[e]);if(d.length>1){d.sort(_);const t=Math.max(rs(e),rs(s));let r=0;for(let o=1,a=d.length;o<a;o++){const a=n[d[r]],h=n[d[o]],u=i[d[r]],m=i[d[o]];if(a!==h||u!==m){if(lm(e,a,h)<=t&&lm(s,u,m)<=t&&!((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(a,0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(u,0,1)||(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(h,0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(m,0,1))){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e.getCoord2D(a),s.getCoord2D(u)),n=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e.getCoord2D(h),s.getCoord2D(m));if(t<=n)continue;if(n<t){d[r]=d[o];continue}continue}r++,d[r]=d[o]}}if(d.length=r+1,1===d.length&&0!==d[0]&&(n[0]=n[d[0]],i[0]=i[d[0]],d[0]=0),d.length>2){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty(),r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.E.constructEmpty();t.setCoords(n[d[0]],n[d.at(-1)]),r.setCoords(i[d[0]],i[d.at(-1)]);let o=!0;for(let e=1,s=d.length-1;e<s;e++)if(!t.containsCoordinate(n[d[e]])||!r.containsCoordinate(i[d[e]])){o=!1;break}if(o){const n=[.5,.2,.7,.1,.3,.4,.6,.8,.9];for(let i=0;i<n.length;i++){let a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(t.vmin,t.vmax,n[i]);const h=e.getCoord2D(a);if(!s.isCloserThanDistance(h,r,u)){o=!1;break}a=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.q)(r.vmin,r.vmax,n[i]);const m=s.getCoord2D(a);if(!e.isCloserThanDistance(m,t,u)){o=!1;break}}}o&&(d[1]=d.at(-1),d.length=2)}}if(1===d.length&&t){const t=0,r=0;Ge(e,s,n[0],i[0],u,1,[t],[r])&&(d.push(1),n[1]=t,i[1]=r,d.sort(_))}if(m&&1===d.length){let t=!0;for(let r=0,o=d.length;r<o;r++){if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n[d[r]],0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(i[d[r]],0,1)){if(0===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(e.getCoord2D(n[d[r]]),s.getCoord2D(i[d[r]])))continue}t=!1;break}if(t)return 0}let p=0;for(let f=0,P=d.length;f<P;
1f++){if(a&&a.push(n[d[f]]),h&&h.push(i[d[f]]),o){const t=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();e.queryCoord2D(n[d[f]],t),o.push(t)}p++}return p}function dm(t,e,s,n,i,r,o,a,h){if((0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(s,0,1)&&(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.N)(n,0,1)){if(0===_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.distance(t.getCoord2D(s),e.getCoord2D(n))){const u=1e-12,m=new Ne,l=Number.EPSILON;if(t.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s,l),m),m.isTrueZero()){const e=1===s?-u:u;t.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(s,l).add(e),m)}1===s&&m.negateThis();const c=new Ne;if(e.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(n,l),c),c.isTrueZero()){const t=1===s?-u:u;e.queryDerivative(new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.H(n,l).add(t),c)}1===n&&c.negateThis(),m.isZero()||m.normalize(),c.isZero()||c.normalize();const g=m.dotProduct(c),d=m.crossProduct(c);d.scaleError(3);const _=()=>{if(h)return.001;{const s=t.calculateUpperLength2D(),n=e.calculateUpperLength2D();return Math.min(.01*i/Math.min(s,n),1e-10)}};if(g.ge(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.J)&&(d.isZero()||Math.abs(d.value())<_())){return ke(t,e,s,n,i,r,o,a)}}}return 0}function _m(t,e,n,i,r){let o=-1,a=-1,h=-1,u=-1;{const s=[0,e],r=[e,0],m=[0,i],l=[i,0];for(let e=0;e<2&&-1===o;++e)for(let i=0;i<2;++i)if(t[s[e]].equals(n[m[i]])){o=s[e],a=r[e],h=m[i],u=l[i];break}}if(-1===o){const s=new we;s.setFromPoints(t,e+1);const o=new we;return o.setFromPoints(n,i+1),o.inflate(r),s.isIntersectingW(o)?-1:0}{const m=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(e+1,Number.NaN),l=Cr(t,e+1,m);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(l>1);let c=0,g=0;for(let t=0;t<l;++t)o===m[t]&&(g=t,c++),a===m[t]&&c++;if(2!==c)return-1;const d=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.d)(i+1,Number.NaN),_=Cr(n,i+1,d);(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(_>1),c=0;let p=0;for(let t=0;t<_;++t)h===d[t]&&(p=t,c++),u===d[t]&&c++;if(2!==c)return-1;const f=t[m[(g+l-1)%l]],P=t[m[(g+1)%l]],y=n[d[(p+_-1)%_]],x=n[d[(p+1)%_]],C=t[o],v=[f,P,y,x],b=[0,1,2,3];b.sort((t,e)=>_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.compareVectorsOrigin(C,v[t],v[e]));let S=b[0];for(let t=1;t<4;t++){if(b[t]!==(S+1)%4)return-1;S=b[t]}{const t=f.sub(C),e=x.sub(C),s=e.dotProduct(t);if(s>0){const n=e.crossProduct(t),i=Math.abs(Math.atan2(n,s)),o=i*t.length(),a=i*e.length();if(o<=r||a<=r)return-1}}{const t=P.sub(C),e=y.sub(C),s=e.dotProduct(t);if(s>0){const n=e.crossProduct(t),i=Math.abs(Math.atan2(n,s)),o=i*t.length(),a=i*e.length();if(o<=r||a<=r)return-1}}return 1}}var pm=_Envelope_js__WEBPACK_IMPORTED_MODULE_1__.V;class fm extends _s{constructor(t){super(t||{XStart:0,YStart:0,XEnd:0,YEnd:0})}assignMove(t){return this!==t&&(this.m_description=t.m_description,t.m_description=null,this.m_attributes=t.m_attributes,t.m_attributes=null,this.m_XStart=t.m_XStart,t.m_XStart=Number.NaN,this.m_YStart=t.m_YStart,this.m_XEnd=t.m_XEnd,t.m_XEnd=Number.NaN,this.m_YEnd=t.m_YEnd),this}assignCopy(t){return this!==t&&t.copyTo(this),this}calculateLowerLength3D(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}calculateUpperLength3D(){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}changeEndPoints3D(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getClosestCoordinate3D(t,e,n){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}getBoundary(){return $s(this)}getAttributeAsDbl(t,e,s){if(0===e)return 0===s?Ps(this,t):ys(this,t);const n=pm.getInterpolation(e),i=this.getStartAttributeAsDbl(e,s),r=this.getEndAttributeAsDbl(e,s);return (0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.V)(n,i,r,t,pm.getDefaultValue(e))}constructFromCoords(t,e,s,n){this.dropAllAttributes(),this.setStartXYCoords(t,e),this.setEndXYCoords(s,n)}construct(t,e){this.dropAllAttributes(),this.setStartXY(t),this.setEndXY(e)}construct3D(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}constructPoint(t,e){this.assignVertexDescription(t.getDescription()),this.mergeVertexDescription(e.getDescription()),this.setStart(t),this.setEnd(e)}getGeometryType(){return fm.type}queryEnvelope(t){if(4===t.m_EnvelopeType){t.setEmpty(),t.assignVertexDescription(this.m_description);const e=_Envelope2D_js__WEBPACK_IMPORTED_MODULE_3__.Envelope2D.constructEmpty();this.queryEnvelope(e),t.setEnvelope(e);for(let s=1,n=this.m_description.getAttributeCount();s<n;s++){const e=this.m_description.getSemantics(s);for(let n=0,i=pm.getComponentCount(e);s<i;s++){const s=this.queryInterval(e,n);t.setIntervalEnvelope(e,n,s)}}}else 2===t.m_EnvelopeType?t.setCoords({xmin:this.m_XStart,ymin:this.m_YStart,xmax:this.m_XEnd,ymax:this.m_YEnd}):3===t.m_EnvelopeType?(t.setEmpty(),t.mergeCoords(this.m_XStart,this.m_YStart,es(this,0,1,0)),t.mergeCoords(this.m_XEnd,this.m_YEnd,es(this,1,1,0))):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("env type not impl")}applyTransformation(t){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t instanceof _Transformation2D_js__WEBPACK_IMPORTED_MODULE_4__.T);const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;e.x=this.m_XStart,e.y=this.m_YStart,t.transformInPlace(e),this.m_XStart=e.x,this.m_YStart=e.y,e.x=this.m_XEnd,e.y=this.m_YEnd,t.transformInPlace(e),this.m_XEnd=e.x,this.m_YEnd=e.y}createInstance(){return new fm({vd:this.m_description})}calculateLength2D(){return Math.sqrt(qs(this))}calculateLength3D(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}changeEndPoints2D(t,e){this.setStartXY(t),this.setEndXY(e),this.normalizeAfterEndpointChange()}queryControlPointsHelper(t){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(t.length>=2),t[0]=this.getStartXY(),t[1]=this.getEndXY(),2}queryCoord2D(t,e){return ps(this,t,e)}queryCoord3D(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}getCoordZ(t){return xs(this,t)}queryCoord2DE(t,e){vs(this,t,e)}queryCoord2DMP(t,e){e.assignPoint2D(this.getStartXY());const s=qe.constructPoint2D(this.getEndXY());s.subThis(e),s.mulThis(_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.M.constructDouble(t)),e.addThis(s)}getCoordX(t){return Ps(this,t)}getCoordY(t){return ys(this,t)}cut(t,e,s){const n=new Pm;return this.queryCut(t,e,n,s),n.releaseSegment()}queryCut(t,e,s,n){const i=s.createLine();n&&i.assignVertexDescription(this.m_description);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();if(ps(this,t,r),i.setStartXYCoords(r.x,r.y),ps(this,e,r),i.setEndXYCoords(r.x,r.y),!n)for(let o=1,a=this.m_description.getAttributeCount();o<a;o++){const s=this.m_description.getSemantics(o),n=pm.getComponentCount(s);for(let r=0;r<n;r++){const n=this.getAttributeAsDbl(t,s,r);i.setStartAttribute(s,r,n);const o=this.getAttributeAsDbl(e,s,r);i.setEndAttribute(s,r,o)}}}queryDerivative(t,e){Cs(this,t,e)}getClosestCoordinate(t,e){return _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getClosestCoordinate(this.getStartXY(),this.getEndXY(),t,e)}
1getClosestCoordinateOnInterval(t,e,s=-1){const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(e.vmin,n);const i=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;this.queryCoord2D(e.vmax,i);const r=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getClosestCoordinate(n,i,t,!1);return ms.recalculateParentT(e.vmin,e.vmax,r)}intersectionOfYMonotonicWithAxisX(t,e){const s=this.m_YEnd-this.m_YStart;if(!s)return t===this.m_YEnd?e:Number.NaN;const n=(t-this.m_YStart)/s;let i=Ps(this,n);return 1===n&&(i=this.m_XEnd),i}isCurve(){return!1}isMonotoneQuickAndDirty(){return!0}isDegenerate(t){const e=this.m_XStart-this.m_XEnd,s=this.m_YStart-this.m_YEnd;return Math.sqrt(e*e+s*s)<=t}isDegenerate3D(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}queryLooseEnvelope(t){this.queryEnvelope(t)}clone(t){const e=new fm;return this.copyTo(e),e}tToLength(t){return t*this.calculateLength2D()}lengthToT(t){const e=this.calculateLength2D();return 0!==e?t/e:0}calculateWeightedAreaCentroid2D(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return e.setCoords(0,0),e}calculateWeightedCentroid2D(){return this.getCoord2D(.5).mul(this.calculateLength2D())}getTangent(t){const e=_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P.getNAN();return e.setSub(this.getEndXY(),this.getStartXY()),e}getDerivative(t){const e=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return e.setSub(this.getEndXY(),this.getStartXY()),e}getCurvature(t){return 0}isIntersectingPoint(t,e,s){return Ms(this,t,e,s)>=0}isIntersectingPoint3D(t,e,n,i,r=1){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),!1}getYMonotonicParts(t,e){return 0}getMonotonicParts(t,e){return 0}getMonotonicPartParams(t,s){return s&&(t<2&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)(""),s[0]=0,s[1]=1),2}intersectionWithAxis2D(t,e,s,n){if(t){const t=this.m_YEnd-this.m_YStart;if(!t)return e===this.m_YEnd?-1:0;const i=(e-this.m_YStart)/t;return i<0||i>1?0:(s&&(s[0]=Ps(this,i)),n&&(n[0]=i),1)}{const t=this.m_XEnd-this.m_XStart;if(!t)return e===this.m_XEnd?-1:0;const i=(e-this.m_XStart)/t;return i<0||i>1?0:(s&&(s[0]=ys(this,i)),n&&(n[0]=i),1)}}calculateUpperLength2D(){return this.calculateLength2D()}calculateLowerLength2D(){return this.calculateLength2D()}normalizeAfterEndpointChange(){return!1}queryLooseEnvelopeOnInterval(t,e){if(2===e.m_EnvelopeType){let s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(t.vmin,0,1);const n=new _Point2D_js__WEBPACK_IMPORTED_MODULE_2__.P;return this.queryCoord2D(s,n),e.setCoords({pt:n}),s=(0,_Point2D_js__WEBPACK_IMPORTED_MODULE_2__.s)(t.vmax,0,1),this.queryCoord2D(s,n),void e.mergeNe(n)}(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("3d dst not impl")}orientBottomUp(){Es(this)}isLine(){return!0}isDegenerateToLineHelper(t){return!0}copyIgnoreAttributes(t){t.setStartXY(this.getStartXY()),t.setEndXY(this.getEndXY()),t.normalizeAfterEndpointChange()}calculateArea2DHelper(){return 0}absNormXYZ(t){return Ss(this,t)}absNorm(){return this.getStartXY().norm(1)+this.getEndXY().norm(1)}queryEnvelopeW(t,e){e.setCoords(this.getCoord2D(t.vmin)),e.mergeNe(this.getCoord2D(t.vmax))}setSegmentFromCoordsForStitcher(t,e){bs(this,t[0],t[e-1])}writeInBufferStream(t,e){return (0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0),0}readFromBufferStream(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}snapControlPoints(t){return!1}needsSnapControlPoints(t){return!1}calculateSpecialPointsForCracking(t,e){return 0}ensureXYMonotone(){return!1}setCoordsForIntersector(t,e,s){bs(this,t,e)}static isIntersectingLineLine(t,e,s,n){return Ds(t,e,s,n)}static isIntersectingLineLine_(t,e,s,n){return Ds(t,e,s,n)}copyToImpl(t){}reverseImpl(){}equalsImpl(t){return!0}equalsImplTol(t,e){return!0}swapImpl(t){}afterCompletedModification(){}endPointModified(){}clearEndPointModified(){}intersect(t,e,s,n,i){return mm(!1,this,t,e,s,n,i)}intersectPoint(t,e,s){e.length<1&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.r)("");const i=Ms(this,t,s,!1);return i>=0?(e&&(e[0]=i),1):0}isIntersecting(t,e,s){return 0!==om(!1,this,t,e,s)}}fm.type=_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine;class Pm{constructor(t){this.m_seg=null,this.m_curves=null,this.m_lineBuffer=new fm,this.m_mask=0,this.m_active=0,void 0!==t&&(t.copy?t.copy.copyTo(this,!1):t.move?this.assignMove(t.move):t.segment?this.copyFrom(t.segment,!!t.bIgnoreAttributes):(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("bad constructor params"))}assignCopy(t){return t instanceof Pm?this!==t&&t.copyTo(this,!1):this.copyFrom(t,!1),this}assignMove(t){if(t instanceof Pm){if(this===t)return this;this.reset(),1&t.m_mask&&(this.m_lineBuffer=t.m_lineBuffer,t.m_lineBuffer=null,this.m_mask=1),this.m_curves=t.m_curves,this.m_mask=t.m_mask,this.m_active=t.m_active,t.reset(),this.m_seg=this.activeSegment(),t.m_seg=null}else{if(this.m_seg===t)return this;this.create(t.getGeometryType()),this.m_seg.swap(t)}return this}activeSegment(){switch(this.m_active){case 0:return null;case 1:return this.line();case 2:return this.arc();case 4:return this.bezier3();case 8:return this.bezier2();case 16:return this.rbezier2();default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("")}}get(){return this.m_seg}reset(){1&this.m_mask&&(this.m_lineBuffer=null),this.m_mask>1&&(this.m_curves=null),this.m_mask=0,this.m_active=0}empty(){return null===this.m_seg}copyTo(t,e){this!==t&&(this.empty()?t.m_seg=null:t.copyFrom(this.m_seg,e))}copyToWithZ(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}createImpl(t){switch(t){case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine:1&this.m_mask||(this.m_lineBuffer=new fm,this.m_mask|=1,this.m_active=1);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc:2&this.m_mask||(this.m_curves=new qh,this.m_mask=1&this.m_mask|2,this.m_active=2);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier:4&this.m_mask||(this.m_curves=new ra,this.m_mask=1&this.m_mask|4,this.m_active=4);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2:8&this.m_mask||(this.m_curves=new An,this.m_mask=1&this.m_mask|8,this.m_active=8);break;case _Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2:16&this.m_mask||(this.m_curves=new Dn,this.m_mask=1&this.m_mask|16,this.m_active=16);break;default:(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("")}}create(t){t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine?this.createLine():t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc?this.createEllipticArc():t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier?this.createCub
1icBezier():t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2?this.createQuadraticRationalBezier():t===_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2?this.createQuadraticBezier():(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.a)("Segment_buffer.create")}copyFrom(t,e){this.m_seg!==t&&(this.create(t.getGeometryType()),e?t.copyIgnoreAttributes(this.m_seg):t.copyTo(this.m_seg))}copyFromWithZ(t,e){(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.g)(0)}line(){return this.m_lineBuffer}arc(){return this.m_curves}bezier3(){return this.m_curves}bezier2(){return this.m_curves}rbezier2(){return this.m_curves}createLine(){return this.createImpl(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumLine),this.m_seg=this.line(),this.line()}createEllipticArc(){return this.createImpl(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumEllipticArc),this.m_seg=this.arc(),this.arc()}createCubicBezier(){return this.createImpl(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier),this.m_seg=this.bezier3(),this.bezier3()}createQuadraticRationalBezier(){return this.createImpl(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumRationalBezier2),this.m_seg=this.rbezier2(),this.rbezier2()}createQuadraticBezier(){return this.createImpl(_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.G.enumBezier2),this.m_seg=this.bezier2(),this.bezier2()}releaseSegment(){if(this.m_seg=null,0===this.m_active&&(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("releaseSegment"),1&this.m_active){const t=this.line();return this.m_mask-=1,this.m_active=0,this.m_lineBuffer=null,t}let t;return 2&this.m_active?t=this.arc():4&this.m_active?t=this.bezier3():8&this.m_active?t=this.bezier2():16&this.m_active?t=this.rbezier2():(0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.d)("releaseSegment"),this.m_mask-=this.m_active,this.m_active=0,this.m_curves=null,t}equals(t){return t instanceof Pm?this===t||(this.empty()?t.empty():!t.empty()&&this.get().equals(t.get())):((0,_Geometry_js__WEBPACK_IMPORTED_MODULE_0__.t)("seg comparison not yet impl"),!1)}}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UFVLDhDQUFFLFFBQVEsUUFBUSwwQ0FBQyxVQUFVLFVBQVUsUUFBUSwwQ0FBQyxVQUFVLGlCQUFpQiwwQ0FBQyxrQkFBa0IsUUFBUSwwQ0FBQyxVQUFVLDhDQUFFLHlFQUF5RSxRQUFRLDBDQUFDLFVBQVUsVUFBVSxRQUFRLDBDQUFDLFVBQVUsdUJBQXVCLCtDQUErQyw4Q0FBRSxHQU
1FHLDBCQUEwQiwwQ0FBQyxVQUFVLFdBQVcsMENBQUMsTUFBTSxTQUFTLGVBQWUsZ1lBQWdZLDBEQUEwRCwrQ0FBQyxLQUFLLDBEQUEwRCxtTEFBbUwsOEJBQThCLHlFQUF5RSwrQ0FBQyxLQUFLLCtDQUErQyxxREFBcUQsK0NBQUMsOExBQThMLHNWQUFzVixrQkFBa0IsMkJBQTJCLFVBQVUsME5BQTBOLFdBQVcsdVpBQXVaLGVBQWUsOFlBQThZLG1CQUFtQiwwRUFBMEUsbUJBQW1CLG1MQUFtTCxrQkFBa0IsaUxBQWlMLGVBQWUsdUNBQXVDLCtDQUFDLHdMQUF3TCxhQUFhLGdFQUFnRSx1QkFBdUIsc0NBQXNDLHNCQUFzQiwwREFBMEQsc0JBQXNCLHdEQUF3RCxxQkFBcUIsMEVBQTBFLFdBQVcsNEJBQTRCLCtDQUFDLGlhQUFpYSxtQkFBbUIscUZBQXFGLDRCQUE0QixvSUFBb0ksTUFBTSw4ZEFBOGQsaUJBQWlCLG1EQUFtRCxxQkFBcUIsaUNBQWlDLGNBQWMsNk5BQTZOLCtDQUFDLHVGQUF1RixrQkFBa0Isb0pBQW9KLCtDQUFDLCtIQUErSCxZQUFZLCtFQUErRSxRQUFRLE1BQU0sRUFBRSxzRkFBc0Ysb0RBQW9ELDBDQUEwQyxxQkFBcUIsTUFBTSx5SEFBeUgsNk5BQTZOLCtDQUFDLG9EQUFvRCxlQUFlLHdCQUF3QixlQUFlLCtCQUErQixxQkFBcUIsc0RBQXNELG1CQUFtQiwrRUFBK0UsZ0JBQWdCLHNHQUFzRywrQ0FBQyxtTEFBbUwsbUJBQW1CLHFGQUFxRixVQUFVLGdDQUFnQyxzRUFBc0UsU0FBUyxlQUFlLGlDQUFpQyxpQkFBaUIscUJBQXFCLFVBQVUsYUFBYSxTQUFTLGVBQWUscUhBQXFILHdCQUF3QixpQ0FBaUMsVUFBVSxXQUFXLCtDQUFDLDRJQUE0SSxRQUFRLGVBQWUsd0JBQXdCLFlBQVksMkJBQTJCLFNBQVMsa0JBQWtCLFVBQVUsMEdBQTBHLHlCQUF5QiwrQ0FBQyxtQkFBbUIsZUFBZSwrQ0FBQyxxQ0FBcUMsdUJBQXVCLCtDQUFDLDZDQUE2QyxjQUFjLHVCQUF1QixzQkFBc0IsZ0NBQWdDLGVBQWUsMkNBQTJDLDJDQUFDLHFDQUFxQywyQ0FBQyx1Q0FBdUMsZUFBZSwyQ0FBMkMsMkNBQUMscUNBQXFDLDJDQUFDLHVDQUF1QyxpQkFBaUIsMEJBQTBCLGVBQWUsNEJBQTRCLFdBQVcsMkNBQUMsd0JBQXdCLDJDQUFDLGtCQUFrQiwyQ0FBQywyQkFBMkIsMkNBQUMsb0JBQW9CLCtDQUFDLEtBQUssZUFBZSxhQUFhLDJDQUEyQyxxQkFBcUIsNENBQTRDLGdCQUFnQixjQUFjLDBDQUFDLFVBQVUsb0JBQW9CLG9CQUFvQiwwQ0FBQyxVQUFVLHNCQUFzQixRQUFRLDBDQUFDLFVBQVUsb0JBQW9CLElBQUksNkZBQTZGLHNCQUFzQixtQkFBbUIsS0FBSyxtQkFBbUIsRUFBRSxzQkFBc0Isa0JBQWtCLG1DQUFtQyxPQUFPLDJDQUFDLENBQUMsU0FBUyxvQkFBb0IsUUFBUSxVQUFVLEtBQUssMkNBQUMsY0FBYyxNQUFNLEtBQUssMkNBQUMsZ0JBQWdCLE1BQU0sS0FBSywyQ0FBQyxxQkFBcUIsTUFBTSxLQUFLLDJDQUFDLHlCQUF5QixNQUFNLEtBQUssMkNBQUMsa0JBQWtCLE1BQU0sUUFBUSwrQ0FBQyxLQUFLLFNBQVMsY0FBYyx1TkFBdU4sY0FBYywwV0FBMFcsb0JBQW9CLGVBQWUsaWtCQUFpa0Isa0JBQWtCLHVCQUF1QiwyQ0FBQyxhQUFhLDJDQUFDLGNBQWMsZUFBZSwyQkFBMkIsd0JBQXdCLCtDQUFDLGtCQUFrQixrRUFBa0UsZ0JBQWdCLDJCQUEyQixhQUFhLCtDQUFDLDRCQUE0QixxREFBcUQsSUFBSSxLQUFLLHFFQUFxRSxtREFBbUQsZ0lBQWdJLGVBQWUsdUJBQXVCLGNBQWMsNEJBQTRCLHFCQUFxQix5RkFBeUYsa0JBQWtCLHFDQUFxQyx1QkFBdUIsOEZBQThGLDZCQUE2QixtQ0FBbUMsNEJBQTRCLDBHQUEwRyxZQUFZLDJDQUFDLFVBQVUsMENBQUUsVUFBVSwwQ0FBRSxJQUFJLDBCQUEwQixzQ0FBc0MsZ0NBQWdDLGdCQUFnQixZQUFZLEVBQUUsd0JBQXdCLGFBQWEsRUFBRSxVQ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sc0JBQXNCLCtDQUFDLElBQUkseUJBQXlCLCtDQUFDLElBQUksdUJBQXVCLGdDQUFnQyxxQkFBcUIsT0FBTywrQ0FBQyxNQUFNLGtCQUFrQiw0Q0FBNEMsUUFBUSwrQkFBK0IsMEVBQTBFLFFBQVEsdUJBQXVCLGVBQWUsdUlBQXVJLHNCQUFzQiwrRUFBK0UsdUJBQXVCLE9BQU8sK0NBQUMsT0FBTyxlQUFlLFdBQVcsY0FBYyx5QkFBeUIsWUFBWSxlQUFlLCtDQUFDLG9DQUFvQywrQkFBK0IsNkJBQTZCLFlBQVksNkJBQTZCLDBCQUEwQix3QkFBd0IsV0FBVyxjQUFjLDBCQUEwQixZQUFZLGVBQWUsK0NBQUMsb0NBQW9DLDZCQUE2QixZQUFZLDZCQUE2QiwwQkFBMEIsYUFBYSxrQ0FBa0MsK0JBQStCLHlEQUF5RCxzQkFBc0IsZ0ZBQWdGLFdBQVcsaUNBQWlDLCtCQUErQixzREFBc0Qsb0JBQW9CLDJFQUEyRSxhQUFhLGFBQWEsZUFBZSx3QkFBd0IsWUFBWSxhQUFhLCtDQUFDLHFDQUFxQywrQkFBK0IsMkJBQTJCLFlBQVksNEJBQTRCLHdCQUF3QixzQkFBc0IsYUFBYSxlQUFlLHdCQUF3QixZQUFZLGFBQWEsK0NBQUMscUNBQXFDLDJCQUEyQixZQUFZLDRCQUE0Qix3QkFBd0Isc0JBQXNCLFdBQVcsY0FBYyxpQ0FBaUMsWUFBWSxzQkFBc0IsK0NBQUMsb0NBQW9DLCtCQUErQixvQ0FBb0MsWUFBWSxvQ0FBb0MsaUNBQWlDLCtCQUErQixXQUFXLGNBQWMsZ0NBQWdDLFlBQVksc0JBQXNCLCtDQUFDLG9DQUFvQyxvQ0FBb0MsWUFBWSxvQ0FBb0MsaUNBQWlDLG9CQUFvQix5Q0FBeUMsK0JBQStCLHVFQUF1RSw2QkFBNkIsb0dBQW9HLGtCQUFrQix1REFBdUQsK0JBQStCLG1GQUFtRiwyQkFBMkIsZ0dBQWdHLG9CQUFvQixhQUFhLGVBQWUsK0JBQStCLFlBQVksb0JBQW9CLCtDQUFDLHFDQUFxQywrQkFBK0Isa0NBQWtDLFlBQVksbUNBQW1DLCtCQUErQiw2QkFBNkIsYUFBYSxlQUFlLCtCQUErQixZQUF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Y2h1bmtzL011bHRpUGF0aEltcGwuanM/Y2QwMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBDT1BZUklHSFQgRXNyaSAtIGh0dHBzOi8vanMuYXJjZ2lzLmNvbS81LjAuMTcvTElDRU5TRS50eHQgKi9cbmltcG9ydHtpIGFzIHQsYSBhcyBlLGcgYXMgcyxyIGFzIG4sRyBhcyBpLHMgYXMgcix1IGFzIG8sdCBhcyBhLGQgYXMgaCx3IGFzIHUsZiBhcyBtLGUgYXMgbCxoIGFzIGMsbyBhcyBnLHEgYXMgZCx4IGFzIF8saiBhcyBwLHAgYXMgZn1mcm9tXCIuL0dlb21ldHJ5LmpzXCI7aW1wb3J0e2wgYXMgUCxtIGFzIHksbiBhcyB4LG8gYXMgQyxyIGFzIHYsViBhcyBiLHAgYXMgUyxxIGFzIEUsTyBhcyBELHQgYXMgdyx1IGFzIEEsdiBhcyBULEUgYXMgSSx3IGFzIE0sZiBhcyBZLHggYXMgTix5IGFzIFgseiBhcyBxLFAgYXMgRixBIGFzI
1FYsRCBhcyBMLEYgYXMgUixHIGFzIHosSCBhcyBCLEkgYXMgayxhIGFzIEcsQiBhcyBXLFMgYXMgaixUIGFzIFosSiBhcyBIfWZyb21cIi4vRW52ZWxvcGUuanNcIjtpbXBvcnR7RSBhcyBVLGQgYXMgTyxBIGFzIFEsUCBhcyBKLGkgYXMgSyxiIGFzICQsQiBhcyB0dCxDIGFzIGV0LGMgYXMgc3QsRCBhcyBudCxGIGFzIGl0LE0gYXMgcnQscSBhcyBvdCxHIGFzIGF0LEggYXMgaHQsSSBhcyB1dCxKIGFzIG10LGcgYXMgbHQsbSBhcyBjdCxMIGFzIGd0LE4gYXMgZHQsTyBhcyBfdCxzIGFzIHB0LEsgYXMgZnQsUSBhcyBQdCxSIGFzIHl0LFQgYXMgeHQsVSBhcyBDdCxWIGFzIHZ0LFcgYXMgYnQsWCBhcyBTdCxZIGFzIEV0LFogYXMgRHQsXyBhcyB3dCwkIGFzIEF0LG8gYXMgVHQsYTAgYXMgSXQsaiBhcyBNdCxsIGFzIFl0LGUgYXMgTnQsYTEgYXMgWHQsYTIgYXMgcXQsYTMgYXMgRnQsYTQgYXMgVnQsYTUgYXMgTHQsYTYgYXMgUnQsYSBhcyB6dCxhNyBhcyBCdCxhOCBhcyBrdCxhOSBhcyBHdCx2IGFzIFd0LGFhIGFzIGp0LGFiIGFzIFp0LHcgYXMgSHQsYWMgYXMgVXQsYWQgYXMgT3QsYWUgYXMgUXQsYWYgYXMgSnQsYWcgYXMgS3QsYWggYXMgJHQsYWkgYXMgdGUsYWogYXMgZWUsdSBhcyBzZSxuIGFzIG5lLGFrIGFzIGllLGFsIGFzIHJlLGFtIGFzIG9lLGFuIGFzIGFlLGFvIGFzIGhlLGFwIGFzIHVlLGFxIGFzIG1lfWZyb21cIi4vUG9pbnQyRC5qc1wiO2ltcG9ydHtFbnZlbG9wZTJEIGFzIGxlfWZyb21cIi4vRW52ZWxvcGUyRC5qc1wiO2ltcG9ydHtUIGFzIGNlfWZyb21cIi4vVHJhbnNmb3JtYXRpb24yRC5qc1wiO2ltcG9ydHtHIGFzIGdlfWZyb21cIi4vR2VvbWV0cnlDdXJzb3IuanNcIjtjbGFzcyBkZXtjb25zdHJ1Y3Rvcigpe3RoaXMucG9zU3RyZWFtPW51bGwsdGhpcy5zdHJlYW1zPW51bGx9Z2V0KHQpe3JldHVybiB0PjA/dGhpcy5zdHJlYW1zW3QtMV06dGhpcy5wb3NTdHJlYW19c2V0KHQsZSl7dD4wP3RoaXMuc3RyZWFtc1t0LTFdPWU6dGhpcy5wb3NTdHJlYW09ZX1kZXN0cm95QW5kU2V0U2l6ZSh0KXtpZih0aGlzLnN0cmVhbXM9bnVsbCx0PjEpe3RoaXMuc3RyZWFtcz1uZXcgQXJyYXkodC0xKTtmb3IobGV0IGU9MDtlPHQtMTsrK2UpdGhpcy5zdHJlYW1zW2VdPW51bGx9dGhpcy5wb3NTdHJlYW09bnVsbH1zd2FwKHQpe1t0aGlzLnN0cmVhbXMsdC5zdHJlYW1zXT1bdC5zdHJlYW1zLHRoaXMuc3RyZWFtc10sW3RoaXMucG9zU3RyZWFtLHQucG9zU3RyZWFtXT1bdC5wb3NTdHJlYW0sdGhpcy5wb3NTdHJlYW1dfWVtcHR5KCl7cmV0dXJuIG51bGw9PT10aGlzLnBvc1N0cmVhbSYmbnVsbD09PXRoaXMuc3RyZWFtc319ZnVuY3Rpb24gX2UodCxzLG4saSxyKXsoczwwfHxuPDB8fGk8MXx8cytpKihuLTEpKzE+dC5zaXplKCkpJiZlKFwiSW5kZXggb3V0IG9mIGJvdW5kXCIpO2ZvcihsZXQgZT1zLG89cytpKihuLTEpKzE7ZTxvO2UrPWkpdC53cml0ZUFzRGJsKGUscih0LnJlYWRBc0RibChlKSkpfWZ1bmN0aW9uIHBlKHQsZSxzKXtpZih0KWZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7LS1uKXMoZVtuXSk7ZWxzZSBlLmZvckVhY2gocyl9ZnVuY3Rpb24gZmUodCxlKXtsZXQgcz10dCh0KTtjb25zdCBuPWUubGVuZ3RoL0soKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoOysraSl7Y29uc3QgdD1NYXRoLnRydW5jKHMqbik7cz10dChzKTtjb25zdCBpPU1hdGgudHJ1bmMocypuKSxyPWVbdF07ZVt0XT1lW2ldLGVbaV09cn19ZnVuY3Rpb24gUGUodCxlLHMpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm47bGV0IG49MCxpPTA7Zm9yKCsraTtpIT09dC5sZW5ndGg7KytpKWUodFtuXSx0W2ldKXx8KHMobixpKSxuPWkpO3MobixpKX1mdW5jdGlvbiB5ZSh0LGUscyxuLGkpe2V0KHQsZSxuLWUsKHQsZSk9PmkodCxlKT8tMToxKX1mdW5jdGlvbiB4ZSh0LGUscyl7aWYoIShzPD1lKSlmb3IoO2U8czspdFtzXT1zdCh0W2VdLHRbZV09dFtzXSksZSsrLHMtLX1mdW5jdGlvbiBDZSh0LGUscyxuKXt4ZSh0LGUscy0xKSx4ZSh0LHMsbi0xKSx0LnJldmVyc2UoKX1mdW5jdGlvbiB2ZSh0LGUscyl7Y29uc3Qgbj10LmdldERlc2NyaXB0aW9uKCkuZ2V0VG90YWxDb21wb25lbnRDb3VudCgpO3Quc2V0WChlWzBdKSx0LnNldFkoZVsxXSksJCh0LmdldEF0dHJpYnV0ZUFycmF5KCksZSwwLDIsbi0yKX12YXIgYmU9Yjtjb25zdCBTZT1cImNhbiBub3QgYXNzaWduIGFuIGVtcHR5IHBvaW50IHRvIGEgdmVydGV4XCI7Y2xhc3MgRWV7Y29uc3RydWN0b3IodCl7aWYodGhpcy5tX2FjY2VsZXJhdG9ycz1udWxsLHZvaWQgMCE9PXQmJnQubW92ZSl0aGlzLm1fZGVzY3JpcHRpb249dC5tb3ZlLm1fZGVzY3JpcHRpb24sdC5tb3ZlLm1fZGVzY3JpcHRpb249UCgpLHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzPXQubW92ZS5tX3ZlcnRleEF0dHJpYnV0ZXMsdC5tb3ZlLm1fdmVydGV4QXR0cmlidXRlcz1uZXcgZGUsdGhpcy5tX2VudmVsb3BlRGF0YT10Lm1vdmUubV9lbnZlbG9wZURhdGEsdC5tb3ZlLm1fZW52ZWxvcGVEYXRhPW5ldyB5LHRoaXMubV9wb2ludENvdW50PXQubW92ZS5tX3BvaW50Q291bnQsdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD10Lm1vdmUubV9yZXNlcnZlZFBvaW50Q291bnQsdGhpcy5tX2ZsYWdzPXQubW92ZS5tX2ZsYWdzLHRoaXMubV9iRmlsbFJ1bGU9dC5tb3ZlLm1fYkZpbGxSdWxlLHRoaXMubV9iUGF0aFN0YXJ0ZWQ9dC5tb3ZlLm1fYlBhdGhTdGFydGVkLHRoaXMubV9iUG9seWdvbj10Lm1vdmUubV9iUG9seWdvbix0aGlzLm1fc2ltcGxlVG9sZXJhbmNlPXQubW92ZS5tX3NpbXBsZVRvbGVyYW5jZTtlbHNle2NvbnN0IGU9dm9pZCAwIT09dCYmdC52ZD90LnZkOlAoKTt0aGlzLm1fZGVzY3JpcHRpb249ZSx0aGlzLm1fdmVydGV4QXR0cmlidXRlcz1uZXcgZGUsdGhpcy5tX2VudmVsb3BlRGF0YT1uZXcgeSx0aGlzLm1fcG9pbnRDb3VudD0wLHRoaXMubV9yZXNlcnZlZFBvaW50Q291bnQ9LTEsdGhpcy5tX2ZsYWdzPTQwNjMsdGhpcy5tX2JGaWxsUnVsZT10aGlzLm1fYlBhdGhTdGFydGVkPXRoaXMubV9iUG9seWdvbj0hMSx0aGlzLm1fc2ltcGxlVG9sZXJhbmNlPTAsdm9pZCAwIT09dCYmdC5jb3B5JiZ0LmNvcHkuY29weVRvKHRoaXMpfX1lcXVhbHNCYXNlKGUscyl7aWYoIXQoZS5nZXRHZW9tZXRyeVR5cGUoKSkpcmV0dXJuITE7Y29uc3Qgbj1lO2lmKHRoaXM9PT1uKXJldHVybiEwO2lmKCF0aGlzLm1fZGVzY3JpcHRpb24uZXF1YWxzKG4uZ2V0RGVzY3JpcHRpb24oKSkpcmV0dXJuITE7aWYodGhpcy5pc0VtcHR5SW1wbCgpIT09bi5pc0VtcHR5SW1wbCgpKXJldHVybiExO2lmKHRoaXMuaXNFbXB0eUltcGwoKSlyZXR1cm4hMDtjb25zdCBpPXRoaXMuZ2V0UG9pbnRDb3VudCgpO2lmKGkhPT1uLmdldFBvaW50Q291bnQoKSlyZXR1cm4hMTtmb3IobGV0IHQ9MDt0PHRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3QrKyl7Y29uc3QgZT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHQpLHI9dGhpcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoZSksbz1uLmdldEF0dHJpYnV0ZVN0cmVhbVJlZihlKSxhPWJlLmdldENvbXBvbmVudENvdW50KGUpO2lmKCFyLmVxdWFscyhvLDAsaSphLHMpKXJldHVybiExfWlmKHMpe2lmKCF0aGlzLmVxdWFsc0ltcGxUb2woZSxzKSlyZXR1cm4hMX1lbHNlIGlmKCF0aGlzLmVxdWFsc0ltcGwoZSkpcmV0dXJuITE7cmV0dXJuITB9dHJhbnNmb3JtQXR0cmlidXRlKHQscyxuLGkscil7aWYodGhpcy5hZGRBdHRyaWJ1dGUodCksIXRo
1aXMuaXNFbXB0eSgpJiYoMCE9PW58fDEhPT1pKSl7aWYoMD09PXQpe2NvbnN0IHQ9bmV3IGNlO3JldHVybiAwPT09cj8wPT09cz8odC5zZXRTaGlmdENvb3JkcyhuLDApLHQuc2NhbGUoaSwxKSk6MT09PXM/KHQuc2V0U2hpZnRDb29yZHMoMCxuKSx0LnNjYWxlKDEsaSkpOmUoXCJcIik6MD09PXM/KHQuc2V0U2NhbGVDb29yZHMoMS9pLDEpLHQuc2hpZnRDb29yZHMoLW4sMCkpOjE9PT1zPyh0LnNldFNjYWxlQ29vcmRzKDEsMS9pKSx0LnNoaWZ0Q29vcmRzKDAsLW4pKTplKFwiXCIpLHZvaWQgdGhpcy5hcHBseVRyYW5zZm9ybWF0aW9uKHQpfV9lKHRoaXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKHQpLHMsdGhpcy5nZXRQb2ludENvdW50KCksYmUuZ2V0Q29tcG9uZW50Q291bnQodCksTihuLGkscikpLHRoaXMubm90aWZ5TW9kaWZpZWQoKX19Z2V0RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5tX2Rlc2NyaXB0aW9ufWFzc2lnblZlcnRleERlc2NyaXB0aW9uKHQpe3RoaXMubV9kZXNjcmlwdGlvbiE9PXQmJnRoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpfW1lcmdlVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpe2NvbnN0IGU9dGhpcy5nZXREZXNjcmlwdGlvbigpLHM9eChlLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24ocyl9bWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbih0KXt0aGlzLm1fZGVzY3JpcHRpb24hPT10JiYodGhpcy5tX2Rlc2NyaXB0aW9uLmhhc0F0dHJpYnV0ZXNGcm9tKHQpfHx0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpKX1oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMubV9kZXNjcmlwdGlvbi5oYXNBdHRyaWJ1dGUodCl9YWRkQXR0cmlidXRlKHQpe2lmKHRoaXMubV9kZXNjcmlwdGlvbi5oYXNBdHRyaWJ1dGUodCkpcmV0dXJuO2NvbnN0IGU9Qyh0aGlzLm1fZGVzY3JpcHRpb24sdCk7dGhpcy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbihlKX1kcm9wQXR0cmlidXRlKHQpe2lmKCF0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpKXJldHVybjtjb25zdCBlPXYodGhpcy5tX2Rlc2NyaXB0aW9uLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24oZSl9ZHJvcEFsbEF0dHJpYnV0ZXMoKXtjb25zdCB0PVAoKTt0IT09dGhpcy5tX2Rlc2NyaXB0aW9uJiZ0aGlzLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHQpfWdldEF0dHJpYnV0ZVN0cmVhbVJlZih0KXt0aGlzLnRocm93SWZFbXB0eSgpLHRoaXMubV9kZXNjcmlwdGlvbi5oYXNBdHRyaWJ1dGUodCl8fGUoXCJBdHRyaWJ1dGVTdHJlYW0gOiBHZW9tZXRyeSBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGVcIik7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlSW5kZXgodCk7cmV0dXJuIHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChzKX1zZXRBdHRyaWJ1dGVTdHJlYW1SZWYodCxzKXtzfHxlKFwic3RyZWFtXCIpLHMmJmJlLmdldFBlcnNpc3RlbmNlKHQpIT09cy5nZXRQZXJzaXN0ZW5jZSgpJiZlKFwiXCIpLHRoaXMuYWRkQXR0cmlidXRlKHQpO2NvbnN0IG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHQpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmVtcHR5KCkmJnRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmRlc3Ryb3lBbmRTZXRTaXplKHRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpKSx0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5zZXQobixzKSx0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9bm90aWZ5TW9kaWZpZWRGbGFncyh0KXs2NTUzNT09PXQmJih0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50PS0xLHRoaXMubm90aWZ5TW9kaWZpZWRBbGxJbX
1BsKCkpLHRoaXMuc2V0RGlydHlGbGFnUHJvdGVjdGVkKHQsITApLHRoaXMuY2xlYXJBY2NlbGVyYXRvcnMoKSwzMiZ0JiZ0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKX1ub3RpZnlNb2RpZmllZCgpe3RoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1nZXRQb2ludENvdW50KCl7cmV0dXJuIHRoaXMubV9wb2ludENvdW50fWdldFBvaW50QnlWYWwodCxlKXtjb25zdCBzPWU7cy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pO2ZvcihsZXQgbj0wO248dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7bisrKXtjb25zdCBlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3Mobik7Zm9yKGxldCBpPTAscj1iZS5nZXRDb21wb25lbnRDb3VudChlKTtpPHI7aSsrKXtjb25zdCBvPXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChuKS5yZWFkQXNEYmwocip0K2kpO3Muc2V0QXR0cmlidXRlQmFzaWMoZSxpLG8pfX19c2V0UG9pbnRCeVZhbE5vQ3VydmVzKHQscyl7Y29uc3Qgbj1zO24uaXNFbXB0eSgpJiZlKFNlKTtjb25zdCBpPW4uZ2V0RGVzY3JpcHRpb24oKTtpIT09dGhpcy5tX2Rlc2NyaXB0aW9uJiZ0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oaSk7Y29uc3Qgcj10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCk7ci53cml0ZSgyKnQsbi5nZXRYKCkpLHIud3JpdGUoMip0KzEsbi5nZXRZKCkpO2ZvcihsZXQgZT0xLG89dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxvO2UrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLGk9YmUuZ2V0Q29tcG9uZW50Q291bnQocyk7Zm9yKGxldCByPTA7cjxpO3IrKyl7Y29uc3Qgbz1uLmdldEF0dHJpYnV0ZUFzRGJsKHMscik7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLndyaXRlQXNEYmwodCppK3Isbyl9fXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1zZXRQb2ludEJ5VmFsRnJvbUFycmF5Tm9DdXJ2ZXModCxlLG4saSl7cygwKX1nZXRQb2ludEJ5VmFsQXNBcnJheSh0LGUsbixpKXtzKDApfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5pc0VtcHR5SW1wbCgpfWlzRW1wdHlJbXBsKCl7cmV0dXJuIDA9PT10aGlzLm1fcG9pbnRDb3VudH1nZXRBdHRyaWJ1dGVBc0RibCh0LGUscyl7Y29uc3QgaT1iZS5nZXRDb21wb25lbnRDb3VudCh0KTtzPj1pJiZuKFwiXCIpO2NvbnN0IHI9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHQpO3JldHVybiByPj0wP3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChyKS5yZWFkQXNEYmwoZSppK3MpOmJlLmdldERlZmF1bHRWYWx1ZSh0KX1xdWVyeUF0dHJpYnV0ZUFzRGJsKHQsZSxzLGkpe2NvbnN0IHI9YmUuZ2V0Q29tcG9uZW50Q291bnQodCk7aTxyJiZuKFwiXCIpO2NvbnN0IG89dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHQpO2lmKG8+PTApe2NvbnN0IHQ9ZSpyLG49dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG8pO2ZvcihsZXQgZT0wO2U8cjtlKyspc1tlXT1uLnJlYWRBc0RibCh0K2UpfWVsc2V7Y29uc3QgZT1iZS5nZXREZWZhdWx0VmFsdWUodCk7Zm9yKGxldCB0PTA7dDxyO3QrKylzW3RdPWV9fWdldEF0dHJpYnV0ZUFzSW50KHQsZSxzKXtyZXR1cm4gTWF0aC50cnVuYyh0aGlzLmdldEF0dHJpYnV0ZUFzRGJsKHQsZSxzKSl9cXVlcnlBdHRyaWJ1dGVBc0ludCh0LGUsbixpKXtzKDApfXNldEF0dHJpYnV0ZU5vQ3VydmVzKHQsZSxzLGkpe2NvbnN0IHI9YmUuZ2V0Q29tcG9uZW50Q291bnQodCk7cz49ciYmbihcIlwiKSx0aGlzLmFkZEF0dHJpYnV0ZSh0KTtjb25zdCBvPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVJbmRleCh0KTt0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSksdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG8pLndyaXRlQXNEYmwoZSpyK3MsaSl9c2V0QXR0cmlidXRlRnJvbUFycmF5Tm9DdXJ2ZXModCxlLHMsaSl7KGU8MHx8ZT49dGhpcy5tX3BvaW50Q291bnQpJiZuKFwiXCIpO2NvbnN0IHI9YmUuZ2V0Q29tcG9uZW50Q291bnQodCk7aTxyJiZuKFwiXCIpLHRoaXMuYWRkQXR0cmlidXRlKHQpO2NvbnN0IG89dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHQpO3RoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKTtjb25zdCBhPXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChvKTtmb3IobGV0IG49MDtuPHI7KytuKWEud3JpdGVBc0RibChlKnIrbixzW25dKX1nZXRYWSh0KXtyZXR1cm4gdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApLnJlYWRQb2ludDJEKDIqdCl9cXVlcnlYWSh0LGUpe3JldHVybiB0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCkucXVlcnlQb2ludDJEKDIqdCxlKX1zZXRYWU5vQ3VydmVzKHQsZSl7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApLndyaXRlUG9pbnQyRCgyKnQsZSksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfXNldFhZQ29vcmRzTm9DdXJ2ZXModCxlLHMpe2NvbnN0IG49dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApO24ud3JpdGUoMip0LGUpLG4ud3JpdGUoMip0KzEscyksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWdldFhZWih0KXtjb25zdCBlPXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCgwKSxzPVkuZ2V0TkFOKCk7cmV0dXJuIHMueD1lLnJlYWQoMip0KSxzLnk9ZS5yZWFkKDIqdCsxKSx0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKDEpP3Muej10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMSkucmVhZCh0KTpzLno9YmUuZ2V0RGVmYXVsdFZhbHVlKDEpLHN9c2V0WFlaTm9DdXJ2ZXModCxlKXt0aGlzLmFkZEF0dHJpYnV0ZSgxKSx0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSk7Y29uc3Qgcz10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCk7cy53cml0ZSgyKnQsZS54KSxzLndyaXRlKDIqdCsxLGUueSk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDEpLndyaXRlKHQsZS56KX1xdWVyeUVudmVsb3BlKHQpe3QgaW5zdGFuY2VvZiBsZXx8dCBpbnN0YW5jZW9mIFM/dGhpcy51cGRhdGVFbnZlbG9wZSh0KToodGhpcy51cGRhdGVBbGxEaXJ0eUludGVydmFscyghMCksdGhpcy5tX2VudmVsb3BlRGF0YS5jb3B5VG8odGhpcy5tX2Rlc2NyaXB0aW9uLHQpKX1xdWVyeUxvb3NlRW52ZWxvcGUodCl7dGhpcy51cGRhdGVMb29zZUVudmVsb3BlKHQpfXF1ZXJ5SW50ZXJ2YWwodCxlKXtjb25zdCBzPVUuY29uc3RydWN0RW1wdHkoKTtyZXR1cm4gdGhpcy5pc0VtcHR5SW1wbCgpfHwodGhpcy51cGRhdGVBbGxEaXJ0eUludGVydmFscyghMCksdGhpcy5tX2VudmVsb3BlRGF0YS5xdWVyeUludGVydmFsKHRoaXMubV9kZXNjcmlwdGlvbix0LGUscykpLHN9c2V0QXR0cmlidXRlQmFzaWModCxlLHMpe3RoaXMuc2V0QXR0cmlidXRlSW1wbCh0LGUscyl9c2V0QXR0cmlidXRlSW1wbCh0LGUscyl7aWYodGhpcy5hZGRBdHRyaWJ1dGUodCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuO2xldCBuPSExO2NvbnN0IGk9YmUuZ2V0Q29tcG9uZW50Q291bnQodCkscj10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZih0KSxvPU51bWJlci5pc05hTihzKTtpZigxPT09ci5nZXRQZXJzaXN0ZW5jZSgpKXtjb25zdCB0PXI7Zm9yKGxldCByPWUsYT10aGlzLm1fcG9pbnRDb3VudCppO3I8YTtyKz1pKXtjb25zdCBlPXQucmVhZChyKTsob3x8ZT09PXMpJiZOdW1iZXIuaXNOYU4oZSl8fCh0LndyaXRlKHIscyksbj0hMCl9fWVsc2UgZm9yKGxldCBhPWUsaD10aGlzLm1fcG9pbnRDb3VudCppO2E8aDthKz1pKXtyLnJlYWRBc0RibChhKSE9PXMmJihyLndyaXRlQXNEYmwoYSxzKSxuPSEwKX1uJiZ0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9cmVwbGFjZU5hTnModCxlKXtpZih0aGlzLmFkZEF0dHJpYnV0ZSh0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm47bGV0IHM9ITE7Y29uc3Qgbj1iZS5nZXRDb21wb25lbnRDb3VudCh0KSxpPXRoaXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKHQpO2ZvcihsZXQgcj0wO3I8bjtyKyspaWYoMT09PWkuZ2V0UGVyc2lzdGVuY2UoKSl7Y29uc3QgdD1pO2ZvcihsZXQgaT0wLHI9dGhpcy5tX3BvaW50Q291bnQqbjtpPHI7aSsrKXtjb25zdCBuPXQucmVhZChpKTtOdW1iZXIuaXNOYU4obikmJih0LndyaXRlKGksZSkscz0hMCl9fWVsc2UgZm9yKGxldCB0PTAsbz10aGlzLm1fcG9pbnRDb3VudCpuO3Q8bzt0Kyspe2NvbnN0IG49aS5yZWFkQXNEYmwodCk7TnVtYmVyLmlzTmFOKG4pJiYoaS53cml0ZUFzRGJsKHQsZSkscz0hMCl9cyYmdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWNhbGN1bGF0ZUxlbmd0aDNEK
1HQpe3JldHVybiBzKDApLDB9c2V0RW52ZWxvcGVGb3JJbXBvcnQodCl7dGhpcy5tX2Rlc2NyaXB0aW9uLmVxdWFscyh0LmdldERlc2NyaXB0aW9uKCkpfHxlKFwiXCIpLHRoaXMubV9lbnZlbG9wZURhdGE9bmV3IHkoe21vdmVFbnY6dH0pLHRoaXMuc2V0RGlydHlGbGFnUHJvdGVjdGVkKDE5MiwhMSl9Y29weVRvKHQpe3QuZ2V0R2VvbWV0cnlUeXBlKCkhPT10aGlzLmdldEdlb21ldHJ5VHlwZSgpJiZlKFwiXCIpLHRoaXMhPT10JiZ0aGlzLmNvcHlUb1VuY2hlY2tlZCh0LCExKX1xdWVyeUNvb3JkaW5hdGVzKHQscyxuLGkpe2xldCByPWk8MD90aGlzLm1fcG9pbnRDb3VudDppO2lmKHI9TWF0aC5taW4ocixuK3MpLChuPDB8fHI8bnx8dGhpcy5tX3BvaW50Q291bnQ+MCYmbj49dGhpcy5tX3BvaW50Q291bnQpJiZlKFwiXCIpLDA9PT10aGlzLm1fcG9pbnRDb3VudClyZXR1cm4gcjtjb25zdCBvPXRoaXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApO2ZvcihsZXQgZT0yKm4sYT0yKnIsaD0wO2U8YTtlKz0yLGgrKylvLnF1ZXJ5UG9pbnQyRChlLHRbaF0pO3JldHVybiByfXF1ZXJ5Q29vcmRpbmF0ZXMzRCh0LHMsbixpKXtsZXQgcj1pPDA/dGhpcy5tX3BvaW50Q291bnQ6aTtpZihyPU1hdGgubWluKHIsbitzKSwobjwwfHxyPG58fHRoaXMubV9wb2ludENvdW50PjAmJm4+PXRoaXMubV9wb2ludENvdW50KSYmZShcIlwiKSwwPT09dGhpcy5tX3BvaW50Q291bnQpcmV0dXJuIHI7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKTtsZXQgYT1udWxsO2NvbnN0IGg9YmUuZ2V0RGVmYXVsdFZhbHVlKDEpLHU9dGhpcy5tX2Rlc2NyaXB0aW9uLmhhc0F0dHJpYnV0ZSgxKTt1JiYoYT10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigxKSk7bGV0IG09MDtmb3IobGV0IGU9bjtlPHI7ZSsrLG0rKyl0W21dLng9by5yZWFkKDIqZSksdFttXS55PW8ucmVhZCgyKmUrMSksdFttXS56PXU/YS5yZWFkKGUpOmg7cmV0dXJuIHJ9Y2xlYXJBbmRTZXREaXJ0eUZsYWdQcm90ZWN0ZWQodCxlKXtsZXQgcz0wO2NvbnN0IG49dCZ+ZSxpPWV8bjtzPXRoaXMubV9mbGFncywocyZpKSE9PWUmJih0aGlzLm1fZmxhZ3M9cyZ+bnxlKX1nZXRJc1NpbXBsZSh0LGUpe2VbMF09MDtsZXQgcz0tMTtjb25zdCBuPXRoaXMubV9mbGFncyxpPXRoaXMubV9zaW1wbGVUb2xlcmFuY2U7aWYoISgxJm4pKXtzPSgxNCZuKT4+MSxlWzBdPWksaTx0JiYocz0tMSl9cmV0dXJuIHN9c2V0SXNTaW1wbGUodCxlLG49ITEpe2lmKDI9PT10P3ModGhpcy5nZXRHZW9tZXRyeVR5cGUoKT09PWkuZW51bVBvbHlsaW5lKToxPT09dD9zKHRoaXMuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1NdWx0aVBvaW50fHx0aGlzLmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtUG9seWxpbmUpOjM9PT10JiZzKHRoaXMuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1Qb2x5Z29uKSwtMT09PXQpdGhpcy5zZXREaXJ0eUZsYWdQcm90ZWN0ZWQoMTcsITApO2Vsc2V7bGV0IHM9dDw8MTtufHwoc3w9MTYpO2NvbnN0IGk9MzE7dGhpcy5jbGVhckFuZFNldERpcnR5RmxhZ1Byb3RlY3RlZChpLHMpLHRoaXMubV9zaW1wbGVUb2xlcmFuY2UhPT1lJiYodGhpcy5tX3NpbXBsZVRvbGVyYW5jZT1lKX19YXR0cmlidXRlU3RyZWFtSXNBbGxvY2F0ZWQodCl7dGhpcy50aHJvd0lmRW1wdHkoKTtjb25zdCBlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVJbmRleCh0KTtyZXR1cm4gZT49MCYmbnVsbCE9PXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKX1jYXBhY2l0eSgpe3JldHVybi0xPT09dGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudCYmMD09PXRoaXMubV9wb2ludENvdW50PzA6dGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudH1nZXREZXNjcmlwdGlvbkltcGwoKXtyZXR1cm4gdGhpcy5tX2Rlc2NyaXB0aW9ufWNvcHlUb1VuY2hlY2tlZCh0LGU9ITEpe2UmJnRoaXMuaGFzRGlydHlGbGFnKDMyKSYmcihcIkNhbm5vdCBkbyBzaGFsbG93IGNsb25lIG9uIHVucHJlcGFyZWQgZ2VvbWV0cnlcIik7Y29uc3Qgbj10LG89dGhpcy5nZXRHZW9tZXRyeVR5cGUoKSxhPW4uZ2V0R2VvbWV0cnlUeXBlKCk7cyhvPT09YXx8bz09PWkuZW51bVBvbHlnb24mJmE9PT1pLmVudW1Qb2x5bGluZSxcImZhaWx1cmUgaW4gY29weVRvVW5jaGNrZWRcIiksbi5jbGVhckFjY2VsZXJhdG9ycygpLG4ubV9kZXNjcmlwdGlvbj10aGlzLm1fZGVzY3JpcHRpb24sbi5tX3ZlcnRleEF0dHJpYnV0ZXMuZGVzdHJveUFuZFNldFNpemUoMCksbi5tX2VudmVsb3BlRGF0YS5yZWxlYXNlQXR0cmlidXRlcygpO2NvbnN0IGg9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCksdT1uZXcgZGU7aWYoIXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmVtcHR5KCkpe3UuZGVzdHJveUFuZFNldFNpemUoaCk7Zm9yKGxldCB0PTA7dDxoO3QrKylpZih0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCkpaWYoZSl1LnNldCh0LHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCh0KSk7ZWxzZXtjb25zdCBlPWJlLmdldENvbXBvbmVudENvdW50KHRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCkpO3Uuc2V0KHQsdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHQpLnJlc3RyaWN0ZWRDbG9uZSh0aGlzLmdldFBvaW50Q291bnQoKSplKSl9fWlmKHRoaXMubV9lbnZlbG9wZURhdGEuY29weVRvSWZOb3ROdWxsKHRoaXMubV9kZXNjcmlwdGlvbixuLm1fZW52ZWxvcGVEYXRhKSxuLm1fZmxhZ3M9dGhpcy5tX2ZsYWdzLG4ubV9zaW1wbGVUb2xlcmFuY2U9dGhpcy5tX3NpbXBsZVRvbGVyYW5jZSxvIT09YSl7Y29uc3QgdD1bTnVtYmVyLk5hTl07bi5nZXRJc1NpbXBsZSgwLHQpPj0zP24uc2V0SXNTaW1wbGUoMSx0WzBdKTpuLnNldElzU2ltcGxlKC0xLDApfW4ubV92ZXJ0ZXhBdHRyaWJ1dGVzLnN3YXAodSksdS5kZXN0cm95QW5kU2V0U2l6ZSgwKSxuLm1fcG9pbnRDb3VudD10aGlzLm1fcG9pbnRDb3VudCxuLmhhc0RpcnR5RmxhZygzMil8fG4ubV92ZXJ0ZXhBdHRyaWJ1dGVzLmVtcHR5KCk/KHMoIWV8fDA9PT1uLm1fcG9pbnRDb3VudCksbi5tX3Jlc2VydmVkUG9pbnRDb3VudD0tMSk6bi5tX3Jlc2VydmVkUG9pbnRDb3VudD1uLm1fcG9pbnRDb3VudDt0cnl7dGhpcy5jb3B5VG9JbXBsKG4sZSl9Y2F0Y2gobSl7dGhyb3cgbi5zZXRFbXB0eSgpLG19bi52ZXJpZnlBbGxTdHJlYW1zQWZ0ZXJTaXplQ2hhbmdlKCl9YnVpbGRSYXN0ZXJpemVkR2VvbWV0cnlBY2NlbGVyYXRvcih0LGUpe3JldHVybiExfWdldEFjY2VsZXJhdG9ycygpe3JldHVybiB0aGlzLm1fYWNjZWxlcmF0b3JzfWNsZWFyQWNjZWxlcmF0b3JzKCl7dGhpcy5tX2FjY2VsZXJhdG9ycyYmdGhpcy5tX2FjY2VsZXJhdG9ycy5yZWxlYXNlKCksdGhpcy5tX2FjY2VsZXJhdG9ycz1udWxsfWVuc3VyZVVuaXF1ZUFjY2VsZXJhdG9ycygpe2lmKHRoaXMubV9hY2NlbGVyYXRvcnMmJiF0aGlzLm1fYWNjZWxlcmF0b3JzLnVuaXF1ZVVzZSgpKXtjb25zdCB0PXRoaXMubV9hY2NlbGVyYXRvcnMuY2xvbmUoKTt0aGlzLm1fYWNjZWxlcmF0b3JzLnJlbGVhc2UoKSx0aGlzLm1fYWNjZWxlcmF0b3JzPXR9fWludGVycG9sYXRlVHdvVmVydGljZXModCxlLGkscil7KHQ8MHx8dD49dGhpcy5tX3BvaW50Q291bnQpJiZuKFwiXCIpLChlPDB8fGU+PXRoaXMubV9wb2ludENvdW50KSYmbihcIlwiKSxyLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHRoaXMubV9kZXNjcmlwdGlvbik7Y29uc3Qgbz1PKGJlLm1heENvbXBvbmVudENvdW50KCksTnVtYmVyLk5hTiksYT1PKGJlLm1heENvbXBvbmVudENvdW50KCksTnVtYmVyLk5hTiksaD1FKCk7bGV0IHU9MDtmb3IobGV0IG49MDtuPHRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO24rKyl7Y29uc3Qgcj10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKG4pLG09YmUuZ2V0SW50ZXJwb2xhdGlvbihyKSxsPWJlLmdldENvbXBvbmVudENvdW50KHIpLGM9YmUuZ2V0RGVmYXVsdFZhbHVlKHIpO3RoaXMucXVlcnlBdHRyaWJ1dGVBc0RibChyLHQsbyxsKSx0aGlzLnF1ZXJ5QXR0cmlidXRlQXNEYmwocixlLGEsbCkscyh1K2w8PUQpLFEobSxvLGEsaCx1LGwsaSxjKSx1Kz1sfXZlKHIsaCl9Z2V0U2hvcnRlc3REaXN0YW5jZSh0LGUpe3JldHVybiBKLmRpc3RhbmNlKHRoaXMuZ2V0WFkodCksdGhpcy5nZXRYWShlKSl9Z2V0U2hvcnRlc3RTcXJEaXN0YW5jZSh0LGUpe3JldHVybiBKLnNxckRpc3RhbmNlKHRoaXMuZ2V0WFkodCksdGhpcy5nZXRYWShlKSl9cmVzaXplSW1wbCh0KXtpZih0PDAmJmUoKSwodD1NYXRoLmNlaWwodCkpPT09dGhpcy5tX3BvaW50Q291bnQpcmV0dXJuO3RoaXMubV9wb2ludENvdW50PXQ7Y29uc3Qgcz10aGlzLm1fcG9pbnRDb3VudDw9dGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD8yMDAxOjQwOTU7dGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKHMpfWFzc2lnblZlcnRleERlc2NyaXB0aW9uSW1wbCh0KXtpZighdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZW1wdHkoKSl7Y29uc3QgZT13KCk7QSh0LHRoaXMubV9kZXNjcmlwdGlvbixlKTtjb25zdCBzPW5ldyBkZTtzLmRlc3Ryb3lBbmRTZXRTaXplKHQuZ2V0QXR0cmlidXRlQ291bnQoKSk7Zm9yKGxldCBuPTA7bj
1x0LmdldEF0dHJpYnV0ZUNvdW50KCk7bisrKXtjb25zdCB0PWVbbl07LTEhPT10P3Muc2V0KG4sdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHQpKTp0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50PS0xfXMuc3dhcCh0aGlzLm1fdmVydGV4QXR0cmlidXRlcyl9dGhpcy5tX2Rlc2NyaXB0aW9uPXQsdGhpcy5tX2VudmVsb3BlRGF0YS5yZWxlYXNlQXR0cmlidXRlcygpLHRoaXMubm90aWZ5TW9kaWZpZWRGbGFncyg0MDk1KX1oYXNEaXJ0eUZsYWcodCl7cmV0dXJuIDAhPT0odGhpcy5tX2ZsYWdzJnQpfXNldERpcnR5RmxhZ1Byb3RlY3RlZCh0LGUpe2U/dGhpcy5tX2ZsYWdzfD10OnRoaXMubV9mbGFncyY9fnR9bm90aWZ5TW9kaWZpZWRBbGxJbXBsKCl7fXZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKXt0aGlzLmhhc0RpcnR5RmxhZygzMikmJnRoaXMudmVyaWZ5QWxsU3RyZWFtc0FmdGVyU2l6ZUNoYW5nZUltcGwoKX12ZXJpZnlBbGxTdHJlYW1zQWZ0ZXJTaXplQ2hhbmdlSW1wbCgpe2lmKHRoaXMuaGFzRGlydHlGbGFnKDMyKSl7aWYodGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudDx0aGlzLm1fcG9pbnRDb3VudCl7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZW1wdHkoKSYmdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZGVzdHJveUFuZFNldFNpemUodGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCkpLHRoaXMubV9yZXNlcnZlZFBvaW50Q291bnQ9LTE7bGV0IHQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsZT0wO2U9dGhpcy5tX3BvaW50Q291bnQ8ND8zOnRoaXMubV9wb2ludENvdW50PD0xMjg/Mip0aGlzLm1fcG9pbnRDb3VudDpNYXRoLnRydW5jKCg0KnRoaXMubV9wb2ludENvdW50KzIpLzMpO2ZvcihsZXQgcz0wO3M8dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7cysrKXtjb25zdCBuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3Mocyk7bGV0IGk9MDtpZihudWxsIT09dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHMpKXtjb25zdCB0PWJlLmdldENvbXBvbmVudENvdW50KG4pO2k9dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHMpLnNpemUoKS90LGk8dGhpcy5tX3BvaW50Q291bnQmJih0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQocykucmVzaXplKGUqdCxiZS5nZXREZWZhdWx0VmFsdWUobikpLGk9ZSl9ZWxzZSB0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5zZXQocyxUKG4sZSkpLGk9ZTtpPHQmJih0PWkpfXRoaXMubV9yZXNlcnZlZFBvaW50Q291bnQ9dH10aGlzLnZlcmlmeVN0cmVhbXNBZnRlclNpemVDaGFuZ2VFeHRyYUltcGwoKSx0aGlzLnNldERpcnR5RmxhZ1Byb3RlY3RlZCgzMiwhMSl9fXZlcmlmeVN0cmVhbXNBZnRlclNpemVDaGFuZ2VFeHRyYUltcGwoKXt9dXBkYXRlQWxsRGlydHlJbnRlcnZhbHModCl7aWYodD90aGlzLmhhc0RpcnR5RmxhZygxOTIpOnRoaXMuaGFzRGlydHlGbGFnKDEyOCkpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmhhc0RpcnR5RmxhZygxOTIpJiZ0aGlzLm1fZW52ZWxvcGVEYXRhLnNldEVtcHR5KHRoaXMubV9kZXNjcmlwdGlvbiksdm9pZCB0aGlzLnNldERpcnR5RmxhZ1Byb3RlY3RlZCgxOTIsITEpO2NvbnN0IGU9dGhpcy51cGRhdGVYWUltcGwodCkscz1uZXcgSSh7dmQ6dGhpcy5tX2Rlc2NyaXB0aW9ufSk7cy5zZXRFbnZlbG9wZShlKTtmb3IobGV0IHQ9MTt0PHRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3QrKyl7Y29uc3QgZT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHQpLG49YmUuZ2V0Q29tcG9uZW50Q291bnQoZSksaT10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCk7Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3Qgcj1uZXcgVTtyLnNldEVtcHR5KCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm1fcG9pbnRDb3VudDtlKyspe2NvbnN0IHM9aS5yZWFkQXNEYmwoZSpuK3QpO3IubWVyZ2VDb29yZGluYXRlKHMpfXMuc2V0SW50ZXJ2YWxFbnZlbG9wZShlLHQscil9fSh0P3RoaXMuaGFzRGlydHlGbGFnKDE5Mik6dGhpcy5oYXNEaXJ0eUZsYWcoMTI4KSkmJih0aGlzLm1fZW52ZWxvcGVEYXRhPW5ldyB5KHttb3ZlRW52OnN9KSx0aGlzLmNsZWFyRGlydHlJbnRlcnZhbHNGbGFnKHQpKX19dXBkYXRlWFlJbXBsKHQpe2NvbnN0IGU9bGUuY29uc3RydWN0RW1wdHkoKSxzPXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCgwKTtyZXR1cm4gZS5tZXJnZVBvaW50c0ludGVybGVhdmVkKHMsMCx0aGlzLm1fcG9pbnRDb3VudCksZX11cGRhdGVFbnZlbG9wZTNEKHQpe3MoMCl9dXBkYXRlTG9vc2VFbnZlbG9wZSh0KXt0aGlzLnVwZGF0ZUFsbERpcnR5SW50ZXJ2YWxzKCExKSx0IGluc3RhbmNlb2YgbGU/dC5hc3NpZ24odGhpcy5tX2VudmVsb3BlRGF0YS5tX2VudmVsb3BlMkQpOnRoaXMubV9lbnZlbG9wZURhdGEucXVlcnlFbnZlbG9wZTNEKHRoaXMubV9kZXNjcmlwdGlvbix0KX11cGRhdGVFbnZlbG9wZSh0KXt0aGlzLnVwZGF0ZUFsbERpcnR5SW50ZXJ2YWxzKCEwKSx0LmFzc2lnbih0aGlzLm1fZW52ZWxvcGVEYXRhLm1fZW52ZWxvcGUyRCl9c2V0RW1wdHlJbXBsKCl7dGhpcy5tX3BvaW50Q291bnQ9MCx0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50PS0xLHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmRlc3Ryb3lBbmRTZXRTaXplKDApLHRoaXMubm90aWZ5TW9kaWZpZWRGbGFncyg0MDk1KX1jbGVhckRpcnR5SW50ZXJ2YWxzRmxhZyh0KXt0aGlzLnNldERpcnR5RmxhZ1Byb3RlY3RlZCgxOTIsITEpfXJlc2VydmVJbXBsKHQscyl7aWYodDwwJiZlKFwiXCIpLDA9PT10KXJldHVybjtsZXQgbj10PU1hdGguY2VpbCh0KTtpZih0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50PG4pe3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmVtcHR5KCkmJnRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmRlc3Ryb3lBbmRTZXRTaXplKHRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpKSxzPyhudWxsPT09dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApJiZ0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5zZXQoMCxNKDAsMCkpLHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCgwKS5yZXNpemVSb3VuZGVkKDIqbiksbj10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCkuc2l6ZSgpPj4xKTpudWxsPT09dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApP3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLnNldCgwLE0oMCxuKSk6dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApLnJlc2l6ZSgyKm4pO2ZvcihsZXQgdD0xO3Q8dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7dCsrKXtjb25zdCBlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCkscz1iZS5nZXRDb21wb25lbnRDb3VudChlKTtudWxsIT09dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHQpP3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCh0KS5yZXNpemUobipzKTp0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5zZXQodCxNKGUsbikpfXRoaXMucmVzZXJ2ZUltcGxJbXBsKG4scyksdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD1ufX1yZXNlcnZlUm91bmRlZCh0KXt0PDAmJmUoKSx0PU1hdGguY2VpbCh0KSx0aGlzLnJlc2VydmVJbXBsKHQsITApfXJlc2VydmVJbXBsSW1wbCh0LGUpe310aHJvd0lmRW1wdHkoKXt0aGlzLmlzRW1wdHlJbXBsKCkmJm8oXCJcIil9ZXhwb3J0VmVydGV4QXR0cmlidXRlcygpe2NvbnN0IHQ9dGhpcy5nZXRQb2ludENvdW50KCksZT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlSW5kZXgoMSkscz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlSW5kZXgoMiksbj10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5wb3NTdHJlYW0saT1lPjA/dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpOnZvaWQgMCxyPXM+M
1D90aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQocyk6dm9pZCAwLG89bj8uZ2V0QXJyYXkoKT8/bmV3IEZsb2F0NjRBcnJheSxhPWk/LmdldEFycmF5KCksaD1yPy5nZXRBcnJheSgpO3JldHVybnt2ZXJ0ZXhDb3VudDp0LHZlcnRleFhZOm8sdmVydGV4WjphLHZlcnRleE06aH19fWNsYXNzIERlIGV4dGVuZHMgRWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdCYmKHQucG9pbnRzP3RoaXMuYWRkUG9pbnRzMkQodC5wb2ludHMsdC5wb2ludHNTaXplLDAsLTEpOnQucG9pbnQmJnRoaXMuYWRkKHQucG9pbnQpKX1hc3NpZ25Db3B5KHQpe3JldHVybiB0LmNvcHlUbyh0aGlzKSx0aGlzfWFzc2lnbk1vdmUodCl7cmV0dXJuIHQuY29weVRvKHRoaXMpLHQuc2V0RW1wdHkoKSx0aGlzfWluc2VydFBvaW50MkQodCxzKXt0PnRoaXMuZ2V0UG9pbnRDb3VudCgpJiZlKFwiaW52YWxpZCBwb2ludCBpbmRleFwiKSx0PDAmJih0PXRoaXMuZ2V0UG9pbnRDb3VudCgpKTtjb25zdCBuPXRoaXMubV9wb2ludENvdW50O3RoaXMucmVzaXplTm9Jbml0KHRoaXMubV9wb2ludENvdW50KzEpO2ZvcihsZXQgZT0wLGk9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxpO2UrKyl7Y29uc3QgaT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLHI9Yi5nZXRDb21wb25lbnRDb3VudChpKTtpZigwPT09aSl0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0KHIqdCxzLHIqbik7ZWxzZXtjb25zdCBzPWIuZ2V0RGVmYXVsdFZhbHVlKGkpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5pbnNlcnRSYW5nZShyKnQscyxyLHIqbil9fXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1pbnNlcnRQb2ludCh0LHMpe3MuaXNFbXB0eSgpJiZlKFNlKSx0PDAmJih0PXRoaXMuZ2V0UG9pbnRDb3VudCgpKSx0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24ocy5nZXREZXNjcmlwdGlvbigpKTtjb25zdCBuPXRoaXMubV9wb2ludENvdW50O3RoaXMucmVzaXplTm9Jbml0KHRoaXMubV9wb2ludENvdW50KzEpO2ZvcihsZXQgZT0wLGk9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxpO2UrKyl7Y29uc3QgaT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLHI9Yi5nZXRDb21wb25lbnRDb3VudChpKTtpZihzLmhhc0F0dHJpYnV0ZShpKSl0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0QXR0cmlidXRlcyhyKnQscyxpLHIqbik7ZWxzZXtjb25zdCBzPWIuZ2V0RGVmYXVsdFZhbHVlKGkpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5pbnNlcnRSYW5nZShyKnQscyxyLHIqbil9fXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1pbnNlcnRQb2ludHModCxlLHMpe2lmKCh0PnRoaXMuZ2V0UG9pbnRDb3VudCgpfHxzPDApJiZuKFwiXCIpLHQ8MCYmKHQ9dGhpcy5nZXRQb2ludENvdW50KCkpLDA9PT1zKXJldHVybjtjb25zdCBpPWVbMF0uZ2V0RGVzY3JpcHRpb24oKTt0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oaSk7Y29uc3Qgcj10aGlzLm1fcG9pbnRDb3VudDt0aGlzLnJlc2l6ZU5vSW5pdCh0aGlzLm1fcG9pbnRDb3VudCtzKTtmb3IobGV0IG49MCxvPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO248bztuKyspe2NvbnN0IG89dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhuKSxhPWIuZ2V0Q29tcG9uZW50Q291bnQobyk7aWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG4pKWlmKGkuaGFzQXR0cmlidXRlKG8pKXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChuKS5pbnNlcnRBdHRyaWJ1dGVzRnJvbVBvaW50cyh0KmEsZSxzLG8sciphKTtlbHNle2NvbnN0IGU9Yi5nZXREZWZhdWx0VmFsdWUobyk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG4pLmluc2VydFJhbmdlKGEqdCxlLGEqcyxhKnIpfX10aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9aW5zZXJ0UG9pbnRzMkQodCxzLG4pe2lmKCh0PnRoaXMuZ2V0UG9pbnRDb3VudCgpfHxuPDApJiZlKFwiaW52YWxpZCBwb2ludCBpbmRleFwiKSx0PDAmJih0PXRoaXMuZ2V0UG9pbnRDb3VudCgpKSwwPT09bilyZXR1cm47Y29uc3QgaT10aGlzLm1fcG9pbnRDb3VudDt0aGlzLnJlc2l6ZU5vSW5pdCh0aGlzLm1fcG9pbnRDb3VudCtuKTtmb3IobGV0IGU9MCxyPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO2U8cjtlKyspe2NvbnN0IHI9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhlKSxvPWIuZ2V0Q29tcG9uZW50Q291bnQocik7aWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpKWlmKDA9PT1yKXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5pbnNlcnRSYW5nZUZyb21Qb2ludHMobyp0LHMsMCxuLCEwLG8qaSk7ZWxzZXtjb25zdCBzPWIuZ2V0RGVmYXVsdFZhbHVlKHIpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5pbnNlcnRSYW5nZShvKnQscyxvLG8qaSl9fXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1yZW1vdmVQb2ludHModCxlKXtpZigodDwwfHxlPDB8fHQrZT50aGlzLmdldFBvaW50Q291bnQoKSkmJm4oXCJyZW1vdmVfcG9pbnRzXCIpLDAhPT1lKXtmb3IobGV0IHM9MCxuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3M8bjtzKyspaWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHMpKXtjb25zdCBuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MocyksaT1iLmdldENvbXBvbmVudENvdW50KG4pO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChzKS5lcmFzZVJhbmdlKGkqdCxpKmUsaSp0aGlzLm1fcG9pbnRDb3VudCl9dGhpcy5tX3BvaW50Q291bnQtPWUsdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD4wJiYodGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudC09ZSksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfX1yZW1vdmVQb2ludCh0KXtmb3IobGV0IGU9MCxzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO2U8cztlKyspaWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksbj1iLmdldENvbXBvbmVudENvdW50KHMpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChl
1KS5lcmFzZVJhbmdlKG4qdCxuLG4qdGhpcy5tX3BvaW50Q291bnQpfXRoaXMubV9wb2ludENvdW50LS0sdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD4wJiZ0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50LS0sdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWNhbGN1bGF0ZUVudmVsb3BlMkQoKXtyZXR1cm4gdGhpcy51cGRhdGVYWUltcGwoITApfXJlc2l6ZU5vSW5pdCh0KXt0aGlzLnJlc2l6ZUltcGwodCl9cmVzaXplQW5kSW5pdE5vblBvc2l0aW9uQXR0cmlidXRlcyh0KXtjb25zdCBlPXRoaXMubV9wb2ludENvdW50O2lmKHRoaXMucmVzaXplSW1wbCh0KSx0aGlzLm1fcG9pbnRDb3VudD5lKWZvcihsZXQgcz0xLG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7czxuO3MrKyl7Y29uc3QgdD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHMpLG49Yi5nZXREZWZhdWx0VmFsdWUodCksaT1iLmdldENvbXBvbmVudENvdW50KHQpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChzKS5pbnNlcnRSYW5nZShpKmUsbixpKih0aGlzLm1fcG9pbnRDb3VudC1lKSxpKmUpfX1xdWVyeUNvb3JkaW5hdGVzM0QodCxzLG4saSl7bGV0IHI9aTwwP3RoaXMubV9wb2ludENvdW50Omk7aWYocj1NYXRoLm1pbihyLG4rcyksKG48MHx8cjxufHx0aGlzLm1fcG9pbnRDb3VudD4wJiZuPj10aGlzLm1fcG9pbnRDb3VudCkmJmUoXCJcIiksMD09PXRoaXMubV9wb2ludENvdW50KXJldHVybiByO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoMCk7bGV0IGE9bnVsbDtjb25zdCBoPWIuZ2V0RGVmYXVsdFZhbHVlKDEpLHU9dGhpcy5tX2Rlc2NyaXB0aW9uLmhhc0F0dHJpYnV0ZSgxKTt1JiYoYT10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigxKSk7bGV0IG09MDtmb3IobGV0IGU9bjtlPHI7ZSsrLG0rKyl0W21dLng9by5yZWFkKDIqZSksdFttXS55PW8ucmVhZCgyKmUrMSksdFttXS56PXU/YS5yZWFkKGUpOmg7cmV0dXJuIHJ9cXVlcnlBdHRyaWJ1dGVBc0ludCh0LGUsbixpKXtzKDApfWFkZCh0KXt0LmlzRW1wdHkoKSYmZShTZSksdGhpcy5yZXNpemVBbmRJbml0Tm9uUG9zaXRpb25BdHRyaWJ1dGVzKHRoaXMubV9wb2ludENvdW50KzEpLHRoaXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKHRoaXMubV9wb2ludENvdW50LTEsdCl9YWRkWFkodCxlKXt0aGlzLnJlc2l6ZUFuZEluaXROb25Qb3NpdGlvbkF0dHJpYnV0ZXModGhpcy5tX3BvaW50Q291bnQrMSk7Y29uc3Qgcz1uZXcgSih0LGUpO3RoaXMuc2V0WFlOb0N1cnZlcyh0aGlzLm1fcG9pbnRDb3VudC0xLHMpfWFkZFhZWih0LGUscyl7dGhpcy5yZXNpemVBbmRJbml0Tm9uUG9zaXRpb25BdHRyaWJ1dGVzKHRoaXMubV9wb2ludENvdW50KzEpO2NvbnN0IG49bmV3IFk7bi5zZXRDb29yZHModCxlLHMpLHRoaXMuc2V0WFlaTm9DdXJ2ZXModGhpcy5tX3BvaW50Q291bnQtMSxuKX1hZGRQb2ludDJEKHQpe3RoaXMuYWRkWFkodC54LHQueSl9YWRkUG9pbnQzRCh0KXt0aGlzLmFkZFhZWih0LngsdC55LHQueil9YWRkUG9pbnRzKHQscyxuKXt0aGlzPT09dCYmZShcIk11bHRpX3BvaW50X2ltcGwuYWRkXCIpO2NvbnN0IGk9bjwwP3QuZ2V0UG9pbnRDb3VudCgpOm47aWYoKHM8MHx8cz50LmdldFBvaW50Q291bnQoKXx8aTxzKSYmZShcIlwiKSxzPT09aSlyZXR1cm47Y29uc3Qgcj10LmdldERlc2NyaXB0aW9uKCk7dGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKHIpO2NvbnN0IG89aS1zLGE9dGhpcy5tX3BvaW50Q291bnQ7dGhpcy5yZXNpemVOb0luaXQodGhpcy5tX3BvaW50Q291bnQrbyk7Zm9yKGxldCBlPTAsaD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlQ291bnQoKTtlPGg7ZSsrKXtjb25zdCBuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksaT1iLmdldENvbXBvbmVudENvdW50KG4pLGg9dGhpcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYobik7aWYoci5oYXNBdHRyaWJ1dGUobikpe2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYobik7aC5pbnNlcnRSYW5nZUZyb21TdHJlYW0oYSppLGUscyppLG8qaSwhMCwxLGEqaSl9ZWxzZXtjb25zdCB0PWIuZ2V0RGVmYXVsdFZhbHVlKG4pO2guaW5zZXJ0UmFuZ2UoYSppLHQsbyppLGEqaSl9fX1hZGRQb2ludHMyRCh0LHMsbixpKXtsZXQgcj1zO2NvbnN0IG89aTwwP3I6aTtpZigocjwwfHxuPDB8fG4+cnx8bzxuKSYmZShcIlwiKSxuPT09bylyZXR1cm47cj1vLW47Y29uc3QgYT10aGlzLm1fcG9pbnRDb3VudDt0aGlzLnJlc2l6ZUFuZEluaXROb25Qb3NpdGlvbkF0dHJpYnV0ZXModGhpcy5tX3BvaW50Q291bnQrcik7Y29uc3QgaD10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKTtmb3IobGV0IGU9MDtlPHI7KytlKWgud3JpdGVQb2ludDJEKDIqKGErZSksdFtuK2VdKTt0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9YWRkUG9pbnRzM0QodCxzLG4saSl7bGV0IHI9cztjb25zdCBvPWk8MD9yOmk7aWYoKHI8MHx8bjwwfHxuPnJ8fG88bikmJmUoXCJcIiksdGhpcy5hZGRBdHRyaWJ1dGUoMSksbj09PW8pcmV0dXJuO3I9by1uO2NvbnN0IGE9dGhpcy5tX3BvaW50Q291bnQ7dGhpcy5yZXNpemVBbmRJbml0Tm9uUG9zaXRpb25BdHRyaWJ1dGVzKHRoaXMubV9wb2ludENvdW50K3IpO2NvbnN0IGg9dGhpcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoMCksdT1uZXcgSjtmb3IobGV0IGU9MDtlPHI7ZSsrKXUueD10W24rZV0ueCx1Lnk9dFtuK2VdLnksaC53cml0ZVBvaW50MkQoMiooYStlKSx1KTtjb25zdCBtPXRoaXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDEpO2ZvcihsZXQgZT0wO2U8cjtlKyspbS53cml0ZShhK2UsdFtuK2VdLnopO3RoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1zZXRQb2ludEJ5VmFsKHQsZSl7dGhpcy5zZXRQb2ludEJ5VmFsTm9DdXJ2ZXModCxlKX1zZXRYWSh0LGUpe3RoaXMuc2V0WFlOb0N1cnZlcyh0LGUpfXNldFhZQ29vcmRzKHQsZSxzKXt0aGlzLnNldFhZQ29vcmRzTm9DdXJ2ZXModCxlLHMpfXNldFhZWih0LGUpe3RoaXMuc2V0WFlaTm9DdXJ2ZXModCxlKX1zZXRBdHRyaWJ1dGUodCxlLHMsbil7dGhpcy5zZXRBdHRyaWJ1dGVOb0N1cnZlcyh0LGUscyxuKX1nZXRHZW9tZXRyeVR5cGUoKXtyZXR1cm4gaS5lbnVtTXVsdGlQb2ludH1nZXREaW1lbnNpb24oKXtyZXR1cm4gMH1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgRGUoe3ZkOnRoaXMuZ2V0RGVzY3JpcHRpb24oKX0pfXNldEVtcHR5KCl7dGhpcy5zZXRFbXB0eUltcGwoKX1hcHBseVRyYW5zZm9ybWF0aW9uKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybjtpZih0LmlzSWRlbnRpdHkoKSlyZXR1cm47Y29uc3QgZT10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCk7MT09PXQubV9UcmFuc2Zvcm1hdGlvblR5cGU/ZS5hcHBseVRyYW5zZm9ybWF0aW9uKHQsMCx0aGlzLm1fcG9pbnRDb3VudCk6YShcIjNkIHhmb3JtIG5vdCBpbXBsXCIpLHRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1jYWxjdWxhdGVBcmVhMkQoKXtyZXR1cm4gMH1jYWxjdWxhdGVMZW5ndGgyRCgpe3JldHVybiAwfWNhbGN1bGF0ZUxlbmd0aDNEK
1HQpe3JldHVybiAwfWVxdWFscyh0LGUpe3JldHVybiB0LmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtTXVsdGlQb2ludCYmdGhpcy5lcXVhbHNCYXNlKHQsZSl9cXVlcnlFbnZlbG9wZSh0KXs0PT09dC5tX0VudmVsb3BlVHlwZT8odGhpcy51cGRhdGVBbGxEaXJ0eUludGVydmFscyghMCksdGhpcy5tX2VudmVsb3BlRGF0YS5jb3B5VG8odGhpcy5tX2Rlc2NyaXB0aW9uLHQpKToyPT09dC5tX0VudmVsb3BlVHlwZT90aGlzLnVwZGF0ZUVudmVsb3BlKHQpOmEoXCJcIil9Z2V0SW1wbCgpe3JldHVybiB0aGlzfWdldEJvdW5kYXJ5KCl7cmV0dXJuIG51bGx9cmVzZXJ2ZSh0KXt0aGlzLnJlc2VydmVJbXBsKHQpfWNsb25lKCl7Y29uc3QgdD10aGlzLmNyZWF0ZUluc3RhbmNlKCk7cmV0dXJuIHRoaXMuY29weVRvKHQpLHR9c3dhcCh0KXtzKDApfWJ1aWxkUXVhZFRyZWVBY2NlbGVyYXRvcih0KXtyZXR1cm4hMX1nZXRIYXNoQ29kZUltcGwoKXtyZXR1cm4gcygwKSwwfWVxdWFsc0ltcGwodCl7cmV0dXJuITB9ZXF1YWxzSW1wbFRvbCh0LGUpe3JldHVybiEwfWNvcHlUb0ltcGwodCxlKXt9dG9GbGF0R2VvbWV0cnkoKXtyZXR1cm57dHlwZTpcIm11bHRpcG9pbnRcIiwuLi50aGlzLmV4cG9ydFZlcnRleEF0dHJpYnV0ZXMoKSwuLi5YfX19RGUudHlwZT1pLmVudW1NdWx0aVBvaW50O2NsYXNzIHdle2NvbnN0cnVjdG9yKCl7dGhpcy5tX0VudmVsb3BlVHlwZT01LHRoaXMuZW52QWFiYj1sZS5jb25zdHJ1Y3RFbXB0eSgpLHRoaXMuZW52Um90PWxlLmNvbnN0cnVjdEVtcHR5KCl9c3RhdGljIGNvbnN0cnVjdEVtcHR5KCl7cmV0dXJuIG5ldyB3ZX13aWR0aCgpe3JldHVybiB0aGlzLmVudkFhYmIud2lkdGgoKX1oZWlnaHQoKXtyZXR1cm4gdGhpcy5lbnZBYWJiLmhlaWdodCgpfW1heERpbSgpe3JldHVybiBNYXRoLm1heCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSl9c2V0RW1wdHkoKXt0aGlzLmVudkFhYmIuc2V0RW1wdHkoKSx0aGlzLmVudlJvdC5zZXRFbXB0eSgpfXNldENvb3Jkcyh0KXt0aGlzLmVudkFhYmIuc2V0Q29vcmRzKHQpLHRoaXMuZW52Um90LnNldENvb3Jkcyh7eDpJZSh0KSx5Ok1lKHQpfSl9c2V0RnJvbVBvaW50cyh0LGUpe3RoaXMuc2V0RW1wdHkoKSx0aGlzLm1lcmdlUG9pbnRzKHQsZSl9bWVyZ2VOZSh0KXt0aGlzLmVudkFhYmIubWVyZ2VOZSh0KSx0aGlzLmVudlJvdC5tZXJnZU5lQ29vcmRzKEllKHQpLE1lKHQpKX1tZXJnZVBvaW50cyh0LGUpe3RoaXMuZW52QWFiYi5tZXJnZVBvaW50cyh0LGUpO2ZvcihsZXQgcz0wO3M8ZTspe2lmKCF0aGlzLmVudlJvdC5pc0VtcHR5KCkpe2ZvcihsZXQgbj1zO248ZTtuKyspe2NvbnN0IGU9SWUodFtuXSkscz1NZSh0W25dKTt0aGlzLmVudlJvdC5tZXJnZU5lQ29vcmRzKGUscyl9YnJlYWt9e2NvbnN0IGU9SWUodFtzXSksbj1NZSh0W3NdKTt0aGlzLmVudlJvdC5zZXRDb29yZHMoe3g6ZSx5Om59KSxzKyt9fX1pc0ludGVyc2VjdGluZ1BvaW50MkQodCl7cmV0dXJuISghdGhpcy5lbnZBYWJiLmNvbnRhaW5zKHQpfHwhdGhpcy5lbnZSb3QuY29udGFpbnNDb29yZHMoSWUodCksTWUodCkpKX1pc0ludGVyc2VjdGluZ1codCl7cmV0dXJuIHRoaXMuZW52QWFiYi5pc0ludGVyc2VjdGluZyh0LmVudkFhYmIpJiZ0aGlzLmVudlJvdC5pc0ludGVyc2VjdGluZyh0LmVudlJvdCl9Y29udGFpbnNXKHQpe3JldHVybiEoIXRoaXMuZW52QWFiYi5jb250YWluc0VudmVsb3BlKHQuZW52QWFiYil8fCF0aGlzLmVudlJvdC5jb250YWluc0VudmVsb3BlKHQuZW52Um90KSl9Y29udGFpbnNQb2ludDJEKHQpe3JldHVybiB0aGlzLmlzSW50ZXJzZWN0aW5nUG9pbnQyRCh0KX1pbnRlcnNlY3RXKHQpe2NvbnN0IGU9dGhpcy5lbnZBYWJiLmludGVyc2VjdCh0LmVudkFhYmIpLHM9dGhpcy5lbnZSb3QuaW50ZXJzZWN0KHQuZW52Um90KTtyZXR1cm4gZSYmIXMmJnRoaXMuZW52QWFiYi5zZXRFbXB0eSgpLHMmJiFlJiZ0aGlzLmVudlJvdC5zZXRFbXB0eSgpLGUmJnN9aW5mbGF0ZSh0KXt0aGlzLmVudkFhYmIuaW5mbGF0ZUNvb3Jkcyh0LHQpO2NvbnN0IGU9dCpudCgpO3RoaXMuZW52Um90LmluZmxhdGVDb29yZHMoZSxlKSxlPDAmJndlLnN0X3JlZHVjZUVtcHR5KHRoaXMpfXN0YXRpYyBzdF9yZWR1Y2VFbXB0eSh0KXtjb25zdCBlPXQuZW52QWFiYi5pc0VtcHR5KCkscz10LmVudlJvdC5pc0VtcHR5KCk7ZSYmIXM/dC5lbnZSb3Quc2V0RW1wdHkoKTpzJiYhZSYmdC5lbnZBYWJiLnNldEVtcHR5KCl9c3FyTWF4TWluRGlzdGFuY2UodCl7Y29uc3QgZT10aGlzLmVudkFhYmIuc3FyTWF4TWluRGlzdGFuY2UodCkscz10aGlzLmVudlJvdC5zcXJNYXhNaW5EaXN0YW5jZShZZSh0KSkvMjtyZXR1cm4gTWF0aC5tYXgoZSxzKX1zcXJNaW5EaXN0YW5jZSh0KXtjb25zdCBlPXRoaXMuZW52QWFiYi5zcXJNaW5EaXN0YW5jZSh0KSxzPXRoaXMuZW52Um90LnNxck1pbkRpc3RhbmNlKFllKHQpKS8yO3JldHVybiBNYXRoLm1heChlLHMpfXNxck1heERpc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5lbnZBYWJiLnNxck1heERpc3RhbmNlKHQpLHM9dGhpcy5lbnZSb3Quc3FyTWF4RGlzdGFuY2UoWWUodCkpLzI7cmV0dXJuIE1hdGgubWF4KGUscyl9Z2V0RW52ZWxvcGUyRCgpe3JldHVybiB0aGlzLmVudkFhYmJ9Z2V0Um90YXRlZEVudmVsb3BlMkQoKXtyZXR1cm4gdGhpcy5lbnZSb3R9eHlSb3QodCxlKXtjb25zdCBzPUFlKHQueCx0LnkpLG49VGUodC54LHQueSk7ZS5zZXRDb29yZHMocyxuKX19ZnVuY3Rpb24gQWUodCxlKXtyZXR1cm4gdC1lfWZ1bmN0aW9uIFRlKHQsZSl7cmV0dXJuIHQrZX1mdW5jdGlvbiBJZSh0KXtyZXR1cm4gdC54LXQueX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdC54K3QueX1mdW5jdGlvbiBZZSh0KXtyZXR1cm4gbmV3IEooSWUodCksTWUodCkpfWNsYXNzIE5le2NvbnN0cnVjdG9yKCl7dGhpcy54PWh0LmdldE5BTigpLHRoaXMueT1odC5nZXROQU4oKX1zdGF0aWMgZ2V0TkFOKCl7cmV0dXJuIG5ldyBOZX1zdGF0aWMgY29uc3RydWN0UG9pbnQyRCh0KXtjb25zdCBlPW5ldyBOZTtyZXR1cm4gZS54LnNldCh0LngpLGUueS5zZXQodC55KSxlfXN0YXRpYyBjb25zdHJ1Y3RDb29yZHModCxlKXtjb25zdCBzPW5ldyBOZTtyZXR1cm4gcy54LnNldCh0KSxzLnkuc2V0KGUpLHN9c3RhdGljIGNvbnN0cnVjdENvb3Jkc0UodCxlKXtjb25zdCBzPW5ldyBOZTtyZXR1cm4gcy5zZXRDb29yZHNFKHQsZSksc31nZXQgMCgpe3JldHVybiB0aGlzLnguY2xvbmUoKX1zZXQgMCh0KXt0aGlzLnguc2V0RSh0KX1nZXQgMSgpe3JldHVybiB0aGlzLnkuY2xvbmUoKX1zZXQgMSh0KXt0aGlzLnkuc2V0RSh0KX1jbG9uZSgpe3JldHVybihuZXcgTmUpLnNldEUodGhpcyl9c2NhbGVUaGlzKHQpe3JldHVybiB0aGlzLngubXVsVGh
1pc0UodCksdGhpcy55Lm11bFRoaXNFKHQpLHRoaXN9c2V0Q29vcmRzKHQsZSl7cmV0dXJuIHRoaXMueC5zZXQodCksdGhpcy55LnNldChlKSx0aGlzfXNldENvb3Jkc0UodCxlKXtyZXR1cm4gdGhpcy54LnNldEUodCksdGhpcy55LnNldEUoZSksdGhpc31zZXQodCl7cmV0dXJuIHRoaXMueC5zZXQodC54KSx0aGlzLnkuc2V0KHQueSksdGhpc31zZXRFKHQpe3JldHVybiB0aGlzLnguc2V0RSh0LngpLHRoaXMueS5zZXRFKHQueSksdGhpc31zZXRXaXRoRXBzKHQsZSl7cmV0dXJuIHRoaXMueC5zZXRXaXRoRXBzKHQueCxlKSx0aGlzLnkuc2V0V2l0aEVwcyh0LnksZSksdGhpc31nZXRVbml0VmVjdG9yKCl7Y29uc3QgdD10aGlzLmNsb25lKCk7cmV0dXJuIHQubm9ybWFsaXplKCksdH1zcXJMZW5ndGgoKXtyZXR1cm4gdGhpcy54LnNxcigpLmFkZEUodGhpcy55LnNxcigpKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5zcXJMZW5ndGgoKS5zcXJ0KCl9bXVsRSh0KXtjb25zdCBlPW5ldyBOZTtyZXR1cm4gZS5zZXRDb29yZHNFKHRoaXMueC5tdWxFKHQpLHRoaXMueS5tdWxFKHQpKSxlfW11bCh0KXtjb25zdCBlPW5ldyBOZTtyZXR1cm4gZS5zZXRDb29yZHNFKHRoaXMueC5tdWwodCksdGhpcy55Lm11bCh0KSksZX1tdWxUaGlzKHQpe3JldHVybiB0aGlzLngubXVsVGhpcyh0KSx0aGlzLnkubXVsVGhpcyh0KSx0aGlzfW11bFRoaXNFKHQpe3JldHVybiB0aGlzLngubXVsVGhpc0UodCksdGhpcy55Lm11bFRoaXNFKHQpLHRoaXN9ZGl2RSh0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmRpdlRoaXNFKHQpfWRpdlRoaXNFKHQpe3JldHVybiB0aGlzLnguZGl2VGhpc0UodCksdGhpcy55LmRpdlRoaXNFKHQpLHRoaXN9bm9ybWFsaXplKCl7Y29uc3QgdD10aGlzLmxlbmd0aCgpOzA9PT10LnZhbHVlKCk/KHRoaXMueD11dC5jbG9uZSgpLHRoaXMueT1tdC5jbG9uZSgpKToodGhpcy54LmRpdlRoaXNFKHQpLHRoaXMueS5kaXZUaGlzRSh0KSl9YWRkRSh0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmFkZFRoaXNFKHQpfWFkZFRoaXNFKHQpe3JldHVybiB0aGlzLnguYWRkVGhpc0UodC54KSx0aGlzLnkuYWRkVGhpc0UodC55KSx0aGlzfXN1YkUodCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5zdWJUaGlzRSh0KX1zdWJUaGlzRSh0KXtyZXR1cm4gdGhpcy54LnN1YlRoaXNFKHQueCksdGhpcy55LnN1YlRoaXNFKHQueSksdGhpc31zdGF0aWMgZGlzdGFuY2UodCxlKXtyZXR1cm4gdC5zdWJFKGUpLmxlbmd0aCgpfW5lZ2F0ZVRoaXMoKXtyZXR1cm4gdGhpcy54Lm5lZ2F0ZVRoaXMoKSx0aGlzLnkubmVnYXRlVGhpcygpLHRoaXN9ZXEodCl7cmV0dXJuIHRoaXMueC5lcSh0LngpJiZ0aGlzLnkuZXEodC55KX1pc1plcm8oKXtyZXR1cm4gdGhpcy54LmlzWmVybygpJiZ0aGlzLnkuaXNaZXJvKCl9aXNUcnVlWmVybygpe3JldHVybiF0aGlzLngudmFsdWUoKSYmIXRoaXMueS52YWx1ZSgpfXJvdGF0ZURpcmVjdCh0LGUpe2NvbnN0IHM9dGhpcy54Lm11bEUodCkuc3ViVGhpc0UodGhpcy55Lm11bEUoZSkpLG49dGhpcy54Lm11bEUoZSkuYWRkVGhpc0UodGhpcy55Lm11bEUodCkpO3JldHVybiB0aGlzLnguc2V0RShzKSx0aGlzLnkuc2V0RShuKSx0aGlzfXJvdGF0ZVJldmVyc2UodCxlKXtjb25zdCBzPXRoaXMueC5tdWxFKHQpLmFkZFR
1oaXNFKHRoaXMueS5tdWxFKGUpKSxuPXRoaXMueC5uZWdhdGUoKS5tdWxUaGlzRShlKS5hZGRUaGlzRSh0aGlzLnkubXVsRSh0KSk7cmV0dXJuIHRoaXMueC5zZXRFKHMpLHRoaXMueS5zZXRFKG4pLHRoaXN9ZG90UHJvZHVjdCh0KXtyZXR1cm4gdGhpcy54Lm11bEUodC54KS5hZGRFKHRoaXMueS5tdWxFKHQueSkpfWNyb3NzUHJvZHVjdCh0KXtyZXR1cm4gdGhpcy54Lm11bEUodC55KS5zdWJFKHRoaXMueS5tdWxFKHQueCkpfXZhbHVlKCl7cmV0dXJuIEouY29uc3RydWN0KHRoaXMueC52YWx1ZSgpLHRoaXMueS52YWx1ZSgpKX19Y2xhc3MgWGV7Y29uc3RydWN0b3IoKXt0aGlzLmExMT1uZXcgaHQoMSksdGhpcy5hMTI9bmV3IGh0KDApLHRoaXMuYTIxPW5ldyBodCgwKSx0aGlzLmEyMj1uZXcgaHQoMSl9Y2xvbmUoKXtjb25zdCB0PW5ldyBYZTtyZXR1cm4gdC5hMTEuc2V0RSh0aGlzLmExMSksdC5hMTIuc2V0RSh0aGlzLmExMiksdC5hMjEuc2V0RSh0aGlzLmEyMSksdC5hMjIuc2V0RSh0aGlzLmEyMiksdH1hc3NpZ24odCl7cmV0dXJuIHRoaXMuYTExLnNldEUodC5hMTEpLHRoaXMuYTEyLnNldEUodC5hMTIpLHRoaXMuYTIxLnNldEUodC5hMjEpLHRoaXMuYTIyLnNldEUodC5hMjIpLHRoaXN9bXVsVGhpcyh0KXtjb25zdCBlPXRoaXMuYTExLm11bEUodC5hMTEpLmFkZFRoaXNFKHRoaXMuYTEyLm11bEUodC5hMjEpKSxzPXRoaXMuYTExLm11bEUodC5hMTIpLmFkZFRoaXNFKHRoaXMuYTEyLm11bEUodC5hMjIpKSxuPXRoaXMuYTIxLm11bEUodC5hMTEpLmFkZFRoaXNFKHRoaXMuYTIyLm11bEUodC5hMjEpKSxpPXRoaXMuYTIxLm11bEUodC5hMTIpLmFkZFRoaXNFKHRoaXMuYTIyLm11bEUodC5hMjIpKTtyZXR1cm4gdGhpcy5hMTE9ZSx0aGlzLmExMj1zLHRoaXMuYTIxPW4sdGhpcy5hMjI9aSx0aGlzfW11bExlZnRUaGlzKHQpe2NvbnN0IGU9dC5jbG9uZSgpO3JldHVybiB0aGlzLmFzc2lnbihlLm11bFRoaXModGhpcykpLHRoaXN9ZGV0KCl7cmV0dXJuIHRoaXMuYTExLm11bEUodGhpcy5hMjIpLnN1YlRoaXNFKHRoaXMuYTEyLm11bEUodGhpcy5hMjEpKX1pbnZlcnRUaGlzKCl7Y29uc3QgdD10aGlzLmRldCgpO2lmKDAhPT10LnZhbHVlKCkpe2NvbnN0IGU9dGhpcy5hMjIuZGl2RSh0KSxzPXRoaXMuYTEyLm5lZ2F0ZSgpLmRpdlRoaXNFKHQpLG49dGhpcy5hMjEubmVnYXRlKCkuZGl2VGhpc0UodCksaT10aGlzLmExMS5kaXZFKHQpO3RoaXMuYTExPWUsdGhpcy5hMTI9cyx0aGlzLmEyMT1uLHRoaXMuYTIyPWl9ZWxzZSB0aGlzLnNldFplcm8oKTtyZXR1cm4hdC5pc1plcm8oKX10cmFuc3Bvc2VUaGlzKCl7cmV0dXJuIHRoaXMuYTIxPXN0KHRoaXMuYTEyLHRoaXMuYTEyPXRoaXMuYTIxKSx0aGlzfWVpZ2VuU3ltbWV0cmljKHQsZSl7Y29uc3Qgcz10aGlzLmExMi5jbG9uZSgpO3MuYWRkVGhpc0UodGhpcy5hMjEpLHMubXVsVGhpc0J5UG93ZXIyKC41KTtsZXQgbj1uZXcgaHQoMSksaT1uZXcgaHQoMCk7aWYocy5pc1plcm8oKSl0WzBdLnNldEUodGhpcy5hMTEpLHRbMV0uc2V0RSh0aGlzLmEyMik7ZWxzZXtjb25zdCBlPW5ldyBodCgxKTtpZih0aGlzLmExMS5uZSh0aGlzLmEyMikpe2NvbnN0IHI9dGhpcy5hMTEuc3ViRSh0aGlzLmEyMikuZGl2RShzKTtyLm11bFRoaXNCeVBvd2VyMiguNSk7Y29uc3Qgbz1yLnNxcigpO2Uuc2V0RShyKSxlLmFic1RoaXMoKSxlLnN1YlRoaXNFKG8uYWRkKDEpLnNxcnRUaGlzKCkpLHIuZ3QobXQpJiZlLm5lZ2F0ZVRoaXMoKTtjb25zdCBhPWUuc3FyKCkuYWRkVGhpcygxKS5zcXJ0VGhpcygpLmludlRoaXMoKTtpPWUubXVsRShhKSxuLnNldEUoYSk7Y29uc3QgaD1lLm11bEUocyk7dFswXT10aGlzLmExMS5hZGRFKGgpLHRbMV09dGhpcy5hMjIuc3ViRShoKX1lbHNlIG49bmV3IGh0KDEvTWF0aC5zcXJ0KDIpKSxpPW4uY2xvbmUoKSx0WzBdPXRoaXMuYTExLmFkZEUocyksdFsxXT10aGlzLmEyMi5zdWJFKHMpfWVbMF0ueD1uLnRvRG91YmxlKCksZVswXS55PWkudG9Eb3VibGUoKSxlWzFdLng9aS5uZWdhdGUoKS50b0RvdWJsZSgpLGVbMV0ueT1uLnRvRG91YmxlKCksTWF0aC5hYnModFswXS50b0RvdWJsZSgpKT5NYXRoLmFicyh0WzFdLnRvRG91YmxlKCkpJiYodFsxXT1zdCh0WzBdLHRbMF09dFsxXSksZVsxXT1zdChlWzBdLGVbMF09ZVsxXSkpfXNldFplcm8oKXt0aGlzLmExMS5zZXQoMCksdGhpcy5hMjEuc2V0KDApLHRoaXMuYTEyLnNldCgwKSx0aGlzLmEyMi5zZXQoMCl9fWNsYXNzIHFle3N0YXRpYyBjb25zdHJ1Y3RQb2ludDJEKHQpe3JldHVybiBuZXcgcWUocnQuY29uc3RydWN0RG91YmxlKHQueCkscnQuY29uc3RydWN0RG91YmxlKHQueSkpfWNvbnN0cnVjdG9yKHQsZSl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy54PShuZXcgcnQpLnNldE5BTigpLHZvaWQodGhpcy55PShuZXcgcnQpLnNldE5BTigpKTt0aGlzLng9dC5jbG9uZSgpLHRoaXMueT1lLmNsb25lKCl9YXNzaWduUG9pbnQyRCh0KXtyZXR1cm4gdGhpcy54LnNldERvdWJsZSh0LngpLHRoaXMueS5zZXREb3VibGUodC55KSx0aGlzfXNldENvb3Jkcyh0LGUpe3JldHVybiB0aGlzLnguc2V0VGhpcyh0KSx0aGlzLnkuc2V0VGhpcyhlKSx0aGlzfWFzUG9pbnQyRCgpe3JldHVybiBuZXcgSih0aGlzLngudmFsdWUoKSx0aGlzLnkudmFsdWUoKSl9Y3Jvc3NQcm9kdWN0KHQpe3JldHVybiB0aGlzLngubXVsKHQueSkuc3ViKHRoaXMueS5tdWwodC54KSl9bGVmdFBlcnBlbmRpY3VsYXJUaGlzKCl7Y29uc3QgdD10aGlzLnguY2xvbmUoKTt0aGlzLng9dGhpcy55LmNsb25lKCkubmVnYXRlKCksdGhpcy55PXR9Y2xvbmUoKXtyZXR1cm4gbmV3IHFlKHRoaXMueCx0aGlzLnkpfWRvdFByb2R1Y3QodCl7cmV0dXJuIHRoaXMueC5tdWwodC54KS5hZGQodGhpcy55Lm11bCh0LnkpKX1hZGQodCl7cmV0dXJuIG5ldyBxZSh0aGlzLnguYWRkKHQueCksdGhpcy55LmFkZCh0LnkpKX1zdWIodCl7cmV0dXJuIG5ldyBxZSh0aGlzLnguc3ViKHQueCksdGhpcy55LnN1Yih0LnkpKX1zcXJMZW5ndGgoKXtyZXR1cm4gdGhpcy54LnNxcigpLmFkZFRoaXModGhpcy55LnNxcigpKX1tdWxUaGlzKHQpe3JldHVybiB0aGlzLngubXVsVGh
1pcyh0KSx0aGlzLnkubXVsVGhpcyh0KSx0aGlzfW11bCh0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRoaXModCl9c3ViVGhpcyh0KXtyZXR1cm4gdGhpcy54LnN1YlRoaXModC54KSx0aGlzLnkuc3ViVGhpcyh0LnkpLHRoaXN9YWRkVGhpcyh0KXtyZXR1cm4gdGhpcy54LmFkZFRoaXModC54KSx0aGlzLnkuYWRkVGhpcyh0LnkpLHRoaXN9fXZhciBGZT1iO2Z1bmN0aW9uIFZlKHQpe2xldCBlPSExO2ZvcihsZXQgcz0wO3M8MjtzKyspe2NvbnN0IG49aXQodFswXVtzXSx0WzNdW3NdKTtuPjA/KGl0KHRbMF1bc10sdFsxXVtzXSk8MCYmKHRbMV1bc109dFswXVtzXSxlPSEwKSxpdCh0WzFdW3NdLHRbM11bc10pPDAmJih0WzFdW3NdPXRbM11bc10sZT0hMCksaXQodFswXVtzXSx0WzJdW3NdKTwwJiYodFsyXVtzXT10WzBdW3NdLGU9ITApLGl0KHRbMl1bc10sdFszXVtzXSk8MCYmKHRbMl1bc109dFszXVtzXSxlPSEwKSxpdCh0WzFdW3NdLHRbMl1bc10pPDAmJih0WzJdW3NdPXRbMV1bc10sZT0hMCkpOm48MD8oaXQodFswXVtzXSx0WzFdW3NdKT4wJiYodFsxXVtzXT10WzBdW3NdLGU9ITApLGl0KHRbMV1bc10sdFszXVtzXSk+MCYmKHRbMV1bc109dFszXVtzXSxlPSEwKSxpdCh0WzBdW3NdLHRbMl1bc10pPjAmJih0WzJdW3NdPXRbMF1bc10sZT0hMCksaXQodFsyXVtzXSx0WzNdW3NdKT4wJiYodFsyXVtzXT10WzNdW3NdLGU9ITApLGl0KHRbMV1bc10sdFsyXVtzXSk+MCYmKHRbMl1bc109dFsxXVtzXSxlPSEwKSk6dFsxXVtzXT09PXRbMF1bc10mJnRbMl1bc109PT10WzBdW3NdfHwodFsxXVtzXT10WzBdW3NdLHRbMl1bc109dFswXVtzXSxlPSEwKX1yZXR1cm4gZX1mdW5jdGlvbiBMZSh0KXtjb25zdCBlPWl0KHRbMF0ueSx0WzFdLnkpLHM9aXQodFsxXS55LHRbMl0ueSksbj1pdCh0WzJdLnksdFszXS55KTtpZihlPj0wJiZzPj0wJiZuPj0wfHxlPD0wJiZzPD0wJiZuPD0wKXtjb25zdCBlPWl0KHRbMF0ueCx0WzFdLngpLHM9aXQodFsxXS54LHRbMl0ueCksbj1pdCh0WzJdLngsdFszXS54KTtpZihlPj0wJiZzPj0wJiZuPj0wfHxlPD0wJiZzPD0wJiZuPD0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFJlKHQsZSl7Y29uc3Qgcz10LmdldFN0YXJ0WFkoKTtpZihzLmVxdWFscyhlLmdldFN0YXJ0WFkoKSkpcmV0dXJuITA7aWYocy5lcXVhbHMoZS5nZXRFbmRYWSgpKSlyZXR1cm4hMDtjb25zdCBuPXQuZ2V0RW5kWFkoKTtyZXR1cm4hIW4uZXF1YWxzKGUuZ2V0U3RhcnRYWSgpKXx8ISFuLmVxdWFscyhlLmdldEVuZFhZKCkpfWZ1bmN0aW9uIHplKHQsZSl7bGV0IHM9dC5jYWxjdWxhdGVMb3dlckxlbmd0aDJEKCk7cmV0dXJuIShzPmUpJiYoISF0LmlzTGluZSgpfHwocz10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKSxzPD1lfHwwIT09ZSYmdC5jYWxjdWxhdGVMZW5ndGgyRCgpPD1lKSl9ZnVuY3Rpb24gQmUodCxlLHMpe2NvbnN0IG49Y3QoSiw0KTtsZXQgcj10LnF1ZXJ5Q29udHJvbFBvaW50c0hlbHBlcihuKTtjb25zdCBvPWN0KEosNCk7bGV0IGE9ZS5xdWVyeUNvbnRyb2xQb2ludHNIZWxwZXIobyk7blswXS5lcXVhbHMob1swXSl8fHUoXCJcIik7Y29uc3QgaD10LmdldEdlb21ldHJ5VHlwZSgpO2lmKGg9PT1lLmdldEdlb21ldHJ5VHlwZSgpJiZuLm1hcCgodCxlKT0+b1tlXS5lcXVhbHModCkpLnJlZHVjZSgodCxlKT0+dCYmZSkpe2lmKGghPT1pLmVudW1SYXRpb25hbEJlemllcjIpcmV0dXJuIDA7e2NvbnN0IHM9ZSxuPVswLDAsMF0saT1bMCwwLDB
1dO2lmKHQucXVlcnlXZWlnaHRzKG4pLHMucXVlcnlXZWlnaHRzKGkpLG4ubWFwKCh0LGUpPT5pW2VdPT09dCkucmVkdWNlKCh0LGUpPT50JiZlKSlyZXR1cm4gMH19Zm9yKDtyPjImJm5bMV0uZXF1YWxzKG5bMF0pOyluLnNwbGljZSgxLDEpLHItLTtmb3IoO2E+MiYmb1sxXS5lcXVhbHMob1swXSk7KW8uc3BsaWNlKDEsMSksYS0tOyhuWzFdLmVxdWFscyhuWzBdKXx8b1sxXS5lcXVhbHMoblswXSkpJiZ1KFwiXCIpO2NvbnN0IG09Si5jb21wYXJlVmVjdG9yc09yaWdpbihuWzBdLG5bMV0sb1sxXSk7aWYoMD09PW0pe2NvbnN0IHM9cWUuY29uc3RydWN0UG9pbnQyRChuWzBdKSxpPW5ldyBxZTt0LnF1ZXJ5Q29vcmQyRE1QKDFlLTE2LGkpLGkuc3ViKHMpO2NvbnN0IHI9bmV3IHFlO2UucXVlcnlDb29yZDJETVAoMWUtMTYsciksci5zdWIocyk7cmV0dXJuIHIuY3Jvc3NQcm9kdWN0KGkpLnNpZ24oKX1yZXR1cm4gbX1mdW5jdGlvbiBrZSh0LGUsbixpLHIsbyxhLGgpe2xldCB1PXQuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpLG09ZS5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCksbD10LGM9ZSxnPSExO3U+bSYmKGM9c3QobCxsPWMpLGk9c3QobixuPWkpLG09c3QodSx1PW0pLGc9ITApO2NvbnN0IGQ9MD09PW47e2FbMF09ZD8xOjA7Y29uc3QgdD1sLmdldENvb3JkMkQoYVswXSk7aFswXT1jLmdldENsb3Nlc3RDb29yZGluYXRlKHQsITEpO2NvbnN0IGU9Yy5nZXRDb29yZDJEKGhbMF0pO2lmKEouZGlzdGFuY2UodCxlKTw9cil7Y29uc3QgZT1bLjUsLjc1LC4yNSwuMSwuOV07bGV0IHM9ITA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5hc3NpZ24obC5nZXRDb29yZDJEKGVbbl0pKSwhYy5pc0Nsb3NlclRoYW5EaXN0YW5jZSh0LG5ldyBVKDAsMSkscikpe3M9ITE7YnJlYWt9aWYocylyZXR1cm4gZyYmKGhbMF09c3QoYVswXSxhWzBdPWhbMF0pKSwxfX1pZih1PD0zKnIpcmV0dXJuIDA7bGV0IF89cHQoTWF0aC5tYXgoci91LC4xKSwwLC41KSxwPS4wMSpyLGY9MCxQPTAseT1fLHg9LTEsQz0wLHY9MS8zMjtmb3IobGV0IGI9MDs7YisrKXtzKGI8NDA5NSk7Y29uc3QgdD1kP186MS1fLGU9bC5nZXRDb29yZDJEKHQpLG49Yy5nZXRDbG9zZXN0Q29vcmRpbmF0ZShlLCExKTtpZihuPT09aSlyZXR1cm4gQztjb25zdCB1PWMuZ2V0Q29vcmQyRChuKSxtPUouZGlzdGFuY2UoZSx1KTtpZigwPT09YiYmKHg9bSksbTw9cD8odj0uNSxQPW0sZj1fKTooeT1fLHg9bSksTWF0aC5hYnMoUC14KT4uMSpwJiZ5LWY+MWUtMTYpXz1vdChmLHksdik7ZWxzZXtpZihhW0NdPXQsaFtDXT1uLGcmJihoW0NdPXN0KGFbQ10sYVtDXT1oW0NdKSksMT09PW98fDE9PT1DKXJldHVybiAxPT09QyYmYVswXT5hWzFdJiYoYVsxXT1zdChhWzBdLGFbMF09YVsxXSksaFsxXT1zdChoWzBdLGhbMF09aFsxXSkpLEMrMTtDKyssZj15LFA9eCx5PS44LHg9LTEsXz0uOCx2PTEvMzIscD0xMCpyLGI9MH19fWZ1bmN0aW9uIEdlKHQsZSxzLG4saSxyLG8sYSxoKXtpZihkdChzLDAsMSkmJmR0KG4sMCwxKSl7aWYoMD09PUouZGlzdGFuY2UodC5nZXRDb29yZDJEKHMpLGUuZ2V0Q29vcmQyRChuKSkpe2NvbnN0IGg9MWUtMTIsdT1uZXcgTmUsbT1fdCgpO2lmKHQucXVlcnlEZXJpdmF0aXZlKG5ldyBodChzLG0pLHUpLHUuaXNUcnVlWmVybygpKXtjb25zdCBlPTE9PT1zPy1oOmg7dC5xdWVyeURlcml2YXRpdmUobmV3IGh0KHMsbSkuYWRkKGUpLHUpfTE9PT1zJiZ1Lm5lZ2F0ZVRoaXMoKTtjb25zdCBsPW5ldyBOZTtpZihlLnF1ZXJ5RGVyaXZhdGl2ZShuZXcgaHQobixtKSxsKSxsLmlzVHJ1ZVplcm8oKSl7Y29uc3QgdD0xPT09cz8taDpoO2UucXVlcnlEZXJpdmF0aXZlKG5ldyBodChuLG0pLmFkZCh0KSxsKX0xPT09biYmbC5uZWdhdGVUaGlzKCksdS5pc1plcm8oKXx8dS5ub3JtYWxpemUoKSxsLmlzWmVybygpfHxsLm5vcm1hbGl6ZSgpO2NvbnN0IGM9dS5kb3RQcm9kdWN0KGwpLGc9dS5jcm9zc1Byb2R1Y3QobCk7Zy5zY2FsZUVycm9yKDMpO2NvbnN0IGQ9KCk9Pnt7Y29uc3Qgcz10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKSxuPWUuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO3JldHVybiBNYXRoLm1pbiguMDEqaS9NYXRoLm1pbihzLG4pLDFlLTEwKX19O2lmKGMuZ2UobXQpJiYoZy5pc1plcm8oKXx8TWF0aC5hYnMoZy52YWx1ZSgpKTxkKCkpKXtyZXR1cm4ga2UodCxlLHMsbixpLHIsbyxhKX19fXJldHVybiAwfWZ1bmN0aW9uIFdlKHQsZSxuKXtpZihzKHQuaXNDdXJ2ZSgpfHxlLmlzQ3VydmUoKSksdC5nZXRTdGFydFhZKCkuZXF1YWxzKGUuZ2V0U3RhcnRYWSgpKSl7aWYoR2UodCxlLDAsMCxuLDIsWzAsMF0sWzAsMF0pKXJldHVybiEwfWlmKHQuZ2V0RW5kWFkoKS5lcXVhbHMoZS5nZXRFbmRYWSgpKSl7aWYoR2UodCxlLDEsMSxuLDIsWzAsMF0sWzAsMF0pKXJldHVybiEwfWlmKHQuZ2V0U3RhcnRYWSgpLmVxdWFscyhlLmdldEVuZFhZKCkpKXtpZihHZSh0LGUsMCwxLG4sMixbMCwwXSxbMCwwXSkpcmV0dXJuITB9aWYodC5nZXRFbmRYWSgpLmVxdWFscyhlLmdldFN0YXJ0WFkoKSkpe2lmKEdlKHQsZSwxLDAsbiwyLFswLDBdLFswLDBdKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBqZSh0LGUpe3QubV9YU3RhcnQ9ZS54LHQubV9ZU3RhcnQ9ZS55fWZ1bmN0aW9uIFplKHQsZSxzKXt0Lm1fWFN0YXJ0PWUsdC5tX1lTdGFydD1zfWZ1bmN0aW9uIEhlKHQsZSl7dC5tX1hFbmQ9ZS54LHQubV9ZRW5kPWUueX1mdW5jdGlvbiBVZSh0LGUscyl7dC5tX1hFbmQ9ZSx0Lm1fWUVuZD1zfWZ1bmN0aW9uIE9lKHQsZSxzKXtlP3QubV9YRW5kPT09cy54JiZ0Lm1fWUVuZD09PXMueXx8KHQubV9YRW5kPXMueCx0Lm1fWUVuZD1zLnksdC5lbmRQb2ludE1vZGlmaWVkKCkpOnQubV9YU3RhcnQ9PT1zLngmJnQubV9ZU3RhcnQ9PT1zLnl8fCh0Lm1fWFN0YXJ0PXMueCx0Lm1fWVN0YXJ0PXMueSx0LmVuZFBvaW50TW9kaWZpZWQoKSl9ZnVuY3Rpb24gUWUodCxlKXtjb25zdCBzPW5ldyBZO3JldHVybiBlPyhzLng9dC5tX1hFbmQscy55PXQubV9ZRW5kKToocy54PXQubV9YU3RhcnQscy55PXQubV9ZU3R
1hcnQpLHMuej1KZSh0LGUpLHN9ZnVuY3Rpb24gSmUodCxlKXtyZXR1cm4gdC5tX2Rlc2NyaXB0aW9uLmhhc1ooKT90Lm1fYXR0cmlidXRlc1tlKih0Lm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTIpXTpGZS5nZXREZWZhdWx0VmFsdWUoMSl9ZnVuY3Rpb24gS2UodCxlLHMpe3QubV9kZXNjcmlwdGlvbi5oYXNaKCl8fHQuYWRkQXR0cmlidXRlKDEpLGU/dC5tX1hFbmQ9PT1zLngmJnQubV9ZRW5kPT09cy55fHwodC5tX1hFbmQ9cy54LHQubV9ZRW5kPXMueSx0LmVuZFBvaW50TW9kaWZpZWQoKSk6dC5tX1hTdGFydD09PXMueCYmdC5tX1lTdGFydD09PXMueXx8KHQubV9YU3RhcnQ9cy54LHQubV9ZU3RhcnQ9cy55LHQuZW5kUG9pbnRNb2RpZmllZCgpKSx0Lm1fYXR0cmlidXRlc1sodC5tX2Rlc2NyaXB0aW9uLmdldFRvdGFsQ29tcG9uZW50Q291bnQoKS0yKSplXT1zLnp9ZnVuY3Rpb24gJGUodCxlLHMpe3MuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odC5tX2Rlc2NyaXB0aW9uKTtjb25zdCBuPTA9PT1lP3QubV9YU3RhcnQ6dC5tX1hFbmQsaT0wPT09ZT90Lm1fWVN0YXJ0OnQubV9ZRW5kO3Muc2V0WFlDb29yZHMobixpKTtmb3IobGV0IHI9MTtyPHQubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3IrKyl7Y29uc3Qgbj10Lm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHIpO2ZvcihsZXQgaT0wLHI9RmUuZ2V0Q29tcG9uZW50Q291bnQobik7aTxyO2krKyl7Y29uc3Qgcj1lcyh0LGUsbixpKTtzLnNldEF0dHJpYnV0ZUJhc2ljKG4saSxyKX19fWZ1bmN0aW9uIHRzKHQsZSxzKXtzLmlzRW1wdHkoKSYmbyhcIlwiKSxPZSh0LGUscy5nZXRYWSgpKTtjb25zdCBuPXMuZ2V0RGVzY3JpcHRpb24oKTtuIT09dC5tX2Rlc2NyaXB0aW9uJiZ0Lm1lcmdlVmVydGV4RGVzY3JpcHRpb24obik7Zm9yKGxldCBpPTEscj1uLmdldEF0dHJpYnV0ZUNvdW50KCk7aTxyO2krKyl7Y29uc3Qgcj1uLmdldFNlbWFudGljcyhpKSxvPUZlLmdldENvbXBvbmVudENvdW50KHIpO2ZvcihsZXQgbj0wO248bztuKyspe3NzKHQsZSxyLG4scy5nZXRBdHRyaWJ1dGVBc0RibChyLG4pKX19fWZ1bmN0aW9uIGVzKHQsZSxzLGkpe2lmKChlPDB8fGU+MSkmJm4oXCJcIiksMD09PXMpcmV0dXJuKGk8MHx8aT49MikmJm4oXCJcIiksMD09PWU/MD09PWk/dC5tX1hTdGFydDp0Lm1fWVN0YXJ0OjA9PT1pP3QubV9YRW5kOnQubV9ZRW5kO2NvbnN0IHI9RmUuZ2V0Q29tcG9uZW50Q291bnQocyk7KGk8MHx8aT49cikmJm4oXCJcIik7Y29uc3Qgbz10Lm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlSW5kZXgocyk7cmV0dXJuIG8+PTA/dC5tX2F0dHJpYnV0ZXNbZSoodC5tX2Rlc2NyaXB0aW9uLmdldFRvdGFsQ29tcG9uZW50Q291bnQoKS0yKSt0Lm1fZGVzY3JpcHRpb24uZ2V0UG9pbnRBdHRyaWJ1dGVPZmZzZXQobyktMitpXTpGZS5nZXREZWZhdWx0VmFsdWUocyl9ZnVuY3Rpb24gc3ModCxlLHMsaSxyKXtpZigoZTwwfHxlPjEpJiZuKFwiXCIpLDA9PT1zKXJldHVybiAwPT09ZT8wPT09aT90Lm1fWFN0YXJ0PXI6MT09PWk/dC5tX1lTdGFydD1yOm4oXCJcIik6MT09PWU/MD09PWk/dC5tX1hFbmQ9cjoxPT09aT90Lm1fWUVuZD1yOm4oXCJcIik6bihcIlwiKSx2b2lkIHQuZW5kUG9pbnRNb2RpZmllZCgpO2NvbnN0IG89RmUuZ2V0Q29tcG9uZW50Q291bnQocyk7KGk8MHx8aT49bykmJm4oXCJcIik7bGV0IGE9dC5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHMpO2E8MCYmKHQuYWRkQXR0cmlidXRlKHMpLGE9dC5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUluZGV4KHMpKSx0Lm1fYXR0cmlidXRlc1tlKih0Lm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTIpK3QubV9kZXNjcmlwdGlvbi5nZXRQb2ludEF0dHJpYnV0ZU9mZnNldChhKS0yK2ldPXJ9ZnVuY3Rpb24gbnModCxlKXtpZih0PT09ZSlyZXR1cm47ZS5pc0VtcHR5KCkmJm8oXCJcIik7Y29uc3Qgcz1lLmdldERlc2NyaXB0aW9uKCk7cyE9PXQubV9kZXNjcmlwdGlvbiYmdC5tZXJnZVZlcnRleERlc2NyaXB0aW9uKHMpO2ZvcihsZXQgbj0xLGk9cy5nZXRBdHRyaWJ1dGVDb3VudCgpO248aTtuKyspe2NvbnN0IGk9cy5nZXRTZW1hbnRpY3Mobikscj1GZS5nZXRDb21wb25lbnRDb3VudChpKTtmb3IobGV0IHM9MDtzPHI7cysrKXtsZXQgbj1lcyhlLDAsaSxzKTtzcyh0LDAsaSxzLG4pLG49ZXMoZSwxLGkscyksc3ModCwxLGkscyxuKX19fWZ1bmN0aW9uIGlzKHQsZSl7Y29uc3Qgcz13KCk7QShlLHQubV9kZXNjcmlwdGlvbixzKTtsZXQgbj1udWxsO2NvbnN0IGk9ZS5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMixyPXQubV9kZXNjcmlwdGlvbj90Lm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTI6MDtpZihpPjAmJihuPU8oMippLE51bWJlci5OYU4pLCQobixlLmdldERlZmF1bHRQb2ludEF0dHJpYnV0ZXMoKSwwLDIsaSksJChuLGUuZ2V0RGVmYXVsdFBvaW50QXR0cmlidXRlcygpLGksMixpKSxudWxsIT09dC5tX2Rlc2NyaXB0aW9uKSlmb3IobGV0IG89MTtvPGUuZ2V0QXR0cmlidXRlQ291bnQoKTtvKyspe2NvbnN0IGE9c1tvXTtpZigtMSE9PWEpe2NvbnN0IHM9dC5tX2Rlc2NyaXB0aW9uLmdldFBvaW50QXR0cmlidXRlT2Zmc2V0KGEpLTIsaD1lLmdldFBvaW50QXR0cmlidXRlT2Zmc2V0KG8pLTIsdT1GZS5nZXRDb21wb25lbnRDb3VudChlLmdldFNlbWFudGljcyhvKSk7Zm9yKGxldCBlPTA7ZTx1OysrZSluW2hdPXQubV9hdHRyaWJ1dGVzW3NdLG5baStoXT10Lm1fYXR0cmlidXRlc1tyK3NdfX10Lm1fYXR0cmlidXRlcz1uLHQubV9kZXNjcmlwdGlvbj1lfWZ1bmN0aW9uIHJzKHQpe3JldHVybiB0LmFic05vcm0oKSpsdCgpfWZ1bmN0aW9uIG9zKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQuYWJzTm9ybSgpLGUuYWJzTm9ybSgpKSpsdCgpfWZ1bmN0aW9uIGFzKHQsZSxzKXtjb25zdCBuPW5ldyB3ZTt0LnF1ZXJ5RW52ZWxvcGVXKFUudW5pdCgpLG4pO2NvbnN0IGk9bmV3IHdlO3JldHVybiBlLnF1ZXJ5RW52ZWxvcGVXKFUudW5pdCgpLGkpLGkuaW5mbGF0ZShzKSwhbi5pc0ludGVyc2VjdGluZ1coaSl9ZnVuY3Rpb24gaHModCxlLHMpe2NvbnN0IG49Z3QodCxzKSxpPWd0KGUscyk7bi5zb3J0KCh0LGUpPT50LmNvbXBhcmUoZSkpLGkuc29ydCgodCxlKT0+dC5jb21wYXJlKGUpKTtmb3IobGV0IHI9MDtyPDM7cisrKXtpZihuW3JdLmNvbXBhcmUoaVtyXSk8MClyZXR1cm4tMTtpZigwIT09bltyXS5jb21wYXJlKGlbcl0pKXJldHVybiAxfXJldHVybiAwfXZhciB1cz1iO2NsYXNzIG1ze2NvbnN0cnVjdG9yKHQpe2lmKHQuY29weSl7aWYodGhpcy5tX1hTdGFydD10LmNvcHkubV9YU3RhcnQsdGhpcy5tX1lTdGFydD10LmNvcHkubV9ZU3R
1hcnQsdGhpcy5tX1hFbmQ9dC5jb3B5Lm1fWEVuZCx0aGlzLm1fWUVuZD10LmNvcHkubV9ZRW5kLHRoaXMubV9kZXNjcmlwdGlvbj10LmNvcHkubV9kZXNjcmlwdGlvbix0aGlzLm1fYXR0cmlidXRlcz1udWxsLHRoaXMubV9kZXNjcmlwdGlvbil7dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFRvdGFsQ29tcG9uZW50Q291bnQoKS0yJiYodGhpcy5tX2F0dHJpYnV0ZXM9dC5jb3B5Lm1fYXR0cmlidXRlcy5zbGljZSgpKX19ZWxzZXtpZih0Lm1vdmUpcmV0dXJuIHRoaXMubV9kZXNjcmlwdGlvbj10Lm1vdmUubV9kZXNjcmlwdGlvbix0Lm1vdmUubV9kZXNjcmlwdGlvbj1udWxsLHRoaXMubV9hdHRyaWJ1dGVzPXQubW92ZS5tX2F0dHJpYnV0ZXMsdC5tb3ZlLm1fYXR0cmlidXRlcz1udWxsLHRoaXMubV9YU3RhcnQ9dC5tb3ZlLm1fWFN0YXJ0LHRoaXMubV9ZU3RhcnQ9dC5tb3ZlLm1fWVN0YXJ0LHRoaXMubV9YRW5kPXQubW92ZS5tX1hFbmQsdm9pZCh0aGlzLm1fWUVuZD10Lm1vdmUubV9ZRW5kKTtpZih2b2lkIDAhPT10LlhTdGFydClyZXR1cm4gdGhpcy5tX1hTdGFydD10LlhTdGFydCx0aGlzLm1fWVN0YXJ0PXQuWVN0YXJ0LHRoaXMubV9YRW5kPXQuWEVuZCx0aGlzLm1fWUVuZD10LllFbmQsdGhpcy5tX2F0dHJpYnV0ZXM9bnVsbCx0aGlzLm1fZGVzY3JpcHRpb249dC52ZD90LnZkOlAoKSx2b2lkKHQudmQmJnRoaXMuc2V0RGVmYXVsdEF0dHJpYnV0ZVZhbHVlcygpKTtpZih2b2lkIDAhPT10LlpTdGFydClyZXR1cm4gdGhpcy5tX1hTdGFydD10LlhTdGFydCx0aGlzLm1fWVN0YXJ0PXQuWVN0YXJ0LHRoaXMubV9YRW5kPXQuWEVuZCx0aGlzLm1fWUVuZD10LllFbmQsdGhpcy5tX2Rlc2NyaXB0aW9uPXQudmQ/dC52ZDpxKCksdm9pZCh0LnZkPyh0aGlzLnNldERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMoKSx0aGlzLmFkZEF0dHJpYnV0ZSgxKSx0aGlzLm1fYXR0cmlidXRlc1swXT10LlpTdGFydCx0aGlzLm1fYXR0cmlidXRlc1t0aGlzLm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTJdPXQuWkVuZCk6dGhpcy5tX2F0dHJpYnV0ZXM9W3QuWlN0YXJ0LHQuWkVuZF0pO2lmKHQuc3RhcnQpcmV0dXJuIHRoaXMubV9YU3RhcnQ9dC5zdGFydC54LHRoaXMubV9ZU3RhcnQ9dC5zdGFydC55LHRoaXMubV9YRW5kPXQuZW5kLngsdGhpcy5tX1lFbmQ9dC5lbmQueSx0aGlzLm1fYXR0cmlidXRlcz1udWxsLHZvaWQodGhpcy5tX2Rlc2NyaXB0aW9uPVAoKSk7aWYodC5zdGFydDNEKXJldHVybiB0aGlzLm1fWFN0YXJ0PXQuc3RhcnQzRC54LHRoaXMubV9ZU3RhcnQ9dC5zdGFydDNELnksdGhpcy5tX1hFbmQ9dC5lbmQzRC54LHRoaXMubV9ZRW5kPXQuZW5kM0QueSx0aGlzLm1fZGVzY3JpcHRpb249dC52ZD90LnZkOnEoKSx2b2lkKHQudmQ/KHRoaXMuc2V0RGVmYXVsdEF0dHJpYnV0ZVZhbHVlcygpLHRoaXMuYWRkQXR0cmlidXRlKDEpLHRoaXMubV9hdHRyaWJ1dGVzWzBdPXQuc3RhcnQzRC56LHRoaXMubV9hdHRyaWJ1dGVzW3RoaXMubV9kZXNjcmlwdGlvbi5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMl09dC5lbmQzRC56KTp0aGlzLm1fYXR0cmlidXRlcz1bdC5zdGFydDNELnosdC5lbmQzRC56XSk7aChcImJhZCBjb25zdHJ1Y3RvciBwYXJhbXNcIiksdGhpcy5tX1hTdGFydD10aGlzLm1fWVN0YXJ0PXRoaXMubV9YRW5kPXRoaXMubV9ZRW5kPU51bWJlci5OYU59fXNldERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMoKXtjb25zdCB0PXRoaXMubV9kZXNjcmlwdGlvbi5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMjt0PjAmJihudWxsPT09dGhpcy5tX2F0dHJpYnV0ZXMmJih0aGlzLm1fYXR0cmlidXRlcz1PKDIqdCxOdW1iZXIuTmFOKSksJCh0aGlzLm1fYXR0cmlidXRlcyx0aGlzLm1fZGVzY3JpcHRpb24uZ2V0RGVmYXVsdFBvaW50QXR0cmlidXRlcygpLDAsMix0KSwkKHRoaXMubV9hdHRyaWJ1dGVzLHRoaXMubV9kZXNjcmlwdGlvbi5nZXREZWZhdWx0UG9pbnRBdHRyaWJ1dGVzKCksdCwyLHQpKX1hYnNOb3JtWFlaKHQpe3JldHVybiBhKFwibm90IGltcGxlbWVudGVkXCIpLDB9cXVlcnlXZWlnaHRzKHQpe31zbmFwQ29udHJvbFBvaW50czNEKCl7cmV0dXJuIGEoXCJub3QgaW1wbGVtZW50ZWRcIiksITF9c2V0Q29vcmRzRm9ySW50ZXJzZWN0b3IzRCh0LGUscyl7YShcIm5vdCBpbXBsZW1lbnRlZFwiKX10cmFuc2Zvcm1BdHRyaWJ1dGUodCxlLHMsbixpKXthKFwiXCIpfW1lcmdlVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpe2NvbnN0IGU9dGhpcy5nZXREZXNjcmlwdGlvbigpLHM9eChlLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24ocyl9Y2hhbmdlRW5kUG9pbnRzKHQsZSl7Y29uc3Qgcz10LmdldFhZKCksbj1lLmdldFhZKCk7dGhpcy5jaGFuZ2VFbmRQb2ludHMyRChzLG4pO2xldCBpPXQuZ2V0RGVzY3JpcHRpb24oKTtpIT09dGhpcy5nZXREZXNjcmlwdGlvbigpJiZ0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oaSksaT1lLmdldERlc2NyaXB0aW9uKCksaSE9PXRoaXMuZ2V0RGVzY3JpcHRpb24oKSYmdGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKGkpO2ZvcihsZXQgcj0xLG89aS5nZXRBdHRyaWJ1dGVDb3VudCgpO3I8bztyKyspe2NvbnN0IHM9aS5nZXRTZW1hbnRpY3Mociksbj11cy5nZXRDb21wb25lbnRDb3VudChzKTtmb3IobGV0IGk9MDtpPG47aSsrKXtzcyh0aGlzLDAscyxpLHQuZ2V0QXR0cmlidXRlQXNEYmwocyxpKSk7c3ModGhpcywxLHMsaSxlLmdldEF0dHJpYnV0ZUFzRGJsKHMsaSkpfX19Z2V0U3RhcnRYWSgpe3JldHVybiBuZXcgSih0aGlzLm1fWFN0YXJ0LHRoaXMubV9ZU3RhcnQpfXNldFN0YXJ0WFkodCl7dGhpcy5tX1hTdGFydD10LngsdGhpcy5tX1lTdGFydD10LnksdGhpcy5lbmRQb2ludE1vZGlmaWVkKCl9c2V0U3RhcnRYWUNvb3Jkcyh0LGUpe3RoaXMubV9YU3RhcnQ9dCx0aGlzLm1fWVN0YXJ0PWUsdGhpcy5lbmRQb2ludE1vZGlmaWVkKCl9Z2V0U3RhcnRYWVooKXtyZXR1cm4gUWUodGhpcywwKX1zZXRTdGFydFhZWih0KXtLZSh0aGlzLDAsdCl9c2V0U3RhcnRYWVpDb29yZHModCxlLHMpe0tlKHRoaXMsMCxZLmNvbnN0cnVjdCh0LGUscykpfXF1ZXJ5U3RhcnQodCl7JGUodGhpcywwLHQpfXNldFN0YXJ0KHQpe3RzKHRoaXMsMCx0KX1zZXRTdGFydDJEKHQpe3RoaXMuc2V0U3RhcnRYWSh0KX1nZXRTdGFydEF0dHJpYnV0ZUFzRGJsKHQsZSl7cmV0dXJuIGVzKHR
1oaXMsMCx0LGUpfWdldFN0YXJ0QXR0cmlidXRlQXNJbnQodCxlKXtyZXR1cm4gcygwKSwwfXNldFN0YXJ0QXR0cmlidXRlKHQsZSxzKXtzcyh0aGlzLDAsdCxlLHMpfXNldFN0YXJ0QXR0cmlidXRlc0Zyb21Qb2ludCh0LGUpe2NvbnN0IHM9dC5nZXREZXNjcmlwdGlvbigpO2ZvcihsZXQgbj1lJiZzLmhhc1ooKT8yOjEsaT1zLmdldEF0dHJpYnV0ZUNvdW50KCk7bjxpOysrbil7Y29uc3QgZT1zLmdldFNlbWFudGljcyhuKSxpPXVzLmdldENvbXBvbmVudENvdW50KGUpO2ZvcihsZXQgcz0wO3M8aTsrK3Mpe2NvbnN0IG49dC5nZXRBdHRyaWJ1dGVBc0RibChlLHMpO3RoaXMuc2V0U3RhcnRBdHRyaWJ1dGUoZSxzLG4pfX19c2V0RW5kQXR0cmlidXRlc0Zyb21Qb2ludCh0LGUpe2NvbnN0IHM9dC5nZXREZXNjcmlwdGlvbigpO2ZvcihsZXQgbj1lJiZzLmhhc1ooKT8yOjEsaT1zLmdldEF0dHJpYnV0ZUNvdW50KCk7bjxpOysrbil7Y29uc3QgZT1zLmdldFNlbWFudGljcyhuKSxpPXVzLmdldENvbXBvbmVudENvdW50KGUpO2ZvcihsZXQgcz0wO3M8aTsrK3Mpe2NvbnN0IG49dC5nZXRBdHRyaWJ1dGVBc0RibChlLHMpO3RoaXMuc2V0RW5kQXR0cmlidXRlKGUscyxuKX19fWdldFN0YXJ0WCgpe3JldHVybiB0aGlzLm1fWFN0YXJ0fWdldFN0YXJ0WSgpe3JldHVybiB0aGlzLm1fWVN0YXJ0fWdldFN0YXJ0Wigpe3JldHVybiBzKDApLDB9Z2V0RW5kWCgpe3JldHVybiB0aGlzLm1fWEVuZH1nZXRFbmRZKCl7cmV0dXJuIHRoaXMubV9ZRW5kfWdldEVuZFooKXtyZXR1cm4gcygwKSwwfWdldEVuZFhZKCl7cmV0dXJuIG5ldyBKKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kKX1zZXRFbmRYWSh0KXt0aGlzLm1fWEVuZD10LngsdGhpcy5tX1lFbmQ9dC55LHRoaXMuZW5kUG9pbnRNb2RpZmllZCgpfXNldEVuZFhZQ29vcmRzKHQsZSl7dGhpcy5tX1hFbmQ9dCx0aGlzLm1fWUVuZD1lLHRoaXMuZW5kUG9pbnRNb2RpZmllZCgpfWdldEVuZFhZWigpe3JldHVybiBRZSh0aGlzLDEpfXNldEVuZFhZWih0KXtLZSh0aGlzLDEsdCl9c2V0RW5kWFlaQ29vcmRzKHQsZSxzKXtLZSh0aGlzLDEsWS5jb25zdHJ1Y3QodCxlLHMpKX1xdWVyeUVuZCh0KXskZSh0aGlzLDEsdCl9c2V0RW5kKHQpe3RzKHRoaXMsMSx0KX1zZXRFbmQyRCh0KXt0aGlzLnNldEVuZFhZKHQpfWdldEVuZEF0dHJpYnV0ZUFzRGJsKHQsZSl7cmV0dXJuIGVzKHRoaXMsMSx0LGUpfWdldEVuZEF0dHJpYnV0ZUFzSW50KHQsZSl7cmV0dXJuIHMoMCksTWF0aC50cnVuYygwKX1zZXRFbmRBdHRyaWJ1dGUodCxlLHMpe3NzKHRoaXMsMSx0LGUscyl9Z2V0RGltZW5zaW9uKCl7cmV0dXJuIDF9Y29weVRvKHQpe2lmKHRoaXM9PT10KXJldHVybjt0LmdldEdlb21ldHJ5VHlwZSgpIT09dGhpcy5nZXRHZW9tZXRyeVR5cGUoKSYmZShcIlwiKTtjb25zdCBzPXQ7cy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pLHMubV9hdHRyaWJ1dGVzJiYkKHMubV9hdHRyaWJ1dGVzLHRoaXMubV9hdHRyaWJ1dGVzLDAsMCwyKih0aGlzLm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTIpKSxzLm1fWFN0YXJ0PXRoaXMubV9YU3RhcnQscy5tX1lTdGFydD10aGlzLm1fWVN0YXJ0LHMubV9YRW5kPXRoaXMubV9YRW5kLHMubV9ZRW5kPXRoaXMubV9ZRW5kLHRoaXMuY29weVRvSW1wbChzKX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNFbXB0eUltcGwoKX1pc0Nsb3NlZCgpe3JldHVybiB0aGlzLm1fWFN0YXJ0PT09dGhpcy5tX1hFbmQmJnRoaXMubV9ZU3RhcnQ9PT10aGlzLm1fWUVuZH1zZXRFbXB0eSgpe31jYWxjdWxhdGVBcmVhMkQoKXtyZXR1cm4gMH1xdWVyeUludGVydmFsKHQsZSl7Y29uc3Qgcz1VLmNvbnN0cnVjdEVtcHR5KCk7cmV0dXJuIHMudm1pbj1lcyh0aGlzLDAsdCxlKSxzLnZtYXg9cy52bWluLHMubWVyZ2VOZUNvb3JkaW5hdGUoZXModGhpcywxLHQsZSkpLHN9Y2FsY3VsYXRlTGVuZ3RoM0QodCl7cmV0dXJuIHMoMCksMH1nZXRDb29yZDNEKHQpe3JldHVybiBzKDApLHt9fWdldENvb3JkMkQodCl7Y29uc3QgZT1KLmdldE5BTigpO3JldHVybiB0aGlzLnF1ZXJ5Q29vcmQyRCh0LGUpLGV9cXVlcnlDb29yZDNEKHQsZSl7cygwKX1nZXRDb29yZFoodCl7cmV0dXJuIHMoMCksMH1xdWVyeUNvb3JkKHQsZSl7ZS5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pLGUuc2V0WFkodGhpcy5nZXRDb29yZDJEKHQpKTtmb3IobGV0IHM9MSxuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3M8bjtzKyspe2NvbnN0IG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhzKSxpPXVzLmdldENvbXBvbmVudENvdW50KG4pO2ZvcihsZXQgcz0wO3M8aTtzKyspe2NvbnN0IGk9dGhpcy5nZXRBdHRyaWJ1dGVBc0RibCh0LG4scyk7ZS5zZXRBdHRyaWJ1dGVCYXNpYyhuLHMsaSl9fX1pc0Nsb3NlclRoYW5EaXN0YW5jZSh0LGUscyl7Y29uc3Qgbj1sZS5jb25zdHJ1Y3RFbXB0eSgpO3RoaXMucXVlcnlMb29zZUVudmVsb3BlT25JbnRlcnZhbChlLG4pO2lmKG4uZGlzdGFuY2UodCk+cylyZXR1cm4hMTtjb25zdCBpPXRoaXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGVPbkludGVydmFsKHQsZSxzKTtyZXR1cm4hTnVtYmVyLmlzTmFOKGkpJiZKLmRpc3RhbmNlKHQsdGhpcy5nZXRDb29yZDJEKGkpKTw9c31pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpe3JldHVybiExfWlzVHJ1ZTNEKCl7cmV0dXJuITF9Z2V0UmV2ZXJzZWQoKXtjb25zdCB0PXRoaXMuY2xvbmUoKTtyZXR1cm4gdC5yZXZlcnNlKCksdH1yZXZlcnNlKCl7dGhpcy5tX1hFbmQ9c3QodGhpcy5tX1hTdGFydCx0aGlzLm1fWFN0YXJ0PXRoaXMubV9YRW5kKSx0aGlzLm1fWUVuZD1zdCh0aGlzLm1fWVN0YXJ0LHRoaXMubV9ZU3RhcnQ9dGhpcy5tX1lFbmQpLHRoaXMucmV2ZXJzZUltcGwoKTtmb3IobGV0IHQ9MSxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3Q8ZTt0Kyspe2NvbnN0IGU9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyh0KTtmb3IobGV0IHQ9MCxzPXVzLmdldENvbXBvbmVudENvdW50KGUpO3Q8czt0Kyspe2NvbnN0IHM9ZXModGhpcywwLGUsdCk7c3ModGhpcywwLGUsdCxlcyh0aGlzLDEsZSx0KSksc3ModGhpcywxLGUsdCxzKX19cmV0dXJuIHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSx0aGlzfWlzRW1wdHlJbXBsKCl7cmV0dXJuITF9aXNDaXJjdWxhcigpe3JldHVybiExfWRpc3RhbmNlKHQsZSxuLGkpe2lmKCFlJiZ0aGlzLmlzSW50ZXJzZWN0aW5nKHQsMCwhMSkpe2lmKG51bGwhPT1ufHxudWxsIT09aSl7Y29uc3QgZT1PKDksTnVtYmVyLk5hTikscj1PKDksTnVtYmVyLk5hTiksbz10aGlzLmludGVyc2VjdCh0LG51bGwsZSxyLDApO3Mobzw9OSksMD09PW8mJmgoXCJcIiksbnVsbCE9PW4mJihuWzBdPWVbMF0pLG51bGwhPT1pJiYoaVswXT1yWzBdKX1yZXR1cm4gMH1sZXQgcixvPU51bWJlci5NQVhfVkFMVUUsYT0tMSx1PW87cmV0dXJuIHI9dGhpcy5nZXRTdGFydFhZKCksYT10LmdldENsb3Nlc3RDb29yZGluYX
1RlKHIsITEpLHIuc3ViVGhpcyh0LmdldENvb3JkMkQoYSkpLHU9ci5sZW5ndGgoKSx1PG8mJihvPXUsbnVsbCE9PWkmJihpWzBdPWEpLG51bGwhPT1uJiYoblswXT0wKSkscj10aGlzLmdldEVuZFhZKCksYT10LmdldENsb3Nlc3RDb29yZGluYXRlKHIsITEpLHIuc3ViVGhpcyh0LmdldENvb3JkMkQoYSkpLHU9ci5sZW5ndGgoKSx1PG8mJihvPXUsbnVsbCE9PWkmJihpWzBdPWEpLG51bGwhPT1uJiYoblswXT0xKSkscj10LmdldFN0YXJ0WFkoKSxhPXRoaXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUociwhMSksci5zdWJUaGlzKHRoaXMuZ2V0Q29vcmQyRChhKSksdT1yLmxlbmd0aCgpLHU8byYmKG89dSxudWxsIT09biYmKG5bMF09YSksbnVsbCE9PWkmJihpWzBdPTApKSxyPXQuZ2V0RW5kWFkoKSxhPXRoaXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUociwhMSksci5zdWJUaGlzKHRoaXMuZ2V0Q29vcmQyRChhKSksdT1yLmxlbmd0aCgpLHU8byYmKG89dSxudWxsIT09biYmKG5bMF09YSksbnVsbCE9PWkmJihpWzBdPTEpKSxvfWNhbGN1bGF0ZVN1Ykxlbmd0aEZyb21TdGFydCh0KXtyZXR1cm4gdGhpcy50VG9MZW5ndGgodCl9Y2FsY3VsYXRlU3ViTGVuZ3RoKHQsZSl7cmV0dXJuIGU9PT10PzA6dGhpcy50VG9MZW5ndGgoZSktdGhpcy50VG9MZW5ndGgodCl9c3RhdGljIHJlY2FsY3VsYXRlUGFyZW50VCh0LGUscyl7cmV0dXJuIG90KHQsZSxzKX1tb3ZlVG8odCl7Y29uc3QgZT10aGlzLmlzQ2xvc2VkKCkscz1uZXcgY2U7cy5zZXRTaGlmdCh0LnN1Yih0aGlzLmdldFN0YXJ0WFkoKSkpLHRoaXMuYXBwbHlUcmFuc2Zvcm1hdGlvbihzKSxlP3RoaXMuY2hhbmdlRW5kUG9pbnRzMkQodCx0KTp0aGlzLmNoYW5nZUVuZFBvaW50czJEKHQsdGhpcy5nZXRFbmRYWSgpKX1tb3ZlVG8zRCh0KXtzKDApfWdldERlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMubV9kZXNjcmlwdGlvbn1hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0KXtpcyh0aGlzLHQpfW1lcmdlVmVydGV4RGVzY3JpcHRpb24odCl7dGhpcy5tX2Rlc2NyaXB0aW9uIT09dCYmKHRoaXMubV9kZXNjcmlwdGlvbi5oYXNBdHRyaWJ1dGVzRnJvbSh0KXx8dGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uSW1wbCh0KSl9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpfWFkZEF0dHJpYnV0ZSh0KXtpZih0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpKXJldHVybjtjb25zdCBlPUModGhpcy5tX2Rlc2NyaXB0aW9uLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24oZSl9ZHJvcEF0dHJpYnV0ZSh0KXtpZighdGhpcy5tX2Rlc2NyaXB0aW9uLmhhc0F0dHJpYnV0ZSh0KSlyZXR1cm47Y29uc3QgZT12KHRoaXMubV9kZXNjcmlwdGlvbix0KTt0aGlzLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKGUpfWRyb3BBbGxBdHRyaWJ1dGVzKCl7Y29uc3QgdD1QKCk7dCE9PXRoaXMubV9kZXNjcmlwdGlvbiYmdGhpcy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0KX1zd2FwKHQpe2lmKHRoaXM9PT10KXJldHVybjt0LmdldEdlb21ldHJ5VHlwZSgpIT09dGhpcy5nZXRHZW9tZXRyeVR5cGUoKSYmZShcIndyb25nIGdlb21ldHJ5IHR5cGVcIik7Y29uc3Qgcz10O3MubV9kZXNjcmlwdGlvbj1zdCh0aGlzLm1fZGVzY3JpcHRpb24sdGhpcy5tX2Rlc2NyaXB0aW9uPXMubV9kZXNjcmlwdGlvbikscy5tX1hTdGFydD1zdCh0aGlzLm1fWFN0YXJ0LHRoaXMubV9YU3RhcnQ9cy5tX1hTdGFydCkscy5tX1lTdGFydD1zdCh0aGlzLm1fWVN0YXJ0LHRoaXMubV9ZU3RhcnQ9cy5tX1lTdGFydCkscy5tX1hFbmQ9c3QodGhpcy5tX1hFbmQsdGhpcy5tX1hFbmQ9cy5tX1hFbmQpLHMubV9ZRW5kPXN0KHRoaXMubV9ZRW5kLHRoaXMubV9ZRW5kPXMubV9ZRW5kKSxzLm1fYXR0cmlidXRlcz1zdCh0aGlzLm1fYXR0cmlidXRlcyx0aGlzLm1fYXR0cmlidXRlcz1zLm1fYXR0cmlidXRlcyksdGhpcy5zd2FwSW1wbChzKX1lcXVhbHModCxlKXtpZih0aGlzLmdldEdlb21ldHJ5VHlwZSgpIT09dC5nZXRHZW9tZXRyeVR5cGUoKSlyZXR1cm4hMTtjb25zdCBzPXZvaWQgMD09PWU7cyYmKGU9MCk7Y29uc3Qgbj10O2lmKHRoaXM9PT1uKXJldHVybiEwO2lmKHRoaXMubV9kZXNjcmlwdGlvbiE9PW4ubV9kZXNjcmlwdGlvbilyZXR1cm4hMTtpZihNYXRoLmFicyh0aGlzLm1fWFN0YXJ0LW4ubV9YU3RhcnQpPmV8fE1hdGguYWJzKHRoaXMubV9YRW5kLW4ubV9YRW5kKT5lfHxNYXRoLmFicyh0aGlzLm1fWVN0YXJ0LW4ubV9ZU3RhcnQpPmV8fE1hdGguYWJzKHRoaXMubV9ZRW5kLW4ubV9ZRW5kKT5lKXJldHVybiExO2ZvcihsZXQgaT0wLHI9MioodGhpcy5tX2Rlc2NyaXB0aW9uLmdldFRvdGFsQ29tcG9uZW50Q291bnQoKS0yKTtpPHI7aSsrKWlmKCFhdCh0aGlzLm1fYXR0cmlidXRlc1tpXSxuLm1fYXR0cmlidXRlc1tpXSxlKSlyZXR1cm4hMTtyZXR1cm4gcz90aGlzLmVxdWFsc0ltcGwobik6dGhpcy5lcXVhbHNJbXBsVG9sKG4sZSl9Z2V0SW1wbCgpe3JldHVybiB0aGlzfXNldEF0dHJpYnV0ZUJhc2ljKHQscyxuKXtpZih0aGlzLmFkZEF0dHJpYnV0ZSh0KSwwPT09dCYmdGhpcy5pc0N1cnZlKCkpeyhzPDB8fHM+MSkmJmUoXCJcIik7Y29uc3QgdD1uZXcgY2UsaT0wPT09cz9uOjAscj0xPT09cz9uOjA7dC5zZXRTaGlmdENvb3JkcyhpLHIpLDA9PT1zP3QueHg9MDp0Lnl5PTAsdGhpcy5hcHBseVRyYW5zZm9ybWF0aW9uKHQpfWVsc2UgdGhpcy5zZXRTdGFydEF0dHJpYnV0ZSh0LHMsbiksdGhpcy5zZXRFbmRBdHRyaWJ1dGUodCxzLG4pfXJlcGxhY2VOYU5zKHQsZSl7aWYodGhpcy5hZGRBdHRyaWJ1dGUodCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuO2NvbnN0IHM9dXMuZ2V0Q29tcG9uZW50Q291bnQodCk7Zm9yKGxldCBuPTA7bjxzO24rKyl7Y29uc3Qgcz10aGlzLmdldFN0YXJ0QXR0cmlidXRlQXNEYmwodCxuKTtOdW1iZXIuaXNOYU4ocykmJnRoaXMuc2V0U3RhcnRBdHRyaWJ1dGUodCxuLGUpO2NvbnN0IGk9dGhpcy5nZXRFbmRBdHRyaWJ1dGVBc0RibCh0LG4pO051bWJlci5pc05hTihpKSYmdGhpcy5zZXRFbmRBdHRyaWJ1dGUodCxuLGUpfX19bXMuc19tYXhNb25vdG9uaWNQYXJ0UGFyYW1zPTg7Y2xhc3MgbHMgZXh0ZW5kcyBnZXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5tX2luZGV4PS0xLHRoaXMuZ2M9dCx0aGlzLmRpbT1lfW5leHQoKXtmb3IoOzspe2lmKHRoaXMubV9pbmRleD49dGhpcy5nYy5nZXRHZW9tZXRyeUNvdW50KCkpcmV0dXJuIG51bGw7aWYodGhpcy5tX2luZGV4KyssdGhpcy5tX2luZGV4PT09dGhpcy5nYy5nZXRHZW9tZXRyeUNvdW50KCkpcmV0dXJuIG51bGw7Y29uc3QgdD10aGlzLmdjLmdldEdlb21ldHJ5KHRoaXMubV9pbmRleCk7aWYoLTE9PT10aGlzLmRpbXx8MTw8dC5nZXREaW1lbnNpb24oKSZ0aGlzLmRpbSlyZXR1cm4gdH1yZXR1cm4gbnVsbH1nZXRHZW9tZXRyeUlEKCl7cmV0dXJuIHRoaXMubV9pbmRleH10b2NrKCl7cmV0dXJuITB9Z2V0UmFuaygpe3JldHVybiAxfX1jbGFzcyBjc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm1fZ2VvbXM9W10sdGhpcy5tX2Rlc2NyaXB0aW9uPVAoKSx0JiYodC52ZD90aGlzLm1fZGVzY3JpcHRpb249dC52ZDp0LmNvcHk/dC5jb3B5LmNvcHlUbyh0aGlzKTplKFwiY29uc3RydWN0b3IgYXJndW1lbnQgbm90IHJlY29nbml6ZWRcIikpfWdldEdlb21ldHJ5Q291bnQoKXtyZXR1cm4gdGhpcy5tX2dlb21zLmxlbmd0aH1yZXNlcnZlKHQpe31hZGRHZW9tZXRyeSh0KXtpZih0LmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtR2VvbWV0cnlDb2xsZWN0aW9uKXtjb25zdCBlPXQ7Zm9yKGxldCB0PTAscz1lLmdldEdlb21ldHJ5Q291bnQoKTt0PHM7dCsrKXRoaXMuYWRkR2VvbWV0cnkoZS5nZXRHZW9tZXRyeSh0KSl9ZWxzZSB0aGlzLm1fZ2VvbXMucHVzaCh0LmNsb25lKCkpLHRoaXMubWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbih0LmdldERlc2NyaXB0aW9uKCkpfWFkZEN1cnNvcih0KXtmb3IobGV0IGU9dC5uZXh0KCk7bnVsbCE9PWU7ZT10Lm5leHQoKSl0aGlzLmFkZEdlb21ldHJ5KGUpfWdldEdlb21ldHJ5KHQpe3JldHVybih0PDB8fHQ+PXRoaXMubV9
1nZW9tcy5sZW5ndGgpJiZlKFwiR2VvbWV0cnlfY29sbGVjdGlvbi5nZXRfZ2VvbWV0cnlcIiksdGhpcy5tX2dlb21zW3RdfW1vZGlmaWVkRWxlbWVudEluZGV4KHQpe3RoaXMubWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLmdldEdlb21ldHJ5KHQpLmdldERlc2NyaXB0aW9uKCkpfW1vZGlmaWVkRWxlbWVudCh0KXt0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24odC5nZXREZXNjcmlwdGlvbigpKX1nZXRHZW9tZXRyeVR5cGUoKXtyZXR1cm4gaS5lbnVtR2VvbWV0cnlDb2xsZWN0aW9ufWdldERpbWVuc2lvbigpe2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5tX2dlb21zKXQ9TWF0aC5tYXgodCxlLmdldERpbWVuc2lvbigpKTtyZXR1cm4gdH1nZXREZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLm1fZGVzY3JpcHRpb259YXNzaWduVmVydGV4RGVzY3JpcHRpb24odCl7dGhpcy5tX2Rlc2NyaXB0aW9uIT09dCYmdGhpcy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbkltcGwodCl9YXNzaWduVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpe2Zvcihjb25zdCBlIG9mIHRoaXMubV9nZW9tcyllLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHQpO3RoaXMubV9kZXNjcmlwdGlvbj10fW1lcmdlVmVydGV4RGVzY3JpcHRpb24odCl7dGhpcy5tX2Rlc2NyaXB0aW9uIT09dCYmKHRoaXMubV9kZXNjcmlwdGlvbi5oYXNBdHRyaWJ1dGVzRnJvbSh0KXx8dGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uSW1wbCh0KSl9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpfWFkZEF0dHJpYnV0ZSh0KXtpZih0aGlzLm1fZGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpKXJldHVybjtjb25zdCBlPUModGhpcy5tX2Rlc2NyaXB0aW9uLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24oZSl9ZHJvcEF0dHJpYnV0ZSh0KXtpZighdGhpcy5tX2Rlc2NyaXB0aW9uLmhhc0F0dHJpYnV0ZSh0KSlyZXR1cm47Y29uc3QgZT12KHRoaXMubV9kZXNjcmlwdGlvbix0KTt0aGlzLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKGUpfWRyb3BBbGxBdHRyaWJ1dGVzKCl7Y29uc3QgdD1QKCk7dCE9PXRoaXMubV9kZXNjcmlwdGlvbiYmdGhpcy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0KX1xdWVyeUludGVydmFsKHQsZSl7bGV0IHM9bmV3IFU7Y29uc3Qgbj1uZXcgVTtuLnNldEVtcHR5KCk7Zm9yKGNvbnN0IGkgb2YgdGhpcy5tX2dlb21zKXM9aS5xdWVyeUludGVydmFsKHQsZSksbi5tZXJnZShzKTtyZXR1cm4gbn1xdWVyeUVudmVsb3BlKHQpe2lmKDQ9PT10Lm1fRW52ZWxvcGVUeXBlKXtjb25zdCBlPW5ldyBJO3Quc2V0RW1wdHkoKSx0LmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHRoaXMubV9kZXNjcmlwdGlvbik7Zm9yKGNvbnN0IHMgb2YgdGhpcy5tX2dlb21zKXMucXVlcnlFbnZlbG9wZShlKSx0Lm1lcmdlKGUpfWVsc2UgaWYoMj09PXQubV9FbnZlbG9wZVR5cGUpe2NvbnN0IGU9bmV3IGxlO3Quc2V0RW1wdHkoKTtmb3IoY29uc3QgcyBvZiB0aGlzLm1fZ2VvbXMpcy5xdWVyeUVudmVsb3BlKGUpLHQubWVyZ2VFbnZlbG9wZTJEKGUpfWEoXCIzZCBlbnZlbG9wZSBjYXNlIG5vdCBpbXBsZW1lbnRlZFwiKX1xdWVyeUxvb3NlRW52ZWxvcGUodCl7aWYoMj09PXQubV9FbnZlbG9wZVR5cGUpe2NvbnN0IGU9bmV3IGxlO3Quc2V0RW1wdHkoKTtmb3IoY29uc3QgcyBvZiB0aGlzLm1fZ2VvbXMpcy5xdWVyeUxvb3NlRW52ZWxvcGUoZSksdC5tZXJnZUVudmVsb3BlMkQoZSl9YShcIjNkIG5vdCBpbXBsXCIpfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMubV9nZW9tcy5sZW5ndGh9c2V0RW1wdHkoKXt0aGlzLm1fZ2VvbXMubGVuZ3RoPTB9YXBwbHlUcmFuc2Zvcm1hdGlvbih0KXtpZigxPT09dC5tX1RyYW5zZm9ybWF0aW9uVHlwZSlmb3IoY29uc3QgZSBvZiB0aGlzLm1fZ2VvbXMpZS5hcHBseVRyYW5zZm9ybWF0aW9uKHQpO2EoXCIzZCB4Zm9ybSBub3QgaW1wbFwiKX10cmFuc2Zvcm1BdHRyaWJ1dGUodCxlLHMsbixpKXtmb3IoY29uc3QgciBvZiB0aGlzLm1fZ2VvbXMpci50cmFuc2Zvcm1BdHRyaWJ1dGUodCxlLHMsbixpKX1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgY3Moe3ZkOnRoaXMuZ2V0RGVzY3JpcHRpb24oKX0pfWNvcHlUbyh0KXt0LmdldEdlb21ldHJ5VHlwZSgpIT09aS5lbnVtR2VvbWV0cnlDb2xsZWN0aW9uJiZlKFwiXCIpO2NvbnN0IHM9dDtpZihzIT09dGhpcyl7cy5tX2dlb21zLmxlbmd0aD0wLHMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odGhpcy5tX2Rlc2NyaXB0aW9uKTtmb3IoY29uc3QgdCBvZiB0aGlzLm1fZ2VvbXMpcy5tX2dlb21zLnB1c2godC5jbG9uZSgpKX19Y2FsY3VsYXRlQXJlYTJEKCl7Y29uc3QgdD1uZXcgZnQoMCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5tX2dlb21zKXQucGUoZS5jYWxjdWxhdGVBcmVhMkQoKSk7cmV0dXJuIHQuZ2V0UmVzdWx0KCl9Y2FsY3VsYXRlTGVuZ3RoMkQoKXtjb25zdCB0PW5ldyBmdCgwKTtmb3IoY29uc3QgZSBvZiB0aGlzLm1fZ2VvbXMpdC5wZShlLmNhbGN1bGF0ZUxlbmd0aDJEKCkpO3JldHVybiB0LmdldFJlc3VsdCgpfWNhbGN1bGF0ZUxlbmd0aDNEKHQpe3JldHVybiBzKDApLDB9Z2V0Qm91bmRhcnkoKXtjb25zdCB0PXRoaXMuY3JlYXRlSW5zdGFuY2UoKSxlPXQ7Zm9yKGNvbnN0IHMgb2YgdGhpcy5tX2dlb21zKXtjb25zdCB0PXMuZ2V0Qm91bmRhcnkoKTt0JiZlLm1fZ2VvbXMucHVzaCh0KX1yZXR1cm4gdH1jbG9uZSgpe3JldHVybiBuZXcgY3Moe2NvcHk6dGhpc30pfWVxdWFscyh0LGUpe2lmKHQ9PT10aGlzKXJldHVybiEwO2lmKHQuZ2V0R2VvbWV0cnlUeXBlKCkhPT1pLmVudW1HZW9tZXRyeUNvbGxlY3Rpb24pcmV0dXJuITE7Y29uc3Qgcz10O2lmKHRoaXMubV9kZXNjcmlwdGlvbiE9PXMubV9kZXNjcmlwdGlvbilyZXR1cm4hMTtpZih0aGlzLm1fZ2VvbXMubGVuZ3RoIT09cy5tX2dlb21zLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPHRoaXMubV9nZW9tcy5sZW5ndGg7KytuKWlmKCF0aGlzLm1fZ2VvbXNbbl0uZXF1YWxzKHMubV9nZW9tc1tuXSxlKSlyZXR1cm4hMTtyZXR1cm4hMH1zd2FwKHQpe3QuZ2V0R2VvbWV0cnlUeXBlKCkhPT1pLmVudW1HZW9tZXRyeUNvbGxlY3Rpb24mJmUoXCJcIik7Y29uc3Qgcz10O3MhPT10aGlzJiYodGhpcy5tX2dlb21zPXN0KHMubV9nZW9tcyxzLm1fZ2VvbXM9dGhpcy5tX2dlb21zKSl9c2V0QXR0cmlidXRlQmFzaWModCxlLHMpe2Zvcihjb25zdCBuIG9mIHRoaXMubV9
1nZW9tcyluLnNldEF0dHJpYnV0ZUJhc2ljKHQsZSxzKX1yZXBsYWNlTmFOcyh0LGUpe2Zvcihjb25zdCBzIG9mIHRoaXMubV9nZW9tcylzLnJlcGxhY2VOYU5zKHQsZSl9Z2V0SW1wbCgpe3JldHVybiB0aGlzfW1lcmdlVmVydGV4RGVzY3JpcHRpb25JbXBsKHQpe2NvbnN0IGU9dGhpcy5nZXREZXNjcmlwdGlvbigpLHM9eChlLHQpO3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24ocyl9fWZ1bmN0aW9uIGdzKHQsZT0tMSl7cmV0dXJuIG5ldyBscyh0LGUpfWNzLnR5cGU9aS5lbnVtR2VvbWV0cnlDb2xsZWN0aW9uO2NsYXNzIGRzIGV4dGVuZHMgbXN7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9fWNsYXNzIF9zIGV4dGVuZHMgZHN7aXNUcnVlM0QoKXtyZXR1cm4hMH1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX19ZnVuY3Rpb24gcHModCxlLHMpe2ZzKGUsdC5nZXRTdGFydFhZKCksdC5nZXRFbmRYWSgpLHMpfWZ1bmN0aW9uIGZzKHQsZSxzLG4pe0N0KGUscyx0LG4pfWZ1bmN0aW9uIFBzKHQsZSl7cmV0dXJuIG90KHQubV9YU3RhcnQsdC5tX1hFbmQsZSl9ZnVuY3Rpb24geXModCxlKXtyZXR1cm4gb3QodC5tX1lTdGFydCx0Lm1fWUVuZCxlKX1mdW5jdGlvbiB4cyh0LGUpe2NvbnN0IHM9dC5nZXRTdGFydFooKSxuPXQuZ2V0RW5kWigpO3JldHVybiBvdChzLG4sZSl9ZnVuY3Rpb24gQ3ModCxlLHMpe2NvbnN0IG49TmUuY29uc3RydWN0UG9pbnQyRCh0LmdldFN0YXJ0WFkoKSksaT1OZS5jb25zdHJ1Y3RQb2ludDJEKHQuZ2V0RW5kWFkoKSk7cy5zZXRDb29yZHNFKGkueC5zdWJFKG4ueCksaS55LnN1YkUobi55KSl9ZnVuY3Rpb24gdnModCxlLHMpe2UudmFsdWUoKTw9LjU/RnQoMixOZS5jb25zdHJ1Y3RQb2ludDJEKHQuZ2V0U3RhcnRYWSgpKSxOZS5jb25zdHJ1Y3RQb2ludDJEKHQuZ2V0RW5kWFkoKSksZSxzKTpWdCgyLE5lLmNvbnN0cnVjdFBvaW50MkQodC5nZXRTdGFydFhZKCkpLE5lLmNvbnN0cnVjdFBvaW50MkQodC5nZXRFbmRYWSgpKSxlLHMpfWZ1bmN0aW9uIGJzKHQsZSxzKXt0Lm1fWFN0YXJ0PWUueCx0Lm1fWVN0YXJ0PWUueSx0Lm1fWEVuZD1zLngsdC5tX1lFbmQ9cy55LHQuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1mdW5jdGlvbiBTcyh0LGUpe2NvbnN0IHM9dC5nZXRTdGFydFhZWigpO3Mueio9ZTtjb25zdCBuPXQuZ2V0RW5kWFlaKCk7cmV0dXJuIG4ueio9ZSxzLm5vcm0oMSkrbi5ub3JtKDEpfWZ1bmN0aW9uIEVzKHQpe2lmKHQubV9ZRW5kPHQubV9ZU3RhcnR8fHQubV9ZRW5kPT09dC5tX1lTdGFydCYmdC5tX1hFbmQ8dC5tX1hTdGFydCl7dC5tX1hFbmQ9c3QodC5tX1hTdGFydCx0Lm1fWFN0YXJ0PXQubV9YRW5kKSx0Lm1fWUVuZD1zdCh0Lm1fWVN0YXJ0LHQubV9ZU3RhcnQ9dC5tX1lFbmQpO2ZvcihsZXQgZT0wLHM9dC5tX2Rlc2NyaXB0aW9uLmdldFRvdGFsQ29tcG9uZW50Q291bnQoKS0yO2U8cztlKyspdC5tX2F0dHJpYnV0ZXNbZStzXT1zdCh0Lm1fYXR0cmlidXRlc1tlXSx0Lm1fYXR0cmlidXRlc1tlXT10Lm1fYXR0cmlidXRlc1tlK3NdKX19ZnVuY3Rpb24gRHModCxlLHMsbil7bGV0IGk9MDtpZigodC5tX1hTdGFydD09PWUubV9YU3RhcnQmJnQubV9ZU3RhcnQ9PT1lLm1fWVN0YXJ0fHx0Lm1fWFN0YXJ0PT09ZS5tX1hFbmQmJnQubV9ZU3RhcnQ9PT1lLm1fWUVuZCkmJihpKyssIW4pKXJldHVybiAxO2lmKHQubV9YRW5kPT09ZS5tX1hTdGFydCYmdC5tX1lFbmQ9PT1lLm1fWVN0YXJ0fHx0Lm1fWEVuZD09PWUubV9YRW5kJiZ0Lm1fWUVuZD09PWUubV9ZRW5kKXtpZihpKyssMj09PWkpcmV0dXJuIDI7aWYoIW4pcmV0dXJuIDF9cmV0dXJuIGUuaXNJbnRlcnNlY3RpbmdQb2ludCh0LmdldFN0YXJ0WFkoKSxzLCEwKXx8ZS5pc0ludGVyc2VjdGluZ1BvaW50KHQuZ2V0RW5kWFkoKSxzLCEwKXx8dC5pc0ludGVyc2VjdGluZ1BvaW50KGUuZ2V0U3RhcnRYWSgpLHMsITApfHx0LmlzSW50ZXJzZWN0aW5nUG9pbnQoZS5nZXRFbmRYWSgpLHMsITApPzQ6biYmaT8wOlRzKHQsZSk/NDowfWZ1bmN0aW9uIHdzKHQsZSxzLG4saSxyLG8sYSl7bnVsbCE9PW4mJkh0KG4sMixOdW1iZXIuTmFOKSxudWxsIT09aSYmSHQoaSwyLE51bWJlci5OYU4pLG51bGwhPT1zJiZVdChzLEosMik7Y29uc3QgaD1Bcyh0LGUsMixzLG4saSxyLG8sYSk7cmV0dXJuIG4mJihuLmxlbmd0aD1oKSxpJiYoaS5sZW5ndGg9aCkscyYmKHMubGVuZ3RoPWgpLGh9ZnVuY3Rpb24gQXModCxlLHMsbixpLHIsbyxhLGgpe2NvbnN0IHU9TXModCxlLmdldFN0YXJ0WFkoKSxvLCExKSxtPU1zKHQsZS5nZXRFbmRYWSgpLG8sITEpLGw9TXMoZSx0LmdldFN0YXJ0WFkoKSxvLCExKSxjPU1zKGUsdC5nZXRFbmRYWSgpLG8sITEpO2xldCBnPTAsZD0wO2lmKCFOdW1iZXIuaXNOYU4odSkpe2xldCBzPSExO2EmJmR0KHUsMCwxKSYmdC5nZXRDb29yZDJEKHUpLmlzRXF1YWxQb2ludDJEKGUuZ2V0U3RhcnRYWSgpKSYmKGcrKyxzPSEwKSxzfHwoaSYmKGlbZF09dSksciYmKHJbZF09MCksbiYmbltkXS5zZXRDb29yZHMoZS5tX1hTdGFydCxlLm1fWVN0YXJ0KSxkKyspfWlmKCFOdW1iZXIuaXNOYU4obSkpe2xldCBvPSExO2EmJmR0KG0sMCwxKSYmdC5nZXRDb29yZDJEKG0pLmlzRXF1YWxQb2ludDJEKGUuZ2V0RW5kWFkoKSkmJihnKyssbz0hMCksb3x8KHM+ZCYmKGkmJihpW2RdPW0pLHImJihyW2RdPTEpLG4mJm5bZF0uc2V0Q29vcmRzKGUubV9YRW5kLGUubV9ZRW5kKSksZCsrKX1pZigyIT09ZCYmIU51bWJlci5pc05hTihsKSYmISgwPT09dSYmMD09PWx8fDA9PT1tJiYxPT09bCkpe2xldCBvPSExO2EmJmR0KGwsMCwxKSYmZS5nZXRDb29yZDJEKGwpLmlzRXF1YWxQb2ludDJEKHQuZ2V0U3RhcnRYWSgpKSYmKGcrKyxvPSEwKSxvfHwocz5kJiYoaSYmKGlbZF09MCksciYmKHJbZF09bCksbiYmbltkXS5zZXRDb29yZHModC5tX1hTdGFydCx0Lm1fWVN0YXJ0KSksZCsrKX1pZigyIT09ZCYmIU51bWJlci5pc05hTihjKSYmISgxPT09dSYmMD09PWN8fDE9PT1tJiYxPT09Yykpe2xldCBvPSExO2EmJmR0KGMsMCwxKSYmZS5nZXRDb29yZDJEKGMpLmlzRXF1YWxQb2ludDJEKHQuZ2V0RW5kWFkoKSkmJihnKyssbz0hMCksb3x8KHM+ZCYmKGkmJihpW2RdPTEpLHImJihyW2RdPWMpLG4mJm5bZF0uc2V0Q29vcmRzKGUubV9YRW5kLGUubV9ZRW5kKSksZCsrKX1pZihkPjApcmV0dXJuIGgmJihyPXN0KGksaT1yKSksMj09PWQmJnM+PTImJmkmJmlbMF0+aVsxXSYmKGlbMV09c3QoaVswXSxpWzBdPWlbMV0pLHImJihyWzFdPXN0KHJbMF0sclswXT1yWzFdKSksbiYmKG5bMV09c3QoblswXSxuWzBdPW5bMV0pKSksZDtpZihnPjApcmV0dXJuIDA7Y29uc3QgXz1G
1cyh0LGUsbyk7cmV0dXJuIE51bWJlci5pc05hTihfLngpPzA6KG4mJihuWzBdPXQuZ2V0Q29vcmQyRChfLngpKSxpJiYoaVswXT1fLngpLHImJihyWzBdPV8ueSksMSl9ZnVuY3Rpb24gVHModCxlKXtjb25zdCBzPVlzKHQsZS5tX1hTdGFydCxlLm1fWVN0YXJ0KSxuPVlzKHQsZS5tX1hFbmQsZS5tX1lFbmQpO2lmKHM8MCYmbjwwfHxzPjAmJm4+MClyZXR1cm4hMTtjb25zdCBpPVlzKGUsdC5tX1hTdGFydCx0Lm1fWVN0YXJ0KSxyPVlzKGUsdC5tX1hFbmQsdC5tX1lFbmQpO2lmKGk8MCYmcjwwfHxpPjAmJnI+MClyZXR1cm4hMTtyZXR1cm4gcXModCk+cXMoZSk/WHModCxlKTpYcyhlLHQpfWZ1bmN0aW9uIElzKHQsZSl7Y29uc3Qgcz17YkludGVyc2VjdDohMSx0MTpOdW1iZXIuTmFOLHQyOk51bWJlci5OYU59LG49dC5tX1hFbmQtdC5tX1hTdGFydCxpPXQubV9ZRW5kLXQubV9ZU3RhcnQscj1lLm1fWEVuZC1lLm1fWFN0YXJ0LG89ZS5tX1lFbmQtZS5tX1lTdGFydCxhPXIqaS1uKm87aWYoMD09PWEpcmV0dXJuIHM7Y29uc3QgaD1lLm1fWFN0YXJ0LXQubV9YU3RhcnQsdT1lLm1fWVN0YXJ0LXQubV9ZU3RhcnQsbT1yKnUtaCpvLGw9bip1LWgqaSxjPTEvYTtyZXR1cm4gcy50MT1tKmMscy50Mj1sKmMscy5iSW50ZXJzZWN0PSEwLHN9ZnVuY3Rpb24gTXModCxlLHMsbil7Y29uc3QgaT1KLmdldE5BTigpLHI9Si5nZXROQU4oKTtsZXQgbz0hMTt0Lm1fWUVuZDx0Lm1fWVN0YXJ0fHx0Lm1fWUVuZD09PXQubV9ZU3RhcnQmJnQubV9YRW5kPHQubV9YU3RhcnQ/KGkuc2V0Q29vcmRzKHQubV9YRW5kLHQubV9ZRW5kKSxyLnNldENvb3Jkcyh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpLG89ITApOihpLnNldENvb3Jkcyh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpLHIuc2V0Q29vcmRzKHQubV9YRW5kLHQubV9ZRW5kKSk7Y29uc3QgYT1vPzE6MCxoPW8/MDoxLHU9Si5nZXROQU4oKTt1LnNldFN1YihlLGkpO2xldCBtPXUubGVuZ3RoKCksbD0zKm0qX3QoKTtpZihtPD1NYXRoLm1heChzLGwpKXJldHVybiBuJiYwPT09bT9OdW1iZXIuTmFOOmE7aWYodS5zZXRTdWIoZSxyKSxtPXUubGVuZ3RoKCksbD0zKm0qX3QoKSxtPD1NYXRoLm1heChzLGwpKXJldHVybiBuJiYwPT09bT9OdW1iZXIuTmFOOmg7dS5zZXRDb29yZHMoci54LWkueCxyLnktaS55KTtjb25zdCBjPXUubGVuZ3RoKCk7aWYoYz4wKXtjb25zdCB0PTEvYzt1LnNjYWxlKHQpO2NvbnN0IG49Si5nZXROQU4oKTtuLnNldFN1YihlLGkpO2NvbnN0IG09bi5kb3RQcm9kdWN0KHUpLGw9OCpuLmRvdFByb2R1Y3RBYnModSkqX3QoKTt1LmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpO2NvbnN0IGc9bi5kb3RQcm9kdWN0KHUpLGQ9OCpuLmRvdFByb2R1Y3RBYnModSkqX3QoKSxfPU1hdGgubWF4KHMsbCk7aWYobTwtX3x8bT5jK18pcmV0dXJuIE51bWJlci5OYU47Y29uc3QgcD1NYXRoLm1heChzLGQpO2lmKE1hdGguYWJzKGcpPD1wKXtsZXQgbj1tKnQ7bj1wdChuLDAsMSk7Y29uc3QgdT1KLmdldE5BTigpO2lmKGZzKG4saSxyLHUpLEouZGlzdGFuY2UodSxlKTw9cyl7aWYobjwuNSl7aWYoSi5kaXN0YW5jZSh1LGkpPD1zJiZKLmRpc3RhbmNlKGUsaSk8PXMpcmV0dXJuIGF9ZWxzZSBpZihKLmRpc3RhbmNlKHUscik8PXMmJkouZGlzdGFuY2UoZSxyKTw9cylyZXR1cm4gaDtyZXR1cm4gbz8xLW46bn19fXJldHVybiBOdW1iZXIuTmFOfWZ1bmN0aW9uIFlzKHQsZSxzKXtjb25zdCBuPUouZ2V0TkFOKCk7bi5zZXRDb29yZHMoZSxzKSxuLnN1YlRoaXModC5nZXRTdGFydFhZKCkpO2NvbnN0IGk9Si5nZXROQU4oKTtpLnNldFN1Yih0LmdldEVuZFhZKCksdC5nZXRTdGFydFhZKCkpO2NvbnN0IHI9aS5jcm9zc1Byb2R1Y3Qobiksbz00Kl90KCkqKE1hdGguYWJzKGkueCpuLnkpK01hdGguYWJzKGkueSpuLngpKTtyZXR1cm4gcj5vPy0xOnI8LW8/MTowfWZ1bmN0aW9uIE5zKHQsZSxzLG4pe2NvbnN0IGk9bj90Lm1fWFN0YXJ0OnQubV9YRW5kLHI9bj90Lm1fWVN0YXJ0OnQubV9ZRW5kLG89Si5nZXROQU4oKTtvLng9ZS5nZXRFbmRYKCktaSxvLnk9ZS5nZXRFbmRZKCktcjtpZihzLmRvdFByb2R1Y3Qobyk+MypfdCgpKnMuZG90UHJvZHVjdEFicyhvKSl7by54PWUuZ2V0U3RhcnRYKCktaSxvLnk9ZS5nZXRTdGFydFkoKS1yO3JldHVybiBzLmRvdFByb2R1Y3Qobyk8PTMqX3QoKSpzLmRvdFByb2R1Y3RBYnMobyl9cmV0dXJuITB9ZnVuY3Rpb24gWHModCxlKXtjb25zdCBzPUouZ2V0TkFOKCk7cmV0dXJuIHMueD10Lm1fWEVuZC10Lm1fWFN0YXJ0LHMueT10Lm1fWUVuZC10Lm1fWVN0YXJ0LCEhTnModCxlLHMsITEpJiYocy5uZWdhdGVUaGlzKCksISFOcyh0LGUscywhMCkpfWZ1bmN0aW9uIHFzKHQpe2NvbnN0IGU9dC5tX1hTdGFydC10Lm1fWEVuZCxzPXQubV9ZU3RhcnQtdC5tX1lFbmQ7cmV0dXJuIGUqZStzKnN9ZnVuY3Rpb24gRnModCxlLHMpe2NvbnN0IG49dC5tX1hFbmQtdC5tX1hTdGFydCxpPXQubV9ZRW5kLXQubV9ZU3RhcnQscj1lLm1fWEVuZC1lLm1fWFN0YXJ0LG89ZS5tX1lFbmQtZS5tX1lTdGFydCxhPXIqaS1uKm87aWYoMD09PWEpcmV0dXJuIEouZ2V0TkFOKCk7Y29uc3QgaD00Kl90KCkqKE1hdGguYWJzKHIqaSkrTWF0aC5hYnMobipvKSksdT1lLm1fWFN0YXJ0LXQubV9YU3RhcnQsbT1lLm1fWVN0YXJ0LXQubV9ZU3RhcnQsbD1yKm0tdSpvLGM9NCpfdCgpKihNYXRoLmFicyhyKm0pK01hdGguYWJzKHUqbykpLGc9bC9hLGQ9TWF0aC5hYnMoYSksXz0oYypkK2gqTWF0aC5hYnMobCkpLyhhKmEpK190KCkqTWF0aC5hYnMoZyk7aWYoZzwtX3x8Zz4xK18pcmV0dXJuIEouZ2V0TkFOKCk7Y29uc3QgcD1uKm0tdSppLGY9cC9hLFA9KDQqX3QoKSooTWF0aC5hYnMobiptKStNYXRoLmFicyh1KmkpKSpkK2gqTWF0aC5hYnMocCkpLyhhKmEpK190KCkqTWF0aC5hYnMoZik7aWYoZjwtUHx8Zj4xK1ApcmV0dXJuIEouZ2V0TkFOKCk7bGV0IHk9cHQoZywwLDEpLHg9cHQoZiwwLDEpO2NvbnN0IEM9Si5nZXROQU4oKTtwcyh0LHksQyk7Y29uc3Qgdj1KLmdldE5BTigpO2lmKHBzKGUseCx2KSwhc3x8Si5kaXN0YW5jZShDLHYpPnMpe2NvbnN0IG49Si5nZXROQU4oKTtDdChDLHYsLjUsbikseT10LmdldENsb3Nlc3RDb29yZGluYX
1RlKG4sITEpLHg9ZS5nZXRDbG9zZXN0Q29vcmRpbmF0ZShuLCExKTtjb25zdCBpPUouZ2V0TkFOKCk7cHModCx5LGkpO2NvbnN0IHI9Si5nZXROQU4oKTtwcyhlLHgsciksaS5zdWJUaGlzKHIpO2NvbnN0IG89aS5sZW5ndGgoKSxhPSh0LmFic05vcm0oKStlLmFic05vcm0oKSkqbHQoKTtpZihvPk1hdGgubWF4KHMsYSkpcmV0dXJuIEouZ2V0TkFOKCl9cmV0dXJuIG5ldyBKKHkseCl9Y2xhc3MgVnN7Y29uc3RydWN0b3IodCl7aWYodGhpcy5tX3NlZ0ZsYWdTdHJlYW09bnVsbCx0aGlzLm1feHlTdHJlYW09bnVsbCx0aGlzLm1fYkNpcmN1bGF0b3I9ITEsdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9MCx0aGlzLm1fbmV4dFBhdGhJbmRleD0wLHRoaXMubV9jdXJyZW50UGF0aEluZGV4PS0xLHRoaXMubV9wYXJlbnQ9dC5wYXJlbnQsdGhpcy5tX2J1ZmZlcj1uZXcgdGhpcy5tX3BhcmVudC5tX3NlZ21lbnRCdWZmZXJDVG9yLHRoaXMubV9kZXNjcmlwdGlvbj10LnBhcmVudC5nZXREZXNjcmlwdGlvbigpLHRoaXMubV9zZWdtZW50Q291bnQ9dGhpcy5nZXRTZWdtZW50Q291bnQodGhpcy5tX25leHRQYXRoSW5kZXgpLHZvaWQgMCE9PXQucG9pbnRJbmRleCl7KHQucG9pbnRJbmRleDwwfHx0LnBvaW50SW5kZXg+PXQucGFyZW50LmdldFBvaW50Q291bnQoKSkmJm4oXCJcIik7Y29uc3QgZT10LnBhcmVudC5nZXRQYXRoSW5kZXhGcm9tUG9pbnRJbmRleCh0LnBvaW50SW5kZXgpO3RoaXMubV9jdXJyZW50UGF0aEluZGV4PWUsdGhpcy5tX25leHRQYXRoSW5kZXg9ZSsxLHRoaXMubV9uZXh0U2VnbWVudEluZGV4PXQucG9pbnRJbmRleC10LnBhcmVudC5nZXRQYXRoU3RhcnQoZSksdGhpcy5tX3NlZ21lbnRDb3VudD10aGlzLmdldFNlZ21lbnRDb3VudCh0aGlzLm1fY3VycmVudFBhdGhJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT10LnBhdGhJbmRleCl7KHQucGF0aEluZGV4PDB8fHQucGF0aEluZGV4Pj10LnBhcmVudC5nZXRQYXRoQ291bnQoKXx8dC5zZWdtZW50SW5kZXg8MCkmJm4oXCJcIik7Y29uc3QgZT10LnBhcmVudC5pc0Nsb3NlZFBhdGgodC5wYXRoSW5kZXgpPzA6MTt0LnNlZ21lbnRJbmRleD49dC5wYXJlbnQuZ2V0UGF0aFNpemUodC5wYXRoSW5kZXgpLWUmJm4oXCJcIiksdGhpcy5tX25leHRTZWdtZW50SW5kZXg9dC5zZWdtZW50SW5kZXgsdGhpcy5tX2N1cnJlbnRQYXRoSW5kZXg9dC5wYXRoSW5kZXgsdGhpcy5tX25leHRQYXRoSW5kZXg9dGhpcy5tX25leHRTZWdtZW50SW5kZXgrMSx0aGlzLm1fc2VnbWVudENvdW50PXRoaXMuZ2V0U2VnbWVudENvdW50KHRoaXMubV9uZXh0UGF0aEluZGV4KX10aGlzLnByZXBhcmUoKSx0aGlzLm1fcGF0aEJlZ2luPS0xLHRoaXMubV9iQ3VycmVudFBhdGhDbG9zZWQ9ITEsdGhpcy5tX2JTdHJpcEF0dHJpYnV0ZXM9ITEsdGhpcy5tX3ByZXZQYXRoSW5kZXg9LTEsdGhpcy5tX3ByZXZTZWdtZW50SW5kZXg9LTEsdGhpcy5tX2JOZWVkc1VwZGF0ZT0hMSx0aGlzLm1fY3VycmVudFBhdGhJbmRleD4tMSYmKHRoaXMubV9wYXRoQmVnaW49dGhpcy5tX3BhcmVudC5nZXRQYXRoU3RhcnQodGhpcy5tX2N1cnJlbnRQYXRoSW5kZXgpLHRoaXMubV9iQ3VycmVudFBhdGhDbG9zZWQ9dGhpcy5tX3BhcmVudC5pc0Nsb3NlZFBhdGgodGhpcy5tX2N1cnJlbnRQYXRoSW5kZXgpKX1zdHJpcEF0dHJpYnV0ZXMoKXt0aGlzLm1fYlN0cmlwQXR0cmlidXRlcz0hMH1wcmVwYXJlKCl7dGhpcy5tX2JDaXJjdWxhdG9yPSExLHRoaXMubV9wYXJlbnQuaXNFbXB0eUltcGwoKT8odGhpcy5tX3NlZ0ZsYWdTdHJlYW09bnVsbCx0aGlzLm1feHlTdHJlYW09bnVsbCk6KHRoaXMubV9zZWdGbGFnU3RyZWFtPXRoaXMubV9wYXJlbnQuZ2V0U2VnbWVudEZsYWdzU3RyZWFtUmVmKCksdGhpcy5tX3h5U3RyZWFtPXRoaXMubV9wYXJlbnQuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApKX1uZXh0UGF0aCgpe3JldHVybiB0aGlzLm1fY3VycmVudFBhdGhJbmRleD10aGlzLm1fbmV4dFBhdGhJbmRleCwhKHRoaXMubV9jdXJyZW50UGF0aEluZGV4Pj10aGlzLm1fcGFyZW50LmdldFBhdGhDb3VudCgpKSYmKHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4PS0xLHRoaXMubV9uZXh0U2VnbWVudEluZGV4PTAsdGhpcy5tX3NlZ21lbnRDb3VudD10aGlzLmdldFNlZ21lbnRDb3VudCh0aGlzLm1fY3VycmVudFBhdGhJbmRleCksdGhpcy5tX3BhdGhCZWdpbj10aGlzLm1fcGFyZW50LmdldFBhdGhTdGFydCh0aGlzLm1fY3VycmVudFBhdGhJbmRleCksdGhpcy5tX2JDdXJyZW50UGF0aENsb3NlZD10aGlzLm1fcGFyZW50LmlzQ2xvc2VkUGF0aCh0aGlzLm1fY3VycmVudFBhdGhJbmRleCksdGhpcy5tX25leHRQYXRoSW5kZXgrKywhMCl9cHJldmlvdXNQYXRoKCl7cmV0dXJuIDAhPT10aGlzLm1fbmV4dFBhdGhJbmRleCYmKHRoaXMubV9uZXh0UGF0aEluZGV4LS0sdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9MCx0aGlzLm1fc2VnbWVudENvdW50PXRoaXMuZ2V0U2VnbWVudENvdW50KHRoaXMubV9uZXh0UGF0aEluZGV4KSx0aGlzLm1fY3VycmVudFBhdGhJbmRleD10aGlzLm1fbmV4dFBhdGhJbmRleCx0aGlzLm1fcGF0aEJlZ2luPXRoaXMubV9wYXJlbnQuZ2V0UGF0aFN0YXJ0KHRoaXMubV9jdXJyZW50UGF0aEluZGV4KSx0aGlzLm1fYkN1cnJlbnRQYXRoQ2xvc2VkPXRoaXMubV9wYXJlbnQuaXNDbG9zZWRQYXRoKHRoaXMubV9jdXJyZW50UGF0aEluZGV4KSx0aGlzLnJlc2V0VG9MYXN0U2VnbWVudCgpLCEwKX1nZXRTZWdtZW50Q291bnQodCl7cmV0dXJuIHRoaXMubV9wYXJlbnQuaXNFbXB0eUltcGwoKT8wOnRoaXMubV9wYXJlbnQuZ2V0U2VnbWVudENvdW50UGF0aCh0KX1yZXNldFRvRmlyc3RQYXRoKCl7dGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX3NlZ21lbnRDb3VudD0tMSx0aGlzLm1fbmV4dFBhdGhJbmRleD0wLHRoaXMubV9jdXJyZW50UGF0aEluZGV4PS0xLHRoaXMubV9wYXRoQmVnaW49LTEsdGhpcy5tX2JDdXJyZW50UGF0aENsb3NlZD0hMX1yZXNldFRvTGFzdFBhdGgoKXt0aGlzLm1fbmV4dFBhdGhJbmRleD10aGlzLm1fcGFyZW50LmdldFBhdGhDb3VudCgpLHRoaXMubV9
1jdXJyZW50UGF0aEluZGV4PS0xLHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4PS0xLHRoaXMubV9uZXh0U2VnbWVudEluZGV4PS0xLHRoaXMubV9zZWdtZW50Q291bnQ9LTEsdGhpcy5tX3BhdGhCZWdpbj0tMX1yZXNldFRvUGF0aCh0KXsodDwwfHx0PnRoaXMubV9wYXJlbnQuZ2V0UGF0aENvdW50KCkpJiZuKFwiXCIpLHRoaXMubV9uZXh0UGF0aEluZGV4PXQsdGhpcy5tX2N1cnJlbnRQYXRoSW5kZXg9LTEsdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX3NlZ21lbnRDb3VudD0tMSx0aGlzLm1fcGF0aEJlZ2luPS0xLHRoaXMubV9iQ3VycmVudFBhdGhDbG9zZWQ9ITF9aXNMYXN0UGF0aCgpe3JldHVybiB0aGlzLm1fY3VycmVudFBhdGhJbmRleD09PXRoaXMubV9wYXJlbnQuZ2V0UGF0aENvdW50KCktMX1pc0ZpcnN0U2VnbWVudEluUGF0aCgpe3JldHVybiAwPT09dGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXh9aXNMYXN0U2VnbWVudEluUGF0aCgpe3JldHVybiB0aGlzLm1fY3VycmVudFNlZ21lbnRJbmRleD09PXRoaXMubV9zZWdtZW50Q291bnQtMX1yZXNldFRvRmlyc3RTZWdtZW50KCl7dGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9MH1yZXNldFRvTGFzdFNlZ21lbnQoKXt0aGlzLm1fbmV4dFNlZ21lbnRJbmRleD10aGlzLm1fc2VnbWVudENvdW50LHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4PS0xfXJlc2V0VG8odCl7dGhpcy5tX3BhcmVudCE9PXQubV9wYXJlbnQmJmQoXCJcIiksdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9dC5tX2N1cnJlbnRTZWdtZW50SW5kZXgsdGhpcy5tX25leHRTZWdtZW50SW5kZXg9dC5tX25leHRTZWdtZW50SW5kZXgsdGhpcy5tX2N1cnJlbnRQYXRoSW5kZXg9dC5tX2N1cnJlbnRQYXRoSW5kZXgsdGhpcy5tX25leHRQYXRoSW5kZXg9dC5tX25leHRQYXRoSW5kZXgsdGhpcy5tX3NlZ21lbnRDb3VudD10Lm1fc2VnbWVudENvdW50LHRoaXMubV9iQ2lyY3VsYXRvcj10Lm1fYkNpcmN1bGF0b3IsdGhpcy5tX3BhdGhCZWdpbj10Lm1fcGF0aEJlZ2luLHRoaXMubV9iQ3VycmVudFBhdGhDbG9zZWQ9dC5tX2JDdXJyZW50UGF0aENsb3NlZCx0aGlzLm1fYlN0cmlwQXR0cmlidXRlcz10Lm1fYlN0cmlwQXR0cmlidXRlcyx0aGlzLm1fZGVzY3JpcHRpb249dC5tX2Rlc2NyaXB0aW9ufXJlc2V0VG9WZXJ0ZXgodCxlKXtpZih0aGlzLm1fY3VycmVudFBhdGhJbmRleD49MCYmdGhpcy5tX2N1cnJlbnRQYXRoSW5kZXg8dGhpcy5tX3BhcmVudC5nZXRQYXRoQ291bnQoKSl7Y29uc3QgZT10aGlzLmdldFBhdGhCZWdpbigpO2lmKHQ+PWUmJnQ8dGhpcy5tX3BhcmVudC5nZXRQYXRoRW5kKHRoaXMubV9jdXJyZW50UGF0aEluZGV4KSlyZXR1cm4gdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9LTEsdm9pZCh0aGlzLm1fbmV4dFNlZ21lbnRJbmRleD10LWUpfWxldCBzO3M9ZT49MCYmZTx0aGlzLm1fcGFyZW50LmdldFBhdGhDb3VudCgpJiZ0Pj10aGlzLm1fcGFyZW50LmdldFBhdGhTdGFydChlKSYmdDx0aGlzLm1fcGFyZW50LmdldFBhdGhFbmQoZSk/ZTp0aGlzLm1fcGFyZW50LmdldFBhdGhJbmRleEZyb21Qb2ludEluZGV4KHQpLHRoaXMubV9uZXh0UGF0aEluZGV4PXMrMSx0aGlzLm1fY3VycmVudFBhdGhJbmRleD1zLHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4PS0xLHRoaXMubV9uZXh0U2VnbWVudEluZGV4PXQtdGhpcy5tX3BhcmVudC5nZXRQYXRoU3RhcnQocyksdGhpcy5tX3NlZ21lbnRDb3VudD10aGlzLmdldFNlZ21lbnRDb3VudChzKSx0aGlzLm1fcGF0aEJlZ2luPXRoaXMubV9wYXJlbnQuZ2V0UGF0aFN0YXJ0KHRoaXMubV9jdXJyZW50UGF0aEluZGV4KSx0aGlzLm1fYkN1cnJlbnRQYXRoQ2xvc2VkPXRoaXMubV9wYXJlbnQuaXNDbG9zZWRQYXRoKHRoaXMubV9jdXJyZW50UGF0aEluZGV4KX1oYXNOZXh0U2VnbWVudCgpe3JldHVybiB0aGlzLm1fbmV4dFNlZ21lbnRJbmRleDx0aGlzLm1fc2VnbWVudENvdW50fWhhc1ByZXZpb3VzU2VnbWVudCgpe3JldHVybiB0aGlzLm1fbmV4dFNlZ21lbnRJbmRleD4wfW5leHRTZWdtZW50KCl7cmV0dXJuIHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4IT09dGhpcy5tX25leHRTZWdtZW50SW5kZXgmJnRoaXMudXBkYXRlU2VnbWVudCgpLHRoaXMubV9iQ2lyY3VsYXRvcj90aGlzLm1fbmV4dFNlZ21lbnRJbmRleD0odGhpcy5tX25leHRTZWdtZW50SW5kZXgrMSkldGhpcy5tX3NlZ21lbnRDb3VudDoodGhpcy5tX25leHRTZWdtZW50SW5kZXg9PT10aGlzLm1fc2VnbWVudENvdW50JiZuKFwiU2VnbWVudF9pdGVyYXRvcl9pbXBsOjpuZXh0X3NlZ21lbnRcIiksdGhpcy5tX25leHRTZWdtZW50SW5kZXgrKyksdGhpcy5tX2J1ZmZlci5nZXQoKX1wcmV2aW91c1NlZ21lbnQoKXtyZXR1cm4gdGhpcy5tX2JDaXJjdWxhdG9yP3RoaXMubV9uZXh0U2VnbWVudEluZGV4PSh0aGlzLm1fc2VnbWVudENvdW50K3RoaXMubV9uZXh0U2VnbWVudEluZGV4LTEpJXRoaXMubV9zZWdtZW50Q291bnQ6KDA9PT10aGlzLm1fbmV4dFNlZ21lbnRJbmRleCYmbihcIlwiKSx0aGlzLm1fbmV4dFNlZ21lbnRJbmRleC0tKSx0aGlzLm1fbmV4dFNlZ21lbnRJbmRleCE9PXRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4JiZ0aGlzLnVwZGF0ZVNlZ21lbnQoKSx0aGlzLm1fYnVmZmVyLmdldCgpfW5leHRDdXJ2ZSgpe2lmKCF0aGlzLm1fcGFyZW50Lmhhc05vbkxpbmVhclNlZ21lbnRzKCkpcmV0dXJuIHRoaXMucmVzZXRUb0xhc3RTZWdtZW50KCksbnVsbDtsZXQgdD0wO2Zvcig7Oyl7aWYodGhpcy5tX25leHRTZWdtZW50SW5kZXg9PT10aGlzLm1fc2VnbWVudENvdW50fHx0PT09dGhpcy5tX3NlZ21lbnRDb3VudClyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMuZ2V0UGF0aEJlZ2luKCkrdGhpcy5tX25leHRTZWdtZW50SW5kZXg7aWYoMSE9PSgzMSZ0aGlzLm1fc2VnRmxhZ1N0cmVhbS5yZWFkKGUpKSl7dGhpcy51cGRhdGVTZWdtZW50KCk7YnJlYWt9dGhpcy5tX2JDaXJjdWxhdG9yP3RoaXMubV9uZXh0U2VnbWVudEluZGV4PSh0aGlzLm1fbmV4dFNlZ21lbnRJbmRleCsxKSV0aGlzLm1fc2VnbWVudENvdW50OnRoaXMubV9uZXh0U2VnbWVudEluZGV4KyssdCsrfXJldHVybi
1B0aGlzLm1fY3VycmVudFNlZ21lbnRJbmRleCE9PXRoaXMubV9uZXh0U2VnbWVudEluZGV4JiZ0aGlzLnVwZGF0ZVNlZ21lbnQoKSx0aGlzLm1fYkNpcmN1bGF0b3I/dGhpcy5tX25leHRTZWdtZW50SW5kZXg9KHRoaXMubV9uZXh0U2VnbWVudEluZGV4KzEpJXRoaXMubV9zZWdtZW50Q291bnQ6KHRoaXMubV9uZXh0U2VnbWVudEluZGV4PT09dGhpcy5tX3NlZ21lbnRDb3VudCYmbihcIlwiKSx0aGlzLm1fbmV4dFNlZ21lbnRJbmRleCsrKSx0aGlzLm1fYnVmZmVyLmdldCgpfWdldFBhdGhCZWdpbigpe3JldHVybiB0aGlzLm1fcGF0aEJlZ2lufWdldFBhdGhJbmRleCgpe3JldHVybiB0aGlzLm1fY3VycmVudFBhdGhJbmRleH1nZXRTdGFydFBvaW50SW5kZXgoKXtyZXR1cm4gdGhpcy5nZXRQYXRoQmVnaW4oKSt0aGlzLm1fY3VycmVudFNlZ21lbnRJbmRleH1nZXRFbmRQb2ludEluZGV4KCl7cmV0dXJuIHRoaXMuaXNDbG9zaW5nU2VnbWVudCgpP3RoaXMuZ2V0UGF0aEJlZ2luKCk6dGhpcy5nZXRTdGFydFBvaW50SW5kZXgoKSsxfXVwZGF0ZVNlZ21lbnQoKXsodGhpcy5tX25leHRTZWdtZW50SW5kZXg8MHx8dGhpcy5tX25leHRTZWdtZW50SW5kZXg+PXRoaXMubV9zZWdtZW50Q291bnR8fHRoaXMubV9jdXJyZW50UGF0aEluZGV4PDApJiZuKFwiXCIpLHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4PXRoaXMubV9uZXh0U2VnbWVudEluZGV4LHRoaXMubV9wYXJlbnQuZ2V0U2VnbWVudEZyb21QYXRoKHRoaXMubV9jdXJyZW50UGF0aEluZGV4LHRoaXMubV9jdXJyZW50U2VnbWVudEluZGV4LHRoaXMubV9idWZmZXIsdGhpcy5tX2JTdHJpcEF0dHJpYnV0ZXMpfWlzQ2xvc2luZ1NlZ21lbnQoKXtyZXR1cm4gdGhpcy5tX2JDdXJyZW50UGF0aENsb3NlZCYmdGhpcy5tX2N1cnJlbnRTZWdtZW50SW5kZXg9PT10aGlzLm1fc2VnbWVudENvdW50LTF9aXNDdXJ2ZSgpe2lmKG51bGwhPT10aGlzLm1fc2VnRmxhZ1N0cmVhbSl7cmV0dXJuIDEhPT0oMzEmdGhpcy5tX3NlZ0ZsYWdTdHJlYW0ucmVhZCh0aGlzLm1fY3VycmVudFNlZ21lbnRJbmRleCkpfXJldHVybiExfWlzUGF0aENsb3NlZCgpe3JldHVybiB0aGlzLm1fYkN1cnJlbnRQYXRoQ2xvc2VkfXNldENpcmN1bGF0b3IodCl7dGhpcy5tX2JDaXJjdWxhdG9yPXR9Z2V0SW1wbCgpe3JldHVybiB0aGlzfX1jbGFzcyBMc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm1fcmFzdGVyaXplZEdlb21ldHJ5PW51bGwsdGhpcy5tX3F1YWRUcmVlPW51bGwsdGhpcy5tX3F1YWRUcmVlRm9yUGF0aHM9bnVsbCx0aGlzLm1fcmVmQ291bnQ9MSx0JiZ0LmNvcHlUbyh0aGlzKX1nZXRSYXN0ZXJpemVkR2VvbWV0cnkoKXtyZXR1cm4gdGhpcy5tX3Jhc3Rlcml6ZWRHZW9tZXRyeX1jb3B5VG8odCl7dCE9PXRoaXMmJihzKHQudW5pcXVlVXNlKCkpLHQubV9xdWFkVHJlZT10aGlzLm1fcXVhZFRyZWUsdC5tX3F1YWRUcmVlRm9yUGF0aHM9dGhpcy5tX3F1YWRUcmVlRm9yUGF0aHMsdC5tX3Jhc3Rlcml6ZWRHZW9tZXRyeT10aGlzLm1fcmFzdGVyaXplZEdlb21ldHJ5KX1jbG9uZSgpe2NvbnN0IHQ9bmV3IExzO3JldHVybiB0aGlzLmNvcHlUbyh0KSx0fXVuaXF1ZVVzZSgpe3JldHVybiAxPT09dGhpcy5tX3JlZkNvdW50fWFkZFJlZigpeysrdGhpcy5tX3JlZkNvdW50fXJlbGVhc2UoKXswPT09LS10aGlzLm1fcmVmQ291bnQmJih0aGlzLm1fcmFzdGVyaXplZEdlb21ldHJ5PW51bGwsdGhpcy5tX3F1YWRUcmVlPW51bGwsdGhpcy5tX3F1YWRUcmVlRm9yUGF0aHM9bnVsbCl9c2V0UmFzdGVyaXplZEdlb21ldHJ5KHQpe3ModGhpcy51bmlxdWVVc2UoKSl9c2V0UXVhZFRyZWUodCl7cyh0aGlzLnVuaXF1ZVVzZSgpKSx0aGlzLm1fcXVhZFRyZWU9dH1zZXRRdWFkVHJlZUZvclBhdGhzKHQpe3ModGhpcy51bmlxdWVVc2UoKSksdGhpcy5tX3F1YWRUcmVlRm9yUGF0aHM9dH1n
1ZXRRdWFkVHJlZSgpe3JldHVybiB0aGlzLm1fcXVhZFRyZWV9Z2V0UXVhZFRyZWVGb3JQYXRocygpe3JldHVybiB0aGlzLm1fcXVhZFRyZWVGb3JQYXRoc319ZnVuY3Rpb24gUnModCl7cmV0dXJuISh0LmlzRW1wdHkoKXx8dC5nZXRHZW9tZXRyeVR5cGUoKSE9PWkuZW51bVBvbHlsaW5lJiZ0LmdldEdlb21ldHJ5VHlwZSgpIT09aS5lbnVtUG9seWdvbikmJiEodC5nZXRQb2ludENvdW50KCk8MjApfWZ1bmN0aW9uIHpzKHQpe3JldHVybiEodC5pc0VtcHR5KCl8fHQuZ2V0R2VvbWV0cnlUeXBlKCkhPT1pLmVudW1Qb2x5bGluZSYmdC5nZXRHZW9tZXRyeVR5cGUoKSE9PWkuZW51bVBvbHlnb24pJiYhKHQuZ2V0UG9pbnRDb3VudCgpPDIwKX1mdW5jdGlvbiBCcyh0LGUpe3JldHVybiB0LnJlYWRQb2ludDJEKGUrNCl9ZnVuY3Rpb24ga3ModCl7Y29uc3QgZT10LmdldEdlb21ldHJ5VHlwZSgpO3JldHVybiBlPT09aS5lbnVtRWxsaXB0aWNBcmM/MTA6ZT09PWkuZW51bUJlemllcj80OmU9PT1pLmVudW1SYXRpb25hbEJlemllcjI/NTplPT09aS5lbnVtQmV6aWVyMj8yOnZvaWQgaChcIlwiKX1mdW5jdGlvbiBHcyh0KXtjb25zdCBlPTMxJnQ7cmV0dXJuIDQ9PT1lPzEwOjI9PT1lPzQ6OD09PWU/NToxNj09PWU/MjowfWZ1bmN0aW9uIFdzKHQsZSxzLG4pe2NvbnN0IGk9dC5nZXRQYXRoU3RhcnQoZSkscj10LmdldFBhdGhFbmQoZSk7aWYoci1pPDMpcmV0dXJuO2NvbnN0IG89MippLGE9Si5nZXROQU4oKTtzLnF1ZXJ5UG9pbnQyRChvLGEpO2NvbnN0IGg9YS54LHU9YS55LG09Si5nZXROQU4oKTtzLnF1ZXJ5UG9pbnQyRChvKzIsbSk7Y29uc3QgbD1KLmdldE5BTigpO2ZvcihsZXQgYz1vKzQsZz0yKnI7YzxnO2MrPTIpcy5xdWVyeVBvaW50MkQoYyxsKSxuLnBlKChsLngtYS54KSoobS55LXUpKSxhLnNldENvb3Jkc1BvaW50MkQobSksbS5zZXRDb29yZHNQb2ludDJEKGwpO24ucGUoKGgtYS54KSoobS55LXUpKX1mdW5jdGlvbiBqcyh0LGUscyl7Zm9yKDtlLmhhc05leHRTZWdtZW50KCk7KXtjb25zdCB0PWUubmV4dEN1cnZlKCk7aWYobnVsbD09PXQpYnJlYWs7cy5wZSgyKnQuY2FsY3VsYXRlQXJlYTJESGVscGVyKCkpfX12YXIgWnM9YjtjbGFzcyBIc3tzdGF0aWMgdG9TZWdUeXBlKHQpe2xldCBlPTA7c3dpdGNoKHQpe2Nhc2UgaS5lbnVtTGluZTplPTE7YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6ZT0yO2JyZWFrO2Nhc2UgaS5lbnVtRWxsaXB0aWNBcmM6ZT00O2JyZWFrO2Nhc2UgaS5lbnVtUmF0aW9uYWxCZXppZXIyOmU9ODticmVhaztjYXNlIGkuZW51bUJlemllcjI6ZT0xNjticmVhaztkZWZhdWx0OmgoXCJcIil9cmV0dXJuIGV9Y29uc3RydWN0b3IoKXt0aGlzLm1fc2VnbWVudEZsYWdzPW51bGwsdGhpcy5tX3NlZ21lbnRQYXJhbUluZGV4PW51bGwsdGhpcy5tX3NlZ21lbnRQYXJhbXM9bnVsbCx0aGlzLm1fY3VydmVDb3VudD0wLHRoaXMubV9iZXppZXJDb3VudD0wLHRoaXMubV9hcmNDb3VudD0wLHRoaXMubV9yYmV6aWVyMkNvdW50PTAsdGhpcy5tX2JlemllcjJDb3VudD0wLHRoaXMubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludD0wfWFzc2lnbkNvcHkodCl7cmV0dXJuIHRoaXMubV9zZWdtZW50RmxhZ3M9dC5tX3NlZ21lbnRGbGFncyx0aGlzLm1fc2VnbWVudFBhcmFtSW5kZXg9dC5tX3NlZ21lbnRQYXJhbUluZGV4LHRoaXMubV9zZWdtZW50UGFyYW1zPXQubV9zZWdtZW50UGFyYW1zLHRoaXMubV9jdXJ2ZUNvdW50PXQubV9jdXJ2ZUNvdW50LHRoaXMubV9iZXppZXJDb3VudD10Lm1fYmV6aWVyQ291bnQsdGhpcy5tX2FyY0NvdW50PXQubV9hcmNDb3VudCx0aGlzLm1fcmJlemllcjJDb3VudD10Lm1fcmJlemllcjJDb3VudCx0aGlzLm1fYmV6aWVyMkNvdW50PXQubV9iZXppZXIyQ291bnQsdGhpcy5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50PXQubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludCx0aGlzfX1jbGFzcyBVcyBleHRlbmRzIEVle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMubV9jYWNoZWRSaW5nQXJlYXMyRD1udWxsLHRoaXMubV9wYXRocz1udWxsLHRoaXMubV9wYXRoRmxhZ3M9bnVsbCx0aGlzLm1fY3VydmVEYXRhPW51bGwsdC5tb3ZlPyh0aGlzLm1fYlBvbHlnb249dC5tb3ZlLm1fYlBvbHlnb24sdGhpcy5tX2NhY2hlZExlbmd0aDJEPXQubW92ZS5tX2NhY2hlZExlbmd0aDJELHRoaXMubV9jYWNoZWRBcmVhMkQ9dC5tb3ZlLm1fY2FjaGVkQXJlYTJELHRoaXMubV9jdXJyZW50UGF0aEluZGV4PXQubW92ZS5tX2N1cnJlbnRQYXRoSW5kZXgsdGhpcy5tX2NhY2hlZFJpbmdBcmVhczJEPXQubW92ZS5tX2NhY2hlZFJpbmdBcmVhczJELHRoaXMubV9wYXRocz10Lm1vdmUubV9wYXRocyx0aGlzLm1fcGF0aEZsYWdzPXQubW92ZS5tX3BhdGhGbGFncyx0aGlzLm1fY3VydmVEYXRhPXQubW92ZS5tX2N1cnZlRGF0YSx0Lm1vdmUubV9jdXJ2ZURhdGE9bnVsbCx0Lm1vdmUuc2V0RW1wdHkoKSk6KHRoaXMubV9iUG9seWdvbj10LmJQb2x5Z29uLHRoaXMubV9jYWNoZWRMZW5ndGgyRD0wLHRoaXMubV9jYWNoZWRBcmVhMkQ9MCx0aGlzLm1fY3VycmVudFBhdGhJbmRleD0wKX1nZXRHZW9tZXRyeVR5cGUoKXtyZXR1cm4gdGhpcy5tX2JQb2x5Z29uP2kuZW51bVBvbHlnb246aS5lbnVtUG9seWxpbmV9Z2V0RGltZW5zaW9uKCl7cmV0dXJuIHRoaXMubV9iUG9seWdvbj8yOjF9Y2hhbmdlUmluZ1N0YXJ0UG9pbnQodCl7cyh0aGlzLm1fYlBvbHlnb24pO2NvbnN0IG49dGhpcy5nZXRQYXRoSW5kZXhGcm9tUG9pbnRJbmRleCh0KSxpPXRoaXMuZ2V0UGF0aFN0YXJ0KG4pO2lmKGk9PT10KXJldHVybjtjb25zdCByPXRoaXMuZ2V0UGF0aEVuZChuKTsodD49cnx8dDxpKSYmZShcImNoYW5nZV9yaW5nX3N0YXJ0X3BvaW50XCIpO2ZvcihsZXQgZT0wLHM9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxzO2UrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLG49WnMuZ2V0Q29tcG9uZW50Q291bnQocyk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLnJvdGF0ZShpKm4sdCpuLHIqbil9dGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpJiYodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yb3RhdGUoaSx0LHIpLHRoaXMubV9
1jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5yb3RhdGUoaSx0LHIpKX1zZXRGaWxsUnVsZSh0KXt0aGlzLm1fYkZpbGxSdWxlPTE9PT10fWdldEZpbGxSdWxlKCl7cmV0dXJuIHRoaXMubV9iRmlsbFJ1bGU/MTowfWlzRXh0ZXJpb3JSaW5nT0dDKHQpe3JldHVybiEhdGhpcy5tX2JQb2x5Z29uJiYodGhpcy51cGRhdGVPR0NGbGFnc1Byb3RlY3RlZCgpLCEhKDgmdGhpcy5tX3BhdGhGbGFncy5yZWFkKHQpKSl9aXNFeHRlcmlvclJpbmcodCl7cmV0dXJuIHRoaXMuY2FsY3VsYXRlUmluZ0FyZWEyRCh0KT4wfWNhbGN1bGF0ZVJpbmdBcmVhMkQodCl7cmV0dXJuIHRoaXMubV9iUG9seWdvbj8odGhpcy51cGRhdGVSaW5nQXJlYXMyRFByb3RlY3RlZCgpLHRoaXMubV9jYWNoZWRSaW5nQXJlYXMyRC5yZWFkKHQpKTowfXVwZGF0ZVJpbmdBcmVhczJEUHJvdGVjdGVkKCl7aWYoIXRoaXMuaGFzRGlydHlGbGFnKDEwMjQpKXJldHVybjtjb25zdCB0PXRoaXMuZ2V0UGF0aENvdW50KCk7aWYoMD09PXQpcmV0dXJuIHRoaXMuaGFzRGlydHlGbGFnKDEwMjQpJiYodGhpcy5tX2NhY2hlZEFyZWEyRD0wKSx2b2lkIHRoaXMuc2V0RGlydHlGbGFnUHJvdGVjdGVkKDEwMjQsITEpO2NvbnN0IGU9bmV3IFYodCkscz1uZXcgZnQoMCksbj1uZXcgZnQoMCk7aWYoMCE9PXRoaXMubV9wb2ludENvdW50KXtjb25zdCBpPXRoaXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApO2lmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7Y29uc3QgdD1uZXcgVnMoe3BhcmVudDp0aGlzfSk7Zm9yKHQuc3RyaXBBdHRyaWJ1dGVzKCk7dC5uZXh0UGF0aCgpOyl7bi5yZXNldCgpO2NvbnN0IHI9dC5nZXRQYXRoSW5kZXgoKTtXcyh0aGlzLHIsaSxuKSxqcyh0aGlzLHQsbik7Y29uc3Qgbz0uNSpuLmdldFJlc3VsdCgpO3MuYWRkKG8pLGUud3JpdGUocixvKX19ZWxzZSBmb3IobGV0IHI9MDtyPHQ7cisrKXtuLnJlc2V0KCksV3ModGhpcyxyLGksbik7Y29uc3QgdD0uNSpuLmdldFJlc3VsdCgpO3MuYWRkKHQpLGUud3JpdGUocix0KX19dGhpcy5oYXNEaXJ0eUZsYWcoMTAyNCkmJih0aGlzLm1fY2FjaGVkQXJlYTJEPXMuZ2V0UmVzdWx0KCksdGhpcy5tX2NhY2hlZFJpbmdBcmVhczJEPWUsdGhpcy5zZXREaXJ0eUZsYWdQcm90ZWN0ZWQoMTAyNCwhMSkpfWdldE9HQ1BvbHlnb25Db3VudCgpe2lmKCF0aGlzLm1fYlBvbHlnb24pcmV0dXJuIDA7dGhpcy51cGRhdGVPR0NGbGFnc1Byb3RlY3RlZCgpO2xldCB0PTA7Y29uc3QgZT10aGlzLmdldFBhdGhDb3VudCgpO2ZvcihsZXQgcz0wO3M8ZTtzKyspOCZ0aGlzLm1fcGF0aEZsYWdzLnJlYWQocykmJnQrKztyZXR1cm4gdH1nZXRIYXNoQ29kZUltcGwoKXtyZXR1cm4gcygwKSwwfWVxdWFsc0ltcGwodCl7Y29uc3QgZT10LHM9dGhpcy5nZXRQYXRoQ291bnQoKTtpZihzIT09ZS5nZXRQYXRoQ291bnQoKSlyZXR1cm4hMTtjb25zdCBuPXRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKTtpZihuIT09ZS5oYXNOb25MaW5lYXJTZWdtZW50cygpKXJldHVybiExO2lmKG4pe2lmKHRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZUNvdW50IT09ZS5tX2N1cnZlRGF0YS5tX2N1cnZlQ291bnQpcmV0dXJuITE7aWYodGhpcy5tX2N1cnZlRGF0YS5tX2JlemllckNvdW50IT09ZS5tX2N1cnZlRGF0YS5tX2JlemllckNvdW50KXJldHVybiExfWlmKHRoaXMubV9wYXRocyYmIXRoaXMubV9wYXRocy5lcXVhbHMoZS5tX3BhdGhzLDAscysxKSlyZXR1cm4hMTtpZih0aGlzLm1fYkZpbGxSdWxlIT09ZS5tX2JGaWxsUnVsZSlyZXR1cm4hMTtpZighdGhpcy5tX2JQb2x5Z29uJiZ0aGlzLm1fcGF0aEZsYWdzJiYhdGhpcy5tX3BhdGhGbGFncy5lcXVhbHMoZS5tX3BhdGhGbGFncywwLHMpKXJldHVybiExO2lmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7aWYoIXRoaXMubV9
1jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MuZXF1YWxzKGUubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MsMCx0aGlzLmdldFBvaW50Q291bnQoKSkpcmV0dXJuITE7Zm9yKGxldCB0PTAscz10aGlzLmdldFBvaW50Q291bnQoKTt0PHM7dCsrKXtjb25zdCBzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZCh0KTtpZighVXMuaXNOb25MaW5lYXJTZWdtZW50RmxhZyhzKSljb250aW51ZTtjb25zdCBuPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5yZWFkKHQpLGk9ZS5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlYWQodCkscj1HcyhzKTtmb3IobGV0IHQ9MDt0PHI7dCsrKXtjb25zdCBzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLnJlYWQobit0KSxyPWUubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLnJlYWQoaSt0KTtpZighUHQocyxyKSlyZXR1cm4hMX19fXJldHVybiEwfWVxdWFsc0ltcGxUb2wodCxlKXtjb25zdCBzPXQsbj10aGlzLmdldFBhdGhDb3VudCgpO2lmKG4hPT1zLmdldFBhdGhDb3VudCgpKXJldHVybiExO2NvbnN0IGk9dGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpO2lmKGkhPT1zLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpcmV0dXJuITE7aWYoaSl7aWYodGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlQ291bnQhPT1zLm1fY3VydmVEYXRhLm1fY3VydmVDb3VudClyZXR1cm4hMTtpZih0aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyQ291bnQhPT1zLm1fY3VydmVEYXRhLm1fYmV6aWVyQ291bnQpcmV0dXJuITF9aWYodGhpcy5tX3BhdGhzJiYhdGhpcy5tX3BhdGhzLmVxdWFscyhzLm1fcGF0aHMsMCxuKzEpKXJldHVybiExO2lmKHRoaXMubV9iRmlsbFJ1bGUhPT1zLm1fYkZpbGxSdWxlKXJldHVybiExO2lmKCF0aGlzLm1fYlBvbHlnb24mJnRoaXMubV9wYXRoRmxhZ3MmJiF0aGlzLm1fcGF0aEZsYWdzLmVxdWFscyhzLm1fcGF0aEZsYWdzLDAsbikpcmV0dXJuITE7aWYoIWkpcmV0dXJuITA7aWYoIXRoaXMubV9
1jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MuZXF1YWxzKHMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MsMCx0aGlzLmdldFBvaW50Q291bnQoKSkpcmV0dXJuITE7Y29uc3Qgcj10aGlzLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yKCksbz1zLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yKCk7Zm9yKDtyLm5leHRQYXRoKCk7KXtpZighby5uZXh0UGF0aCgpKXJldHVybiExO2Zvcig7ci5oYXNOZXh0U2VnbWVudCgpOyl7Y29uc3QgdD1yLm5leHRDdXJ2ZSgpLHM9by5uZXh0Q3VydmUoKTtpZighKHQmJnMmJnQuZXF1YWxzKHMsZSkpKXtpZighdCYmIXMpYnJlYWs7cmV0dXJuITF9fX1yZXR1cm4hMH1yZXNlcnZlSW1wbEltcGwodCxlKXt0aGlzLm1fY3VydmVEYXRhJiZ0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzJiYodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZXNpemUodCwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmVzaXplKHQsLTEpLHRoaXMuY2hlY2tDb21wYWN0U2VnbWVudFBhcmFtcygpKX12ZXJpZnlTdHJlYW1zQWZ0ZXJTaXplQ2hhbmdlRXh0cmFJbXBsKCl7dGhpcy5tX3BhdGhzfHwodGhpcy5tX3BhdGhzPUwoMSwwKSx0aGlzLm1fcGF0aEZsYWdzPVIoMSwwKSksdGhpcy5tX2N1cnZlRGF0YSYmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncyYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVzaXplKHRoaXMubV9yZXNlcnZlZFBvaW50Q291bnQsMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlc2l6ZSh0aGlzLm1fcmVzZXJ2ZWRQb2ludENvdW50LC0xKSx0aGlzLmNoZWNrQ29tcGFjdFNlZ21lbnRQYXJhbXMoKSl9Y29weVRvSW1wbCh0LGUpe2NvbnN0IHM9dDtzLm1fYlBhdGhTdGFydGVkPSExLHMubV9iRmlsbFJ1bGU9dGhpcy5tX2JGaWxsUnVsZSx0aGlzLm1fcGF0aHM/cy5tX3BhdGhzPWU/dGhpcy5tX3BhdGhzOnRoaXMubV9wYXRocy5jbG9uZSgpOnMubV9wYXRocz1udWxsLHRoaXMubV9wYXRoRmxhZ3M/cy5tX3BhdGhGbGFncz1lP3RoaXMubV9wYXRoRmxhZ3M6dGhpcy5tX3BhdGhGbGFncy5jbG9uZSgpOnMubV9wYXRoRmxhZ3M9bnVsbCx0aGlzLm1fY3VydmVEYXRhJiYocy5tX2N1cnZlRGF0YXx8KHMubV9jdXJ2ZURhdGE9bmV3IEhzKSxzLm1fY3VydmVEYXRhLmFzc2lnbkNvcHkodGhpcy5tX2N1cnZlRGF0YSkscy5tX2N1cnZlRGF0YS5tX2N1cnZlQ291bnQ9MCxzLnVwZGF0ZUN1cnZlQ291bnRlcih0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVDb3VudCksZXx8KHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleD9zLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXg9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LmNsb25lKCk6cy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4PW51bGwsdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncz9zLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MuY2xvbmUoKTpzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzPW51bGwsdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXM/cy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXM9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMuY2xvbmUoKTpzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcz1udWxsKSkscy5oYXNEaXJ0eUZsYWcoNTEyKXx8KHMubV9jYWNoZWRMZW5ndGgyRD10aGlzLm1fY2FjaGVkTGVuZ3RoMkQpLHMubV9jYWNoZWRSaW5nQXJlYXMyRD1udWxsLHMuaGFzRGlydHlGbGFnKDEwMjQpfHwocy5tX2NhY2hlZEFyZWEyRD10aGlzLm1fY2FjaGVkQXJlYTJELG51bGwhPT10aGlzLm1fY2FjaGVkUmluZ0FyZWFzMkQmJihzLm1fY2FjaGVkUmluZ0FyZWFzMkQ9ZT90aGlzLm1fY2FjaGVkUmluZ0FyZWFzMkQ6dGhpcy5tX2NhY2hlZFJpbmdBcmVhczJELmNsb25lKCkpKX1jYWxjdWxhdGVBcmVhMkQoKXtyZXR1cm4gdGhpcy5tX2JQb2x5Z29uPyh0aGlzLnVwZGF0ZVJpbmdBcmVhczJEUHJvdGVjdGVkKCksdGhpcy5tX2NhY2hlZEFyZWEyRCk6MH1jYWxjdWxhdGVMZW5ndGgyRCgpe2lmKCF0aGlzLmhhc0RpcnR5RmxhZyg1MTIpKXJldHVybiB0aGlzLm1fY2FjaGVkTGVuZ3RoMkQ7Y29uc3QgdD10aGlzLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yKCksZT1uZXcgZnQoMCk7Zm9yKDt0Lm5leHRQYXRoKCk7KWZvcig7dC5oYXNOZXh0U2VnbWVudCgpOyllLmFkZCh0Lm5leHRTZWdtZW50KCkuY2FsY3VsYXRlTGVuZ3RoMkQoKSk7cmV0dXJuIHRoaXMuaGFzRGlydHlGbGFnKDUxMikmJih0aGlzLm1fY2FjaGVkTGVuZ3RoMkQ9ZS5nZXRSZXN1bHQoKSksdGhpcy5zZXREaXJ0eUZsYWdQcm90ZWN0ZWQoNTEyLCExKSxlLmdldFJlc3VsdCgpfWNhbGN1bGF0ZVBhdGhMZW5ndGgyRCh0KXtjb25zdCBlPXRoaXMucXVlcnlTZWdtZW50SXRlcmF0b3JBdFZlcnRleCh0aGlzLmdldFBhdGhTdGFydCh0KSkscz1uZXcgZnQoMCk7Zm9yKDtlLmhhc05leHRTZWdtZW50KCk7KXMuYWRkKGUubmV4dFNlZ21lbnQoKS5jYWxjdWxhdGVMZW5ndGgyRCgpKTtyZXR1cm4gcy5nZXRSZXN1bHQoKX1jYWxjdWxhdGVMZW5ndGgzRCh0KXtyZXR1cm4gcygwKSwwfWNhbGN1bGF0ZVBhdGhMZW5ndGgzRCh0LGUpe3JldHVybiBzKDApLDB9Y29weVRvKHQpe2ModC5nZXRHZW9tZXRyeVR5cGUoKSl8fGUoXCJcIiksdGhpcyE9PXQmJnN1cGVyLmNvcHlUbyh0KX1zd2FwKHQpe3MoMCl9c2V0UG9pbnRCeVZhbCh0LGUpe3RoaXMuc2V0UG9pbnRCeVZhbFdpdGhDdXJ2ZXModCxlKX1zZXRQb2ludEJ5VmFsV2l0aEN1cnZlcyh0LGUpe2lmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7Y29uc3Qgcz1lLmdldFhZKCk7aWYodGhpcy5zZXRYWUNvb3Jkc1dpdGhDdXJ2ZXModCxzLngscy55KSwxPT09dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCkpcmV0dXJufXRoaXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKHQsZSl9c2V0WFlDb29yZHNXaXRoQ3VydmVzKHQsZSxzKXtpZih0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpe2NvbnN0IG49VXMuZ2V0UGF0aEluZGV4RnJvbVBvaW50SW5kZXhJbXBsKHRoaXMubV9wYXRocyx0aGlzLmdldFBhdGhDb3VudCgpLHQsdGhpcy5tX2N1cnJlbnRQYXRoSW5kZXgpO3RoaXMubV9
1jdXJyZW50UGF0aEluZGV4PW47Y29uc3QgaT10aGlzLmdldFByZXZTZWdtZW50VHlwZUZyb21QYXRoKG4sdCkscj10aGlzLmdldE5leHRTZWdtZW50VHlwZSh0KTtpZigxIT09aXx8MSE9PXIpe2xldCBvPXQtMTtjb25zdCBhPW5ldyBQbTtpZigxIT09aSl7aWYodGhpcy5pc0Nsb3NlZFBhdGgobikmJnQ9PT10aGlzLmdldFBhdGhTdGFydChuKSl7bz10aGlzLmdldFBhdGhFbmQobiktMX10aGlzLmdldFNlZ21lbnRCdWZmZXIobyxhLCEwKX1jb25zdCBoPW5ldyBQbTsxIT09ciYmdGhpcy5nZXRTZWdtZW50QnVmZmVyKHQsaCwhMCk7Y29uc3QgdT10KzE7dGhpcy5zZXRYWUNvb3Jkc05vQ3VydmVzKHQsZSxzKTtjb25zdCBtPW5ldyBKKGUscyk7cmV0dXJuIDEhPT1pJiYoYS5nZXQoKS5jaGFuZ2VFbmRQb2ludHMyRChhLmdldCgpLmdldFN0YXJ0WFkoKSxtKSx0aGlzLnJlcGxhY2VTZWdtZW50SW1wbChvLHQsYS5nZXQoKSwhMCkpLHZvaWQoMSE9PXImJihoLmdldCgpLmNoYW5nZUVuZFBvaW50czJEKG0saC5nZXQoKS5nZXRFbmRYWSgpKSx0aGlzLnJlcGxhY2VTZWdtZW50SW1wbCh0LHUsaC5nZXQoKSwhMCkpKX19dGhpcy5zZXRYWUNvb3Jkc05vQ3VydmVzKHQsZSxzKX1zZXRYWVpXaXRoQ3VydmVzKHQsZSl7dGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpPyh0aGlzLnNldFhZQ29vcmRzV2l0aEN1cnZlcyh0LGUueCxlLnkpLHRoaXMuc2V0QXR0cmlidXRlTm9DdXJ2ZXMoMSx0LDAsZS56KSk6dGhpcy5zZXRYWVpOb0N1cnZlcyh0LGUpfXNldEF0dHJpYnV0ZVdpdGhDdXJ2ZXModCxlLHMsbil7aWYoMD09PXQmJnRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7Y29uc3QgdD10aGlzLmdldFhZKGUpOzA9PT1zP3QueD1uOnQueT1uLHRoaXMuc2V0WFlDb29yZHNXaXRoQ3VydmVzKGUsdC54LHQueSl9ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5vQ3VydmVzKHQsZSxzLG4pfXNldFhZKHQsZSl7dGhpcy5zZXRYWUNvb3Jkc1dpdGhDdXJ2ZXModCxlLngsZS55KX1zZXRYWUNvb3Jkcyh0LGUscyl7dGhpcy5zZXRYWUNvb3Jkc1dpdGhDdXJ2ZXModCxlLHMpfXNldFhZWih0LGUpe3RoaXMuc2V0WFlaV2l0aEN1cnZlcyh0LGUpfXNldEF0dHJpYnV0ZSh0LGUscyxuKXt0aGlzLnNldEF0dHJpYnV0ZVdpdGhDdXJ2ZXModCxlLHMsbil9c2V0QXR0cmlidXRlV2l0aEN1cnZlc0Zyb21BcnJheSh0LGUscyxpKXtpZigwPT09dCYmdGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpKXtpPDImJm4oXCJcIik7Y29uc3QgdD10aGlzLmdldFhZKGUpO3QueD1zWzBdLHQueT1zWzFdLHRoaXMuc2V0WFlDb29yZHNXaXRoQ3VydmVzKGUsdC54LHQueSl9ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZUZyb21BcnJheU5vQ3VydmVzKHQsZSxzLGkpfXNldEF0dHJpYnV0ZUZyb21BcnJheSh0LGUscyxuKXt0aGlzLnNldEF0dHJpYnV0ZVdpdGhDdXJ2ZXNGcm9tQXJyYXkodCxlLHMsbil9aGFzTm9uTGluZWFyU2VnbWVudHMoKXtyZXR1cm4gMCE9PXRoaXMuZ2V0Q3VydmVDb3VudCgpfWdldFNlZ21lbnRDb3VudCgpe2xldCB0PXRoaXMuZ2V0UG9pbnRDb3VudCgpO2lmKCF0aGlzLm1fYlBvbHlnb24pe3QtPXRoaXMuZ2V0UGF0aENvdW50KCk7Zm9yKGxldCBlPTAscz10aGlzLmdldFBhdGhDb3VudCgpO2U8cztlKyspdGhpcy5pc0Nsb3NlZFBhdGgoZSkmJnQrK31yZXR1cm4gdH1nZXRTZWdtZW50Q291bnRQYXRoKHQpe2xldCBlPXRoaXMuZ2V0UGF0aFNpemUodCk7cmV0dXJuIXRoaXMuaXNDbG9zZWRQYXRoKHQpJiZlPjAmJmUtLSxlfWFkZCh0LHMpe3RoaXM9PT10JiZlKFwiTXVsdGlfcGF0aF9pbXBsOjphZGRcIik7Zm9yKGxldCBlPTAsbj10LmdldFBhdGhDb3VudCgpO2U8bjtlKyspdGhpcy5hZGRQYXRoKHQsZSwhcyl9YWRkUGF0aCh0LGUscyl7dGhpcy5pbnNlcnRQYXRoKC0xLHQsZSxzKX1hZGRQYXRoUG9pbnQyRCh0LGUscyl7dGhpcy5pbnNlcnRQYXRoMkQoLTEsdCwwLGUscyl9YWRkUGF0aE11bHRpUG9pbnQodCxlLHMsbil7czwwJiYocz10LmdldFBvaW50Q291bnQoKS1lKSx0aGlzLmluc2VydFBvaW50c0Zyb21NdWx0aXBvaW50KC0xLDAsdCxlLHMsbil9YWRkU2VnbWVudHNGcm9tUGF0aCh0LHMsaSxyLG8pe2lmKHRoaXM9PT10JiZlKFwiTXVsdGlfcGF0aF9pbXBsLmFkZF9zZWdtZW50c19mcm9tX3BhdGhcIiksb3x8MCE9PXRoaXMuZ2V0UGF0aENvdW50KCl8fChvPSEwKSxzPDAmJihzPXQuZ2V0UGF0aENvdW50KCktMSksKHM+PXQuZ2V0UGF0aENvdW50KCl8fGk8MHx8cjwwfHxpK3I+dC5nZXRTZWdtZW50Q291bnRQYXRoKHMpKSYmbihcImFkZF9zZWdtZW50c19mcm9tX3BhdGhcIiksMD09PXIpcmV0dXJuO2NvbnN0IGE9dC5nZXRQYXRoU3RhcnQocyksaD10LmlzQ2xvc2VkUGF0aChzKSYmaStyPT09dC5nZXRTZWdtZW50Q291bnRQYXRoKHMpO3RoaXMubV9iUGF0aFN0YXJ0ZWQ9ITEsdGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKHQuZ2V0RGVzY3JpcHRpb24oKSk7bGV0IHU9cjtjb25zdCBtPWEraTtsZXQgbD1tKzE7byYmKHUrKyxsLS0pLCFvJiZ0Lmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJjEhPT10Lm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQobSkmJih0LmdldFhZKG0pLmVxdWFscyh0aGlzLmdldFhZKHRoaXMubV9wb2ludENvdW50LTEpKXx8ZShcImFkZF9zZWdtZW50c19mcm9tX3BhdGg6IHN0YXJ0IHBvaW50IG1pc21hdGNoXCIpKTtjb25zdCBjPXRoaXMubV9wb2ludENvdW50O2lmKHRoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCt1KSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKSxvKXtpZigwPT09dSlyZXR1cm47dGhpcy5tX3BhdGhzLmFkZCh0aGlzLm1fcG9pbnRDb3VudCk7bGV0IGU9dC5tX3BhdGhGbGFncy5yZWFkKHMpO3RoaXMubV9iUG9seWdvbiYmKGV8PTEpLHRoaXMubV9wYXRoRmxhZ3Mud3JpdGUodGhpcy5tX3BhdGhGbGFncy5zaXplKCktMSxlKSx0aGlzLm1fcGF0aEZsYWdzLmFkZCgwKX1lbHNlIHRoaXMubV9wYXRocy53cml0ZSh0aGlzLm1fcGF0aEZsYWdzLnNpemUoKS0xLHRoaXMubV9wb2ludENvdW50KTtjb25zdCBnPWg/dS0xOnU7Zm9yKGxldCBlPTAsbj10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlQ291bnQoKTtlPG47ZSsrKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksbj1acy5nZXRDb21wb25lbnRDb3VudChzKSxpPXQubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVJbmRleChzKTtpZihnPjApe2lmKGk8MHx8IXQubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChpKSl7Y29uc3QgdD1acy5nZXREZWZhdWx0VmFsdWUocyk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLmluc2VydFJhbmdlKG4qYyx0LGcqbixuKmMpLGgmJnRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChl
1KS5pbnNlcnRSYW5nZShuKmMrZypuLHQsbixuKmMpO2NvbnRpbnVlfXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5pbnNlcnRSYW5nZUZyb21TdHJlYW0obipjLHQubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChpKSxuKmwsZypuLCEwLG4sbipjKX1oJiZ0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0UmFuZ2VGcm9tU3RyZWFtKG4qKGMrZyksdC5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGkpLG4qYSxuLCEwLG4sbiooYytnKSl9aWYodGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpJiZ0aGlzLmluaXRTZWdtZW50RGF0YSgwKSx0Lmhhc05vbkxpbmVhclNlZ21lbnRzKCkpe2xldCBlPTA7Zm9yKGxldCBzPTAsbj1tO3M8cjtzKyspe2UrPUdzKHQubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChuKSksbisrfWlmKGU+MCl7dGhpcy5pbml0U2VnbWVudERhdGEoZSk7bGV0IHM9bSxuPWMtKG8/MDoxKSxpPTA7Zm9yKGxldCBlPTA7ZTxyO2UrKyl7Y29uc3QgZT10Lm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQocyk7aWYodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy53cml0ZShuLGUpLFVzLmlzTm9uTGluZWFyU2VnbWVudEZsYWcoZSkpe2krKztsZXQgcj10Lm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmVhZChzKTtjb25zdCBvPUdzKGUpO3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC53cml0ZShuLHRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludCk7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3QgZT10Lm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5yZWFkKHIpO3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLndyaXRlKHRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludCxlKSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQrKyxyKyt9dGhpcy5pbmNDdXJ2ZVR5cGUoZSwxKX1lbHNlIHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC53cml0ZShuLC0xKTtuKysscysrfXRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKGkpfX1pZihoKXtjb25zdCB0PXRoaXMuZ2V0UGF0aENvdW50KCktMSxlPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLHM9dGhpcy5nZXRQYXRoRW5kKHQpLTEsbj10aGlzLmdldFhZKGUpLGk9dGhpcy5nZXRYWShzKTtuLmlzRXF1YWxQb2ludDJEKGkpJiYoLS10aGlzLm1fcG9pbnRDb3VudCx0aGlzLm1fcGF0aHMud3JpdGUodCsxLHRoaXMubV9wb2ludENvdW50KSl9dGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfXJldmVyc2VBbGxQYXRocygpe2ZvcihsZXQgdD0wLGU9dGhpcy5nZXRQYXRoQ291bnQoKTt0PGU7dCsrKXRoaXMucmV2ZXJzZVBhdGgodCl9cmV2ZXJzZVBhdGgodCl7dD49dGhpcy5nZXRQYXRoQ291bnQoKSYmZShcIlwiKTtjb25zdCBzPXRoaXMuZ2V0UGF0aFNpemUodCk7aWYoMD09PXMpcmV0dXJuO2NvbnN0IG49dGhpcy5nZXRQYXRoU3RhcnQodCksaT10aGlzLmlzQ2xvc2VkUGF0aCh0KTtpZih0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpe2xldCB0PW47Y29uc3QgZT1uZXcgdGhpcy5tX3NlZ21lbnRCdWZmZXJDVG9yO2xldCByPSExO2ZvcihsZXQgbj0wO248cztuKyssdCsrKXtjb25zdCBzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZCh0KTtpZighVXMuaXNOb25MaW5lYXJTZWdtZW50RmxhZyhzKSljb250aW51ZTtyPSEwLHRoaXMucXVlcnlTZWdtZW50KHQsZSwhMCksZS5nZXQoKS5yZXZlcnNlKCk7Y29uc3Qgbj10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmVhZCh0KTtlLmdldCgpLndyaXRlSW5CdWZmZXJTdHJlYW0odGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMsbil9aWYocil7Y29uc3QgdD1pPzA6MTt0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJldmVyc2VSYW5nZShuLHMtdCwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmV2ZXJzZVJhbmdlKG4scy10LDEpfX1jb25zdCByPWk/MTowO2ZvcihsZXQgZT0wLGE9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxhO2UrKylpZih0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkpe2NvbnN0IHQ9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhlKSxpPVpzLmdldENvbXBvbmVudENvdW50KHQpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChlKS5yZXZlcnNlUmFuZ2UoaSoobityKSxpKihzLXIpLGkpfWNvbnN0IG89NiZ0aGlzLm1fcGF0aEZsYWdzLnJlYWQodCk7aWYobyl7bGV0IGU9MDs0Jm8mJihlfD0yKSwyJm8mJihlfD00KSx0aGlzLm1fcGF0aEZsYWdzLmNsZWFyQml0cyh0LDYpLHRoaXMubV9wYXRoRmxhZ3Muc2V0Qml0cyh0LGUpfXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygxMjMzKX1yZW1vdmVQYXRoKHQpe2NvbnN0IHM9dGhpcy5nZXRQYXRoQ291bnQoKTt0PDAmJih0PXMtMSksdD49cyYmZShcIlwiKTtjb25zdCBuPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLGk9dGhpcy5nZXRQYXRoU2l6ZSh0KTtmb3IobGV0IGU9MCxyPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO2U8cjtlKyspaWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpKXtjb25zdCB0PXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSkscz1acy5nZXRDb21wb25lbnRDb3VudCh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuZXJhc2VSYW5nZShzKm4scyppLHMqdGhpcy5tX3BvaW50Q291bnQpfWlmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7bGV0IHQ9MDtmb3IobGV0IGU9bixzPW4raTtlPHM7ZSsrKXtjb25zdCBzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChlKTtVcy5pc05vbkxpbmVhclNlZ21lbnRGbGFnKHMpJiYodGhpcy5pbmNDdXJ2ZVR5cGUocywtMSksdCsrKX10aGlzLm1vZGlmeUN1cnZlQ291bnRlcigtdCksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5lcmFzZVJhbmdlKG4saSx0aGlzLm1fcG9pbnRDb3VudCksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LmVyYXNlUmFuZ2UobixpLHRoaXMubV9wb2ludENvdW50KX1mb3IobGV0IGU9dCsxO2U8PXM7ZSsrKXtjb25zdCB0PXRoaXMubV9wYXRocy5yZWFkKGUpO3RoaXMubV9wYXRocy53cml0ZShlLTEsdC1pKX1pZih0aGlzLm1fcGF0aEZsYWdzKWZvcihsZXQgZT10KzE7ZTw9cztlKyspe2NvbnN0IHQ9dGhpcy5tX3BhdGhGbGFncy5yZWFkKGUpO3RoaXMubV9wYXRoRmxhZ3Mud3JpdGUoZS0xLHQpfXRoaXMubV9wYXRocy5yZXNpemUocyksdGhpcy5tX3BhdGhGbGFncy5yZXNpemUocyksdGhpcy5tX3BvaW50Q291bnQtPWksdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudC09aSx0PT09cy0xJiYodGhpcy5tX2JQYXRoU3RhcnRlZD0hMSksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpLHRoaXMuY2hlY2tDb21wYWN0U2VnbWVudFBhcmFtcygpLHRoaXMuZGJnVmVyaWZ5Q3VydmVzKCl9ZGJnVmVyaWZ5Q3VydmVzKCl7fWluc2VydFBhdGgodCxzLG4saSl7dGhpcz09PXMmJmUoXCJNdWx0aV9wYXRoX2ltcGw6Omluc2VydF9wYXRoXCIpO2NvbnN0IHI9dGhpcy5nZXRQYXRoQ291bnQoKTtpZighaSYmcy5oYXNOb25MaW5lYXJTZWdtZW50c1BhdGgobikpcmV0dXJuIHQ9dGhpcy5pbnNlcnRQYXRoKHQscyxuLCEwKSx0aGlzLnJldmVyc2VQYXRoKHQpLHQ7bj49cy5nZXRQYXRoQ291bnQoKSYmZShcIlwiKSx0PnImJmUoXCJcIiksdDwwJiYodD1yKSxuPDAmJihuPXMuZ2V0UGF0aENvdW50KCktMSksdGhpcy5tX2JQYXRoU3RhcnRlZD0hMSx0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24ocy5nZXREZXNjcmlwdGlvbigpKTtjb25zdCBvPXMuZ2V0UGF0aFN0YXJ0KG4pLGE9cy5nZXRQYXRoU2l6ZShuKTtpZigwPT09YSlyZXR1cm4gdGhpcy5pbnNlcnRQYXRoMkQodCxudWxsLDAsMCwhMCk7Y29uc3QgaD10aGlzLm1fcG9pbnRDb3VudCx1PXMuaXNDbG9zZWRQYXRoKG4pJiYhaT8xOjA7dGhpcy5yZXNpemVJbXBsKHRoaXMubV9wb2ludENvdW50K2EpLHRoaXMudmVyaWZ5QWxsU3RyZWFtc0FmdGVyU2l6ZUNoYW5nZSgpO2NvbnN0IG09dDxyP3RoaXMuZ2V0UGF0aFN0YXJ0KHQpOmg7Zm9yKGxldCBlPTAsZz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlQ291bnQoKTtlPGc7ZSsrKXtjb25zdCB0PXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksbj1zLmdldERlc2NyaXB0aW9uKCkuZ2V0QXR0cmlidXRlSW5kZXgodCkscj1acy5nZXRDb21wb25lbnRDb3VudCh0KTtpZihuPj0wJiZzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQobikpMCE9PXUmJnRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChl
1KS5pbnNlcnRSYW5nZUZyb21TdHJlYW0obSpyLHMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChuKSxyKm8sciwhMCxyLHIqaCksdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLmluc2VydFJhbmdlRnJvbVN0cmVhbSgobSt1KSpyLHMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChuKSxyKihvK3UpLHIqKGEtdSksaSxyLHIqKGgrdSkpO2Vsc2V7Y29uc3Qgcz1acy5nZXREZWZhdWx0VmFsdWUodCk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLmluc2VydFJhbmdlKG0qcixzLHIqYSxyKmgpfX1jb25zdCBsPWgrYTt0aGlzLm1fcGF0aHMuYWRkKGwpO2ZvcihsZXQgZT1yO2U+PXQrMTtlLS0pe2NvbnN0IHQ9dGhpcy5tX3BhdGhzLnJlYWQoZS0xKTt0aGlzLm1fcGF0aHMud3JpdGUoZSx0K2EpfXRoaXMubV9wYXRoRmxhZ3MuYWRkKDApO2ZvcihsZXQgZT1yLTE7ZT49dCsxO2UtLSl7bGV0IHQ9dGhpcy5tX3BhdGhGbGFncy5yZWFkKGUpO3QmPS05LHRoaXMubV9wYXRoRmxhZ3Mud3JpdGUoZSsxLHQpfWxldCBjPXMuZ2V0UGF0aEZsYWdzU3RyZWFtUmVmKCkucmVhZChuKTtpZihjJj0tOSx0aGlzLm1fYlBvbHlnb24mJihjfD0xKSx0aGlzLm1fcGF0aEZsYWdzLndyaXRlKHQsYykscy5oYXNOb25MaW5lYXJTZWdtZW50cygpKXt0aGlzLmluaXRTZWdtZW50RGF0YSgwKTtsZXQgdD1vLGU9MDtmb3IobGV0IG49MDtuPGE7bisrKXtlKz1HcyhzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQodCkpLHQrK31pZihlPjApe251bGw9PT10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzPyh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzPVIodGhpcy5tX3BvaW50Q291bnQsMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4PUwodGhpcy5tX3BvaW50Q291bnQsLTEpKToodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5pbnNlcnRSYW5nZShtLDEsYSxoKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXguaW5zZXJ0UmFuZ2UobSwtMSxhLGgpKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcz90aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5yZXNpemUodGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50K2UpOnRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zPXooZSksdD1vO2xldCBuPW0saT0wO2ZvcihsZXQgZT0wO2U8YTtlKyspe2NvbnN0IGU9cy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKHQpO2lmKFVzLmlzTm9uTGluZWFyU2VnbWVudEZsYWcoZSkpe3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUobixlKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUobix0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQpO2NvbnN0IHI9R3MoZSk7bGV0IG89cy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlYWQodCk7Zm9yKGxldCB0PTA7dDxyO3QrKyl7Y29uc3QgdD1zLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5yZWFkKG8pO3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLndyaXRlKHRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludCx0KSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQrKyxvKyt9aSsrLHRoaXMuaW5jQ3VydmVUeXBlKGUsMSl9dCsrLG4rK310aGlzLm1vZGlmeUN1cnZlQ291bnRlcihpKX19cmV0dXJuIHRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKSx0fWluc2VydFBhdGgyRCh0LHMsbixpLHIpe2NvbnN0IG89dGhpcy5nZXRQYXRoQ291bnQoKTsodD5vfHxuPDApJiZlKFwiXCIpLHQ8MCYmKHQ9byksdGhpcy5tX2JQYXRoU3RhcnRlZD0hMTtjb25zdCBhPXRoaXMubV9wb2ludENvdW50O3RoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCtpKSwwPT09aSYmdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDMyKSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKTtjb25zdCBoPXQ8bz90aGlzLmdldFBhdGhTdGFydCh0KTphO2lmKHMpdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApLmluc2VydFJhbmdlRnJvbVBvaW50cygyKmgscyxuLGksciwyKmEpO2Vsc2V7Y29uc3QgdD1acy5nZXREZWZhdWx0VmFsdWUoMCk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KDApLmluc2VydFJhbmdlKDIqaCx0LDIqaSwyKmEpfWZvcihsZXQgZT0xLHU9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTx1O2UrKyl7Y29uc3QgdD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLHM9WnMuZ2V0Q29tcG9uZW50Q291bnQodCksbj1acy5nZXREZWZhdWx0VmFsdWUodCk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpLmluc2VydFJhbmdlKGgqcyxuLHMqaSxzKmEpfXRoaXMubV9wYXRocy5hZGQodGhpcy5tX3BvaW50Q291bnQpO2ZvcihsZXQgZT1vO2U+PXQrMTtlLS0pe2NvbnN0IHQ9dGhpcy5tX3BhdGhzLnJlYWQoZS0xKTt0aGlzLm1fcGF0aHMud3JpdGUoZSx0K2kpfXRoaXMubV9wYXRoRmxhZ3MuYWRkKDApO2ZvcihsZXQgZT1vLTE7ZT49dCsxO2UtLSl7bGV0IHQ9dGhpcy5tX3BhdGhGbGFncy5yZWFkKGUpO3QmPS05LHRoaXMubV9wYXRoRmxhZ3Mud3JpdGUoZSsxLHQpfXJldHVybiB0aGlzLm1fYlBvbHlnb24mJnRoaXMubV9wYXRoRmxhZ3Mud3JpdGUodCwxKSx0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLmluc2VydFJhbmdlKGgsMSxpLGEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5pbnNlcnRSYW5nZShoLC0xLGksYSkpLHRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKSx0fWluc2VydFBhdGhGcm9tTXVsdGlwb2ludCh0LHMsbixpLHIpe2NvbnN0IG89cy5nZXRJbXBsKCksYT10aGlzLmdldFBhdGhDb3VudCgpOyh0PmF8fG48MCkmJmUoXCJcIik7Y29uc3QgaD1pPDA/by5nZXRQb2ludENvdW50KCktbjppO2lmKGg+by5nZXRQb2ludENvdW50KCkmJmUoXCJcIiksbj49by5nZXRQb2ludENvdW50KCkmJmUoXCJwb2ludHNPZmZzZXRcIiksdDwwJiYodD1hKSx0aGlzLm1fYlBhdGhTdGFydGVkPSExLHRoaXMubWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbihvLmdldERlc2NyaXB0aW9uKCkpLDA9PT1oKXJldHVybi
1B2b2lkIHRoaXMuaW5zZXJ0UGF0aDJEKHQsbnVsbCwwLDAsITApO2NvbnN0IHU9dGhpcy5tX3BvaW50Q291bnQsbT1uO3RoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCtoKSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKTtjb25zdCBsPXQ8YT90aGlzLmdldFBhdGhTdGFydCh0KTp1O2ZvcihsZXQgZT0wLGQ9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxkO2UrKyl7Y29uc3QgdD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLHM9by5nZXREZXNjcmlwdGlvbigpLmdldEF0dHJpYnV0ZUluZGV4KHQpLG49WnMuZ2V0Q29tcG9uZW50Q291bnQodCk7aWYocz49MCl7Y29uc3Qgcz1vLmdldEF0dHJpYnV0ZVN0cmVhbVJlZih0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0UmFuZ2VGcm9tU3RyZWFtKGwqbixzLG4qbSxuKmgscixuLG4qdSl9ZWxzZXtjb25zdCBzPVpzLmdldERlZmF1bHRWYWx1ZSh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0UmFuZ2UobCpuLHMsbipoLG4qdSl9fWNvbnN0IGM9dStoO3RoaXMubV9wYXRocy5hZGQoYyk7Zm9yKGxldCBlPWE7ZT49dCsxO2UtLSl7Y29uc3QgdD10aGlzLm1fcGF0aHMucmVhZChlLTEpO3RoaXMubV9wYXRocy53cml0ZShlLHQraCl9dGhpcy5tX3BhdGhGbGFncy5hZGQoMCk7Zm9yKGxldCBlPWEtMTtlPj10KzE7ZS0tKXtsZXQgdD10aGlzLm1fcGF0aEZsYWdzLnJlYWQoZSk7dCY9LTksdGhpcy5tX3BhdGhGbGFncy53cml0ZShlKzEsdCl9bGV0IGc9MDt0aGlzLm1fYlBvbHlnb24mJihnfD0xKSx0aGlzLm1fcGF0aEZsYWdzLndyaXRlKHQsZyksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWluc2VydFBvaW50cyh0LHMsaSxyLG8sYSxoKXtpZih0aGlzPT09aSYmZShcIk11bHRpX3BhdGhfaW1wbC5pbnNlcnRfcG9pbnRzXCIpLHQ8MCYmKHQ9dGhpcy5nZXRQYXRoQ291bnQoKSkscjwwJiYocj1pLmdldFBhdGhDb3VudCgpLTEpLCh0PnRoaXMuZ2V0UGF0aENvdW50KCl8fHM+PTAmJnM+dGhpcy5nZXRQYXRoU2l6ZSh0KXx8cj49aS5nZXRQYXRoQ291bnQoKXx8YT5pLmdldFBhdGhTaXplKHIpKSYmbihcIlwiKSwhYSlyZXR1cm47aWYodGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKGkubV9kZXNjcmlwdGlvbiksdD09PXRoaXMuZ2V0UGF0aENvdW50KCkpe3RoaXMubV9wYXRocy5hZGQodGhpcy5tX3BvaW50Q291bnQpO2xldCB0PWkubV9wYXRoRmxhZ3MucmVhZChyKTt0Jj0tOSx0aGlzLm1fYlBvbHlnb24/dGhpcy5tX3BhdGhGbGFncy5hZGQoMXx0KTp0aGlzLm1fcGF0aEZsYWdzLmFkZCh0KX1zPDAmJihzPXRoaXMuZ2V0UGF0aFNpemUodCkpO2NvbnN0IHU9dGhpcy5tX3BvaW50Q291bnQ7dGhpcy5yZXNpemVJbXBsKHRoaXMubV9wb2ludENvdW50K2EpLHRoaXMudmVyaWZ5QWxsU3RyZWFtc0FmdGVyU2l6ZUNoYW5nZSgpO2NvbnN0IG09dGhpcy5nZXRQYXRoU3RhcnQodCksbD1tK3M7YTwwJiYoYT1pLmdldFBhdGhTaXplKHIpKTtjb25zdCBjPWkuZ2V0UGF0aFN0YXJ0KHIpLGc9YythO2ZvcihsZXQgZT0wLG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7ZTxuO2UrKyl7Y29uc3QgdD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLG49WnMuZ2V0Q29tcG9uZW50Q291bnQodCkscj1pLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlSW5kZXgodCk7aWYocjwwfHwhaS5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHIpKXtjb25zdCBzPVpzLmdldERlZmF1bHRWYWx1ZSh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoZSkuaW5zZXJ0UmFuZ2UobipsLHMsZypuLG4qdSk7Y29udGludWV9dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KGUpPy5pbnNlcnRSYW5nZUZyb21TdHJlYW0obioobStzKSxpLm1fdmVydGV4QXR0cmlidXRlcy5nZXQociksbiooYytvKSxhKm4saCxuLG4qdSl9dGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpJiYodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5pbnNlcnRSYW5nZShtK3MsMSxhLHUpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5pbnNlcnRSYW5nZShtK3MsLTEsYSx1KSxzPjAmJnRoaXMuaXNOb25MaW5lYXJTZWdtZW50KG0rcy0xKSYmKHRoaXMuaW5jQ3VydmVUeXBlKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChtK3MtMSksLTEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUobStzLTEsMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LndyaXRlKG0rcy0xLC0xKSx0aGlzLm1vZGlmeUN1cnZlQ291bnRlcigtMSkpKTtmb3IobGV0IGU9dCsxLG49dGhpcy5nZXRQYXRoQ291bnQoKTtlPD1uO2UrKyl7Y29uc3QgdD10aGlzLm1fcGF0aHMucmVhZChlKTt0aGlzLm1fcGF0aHMud3JpdGUoZSx0K2EpfXRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1pbnNlcnRQb2ludHNGcm9tUG9pbnRzKHQsZSxzLGkscixvKXtpZih0PDAmJih0PXRoaXMuZ2V0UGF0aENvdW50KCkpLCh0PnRoaXMuZ2V0UGF0aENvdW50KCl8fGU+dGhpcy5nZXRQYXRoU2l6ZSh0KXx8aTwwKSYmbihcIlwiKSwhcilyZXR1cm47dD09PXRoaXMuZ2V0UGF0aENvdW50KCkmJih0aGlzLm1fcGF0aHMuYWRkKHRoaXMubV9wb2ludENvdW50KSx0aGlzLm1fYlBvbHlnb24/dGhpcy5tX3BhdGhGbGFncy5hZGQoMSk6dGhpcy5tX3BhdGhGbGFncy5hZGQoMCkpLGU8MCYmKGU9dGhpcy5nZXRQYXRoU2l6ZSh0KSk7Y29uc3QgYT10aGlzLm1fcG9pbnRDb3VudDt0aGlzLnJlc2l6ZUltcGwodGhpcy5tX3BvaW50Q291bnQrciksdGhpcy52ZXJpZnlBbGxTdHJlYW1zQWZ0ZXJTaXplQ2hhbmdlKCk7Y29uc3QgaD10aGlzLmdldFBhdGhTdGFydCh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCkuaW5zZXJ0UmFuZ2VGcm9tUG9pbnRzKDIqKGgrZSkscyxpLHIsbywyKmEpO2ZvcihsZXQgbj0xLHU9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7bjx1O24rKyl7Y29uc3QgdD10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKG4pLHM9WnMuZ2V0Q29tcG9uZW50Q291bnQodCksaT1acy5nZXREZWZhdWx0VmFsdWUodCk7dGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG4pLmluc2VydFJhbmdlKChoK2UpKnMsaSxzKnIscyphKX10aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLmluc2VydFJhbmdlKGgrZSwxLHIsYSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4Lmluc2VydFJhbmdlKGgrZSwtMSxyLGEpLGU+MCYmdGhpcy5pc05vbkxpbmVhclNlZ21lbnQoaCtlLTEpJiYodGhpcy5pbmNDdXJ2ZVR5cGUodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKGgrZS0xKSwtMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy53cml0ZShoK2UtMSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUoaCtlLTEsLTEpLHRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKC0xKSkpO2ZvcihsZXQgbj10KzEsdT10aGlzLmdldFBhdGhDb3VudCgpO248PXU7bisrKXRoaXMubV9wYXRocy53cml0ZShuLHRoaXMubV9wYXRocy5yZWFkKG4pK3IpO3RoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1pbnNlcnRQb2ludHNGcm9tTXVsdGlwb2ludCh0LGUscyxpLHIsbyl7Y29uc3QgYT1zLmdldEltcGwoKSxoPXRoaXMuZ2V0UGF0aENvdW50KCk7dDwwJiYodD10aGlzLmdldFBhdGhDb3VudCgpKTtjb25zdCB1PWEuZ2V0UG9pbnRDb3VudCgpO2lmKChpPDB8fGk+dSkmJm4oXCJcIiksKHI8MHx8aStyPnUpJiYocj11LWkpLGU8MCYmKGU9dDxoP3RoaXMuZ2V0UGF0aFNpemUodCk6MCksKHQ+aHx8dDxoJiZlPnRoaXMuZ2V0UGF0aFNpemUodCl8fHQ9PT1oJiZlPjB8fHI8MCkmJm4oXCJcIiksIXIpcmV0dXJuO2lmKHRoaXMubWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbihhLmdldERlc2NyaXB0aW9uKCkpLHQ9PT1oKXt0aGlzLm1fcGF0aHMuYWRkKHRoaXMubV9wb2ludENvdW50KTtjb25zdCB0PTA7dGhpcy5tX2JQb2x5Z29uP3RoaXMubV9wYXRoRmxhZ3MuYWRkKDF8dCk6dGhpcy5tX3BhdGhGbGFncy5hZGQodCl9ZTwwJiYoZT10aGlzLmdldFBhdGhTaXplKHQpKTtjb25zdCBtPXRoaXMubV9wb2ludENvdW50O3RoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCtyKSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKTtjb25zdCBsPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLGM9bCtlLGc9MCxkPWcrcjtmb3IobGV0IG49MCxfPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO248XztuKyspe2NvbnN0IHQ9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhuKSxzPVpzLmdldENvbXBvbmVudENvdW50KHQpO2lmKGEuZ2V0RGVzY3JpcHRpb24oKS5nZXRBdHRyaWJ1dGVJbmRleCh0KTwwKXtjb25zdCBlPVpzLmdldERlZmF1bHRWYWx1ZSh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQobikuaW5zZXJ0UmFuZ2UocypjLGUsZCpzLHMqbSk7Y29udGludWV9Y29uc3QgaD1hLmdldEF0dHJpYnV0ZVN0cmVhbVJlZih0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQobikuaW5zZXJ0UmFuZ2VGcm9tU3RyZWFtKHMqKGwrZSksaCxzKihnK2kpLHIqcyxvLHMscyptKX10aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLmluc2VydFJhbmdlKGwrZSwxLHIsbSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4Lmluc2VydFJhbmdlKGwrZSwtMSxyLG0pLGU+MCYmdGhpcy5pc05vbkxpbmVhclNlZ21lbnQobCtlLTEpJiYodGhpcy5pbmNDdXJ2ZVR5cGUodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKGwrZS0xKSwtMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy53cml0ZShsK2UtMSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUobCtlLTEsLTEpLHRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKC0xKSkpO2ZvcihsZXQgbj10KzEsXz10aGlzLmdldFBhdGhDb3VudCgpO248PV87bisrKXtjb25zdCB0PXRoaXMubV9wYXRocy5yZWFkKG4pO3RoaXMubV9wYXRocy53cml0ZShuLHQrcil9dGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWluc2VydFBvaW50MkQodCxlLHMpe2NvbnN0IGk9dGhpcy5nZXRQYXRoQ291bnQoKTt0PDAmJih0PWkpLCh0Pml8fHQ8aSYmZT50aGlzLmdldFBhdGhTaXplKHQpKSYmbihcIlwiKSx0PT09aSYmdGhpcy5hZGRQYXRoUG9pbnQyRChudWxsLDAsITApO2NvbnN0IHI9dGhpcy5tX3BvaW50Q291bnQ7dGhpcy5yZXNpemVJbXBsKHRoaXMubV9wb2ludENvdW50KzEpLHRoaXMudmVyaWZ5QWxsU3RyZWFtc0FmdGVyU2l6ZUNoYW5nZSgpO2NvbnN0IG89dGhpcy5nZXRQYXRoU3RhcnQodCksYT1lPDA/dGhpcy5nZXRQYXRoU2l6ZSh0KStvOmUrb
1yxoPXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCgwKTtpZihhPT09cil0aGlzLm1fcGF0aHMud3JpdGUodCsxLHIrMSksaC53cml0ZVBvaW50MkQoMiphLHMpO2Vsc2V7aC5pbnNlcnQoMiphLHMsMipyKTtmb3IobGV0IHQ9MSxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3Q8ZTt0Kyspe2NvbnN0IGU9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyh0KSxzPVpzLmdldENvbXBvbmVudENvdW50KGUpLG49WnMuZ2V0RGVmYXVsdFZhbHVlKGUpO3RoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCh0KS5pbnNlcnRSYW5nZShzKmEsbixzLHMqcil9dGhpcy5tX2N1cnZlRGF0YSYmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncyYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MuaW5zZXJ0UmFuZ2UoYSwxLDEsciksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4Lmluc2VydFJhbmdlKGEsLTEsMSxyKSk7Zm9yKGxldCBlPXQrMSxzPWk7ZTw9cztlKyspdGhpcy5tX3BhdGhzLndyaXRlKGUsdGhpcy5tX3BhdGhzLnJlYWQoZSkrMSl9dGhpcy5tX2N1cnZlRGF0YSYmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncyYmYT5vJiZ0aGlzLmlzTm9uTGluZWFyU2VnbWVudChhLTEpJiYodGhpcy5pbmNDdXJ2ZVR5cGUodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKGEtMSksLTEpLHRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKC0xKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLndyaXRlKGEtMSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUoYS0xLC0xKSksdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWluc2VydFBvaW50KHQsZSxzKXtjb25zdCBpPXRoaXMuZ2V0UGF0aENvdW50KCk7dDwwJiYodD1pKSwodD5pfHx0PGkmJmU+dGhpcy5nZXRQYXRoU2l6ZSh0KSkmJm4oXCJcIiksdD09PWkmJnRoaXMuYWRkUGF0aFBvaW50MkQobnVsbCwwLCEwKTtjb25zdCByPXRoaXMubV9wb2ludENvdW50O3RoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCsxKSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKTtjb25zdCBvPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLGE9ZTwwP3RoaXMuZ2V0UGF0aFNpemUodCkrbzplK287aWYoYT09PXIpdGhpcy5tX3BhdGhzLndyaXRlKHQrMSxyKzEpLHRoaXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKGEscyk7ZWxzZXtjb25zdCBlPXMuZ2V0RGVzY3JpcHRpb24oKTt0aGlzLm1fZGVzY3JpcHRpb24hPT1lJiZ0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oZSk7Zm9yKGxldCB0PTAsbj10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlQ291bnQoKTt0PG47dCsrKXtjb25zdCBuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCksaT1acy5nZXRDb21wb25lbnRDb3VudChuKTtpZihlLmhhc0F0dHJpYnV0ZShuKSl0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCkuaW5zZXJ0QXR0cmlidXRlcyhpKmEscyxuLGkqcik7ZWxzZXtjb25zdCBlPVpzLmdldERlZmF1bHRWYWx1ZShuKTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCkuaW5zZXJ0UmFuZ2UoaSphLGUsaSxpKnIpfX10aGlzLm1fY3VydmVEYXRhJiZ0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzJiYodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5pbnNlcnRSYW5nZShhLDEsMSxyKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXguaW5zZXJ0UmFuZ2UoYSwtMSwxLHIpKTtmb3IobGV0IHM9dCsxLG49aTtzPD1uO3MrKyl0aGlzLm1fcGF0aHMud3JpdGUocyx0aGlzLm1fcGF0aHMucmVhZChzKSsxKX10aGlzLm1fY3VydmVEYXRhJiZ0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzJiZhPm8mJnRoaXMuaXNOb25MaW5lYXJTZWdtZW50KGEtMSkmJih0aGlzLmluY0N1cnZlVHlwZSh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQoYS0xKSwtMSksdGhpcy5tb2RpZnlDdXJ2ZUNvdW50ZXIoLTEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUoYS0xLDEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC53cml0ZShhLTEsLTEpKSx0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9cmVtb3ZlUG9pbnRGcm9tUGF0aCh0LGUpe2NvbnN0IHM9dGhpcy5nZXRQYXRoQ291bnQoKTt0PDAmJih0PXMtMSksKHQ+PXN8fGU+PXRoaXMuZ2V0UGF0aFNpemUodCkpJiZuKFwiTXVsdGlfcGF0aC5yZW1vdmVfcG9pbnRcIik7Y29uc3QgaT10aGlzLmdldFBhdGhTdGFydCh0KSxyPXRoaXMuaXNDbG9zZWRQYXRoKHQpO2U8MCYmKGU9dGhpcy5nZXRQYXRoU2l6ZSh0KS0xKSxlPDAmJm4oXCJNdWx0aV9wYXRoLnJlbW92ZV9wb2ludFwiKTtjb25zdCBvPWkrZTtmb3IobGV0IG49MCxhPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO248YTtuKyspaWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KG4pKXtjb25zdCB0PXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MobiksZT1acy5nZXRDb21wb25lbnRDb3VudCh0KTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQobikuZXJhc2VSYW5nZShlKm8sZSxlKnRoaXMubV9wb2ludENvdW50KX1pZih0aGlzLm1fY3VydmVEYXRhJiZ0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzKXt0aGlzLmNoZWNrQ29tcGFjdFNlZ21lbnRQYXJhbXMoKTtsZXQgZT0wO2lmKG8+aSYmdGhpcy5pc05vbkxpbmVhclNlZ21lbnQoby0xKSllKz0xLHRoaXMuaW5jQ3VydmVUeXBlKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChvLTEpLC0xKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLndyaXRlKG8tMSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUoby0xLC0xKTtlbHNle2NvbnN0IHM9dGhpcy5nZXRQYXRoRW5kKHQpO3ImJmkrMTxzJiZ0aGlzLmlzTm9uTGluZWFyU2VnbWVudChzLTEpJiYodGhpcy5pbmNDdXJ2ZVR5cGUodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKHMtMSksLTEpLHRoaXMubV9
1jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUocy0xLDEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC53cml0ZShzLTEsLTEpLGUrPTEpfXRoaXMuaXNOb25MaW5lYXJTZWdtZW50KG8pJiYodGhpcy5pbmNDdXJ2ZVR5cGUodGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKG8pLC0xKSxlKz0xKSxlPjAmJnRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKC1lKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLmVyYXNlUmFuZ2UobywxLHRoaXMubV9wb2ludENvdW50KSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXguZXJhc2VSYW5nZShvLDEsdGhpcy5tX3BvaW50Q291bnQpfWZvcihsZXQgbj1zO24+PXQrMTtuLS0pe2NvbnN0IHQ9dGhpcy5tX3BhdGhzLnJlYWQobik7dGhpcy5tX3BhdGhzLndyaXRlKG4sdC0xKX10aGlzLm1fcG9pbnRDb3VudC0tLHRoaXMubV9yZXNlcnZlZFBvaW50Q291bnQtLSx0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9cmVtb3ZlUG9pbnQodCl7bGV0IGU7ZT10PDA/dGhpcy5nZXRQYXRoQ291bnQoKS0xOnRoaXMuZ2V0UGF0aEluZGV4RnJvbVBvaW50SW5kZXgodCksdGhpcy5yZW1vdmVQb2ludEZyb21QYXRoKGUsdC10aGlzLmdldFBhdGhTdGFydChlKSl9Z2V0TmV4dFNlZ21lbnRUeXBlKHQpe3JldHVybiB0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCk/dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKHQpOjF9Z2V0UHJldlNlZ21lbnRUeXBlRnJvbVBhdGgodCxlKXtpZighdGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpKXJldHVybiAxO2NvbnN0IHM9dGhpcy5nZXRQYXRoU3RhcnQodCk7aWYoZT5zKXJldHVybiB0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQoZS0xKTtpZihlPT09cyl7aWYodGhpcy5pc0Nsb3NlZFBhdGgodCkpe2NvbnN0IGU9dGhpcy5nZXRQYXRoRW5kKHQpO3JldHVybiB0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQoZS0xKX1yZXR1cm4gMX1oKFwiXCIpfWdldE51bWJlck9mQ3VydmVzKHQpe2lmKCF0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpcmV0dXJuIDA7bGV0IGU9MDtmb3IobGV0IHM9dGhpcy5nZXRQYXRoU3RhcnQodCksbj10aGlzLmdldFBhdGhFbmQodCk7czxuO3MrKylVcy5pc05vbkxpbmVhclNlZ21lbnRGbGFnKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChzKSkmJisrZTtyZXR1cm4gZX1nZXRQYXRoQ291bnQoKXtyZXR1cm4gdGhpcy5tX3BhdGhzP3RoaXMubV9wYXRocy5zaXplKCktMTowfWdldFBhdGhTaXplKHQpe3JldHVybiB0aGlzLm1fcGF0aHMucmVhZCh0KzEpLXRoaXMubV9wYXRocy5yZWFkKHQpfWdldFBhdGhTdGFydCh0KXtyZXR1cm4gdGhpcy5tX3BhdGhzLnJlYWQodCl9Z2V0UGF0aEVuZCh0KXtyZXR1cm4gdGhpcy5tX3BhdGhzLnJlYWQodCsxKX1nZXRQYXRoSW5kZXhGcm9tUG9pbnRJbmRleCh0LGU9LTEpey0xPT09ZSYmKGU9dGhpcy5tX2N1cnJlbnRQYXRoSW5kZXgpO2NvbnN0IHM9dGhpcy5nZXRQYXRoQ291bnQoKSxuPVVzLmdldFBhdGhJbmRleEZyb21Qb2ludEluZGV4SW1wbCh0aGlzLm1fcGF0aHMscyx0LGUpO3JldHVybiB0aGlzLm1fY3VycmVudFBhdGhJbmRleD1uLG59c3RhcnRQYXRoQ29vcmRzKHQsZSl7dGhpcy5zdGFydFBhdGhQb2ludChuZXcgRih7eDp0LHk6ZX0pKX1zdGFydFBhdGgodCl7dGhpcy5zdGFydFBhdGhQb2ludChuZXcgRih7cHQ6dH0pKX1zdGFydFBhdGgzRCh0KXt0aGlzLnN0YXJ0UGF0aFBvaW50KG5ldyBGKHt4OnQueCx5OnQueSx6OnQuen0pKX1zdGFydFBhdGgzRENvb3Jkcyh0LGUscyl7dGhpcy5zdGFydFBhdGhQb2ludChuZXcgRih7eDp0LHk6ZSx6OnN9KSl9c3RhcnRQYXRoUG9pbnQodCl7dC5pc0VtcHR5KCkmJmUoXCJcIik7Y29uc3Qgcz10LmdldERlc2NyaXB0aW9uKCk7bGV0IG47aWYodGhpcy5tX2Rlc2NyaXB0aW9uIT09cyl7dGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKHMpO2NvbnN0IGU9bmV3IEYoe3ZkOnRoaXMubV9kZXNjcmlwdGlvbn0pO3QuY29weUNvbW1vbkF0dHJpYnV0ZXNUbyhlKSxuPWV9ZWxzZSBuPXQ7dGhpcy5tX2JQYXRoU3RhcnRlZD90aGlzLnNldFBvaW50QnlWYWxOb0N1cnZlcyh0aGlzLm1fcG9pbnRDb3VudC0xLG4pOih0aGlzLmluc2VydFBvaW50KC0xLC0xLG4pLHRoaXMubV9iUGF0aFN0YXJ0ZWQ9ITApfWJlZm9yZU5ld1NlZ21lbnRIZWxwZXIyKCl7dGhpcy5tX3BhdGhzPUwoMiksdGhpcy5tX3BhdGhzLndyaXRlKDAsMCksdGhpcy5tX3BhdGhGbGFncz1SKDIsMCksdGhpcy5tX2JQb2x5Z29uJiZ0aGlzLm1fcGF0aEZsYWdzLndyaXRlKDAsMSl9YmVmb3JlTmV3U2VnbWVudEhlbHBlcjEoKXtudWxsIT09dGhpcy5tX3BhdGhzPyh0aGlzLm1fcGF0aHMuYWRkKDApLHRoaXMubV9wYXRoRmxhZ3MuYWRkKDApLHRoaXMubV9iUG9seWdvbiYmdGhpcy5tX3BhdGhGbGFncy53cml0ZSh0aGlzLm1fcGF0aEZsYWdzLnNpemUoKS0yLDEpKTp0aGlzLmJlZm9yZU5ld1NlZ21lbnRIZWxwZXIyKCl9YmVmb3JlTmV3U2VnbWVudCh0KXswIT09dGhpcy5tX3BvaW50Q291bnR8fHRoaXMubV9iUGF0aFN0YXJ0ZWR8fHRoaXMuc3RhcnRQYXRoQ29vcmRzKDAsMCk7Y29uc3QgZT10aGlzLm1fcG9pbnRDb3VudCxzPXRoaXMubV9wYXRocy5zaXplKCktMSxuPWUrdDt0aGlzLm1fcGF0aHMud3JpdGUocyxuKSx0aGlzLnJlc2l6ZUltcGwobiksdGhpcy5tX2JQYXRoU3RhcnRlZCYmKHRoaXMubV9iUGF0aFN0YXJ0ZWQ9ITEpfWZpbmlzaExpbmVUbygpe2lmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7Y29uc3QgdD10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQodGhpcy5tX3BvaW50Q291bnQtMSk7MSE9PXQmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLndyaXRlKHRoaXMubV9wb2ludENvdW50LTEsMSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LndyaXRlKHRoaXMubV9wb2ludENvdW50LTEsLTEpLHRoaXMubW9kaWZ5Q3VydmVDb3VudGVyKC0xKSx0aGlzLmluY0N1cnZlVHlwZSh0LC0xKSl9fWxpbmVUb0Nvb3Jkcyh0LGUpe2lmKHRoaXMuYmVmb3JlTmV3U2VnbWVudCgxKSwxPT09dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCkpdGhpcy5zZXRYWUNvb3Jkc05vQ3VydmVzKHRoaXMubV9wb2ludENvdW50LTEsdCxlKTtlbHNle2NvbnN0IHM9RSgpLG49bmV3IEYoe3ZkOnRoaXMubV9kZXNjcmlwdGlvbixhdHRyaWJCdWZmZXI6cyxpbml0RGVmYXVsdFZhbHVlczohMH0pO24uc2V0WFlDb29yZH
1ModCxlKSx0aGlzLnNldFBvaW50QnlWYWxOb0N1cnZlcyh0aGlzLm1fcG9pbnRDb3VudC0xLG4pfXRoaXMuZmluaXNoTGluZVRvKCl9bGluZVRvKHQpe3RoaXMubGluZVRvQ29vcmRzKHQueCx0LnkpfWxpbmVUbzNEKHQpe3RoaXMuYmVmb3JlTmV3U2VnbWVudCgxKTtjb25zdCBlPXgodGhpcy5tX2Rlc2NyaXB0aW9uLHEoKSkscz1FKCksbj1uZXcgRih7dmQ6ZSxhdHRyaWJCdWZmZXI6cyxpbml0RGVmYXVsdFZhbHVlczohMH0pO24uc2V0WFlaKHQpLHRoaXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKHRoaXMubV9wb2ludENvdW50LTEsbiksdGhpcy5maW5pc2hMaW5lVG8oKX1saW5lVG8zRENvb3Jkcyh0LGUscyl7dGhpcy5saW5lVG8zRChuZXcgWSh0LGUscykpfWxpbmVUb1BvaW50KHQpe2lmKHRoaXMuYmVmb3JlTmV3U2VnbWVudCgxKSx0aGlzLm1fZGVzY3JpcHRpb249PT10LmdldERlc2NyaXB0aW9uKCkpdGhpcy5zZXRQb2ludEJ5VmFsTm9DdXJ2ZXModGhpcy5tX3BvaW50Q291bnQtMSx0KTtlbHNle3RoaXMubWVyZ2VWZXJ0ZXhEZXNjcmlwdGlvbih0LmdldERlc2NyaXB0aW9uKCkpO2NvbnN0IGU9RSgpLHM9bmV3IEYoe3ZkOnRoaXMubV9kZXNjcmlwdGlvbixhdHRyaWJCdWZmZXI6ZSxpbml0RGVmYXVsdFZhbHVlczohMX0pO3QuY29weUNvbW1vbkF0dHJpYnV0ZXNUbyhzKSx0aGlzLnNldFBvaW50QnlWYWxOb0N1cnZlcyh0aGlzLm1fcG9pbnRDb3VudC0xLHMpfXRoaXMuZmluaXNoTGluZVRvKCl9b3BlblBhdGhBbmREdXBsaWNhdGVTdGFydFZlcnRleCh0KXt0aGlzLm1fYlBvbHlnb24mJmgoXCJcIik7Y29uc3Qgcz10aGlzLmdldFBhdGhDb3VudCgpO2lmKHQ+cyYmZShcIlwiKSwhdGhpcy5pc0Nsb3NlZFBhdGgodCkpcmV0dXJuO3RoaXMubV9wYXRoRmxhZ3N8fGgoXCJcIik7Y29uc3Qgbj10aGlzLm1fcG9pbnRDb3VudCxpPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLHI9dGhpcy5nZXRQYXRoRW5kKHQpO2lmKHItaSE9PTApe3RoaXMucmVzaXplSW1wbCh0aGlzLm1fcG9pbnRDb3VudCsxKSx0aGlzLnZlcmlmeUFsbFN0cmVhbXNBZnRlclNpemVDaGFuZ2UoKTtmb3IobGV0IHQ9MCxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3Q8ZTt0KyspaWYodGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuZ2V0KHQpKXtjb25zdCBlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCkscz1acy5nZXRDb21wb25lbnRDb3VudChlKTt0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCkuaW5zZXJ0UmFuZ2VGcm9tU3RyZWFtKHMqcix0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQodCkscyppLHMsITAsMSxzKm4pfWZvcihsZXQgZT1zO2U+dDtlLS0pe2NvbnN0IHQ9dGhpcy5tX3BhdGhzLnJlYWQoZSk7dGhpcy5tX3BhdGhzLndyaXRlKGUsdCsxKX10aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLmluc2VydFJhbmdlKHIsMSwxLG4pLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5pbnNlcnRSYW5nZShyLC0xLDEsbikpLHRoaXMubV9wYXRoRmxhZ3MuY2xlYXJCaXRzKHQsMSl9fW9wZW5QYXRoKHQpe3RoaXMubV9iUG9seWdvbiYmaChcIlwiKSx0PnRoaXMuZ2V0UGF0aENvdW50KCkmJmUoXCJcIiksdGhpcy5tX3BhdGhGbGFnc3x8aChcIlwiKSx0aGlzLm1fcGF0aEZsYWdzLmNsZWFyQml0cyh0LDEpfWlzU3Ryb25nUGF0aFN0YXJ0KHQpe3JldHVybiEhKDImdGhpcy5tX3BhdGhGbGFncy5yZWFkKHQpKX1zZXRTdHJvbmdQYXRoU3RhcnQodCxlKXtlP3RoaXMubV9wYXRoRmxhZ3Muc2V0Qml0cyh0LDIpOnRoaXMubV9wYXRoRmxhZ3MuY2xlYXJCaXRzKHQsMil9aXNTdHJvbmdQYXRoRW5kKHQpe3JldHVybiEhKDQmdGhpcy5tX3BhdGhGbGFncy5yZWFkKHQpKX1zZXRTdHJvbmdQYXRoRW5kKHQsZSl7ZT90aGlzLm1fcGF0aEZsYWdzLnNldEJpdHModCw0KTp0aGlzLm1fcGF0aEZsYWdzLmNsZWFyQml0cyh0LDQpfWNsZWFyU3Ryb25nUGF0aEVuZHMoKXtmb3IobGV0IHQ9MCxlPXRoaXMuZ2V0UGF0aENvdW50KCk7dDxlOysrdCl0aGlzLm1fcGF0aEZsYWdzLmNsZWFyQml0cyh0LDYpfW9wZW5BbGxQYXRoc0FuZER1cGxpY2F0ZVN0YXJ0VmVydGV4KCl7aWYodGhpcy5tX2JQb2x5Z29uJiZoKFwiXCIpLHRoaXMuaXNFbXB0eSgpKXJldHVybjt0aGlzLm1fcGF0aEZsYWdzfHxoKFwiXCIpO2xldCB0PTA7Y29uc3QgZT10aGlzLmdldFBhdGhDb3VudCgpO2ZvcihsZXQgaD0wO2g8ZTtoKyspdGhpcy5pc0Nsb3NlZFBhdGgoaCkmJih0aGlzLmdldFBhdGhTaXplKGgpPjA/dCsrOnRoaXMubV9wYXRoRmxhZ3MuY2xlYXJCaXRzKGgsMSkpO2lmKDA9PT10KXJldHVybjtjb25zdCBzPXRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKTtsZXQgbj0wO2NvbnN0IGk9dGhpcy5nZXRQYXRoQ291bnQoKSxyPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpLG89bmV3IEFycmF5KHIpO2xldCBhPW51bGwsdT1udWxsO2ZvcihsZXQgaD0wO2g8aTsrK2gpe2NvbnN0IGU9dGhpcy5nZXRQYXRoU3RhcnQoaCksaT10aGlzLmdldFBhdGhTaXplKGgpLG09dGhpcy5pc0Nsb3NlZFBhdGgoaCk7aWYoaT4wKXtjb25zdCBoPWUrbjtmb3IobGV0IHM9MDtzPHI7cysrKWlmKHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChzKSl7Y29uc3Qgbj10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHMpLHI9WnMuZ2V0Q29tcG9uZW50Q291bnQobik7aWYoIW9bc10pe2NvbnN0IGU9cioodGhpcy5tX3BvaW50Q291bnQrdCksaT1NKG4sZSk7b1tzXT1pfW9bc10ud3JpdGVSYW5nZShoKnIsaSpyLHRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChzKSxlKnIsITAsMSksbSYmb1tzXS53cml0ZVJhbmdlKChoK2kpKnIscix0aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQocyksZSpyLCEwLDEpfWlmKHMpe2lmKG51bGw9PT1hKXtjb25zdCBlPXRoaXMubV9wb2ludENvdW50K3Q7YT1SKGUpLHU9TChlKX1hLndyaXRlUmFuZ2UoaCxpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MsZSwhMCwxKSx1LndyaXRlUmFuZ2UoaCxpLHRoaXMubV9
1jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleCxlLCEwLDEpLG0mJihhLndyaXRlKGgraSwxKSx1LndyaXRlKGgraSwtMSkpfX10aGlzLm1fcGF0aHMud3JpdGUoaCxlK24pLG0mJih0aGlzLm1fcGF0aEZsYWdzLmNsZWFyQml0cyhoLDEpLCsrbil9dGhpcy5tX3BhdGhzLndyaXRlKGksdGhpcy5tX3BvaW50Q291bnQrdCksdGhpcy5tX3BhdGhGbGFncy5jbGVhckJpdHMoaSwxKTtmb3IobGV0IGg9MDtoPHI7aCsrKXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldChoKSYmdGhpcy5tX3ZlcnRleEF0dHJpYnV0ZXMuc2V0KGgsb1toXSk7cyYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3M9YSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXg9dSksdGhpcy5tX3BvaW50Q291bnQrPXQsdGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD4wJiYodGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD10aGlzLm1fcG9pbnRDb3VudCl9Y2xvc2VQYXRoV2l0aExpbmUodCl7dm9pZCAwPT09dCYmKHQ9dGhpcy5nZXRQYXRoQ291bnQoKS0xKSx0aGlzLnRocm93SWZFbXB0eSgpLCh0PDB8fHQ+PXRoaXMuZ2V0UGF0aENvdW50KCkpJiZlKFwiY2xvc2VfcGF0aF93aXRoX2xpbmVcIiksdD09PXRoaXMuZ2V0UGF0aENvdW50KCktMSYmKHRoaXMubV9iUGF0aFN0YXJ0ZWQ9ITEpO2NvbnN0IHM9dGhpcy5tX3BhdGhGbGFncy5yZWFkKHQpO2lmKDEmc3x8dGhpcy5tX3BhdGhGbGFncy53cml0ZSh0LDF8cyksdGhpcy5tX2N1cnZlRGF0YSYmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncyl7Y29uc3QgZT10aGlzLmdldFBhdGhFbmQodCktMSxzPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3MucmVhZChlKTsxIT09cyYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUoZSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUoZSwtMSksdGhpcy5pbmNDdXJ2ZVR5cGUocywtMSksdGhpcy5tb2RpZnlDdXJ2ZUNvdW50ZXIoLTEpKX10aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9Y2xvc2VMYXN0UGF0aFdpdGhTZWdtZW50KHQpe3RoaXMuY2xvc2VQYXRoV2l0aFNlZ21lbnQodGhpcy5nZXRQYXRoQ291bnQoKS0xLHQpfWNsb3NlUGF0aFdpdGhTZWdtZW50KHQscyl7aWYodGhpcy50aHJvd0lmRW1wdHkoKSwodDwwfHx0Pj10aGlzLmdldFBhdGhDb3VudCgpKSYmZShcImNsb3NlX3BhdGhfd2l0aF9saW5lXCIpLHMuZ2V0RW5kWFkoKS5lcXVhbHModGhpcy5nZXRYWSh0aGlzLmdldFBhdGhTdGFydCh0KSkpfHxlKFwiY2xvc2VfcGF0aF93aXRoX3NlZ21lbnQ6IGVuZCBwb2ludCBtaXNtYXRjaFwiKSx0PT09dGhpcy5nZXRQYXRoQ291bnQoKS0xKXRoaXMubV9iUGF0aFN0YXJ0ZWQ9ITEsdGhpcy5hZGRTZWdtZW50KHMsITEpLC0tdGhpcy5tX3BvaW50Q291bnQsdGhpcy5tX3BhdGhzLndyaXRlKHQrMSx0aGlzLm1fcG9pbnRDb3VudCk7ZWxzZXt0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24ocy5nZXREZXNjcmlwdGlvbigpKTtjb25zdCBuPXMuZ2V0U3RhcnRYWSgpLHI9dGhpcy5nZXRQYXRoRW5kKHQpLTE7bi5lcXVhbHModGhpcy5nZXRYWShyKSl8fGUoXCJjbG9zZV9wYXRoX3dpdGhfc2VnbWVudDogc3RhcnQgcG9pbnQgbWlzbWF0Y2hcIik7Y29uc3Qgbz1zLmdldEdlb21ldHJ5VHlwZSgpO2lmKG89PT1pLmVudW1MaW5lKXJldHVybiB2b2lkIHRoaXMuY2xvc2VQYXRoV2l0aExpbmUodCk7e2NvbnN0IHQ9a3Mocyk7dGhpcy5pbml0U2VnbWVudERhdGEodCk7Y29uc3QgZT1Icy50b1NlZ1R5cGUobyksbj10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQocik7aWYobiE9PWUpdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LndyaXRlKHIsdGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50KSxzLndyaXRlSW5CdWZmZXJTdHJlYW0odGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMsdGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50KSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQrPXQsdGhpcy5pbmNDdXJ2ZVR5cGUoZSwxKSwxIT09bj90aGlzLmluY0N1cnZlVHlwZShuLC0xKTp0aGlzLm1vZGlmeUN1cnZlQ291bnRlcigxKTtlbHNle2NvbnN0IHQ9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlYWQocik7cy53cml0ZUluQnVmZmVyU3RyZWFtKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLHQpfXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUocixlKX19Y29uc3Qgbj10aGlzLm1fcGF0aEZsYWdzLnJlYWQodCk7MSZufHx0aGlzLm1fcGF0aEZsYWdzLndyaXRlKHQsMXxuKSx0aGlzLm5vdGlmeU1vZGlmaWVkRmxhZ3MoMjAwMSl9Y2xvc2VBbGxQYXRocygpe2lmKHRoaXMubV9iUG9seWdvbnx8dGhpcy5pc0VtcHR5SW1wbCgpKXJldHVybjt0aGlzLm1fYlBhdGhTdGFydGVkPSExO2xldCB0PSExO2ZvcihsZXQgZT0wLHM9dGhpcy5tX3BhdGhzLnNpemUoKS0xO2U8cztlKyspe2lmKHRoaXMuaXNDbG9zZWRQYXRoKGUpKWNvbnRpbnVlO2NvbnN0IHM9dGhpcy5tX3BhdGhGbGFncy5yZWFkKGUpO3RoaXMubV9wYXRoRmxhZ3Mud3JpdGUoZSwxfHMpLHQ9ITB9dCYmdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDUxMil9aXNDbG9zZWRQYXRoKHQpe3JldHVybiEhKDEmdGhpcy5tX3BhdGhGbGFncy5yZWFkKHQpKX1pc0Nsb3NlZFBhdGhJblhZUGxhbmUodCl7aWYodGhpcy5pc0Nsb3NlZFBhdGgodCkpcmV0dXJuITA7Y29uc3QgZT10aGlzLmdldFBhdGhTdGFydCh0KSxzPXRoaXMuZ2V0UGF0aEVuZCh0KS0xO2lmKGU+cylyZXR1cm4hMTtjb25zdCBuPXRoaXMuZ2V0WFkoZSksaT10aGlzLmdldFhZKHMpO3JldHVybiBuLmlzRXF1YWxQb2ludDJEKGkpfWlzQ2xvc2VkUGF0aEluM0QodCl7cmV0dXJuIHMoMCksITF9aGFzTm9uTGluZWFyU2VnbWVudHNQYXRoKHQpe2lmKCF0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpcmV0dXJuITE7Zm9yKGxldCBlPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpLHM9dGhpcy5nZXRQYXRoRW5kKHQpO2U8cztlKyspaWYoVXMuaXNOb25MaW5lYXJTZWdtZW50RmxhZyh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQoZSkpKXJldHVybiEwO3JldHVybiExfWlzTm9uTGluZWFyU2VnbWVudCh0KXtyZXR1cm4hKDEmdGhpcy5nZXRTZWdtZW50RmxhZ3ModCkpfWFkZEVudmVsb3BlKHQsZSl7aWYodC5pc0VtcHR5KCkpcmV0dXJuO2NvbnN0IHM9MD09PXRoaXMubV9wb2ludENvdW50O2lmKHQgaW5zdGFuY2VvZiBsZSl0aGlzLnN0YXJ0UGF0aENvb3Jkcyh0LnhtaW4sdC55bWluKSxlPyh0aGlzLmxpbmVUb0Nvb3Jkcyh0LnhtYXgsdC55bWluKSx0aGlzLmxpbmVUb0Nvb3Jkcyh0LnhtYXgsdC55bWF4KSx0aGlzLmxpbmVUb0Nvb3Jkcyh0LnhtaW4sdC55bWF4KSk6KHRoaXMubGluZVRvQ29vcmRzKHQueG1pbix0LnltYXgpLHRoaXMubGluZVRvQ29vcmRzKHQueG1heCx0LnltYXgpLHRoaXMubGluZVRvQ29vcmRzKHQueG1heCx0LnltaW4pKTtlbHNle2NvbnN0IHM9dC5nZXREZXNjcmlwdGlvbigpLG49RSgpLGk9bmV3IEYoe3ZkOnMsYXR0cmliQnVmZmVyOm4saW5pdERlZmF1bHRWYWx1ZXM6ITF9KTtmb3IobGV0IHI9MCxvPTQ7cjxvO3IrKyl7Y29uc3Qgcz1lP28tci0xOnI7dC5xdWVyeUNvcm5lckJ5VmFsKHMsaSksMD09PXI/dGhpcy5zdGFydFBhdGhQb2ludChpKTp0aGlzLmxpbmVUb1BvaW50KGkpfX10aGlzLmNsb3NlUGF0aFdpdGhMaW5lKCksdGhpcy5tX2JQYXRoU3RhcnRlZD0hMSxzJiYhZSYmKHRoaXMuc2V0RGlydHlGbGFnUHJvdGVjdGVkKDI1NiwhMSksdGhpcy5tX2JQb2x5Z29uJiZNYXRoLm1pbih0LndpZHR
1oKCksdC5oZWlnaHQoKSk+MCYmdGhpcy5zZXRJc1NpbXBsZSgzLDApKX1hZGRQYXRoRnJvbUNsb3NlZFNlZ21lbnQodCxzKXtpZih0LmlzQ2xvc2VkKCl8fGUoXCJhZGRfcGF0aF9mcm9tX2Nsb3NlZFNlZ21lbnQ6IHNlZ21lbnQgbXVzdCBiZSBjbG9zZWRcIikscyl7Y29uc3QgZT10LmdldFJldmVyc2VkKCkscz1uZXcgRjtlLnF1ZXJ5U3RhcnQocyksdGhpcy5zdGFydFBhdGhQb2ludChzKSx0aGlzLmNsb3NlTGFzdFBhdGhXaXRoU2VnbWVudChlKX1lbHNle2NvbnN0IGU9bmV3IEY7dC5xdWVyeVN0YXJ0KGUpLHRoaXMuc3RhcnRQYXRoUG9pbnQoZSksdGhpcy5jbG9zZUxhc3RQYXRoV2l0aFNlZ21lbnQodCl9fWFkZFNlZ21lbnRfKHQscyl7Y29uc3Qgbj10LmdldERlc2NyaXB0aW9uKCk7dGhpcy5tZXJnZVZlcnRleERlc2NyaXB0aW9uKG4pO2NvbnN0IHI9RSgpLG89bmV3IEYoe3ZkOm4sYXR0cmliQnVmZmVyOnIsaW5pdERlZmF1bHRWYWx1ZXM6ITF9KSxhPXQuZ2V0R2VvbWV0cnlUeXBlKCk7aWYoYT09PWkuZW51bUxpbmUpKHN8fHRoaXMuaXNFbXB0eUltcGwoKSkmJih0LnF1ZXJ5U3RhcnQobyksdGhpcy5zdGFydFBhdGhQb2ludChvKSksdC5xdWVyeUVuZChvKSx0aGlzLmxpbmVUb1BvaW50KG8pO2Vsc2V7bGV0IG49ITE7aWYoKHN8fHRoaXMuaXNFbXB0eUltcGwoKSkmJihuPSEwKSwhbil7dC5nZXRTdGFydFhZKCkuZXF1YWxzKHRoaXMuZ2V0WFkodGhpcy5tX3BvaW50Q291bnQtMSkpfHxlKFwiYWRkX3NlZ21lbnQ6IHN0YXJ0IHBvaW50IG1pc21hdGNoXCIpfWlmKG4mJih0LnF1ZXJ5U3RhcnQobyksdGhpcy5zdGFydFBhdGhQb2ludChvKSksdGhpcy5iZWZvcmVOZXdTZWdtZW50KDEpLHQucXVlcnlFbmQobyksby5nZXREZXNjcmlwdGlvbigpPT09dGhpcy5tX2Rlc2NyaXB0aW9uKXRoaXMuc2V0UG9pbnRCeVZhbCh0aGlzLm1fcG9pbnRDb3VudC0xLG8pO2Vsc2V7Y29uc3QgdD1FKCksZT1uZXcgRih7dmQ6dGhpcy5tX2Rlc2NyaXB0aW9uLGF0dHJpYkJ1ZmZlcjp0LGluaXREZWZhdWx0VmFsdWVzOiExfSk7by5jb3B5Q29tbW9uQXR0cmlidXRlc1RvKGUpLHRoaXMuc2V0UG9pbnRCeVZhbCh0aGlzLm1fcG9pbnRDb3VudC0xLGUpfWNvbnN0IGk9a3ModCk7dGhpcy5pbml0U2VnbWVudERhdGEoaSksdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LndyaXRlKHRoaXMubV9wb2ludENvdW50LTIsdGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50KSx0LndyaXRlSW5CdWZmZXJTdHJlYW0odGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMsdGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50KSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQrPWk7Y29uc3Qgcj1Icy50b1NlZ1R5cGUoYSk7dGhpcy5pbmNDdXJ2ZVR5cGUociwxKSx0aGlzLm1vZGlmeUN1cnZlQ291bnRlcigxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLndyaXRlKHRoaXMubV9wb2ludENvdW50LTIscil9fWFkZFNlZ21lbnQodCxlLHMpe3M/ZT90aGlzLmFkZFBhdGhGcm9tQ2xvc2VkU2VnbWVudCh0LCExKTp0aGlzLmNsb3NlTGFzdFBhdGhXaXRoU2VnbWVudCh0KTp0aGlzLmFkZFNlZ21lbnRfKHQsZSl9aW50ZXJwb2xhdGVBdHRyaWJ1dGVzUmFuZ2UodCxzLG4saSl7Zm9yKGxldCBhPXQ7YTxuLTE7YSsrKXRoaXMuaXNDbG9zZWRQYXRoKGEpJiZlKFwiY2Fubm90IGludGVycG9sYXRlIGFjcm9zcyBjbG9zZWQgcGF0aHNcIik7Y29uc3Qgcj10aGlzLm1fZGVzY3JpcHRpb24uZ2V0QXR0cmlidXRlQ291bnQoKTtpZigxPT09cilyZXR1cm47Y29uc3Qgbz10aGlzLmNhbGN1bGF0ZVN1Ykxlbmd0aDJEKHQscyxuLGkpO2lmKDAhPT1vKWZvcihsZXQgZT0xO2U8cjtlKyspe2NvbnN0IHI9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhlKTt0aGlzLmludGVycG9sYXRlQXR0cmlidXRlc1NlbWFudGljc0ltcGwocix0LHMsbixpLG8pfX1pbnRlcnBvbGF0ZUF0dHJpYnV0ZXNTZW1hbnRpY3ModCxzLG4saSxyKXtpZigwPT09dClyZXR1cm47dGhpcy5oYXNBdHRyaWJ1dGUodCl8fGUoXCJkb2VzIG5vdCBoYXZlIHRoZSBnaXZlbiBhdHRyaWJ1dGVcIik7Mj09PVpzLmdldEludGVycG9sYXRpb24odCkmJmUoXCJhbmd1bGFyIGludGVycG9sYXRpb25cIik7Zm9yKGxldCBhPXM7YTxpLTE7YSsrKXRoaXMuaXNDbG9zZWRQYXRoKGEpJiZlKFwiY2Fubm90IGludGVycG9sYXRlIGFjcm9zcyBjbG9zZWQgcGF0aHNcIik7Y29uc3Qgbz10aGlzLmNhbGN1bGF0ZVN1Ykxlbmd0aDJEKHMsbixpLHIpOzAhPT1vJiZ0aGlzLmludGVycG9sYXRlQXR0cmlidXRlc1NlbWFudGljc0ltcGwodCxzLG4saSxyLG8pfWludGVycG9sYXRlQXR0cmlidXRlc1BhdGgodCxlLHMpe2NvbnN0IG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7aWYoMT09PW4pcmV0dXJuO2lmKGU9PT1zKXJldHVybjtjb25zdCBpPXRoaXMuY2FsY3VsYXRlUGF0aFN1Ykxlbmd0aDJEKHQsZSxzKTtmb3IobGV0IHI9MTtyPG47cisrKXtjb25zdCBuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3Mocik7dGhpcy5pbnRlcnBvbGF0ZUF0dHJpYnV0ZXNTZW1hbnRpY3NQYXRoSW1wbChuLHQsZSxzLGkpfX1pbnRlcnBvbGF0ZUF0dHJpYnV0ZXNTZW1hbnRpY3NQYXRoKHQscyxuLGkpe2lmKDA9PT10KXJldHVybjt0aGlzLmhhc0F0dHJpYnV0ZSh0KXx8ZShcImRvZXMgbm90IGhhdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZVwiKTsyPT09WnMuZ2V0SW50ZXJwb2xhdGlvbih0KSYmZShcImFuZ3VsYXIgaW50ZXJwb2xhdGlvblwiKTtjb25zdCByPXRoaXMuY2FsY3VsYXRlUGF0aFN1Ykxlbmd0aDJEKHMsbixpKTswIT09ciYmdGhpcy5pbnRlcnBvbGF0ZUF0dHJpYnV0ZXNTZW1hbnRpY3NQYXRoSW1wbCh0LHMsbixpLHIpfWludGVycG9sYXRlQXR0cmlidXRlc1NlbWFudGljc0ltcGwodCxlLHMsbixpLHIpe2NvbnN0IG89dGhpcy5xdWVyeVNlZ21lbnRJdGVyYXRvcigpLGE9dGhpcy5nZXRQYXRoU3RhcnQoZSkrcyxoPXRoaXMuZ2V0UGF0aFN0YXJ0KG4pK2ksdT1acy5nZXRDb21wb25lbnRDb3VudCh0KSxtPU8oWnMubWF4Q29tcG9uZW50Q291bnQoKSxOdW1iZXIuTmFOKTt0aGlzLnF1ZXJ5QXR0cmlidXRlQXNEYmwodCxhLG0sdSk7Y29uc3QgbD1PKFpzLm1heENvbXBvbmVudENvdW50KCksTnVtYmVyLk5hTik7dGhpcy5xdWVyeUF0dHJpYnV0ZUFzRGJsKHQsaCxsLHUpO2NvbnN0IGM9Tyhacy5tYXhDb21wb25lbnRDb3VudCgpLE51bWJlci5OYU4pOyQoYyxtLDAsMCx1KTtsZXQgZz0wO2NvbnN0IGQ9WnMuZ2V0RGVmYXVsdFZhbHVlKHQpLF89WnMuZ2V0SW50ZXJwb2xhdGlvbih0KTtvLnJlc2V0VG9WZXJ0ZXgoYSxlKTtkb3tpZihvLmhhc05leHRTZWdtZW50KCkpe2lmKG8ubmV4dFNlZ21lbnQoKSxvLmdldFN0YXJ0UG9pbnRJbmRleCgpPT09aClyZXR1cm47dGhpcy5zZXRBdHRyaWJ1dGVGcm9tQXJyYXkodCxvLmdldFN0YXJ0UG9pbnRJbmRleCgpLGMsdSksby5wcmV2aW91c1NlZ21lbnQoKTtkb3tjb25zdCBlPW8ubmV4dFNlZ21lbnQoKTtpZihvLmdldEVuZFBvaW50SW5kZXgoKT09PWgpcmV0dXJuO2crPWUuY2FsY3VsYXRlTGVuZ3RoMkQoKTtRKF8sbSxsLGMsMCx1LGcvcixkKSxvLmlzQ2xvc2luZ1NlZ21lbnQoKXx8dGhpcy5zZXRBdHRyaWJ1dGVGcm9tQXJyYXkodCxvLmdldEVuZFBvaW50SW5kZXgoKSxjLHUpfXdoaWxlKG8uaGFzTmV4dFNlZ21lbnQoKSl9fXdoaWxlKG8ubmV4dFBhdGgoKSl9aW50ZXJwb2xhdGVBdHRyaWJ1dGVzU2VtYW50aWNzUGF0aEltcGwodCxlLG4saSxyKXtzKDAhPT10KTtjb25zdCBvPXRoaXMucXVlcnlTZWdtZW50SXRlcmF0b3IoKSxhPVpzLmdldEludGVycG9sYXRpb24odCksaD10aGlzLmdldFBhdGhTdGFydChlKStuLHU9dGhpcy5nZXRQYXRoU3RhcnQoZSkraTtpZih1PT09aClyZXR1cm47Y29uc3QgbT1acy5nZXRDb21wb25lbnRDb3VudCh0KSxsPU8oWnMubWF4Q29tcG9uZW50Q291bnQoKSxOdW1iZXIuTmFOKTt0aGlzLnF1ZXJ5QXR0cmlidXRlQXNEYmwodCxoLGwsbSk7Y29uc3QgYz1PKFpzLm1heENvbXBvbmVudENvdW50KCksTnVtYmVyLk5hTik7dGhpcy5xdWVyeUF0dHJpYnV0ZUFzRGJsKHQsdSxjLG0pO2NvbnN0IGc9bmV3IGZ0KDApO28ucmVzZXRUb1ZlcnRleChoLGUpLG8uc2V0Q2lyY3VsYXRvcih0aGlzLmlzQ2xvc2VkUGF0aChlKSk7Y29uc3QgZD1acy5nZXREZWZhdWx0VmFsdWUodCksXz1PKFpzLm1heENvbXBvbmVudENvdW50KCksTnVtYmVyLk5hTik7JChfLGwsMCwwLG0pO2NvbnN0IHA9MD09PXI7bGV0IGY9LjU7ZG97Y29uc3QgZT1vLm5leHRTZWdtZW50KCk7aWYodGhpcy5zZXRBdHRyaWJ1dGVGcm9tQXJyYXlOb0N1cnZlcyh0LG8uZ2V0U3RhcnRQb2ludEluZGV4KCksXyxtKSwhcCl7Y29uc3QgdD1lLmNhbGN1bGF0ZUxlbmd0aDJEKCk7Zy5wZSh0KSxmPWcuZ2V0UmVzdWx0KCkvcn1RKGEsbCxjLF8sMCxtLGYsZCl9d2hpbGUoby5nZXRFbmRQb2ludEluZGV4KCkhPT11KX1xdWVyeVNlZ21lbnQodCxzLG4pe2NvbnN0IGk9dGhpcy5nZXRQYXRoSW5kZXhGcm9tUG9pbnRJbmRleCh0KSxyPXQtdGhpcy5nZXRQYXRoU3RhcnQoaSk7cj49dGhpcy5nZXRTZWdtZW50Q291bnRQYXRoKGkpJiZlKFwiZ2V0X3NlZ21lbnRcIiksdGhpcy5nZXRTZWdtZW50RnJvbVBhdGgoaSxyLHMsbil9Z2V0U2VnbWVudCh0LGUpe2NvbnN0IHM9bmV3IH
1RoaXMubV9zZWdtZW50QnVmZmVyQ1RvcjtyZXR1cm4gdGhpcy5nZXRTZWdtZW50QnVmZmVyKHQscyxlKSxzLnJlbGVhc2VTZWdtZW50KCl9Z2V0U2VnbWVudFR5cGUodCl7Y29uc3Qgcz10aGlzLmdldFBhdGhJbmRleEZyb21Qb2ludEluZGV4KHQpLG49dC10aGlzLmdldFBhdGhTdGFydChzKTtyZXR1cm4gbj49dGhpcy5nZXRTZWdtZW50Q291bnRQYXRoKHMpJiZlKFwiZ2V0X3NlZ21lbnRcIiksdGhpcy5nZXRTZWdtZW50VHlwZUZyb21QYXRoKHMsbil9Z2V0U2VnbWVudEZyb21QYXRoKHQsZSxzLG4pe2NvbnN0IGk9dGhpcy5nZXRQYXRoU3RhcnQodCkrZSxyPXRoaXMuZ2V0U2VnbWVudEZsYWdzU3RyZWFtUmVmKCk7bGV0IG89MTtzd2l0Y2gociYmKG89MzEmci5yZWFkKGkpKSxvKXtjYXNlIDE6cy5jcmVhdGVMaW5lKCk7YnJlYWs7Y2FzZSAyOnMuY3JlYXRlQ3ViaWNCZXppZXIoKTticmVhaztjYXNlIDQ6cy5jcmVhdGVFbGxpcHRpY0FyYygpO2JyZWFrO2Nhc2UgODpzLmNyZWF0ZVF1YWRyYXRpY1JhdGlvbmFsQmV6aWVyKCk7YnJlYWs7Y2FzZSAxNjpzLmNyZWF0ZVF1YWRyYXRpY0JlemllcigpO2JyZWFrO2RlZmF1bHQ6aChcIlwiKX1jb25zdCBhPXMuZ2V0KCk7bGV0IHUsbT1udWxsO24/KG09UCgpLGEuYXNzaWduVmVydGV4RGVzY3JpcHRpb24obSkpOmEuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odGhpcy5tX2Rlc2NyaXB0aW9uKSx1PWk9PT10aGlzLmdldFBhdGhFbmQodCktMSYmdGhpcy5pc0Nsb3NlZFBhdGgodCk/dGhpcy5nZXRQYXRoU3RhcnQodCk6aSsxO2plKGEsdGhpcy5nZXRYWShpKSk7aWYoSGUoYSx0aGlzLmdldFhZKHUpKSwhbilmb3IobGV0IGg9MSxsPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO2g8bDtoKyspe2NvbnN0IHQ9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhoKSxlPVpzLmdldENvbXBvbmVudENvdW50KHQpO2ZvcihsZXQgcz0wO3M8ZTtzKyspe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGVBc0RibCh0LGkscyk7YS5zZXRTdGFydEF0dHJpYnV0ZSh0LHMsZSk7Y29uc3Qgbj10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKHQsdSxzKTthLnNldEVuZEF0dHJpYnV0ZSh0LHMsbil9fWlmKFVzLmlzTm9uTGluZWFyU2VnbWVudEZsYWcobykpe2NvbnN0IHQ9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlYWQoaSk7YS5yZWFkRnJvbUJ1ZmZlclN0cmVhbSh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcyx0KX19cmVwbGFjZUxpbmVhckVsbGlwdGljYWxBcmNzV2l0aFRydWVMaW5lcygpe2lmKCF0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpcmV0dXJuITE7aWYoMD09PXRoaXMubV9jdXJ2ZURhdGEubV9hcmNDb3VudClyZXR1cm4hMTtsZXQgdD0hMTtmb3IobGV0IGU9MCxzPXRoaXMuZ2V0UG9pbnRDb3VudCgpO2U8cztlKyspe2lmKDQ9PT10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQoZSkpe2NvbnN0IHM9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbUluZGV4LnJlYWQoZSk7QnModGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMscykuaXNOQU4oKSYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Mud3JpdGUoZSwxKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUoZSwtMSksdGhpcy5pbmNDdXJ2ZVR5cGUoNCwtMSksdGhpcy5tb2RpZnlDdXJ2ZUNvdW50ZXIoLTEpLHQ9ITApfX1yZXR1cm4gdCYmdGhpcy5jaGVja0NvbXBhY3RTZWdtZW50UGFyYW1zKCksdH1xdWVyeVBvaW50QWxvbmdQYXRoKHQscyxuLGk9ITEpe2NvbnN0IHI9e2lTZWdtZW50Oi0xfSxvPWk/cjp7dFNlZ21lbnQ6MH07aWYobi5zZXRFbXB0eSgpLHRoaXMuaXNFbXB0eSgpKXJldHVybiByO2lmKCh0PDB8fHQ+PXRoaXMuZ2V0UGF0aENvdW50KCkpJiZlKFwicXVlcnlfcG9pbnRfYWxvbmdfcGF0aFwiKSxzPDApcmV0dXJuIHI7Y29uc3QgYT10aGlzLmdldFBhdGhTaXplKHQpO2lmKDA9PT1hKXJldHVybiByO2lmKDE9PT1hKXJldHVybiB0aGlzLmdldFBvaW50QnlWYWwodGhpcy5nZXRQYXRoU3RhcnQodCksbiksby50U2VnbWVudD0wLHIuaVNlZ21lbnQ9dGhpcy5nZXRQYXRoU3RhcnQodCkscjtjb25zdCBoPXRoaXMucXVlcnlTZWdtZW50SXRlcmF0b3JBdFZlcnRleCh0aGlzLmdldFBhdGhTdGFydCh0KSksdT1uZXcgZnQoMCk7Zm9yKDtoLmhhc05leHRTZWdtZW50KCk7KXtjb25zdCB0PWgubmV4dFNlZ21lbnQoKSxlPXQuY2FsY3VsYXRlTGVuZ3RoMkQoKSxpPXUuZ2V0UmVzdWx0KCk7aWYodS5hZGQoZSksdS5nZXRSZXN1bHQoKT49cyl7bGV0IGE9cy1pO2E+ZSYmKGE9ZSk7Y29uc3QgdT10Lmxlbmd0aFRvVChhKTtyZXR1cm4gdC5xdWVyeUNvb3JkKHUsbiksby50U2VnbWVudD11LHIuaVNlZ21lbnQ9aC5nZXRTdGFydFBvaW50SW5kZXgoKSxyfX1pZih0aGlzLmlzQ2xvc2VkUGF0aCh0KSl7Y29uc3QgZT10aGlzLmdldFBhdGhTdGFydCh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludEJ5VmFsKGUsbiksby50U2VnbWVudD0xLHIuaVNlZ21lbnQ9dGhpcy5nZXRQYXRoRW5kKHQpLTEscn17Y29uc3QgZT10aGlzLmdldFBhdGhFbmQodCktMTtyZXR1cm4gdGhpcy5nZXRQb2ludEJ5VmFsKGUsbiksdGhpcy5nZXRQYXRoU2l6ZSh0KT4xPyhvLnRTZWdtZW50PTEsci5pU2VnbWVudD10aGlzLmdldFBhdGhFbmQodCktMixyKTooby50U2VnbWVudD0wLHIuaVNlZ21lbnQ9dGhpcy5nZXRQYXRoU3RhcnQodCkscil9fXF1ZXJ5UG9pbnRzQWxvbmdQYXRoKHQscyxuLGkscixvKXt7bGV0IHQ9MDtmb3IobGV0IGE9MDthPHM7KythKWkmJmlbYV0uc2V0RW1wdHkoKSxyJiYoclthXT0tMSksbyYmKG9bYV09MCksdD5uW2FdJiZlKFwicXVlcnlfcG9pbnRzX2Fsb25nXCIpLHQ9blthXX1jb25zdCBhPXRoaXMuZ2V0UGF0aFNpemUodCk7aWYoMD09PXN8fDA9PT1hKXJldHVybiAwO2lmKDE9PT1hKXtjb25zdCBlPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpO3JldHVybiBpJiZ0aGlzLmdldFBvaW50QnlWYWwoZSxpWzBdKSxvJiYob1swXT0wKSxyJiYoclswXT1lKSwxfWNvbnN0IGg9dGhpcy5nZXRQYXRoU3RhcnQodCksdT1uZXcgZnQoMCksbT10aGlzLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yQXRWZXJ0ZXgoaCk7bGV0IGw9MCxjPTAsZz1uW2xdO2Zvcig7bS5oYXNOZXh0U2VnbWVudCgpOyl7Y29uc3QgdD1tLm5leHRTZWdtZW50KCksZT10LmNhbGN1bGF0ZUxlbmd0aDJEKCksYT11LmdldFJlc3VsdCgpO2Zvcih1LmFkZChlKTt1LmdldFJlc3VsdCgpPj1nOyl7bGV0IGg9Zy1hO2g+ZSYmKGg9ZSk7Y29uc3QgdT10Lmxlbmd0aFRvVChoKTtpZihpJiZ0LnF1ZXJ5Q29vcmQodSxpW2NdKSxvJiYob1tjXT11KSxyJiYocltjXT1tLmdldFN0YXJ0UG9pbnRJbmRleCgpKSxjKyssbCsrLGc9bltsXSxsPT09cylyZXR1cm4gY319aWYodGhpcy5pc0Nsb3NlZFBhdGgodCkpe2NvbnN0IGU9dGhpcy5nZXRQYXRoU3RhcnQodCkscz0wO2kmJnRoaXMuZ2V0UG9pbnRCeVZhbChlLGlbY10pLG8mJihvW2NdPXMpLHImJihyW2NdPWUpLGMrK31lbHNlIGlmKHRoaXMuZ2V0UGF0aFNpemUodCk+MSl7Y29uc3QgZT10aGlzLmdldFBhdGhFbmQodCktMixzPTE7aSYmdGhpcy5nZXRQb2ludEJ5VmFsKGUrMSxpW2NdKSxvJiYob1tjXT1zKSxyJiYocltjXT1lKSxjKyt9cmV0dXJuIGN9cXVlcnlQb2ludHNBbG9uZyh0LHMsbixpLHIpe3tsZXQgbz0wO2ZvcihsZXQgYT0wO2E8dDsrK2EpbiYmblthXS5zZXRFbXB0eSgpLGkmJihpW2FdPS0xKSxyJiYoclthXT0wKSxvPnNbYV0mJmUoXCJxdWVyeV9wb2ludHNfYWxvbmdcIiksbz1zW2FdfWlmKDA9PT10KXJldHVybiAwO2NvbnN0IG89bmV3IGZ0KDApLGE9dGhpcy5xdWVyeVNlZ21lbnRJdGVyYXRvcigpO2xldCBoPS0xLHU9MCxtPTAsbD1zW3VdO2Zvcig7YS5uZXh0UGF0aCgpOylmb3IoO2EuaGFzTmV4dFNlZ21lbnQoKT
1spe2g9YS5nZXRQYXRoSW5kZXgoKTtjb25zdCBlPWEubmV4dFNlZ21lbnQoKSxjPWUuY2FsY3VsYXRlTGVuZ3RoMkQoKSxnPW8uZ2V0UmVzdWx0KCk7Zm9yKG8uYWRkKGMpO28uZ2V0UmVzdWx0KCk+PWw7KXtsZXQgbz1sLWc7bz5jJiYobz1jKTtjb25zdCBoPWUubGVuZ3RoVG9UKG8pO2lmKG4mJmUucXVlcnlDb29yZChoLG5bbV0pLHImJihyW21dPWgpLGkmJihpW21dPWEuZ2V0U3RhcnRQb2ludEluZGV4KCkpLG0rKyx1KyssbD1zW3VdLHU9PT10KXJldHVybiBtfX1pZihoPDApcmV0dXJuIDA7aWYodGhpcy5pc0Nsb3NlZFBhdGgoaCkpe2NvbnN0IHQ9dGhpcy5nZXRQYXRoU3RhcnQoaCksZT0wO24mJnRoaXMuZ2V0UG9pbnRCeVZhbCh0LG5bbV0pLHImJihyW21dPWUpLGkmJihpW21dPXQpLG0rK31lbHNlIGlmKHRoaXMuZ2V0UGF0aFNpemUoaCk+MSl7Y29uc3QgdD10aGlzLmdldFBhdGhFbmQoaCktMixlPTE7biYmdGhpcy5nZXRQb2ludEJ5VmFsKHQrMSxuW21dKSxyJiYoclttXT1lKSxpJiYoaVttXT10KSxtKyt9cmV0dXJuIG19cXVlcnlTZWdtZW50SXRlcmF0b3IoKXtyZXR1cm4gbmV3IFZzKHtwYXJlbnQ6dGhpc30pfXF1ZXJ5U2VnbWVudEl0ZXJhdG9yQXRWZXJ0ZXgodCl7cmV0dXJuIG5ldyBWcyh7cGFyZW50OnRoaXMscG9pbnRJbmRleDp0fSl9cXVlcnlQYXRoRW52ZWxvcGUodCxlKXt0aGlzLnF1ZXJ5UGF0aEVudmVsb3BlSW1wbCh0LGUsITApfXF1ZXJ5TG9vc2VQYXRoRW52ZWxvcGUodCxlKXt0aGlzLnF1ZXJ5UGF0aEVudmVsb3BlSW1wbCh0LGUsITEpfXF1ZXJ5UGF0aEVudmVsb3BlSW1wbCh0LG4saSl7aWYobiBpbnN0YW5jZW9mIEkmJnMoMCxcIm5vdCBpbXBsZW1lbnRlZCBmb3IgRW52ZWxvcGVcIiksbiBpbnN0YW5jZW9mIFMmJnMoMCxcIm5vdCBpbXBsZW1lbnRlZCBmb3IgRW52ZWxvcGUzRFwiKSwodD49dGhpcy5nZXRQYXRoQ291bnQoKXx8dDwwKSYmZShcIlwiKSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdm9pZCBuLnNldEVtcHR5KCk7Y29uc3Qgcj10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKSxvPWxlLmNvbnN0cnVjdEVtcHR5KCk7by5zZXRFbXB0eSgpO2ZvcihsZXQgZT0yKnRoaXMuZ2V0UGF0aFN0YXJ0KHQpLGE9Mip0aGlzLmdldFBhdGhFbmQodCk7ZTxhOyl7Y29uc3QgdD1hLWU7cyghKDEmdCkpLG8ubWVyZ2VQb2ludHNJbnRlcmxlYXZlZChyLGUvMix0LzIpLGUrPXR9aWYobi5zZXRDb29yZHMoe2VudjJEOm99KSx0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzUGF0aCh0KSl7Y29uc3QgZT10aGlzLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yKCk7aWYoZS5yZXNldFRvUGF0aCh0KSxlLm5leHRQYXRoKCkpZm9yKDtlLmhhc05leHRTZWdtZW50KCk7KXtjb25zdCB0PWUubmV4dEN1cnZlKCk7aWYoIXQpYnJlYWs7e2NvbnN0IGU9bGUuY29uc3RydWN0RW1wdHkoKTtpP3QucXVlcnlFbnZlbG9wZShlKTp0LnF1ZXJ5TG9vc2VFbnZlbG9wZShlKSxuLm1lcmdlRW52ZWxvcGUyRChlKX19ZWxzZSBzKDApfX1jaGVja0NvbXBhY3RTZWdtZW50UGFyYW1zKCl7aWYoIXRoaXMubV9
1jdXJ2ZURhdGF8fG51bGw9PT10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcylyZXR1cm4hMTtpZih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5zaXplKCk8PXRoaXMubV92ZXJ0ZXhBdHRyaWJ1dGVzLmdldCgwKS5zaXplKCkpcmV0dXJuITE7Y29uc3QgdD0xMCxlPUdzKDQpKnRoaXMubV9jdXJ2ZURhdGEubV9hcmNDb3VudCtHcygyKSp0aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyQ291bnQrR3MoOCkqdGhpcy5tX2N1cnZlRGF0YS5tX3JiZXppZXIyQ291bnQrR3MoMTYpKnRoaXMubV9jdXJ2ZURhdGEubV9iZXppZXIyQ291bnQ7cmV0dXJuIHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLnNpemUoKT5NYXRoLm1heCgzKmU+PjEsdCk/KHRoaXMuZm9yY2VDb21wYWN0U2VnbWVudFBhcmFtcygpLCEwKTooMD09PXRoaXMubV9wb2ludENvdW50JiYodGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50PTApLCExKX1mb3JjZUNvbXBhY3RTZWdtZW50UGFyYW1zKCl7bGV0IHQ9MDtmb3IobGV0IG49MCxpPXRoaXMuZ2V0UG9pbnRDb3VudCgpO248aTtuKyspe2NvbnN0IGU9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKG4pO2lmKFVzLmlzTm9uTGluZWFyU2VnbWVudEZsYWcoZSkpe3QrPUdzKGUpfX1jb25zdCBlPXoodCk7bGV0IHM9MDtmb3IobGV0IG49MCxpPXRoaXMuZ2V0UG9pbnRDb3VudCgpO248aTtuKyspe2NvbnN0IHQ9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKG4pO2lmKFVzLmlzTm9uTGluZWFyU2VnbWVudEZsYWcodCkpe2xldCBpPXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5yZWFkKG4pO3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC53cml0ZShuLHMpO2NvbnN0IHI9R3ModCk7Zm9yKGxldCB0PTA7dDxyO3QrKyllLndyaXRlKHMsdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMucmVhZChpKSkscysrLGkrK319dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXM9ZSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQ9c31zZXRFbXB0eSgpe3RoaXMubV9jdXJ2ZURhdGEmJih0aGlzLnJlbW92ZUFsbEN1cnZlc0Zyb21HbG9iYWxDb3VudGVyKCksdGhpcy5tX2N1cnZlRGF0YT1udWxsKSx0aGlzLm1fYlBhdGhTdGFydGVkPSExLHRoaXMubV9wYXRocz1udWxsLHRoaXMubV9wYXRoRmxhZ3M9bnVsbCx0aGlzLnNldEVtcHR5SW1wbCgpfWFwcGx5VHJhbnNmb3JtYXRpb24odCl7dGhpcy5hcHBseVRyYW5zZm9ybWF0aW9uVG9QYXRoKHQsLTEpfWFwcGx5VHJhbnNmb3JtYXRpb24zRCh0KXtzKDApfWdldEltcGwoKXtyZXR1cm4gdGhpc31yZXNlcnZlKHQpe3RoaXMucmVzZXJ2ZUltcGwodCksdD4wJiYhdGhpcy5tX3BhdGhzJiYodGhpcy5tX3BhdGhzPUwoMCksdGhpcy5tX3BhdGhGbGFncz1SKDApLHRoaXMubV9wYXRocy5yZXNlcnZlKDIpLHRoaXMubV9wYXRoRmxhZ3MucmVzZXJ2ZSgyKSx0aGlzLm1fcGF0aHMucmVzaXplKDEsMCksdGhpcy5tX3BhdGhGbGFncy5yZXNpemUoMSx0aGlzLm1fYlBvbHlnb24/MTowKSl9cmVzZXJ2ZVBhcnRzKHQsZSl7dGhpcy5yZXNlcnZlSW1wbCh0KSxlPjAmJih0aGlzLm1fcGF0aHM/KHRoaXMubV9wYXRocy5yZXNlcnZlKGUrMSksdGhpcy5tX3BhdGhGbGFncy5yZXNlcnZlKGUrMSkpOih0aGlzLm1fcGF0aHM9TCgwKSx0aGlzLm1fcGF0aEZsYWdzPVIoMCksdGhpcy5tX3BhdGhzLnJlc2VydmUoZSsxKSx0aGlzLm1fcGF0aEZsYWdzLnJlc2VydmUoZSsxKSx0aGlzLm1fcGF0aHMucmVzaXplKDEsMCksdGhpcy5tX3BhdGhGbGFncy5yZXNpemUoMSx0aGlzLm1fYlBvbHlnb24/MTowKSkpfWNsb25lKCl7Y29uc3QgdD10aGlzLmNyZWF0ZUluc3RhbmNlKCk7cmV0dXJuIHRoaXMuY29weVRvKHQpLHR9cXVlcnlMaW1pdGVkU2VnbWVudEl0ZXJhdG9yKHQpe3JldHVybiBuZXcgT3ModGhpcyx0KX1nZXRQYXRoU3RyZWFtUmVmKCl7cmV0dXJuIHRoaXMudGhyb3dJZkVtcHR5KCksdGhpcy5tX3BhdGhzfXNldFBhdGhTdHJlYW1SZWYodCl7dGhpcy5tX3BhdGhzPXR9Z2V0U2VnbWVudEZsYWdzU3RyZWFtUmVmKCl7cmV0dXJuIHRoaXMudGhyb3dJZkVtcHR5KCksbnVsbCE9dGhpcy5tX2N1cnZlRGF0YT90aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzOm51bGx9Z2V0UGF0aEZsYWdzU3RyZWFtUmVmKCl7cmV0dXJuIHRoaXMudGhyb3dJZkVtcHR5KCksdGhpcy5tX3BhdGhGbGFnc31zZXRQYXRoRmxhZ3NTdHJlYW1SZWYodCl7dGhpcy5tX3BhdGhGbGFncz10fWdldFNlZ21lbnRJbmRleFN0cmVhbVJlZigpe3JldHVybiB0aGlzLnRocm93SWZFbXB0eSgpLG51bGwhPT10aGlzLm1fY3VydmVEYXRhP3RoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleDpudWxsfWdldFNlZ21lbnREYXRhU3RyZWFtUmVmKCl7cmV0dXJuIHRoaXMudGhyb3dJZkVtcHR5KCksbnVsbCE9PXRoaXMubV9jdXJ2ZURhdGE/dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXM6bnVsbH1zZXRTZWdtZW50RGF0YSh0LGUscyxuKXt0aGlzLm1fY3VydmVEYXRhfHwodGhpcy5tX2N1cnZlRGF0YT1uZXcgSHMpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3M9cyx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcz1lLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleD10LHRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludD1ufXN0YXRpYyBnZXRQYXRoSW5kZXhGcm9tUG9pbnRJbmRleEltcGwodCxlLHMsbil7aWYobj49MCYmbjxlKXtpZihzPj10LnJlYWQobikpe2lmKHM8dC5yZWFkKG4rMSkpcmV0dXJuIG47bisrfWVsc2Ugbi0tO2lmKG4+PTAmJm48ZSYmcz49dC5yZWFkKG4pJiZzPHQucmVhZChuKzEpKXJldHVybiBufWlmKGU8NSl7Zm9yKGxldCBuPTA7bjxlO24rKylpZihzPHQucmVhZChuKzEpKXJldHVybiBuO2coXCJcIil9bGV0IGk9MCxyPWUtMTtmb3IoO3I+aTspe2NvbnN0IGU9aSsoci1pPj4xKTtpZihzPHQucmVhZChlKSlyPWUtMTtlbHNle2lmKCEocz49dC5yZWFkKGUrMSkpKXJldHVybi
1BlO2k9ZSsxfX1yZXR1cm4gaX1nZXRIaWdoZXN0UG9pbnRJbmRleCh0KXtzKHQ+PTAmJnQ8dGhpcy5nZXRQYXRoQ291bnQoKSk7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKSxuPXRoaXMuZ2V0UGF0aEVuZCh0KSxpPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpO2xldCByPS0xO2NvbnN0IG89bmV3IEo7by55PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxvLng9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO2ZvcihsZXQgcz1pKzA7czxuO3MrKyl7Y29uc3QgdD1lLnJlYWRQb2ludDJEKDIqcyk7LTE9PT1vLmNvbXBhcmUodCkmJihyPXMsby5zZXRDb29yZHNQb2ludDJEKHQpKX1yZXR1cm4gcn1hcHBseVRyYW5zZm9ybWF0aW9uVG9QYXRoKHQscyl7aWYocz49dGhpcy5nZXRQYXRoQ291bnQoKSYmZShcImFwcGx5X3RyYW5zZm9ybWF0aW9uXCIpLHRoaXMuaXNFbXB0eSgpKXJldHVybjtpZih0LmlzSWRlbnRpdHkoKSlyZXR1cm47Y29uc3Qgbj10aGlzLm1fdmVydGV4QXR0cmlidXRlcy5nZXQoMCk7aWYoIShzPDA/dGhpcy5oYXNOb25MaW5lYXJTZWdtZW50cygpOnRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHNQYXRoKHMpKSl7bGV0IGUsaTtyZXR1cm4gczwwPyhlPTAsaT10aGlzLm1fcG9pbnRDb3VudCk6KGU9dGhpcy5nZXRQYXRoU3RhcnQocyksaT10aGlzLmdldFBhdGhFbmQocykpLG4uYXBwbHlUcmFuc2Zvcm1hdGlvbih0LDIqZSxpLWUpLHZvaWQgdGhpcy5ub3RpZnlNb2RpZmllZEZsYWdzKDIwMDEpfWNvbnN0IGk9bmV3IHRoaXMubV9zZWdtZW50QnVmZmVyQ1RvcixyPXRoaXMuZ2V0UGF0aENvdW50KCk7bGV0IG89czwwPzA6cztkb3tjb25zdCBlPXRoaXMuZ2V0UGF0aFN0YXJ0KG8pLHI9dGhpcy5nZXRQYXRoRW5kKG8pLGE9dGhpcy5pc0Nsb3NlZFBhdGgobyksaD1uLnJlYWRQb2ludDJEKDIqZSk7aWYoIXRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHNQYXRoKG8pKXtuLmFwcGx5VHJhbnNmb3JtYXRpb24odCwyKmUsci1lKTtjb250aW51ZX1jb25zdCB1PUouZ2V0TkFOKCk7Zm9yKGxldCBzPWU7czxyOysrcyl7aWYoMSE9PSgzMSZ0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlYWQocykpKXtjb25zdCBvPWEmJnMrMT09PXI7byYmbi53cml0ZVBvaW50MkQoMiplLGgpLHRoaXMuZ2V0U2VnbWVudEJ1ZmZlcihzLGksITApLGkuZ2V0KCkuYXBwbHlUcmFuc2Zvcm1hdGlvbih0KTtjb25zdCB1PXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5yZWFkKHMpO2kuZ2V0KCkud3JpdGVJbkJ1ZmZlclN0cmVhbSh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcyx1KSxuLndyaXRlUG9pbnQyRCgyKnMsaS5nZXQoKS5nZXRTdGFydFhZKCkpLG8mJm4ud3JpdGVQb2ludDJEKDIqZSxpLmdldCgpLmdldEVuZFhZKCkpO2NvbnRpbnVlfWNvbnN0IG89MipzO24ucXVlcnlQb2ludDJEKG8sdSksdC50cmFuc2Zvcm1JblBsYWNlKHUpLG4ud3JpdGVQb2ludDJEKG8sdSl9aWYobz09PXMpYnJlYWt9d2hpbGUoKytvPHIpO3RoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKX1jYWxjdWxhdGVTdWJMZW5ndGgyRCh0LGUscyxuKXtjb25zdCBpPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpK2Uscj10aGlzLmdldFBhdGhTdGFydChzKStuOyhyPGl8fGk8MHx8cj50aGlzLmdldFBvaW50Q291bnQoKS0xKSYmZChcIlwiKTtjb25zdCBvPXRoaXMucXVlcnlTZWdtZW50SXRlcmF0b3IoKTtsZXQgYT0wO28ucmVzZXRUb1ZlcnRleChpLHQpO2Rve2Zvcig7by5oYXNOZXh0U2VnbWVudCgpOyl7Y29uc3QgdD1vLm5leHRTZWdtZW50KCk7aWYoby5nZXRTdGFydFBvaW50SW5kZXgoKT09PXIpYnJlYWs7YSs9dC5jYWxjdWxhdGVMZW5ndGgyRCgpfWlmKG8uZ2V0U3RhcnRQb2ludEluZGV4KCk9PT1yKWJyZWFrfXdoaWxlKG8ubmV4dFBhdGgoKSk7cmV0dXJuIGF9Y2FsY3VsYXRlUGF0aFN1Ykxlbmd0aDJEKHQscyxuKXtjb25zdCBpPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpK3Mscj10aGlzLmdldFBhdGhTdGFydCh0KStuOyhpPDB8fHI+dGhpcy5nZXRQb2ludENvdW50KCktMSkmJmQoXCJcIik7Y29uc3Qgbz10aGlzLnF1ZXJ5U2VnbWVudEl0ZXJhdG9yKCk7aWYoaT5yJiYodGhpcy5pc0Nsb3NlZFBhdGgodCl8fGUoXCJjYW5ub3QgaXRlcmF0ZSBhY3Jvc3MgYW4gb3BlbiBwYXRoXCIpLG8uc2V0Q2lyY3VsYXRvcighMCkpLGk9PT1yKXJldHVybiAwO2xldCBhPTAsaD0wO28ucmVzZXRUb1ZlcnRleChpLHQpO2Rve2grPWE7YT1vLm5leHRTZWdtZW50KCkuY2FsY3VsYXRlTGVuZ3RoMkQoKX13aGlsZShvLmdldFN0YXJ0UG9pbnRJbmRleCgpIT09cik7cmV0dXJuIGh9Y2FsY3VsYXRlRW52ZWxvcGUyRCh0KXtyZXR1cm4gdGhpcy51cGRhdGVYWUltcGwodCl9dXBkYXRlWFlJbXBsKHQpe2NvbnN0IGU9c3VwZXIudXBkYXRlWFlJbXBsKHQpO2lmKHRoaXMuaGFzTm9uTGluZWFyU2VnbWVudHMoKSl7Y29uc3Qgcz1sZS5jb25zdHJ1Y3RFbXB0eSgpLG49dGhpcy5xdWVyeVNlZ21lbnRJdGVyYXRvcigpO2Zvcig7bi5uZXh0UGF0aCgpOylmb3IoO24uaGFzTmV4dFNlZ21lbnQoKTspe2NvbnN0IGk9bi5uZXh0Q3VydmUoKTtpZighaSlicmVhazt0P2kucXVlcnlFbnZlbG9wZShzKTppLnF1ZXJ5TG9vc2VFbnZlbG9wZShzKSxlLm1lcmdlRW52ZWxvcGUyRChzKX19cmV0dXJuIGV9bm90aWZ5TW9kaWZpZWRBbGxJbX
1BsKCl7bnVsbCE9PXRoaXMubV9wYXRocyYmdGhpcy5tX3BhdGhzLnNpemUoKT90aGlzLm1fcG9pbnRDb3VudD10aGlzLm1fcGF0aHMucmVhZCh0aGlzLm1fcGF0aHMuc2l6ZSgpLTEpOnRoaXMubV9wb2ludENvdW50PTB9c2V0RGlydHlPR0NGbGFncyh0KXt0aGlzLnNldERpcnR5RmxhZ1Byb3RlY3RlZCgxNix0KX1oYXNEaXJ0eU9HQ1N0YXJ0RmxhZ3MoKXtyZXR1cm4gdGhpcy5oYXNEaXJ0eUZsYWcoMTYpfXNldERpcnR5UmluZ0FyZWFzMkQodCl7dGhpcy5zZXREaXJ0eUZsYWdQcm90ZWN0ZWQoMTAyNCx0KX1oYXNEaXJ0eVJpbmdBcmVhczJEKCl7cmV0dXJuIHRoaXMuaGFzRGlydHlGbGFnKDEwMjQpfXN0YXRpYyBpc05vbkxpbmVhclNlZ21lbnRGbGFnKHQpe3JldHVybiEoMSZ0KX1hZGRBbmRFeHBsaWNpdGx5T3BlbkFsbFBhdGhzKHQscyl7dGhpcz09PXQmJmUoXCJNdWx0aV9wYXRoX2ltcGw6OmFkZFwiKTtsZXQgbj10aGlzLmdldFBhdGhDb3VudCgpO2ZvcihsZXQgZT0wLGk9dC5nZXRQYXRoQ291bnQoKTtlPGk7ZSsrKXRoaXMuYWRkUGF0aCh0LGUsIXMpLHRoaXMub3BlblBhdGhBbmREdXBsaWNhdGVTdGFydFZlcnRleChuKSxuKyt9Z2V0U2VnbWVudEZsYWdzKHQpe3JldHVybiBudWxsIT09dGhpcy5tX2N1cnZlRGF0YSYmbnVsbCE9PXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3M/dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKHQpOjF9Z2V0U2VnbWVudEJ1ZmZlcih0LHMsbil7Y29uc3QgaT10aGlzLmdldFBhdGhJbmRleEZyb21Qb2ludEluZGV4KHQpLHI9dC10aGlzLmdldFBhdGhTdGFydChpKTtyPj10aGlzLmdldFNlZ21lbnRDb3VudFBhdGgoaSkmJmUoXCJnZXRTZWdtZW50QnVmZmVyXCIpLHRoaXMuZ2V0U2VnbWVudEZyb21QYXRoKGkscixzLG4pfWdldFNlZ21lbnRUeXBlRnJvbVBhdGgodCxlKXtjb25zdCBzPXRoaXMuZ2V0UGF0aFN0YXJ0KHQpK2Usbj10aGlzLmdldFNlZ21lbnRGbGFnc1N0cmVhbVJlZigpO2xldCByPTE7c3dpdGNoKG4mJihyPTMxJm4ucmVhZChzKSkscil7Y2FzZSAxOnJldHVybiBpLmVudW1MaW5lO2Nhc2UgMjpyZXR1cm4gaS5lbnVtQmV6aWVyO2Nhc2UgNDpyZXR1cm4gaS5lbnVtRWxsaXB0aWNBcmM7Y2FzZSA4OnJldHVybiBpLmVudW1SYXRpb25hbEJlemllcjI7Y2FzZSAxNjpyZXR1cm4gaS5lbnVtQmV6aWVyMjtkZWZhdWx0OmgoXCJcIil9fWVuc3VyZVhZTW9ub3RvbmVTZWdtZW50cygpe2lmKCF0aGlzLm1fY3VydmVEYXRhKXJldHVybiExO2xldCB0PSExO2ZvcihsZXQgZT0wLHM9dGhpcy5nZXRQYXRoQ291bnQoKTtlPHM7ZSsrKXtjb25zdCBzPXRoaXMuZ2V0UGF0aFN0YXJ0KGUpLG49dGhpcy5nZXRQYXRoRW5kKGUpLGk9bi1zO2ZvcihsZXQgZT1zO2U8bjtlKyspe2NvbnN0IG49MzEmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKGUpO2lmKDE9PT1uKWNvbnRpbnVlOzIhPT1uJiZhKFwiZW5zdXJlX3h5X21vbm90b25lX3NlZ21lbnRzXCIpO2NvbnN0IHI9KGUtcysxKSVpK3Msbz10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmVhZChlKSxoPWN0KEosNCk7aFswXT10aGlzLmdldFhZKGUpLGhbM109dGhpcy5nZXRYWShyKSxoWzFdLng9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMucmVhZChvKSxoWzFdLnk9dGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMucmVhZChvKzEpLGhbMl0ueD10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5yZWFkKG8rMiksaFsyXS55PXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLnJlYWQobyszKSxWZShoKSYmKHQ9ITAsdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRQYXJhbXMud3JpdGUobyxoWzFdLngpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLndyaXRlKG8rMSxoWzFdLnkpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLndyaXRlKG8rMixoWzJdLngpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLndyaXRlKG8rMyxoWzJdLnkpKX19cmV0dXJuIHQmJnRoaXMubm90aWZ5TW9kaWZpZWRGbGFncygyMDAxKSx0fWJ1aWxkUmFzdGVyaXplZEdlb21ldHJ5QWNjZWxlcmF0b3IodCxlKXtyZXR1cm4hMX1idWlsZFF1YWRUcmVlQWNjZWxlcmF0b3IodCl7aWYodGhpcy5tX2FjY2VsZXJhdG9yc3x8KHRoaXMubV9hY2NlbGVyYXRvcnM9bmV3IExzKSxudWxsIT09dGhpcy5tX2FjY2VsZXJhdG9ycy5nZXRRdWFkVHJlZSgpKXJldHVybiEwO3RoaXMuZW5zdXJlVW5pcXVlQWNjZWxlcmF0b3JzKCksdGhpcy5tX2FjY2VsZXJhdG9ycy5zZXRRdWFkVHJlZShudWxsKTtjb25zdCBlPUIodGhpcyk7cmV0dXJuIHRoaXMubV9hY2NlbGVyYXRvcnMuc2V0UXVhZFRyZWUoZSksITB9YnVpbGRRdWFkVHJlZUZvclBhdGhzQWNjZWxlcmF0b3IodCl7aWYodGhpcy5tX2FjY2VsZXJhdG9yc3x8KHRoaXMubV9hY2NlbGVyYXRvcnM9bmV3IExzKSxudWxsIT09dGhpcy5tX2FjY2VsZXJhdG9ycy5nZXRRdWFkVHJlZUZvclBhdGhzKCkpcmV0dXJuITA7dGhpcy5lbnN1cmVVbmlxdWVBY2NlbGVyYXRvcnMoKSx0aGlzLm1fYWNjZWxlcmF0b3JzLnNldFF1YWRUcmVlRm9yUGF0aHMobnVsbCk7Y29uc3QgZT1rKHRoaXMpO3JldHVybiB0aGlzLm1fYWNjZWxlcmF0b3JzLnNldFF1YWRUcmVlRm9yUGF0aHMoZSksITB9dXBkYXRlQ3VydmVDb3VudGVyKHQpe3RoaXMubW9kaWZ5Q3VydmVDb3VudGVyKHQtdGhpcy5nZXRDdXJ2ZUNvdW50KCkpfXJlbW92ZUFsbEN1cnZlc0Zyb21HbG9iYWxDb3VudGVyKCl7dGhpcy5tX2N1cnZlRGF0YSYmKFVzLnN0X3RvdGFsQ3VydmVDb3VudC09dGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlQ291bnQsdGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlQ291bnQ9MCx0aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyQ291bnQ9MCx0aGlzLm1fY3VydmVEYXRhLm1fYXJjQ291bnQ9MCx0aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyMkNvdW50PTAsdGhpcy5tX2N1cnZlRGF0YS5tX3JiZXppZXIyQ291bnQ9MCx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQ9MCl9bW9kaWZ5Q3VydmVDb3VudGVyKHQpe3QmJih0aGlzLm1fY3VydmVEYXRhfHwodGhpcy5tX2N1cnZlRGF0YT1uZXcgSHMpLFVzLnN0X3RvdGFsQ3VydmVDb3VudCs9dCx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVDb3VudCs9dCl9Z2V0Q3VydmVDb3VudCgpe3JldHVybiB0aGlzLm1fY3VydmVEYXRhP3RoaXMubV9
1jdXJ2ZURhdGEubV9jdXJ2ZUNvdW50OjB9aW5jQ3VydmVUeXBlKHQsZSl7dGhpcy5tX2N1cnZlRGF0YXx8KHRoaXMubV9jdXJ2ZURhdGE9bmV3IEhzKSwyJnQ/dGhpcy5tX2N1cnZlRGF0YS5tX2JlemllckNvdW50Kz1lOjQmdD90aGlzLm1fY3VydmVEYXRhLm1fYXJjQ291bnQrPWU6OCZ0P3RoaXMubV9jdXJ2ZURhdGEubV9yYmV6aWVyMkNvdW50Kz1lOjE2JnQmJih0aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyMkNvdW50Kz1lKX1nZXRDdXJ2ZVdyaXRlUG9pbnQoKXtyZXR1cm4gbnVsbCE9PXRoaXMubV9jdXJ2ZURhdGE/dGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50OjB9aW5pdFNlZ21lbnREYXRhKHQpe251bGw9PT10aGlzLm1fY3VydmVEYXRhJiYodGhpcy5tX2N1cnZlRGF0YT1uZXcgSHMpO2NvbnN0IGU9dGhpcy5tX3Jlc2VydmVkUG9pbnRDb3VudD4wP3RoaXMubV9yZXNlcnZlZFBvaW50Q291bnQ6dGhpcy5tX3BvaW50Q291bnQ7bnVsbD09PXRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleCYmKHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3M9UihlLDEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleD1MKGUsLTEpKTtjb25zdCBzPXRoaXMubV9jdXJ2ZURhdGEubV9jdXJ2ZVBhcmFtV3JpdGVQb2ludCt0O251bGw9PT10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcz90aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcz16KHMpOnMhPT10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcy5zaXplKCkmJnRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1zLnJlc2l6ZShzLDApLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50RmxhZ3Muc2l6ZSgpPGUmJih0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLnJlc2l6ZShlLDEpLHRoaXMubV9jdXJ2ZURhdGEubV9zZWdtZW50UGFyYW1JbmRleC5yZXNpemUoZSwtMSkpfXVwZGF0ZUN1cnZlV3JpdGVQb2ludCh0KXtudWxsPT09dGhpcy5tX2N1cnZlRGF0YSYmKHRoaXMubV9jdXJ2ZURhdGE9bmV3IEhzKSx0aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQ9dH11cGRhdGVPR0NGbGFnc0hlbHBlcigpe2NvbnN0IHQ9dGhpcy5nZXRQYXRoQ291bnQoKTtpZigwPT09dClyZXR1cm47Y29uc3QgZT10aGlzLm1fcGF0aEZsYWdzO2xldCBzPTA7Zm9yKGxldCBuPTA7bjx0O24rKyl7Y29uc3QgdD10aGlzLm1fY2FjaGVkUmluZ0FyZWFzMkQucmVhZChuKTswPT09cyYmKHM9TnQodCkpLHQqcz4wfHwwPT09cz9lLnNldEJpdHMobiw4KTplLmNsZWFyQml0cyhuLDgpfX11cGRhdGVPR0NGbGFnc1Byb3RlY3RlZCgpe3RoaXMuaGFzRGlydHlGbGFnKDE2KSYmKHRoaXMudXBkYXRlUmluZ0FyZWFzMkRQcm90ZWN0ZWQoKSx0aGlzLnVwZGF0ZU9HQ0ZsYWdzSGVscGVyKCksdGhpcy5zZXREaXJ0eUZsYWdQcm90ZWN0ZWQoMTYsITEpKX1yZXBsYWNlU2VnbWVudCh0LG4saSl7KHQ8MHx8dD49dGhpcy5nZXRQb2ludENvdW50KCkpJiZlKFwiTXVsdGlfcGF0aF9pbXBsLnJlcGxhY2Vfc2VnbWVudFwiKSxzKG4uaXNDdXJ2ZSgpKTtjb25zdCByPXRoaXMuZ2V0UGF0aEluZGV4RnJvbVBvaW50SW5kZXgodCksbz10aGlzLmdldFBhdGhTdGFydChyKSxhPSh0LW8rMSkldGhpcy5nZXRQYXRoU2l6ZShyKStvO3tjb25zdCBlPXRoaXMuZ2V0WFkodCksaT10aGlzLmdldFhZKGEpLHI9IWUuaXNFcXVhbFBvaW50MkQobi5nZXRTdGFydFhZKCkpfHwhaS5pc0VxdWFsUG9pbnQyRChuLmdldEVuZFhZKCkpO3MoIXIpfXRoaXMucmVwbGFjZVNlZ21lbnRJbXBsKHQsYSxuLGkpfXJlcGxhY2VTZWdtZW50SW1wbCh0LGUsbixpKXtjb25zdCByPW4uZ2V0RGVzY3JpcHRpb24oKTt0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24ocik7Y29uc3Qgbz1PKDMyLE51bWJlci5OYU4pLGE9bmV3IEYoe3ZkOnIsYXR0cmliQnVmZmVyOm8saW5pdERlZmF1bHRWYWx1ZXM6ITF9KSxoPW51bGw9PT10aGlzLm1fY3VydmVEYXRhPzE6MzEmdGhpcy5tX2N1cnZlRGF0YS5tX3NlZ21lbnRGbGFncy5yZWFkKHQpLHU9R3MoaCksbT1rcyhuKTtsZXQgbCxjPSExO3U+PW0/KHMobnVsbCE9PXRoaXMubV9jdXJ2ZURhdGEpLGM9ITAsbD10aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgucmVhZCh0KSk6KHRoaXMuaW5pdFNlZ21lbnREYXRhKG0pLGM9ITEsbD10aGlzLm1fY3VydmVEYXRhLm1fY3VydmVQYXJhbVdyaXRlUG9pbnQpO2NvbnN0IGc9bi5nZXRHZW9tZXRyeVR5cGUoKSxkPUhzLnRvU2VnVHlwZShnKTtpfHwobi5xdWVyeVN0YXJ0KGEpLHRoaXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKHQsYSksbi5xdWVyeUVuZChhKSx0aGlzLnNldFBvaW50QnlWYWxOb0N1cnZlcyhlLGEpKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtSW5kZXgud3JpdGUodCwxIT09ZD9sOi0xKSx0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudEZsYWdzLndyaXRlKHQsZCksMSE9PWQmJm4ud3JpdGVJbkJ1ZmZlclN0cmVhbSh0aGlzLm1fY3VydmVEYXRhLm1fc2VnbWVudFBhcmFtcyxsKSxjfHwodGhpcy5tX2N1cnZlRGF0YS5tX2N1cnZlUGFyYW1Xcml0ZVBvaW50Kz1tKSxoIT09ZCYmKHRoaXMuaW5jQ3VydmVUeXBlKGgsLTEpLHRoaXMuaW5jQ3VydmVUeXBlKGQsMSksdGhpcy5tb2RpZnlDdXJ2ZUNvdW50ZXIoMT09PWg/MTotMSkpfXNldEF0dHJpYnV0ZUltcGwodCxzLG4pe2lmKHRoaXMuYWRkQXR0cmlidXRlKHQpLCF0aGlzLmlzRW1wdHkoKSlpZih0aGlzLmhhc05vbkxpbmVhclNlZ21lbnRzKCkmJjA9PT10KXsoczwwfHxzPjEpJiZlKFwiXCIpO2NvbnN0IHQ9bmV3IGNlLGk9MD09PXM/bjowLHI9MD09PXM/MDoxO3Quc2V0U2hpZnRDb29yZHMoaSxyKSwwPT09cz90Lnh4PTA6dC55eT0wLHRoaXMuYXBwbHlUcmFuc2Zvcm1hdGlvbih0KX1lbHNlIHN1cGVyLnNldEF0dHJpYnV0ZUltcGwodCxzLG4pfXRvRmxhdEdlb21ldHJ5KCl7Y29uc3QgdD10aGlzLm1fYlBvbHlnb24/XCJwb2x5Z29uXCI6XCJwb2x5bGluZVwiLGU9dGhpcy5nZXRQYXRoQ291bnQoKSxzPXRoaXMubV9wYXRocz90aGlzLm1fcGF0aHMuZ2V0QXJyYXkoKTpuZXcgSW50MzJBcnJheSxuPXRoaXMubV9wYXRocz90aGlzLm1fcGF0aEZsYWdzLmdldEFycmF5KCk6bmV3IEludDhBcnJheTtsZXQgaSxyLG8sYT0wLGg9MDtpZih0aGlzLm1fY3VydmVEYXRhKXtjb25zdHttX3NlZ21lbnRGbGFnczp0LG1fc2VnbWVudFBhcmFtSW5kZXg6ZSxtX3NlZ21lbnRQYXJhbXM6c309dGhpcy5tX2N1cnZlRGF0YTtpPXQ/LmdldEFycmF5KCk/P25ldyBJbnQ4QXJyYXkscj1lPy5nZXRBcnJheSgpPz9uZXcgSW50MzJBcnJheSxvPXM/LmdldEFycmF5KCk/P25ldyBGbG9hdDY0QXJyYXksYT10aGlzLm1fY3VydmVEYXRhLm1fYXJjQ291bnQsaD10aGlzLm1fY3VydmVEYXRhLm1fYmV6aWVyQ291bnR9cmV0dXJue3R5cGU6dCwuLi50aGlzLmV4cG9ydFZlcnRleEF0dHJpYnV0ZXMoKSxwYXJ0Q291bnQ6ZSxwYXJ0T2Zmc2V0czpzLHBhcnRGbGFnczpuLHNlZ21lbnRGbGFnczppLHNlZ21lbnRJbmRpY2VzOnIsc2VnbWVudFBhcmFtczpvLHNlZ21lbnRDb3VudEFyYzphLHNlZ21lbnRDb3VudEJlemllcjpofX19VXMuc3RfdG90YWxDdXJ2ZUNvdW50PTA7Y2xhc3MgT3N7Y29uc3RydWN0b3IodCxlKXt0aGlzLm1fc2VnSXRlcj1udWxsLHRoaXMubV9xdWFkVHJlZT1udWxsLHRoaXMubV9xdEl0ZXI9bnVsbCx0aGlzLm1fZXh0ZW50T2ZJbnRlcmVzdD1uZXcgbGUoZSksdGhpcy5tX2JmaXJzdD0hMCx0aGlzLm1fcHJldkluZGV4PS0xMDAsdGhpcy5tX3BhcmVudD10fW5leHRTZWdtZW50KCl7cmV0dXJuIHRoaXMubV9iZmlyc3QmJnRoaXMucHJlcGFyZV8oKSx0aGlzLm1fcXVhZFRyZWU/dGhpcy5uZXh0U2VnbWVudFF0KCk6dGhpcy5uZXh0U2VnbWVudE5vUXQoKX1nZXRQYXRoSW5kZXgoKXtyZXR1cm4gdGhpcy5tX3NlZ0l0ZXIuZ2V0UGF0aEluZGV4KCl9Z2V0U3RhcnRQb2ludEluZGV4KCl7cmV0dXJuIHRoaXMubV9zZWdJdGVyLmdldFN0YXJ0UG9pbnRJbmRleCgpfWdldEVuZFBvaW50SW5kZXgoKXtyZXR1cm4gdGhpcy5tX3NlZ0l0ZXIuZ2V0RW5kUG9pbnRJbmRleCgpfWlzQ2xvc2luZ1NlZ21lbnQoKXtyZXR1cm4gdGhpcy5tX3NlZ0l0ZXIuaXNDbG9zaW5nU2VnbWVudCgpfWlzUGF0aENsb3NlZCgpe3JldHVybiB0aGlzLm1fc2VnSXRlci5pc1BhdGhDbG9zZWQoKX1wcmVwYXJlXygpe2NvbnN0IHQ9dGhpcy5tX3BhcmVudC5nZXRBY2NlbGVyYXRvcnMoKTt0JiYodGhpcy5tX3F1YWRUcmVlPXQuZ2V0UXVhZFRyZWUoKSx0aGlzLm1fcXVhZFRyZWUmJih0aGlzLm1fcXRJdGVyPXRoaXMubV9xdWFkVHJlZS5nZXRTb3J0ZWRJdGVyYXRvcih0aGlzLm1fZXh0ZW50T2ZJbnRlcmVzdCwwKSkpLHRoaXMubV9zZWdJdGVyPXRoaXMubV9wYXJlbnQucXVlcnlTZWdtZW50SXRlcmF0b3IoKX1uZXh0U2VnbWVudFF0KCl7dGhpcy5tX2JmaXJzdD0hMTtjb25zdCB0PXRoaXMubV9xdEl0ZXIubmV4dCgpO2lmKC0xPT09dClyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMubV9xdWFkVHJlZS5nZXRFbGVtZW50KHQpOyhlIT09dGhpcy5tX3ByZXZJbmRleCsxfHx0aGlzLm1fc2VnSXRlci5pc0xhc3RTZWdtZW50SW5QYXRoKCkpJiYodGhpcy5tX3NlZ0l0ZXIucmVzZXRUb1ZlcnRleChlLHRoaXMubV9zZWdJdGVyLmdldFBhdGhJbmRleCgpKSx0aGlzLm1fcHJldkluZGV4PWUpO3JldHVybiB0aGlzLm1fc2VnSXRlci5uZXh0U2VnbWVudCgpfW5leHRTZWdtZW50Tm9RdCgpe2Zvcig7Oyl7aWYoIXRoaXMubV9iZmlyc3QmJnRoaXMubV9zZWdJdGVyLmhhc05leHRTZWdtZW50KCkpe2NvbnN0IHQ9dGhpcy5tX3NlZ0l0ZXIubmV4dFNlZ21lbnQoKSxlPWxlLmNvbnN0cnVjdEVtcHR5KCk7aWYodC5xdWVyeUxvb3NlRW52ZWxvcGUoZSksIWUuaXNJbnRlcnNlY3RpbmcodGhpcy5tX2V4dGVudE9mSW50ZXJlc3QpKWNvbnRpbnVlO3JldHVybiB0fWlmKHRoaXMubV9iZmlyc3Q9ITEsIXRoaXMubV9zZWdJdGVyLm5leHRQYXRoKCkpcmV0dXJuIG51bGx9fX1jbGFzcyBRcyBleHRlbmRzIFVze2NvbnN0cnVjdG9yKHQpe3Q/dC52ZD8oc3VwZXIoe3ZkOnQudmQsYlBvbHlnb246ITF9KSx0aGlzLm1fc2VnbWVudEJ1ZmZlckNUb3I9UG0pOnQuY29weT8oc3VwZXIoe3ZkOnQuY29weS5nZXREZXNjcmlwdGlvbigpLGJQb2x5Z29uOiExfSksdGhpcy5tX3NlZ21lbnRCdWZmZXJDVG9yPVBtLHQuY29weS5jb3B5VG8odGhpcykpOnQubW92ZT8oc3VwZXIoe21vdmU6dC5tb3ZlfSksdGhpcy5tX3NlZ21lbnRCdWZmZXJDVG9yPVBtKTp0LnN0YXJ0PyhzdXBlcih7dmQ6dC5zdGFydC5nZXREZXNjcmlwdGlvbigpLGJQb2x5Z29uOiExfSksdGhpcy5tX3NlZ21lbnRCdWZmZXJDVG9yPVBtLHRoaXMuc3RhcnRQYXRoUG9pbnQodC5zdGFydCksdGhpcy5saW5lVG9Qb2ludCh0LmVuZCkpOnQucGF0aD8oc3VwZXIoe2JQb2x5Z29uOiExfSksdGhpcy5tX3NlZ21lbnRCdWZmZXJDVG9yPVBtLHRoaXMuYWRkUGF0aFBvaW50MkQodC5wYXRoLHQucG9pbnRDb3VudCx0LmJGb3J3YXJkKSk6aChcImJhZCBjb25zdHJ1Y3RvciBhcmdcIik6KHN1cGVyKHtiUG9seWdvbjohMX0pLHRoaXMubV9zZWdtZW50QnVmZmVyQ1Rvcj1QbSl9Z2V0Qm91bmRhcnkoKXtyZXR1cm4gJHModGhpcyl9YXNzaWduQ29weSh0KXtyZXR1cm4gdGhpcyE9PXQmJnQuY29weVRvKHRoaXMpLHRoaXN9YXNzaWduTW92ZSh0KXtyZXR1cm4gdC5jb3B5VG8odGhpcyksdGhpc31nZXRHZW9tZXRyeVR5cGUoKXtyZXR1cm4gUXMudHlwZX1nZXREaW1lbnNpb24oKXtyZXR1cm4gMX1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgUXMoe3ZkOnRoaXMuZ2V0RGVzY3JpcHRpb24oKX0pfWVxdWFscyh0LGUpe3JldHVybiB0aGlzLmVxdWFsc0Jhc2UodCxlKX19UXMudHlwZT1pLmVudW1Qb2x5bGluZTt2YXIgSnM9aTtmdW5jdGlvbiBLcyh0LGUpe2lmKHQuaXNFbXB0eSgpKXJldHVybiExO2NvbnN0IHM9dC5nZXRHZW9tZXRyeVR5cGUoKTtpZihzPT09SnMuZW51bVBvbHlnb24pcmV0dXJuIDAhPT10LmNhbGN1bGF0ZUFyZWEyRCgpO2lmKHM9PT1Kcy5lbnVtUG9seWxpbmUpcmV0dXJuIHRuKHQuZ2V0SW1wbCgpLGUsITApLmJOb3RFbXB0eTtpZihzPT09SnMuZW51bUVudmVsb3BlKXJldHVybiEwO2lmKG0ocykpcmV0dXJuISF0LmlzQ2xvc2VkKCk7aWYobChzKSlyZXR1cm4hMTtpZihzPT09SnMuZW51bUdlb21ldHJ5Q29sbGVjdGlvbil7Y29uc3Qgcz10O2ZvcihsZXQgdD0wLG49cy5nZXRHZW9tZXRyeUNvdW50KCk7dDxuO3QrKylpZihLcyhzLmdldEdlb21ldHJ5KHQpLGUpKXJldHVybiEwO3JldHVybiExfWEoXCJcIil9ZnVuY3Rpb24gJHModCxlKXtjb25zdCBzPXQuZ2V0R2VvbWV0cnlUeXBlKCk7aWYocz09PUpzLmVudW1Qb2x5Z29uKXtjb25zdCBlPW5ldyBRcyh7dmQ6dC5nZXREZXNjcmlwdGlvbigpfSk7cmV0dXJuIHQuaXNFbXB0eSgpfHx0LmNvcHlUb1VuY2hlY2tlZChlKSxlfWlmKHM9PT1Kcy5lbnVtUG9seWxpbmUpcmV0dXJuIHRuKHQuZ2V0SW1wbCgpLGUsITEpLmJvdW5kYXJ5O2lmKHM9PT1Kcy5lbnVtRW52ZWxvcGUpe2NvbnN0IGU9bmV3IFFzKHt2ZDp0LmdldERlc2NyaXB0aW9uKCl9KTtyZXR1cm4gdC5pc0VtcHR5KCl8fGUuYWRkRW52ZWxvcGUodCwhMSksZX1pZihtKH
1MpKXtjb25zdCBlPW5ldyBEZSh7dmQ6dC5nZXREZXNjcmlwdGlvbigpfSk7aWYoIXQuaXNFbXB0eSgpJiYhdC5pc0Nsb3NlZCgpKXtjb25zdCBzPW5ldyBGO2UucmVzZXJ2ZSgyKSx0LnF1ZXJ5U3RhcnQocyksZS5hZGQocyksdC5xdWVyeUVuZChzKSxlLmFkZChzKX1yZXR1cm4gZX1pZihzPT09SnMuZW51bUdlb21ldHJ5Q29sbGVjdGlvbil7Y29uc3Qgcz10O2xldCBuPW51bGw7Zm9yKGxldCBpPTAscj1zLmdldEdlb21ldHJ5Q291bnQoKTtpPHI7aSsrKXtjb25zdCByPSRzKHMuZ2V0R2VvbWV0cnkoaSksZSk7aWYobnVsbCE9PXIpe251bGw9PT1uJiYobj10LmNyZWF0ZUluc3RhbmNlKCkpO2NvbnN0IGU9cjtuLmFkZEdlb21ldHJ5KGUpfX1yZXR1cm4gbn1pZihsKHMpKXJldHVybiBuZXcgRih7dmQ6dC5nZXREZXNjcmlwdGlvbigpfSk7YShcIlwiKX1mdW5jdGlvbiB0bih0LGUscyl7Y29uc3Qgbj0hMSxpPXQ7bGV0IHI9bnVsbDtpZihzfHwocj1uZXcgRGUoe3ZkOmkuZ2V0RGVzY3JpcHRpb24oKX0pKSwhaS5pc0VtcHR5KCkpe2NvbnN0IHQ9bmV3IEcoMCk7Zm9yKGxldCBlPTAscz1pLmdldFBhdGhDb3VudCgpO2U8cztlKyspe2lmKGkuZ2V0UGF0aFNpemUoZSk+MCYmIWkuaXNDbG9zZWRQYXRoSW5YWVBsYW5lKGUpKXtjb25zdCBzPWkuZ2V0UGF0aFN0YXJ0KGUpO3QuYWRkKHMpO2NvbnN0IG49aS5nZXRQYXRoRW5kKGUpLTE7dC5hZGQobil9fWlmKHQuc2l6ZSgpPjApe2NvbnN0IGU9bmV3IFcsbj1pLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKSxvPXt1c2VyU29ydCh0LGUscyl7Y29uc3QgaT1KLmdldE5BTigpLHI9Si5nZXROQU4oKTtzLnNvcnQodCxlLCh0LGUpPT4obi5xdW
1VyeVBvaW50MkQoMip0LGkpLG4ucXVlcnlQb2ludDJEKDIqZSxyKSxpLmNvbXBhcmUocikpKX0sZ2V0VmFsdWU6dD0+bi5yZWFkKDIqdCsxKX07ZS5zb3J0KHQsMCx0LnNpemUoKSxvKTtsZXQgYT1uLnJlYWRQb2ludDJEKDIqdC5yZWFkKDApKSxoPTAsdT0xO2NvbnN0IG09bmV3IEY7Zm9yKGxldCBpPTEscj10LnNpemUoKTtpPHI7aSsrKXtjb25zdCBlPW4ucmVhZFBvaW50MkQoMip0LnJlYWQoaSkpO2lmKGUuaXNFcXVhbFBvaW50MkQoYSkpdC5yZWFkKGgpPnQucmVhZChpKT8odC53cml0ZShoLE10KCkpLGg9aSk6dC53cml0ZShpLE10KCkpLHUrKztlbHNle2lmKDEmdSl7aWYocylyZXR1cm57Yk5vdEVtcHR5OiEwLGJvdW5kYXJ5Om5ldyBEZSh7fSl9fWVsc2UgdC53cml0ZShoLE10KCkpO2E9ZSxoPWksdT0xfX1pZigxJnUpe2lmKHMpcmV0dXJue2JOb3RFbXB0eTohMCxib3VuZGFyeTpuZXcgRGUoe30pfX1lbHNlIHQud3JpdGUoaCxNdCgpKTtpZighcyl7dC5zb3J0KDAsdC5zaXplKCkpO2ZvcihsZXQgZT0wLHM9dC5zaXplKCk7ZTxzJiZ0LnJlYWQoZSkhPT1NdCgpO2UrKylpLmdldFBvaW50QnlWYWwodC5yZWFkKGUpLG0pLHIuYWRkKG0pfX19cmV0dXJuIHM/e2JOb3RFbXB0eTpuLGJvdW5kYXJ5Om5ldyBEZSh7fSl9OntiTm90RW1wdHk6bixib3VuZGFyeTpyfX1mdW5jdGlvbiBlbih0LGUsbixpKXtjb25zdCByPTQqX3QoKSooTWF0aC5hYnMoZS52bWluKStNYXRoLmFicyhlLnZtYXgpKSxvPV90KCk7aWYoMT09PXQuZ2V0TWF4RGVyaXZhdGl2ZSgpKXtzKG4+MCk7Y29uc3Qgbz11bih0LDAsZSxfdCgpLHIpO3JldHVybiBpWzBdPW8ucm9vdCxvLmNSb290c31sZXQgYSxoPVtdO2NvbnN0IHU9bmV3IFUoZS52bWluLXIsZS52bWF4K3IpO2gucHVzaChuZXcgSih1LnZtaW4sdS52bWF4KSk7bGV0IG09MDtmb3IobGV0IHM9dC5nZXRNYXhEZXJpdmF0aXZlKCktMTtzPj0wO3MtLSl7YT1oLGg9W107Zm9yKGxldCB1PTAsbD1hLmxlbmd0aDt1PGw7dSsrKXtpZihhW3VdWzBdPGFbdV1bMV0pe2xldCBsLGMsZztpZihzPT09dC5nZXRNYXhEZXJpdmF0aXZlKCktMT8oe3Jvb3Q6bCxmdW5jQXRSb290OmMsY1Jvb3RzOmd9PXVuKHQscyxVLmNvbnN0cnVjdChhW3VdWzBdLGFbdV1bMV0pLG8sLjUqcikpOih7cm9vdDpsLGZ1bmNBdFJvb3Q6YyxjUm9vdHM6Z309bW4odCxzLFUuY29uc3RydWN0KGFbdV1bMF0sYVt1XVsxXSksbywuNSpyKSksMT09PWcpe2lmKDA9PT1zKXtpZihtPG4pe2lmKGFbdV1bMF08PWUudm1pbiYmYVt1XVsxXT49ZS52bWluJiZsIT09ZS52bWluKXswPT09dC5nZXRWYWx1ZSgwLGUudm1pbikmJihsPWUudm1pbil9aWYoYVt1XVswXTw9ZS52bWF4JiZhW3VdWzFdPj1lLnZtYXgmJmwhPT1lLnZtYXgpezA9PT10LmdldFZhbHVlKDAsZS52bWF4KSYmKGw9ZS52bWF4KX1pW21dPWUuc25hcENsaXAobCksbT4wP2lbbV0taVttLTFdPnImJm0rKzptKyt9fWVsc2V7Y29uc3QgdD1KLmdldE5BTigpO3RbMF09YVt1XVswXSx0WzFdPWwsaC5wdXNoKHQpO2NvbnN0IGU9Si5nZXROQU4oKTtlWzBdPWwsZVsxXT1hW3VdWzFdLGgucHVzaChlKX1jb250aW51ZX19aC5wdXNoKGFbdV0pfX1yZXR1cm4gbX1mdW5jdGlvbiBzbih0LGUscyxuKXtjb25zdCBpPW5ldyBodCxyPWduKG5ldyBodCh0KSxuZXcgaHQoZSkscyxpKTtyZXR1cm4gblswXT1pLnZhbHVlKCkscn1mdW5jdGlvbiBubih0LGUscyxuLGkscil7Y29uc3Qgbz1jdChodCwyKSxhPWRuKG5ldyBodCh0KSxuZXcgaHQoZSksbmV3IGh0KHMpLG4saSxvKTtyZXR1cm4gclswXT1vWzBdLnZhbHVlKCksclsxXT1vWzFdLnZhbHVlKCksYX1mdW5jdGlvbiBybih0LGUscyxuLGkscixvKXtjb25zdCBhPWN0KGh0LDMpLGg9X24obmV3IGh0KHQpLG5ldyBodChlKSxuZXcgaHQocyksbmV3IGh0KG4pLGkscixhKTtyZXR1cm4gb1swXT1hWzBdLnZhbHVlKCksb1sxXT1hWzFdLnZhbHVlKCksb1syXT1hWzJdLnZhbHVlKCksaH1mdW5jdGlvbiBvbih0LGUscyxuLGkscixvLGEpe3JldHVybiBobih0LGUscyxuLGkscixvLGEpfWZ1bmN0aW9uIGFuKHQsZSxzLG4saSxyKXtyZXR1cm4gY24odCxlLHMsbixpLHIpfWZ1bmN0aW9uIGhuKHQsZSxzLG4saSxyLG8sYSl7Y29uc3QgaD1PKHMqcyxOdW1iZXIuTmFOKTtoLmZpbGwoMCksJChhLG4sMCwwLHMpO2NvbnN0IHU9TyhzLE51bWJlci5OYU4pLG09TyhzLE51bWJlci5OYU4pLGw9TyhzLE51bWJlci5OYU4pO2xldCBjPXQoYSxzLGUpO2NvbnN0IGc9MTAwO2xldCBkPTA7Zm9yKGQ9MDtkPGc7ZCsrKXtjb25zdCBuPWM7Zm9yKGxldCB0PTA7dDxzOysrdCltW3RdPWFbdF07aWYoZCVzPT09MCl7aC5maWxsKDApO2ZvcihsZXQgdD0wO3Q8czt0KyspaFt0KnMrdF09MX1sZXQgbz0wLGc9MDtmb3IobGV0IG09MDttPHM7KyttKXtmb3IobGV0IHQ9MDt0PHM7Kyt0KXVbdF09aFttKnMrdF07Y29uc3Qgbj1jO2M9bG4odCxlLGEsdSxpLHIscyk7Y29uc3QgbD1uLWM7bD5vJiYoZz1tLG89bCl9Zm9yKGxldCB0PTA7dDxzO3QrKyl1W3RdPWFbdF0tbVt0XSxsW3RdPWFbdF0rKGFbdF0tbVt0XSk7Y29uc3QgXz10KGwscyxlKTtpZihfPG4pe2lmKDIqKG4tMipjK18pKnp0KG4tYy1vKTx6dChuLV8pKm8pe2M9bG4odCxlLGEsdSxpLHIscyk7Zm9yKGxldCB0PTA7dDxzOysrdCloW2cqcyt0XT1oWyhzLTEpKnMrdF0saFsocy0xKSpzK3RdPXVbdF19fWlmKG48PWMpcmV0dXJuIHQoYSxzLGUpfXJldHVybiBjfWZ1bmN0aW9uIHVuKHQsZSxzLG4saSl7Y29uc3Qgcj17cm9vdDowLGZ1bmNBdFJvb3Q6MCxjUm9vdHM6MH07bGV0IG89cy52bWluLGE9cy52bWF4LHU9MCxtPU51bWJlci5NQVhfVkFMVUUsbD10LmdldFZhbHVlKGUsbyksYz10LmdldFZhbHVlKGUsYSksZz0wLGQ9MCxfPTA7aWYobD49MCYmYz49MHx8bDw9MCYmYzw9MClyZXR1cm4gTWF0aC5hYnMobCk8TWF0aC5hYnMoYyk/KHIuZnVuY0F0Um9vdD1sLHIucm9vdD1vLHIuY1Jvb3RzPTA9PT1sPzE6MCxyKTooci5mdW5jQXRSb290PWMsci5yb290PWEsci5jUm9vdHM9MD09PWM/MTowLHIpO01hdGguYWJzKGwpPE1hdGguYWJzKGMpJiYoYT1zdChvLG89YSksYz1zdChsLGw9YykpLHU9byxnPWw7bGV0IHA9ITAsZj0wO2Zvcig7MCE9PWMmJk1hdGguYWJzKG8tYSk+bipNYXRoLmFicyhhKStpO2YrKyl7bGV0IHM9Zj42NDtpZighcyl7ZD1sIT09ZyYmYyE9PWc/bypjKmcvKChsLWMpKihsLWcpKSthKmwqZy8oKGMtbCkqKGMtZykpK3UqbCpjLygoZy1sKSooZy1jKSk6YS1jKihhLW8pLyhjLWwpO2NvbnN0IHQ9KDMqbythKS80O2lmKHM9IShkPnQmJmQ8YXx8ZD5hJiZkPHQpLCFzKXtjb25zdCB0PW4qTWF0aC5hYnMoYSkraTtpZihwKXtjb25zdCBlPU1hdGguYWJzKGEtdSk7cz1NYXRoLmFicyhkLWEpPj0uNSplfHxlPHR9ZWxzZXtjb25zdCBlPU1hdGguYWJzKHUtbSk7cz1NYXRoLmFicyhkLWEpPj0uNSplfHxlPHR9fX1pZihzPyhkPShvK2EpLzIscD0hMCk6cD0hMSxfPXQuZ2V0VmFsdWUoZSxkKSwwPT09XylyZXR1cm4gci5yb290PWQsci5mdW5jQXRSb290PV8sci5jUm9vdHM9MSxyO2lmKCFzKXtjb25zdCBzPW8tZCxuPWQtYTtpZihNYXRoLmFicyhzKT4xMCpNYXRoLmFicyhuKSl7bGV0IHM9YSszKm47Zm9yKGxldCBuPTA7bjwyO24rKyl7Y29uc3Qgbj10LmdldFZhbHVlKGUscyk7TnQobCkqTnQobik+MD8obz1zLGw9bik6cz1vdChvLGEsLjc1KX19ZWxzZSBpZihNYXRoLmFicyhuKT4xMCpNYXRoLmFicyhzKSl7bGV0IG49by0zKnM7Zm9yKGxldCBzPTA7czwyOysrcyl7Y29uc3Qgcz10LmdldFZhbHVlKGUsbik7TnQoYykqTnQocyk+MD8oYT1uLGM9cyk6bj1vdChvLGEsLjI1KX19fW09dSx1PWEsZz1jLE50KGwpKk50KF8pPDA/KGE9ZCxjPV8pOihvPWQsbD1fKSxNYXRoLmFicyhsKTxNYXRoLmFicyhjKSYmKGE9c3QobyxvPWEpLGM9c3QobCxsPWMpKSwxMjg9PT1mJiZoKFwiUm9vdF9maW5kZXIgaXRlcmF0aW9ucyBleGNlZWRlZFwiKX1yZXR1cm4gci5yb290PWEsci5mdW5jQXRSb290PWMsci5jUm9vdHM9MSxyfWZ1bmN0aW9uIG1uKHQsZSxzLG4saSl7Y29uc3Qgcj17cm9vdDowLGZ1bmNBdFJvb3Q6MCxjUm9vdHM6MH07bGV0IG89cy52bWluLGE9dC5nZXRWYWx1ZShlLG8pLHU9cy52bWF4LG09dC5nZXRWYWx1ZShlLHUpO2lmKGE+PTAmJm0+PTB8fGE8PTAmJm08PTApcmV0dXJuIE1hdGguYWJzKGEpPE1hdGguYWJzKG0pPyhyLmZ1bmNBdFJvb3Q9YSxyLnJvb3Q9byxyLmNSb290cz0wPT09YT8xOjAscik6KHIuZnVuY0F0Um9vdD1tLHIucm9vdD11LHIuY1Jvb3RzPTA9PT1tPzE6MCxyKTttPDAmJihtPXN0KGEsYT1tKSx1PXN0KG8sbz11KSk7bGV0IGw9LjUqKG8rdSksYz1NYXRoLmFicyh1LW8pLGc9YyxkPXQuZ2V0VmFsdWUoZSxsKSxfPXQuZ2V0VmFsdWUoZSsxLGwpO2NvbnN0IHA9MSxmPTQ7bGV0IFA9Zjtjb25zdCB5PTI7bGV0IHg9MSxDPTAsdj0wLGI9cDtjb25zdCBTPTMyO2xldCBFPTA7Zm9yKDsrK0U8MTAwOyl7bGV0IHM7RT5TfHwwPT09X3x8Yj09PXkmJkM+MXx8Yj09PXAmJlA8Zj8oYj1wLHg+MSYmeC0tKTooYj15LHY+MSYmTWF0aC5hYnMoMipkKT5NYXRoLmFicyhjKl8pJiZ4KyspLGM9ZztsZXQgbj0
1hMTtpZihiPT09cClkb3tpZih2PjIpe2NvbnN0IHQ9MTYqTWF0aC5hYnMoYyk7aWYoLjUqTWF0aC5hYnMoby11KT50KXtjb25zdCBlPU1hdGgubWluKG8sdSksbj1NYXRoLm1heChvLHUpO2lmKGw9PT1lKXtzPWwsbD1lK3QsZz1sLXM7YnJlYWt9aWYobD09PW4pe3M9bCxsPW4tdCxnPWwtczticmVha319fWc9LjUqKHUtbykscz1sLGw9bytnLG49bz09PWx8fHU9PT1sfXdoaWxlKDApO2Vsc2UgZm9yKDs7KXtnPXgqZC9fLHM9bCxsLT1nLG49bD09PXM7Y29uc3QgdD1NYXRoLm1pbihvLHUpLGU9TWF0aC5tYXgobyx1KTtpZihsPHQpe2lmKHg+MSl7bD1zLHgtLTtjb250aW51ZX1nPXMtdCxsPXR9ZWxzZSBpZihsPmUpe2lmKHg+MSl7bD1zLHgtLTtjb250aW51ZX1nPXMtZSxsPWV9YnJlYWt9aWYobnx8TWF0aC5hYnMoZyk8aSl7cyE9PWwmJihkPXQuZ2V0VmFsdWUoZSxsKSk7YnJlYWt9ZD10LmdldFZhbHVlKGUsbCksXz10LmdldFZhbHVlKGUrMSxsKTtjb25zdCByPW8saD11O2Q8MD8oYT1kLG89bCk6KG09ZCx1PWwpLGI9PT15JiYobz09PXImJnU9PT1ofHx2PjEmJk1hdGguYWJzKGcpPj0uNTAwMSpNYXRoLmFicyhjKSk/QysrOkM9MCxiPT09cD8oUCsrLHY9MCk6KFA9MCx2KyspfXJldHVybiAxMDA9PT1FJiZoKFwiUm9vdF9maW5kZXIgaXRlcmF0aW9ucyBleGNlZWRlZFwiKSxyLnJvb3Q9bCxyLmZ1bmNBdFJvb3Q9ZCxyLmNSb290cz0xLHJ9ZnVuY3Rpb24gbG4odCxlLHMsbixpLHIsbyl7Y29uc3QgYT1uLnNsaWNlKDAsbyk7bGV0IGg9MDtmb3IobGV0IGY9MDtmPG87ZisrKWgrPW5bZl0qbltmXTtpZihoPU1hdGguc3FydChoKSxoPjApZm9yKGxldCBmPTA7ZjxvO2YrKylhW2ZdLz1oO2xldCB1PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxtPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTt7Y29uc3QgdD1PKG8sMCk7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0W2VdPWU7dC5zb3J0KCh0LGUpPT57Y29uc3Qgcz1NYXRoLmFicyhhW3RdKSxuPU1hdGguYWJzKGFbZV0pO3JldHVybiBzPG4/LTE6cz5uPzE6MH0pO2ZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IG49dFtlXTtpZigwPT09YVtuXSljb250aW51ZTtsZXQgbz0oaVtuXS1zW25dKS9hW25dLGg9KHJbbl0tc1tuXSkvYVtuXTtoPG8mJihoPXN0KG8sbz1oKSksbz51JiYodT1vKSxoPG0mJihtPWgpfX1sZXQgbD0wO2NvbnN0IGM9KE1hdGguYWJzKHUpK01hdGguYWJzKG0pKSpfdCgpKjEwMCxnPU8obyxOdW1iZXIuTmFOKSxkPWEuc2xpY2UoKTtmdW5jdGlvbiBfKG4saSl7Zm9yKGxldCB0PTAsZT1vO3Q8ZTt0KyspZ1t0XT1zW3RdK24qZFt0XTtyZXR1cm4gdChnLG8sZSl9Yz4wJiYobD1hbihfLG51bGwsdSwwLG0sYykpO2NvbnN0IHA9XyhsKTtmb3IobGV0IGY9MCxQPW87ZjxQO2YrKylzW2ZdPXB0KGdbZl0saVtmXSxyW2ZdKTtyZXR1cm4gcH1mdW5jdGlvbiBjbih0LGUscyxuLGkscil7Y29uc3Qgbz1tZSgpO2xldCBhPW4saD10KGEsZSksdT1zLG09aSxsPXQodSxlKSxjPXQobSxlKTtoPmwmJihoPWwsYT11KSxoPmMmJihoPWMsYT1tKTtsZXQgZz11LGQ9bSxfPWwscD1jO18+cCYmKF89c3QocCxwPV8pLGQ9c3QoZyxnPWQpKTtsZXQgZj1hLWcsUD1nLWQ7Y29uc3QgeT0uNSpNYXRoLm1pbihyLG0tdSkseD0yKnksQz0xMDA7bGV0IHYsYj0wO2Zvcih2PTA7djxDJiYhKG0tdTw9eCk7Kyt2KXtjb25zdCBzPXUrLjUqKG0tdSk7bGV0IG49Yj4wO2lmKCFuJiZNYXRoLmFicyhQKTw9eSYmKG49ITAsYj0zKSwhbil7Y29uc3QgdD1hLWcsZT1hLWQscz10KihoLXApO2xldCBpPWUqKGgtXykscj1lKmktdCpzO2k9MiooaS1zKSxpPjAmJihyPS1yKSxpPU1hdGguYWJzKGkpLDA9PT1pfHxNYXRoLmFicyhyKT49TWF0aC5hYnMoaSpQLzIpfHxyPD1pKih1LWEpfHxyPj1pKihtLWEpPyhuPSEwLGI9Myk6KFA9ZixmPXIvaSl9biYmKFA9YT49cz91LWE6bS1hLGY9bypQLGItLSk7bGV0IGk9YStmO2k8dSt5P2k9dSt5Omk+bS15JiYoaT1tLXkpO2NvbnN0IHI9dChpLGUpO3I8aD8oaT49YT8odT1hLGw9aCk6KG09YSxjPWgpLGQ9ZyxnPWEsYT1pLHA9XyxfPWgsaD1yKTooaTxhPyh1PWksbD1yKToobT1pLGM9cikscjw9X3x8Zz09PWE/KGQ9ZyxnPWkscD1fLF89cik6KHI8PXB8fGQ9PT1hfHxkPT09ZykmJihkPWkscD1yKSl9cmV0dXJuIGF9ZnVuY3Rpb24gZ24odCxlLHMsbil7cmV0dXJuIHQuaXNaZXJvKCk/ZS5pc1plcm8oKT8tMTowOihuLnNldEUoZS5jbG9uZSgpLm5lZ2F0ZVRoaXMoKS5kaXZUaGlzRSh0KSkscy5jb250YWluc0Nvb3JkaW5hdGUobi52YWx1ZSgpKT8xOjApfWZ1bmN0aW9uIGRuKHQsZSxzLG4saSxyKXtpZigwPT09dC52YWx1ZSgpKXtpZihpKXJldHVybiByWzBdLnNldCgxKSxuLmNvbnRhaW5zQ29vcmRpbmF0ZShyWzBdLnZhbHVlKCkpPzE6MDtyZXR1cm4gZ24oZSxzLG4sclswXSl9aWYoaSl7bGV0IGU9MjtyZXR1cm4gclswXS5zZXQoMSksclsxXS5zZXRFKHMpLmRpdlRoaXNFKHQpLHJbMV0uZXEoclswXSkmJihyWzFdLnNldCgxKSxlPTEpLG4uY29udGFpbnNDb29yZGluYXRlKHJbMV0udmFsdWUoKSl8fChlPTEpLG4uY29udGFpbnNDb29yZGluYXRlKHJbMF0udmFsdWUoKSl8fChlLS0sclswXS5zZXRFKHJbMV0pKSwyPT09ZSYmclswXS52YWx1ZSgpPnJbMV0udmFsdWUoKSYmKHJbMV09c3QoclswXSxyWzBdPXJbMV0pKSxlfWNvbnN0IG89ZS5jbG9uZSgpLnNxclRoaXMoKS5zdWJUaGlzRSh0LmNsb25lKCkubXVsVGhpc0UocykubXVsVGhpc0UoTHQpKTtpZihvLmx0KG10KSlyZXR1cm4gMDtjb25zdCBhPW5ldyBodChlLnZhbHVlKCk+PTA/MTotMSksaD1vLmNsb25lKCkuc3FydFRoaXMoKSx1PW5ldyBodCgtLjUpLm11bFRoaXNFKGUuY2xvbmUoKS5hZGRUaGlzRShhLmNsb25lKCkubXVsVGhpc0UoaCkpKTtsZXQgbT0wO3JbMF0uc2V0RSh1LmRpdkUodCkpO2NvbnN0IGw9bmV3IGh0KHJbMF0udmFsdWUoKSksYz1uZXcgaHQodC52YWx1ZSgpKS5tdWxFKGwpLmFkZEUobmV3IGh0KGUudmFsdWUoKSkubXVsRShsKS5hZGRFKG5ldyBodChzLnZhbHVlKCkpKSk7cmV0dXJuIGMuaXNaZXJvKCl8fHZuKHJbMF0sdCxlLHMsclswXSksbi5jb250YWluc0Nvb3JkaW5hdGUoclswXS52YWx1ZSgpKSYmbSsrLDAhPT1oLnZhbHVlKCkmJjAhPT11LnZhbHVlKCk/KHJbbV0uYXNzaWduKHMuZGl2RSh1KSksbC5zZXQoclttXS52YWx1ZSgpKSxjLmFzc2lnbihuZXcgaHQodC52YWx1ZSgpKS5tdWxFKGwpLmFkZEUobmV3IGh0KGUudmFsdWUoKSkubXVsRShsKS5hZGR
1FKG5ldyBodChzLnZhbHVlKCkpKSkpLGMuaXNaZXJvKCl8fHZuKHJbbV0sdCxlLHMsclttXSksbi5jb250YWluc0Nvb3JkaW5hdGUoclttXS52YWx1ZSgpKSYmbSsrLDI9PT1tJiZyWzBdLnZhbHVlKCk+clsxXS52YWx1ZSgpJiYoclsxXT1zdChyWzBdLHJbMF09clsxXSkpLG0pOm19ZnVuY3Rpb24gX24odCxlLHMsbixpLHIsbyl7aWYoMD09PXQudmFsdWUoKSl7cmV0dXJuIGRuKGUscyxuLGkscixvKX1pZihyKXtsZXQgcz0xO29bMF0uc2V0KDEpO2NvbnN0IHI9by5zbGljZShzKSxhPWRuKHQsZS5hZGRFKHQpLG4ubmVnYXRlKCksaSwhMSxyKTtpZihhPjApe3MrPWE7Zm9yKGxldCB0PTE7dDxzO3QrKylvW3RdLmVxKHV0KSYmKG9bcy0xXT1zdChvW3RdLG9bdF09b1tzLTFdKSxzLS0pfWNvbnN0IGg9by5zbGljZSgwLHMpO2guc29ydCgodCxlKT0+dC52YWx1ZSgpPGUudmFsdWUoKT8tMTp0LnZhbHVlKCk+ZS52YWx1ZSgpPzE6MCk7Zm9yKGxldCB0PTA7dDxzOysrdClvW3RdPWhbdF07cmV0dXJuIHN9cmV0dXJuIGJuKHQsZSxzLG4saSxvKX1mdW5jdGlvbiBwbih0LHMsbixpLHIsbyl7cmV0dXJuKG88c3x8czwwKSYmZShcIm50aF9kZWdyZWVfcmVhbF9yb290c1wiKSxTbih0LHMsbixpLHIpfWZ1bmN0aW9uIGZuKHQsZSxzLG4pe3JldHVybntjb2VmMDp0LmNsb25lKCksY29lZjE6ZS5jbG9uZSgpLGNvZWYyOnMuY2xvbmUoKSxjb2VmMzpuLmNsb25lKCksY2FsY0YodCl7cmV0dXJuIHRoaXMuY29lZjAuY2xvbmUoKS5tdWxUaGlzKHQpLmFkZFRoaXNFKHRoaXMuY29lZjEpLm11bFRoaXModCkuYWRkVGhpc0UodGhpcy5jb2VmMikubXVsVGhpcyh0KS5hZGRUaGlzRSh0aGlzLmNvZWYzKX0sY2FsY0RGKHQpe3JldHVybiB0aGlzLmNvZWYwLmNsb25lKCkubXVsVGhpcygzKS5tdWxUaGlzKHQpLmFkZFRoaXNFKHRoaXMuY29lZjEuY2xvbmUoKS5tdWxUaGlzQnlQb3dlcjIoMikpLm11bFRoaXModCkuYWRkVGhpc0UodGhpcy5jb2VmMil9LGVzdGltYXRlRXJyb3IodCl7Y29uc3QgZT1NYXRoLmFicyh0KSxzPSgodGhpcy5jb2VmMC5lcHMoKSplK3RoaXMuY29lZjEuZXBzKCkpKmUrdGhpcy5jb2VmMi5lcHMoKSkqZSt0aGlzLmNvZWYzLmVwcygpK3RoaXMuY2FsY0YodCkuZXBzKCksbj10aGlzLmNvZWYwLmNsb25lKCkubXVsVGhpcyh0KS5tdWxUaGlzKDMpLmFkZFRoaXNFKHRoaXMuY29lZjEuY2xvbmUoKS5tdWxUaGlzKDIpKS5tdWxUaGlzKHQpLmFkZFRoaXNFKHRoaXMuY29lZjIpO2lmKG4uaXNaZXJvKCkpe2NvbnN0IGU9dGhpcy5jb2VmMC5jbG9uZSgpLm11bFRoaXModCkubXVsVGhpcyg2KS5hZGRUaGlzRSh0aGlzLmNvZWYxLmNsb25lKCkubXVsVGhpcygyKSk7aWYoZS5pc1plcm8oKSl7Y29uc3QgdD10aGlzLmNvZWYwLmNsb25lKCkubXVsVGhpcyg2KTtyZXR1cm4gTWF0aC5wb3coNipzL01hdGguYWJzKHQudmFsdWUoKSksMS8zKX1yZXR1cm4gTWF0aC5zcXJ0KDIqcy9NYXRoLmFicyhlLnZhbHVlKCkpKX1yZXR1cm4gcy9NYXRoLmFicyhuLnZhbHVlKCkpfX19Y2xhc3MgUG57dXBkYXRlQ29lZnModCl7aWYodGhpcy5sYXN0RGVyaXYxPT09dClyZXR1cm4gdGhpcy5jdXJDb2Vmcz10aGlzLmRlcml2Q29lZnMxLHZvaWQodGhpcy5sYXN0VXNlZD0xKTtpZih0aGlzLmxhc3REZXJpdjI9PT10KXJldHVybiB0aGlzLmN1ckNvZWZzPXRoaXMuZGVyaXZDb2VmczIsdm9pZCh0aGlzLmxhc3RVc2VkPTIpO2xldCBlOzE9PT10aGlzLmxhc3RVc2VkPyhlPXRoaXMuZGVyaXZDb2VmczIsdGhpcy5sYXN0RGVyaXYyPXQsdGhpcy5sYXN0VXNlZD0yKTooZT10aGlzLmRlcml2Q29lZnMxLHRoaXMubGFzdERlcml2MT10LHRoaXMubGFzdFVzZWQ9MSksZS5sZW5ndGg9MDtmb3IobGV0IHM9MCxuPXRoaXMudHJ1ZVBvd2VyLXQ7czw9bjsrK3Mpe2UucHVzaCh0aGlzLmNvZWZzW3MrdF0uY2xvbmUoKSk7bGV0IG49cyt0LGk9bi0tO2ZvcihsZXQgZT0xO2U8dDtlKyspaSo9bi0tO2Vbc10ubXVsVGhpcyhpKX10aGlzLmN1ckNvZWZzPWV9Y29uc3RydWN0b3IodCxlLHMsbil7dGhpcy5kZXJpdkNvZWZzMT1bXSx0aGlzLmRlcml2Q29lZnMyPVtdLHRoaXMubGFzdERlcml2MT0tMSx0aGlzLmxhc3REZXJpdjI9LTEsdGhpcy5sYXN0VXNlZD0tMSx0aGlzLmN1ckNvZWZzPW51bGwsdGhpcy5jb2Vmcz10LHRoaXMucG93ZXI9ZSx0aGlzLnRydWVQb3dlcj0wO2ZvcihsZXQgaT1lO2k+PTE7aS0tKWlmKDAhPT10aGlzLmNvZWZzW2ldLnZhbHVlKCkpe3RoaXMudHJ1ZVBvd2VyPWk7YnJlYWt9fWdldE1heERlcml2YXRpdmUoKXtyZXR1cm4gdGhpcy50cnVlUG93ZXIrMX1nZXRWYWx1ZSh0LGUpe2xldCBzPXRoaXMuY29lZnM7MD09PXQ/cz10aGlzLmNvZWZzOih0aGlzLnVwZGF0ZUNvZWZzKHQpLHM9dGhpcy5jdXJDb2Vmcyk7Y29uc3Qgbj1uZXcgZnQoMCk7bGV0IGk9MTtmb3IobGV0IHI9MCxvPXRoaXMudHJ1ZVBvd2VyLXQ7cjw9bzsrK3Ipbi5wZShpKnNbcl0udmFsdWUoKSksaSo9ZTtyZXR1cm4gbi5nZXRSZXN1bHQoKX1nZXRFcnJvcih0KXtjb25zdCBlPU1hdGguYWJzKHQpLHM9bmV3IGZ0KDApLG49bmV3IGh0KDEpLGk9bmV3IGh0KDApO2ZvcihsZXQgbz0wLGE9dGhpcy5wb3dlcjtvPD1hOysrbylpLmFkZFRoaXNFKHRoaXMuY29lZnNbb10ubXVsRShuKSkscy5wZShuLnZhbHVlKCkqdGhpcy5jb2Vmc1tvXS5lcHMoKSksbi5tdWxUaGlzKGUpO3MucGUoaS5lcHMoKSk7bGV0IHI9MTtmb3IobGV0IG89MTtvPD10aGlzLnRydWVQb3dlcjsrK28pe3IqPW8sdGhpcy51cGRhdGVDb2VmcyhvKTtjb25zdCBlPW5ldyBodCgxKSxuPW5ldyBodCgwKTtmb3IobGV0IHM9MCxpPXRoaXMudHJ1ZVBvd2VyLW87czw9aTsrK3Mpbi5hZGRUaGlzRSh0aGlzLmN1ckNvZWZzW3NdLm11bEUoZSkpLGUubXVsVGhpcyh0KTtpZighbi5pc1plcm8oKSlyZXR1cm4gTWF0aC5wb3cocipzLmdldFJlc3VsdCgpL01hdGguYWJzKG4udmFsdWUoKSksMS9vKX1yZXR1cm4gMH19ZnVuY3Rpb24geW4odCxlLHMsbixpLHIpe2xldCBvPXQsYT1lLGg9YS1vO2lmKCFyKXtsZXQgcz1uLmNhbGNGKHQpLnZhbHVlKCksaT1uLmNhbGNGKGUpLnZhbHVlKCk7aWYoKHM+MHx8cz5pKSYmKGE9c3QobyxvPWEpLGk9c3QocyxzPWkpKSxzPj0wfHxpPD0wKXJldHVybiExfWxldCB1LG09ITEsbD1zLGM9MDtmb3IoO2M8MTAwO2MrKyl7Y29uc3QgdD1uLmNhbGNGKGwpO2lmKHU9bi5jYWxjREYobCksdS5pc1plcm8oKSlyZXR1cm4hMTtpZighdC52YWx1ZSgpfHxjPjMmJnQuaXNaZXJvKCkpe209ITA7YnJlYWt9cnx8KHQudmFsdWUoKTwwP289bD
1phPWwpO2NvbnN0IGU9dC52YWx1ZSgpL3UudmFsdWUoKSxzPWwtZTtyfHwocz49byYmczw9YXx8cz49YSYmczw9bykmJk1hdGguYWJzKGUpPD0uNSpoPyhsPXMsaD1NYXRoLmFicyhlKSk6KGg9TWF0aC5hYnMoLjUqKGEtbykpLGw9LjUqKG8rYSkpfXJldHVybiEhbSYmKGkuc2V0KGwsbi5lc3RpbWF0ZUVycm9yKGwpKSwhMCl9ZnVuY3Rpb24geG4odCxlLHMsbixpLHIsbyxhKXtyZXR1cm4geW4odCxlLHMudmFsdWUoKSxmbihuLGkscixvKSxhLCExKX1jbGFzcyBDbntjb25zdHJ1Y3Rvcih0LGUscyl7dGhpcy5jb2Vmcz1jdChodCwzKSx0aGlzLmNvZWZzWzBdLnNldEUodCksdGhpcy5jb2Vmc1sxXS5zZXRFKGUpLHRoaXMuY29lZnNbMl0uc2V0RShzKX1jYWxjRih0KXtjb25zdCBlPW5ldyBodCh0KTtyZXR1cm4gdGhpcy5jb2Vmc1swXS5tdWxFKGUpLmFkZEUodGhpcy5jb2Vmc1sxXSkubXVsRShlKS5hZGRFKHRoaXMuY29lZnNbMl0pfWNhbGNERih0KXtjb25zdCBlPW5ldyBodCh0KTtyZXR1cm4gaHQuc3RfbXVsQnlQb3dlcjIodGhpcy5jb2Vmc1swXSwyKS5tdWxFKGUpLmFkZEUodGhpcy5jb2Vmc1sxXSl9ZXN0aW1hdGVFcnJvcih0KXtjb25zdCBlPU1hdGguYWJzKHQpLHM9KHRoaXMuY29lZnNbMF0uZXBzKCkqZSt0aGlzLmNvZWZzWzFdLmVwcygpKSplK3RoaXMuY29lZnNbMl0uZXBzKCkrdGhpcy5jYWxjRih0KS5lcHMoKSxuPW5ldyBodCgyKS5tdWxFKHRoaXMuY29lZnNbMF0pLm11bCh0KS5hZGRFKHRoaXMuY29lZnNbMV0pO2lmKG4uaXNaZXJvKCkpe2NvbnN0IHQ9dGhpcy5jb2Vmc1swXS52YWx1ZSgpO3JldHVybiBNYXRoLnNxcnQocy9NYXRoLmFicyh0KSl9cmV0dXJuIHMvTWF0aC5hYnMobi52YWx1ZSgpKX19ZnVuY3Rpb24gdm4odCxlLHMsbixpKXtyZXR1cm4geW4oMCwwLHQudmFsdWUoKSxuZXcgQ24oZSxzLG4pLGksITApfWZ1bmN0aW9uIGJuKHQsZSxzLG4saSxyKXtjb25zdCBvPWN0KGh0LDMpO2xldCBhPTA7Y29uc3QgdT1lLm5lZ2F0ZSgpLmRpdlRoaXNFKHQuY2xvbmUoKS5tdWxUaGlzKDMpKTtpLmNvbnRhaW5zQ29vcmRpbmF0ZSh1LnZhbHVlKCkpJiYob1swXS5zZXRFKHUpLGE9MSk7Y29uc3QgbT1jdChodCwyKSxsPWRuKHQubXVsKDMpLGUubXVsKDIpLHMsaSwhMSxtKTtpZihsPDApcmV0dXJuIG4uaXNaZXJvKCk/LTE6MDtmb3IobGV0IGg9MDtoPGw7aCsrKWkuY29udGFpbnNDb29yZGluYXRlKG1baF0udmFsdWUoKSkmJm9bYSsrXS5zZXRFKG1baF0pO2V0KG8sMCxhLCh0LGUpPT50LnZhbHVlKCk8ZS52YWx1ZSgpPy0xOnQudmFsdWUoKT5lLnZhbHVlKCk/MTowKTtjb25zdCBjPWN0KGh0LDUpO2NbMF0uc2V0KGkudm1pbik7Zm9yKGxldCBoPTA7aDxhO2grKyljWzEraF0uc2V0RShvW2hdKTtjWzErYV0uc2V0KGkudm1heCk7Y29uc3QgZz1hKzI7bGV0IGQ9MSxfPTA7e2NvbnN0IGk9Y1swXS5jbG9uZSgpO2lmKHQuY2xvbmUoKS5tdWxUaGlzRShpKS5hZGRUaGlzRShlKS5tdWxUaGlzRShpKS5hZGRUaGlzRShzKS5tdWxUaGlzRShpKS5hZGRUaGlzRShuKS5pc1plcm8oKSl7Y29uc3Qgbz1mbih0LGUscyxuKTtpLnNldEVycm9yKG8uZXN0aW1hdGVFcnJvcihpLnZhbHVlKCkpKSxyW19dPWksXysrLGQrK319Zm9yKGxldCBwPWQ7cDxnO3ArKyl7Y29uc3Qgbz1jW3BdLmNsb25lKCksYT10LmNsb25lKCkubXVsVGhpc0UobykuYWRkVGhpc0UoZSkubXVsVGhpc0UobykuYWRkVGhpc0UocykubXVsVGhpc0UobykuYWRkVGhpc0UobikuaXNaZXJvKCk7aWYoYXx8IWNbcF0uZXEoY1twLTFdKSl7aWYoYXx8eG4oY1twLTFdLnZhbHVlKCksY1twXS52YWx1ZSgpLGNbcC0xXS5jbG9uZSgpLmFkZFRoaXNFKGNbcF0pLmRpdlRoaXNCeVBvd2VyMigyKSx0LGUscyxuLG8pKXtpZihfPjAmJm8uZXEocltfLTFdKSljb250aW51ZTtpZihfPj0zJiZoKFwiY3ViaWNfcG9seW5vbWlhbF9zb2x2ZXJfdG9vX21hbnlfcm9vdHNcIiksYSl7Y29uc3QgaT1mbih0LGUscyxuKTtvLnNldEVycm9yKGkuZXN0aW1hdGVFcnJvcihvLnZhbHVlKCkpKX1yW19dPW8sXysrfWlmKGNbcF0udmFsdWUoKT09PWkudm1heClicmVhazthJiZwKyt9fXJldHVybiBffWZ1bmN0aW9uIFNuKHQsZSxzLG4saSxyKXtjb25zdCBvPW5ldyBQbih0LGUscyxfdCgpKTtsZXQgYT0wO2lmKDI9PT1vLnRydWVQb3dlcilhPWRuKHRbMl0sdFsxXSx0WzBdLHMsbixpKTtlbHNlIGlmKDE9PT1vLnRydWVQb3dlcilhPWduKHRbMV0sdFswXSxzLGlbMF0pO2Vsc2V7aWYoMD09PW8udHJ1ZVBvd2VyKXJldHVybiB0WzBdLnZhbHVlKCk/MDotMTt7Y29uc3QgdD1bXTt0Lmxlbmd0aD1lLGE9ZW4obyxzLGUsdCk7Zm9yKGxldCBlPTA7ZTxhO2UrKylpW2VdLnNldCh0W2VdKX19Zm9yKGxldCBoPTA7aDxhO2grKylpW2hdLnNldEVycm9yKG8uZ2V0RXJyb3IoaVtoXS52YWx1ZSgpKSk7cmV0dXJuIGF9dmFyIEVuPWI7Y2xhc3MgRG4gZXh0ZW5kcyBkc3tjb25zdHJ1Y3Rvcih0KXtyZXR1cm4gdm9pZCAwPT09dHx8YnQodCxcInZkXCIpPyhzdXBlcih7dmQ6dD8udmQsWFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHRoaXMubV9jcD1uZXcgSigwLDApLHZvaWQodGhpcy5tX3dlaWdodHM9WzEsMCwxXSkpOih0LmZyb21Qb2ludCYmdC53ZWlnaHQ/dD17ZnJvbVBvaW50OnQuZnJvbVBvaW50LGNvbnRyb2xQb2ludDE6dC5jb250cm9sUG9pbnQxLHRvUG9pbnQ6dC50b1BvaW50LHdlaWdodDA6MSx3ZWlnaHQxOnQud2VpZ2h0LHdlaWdodDI6MX06dC5wb2ludHMmJnQud2VpZ2h0P3Q9e2Zyb21Qb2ludDp0LnBvaW50c1swXSxjb250cm9sUG9pbnQxOnQucG9pbnRzWzFdLHRvUG9pbnQ6dC5wb2ludHNbMl0sd2VpZ2h0MDoxLHdlaWdodDE6dC53ZWlnaHQsd2VpZ2h0MjoxfTp0LnBvaW50cyYmdC53ZWlnaHRzJiYodD17ZnJvbVBvaW50OnQucG9pbnRzWzBdLGNvbnRyb2xQb2ludDE6dC5wb2ludHNbMV0sdG9Qb2ludDp0LnBvaW50c1syXSx3ZWlnaHQwOnQud2VpZ2h0c1swXSx3ZWlnaHQxOnQud2VpZ2h0c1sxXSx3ZWlnaHQyOnQud2VpZ2h0c1syXX0pLHQuZnJvbVBvaW50JiZ0LndlaWdodDA/KHN1cGVyKHtzdGFydDp0LmZyb21Qb2ludCxlbmQ6dC50b1BvaW50fSksKHQud2VpZ2h0MDw9MHx8dC53ZWlnaHQxPDB8fHQud2VpZ2h0Mjw9MCkmJmUoXCJ3ZWlnaHRzXCIpLHRoaXMubV9
1jcD10LmNvbnRyb2xQb2ludDEuY2xvbmUoKSx2b2lkKHRoaXMubV93ZWlnaHRzPVt0LndlaWdodDAsdC53ZWlnaHQxLHQud2VpZ2h0Ml0pKTp0LmNvcHk/KHN1cGVyKHQpLHRoaXMubV9jcD10LmNvcHkubV9jcC5jbG9uZSgpLHZvaWQodGhpcy5tX3dlaWdodHM9dC5jb3B5Lm1fd2VpZ2h0cy5zbGljZSgpKSk6dC5tb3ZlPyhzdXBlcih0KSx0aGlzLm1fY3A9dC5tb3ZlLm1fY3AuY2xvbmUoKSx2b2lkKHRoaXMubV93ZWlnaHRzPXQubW92ZS5tX3dlaWdodHMuc2xpY2UoKSkpOnZvaWQgYShcInVuZXhwZWN0ZWQgY29uc3RydWN0b3IgcGFyYW1cIikpfWdldEJvdW5kYXJ5KCl7cmV0dXJuICRzKHRoaXMpfWFzc2lnbk1vdmUodCl7cmV0dXJuIHRoaXN9YXNzaWduQ29weSh0KXtyZXR1cm4gdC5jb3B5VG8odGhpcyksdGhpc31jb25zdHJ1Y3QodCxlLHMsbil7dGhpcy5kcm9wQWxsQXR0cmlidXRlcygpLHRoaXMuc2V0Q3BzQW5kV2VpZ2h0cyh0LGUscywxLG4sMSksY2EodGhpcyl9Y29uc3RydWN0V2VpZ2h0cyh0LGUscyxuLGkscil7dGhpcy5kcm9wQWxsQXR0cmlidXRlcygpLHRoaXMuc2V0Q3BzQW5kV2VpZ2h0cyh0LGUscyxuLGksciksY2EodGhpcyl9Y29uc3RydWN0QXJyYXkodCxlKXt0aGlzLmNvbnN0cnVjdCh0WzBdLHRbMV0sdFsyXSxlKX1jb25zdHJ1Y3RBcnJheVdlaWdodHModCxlKXt0aGlzLmRyb3BBbGxBdHRyaWJ1dGVzKCksdGhpcy5zZXRDcHNBbmRXZWlnaHRzQXJyYXkodCxlKSxjYSh0aGlzKX1jb252ZXJ0VG9TdGFuZGFyZEZvcm0oKXt9Z2V0U3RhbmRhcmRGb3JtV2VpZ2h0KCl7cmV0dXJuIHRoaXMubV93ZWlnaHRzWzFdL01hdGguc3FydCh0aGlzLm1fd2VpZ2h0c1swXSp0aGlzLm1fd2VpZ2h0c1syXSl9Z2V0R2VvbWV0cnlUeXBlKCl7cmV0dXJuIGkuZW51bVJhdGlvbmFsQmV6aWVyMn1xdWVyeUVudmVsb3BlKHQpe2lmKHQgaW5zdGFuY2VvZiBsZSl7aWYodC5zZXRDb29yZHModGhpcy5nZXRTdGFydFhZKCkpLHQubWVyZ2VOZSh0aGlzLmdldEVuZFhZKCkpLHQuY29udGFpbnModGhpcy5tX2NwKSlyZXR1cm47Y29uc3QgZT1MYSh0aGlzKTtpZihudWxsIT09ZSl7Y29uc3Qgcz1uZXcgSjtmb3IoY29uc3QgbiBvZiBlLnNwZWNpYWxQb2ludHMpdGhpcy5xdWVyeUNvb3JkMkQobixzKSx0Lm1lcmdlTmUocyl9ZWxzZXtjb25zdCBlPVtdLHM9Y3QoSiwzKTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhzKSxfYShzLHRoaXMubV93ZWlnaHRzLGUpO2NvbnN0IG49bmV3IEo7Zm9yKGNvbnN0IGkgb2YgZSl0aGlzLnF1ZXJ5Q29vcmQyRChpLG4pLHQubWVyZ2VOZShuKX19fWFwcGx5VHJhbnNmb3JtYXRpb24odCl7aWYodCBpbnN0YW5jZW9mIGNlKXtjb25zdCBlPWN0KEosMyk7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKGUpLHQudHJhbnNmb3JtUG9pbnRzMkQoZSwzLGUpLHRoaXMuc2V0U3RhcnRYWShlWzBdKSx0aGlzLm1fY3AuYXNzaWduKGVbMV0pLHRoaXMuc2V0RW5kWFkoZVsyXSksdm9pZCB0aGlzLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl9fWNyZWF0ZUluc3RhbmNlKCl7cmV0dXJuIG5ldyBEbih7dmQ6dGhpcy5tX2Rlc2NyaXB0aW9ufSl9Y2FsY3VsYXRlTGVuZ3RoMkQoKXtyZXR1cm4gcGEodGhpcywxLCExKX1jYWxjdWxhdGVMb3dlckxlbmd0aDJEKCl7cmV0dXJuIEouZGlzdGFuY2UodGhpcy5nZXRTdGFydFhZKCksdGhpcy5nZXRFbmRYWSgpKX1jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCl7cmV0dXJuIHRoaXMuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRF8oKX1jYWxjdWxhdGVVcHBlckxlbmd0aDJEXygpe2lmKHRoaXMubV93ZWlnaHRzWzFdPjApe3JldHVybiBKLmRpc3RhbmNlKHRoaXMuZ2V0U3RhcnRYWSgpLHRoaXMubV9jcCkrSi5kaXN0YW5jZSh0aGlzLmdldEVuZFhZKCksdGhpcy5tX2NwKX1yZXR1cm4gSi5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCkpfXF1ZXJ5Q29vcmQyRCh0LGUpe3JldHVybiB0aGlzLnF1ZXJ5Q29vcmQyREV4dGVuc2lvbih0LGUsITApfXF1ZXJ5Q29vcmQyREUodCxlKXtjaCh0aGlzLHQsZSl9cXVlcnlDb29yZDJERXh0ZW5zaW9uKHQsZSxzKXtpZihzKXtpZih0PDApe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dGhpcy5nZXRTdGFydFhZKCksZW5kOnRoaXMuZ2V0U3RhcnRYWSgpLmFkZCh0aGlzLmdldFRhbmdlbnQoMCkuZ2V0VW5pdFZlY3RvcigpKX0pLHQsZSl9aWYodD4xKXtyZXR1cm4gdm9pZCBwcyhuZXcgZm0oe3N0YXJ0OnRoaXMuZ2V0RW5kWFkoKSxlbmQ6dGhpcy5nZXRFbmRYWSgpLmFkZCh0aGlzLmdldFRhbmdlbnQoMSkuZ2V0VW5pdFZlY3RvcigpKX0pLHQtMSxlKX19Y29uc3Qgbj1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKG4pLHBoKG4sdGhpcy5tX3dlaWdodHMsdCxlKX1nZXRDb29yZFgodCl7Y29uc3QgZT1uZXcgSjtyZXR1cm4gdGhpcy5xdWVyeUNvb3JkMkRFeHRlbnNpb24odCxlLCEwKSxlLnh9Z2V0Q29vcmRZKHQpe2NvbnN0IGU9bmV3IEo7cmV0dXJuIHRoaXMucXVlcnlDb29yZDJERXh0ZW5zaW9uKHQsZSwhMCksZS55fWN1dCh0LGUscyl7Y29uc3Qgbj1uZXcgUG07cmV0dXJuIHRoaXMucXVlcnlDdXQodCxlLG4scyksbi5yZWxlYXNlU2VnbWVudCgpfXF1ZXJ5Q3V0KHQsZSxzLG4pe2NvbnN0IGk9cy5jcmVhdGVRdWFkcmF0aWNSYXRpb25hbEJlemllcigpO2lmKHRoaXMuY3V0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LGUsaSksbilyZXR1cm47aS5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pO2NvbnN0IHI9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7aWYocj4xKXtmb3IobGV0IGU9MTtlPHI7ZSsrKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksbj1Fbi5nZXRDb21wb25lbnRDb3VudChzKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlQXNEYmwodCxzLGUpO2kuc2V0U3RhcnRBdHRyaWJ1dGUocyxlLG4pfX1mb3IobGV0IHQ9MTt0PHI7dCsrKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCksbj1Fbi5nZXRDb21wb25lbnRDb3VudChzKTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlQXNEYmwoZSxzLHQpO2kuc2V0RW5kQXR0cmlidXRlKHMsdCxuKX19fX1xdWVyeURlcml2YXRpdmUodCxlKXtEYSh0aGlzLHQsZSl9Y3V0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LHMsbil7KHQ8MHx8cz4xfHx0PnMpJiZlKFwiUXVhZHJhdGljX3JhdGlvbmFsX2Jlemllci5jdXRfYmV6aWVyX2lnbm9yZV9hdHRyaWJ1dGVzXCIpO2NvbnN0IGk9Y3QoSiwzKTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhpKTtjb25zdCByPVswLDAsMF07SmEoaSx0aGlzLm1fd2VpZ2h0cyx0LHMsaSxyKSxuLnNldENvbnRyb2xQb2ludHNBbmRXZWlnaHRzKGkscil9c3BsaXRCZXppZXJJZ25vcmVBdHRyaWJ1dGVzKHQsZSxzKXt9Z2V0QXR0cmlidXRlQXNEYmwodCxlLHMpe2lmKDA9PT1lKXJldHVybiAwPT09cz90aGlzLmdldENvb3JkWCh0KTp0aGlzLmdldENvb3JkWSh0KTtjb25zdCBuPXRoaXMuY2FsY3VsYXRlTGVuZ3RoMkQoKSxpPW4+MD90aGlzLnRUb0xlbmd0aCh0KS9uOjAscj1Fbi5nZXRJbnRlcnBvbGF0aW9uKGUpLG89dGhpcy5nZXRTdGFydEF0dHJpYnV0ZUFzRGJsKGUscyksYT10aGlzLmdldEVuZEF0dHJpYnV0ZUFzRGJsKGUscyk7cmV0dXJuIHZ0KHIsbyxhLGksRW4uZ2V0RGVmYXVsdFZhbHVlKGUpKX1nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LGUpe3JldHVybiB6YSh0aGlzLHQsVS51bml0KCksZSwtMSl9Z2V0Q2xvc2VzdENvb3JkaW5hdGVPbkludGVydmFsKHQsZSxzPS0xKXtyZXR1cm4gemEodGhpcyx0LGUsITEscyl9Z2V0WU1vbm90b25pY1BhcnRzKHQsZSl7cmV0dXJuIHRoaXMuZ2V0TW9ub3RvbmljUGFydHModCxlKX1nZXRNb25vdG9uaWNQYXJ0cyh0LG4pe3QubGVuZ3RoPDImJmUoXCJcIik7Y29uc3QgaT1kYSh0aGlzKTtsZXQgcj0wO2lmKDI9PT1pLnNwZWNpYWxQb2ludHNDb3VudCgpKXJldHVybiAwO3ModC5sZW5ndGg+PWkuc3BlY2lhbFBvaW50c0NvdW50KCktMSk7Zm9yKGxldCBlPTEscz1pLnNwZWNpYWxQb2ludHNDb3VudCgpO2U8czsrK2UpdGhpcy5xdWVyeUN1dChpLnNwZWNpYWxQb2ludHNbZS0xXSxpLnNwZWNpYWxQb2ludHNbZV0sdFtyXSxuKSxyKys7Zm9yKGxldCBlPTA7ZTxyOysrZSl7SGEodFtlXS5nZXQoKSl9cmV0dXJuIHJ9aW50ZXJzZWN0aW9uV2l0aEF4aXMyRCh0LGUscyxuKXtzJiYocy5sZW5ndGg9OSksbiYmKG4ubGVuZ3RoPTkpO2NvbnN0IGk9bmV3IEFycmF5KDMpLHI9Y3QoaHQsMiksbz1uZXcgVSgwLDEpO2xldCBhPTA7Y29uc3QgaD1jdChKLDMpO2lmKHRoaXMucXVlcnlDb250cm9sUG9pbnRzKGgpLHQpe2lmKGlbMF09bmV3IGh0KGhbMF0ueSkuc3ViKGUpLm11bCh0aGlzLm1fd2VpZ2h0c1swXSksaVsxXT1uZXcgaHQoaFsxXS55KS5zdWIoZSkubXVsKHRoaXMubV93ZWlnaHRzWzFdKSxpWzJdPWlbMF0uc3ViRShpWzFdLm11bCgyKSkuYWRkRShuZXcgaHQoaFsyXS55KS5zdWIoZSkubXVsKHRoaXMubV93ZWlnaHRzWzJdKSksaVsxXT1pWzFdLnN1YkUoaVswXSkubXVsVGhpc0J5UG93ZXIyKDIpLGE9ZG4oaVsyXSxpWzFdLGlbMF0sbywhMSxyKSxzKWZvcihsZXQgdT0wO3U8YTt1Kyspc1t1XT10aGlzLmdldENvb3JkWChyW3VdLnZhbHVlKCkpfWVsc2UgaWYoaVswXT1uZXcgaHQoaFswXS54KS5zdWIoZSkubXVsKHRoaXMubV93ZWlnaHRzWzBdKSxpWzFdPW5ldyBodChoWzFdLngpLnN1YihlKS5tdWwodGhpcy5tX3dlaWdodHNbMV0pLGlbMl09aVswXS5zdWJFKGlbMV0ubXVsKDIpKS5hZGRFKG5ldyBodChoWzJdLngpLnN1YihlKS5tdWwodGhpcy5tX3dlaWdodHNbMl0pKSxpWzFdPWlbMV0uc3ViRShpWzBdKS5tdWxUaGlzQnlQb3dlcjIoMiksYT1kbihpWzJdLGlbMV0saVswXSxvLCExLHIpLHMpZm9yKGxldCB1PTA7dTxhO3UrKylzW3VdPXRoaXMuZ2V0Q29vcmRZKHJbdV0udmFsdWUoKSk7aWYobilmb3IobGV0IHU9MDt1PGE7dSsrKW5bdV09clt1XS52YWx1ZSgpO2Vsc2Ug
1cyYmZXQocywwLGEsQnQpO3JldHVybiBhfWludGVyc2VjdGlvbk9mWU1vbm90b25pY1dpdGhBeGlzWCh0LGUpe2lmKHRoaXMubV9ZU3RhcnQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdD09PXRoaXMubV9ZU3RhcnQ/ZTpOdW1iZXIuTmFOO2lmKHQ9PT10aGlzLm1fWVN0YXJ0KXJldHVybiB0aGlzLm1fWFN0YXJ0O2lmKHQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdGhpcy5tX1hFbmQ7Y29uc3Qgbj1bTnVtYmVyLk5hTixOdW1iZXIuTmFOXSxpPXRoaXMuaW50ZXJzZWN0aW9uV2l0aEF4aXMyRCghMCx0LG4sbnVsbCk7cmV0dXJuIHMoMiE9PWkpLC0xPT09aT9lOm5bMF19aXNDdXJ2ZSgpe3JldHVybiEwfWlzRGVnZW5lcmF0ZSh0KXtyZXR1cm4gemUodGhpcyx0KX1pc0RlZ2VuZXJhdGUzRCh0LGUpe3JldHVybiExfXF1ZXJ5TG9vc2VFbnZlbG9wZSh0KXtpZih0IGluc3RhbmNlb2YgbGUpcmV0dXJuIHQuc2V0Q29vcmRzKHtwdDp0aGlzLmdldFN0YXJ0WFkoKX0pLHQubWVyZ2VOZSh0aGlzLm1fY3ApLHZvaWQgdC5tZXJnZU5lKHRoaXMuZ2V0RW5kWFkoKSl9Y2xvbmUodCl7Y29uc3QgZT10aGlzLmNyZWF0ZUluc3RhbmNlKCk7cmV0dXJuIHRoaXMuY29weVRvKGUpLGV9cXVlcnlJbnRlcnZhbCh0LGUpe2lmKDA9PT10KXtjb25zdCB0PWxlLmNvbnN0cnVjdEVtcHR5KCk7dGhpcy5xdWVyeUVudmVsb3BlKHQpO2NvbnN0IHM9VS5jb25zdHJ1Y3RFbXB0eSgpO3JldHVybiAwPT09ZT90LnF1ZXJ5SW50ZXJ2YWxYKHMpOnQucXVlcnlJbnRlcnZhbFkocyksc31yZXR1cm4gc3VwZXIucXVlcnlJbnRlcnZhbCh0LGUpfXF1ZXJ5TG9vc2VFbnZlbG9wZU9uSW50ZXJ2YWwodCxlKXtjb25zdCBzPWN0KEosMyk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMocyk7Y29uc3Qgbj1bMCwwLDBdO0phKHMsdGhpcy5tX3dlaWdodHMsdC52bWluLHQudm1heCxzLG4pLGUuc2V0RnJvbVBvaW50cyhzLDMpfWNoYW5nZUVuZFBvaW50czJEKHQsZSl7aWYodC5pc0VxdWFsKHRoaXMubV9YU3RhcnQsdGhpcy5tX1lTdGFydCkmJmUuaXNFcXVhbCh0aGlzLm1fWEVuZCx0aGlzLm1fWUVuZCkpcmV0dXJuO2NvbnN0IHM9dGhpcy5tX2NwLmlzRXF1YWwodGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0KSxuPXRoaXMubV9jcC5pc0VxdWFsKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kKTt0aGlzLnNldFN0YXJ0WFkodCksdGhpcy5zZXRFbmRYWShlKSxzP3RoaXMubV9jcC5zZXRDb29yZHNQb2ludDJEKHQpOm4mJnRoaXMubV9jcC5zZXRDb29yZHNQb2ludDJEKGUpLHRoaXMubm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpfXRUb0xlbmd0aCh0KXtyZXR1cm4gcGEodGhpcyx0LCEwKX1sZW5ndGhUb1QodCl7cmV0dXJuIElhKHRoaXMsdCl9Y2FsY3VsYXRlV2VpZ2h0ZWRBcmVhQ2VudHJvaWQyRCh0KXtjb25zdCBlPVhhKHRoaXMpLHM9TWEodGhpcyk7cmV0dXJuIGUueCs9KHRoaXMuZ2V0U3RhcnRYKCktdC54KSpzLGUueSs9KHRoaXMuZ2V0U3RhcnRZKCktdC55KSpzLGV9Y2FsY3VsYXRlV2VpZ2h0ZWRDZW50cm9pZDJEKCl7Y29uc3QgdD1uZXcgSjtyZXR1cm4gdGhpcy5pc0RlZ2VuZXJhdGUoMCk/KHQuc2V0Q29vcmRzKDAsMCksdCk6VmEodGhpcyk/KHQuYXNzaWduKHRoaXMuZ2V0Q29vcmQyRCguNSkubXVsKHRoaXMuY2FsY3VsYXRlTGVuZ3RoMkQoKSkpLHQpOih0LmFzc2lnbihPYSh0aGlzLDEpKSx0KX1nZXRDb250cm9sUG9pbnQxKCl7cmV0dXJuIHRoaXMubV9jcC5jbG9uZSgpfXNldENvbnRyb2xQb2ludDEodCl7dGhpcy5tX2NwLnNldENvb3Jkc1BvaW50MkQodCksdGhpcy5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpfXF1ZXJ5V2VpZ2h0cyh0KXtmb3IobGV0IGU9MDtlPDM7KytlKXRbZV09dGhpcy5tX3dlaWdodHNbZV19cXVlcnlDb29yZDJETVAodCxlKXtjb25zdCBzPWN0KEosMyk7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKHMpLGRoKHMubWFwKHQ9PnFlLmNvbnN0cnVjdFBvaW50MkQodCkpLHRoaXMubV93ZWlnaHRzLm1hcCh0PT5ydC5jb25zdHJ1Y3REb3VibGUodCkpLHJ0LmNvbnN0cnVjdERvdWJsZSh0KSxlKX1zZXRXZWlnaHRzKHQpe31xdWVyeUNvbnRyb2xQb2ludHModCl7dFswXS5hc3NpZ24odGhpcy5nZXRTdGFydFhZKCkpLHRbMV0uYXNzaWduKHRoaXMubV9jcCksdFsyXS5hc3NpZ24odGhpcy5nZXRFbmRYWSgpKX1xdWVyeUNvbnRyb2xQb2ludHNIZWxwZXIodCl7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKHQpLDN9c2V0Q29udHJvbFBvaW50c0FuZFdlaWdodHModCxlKXt0aGlzLnNldENwc0FuZFdlaWdodHNBcnJheSh0LGUpLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1nZXRUYW5nZW50KHQpe2NvbnN0IGU9Y3QoSiwzKTtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksQWEoZSx0aGlzLm1fd2VpZ2h0cyx0KX1nZXREZXJpdmF0aXZlKHQpe2NvbnN0IGU9cHQodCwwLDEpLHM9Y3QoSiw0KTtyZXR1cm4gZmEodGhpcywxLGUscyksc1sxXX1nZXRDdXJ2YXR1cmUodCl7Y29uc3QgZT1jdChKLDQpO2ZhKHRoaXMsMix0LGUpO2NvbnN0IHM9ZVsxXS5zcXJMZW5ndGgoKTtpZigwPT09cylyZXR1cm4gTnVtYmVyLk5hTjtlWzFdLmRpdlRoaXMoTWF0aC5zcXJ0KHMpKTtyZXR1cm4gZVsxXS5jcm9zc1Byb2R1Y3QoZVsyXSkvc31pc0ludGVyc2VjdGluZyh0LGUscyl7cmV0dXJuITF9aXNJbnRlcnNlY3RpbmdQb2ludCh0LGUscyl7cmV0dXJuITF9aXNJbnRlcnNlY3RpbmdQb2ludDNEKHQsZSxzLG4saT0xKXtyZXR1cm4hMX1pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpe2NvbnN0IHQ9Y3QoSiwzKTtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHModCksWmEodCl9Z2V0TW9ub3RvbmljUGFydFBhcmFtcyh0LHMpe2NvbnN0IG49ZGEodGhpcyksaT1uLnNwZWNpYWxQb2ludHNDb3VudCgpO2lmKCFzKXJldHVybiBuLnNwZWNpYWxQb2ludHNDb3VudCgpO3Q8aSYmZShcIlwiKTtmb3IobGV0IGU9MDtlPGk7ZSsrKXNbZV09b
1i5zcGVjaWFsUG9pbnRzW2VdO3JldHVybiBpfW5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKXtyZXR1cm4hMX1vcmllbnRCb3R0b21VcCgpe2lmKHRoaXMubV9ZRW5kPHRoaXMubV9ZU3RhcnR8fHRoaXMubV9ZRW5kPT09dGhpcy5tX1lTdGFydCYmdGhpcy5tX1hFbmQ8dGhpcy5tX1hTdGFydCl7dGhpcy5tX1hFbmQ9c3QodGhpcy5tX1hTdGFydCx0aGlzLm1fWFN0YXJ0PXRoaXMubV9YRW5kKSx0aGlzLm1fWUVuZD1zdCh0aGlzLm1fWVN0YXJ0LHRoaXMubV9ZU3RhcnQ9dGhpcy5tX1lFbmQpLHRoaXMubV93ZWlnaHRzWzJdPXN0KHRoaXMubV93ZWlnaHRzWzBdLHRoaXMubV93ZWlnaHRzWzBdPXRoaXMubV93ZWlnaHRzWzJdKTtmb3IobGV0IHQ9MCxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMjt0PGU7dCsrKXRoaXMubV9hdHRyaWJ1dGVzW3QrZV09c3QodGhpcy5tX2F0dHJpYnV0ZXNbdF0sdGhpcy5tX2F0dHJpYnV0ZXNbdF09dGhpcy5tX2F0dHJpYnV0ZXNbdCtlXSk7dGhpcy5tX2NhY2hlZFZhbHVlcz1udWxsfX1pc0xpbmUoKXtyZXR1cm4hMX1pc0RlZ2VuZXJhdGVUb0xpbmVIZWxwZXIodCl7Y29uc3QgZT1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKGUpO2NvbnN0IHM9ZVsyXS5zdWIoZVswXSksbj1zLmxlbmd0aCgpO2lmKEouZGlzdGFuY2UoZVswXSxlWzFdKStKLmRpc3RhbmNlKGVbMl0sZVsxXSktbj50KXJldHVybiExO2NvbnN0IGk9dCxyPWVbMV0uY2xvbmUoKTtyLnN1YlRoaXMoZVswXSk7cmV0dXJuIShNYXRoLmFicyhyLmNyb3NzUHJvZHVjdChzKSkvbj5pKX1jb3B5SWdub3JlQXR0cmlidXRlcyh0KXtjb25zdCBlPWN0KEosMyk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSk7Y29uc3Qgcz1bMCwwLDBdO3RoaXMucXVlcnlXZWlnaHRzKHMpLHQuc2V0Q29udHJvbFBvaW50c0FuZFdlaWdodHMoZSxzKX1jYWxjdWxhdGVBcmVhMkRIZWxwZXIoKXtyZXR1cm4gTWEodGhpcyl9YWJzTm9ybSgpe3JldHVybiB0aGlzLmdldFN0YXJ0WFkoKS5ub3JtKDEpK3RoaXMuZ2V0RW5kWFkoKS5ub3JtKDEpK3RoaXMubV9jcC5ub3JtKDEpfWFic05vcm1YWVoodCl7cmV0dXJuIHMoMCksMH1xdWVyeUVudmVsb3BlVyh0LGUpe1dhKHRoaXMsdCxlKX1zZXRTZWdtZW50RnJvbUNvb3Jkc0ZvclN0aXRjaGVyKHQsZSl7Y29uc3Qgcz1bMCwwLDBdO3RoaXMucXVlcnlXZWlnaHRzKHMpLHRoaXMuY29uc3RydWN0V2VpZ2h0cyh0WzBdLHRoaXMuZ2V0Q29udHJvbFBvaW50MSgpLHRbZS0xXSxzWzBdLHNbMV0sc1syXSl9d3JpdGVJbkJ1ZmZlclN0cmVhbSh0LGUpe2NvbnN0IHM9bmV3IEZsb2F0NjRBcnJheSg1KTtyZXR1cm4gc1swXT10aGlzLm1fY3AueCxzWzFdPXRoaXMubV9jcC55LHNbMl09dGhpcy5tX3dlaWdodHNbMF0sc1szXT10aGlzLm1fd2VpZ2h0c1sxXSxzWzRdPXRoaXMubV93ZWlnaHRzWzJdLHQud3JpdGVSYW5nZUZyb21BcnJheShlLHMubGVuZ3RoLHMsITAsMSksZStzLmxlbmd0aH1yZWFkRnJvbUJ1ZmZlclN0cmVhbSh0LGUpe2NvbnN0IHM9bmV3IEZsb2F0NjRBcnJheSg1KTt0LnF1ZXJ5UmFuZ2UoZSxzLmxlbmd0aCxzLCEwLDEpLHRoaXMubV9jcC54PXNbMF0sdGhpcy5tX2NwLnk9c1sxXSx0aGlzLm1fd2VpZ2h0c1swXT1zWzJdLHRoaXMubV93ZWlnaHRzWzFdPXNbM10sdGhpcy5tX3dlaWdodHNbMl09c1s0XSx0aGlzLm1fY2FjaGVkVmFsdWVzPW51bGx9c25hcENvbnRyb2xQb2ludHModCl7Y29uc3QgZT1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKGUpO2NvbnN0IHM9Si5zcXJEaXN0YW5jZShlWzFdLGVbMF0pLG49Si5zcXJEaXN0YW5jZShlWzFdLGVbMl0pO2xldCBpPWVbMF0uY2xvbmUoKSxyPXM7cz5uJiYoaT1lWzJdLmNsb25lKCkscj1uKTtsZXQgbz0hMTtyZXR1cm4gcjw9dCYmMCE9PXImJihvPSEwLHRoaXMuc2V0Q29udHJvbFBvaW50MShpKSksb31uZWVkc1NuYXBDb250cm9sUG9pbnRzKHQpe2lmKCF0KXJldHVybiExO2NvbnN0IGU9Y3QoSiwzKTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhlKTtjb25zdCBzPUouc3FyRGlzdGFuY2UoZVsxXSxlWzBdKSxuPUouc3FyRGlzdGFuY2UoZVsxXSxlWzJdKTtlWzBdLmNsb25lKCk7bGV0IGk9cztyZXR1cm4gcz5uJiYoZVsyXS5jbG9uZSgpLGk9biksaTw9dCYmMCE9PWl9Y2FsY3VsYXRlU3BlY2lhbFBvaW50c0ZvckNyYWNraW5nKHQsZSl7cmV0dXJuIDB9ZW5zdXJlWFlNb25vdG9uZSgpe3JldHVybiBIYSh0aGlzKX1zZXRDb29yZHNGb3JJbnRlcnNlY3Rvcih0LGUscyl7JGEodGhpcyx0LGUscyl9Y29weVRvSW1wbCh0KXtjb25zdCBlPXQ7ZS5tX2NwLnNldENvb3Jkc1BvaW50MkQodGhpcy5tX2NwKSxlLm1fd2VpZ2h0c1swXT10aGlzLm1fd2VpZ2h0c1swXSxlLm1fd2VpZ2h0c1sxXT10aGlzLm1fd2VpZ2h0c1sxXSxlLm1fd2VpZ2h0c1syXT10aGlzLm1fd2VpZ2h0c1syXSxSYShlLExhKHRoaXMpKX1yZXZlcnNlSW1wbCgpe3RoaXMubV93ZWlnaHRzWzJdPXN0KHRoaXMubV93ZWlnaHRzWzBdLHRoaXMubV93ZWlnaHRzWzBdPXRoaXMubV93ZWlnaHRzWzJdKX1lcXVhbHNJbXBsKHQpe2NvbnN0IGU9dDtpZighdGhpcy5tX2NwLmVxdWFscyhlLm1fY3ApKXJldHVybiExO2ZvcihsZXQgcz0wO3M8MztzKyspaWYodGhpcy5tX3dlaWdodHNbc10hPT1lLm1fd2VpZ2h0c1tzXSlyZXR1cm4hMTtyZXR1cm4hMH1lcXVhbHNJbXBsVG9sKHQsZSl7Y29uc3Qgcz10O2lmKCF0aGlzLm1fY3AuaXNFcXVhbFBvaW50MkQocy5tX2NwLGUpKXJldHVybiExO2NvbnN0IG49Y3QoSiwzKTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhuKTtjb25zdCBpPWN0KEosMyk7cy5xdWVyeUNvbnRyb2xQb2ludHMoaSk7Y29uc3Qgcj1bcy5tX3dlaWdodHNbMF0scy5tX3dlaWdodHNbMV0scy5tX3dlaWdodHNbMl1dO2ZvcihsZXQgbz0wO288MztvKyspe2NvbnN0IHQ9bmV3IFk7dC5zZXRDb29yZHNQb2ludDJEWihuW29dLm11bCh0aGlzLm1fd2VpZ2h0c1tvXSksdGhpcy5tX3dlaWdodHNbb10pO2NvbnN0IHM9bmV3IFk7aWYocy5zZXRDb29yZHNQb2ludDJEWihpW29dLm11bChyW29dKSxyW29dKSwhdC5pc0VxdWFsKHMsZSkpcmV0dXJuITF9cmV0dXJuITB9c3dhcEltcGwodCl7Y29uc3QgZT10O2UubV9jcD1zdCh0aGlzLm1fY3AsdGhpcy5tX2NwPWUubV9jcCksZS5tX3dlaWdodHM9c3QodGhpcy5tX3dlaWdodHMsdGhpcy5tX3dlaWdodHM9ZS5tX3dlaWdodHMpLGdhKHRoaXMsZSl9YWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKXtjYSh0aGlzKX1pbnRlcnNlY3QodCxlLHMsbixpKXtyZXR1cm4gbW0oITEsdGhpcyx0LGUscyxuLGkpfWludGVyc2VjdFBvaW50KHQsZSxzKXtyZXR1cm4gR2EodGhpcyx0LGUscyl9ZW5kUG9pbnRNb2RpZmllZCgpe2NhKHRoaXMpfWNsZWFyRW5kUG9pbnRNb2RpZmllZCgpe31zZXRDcHNBbmRXZWlnaHRzKHQscyxuLGkscixvKXsoaTw9MHx8bzw9MHx8cjwwKSYmZShcIndlaWdodHNcIiksKHQuaXNOQU4oKXx8cy5pc05BTigpfHxuLmlzTkFOKCkpJiZlKFwiTkFOIGNvbnRyb2wgcG9pbnRzIGluIGJlemllciBhcmUgbm90IHN1cHBvcnRlZFwiKSx0aGlzLnNldFN0YXJ0WFkodCksdGhpcy5tX2NwLmFzc2lnbihzKSx0aGlzLm1fd2VpZ2h0c1swXT1pLHRoaXMubV93ZWlnaHRzWzFdPXIsdGhpcy5tX3dlaWdodHNbMl09byx0aGlzLnNldEVuZFhZKG4pfXNldENwc0FuZFdlaWdodHNBcnJheSh0LGUpe3RoaXMuc2V0Q3BzQW5kV2VpZ2h0cyh0WzBdLHRbMV0sdFsyXSxlWzBdLGVbMV0sZVsyXSl9fU
1RuLnR5cGU9aS5lbnVtUmF0aW9uYWxCZXppZXIyO3ZhciB3bj1iO2NsYXNzIEFuIGV4dGVuZHMgZHN7Y29uc3RydWN0b3IodCl7dm9pZCAwPT09dHx8YnQodCxcInZkXCIpPyhzdXBlcih7dmQ6dD8udmQsWFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHRoaXMubV9jcD1uZXcgSigwLDApKTp0LmZyb20/KHN1cGVyKHtYU3RhcnQ6dC5mcm9tLngsWVN0YXJ0OnQuZnJvbS55LFhFbmQ6dC50by54LFlFbmQ6dC50by55LC4uLnQudmR9KSx0aGlzLm1fY3A9dC5jcC5jbG9uZSgpKTp0LnBvaW50cz8oc3VwZXIoe1hTdGFydDp0LnBvaW50c1swXS54LFlTdGFydDp0LnBvaW50c1swXS55LFhFbmQ6dC5wb2ludHNbMl0ueCxZRW5kOnQucG9pbnRzWzJdLnksLi4udC52ZH0pLHRoaXMubV9jcD10LnBvaW50c1sxXS5jbG9uZSgpKTp0LmNvcHk/KHN1cGVyKHQpLHRoaXMubV9jcD10LmNvcHkubV9jcC5jbG9uZSgpKTpoKFwidW5leHBlY3RlZCBjb25zdHJ1Y3RvciBhcmdzXCIpfWdldEJvdW5kYXJ5KCl7cmV0dXJuICRzKHRoaXMpfWFzc2lnbkNvcHkodCl7cmV0dXJuIHRoaXMhPT10JiZ0LmNvcHlUbyh0aGlzKSx0aGlzfWNvbnN0cnVjdCh0LGUscyl7dGhpcy5zZXRTdGFydFhZKHQpLHRoaXMubV9jcC5hc3NpZ24oZSksdGhpcy5zZXRFbmRYWShzKSxyaSh0aGlzKX1jb25zdHJ1Y3RQb2ludHModCl7dGhpcy5zZXRTdGFydFhZKHRbMF0pLHRoaXMubV9jcC5hc3NpZ24odFsxXSksdGhpcy5zZXRFbmRYWSh0WzJdKSxyaSh0aGlzKX1nZXRHZW9tZXRyeVR5cGUoKXtyZXR1cm4gaS5lbnVtQmV6aWVyMn1xdWVyeUVudmVsb3BlKHQpe2lmKDI9PT10Lm1fRW52ZWxvcGVUeXBlKXtpZih0LnNldENvb3Jkcyh0aGlzLmdldFN0YXJ0WFkoKSksdC5tZXJnZU5lKHRoaXMuZ2V0RW5kWFkoKSksdC5jb250YWlucyh0aGlzLm1fY3ApKXJldHVybjtjb25zdCBlPXhpKHRoaXMpO2lmKG51bGwhPT1lKXtjb25zdCBzPW5ldyBKO2Zvcihjb25zdCBuIG9mIGUuc3BlY2lhbFBvaW50cyl0aGlzLnF1ZXJ5Q29vcmQyRChuLHMpLHQubWVyZ2VOZShzKX1lbHNle2NvbnN0IGU9W107aGkodGhpcyxlKTtjb25zdCBzPW5ldyBKO2Zvcihjb25zdCBuIG9mIGUpdGhpcy5xdWVyeUNvb3JkMkQobixzKSx0Lm1lcmdlTmUocyl9cmV0dXJufWEoXCJlbnYgdHlwZSBub3QgaW1wbFwiKX1hcHBseVRyYW5zZm9ybWF0aW9uKHQpe2lmKDE9PT10Lm1fVHJhbnNmb3JtYXRpb25UeXBlKXtjb25zdCBlPWN0KEosMyk7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKGUpLHQudHJhbnNmb3JtUG9pbnRzMkQoZSwzLGUpLHRoaXMuc2V0U3RhcnRYWShlWzBdKSx0aGlzLm1fY3AuYXNzaWduKGVbMV0pLHRoaXMuc2V0RW5kWFkoZVsyXSksdm9pZCB0aGlzLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl9cygwKX1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgQW4oe3ZkOnRoaXMubV9kZXNjcmlwdGlvbn0pfWNhbGN1bGF0ZUxlbmd0aDJEKCl7cmV0dXJuIHVpKHRoaXMsMSwhMSl9Y2FsY3VsYXRlTG93ZXJMZW5ndGgyRCgpe3JldHVybiBKLmRpc3RhbmNlKHRoaXMuZ2V0U3RhcnRYWSgpLHRoaXMuZ2V0RW5kWFkoKSl9Y2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpe3JldHVybiB0aGlzLmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkRfKCl9Y2FsY3VsYXRlVXBwZXJMZW5ndGgyRF8oKXtyZXR1cm4gSi5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLm1fY3ApK0ouZGlzdGFuY2UodGhpcy5nZXRFbmRYWSgpLHRoaXMubV9jcCl9cXVlcnlDb29yZDJEKHQsZSl7dGhpcy5xdWVyeUNvb3JkMkRFeHRlbmRlZCh0LGUsITEpfXF1ZXJ5Q29vcmQyREV4dGVuZGVkKHQsZSxzKXtjb25zdCBuPWN0KEosMyk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMobiksWmkobix0LGUscyl9cXVlcnlDb29yZDJERSh0LGUpe0hpKHRoaXMsdCxlKX1xdWVyeUNvb3JkMkRNUCh0LGUpe3MoITEsXCJiZXJuc3RlaW4gcG9seW5vbWlhbHMgbm90IHBvcnRlZFwiKX1nZXRDb29yZFgodCl7aWYodDwwfHx0PjEpe2NvbnN0IGU9bmV3IEo7cmV0dXJuIHRoaXMucXVlcnlDb29yZDJERXh0ZW5kZWQodCxlLCEwKSxlLnh9aWYodDw9LjUpe2NvbnN0IGU9U3QodGhpcy5nZXRTdGFydFgoKSx0aGlzLm1fY3AueCx0KSxzPVN0KHRoaXMubV9jcC54LHRoaXMuZ2V0RW5kWCgpLHQpO3JldHVybiBTdChlLHMsdCl9e2NvbnN0IGU9RXQodGhpcy5nZXRTdGFydFgoKSx0aGlzLm1fY3AueCx0KSxzPUV0KHRoaXMubV9jcC54LHRoaXMuZ2V0RW5kWCgpLHQpO3JldHVybiBFdChlLHMsdCl9fWdldENvb3JkWSh0KXtpZih0PDB8fHQ+MSl7Y29uc3QgZT1uZXcgSjtyZXR1cm4gdGhpcy5xdWVyeUNvb3JkMkRFeHRlbmRlZCh0LGUsITApLGUueX1pZih0PD0uNSl7Y29uc3QgZT1TdCh0aGlzLmdldFN0YXJ0WCgpLHRoaXMubV9jcC54LHQpLHM9U3QodGhpcy5tX2NwLngsdGhpcy5nZXRFbmRYKCksdCk7cmV0dXJuIFN0KGUscyx0KX17Y29uc3QgZT1FdCh0aGlzLmdldFN0YXJ0WSgpLHRoaXMubV9jcC55LHQpLHM9RXQodGhpcy5tX2NwLnksdGhpcy5nZXRFbmRZKCksdCk7cmV0dXJuIEV0KGUscyx0KX19Y3V0KHQsZSxzKXtjb25zdCBuPW5ldyBQbTtyZXR1cm4gdGhpcy5xdWVyeUN1dCh0LGUsbixzKSxuLnJlbGVhc2VTZWdtZW50KCl9cXVlcnlDdXQodCxlLHMsbil7Y29uc3QgaT1zLmNyZWF0ZVF1YWRyYXRpY0JlemllcigpO2lmKHRoaXMuY3V0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LGUsaSksbilyZXR1cm47aS5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pO2NvbnN0IHI9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7aWYocj4xKXtmb3IobGV0IGU9MTtlPHI7ZSsrKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3MoZSksbj13bi5nZXRDb21wb25lbnRDb3VudChzKTtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlQXNEYmwodCxzLGUpO2kuc2V0U3RhcnRBdHRyaWJ1dGUocyxlLG4pfX1mb3IobGV0IHQ9MTt0PHI7dCsrKXtjb25zdCBzPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRTZW1hbnRpY3ModCksbj13bi5nZXRDb21wb25lbnRDb3VudChzKTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlQXNEYmwoZSxzLHQpO2kuc2V0RW5kQXR0cmlidXRlKHMsdCxuKX19fX1xdWVyeURlcml2YXRpdmUodCxlKXtPaSh0aGlzLHQsZSl9Y3V0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LHMsbil7aWYoKHQ8MHx8cz4xfHx0PnMpJiZlKFwiUXVhZHJhdGljX2Jlemllci5jdXRfYmV6aWVyX2lnbm9yZV9hdHRyaWJ1dGVzXCIpLDA9PT10JiYxPT09cylyZXR1cm4gbi5zZXRTdGFydFhZKHRoaXMuZ2V0U3RhcnRYWSgpKSxuLm1fY3AuYXNzaWduKHRoaXMubV9
1jcCksdm9pZCBuLnNldEVuZFhZKHRoaXMuZ2V0RW5kWFkoKSk7Y29uc3QgaT1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKGkpLFlpKGksdCxzLGkpLG4uY29uc3RydWN0UG9pbnRzKGkpfXNwbGl0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LGUsbil7cygwKX1nZXRBdHRyaWJ1dGVBc0RibCh0LGUscyl7aWYoMD09PWUpcmV0dXJuIDA9PT1zP3RoaXMuZ2V0Q29vcmRYKHQpOnRoaXMuZ2V0Q29vcmRZKHQpO2NvbnN0IG49dGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpLGk9bj4wP3RoaXMudFRvTGVuZ3RoKHQpL246MCxyPXduLmdldEludGVycG9sYXRpb24oZSksbz10aGlzLmdldFN0YXJ0QXR0cmlidXRlQXNEYmwoZSxzKSxhPXRoaXMuZ2V0RW5kQXR0cmlidXRlQXNEYmwoZSxzKTtyZXR1cm4gdnQocixvLGEsaSx3bi5nZXREZWZhdWx0VmFsdWUoZSkpfWdldENsb3Nlc3RDb29yZGluYXRlKHQsZSl7cmV0dXJuIHZpKHRoaXMsdCxVLnVuaXQoKSxlKX1nZXRDbG9zZXN0Q29vcmRpbmF0ZU9uSW50ZXJ2YWwodCxlLHM9LTEpe3JldHVybiB2aSh0aGlzLHQsZSwhMSl9Z2V0WU1vbm90b25pY1BhcnRzKHQsZSl7cmV0dXJuIHRoaXMuZ2V0TW9ub3RvbmljUGFydHModCxlKX1nZXRNb25vdG9uaWNQYXJ0cyh0LG4pe3QubGVuZ3RoPDImJmUoXCJcIik7Y29uc3QgaT1haSh0aGlzKTtsZXQgcj0wO2lmKDI9PT1pLnNwZWNpYWxQb2ludHNDb3VudCgpKXJldHVybiAwO3ModC5sZW5ndGg+PWkuc3BlY2lhbFBvaW50c0NvdW50KCktMSk7Zm9yKGxldCBlPTEscz1pLnNwZWNpYWxQb2ludHNDb3VudCgpO2U8czsrK2UpdGhpcy5xdWVyeUN1dChpLnNwZWNpYWxQb2ludHNbZS0xXSxpLnNwZWNpYWxQb2ludHNbZV0sdFtyXSxuKSxyKys7Zm9yKGxldCBlPTA7ZTxyOysrZSl7QWkodFtlXS5nZXQoKSl9cmV0dXJuIHJ9aW50ZXJzZWN0aW9uV2l0aEF4aXMyRCh0LGUscyxuKXtjb25zdCBpPWN0KGh0LDMpLHI9Y3QoaHQsMiksbz1uZXcgVSgwLDEpO2xldCBhPTA7aWYodCl7aWYoaVswXT1uZXcgaHQodGhpcy5nZXRTdGFydFkoKSkuc3ViKGUpLGlbMV09bmV3IGh0KHRoaXMubV9jcC55KS5zdWJFKG5ldyBodCh0aGlzLmdldFN0YXJ0WSgpKSkubXVsVGhpc0J5UG93ZXIyKDIpLGlbMl09bmV3IGh0KH
1RoaXMuZ2V0U3RhcnRZKCkpLmFkZCh0aGlzLmdldEVuZFkoKSkuc3ViRShuZXcgaHQodGhpcy5tX2NwLnkpLm11bFRoaXNCeVBvd2VyMigyKSksYT1kbihpWzJdLGlbMV0saVswXSxvLCExLHIpLHMpZm9yKGxldCBoPTA7aDxhO2grKylzW2hdPXRoaXMuZ2V0Q29vcmRYKHJbaF0udmFsdWUoKSl9ZWxzZSBpZihpWzBdPW5ldyBodCh0aGlzLmdldFN0YXJ0WCgpKS5zdWIoZSksaVsxXT1uZXcgaHQodGhpcy5tX2NwLngpLnN1YkUobmV3IGh0KHRoaXMuZ2V0U3RhcnRYKCkpKS5tdWxUaGlzQnlQb3dlcjIoMiksaVsyXT1uZXcgaHQodGhpcy5nZXRTdGFydFgoKSkuYWRkKHRoaXMuZ2V0RW5kWCgpKS5zdWJFKG5ldyBodCh0aGlzLm1fY3AueCkubXVsVGhpc0J5UG93ZXIyKDIpKSxhPWRuKGlbMl0saVsxXSxpWzBdLG8sITEscikscylmb3IobGV0IGg9MDtoPGE7aCsrKXNbaF09dGhpcy5nZXRDb29yZFkocltoXS52YWx1ZSgpKTtpZihuKWZvcihsZXQgaD0wO2g8YTtoKyspbltoXT1yW2hdLnZhbHVlKCk7ZWxzZSBzJiZEdChzLGEpO3JldHVybiBhfWludGVyc2VjdGlvbk9mWU1vbm90b25pY1dpdGhBeGlzWCh0LGUpe2lmKHRoaXMubV9ZU3RhcnQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdD09PXRoaXMubV9ZU3RhcnQ/ZTpOdW1iZXIuTmFOO2lmKHQ9PT10aGlzLm1fWVN0YXJ0KXJldHVybiB0aGlzLm1fWFN0YXJ0O2lmKHQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdGhpcy5tX1hFbmQ7Y29uc3Qgbj1bMCwwXSxpPXRoaXMuaW50ZXJzZWN0aW9uV2l0aEF4aXMyRCghMCx0LG4sbnVsbCk7cmV0dXJuIHMoMiE9PWkpLC0xPT09aT9lOm5bMF19aXNDdXJ2ZSgpe3JldHVybiEwfWlzTGluZSgpe3JldHVybiExfWlzRGVnZW5lcmF0ZSh0KXtyZXR1cm4gemUodGhpcyx0KX1pc0RlZ2VuZXJhdGUzRCh0LGUpe3JldHVybiBzKDApLCExfXF1ZXJ5TG9vc2VFbnZlbG9wZSh0KXtpZigyPT09dC5tX0VudmVsb3BlVHlwZSlyZXR1cm4gdC5zZXRDb29yZHModGhpcy5nZXRTdGFydFhZKCkpLHQubWVyZ2VOZSh0aGlzLm1fY3ApLHZvaWQgdC5tZXJnZU5lKHRoaXMuZ2V0RW5kWFkoKSk7cygwKX1jbG9uZSh0KXtjb25zdCBlPXRoaXMuY3JlYXRlSW5zdGFuY2UoKTtyZXR1cm4gdGhpcy5jb3B5VG8oZSksZX1xdWVyeUludGVydmFsKHQsZSl7aWYoMD09PXQpe2NvbnN0IHQ9bmV3IGxlO3RoaXMucXVlcnlFbnZlbG9wZSh0KTtjb25zdCBzPW5ldyBVO3JldHVybiAwPT09ZT90LnF1ZXJ5SW50ZXJ2YWxYKHMpOnQucXVlcnlJbnRlcnZhbFkocyksc31yZXR1cm4gc3VwZXIucXVlcnlJbnRlcnZhbCh0LGUpfXF1ZXJ5TG9vc2VFbnZlbG9wZU9uSW50ZXJ2YWwodCxlKXtjb25zdCBzPWN0KEosNCk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMocyksWWkocyx0LnZtaW4sdC52bWF4LHMpLGUuc2V0RnJvbVBvaW50cyhzLDQpfWNoYW5nZUVuZFBvaW50czJEKHQsZSl7aWYodC5pc0VxdWFsKHRoaXMubV9YU3RhcnQsdGhpcy5tX1lTdGFydCkmJmUuaXNFcXVhbCh0aGlzLm1fWEVuZCx0aGlzLm1fWUVuZCkpcmV0dXJuO2NvbnN0IHM9dGhpcy5tX2NwLmlzRXF1YWwodGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0KSxuPXRoaXMubV9jcC5pc0VxdWFsKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kKTt0aGlzLnNldFN0YXJ0WFkodCksdGhpcy5zZXRFbmRYWShlKSxzP3RoaXMubV9jcC5zZXRDb29yZHNQb2ludDJEKHQpOm4mJnRoaXMubV9jcC5zZXRDb29yZHNQb2ludDJEKGUpLHRoaXMubm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpfXRUb0xlbmd0aCh0KXtyZXR1cm4gdWkodGhpcyx0LCEwKX1sZW5ndGhUb1QodCl7cmV0dXJuIHBpKHRoaXMsdCl9Y2FsY3VsYXRlV2VpZ2h0ZWRBcmVhQ2VudHJvaWQyRCh0KXtjb25zdCBlPWN0KEosMyk7a2kodGhpcyxlKTtjb25zdCBzPWVbMl0sbj1lWzFdLGk9bmV3IEoscj1zLnkqbi54LXMueCpuLnk7aS54PS0oNCpzLngrNSpuLngpKnIvNjAsaS55PS0oNCpzLnkrNSpuLnkpKnIvNjA7Y29uc3Qgbz1maSh0aGlzKTtyZXR1cm4gaS54Kz0oZVswXS54LXQueCkqbyxpLnkrPShlWzBdLnktdC55KSpvLGl9Y2FsY3VsYXRlV2VpZ2h0ZWRDZW50cm9pZDJEKCl7Y29uc3QgdD1uZXcgSjtyZXR1cm4gdGhpcy5pc0RlZ2VuZXJhdGUoMCk/KHQuc2V0Q29vcmRzKDAsMCksdCk6eWkodGhpcyk/KHQuYXNzaWduKHRoaXMuZ2V0Q29vcmQyRCguNSkubXVsKHRoaXMuY2FsY3VsYXRlTGVuZ3RoMkQoKSkpLHQpOih0LmFzc2lnbihJaSh0aGlzLDEpKSx0KX1nZXRDb250cm9sUG9pbnQxKCl7cmV0dXJuIHRoaXMubV9jcC5jbG9uZSgpfXNldENvbnRyb2xQb2ludDEodCl7dGhpcy5tX2NwLnNldENvb3Jkc1BvaW50MkQodCksdGhpcy5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpfXF1ZXJ5Q29udHJvbFBvaW50cyh0KXt0WzBdLmFzc2lnbih0aGlzLmdldFN0YXJ0WFkoKSksdFsxXS5hc3NpZ24odGhpcy5tX2NwKSx0WzJdLmFzc2lnbih0aGlzLmdldEVuZFhZKCkpfXF1ZXJ5Q29udHJvbFBvaW50c0hlbHBlcih0KXtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHModCksM31zZXRDb250cm9sUG9pbnRzKHQpe2ZvcihsZXQgcz0wO3M8MztzKyspdFtzXS5pc05BTigpJiZlKFwiTmFOIGNvbnRyb2wgcG9pbnRzIGluIGJlemllciBhcmUgbm90IHN1cHBvcnRlZFwiKTt0aGlzLm1fWFN0YXJ0PXRbMF0ueCx0aGlzLm1fWVN0YXJ0PXRbMF0ueSx0aGlzLm1fY3Auc2V0Q29vcmRzUG9pbnQyRCh0WzFdKSx0aGlzLm1fWEVuZD10WzJdLngsdGhpcy5tX1lFbmQ9dFsyXS55LHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1nZXRUYW5nZW50KHQpe2NvbnN0IGU9cHQodCwwLDEpO2xldCBzPWdpKHRoaXMsMSxlKTtyZXR1cm4gcy5pc1plcm8oKSYmKHM9Z2kodGhpcywyLGUpLDE9PT1lJiZzLm5lZ2F0ZVRoaXMoKSksc31nZXREZXJpdmF0aXZlKHQpe3JldHVybiBnaSh0aGlzLDEscHQodCwwLDEpKX1nZXRDdXJ2YXR1cmUodCl7Y29uc3QgZT1naSh0aGlzLDEsdCkscz1naSh0aGlzLDIsdCksbj1lLnNxckxlbmd0aCgpO2lmKDA9PT1uKXJldHVybi
1BOdW1iZXIuTmFOO2UuZGl2VGhpcyhNYXRoLnNxcnQobikpO3JldHVybiBlLmNyb3NzUHJvZHVjdChzKS9ufWlzSW50ZXJzZWN0aW5nKHQsZSxzKXtyZXR1cm4gMCE9PW9tKCExLHRoaXMsdCxlLHMpfWlzSW50ZXJzZWN0aW5nUG9pbnQodCxlLHMpe2lmKHMmJih0LmlzRXF1YWxQb2ludDJEKHRoaXMuZ2V0U3RhcnRYWSgpKXx8dC5pc0VxdWFsUG9pbnQyRCh0aGlzLmdldEVuZFhZKCkpKSlyZXR1cm4hMTtjb25zdCBuPW5ldyBsZTtpZih0aGlzLnF1ZXJ5TG9vc2VFbnZlbG9wZShuKSxuLmluZmxhdGVDb29yZHMoZSxlKSwhbi5jb250YWlucyh0KSlyZXR1cm4hMTtjb25zdCBpPXRoaXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUodCwhMSkscj1uZXcgSjt0aGlzLnF1ZXJ5Q29vcmQyRChpLHIpO3JldHVybiBKLmRpc3RhbmNlKHIsdCk8PWV9aXNJbnRlcnNlY3RpbmdQb2ludDNEKHQsZSxuLGkscj0xKXtyZXR1cm4gcygwKSwhMX1pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpe3JldHVybiExfWdldE1vbm90b25pY1BhcnRQYXJhbXModCxzKXtjb25zdCBuPWFpKHRoaXMpLGk9bi5zcGVjaWFsUG9pbnRzQ291bnQoKTtpZighcylyZXR1cm4gbi5zcGVjaWFsUG9pbnRzQ291bnQoKTt0PGkmJmUoXCJcIik7Zm9yKGxldCBlPTA7ZTxpO2UrKylzW2VdPW4uc3BlY2lhbFBvaW50c1tlXTtyZXR1cm4gaX1ub3JtYWxpemVBZnRlckVuZHBvaW50Q2hhbmdlKCl7cmV0dXJuITF9b3JpZW50Qm90dG9tVXAoKXtpZih0aGlzLm1fWUVuZDx0aGlzLm1fWVN0YXJ0fHx0aGlzLm1fWUVuZD09PXRoaXMubV9ZU3RhcnQmJnRoaXMubV9YRW5kPHRoaXMubV9YU3RhcnQpe3N0KHRoaXMubV9YU3RhcnQsdGhpcy5tX1hTdGFydD10aGlzLm1fWEVuZCksc3QodGhpcy5tX1lTdGFydCx0aGlzLm1fWVN0YXJ0PXRoaXMubV9ZRW5kKTtmb3IobGV0IHQ9MCxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMjt0PGU7dCsrKXRoaXMubV9hdHRyaWJ1dGVzW3QrZV09c3QodGhpcy5tX2F0dHJpYnV0ZXNbdF0sdGhpcy5tX2F0dHJpYnV0ZXNbdF09dGhpcy5tX2F0dHJpYnV0ZXNbdCtlXSk7dGhpcy5tX2NhY2hlZFZhbHVlcz1udWxsfX1pc0RlZ2VuZXJhdGVUb0xpbmVIZWxwZXIodCl7Y29uc3QgZT1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKGUpO2NvbnN0IHM9ZVsyXS5zdWIoZVswXSksbj1zLmxlbmd0aCgpO2lmKEouZGlzdGFuY2UoZVswXSxlWzFdKStKLmRpc3RhbmNlKGVbMl0sZVsxXSktbj50KXJldHVybiExO2NvbnN0IGk9dCxyPWVbMV0uY2xvbmUoKTtyLnN1YlRoaXMoZVswXSk7cmV0dXJuIShNYXRoLmFicyhyLmNyb3NzUHJvZHVjdChzKSkvbj5pKX1jb3B5SWdub3JlQXR0cmlidXRlcyh0KXtjb25zdCBlPWN0KEosMyk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksdC5zZXRDb250cm9sUG9pbnRzKGUpfWNhbGN1bGF0ZUFyZWEyREhlbHBlcigpe3JldHVybiBmaSh0aGlzKX1hYnNOb3JtKCl7cmV0dXJuIFhpKHRoaXMpfXF1ZXJ5RW52ZWxvcGVXKHQsZSl7Y29uc3Qgcz1jdChKLDMpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKHMpLERpKHMsdCxlKX1zZXRTZWdtZW50RnJvbUNvb3Jkc0ZvclN0aXRjaGVyKHQsZSl7dGhpcy5jb25zdHJ1Y3QodFswXSx0aGlzLmdldENvbnRyb2xQb2ludDEoKSx0W2UtMV0pfXNuYXBDb250cm9sUG9pbnRzKHQpe3JldHVybiB0cih0aGlzLHQpfXdyaXRlSW5CdWZmZXJTdHJlYW0odCxlKXtjb25zdCBzPW5ldyBGbG9hdDY0QXJyYXkoMik7cmV0dXJuIHNbMF09dGhpcy5tX2NwLngsc1sxXT10aGlzLm1fY3AueSx0LndyaXRlUmFuZ2VGcm9tQXJyYXkoZSxzLmxlbmd0aCxzLCEwLDEpLGUrcy5sZW5ndGh9cmVhZEZyb21CdWZmZXJTdHJlYW0odCxlKXtjb25zdCBzPW5ldyBGbG9hdDY0QXJyYXkoMik7dC5xdWVyeVJhbmdlKGUscy5sZW5ndGgscywhMCwxKSx0aGlzLm1fY3AueD1zWzBdLHRoaXMubV9jcC55PXNbMV0sdGhpcy5tX2NhY2hlZFZhbHVlcz1udWxsfW5lZWRzU25hcENvbnRyb2xQb2ludHModCl7cmV0dXJuIGVyKHRoaXMsdCl9Y2FsY3VsYXRlU3BlY2lhbFBvaW50c0ZvckNyYWNraW5nKHQsZSl7cmV0dXJuIDB9ZW5zdXJlWFlNb25vdG9uZSgpe3JldHVybiBBaSh0aGlzKX1zZXRDb29yZHNGb3JJbnRlcnNlY3Rvcih0LGUscyl7TmkodGhpcyx0LGUscyl9Y29weVRvSW1wbCh0KXtjb25zdCBlPXQ7ZS5tX2NwLnNldENvb3Jkc1BvaW50MkQodGhpcy5tX2NwKSxDaShlLHhpKHRoaXMpKX1yZXZlcnNlSW1wbCgpe31lcXVhbHNJbXBsVG9sKHQsZSl7Y29uc3Qgcz10O3JldHVybiEhdGhpcy5tX2NwLmlzRXF1YWxQb2ludDJEKHMubV9jcCxlKX1lcXVhbHNJbXBsKHQpe2NvbnN0IGU9dDtyZXR1cm4hIXRoaXMubV9
1jcC5lcXVhbHMoZS5tX2NwKX1zd2FwSW1wbCh0KXtjb25zdCBlPXQ7ZS5tX2NwPXN0KHRoaXMubV9jcCx0aGlzLm1fY3A9ZS5tX2NwKSxvaSh0aGlzLGUpfWFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl7cmkodGhpcyl9aW50ZXJzZWN0KHQsZSxzLG4saSl7cmV0dXJuIG1tKCExLHRoaXMsdCxlLHMsbixpKX1pbnRlcnNlY3RQb2ludCh0LGUscyl7cmV0dXJuIFNpKHRoaXMsdCxlLmxlbmd0aCxlLHMpfWVuZFBvaW50TW9kaWZpZWQoKXtyaSh0aGlzKX1jbGVhckVuZFBvaW50TW9kaWZpZWQoKXt9fUFuLnR5cGU9aS5lbnVtQmV6aWVyMjtjbGFzcyBUbntjb25zdHJ1Y3Rvcih0KXtyZXR1cm4gdC5jb2Vmc1Q/KHRoaXMubV96ZXJvQ3Rvcj10Lnplcm9DdG9yLHRoaXMubV9lbGVtZW50cz10LmNvZWZzVC5tYXAodD0+dC5jbG9uZSgpKSxzKHRoaXMubV9lbGVtZW50cy5sZW5ndGg9PT10LnBvd2VyKzEpLHZvaWQgdGhpcy51cGRhdGVQb3dlcigpKTp0LmNvZWYwPyh0aGlzLm1femVyb0N0b3I9dC56ZXJvQ3Rvcix2b2lkKHRoaXMubV9lbGVtZW50cz1bdC5jb2VmMC5jbG9uZSgpXSkpOnQuY29weT8odGhpcy5tX3plcm9DdG9yPXQuY29weS5tX3plcm9DdG9yLHZvaWQodGhpcy5tX2VsZW1lbnRzPXQuY29weS5tX2VsZW1lbnRzLm1hcCh0PT50LmNsb25lKCkpKSk6KHRoaXMubV96ZXJvQ3Rvcj10Lnplcm9DdG9yLHZvaWQodGhpcy5tX2VsZW1lbnRzPVtuZXcgdGhpcy5tX3plcm9DdG9yXSkpfWNvbnN0cnVjdCh0LGUpe3JldHVybiB0aGlzLm1fZWxlbWVudHM9dC5tYXAodD0+dC5jbG9uZSgpKSx0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31jb25zdHJ1Y3QwKHQpe3JldHVybiB0aGlzLm1fZWxlbWVudHMubGVuZ3RoPTAsdGhpcy5tX2VsZW1lbnRzLnB1c2godC5jbG9uZSgpKSx0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31hc3NpZ25Db3B5KHQpe3JldHVybiB0aGlzLm1fZWxlbWVudHM9dC5tX2VsZW1lbnRzLm1hcCh0PT50LmNsb25lKCkpLHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfWFzc2lnbk1vdmUodCl7cmV0dXJuIHRoaXMubV9lbGVtZW50cz10Lm1fZWxlbWVudHMsdC5tX2VsZW1lbnRzPVtdLHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfXBvd2VyKCl7cmV0dXJuIHRoaXMubV9lbGVtZW50cy5sZW5ndGgtMX1hZGRFbGVtZW50KHQpe3RoaXMubV9lbGVtZW50cy5wdXNoKHQuY2xvbmUoKSl9c2NhbGVSYW5nZVRvVW5pdEludGVydmFsKHQsZSl7Y29uc3Qgcz1lO3Muc3ViVGhpcyh0KTtjb25zdCBuPXRoaXMucG93ZXIoKTtmb3IobGV0IGk9MDtpPD1uO2krKyl7Y29uc3QgZT1uZXcgdGhpcy5tX3plcm9DdG9yO2ZvcihsZXQgcz1pO3M8PW47cysrKXtjb25zdCBuPXRoaXMubV9lbGVtZW50c1tzXTtuLm11bERvdWJsZVRoaXMoaGUocyxpKSk7Y29uc3Qgcj10LnBvdyhzLWkpO24ubXVsVGh
1pcyhyKSxlLmFkZFRoaXMobil9Y29uc3Qgcj1zLnBvdyhpKTtlLm11bFRoaXMociksdGhpcy5tX2VsZW1lbnRzW2ldPWV9fWZtU3ViVGhpcyh0LGUpe3JldHVybiBzKDApLHRoaXN9YWRkVGhpcyh0KXtjb25zdCBlPU1hdGgubWluKHRoaXMucG93ZXIoKSx0LnBvd2VyKCkpO2ZvcihsZXQgbj0wO248PWU7KytuKXRoaXMubV9lbGVtZW50c1tuXS5hZGRUaGlzKHQubV9lbGVtZW50c1tuXSk7Y29uc3Qgcz10LnBvd2VyKCk7dGhpcy5tX2VsZW1lbnRzLmxlbmd0aD1NYXRoLm1heCh0aGlzLnBvd2VyKCksdC5wb3dlcigpKSsxO2ZvcihsZXQgbj1lKzE7bjw9czsrK24pdGhpcy5tX2VsZW1lbnRzW25dPXQubV9lbGVtZW50c1tuXTtyZXR1cm4gdGhpcy51cGRhdGVQb3dlcigpLHRoaXN9YWRkMCh0KXtyZXR1cm4gdGhpcy5tX2VsZW1lbnRzWzBdLmFkZFRoaXModCksdGhpcy51cGRhdGVQb3dlcigpLHRoaXN9YWRkTnVtYmVyMCh0KXtyZXR1cm4gcygwKSx0aGlzfXN1Yih0KXtjb25zdCBlPU1hdGgubWluKHRoaXMucG93ZXIoKSx0LnBvd2VyKCkpO2ZvcihsZXQgbj0wO248PWU7KytuKXRoaXMubV9lbGVtZW50c1tuXS5zdWJUaGlzKHQubV9lbGVtZW50c1tuXSk7Y29uc3Qgcz10LnBvd2VyKCk7dGhpcy5tX2VsZW1lbnRzLmxlbmd0aD1NYXRoLm1heCh0aGlzLnBvd2VyKCksdC5wb3dlcigpKSsxO2ZvcihsZXQgbj1lKzE7bjw9czsrK24pdGhpcy5tX2VsZW1lbnRzW25dPXQubV9lbGVtZW50c1tuXS5jbG9uZSgpLHRoaXMubV9lbGVtZW50c1tuXS5uZWdhdGVUaGlzKCk7cmV0dXJuIHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfXN1YjAodCl7cmV0dXJuIHMoMCksdGhpc31zdWJOdW1iZXIwKHQpe3JldHVybiBzKDApLHRoaXN9c3ViU2hpZnRlZCh0LGUpe2NvbnN0IHM9dGhpcy5wb3dlcigpLG49dC5wb3dlcigpK2UsaT1NYXRoLm1pbih0aGlzLnBvd2VyKCksbik7bGV0IHI9MDtmb3IobGV0IG89ZTtvPD1pOysrbyl0aGlzLm1fZWxlbWVudHNbb10uc3ViVGhpcyh0Lm1fZWxlbWVudHNbcl0pLHIrKztpZihuPD1zKXJldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpczt0aGlzLm1fZWxlbWVudHMubGVuZ3RoPW4rMTtmb3IobGV0IG89cysxO288dGhpcy5tX2VsZW1lbnRzLmxlbmd0aDsrK28pdGhpcy5tX2VsZW1lbnRzW29dPW5ldyB0aGlzLm1femVyb0N0b3I7Zm9yKGxldCBvPWkrMTtvPD1uOysrbyl0aGlzLm1fZWxlbWVudHNbb10uc3ViVGhpcyh0Lm1fZWxlbWVudHNbcisrXSk7cmV0dXJuIHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfXN1YlNoaWZ0ZWRXaXRoQ29lZih0LGUscyl7Y29uc3Qgbj10aGlzLnBvd2VyKCksaT10LnBvd2VyKCkrcyxyPU1hdGgubWluKHRoaXMucG93ZXIoKSxpKTtsZXQgbz0wO2ZvcihsZXQgYT1zO2E8PXI7KythKXRoaXMubV9lbGVtZW50c1thXS5mbVN1YlRoaXModC5tX2VsZW1lbnRzW29dLGUpLG8rKztpZihpPD1uKXJldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpczt0aGlzLm1fZWxlbWVudHMubGVuZ3RoPWkrMTtmb3IobGV0IGE9bisxO2E8dGhpcy5tX2VsZW1lbnRzLmxlbmd0aDsrK2EpdGhpcy5tX2VsZW1lbnRzW2FdPW5ldyB0aGlzLm1femVyb0N0b3I7Zm9yKGxldCBhPXIrMTthPD1pOysrYSl0aGlzLm1fZWxlbWVudHNbYV0uZm1TdWJUaGlzKHQubV9lbGVtZW50c1tvKytdLGUpO3JldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31tdWxUaGlzKHQpe2lmKHRoaXMuY29uc3RydWN0b3I9PT10LmNvbnN0cnVjdG9yKXtjb25zdCBlPXQscz1bXTtmb3IobGV0IHQ9MCxuPXRoaXMucG93ZXIoKTt0PD1uO3QrKylmb3IobGV0IGk9MCxyPWUucG93ZXIoKTtpPD1yO2krKyl7Y29uc3Qgbj10aGlzLm1fZWxlbWVudHNbdF0uY2xvbmUoKTtuLm11bFRoaXMoZS5tX2VsZW1lbnRzW2ldKSx0K2k8cy5sZW5ndGg/c1t0K2ldLmFkZFRoaXMobik6cy5wdXNoKG4pfXRoaXMubV9lbGVtZW50cz1zfWVsc2UgZm9yKGxldCBlPTAscz10aGlzLnBvd2VyKCk7ZTw9cztlKyspdGhpcy5tX2VsZW1lbnRzW2VdLm11bFRoaXModCk7cmV0dXJuIHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfW11bEVsZW1lbnRUaGlzKHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5wb3dlcigpO2U8PXM7ZSsrKXRoaXMubV9lbGVtZW50c1tlXS5tdWxUaGlzKHQpO3JldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31tdWxEb3VibGVUaGlzKHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5wb3dlcigpO2U8PXM7ZSsrKXRoaXMubV9lbGVtZW50c1tlXS5tdWxEb3VibGVUaGlzKHQpO3JldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31tdWxOdW1iZXIwKHQpe3JldHVybiBzKDApLHRoaXN9bXVsQmlnaW50MCh0KXtyZXR1cm4gcygwKSx0aGlzfW11bEJpZ0ludFRoaXModCl7cmV0dXJuIHMoMCksdGhpc31tdWxJbnQzMjAodCl7cmV0dXJuIHMoMCksdGhpc31kaXYwKHQpe3JldHVybiBzKDApLHRoaXN9YWJzVGhpcygpe3JldHVybiBzKDApLHRoaXN9ZGl2KHQsZSxzKXtpZih0aGlzLnBvd2VyKCk8dC5wb3dlcigpKXJldHVybiBzLmFzc2lnbkNvcHkodGhpcyksdm9pZCBlLnNldFplcm8oKTtzLnNldFplcm8oKSxlLnNldFplcm8oKTtjb25zdCBuPXQuZ2V0RWxlbWVudCh0LnBvd2VyKCkpLGk9dGhpcy5jbG9uZSgpO2xldCByPWkucG93ZXIoKTtjb25zdCBvPWkucG93ZXIoKS10LnBvd2VyKCk7bGV0IGE9bztmb3IoZS5tX2VsZW1lbnRzPWN0KGUubV96ZXJvQ3RvcixvKzEpOzspe2lmKHI8dC5wb3dlcigpKXtzLmFzc2lnbk1vdmUoaSk7YnJlYWt9aWYocj09PWkucG93ZXIoKSl7Y29uc3Qgcz1pLmdldEVsZW1lbnQoaS5wb3dlcigpKTtzLmRpdlRoaXMobiksaS5zdWJTaGlmdGVkV2l0aENvZWYodCxzLGkucG93ZXIoKS10LnBvd2VyKCkpLGUubV9lbGVtZW50c1thXT1zLmNsb25lKCl9YS0tLHItLX1zLnVwZGF0ZVBvd2VyKCksZS51cGRhdGVQb3dlcigpfWRpdlRoaXModCl7cmV0dXJuIHMoMCksdGhpc31zdWJUaGlzKHQpe2NvbnN0IGU9TWF0aC5taW4odGhpcy5wb3dlcigpLHQucG93ZXIoKSk7Zm9yKGxldCBuPTA7bjw9ZTsrK24pdGhpcy5tX2VsZW1lbnRzW25dLnN1YlRoaXModC5tX2VsZW1lbnRzW25dKTtjb25zdCBzPXQucG93ZXIoKTt0aGlzLm1fZWxlbWVudHMubGVuZ3RoPU1hdGgubWF4KHRoaXMucG93ZXIoKSx0LnBvd2VyKCkpKzE7Zm9yKGxldCBuPWUrMTtuPD1zOysrbil0aGlzLm1fZWxlbWVudHNbbl09dC5tX2VsZW1lbnRzW25dLmNsb25lKCksdGhpcy5tX2VsZW1lbnRzW25dLm5lZ2F0ZVRoaXMoKTtyZXR1cm4gdGhpcy51cGRhdGVQb3dlcigpLHRoaXN9c3ViMFRoaXModCl7cmV0dXJuIHRoaXMubV9lbGVtZW50c1swXS5zdWJUaGlzKHQpLHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfXN1YkZyb20odCxlKXtzKDApfWlzWmVybygpe3JldHVybiAwPT09dGhpcy5wb3dlcigpJiZ0aGlzLm1fZWxlbWVudHNbMF0uaXNaZXJvKCl9bmVnYXRlVGhpcygpe2ZvcihsZXQgdD10aGlzLm1fZWxlbWVudHMubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5tX2VsZW1lbnRzW3RdLm5lZ2F0ZVRoaXMoKTtyZXR1cm4gdGhpc31nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLm1fZWxlbWVudHNbdF0uY2xvbmUoKX1zZXRFbGVtZW50KHQsZSl7cmV0dXJuIHRoaXMubV9lbGVtZW50c1t0XT1lLmNsb25lKCksdGhpc31ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucG93ZXIoKSxzPXRoaXMubV9lbGVtZW50c1tlXS5jbG9uZSgpO2ZvcihsZXQgbj1lLTE7bj49MDstLW4pcy5tdWxUaGlzKHQpLHMuYWRkVGhpcyh0aGlzLm1fZWxlbWVudHNbbl0pO3JldHVybiBzfWVxdWFscyh0KXtpZih0aGlzPT09dClyZXR1cm4hMDtpZih0aGlzLnBvd2VyKCkhPT10LnBvd2VyKCkpcmV0dXJuITE7Zm9yKGxldCBlPXRoaXMubV9lbGVtZW50cy5sZW5ndGgtMTtlPj0wO2UtLSlpZighdGhpcy5tX2VsZW1lbnRzW2VdLmVxdWFscyh0Lm1fZWxlbWVudHNbZV0pKXJldHVybiExO3JldHVybiEwfXVwZGF0ZVBvd2VyKCl7Zm9yKGxldCB0PXRoaXMubV9lbGVtZW50cy5sZW5ndGgtMTt0PjAmJnRoaXMubV9lbGVtZW50c1t0XS5pc1plcm8oKTt0LS0pdGhpcy5tX2VsZW1lbnRzLnBvcCgpO3JldHVybiB0aGlzfXNldFplcm8oKXtyZXR1cm4gdGhpcy5tX2VsZW1lbnRzLmxlbmd0aD0xLHRoaXMubV9lbGVtZW50c1swXT1uZXcgdGhpcy5tX3plcm9DdG9yLHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfWRlcml2YXRpdmUodCl7aWYodGhpcy5wb3dlcigpPHQpcmV0dXJuIHRoaXMuY2xvbmUoKS5zZXRaZXJvKCk7aWYoMD09PXQpcmV0dXJuIHRoaXMuY2xvbmUoKTtjb25zdCBlPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtjb2Vmc1Q6dGhpcy5tX2VsZW1lbnRzLnNsaWNlKHQpLHBvd2VyOnRoaXMucG93ZXIoKS10fSk7Zm9yKGxldCBzPXQsbj10aGlzLnBvd2VyKCk7czw9b
1jtzKyspe2xldCBuPUJpZ0ludChzKTtmb3IobGV0IGU9cy0xLGk9cy10O2U+aTstLWUpbio9QmlnSW50KGUpO2UubV9lbGVtZW50c1tzLXRdLm11bEJpZ0ludFRoaXMobil9cmV0dXJuIGUudXBkYXRlUG93ZXIoKSxlfWRlcml2YXRpdmUxVGhpcygpe2lmKHRoaXMubV9lbGVtZW50cy5sZW5ndGg+MSl7dGhpcy5tX2VsZW1lbnRzPXRoaXMubV9lbGVtZW50cy5zbGljZSgxKTtmb3IobGV0IHQ9MSxlPXRoaXMucG93ZXIoKTt0PD1lO3QrKyl0aGlzLm1fZWxlbWVudHNbdF0ubXVsVGhpcyhydC5jb25zdHJ1Y3RJbnQzMih0KzEpKX1lbHNlIHRoaXMubV9lbGVtZW50cy5sZW5ndGg9MCx0aGlzLm1fZWxlbWVudHMucHVzaChuZXcgdGhpcy5tX3plcm9DdG9yKTtyZXR1cm4gdGhpc31saW1pdFByZWNpc2lvblRoaXModCl7Zm9yKGxldCBlPXRoaXMucG93ZXIoKTtlPj0wOy0tZSl0aGlzLm1fZWxlbWVudHNbZV0ubGltaXRQcmVjaXNpb25UaGlzKHQpO3JldHVybiB0aGlzLnVwZGF0ZVBvd2VyKCksdGhpc31oaUJpdEluZGV4KCl7cmV0dXJuIHRoaXMubV9lbGVtZW50cy5yZWR1Y2UoKHQsZSk9Pntjb25zdCBzPWUuaGlCaXRJbmRleCgpO3JldHVybiB0PHM/czp0fSwwKX1zaGlmdFJpZ2h0KHQpe3JldHVybiB0aGlzLm1fZWxlbWVudHMuc3BsaWNlKDAsdCksdGhpcy51cGRhdGVQb3dlcigpLHRoaXN9ZXZhbHVhdGVEZXJpdmF0aXZlKHQpe2NvbnN0IGU9dGhpcy5wb3dlcigpLHM9dGhpcy5tX2VsZW1lbnRzW2VdO3MubXVsRG91YmxlVGhpcyhlKTtmb3IobGV0IG49ZS0xO24+PTE7LS1uKXtzLm11bFRoaXModCk7Y29uc3QgZT10aGlzLm1fZWxlbWVudHNbbl07ZS5tdWxEb3VibGVUaGlzKG4pLHMuYWRkVGhpcyhlKX1yZXR1cm4gc31zdGF0aWMgZXZhbHVhdGVDb2Vmcyh0LGUscyl7Y29uc3Qgbj10LnBvd2VyKCk7cy5jb25zdHJ1Y3QwKHQuZ2V0RWxlbWVudCgwKS5ldmFsdWF0ZShlKSk7Zm9yKGxldCBpPTE7aTw9bjsrK2kpcy5hZGRFbGVtZW50KHQuZ2V0RWxlbWVudChpKS5ldmFsdWF0ZShlKSk7cy51cGRhdGVQb3dlcigpfX1jbGFzcyBJbiBleHRlbmRzIFRue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHZvaWQgMD09PXQ/e3plcm9DdG9yOnJ0fTp7Li4udCx6ZXJvQ3RvcjpydH0pfWNsb25lKCl7cmV0dXJuIG5ldyBJbih7Y29weTp0aGlzfSl9YWJzRXZhbHVhdGUodCl7Y29uc3QgZT10aGlzLnBvd2VyKCkscz10aGlzLm1fZWxlbWVudHNbZV0uY2xvbmUoKTtzLmFic1RoaXMoKTtjb25zdCBuPXQuY2xvbmUoKTtuLmFic1RoaXMoKTtmb3IobGV0IGk9ZS0xO2k+PTA7LS1pKXMubXVsVGhpcyhuKSxzLmFkZFRoaXModGhpcy5tX2VsZW1lbnRzW2ldLmFicygpKTtyZXR1cm4gc319Y2xhc3MgTW4gZXh0ZW5kcyBUbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih2b2lkIDA9PT10P3t6ZXJvQ3RvcjpJbn06ey4uLnQsemVyb0N0b3I6SW59KX1jbG9uZSgpe3JldHVybiBuZXcgTW4oe2NvcHk6dGhpc30pfWNvbnN0cnVjdEZyb21NUFZhbHVlcyh0LGUpe3RoaXMubV9lbGVtZW50cy5sZW5ndGg9MDtmb3IobGV0IHM9MDtzPD1lOysrcyl0aGlzLm1fZWxlbWVudHMucHVzaChuZXcgSW4oe2NvZWYwOnRbc119KSk7cmV0dXJuIHRoaXMudXBkYXRlUG93ZXIoKSx0aGlzfX1mdW5jdGlvbiBZbigpe3JldHVybntwb2x5cG9seTE6bmV3IE1uLHBvbHlwb2x5MjpuZXcgTW4scG9seVgyOm5ldyBJbixwb2x5WTI6bmV3IEluLHBvbHlYMkRlcml2Om5ldyBJbixwb2x5WTJEZXJpdjpuZXcgSW4scG9seXBvbHlYMTpuZXcgTW4scG9seXBvbHlZMTpuZXcgTW4scG9seXBvbHlYMURlcml2Om5ldyBNbixwb2x5cG9seVkxRGVyaXY6bmV3IE1uLGxhenlQb2x5cG9seUQxOm5ldyBNbixsYXp5UG9seXBvbHlEMURlcml2Om5ldyBNbixsYXp5UG9seUQyOm5ldyBJbixsYXp5UG9seUQyRGVyaXY6bnVsbCxwb2x5cG9seTExOm5ldyBNbixwb2x5cG9seTEyOm5ldyBNbix0ZW1wUHA6bmV3IE1uLHRlbXBQcDE6bmV3IE1uLHRlbXBQcDI6bmV3IE1uLHRlbXBQOm5ldyBJbix0ZW1wUDE6bmV3IEluLHRlbXBQMjpuZXcgSW59fWZ1bmN0aW9uIE5uKHQsZSxuLGkscixvLGEsdSxtLGwsYyxnLGQsXyxwLGYsUCx5LHgsQz0hMSl7Y29uc3Qgdj1ZbigpO3YucG9seVgyLmNvbnN0cnVjdChhLHUpLHYucG9seVkyLmNvbnN0cnVjdChtLGwpLHYucG9seXBvbHlYMS5jb25zdHJ1Y3RGcm9tTVBWYWx1ZXModCxlKSx2LnBvbHlwb2x5WTEuY29uc3RydWN0RnJvbU1QVmFsdWVzKG4saSksdi5wb2x5cG9seTExLmFzc2lnbkNvcHkodi5wb2x5cG9seVgxKSx2LnBvbHlwb2x5MTIuYXNzaWduQ29weSh2LnBvbHlwb2x5WTEpLGMmJih2LmxhenlQb2x5RDIuY29uc3RydWN0KGMsZyksdi5wb2x5cG9seTExLm11bEVsZW1lbnRUaGlzKHYubGF6eVBvbHlEMiksdi5wb2x5cG9seTEyLm11bEVsZW1lbnRUaGlzKHYubGF6eVBvbHlEMikpLHI/KHYubGF6eVBvbHlwb2x5RDEuY29uc3RydWN0RnJvbU1QVmFsdWVzKHIsbyksdi5sYXp5UG9seXBvbHlEMURlcml2PW5ldyBNbih7Y29weTp2LmxhenlQb2x5cG9seUQxfSksdi5sYXp5UG9seXBvbHlEMURlcml2LmRlcml2YXRpdmUxVGhpcygpLHYudGVtcFBwLmFzc2lnbkNvcHkodi5sYXp5UG9seXBvbHlEMSksdi50ZW1wUHAubXVsRWxlbWVudFRoaXModi5wb2x5WDIpLHYucG9seXBvbHkxMS5zdWJUaGlzKHYudGVtcFBwKSx2LnRlbXBQcC5hc3NpZ25Db3B5KHYubGF6eVBvbHlwb2x5RDEpLHYudGVtcFBwLm11bEVsZW1lbnRUaGlzKHYucG9seVkyKSx2LnBvbHlwb2x5MTIuc3ViVGhpcyh2LnRlbXBQcCkpOih2LnBvbHlwb2x5MTEuc3ViMFRoaXModi5wb2x5WDIpLHYucG9seXBvbHkxMi5zdWIwVGhpcyh2LnBvbHlZMikpLHYucG9seXBvbHlYMURlcml2LmFzc2lnbkNvcHkodi5wb2x5cG9seVgxKSx2LnBvbHlwb2x5WDFEZXJpdi5kZXJpdmF0aXZlMVRoaXMoKSx2LnBvbHlwb2x5WTFEZXJpdi5hc3NpZ25Db3B5KHYucG9seXBvbHlZMSksdi5wb2x5cG9seVkxRGVyaXYuZGVyaXZhdGl2ZTFUaGlzKCksciYmKHYucG9seXBvbHlYMURlcml2Lm11bFRoaXModi5sYXp5UG9seXBvbHlEMSksdi50ZW1wUHAyLmFzc2lnbkNvcHkodi5sYXp5UG9seXBvbHlEMURlcml2KSx2LnRlbXBQcDIubXVsVGhpcyh2LnBvbHlwb2x5WDEpLHYucG9seXBvbHlYMURlcml2LnN1YlRoaXModi50ZW1wUHAyKSx2LnBvbHlwb2x5WTFEZXJpdi5tdWxUaGlzKHYubGF6eVBvbHlwb2x5RDEpLHYudGVtcFBwMi5hc3NpZ25Db3B5KHYubGF6eVBvbHlwb2x5RDFEZXJpdiksdi50ZW1wUHAyLm11bFRoaXModi5wb2x5cG9seVkxKSx2LnBvbHlwb2x5WTFEZXJpdi5zdWJUaGlzKHYudGVtcFBwMikpLHYucG9seVgyRGVyaXYuYXNzaWduQ29weSh2LnBvbHlYMiksdi5wb2x5WDJEZXJpdi5kZXJpdmF0aXZlMVRoaXMoKSx2LnBvbHlZMkRlcml2LmFzc2lnbkNvcHkodi5wb2x5WTIpLHYucG9seVkyRGVyaXYuZGVyaXZhdGl2ZTFUaGlzKCksYyYmKHMobnVsbD09PXYubGF6eVBvbHlEMkRlcml2KSx2LmxhenlQb2x5RDJEZXJpdj1uZXcgSW4oe2NvcHk6di5sYXp5UG9seUQyfSksdi5sYXp5UG9seUQyRGVyaXYuZGVyaXZhdGl2ZTFUaGlzKCksdi5wb2x5WDJEZXJpdi5tdWxUaGlzKHYubGF6eVBvbHlEMiksdi50ZW1wUDEuYXNzaWduQ29weSh2LmxhenlQb2x5RDJEZXJpdiksdi50ZW1wUDEubXVsVGhpcyh2LnBvbHlYMiksdi5wb2x5WDJEZXJpdi5zdWJUaGlzKHYudGVtcFAxKSx2LnBvbHlZMkRlcml2Lm11bFRoaXModi5sYXp5UG9seUQyKSx2LnRlbXBQMS5hc3NpZ25Db3B5KHYubGF6eVBvbHlEMkRlcml2KSx2LnRlbXBQMS5tdWxUaGlzKHYucG9seVkyKSx2LnBvbHlZMkRlcml2LnN1YlRoaXModi50ZW1wUDEpKSx2LnBvbHlwb2x5MS5hc3NpZ25Db3B5KHYucG9seXBvbHkxMSksdi5wb2x5cG9seTEubXVsRWxlbWVudFRoaXModi5wb2x5WDJEZXJpdiksdi50ZW1wUHAuYXNzaWduQ29weSh2LnBvbHlwb2x5MTIpLHYudGVtcFBwLm11bEVsZW1lbnRUaGlzKHYucG9seVkyRGVyaXYpLHYucG9seXBvbHkxLmFkZFR
1oaXModi50ZW1wUHApLHYucG9seXBvbHkyLmFzc2lnbkNvcHkodi5wb2x5cG9seVgxRGVyaXYpLHYucG9seXBvbHkyLm11bEVsZW1lbnRUaGlzKHYucG9seVkyRGVyaXYpLHYudGVtcFBwLmFzc2lnbkNvcHkodi5wb2x5cG9seVkxRGVyaXYpLHYudGVtcFBwLm11bEVsZW1lbnRUaGlzKHYucG9seVgyRGVyaXYpLHYucG9seXBvbHkyLnN1YlRoaXModi50ZW1wUHApO2xldCBiPVtdO2NvbnN0IFM9W107UHx8KFA9W10pLGZ8fChmPVtdKSxHbih2LnBvbHlwb2x5MTEsdi5wb2x5cG9seTEyLHYudGVtcFApO2NvbnN0IEU9NjQsRD10ZS5sZGV4cCgtNTkpLnRvRG91YmxlKCksdz1bXTtsZXQgQT1Xbih2LnRlbXBQLGQscCxELEUsdyx5LHkpO2lmKEE8MClyZXR1cm4tMTtmb3IobGV0IFk9MDtZPEE7WSsrKXtjb25zdCB0PXYudGVtcFAxLGU9di50ZW1wUDI7SW4uZXZhbHVhdGVDb2Vmcyh2LnBvbHlwb2x5MTEsd1tZXSx0KTtjb25zdCBuPWVlKHQubV9lbGVtZW50cyx0LnBvd2VyKCkrMSk7bi5zb3J0KCh0LGUpPT50LmNvbXBhcmUoZSkpLEluLmV2YWx1YXRlQ29lZnModi5wb2x5cG9seTEyLHdbWV0sZSk7Y29uc3QgaT1lZShlLm1fZWxlbWVudHMsZS5wb3dlcigpKzEpO2kuc29ydCgodCxlKT0+dC5jb21wYXJlKGUpKTtjb25zdCByPW5bMF0sbz1uLmF0KC0xKSxhPWlbMF0sdT1pLmF0KC0xKTtvLnN1YlRoaXMociksdS5zdWJUaGlzKGEpO2NvbnN0IG09by5zdWJUaGlzKHUpLkdFWigpLGw9NTgsYz10ZS5sZGV4cCgtNTkpLnRvRG91YmxlKCksZz1bXTtsZXQgcDtpZihwPVduKG0/dDplLGQsXyxjLGwsZyx5LHkpLHA8MCYmaChcIm1wX2N1cnZlX3Byb3hpbWl0eVwiKSxwPjApe2NvbnN0IG49bT9lOnQ7Zm9yKGxldCB0PTA7dDxwO3QrKyl7bGV0IGU7aWYobSl7Y29uc3Qgcz12LnRlbXBQO0luLmV2YWx1YXRlQ29lZnModi5wb2x5cG9seTEyLHdbWV0uYWRkRG91YmxlKE51bWJlci5FUFNJTE9OKSxzKSxlPXMuZXZhbHVhdGUoZ1t0XSl9ZWxzZXtjb25zdCBzPXYudGVtcFA7SW4uZXZhbHVhdGVDb2Vmcyh2LnBvbHlwb2x5MTEsd1tZXS5hZGREb3VibGUoTnVtYmVyLkVQU0lMT04pLHMpLGU9cy5ldmFsdWF0ZShnW3RdKX1jb25zdCBpPW4uZXZhbHVhdGVEZXJpdmF0aXZlKGdbdF0pLmFicygpLm11bERvdWJsZVRoaXMoTnVtYmVyLkVQU0lMT04pLHI9bi5ldmFsdWF0ZShnW3RdKTtpLmFkZFRoaXMoZS5zdWIocikuYWJzVGhpcygpKSxpLmxkZXhwVGhpcygzKSxyLmFic1RoaXMoKSxyLmx0KGkpP1MucHVzaChZdChnW3RdLnRvRG91YmxlKCksd1tZXS50b0RvdWJsZSgpKSk6cyhyLmd0ZShpKSl9fX1BPVMubGVuZ3RoLEduKHYucG9seXBvbHkxLHYucG9seXBvbHkyLHYudGVtcFApO2NvbnN0IFQ9W107bGV0IEk9V24odi50ZW1wUCxkLHAsRCxFLFQpO0k8MCYmKEk9MCk7Zm9yKGxldCBzPTA7czxJO3MrKyl7SW4uZXZhbHVhdGVDb2Vmcyh2LnBvbHlwb2x5MSxUW3NdLHYudGVtcFAxKTtjb25zdCB0PVtdO2xldCBlPVduKHYudGVtcFAxLGQsXyxELEUsdCk7aWYoMCE9PWUpaWYoSW4uZXZhbHVhdGVDb2Vmcyh2LnBvbHlwb2x5MixUW3NdLHYudGVtcFAyKSxlPDApe2lmKGU9V24odi50ZW1wUDIsZCxfLEQsRSx0KSxlPDApY29udGludWU7Zm9yKGxldCBuPTA7bjxlO24rKyliLnB1c2goWXQodFtuXS50b0RvdWJsZSgpLFRbc10udG9Eb3VibGUoKSkpfWVsc2V7Y29uc3Qgbj12LnRlbXBQMi5hYnNFdmFsdWF0ZSh0ZSk7bi5tdWxUaGlzKHJ0LmNvbnN0cnVjdERvdWJsZSgxZS0xMikpO2ZvcihsZXQgaT0wO2k8ZTtpKyspe2NvbnN0IGU9di50ZW1wUDIuZXZhbHVhdGUodFtpXSk7ZS5hYnNUaGlzKCksZS5sdChuKSYmYi5wdXNoKFl0KHRbaV0udG9Eb3VibGUoKSxUW3NdLnRvRG91YmxlKCkpKX19fWlmKEk9Yi5sZW5ndGgsMD09PUEmJjA9PT1JKXJldHVybiAwO2I9Yi5jb25jYXQoUyksYi5zb3J0KCh0LGUpPT5DP0J0KHQuc2Vjb25kLGUuc2Vjb25kKTpCdCh0LmZpcnN0LGUuZmlyc3QpKTtjb25zdCBNPXNlKGIsKHQsZSk9PnQuZmlyc3Q9PT1lLmZpcnN0JiZ0LnNlY29uZD09PWUuc2Vjb25kKTtiPWIuc2xpY2UoMCxNKSxmLmxlbmd0aD0wLFAubGVuZ3RoPTA7Zm9yKGNvbnN0IHMgb2YgYilmLnB1c2gocy5maXJzdCksUC5wdXNoKHMuc2Vjb25kKTtyZXR1cm4gcyhmLmxlbmd0aD09PVAubGVuZ3RoKSxQLmxlbmd0aH1mdW5jdGlvbiBYbih0LGUscyxuLGkscixvKXtpZigwPT09dC5wb3dlcigpKXJldHVybiB0LmlzWmVybygpPy0xOjA7Y29uc3QgYT10LmV2YWx1YXRlKHJ0LmNvbnN0cnVjdEludDMyKDEpKS5pc1plcm8oKTtpZigxPT09dC5wb3dlcigpKXtjb25zdCBzPVZuKHQuZ2V0RWxlbWVudCgxKSx0LmdldEVsZW1lbnQoMCksZSxyLmF0KDApKTtyZXR1cm4gclswXS5saW1pdFByZWNpc2lvblRoaXMobiksMSE9PXM/MDooclswXS5saW1pdFByZWNpc2lvblRoaXMobiksMSl9aWYoMj09PXQucG93ZXIoKSl7cmV0dXJuIExuKHQuZ2V0RWxlbWVudCgyKSx0LmdldEVsZW1lbnQoMSksdC5nZXRFbGVtZW50KDApLG4sZSxhLHIpfWlmKDM9PT10LnBvd2VyKCkpe3JldHVybiBSbih0LmdldEVsZW1lbnQoMyksdC5nZXRFbGVtZW50KDIpLHQuZ2V0RWxlbWVudCgxKSx0LmdldEVsZW1lbnQoMCksbixlLGEscil9aWYoND09PXQucG93ZXIoKSl7cmV0dXJuIHpuKHQuZ2V0RWxlbWVudCg0KSx0LmdldEVsZW1lbnQoMyksdC5nZXRFbGVtZW50KDIpLHQuZ2V0RWxlbWVudCgxKSx0LmdldEVsZW1lbnQoMCksbixlLGEscil9cmV0dXJuIE9uKHQsZSxzLG4sYSxpLHIsbyl9ZnVuY3Rpb24gcW4oKXtyZXR1cm57cG9seUludGVyc2VjdDpuZXcgSW4scG9seVgxOm5ldyBJbixwb2x5WTE6bmV3IEluLHBvbHlYMURlcml2Om5ldyBJbixwb2x5WTFEZXJpdjpuZXcgSW4sbGF6eVBvbHlEMTpuZXcgSW4sbGF6eVBvbHlEMURlcml2Om5ldyBJbix0ZW1wUDpuZXcgSW4sdGVtcFAxOm5ldyBJbix0ZW1wUDI6bmV3IEluLHBvbHlwb2x5MVByb3hpbWl0eTpuZXcgTW4scG9seXBvbHkyUHJveGltaXR5Om5ldyBNbn19ZnVuY3Rpb24gRm4odCxlLHMsbixpLHIsbyxhLGgsdSxtLGwsYyl7Y29uc3QgZz1xbigpO2cucG9seVgxLmNvbnN0cnVjdCh0LGUpLGcucG9seVkxLmNvbnN0cnVjdChzLG4pLGcucG9seVgxRGVyaXYuYXNzaWduQ29weShnLnBvbHlYMSksZy5wb2x5WDFEZXJpdi5kZXJpdmF0aXZlMVRoaXMoKSxnLnBvbHlZMURlcml2LmFzc2lnbkNvcHkoZy5wb2x5WTEpLGcucG9seVkxRGVyaXYuZGVyaXZhdGl2ZTFUaGlzKCksZy5wb2x5SW50ZXJzZWN0LmFzc2lnbkNvcHkoZy5wb2x5WDEpLGcucG9seUludGVyc2VjdC5tdWxUaGlzKGcucG9seVgxKSxnLnBvbHlJbnRlcnNlY3QubXVsRWxlbWVudFRoaXMob1swXSksZy50ZW1wUC5hc3NpZ25Db3B5KGcucG9seVkxKSxnLnRlbXBQLm11bFRoaXMoZy5wb2x5WTEpLGcudGVtcFAubXVsRWxlbWVudFRoaXMob1sxXSksZy5wb2x5SW50ZXJzZWN0LmFkZFRoaXMoZy50ZW1wUCksaT8oZy5sYXp5UG9seUQxLmNvbnN0cnVjdChpLHIpLGcudGVtcFAuYXNzaWduQ29weShnLmxhenlQb2x5RDEpLGcudGVtcFAubXVsVGh
1pcyhnLmxhenlQb2x5RDEpLGcudGVtcFAubXVsRWxlbWVudFRoaXMob1syXSksZy5wb2x5SW50ZXJzZWN0LmFkZFRoaXMoZy50ZW1wUCkpOmcucG9seUludGVyc2VjdC5hZGQwKG9bMl0pO3tjb25zdCBpPW9bMF0uY2xvbmUoKSxyPWkuY2xvbmUoKTtyLnNxclRoaXMoKTtjb25zdCBhPW9bMV0uY2xvbmUoKSxoPWEuY2xvbmUoKTtoLnNxclRoaXMoKTtjb25zdCB1PW9bMl0uY2xvbmUoKSxtPWkuY2xvbmUoKTttLnN1YlRoaXMoYSksZy5wb2x5WDEuY29uc3RydWN0KHQsZSksZy5wb2x5WDFEZXJpdi5hc3NpZ25Db3B5KGcucG9seVgxKSxnLnBvbHlYMURlcml2LmRlcml2YXRpdmUxVGhpcygpLGcucG9seVkxLmNvbnN0cnVjdChzLG4pLGcucG9seVkxRGVyaXYuYXNzaWduQ29weShnLnBvbHlZMSksZy5wb2x5WTFEZXJpdi5kZXJpdmF0aXZlMVRoaXMoKSxnLnRlbXBQLmFzc2lnbkNvcHkoZy5wb2x5WDEpLGcudGVtcFAubXVsVGhpcyhnLnBvbHlYMSksZy50ZW1wUC5tdWxFbGVtZW50VGhpcyhoKSxnLnRlbXBQLm11bEVsZW1lbnRUaGlzKHUpLGcucG9seXBvbHkxUHJveGltaXR5LmNvbnN0cnVjdDAoZy50ZW1wUCksZy50ZW1wUC5hc3NpZ25Db3B5KGcucG9seVgxKSxnLnRlbXBQLm11bFRoaXMoYS5tdWwobSkubXVsKHUpLmxkZXhwVGhpcygxKSksZy5wb2x5cG9seTFQcm94aW1pdHkuYWRkRWxlbWVudChnLnRlbXBQKSxnLnRlbXBQLmFzc2lnbkNvcHkoZy5wb2x5WDEpLGcudGVtcFAubXVsVGhpcyhnLnBvbHlYMSksZy50ZW1wUC5tdWxFbGVtZW50VGhpcyhpLm11bChoKSksZy50ZW1wUDEuYXNzaWduQ29weShnLnBvbHlZMSksZy50ZW1wUDEubXVsVGhpcyhnLnBvbHlZMSksZy50ZW1wUDEubXVsRWxlbWVudFRoaXMoci5tdWwoYSkpLGcudGVtcFAuYWRkVGhpcyhnLnRlbXBQMSksZy50ZW1wUC5hZGQwKG0ubXVsKG0pLm11bCh1KSksZy5wb2x5cG9seTFQcm94aW1pdHkuYWRkRWxlbWVudChnLnRlbXBQKSxnLnRlbXBQLmFzc2lnbkNvcHkoZy5wb2x5WDEpLGcudGVtcFAubXVsRWxlbWVudFRoaXMobS5tdWwoaSkubXVsKGEpLmxkZXhwVGhpcygxKSksZy5wb2x5cG9seTFQcm94aW1pdHkuYWRkRWxlbWVudChnLnRlbXBQKSxnLnRlbXBQLmNvbnN0cnVjdDAoaS5tdWwobSkubXVsKG0pKSxnLnBvbHlwb2x5MVByb3hpbWl0eS5hZGRFbGVtZW50KGcudGVtcFApLGcucG9seXBvbHkxUHJveGltaXR5LnVwZGF0ZVBvd2VyKCksZy50ZW1wUC5jb25zdHJ1Y3QwKCR0KSxnLnBvbHlwb2x5MlByb3hpbWl0eS5jb25zdHJ1Y3QwKGcudGVtcFApLGcudGVtcFAuYXNzaWduQ29weShnLnBvbHlYMSksZy50ZW1wUC5tdWxUaGlzKGcucG9seVgxRGVyaXYpLGcudGVtcFAxLmFzc2lnbkNvcHkoZy5wb2x5WTEpLGcudGVtcFAxLm11bFRoaXMoZy5wb2x5WTFEZXJpdiksZy50ZW1wUC5hZGRUaGlzKGcudGVtcFAxKSxnLnRlbXBQLm11bEVsZW1lbnRUaGlzKGkubXVsKGEpKSxnLnBvbHlwb2x5MlByb3hpbWl0eS5hZGRFbGVtZW50KGcudGVtcFApLGcudGVtcFAuYXNzaWduQ29weShnLnBvbHlYMURlcml2KSxnLnRlbXBQLm11bEVsZW1lbnRUaGlzKG0ubXVsKGkpKSxnLnBvbHlwb2x5MlByb3hpbWl0eS5hZGRFbGVtZW50KGcudGVtcFApLGcucG9seXBvbHkyUHJveGltaXR5LnVwZGF0ZVBvd2VyKCl9Y29uc3QgZD1bXSxfPVtdO251bGw9PT1tJiYobT1bXSk7bGV0IHA9MipnLnBvbHlJbnRlcnNlY3QucG93ZXIoKSs1ODtjb25zdCBmPS41Kk51bWJlci5FUFNJTE9OLFA9W10seT1XbihnLnBvbHlJbnRlcnNlY3QsYSxoLGYscCxQLGwsbCk7aWYoeTwwKXJldHVybi0xO2Zvcihjb25zdCBiIG9mIFApXy5wdXNoKGIudG9Eb3VibGUoKSk7R24oZy5wb2x5cG9seTFQcm94aW1pdHksZy5wb2x5cG9seTJQcm94aW1pdHksZy50ZW1wUCkscD0yKmcudGVtcFAucG93ZXIoKSs1OCxQLmxlbmd0aD0wO2xldCB4PVduKGcudGVtcFAsYSxoLGYscCxQKTtpZih4PDAmJih4PTApLDA9PT15JiYwPT09eClyZXR1cm4gMDtmb3IoY29uc3QgYiBvZiBQKWQucHVzaChiLnRvRG91YmxlKCkpO2NvbnN0IEM9ZC5jb25jYXQoXyk7bS5sZW5ndGg9Qy5sZW5ndGgsJChtLEMsMCwwLEMubGVuZ3RoKSxXdChtKTtjb25zdCB2PXNlKG0sKHQsZSk9PjA9PT1CdCh0LGUpKTtyZXR1cm4gbS5sZW5ndGg9dixtLmxlbmd0aH1mdW5jdGlvbiBWbih0LGUscyxuKXtyZXR1cm4gdC5pc1plcm8oKT9lLmlzWmVybygpPy0xOjA6KG4uc2V0VGhpcyhlKSxuLm5lZ2F0ZVRoaXMoKSxuLmRpdlRoaXModCkscy5pc0VtcHR5KCl8fHMuY29udGFpbnNDb29yZGluYXRlKG4udmFsdWUoKSk/MTowKX1mdW5jdGlvbiBMbih0LGUscyxuLGkscixvKXtpZih0LmlzWmVybygpKXtpZihyKXJldHVybiBvWzBdLnNldEludDMyKDEpLGkuY29udGFpbnNDb29yZGluYXRlKDEpPzE6MDtyZXR1cm4gVm4oZSxzLGksb1swXSl9aWYocil7bGV0IGU9MjtyZXR1cm4gb1swXS5zZXRJbnQzMigxKSxzLmVxdWFscyh0KT8ob1sxXS5zZXRJbnQzMigxKSxlPTEpOm9bMV0uc2V0VGhpcyhzLmRpdih0KSksaS5jb250YWluc0Nvb3JkaW5hdGUob1sxXS52YWx1ZSgpKXx8KGU9MSksaS5jb250YWluc0Nvb3JkaW5hdGUob1swXS52YWx1ZSgpKXx8KGUtLSxvWzBdLnNldFRoaXMob1sxXSkpLDI9PT1lJiZvWzBdLnZhbHVlKCk+b1sxXS52YWx1ZSgpJiYob1sxXT1zdChvWzBdLG9bMF09b1sxXSkpLGV9Y29uc3QgYT1lLmNsb25lKCk7YS5zcXJUaGlzKCk7Y29uc3QgaD10LmNsb25lKCk7aWYoaC5tdWxUaGlzKHMpLmxkZXhwVGhpcygyKS5uZWdhdGVUaGlzKCkuYWRkVGhpcyhhKSxoLkxaKCkpcmV0dXJuIDA7Y29uc3QgdT1uKzIsbT1ydC5zcXJ0KGgsdSksbD1tLmNsb25lKCk7ZS5MWigpJiZsLm5lZ2F0ZVRoaXMoKSxsLmFkZFRoaXMoZSkubGltaXRQcmVjaXNpb25UaGlzKHUpLmxkZXhwVGhpcygtMSkubmVnYXRlVGhpcygpO2xldCBjPTA7cmV0dXJuIG9bMF0uc2V0VGhpcyhsKS5kaXZUaGlzKHJ0LmNvbnN0cnVjdEFzc2lnbih0LHUpKS5saW1pdFByZWNpc2lvblRoaXMobiksKGkuaXNFbXB0eSgpfHxpLmNvbnRhaW5zQ29vcmRpbmF0ZShvWzBdLnZhbHVlKCkpKSYmYysrLG0uaXNaZXJvKCl8fGwuaXNaZXJvKCl8fChvW2NdLnNldFRoaXMocykuZGl2VGhpcyhsKS5saW1pdFByZWNpc2lvblRoaXMobiksKGkuaXNFbXB0eSgpfHxpLmNvbnRhaW5zQ29vcmRpbmF0ZShvW2NdLnZhbHVlKCkpKSYmYysrLDI9PT1jJiZvWzBdLmd0KG9bMV0pJiYob1sxXT1zdChvWzBdLG9bMF09b1sxXSkpKSxjfWZ1bmN0aW9uIFJuKHQsZSxuLGkscixvLGEsaCl7aWYodC5pc1plcm8oKSl7cmV0dXJuIExuKGUsbixpLHIsbyxhLGgpfWNvbnN0IHU9KHQsZSk9PntpZih0PjApe2xldCBzPWUrdDtmb3IobGV0IHQ9MTt0PHM7dCsrKWhbdF0uZXF1YWxzKGhbMF0pJiYoaFtzLTFdPXN0KGhbdF0saFt0XT1oW3MtMV0pLHMtLSk7ZT1zfXJldHVybi
1BldChoLDAsZSwodCxlKT0+dC5jb21wYXJlKGUpKSxlfTtpZihpLmlzWmVybygpKXtsZXQgcz0wO28uY29udGFpbnNDb29yZGluYXRlKDApJiYoaFswXS5zZXRJbnQzMigwKSxzPTEpO3JldHVybiB1KExuKHQsZSxuLHIsbyxhLGguc2xpY2UoMSkpLHMpfWlmKGEpe2xldCBzPTA7by5jb250YWluc0Nvb3JkaW5hdGUoMSkmJihoWzBdLnNldEludDMyKDEpLHM9MSk7Y29uc3Qgbj1lLmFkZCh0KSxhPWkubmVnYXRlKCksbT10LmFkZChuKS5hZGQoYSkuaXNaZXJvKCk7cmV0dXJuIHUoTG4odCxuLGEscixvLG0saC5zbGljZShzKSkscyl9Y29uc3QgbT1uZXcgcnQsbD1uZXcgcnQsYz1uZXcgcnQsZz1lLmNsb25lKCk7aWYoZy5pc1plcm8oKSlsLnNldFRoaXMobiksbC5kaXZUaGlzKHQpLGMuc2V0VGhpcyhpKSxjLmRpdlRoaXModCk7ZWxzZXtnLmRpdlRoaXModCkuZGl2RG91YmxlVGhpcygzKS5uZWdhdGVUaGlzKCk7Y29uc3Qgcz1lLmNsb25lKCk7cy5zcXJUaGlzKCk7Y29uc3Qgcj10LmNsb25lKCk7ci5zcXJUaGlzKCksbC5zZXRUaGlzKHQpLGwubXVsVGhpcyhuKS5tdWxEb3VibGVUaGlzKDMpLnN1YlRoaXMocykuZGl2VGhpcyhyKS5kaXZEb3VibGVUaGlzKDMpLGMuc2V0VGhpcyhzKSxjLm11bFRoaXMoZSksYy5sZGV4cFRoaXMoMSksbS5zZXRUaGlzKHQpLG0ubXVsVGhpcyhlKS5tdWxUaGlzKG4pLm11bERvdWJsZVRoaXMoOSksYy5zdWJUaGlzKG0pLG0uc2V0VGhpcyhyKSxtLm11bFRoaXMoaSkubXVsRG91YmxlVGhpcygyNyksYy5hZGRUaGlzKG0pLGMuZGl2VGhpcyhyKS5kaXZUaGlzKHQpLmRpdkRvdWJsZVRoaXMoMjcpfWlmKGwuaXNaZXJvKCkpe2NvbnN0IHQ9Yy5jbG9uZSgpO3JldHVybiB0Lm5lZ2F0ZVRoaXMoKSx0LmlzWmVybygpPyhoWzBdLnNldFRoaXMoZyksSm4obyxyLGgsMSkpOihoWzBdLnNldFRoaXMocnQuY3ViaWNSb290KHQscikuYWRkKGcpKSxKbihvLHIsaCwxKSl9Y29uc3QgZD1jLmNsb25lKCk7aWYoZC5zcXJUaGlzKCkubGRleHBUaGlzKC0yKSxtLnNldFRoaXMobC5jbG9uZSgpKSxtLnNxclRoaXMoKS5tdWxUaGlzKGwpLmRpdkRvdWJsZVRoaXMoMjcpLGQuYWRkVGhpcyhtKSxkLmlzWmVybygpKXJldHVybiBoWzBdLnNldFRoaXMoYyksaFswXS5tdWxEb3VibGVUaGlzKDMpLmRpdlRoaXMobCksaFsxXS5zZXRUaGlzKGhbMF0pLGhbMV0ubmVnYXRlVGhpcygpLGhbMV0ubGRleHBUaGlzKC0xKSxoWzBdLmFkZFRoaXMoZyksaFsxXS5hZGRUaGlzKGcpLEpuKG8scixoLDIpO2lmKGQuR1ooKSlyZXR1cm4gZC5zZXRUaGlzKHJ0LnNxcnQoZCxyKzgpKSxtLnNldFRoaXMoYyksbS5sZGV4cFRoaXMoLTEpLm5lZ2F0ZVRoaXMoKSxtLmFkZFRoaXMoZCksaFswXS5zZXRUaGlzKHJ0LmN1YmljUm9vdChtLHIrOCkpLG0uc2V0VGhpcyhjKSxtLmxkZXhwVGhpcygtMSkubmVnYXRlVGhpcygpLG0uc3ViVGhpcyhkKSxoWzBdLmFkZFRoaXMocnQuY3ViaWNSb290KG0scis4KSksaFswXS5hZGRUaGlzKGcpLEpuKG8scixoLDEpO20uc2V0VGhpcyhsKSxtLmRpdkRvdWJsZVRoaXMoMykubmVnYXRlVGhpcygpLHMobS5HRVooKSk7Y29uc3QgXz1ydC5zcXJ0KG0scis4KSxwPV8uY2xvbmUoKTtwLm5lZ2F0ZVRoaXMoKSxwLmFkZFRoaXMoZyksXy5hZGRUaGlzKGcpO2NvbnN0IGY9cnQuY29uc3RydWN0RG91YmxlKG8uaXNFbXB0eSgpPy1OdW1iZXIuTUFYX1ZBTFVFOm8udm1pbiksUD1ydC5jb25zdHJ1Y3REb3VibGUoby5pc0VtcHR5KCk/TnVtYmVyLk1BWF9WQUxVRTpvLnZtYXgpLHk9bmV3IEluKHt6ZXJvQ3RvcjpydH0pO3kuY29uc3RydWN0MChpKSx5LmFkZEVsZW1lbnQobikseS5hZGRFbGVtZW50KGUpLHkuYWRkRWxlbWVudCh0KTtjb25zdCB4PW5ldyBJbih7Y29weTp5fSk7eC5kZXJpdmF0aXZlMVRoaXMoKTtsZXQgQz0wO2NvbnN0IHY9Y3QocnQsNCk7dltDKytdLnNldFRoaXMoZikscC5ndChmKSYmcC5sdChQKSYmdltDKytdLnNldFRoaXMocCksXy5ndChmKSYmXy5sdChQKSYmdltDKytdLnNldFRoaXMoXyksdltDKytdLnNldFRoaXMoUCk7Y29uc3QgYj0zKnI7bGV0IFM9NTIsRT1OdW1iZXIuRVBTSUxPTjtmb3IoO1M8YjspMipTPD1iPyhFKj1FLFMqPTIpOihFKj1OdW1iZXIuRVBTSUxPTixTKz01Mik7Uys9MjtsZXQgRD0wLHc9ITE7Zm9yKGxldCBzPTE7czxDO3MrKyl7aWYoSG4oeSx4LHZbcy0xXSx2W3NdLEUsUyxoWzBdKSl7RD0xLHc9cysxPEM7YnJlYWt9fWlmKCFEKXJldHVybiAwO2lmKHcpe2NvbnN0IHQ9bmV3IEluKHt6ZXJvQ3RvcjpydCxjb2VmMDpoWzBdfSk7dC5uZWdhdGVUaGlzKCksdC5hZGRFbGVtZW50KHRlKTt
1jb25zdCBlPW5ldyBJbih7emVyb0N0b3I6cnR9KSxuPW5ldyBJbih7emVyb0N0b3I6cnR9KTt5LmRpdih0LGUsbikscygyPT09ZS5wb3dlcigpKSxzKDA9PT1uLnBvd2VyKCkpO2NvbnN0IGk9TG4oZS5nZXRFbGVtZW50KDIpLGUuZ2V0RWxlbWVudCgxKSxlLmdldEVsZW1lbnQoMCkscixvLCExLGguc2xpY2UoMSkpO3MoaT49MCYmaTw9MiksRCs9aX1yZXR1cm4gSm4obyxyLGgsRCl9ZnVuY3Rpb24gem4odCxlLHMsbixpLHIsbyxhLGgpe2lmKHQuaXNaZXJvKCkpcmV0dXJuIFJuKGUscyxuLGkscixvLGEsaCk7Y29uc3QgdT0odCxlKT0+e2lmKHQ+MCl7bGV0IHM9ZSt0O2ZvcihsZXQgdD0xO3Q8czt0KyspaFt0XS5lcXVhbHMoaFswXSkmJihoW3MtMV09c3QoaFt0XSxoW3RdPWhbcy0xXSkscy0tKTtlPXN9cmV0dXJuIGV0KGgsMCxlLCh0LGUpPT50LmNvbXBhcmUoZSkpLGV9O2lmKGkuaXNaZXJvKCkpe2xldCBpPTA7by5jb250YWluc0Nvb3JkaW5hdGUoMCkmJihoWzBdLnNldEludDMyKDApLGk9MSk7cmV0dXJuIHUoUm4odCxlLHMsbixyLG8sYSxoLnNsaWNlKGkpKSxpKX1jb25zdCBtPW5ldyBJbih7emVyb0N0b3I6cnQsY29lZjA6aX0pO2lmKG0uYWRkRWxlbWVudChuKSxtLmFkZEVsZW1lbnQocyksbS5hZGRFbGVtZW50KGUpLG0uYWRkRWxlbWVudCh0KSxhKXtsZXQgdD0wO28uY29udGFpbnNDb29yZGluYXRlKDEpJiYoaFswXS5zZXRJbnQzMigxKSx0PTEpO2NvbnN0IGU9bmV3IEluKHt6ZXJvQ3RvcjpydCxjb2VmMDpydC5jb25zdHJ1Y3RJbnQzMigtMSl9KTtlLmFkZEVsZW1lbnQocnQuY29uc3RydWN0SW50MzIoMSkpO2NvbnN0IHM9bmV3IEluKHt6ZXJvQ3RvcjpydH0pLG49bmV3IEluKHt6ZXJvQ3RvcjpydH0pO20uZGl2KGUscyxuKTtyZXR1cm4gdShSbigzPT09cy5wb3dlcigpP3MuZ2V0RWxlbWVudCgzKTokdC5jbG9uZSgpLHMucG93ZXIoKT49Mj9zLmdldEVsZW1lbnQoMik6JHQuY2xvbmUoKSxzLnBvd2VyKCk+PTE/cy5nZXRFbGVtZW50KDEpOiR0LmNsb25lKCkscy5nZXRFbGVtZW50KDApLHIsbyxzLmV2YWx1YXRlKHRlKS5pc1plcm8oKSxoLnNsaWNlKHQpKSx0KX1pZihtLmdldEVsZW1lbnQoMCkuaXNaZXJvKCkpe2xldCB0PTA7Zm9yKG8uY29udGFpbnNDb29yZGluYXRlKDApJiYodD0xLGhbMF0uc2V0RG91YmxlKDApKTttLmdldEVsZW1lbnQoMCkuaXNaZXJvKCkmJm0ucG93ZXIoKT4wOyltLnNoaWZ0UmlnaHQoMSk7Y29uc3QgZT1SbigzPT09bS5wb3dlcigpP20uZ2V0RWxlbWVudCgzKTokdC5jbG9uZSgpLG0ucG93ZXIoKT49Mj9tLmdldEVsZW1lbnQoMik6JHQuY2xvbmUoKSxtLnBvd2VyKCk+PTE/bS5nZXRFbGVtZW50KDEpOiR0LmNsb25lKCksbS5nZXRFbGVtZW50KDApLHIsbywhMSxoLnNsaWNlKHQpKTtyZXR1cm4gZT4wJiYodCs9ZSksZXQoaCwwLHQsKHQsZSk9PnQuY29tcGFyZShlKSksdH1sZXQgbD01MixjPU51bWJlci5FUFNJTE9OO2Zvcig7bDxyOykyKmw8PXI/KGMqPWMsbCo9Mik6KGMqPU51bWJlci5FUFNJTE9OLGwrPTUyKTtsKz0yO2NvbnN0IGc9UW4obSksZD1ydC5jb25zdHJ1Y3REb3VibGUoTWF0aC5tYXgoTWF0aC5hYnMoby52bWF4KSxNYXRoLmFicyhvLnZtaW4pKSk7cmV0dXJuIGM9KGcubHQoZCk/ZzpkKS5tdWwocnQuY29uc3RydWN0RG91YmxlKGMpKS50b0RvdWJsZSgpLE9uKG0sbyxjLGwsYSwhMSxoLDQpfWZ1bmN0aW9uIEJuKHQsZSl7bGV0IHM9dCxuPWU7bi5wb3dlcigpPnMucG93ZXIoKSYmKG49c3QocyxzPW4pKTtjb25zdCBpPXMucG93ZXIoKS1uLnBvd2VyKCkscj1uZXcgSW4oe2NvcHk6cy5nZXRFbGVtZW50KHMucG93ZXIoKSl9KTtzLm11bFRoaXMobi5nZXRFbGVtZW50KG4ucG93ZXIoKSkpO2ZvcihsZXQgbz0wLGE9cy5wb3dlcigpO288YTtvKyspaWYobz49aSl7Y29uc3QgdD1uZXcgSW4oe2NvcHk6bi5nZXRFbGVtZW50KG8taSl9KTt0Lm11bFRoaXMocik7Y29uc3QgZT1zLmdldEVsZW1lbnQobykuc3ViKHQpO3Muc2V0RWxlbWVudChvLGUpfXMuc2V0RWxlbWVudChzLnBvd2VyKCkscy5nZXRFbGVtZW50KHMucG93ZXIoKSkuc2V0WmVybygpKSxzLnVwZGF0ZVBvd2VyKCksa24ocyl9ZnVuY3Rpb24ga24odCl7bGV0IGU9MDtmb3IoO2U8dC5wb3dlcigpJiZ0LmdldEVsZW1lbnQoZSkuaXNaZXJvKCk7KWUrKztyZXR1cm4gZT4wJiYodC5zaGlmdFJpZ2h0KGUpLCEwKX1mdW5jdGlvbiBHbih0LGUscyl7Y29uc3Qgbj10LmNsb25lKCksaT1lLmNsb25lKCk7Zm9yKGtuKG4pLGtuKGkpOzAhPT1uLnBvd2VyKCl8fDAhPT1pLnBvd2VyKCk7KUJuKG4saSk7cy5hc3NpZ25Nb3ZlKG4uZ2V0RWxlbWVudCgwKSl9ZnVuY3Rpb24gV24odCxlLHMsbixpLHIsbz0hMSxhPSExKXtyLmxlbmd0aD0wO2NvbnN0IGg9dC5wb3dlcigpLHU9Y3QocnQsMipoKzQpLG09WG4odCxzfHxVLnVuaXQoKSxuLGksITEsdSx1Lmxlbmd0aCk7aWYobT4wKXtyLmxlbmd0aD0wO2ZvcihsZXQgdD0wO3Q8bTt0Kyspe2NvbnN0IGU9dVt0XTt0PjAmJmUubHRlKHIuYXQoLTEpKXx8ci5wdXNoKGUuY2xvbmUoKSl9cmV0dXJuIHIubGVuZ3RofXJldHVybiBtfWZ1bmN0aW9uIGpuKHQsZSxuKXtpZihzKG4+PTEpLDA9PT10LnBvd2VyKCkpcmV0dXJuIHQuaXNaZXJvKCk/LTE6MDtjb25zdCBpPXQuZ2V0RWxlbWVudCgwKTtyZXR1cm4gaS5uZWdhdGVUaGlzKCksaS5kaXZUaGlzKHQuZ2V0RWxlbWVudCgxKSksZVswXS5zZXRUaGlzKGkpLDF9ZnVuY3Rpb24gWm4odCxlLG4saSl7aWYodC5wb3dlcigpPDIpcmV0dXJuIGpuKHQsbixpKTtzKGk+PTEpO2xldCByPXQuZ2V0RWxlbWVudCgxKTtyLm11bFRoaXModC5nZXRFbGVtZW50KDEpKTtjb25zdCBvPXQuZ2V0RWxlbWVudCgwKTtpZihvLm11bFRoaXModC5nZXRFbGVtZW50KDIpKSxvLmxkZXhwVGhpcygyKSxyLnN1YlRoaXMobyksci5MWigpKXJldHVybiAwO2lmKHIuaXNaZXJvKCkpe2NvbnN0IHM9dC5nZXRFbGVtZW50KDEpO3JldHVybiBzLm5lZ2F0ZVRoaXMoKSxzLmRpdlRoaXModC5nZXRFbGVtZW50KDIpKSxzLmxkZXhwVGhpcygtMSkscy5saW1pdFByZWNpc2lvblRoaXMoZSksblswXS5zZXRUaGlzKHMpLDF9cyhpPj0yKSxyPXJ0LnNxcnQ
1ocixlKzgpO2NvbnN0IGE9dC5nZXRFbGVtZW50KDEpO2EubmVnYXRlVGhpcygpO2NvbnN0IGg9YS5jbG9uZSgpO2guc3ViVGhpcyhyKSxoLmRpdlRoaXModC5nZXRFbGVtZW50KDIpKSxoLmxkZXhwVGhpcygtMSksaC5saW1pdFByZWNpc2lvblRoaXMoZSk7Y29uc3QgdT1hLmNsb25lKCk7cmV0dXJuIHUuYWRkVGhpcyhyKSx1LmRpdlRoaXModC5nZXRFbGVtZW50KDIpKSx1LmxkZXhwVGhpcygtMSksdS5saW1pdFByZWNpc2lvblRoaXMoZSksaC5sdCh1KT8oblswXS5zZXRUaGlzKGgpLG5bMV0uc2V0VGhpcyh1KSk6KG5bMV0uc2V0VGhpcyhoKSxuWzBdLnNldFRoaXModSkpLDJ9ZnVuY3Rpb24gSG4odCxlLHMsbixpLHIsbyl7bGV0IGE9cy5jbG9uZSgpLHU9bi5jbG9uZSgpO2EubGltaXRQcmVjaXNpb25UaGlzKHIpLHUubGltaXRQcmVjaXNpb25UaGlzKHIpO2xldCBtPXQuZXZhbHVhdGUoYSk7bS5saW1pdFByZWNpc2lvblRoaXMocisyKTtsZXQgbD10LmV2YWx1YXRlKHUpO2lmKGwubGltaXRQcmVjaXNpb25UaGlzKHIrMiksbS5HRVooKSYmbC5HRVooKXx8bS5MRVooKSYmbC5MRVooKSlyZXR1cm4gbS5hYnNMZXNzQWJzKGwpPyhvPWEsbS5pc1plcm8oKSk6KG89dSxsLmlzWmVybygpKTtjb25zdCBjPWwuTFooKTtjJiYobD1zdChtLG09bCksdT1zdChhLGE9dSkpO2NvbnN0IGc9Yz91OmEsZD1jP2E6dSxfPWEuYWRkKHUpLmxkZXhwVGhpcygtMSk7Xy5saW1pdFByZWNpc2lvblRoaXMocik7Y29uc3QgcD11LnN1YihhKTtwLmxpbWl0UHJlY2lzaW9uVGhpcyhyKSxwLmFic1RoaXMoKTtjb25zdCBmPXAuY2xvbmUoKTtsZXQgUD10LmV2YWx1YXRlKF8pLHk9ZS5ldmFsdWF0ZShfKTtjb25zdCB4PW5ldyBJbih7Y29weTp0fSksQz1uZXcgSW4oe2NvcHk6ZX0pO3tjb25zdCBzPU1hdGgubWF4KHQuaGlCaXRJbmRleCgpLGUuaGlCaXRJbmRleCgpKSxuPXRlLmNsb25lKCk7bi5sZGV4cFRoaXMoLShyKzIpKTtmb3IobGV0IGk9NjQ7aTxzOyl7eC5saW1pdFByZWNpc2lvblRoaXMoaSksQy5saW1pdFByZWNpc2lvblRoaXMoaSk7Y29uc3Qgcj14LmV2YWx1YXRlKF8pLG89Qy5ldmFsdWF0ZShfKSxhPXIuc3ViKFApLGg9by5zdWIoeSk7aWYoYS5kaXZUaGlzKFApLmFic1RoaXMoKS5sdChuKSYmKHkuaXNaZXJvKCl8fGguZGl2VGhpcyh5KS5hYnNUaGlzKCkubHQobikpKWJyZWFrO3guYXNzaWduQ29weSh0KSxDLmFzc2lnbkNvcHkoZSksaT1NYXRoLm1pbihpKzY0LHMpfVAubGltaXRQcmVjaXNpb25UaGlzKHIrMikseS5saW1pdFByZWNpc2lvblRoaXMocisyKX1jb25zdCB2PTEsYj00O2xldCBTPWI7Y29uc3QgRT0yO2xldCBEPTEsdz0wLEE9MCxUPXY7Y29uc3QgST0zMixNPXJ0LmNvbnN0cnVjdERvdWJsZSguMjUqaSksWT1ydC5jb25zdHJ1Y3REb3VibGUoLjUwMDEpO2xldCBOPTA7Y29uc3QgWD0zMDA7Zm9yKDsrK048WDspe2lmKE4+SSYmdz4wfHx5LmlzWmVybygpfHxUPT09RSYmdz4xfHxUPT09diYmUzxiKVQ9dixEPjEmJkQtLTtlbHNlIGlmKFQ9RSxBPjEpe2NvbnN0IHQ9cC5tdWwoeSk7dC5hYnNUaGlzKCksdC5sZGV4cFRoaXMoLTMpLHQuYWJzTGVzc0FicyhQKSYmRCsrfXAuc2V0VGhpcyhmKTtjb25zdCB0PW5ldyBydDtsZXQgZT0hMTtpZihUPT09dilkb3tpZihBPjIpe2NvbnN0IGU9cC5jbG9uZSgpO2lmKGUuYWJzVGhpcygpLGUubGRleHBUaGlzKDQpLGQuc3ViKGcpLmxkZXhwVGhpcygtMSkuZ3QoZSkpe2lmKF8uZXF1YWxzKGcpKXt0LnNldFRoaXMoXyksXy5zZXRUaGlzKGcuYWRkKGUpKSxfLmxpbWl0UHJlY2lzaW9uVGhpcyhyKSxmLnNldFRoaXMoXy5zdWIodCkpO2JyZWFrfWlmKF8uZXF1YWxzKGQpKXt0LnNldFRoaXMoXyksXy5zZXRUaGlzKGQuc3ViKGUpKSxfLmxpbWl0UHJlY2lzaW9uVGhpcyhyKSxmLnNldFRoaXMoXy5zdWIodCkpO2JyZWFrfX19Zi5zZXRUaGlzKHUuc3ViKGEpKSxmLmxkZXhwVGhpcygtMSksZi5saW1pdFByZWNpc2lvblRoaXMociksdC5zZXRUaGlzKF8pLF8uc2V0VGhpcyhhLmFkZChmKSksXy5saW1pdFByZWNpc2lvblRoaXMociksXy5sdChnKT9fLnNldFRoaXMoZyk6Xy5ndC
1hkKSYmXy5zZXRUaGlzKGQpLGU9YS5lcXVhbHMoXyl8fHUuZXF1YWxzKF8pfXdoaWxlKDApO2Vsc2UgZm9yKDs7KXtpZihmLnNldFRoaXMoUC5kaXYoeSkpLGYubGltaXRQcmVjaXNpb25UaGlzKHIpLDEhPT1EJiZmLm11bERvdWJsZVRoaXMoRCksdC5zZXRUaGlzKF8pLF8uc3ViVGhpcyhmKSxfLmxpbWl0UHJlY2lzaW9uVGhpcyhyKSxlPV8uZXF1YWxzKHQpLF8ubHQoZykpe2lmKEQ+MSl7Xy5zZXRUaGlzKHQpLEQtLTtjb250aW51ZX1mLnNldFRoaXModC5zdWIoZykpLF8uc2V0VGhpcyhnKX1lbHNlIGlmKF8uZ3QoZCkpe2lmKEQ+MSl7Xy5zZXRUaGlzKHQpLEQtLTtjb250aW51ZX1mLnNldFRoaXModC5zdWIoZCkpLF8uc2V0VGhpcyhkKX1icmVha31pZihlfHxmLmFic0xlc3NBYnMoTSkpe3QuZXF1YWxzKF8pfHwoUD14LmV2YWx1YXRlKF8pLFAubGltaXRQcmVjaXNpb25UaGlzKHIrMikpO2JyZWFrfVA9eC5ldmFsdWF0ZShfKSxQLmxpbWl0UHJlY2lzaW9uVGhpcyhyKzIpLHk9Qy5ldmFsdWF0ZShfKSx5LmxpbWl0UHJlY2lzaW9uVGhpcyhyKzIpO2NvbnN0IHM9YS5jbG9uZSgpLG49dS5jbG9uZSgpO1AuTFooKT8obS5zZXRUaGlzKFApLGEuc2V0VGhpcyhfKSk6KGwuc2V0VGhpcyhQKSx1LnNldFRoaXMoXykpLFQ9PT1FJiYoYS5lcXVhbHMocykmJnUuZXF1YWxzKG4pfHxBPjEmJiFmLmFic0xlc3NBYnMoWS5tdWwocCkpKT93Kys6dz0wLFQ9PT12PyhTKyssQT0wKTooUz0wLEErKyl9cmV0dXJuIE4+PVgmJmgoXCJSb290X2ZpbmRlciBpdGVyYXRpb25zIGV4Y2VlZGVkXCIpLG8uc2V0VGhpcyhfKSwhMH1mdW5jdGlvbiBVbih0LGUscyxuLGkpe2NvbnN0IHI9dC5ldmFsdWF0ZShzKTtpZihyLmlzWmVybygpKXJldHVybiEwO2NvbnN0IG89cnQuY29uc3RydWN0RG91YmxlKC41Km4pLGE9cy5jbG9uZSgpO2Euc3ViVGhpcyhvKTtjb25zdCBoPXQuZXZhbHVhdGUoYSksdT1zLmNsb25lKCk7dS5hZGRUaGlzKG8pO2NvbnN0IG09dC5ldmFsdWF0ZSh1KTtpZihoLkxaKCkmJm0uR1ooKXx8aC5HWigpJiZtLkxaKCkpcmV0dXJuITA7aWYoci5HWigpP2guTEVaKCl8fG0uTEVaKCk6aC5HRVooKXx8bS5HRVooKSlyZXR1cm4hMDtjb25zdCBsPWguTEVaKCkmJm0uTEVaKCksYz1oLkdFWigpJiZtLkdFWigpO2xldCBnPSExO3JldHVybiBsP3IuZ3QoaCkmJnIuZ3QobSkmJihnPSEwKTpjJiZyLmx0KGgpJiZyLmx0KG0pJiYoZz0hMCksISFnJiZyLmFic1RoaXMoKS5sdChydC5jb25zdHJ1Y3REb3VibGUoMWUtMTcpKX1mdW5jdGlvbiBPbih0LGUsbixpLHIsbyxhLGgpe3Mobj4wKSxzKGg+PXQucG93ZXIoKSk7Y29uc3QgdT1hLG09W107bGV0IGw9W107Y29uc3QgYz1uZXcgSW4oe3plcm9DdG9yOnQubV96ZXJvQ3Rvcn0pLGc9bmV3IEluKHt6ZXJvQ3Rvcjp0Lm1femVyb0N0b3J9KSxkPW5ldyBJbih7emVyb0N0b3I6dC5tX3plcm9DdG9yfSksXz1ydC5jb25zdHJ1Y3REb3VibGUobikscD1ydC5jb25zdHJ1Y3REb3VibGUoZS52bWluKSxmPXJ0LmNvbnN0cnVjdERvdWJsZShlLnZtYXgpLFA9cC5zdWIoXykseT1mLmFkZChfKSx4PVFuKHQpLEM9eC5jbG9uZSgpO2lmKEMubmVnYXRlVGhpcygpLFAubHQoQykpUC5zZXRUaGlzKEMuc3ViKF8pKTtlbHNlIGlmKFAuZ3QoeCkpcmV0dXJuIDA7aWYoeS5ndCh4KSl5LnNldFRoaXMoeC5hZGQoXykpO2Vsc2UgaWYoeS5sdChDKSlyZXR1cm4gMDtsZXQgdj10LGI9bnVsbDtpZihyKXtjb25zdCBlPW5ldyBJbih7Y29lZjA6cnQuY29uc3RydWN0SW50MzIoLTEpfSk7ZS5hZGRFbGVtZW50KHRlKSxiPW5ldyBJbix2PWI7Y29uc3Qgcz1uZXcgSW4sbj1uZXcgSW47Zm9yKHQuZGl2KGUscyxuKSxiLmFzc2lnbkNvcHkocyk7di5ldmFsdWF0ZSh0ZSkuaXNaZXJvKCk7KXYuZGl2KGUscyxuKSxiLmFzc2lnbkNvcHkocyl9bGV0IFM9ITE7aWYodi5wb3dlcigpPjAmJnYuZ2V0RWxlbWVudCgwKS5pc1plcm8oKSlmb3IoUz0hMCxifHwoYj1uZXcgSW4oe2NvcHk6dn0pLHY9Yik7di5nZXRFbGVtZW50KDApLmlzWmVybygpOyliLnNoaWZ0UmlnaHQoMSk7bGV0IEU9aSsyKnYucG93ZXIoKSsyLEQ9bi9NYXRoLnBvdygyLHYucG93ZXIoKSsyKSx3PUU7aWYoJHQuZ3QoUCkmJiR0Lmx0KHkpKWZvcihsZXQgcz0wLFk9di5wb3dlcigpO3M8WTtzKyspaWYodi5nZXRFbGVtZW50KHMpLmlzWmVybygpKXttLnB1c2goJHQuY2xvbmUoKSk7YnJlYWt9Zm9yKGxldCBZPXYucG93ZXIoKS0xO1k+MDtZLS0pe2lmKEQqPTIsRS09Mix3LT0yLHYucG93ZXIoKS1ZPT09MSl7Zy5hc3NpZ25Nb3ZlKHYuZGVyaXZhdGl2ZShZKSk7MT09PWpuKGcsdSxoKSYmKHVbMF0uZ3QoUCkmJnVbMF0ubHQoeSkmJiF1WzBdLmlzWmVybygpJiZtLnB1c2godVswXS5jbG9uZSgpKSxjLmFzc2lnbk1vdmUoZyksZC5hc3NpZ25Nb3ZlKHYuZGVyaXZhdGl2ZShZLTEpKSk7Y29udGludWV9aWYodi5wb3dlcigpLVk9PT0yKXtnLmFzc2lnbk1vdmUodi5kZXJpdmF0aXZlKFkpKTtjb25zdCB0PVpuKGcsRSx1LGgpO3ModD49MCYmdDw9Mik7Zm9yKGxldCBlPTA7ZTx0O2UrKyl1W2VdLmd0KFApJiZ1W2VdLmx0KHkpJiYhdVtlXS5pc1plcm8oKSYmbS5wdXNoKHVbZV0uY2xvbmUoKSk7aWYobS5sZW5ndGg+MSYmbS5zb3J0KCh0LGUpPT50LmNvbXBhcmUoZSkpLG0ubGVuZ3RoPjApe2xldCB0PW1bMF0uc3ViKF8pO3QubGltaXRQcmVjaXNpb25UaGlzKHcpLGwucHVzaChZdChQLmNsb25lKCksdCkpO2xldCBlPTE9PT1tLmxlbmd0aD95LmNsb25lKCk6bVsxXS5zdWIoXyk7dD1tWzBdLmFkZChfKSx0LmxpbWl0UHJlY2lzaW9uVGhpcyh3KSxlLmxpbWl0UHJlY2lzaW9uVGhpcyh3KSxsLnB1c2goWXQodCxlKSksbS5sZW5ndGg+MSYmKGU9Mj09PW0ubGVuZ3RoP3kuY2xvbmUoKTptWzJdLnN1YihfKSxlLmxpbWl0UHJlY2lzaW9uVGhpcyh3KSx0PW1bMV0uYWRkKF8pLHQubGltaXRQcmVjaXNpb25UaGlzKHcpLGwucHVzaChZdCh0LGUpKSxtLmxlbmd0aD4yJiYodD1tWzJdLmFkZChfKSx0LmxpbWl0UHJlY2lzaW9uVGhpcyh3KSxsLnB1c2goWXQodCx5LmNsb25lKCkpKSkpfWVsc2UgbC5wdXNoKFl0KFAuY2xvbmUoKSx5LmNsb25lKCkpKTtjLmFzc2lnbkNvcHkoZyksZC5hc3NpZ25Nb3ZlKHYuZGVyaXZhdGl2ZShZLTEpKTtjb250aW51ZX17Zy5hc3NpZ25Nb3ZlKGQpLGQuYXNzaWduTW92ZSh2LmRlcml2YXRpdmUoWS0xKSk7bGV0IHQ9W107Zm9yKGxldCBlPTAscz1sLmxlbmd0aDtlPHM7KytlKWlmKGxbZV0uZmlyc3QubHRlKGxbZV0uc2Vjb25kKSl7Y29uc3Qgcz1uZXcgcnQ7aWYoSG4oZyxjLGxbZV0uZmlyc3QsbFtlXS5zZWNvbmQsRCxFLHMpKXttLnB1c2gocyk7bGV0IG49cy5zdWIoXyk7bi5saW1pdFByZWNpc2lvblRoaXModyksdC5wdXNoKFl0KGxbZV0uZmlyc3QsbikpLG49cy5hZGQoXyksbi5saW1pdFByZWNpc2lvblRoaXModyksdC5wdXNoKFl0KG4sbFtlXS5zZWNvbmQpKX1lbHNlIHQucHVzaChsW2VdKX1sPXQsdD1bXSxjLmFzc2lnbk1vdmUoZyl9fW0uc29ydCgodCxlKT0+dC5jb21wYXJlKGUpKSwwPT09bC5sZW5ndGgmJihjLmFzc2lnbk1vdmUodi5kZXJpdmF0aXZlKHYucG93ZXIoKSkpLGMuaXNaZXJvKCl8fGwucHVzaChZdChQLmNsb25lKCkseS5jbG9uZSgpKSkpO2xldCBBPTAsVD0wLEk9MDtjb25zdCBNPW5ldyBydDtmb3IoOzspe2lmKFQ8bC5sZW5ndGgpe2lmKGxbVF0uZmlyc3QuZ3QobFtUXS5zZWNvbmQpKXtUKys7Y29udGludWV9bGV0IHQ9ITE7aWYoSTxtLmxlbmd0aCYmbVtJXS5sdChsW1RdLmZpcnN0KSYmKHQ9ITApLCF0KXtIbih2LGMsbFtUXS5maXJzdCxsW1RdLnNlY29uZCxuLGksTSkmJihNLmx0KHApP3VbQSsrXS5zZXRUaGlzKHApOk0uZ3QoZik/dVtBKytdLnNldFRoaXMoZik6dVtBKytdLnNldFRoaXMoTSkpL
1FQrKztjb250aW51ZX19aWYoIShJPG0ubGVuZ3RoKSlicmVhazswIT09SSYmbVtJLTFdLmVxdWFscyhtW0ldKXx8VW4odixjLG1bSV0sbikmJihNLnNldFRoaXMobVtJXSksTS5sdChwKT9NLnNldFRoaXMocCk6TS5ndChmKSYmTS5zZXRUaGlzKGYpLDAhPT1BJiZ1W0FdLmVxdWFscyhNKXx8dVtBKytdLnNldFRoaXMoTSkpLEkrK31yZXR1cm4gUyYmJHQuZ3QoUCkmJiR0Lmx0KHkpJiYodVtBKytdLnNldFRoaXMoJHQpLGV0KHUsMCxBLCh0LGUpPT50LmNvbXBhcmUoZSkpKSxyJiZ0ZS5ndChQKSYmdGUubHQoeSkmJih1W0ErK10uc2V0VGhpcyh0ZSksZXQodSwwLEEsKHQsZSk9PnQuY29tcGFyZShlKSkpLEF9ZnVuY3Rpb24gUW4odCl7Y29uc3QgZT10LmdldEVsZW1lbnQodC5wb3dlcigpKTtlLmxpbWl0UHJlY2lzaW9uVGhpcyg1MyksZS5hYnNUaGlzKCk7Y29uc3Qgcz0kdC5jbG9uZSgpO2ZvcihsZXQgbj0wLGk9dC5wb3dlcigpO248aTtuKyspe2NvbnN0IGU9dC5nZXRFbGVtZW50KG4pO2UubGltaXRQcmVjaXNpb25UaGlzKDUzKSxlLmd0KHMpJiZzLnNldFRoaXMoZSl9cmV0dXJuIHMuZGl2VGhpcyhlKSxzLmFkZFRoaXModGUpLHMubXVsVGhpcyhydC5jb25zdHJ1Y3REb3VibGUoMSsxMDAqTnVtYmVyLkVQU0lMT04pKSxzfWZ1bmN0aW9uIEpuKHQsZSxzLG4pe2xldCBpPW47aWYoIXQuaXNFbXB0eSgpKXtpPTA7Zm9yKGxldCBlPTA7ZTxuOysrZSl0LmNvbnRhaW5zQ29vcmRpbmF0ZShzW2VdLnZhbHVlKCkpJiYoaSE9PWUmJnNbaV0uc2V0VGhpcyhzW2VdKSxpKyspfWk+MSYmKHNbMF0uZ3Qoc1sxXSkmJihzWzFdPXN0KHNbMF0sc1swXT1zWzFdKSksaT4yJiYoc1swXS5ndChzWzJdKSYmKHNbMl09c3Qoc1swXSxzWzBdPXNbMl0pKSxzWzFdLmd0KHNbMl0pJiYoc1syXT1zdChzWzFdLHNbMV09c1syXSkpKSk7Zm9yKGxldCByPTA7cjxpOysrcilzW3JdLmxpbWl0UHJlY2lzaW9uVGhpcyhlKTtyZXR1cm4gaX1mdW5jdGlvbiBLbih0LGUscyxuLGkscil7cmV0dXJuIGVpKHQsZSxzLHIsbixpKX1mdW5jdGlvbiAkbih0LGUscyxuLGkscil7bGV0IG89aTtpZihuKXJldHVybi
1ByWzBdPTEsbz0uNSooZS10KSoocyh0KStzKGUpKSxvO2NvbnN0IGE9clswXSxoPShlLXQpL2EsdT10LG09bmV3IGZ0KDApO2ZvcihsZXQgbD0xO2w8PXJbMF07KytsKXtjb25zdCB0PShsLS41KSpoO20uYWRkKHModSt0KSl9cmV0dXJuIG89LjUqKG8rKGUtdCkqbS5nZXRSZXN1bHQoKS9hKSxyWzBdKj0yLG99ZnVuY3Rpb24gdGkodCxlLHMsbixpLHIsbyl7bGV0IGE9MCxoPU1hdGguYWJzKGktc1t0XSk7Y29uc3QgdT1PKGUsTnVtYmVyLk5hTiksbT1PKGUsTnVtYmVyLk5hTik7Zm9yKGxldCBkPTA7ZDxlOysrZCl7Y29uc3QgZT1NYXRoLmFicyhpLXNbdCtkXSk7ZTxoJiYoYT1kLGg9ZSksdVtkXT1uW3QrZF0sbVtkXT1uW3QrZF19bGV0IGw9MCxjPTAsZz0wO3JbMF09blt0K2FdLGEtLTtmb3IobGV0IGQ9MTtkPGU7ZCsrKXtmb3IobGV0IG49MDtuPGUtZDtuKyspe2lmKGM9c1t0K25dLWksZz1zW3QrbitkXS1pLGw9Yy1nLDA9PT1sKXJldHVybiExO2NvbnN0IGU9KHVbbisxXS1tW25dKS9sO3Vbbl09YyplLG1bbl09ZyplfWlmKDIqKGErMSk8ZS1kKXtjb25zdCB0PWErMTtvWzBdPXVbdF19ZWxzZXtjb25zdCB0PWE7b1swXT1tW3RdLGEtLX1yWzBdKz1vWzBdfXJldHVybiEwfWZ1bmN0aW9uIGVpKHQscyxuLGkscixvKXtpZihuPHMmJmUoXCJ4VG8gPCB4RnJvbVwiKSxuPT09cylyZXR1cm4gMDtjb25zdCBhPVswXTtsZXQgdT1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IG09W051bWJlci5NQVhfVkFMVUVdO2xldCBsPTA7Y29uc3QgYz0zMixnPU8oYysxLE51bWJlci5OYU4pLGQ9TyhjKzEsTnVtYmVyLk5hTiksXz1bMF07Z1swXT0xO2xldCBwPTAsZj0wO2ZvcihsZXQgZT0wO2U8YztlKyspe2lmKGw9JG4ocyxuLGksMD09PWUsbCxfKSxkW2VdPWwsZSsxPj10KXt0aShlKzEtdCx0LGcsZCwwLGEsbSl8fGgoXCJwb2x5bm9taWFsX2ludGVycG9sYXRpb25cIik7Y29uc3Qgcz1yKk1hdGguYWJzKGFbMF0pK28sbj1NYXRoLmFicyh1LWFbMF0pO2lmKG48PXMmJk1hdGguYWJzKG1bMF0pPD1zKXtpZihwKysscD4xJiYobjw9LjEqZnx8MD09PWZ8fHA+MikpcmV0dXJuIGFbMF19ZWxzZSBwPTA7Zj1uLHU9YVswXX1kW2UrMV09ZFtlXSxnW2UrMV09LjI1KmdbZV19cmV0dXJuIGFbMF19Y2xhc3Mgc2l7Y29uc3RydWN0b3IoKXt0aGlzLmFyZWE9TnVtYmVyLk5hTix0aGlzLmNlbnRyb2lkX3g9TnVtYmVyLk5hTix0aGlzLmNlbnRyb2lkX3k9MCx0aGlzLnNwZWNpYWxQb2ludHM9W10sdGhpcy5zcGVjaWFsUG9pbnRzTGVuZ3RoPVtdfXNwZWNpYWxQb2ludHNDb3VudCgpe3JldHVybiB0aGlzLnNwZWNpYWxQb2ludHMubGVuZ3RofX1sZXQgbmk9Y2xhc3N7Y29uc3RydWN0b3IodCxlKXt0aGlzLmI9dCx0aGlzLmxlbj1lfWdldE1heERlcml2YXRpdmUoKXtyZXR1cm4gMX1nZXRWYWx1ZSh0LGUpe3JldHVybiAwPT09dD90aGlzLmxlbi11aSh0aGlzLmIsZSwhMSk6MH1nZXRFcnJvcih0KXtyZXR1cm4gcygwKSwwfX07ZnVuY3Rpb24gaWkodCxlLHMsbixpKXtsZXQgcj0hMDtjb25zdCBvPWN0KEosMyk7dC5xdWVyeUNvbnRyb2xQb2ludHMobyk7bGV0IGE9cj8wOjEsaD1vWzFdW2FdLW9bMF1bYV0sdT1vWzJdW2FdLW9bMF1bYV07Y29uc3QgbT1Lbig1LGUscyxuLGksdD0+e2xldCBlO2lmKHQ8PS41KXtjb25zdCBzPVN0KDAsaCx0KSxuPVN0KGgsdSx0KTtlPVN0KHMsbix0KX1lbHNle2NvbnN0IHM9RXQoMCxoLHQpLG49RXQoaCx1LHQpO2U9RXQocyxuLHQpfXJldHVybiBlKmRpKG8sMSx0KS5sZW5ndGgoKX0pO3I9ITEsYT1yPzA6MSxoPW9bMV1bYV0tb1swXVthXSx1PW9bMl1bYV0tb1swXVthXTtjb25zdCBsPUtuKDUsZSxzLG4saSx0PT57bGV0IGU7aWYodDw9LjUpe2NvbnN0IHM9U3QoMCxoLHQpLG49U3QoaCx1LHQpO2U9U3QocyxuLHQpfWVsc2V7Y29uc3Qgcz1FdCgwLGgsdCksbj1FdChoLHUsdCk7ZT1FdChzLG4sdCl9cmV0dXJuIGUqZGkobywxLHQpLmxlbmd0aCgpfSk7cmV0dXJuIG5ldyBKKG0sbCl9ZnVuY3Rpb24gcmkodCl7dC5tX2NhY2hlZFZhbHVlcz1udWxsfWZ1bmN0aW9uIG9pKHQsZSl7ZS5tX2NhY2hlZFZhbHVlcz1zdCh0Lm1fY2FjaGVkVmFsdWVzLHQubV9jYWNoZWRWYWx1ZXM9ZS5tX2NhY2hlZFZhbHVlcyl9ZnVuY3Rpb24gYWkodCl7aWYodC5tX2NhY2hlZFZhbHVlcylyZXR1cm4gdC5tX2NhY2hlZFZhbHVlcztjb25zdCBlPW5ldyBzaTtyZXR1cm4gaGkodCxlLnNwZWNpYWxQb2ludHMpLENpKHQsZSksZX1mdW5jdGlvbiBoaSh0LGUpe2NvbnN0IHM9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhzKTtjb25zdCBuPWN0KGh0LDgpO25bMF0uc2V0KDApO2xldCBpPTE7e2NvbnN0IHQ9Y3QoaHQsMyk7R2kocyx0LCExKTtjb25zdCBlPWN0KGh0LDIpLHI9bmV3IFUoMCwxKTtsZXQgbz1nbih0WzJdLm11bCgyKSx0WzFdLHIsZVswXSk7bzwwJiYobz0wKTtmb3IobGV0IHM9MDtzPG87cysrKWR0KGVbc10udmFsdWUoKSwwLDEpfHwobltpXT1lW3NdLGkrKyl9e2NvbnN0IHQ9Y3QoaHQsMyk7V2kocyx0LCExKTtjb25zdCBlPWN0KGh0LDIpLHI9bmV3IFUoMCwxKTtsZXQgbz1nbih0WzJdLm11bCgyKSx0WzFdLHIsZVswXSk7bzwwJiYobz0wKTtmb3IobGV0IHM9MDtzPG87cysrKWR0KGVbc10udmFsdWUoKSwwLDEpfHwobltpXT1lW3NdLGkrKyl9aWYobltpXS5zZXQoMSksaSsrLGk+Mil7ZXQobiwwLGksKHQsZSk9PnQudmFsdWUoKS1lLnZhbHVlKCkpO2xldCB0PTAsZT1uWzBdLnZhbHVlKCkscz0xO2ZvcihsZXQgcj0xO3I8aTtyKyspbltyXS5lcShuW3ItMV0pPyhlKz1uW3JdLnZhbHVlKCkscysrKToocz4xJiYoZS89cyxuW3RdLnNldChlKSksdCsrLG5bdF09bltyXSxlPW5bcl0udmFsdWUoKSxzPTEpO3QrKyxpPXR9blswXS5zZXQoMCksbltpLTFdLnNldCgxKSxlLmxlbmd0aD1pO2ZvcihsZXQgcj0wO3I8aTtyKyspZVtyXT1uW3JdLnZhbHVlKCl9ZnVuY3Rpb24gdWkodCxlLHMpe2NvbnN0IG49Y3QoSiwzKTtyZXR1cm4gdC5xdWVyeUNvbnRyb2xQb2ludHMobiksbWkobixlLHMpfWZ1bmN0aW9uIG1pKHQsZSxzKXtpZihzKXtpZihlPDApcmV0dXJuIGU7aWYoZT4xKXJldHVybiBlLTErbWkodCwxLCExKX1pZigxPT09ZSlyZXR1cm4gbGkodCk7Y29uc3Qgbj1jdChKLDMpO3JldHVybiBNaSh0LGUsbixudWxsKSxsaShuKX1mdW5jdGlvbiBsaSh0KXtpZih0WzBdLmVxdWFscyh0WzFdKSlyZXR1cm4gSi5kaXN0YW5jZSh0WzJdLHRbMF0pO2lmKHRbMV0uZXF1YWxzKHRbMl0pKXJldHVybi
1BKLmRpc3RhbmNlKHRbMF0sdFsyXSk7Y29uc3QgZT1KLmRpc3RhbmNlKHRbMF0sdFsxXSkrSi5kaXN0YW5jZSh0WzJdLHRbMV0pLHM9Si5kaXN0YW5jZSh0WzBdLHRbMl0pO2lmKGUtczw9ZSpOdW1iZXIuRVBTSUxPTilyZXR1cm4gcztjb25zdCBuPTEsaT1jdChKLDMpO0JpKHQsaSwhMCk7Y29uc3Qgcj00Kih6dChpWzJdLngpK3p0KGlbMl0ueSkpLG89MiooaVsyXS54KmlbMV0ueCtpWzJdLnkqaVsxXS55KSxhPXp0KGlbMV0ueCkrenQoaVsxXS55KTtpZigxZS0xNCooTWF0aC5hYnMobykrTWF0aC5hYnMoYSkpPj1NYXRoLmFicyhyKSl7aWYoMWUtMTQqTWF0aC5hYnMoYSk+PU1hdGguYWJzKG8pKXtyZXR1cm4gTWF0aC5zcXJ0KGEpKm59cmV0dXJuIDIvKDMqbykqKE1hdGgucG93KG8qbithLDEuNSktTWF0aC5wb3coYSwxLjUpKX1jb25zdCBoPW8vcix1PWEvcixtPXUtaCpoLGw9bitoO2lmKDA9PT1tKXtpZihoPj0wJiZsPj0wfHxoPD0wJiZsPD0wKXtyZXR1cm4gTWF0aC5hYnMoLjUqTWF0aC5zcXJ0KHIpKihsKmwtaCpoKSl9cmV0dXJuLjUqTWF0aC5zcXJ0KHIpKihsKmwraCpoKX1jb25zdCBjPU1hdGguc3FydChtK2wqbCksZz1NYXRoLnNxcnQodSk7cmV0dXJuLjUqTWF0aC5zcXJ0KHIpKihsKmMtaCpnK20qTWF0aC5sb2coTWF0aC5hYnMoKGwrYykvKGgrZykpKSl9ZnVuY3Rpb24gY2kodCxlKXtjb25zdCBzPXB0KGUsMCwxKTtsZXQgbj1kaSh0LDEscyk7cmV0dXJuIG4uaXNaZXJvKCkmJihuPWRpKHQsMixzKSksbn1mdW5jdGlvbiBnaSh0LGUscyl7Y29uc3Qgbj1jdChKLDMpO3JldHVybiB0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSxkaShuLGUscyl9ZnVuY3Rpb24gZGkodCxlLHMpe2lmKDE9PT1lKXtjb25zdCBlPXRbMV0uc3ViKHRbMF0pLm11bCgxLXMpLmFkZCh0WzJdLnN1Yih0WzFdKS5tdWwocykpO3JldHVybiBlLm11bFRoaXMoMiksZX1yZXR1cm4gMj09PWU/dFsyXS5zdWIodFsxXSkuc3ViKHRbMV0uc3ViKHRbMF0pLm11bCgyKSk6Si5jb25zdHJ1Y3QoMCwwKX1mdW5jdGlvbiBfaSh0LGUscyl7e2NvbnN0IGU9TmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKS5zdWJFKE5lLmNvbnN0cnVjdFBvaW50MkQodFswXSkpLG49bmV3IGh0KDEpLnN1YkUocyksaT1OZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pLnN1YkUoTmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKSkscj1lLm11bEUobikuYWRkRShpLm11bEUocykpO3JldHVybiByLm11bFRoaXNFKG5ldyBodCgyKSkscn19ZnVuY3Rpb24gcGkodCxlLHMpe2NvbnN0IG49dWkodCwxLCExKTtpZihlPD0wKXJldHVybiBlO2lmKGU+PW4pcmV0dXJuIGUtbisxO2NvbnN0IGk9WzBdO3JldHVybiAxIT09ZW4obmV3IG5pKHQsZSksVS51bml0KCksMSxpKSYmaChcIlwiKSxpWzBdfWZ1bmN0aW9uIGZpKHQpe2NvbnN0IGU9Y3QoSiwzKTtyZXR1cm4gdC5xdWVyeUNvbnRyb2xQb2ludHMoZSksUGkoZSl9ZnVuY3Rpb24gUGkodCl7cmV0dXJuLXRbMV0uc3ViKHRbMF0pLmNyb3NzUHJvZHVjdCh0WzJdLnN1Yih0WzBdKSkvM31mdW5jdGlvbiB5aSh0KXtjb25zdCBlPUouZGlzdGFuY2UodC5nZXRTdGFydFhZKCksdC5nZXRFbmRYWSgpKSxzPXQuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO3JldHVybiBzLWU8PTgqTnVtYmVyLkVQU0lMT04qc31mdW5jdGlvbiB4aSh0KXtyZXR1cm4gdC5tX2NhY2hlZFZhbHVlc31mdW5jdGlvbiBDaSh0LGUpe3QubV9jYWNoZWRWYWx1ZXM9ZX1mdW5jdGlvbiB2aSh0LGUscyxuLGkpe18oVS51bml0KCkuY29udGFpbnMocyksXCJRdWFkcmF0aWNCZXppZXJIZWxwZXI6OmdldENsb3Nlc3RDb29yZGluYXRlU2VnbWVudFwiKTtjb25zdCByPWN0KEosMyk7dC5xdWVyeUNvbnRyb2xQb2ludHMocik7bGV0IG89TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBhPVswXSxoPWJpKHIsZSxhKTtpZihzLmNvbnRhaW5zQ29vcmRpbmF0ZShhWzBdKSlvPUouZGlzdGFuY2UoZSxoKTtlbHNle2FbMF09cy52bWluLFppKHIsYVswXSxoKSxvPUouZGlzdGFuY2UoaCxlKTtjb25zdCB0PW5ldyBKO1ppKHIscy52bWF4LHQpO2NvbnN0IG49Si5kaXN0YW5jZSh0LGUpO28+biYmKGguc2V0Q29vcmRzUG9pbnQyRCh0KSxhWzBdPXMudm1heCxvPW4pfWlmKCFuKXJldHVybi
1BhWzBdO2lmKHMudm1pbjw9MCl7Y29uc3Qgbj1uZXcgSjt0LnF1ZXJ5Q29vcmQyREV4dGVuZGVkKC0xLG4sITApO2NvbnN0IGk9bmV3IEo7dC5xdWVyeUNvb3JkMkQocy52bWluLGkpO2NvbnN0IHI9bmV3IGZtKHtzdGFydDpuLGVuZDppfSksdT1yLmdldENsb3Nlc3RDb29yZGluYXRlKGUsITApO2lmKHU8MSl7Y29uc3QgdD1yLmdldENvb3JkMkQodSkscz1KLmRpc3RhbmNlKHQsZSk7czxvJiYobz1zLGFbMF09dS0xLGguYXNzaWduKHQpKX19aWYocy52bWluPj0xKXtjb25zdCBuPW5ldyBKO3QucXVlcnlDb29yZDJERXh0ZW5kZWQoMixuLCEwKTtjb25zdCBpPW5ldyBKO3QucXVlcnlDb29yZDJEKHMudm1heCxpKTtjb25zdCByPW5ldyBmbSh7c3RhcnQ6aSxlbmQ6bn0pLHU9ci5nZXRDbG9zZXN0Q29vcmRpbmF0ZShlLCEwKTtpZih1PjApe2NvbnN0IHQ9ci5nZXRDb29yZDJEKHUpLHM9Si5kaXN0YW5jZSh0LGUpO3M8byYmKG89cyxhWzBdPTErdSxoLmFzc2lnbih0KSl9fXJldHVybiBhWzBdfWZ1bmN0aW9uIGJpKHQsZSxzKXtjb25zdCBuPXRbMl0uc3ViKHRbMV0pLnN1Yih0WzFdLnN1Yih0WzBdKSksaT10WzFdLnN1Yih0WzBdKSxyPXRbMF0uc3ViKGUpLG89ci5kb3RQcm9kdWN0KGkpLGE9ci5kb3RQcm9kdWN0KG4pKzIqaS5kb3RQcm9kdWN0KGkpLGg9MyppLmRvdFByb2R1Y3QobiksdT1uLmRvdFByb2R1Y3QobiksbT1PKDMsTnVtYmVyLk5hTiksbD1ybih1LGgsYSxvLFUudW5pdCgpLCExLG0pLGM9dFswXS5jbG9uZSgpO2xldCBnPTAsZD1KLnNxckRpc3RhbmNlKHRbMF0sZSksXz1KLnNxckRpc3RhbmNlKHRbMl0sZSk7XzxkJiYoZz0xLGMuYXNzaWduKHRbMl0pLGQ9Xyk7Zm9yKGxldCBwPTA7cDxsO3ArKyl7Y29uc3Qgcz1uZXcgSjtaaSh0LG1bcF0scyksXz1KLnNxckRpc3RhbmNlKHMsZSksXzxkJiYoZD1fLGMuYXNzaWduKHMpLGc9bVtwXSl9cmV0dXJuIHMmJihzWzBdPWcpLGN9ZnVuY3Rpb24gU2kodCxlLHMsbixpLHIpe2NvbnN0IG89bmV3IHdlO2lmKEVpKHQsVS51bml0KCksbyksby5pbmZsYXRlKGkpLCFvLmlzSW50ZXJzZWN0aW5nUG9pbnQyRChlKSlyZXR1cm4gMDtjb25zdCBhPW5ldyBKLGg9dmkodCxlLFUudW5pdCgpLCExKTt0LnF1ZXJ5Q29vcmQyRChoLGEpO3JldHVybiBKLmRpc3RhbmNlKGEsZSk8PWk/KG4mJihuWzBdPWgpLDEpOjB9ZnVuY3Rpb24gRWkodCxlLHMpe2NvbnN0IG49Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSxEaShuLGUscyl9ZnVuY3Rpb24gRGkodCxlLHMpe2lmKGUuZXF1YWxzUmFuZ2UoMCwxKSlyZXR1cm4gdm9pZCBzLnNldEZyb21Qb2ludHModCwzKTtjb25zdCBuPWN0KEosMyk7WWkodCxlLnZtaW4sZS52bWF4LG4pLHMuc2V0RnJvbVBvaW50cyhuLDMpfWZ1bmN0aW9uIHdpKHQsZSxzKXtzLnNldEVtcHR5KCk7Y29uc3Qgbj1bXTtuLnB1c2gobmV3IFUoMCwxKSk7Y29uc3QgaT0uNSpNYXRoLm1heChlLndpZHRoKCksZS5oZWlnaHQoKSk7Zm9yKDtuLmxlbmd0aDspe2NvbnN0IHI9bi5hdCgtMSk7bi5wb3AoKTtjb25zdCBvPW5ldyB3ZTtpZihEaSh0LHIsbyksby5pc0ludGVyc2VjdGluZ1coZSkpe2NvbnN0IHQ9TWF0aC5tYXgoby53aWR0aCgpLG8uaGVpZ2h0KCkpO2lmKGUuY29udGFpbnNXKG8pfHx0PD1pfHxyLndpZHRoKCk8MWUtMTIpcy5tZXJnZShyKTtlbHNle2NvbnN0IHQ9ci5nZXRDZW50ZXIoKTtuLnB1c2goVS5jb25zdHJ1Y3Qoci52bWluLHQpKSxuLnB1c2goVS5jb25zdHJ1Y3QodCxyLnZtYXgpKX19fX1mdW5jdGlvbiBBaSh0KXtjb25zdCBlPWN0KEosMyk7dC5xdWVyeUNvbnRyb2xQb2ludHMoZSk7Y29uc3Qgcz1UaShlKTtyZXR1cm4gcyYmKHQubV9jcC5zZXRDb29yZHNQb2ludDJEKGVbMV0pLHQuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSksc31mdW5jdGlvbiBUaSh0KXtsZXQgZT0hMTtmb3IobGV0IHM9MDtzPDI7cysrKXtjb25zdCBuPWl0KHRbMF1bc10sdFsyXVtzXSk7bj4wPyhpdCh0WzBdW3NdLHRbMV1bc10pPDAmJih0WzFdW3NdPXRbMF1bc10sZT0hMCksaXQodFsxXVtzXSx0WzJdW3NdKTwwJiYodFsxXVtzXT10WzJdW3NdLGU9ITApKTpuPDA/KGl0KHRbMF1bc10sdFsxXVtzXSk+MCYmKHRbMV1bc109dFswXVtzXSxlPSEwKSxpdCh0WzFdW3NdLHRbMl1bc10pPjAmJih0WzFdW3NdPXRbMl1bc10sZT0hMCkpOnRbMV1bc10hPT10WzBdW3NdJiYodFsxXVtzXT10WzBdW3NdLGU9ITApfXJldHVybiBlfWZ1bmN0aW9uIElpKHQscyxuKXt2b2lkIDA9PT1uJiYobj1zLHM9MCk7Y29uc3QgaT1uZXcgSjtpZihzPDB8fG4+MSlyZXR1cm4gaS5zZXROQU4oKSxpO2lmKHM+biYmZShcImNhbGN1bGF0ZV9zdWJfd2VpZ2h0ZWRfY2VudHJvaWRcIikscz09PW58fHQuaXNEZWdlbmVyYXRlKDApKXJldHVybiBpLnNldENvb3JkcygwLDApLGk7Y29uc3Qgcj1haSh0KSxvPXJzKHQpLGE9TWF0aC5taW4oby90LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKSwxZS03KTtsZXQgaD1zLHU9MDtmb3IobGV0IGU9MSxtPXIuc3BlY2lhbFBvaW50c0NvdW50KCk7ZTxtO2UrKylpZihzPHIuc3BlY2lhbFBvaW50c1tlXSl7dT1lLTE7YnJlYWt9aS5zZXRDb29yZHMoMCwwKTtmb3IobGV0IGU9dSsxLG09ci5zcGVjaWFsUG9pbnRzQ291bnQoKTtlPG07ZSsrKXtjb25zdCBzPU1hdGgubWluKHIuc3BlY2lhbFBvaW50c1tlXSxuKSx1PWlpKHQsaCxzLGEsbyk7aWYoaS5hZGRUaGlzKHUpLGg9cyxuPD1yLnNwZWNpYWxQb2ludHNbZV0pYnJlYWt9cmV0dXJuIGkuYWRkKHQuZ2V0U3RhcnRYWSgpLm11bCh0LmNhbGN1bGF0ZUxlbmd0aDJEKCkpKX1mdW5jdGlvbiBNaSh0LGUscyxuKXsobmV3IEopLnNldENvb3Jkc1BvaW50MkQodFswXSk7KG5ldyBKKS5zZXRDb29yZHNQb2ludDJEKHRbMV0pOyhuZXcgSikuc2V0Q29vcmRzUG9pbnQyRCh0WzJdKTtjb25zdCBpPW5ldyBKLHI9bmV3IEosbz1uZXcgSjtpZihDdCh0WzBdLHRbMV0sZSxpKSxDdCh0WzFdLHRbMl0sZSxyKSxDdChpLHIsZSxvKSxzJiYoc1swXS5hc3NpZ24odFswXSksc1sxXS5hc3NpZ24oaSksc1syXS5hc3NpZ24obykpLG4pe2NvbnN0IGU9dFsyXTtuWzBdLmFzc2lnbihvKSxuWzFdLmFzc2lnbihyKSxuWzJdLmFzc2lnbihlKX19ZnVuY3Rpb24gWWkodCxlLHMsbil7aWYoZT09PXMpe2NvbnN0IHM9bmV3IEo7cmV0dXJuIFppKHQsZSxzKSxuWzBdPXMsblsxXT1zLHZvaWQoblsyXT1zKX1jb25zdCBpPWN0KEosMyk7TWkodCxzLGksbnVsbCksTWkoaSxlL3MsbnVsbCxpKSxaaSh0LGUsaVswXSksWmkodCxzLGlbMl0pLG5bMF0uc2V0Q29vcmRzUG9pbnQyRChpWzBdKSxuWzFdLnNldENvb3Jkc1BvaW50MkQoaVsxXSksblsyXS5zZXRDb29yZHNQb2ludDJEKGlbMl0pfWZ1bmN0aW9uIE5pKHQsZSxzLG4pe2lmKGUuaXNFcXVhbCh0Lm1fWFN0YXJ0LHQubV9ZU3R
1hcnQpJiZzLmlzRXF1YWwodC5tX1hFbmQsdC5tX1lFbmQpKXJldHVybjtjb25zdCBpPSEhbiYmdC5pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpLHI9bmV3IGNlLG89Y3QoSiwzKTtvWzBdLnNldENvb3Jkcyh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpLG9bMl0uc2V0Q29vcmRzKHQubV9YRW5kLHQubV9ZRW5kKTtjb25zdCBhPW5ldyBKO2Euc2V0U3ViKG9bMl0sb1swXSksYS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSxvWzFdLnNldEFkZChvWzBdLGEpO2NvbnN0IGg9Y3QoSiwzKTtoWzBdLnNldENvb3Jkc1BvaW50MkQoZSksaFsyXS5zZXRDb29yZHNQb2ludDJEKHMpLGEuc2V0U3ViKGhbMl0saFswXSksYS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSxoWzFdLnNldEFkZChoWzBdLGEpLHIuc2V0RnJvbVR3b1RyaWFuZ2xlcyhvLGgpP3IudHJhbnNmb3JtSW5QbGFjZSh0Lm1fY3ApOkN0KGUscywuNSx0Lm1fY3ApLHQuY2hhbmdlRW5kUG9pbnRzMkQoZSxzKSxpJiZBaSh0KX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5nZXRTdGFydFhZKCkubm9ybSgxKSt0LmdldEVuZFhZKCkubm9ybSgxKSt0Lm1fY3Aubm9ybSgxKX1mdW5jdGlvbiBxaSh0LGUscyxuLGkpe2lmKGkpe2lmKDAhPT1obShlLHMpKXJldHVybiB0PzQ6Mn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1MaSh0LGUscyxudWxsLG51bGwsbnVsbCxuLGk/PyExLCEwLCExKT80OjB9ZnVuY3Rpb24gRmkodCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gdD80OjJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09UmkodCxlLHMsbnVsbCxudWxsLG51bGwsbixpPz8hMSwhMCwhMSk/NDowfWZ1bmN0aW9uIFZpKHQsZSxzLG4saSl7aWYoaSl7aWYoMCE9PWhtKGUscykpcmV0dXJuIDJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09emkodCxlLHMsbnVsbCxudWxsLG51bGwsbixpPz8hMSwhMCwhMSk/NDowfWZ1bmN0aW9uIExpKHQsZSxuLGkscixvLGEsaCx1LG0pe2lmKG51bGwhPXImJihyLmxlbmd0aD0wKSxudWxsIT09byYmKG8ubGVuZ3RoPTApLG51bGwhPT1pJiYoaS5sZW5ndGg9MCksbi5pc0RlZ2VuZXJhdGUoMCkpe2NvbnN0IHQ9WzAsMF0scz1lLmludGVyc2VjdFBvaW50KG4uZ2V0U3RhcnRYWSgpLHQsYSk7aWYocz4wKXtpZihudWxsIT09cilmb3IobGV0IGU9MDtlPHM7ZSsrKXIucHVzaCh0W2VdKTtpZihudWxsIT09bylmb3IobGV0IHQ9MDt0PHM7dCsrKW8ucHVzaCgwKTtpZihudWxsIT09aSlmb3IobGV0IG49MDtuPHM7bisrKXtjb25zdCBzPW5ldyBKO2UucXVlcnlDb29yZDJEKHRbbl0scyksaS5wdXNoKHMpfX1yZXR1cm4gc31jb25zdCBsPW9zKGUsbik7aWYoYT1NYXRoLm1heChhLGwpLGUuaXNEZWdlbmVyYXRlVG9MaW5lSGVscGVyKGwpKXtjb25zdCB0PW5ldyBmbSh7c3RhcnQ6ZS5nZXRTdGFydFhZKCksZW5kOmUuZ2V0RW5kWFkoKX0pLHM9d3ModCxuLGkscixvLGEsaCxtKTtpZihyKWZvcihsZXQgbj0wO248czsrK24pe2NvbnN0IHM9dC5nZXRDb29yZDJEKHJbbl0pO3Jbbl09ZS5nZXRDbG9zZXN0Q29vcmRpbmF0ZShzLCExKX1yZXR1cm4gc31pZihhcyhlLG4sYSkpcmV0dXJuIDA7Y29uc3QgYz1xZS5jb25zdHJ1Y3RQb2ludDJEKG4uZ2V0U3RhcnRYWSgpKSxnPXFlLmNvbnN0cnVjdFBvaW50MkQobi5nZXRFbmRYWSgpKS5zdWIoYyksZD1nLmNsb25lKCk7ZC5sZWZ0UGVycGVuZGljdWxhclRoaXMoKTtjb25zdCBfPXFlLmNvbnN0cnVjdFBvaW50MkQoZS5tX2NwKS5zdWIocWUuY29uc3RydWN0UG9pbnQyRChlLmdldFN0YXJ0WFkoKSkpLHA9cWUuY29uc3RydWN0UG9pbnQyRChlLmdldEVuZFhZKCkpLnN1YihxZS5jb25zdHJ1Y3RQb2ludDJEKGUubV9jcCkpO2xldCBmPV8uZG90UHJvZHVjdChkKS50b0RvdWJsZSgpLFA9cC5zdWIoXykuZG90UHJvZHVjdChkKS50b0RvdWJsZSgpO2NvbnN0IHk9TygxMixOdW1iZXIuTmFOKSx4PU8oMTIsTnVtYmVyLk5hTik7bGV0IEM9c24oUCxmLFUudW5pdCgpLHkpO0M8MCYmKHlbMF09MCx5WzFdPTEsQz0yKTtsZXQgdixiPTA7Zm9yKGxldCBzPTAsdz1iO3M8QzsrK3Mpe2NvbnN0IHQ9ZS5nZXRDb29yZDJEKHlbcyt3XSk7eFtiXT1uLmdldENsb3Nlc3RDb29yZGluYXRlKHQsITEpLEouZGlzdGFuY2UodCxuLmdldENvb3JkMkQoeFtiXSkpPD1hJiYoeVtiXT15W3Mrd10sYisrKX1jb25zdCBTPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMoUyk7e2NvbnN0IHQ9Y3QocWUsMyk7aWYoamkoUyx0LCExKSx0WzBdPXRbMF0uc3ViKGMpLGcueC5hYnMoKS5ndGUoZy55LmFicygpKSl7Y29uc3QgZT1nLnkuZGl2KGcueCk7UD10WzJdLnkuc3ViKHRbMl0ueC5tdWwoZSkpLnRvRG91YmxlKCksZj10WzFdLnkuc3ViKHRbMV0ueC5tdWwoZSkpLnRvRG91YmxlKCksdj10WzBdLnkuc3ViKHRbMF0ueC5tdWwoZSkpLnRvRG91YmxlKCl9ZWxzZXtjb25zdCBlPWcueC5kaXYoZy55KTtQPXRbMl0ueC5zdWIodFsyXS55Lm11bChlKSkudG9Eb3VibGUoKSxmPXRbMV0ueC5zdWIodFsxXS55Lm11bChlKSkudG9Eb3VibGUoKSx2PXRbMF0ueC5zdWIodFswXS55Lm11bChlKSkudG9Eb3VibGUoKX19Y29uc3QgRT1lLmdldEVuZFhZKCkuZXF1YWxzKG4uZ2V0U3RhcnRYWSgpKXx8ZS5nZXRFbmRYWSgpLmVxdWFscyhuLmdldEVuZFhZKCkpLEQ9WzAsMF07Qz1ubihQLGYsdixVLnVuaXQoKSxFLEQpO2ZvcihsZXQgcz0wLHc9YjtzPEM7KytzKXt5W3Mrd109RFtzXTtjb25zdCB0PWUuZ2V0Q29vcmQyRCh5W3Mrd10pO3hbYl09bi5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LCExKSxKLmRpc3RhbmNlKHQsbi5nZXRDb29yZDJEKHhbYl0pKTw9YSYmKHlbYl09eVtzK3ddLGIrKyl9cyhiPHkubGVuZ3RoKzQpLEM9ZS5pbnRlcnNlY3RQb2ludChuLmdldFN0YXJ0WFkoKSxELGEpO2ZvcihsZXQgcz0wO3M8QztzKyspeVtiXT1EW3NdLHhbYisrXT0wO0M9ZS5pbnRlcnNlY3RQb2ludChuLmdldEVuZFhZKCksRCxhKTtmb3IobGV0IHM9MDtzPEM7cysrKXlbYl09RFtzXSx4W2IrK109MTtDPW4uaW50ZXJzZWN0UG9pbnQoZS5nZXRTdGFydFhZKCksRCxhKTtmb3IobGV0IHM9MDtzPEM7cysrKXhbYl09RFtzXSx5W2IrK109MDtDPW4uaW50ZXJzZWN0UG9pbnQoZS5nZXRFbmRYWSgpLEQsYSk7Zm9yKGxldCBzPTA7czxDO3MrKyl4W2JdPURbc10seVtiKytdPTA7cmV0dXJuIDA9PT1iPzA6Z20odCxlLG4seSx4LGIsaSxyLG8sYSxoLHUsbSl9ZnVuY3Rpb24gUmkodCxlLHMsbixpLHIsbyxhLGgsdSl7aWYoRXUocykpe3JldHVybiBMaSh0LGUsbmV3IGZtKHtzdGFydDpzLmdldFN0YXJ0WFkoKSxlbmQ6cy5nZXRFbmRYWSgpfSksbixpLHIsbyxhLGgsdSl9Y29uc3QgbT1vcyhlLHMpO2lmKGFzKGUscyxvPU1hdGgubWF4KG8sbSkpKXJldHVybiAwO2NvbnN0IGw9W10sYz1b
1XSxnPWN0KEosMyk7e2UucXVlcnlDb250cm9sUG9pbnRzKGcpO2NvbnN0IHQ9Y3QoSiwzKSxuPW5ldyBjZTtzLmNhbm9uaWNUb1dvcmxkVHJhbnNmb3JtYXRpb24obik7Y29uc3QgaT1uZXcgY2U7aS5zZXRJbnZlcnQobiksaS50cmFuc2Zvcm1Qb2ludHMyRChnLDMsdCk7Y29uc3Qgcj1jdChxZSwzKTtqaSh0LHIpO2NvbnN0IGg9W3JbMF0ueCxyWzFdLngsclsyXS54XSx1PVtyWzBdLnksclsxXS55LHJbMl0ueV0sbT1jdChydCwzKTttWzBdLnNldERvdWJsZShzLmdldFNlbWlNaW5vckF4aXMoKSksbVswXS5zcXJUaGlzKCksbVsxXS5zZXREb3VibGUocy5nZXRTZW1pTWFqb3JBeGlzKCkpLG1bMV0uc3FyVGhpcygpLG1bMl09bVswXSxtWzJdLm11bChtWzFdKSxtWzJdLm5lZ2F0ZSgpO2NvbnN0IGQ9Rm4oaCwyLHUsMixudWxsLDAsbSwhMCxVLnVuaXQoKSxVLnVuaXQoKSxsLGEpO2lmKGQ+MCl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGQ7bisrKXtjb25zdCBpPW5ldyBKO2UucXVlcnlDb29yZDJEKGxbbl0saSk7Y29uc3Qgcj1zLmdldENsb3Nlc3RDb29yZGluYXRlKGksITEpLGE9bmV3IEo7cy5xdWVyeUNvb3JkMkQocixhKSxKLmRpc3RhbmNlKGksYSk8PW8mJihsW3RdPWxbbl0sYy5wdXNoKHIpLHQrKyl9bC5sZW5ndGg9dH19Y29uc3QgZD1bMCwxXTtmb3IobGV0IF89MDtfPDI7XysrKXtjb25zdCB0PTA9PT1fP3MuZ2V0U3RhcnRYWSgpOnMuZ2V0RW5kWFkoKSxlPVswXTtiaShnLHQsZSk7Y29uc3Qgbj1uZXcgSjtaaShnLGVbMF0sbiksSi5kaXN0YW5jZSh0LG4pPD1vJiYobC5wdXNoKGVbMF0pLGMucHVzaChkW19dKSl9Zm9yKGxldCBfPTA7XzwyO18rKyl7Y29uc3QgdD1bMCwyXTt7Y29uc3QgZT1zLmdldENsb3Nlc3RDb29yZGluYXRlKGdbdFtfXV0sITEpLG49bmV3IEo7cy5xdWVyeUNvb3JkMkQoZSxuKSxKLmRpc3RhbmNlKGdbdFtfXV0sbik8PW8mJihsLnB1c2goZFtfXSksYy5wdXNoKGUpKX19cmV0dXJuIGdtKHQsZSxzLGwsYyxsLmxlbmd0aCxuLGkscixvLGEsaCx1KX1mdW5jdGlvbiB6aSh0LGUscyxuLGkscixvLGEsaCx1KXtjb25zdCBtPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMobSk7Y29uc3QgbD1jdChKLDMpO2lmKHMucXVlcnlDb250cm9sUG9pbnRzKGwpLGhzKG0sbCwzKTwwKXJldHVybiB6aSh0LHMsZSxuLHIsaSxvLGEsaCwhdSk7Y29uc3QgYz1vcyhlLHMpO2lmKGFzKGUscyxvPU1hdGgubWF4KG8sYykpKXJldHVybiAwO2lmKHNyKGUscyxuLGkscixvLGEsaCx1KSlyZXR1cm4gMjtjb25zdCBnPW5ldyBVKDAsMSksZD1uZXcgVSgwLDEpO3tjb25zdCB0PW5ldyB3ZTtEaShtLFUudW5pdCgpLHQpO2NvbnN0IGU9bmV3IHdlO0RpKGwsVS51bml0KCksZSk7Y29uc3Qgcz1NYXRoLm1heCh0Lm1heERpbSgpLGUubWF4RGltKCkpO2lmKHQuaW5mbGF0ZSgzKm8pLGUuaW5mbGF0ZSgzKm8pLCF0LmludGVyc2VjdFcoZSkpcmV0dXJuIDA7aWYodC5tYXhEaW0oKTwuMSpzKXtpZih3aShtLHQsZyksd2kobCx0LGQpLGcuaXNFbXB0eSgpfHxkLmlzRW1wdHkoKSlyZXR1cm4gMDtZaShtLGcudm1pbixnLnZtYXgsbSksWWkobCxkLnZtaW4sZC52bWF4LGwpfX1jb25zdCBfPV9tKG0sMixsLDIsbyk7aWYoMD09PV8pcmV0dXJuIDA7Y29uc3QgcD1bXSxmPVtdO2lmKC0xPT09Xyl7Y29uc3QgdD1jdChxZSwzKTtqaShtLHQpO2NvbnN0IGU9W3RbMF0ueCx0WzFdLngsdFsyXS54XSxzPVt0WzBdLnksdFsxXS55LHRbMl0ueV0sbj1jdChxZSwzKTtqaShsLG4pO2NvbnN0IGk9Tm4oZSwyLHMsMixudWxsLDAsW25bMF0ueCxuWzFdLngsblsyXS54XSwyLFtuWzBdLnksblsxXS55LG5bMl0ueV0sMixudWxsLDAsITAsVS51bml0KCksVS51bml0KCkscCxmLHUsYSx1KTtpZihpPjApe2xldCB0PTA7Zm9yKGxldCBlPTA7ZTxpO2UrKyl7Y29uc3Qgcz1uZXcgSixuPW5ldyBKO1ppKGwsZltlXSxuKSxaaShtLHBbZV0scyksSi5kaXN0YW5jZShzLG4pPD1vJiYocFt0XT1wW2VdLGZbdF09ZltlXSx0KyspfXAubGVuZ3RoPXQsZi5sZW5ndGg9dH19Zm9yKGxldCBQPTA7UDwyO1ArKyl7Y29uc3QgdD0wPT09UD9tOmwsZT0wPT09UD9sOm07Zm9yKGxldCBzPTA7czwyO3MrKyl7Y29uc3Qgbj0wPT09cz8wOjIsaT1bMF07YmkoZSx0W25dLGkpO2NvbnN0IHI9bmV3IEo7WmkoZSxpWzBdLHIpLEouZGlzdGFuY2UodFtuXSxyKTw9byYmKDA9PT1QPyhwLnB1c2goMD09PW4/MDoxKSxmLnB1c2goaVswXSkpOihmLnB1c2goMD09PW4/MDoxKSxwLnB1c2goaVswXSkpKX19aWYoMD09PXAubGVuZ3RoKXJldHVybiAwO2lmKCFnLmVxdWFsc1JhbmdlKDAsMSkpZm9yKGxldCBQPTA7UDxwLmxlbmd0aDsrK1ApcFtQXT1Bbi5yZWNhbGN1bGF0ZVBhcmVudFQoZy52bWluLGcudm1heCxwW1BdKTtpZighZC5lcXVhbHNSYW5nZSgwLDEpKWZvcihsZXQgUD0wO1A8Zi5sZW5ndGg7KytQKWZbUF09QW4ucmVjYWxjdWxhdGVQYXJlbnRUKGQudm1pbixkLnZtYXgsZltQXSk7cmV0dXJuIGdtKHQsZSxzLHAsZixwLmxlbmd0aCxuLGkscixvLGEsaCx1KX1mdW5jdGlvbiBCaSh0LGUscz0hMSl7Y29uc3Qgbj10WzFdLnN1Yih0WzBdKTtlWzFdLmFzc2lnbihuLm11bCgyKSksZVsyXS5hc3NpZ24odFsyXS5zdWIodFsxXSkuc3ViKG4pKSxzP2VbMF0uc2V0Q29vcmRzKDAsMCk6ZVswXS5hc3NpZ24odFswXSl9ZnVuY3Rpb24ga2kodCxlLHM9ITEpe2NvbnN0IG49Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSxCaShuLGUscyl9ZnVuY3Rpb24gR2kodCxlLHM9ITEpe2NvbnN0IG49MCxpPW5ldyBodCh0WzFdW25dKS5zdWJFKG5ldyBodCh0WzBdW25dKSk7ZVsxXT1pLm11bCgyKSxlWzJdPW5ldyBodCh0WzJdW25dKS5zdWJFKG5ldyBodCh0WzFdW25dKSkuc3ViRShpKSxzP2VbMF0uc2V0KDApOmVbMF0uc2V0KHRbMF1bbl0pfWZ1bmN0aW9uIFdpKHQsZSxzPSExKXtjb25zdCBuPTEsaT1uZXcgaHQodFsxXVtuXSkuc3ViRShuZXcgaHQodFswXVtuXSkpO2VbMV09aS5tdWwoMiksZVsyXT1uZXcgaHQodFsyXVtuXSkuc3ViRShuZXcgaHQodFsxXVtuXSkpLnN1YkUoaSkscz9lWzBdLnNldCgwKTplWzBdLnNldCh0WzBdW25dKX1mdW5jdGlvbiBqaSh0LGUscz0hMSl7Y29uc3Qgbj1xZS5jb25zdHJ1Y3RQb2ludDJEKHRbMV0pLGk9bi5zdWIocWUuY29uc3RydWN0UG9pbnQyRCh0WzBdKSk7ZVsxXT1pLm11bChydC5jb25zdHJ1Y3RJbnQzMigyKSksZVsyXT1xZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pLnN1YihuKS5zdWIoaSksZVswXT1zP25ldyBxZSgkdCwkdCk6cWUuY29uc3RydWN0UG9pbnQyRCh0WzBdKX1mdW5jdGlvbiBaaSh0LGUscyxuKXtpZihuKXtpZihlPDApe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dFswXSxlbmQ6dFswXS5hZGQoY2kodCwwKS5nZXRVbml0VmVjdG9yKCkpfSksZSxzKX1pZihlPjEpe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dFsyXSxlbmQ6dFsyXS5hZGQoY2kodCwxKS5nZXRVbml0VmVjdG9yKCkpfSksZS0xLHMpfX1pZihlPD0uNSl7Y29uc3Qgbj10WzFdLmNsb25lKCksaT1uZXcgSjtYdCgyLHRbMF0sbixlLGkpO2NvbnN0IHI9bmV3IEo7WHQoMixuLHRbMl0sZSxyKTtjb25zdCBvPW5ldyBKO1h0KDIsaSxyLGUsbykscy5hc3NpZ24obyl9ZWxzZXtjb25zdCBuPXRbMV0uY2xvbmUoKSxpPW5ldyBKO3F0KDIsdFswXSxuLGUsaSk7Y29uc3Qgcj1uZXcgSjtxdCgyLG4sdFsyXSxlLHIpO2NvbnN0IG89bmV3IEo7cXQoMixpLHIsZSxvKSxzLmFzc2lnbihvKX19ZnVuY3Rpb24gSGkodCxlLHMpe2NvbnN0IG49Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSxVaShuLGUscyl9ZnVuY3Rpb24gVWkodCxlLHMpe2lmKGUudmFsdWUoKTw9LjUpe2NvbnN0IG49TmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKSxpPW5ldyBOZTtGdCgyLE5lLmNvbnN0cnVjdFBvaW50MkQodFswXSksbixlLGkpO2NvbnN0IHI9bmV3IE5lO0Z0KDIsbixOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pLGUscik7Y29uc3Qgbz1uZXcgTmU7RnQoMixpLHIsZSxvKSxzLnNldEUobyl9ZWxzZXtjb25zdCBuPU5lLmNvbnN0cnVjdFBvaW50MkQodFsxXSksaT1uZXcgTmU7VnQ
1oMixOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMF0pLG4sZSxpKTtjb25zdCByPW5ldyBOZTtWdCgyLG4sTmUuY29uc3RydWN0UG9pbnQyRCh0WzJdKSxlLHIpO2NvbnN0IG89bmV3IE5lO1Z0KDIsaSxyLGUsbykscy5zZXRFKG8pfX1mdW5jdGlvbiBPaSh0LGUscyl7Y29uc3Qgbj1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKG4pLFFpKG4sZSxzKX1mdW5jdGlvbiBRaSh0LGUscyl7ZS52YWx1ZSgpPDAmJmUuc2V0KDAsZS5lcHMoKSksZS52YWx1ZSgpPjEmJmUuc2V0KDEsZS5lcHMoKSkscy5zZXRFKF9pKHQsMSxlKSl9ZnVuY3Rpb24gSmkodCxlKXtsZXQgcz0xO3RbMV0uaXNFcXVhbFBvaW50MkQodFswXSkmJihzPTIsdFsyXS5pc0VxdWFsUG9pbnQyRCh0WzBdKSYmKHM9MykpO2xldCBuPTI7dFsyXS5pc0VxdWFsUG9pbnQyRCh0WzNdKSYmKG49MSx0WzFdLmlzRXF1YWxQb2ludDJEKHRbM10pJiYobj0wKSksZVswXS5hc3NpZ24odFswXSksZVsyXS5hc3NpZ24odFszXSk7Y29uc3QgaT1KLmludGVyc2VjdExpbmVzQXRPbmVQb2ludCh0WzBdLHRbc10sdFtuXSx0WzNdKSxyPW5ldyBKO0N0KHRbMF0sdFszXSwuNSxyKTtjb25zdCBvPW5ldyBKO3lvKHQsLjUsbyk7Y29uc3QgYT1uZXcgSjtlWzFdLmFzc2lnbihpKSxaaShlLC41LGEpO2NvbnN0IGg9bmV3IEo7ZVsxXS5hc3NpZ24ociksWmkoZSwuNSxoKTtjb25zdCB1PUouc3FyRGlzdGFuY2UobyxhKSxtPUouc3FyRGlzdGFuY2UobyxoKTtyZXR1cm4gdTxtPyhlWzFdLnNldENvb3Jkc1BvaW50MkQoaSksTWF0aC5zcXJ0KHUpKTooZVsxXS5zZXRDb29yZHNQb2ludDJEKHIpLE1hdGguc3FydChtKSl9ZnVuY3Rpb24gS2kodCxlLHMpe3NbMF0uYXNzaWduKHRbMF0pLHNbMV0uYXNzaWduKHRbMV0pLHNbMl0uYXNzaWduKHRbMl0pO2NvbnN0IG49bmV3IEo7cGgodCxlLC41LG4pO2NvbnN0IGk9bmV3IEo7WmkocywuNSxpKTtjb25zdCByPUouc3FyRGlzdGFuY2UobixpKTtyZXR1cm4gTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uICRpKHQsZSl7ZVswXS5hc3NpZ24odFswXSksZVszXS5hc3NpZ24odFsyXSksQ3QodFswXSx0WzFdLDIvMyxlWzFdKSxDdCh0WzFdLHRbMl0sMS8zLGVbMl0pfWZ1bmN0aW9uIHRyKHQsZSl7Y29uc3Qgcz1jdChKLDMpO3QucXVlcnlDb250cm9sUG9pbnRzKHMpO2NvbnN0IG49Si5zcXJEaXN0YW5jZShzWzFdLHNbMF0pLGk9Si5zcXJEaXN0YW5jZShzWzFdLHNbMl0pO2xldCByPXNbMF0uY2xvbmUoKSxvPW47bj5pJiYocj1zWzJdLmNsb25lKCksbz1pKTtsZXQgYT0hMTtyZXR1cm4gbzw9ZSYmMCE9PW8mJihhPSEwLHQuc2V0Q29udHJvbFBvaW50MShyKSksYX1mdW5jdGlvbiBlcih0LGUpe2lmKCFlKXJldHVybiExO2NvbnN0IHM9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhzKTtjb25zdCBuPUouc3FyRGlzdGFuY2Uoc1sxXSxzWzBdKSxpPUouc3FyRGlzdGFuY2Uoc1sxXSxzWzJdKTtzWzBdLmNsb25lKCk7bGV0IHI9bjtyZXR1cm4gbj5pJiYoc1syXS5jbG9uZSgpLHI9aSkscjw9ZSYmMCE9PXJ9ZnVuY3Rpb24gc3IodCxlLHMsbixpLHIsbyxhLGgpe2NvbnN0IHU9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyh1KTtjb25zdCBtPWN0KEosMyk7aWYoZS5xdWVyeUNvbnRyb2xQb2ludHMobSksdVswXS5lcXVhbHMobVswXSkpe2lmKHVbMV0uZXF1YWxzKG1bMV0pJiZ1WzJdLmVxdWFscyhtWzJdKSlyZXR1cm4gcyYmKHMubGVuZ3RoPTAscy5wdXNoKHVbMF0pLHMucHVzaCh1WzJdKSksbiYmKG4ubGVuZ3RoPTAsbi5wdXNoKDApLG4ucHVzaCgxKSksaSYmKGkubGVuZ3RoPTAsaS5wdXNoKDApLGkucHVzaCgxKSksITA7aWYoIXVbMF0uZXF1YWxzKG1bMl0pKXJldHVybiExfXJldHVybiEhKHVbMF0uZXF1YWxzKG1bMl0pJiZ1WzFdLmVxdWFscyhtWzFdKSYmdVsyXS5lcXVhbHMobVswXSkpJiYobiYmKG4ubGVuZ3RoPTAsbi5wdXNoKDApLG4ucHVzaCgxKSxoJiYoblsxXT1zdChuWzBdLG5bMF09blsxXSkpKSxpJiYoaS5sZW5ndGg9MCxpLnB1c2goMSksaS5wdXNoKDApLGgmJihpWzFdPXN0KGlbMF0saVswXT1pWzFdKSkpLHMmJihzLmxlbmd0aD0wLHMucHVzaCh1WzBdKSxzLnB1c2godVsyXSksaCYmKHNbMV09c3Qoc1swXSxzWzBdPXNbMV0pKSksITApfWNvbnN0IG5yPVtbLjMzOTk4MTA0MzU4NDg1NjI2LC42NTIxNDUxNTQ4NjI1NDYxXSxbLjg2MTEzNjMxMTU5NDA1MjYsLjM0Nzg1NDg0NTEzNzQ1Mzg1XV0saXI9W1suMTgzNDM0NjQyNDk1NjQ5OCwuMzYyNjgzNzgzMzc4MzYyXSxbLjUyNTUzMjQwOTkxNjMyOSwuMzEzNzA2NjQ1ODc3ODg3MjddLFsuNzk2NjY2NDc3NDEzNjI2NywuMjIyMzgxMDM0NDUzMzc0NDhdLFsuOTYwMjg5ODU2NDk3NTM2MywuMTAxMjI4NTM2MjkwMzc2MjZdXSxycj1bWy4wOTUwMTI1MDk4Mzc2Mzc0NCwuMTg5NDUwNjEwNDU1MDY4NV0sWy4yODE2MDM1NTA3NzkyNTg5LC4xODI2MDM0MTUwNDQ5MjM1OF0sWy40NTgwMTY3Nzc2NTcyMjczNywuMTY5MTU2NTE5Mzk1MDAyNTRdLFsuNjE3ODc2MjQ0NDAyNjQzOCwuMTQ5NTk1OTg4ODE2NTc2NzRdLFsuNzU1NDA0NDA4MzU1MDAzLC4xMjQ2Mjg5NzEyNTU1MzM4OF0sWy44NjU2MzEyMDIzODc4MzE4LC4wOTUxNTg1MTE2ODI0OTI3OV0sWy45NDQ1NzUwMjMwNzMyMzI2LC4wNjIyNTM1MjM5Mzg2NDc4OTRdLFsuOTg5NDAwOTM0OTkxNjQ5OSwuMDI3MTUyNDU5NDExNzU0MDk2XV0sb3I9W1suMDQ4MzA3NjY1Njg3NzM4MzIsLjA5NjU0MDA4ODUxNDcyNzhdLFsuMTQ0NDcxOTYxNTgyNzk2NSwuMDk1NjM4NzIwMDc5Mjc0ODZdLFsuMjM5Mjg3MzYyMjUyMTM3MDYsLjA5Mzg0NDM5OTA4MDgwNDU3XSxbLjMzMTg2ODYwMjI4MjEyNzY3LC4wOTExNzM4Nzg2OTU3NjM4OV0sWy40MjEzNTEyNzYxMzA2MzUzMywuMDg3NjUyMDkzMDA0NDAzODFdLFsuNTA2ODk5OTA4OTMyMjI5NCwuMDgzMzExOTI0MjI2OTQ2NzVdLFsuNTg3NzE1NzU3MjQwNzYyMywuMDc4MTkzODk1Nzg3MDcwMzFdLFsuNjYzMDQ0MjY2OTMwMjE1MiwuMDcyMzQ1Nzk0MTA4ODQ4NV0sWy43MzIxODIxMTg3NDAyODk3LC4wNjU4MjIyMjI3NzYzNjE4NV0sWy43OTQ0ODM3OTU5Njc5NDI0LC4wNTg2ODQwOTM0Nzg1MzU1NDRdLFsuODQ5MzY3NjEzNzMyNTcsLjA1MDk5ODA1OTI2MjM3NjE3NV0sWy44OTYzMjExNTU3NjYwNTIxLC4wNDI4MzU4OTgwMjIyMjY2OF0sWy45MzQ5MDYwNzU5Mzc3Mzk3LC4wMzQyNzM4NjI5MTMwMjE0M10sWy45NjQ3NjIyNTU1ODc1MDY0LC4wMjUzOTIwNjUzMDkyNjIwNl0sWy45ODU2MTE1MTE1NDUyNjg0LC4wMTYyNzQzOTQ3MzA5MDU2N10sWy45OTcyNjM4NjE4NDk0ODE2LC4wMDcwMTg2MTAwMDk0NzAwOTZdXSxhcj1bWy4wMjQzNTAyOTI2NjM0MjQ0MzMsLjA0ODY5MDk1NzAwOTEzOTcyNF0sWy4wNzI5OTMxMjE3ODc3OTkwNCwuMDQ4NTc1NDY3NDQxNTAzNDNdLFsuMTIxNDYyODE5Mjk2MTIwNTYsLjA0ODM0NDc2MjIzNDgwMjk1NF0sWy4xNjk2NDQ0MjA0MjM5OTI4MywuMDQ3OTk5Mzg4NTk2NDU4MzFdLFsuMjE3NDIzNjQzNzQwMDA3MDgsLjA0NzU0MDE2NTcxNDgzMDMxXSxbLjI2NDY4NzE2MjIwODc2NzQsLjA0Njk2ODE4MjgxNjIxMDAyXSxbLjMxMTMyMjg3MTk5MDIxMDk3LC4wNDYyODQ3OTY1ODEzMTQ0MTZdLFsuMzU3MjIwMTU4MzM3NjY4MSwuMDQ1NDkxNjI3OTI3NDE4MTRdLFsuNDAyMjcwMTU3OTYzOTkxNiwuMDQ0NTkwNTU4MTYzNzU2NTY2XSxbLjQ0NjM2NjAxNzI1MzQ2NDEsLjA0MzU4MzcyNDUyOTMyMzQ1XSxbLjQ4OTQwMzE0NTcwNzA1Mjk2LC4wNDI0NzM1MTUxMjM2NTM1OV0sWy41MzEyNzk0NjQwMTk4OTQ2LC4wNDEyNjI1NjMyNDI2MjM1M10sWy41NzE4OTU2NDYyMDI2MzQsLjAzOTk1Mz
1c0MTEzMjcyMDM0XSxbLjYxMTE1NTM1NTE3MjM5MzMsLjAzODU1MDE1MzE3ODYxNTYyNl0sWy42NDg5NjU0NzEyNTQ2NTczLC4wMzcwNTUxMjg1NDAyNDAwNV0sWy42ODUyMzYzMTMwNTQyMzMzLC4wMzU0NzIyMTMyNTY4ODIzODZdLFsuNzE5ODgxODUwMTcxNjEwOSwuMDMzODA1MTYxODM3MTQxNjA2XSxbLjc1MjgxOTkwNzI2MDUzMTksLjAzMjA1NzkyODM1NDg1MTU1XSxbLjc4Mzk3MjM1ODk0MzM0MTQsLjAzMDIzNDY1NzA3MjQwMjQ3OF0sWy44MTMyNjUzMTUxMjI3OTc1LC4wMjgzMzk2NzI2MTQyNTk0ODNdLFsuODQwNjI5Mjk2MjUyNTgwMywuMDI2Mzc3NDY5NzE1MDU0NjZdLFsuODY1OTk5Mzk4MTU0MDkyOCwuMDI0MzUyNzAyNTY4NzEwODc0XSxbLjg4OTMxNTQ0NTk5NTExNDEsLjAyMjI3MDE3MzgwODM4MzI1M10sWy45MTA1MjIxMzcwNzg1MDI4LC4wMjAxMzQ4MjMxNTM1MzAyMV0sWy45Mjk1NjkxNzIxMzE5Mzk2LC4wMTc5NTE3MTU3NzU2OTczNDNdLFsuOTQ2NDExMzc0ODU4NDAyOCwuMDE1NzI2MDMwNDc2MDI0NzE4XSxbLjk2MTAwODc5OTY1MjA1MzgsLjAxMzQ2MzA0Nzg5NjcxODY0M10sWy45NzMzMjY4Mjc3ODk5MTEsLjAxMTE2ODEzOTQ2MDEzMTEyOF0sWy45ODMzMzYyNTM4ODQ2MjYsLjAwODg0Njc1OTgyNjM2Mzk0N10sWy45OTEwMTMzNzE0NzY3NDQzLC4wMDY1MDQ0NTc5Njg5NzgzNjNdLFsuOTk2MzQwMTE2NzcxOTU1MywuMDA0MTQ3MDMzMjYwNTYyNDY4XSxbLjk5OTMwNTA0MTczNTc3MjIsLjAwMTc4MzI4MDcyMTY5NjQzM11dLGhyPVtbLjAxMjIyMzY5ODk2MDYxNTc2NCwuMDI0NDQ2MTgwMTk2MjYyNTE4XSxbLjAzNjY2Mzc5MDk2ODczMzQ5LC4wMjQ0MzE1NjkwOTc4NTAwNDRdLFsuMDYxMDgxOTY5NjA0MTM5NTcsLjAyNDQwMjM1NTYzMzg0OTU4XSxbLjA4NTQ2MzY0MDUwNDUxNTQ5LC4wMjQzNTg1NTcyNjQ2OTA2MjZdLFsuMTA5Nzk0MjMxMTI3NjQzNzUsLjAyNDMwMDIwMDE2Nzk3MTg2N10sWy4xMzQwNTkxOTk0NjExODc3NywuMDI0MjI3MzE5MjIyODE1MjVdLFsuMTU4MjQ0MDQyNzE0MjI0OTMsLjAyNDEzOTk1Nzk4OTAxOTI4N10sWy4xODIzMzQzMDU5ODUzMzcxOCwuMDI0MDM4MTY4NjgxMDI0MDUyXSxbLjIwNjMxNTU5MDkwMjA3OTIsLjAyMzkyMjAxMjEzNjcwMzQ1N10sWy4yMzAxNzM1NjQyMjY2NiwuMDIzNzkxNTU3NzgxMDAzNDAyXSxbLjI1Mzg5Mzk2NjQyMjY5NDMsLjAyMzY0Njg4MzU4NDQ0NzYxNl0sWy4yNzc0NjI2MjAxNzc5MDQ0LC4wMjM0ODgwNzYwMTY1MzU5MV0sWy4zMDA4NjU0Mzg4Nzc2NzcyLC4wMjMzMTUyMjk5OTQwNjI3Nl0sWy4zMjQwODg0MzUwMjQ0MTMzNywuMDIzMTI4NDQ4ODI0Mzg3MDI3XSxbLjM0NzExNzcyODU5NzYzNTUsLjAyMjkyNzg0NDE0MzY4Njg0Nl0sWy4zNjk5Mzk1NTUzNDk4NTksLjAyMjcxMzUzNTg1MDIzNjQ2XSxbLjM5MjU0MDI3NTAzMzI2NzQ0LC4wMjI0ODU2NTIwMzI3NDQ5NjhdLFsuNDE0OTA2Mzc5NTUyMjc1LC4wMjIyNDQzMjg4OTM3OTk3NjRdLFsuNDM3MDI0NTAxMDM3MTA0MTYsLjAyMTk4OTcxMDY2ODQ2MDQ5XSxbLjQ1ODg4MTQxOTgzMzU1MjIsLjAyMTcyMTk0OTUzODA1MjA3Nl0sWy40ODA0NjQwNzI0MDQxNzIwNSwuMDIxNDQxMjA1NTM5MjA4NDZdLFsuNTAxNzU5NTU5MTM2MTQ0NSwuMDIxMTQ3NjQ2NDY4MjIxMzVdLFsuNTIyNzU1MTUyMDUxMTc1NSwuMDIwODQxNDQ3NzgwNzUxMTVdLFsuNTQzNDM4MzAyNDEyODEwMywuMDIwNTIyNzkyNDg2OTYwMDddLFsuNTYzNzk2NjQ4MjI2NjE4MSwuMDIwMTkxODcxMDQyMTMwMDQzXSxbLjU4MzgxODAyMTYyODc2MzEsLjAxOTg0ODg4MTIzMjgzMDg2XSxbLjYwMzQ5MDQ1NjE1ODU0ODYsLjAxOTQ5NDAyODA1ODcwNjYwMl0sWy42MjI4MDIxOTM5MTA1ODQ5LC4wMTkxMjc1MjM2MDk5NTA5NDRdLFsuNjQxNzQxNjkyNTYyMzA3NSwuMDE4NzQ5NTg2OTQwNTQ0NzFdLFsuNjYwMjk3NjMyMjcyNjQ2LC4wMTgzNjA0NDM5MzczMzEzNF0sWy42Nzg0NTg5MjI0NDc3MTkyLC4wMTc5NjAzMjcxODUwMDg2ODddLFsuNjk2MjE0NzA4MzY5NTE0NCwuMDE3NTQ5NDc1ODI3MTE3NzA2XSxbLjcxMzU1NDM3NzY4MzU4NzQsLjAxNzEyODEzNTQyMzExMTM4XSxbLjczMDQ2NzU2Njc0MTkwODgsLjAxNjY5NjU1NzgwMTU4OTIwNV0sWy43NDY5NDQxNjY3OTcwNjIsLjAxNjI1NTAwMDkwOTc4NTE4N10sWy43NjI5NzQzMzAwNDQwOTQ4LC4wMTU4MDM3Mjg2NTkzOTkzNDddLFsuNzc4NTQ4NDc1NTA2NDExOSwuMDE1MzQzMDEwNzY4ODY1MTQ0XSxbLjc5MzY1NzI5NDc2MjE5MzMsLjAxNDg3MzEyMjYwMjE0NzMxNF0sWy44MDgyOTE3NTc1MDc5MTM3LC4wMTQzOTQzNDUwMDQxNjY4NDddLFsuODIyNDQzMTE2OTU1NjQzOSwuMDEzOTA2OTY0MTMyOTUxOTg1XSxbLjgzNjEwMjkxNTA2MDkwNjgsLjAxMzQxMTI3MTI4ODYxNjMzM10sWy44NDkyNjI5ODc1Nzc5Njg5LC4wMTI5MDc1NjI3MzkyNjczNDhdLFsuODYxOTE1NDY4OTM5NTQ4NSwuMDEyMzk2MTM5NTQzOTUwOTIzXSxbLjg3NDA1Mjc5Njk1ODAzMTgsLjAxMTg3NzMwNzM3Mjc0MDI4XSxbLjg4NTY2NzcxNzM0NTM5NzIsLjAxMTM1MTM3NjMyNDA4MDQxN10sWy44OTY3NTMyODgwNDkxNTgyLC4wMTA4MTg2NjA3Mzk1MDMwNzZdLFsuOTA3MzAyODgzNDAxNzU2OCwuMDEwMjc5NDc5MDE1ODMyMTU4XSxbLjkxNzMxMDE5ODA4MDk2MDUsLjAwOTczNDE1MzQxNTAwNjgwNl0sWy45MjY3NjkyNTA4Nzg5NDc4LC4wMDkxODMwMDk4NzE2NjA4NzRdLFsuOTM1Njc0Mzg4Mjc3OTE2NCwuMDA4NjI2Mzc3Nzk4NjE2NzVdLFsuOTQ0MDIwMjg3ODMwMjIwMiwuMDA4MDY0NTg5ODkwNDg2MDU5XSxbLjk1MTgwMTk2MTM0MTI2NDQsLjAwNzQ5Nzk4MTkyNTYzNDcyODVdLFsuOTU5MDE0NzU3ODUzNjk5OSwuMDA2OTI2ODkyNTY2ODk4ODE0XSxbLjk2NTY1NDM2NjQzMTk2NTIsLjAwNjM1MTY2MzE2MTcwNzE4OV0sWy45NzE3MTY4MTg3NDcxMzY2LC4wMDU3NzI2Mzc1NDI4NjU2OThdLFsuOTc3MTk4NDkxNDYzOTA3NCwuMDA1MTkwMTYxODMyNjc2MzNdLFsuOTgyMDk2MTA4NDM1NzE4NSwuMDA0NjA0NTg0MjU2NzAyOTU1XSxbLjk4NjQwNjc0MjcyNDU4NjIsLjAwNDAxNjI1NDk4MzczODY0Ml0sWy45OTAxMjc4MTg0OTE3MzQ0LC4wMDM0MjU1MjYwNDA5MTAyMTU3XSxbLjk5MzI1NzExMjkwMDIxMjksLjAwMjgzMjc1MTQ3MTQ1Nzk5
1MTJdLFsuOTk1NzkyNzU4NTM0OTgxMiwuMDAyMjM4Mjg4NDMwOTYyNjE4Nl0sWy45OTc3MzMyNDg2MjU1MTQsLjAwMTY0MjUwMzAxODY2OTAyOTRdLFsuOTk5MDc3NDU5OTc3Mzc1OCwuMDAxMDQ1ODEyNjc5MzQwMzQ4OV0sWy45OTk4MjQ4ODc5NDcxMzE5LC4wMDA0NDkzODA5NjAyOTIwOTAzNV1dO2Z1bmN0aW9uIHVyKHQsZSxzLG4pe2NvbnN0IGk9LjUqKG4tcykscj1zK2ksbz1uZXcgZnQoMCk7Zm9yKGxldCBhPTAsaD1NYXRoLnRydW5jKHQvMik7YTxoOysrYSl7bGV0IHMsbjtzd2l0Y2godCl7Y2FzZSA0OnM9bnJbYV1bMF0sbj1uclthXVsxXTticmVhaztjYXNlIDg6cz1pclthXVswXSxuPWlyW2FdWzFdO2JyZWFrO2Nhc2UgMTY6cz1yclthXVswXSxuPXJyW2FdWzFdO2JyZWFrO2Nhc2UgMzI6cz1vclthXVswXSxuPW9yW2FdWzFdO2JyZWFrO2Nhc2UgNjQ6cz1hclthXVswXSxuPWFyW2FdWzFdO2JyZWFrO2Nhc2UgMTI4OnM9aHJbYV1bMF0sbj1oclthXVsxXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIlF1YWRyYXR1cmVfaW50ZWdyYWw6IGludmFsaWQgblwiKX1jb25zdCBoPW9lKC1pLHMsciksdT1vZShpLHMscik7by5wZShlKGgpKm4pLG8ucGUoZSh1KSpuKX1yZXR1cm4gby5nZXRSZXN1bHQoKSppfWNsYXNzIG1yIGV4dGVuZHMgVXN7Y29uc3RydWN0b3IodCl7dD90LnZkPyhzdXBlcih7dmQ6dC52ZCxiUG9seWdvbjohMH0pLHRoaXMubV9zZWdtZW50QnVmZmVyQ1Rvcj1QbSk6dC5jb3B5PyhzdXBlcih7dmQ6dC5jb3B5LmdldERlc2NyaXB0aW9uKCksYlBvbHlnb246ITB9KSx0aGlzLm1fc2VnbWVudEJ1ZmZlckNUb3I9UG0sdC5jb3B5LmNvcHlUbyh0aGlzKSk6dC5tb3ZlPyhzdXBlcih7bW92ZTp0Lm1vdmV9KSx0aGlzLm1fc2VnbWVudEJ1ZmZlckNUb3I9UG0pOnQuZW52ZWxvcGU/YShcImVudmVsb3BlIGNvbnN0cnVjdG9yIG5vdCBpbXBsXCIpOmgoXCJiYWQgYXJnIHRvIHBvbHlnb24gY29uc3RydWN0b3JcIik6KHN1cGVyKHtiUG9seWdvbjohMH0pLHRoaXMubV9zZWdtZW50QnVmZmVyQ1Rvcj1QbSl9YXNzaWduTW92ZSh0KXtyZXR1cm4gdC5jb3B5VG8odGhpcyksdGhpc31hc3NpZ25Db3B5KHQpe3JldHVybiB0LmNvcHlUbyh0aGlzKSx0aGlzfWdldEJvdW5kYXJ5KCl7cmV0dXJuICRzKHRoaXMpfWdldEV4dGVyaW9yUmluZ0NvdW50KCl7cmV0dXJuIHRoaXMuZ2V0T0dDUG9seWdvbkNvdW50KCl9Z2V0R2VvbWV0cnlUeXBlKCl7cmV0dXJuIG1yLnR5cGV9Z2V0RGltZW5zaW9uKCl7cmV0dXJuIDJ9Y3JlYXRlSW5zdGFuY2UoKXtyZXR1cm4gbmV3IG1yKHt2ZDp0aGlzLmdldERlc2NyaXB0aW9uKCl9KX1lcXVhbHModCxlKXtyZXR1cm4gdGhpcy5lcXVhbHNCYXNlKHQsZSl9fWZ1bmN0aW9uIGxyKHQscyl7bGV0IG4scj1zLG89bnVsbDtzd2l0Y2gocnx8KG89cCh0KT9xKCk6UCgpLHI9byksdCl7Y2FzZSBpLmVudW1Qb2ludDpuPW5ldyBGKHt2ZDpyfSk7YnJlYWs7Y2FzZSBpLmVudW1MaW5lOm49bmV3IGZtKHt2ZDpyfSk7YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6bj1uZXcgcmEoe3ZkOnJ9KTticmVhaztjYXNlIGkuZW51bUVsbGlwdGljQXJjOm49bmV3IHFoKHt2ZDpyfSk7YnJlYWs7Y2FzZSBpLmVudW1SYXRpb25hbEJlemllcjI6bj1uZXcgRG4oe3ZkOnJ9KTticmVhaztjYXNlIGkuZW51bUJlemllcjI6bj1uZXcgQW4oe3ZkOnJ9KTticmVhaztjYXNlIGkuZW51bUVudmVsb3BlOm49bmV3IEkoe3ZkOnJ9KTticmVhaztjYXNlIGkuZW51bU11bHRpUG9pbnQ6bj1uZXcgRGUoe3ZkOnJ9KTticmVhaztjYXNlIGkuZW51bVBvbHlsaW5lOm49bmV3IFFzKHt2ZDpyfSk7YnJlYWs7Y2FzZSBpLmVudW1Qb2x5Z29uOm49bmV3IG1yKHt2ZDpyfSk7YnJlYWs7Y2FzZSBpLmVudW1NdWx0aXBhdGNoOmEoXCJtdWx0aXBhdGNoIG5vdCBpbXBsXCIpO2JyZWFrO2Nhc2UgaS5lbnVtR2VvbWV0cnlDb2xsZWN0aW9uOm49bmV3IGNzKHt2ZDpyfSk7YnJlYWs7ZGVmYXVsdDplKFwiR2VvbWV0cnkuY3JlYXRlXCIpfXJldHVybiBufW1yLnR5cGU9aS5lbnVtUG9seWdvbjt2YXIgY3I9Yjtjb25zdCBncj0tMSxkcj0xO2NsYXNzIF9ye2NvbnN0cnVjdG9yKHQpe3RoaXMubV9zaGFwZT10fXVzZXJTb3J0KHQsZSxzKXt0aGlzLm1fc2hhcGUuc29ydFZlcnRpY2VzU2ltcGxlQnlZSGVscGVyKHMsdCxlKX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5tX3NoYXBlLmdldFkodCl9fWZ1bmN0aW9uIHByKHQpe3JldHVybiB2b2lkIDAhPT10LnBhcmVudH1jbGFzcyBmcntjb25zdHJ1Y3Rvcih0KXtwcih0KT8odGhpcy5tX3BhcmVudD10LnBhcmVudCx0aGlzLm1fZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzLm1fcGF0aD10LnBhdGgsdGhpcy5tX3ZlcnRleD10LnZlcnRleCx0aGlzLm1fZmlyc3RWZXJ0ZXg9dC5maXJzdFZlcnRleCx0aGlzLm1faW5kZXg9dC5zZWxlY3Rpb24/MDp0LmluZGV4LHRoaXMubV9iU2tpcE11bHRpUG9pbnRzPXQuYlNraXBNdWx0aVBvaW50cyx0aGlzLm1fc2VsZWN0aW9uPXQuc2VsZWN0aW9uLHRoaXMubV9iT25lR2VvbT10LmJPbmVHZW9tLHRoaXMubV9iRmlyc3Q9ITApOih0aGlzLm1fcGFyZW50PXQuY29weS5tX3BhcmVudCx0aGlzLm1fZ2VvbWV0cnk9dC5jb3B5Lm1fZ2VvbWV0cnksdGhpcy5tX3BhdGg9dC5jb3B5Lm1fcGF0aCx0aGlzLm1fdmVydGV4PXQuY29weS5tX3ZlcnRleCx0aGlzLm1faW5kZXg9dC5jb3B5Lm1faW5kZXgsdGhpcy5tX2JTa2lwTXVsdGlQb2ludHM9dC5jb3B5Lm1fYlNraXBNdWx0aVBvaW50cyx0aGlzLm1fZmlyc3RWZXJ0ZXg9dC5jb3B5Lm1fZmlyc3RWZXJ0ZXgsdGhpcy5tX2JGaXJzdD0hMCx0aGlzLm1fc2VsZWN0aW9uPXQuY29weS5tX3NlbGVjdGlvbix0aGlzLm1fYk9uZUdlb209dC5jb3B5Lm1fYk9uZUdlb20pfW1vdmVUb05leHRIZWxwZXIoKXtmb3IodGhpcy5tX3BhdGg9dGhpcy5tX3BhcmVudC5nZXROZXh0UGF0aCh0aGlzLm1fcGF0aCksdGhpcy5tX2luZGV4PTA7dGhpcy5tX2dlb21ldHJ5IT09Z3I7KXtmb3IoO3RoaXMubV9wYXRoIT09Z3I7dGhpcy5tX3BhdGg9dGhpcy5tX3BhcmVudC5nZXROZXh0UGF0aCh0aGlzLm1fcGF0aCkpaWYodGhpcy5tX3ZlcnRleD10aGlzLm1fcGFyZW50LmdldEZpcnN0VmVydGV4KHRoaXMubV9wYXRoKSx0aGlzLm1fZmlyc3RWZXJ0ZXg9dGhpcy5tX3ZlcnRleCx0aGlzLm1fdmVydGV4IT09Z3IpcmV0dXJuIHRoaXMubV92ZXJ0ZXg7aWYodGhpcy5tX2JPbmVHZW9tKXJldHVybi
1BncjtpZih0aGlzLm1fZ2VvbWV0cnk9dGhpcy5tX3BhcmVudC5nZXROZXh0R2VvbWV0cnkodGhpcy5tX2dlb21ldHJ5KSx0aGlzLm1fZ2VvbWV0cnk9PT1ncilicmVhazt0aGlzLm1fYlNraXBNdWx0aVBvaW50cyYmIWModGhpcy5tX3BhcmVudC5nZXRHZW9tZXRyeVR5cGUodGhpcy5tX2dlb21ldHJ5KSl8fCh0aGlzLm1fcGF0aD10aGlzLm1fcGFyZW50LmdldEZpcnN0UGF0aCh0aGlzLm1fZ2VvbWV0cnkpKX1yZXR1cm4gZ3J9bmV4dFNlbGVjdGlvbigpe2Zvcig7dGhpcy5tX2luZGV4PHRoaXMubV9wYXJlbnQubV9zZWxlY3RlZFZlcnRpY2VzLmxlbmd0aDspe2NvbnN0IHQ9dGhpcy5tX3BhcmVudC5tX3NlbGVjdGVkVmVydGljZXNbdGhpcy5tX2luZGV4KytdO2lmKHQhPT1nciYmKHRoaXMubV9wYXRoPXRoaXMubV9wYXJlbnQuZ2V0UGF0aEZyb21WZXJ0ZXgodCksIXRoaXMubV9iT25lR2VvbXx8dGhpcy5tX2dlb21ldHJ5PT09dGhpcy5tX3BhcmVudC5nZXRHZW9tZXRyeUZyb21QYXRoKHRoaXMubV9wYXRoKSkpcmV0dXJuIHRoaXMubV9nZW9tZXRyeT10aGlzLm1fcGFyZW50LmdldEdlb21ldHJ5RnJvbVBhdGgodGhpcy5tX3BhdGgpLHR9cmV0dXJuIGdyfW5leHQoKXtyZXR1cm4gdGhpcy5tX3NlbGVjdGlvbj90aGlzLm5leHRTZWxlY3Rpb24oKTp0aGlzLm1fYkZpcnN0Pyh0aGlzLm1fYkZpcnN0PSExLHRoaXMubV92ZXJ0ZXgpOnRoaXMubV92ZXJ0ZXghPT1ncj8odGhpcy5tX3ZlcnRleD10aGlzLm1fcGFyZW50LmdldE5leHRWZXJ0ZXgodGhpcy5tX3ZlcnRleCksdGhpcy5tX2luZGV4KyssdGhpcy5tX3ZlcnRleCE9PWdyJiZ0aGlzLm1fdmVydGV4IT09dGhpcy5tX2ZpcnN0VmVydGV4P3RoaXMubV92ZXJ0ZXg6dGhpcy5tb3ZlVG9OZXh0SGVscGVyKCkpOmdyfWN1cnJlbnRHZW9tZXRyeSgpe3JldHVybiB0aGlzLm1fZ2VvbWV0cnl9Y3VycmVudFBhdGgoKXtyZXR1cm4gdGhpcy5tX3BhdGh9c3RhdGljIGNyZWF0ZV8odCxlLHMsbixpLHIsbyxhLGgpe3JldHVybiBuZXcgZnIoe3BhcmVudDp0LGdlb21ldHJ5OmUscGF0aDpzLHZlcnRleDpuLGZpcnN0VmVydGV4OmksaW5kZXg6cixiU2tpcE11bHRpUG9pbnRzOm8sc2VsZWN0aW9uOmEsYk9uZUdlb206aH0pfX1jbGFzcyBQcntjb25zdHJ1Y3Rvcih0KXt0aGlzLnBhcmVudGFnZT10fWVxdWFscyh0KXtyZXR1cm4gdGhpcy5wYXJlbnRhZ2U9PT10LnBhcmVudGFnZX19Y2xhc3MgeXJ7c2V0UHJldlBhdGgodCxlKXt0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZCh0LDEsZSl9c2V0TmV4dFBhdGgodCxlKXt0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZCh0LDIsZSl9c2V0UGF0aEZsYWdzKHQsZSl7dGhpcy5tX3BhdGhJbmRleExpc3Quc2V0RmllbGQodCw2LGUpfWdldFBhdGhGbGFncyh0KXtyZXR1cm4gdGhpcy5tX3BhdGhJbmRleExpc3QuZ2V0RmllbGQodCw2KX1zZXRQYXRoR2VvbWV0cnkodCxlKXt0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZCh0LDcsZSl9Z2V0UGF0aEluZGV4KHQpe3JldHVybiB0aGlzLm1fcGF0aEluZGV4TGlzdC5nZXRGaWVsZCh0LDApfXNldE5leHRHZW9tZXRyeSh0LGUpe3RoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZCh0LDEsZSl9c2V0UHJldkdlb21ldHJ5KHQsZSl7dGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKHQsMCxlKX1nZXRHZW9tZXRyeUluZGV4KHQpe3JldHVybiB0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3QuZ2V0RmllbGQodCw3KX1zZXRGaXJzdFBhdGgodCxlKXt0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3Quc2V0RmllbGQodCwzLGUpfXNldExhc3RQYXRoKHQsZSl7dGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKHQsNCxlKX1uZXdHZW9tZXRyeSh0KXtjb25zdCBlPXRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5uZXdFbGVtZW50KCk7cmV0dXJuIHRoaXMubV9
1nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZChlLDIsdCksdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKGUsNSwwKSx0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3Quc2V0RmllbGQoZSw2LDApLHRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZChlLDcsdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LmVsZW1lbnRUb0luZGV4KGUpKSxlfWZyZWVHZW9tZXRyeSh0KXt0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3QuZGVsZXRlRWxlbWVudCh0KX1uZXdQYXRoKHQpe2NvbnN0IGU9dGhpcy5tX3BhdGhJbmRleExpc3QubmV3RWxlbWVudCgpLHM9dGhpcy5tX3BhdGhJbmRleExpc3QuZWxlbWVudFRvSW5kZXgoZSk7aWYodGhpcy5tX3BhdGhJbmRleExpc3Quc2V0RmllbGQoZSwwLHMpLHRoaXMubV9wYXRoSW5kZXhMaXN0LnNldEZpZWxkKGUsMywwKSx0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZChlLDYsMCksdGhpcy5zZXRQYXRoR2VvbWV0cnkoZSx0KSxzPj10aGlzLm1fcGF0aEFyZWFzLmxlbmd0aCl7Y29uc3QgdD1NYXRoLnRydW5jKHM8MTY/MTY6MypzLzIpO3RoaXMubV9wYXRoQXJlYXMubGVuZ3RoPXQsdGhpcy5tX3BhdGhMZW5ndGhzLmxlbmd0aD10fXJldHVybiB0aGlzLm1fcGF0aEFyZWFzW3NdPTAsdGhpcy5tX3BhdGhMZW5ndGhzW3NdPTAsdGhpcy5tX3BhdGhDb3VudCsrLGV9ZnJlZVBhdGgodCl7dGhpcy5tX3BhdGhJbmRleExpc3QuZGVsZXRlRWxlbWVudCh0KSx0aGlzLm1fcGF0aENvdW50LS19bmV3VmVydGV4KHQpe2NvbnN0IGU9dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5uZXdFbGVtZW50KCkscz10Pj0wP3Q6dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5lbGVtZW50VG9JbmRleChlKTtpZih0aGlzLm1fdmVydGV4SW5kZXhMaXN0LnNldEZpZWxkKGUsMCxzKSx0PDApe2lmKHM+PXRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkpe2NvbnN0IHQ9TWF0aC50cnVuYyhzPDE2PzE2OjMqcy8yKTt0aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodCksdGhpcy5tX3ZlcnRpY2VzLnJlc2l6ZU5vSW5pdCh0KSxudWxsIT09dGhpcy5tX3NlZ21lbnRzJiYodGhpcy5tX3NlZ21lbnRzLmxlbmd0aD10KSx0aGlzLm1feHlTdHJlYW09dGhpcy5tX3ZlcnRpY2VzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKX10aGlzLm1fc2VnbWVudHMmJih0aGlzLm1fc2VnbWVudHNbc109bnVsbCl9cmV0dXJuIHRoaXMubV9wb2ludENvdW50KyssZX1mcmVlVmVydGV4KHQpe3RoaXMudW5zZWxlY3QodCk7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO3RoaXMubV92ZXJ0ZXhJbmRleExpc3QuZGVsZXRlRWxlbWVudCh0KSx0aGlzLm1fcG9pbnRDb3VudC0tO2ZvcihsZXQgcz0wLG49dGhpcy5tX2luZGljZXMubGVuZ3RoO3M8bjtzKyspe2lmKHM9PT10aGlzLm1fc2VsZWN0aW9uSW5kZXgpY29udGludWU7Y29uc3QgdD10aGlzLm1faW5kaWNlc1tzXTtudWxsIT09dCYmdC5zaXplKCk+ZSYmdC53cml0ZShlLC0xKX10aGlzLm1fd2VpZ2h0cyYmdGhpcy5tX3dlaWdodHMuc2l6ZSgpPmUmJnRoaXMubV93ZWlnaHRzLndyaXRlKGUsMSksdGhpcy5tX3JhbmtzJiZ0aGlzLm1fcmFua3Muc2l6ZSgpPmUmJnRoaXMubV9yYW5rcy53cml0ZShlLGRyKSx0aGlzLm1fc2VnbWVudFdlaWdodHMmJnRoaXMubV9zZWdtZW50V2VpZ2h0cy5zaXplKCk+ZSYmdGhpcy5tX3NlZ21lbnRXZWlnaHRzLndyaXRlKGUsMSksdGhpcy5tX3NlZ21lbnRSYW5rcyYmdGhpcy5tX3NlZ21lbnRSYW5rcy5zaXplKCk+ZSYmdGhpcy5tX3NlZ21lbnRSYW5rcy53cml0ZShlLGRyKSx0aGlzLm1fc2VnbWVudHMmJnRoaXMuc2V0U2VnbWVudFRvSW5kZXgoZSxudWxsKX1pbnNlcnRWZXJ0ZXhfKHQsZSxzLG4pe3RoaXMubV9oYXNGb3JjZVNldEVudmVsb3BlPTA7Y29uc3QgaT1lIT09Z3I/dGhpcy5nZXRQcmV2VmVydGV4KGUpOnRoaXMuZ2V0TGFzdFZlcnRleCh0KSxyPWkhPT1ncj90aGlzLmdldE5leHRWZXJ0ZXgoaSk6Z3Isbz10aGlzLm5ld1ZlcnRleChudWxsPT09cz90aGlzLm1fcG9pbnRDb3VudDotMSksYT10aGlzLmdldFZlcnRleEluZGV4KG8pO251bGwhPT1zJiZ0aGlzLm1fdmVydGljZXMuc2V0UG9pbnRCeVZhbE5vQ3VydmVzKGEscyksdGhpcy5zZXRQYXRoVG9WZXJ0ZXgobyx0KSx0aGlzLnNldE5leHRWZXJ0ZXgobyxyKSx0aGlzLnNldFByZXZWZXJ0ZXgobyxpKSxyIT09Z3ImJnRoaXMuc2V0UHJldlZlcnRleChyLG8pLGkhPT1nciYmdGhpcy5zZXROZXh0VmVydGV4KGksbyk7Y29uc3QgaD10aGlzLmlzQ2xvc2VkUGF0aCh0KSx1PXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgodCk7ZT09PWdyJiZ0aGlzLnNldExhc3RWZXJ0ZXgodCxvKSxlPT09dSYmKGgmJm4mJnUhPT1ncnx8dGhpcy5zZXRGaXJzdFZlcnRleCh0LG8pKSxoJiZyPT09Z3ImJih0aGlzLnNldE5leHRWZXJ0ZXgobyxvKSx0aGlzLnNldFByZXZWZXJ0ZXgobyxvKSksdGhpcy5zZXRQYXRoU2l6ZSh0LHRoaXMuZ2V0UGF0aFNpemUodCkrMSk7Y29uc3QgbT10aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgodCk7cmV0dXJuIHRoaXMuc2V0R2VvbWV0cnlWZXJ0ZXhDb3VudChtLHRoaXMuZ2V0UG9pbnRDb3VudChtKSsxKSxvfWdldEhlbHBlclBvaW50KCl7cmV0dXJuIHRoaXMubV9oZWxwZXJQb2ludHx8KHRoaXMubV9oZWxwZXJQb2ludD1uZXcgRih7dmQ6dGhpcy5tX3ZlcnRpY2VzLmdldERlc2NyaXB0aW9uKCl9KSx0aGlzLm1faGVscGVyUG9pbnQuc2V0WFlDb29yZHMoMCwwKSksdGhpcy5tX2hlbHBlclBvaW50fWFkZE11bHRpUG9pbnQodCxlKXtjb25zdCBzPXRoaXMuY3JlYXRlR2VvbWV0cnkodC5nZXRHZW9tZXRyeVR5cGUoKSx0LmdldERlc2NyaXB0aW9uKCkpO3JldHVybiB0aGlzLmFwcGVuZE11bHRpUG9pbnQocyx0LGUpLHN9YWRkUG9pbnRfKHQsZSl7Y29uc3Qgcz10aGlzLmNyZWF0ZUdlb21ldHJ5KGkuZW51bU11bHRpUG9pbnQsdC5nZXREZXNjcmlwdGlvbigpKTtyZXR1cm4gdGhpcy5hcHBlbmRQb2ludChzLHQsZSksc31hcHBlbmRNdWx0aVBhdGhfKHQsZSl7aWYoZS5pc0VtcHR5KCkpcmV0dXJuO2NvbnN0IHM9ZS5nZXRJbXBsKCk7dGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkrcy5nZXRQb2ludENvdW50KCkpLHRoaXMubV92ZXJ0aWNlc01wLmFkZFBvaW50cyhlLDAscy5nZXRQb2ludENvdW50KCkpLHRoaXMubV94eVN0cmVhbT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApO2NvbnN0IG49bnVsbCE9PXR
1oaXMubV9zZWdtZW50c3x8bnVsbCE9PXMuZ2V0U2VnbWVudEZsYWdzU3RyZWFtUmVmKCk7dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zZXRDYXBhY2l0eSh0aGlzLm1fdmVydGV4SW5kZXhMaXN0LnNpemUoKStzLmdldFBvaW50Q291bnQoKSksdGhpcy5tX3BhdGhJbmRleExpc3Quc2V0Q2FwYWNpdHkodGhpcy5tX3BhdGhJbmRleExpc3Quc2l6ZSgpK3MuZ2V0UGF0aENvdW50KCkpO2ZvcihsZXQgaT0wLHI9cy5nZXRQYXRoQ291bnQoKTtpPHI7aSsrKXtpZigwPT09cy5nZXRQYXRoU2l6ZShpKSljb250aW51ZTtjb25zdCBlPXRoaXMuaW5zZXJ0UGF0aCh0LGdyKTt0aGlzLnNldENsb3NlZFBhdGgoZSxzLmlzQ2xvc2VkUGF0aChpKSk7Zm9yKGxldCB0PXMuZ2V0UGF0aFN0YXJ0KGkpLHI9cy5nZXRQYXRoRW5kKGkpO3Q8cjt0Kyspe2NvbnN0IGk9dGhpcy5pbnNlcnRWZXJ0ZXhfKGUsZ3IsbnVsbCwhMSk7aWYobil7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KGkpO2lmKDEmcy5nZXRTZWdtZW50RmxhZ3ModCkpdGhpcy5zZXRTZWdtZW50VG9JbmRleChlLG51bGwpO2Vsc2V7Y29uc3Qgbj1uZXcgUG07cy5xdWVyeVNlZ21lbnQodCxuLCEwKSx0aGlzLnNldFNlZ21lbnRUb0luZGV4KGUsbi5yZWxlYXNlU2VnbWVudCgpKX19fXMuaXNTdHJvbmdQYXRoU3RhcnQoaSkmJnRoaXMuc2V0U3Ryb25nUGF0aFN0YXJ0KGUsITApLHMuaXNTdHJvbmdQYXRoRW5kKGkpJiZ0aGlzLnNldFN0cm9uZ1BhdGhFbmQoZSwhMCl9fWFkZE11bHRpUGF0aCh0LGUpe2NvbnN0IHM9dGhpcy5jcmVhdGVHZW9tZXRyeSh0LmdldEdlb21ldHJ5VHlwZSgpLHQuZ2V0RGVzY3JpcHRpb24oKSk7cmV0dXJuIHQuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1Qb2x5Z29uJiZ0aGlzLnNldEZpbGxSdWxlKHMsdC5nZXRGaWxsUnVsZSgpKSx0aGlzLmFwcGVuZE11bHRpUGF0aChzLHQsZSksc31hcHBlbmRNdWx0aVBhdGhQb2x5bGluZSh0LGUscyl7Y29uc3Qgbj1lLmdldEltcGwoKSxpPW51bGwhPT10aGlzLm1fc2VnbWVudHN8fG51bGwhPT1uLmdldFNlZ21lbnRGbGFnc1N0cmVhbVJlZigpLHI9bmV3IGxlO2UucXVlcnlFbnZlbG9wZShyKTt7Y29uc3Qgcj1zLmNsb25lKCk7bGV0IG89bi5nZXRQb2ludENvdW50KCk7Y29uc3QgYT1uLmdldEFjY2VsZXJhdG9ycygpO2lmKGEmJmEuZ2V0UXVhZFRyZWUoKSl7bz1hLmdldFF1YWRUcmVlKCkuZ2V0SW50ZXJzZWN0aW9uQ291bnQociwwLG4uZ2V0UG9pbnRDb3VudCgpKzEpfWlmKG88ZS5nZXRQb2ludENvdW50KCkpe2lmKDA9PT1vKXJldHVybjtjb25zdCBzPW4ucXVlcnlMaW1pdGVkU2VnbWVudEl0ZXJhdG9yKHIpO2xldCBhPS0xLGg9LTEwMCx1PS0xLG09MCxsPS0xLGM9Z3IsZz0hMSxkPXMubmV4dFNlZ21lbnQoKTtpZihudWxsIT09ZClmb3IoOztkPXMubmV4dFNlZ21lbnQoKSl7bGV0IHI9bnVsbD09PWQ7Y29uc3Qgbz1udWxsIT09ZD9zLmdldFBhdGhJbmRleCgpOmEsXz1udWxsIT09ZD9zLmdldFN0YXJ0UG9pbnRJbmRleCgpOmg7aWYocnx8KGE9PT1vJiZoKzE9PT1fP20rKzpyPSEwKSxyKXtpZigtMSE9PWwpe2xldCB0PS0xLHM9LTE7aWYobT09PXUpe3RoaXMuc2V0Q2xvc2VkUGF0aChjLGcpO2NvbnN0IGk9bi5nZXRQYXRoRW5kKGEpO3RoaXMubV92ZXJ0aWNlcy5yZXNlcnZlUm91bmRlZCh0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpK2ktbCksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsbCxpKSxzPW4uZ2V0UGF0aFNpemUoYSksdD1pLTF9ZWxzZSBpZighZ3x8aCsxPG4uZ2V0UGF0aEVuZChhKSl0aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKStoKzItbCksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsbCxoKzIpLHM9aC1sKzIsdD1oO2Vsc2V7dGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkraCsyLWwpLHRoaXMubV92ZXJ0aWNlc01wPy5hZGRQb2ludHMoZSxsLGgrMSksdD1oLHM9aC1sKzE7Y29uc3QgaT1uLmdldFBhdGhTdGFydChhKTt0aGlzLm1fdmVydGljZXNNcC5hZGRQb2ludHMoZSxpLGkrMSkscys9MX10aGlzLm1feHlTdHJlYW09dGhpcy5tX3ZlcnRpY2VzLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKTtmb3IobGV0IGU9MCxyPWw7ZTxzO2UrKyxyKyspe2NvbnN0IGU9dGhpcy5pbnNlcnRWZXJ0ZXhfKGMsZ3IsbnVsbCwhMSk7aWYoaSl7Y29uc3Qgcz10aGlzLmdldFZlcnRleEluZGV4KGUpO2lmKDEmbi5nZXRTZWdtZW50RmxhZ3Mocil8fHI+dCl0aGlzLnNldFNlZ21lbnRUb0luZGV4KHMsbnVsbCk7ZWxzZXtjb25zdCB0PW5ldyBQbTtuLmdldFNlZ21lbnRCdWZmZXIocix0LCEwKSx0aGlzLnNldFNlZ21lbnRUb0luZGV4KHMsdC5yZWxlYXNlU2VnbWVudCgpKX19fX1pZihudWxsPT09ZClicmVhazttPTEsbD1fLGEhPT1vPyhjPXRoaXMuaW5zZXJ0UGF0aCh0LGdyKSx0aGlzLnNldENsb3NlZFBhdGgoYywhMSksdT1uLmdldFNlZ21lbnRDb3VudFBhdGgobyksZz1uLmlzQ2xvc2VkUGF0aChvKSxhPW8pOmM9dGhpcy5pbnNlcnRQYXRoKHQsZ3IpfWg9X31yZXR1cm59fXRoaXMuYXBwZW5kTXVsdGlQYXRoXyh0LGUpfWFwcGVuZE11bHRpUGF0aFBvbHlnb24odCxlLG4pe2NvbnN0IGk9ZS5nZXRJbXBsKCkscj1udWxsIT09dGhpcy5tX3NlZ21lbnRzfHxudWxsIT09aS5nZXRTZWdtZW50RmxhZ3NTdHJlYW1SZWYoKSxvPWxlLmNvbnN0cnVjdEVtcHR5KCk7ZS5xdWVyeUVudmVsb3BlKG8pLHMobi5pc0ludGVyc2VjdGluZyhvKSYmIW4uY29udGFpbnNFbnZlbG9wZShvKSk7bGV0IGE9bGUuY29uc3RydWN0KE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxuLnltaW4sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG4ueW1heCksaD1sZS5jb25zdHJ1Y3Qobi54bWluLE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxuLnhtYXgsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtjb25zdCB1PWkuZ2V0QWNjZWxlcmF0b3JzKCk7aWYodSYmdS5nZXRRdWFkVHJlZSgpKXtjb25zdCB0PXUuZ2V0UXVhZFRyZWUoKSxlPXQuZ2V0SW50ZXJzZWN0aW9uQ291bnQoYSwwLDApO2U+dC5nZXRJbnRlcnNlY3Rpb25Db3VudChoLDAsZSsxKSYmKGg9c3QoYSxhPWgpKX1lbHNlIGEuaGVpZ2h0KCk+aC53aWR0aCgpJiYoaD1zdChhLGE9aCkpO2NvbnN0IG09W10sbD1pLnF1ZXJ5TGltaXRlZFNlZ21lbnRJdGVyYXRvcihhKTtsZXQgYz0tMSxnPS0xMDAsZD0tMSxfPTAscD0tMSxmPS0xLFA9Z3IseT0hMCx4PWwubmV4dFNlZ21lbnQoKTtpZihudWxsIT09eClmb3IoOzt4PWwubmV4dFNlZ21lbnQoKSl7bGV0IG49bnVsbD09PXg7Y29uc3Qgbz1udWxsIT09eD9sLmdldFBhdGhJbmRleCgpOmMsYT1udWxsIT09eD9sLmdldFN0YXJ0UG9pbnRJbmRleCgpOmc7aWYobnx8KG89PT1jP2crMT09PWE/XysrOm49ITA6KG49Yz49MCxjPDAmJihjPW8sZD1pLmdldFNlZ21lbnRDb3VudFBhdGgoYykscD1hLFA9Z3IsXz0xKSkpLG4pe2lmKCEoMD09PW0ubGVuZ3RoJiZkPT09XykpezAhPT1tLmxlbmd0aCYmbVswXS5maXJzdD09PXB8fCh0aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKSsxKSx0aGlzLm1fdmVydGljZXNNcC5hZGRQb2ludHMoZSxwLHArMSksLTE9PT1mJiYoZj1wKSxQPT09Z3ImJihQPXRoaXMuaW5zZXJ0UGF0aCh0LGdyKSx0aGlzLnNldENsb3NlZFBhdGgoUCwhMCkpLHRoaXMubV94eVN0cmVhbT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApLHRoaXMuaW5zZXJ0VmVydGV4XyhQLGdyLG51bGwsITEpKTtmb3IoY29uc3R7Zmlyc3Q6bixzZWNvbmQ6b31vZiBtKXstMT09PWYmJihmPW4pO2xldCBhPS0xLGg9LTE7Y29uc3QgdT1uK28tMTtpZihvPT09ZCl7Y29uc3QgdD11KzE7aD10LW4sdGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkraCksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsbix0KSxhPXUscygxPT09bS5sZW5ndGgpfWVsc2UgaWYodSsxPGkuZ2V0UGF0aEVuZChjKSl7Y29uc3QgdD11KzI7aD10LW4sdGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkraCksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsbix0KSxhPXV9ZWxzZXtjb25zdCB0PWkuZ2V0UGF0aFN0YXJ0KGMpLHM9dCE9PWY/MTowLHI9dSsxO2g9ci1uK3MsdGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkrKHItbikrcyksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsbixyKSxhPXUscz4wJiZ0aGlzLm1fdmVydGljZXNNcD8uYWRkUG9pbnRzKGUsdCx0KzEpf
1XRoaXMubV94eVN0cmVhbT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApLFA9PT1nciYmKFA9dGhpcy5pbnNlcnRQYXRoKHQsZ3IpLHRoaXMuc2V0Q2xvc2VkUGF0aChQLCEwKSk7Zm9yKGxldCB0PTAsZT1uO3Q8aDt0KyssZSsrKXtjb25zdCB0PXRoaXMuaW5zZXJ0VmVydGV4XyhQLGdyLG51bGwsITEpO2lmKHIpe2NvbnN0IHM9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtpZigxJmkuZ2V0U2VnbWVudEZsYWdzKGUpfHxlPmEpdGhpcy5zZXRTZWdtZW50VG9JbmRleChzLG51bGwpO2Vsc2V7Y29uc3QgdD1uZXcgUG07aS5nZXRTZWdtZW50QnVmZmVyKGUsdCwhMCksdGhpcy5zZXRTZWdtZW50VG9JbmRleChzLHQucmVsZWFzZVNlZ21lbnQoKSl9fX19aWYoMD09PW0ubGVuZ3RofHxtLmF0KC0xKS5maXJzdCttLmF0KC0xKS5zZWNvbmQhPT1wK18pe2xldCB0PXArXzt0PT09ZS5nZXRQYXRoRW5kKGMpJiYodD1lLmdldFBhdGhTdGFydChjKSksZiE9PXQmJih0aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKSsxKSx0aGlzLm1fdmVydGljZXNNcC5hZGRQb2ludHMoZSx0LHQrMSksdGhpcy5pbnNlcnRWZXJ0ZXhfKFAsZ3IsbnVsbCwhMSkpfX1tLmxlbmd0aD0wLHk9ITAsbyE9PWMmJihjPW8sZD1pLmdldFNlZ21lbnRDb3VudFBhdGgoYyksUD1ncixmPS0xKSxwPWEsXz0xfWlmKCF4KWJyZWFrO3tjb25zdCB0PWxlLmNvbnN0cnVjdEVtcHR5KCk7eC5xdWVyeUxvb3NlRW52ZWxvcGUodCksaC5pc0ludGVyc2VjdGluZyh0KT8oeT9tLnB1c2goWXQoYSwxKSk6bS5hdCgtMSkuc2Vjb25kKysseT0hMSk6eT0hMH1nPWF9fWFwcGVuZE11bHRpUGF0aCh0LGUscyl7aWYodm9pZCAwPT09cylyZXR1cm4gdm9pZCB0aGlzLmFwcGVuZE11bHRpUGF0aF8odCxlKTtpZihlLmlzRW1wdHkoKSlyZXR1cm47Y29uc3Qgbj1lLmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtUG9seWdvbixyPWxlLmNvbnN0cnVjdEVtcHR5KCk7ZS5xdWVyeUVudmVsb3BlKHIpLHMuaXNJbnRlcnNlY3RpbmcocikmJighcy5jb250YWluc0VudmVsb3BlKHIpJiZlLmdldFBvaW50Q291bnQoKT4xMD9uP3RoaXMuYXBwZW5kTXVsdGlQYXRoUG9seWdvbih0LGUscyk6dGhpcy5hcHBlbmRNdWx0aVBhdGhQb2x5bGluZSh0LGUscyk6dGhpcy5hcHBlbmRNdWx0aVBhdGhfKHQsZSkpfWFwcGVuZFBvaW50KHQsZSxzKXtpZihlLmlzRW1wdHkoKSlyZXR1cm47aWYodm9pZCAwIT09cyYmIXMuY29udGFpbnMoZS5nZXRYWSgpKSlyZXR1cm47dGhpcy5tX3ZlcnRpY2VzLnJlc2VydmVSb3VuZGVkKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCkrMSksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkKGUpLHRoaXMubV94eVN0cmVhbT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApLHRoaXMubV92ZXJ0ZXhJbmRleExpc3Quc2V0Q2FwYWNpdHkodGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zaXplKCkrMSk7Y29uc3Qgbj10aGlzLmluc2VydFBhdGgodCxncik7dGhpcy5pbnNlcnRWZXJ0ZXhfKG4sZ3IsbnVsbCwhMSl9YXBwZW5kTXVsdGlQb2ludF8odCxlKXt0aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKStlLmdldFBvaW50Q291bnQoKSksdGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUsMCxlLmdldFBvaW50Q291bnQoKSksdGhpcy5tX3h5U3RyZWFtPXRoaXMubV92ZXJ0aWNlcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoMCksdGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zZXRDYXBhY2l0eSh0aGlzLm1fdmVydGV4SW5kZXhMaXN0LnNpemUoKStlLmdldFBvaW50Q291bnQoKSk7Y29uc3Qgcz10aGlzLmluc2VydFBhdGgodCxncik7Zm9yKGxldCBuPTAsaT1lLmdldFBvaW50Q291bnQoKTtuPGk7bisrKXRoaXMuaW5zZXJ0VmVydGV4XyhzLGdyLG51bGwsITEpfWFwcGVuZE11bHRpUG9pbnQodCxlLHMpe2lmKHZvaWQgMD09PXMpcmV0dXJuIHZvaWQgdGhpcy5hcHBlbmRNdWx0aVBvaW50Xyh0LGUpO2NvbnN0IG49ZS5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoMCk7bGV0IGk9MDtmb3IobGV0IHU9MCxtPWUuZ2V0UG9pbnRDb3VudCgpO3U8bTt1Kyspe2NvbnN0IHQ9bi5yZWFkUG9pbnQyRCgyKnUpO3MuY29udGFpbnModCkmJmkrK310aGlzLm1fdmVydGljZXMucmVzZXJ2ZVJvdW5kZWQodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKStpKTtsZXQgcj0tMSxvPS0xLGE9MDtmb3IobGV0IHU9MCxtPWUuZ2V0UG9pbnRDb3VudCgpO3U8bTt1Kyspe2NvbnN0IHQ9bi5yZWFkUG9pbnQyRCgyKnUpO3MuY29udGFpbnModCk/KC0xPT09ciYmKHI9dSxvPXUpLG8rKyk6cj49MCYmKHRoaXMubV92ZXJ0aWNlc01wLmFkZFBvaW50cyhlLHIsby1yKSxyPS0xLGErKyl9aWYocj4wJiYodGhpcy5tX3ZlcnRpY2VzTXAuYWRkUG9pbnRzKGUscixvLXIpLGErKyksIWEpcmV0dXJuO3RoaXMubV94eVN0cmVhbT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApLHRoaXMubV92ZXJ0ZXhJbmRleExpc3Quc2V0Q2FwYWNpdHkodGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zaXplKCkraSk7Y29uc3QgaD10aGlzLmluc2VydFBhdGgodCxncik7Zm9yKGxldCB1PTAsbT1lLmdldFBvaW50Q291bnQoKTt1PG07dSsrKXtjb25zdCB0PW4ucmVhZFBvaW50MkQoMip1KTtzLmNvbnRhaW5zKHQpJiZ0aGlzLmluc2VydFZlcnRleF8oaCxncixudWxsLCExKX19c3BsaXRTZWdtZW50Rm9yd2FyZCh0LHMsbixyLG8pe2NvbnN0IGE9dGhpcy5nZXROZXh0VmVydGV4KHQpO2E9PT1nciYmZShcIkVkaXRfc2hhcGUuc3BsaXRfc2VnbWVudF9mb3J3YXJkX1wiKTtjb25zdCBoPXRoaXMuZ2V0SGVscGVyUG9pbnQoKSx1PXRoaXMuZ2V0UGF0aEZyb21WZXJ0ZXgodCk7bGV0IG09dDtjb25zdCBsPXRoaXMuaGFzU2VnbWVudFBhcmVudGFnZSgpO2ZvcihsZXQgZT0wLGM9cy5nZXRSZXN1bHRTZWdtZW50Q291bnQobik7ZTxjO2UrKyl7Y29uc3QgdD10aGlzLmdldFZlcnRleEluZGV4KG0pLHI9dGhpcy5nZXROZXh0VmVydGV4KG0pLGc9cy5nZXRSZXN1bHRTZWdtZW50KG4sZSk7bGV0IGQ9bnVsbDtpZihnLmdldEdlb21ldHJ5VHlwZSgpIT09aS5lbnVtTGluZSYmKGQ9Zy5jbG9uZSgpLGQuZHJvcEFsbEF0dHJpYnV0ZXMoKSksMD09PWUmJihnLnF1ZXJ5U3RhcnQoaCksdGhpcy5zZXRTZWdtZW50VG9JbmRleCh0LG51bGwpLHRoaXMuc2V0UG9pbnRFeChtLGgscy5nZXRSZXN1bHRTZWdtZW50U3RhcnRQb2ludFJhbmsobixlKSxzLmdldFJlc3VsdFNlZ21lbnRTdGFydFBvaW50V2VpZ2h0KG4sZSksbykpLHRoaXMuc2V0U2VnbWVudFJhbmsobSxzLmdldFJlc3VsdFNlZ21lbnRJbnRlcmlvclJhbmsobixlKSksdGhpcy5zZXRTZWdtZW50V2VpZ2h0KG0scy5nZXRSZXN1bHRTZWdtZW50SW50ZXJpb3JXZWlnaHQobixlKSksbCl7Y29uc3QgdD1zLmdldFJlc3VsdFNlZ21lbnRTZWdtZW50UGFyZW50YWdlKG4sZSksaT1zLmdldFJlc3VsdFNlZ21lbnRTdGFydFBvaW50SXNCcmVhayhuLGUpO3RoaXMuc2V0U2VnbWVudFBhcmVudGFnZUFuZEJyZWFrKG0sdCxpKX1pZihnLnF1ZXJ5RW5kKGgpLGU8Yy0xKXt0aGlzLnNldFNlZ21lbnRUb0luZGV4KHQsZCk7Y29uc3QgaT10aGlzLmluc2VydFZlcnRleCh1LHIsaCk7dGhpcy5zZXRXZWlnaHQoaSxzLmdldFJlc3VsdFNlZ21lbnRFbmRQb2ludFdlaWdodChuLGUpKSx0aGlzLnNldFJhbmsoaSxzLmdldFJlc3VsdFNlZ21lbnRFbmRQb2ludFJhbmsobixlKSksdGhpcy5zZWxlY3QoaSksbT1pfWVsc2V7dGhpcy5zZXRQb2ludEV4KGEsaCxzLmdldFJlc3VsdFNlZ21lbnRFbmRQb2ludFJhbmsobixlKSxzLmdldFJlc3VsdFNlZ21lbnRFbmRQb2ludFdlaWdodChuLGUpLG8pO2NvbnN0IGk9cy5nZXRSZXN1bHRTZWdtZW50RW5kUG9pbnRJc0JyZWFrKG4sZSk7dGhpcy5zZXRTZWdtZW50UGFyZW50YWdlQnJlYWtWZXJ0ZXgoYSxpKSx0aGlzLnNldFNlZ21lbnRUb0luZGV4KHQsZCl9fX1zcGxpdFNlZ21lbnRCYWNrd2FyZCh0LHMsbixyLG8pe2NvbnN0IGE9dGhpcy5nZXROZXh0VmVydGV4KHQpO2E9PT1nciYmZShcIkVkaXRfc2hhcGUuc3BsaXRfc2VnbWVudF9iYWNrd2FyZF9cIik7Y29uc3QgaD10aGlzLmdldEhlbHBlclBvaW50KCksdT10aGlzLmdldFBhdGhGcm9tVmVydGV4KHQpO2xldCBtPXQ7Y29uc3QgbD10aGlzLmhhc1NlZ21lbnRQYXJlbnRhZ2UoKTtmb3IobGV0IGU9MCxjPXMuZ2V0UmVzdWx0U2VnbWVudENvdW50KG4pO2U8YztlKyspe2NvbnN0IHQ9Yy1lLTEscj10aGlzLmdldFZlcnRleEluZGV4KG0pLGc9dGhpcy5nZXROZXh0VmVydGV4KG0pLGQ9cy5nZXRSZXN1bHRTZWdtZW50KG4sdCk7bGV0IF89bnVsbDtpZihkLmdldEdlb21ldHJ5VHlwZSgpIT09aS5lbnVtTGluZSYmKF89ZC5jbG9uZSgpLF8ucmV2ZXJzZSgpLF8uZHJvcEFsbEF0dHJpYnV0ZXMoKSksMD09PWUmJihkLnF1ZXJ5RW5kKGgpLHRoaXMuc2V0U2VnbWVudFRvSW5kZXgocixudWxsKSx0aGlzLnNldFBvaW50RXgobSxoLHMuZ2V0UmVzdWx0U2VnbWVudEVuZFBvaW50UmFuayhuLHQpLHMuZ2V0UmVzdWx0U2VnbWVudEVuZFBvaW50V2VpZ2h0KG4sdCksbyksdGhpcy5zZXRTZWdtZW50UGFyZW50YWdlQW5kQnJlYWsobSxzLmdldFJlc3VsdFNlZ21lbnRTZWdtZW50UGFyZW50YWdlKG4sdCkscy5nZXRSZXN1bHRTZWdtZW50RW5kUG9pbnRJc0JyZWFrKG4sdCkpKSxkLmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtTGluZT90aGlzLnNldFNlZ21lbnRUb0luZGV4KHIsbnVsbCk6dGhpcy5zZXRTZWdtZW50VG9JbmRleChyLF8pLHRoaXMuc2V0U2VnbWVudFJhbmsobSxzLmdldFJlc3VsdFNlZ21lbnRJbnRlcmlvclJhbmsobix0KSksdGhpcy5zZXRTZWdtZW50V2VpZ2h0KG0scy5nZXRSZXN1bHRTZWdtZW50SW50ZXJpb3JXZWlnaHQobix0KSksZC5xdWVyeVN0YXJ0KGgpLGU8Yy0xKXtjb25zdCBlPXRoaXMuaW5zZXJ0VmVydGV4KHUsZyxoKTt0aGlzLnNldFdlaWdodChlLHMuZ2V0UmVzdWx0U2VnbWVudFN0YXJ0UG9pbnRXZWlnaHQobix0KSksdGhpcy5zZXRSYW5rKGUscy5nZXRSZXN1bHRTZWdtZW50U3RhcnRQb2ludFJhbmsobix0KSksdGhpcy5zZWxlY3QoZSksbT1lLGwmJnRoaXMuc2V0U2VnbWVudFBhcmVudGFnZUFuZEJyZWFrKGUscy5nZXRSZXN1bHRTZWdtZW50U2VnbWVudFBhcmVudGFnZShuLHQpLHMuZ2V0UmVzdWx0U2VnbWVudEVuZFBvaW50SXNCcmVhayhuLHQpKX1lbHNlIHRoaXMuc2V0UG9pbnRFeChhLGgscy5nZXRSZXN1bHRTZWdtZW50U3RhcnRQb2ludFJhbmsobix0KSxzLmdldFJlc3VsdFNlZ21lbnRTdGFydFBvaW50V2VpZ2h0KG4sdCksbyl9fXNlbGVjdGVkXyh0KXtyZXR1cm4gdGhpcy5nZXRVc2VySW5kZXgodCx0aGlzLm1fc2VsZWN0aW9uSW5kZXgpPj0wfWFsbG9jYXRlSW5kZXgodD0hMCl7aWYodGhpcy5tX2RlbGV0ZWRJbmRpY2VzLmxlbmd0aCl7Y29uc3QgZT10aGlzLm1fZGVsZXRlZEluZGljZXMucG9wKCk7cmV0dXJuIHQmJmUuc2V0UmFuZ2UoLTEsMCxlLnNpemUoKSksZX1yZXR1cm4gdD9MKDAsLTEpOkwoMCl9cmVjeWNsZVVzZXJJbmRleCh0KXt0aGlzLm1fZGVsZXRlZEluZGljZXMucHVzaCh0KX1hbGxvY2F0ZVBhdGhJbmRleCgpe2lmKHRoaXMubV9kZWxldGVkUGF0aEluZGljZXMubGVuZ3RoKXtjb25zdCB0PXRoaXMubV9kZWxldGVkUGF0aEluZGljZXMuYXQoLTEpO3JldHVybiB0aGlzLm1fZGVsZXRlZFBhdGhJbmRpY2VzLnBvcCgpLHR9cmV0dXJuIEwoMCl9cmVjeWNsZVBhdGhVc2VySW5kZXgodCl7dGhpcy5tX2RlbGV0ZWRQYXRoSW5kaWNlcy5wdXNoKHQpfXBlZWxBTG9vcF8odCxlLHMpe2NvbnN0IG49dGhpcy5nZXROZXh0VmVydGV4KHQpLGk9dGhpcy5nZXROZXh0VmVydGV4KGUpLHI9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KSxvPXRoaXMuZ2V0VmVydGV4SW5kZXgoZSk7aWYodGhpcy5zZXROZXh0VmVydGV4KHQsaSksdGhpcy5zZXRQcmV2VmVydGV4KGksdCksdGhpcy5zZXROZXh0VmVydGV4KGUsbiksdGhpcy5zZXRQcmV2VmVydGV4KG4sZSksdGhpcy5tX3NlZ21lbnRzKXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChyKSxlPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChvKTt0aGlzLnNldFNlZ21lbnRUb0luZGV4KG8sbnVsbCksdGhpcy5zZXRTZWdtZW50VG9JbmRleChyLGUpLHRoaXMuc2V0U2VnbWVudFRvSW5kZXgobyx0KX1pZih0aGlzLmhhc1NlZ21lbnRQYXJlbnRhZ2UoKSl7bGV0IHM9dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKGUpLG49dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKHQpOy0xPT09cyYmLTE9PT1ufHwobj1zdChzLHM9biksdGhpcy5zZXRTZWdtZW50UGFyZW50YWdlQW5kQnJlYWsodCxuKSx0aGlzLnNldFNlZ21lbnRQYXJlbnRhZ2VBbmRCcmVhayhlLHMpKX1pZihzKXtjb25zdCBlPXRoaXMuZ2V0UGF0aEZyb21WZXJ0ZXgodCkscz10aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgoZSkscj1bITFdLG89dGhpcy5pbnNlcnRDbG9zZWRQYXRoKHMsZ3Isbix0aGlzLmdldEZpcnN0VmVydGV4KGUpLHIpO3JbMF0mJnRoaXMuc2V0Rmlyc3RWZXJ0ZXgoZSxpKTtsZXQgYT10aGlzLmdldFBhdGhTaXplKGUpO3JldHVybiBhLT10aGlzLmdldFBhdGhTaXplKG8pLHRoaXMuc2V0UGF0aFNpemUoZSxhKSxvfXJldHVybi
1Bncn1zb3J0VmVydGljZXNTaW1wbGVCeVlIZWxwZXIodCxlLHMpe3Quc29ydChlLHMsKHQsZSk9PntsZXQgcz10aGlzLmNvbXBhcmVWZXJ0aWNlc1NpbXBsZVkodCxlKTtpZigwPT09cyl7Y29uc3Qgbj10aGlzLmdldFBhdGhJbnRlcm5hbEluZGV4RnJvbVZlcnRleCh0KSxpPXRoaXMuZ2V0UGF0aEludGVybmFsSW5kZXhGcm9tVmVydGV4KGUpO3M9bjxpPy0xOm4+aT8xOjB9cmV0dXJuIHN9KX1zb3J0VmVydGljZXNTaW1wbGVCeVlIZWxwZXIzRCh0LGUsbil7cygwKX1jb25zdHJ1Y3Rvcigpe3RoaXMubV92ZXJ0aWNlc01wPW51bGwsdGhpcy5tX3ZlcnRpY2VzPW51bGwsdGhpcy5tX3h5U3RyZWFtPW51bGwsdGhpcy5tX3ZlcnRleERlc2NyaXB0aW9uPW51bGwsdGhpcy5tX3NlZ21lbnRzPW51bGwsdGhpcy5tX3dlaWdodHM9bnVsbCx0aGlzLm1fcmFua3M9bnVsbCx0aGlzLm1fc2VnbWVudFdlaWdodHM9bnVsbCx0aGlzLm1fc2VnbWVudFJhbmtzPW51bGwsdGhpcy5tX2luZGljZXM9W10sdGhpcy5tX2RlbGV0ZWRJbmRpY2VzPVtdLHRoaXMubV9wYXRoQXJlYXM9W10sdGhpcy5tX3BhdGhMZW5ndGhzPVtdLHRoaXMubV9wYXRoaW5kaWNlcz1bXSx0aGlzLm1fZGVsZXRlZFBhdGhJbmRpY2VzPVtdLHRoaXMubV9nZW9tZXRyeUluZGljZXM9W10sdGhpcy5tX3NlbGVjdGVkVmVydGljZXM9W10sdGhpcy5tX2hlbHBlclBvaW50PW51bGwsdGhpcy5tX2ZvcmNlU2V0RW52ZWxvcGU9Uy5jb25zdHJ1Y3RFbXB0eSgpLHRoaXMubV9oYXNGb3JjZVNldEVudmVsb3BlPTAsdGhpcy5tX3dvcmtQb2ludDJEPUouZ2V0TkFOKCksdGhpcy5tX3dvcmtQb2ludDJfMkQ9Si5nZXROQU4oKSx0aGlzLm1fY3VydmVTdGl0Y2hlcj1udWxsLHRoaXMubV9wYXRoQ291bnQ9MCx0aGlzLm1fcG9pbnRDb3VudD0wLHRoaXMubV9maXJzdEdlb21ldHJ5PWdyLHRoaXMubV9sYXN0R2VvbWV0cnk9Z3IsdGhpcy5tX3ZlcnRleEluZGV4TGlzdD1uZXcgaig1KSx0aGlzLm1fcGF0aEluZGV4TGlzdD1uZXcgaig4KSx0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3Q9bmV3IGooOCksdGhpcy5tX2JIYXNBdHRyaWJ1dGVzPSExLHRoaXMubV9zZWxlY3RlZENvdW50PTAsdGhpcy5tX3NlbGVjdGlvbkluZGV4PS0xLHRoaXMubV9zZWxlY3Rpb249ITEsdGhpcy5tX2J1Y2tldFNvcnQ9bmV3IFcsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleD0tMX1nZXRUb3RhbFBvaW50Q291bnQoKXtyZXR1cm4gdGhpcy5tX3BvaW50Q291bnR9Z2V0RW52ZWxvcGUyRCh0KXtpZigwIT09dGhpcy5tX2hhc0ZvcmNlU2V0RW52ZWxvcGUpcmV0dXJuIG5ldyBsZSh0aGlzLm1fZm9yY2VTZXRFbnZlbG9wZS54bWluLHRoaXMubV9mb3JjZVNldEVudmVsb3BlLnltaW4sdGhpcy5tX2ZvcmNlU2V0RW52ZWxvcGUueG1heCx0aGlzLm1fZm9yY2VTZXRFbnZlbG9wZS55bWF4KTtjb25zdCBlPXRoaXMuaGFzQ3VydmVzKCkscz1sZS5jb25zdHJ1Y3RFbXB0eSgpLG49dGhpcy5xdWVyeVZlcnRleEl0ZXJhdG9yKCk7bGV0IGk9ITA7Zm9yKGxldCByPW4ubmV4dCgpO3IhPT1ncjtyPW4ubmV4dCgpKXtpZihpP3MubWVyZ2UodGhpcy5nZXRYWShyKSk6cy5tZXJnZU5lKHRoaXMuZ2V0WFkocikpLGUpe2NvbnN0IHQ9dGhpcy5nZXRTZWdtZW50KHIpO2lmKG51bGwhPT10KXtjb25zdCBlPWxlLmNvbnN0cnVjdEVtcHR5KCk7dC5xdWVyeUxvb3NlRW52ZWxvcGUoZSkscy5tZXJnZUVudmVsb3BlMkQoZSl9fWk9ITF9cmV0dXJuIHN9Z2V0RW52ZWxvcGUzRCh0KXtyZXR1cm4gcygwKSxTLmNvbnN0cnVjdEVtcHR5KCl9Zm9yY2VTZXRFbnZlbG9wZTJEKHQpe3RoaXMubV9oYXNGb3JjZVNldEVudmVsb3BlPTEsdGhpcy5tX2ZvcmNlU2V0RW52ZWxvcGUuc2V0Q29vcmRzKHQueG1pbix0LnltaW4sMCx0LnhtYXgsdC55bWF4LDApfWZvcmNlU2V0RW52ZWxvcGUzRCh0KXtzKDApfWZvcmdldEZvcmNlU2V0RW52ZWxvcGUoKXt0aGlzLm1faGFzRm9yY2VTZXRFbnZlbG9wZT0wfWdldEdlb21ldHJ5Q291bnQoKXtyZXR1cm4gdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNpemUoKX1hZGRHZW9tZXRyeSh0LHMpe2NvbnN0IG49dC5nZXRHZW9tZXRyeVR5cGUoKTtpZihjKG4pKXJldHVybiB0aGlzLmFkZE11bHRpUGF0aCh0LHMpO2lmKG49PT1pLmVudW1NdWx0aVBvaW50KXJldHVybiB0aGlzLmFkZE11bHRpUG9pbnQodCxzKTtpZihuPT09aS5lbnVtUG9pbnQpcmV0dXJuIHRoaXMuYWRkUG9pbnRfKHQscyk7aWYobj09PWkuZW51bUVudmVsb3BlKXtjb25zdCBlPW5ldyBtcjtyZXR1cm4gZS5hZGRFbnZlbG9wZSh0LCExKSx0aGlzLmFkZE11bHRpUGF0aChlLHMpfWUoXCJcIil9YXBwZW5kR2VvbWV0cnkodCxzKXt0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24ocy5nZXREZXNjcmlwdGlvbigpKTtjb25zdCBuPXMuZ2V0R2VvbWV0cnlUeXBlKCk7YyhuKT90aGlzLmFwcGVuZE11bHRpUGF0aCh0LHMpOm4hPT1pLmVudW1NdWx0aVBvaW50P2UoXCJcIik6dGhpcy5hcHBlbmRNdWx0aVBvaW50KHQscyl9YXNzaWduUmFua1RvR2VvbWV0cnlWZXJ0aWNlcyh0LGUpe2U8ZHImJihlPWRyKTtjb25zdCBzPXRoaXMucXVlcnlWZXJ0ZXhJdGVyYXRvcigpO2ZvcihsZXQgbj1zLm5leHQoKTtuIT09Z3I7bj1zLm5leHQoKSl0aGlzLnNldFJhbmsobixlKSx0aGlzLnNldFNlZ21lbnRSYW5rKG4sZSl9Y29sbGFwc2VBbGxHZW9tZXRyaWVzVG9GaXJzdCgpe3RoaXMuY29sbGFwc2VHZW9tZXRyaWVzVG9GaXJzdChpLmVudW1Vbmtub3duKX1jb2xsYXBzZUdlb21ldHJpZXNUb0ZpcnN0KHQpe3RoaXMuZGJnVmVyaWZ5VmVydGV4Q291bnRzKCk7bGV0IGU9Z3Iscz0tMSxuPS0xO2ZvcihsZXQgcj10aGlzLmdldEZpcnN0R2VvbWV0cnkoKTtyIT09Z3I7KXtpZih0PT09aS5lbnVtVW5rbm93bnx8dGhpcy5nZXRHZW9tZXRyeVR5cGUocik9PT10KXtpZihlPT09Z3Ipe2U9cixzPXRoaXMuZ2V0UGF0aENvdW50KGUpLG49dGhpcy5nZXRQb2ludENvdW50KGUpLHI9dGhpcy5nZXROZXh0R2VvbWV0cnkocik7Y29udGludWV9Zm9yKGxldCBzPXRoaXMuZ2V0Rmlyc3RQYXRoKHIpO3MhPT1ncjtzPXRoaXMuZ2V0TmV4dFBhdGgocykpdGhpcy5zZXRQYXRoR2VvbWV0cnkocyxlKTtzKz10aGlzLmdldFBhdGhDb3VudChyKSxuKz10aGlzLmdldFBvaW50Q291bnQocik7Y29uc3QgdD10aGlzLmdldExhc3RQYXRoKGUpLGk9dGhpcy5nZXRGaXJzdFBhdGgocik7dCE9PWdyP3RoaXMuc2V0TmV4dFBhdGgodCxpKTp0aGlzLnNldEZpcnN0UGF0aChlLGkpLGkhPT1nciYmKHRoaXMuc2V0UHJldlBhdGgoaSx0KSx0aGlzLnNldExhc3RQYXRoKGUsdGhpcy5nZXRMYXN0UGF0aChyKSkpLHRoaXMuc2V0Rmlyc3RQYXRoKHIsZ3IpLHRoaXMuc2V0TGFzdFBhdGgocixncik7Y29uc3Qgbz1yO3I9dGhpcy5nZXROZXh0R2VvbWV0cnkociksdGhpcy5zZXRHZW9tZXRyeVZlcnRleENvdW50KG8sMCksdGhpcy5yZW1vdmVHZW9tZXRyeShvKTtjb250aW51ZX1yPXRoaXMuZ2V0TmV4dEdlb21ldHJ5KHIpfXJldHVybi
1BlIT09Z3ImJih0aGlzLnNldEdlb21ldHJ5VmVydGV4Q291bnQoZSxuKSx0aGlzLnNldEdlb21ldHJ5UGF0aENvdW50KGUscyksdGhpcy5kYmdWZXJpZnlWZXJ0ZXhDb3VudHMoKSksZX1zZXRGaWxsUnVsZSh0LGUpe2xldCBzPXRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDIpO3MmPS0xMzQyMTc3Mjksc3w9MT09PWU/MTM0MjE3NzI4OjAsdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKHQsMixzKX1nZXRGaWxsUnVsZSh0KXtyZXR1cm4gMTM0MjE3NzI4JnRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDIpPzE6MH1zZXRHZW9tZXRyeU1vZGlmaWVkKHQsZSl7bGV0IHM9dGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LmdldEZpZWxkKHQsMik7ISEoNjcxMDg4NjQmcykhPT1lJiYocyY9LTY3MTA4ODY1LHN8PWU/NjcxMDg4NjQ6MCx0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3Quc2V0RmllbGQodCwyLHMpKX1nZXRHZW9tZXRyeU1vZGlmaWVkKHQpe3JldHVybiEhKDY3MTA4ODY0JnRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDIpKX1zZXRHZW9tZXRyeU1vZGlmaWVkV2l0aFZlcnRleCh0LGUpe2NvbnN0IHM9dGhpcy5nZXRQYXRoRnJvbVZlcnRleCh0KSxuPXRoaXMuZ2V0R2VvbWV0cnlGcm9tUGF0aChzKTt0aGlzLnNldEdlb21ldHJ5TW9kaWZpZWQobixlKX1nZXRHZW9tZXRyeU1vZGlmaWVkV2l0aFZlcnRleCh0KXtjb25zdCBlPXRoaXMuZ2V0UGF0aEZyb21WZXJ0ZXgodCkscz10aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgoZSk7cmV0dXJuIHRoaXMuZ2V0R2VvbWV0cnlNb2RpZmllZChzKX1zd2FwR2VvbWV0cnkodCxlKXtjb25zdCBzPXRoaXMuZ2V0Rmlyc3RQYXRoKHQpLG49dGhpcy5nZXRGaXJzdFBhdGgoZSksaT10aGlzLmdldExhc3RQYXRoKHQpLHI9dGhpcy5nZXRMYXN0UGF0aChlKTtmb3IobGV0IGM9dGhpcy5nZXRGaXJzdFBhdGgodCk7YyE9PWdyO2M9dGhpcy5nZXROZXh0UGF0aChjKSl0aGlzLnNldFBhdGhHZW9tZXRyeShjLGUpO2ZvcihsZXQgYz10aGlzLmdldEZpcnN0UGF0aChlKTt
1jIT09Z3I7Yz10aGlzLmdldE5leHRQYXRoKGMpKXRoaXMuc2V0UGF0aEdlb21ldHJ5KGMsdCk7dGhpcy5zZXRGaXJzdFBhdGgodCxuKSx0aGlzLnNldEZpcnN0UGF0aChlLHMpLHRoaXMuc2V0TGFzdFBhdGgodCxyKSx0aGlzLnNldExhc3RQYXRoKGUsaSk7Y29uc3Qgbz10aGlzLmdldFBvaW50Q291bnQodCksYT10aGlzLmdldFBhdGhDb3VudCh0KSxoPXRoaXMuZ2V0UG9pbnRDb3VudChlKSx1PXRoaXMuZ2V0UGF0aENvdW50KGUpO3RoaXMuc2V0R2VvbWV0cnlWZXJ0ZXhDb3VudCh0LGgpLHRoaXMuc2V0R2VvbWV0cnlWZXJ0ZXhDb3VudChlLG8pLHRoaXMuc2V0R2VvbWV0cnlQYXRoQ291bnQodCx1KSx0aGlzLnNldEdlb21ldHJ5UGF0aENvdW50KGUsYSk7Y29uc3QgbT10aGlzLm1fZ2VvbWV0cnlJbmRleExpc3QuZ2V0RmllbGQodCwyKSxsPXRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZChlLDIpO3RoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZCh0LDIsbCksdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKGUsMixtKX1hZGRQYXRoRnJvbU11bHRpUGF0aCh0LGUscyl7Y29uc3Qgbj10aGlzLmNyZWF0ZUdlb21ldHJ5KHM/aS5lbnVtUG9seWdvbjppLmVudW1Qb2x5bGluZSx0LmdldERlc2NyaXB0aW9uKCkpLHI9dC5nZXRJbXBsKCk7aWYodC5nZXRQYXRoU2l6ZShlKTwyKXJldHVybiBuO3RoaXMubV92ZXJ0aWNlcy5yZXNlcnZlUm91bmRlZCh0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpK3QuZ2V0UGF0aFNpemUoZSkpLHRoaXMubV92ZXJ0aWNlc01wLmFkZFBvaW50cyh0LHQuZ2V0UGF0aFN0YXJ0KGUpLHIuZ2V0UGF0aEVuZChlKSksdGhpcy5tX3h5U3RyZWFtPXRoaXMubV92ZXJ0aWNlcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoMCk7Y29uc3Qgbz10aGlzLmluc2VydFBhdGgobixncik7dGhpcy5zZXRDbG9zZWRQYXRoKG8sci5pc0Nsb3NlZFBhdGgoZSl8fHMpO2NvbnN0IGE9bnVsbCE9PXRoaXMubV9zZWdtZW50c3x8bnVsbCE9PXIuZ2V0U2VnbWVudEZsYWdzU3RyZWFtUmVmKCk7Zm9yKGxldCBpPXIuZ2V0UGF0aFN0YXJ0KGUpLGg9ci5nZXRQYXRoRW5kKGUpO2k8aDtpKyspe2NvbnN0IHQ9dGhpcy5pbnNlcnRWZXJ0ZXhfKG8sZ3IsbnVsbCwhMSk7aWYoYSl7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO2lmKDEmci5nZXRTZWdtZW50RmxhZ3MoaSkpdGhpcy5zZXRTZWdtZW50VG9JbmRleChlLG51bGwpO2Vsc2V7Y29uc3QgdD1uZXcgUG07ci5xdWVyeVNlZ21lbnQoaSx0LCEwKSx0aGlzLnNldFNlZ21lbnRUb0luZGV4KGUsdC5yZWxlYXNlU2VnbWVudCgpKX19fXJldHVybiByLmlzU3Ryb25nUGF0aFN0YXJ0KGUpJiZ0aGlzLnNldFN0cm9uZ1BhdGhTdGFydChvLCEwKSxyLmlzU3Ryb25nUGF0aEVuZChlKSYmdGhpcy5zZXRTdHJvbmdQYXRoRW5kKG8sITApLG59Z2V0R2VvbWV0cnkodCl7Y29uc3QgZT10aGlzLmdldEdlb21ldHJ5VHlwZSh0KSxzPWxyKGUsdGhpcy5tX3ZlcnRpY2VzTXAuZ2V0RGVzY3JpcHRpb24oKSksbj10aGlzLmdldFBvaW50Q291bnQodCk7aWYoMD09PW4pcmV0dXJuIHM7aWYoYyhlKSl7Y29uc3QgZT1zLmdldEltcGwoKSxpPXRoaXMuZ2V0UGF0aENvdW50KHQpLHI9TChpKzEpLG89UihpKzEsMCksYT1zLmdldERlc2NyaXB0aW9uKCksaD10aGlzLmhhc0N1cnZlcygpO2ZvcihsZXQgcz0wLHU9YS5nZXRBdHRyaWJ1dGVDb3VudCgpO3M8dTtzKyspe2NvbnN0IGg9YS5nZXRTZW1hbnRpY3MocyksdT1jci5nZXRDb21wb25lbnRDb3VudChoKSxtPVQoaCxuKSxsPXRoaXMubV92ZXJ0aWNlcy5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYoaCk7bGV0IGM9MCxnPTAsZD0wO2ZvcihsZXQgZT10aGlzLmdldEZpcnN0UGF0aCh0KTtlIT09Z3I7ZT10aGlzLmdldE5leHRQYXRoKGUpKXtsZXQgdD0wO3RoaXMuaXNDbG9zZWRQYXRoKGUpJiYodHw9MSksdGhpcy5pc0V4dGVyaW9yKGUpJiYodHw9OCksdGhpcy5pc1N0cm9uZ1BhdGhTdGFydChlKSYmKHR8PTIpLHRoaXMuaXNTdHJvbmdQYXRoRW5kKGUpJiYodHw9NCksdCYmby5zZXRCaXRzKGcsdCk7Y29uc3Qgcz10aGlzLmdldFBhdGhTaXplKGUpO2lmKHIud3JpdGUoZysrLGQpLGQrPXMsMD09PWgpe2NvbnN0IHQ9bCxzPW07bGV0IG47Zm9yKGxldCBpPXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgoZSk7YzxkO2k9dGhpcy5nZXROZXh0VmVydGV4KGkpLGMrKyl7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KGkpO249dC5yZWFkUG9pbnQyRCgyKmUpLHMud3JpdGVQb2ludDJEKDIqYyxuKX19ZWxzZSBmb3IobGV0IG49dGhpcy5nZXRGaXJzdFZlcnRleChlKTtjPGQ7bj10aGlzLmdldE5leHRWZXJ0ZXgobiksYysrKXtjb25zdCB0PXRoaXMuZ2V0VmVydGV4SW5kZXgobik7Zm9yKGxldCBlPTA7ZTx1O2UrKyl7Y29uc3Qgcz1sLnJlYWRBc0RibCh0KnUrZSk7bS53cml0ZUFzRGJsKGMqdStlLHMpfX19ZS5zZXRBdHRyaWJ1dGVTdHJlYW1SZWYoaCxtKSxyLndyaXRlKGksbil9aWYoZS5zZXRQYXRoRmxhZ3NTdHJlYW1SZWYobyksZS5zZXRQYXRoU3RyZWFtUmVmKHIpLGUubm90aWZ5TW9kaWZpZWRGbGFncyg2NTUzNSksaCl7bGV0IHM9MCxuPTA7Zm9yKGxldCBpPXRoaXMuZ2V0Rmlyc3RQYXRoKHQpO2khPT1ncjtpPXRoaXMuZ2V0TmV4dFBhdGgoaSkpe3MrPXRoaXMuZ2V0UGF0aFNpemUoaSk7Zm9yKGxldCB0PXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgoaSk7bjxzO3Q9dGhpcy5nZXROZXh0VmVydGV4KHQpKXtjb25zdCBzPXRoaXMuZ2V0U2VnbWVudCh0KTtudWxsIT09cyYmcy5pc0N1cnZlKCkmJmUucmVwbGFjZVNlZ21lbnQobixzLCEwKSxuKyt9fX19ZWxzZSBpZihlPT09aS5lbnVtTXVsdGlQb2ludCl7Y29uc3QgZT1zLmdldEltcGwoKSxpPXMuZ2V0RGVzY3JpcHRpb24oKTtlLnJlc2VydmUobiksZS5yZXNpemVOb0luaXQobik7Zm9yKGxldCBzPTAsbj1pLmdldEF0dHJpYnV0ZUNvdW50KCk7czxuO3MrKyl7Y29uc3Qgbj1pLmdldFNlbWFudGljcyhzKSxyPWNyLmdldENvbXBvbmVudENvdW50KG4pLG89ZS5nZXRBdHRyaWJ1dGVTdHJlYW1SZWYobiksYT10aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlU3RyZWFtUmVmKG4pO2xldCBoPTA7Y29uc3QgdT10aGlzLmdldEZpcnN0UGF0aCh0KSxtPXRoaXMuZ2V0UGF0aFNpemUodSk7Zm9yKGxldCB0PXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgodSk7aDxtO3Q9dGhpcy5nZXROZXh0VmVydGV4KHQpLGgrKyl7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO2ZvcihsZXQgdD0wO3Q8cjt0Kyspe2NvbnN0IHM9YS5yZWFkQXNEYmwoZSpyK3QpO28ud3JpdGVBc0RibChoKnIrdCxzKX19ZS5zZXRBdHRyaWJ1dGVTdHJlYW1SZWYobixvKX1lLm5vdGlmeU1vZGlmaWVkRmxhZ3MoNjU1MzUpfWVsc2UgaChcImdldEdlb21ldHJ5XCIpO3JldHVybiBzfXF1ZXJ5UG9pbnRHZW9tZXRyeU9ubHkodCxzKXt0aGlzLmdldEdlb21ldHJ5VHlwZSh0KSE9PWkuZW51bU11bHRpUG9pbnQmJmUoXCJnZXRfcG9pbnRfZ2VvbWV0cnlfb25seVwiKTtjb25zdCBuPXRoaXMuZ2V0UG9pbnRDb3VudCh0KTtpZihuPjEmJmUoXCJnZXRfcG9pbnRfZ2VvbWV0cnlfb25seVwiKSwwPT09bilyZXR1cm4gcy5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fdmVydGV4RGVzY3JpcHRpb24pLHZvaWQgcy5zZXRFbXB0eSgpO2NvbnN0IHI9dGhpcy5nZXRGaXJzdFBhdGgodCksbz10aGlzLmdldEZpcnN0VmVydGV4KHIpO3RoaXMucXVlcnlQb2ludChvLHMpfXJlbW92ZUdlb21ldHJ5KHQpe2ZvcihsZXQgbj10aGlzLmdldEZpcnN0UGF0aCh0KTtuIT09Z3I7bj10aGlzLnJlbW92ZVBhdGgobikpO2NvbnN0IGU9dGhpcy5nZXRQcmV2R2VvbWV0cnkodCkscz10aGlzLmdldE5leHRHZW9tZXRyeSh0KTtyZXR1cm4gZSE9PWdyP3RoaXMuc2V0TmV4dEdlb21ldHJ5KGUscyk6dGhpcy5tX2ZpcnN0R2VvbWV0cnk9cyxzIT09Z3I/dGhpcy5zZXRQcmV2R2VvbWV0cnkocyxlKTp0aGlzLm1fbGFzdEdlb21ldHJ5PWUsdGhpcy5mcmVlR2VvbWV0cnkodCksc31jcmVhdGVHZW9tZXRyeSh0LGUpe3ZvaWQgMD09PWUmJihlPVAoKSk7Y29uc3Qgcz10aGlzLm5ld0dlb21ldHJ5KHQpO3JldHVybiB0aGlzLm1fdmVydGljZXN8fCh0aGlzLm1fdmVydGljZXNNcD1uZXcgRGUoe3ZkOmV9KSx0aGlzLm1fdmVydGljZXM9dGhpcy5tX3ZlcnRpY2VzTXAuZ2V0SW1wbCgpKSx0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oZSksdGhpcy5tX2ZpcnN0R2VvbWV0cnk9PT
11ncj8odGhpcy5tX2ZpcnN0R2VvbWV0cnk9cyx0aGlzLm1fbGFzdEdlb21ldHJ5PXMpOih0aGlzLnNldFByZXZHZW9tZXRyeShzLHRoaXMubV9sYXN0R2VvbWV0cnkpLHRoaXMuc2V0TmV4dEdlb21ldHJ5KHRoaXMubV9sYXN0R2VvbWV0cnkscyksdGhpcy5tX2xhc3RHZW9tZXRyeT1zKSxzfWdldEZpcnN0R2VvbWV0cnkoKXtyZXR1cm4gdGhpcy5tX2ZpcnN0R2VvbWV0cnl9Z2V0TGFzdEdlb21ldHJ5KCl7cmV0dXJuIHRoaXMubV9sYXN0R2VvbWV0cnl9Z2V0TmV4dEdlb21ldHJ5KHQpe3JldHVybiB0aGlzLm1fZ2VvbWV0cnlJbmRleExpc3QuZ2V0RmllbGQodCwxKX1nZXRQcmV2R2VvbWV0cnkodCl7cmV0dXJuIHRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDApfWdldEdlb21ldHJ5VHlwZSh0KXtyZXR1cm4gMTY3NzcyMTUmdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LmdldEZpZWxkKHQsMil9c2V0R2VvbWV0cnlVc2VySW5kZXgodCxlLHMpe2NvbnN0IG49dGhpcy5tX2dlb21ldHJ5SW5kaWNlc1tlXSxpPXRoaXMuZ2V0R2VvbWV0cnlJbmRleCh0KTtpPj1uLnNpemUoKSYmbi5yZXNpemUoTWF0aC5tYXgoMS4yNSppLDE2KSwtMSksbi53cml0ZShpLHMpfWdldEdlb21ldHJ5VXNlckluZGV4KHQsZSl7Y29uc3Qgcz10aGlzLmdldEdlb21ldHJ5SW5kZXgodCksbj10aGlzLm1fZ2VvbWV0cnlJbmRpY2VzW2VdO3JldHVybiBzPG4uc2l6ZSgpP24ucmVhZChzKTotMX1jcmVhdGVHZW9tZXRyeVVzZXJJbmRleCgpe2ZvcihsZXQgZT0wO2U8dGhpcy5tX2dlb21ldHJ5SW5kaWNlcy5sZW5ndGg7ZSsrKWlmKG51bGw9PT10aGlzLm1fZ2VvbWV0cnlJbmRpY2VzW2VdKXJldHVybiB0aGlzLm1fZ2VvbWV0cnlJbmRpY2VzW2VdPUwoMCksZTt0aGlzLm1fZ2VvbWV0cnlJbmRpY2VzLnB1c2goTCgwKSk7Y29uc3QgdD10aGlzLm1fZ2VvbWV0cnlJbmRpY2VzLmxlbmd0aC0xO3JldHVybiBzKHQ+PTAmJnQ8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSx0fXJlbW92ZUdlb21ldHJ5VXNlckluZGV4KHQpe2Zvcih0aGlzLm1fZ2VvbWV0cnlJbmRpY2VzW3RdPW51bGw7dGhpcy5tX2dlb21ldHJ5SW5kaWNlcy5sZW5ndGg+MCYmbnVsbD09PXRoaXMubV9nZW9tZXRyeUluZGljZXMuYXQoLTEpOyl0aGlzLm1fZ2VvbWV0cnlJbmRpY2VzLnBvcCgpfWdldEZpcnN0UGF0aCh0KXtyZXR1cm4gdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LmdldEZpZWxkKHQsMyl9Z2V0TGFzdFBhdGgodCl7cmV0dXJuIHRoaXMubV9
1nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDQpfWhhc1BvaW50RmVhdHVyZXMoKXtmb3IobGV0IHQ9dGhpcy5nZXRGaXJzdEdlb21ldHJ5KCk7dCE9PWdyO3Q9dGhpcy5nZXROZXh0R2VvbWV0cnkodCkpaWYoIWModGhpcy5nZXRHZW9tZXRyeVR5cGUodCkpKXJldHVybiEwO3JldHVybiExfWdldFBvaW50Q291bnQodCl7cmV0dXJuIHRoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5nZXRGaWVsZCh0LDUpfWdldFBhdGhDb3VudCh0KXtyZXR1cm4gdGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LmdldEZpZWxkKHQsNil9ZmlsdGVyQ2xvc2VQb2ludHModCxlLG4scixvKXtjb25zdCBhPXQqdDtsZXQgaD0wO2NvbnN0IHU9dGhpcy5oYXNDdXJ2ZXMoKSxtPXRoaXMuaGFzU2VnbWVudFBhcmVudGFnZSgpLGw9ITA7Zm9yKGxldCBnPW89PT1ncj90aGlzLmdldEZpcnN0R2VvbWV0cnkoKTpvO2chPT1ncjtnPW89PT1ncj90aGlzLmdldE5leHRHZW9tZXRyeShnKTpncil7Y29uc3QgdD10aGlzLmdldEdlb21ldHJ5VHlwZShnKTtpZighYyh0KSljb250aW51ZTtpZihuJiZ0IT09aS5lbnVtUG9seWdvbiljb250aW51ZTtjb25zdCBvPXRoaXMuZ2V0R2VvbWV0cnlUeXBlKGcpPT09aS5lbnVtUG9seWdvbjtsZXQgZD10aGlzLmdldEdlb21ldHJ5TW9kaWZpZWQoZyk7Zm9yKGxldCBuPXRoaXMuZ2V0Rmlyc3RQYXRoKGcpO24hPT1ncjspe2xldCB0PTA7Zm9yKGxldCBlPXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgobik7dDxNYXRoLnRydW5jKHRoaXMuZ2V0UGF0aFNpemUobikvMik7KXtjb25zdCBpPXRoaXMuZ2V0TmV4dFZlcnRleChlKTtpZihpPT09Z3IpYnJlYWs7Y29uc3Qgbz10aGlzLmdldFhZKGUpLGM9dGhpcy5nZXRYWShpKTtsZXQgXz1KLnNxckRpc3RhbmNlKG8sYykscD0hMDtkb3tpZihfPD1hKXtpZih1KXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudChlKTtpZihudWxsIT09dCl7Y29uc3QgZT10LmNhbGN1bGF0ZUxlbmd0aDJEKCk7aWYoXz1lKmUsXz5hKWJyZWFrfX1pZigwPT09Xz8wPT09aCYmKGg9LTEpOmg9MSxpIT09dGhpcy5nZXRMYXN0VmVydGV4KG4pKXtjb25zdCB0PW0mJih0aGlzLmdldFNlZ21lbnRQYXJlbnRhZ2VCcmVha1ZlcnRleChlKXx8dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlQnJlYWtWZXJ0ZXgoaSkpO2lmKHRoaXMudHJhbnNmZXJBbGxEYXRhVG9UaGVWZXJ0ZXgoaSxlLGwpLHRoaXMucmVtb3ZlVmVydGV4KGksITEpLHImJiFkJiYodGhpcy5zZXRHZW9tZXRyeU1vZGlmaWVkKGcsITApLGQ9ITApLG0mJmUhPT1pKXt0aGlzLnNldFNlZ21lbnRQYXJlbnRhZ2VCcmVha1ZlcnRleChlLHQpO2NvbnN0IG49dGhpcy5nZXROZXh0VmVydGV4KGUpO3MobiE9PWdyKSx0aGlzLmlzRGlzY29udGludW91c1NlZ21lbnRQYXJlbnRhZ2UobikmJnRoaXMuc2V0U2VnbWVudFBhcmVudGFnZUJyZWFrVmVydGV4KG4sITApfX1wPSExfX13aGlsZSgwKTtwJiYoZT10aGlzLmdldE5leHRWZXJ0ZXgoZSkpLHQrK31sZXQgaT10aGlzLmdldEZpcnN0VmVydGV4KG4pO2ZvcihsZXQgZT10aGlzLmlzQ2xvc2VkUGF0aChuKT9pOnRoaXMuZ2V0TGFzdFZlcnRleChuKTt0aGlzLmdldFBhdGhTaXplKG4pPjA7KXtjb25zdCB0PXRoaXMuZ2V0UHJldlZlcnRleChlKTtpZih0PT09Z3IpYnJlYWs7e2NvbnN0IG89dGhpcy5nZXRYWSh0KSxjPXRoaXMuZ2V0WFkoZSk7bGV0IF89Si5zcXJEaXN0YW5jZShvLGMpLHA9ITA7ZG97aWYoXzw9YSl7aWYodSl7Y29uc3QgZT10aGlzLmdldFNlZ21lbnQodCk7aWYobnVsbCE9PWUpe2NvbnN0IHQ9ZS5jYWxjdWxhdGVMZW5ndGgyRCgpO2lmKF89dCp0LF8+YSlicmVha319aWYoMD09PV8/MD09PWgmJihoPS0xKTpoPTEsbSl7cyh0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4Pj0wKTtjb25zdCBuPXRoaXMuZ2V0VXNlckluZGV4KGUsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCk7dGhpcy50cmFuc2ZlckFsbERhdGFUb1RoZVZlcnRleCh0LGUsbCksdGhpcy5zZXRVc2VySW5kZXgoZSx0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4LG4pfWVsc2UgdGhpcy50cmFuc2ZlckFsbERhdGFUb1RoZVZlcnRleCh0LGUsbCk7Y29uc3Qgbz1tJiYodGhpcy5nZXRTZWdtZW50UGFyZW50YWdlQnJlYWtWZXJ0ZXgoZSl8fHRoaXMuZ2V0U2VnbWVudFBhcmVudGFnZUJyZWFrVmVydGV4KHQpKTt0aGlzLnJlbW92ZVZlcnRleCh0LCEwKSxyJiYhZCYmKHRoaXMuc2V0R2VvbWV0cnlNb2RpZmllZChnLCEwKSxkPSEwKSxtJiZ0IT09ZSYmKG98fHRoaXMuaXNEaXNjb250aW51b3VzU2VnbWVudFBhcmVudGFnZShlKSkmJnRoaXMuc2V0U2VnbWVudFBhcmVudGFnZUJyZWFrVmVydGV4KGUsITApLGk9PT10JiYoaT10aGlzLmdldEZpcnN0VmVydGV4KG4pKSxwPSExfX13aGlsZSgwKTtpZihwJiYoZT10aGlzLmdldFByZXZWZXJ0ZXgoZSksZT09PWkpKWJyZWFrfX1jb25zdCBjPXRoaXMuZ2V0UGF0aFNpemUobik7bGV0IF89ZSYmYzwobz8zOjIpO18mJm8mJjI9PT1jJiZ1JiYoXz0hdGhpcy5wYXRoSGFzQ3VydmVzKG4pKSxfPyhuPXRoaXMucmVtb3ZlUGF0aChuKSwwPT09aCYmKGg9LTEpLHImJiFkJiYodGhpcy5zZXRHZW9tZXRyeU1vZGlmaWVkKGcsITApLGQ9ITApKTpuPXRoaXMuZ2V0TmV4dFBhdGgobil9fXJldHVybiBofWZpbHRlckNsb3NlUG9pbnRzM0QodCxlLG4saSxyLG8pe3JldHVybiBzKDApLDB9aGFzRGVnZW5lcmF0ZVNlZ21lbnRzKHQpe2ZvcihsZXQgZT10aGlzLmdldEZpcnN0R2VvbWV0cnkoKTtlIT09Z3I7ZT10aGlzLmdldE5leHRHZW9tZXRyeShlKSlpZihjKHRoaXMuZ2V0R2VvbWV0cnlUeXBlKGUpKSlmb3IobGV0IHM9dGhpcy5nZXRGaXJzdFBhdGgoZSk7cyE9PWdyOyl7Y29uc3QgZT10aGlzLmdldFBhdGhTaXplKHMpO2lmKDA9PT1lKXJldHVybiEwO2xldCBuPXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgocyk7Zm9yKGxldCBzPTA7czxlO3MrKyl7Y29uc3QgZT10aGlzLmdldE5leHRWZXJ0ZXgobik7aWYoZT09PWdyKWJyZWFrO2NvbnN0IHM9dGhpcy5nZXRWZXJ0ZXhJbmRleChuKSxpPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChzKTtsZXQgcj0wO2lmKG51bGwhPT1pKXtpZihyPWkuY2FsY3VsYXRlTG93ZXJMZW5ndGgyRCgpLHI8PXQpe2lmKHI9aS5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCkscjw9dClyZXR1cm4hMDtpZihyPWkuY2FsY3VsYXRlTGVuZ3RoMkQoKSxyPD10KXJldHVybiEwfX1lbHNle2NvbnN0IG49dGhpcy5nZXRWZXJ0ZXhJbmRleChlKTtpZihyPXRoaXMubV92ZXJ0aWNlcy5nZXRTaG9ydGVzdERpc3RhbmNlKHMsbikscjw9dClyZXR1cm4hMH1uPWV9cz10aGlzLmdldE5leHRQYXRoKHMpfXJldHVybiExfWhhc0RlZ2VuZXJhdGVTZWdtZW50czNEKHQsZSl7cmV0dXJuIHMoMCksITF9dHJhbnNmZXJBbGxEYXRhVG9UaGVWZXJ0ZXgodCxlLHM9ITEpe2NvbnN0IG49dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KSxpPXRoaXMuZ2V0VmVydGV4SW5kZXgoZSk7aWYocyl7bGV0IHQ9MSxlPTE7aWYodGhpcy5tX3JhbmtzJiYodD10aGlzLmdldFJhbmtXaXRoSW5kZXgobiksZT10aGlzLmdldFJhbmtXaXRoSW5kZXgoaSkpLHQ+ZSYmdGhpcy5zZXRSYW5rV2l0aEluZGV4KGksdCksdD49ZSYmdGhpcy5tX3dlaWdodHMpe2NvbnN0IHM9dGhpcy5nZXRXZWlnaHRXaXRoSW5kZXgobikscj10aGlzLmdldFdlaWdodFdpdGhJbmRleChpKTsodD5lfHxzPnIpJiZ0aGlzLnNldFdlaWdodFdpdGhJbmRleChpLHMpfX1lbHNle2lmKHRoaXMubV93ZWlnaHRzKXtjb25zdCB0PXRoaXMuZ2V0V2VpZ2h0V2l0aEluZGV4KG4pO3RoaXMuc2V0V2VpZ2h0V2l0aEluZGV4KGksdCl9aWYodGhpcy5tX3JhbmtzKXtjb25zdCB0PXRoaXMuZ2V0UmFua1dpdGhJbmRleChuKTt0aGlzLnNldFJhbmtXaXRoSW5kZXgoaSx0KX19aWYodGhpcy5tX3NlZ21lbnRXZWlnaHRzKXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudFdlaWdodFdpdGhJbmRleChuKTt0aGlzLnNldFNlZ21lbnRXZWlnaHRXaXRoSW5kZXgoaSx0KX1pZih0aGlzLm1fc2VnbWVudFJhbmtzKXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudFJhbmtXaXRoSW5kZXgobik7dGhpcy5zZXRTZWdtZW50UmFua1dpdGhJbmRleChpLHQpfWZvcihsZXQgbz0wLGE9dGhpcy5tX2luZGljZXMubGVuZ3RoO288YTtvKyspaWYobyE9PXRoaXMubV9zZWxlY3Rpb25JbmRleCYmbnVsbCE9PXR
1oaXMubV9pbmRpY2VzW29dKXtjb25zdCBzPXRoaXMuZ2V0VXNlckluZGV4KHQsbyk7dGhpcy5zZXRVc2VySW5kZXgoZSxvLHMpfWNvbnN0IHI9dGhpcy5zZWxlY3RlZCh0KTtyIT09dGhpcy5zZWxlY3RlZChlKSYmKHI/dGhpcy5zZWxlY3QoZSk6dGhpcy51bnNlbGVjdChlKSl9c3BsaXRTZWdtZW50QXhpc0F3YXJlKHQscyxuLGkscil7bGV0IG89MDtjb25zdCBhPXRoaXMuZ2V0TmV4dFZlcnRleCh0KTthPT09Z3ImJmUoXCJcIik7Y29uc3QgaD10aGlzLmdldFZlcnRleEluZGV4KHQpLHU9dGhpcy5nZXRWZXJ0ZXhJbmRleChhKSxtPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChoKTtsZXQgbD10aGlzLm1fdmVydGljZXMuZ2V0U2hvcnRlc3REaXN0YW5jZShoLHUpO2NvbnN0IGM9dGhpcy5nZXRQYXRoRnJvbVZlcnRleCh0KSxnPXRoaXMubV9iSGFzQXR0cmlidXRlcztnJiZtJiYobD1tLmNhbGN1bGF0ZUxlbmd0aDJEKCkpO2NvbnN0IGQ9dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKHQpLF89dGhpcy5nZXRIZWxwZXJQb2ludCgpO2lmKG0pe2xldCB0PTAsZT0wLHI9Z3I7Zm9yKGxldCBwPTA7cDxuO3ArKyl7Y29uc3Qgbj1zW3BdO2lmKHQ8biYmbjwxKXtjb25zdCBzPW0uY3V0KHQsbik7aWYobnVsbCE9PWkmJihwPjAmJnMuc2V0U3RhcnRYWShpW3AtMV0pLHMuc2V0RW5kWFkoaVtwXSkscy5ub3JtYWxpemVBZnRlckVuZHBvaW50Q2hhbmdlKCksZT1wKSxnKXtjb25zdCB0PWw+MD9tLmNhbGN1bGF0ZVN1Ykxlbmd0aEZyb21TdGFydChuKS9sOjA7dGhpcy5tX3ZlcnRpY2VzLmludGVycG9sYXRlVHdvVmVydGljZXMoaCx1LHQsXyl9Xy5zZXRYWShzLmdldEVuZFhZKCkpLHI9dGhpcy5pbnNlcnRWZXJ0ZXgoYyxhLF8pLG8rKztjb25zdCBmPXRoaXMuZ2V0UHJldlZlcnRleChyKSxQPXRoaXMuZ2V0VmVydGV4SW5kZXgoZik7dGhpcy5zZXRTZWdtZW50VG9JbmRleChQLHMpLC0xIT09ZCYmdGhpcy5zZXRTZWdtZW50UGFyZW50YWdlQW5kQnJlYWsocixkLCExKSx0PW59fWlmKHIhPT1ncil7Y29uc3Qgcz1tLmN1dCh0LDEpO251bGwhPT1pJiYocy5zZXRTdGFydFhZKGlbZV0pLHMubm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpKTtjb25zdCBuPXRoaXMuZ2V0VmVydGV4SW5kZXgocik7dGhpcy5zZXRTZWdtZW50VG9JbmRleChuLHMpfX1lbHNle2xldCB0PTA7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3Qgbj1zW2VdO2lmKHQ8biYmbjwxKXt0aGlzLm1fdmVydGljZXMuaW50ZXJwb2xhdGVUd29WZXJ0aWNlcyhoLHUsbixfKTtjb25zdCB0PXRoaXMuaW5zZXJ0VmVydGV4KGMsYSxfKTtvKyssLTEhPT1kJiZ0aGlzLnNldFNlZ21lbnRQYXJlbnRhZ2VBbmRCcmVhayh0LGQsITEpfXQ9bn19cmV0dXJuIG99c3BsaXRTZWdtZW50KHQsZSxzLG49bnVsbCl7cmV0dXJuIHRoaXMuc3BsaXRTZWdtZW50QXhpc0F3YXJlKHQsZSxzLG4sLTEpfXNuYXBDb250cm9sUG9pbnRzKHQscyxuKXt0aGlzLmdldE5leHRWZXJ0ZXgodCk9PT1nciYmZShcIlwiKTtsZXQgaT10LHI9ITE7Zm9yKGxldCBlPTA7ZTxzOysrZSl7Y29uc3QgdD10aGlzLmdldFZlcnRleEluZGV4KGkpLGU9dGhpcy5nZXRTZWdtZW50RnJvbUluZGV4KHQpO2lmKGUpe2NvbnN0IHQ9ZS5zbmFwQ29udHJvbFBvaW50cyhuKTtyfHw9dH1pPXRoaXMuZ2V0TmV4dFZlcnRleChpKX1yZXR1cm4gcn1zbmFwQ29udHJvbFBvaW50c09uU2VsZWN0aW9uKHQpe2lmKCF0aGlzLmhhc0N1cnZlcygpKXJldHVybiExO2xldCBlPTA7Y29uc3Qgcz10aGlzLnF1ZXJ5VmVydGV4SXRlcmF0b3JPblNlbGVjdGlvbigpO2ZvcihsZXQgbj1zLm5leHQoKTtuIT09Z3I7bj1zLm5leHQoKSl7Y29uc3Qgcz10aGlzLmdldFZlcnRleEluZGV4KG4pLGk9dGhpcy5nZXRTZWdtZW50RnJvbUluZGV4KHMpO2kmJihlfD1pLnNuYXBDb250cm9sUG9pbnRzKHQpPzE6MCl9cmV0dXJuIDAhPT1lfWNhbGN1bGF0ZVN1Ykxlbmd0aDJEKHQsZSxuKXtyZXR1cm4gcygwKSwwfXNldFBvaW50KHQsZSxzKXtpZih0aGlzLnNldFBvaW50T25seSh0LGUpLG51bGwhPT10aGlzLm1fc2VnbWVudHMpe2NvbnN0IG49dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KSxpPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChuKTtudWxsIT09aSYmKGkuc2V0U3RhcnRYWShlLmdldFhZKCkpLGkubm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpLHMmJmkuZW5zdXJlWFlNb25vdG9uZSgpKTtjb25zdCByPXRoaXMuZ2V0UHJldlZlcnRleCh0KTtpZihyIT09Z3Ipe2NvbnN0IHQ9dGhpcy5nZXRWZXJ0ZXhJbmRleChyKSxuPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleCh0KTtudWxsIT09biYmKG4uc2V0RW5kWFkoZS5nZXRYWSgpKSxuLm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKSxzJiZuLmVuc3VyZVhZTW9ub3RvbmUoKSl9fX1zZXRQb2ludEV4KHQsZSxzLG4saSl7dGhpcy5zZXRQb2ludCh0LGUsaSk7Y29uc3Qgcj10aGlzLmdldFZlcnRleEluZGV4KHQpO3RoaXMuc2V0V2VpZ2h0V2l0aEluZGV4KHIsbiksdGhpcy5zZXRSYW5rV2l0aEluZGV4KHIscyl9c2V0UG9pbnRPbmx5KHQsZSl7Y29uc3Qgcz10aGlzLmdldFZlcnRleEluZGV4KHQpO3RoaXMubV92ZXJ0aWNlcy5zZXRQb2ludEJ5VmFsTm9DdXJ2ZXMocyxlKX1zZXRQb2ludE9ubHlFeCh0LGUsbixpKXtzKDApfXF1ZXJ5UG9pbnQodCxlKXtjb25zdCBzPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7dGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50QnlWYWwocyxlKX1zZXRYWSh0LGUpe3RoaXMuc2V0WFlDb29yZHModCxlLngsZS55KX1zZXRYWUNvb3Jkcyh0LGUscyl7Y29uc3Qgbj10aGlzLmdldFZlcnRleEluZGV4KHQpO2lmKHRoaXMubV92ZXJ0aWNlcz8uc2V0WFlDb29yZHNOb0N1cnZlcyhuLGUscyksbnVsbCE9PXRoaXMubV9zZWdtZW50cyl7Y29uc3QgaT10aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgobik7bnVsbCE9PWkmJihpLnNldFN0YXJ0WFlDb29yZHMoZSxzKSxpLm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKSk7Y29uc3Qgcj10aGlzLmdldFByZXZWZXJ0ZXgodCk7aWYociE9PWdyKXtjb25zdCB0PXRoaXMuZ2V0VmVydGV4SW5kZXgociksbj10aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgodCk7bnVsbCE9biYmKG4uc2V0RW5kWFlDb29yZH
1MoZSxzKSxuLm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKSl9fX1zZXRYWU1vbm90b25pYyh0LGUscyl7Y29uc3Qgbj10aGlzLmdldFZlcnRleEluZGV4KHQpO2lmKHRoaXMubV92ZXJ0aWNlcy5zZXRYWUNvb3Jkc05vQ3VydmVzKG4sZSxzKSxudWxsIT09dGhpcy5tX3NlZ21lbnRzKXtjb25zdCBpPXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChuKTtpZihudWxsIT09aSl7Y29uc3QgdD1pLmdldEVuZFhZKCk7aS5zZXRDb29yZHNGb3JJbnRlcnNlY3RvcihuZXcgSihlLHMpLHQsITEpLGkuZW5zdXJlWFlNb25vdG9uZSgpfWNvbnN0IHI9dGhpcy5nZXRQcmV2VmVydGV4KHQpO2lmKHIhPT1ncil7Y29uc3QgdD10aGlzLmdldFZlcnRleEluZGV4KHIpLG49dGhpcy5nZXRTZWdtZW50RnJvbUluZGV4KHQpO2lmKG51bGwhPT1uKXtjb25zdCB0PW4uZ2V0U3RhcnRYWSgpO24uc2V0Q29vcmRzRm9ySW50ZXJzZWN0b3IodCxuZXcgSihlLHMpLCExKSxuLmVuc3VyZVhZTW9ub3RvbmUoKX19fX1zZXRYWU1vbm90b25pY1BvaW50MkQodCxlKXt0aGlzLnNldFhZTW9ub3RvbmljKHQsZS54LGUueSl9cXVlcnlYWSh0LGUpe2NvbnN0IHM9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtyZXR1cm4gdGhpcy5tX3ZlcnRpY2VzLnF1ZXJ5WFkocyxlKX1nZXRYWSh0KXtjb25zdCBlPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7cmV0dXJuIHRoaXMubV92ZXJ0aWNlcy5nZXRYWShlKX1nZXRYWVdpdGhJbmRleCh0KXtyZXR1cm4gdGhpcy5tX3h5U3RyZWFtLnJlYWRQb2ludDJEKDIqdCl9c3RhdGljIHNldFNlZ0RlZmF1bHQodCxlLG4pe3MoMCl9c2V0WFlaKHQsZSxuKXtzKDApfXNldFhZWkNvb3Jkcyh0LGUsbixpKXtzKDApfXF1ZXJ5WFlaKHQsZSl7cygwKX1nZXRYWVoodCl7cmV0dXJuIHMoMCksWS5nZXROQU4oKX1nZXRYWVpXaXRoSW5kZXgodCl7cmV0dXJuIHMoMCksWS5nZXROQU4oKX1tZXJnZVZlcnRleERlc2NyaXB0aW9uKHQpe3RoaXMubV92ZXJ0aWNlc01wLm1lcmdlVmVydGV4RGVzY3JpcHRpb24odCksdGhpcy5tX3ZlcnRleERlc2NyaXB0aW9uPXRoaXMubV92ZXJ0aWNlc01wLmdldERlc2NyaXB0aW9uKCksdGhpcy5tX2JIYXNBdHRyaWJ1dGVzPXRoaXMubV92ZXJ0ZXhEZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpPjF9YWRkQXR0cmlidXRlKHQpe3MoMCl9Z2V0QXR0cmlidXRlQXNEYmwodCxlLHMpe3JldHVybiB0aGlzLm1fdmVydGljZXMuZ2V0QXR0cmlidXRlQXNEYmwodCx0aGlzLmdldFZlcnRleEluZGV4KGUpLHMpfXF1ZXJ5QXR0cmlidXRlQXNEYmwodCxlLG4saSl7cygwKX1zZXRBdHRyaWJ1dGUodCxlLG4saSl7cygwKX1zZXRBdHRyaWJ1dGVJbnQodCxlLG4saSl7cygwKX1nZXRWZXJ0ZXhEZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLm1fdmVydGV4RGVzY3JpcHRpb259Z2V0TWluUGF0aFZlcnRleFkodCl7cmV0dXJuIHMoMCksMH1nZXRWZXJ0ZXhJbmRleCh0KXtyZXR1cm4gdGhpcy5tX3ZlcnRleEluZGV4TGlzdC5nZXRGaWVsZCh0LDApfWdldFkodCl7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO3JldHVybiB0aGlzLm1fdmVydGljZXMucXVlcnlYWShlLHRoaXMubV93b3JrUG9pbnQyRCksdGhpcy5tX3dvcmtQb2ludDJELnl9Z2V0WCh0KXtyZXR1cm4gdGhpcy5nZXRYWSh0KS54fWlzRXF1YWxYWSh0LGUpe3JldHVybiB0aGlzLnF1ZXJ5WFkodCx0aGlzLm1fd29ya1BvaW50MkQpLHRoaXMucXVlcnlYWShlLHRoaXMubV93b3JrUG9pbnQyXzJEKSx0aGlzLm1fd29ya1BvaW50MkQuaXNFcXVhbFBvaW50MkQodGhpcy5tX3dvcmtQb2ludDJfMkQpfWlzRXF1YWxYWVBvaW50MkQodCxlKXtyZXR1cm4gdGhpcy5xdWVyeVhZKHQsdGhpcy5tX3dvcmtQb2ludDJEKSx0aGlzLm1fd29ya1BvaW50MkQuaXNFcXVhbFBvaW50MkQoZSl9aXNFcXVhbFhZWlBvaW50M0QodCxlKXtyZXR1cm4gcygwKSwhMX1zZXRXZWlnaHQodCxlKXtlPDEmJihlPTEpO2NvbnN0IHM9MT09PWU7aWYobnVsbD09dGhpcy5tX3dlaWdodHMpe2lmKHMpcmV0dXJuO3RoaXMubV93ZWlnaHRzPXoodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKSwxKX1jb25zdCBuPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7aWYobj49dGhpcy5tX3dlaWdodHMuc2l6ZSgpKXtpZihzKXJldHVybjt0aGlzLm1fd2VpZ2h0cy5yZXNpemUobisxLDEpfXRoaXMubV93ZWlnaHRzLndyaXRlKG4sZSl9c2V0V2VpZ2h0V2l0aEluZGV4KHQsZSl7ZTwxJiYoZT0xKTtjb25zdCBzPTE9PT1lO2lmKG51bGw9PT10aGlzLm1fd2VpZ2h0cyl7aWYocylyZXR1cm47dGhpcy5tX3dlaWdodHM9eih0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpLDEpfWlmKHQ+PXRoaXMubV93ZWlnaHRzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3dlaWdodHMucmVzaXplKHQrMSwxKX10aGlzLm1fd2VpZ2h0cy53cml0ZSh0LGUpfWdldFdlaWdodCh0KXtpZihudWxsPT09dGhpcy5tX3dlaWdodHMpcmV0dXJuIDE7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO3JldHVybiBlPj10aGlzLm1fd2VpZ2h0cy5zaXplKCk/MTp0aGlzLm1fd2VpZ2h0cy5yZWFkKGUpfWdldFdlaWdodFdpdGhJbmRleCh0KXtyZXR1cm4gbnVsbD09PXRoaXMubV93ZWlnaHRzfHx0Pj10aGlzLm1fd2VpZ2h0cy5zaXplKCk/MTp0aGlzLm1fd2VpZ2h0cy5yZWFkKHQpfWdldFJhbmsodCl7aWYobnVsbD09PXRoaXMubV9yYW5rcylyZXR1cm4gZHI7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO3JldHVybiBlPj10aGlzLm1fcmFua3Muc2l6ZSgpP2RyOnRoaXMubV9yYW5rcy5yZWFkKGUpfWdldFJhbmtXaXRoSW5kZXgodCl7cmV0dXJuIG51bGw9PT10aGlzLm1fcmFua3N8fHQ+PXRoaXMubV9yYW5rcy5zaXplKCk/ZHI6dGhpcy5tX3JhbmtzLnJlYWQodCl9c2V0UmFuayh0LGUpe2U8ZHImJihlPWRyKTtjb25zdCBzPWU9PT1kcjtpZihudWxsPT09dGhpcy5tX3JhbmtzKXtpZihzKXJldHVybjt0aGlzLm1fcmFua3M9TCh0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpLGRyKX1jb25zdCBuPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7aWYobj49dGhpcy5tX3JhbmtzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3JhbmtzLnJlc2l6ZShuKzEsZHIpfXRoaXMubV9yYW5rcy53cml0ZShuLGUpfXNldFJhbmtXaXRoSW5kZXgodCxlKXtlPGRyJiYoZT1kcik7Y29uc3Qgcz1lPT09ZHI7aWYobnVsbD09PXR
1oaXMubV9yYW5rcyl7aWYocylyZXR1cm47dGhpcy5tX3JhbmtzPUwodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKSxkcil9aWYodD49dGhpcy5tX3JhbmtzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3JhbmtzLnJlc2l6ZSh0KzEsZHIpfXRoaXMubV9yYW5rcy53cml0ZSh0LGUpfXNldFNlZ21lbnRXZWlnaHQodCxlKXtlPDEmJihlPTEpO2NvbnN0IHM9MT09PWU7aWYobnVsbD09PXRoaXMubV9zZWdtZW50V2VpZ2h0cyl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRXZWlnaHRzPXoodGhpcy5tX3ZlcnRpY2VzLmdldFBvaW50Q291bnQoKSwxKX1jb25zdCBuPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7aWYobj49dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnJlc2l6ZShuKzEsMSl9dGhpcy5tX3NlZ21lbnRXZWlnaHRzLndyaXRlKG4sZSl9c2V0U2VnbWVudFdlaWdodFdpdGhJbmRleCh0LGUpe2U8MSYmKGU9MSk7Y29uc3Qgcz0xPT09ZTtpZihudWxsPT10aGlzLm1fc2VnbWVudFdlaWdodHMpe2lmKHMpcmV0dXJuO3RoaXMubV9zZWdtZW50V2VpZ2h0cz16KHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCksMSl9aWYodD49dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnJlc2l6ZSh0KzEsMSl9dGhpcy5tX3NlZ21lbnRXZWlnaHRzLndyaXRlKHQsZSl9Z2V0U2VnbWVudFdlaWdodCh0KXtpZihudWxsPT09dGhpcy5tX3NlZ21lbnRXZWlnaHRzKXJldHVybiAxO2NvbnN0IGU9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtyZXR1cm4gZT49dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnNpemUoKT8xOnRoaXMubV9zZWdtZW50V2VpZ2h0cy5yZWFkKGUpfWdldFNlZ21lbnRXZWlnaHRXaXRoSW5kZXgodCl7cmV0dXJuIG51bGw9PXRoaXMubV9zZWdtZW50V2VpZ2h0c3x8dD49dGhpcy5tX3NlZ21lbnRXZWlnaHRzLnNpemUoKT8xOnRoaXMubV9zZWdtZW50V2VpZ2h0cy5yZWFkKHQpfWdldFNlZ21lbnRSYW5rKHQpe2lmKG51bGw9PT10aGlzLm1fc2VnbWVudFJhbmtzKXJldHVybiB5ci5zdF9kZWZhdWx0UmFuaztjb25zdCBlPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7cmV0dXJuIGU+PXRoaXMubV9zZWdtZW50UmFua3Muc2l6ZSgpP3lyLnN0X2RlZmF1bHRSYW5rOnRoaXMubV9zZWdtZW50UmFua3MucmVhZChlKX1nZXRTZWdtZW50UmFua1dpdGhJbmRleCh0KXtyZXR1cm4gbnVsbD09PXRoaXMubV9zZWdtZW50UmFua3N8fHQ+PXRoaXMubV9zZWdtZW50UmFua3Muc2l6ZSgpP2RyOnRoaXMubV9zZWdtZW50UmFua3MucmVhZCh0KX1zZXRTZWdtZW50UmFuayh0LGUpe2U8ZHImJihlPWRyKTtjb25zdCBzPWU9PT1kcjtpZihudWxsPT09dGhpcy5tX3NlZ21lbnRSYW5rcyl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRSYW5rcz1MKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCksZHIpfWNvbnN0IG49dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtpZihuPj10aGlzLm1fc2VnbWVudFJhbmtzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRSYW5rcy5yZXNpemUobisxLGRyKX10aGlzLm1fc2VnbWVudFJhbmtzLndyaXRlKG4sZSl9c2V0U2VnbWVudFJhbmtXaXRoSW5kZXgodCxlKXtlPGRyJiYoZT1kcik7Y29uc3Qgcz1lPT09ZHI7aWYobnVsbD09PXRoaXMubV9zZWdtZW50UmFua3Mpe2lmKHMpcmV0dXJuO3RoaXMubV9zZWdtZW50UmFua3M9TCh0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpLGRyKX1pZih0Pj10aGlzLm1fc2VnbWVudFJhbmtzLnNpemUoKSl7aWYocylyZXR1cm47dGhpcy5tX3NlZ21lbnRSYW5rcy5yZXNpemUodCsxLGRyKX10aGlzLm1fc2VnbWVudFJhbmtzLndyaXRlKHQsZSl9cmVtb3ZlV2VpZ2h0cygpe3RoaXMubV93ZWlnaHRzPW51bGwsdGhpcy5tX3NlZ21lbnRXZWlnaHRzPW51bGx9cmVtb3ZlUmFua3MoKXt0aGlzLm1fcmFua3M9bnVsbCx0aGlzLm1fc2VnbWVudFJhbmtzPW51bGx9c2V0VXNlckluZGV4KHQsZSxzKXtjb25zdCBuPXRoaXMubV9pbmRpY2VzW2VdLGk9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtpZihuLnNpemUoKTw9aSl7aWYoLTE9PT1zKXJldHVybjtuLnJlc2l6ZSh0aGlzLm1fdmVydGljZXMuZ2V0UG9pbnRDb3VudCgpLC0xKX1uLndyaXRlKGkscyl9Z2V0VXNlckluZGV4KHQsZSl7Y29uc3Qgcz10aGlzLmdldFZlcnRleEluZGV4KHQpLG49dGhpcy5tX2luZGljZXNbZV07aWYoczxuLnNpemUoKSl7cmV0dXJuIG4ucmVhZChzKX1yZXR1cm4tMX1hZGRUb1VzZXJJbmRleCh0LGUscyl7Y29uc3Qgbj10aGlzLm1faW5kaWNlc1tlXSxpPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7bi5zaXplKCk8PWkmJm4ucmVzaXplKHRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCksLTEpO2NvbnN0IHI9bi5yZWFkKGkpO24ud3JpdGUoaSxyK3MpfWNyZWF0ZVVzZXJJbmRleCgpe2ZvcihsZXQgZT0wO2U8dGhpcy5tX2luZGljZXMubGVuZ3RoO2UrKylpZihudWxsPT09dGhpcy5tX2luZGljZXNbZV0pcmV0dXJuIHRoaXMubV9pbmRpY2VzW2VdPXRoaXMuYWxsb2NhdGVJbmRleCgpLGU7dGhpcy5tX2luZGljZXMucHVzaCh0aGlzLmFsbG9jYXRlSW5kZXgoKSk7Y29uc3QgdD10aGlzLm1faW5kaWNlcy5sZW5ndGgtMTtyZXR1cm4gcyh0Pj0wJiZ0PD1LKCkpLHR9Y3JlYXRlVXNlckluZGV4VW5pbml0aWFsaXplZCgpe2ZvcihsZXQgZT0wO2U8dGhpcy5tX2luZGljZXMubGVuZ3RoO2UrKylpZihudWxsPT09dGhpcy5tX2luZGljZXNbZV0pcmV0dXJuIHRoaXMubV9pbmRpY2VzW2VdPXRoaXMuYWxsb2NhdGVJbmRleCghMSksZTt0aGlzLm1faW5kaWNlcy5wdXNoKHRoaXMuYWxsb2NhdGVJbmRleCghMSkpO2NvbnN0IHQ9dGhpcy5tX2luZGljZXMubGVuZ3RoLTE7cmV0dXJuIHModD49MCYmdDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHR9ZmlsbFVzZXJJbmRleEZvckdlb21ldHJ5KHQsZSxzKXtjb25zdCBuPXRoaXMubV9pbmRpY2VzW2VdLGk9bi5zaXplKCk7Zm9yKGxldCByPXRoaXMuZ2V0Rmlyc3RQYXRoKHQpO3IhPT1ncjtyPXRoaXMuZ2V0TmV4dFBhdGgocikpe2xldCB0PXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgocik7Zm9yKGxldCBlPTAsbz10aGlzLmdldFBhdGhTaXplKHIpO2U8bztlKyssdD10aGlzLmdldE5leHRWZXJ0ZXgodCkpe2NvbnN0IGU9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtlPGkmJm4ud3JpdGUoZSxzKX19fWZpbGxVc2VySW5kZXhGb3JTZWxlY3Rpb24odCxlKXtzKDApfXJlbW92ZVVzZXJJbmRleCh0KXtmb3IodGhpcy5yZWN5Y2xlVXNlckluZGV4KHRoaXMubV9pbmRpY2VzW3RdKSx0aGlzLm1faW5kaWNlc1t0XT1udWxsO3RoaXMubV9pbmRpY2VzLmxlbmd0aD4wJiZudWxsPT09dGhpcy5tX2luZGljZXNbdGhpcy5tX2luZGljZXMubGVuZ3RoLTFdOyl0aGlzLm1faW5kaWNlcy5wb3AoKX1yZXBsYWNlQ3VydmVXaXRoTGluZSh0KXtpZihudWxsIT09dGhpcy5tX3NlZ21lbnRzKXtjb25zdCBlPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7dGhpcy5zZXRTZWdtZW50VG9JbmRleChlLG51bGwpfX1xdWVyeUxpbmVDb25uZWN0b3IodCxlLHM9ITEpe2NvbnN0IG49dGhpcy5nZXROZXh0VmVydGV4KHQpO2lmKG49PT1ncilyZXR1cm4hMTtpZighdGhpcy5tX2JIYXNBdHRyaWJ1dGVzfHxzKXtjb25zdCBzPXRoaXMuZ2V0WFkodCk7ZS5zZXRTdGFydFhZKHMpO2NvbnN0IGk9dGhpcy5nZXRYWShuKTtlLnNldEVuZFhZKGkpfWVsc2V7Y29uc3Qgcz1uZXcgRih7dmQ6dGhpcy5nZXRWZXJ0ZXhEZXNjcmlwdGlvbigpfSk7dGhpcy5xdWVyeVBvaW50KHQscyksZS5zZXRTdGFydChzKSx0aGlzLnF1ZXJ5UG9pbnQobixzKSxlLnNldEVuZChzKX1yZXR1cm4hMH1xdWVyeUxpbmVDb25uZWN0b3IzRCh0LGUsbj0hMSl7cmV0dXJuIHMoMCksITF9aGFzQ3VydmVzKCl7cmV0dXJuIG51bGwhPT10aGlzLm1fc2VnbWVudHN9Z2VvbWV0cnlIYXNDdXJ2ZXModCl7cmV0dXJuIHMoMCksITF9cGF0aEhhc0N1cnZlcyh0KXtpZighdGhpcy5oYXNDdXJ2ZXMoKSlyZXR1cm4hMTtjb25zdCBlPXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgodCk7aWYoZT09PWdyKXJldHVybiExO2NvbnN0IHM9dGhpcy5nZXRQYXRoU2l6ZSh0KTtsZXQgbj1lO2ZvcihsZXQgcj0wO3I8cztyKyssbj10aGlzLmdldE5leHRWZXJ0ZXgobikpe2NvbnN0IHQ9dGhpcy5nZXRTZWdtZW50KG4pO2lmKG51bGwhPT10JiZ0LmdldEdlb21ldHJ5VHlwZSgpIT09aS5lbnVtTGluZSlyZXR1cm4hMH1yZXR1cm4hMX1pbnNlcnRQYXRoKHQscyl7bGV0IG49Z3I7cyE9PWdyPyh0IT09dGhpcy5nZXRHZW9tZXRyeUZyb21QYXRoKHMpJiZlKFwiXCIpLG49dGhpcy5nZXRQcmV2UGF0aChzKSk6bj10aGlzLmdldExhc3RQYXRoKHQpO2NvbnN0IGk9dGhpcy5uZXdQYXRoKHQpO3JldHVybiBzIT09Z3ImJnRoaXMuc2V0UHJldlBhdGgocyxpKSx0aGlzLnNldE5leHRQYXRoKGkscyksdGhpcy5zZXRQcmV2UGF0aChpLG4pLG4hPT1ncj90aGlzLnNldE5leHRQYXRoKG4saSk6dGhpcy5zZXRGaXJzdFBhdGgodCxpKSxzPT09Z3ImJnRoaXMuc2V0TGFzdFBhdGgodCxpKSx0aGlzLnNldEdlb21ldHJ5UGF0aENvdW50KHQsdGhpcy5nZXRQYXRoQ291bnQodCkrMSksaX1yZW1vdmVQYXRoKHQpe2NvbnN0IGU9dGhpcy5nZXRQcmV2UGF0aCh0KSxzPXRoaXMuZ2V0TmV4dFBhdGgodCksbj10aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgodCk7cmV0dXJuIGUhPT1ncj90aGlzLnNldE5leHRQYXRoKGUscyk6dGhpcy5zZXRGaXJzdFBhdGgobixzKSxzIT09Z3I/dGhpcy5zZXRQcmV2UGF0aChzLGUpOnRoaXMuc2V0TGFzdFBhdGgobixlKSx0aGlzLmNsZWFyUGF0aCh0KSx0aGlzLnNldEdlb21ldHJ5UGF0aENvdW50KG4sdGhpcy5nZXRQYXRoQ291bnQobiktMSksdGhpcy5mcmVlUGF0aC
1h0KSxzfWNsZWFyUGF0aCh0KXtjb25zdCBlPXRoaXMuZ2V0Rmlyc3RWZXJ0ZXgodCk7aWYoZSE9PWdyKXtsZXQgcz1lO2ZvcihsZXQgZT0wLGk9dGhpcy5nZXRQYXRoU2l6ZSh0KTtlPGk7ZSsrKXtjb25zdCB0PXM7cz10aGlzLmdldE5leHRWZXJ0ZXgocyksdGhpcy5mcmVlVmVydGV4KHQpfWNvbnN0IG49dGhpcy5nZXRHZW9tZXRyeUZyb21QYXRoKHQpO3RoaXMuc2V0R2VvbWV0cnlWZXJ0ZXhDb3VudChuLHRoaXMuZ2V0UG9pbnRDb3VudChuKS10aGlzLmdldFBhdGhTaXplKHQpKX10aGlzLnNldFBhdGhTaXplKHQsMCl9Z2V0TmV4dFBhdGgodCl7cmV0dXJuIHRoaXMubV9wYXRoSW5kZXhMaXN0LmdldEZpZWxkKHQsMil9Z2V0UHJldlBhdGgodCl7cmV0dXJuIHRoaXMubV9wYXRoSW5kZXhMaXN0LmdldEZpZWxkKHQsMSl9Z2V0UGF0aFNpemUodCl7cmV0dXJuIHRoaXMubV9wYXRoSW5kZXhMaXN0LmdldEZpZWxkKHQsMyl9aXNDbG9zZWRQYXRoKHQpe3JldHVybiEhKDEmdGhpcy5nZXRQYXRoRmxhZ3ModCkpfXNldENsb3NlZFBhdGgodCxlKXtpZih0aGlzLmlzQ2xvc2VkUGF0aCh0KT09PWUpcmV0dXJuO2lmKHRoaXMuZ2V0UGF0aFNpemUodCk+MCl7Y29uc3Qgcz10aGlzLmdldEZpcnN0VmVydGV4KHQpLG49dGhpcy5nZXRMYXN0VmVydGV4KHQpO2lmKGUpe3RoaXMuc2V0TmV4dFZlcnRleChuLHMpLHRoaXMuc2V0UHJldlZlcnRleChzLG4pO2NvbnN0IHQ9dGhpcy5nZXRWZXJ0ZXhJbmRleChuKTt0aGlzLnNldFNlZ21lbnRUb0luZGV4KHQsbnVsbCl9ZWxzZXt0aGlzLnNldE5leHRWZXJ0ZXgobixnciksdGhpcy5zZXRQcmV2VmVydGV4KHMsZ3IpO2NvbnN0IHQ9dGhpcy5nZXRWZXJ0ZXhJbmRleChuKTt0aGlzLnNldFNlZ21lbnRUb0luZGV4KHQsbnVsbCl9fWNvbnN0IHM9KDF8dGhpcy5nZXRQYXRoRmxhZ3ModCkpLTE7dGhpcy5zZXRQYXRoRmxhZ3ModCxzfChlPzE6MCkpfWNsb3NlQWxsUGF0aHModCl7cygwKX1pc1N0cm9uZ1BhdGhTdGFydCh0KXtyZXR1cm4hISg4JnRoaXMuZ2V0UGF0aEZsYWdzKHQpKX1pc1N0cm9uZ1BhdGhFbmQodCl7cmV0dXJuISEoMTYmdGhpcy5nZXRQYXRoRmxhZ3ModCkpfXNldFN0cm9uZ1BhdGhTdGFydCh0LGUpe2NvbnN0IHM9KDh8dGhpcy5nZXRQYXRoRmxhZ3ModCkpLTg7dGhpcy5zZXRQYXRoRmxhZ3ModCxzfChlPzg6MCkpfXNldFN0cm9uZ1BhdGhFbmQodCxlKXtjb25zdCBzPSgxNnx0aGlzLmdldFBhdGhGbGFncyh0KSktMTY7dGhpcy5zZXRQYXRoRmxhZ3ModCxzfChlPzE2OjApKX1nZXRHZW9tZXRyeUZyb21QYXRoKHQpe3JldHVybiB0aGlzLm1fcGF0aEluZGV4TGlzdC5nZXRGaWVsZCh0LDcpfWlzRXh0ZXJpb3IodCl7cmV0dXJuISEoMiZ0aGlzLmdldFBhdGhGbGFncyh0KSl9c2V0RXh0ZXJpb3IodCxlKXtjb25zdCBzPSgyfHRoaXMuZ2V0UGF0aEZsYWdzKHQpKS0yO3RoaXMuc2V0UGF0aEZsYWdzKHQsc3woZT8yOjApKX1nZXRSaW5nQXJlYSh0KXtpZih0aGlzLmlzUmluZ0FyZWFWYWxpZCh0KSlyZXR1cm4gdGhpcy5tX3BhdGhBcmVhc1t0aGlzLmdldFBhdGhJbmRleCh0KV07Y29uc3QgZT10aGlzLmdldEZpcnN0VmVydGV4KHQpO2lmKGU9PT1ncilyZXR1cm4gMDtjb25zdCBzPXRoaXMuZ2V0WFkoZSksbj1uZXcgZnQoMCkscj10aGlzLmdldFBhdGhTaXplKHQpO2lmKHI+Mil7Y29uc3QgdD1zLmNsb25lKCksaT10Lngsbz10Lnk7bGV0IGE9dGhpcy5nZXROZXh0VmVydGV4KGUpO2NvbnN0IGg9dGhpcy5nZXRYWShhKTthPXRoaXMuZ2V0TmV4dFZlcnRleChhKTtjb25zdCB1PUouZ2V0TkFOKCk7Zm9yKGxldCBlPTI7ZTxyO2UrKyxhPXRoaXMuZ2V0TmV4dFZlcnRleChhKSl0aGlzLnF1ZXJ5WFkoYSx1KSxuLnBlKCh1LngtdC54KSooaC55LW8pKSx0LnNldENvb3Jkc1BvaW50MkQoaCksaC5zZXRDb29yZHNQb2ludDJEKHUpO24ucGUoKGktdC54KSooaC55LW8pKX1pZih0aGlzLmhhc0N1cnZlcygpKXtsZXQgdD1lO2ZvcihsZXQgZT0wO2U8cjtlKyssdD10aGlzLmdldE5leHRWZXJ0ZXgodCkpe2NvbnN0IGU9dGhpcy5nZXRTZWdtZW50KHQpO2lmKG51bGw9PT1lfHxlLmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtTGluZSljb250aW51ZTtjb25zdCBzPTIqZS5jYWxjdWxhdGVBcmVhMkRIZWxwZXIoKTtuLnBlKHMpfX10aGlzLnNldFJpbmdBcmVhVmFsaWQodCwhMCk7Y29uc3Qgbz0uNSpuLmdldFJlc3VsdCgpO3JldHVybiB0aGlzLm1fcGF0aEFyZWFzW3RoaXMuZ2V0UGF0aEluZGV4KHQpXT1vLG99Z2V0UGF0aEluZGV4SW50ZXJuYWwodCl7cmV0dXJuIHRoaXMuZ2V0UGF0aEluZGV4KHQpfWdldFBhdGhJbnRlcm5hbEluZGV4RnJvbVZlcnRleCh0KXtyZXR1cm4gdGhpcy5nZXRQYXRoSW5kZXgodGhpcy5nZXRQYXRoRnJvbVZlcnRleCh0KSl9c2V0UGF0aFVzZXJJbmRleCh0LGUscyl7Y29uc3Qgbj10aGlzLm1fcGF0aGluZGljZXNbZV0saT10aGlzLmdldFBhdGhJbmRleCh0KTtuLnNpemUoKTx0aGlzLm1fcGF0aEFyZWFzLmxlbmd0aCYmbi5yZXNpemUodGhpcy5tX3BhdGhBcmVhcy5sZW5ndGgsLTEpLG4ud3JpdGUoaSxzKX1nZXRQYXRoVXNlckluZGV4KHQsZSl7Y29uc3Qgcz10aGlzLmdldFBhdGhJbmRleCh0KSxuPXRoaXMubV9wYXRoaW5kaWNlc1tlXTtyZXR1cm4gczxuLnNpemUoKT9uLnJlYWQocyk6LTF9Y3JlYXRlUGF0aFVzZXJJbmRleCgpe2ZvcihsZXQgZT0wO2U8dGhpcy5tX3BhdGhpbmRpY2VzLmxlbmd0aDtlKyspaWYobnVsbD09PXRoaXMubV9wYXRoaW5kaWNlc1tlXSlyZXR1cm4gdGhpcy5tX3BhdGhpbmRpY2VzW2VdPXRoaXMuYWxsb2NhdGVQYXRoSW5kZXgoKSxlO3RoaXMubV9wYXRoaW5kaWNlcy5wdXNoKHRoaXMuYWxsb2NhdGVQYXRoSW5kZXgoKSk7Y29uc3QgdD10aGlzLm1fcGF0aGluZGljZXMubGVuZ3RoLTE7cmV0dXJuIHModD49MCYmdDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHR9ZmlsbFBhdGhVc2VySW5kZXhGb3JHZW9tZXRyeSh0LGUscyl7Y29uc3Qgbj10aGlzLm1fcGF0aGluZGljZXNbZV0saT1uLnNpemUoKTtmb3IobGV0IHI9dGhpcy5nZXRGaXJzdFBhdGgodCk7ciE9PWdyO3I9dGhpcy5nZXROZXh0UGF0aChyKSl7Y29uc3QgdD10aGlzLmdldFBhdGhJbmRleChyKTt0PGkmJm4ud3JpdGUodCxzKX19cmVtb3ZlUGF0aFVzZXJJbmRleCh0KXtmb3IodGhpcy5yZWN5Y2xlUGF0aFVzZXJJbmRleCh0aGlzLm1fcGF0aGluZGljZXNbdF0pLHRoaXMubV9wYXRoaW5kaWNlc1t0XT1udWxsO3RoaXMubV9wYXRoaW5kaWNlcy5sZW5ndGg+MCYmbnVsbD09PXR
1oaXMubV9wYXRoaW5kaWNlcy5hdCgtMSk7KXRoaXMubV9wYXRoaW5kaWNlcy5wb3AoKX1tb3ZlUGF0aCh0LHMsbil7aWYobj09PWdyJiZlKFwiXCIpLHM9PT1uKXJldHVybjtjb25zdCBpPXRoaXMuZ2V0TmV4dFBhdGgobik7bGV0IHI9dGhpcy5nZXRQcmV2UGF0aChuKTtjb25zdCBvPXRoaXMuZ2V0R2VvbWV0cnlGcm9tUGF0aChuKTtyPT09Z3I/dGhpcy5zZXRGaXJzdFBhdGgobyxpKTp0aGlzLnNldE5leHRQYXRoKHIsaSksaT09PWdyP3RoaXMuc2V0TGFzdFBhdGgobyxyKTp0aGlzLnNldFByZXZQYXRoKGksciksdGhpcy5zZXRHZW9tZXRyeVZlcnRleENvdW50KG8sdGhpcy5nZXRQb2ludENvdW50KG8pLXRoaXMuZ2V0UGF0aFNpemUobikpLHRoaXMuc2V0R2VvbWV0cnlQYXRoQ291bnQobyx0aGlzLmdldFBhdGhDb3VudChvKS0xKSxyPXM9PT1ncj90aGlzLmdldExhc3RQYXRoKHQpOnRoaXMuZ2V0UHJldlBhdGgocyksdGhpcy5zZXRQcmV2UGF0aChuLHIpLHRoaXMuc2V0TmV4dFBhdGgobixzKSxzPT09Z3I/dGhpcy5zZXRMYXN0UGF0aCh0LG4pOnRoaXMuc2V0UHJldlBhdGgocyxuKSxyPT09Z3I/dGhpcy5zZXRGaXJzdFBhdGgodCxuKTp0aGlzLnNldE5leHRQYXRoKHIsbiksdGhpcy5zZXRHZW9tZXRyeVZlcnRleENvdW50KHQsdGhpcy5nZXRQb2ludENvdW50KHQpK3RoaXMuZ2V0UGF0aFNpemUobikpLHRoaXMuc2V0R2VvbWV0cnlQYXRoQ291bnQodCx0aGlzLmdldFBhdGhDb3VudCh0KSsxKSx0aGlzLnNldFBhdGhHZW9tZXRyeShuLHQpfWFkZFZlcnRleCh0LGUpe3RoaXMubV92ZXJ0aWNlcy5nZXRQb2ludEJ5VmFsKHRoaXMuZ2V0VmVydGV4SW5kZXgoZSksdGhpcy5nZXRIZWxwZXJQb2ludCgpKTtyZXR1cm4gdGhpcy5pbnNlcnRWZXJ0ZXhfKHQsZ3IsdGhpcy5nZXRIZWxwZXJQb2ludCgpLCExKX1pbnNlcnRWZXJ0ZXgodCxlLHMpe3JldHVybiB0aGlzLmluc2VydFZlcnRleF8odCxlLHMsITApfXJlbW92ZVZlcnRleCh0LGUpe2NvbnN0IHM9dGhpcy5nZXRQYXRoRnJvbVZlcnRleCh0KSxuPXRoaXMuZ2V0UHJldlZlcnRleCh0KSxpPXRoaXMuZ2V0TmV4dFZlcnRleCh0KTtuIT09Z3ImJnRoaXMuc2V0TmV4dFZlcnRleChuLGkpO2NvbnN0IHI9dGhpcy5nZXRQYXRoU2l6ZShzKTt0PT09dGhpcy5nZXRGaXJzdFZlcnRleChzKSYmdGhpcy5zZXRGaXJzdFZlcnRleChzLHI+MT9pOmdyKSxpIT09Z3ImJnRoaXMuc2V0UHJldlZlcnRleChpLG4pLHQ9PT10aGlzLmdldExhc3RWZXJ0ZXgocykmJnRoaXMuc2V0TGFzdFZlcnRleChzLHI+MT9uOmdyKTtpZih0aGlzLmhhc0N1cnZlcygpJiZuIT09Z3ImJmkhPT1ncil7Y29uc3Qgcz10aGlzLmdldFZlcnRleEluZGV4KHQpLHI9dGhpcy5nZXRWZXJ0ZXhJbmRleChuKSxvPXRoaXMuZ2V0VmVydGV4SW5kZXgoaSk7aWYoZSl7Y29uc3QgdD10aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgocik7aWYobnVsbCE9PXQpe2NvbnN0IGU9dGhpcy5tX3ZlcnRpY2VzLmdldFhZKG8pO3Quc2V0RW5kWFkoZSksdC5ub3JtYWxpemVBZnRlckVuZHBvaW50Q2hhbmdlKCl9dGhpcy5zZXRTZWdtZW50VG9JbmRleChzLG51bGwpfWVsc2V7Y29uc3QgdD10aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgocyk7aWYodGhpcy5zZXRTZWdtZW50VG9JbmRleChzLG51bGwpLG51bGwhPT10KXtjb25zdCBlPXRoaXMubV92ZXJ0aWNlcy5nZXRYWShyKTt0LnNldFN0YXJ0WFkoZSksdC5ub3JtYWxpemVBZnRlckVuZHBvaW50Q2hhbmdlKCl9dGhpcy5zZXRTZWdtZW50VG9JbmRleChyLHQpfX10aGlzLnNldFBhdGhTaXplKHMsci0xKTtjb25zdCBvPXRoaXMuZ2V0R2VvbWV0cnlGcm9tUGF0aChzKTtyZXR1cm4gdGhpcy5zZXRHZW9tZXRyeVZlcnRleENvdW50KG8sdGhpcy5nZXRQb2ludENvdW50KG8pLTEpLHRoaXMuZnJlZVZlcnRleCh0KSxpfXJlbW92ZVZlcnRpY2VzKHQsZSl7cyh0IT09ZSk7Y29uc3Qgbj10aGlzLmdldFBhdGhGcm9tVmVydGV4KHQpLGk9dGhpcy5nZXRQcmV2VmVydGV4KHQpLHI9dGhpcy5nZXRQcmV2VmVydGV4KGUpO2khPT1nciYmdGhpcy5zZXROZXh0VmVydGV4KGksZSk7bGV0IG89dGhpcy5nZXRQYXRoU2l6ZShuKTtjb25zdCBhPXRoaXMuZ2V0VmVydGV4SW5kZXgodCk7dGhpcy5zZXRTZWdtZW50VG9JbmRleChhLG51bGwpLHRoaXMuc2V0UHJldlZlcnRleChlLGkpLHRoaXMuc2V0UHJldlZlcnRleCh0LGdyKSx0aGlzLnNldE5leHRWZXJ0ZXgocixncik7bGV0IGg9MCx1PXQ7Y29uc3QgbT10aGlzLmdldEZpcnN0VmVydGV4KG4pO2xldCBsPSExO2Zvcig7Oyl7Y29uc3QgdD10aGlzLmdldE5leHRWZXJ0ZXgodSk7aWYobHx8PW09PT11LHRoaXMuZnJlZVZlcnRleCh1KSxoKyssdT09PXIpYnJlYWs7dT10fW8tPWgsbCYmdGhpcy5zZXRGaXJzdFZlcnRleChuLG8+MD9lOmdyKSx0aGlzLnNldFBhdGhTaXplKG4sbyk7Y29uc3QgYz10aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgobik7dGhpcy5zZXRHZW9tZXRyeVZlcnRleENvdW50KGMsdGhpcy5nZXRQb2ludENvdW50KGMpLWgpfWdldEZpcnN0VmVydGV4KHQpe3JldHVybiB0aGlzLm1fcGF0aEluZGV4TGlzdC5nZXRGaWVsZCh0LDQpfWdldExhc3RWZXJ0ZXgodCl7cmV0dXJuIHRoaXMubV9wYXRoSW5kZXhMaXN0LmdldEZpZWxkKHQsNSl9Z2V0TmV4dFZlcnRleCh0KXtyZXR1cm4gdGhpcy5tX3ZlcnRleEluZGV4TGlzdC5nZXRGaWVsZCh0LDIpfWdldFByZXZWZXJ0ZXgodCl7cmV0dXJuIHRoaXMubV92ZXJ0ZXhJbmRleExpc3QuZ2V0RmllbGQodCwxKX1nZXROZXh0VmVydGV4RXgodCxlKXtyZXR1cm4gZT4wP3RoaXMubV92ZXJ0ZXhJbmRleExpc3QuZ2V0RmllbGQodCwyKTp0aGlzLm1fdmVydGV4SW5kZXhMaXN0LmdldEZpZWxkKHQsMSl9Z2V0UHJldlZlcnRleEV4KHQsZSl7cmV0dXJuIGU+MD90aGlzLm1fdmVydGV4SW5kZXhMaXN0LmdldEZpZWxkKHQsMSk6dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5nZXRGaWVsZCh0LDIpfWdldFBhdGhGcm9tVmVydGV4KHQpe3JldHVybiB0aGlzLm1fdmVydGV4SW5kZXhMaXN0LmdldEZpZWxkKHQsMyl9YWRkUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5pbnNlcnRWZXJ0ZXhfKHQsZ3IsZSwhMSl9Z2V0R2VvbWV0cnlGcm9tVmVydGV4KHQpe3JldHVybiB0aGlzLmdldEdlb21ldHJ5RnJvbVBhdGgodGhpcy5nZXRQYXRoRnJvbVZlcnRleCh0KSl9cmVwbGFjZU5hTnModCxlKXt0aGlzLm1fdmVydGV4RGVzY3JpcHRpb24uaGFzQXR0cmlidXRlKHQpfHxoKFwiXCIpLHRoaXMubV92ZXJ0aWNlcy5yZXBsYWNlTmFOcyh0LGUpfXJlbW92ZU5hTlZlcnRpY2VzKCl7Zm9yKGxldCB0PXRoaXMuZ2V0Rmlyc3RHZW9tZXRyeSgpO3QhPT1ncjt0PXRoaXMuZ2V0TmV4dEdlb21ldHJ5KHQpKWZvcihsZXQgZT10aGlzLmdldEZpcnN0UGF0aCh0KTtlIT09Z3I7ZT10aGlzLmdldE5leHRQYXRoKGUpKXtsZXQgdD10aGlzLmdldEZpcnN0VmVydGV4KGUpO2ZvcihsZXQgcz0wLG49dGhpcy5nZXRQYXRoU2l6ZShlKTtzPG47cysrKXQ9dGhpcy5nZXRYWSh0KS5pc0Zpbml0ZSgpP3RoaXMuZ2V0TmV4dFZlcnRleCh0KTp0aGlzLnJlbW92ZVZlcnRleCh0LCEwKX19cXVlcnlWZXJ0ZXhJdGVyYXRvcih0PWdyKXtyZXR1cm4gdGhpcy5xdWVyeVZlcnRleEl0ZXJhdG9yRXgoITEsdCl9cXVlcnlWZXJ0ZXhJdGVyYXRvckV4KHQsZT1ncil7bGV0IHM9Z3Isbj1ncixpPWdyLHI9Z3Isbz0wLGE9ITE7Zm9yKHM9ZSE9PWdyP2U6dGhpcy5nZXRGaXJzdEdlb21ldHJ5KCk7cyE9PWdyO3M9dGhpcy5nZXROZXh0R2VvbWV0cnkocykp
1aWYoIXR8fGModGhpcy5nZXRHZW9tZXRyeVR5cGUocykpKXtmb3Iobj10aGlzLmdldEZpcnN0UGF0aChzKTtuIT09Z3I7bj10aGlzLmdldE5leHRQYXRoKG4pKWlmKGk9dGhpcy5nZXRGaXJzdFZlcnRleChuKSxyPWksbz0wLGkhPT1ncil7YT0hMDticmVha31pZihhfHxlIT09Z3IpYnJlYWt9cmV0dXJuIGF8fChzPWdyKSxmci5jcmVhdGVfKHRoaXMscyxuLGkscixvLHQsITEsZSE9PWdyKX1xdWVyeVZlcnRleEl0ZXJhdG9yT25TZWxlY3Rpb24odD1ncil7cmV0dXJuIHRoaXMubV9zZWxlY3Rpb24/ZnIuY3JlYXRlXyh0aGlzLHQsZ3IsZ3IsZ3IsLTEsITEsITAsdCE9PWdyKTp0aGlzLnF1ZXJ5VmVydGV4SXRlcmF0b3JFeCghMSx0KX1oYXNTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5tX3NlbGVjdGlvbn1jcmVhdGVFbXB0eVNlbGVjdGlvbigpe3MoMCl9cmVtb3ZlU2VsZWN0aW9uKCl7dGhpcy5tX3NlbGVjdGlvbiYmKHRoaXMubV9zZWxlY3RlZFZlcnRpY2VzLmxlbmd0aD0wLHRoaXMucmVtb3ZlVXNlckluZGV4KHRoaXMubV9zZWxlY3Rpb25JbmRleCksdGhpcy5tX3NlbGVjdGlvbkluZGV4PS0xLHRoaXMubV9zZWxlY3Rpb249ITEsdGhpcy5tX3NlbGVjdGVkQ291bnQ9MCl9c2VsZWN0KHQpe3JldHVybiEhdGhpcy5zZWxlY3RlZCh0KXx8KHRoaXMuc2V0VXNlckluZGV4KHQsdGhpcy5tX3NlbGVjdGlvbkluZGV4LHRoaXMubV9zZWxlY3RlZFZlcnRpY2VzLmxlbmd0aCksdGhpcy5tX3NlbGVjdGVkVmVydGljZXMucHVzaCh0KSx0aGlzLm1fc2VsZWN0ZWRDb3VudCsrLCExKX11bnNlbGVjdCh0KXtpZighdGhpcy5tX3NlbGVjdGlvbilyZXR1cm47Y29uc3QgZT10aGlzLmdldFVzZXJJbmRleCh0LHRoaXMubV9zZWxlY3Rpb25JbmRleCk7ZT49MCYmKHRoaXMubV9zZWxlY3RlZFZlcnRpY2VzW2VdPWdyLHRoaXMuc2V0VXNlckluZGV4KHQsdGhpcy5tX3NlbGVjdGlvbkluZGV4LC0xKSx0aGlzLm1fc2VsZWN0ZWRDb3VudC0tKX1zZWxlY3RlZCh0KXtyZXR1cm4hdGhpcy5tX3NlbGVjdGlvbnx8dGhpcy5zZWxlY3RlZF8odCl9Z2V0U2VsZWN0ZWRDb3VudCgpe3JldHVybiB0aGlzLm1fc2VsZWN0aW9uP3RoaXMubV9zZWxlY3RlZENvdW50OnRoaXMuZ2V0VG90YWxQb2ludENvdW50KCl9Y3JlYXRlU2VsZWN0aW9uRm9yQ3JhY2tpbmdBbmRDbHVzdGVyaW5nKHQsZSl7cmV0dXJuIHMoMCksITF9cGVlbEFMb29wKHQsZSl7dGhpcy5wZWVsQUxvb3BfKHQsZSwhMSl9cGVlbEFMb29wSW50b0FQYXRoKHQsZSl7cmV0dXJuIHRoaXMucGVlbEFMb29wXyh0LGUsITApfWFwcGx5VHJhbnNmb3JtYXRpb24odCl7aWYodGhpcy5tX3ZlcnRpY2VzTXAuYXBwbHlUcmFuc2Zvcm1hdGlvbih0KSxudWxsIT09dGhpcy5tX3NlZ21lbnRzKWZvcihsZXQgZT0wLHM9dGhpcy5tX3NlZ21lbnRzLmxlbmd0aDtlPHM7ZSsrKXRoaXMubV9zZWdtZW50c1tlXSYmdGhpcy5tX3NlZ21lbnRzW2VdLmFwcGx5VHJhbnNmb3JtYXRpb24odCl9c2V0R2VvbWV0cnlUeXBlKHQsZSl7dGhpcy5tX2dlb21ldHJ5SW5kZXhMaXN0LnNldEZpZWxkKHQsMixlKX1zcGxpdFNlZ21lbnRXaXRoSW50ZXJzZWN0b3IodCxlLHMsbixpKXtuP3RoaXMuc3BsaXRTZWdtZW50Rm9yd2FyZCh0LGUscywhMCxpKTp0aGlzLnNwbGl0U2VnbWVudEJhY2t3YXJkKHQsZSxzLCEwLGkpfXNldFByZXZWZXJ0ZXgodCxlKXt0aGlzLm1fdmVydGV4SW5kZXhMaXN0LnNldEZpZWxkKHQsMSxlKX1zZXROZXh0VmVydGV4KHQsZSl7dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zZXRGaWVsZCh0LDIsZSl9c2V0UGF0aFRvVmVydGV4KHQsZSl7dGhpcy5tX3ZlcnRleEluZGV4TGlzdC5zZXRGaWVsZCh0LDMsZSl9c2V0UGF0aFNpemUodCxlKXt0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZCh0LDMsZSl9c2V0Rmlyc3RWZXJ0ZXgodCxlKXt0aGlzLm1fcGF0aEluZGV4TGlzdC5zZXRGaWVsZCh0LDQsZSl9c2V0TGFzdFZlcnRleCh0LGUpe3RoaXMubV9wYXRoSW5kZXhMaXN0LnNldEZpZWxkKHQsNSxlKX1nZXRTZWdtZW50KHQpe2lmKG51bGwhPXRoaXMubV9zZWdtZW50cyl7Y29uc3QgZT10aGlzLmdldFZlcnRleEluZGV4KHQpO3JldHVybiB0aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgoZSl9cmV0dXJuIG51bGx9aXNDdXJ2ZSh0KXtpZihudWxsPT09dGhpcy5tX3NlZ21lbnRzKXJldHVybiExO2NvbnN0IGU9dGhpcy5nZXRWZXJ0ZXhJbmRleCh0KTtyZXR1cm4gdGhpcy5tX3NlZ21lbnRzLmxlbmd0aD5lJiZudWxsIT09dGhpcy5tX3NlZ21lbnRzW2VdfXF1ZXJ5U2VnbWVudCh0LGUscz0hMCxuPSExKXtjb25zdCBpPXRoaXMuZ2V0TmV4dFZlcnRleCh0KTtpZihpPT09Z3IpcmV0dXJuITE7Y29uc3Qgcj10aGlzLmdldFNlZ21lbnQodCk7aWYoIXIpcmV0dXJuIXMmJih0aGlzLnF1ZXJ5TGluZUNvbm5lY3Rvcih0LGUuY3JlYXRlTGluZSgpLG4pLCEwKTtpZihlLmNvcHlGcm9tKHIsITApLG4pcmV0dXJuITA7aWYodGhpcy5tX3ZlcnRleERlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk+MSl7Y29uc3Qgcz10aGlzLmdldEhlbHBlclBvaW50KCk7dGhpcy5xdWVyeVBvaW50KHQscyksZS5nZXQoKS5zZXRTdGFydChzKSx0aGlzLnF1ZXJ5UG9pbnQoaSxzKSxlLmdldCgpLnNldEVuZChzKX1yZXR1cm4hMH1nZXRTZWdtZW50RnJvbUluZGV4KHQpe2NvbnN0IGU9bnVsbCE9PXRoaXMubV9zZWdtZW50cyYmdGhpcy5tX3NlZ21lbnRzLmxlbmd0aD50P3RoaXMubV9zZWdtZW50c1t0XTpudWxsO3JldHVybiBlfHxudWxsfWdldEFuZENsZWFyU2VnbWVudEZyb21JbmRleCh0KXtjb25zdCBlPW51bGwhPT10aGlzLm1fc2VnbWVudHMmJnRoaXMubV9zZWdtZW50cy5sZW5ndGg+dD90aGlzLm1fc2VnbWVudHNbdF06bnVsbDtyZXR1cm4gZXx8bnVsbH1zZXRTZWdtZW50VG9JbmRleCh0LGUpe2lmKHRoaXMubV9oYXNGb3JjZVNldEVudmVsb3BlPTAsbnVsbD09PXRoaXMubV9zZWdtZW50cyl7aWYoIWUpcmV0dXJuO3RoaXMubV9zZWdtZW50cz1bXSx0aGlzLm1fc2VnbWVudHMubGVuZ3RoPXRoaXMubV92ZXJ0aWNlcy5nZXRQb2ludENvdW50KCl9dD49dGhpcy5tX3NlZ21lbnRzLmxlbmd0aCYmKHRoaXMubV9zZWdtZW50cy5sZW5ndGg9dCsxKSx0aGlzLm1fc2VnbWVudHNbdF09ZX1zZXRHZW9tZXRyeVBhdGhDb3VudCh0LGUpe3RoaXMubV9
1nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZCh0LDYsZSl9c2V0R2VvbWV0cnlWZXJ0ZXhDb3VudCh0LGUpe3RoaXMubV9nZW9tZXRyeUluZGV4TGlzdC5zZXRGaWVsZCh0LDUsZSl9cmluZ1BhcmVudGFnZUNoZWNrSW50ZXJuYWwodCxlKXtyZXR1cm4gcygwKSwhMX1yZXZlcnNlUmluZ0ludGVybmFsKHQpe2NvbnN0IGU9dGhpcy5oYXNDdXJ2ZXMoKSxzPXRoaXMuaGFzU2VnbWVudFBhcmVudGFnZSgpO2xldCBuPW51bGwsaT0tMSxyPXQ7aWYoZSl7Y29uc3QgdD10aGlzLmdldFZlcnRleEluZGV4KHIpO249dGhpcy5nZXRBbmRDbGVhclNlZ21lbnRGcm9tSW5kZXgodCl9cyYmKGk9dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKHIpKTtkb3tjb25zdCB0PXRoaXMuZ2V0UHJldlZlcnRleChyKSxvPXRoaXMuZ2V0TmV4dFZlcnRleChyKTtpZih0aGlzLnNldE5leHRWZXJ0ZXgocix0KSx0aGlzLnNldFByZXZWZXJ0ZXgocixvKSxlKXtjb25zdCB0PXRoaXMuZ2V0VmVydGV4SW5kZXgobyksZT10aGlzLmdldFNlZ21lbnRGcm9tSW5kZXgodCk7biYmbi5yZXZlcnNlKCksdGhpcy5zZXRTZWdtZW50VG9JbmRleCh0LG4pLG49ZX1pZihzKXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudFBhcmVudGFnZShvKTt0aGlzLnNldFNlZ21lbnRQYXJlbnRhZ2VQcmVzZXJ2ZUJyZWFrKG8saSksaT10fXI9b313aGlsZShyIT09dCk7dGhpcy5kYmdWZXJpZnlJbnRlZ3JpdHkodCl9c2V0VG90YWxQb2ludENvdW50KHQpe3RoaXMubV9wb2ludENvdW50PXR9cmVtb3ZlUGF0aE9ubHkodCl7Y29uc3QgZT10aGlzLmdldFByZXZQYXRoKHQpLHM9dGhpcy5nZXROZXh0UGF0aCh0KSxuPXRoaXMuZ2V0R2VvbWV0cnlGcm9tUGF0aCh0KTtlIT09Z3I/dGhpcy5zZXROZXh0UGF0aChlLHMpOnRoaXMuc2V0Rmlyc3RQYXRoKG4scykscyE9PWdyP3RoaXMuc2V0UHJldlBhdGgocyxlKTp0aGlzLnNldExhc3RQYXRoKG4sZSksdGhpcy5zZXRGaXJzdFZlcnRleCh0LGdyKSx0aGlzLnNldExhc3RWZXJ0ZXgodCxnciksdGhpcy5mcmVlUGF0aCh0KX1pbnNlcnRDbG9zZWRQYXRoKHQsZSxzLG4saSl7Y29uc3Qgcj10aGlzLmluc2VydFBhdGgodCxncik7bGV0IG89MCxhPXM7Zm9yKGlbMF09ITE7Oyl7YT09PW4mJihpWzBdPSEwKSx0aGlzLnNldFBhdGhUb1ZlcnRleChhLHIpLG8rKztjb25zdCB0PXRoaXMuZ2V0TmV4dFZlcnRleChhKTtpZih0PT09cylicmVhazthPXR9cmV0dXJuIHRoaXMuc2V0Q2xvc2VkUGF0aChyLCEwKSx0aGlzLnNldFBhdGhTaXplKHIsbyksaVswXSYmKHM9biksdGhpcy5zZXRGaXJzdFZlcnRleChyLHMpLHRoaXMuc2V0TGFzdFZlcnRleChyLHRoaXMuZ2V0UHJldlZlcnRleChzKSksdGhpcy5zZXRSaW5nQXJlYVZhbGlkKHIsITEpLHJ9ZmluZFZlcnRleDJEKHQsZSl7cmV0dXJuIHMoMCksMH1maW5kVmVydGV4M0QodCxlLG4pe3JldHVybiBzKDApLDB9ZGJnVmVyaWZ5TW9ub3RvbmUoKXt9ZGJnQ2hlY2tTZWxlY3Rpb24oKXt9ZGJnVmVyaWZ5U2VnbWVudCh0KXt9ZGJnVmVyaWZ5SW50ZWdyaXR5KHQsZT0hMCl7fWRiZ1ZlcmlmeVZlcnRleENvdW50cygpe31kYmdWZXJpZnlDdXJ2ZXMoKXt9ZGJnRHVtcEdlb21ldHJ5KHQsZSl7fWdldE5leHROdGhWZXJ0ZXgodCxlKXtpZigwPT09ZSlyZXR1cm4gdDtsZXQgcz10O2ZvcihsZXQgbj0wO248ZTsrK24paWYocz1lPjA/dGhpcy5nZXROZXh0VmVydGV4KHMpOnRoaXMuZ2V0UHJldlZlcnRleChzKSxzPT09Z3IpcmV0dXJuIGdyO3JldHVybiBzfXJlbW92ZVZlcnRleEludGVybmFsKHQsZSl7Y29uc3Qgcz10aGlzLmdldFByZXZWZXJ0ZXgodCksbj10aGlzLmdldE5leHRWZXJ0ZXgodCk7cyE9PWdyJiZ0aGlzLnNldE5leHRWZXJ0ZXgocyxuKSxuIT09Z3ImJnRoaXMuc2V0UHJldlZlcnRleChuLHMpO2lmKHRoaXMuaGFzQ3VydmVzKCkmJnMhPT1nciYmbiE9PWdyKXtjb25zdCBpPXRoaXMuZ2V0VmVydGV4SW5kZXgodCkscj10aGlzLmdldFZlcnRleEluZGV4KHMpLG89dGhpcy5nZXRWZXJ0ZXhJbmRleChuKTtpZihlKXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChyKTtpZihudWxsIT09dCl7Y29uc3QgZT10aGlzLm1fdmVydGljZXMuZ2V0WFkobyk7dC5zZXRFbmRYWShlKSx0Lm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKX10aGlzLnNldFNlZ21lbnRUb0luZGV4KGksbnVsbCl9ZWxzZXtjb25zdCB0PXRoaXMuZ2V0U2VnbWVudEZyb21JbmRleChpKTtpZih0aGlzLnNldFNlZ21lbnRUb0luZGV4KGksbnVsbCksbnVsbCE9PXQpe2NvbnN0IGU9dGhpcy5tX3ZlcnRpY2VzLmdldFhZKHIpO3Quc2V0U3RhcnRYWShlKSx0Lm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKX10aGlzLnNldFNlZ21lbnRUb0luZGV4KHIsdCl9fXJldHVybiB0aGlzLmZyZWVWZXJ0ZXgodCksbn1pc1JpbmdBcmVhVmFsaWQodCl7cmV0dXJuISEoNCZ0aGlzLmdldFBhdGhGbGFncyh0KSl9c2V0UmluZ0FyZWFWYWxpZCh0LGUpe2NvbnN0IHM9KDR8dGhpcy5nZXRQYXRoRmxhZ3ModCkpLTQ7dGhpcy5zZXRQYXRoRmxhZ3ModCxzfChlPzQ6MCkpfWNvbXBhcmVWZXJ0aWNlc1NpbXBsZVkodCxlKXtyZXR1cm4gdGhpcy5xdWVyeVhZKHQsdGhpcy5tX3dvcmtQb2ludDJEKSx0aGlzLnF1ZXJ5WFkoZSx0aGlzLm1fd29ya1BvaW50Ml8yRCksdGhpcy5tX3dvcmtQb2ludDJELmNvbXBhcmUodGhpcy5tX3dvcmtQb2ludDJfMkQpfWNvbXBhcmVWZXJ0aWNlc1NpbXBsZVkzRCh0LGUpe3JldHVybiB0aGlzLmdldFhZWih0KS5jb21wYXJlKHRoaXMuZ2V0WFlaKGUpKX1jb21wYXJlVmVydGljZXNTaW1wbGVYKHQsZSl7cmV0dXJuIHRoaXMuZ2V0WFkodCkuY29tcGFyZVgodGhpcy5nZXRYWShlKSl9c29ydFZlcnRpY2VzU2ltcGxlQnlZSGVhcE1lcmdlKHQsZSl7cygwKX1zb3J0VmVydGljZXNTaW1wbGVCeVkodCxlLHMpe3RoaXMubV9idWNrZXRTb3J0LnNvcnQodCxlLHMsbmV3IF9yKHRoaXMpKX1zb3J0VmVydGljZXNTaW1wbGVCeVgodCxlLG4pe3MoMCl9c29ydFZlcnRpY2VzU2ltcGxlQnlZM0QodCxlLG4pe3MoMCl9c25hcFZlcnRleEZvclBvbGVDbGlwcGluZyh0LGUpe2NvbnN0IHM9dGhpcy5nZXRQcmV2VmVydGV4KHQpO3MhPT1nciYmdGhpcy5yZXBsYWNlQ3VydmVXaXRoTGluZShzKTt0aGlzLmdldE5leHRWZXJ0ZXgodCkhPT1nciYmdGhpcy5yZXBsYWNlQ3VydmVXaXRoTGluZSh0KTtjb25zdCBuPW5ldyBKO3RoaXMucXVlcnlYWSh0LG4pLG4ueT1lLHRoaXMuc2V0WFkodCxuKX1zZXRTZWdtZW50UGFyZW50YWdlQW5kQnJlYWsodCxlLG49ITApe2lmKC0xPT09dGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCl7aWYoLTE9PT1lKXJldHVybjt0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4PXRoaXMuY3JlYXRlVXNlckluZGV4KCl9ZT49MCYmKHMoZTw9TXQoKT4+MSksZTw8PTEsZXw9bj8xOjApLHRoaXMuc2V0VXNlckluZGV4KHQsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCxlKX1zZXRTZWdtZW50UGFyZW50YWdlUHJlc2VydmVCcmVhayh0LGUpe2lmKHMoZT49LTEpLC0xPT09dGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCl7aWYoLTE9PT1lKXJldHVybjt0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4PXRoaXMuY3JlYXRlVXNlckluZGV4KCl9aWYoZT49MCl7cyhlPD1NdCgpPj4xKSxlPDw9MTtlfD10aGlzLmdldFNlZ21lbnRQYXJlbnRhZ2VCcmVha1ZlcnRleCh0KT8xOjB9dGhpcy5zZXRVc2VySW5kZXgodCx0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4LGUpfWdldFNlZ21lbnRQYXJlbnRhZ2UodCl7aWYoLTE9PT10aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4KXJldHVybi0xO2NvbnN0IGU9dGhpcy5nZXRVc2VySW5kZXgodCx0aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4KTtyZXR1cm4gZTwwP2U6ZT4+MX1nZXRPcmlnaW5hbFNlZ21lbnRJbmZvKHQpe2lmKC0xIT09dGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCl7Y29uc3QgZT10aGlzLmdldFNlZ21lbnRQYXJlbnRhZ2UodCk7cmV0dXJuIG5ldyBQcihlKX1yZXR1cm4gbmV3IFByKC0xKX1zZXRTZWdtZW50UGFyZW50YWdlQnJlYWtWZXJ0ZXgodCxlKXtpZigtMT09PXRoaXMubV9zZWdtZW50UGFyZW50YWdlSW5kZXgpcmV0dXJuO2xldCBzPXRoaXMuZ2V0VXNlckluZGV4KHQsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCk7czwwfHwhISgxJnMpIT09ZSYmKGU/c3w9MTpzJj1NdCgpPj4xPDwxLHRoaXMuc2V0VXNlckluZGV4KHQsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCxzKSl9Z2V0U2VnbWVudFBhcmVudGFnZUJyZWFrVmVydGV4KHQpe2lmKC0xPT09dGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleClyZXR1cm4hMDtjb25zdCBlPXRoaXMuZ2V0VXNlckluZGV4KHQsdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCk7cmV0dXJuIGU8MHx8ISEoMSZlKX1pc0Rpc2NvbnRpbnVvdXNTZWdtZW50UGFyZW50YWdlKHQpe2NvbnN0IGU9dGhpcy5nZXRQcmV2VmVydGV4KHQpO2lmKGU9PT1ncilyZXR1cm4hMTtyZXR1cm4gdGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKGUpIT09dGhpcy5nZXRTZWdtZW50UGFyZW50YWdlKHQpfXNldEN1cnZlU3RpdGNoZXJQb2ludGVyKHQpe3RoaXMubV9
1jdXJ2ZVN0aXRjaGVyPXR9aGFzU2VnbWVudFBhcmVudGFnZSgpe3JldHVybi0xIT09dGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleH1kZWxldGVTZWdtZW50UGFyZW50YWdlKCl7LTEhPT10aGlzLm1fc2VnbWVudFBhcmVudGFnZUluZGV4JiYodGhpcy5yZW1vdmVVc2VySW5kZXgodGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleCksdGhpcy5tX3NlZ21lbnRQYXJlbnRhZ2VJbmRleD0tMSksdGhpcy5tX2N1cnZlU3RpdGNoZXI9bnVsbH1jbGVhclNlZ21lbnRzKCl7dGhpcy5tX3NlZ21lbnRzPW51bGx9fWZ1bmN0aW9uIHhyKHQpe2lmKHQuaXNFbXB0eSgpKXJldHVybiBuZXcgbXIoe3ZkOnQuZ2V0RGVzY3JpcHRpb24oKX0pO2lmKGModC5nZXRHZW9tZXRyeVR5cGUoKSkmJnQuaGFzTm9uTGluZWFyU2VnbWVudHMoKSlyZXR1cm4gdnIodCk7Y29uc3QgZT10LmdldEltcGwoKSxzPWUuZ2V0UG9pbnRDb3VudCgpO2lmKHM8PTIpe2lmKDE9PT1zfHxlLmdldFhZKDApLmVxdWFscyhlLmdldFhZKDEpKSl7Y29uc3QgdD1uZXcgRih7dmQ6ZS5nZXREZXNjcmlwdGlvbigpfSk7cmV0dXJuIGUuZ2V0UG9pbnRCeVZhbCgwLHQpLHR9e2NvbnN0IHQ9bmV3IEYscz1uZXcgUXMoe3ZkOmUuZ2V0RGVzY3JpcHRpb24oKX0pO3JldHVybiBlLmdldFBvaW50QnlWYWwoMCx0KSxzLnN0YXJ0UGF0aFBvaW50KHQpLGUuZ2V0UG9pbnRCeVZhbCgxLHQpLHMubGluZVRvUG9pbnQodCksc319Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKSxpPW5ldyBBcih7c3RyZWFtOm4sbjpzfSk7bGV0IHI9MCxvPTE7Y29uc3QgYT1uLnJlYWRQb2ludDJEKHI8PDEpLGg9bmV3IEo7Zm9yKDtvPHMmJm4ucXVlcnlQb2ludDJEKG88PDEsaCkuZXF1YWxzKGEpOylvKys7aWYoaS5tX3RyZWVIdWxsLmFkZEVsZW1lbnQociksbzxzKXtpLm1fdHJlZUh1bGwuYWRkQmlnZ2VzdEVsZW1lbnQobyk7Y29uc3QgdD1uZXcgSjtmb3IobGV0IHM9bysxO3M8ZS5nZXRQb2ludENvdW50KCk7cysrKXtuLnF1ZXJ5UG9pbnQyRChzPDwxLHQpO2NvbnN0IGU9aS50cmVlSHVsbCh0KTstMSE9PWUmJmkubV90cmVlSHVsbC5zZXRFbGVtZW50KGUscyl9fWNvbnN0IHU9ZS5nZXREZXNjcmlwdGlvbigpLG09dS5nZXRBdHRyaWJ1dGVDb3VudCgpPjEsbD1pLm1fdHJlZUh1bGwuc2l6ZSgpO2xldCBnPW51bGw7aWYobD49Mil7Zz1sPj0zP25ldyBtcih7dmQ6dX0pOm5ldyBRcyh7dmQ6dX0pO2NvbnN0IHQ9Zy5nZXRJbXBsKCk7dC5yZXNlcnZlKGkubV90cmVlSHVsbC5zaXplKCkpLHQuYWRkUGF0aFBvaW50MkQobnVsbCwwLCEwKTtjb25zdCBzPW5ldyBKO2ZvcihsZXQgcj1pLm1fdHJlZUh1bGwuZ2V0Rmlyc3QoKTstMSE9PXI7cj1pLm1fdHJlZUh1bGwuZ2V0TmV4dChyKSlpZihtKXtjb25zdCBzPW5ldyBGO2UuZ2V0UG9pbnRCeVZhbChpLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChyKSxzKSx0Lmluc2VydFBvaW50KDAsLTEscyl9ZWxzZSBuLnF1ZXJ5UG9pbnQyRChpLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChyKTw8MSxzKSx0Lmluc2VydFBvaW50MkQoMCwtMSxzKX1lbHNlIGlmKG0pe2NvbnN0IHQ9bmV3IEYoe3ZkOnV9KTtlLmdldFBvaW50QnlWYWwoaS5tX3RyZWVIdWxsLmdldEVsZW1lbnQoaS5tX3RyZWVIdWxsLmdldEZpcnN0KCkpLHQpLGc9dH1lbHNle2NvbnN0IHQ9bi5yZWFkUG9pbnQyRChpLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChpLm1fdHJlZUh1bGwuZ2V0Rmlyc3QoKSk8PDEpO2c9bmV3IEYodCl9cmV0dXJuIGd9ZnVuY3Rpb24gQ3IodCxlLHMsbj0hMSl7aWYoZTw9MjYyMTQ0KXJldHVybiBNcih0LGUscyxuKTtjb25zdCBpPW5ldyBBcih7cG9pbnRzOnQsbjplfSkscj0wO2xldCBvPTE7Y29uc3QgYT10W3JdO2Zvcig7bzxlJiZ0W29dLmVxdWFscyhhKTspbysrO2lmKGkubV90cmVlSHVsbC5hZGRFbGVtZW50KHIpLG88ZSl7aS5tX3RyZWVIdWxsLmFkZEJpZ2dlc3RFbGVtZW50KG8pO2ZvcihsZXQgcz1vKzE7czxlO3MrKyl7Y29uc3QgZT10W3NdLG49aS50cmVlSHVsbChlKTstMSE9PW4mJmkubV90cmVlSHVsbC5zZXRFbGVtZW50KG4scyl9fWxldCBoPTA7Zm9yKGxldCB1PWkubV90cmVlSHVsbC5nZXRGaXJzdCgpOy0xIT09dTt1PWkubV90cmVlSHVsbC5nZXROZXh0KHUpKXNbaCsrXT1pLm1fdHJlZUh1bGwuZ2V0RWxlbWVudCh1KTtyZXR1cm4gaH1mdW5jdGlvbiB2cih0KXtzKHQuaGFzTm9uTGluZWFyU2VnbWVudHMoKSYmIXQuaXNFbXB0eSgpKTtjb25zdCBlPW5ldyBBcjtyZXR1cm4gZS5hZGRHZW9tZXRyeSh0KSxlLmdldEJvdW5kaW5nR2VvbWV0cnkoKX1mdW5jdGlvbiBicih0LHMsbil7aWYoKHM8MHx8cz49dC5nZXRQYXRoQ291bnQoKSkmJmUoXCJwYXRoIGluZGV4XCIpLHQuaGFzTm9uTGluZWFyU2VnbWVudHNQYXRoKHMpKXJldHVybiExO2NvbnN0IGk9dC5nZXRJbXBsKCkscj1pLmdldFBhdGhTdGFydChzKSxvPWkuZ2V0UGF0aEVuZChzKSxhPSFpLmlzQ2xvc2VkUGF0aChzKSYmaS5pc0Nsb3NlZFBhdGhJblhZUGxhbmUocyksaD1pLmdldEF0dHJpYnV0ZVN0cmVhbVJlZigwKSx1PTIqcjtsZXQgbT0yKm87aWYoYSYmKG0tPTIpLG0tdTw2KXJldHVybiEwO2NvbnN0IGw9aC5yZWFkUG9pbnQyRCh1KSxjPWgucmVhZFBvaW50MkQodSsyKSxnPWgucmVhZFBvaW50MkQodSs0KTtpZighWXIoSi5vcmllbnRhdGlvblJvYnVzdChjLGcsbCkpKXJldHVybiExO2NvbnN0IGQ9Yy5jbG9uZSgpLF89bmV3IEo7Zm9yKGxldCBlPXUrNjtlPG07ZSs9Mil7Xy5hc3NpZ24oYyksYy5hc3NpZ24oZyksaC5xdWVyeVBvaW50MkQoZSxnKTtpZighWXIoSi5vcmllbnRhdGlvblJvYnVzdChjLGcsbCkpKXJldHVybiExO2lmKCFZcihKLm9yaWVudGF0aW9uUm9idXN0KGQsZyxsKSkpcmV0dXJuITE7aWYoIVlyKEoub3JpZW50YXRpb25Sb2J1c3QoYyxnLF8pKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBTcih0LGUscyl7dC5zZXROQU4oKSxlLnNldENvb3JkcygxLDApLHMuc2V0Q29vcmRzKDAsMCl9ZnVuY3Rpb24gRXIodCxlLHMsbixyKXtpZihTcihzLG4sciksdC5pc0VtcHR5KCkpcmV0dXJuO2lmKHQuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1Qb2ludClyZXR1cm4gdm9pZCBzLmFzc2lnbih0LmdldFhZKCkpO2NvbnN0IG89dCxhPW8uZ2V0UG9pbnRDb3VudCgpOzAhPT1hJiYoMSE9PWE/RHIobyxhLGUscyxuLHIpOnMuYXNzaWduKG8uZ2V0WFkoMCkpKX1mdW5jdGlvbiBEcih0LGUscyxuLGkscil7aWYoMj09PWUpe2NvbnN0IGU9dC5nZXRYWSgwKSxzPXQuZ2V0WFkoMSk7bi5hc3NpZ24oZS5hZGQocykubXVsKC41KSk7Y29uc3Qgbz1zLnN1YihlKTtpPXFyKG8pLHIuc2V0Q29vcmRzKC41Km8ubGVuZ3RoKCksMCl9ZWxzZXtsZXQgbz1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGE9WzAsMSwwLDB
1dLGg9bmV3IHl0KDQsMik7Zm9yKGguc2V0KDAsMCwwKSxoLnNldCgwLDEsMSksaC5zZXQoMSwwLDEpLGguc2V0KDEsMSwyKTthWzBdPGU7KythWzBdLEZyKGgsMCxlKSl7YVsxXT09PWFbMF0mJigrK2FbMV0sRnIoaCwxLGUpKTtmb3IobGV0IHM9MTs7KytzKXtmb3IoOzspe2NvbnN0IG49VnIodC5nZXRYWShoLmdldCgwLDApKSx0LmdldFhZKGguZ2V0KDAsMSkpLHQuZ2V0WFkoaC5nZXQocywwKSksdC5nZXRYWShoLmdldChzLDEpKSwyXnMpO2lmKG4+MClicmVhaztpZigrK2Fbc10sRnIoaCxzLGUpLDA9PT1uKWJyZWFrfWlmKDM9PT1zKWJyZWFrO2FbcysxXTxhW3NdJiYoYVtzKzFdPWFbc10saC5zZXQocysxLDAsaC5nZXQocywwKSksaC5zZXQocysxLDEsaC5nZXQocywxKSkpfWNvbnN0IHU9dC5nZXRYWShoLmdldCgwLDApKS5hZGQodC5nZXRYWShoLmdldCgyLDApKSkubXVsKC41KSxtPXFyKHQuZ2V0WFkoaC5nZXQoMCwxKSkuc3ViKHQuZ2V0WFkoaC5nZXQoMCwwKSkpKSxsPW5ldyBKO2xldCBjLGc7aWYobC54PU1hdGgubWF4KDAsbS5kb3RQcm9kdWN0KHQuZ2V0WFkoaC5nZXQoMSwwKSkuc3ViKHQuZ2V0WFkoaC5nZXQoMywwKSkpKSksbC55PU1hdGgubWF4KDAsbS5jcm9zc1Byb2R1Y3QodC5nZXRYWShoLmdldCgwLDApKS5zdWIodC5nZXRYWShoLmdldCgyLDApKSkpKSxzPyhjPWwueCpsLnksZz1jPG8pOihjPWwueSxnPWM8byksZyl7bz1jO2NvbnN0IGU9dC5nZXRYWShoLmdldCgxLDApKSxzPXQuZ2V0WFkoaC5nZXQoMywwKSksYT1lLmFkZChzKS5tdWwoLjUpLnN1Yih1KTtuLmFzc2lnbih1LmFkZChtLm11bChtLmRvdFByb2R1Y3QoYSkpKSksaS5hc3NpZ24obSksci5hc3NpZ24obCl9fXIubXVsVGhpcyguNSksci54PHIueSYmKHIueT1zdChyLngsci54PXIueSksaS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSl9aS55PDA/aS5uZWdhdGVUaGlzKCk6MD09PWkueSYmKGkueD0xKX15ci5zdF9kZWZhdWx0UmFuaz0xO2NsYXNzIHdye2NvbnN0cnVjdG9yKHQpe3RoaXMubV9oYW5kbGVQPS0xLHRoaXMubV9oYW5kbGVRPS0xLHRoaXMubV9jdXJyZW50U3VwcG9ydD0tMSx0aGlzLm1fYXJlYT0wLHRoaXMubV9iRG9uZT0hMCxzKDApLHRoaXMubV9jb252ZXhIdWxsPXQsdGhpcy5tX2Z1bmN0aW9uPXRoaXMuZG9uZV99bmV4dCgpe3JldHVybiBzKDApLCExfWdldF92ZXJ0ZXhfaGFuZGxlX3AoKXtyZXR1cm4gcygwKSwwfWdldF92ZXJ0ZXhfaGFuZGxlX3EoKXtyZXR1cm4gcygwKSwwfWdldF9jdXJyZW50X3N1cHBvcnQoKXtyZXR1cm4gcygwKSwwfWdldE5leHQodCl7cmV0dXJuIHMoMCksMH1nZXRQcmV2KHQpe3JldHVybiBzKDApLDB9aW50aWFsaXplXygpe3JldHVybiBzKDApLCExfWluY3JlbWVudF8oKXtyZXR1cm4gcygwKSwhMX1pbmNyZW1lbnRfcV8oKXtyZXR1cm4gcygwKSwhMX1pbmNyZW1lbnRfcF8oKXtyZXR1cm4gcygwKSwhMX1wYXJhbGxlbF9lZGdlX3dpdGhfcV9zdXBwb3J0Xygpe3JldHVybiBzKDApLCExfXBhcmFsbGVsX2VkZ2Vfd2l0aF9wX3N1cHBvcnRfKCl7cmV0dXJuIHMoMCksITF9ZG9uZV8oKXtyZXR1cm4gcygwKSwhMX19Y2xhc3MgQXJ7bnVsbEdldFhZKHQpe3JldHVybiBoKFwibV9nZXRYWSBpcyBudWxsXCIpLHt9fW51bGxEZWxldGVOb2RlKHQpe2goXCJtX2RlbGV0ZU5vZGUgaXMgbnVsbFwiKX1jb25zdHJ1Y3Rvcih0KXtyZXR1cm4gdGhpcy5tX3RyZWVIdWxsPW5ldyBaLHRoaXMubV9zaGFwZT1udWxsLHRoaXMubV9zdHJlYW09bnVsbCx0aGlzLm1fcG9pbnRzPW51bGwsdGhpcy5tX2dlb21ldHJ5SGFuZGxlPS0xLHRoaXMubV9wYXRoSGFuZGxlPS0xLHRoaXMubV9
1nZXRYWT10aGlzLm51bGxHZXRYWSx0aGlzLm1fZGVsZXRlTm9kZT10aGlzLm51bGxEZWxldGVOb2RlLHQ/dC5zdHJlYW0/KHRoaXMubV90cmVlSHVsbC5zZXRDYXBhY2l0eShNYXRoLm1pbigyMCx0Lm4pKSx0aGlzLm1fc3RyZWFtPXQuc3RyZWFtLHRoaXMubV9nZXRYWT10aGlzLmdldFhZU3RyZWFtLHRoaXMubV9kZWxldGVOb2RlPXRoaXMuZGVsZXRlTm9kZVN0cmVhbSx0aGlzLm1fcG9pbnRzPW51bGwsdGhpcy5tX2dlb21ldHJ5SGFuZGxlPWdyLHZvaWQodGhpcy5tX3BhdGhIYW5kbGU9Z3IpKTp0LnBvaW50cz8odGhpcy5tX3RyZWVIdWxsLnNldENhcGFjaXR5KE1hdGgubWluKDIwLHQubikpLHRoaXMubV9wb2ludHM9dC5wb2ludHMsdGhpcy5tX2dldFhZPXRoaXMuZ2V0WFlQb2ludHMsdGhpcy5tX2RlbGV0ZU5vZGU9dGhpcy5kZWxldGVOb2RlUG9pbnRzLHRoaXMubV9zdHJlYW09bnVsbCx0aGlzLm1fZ2VvbWV0cnlIYW5kbGU9Z3Isdm9pZCh0aGlzLm1fcGF0aEhhbmRsZT1ncikpOnZvaWQgZChcInVucmVjb2duaXplZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJcIik6KHRoaXMubV90cmVlSHVsbC5zZXRDYXBhY2l0eSgyMCksdGhpcy5tX3NoYXBlPW5ldyB5cix0aGlzLm1fZ2VvbWV0cnlIYW5kbGU9dGhpcy5tX3NoYXBlLmNyZWF0ZUdlb21ldHJ5KGkuZW51bU11bHRpUG9pbnQpLHRoaXMubV9wYXRoSGFuZGxlPXRoaXMubV9zaGFwZS5pbnNlcnRQYXRoKHRoaXMubV9nZW9tZXRyeUhhbmRsZSxnciksdGhpcy5tX2dldFhZPXRoaXMuZ2V0WFlTaGFwZSx0aGlzLm1fZGVsZXRlTm9kZT10aGlzLmRlbGV0ZU5vZGVTaGFwZSx0aGlzLm1fc3RyZWFtPW51bGwsdm9pZCh0aGlzLm1fcG9pbnRzPW51bGwpKX1nZXRYWVNoYXBlKHQpe3JldHVybiB0aGlzLm1fc2hhcGUuZ2V0WFkodCl9Z2V0WFlTdHJlYW0odCl7cmV0dXJuIHRoaXMubV9zdHJlYW0ucmVhZFBvaW50MkQodDw8MSl9Z2V0WFlQb2ludHModCl7cmV0dXJuIHMoMCksbmV3IEp9ZGVsZXRlTm9kZVNoYXBlKHQpe2NvbnN0IGU9dGhpcy5tX3RyZWVIdWxsLmdldEVsZW1lbnQodCk7dGhpcy5tX3RyZWVIdWxsLmRlbGV0ZU5vZGUodCksdGhpcy5tX3NoYXBlLnJlbW92ZVZlcnRleChlLCExKX1kZWxldGVOb2RlU3RyZWFtKHQpe3RoaXMubV90cmVlSHVsbC5kZWxldGVOb2RlKHQpfWRlbGV0ZU5vZGVQb2ludHModCl7cygwKX1hZGRHZW9tZXRyeShzKXtpZihzLmlzRW1wdHkoKSlyZXR1cm47Y29uc3Qgbj1zLmdldEdlb21ldHJ5VHlwZSgpO2lmKG49PT1pLmVudW1HZW9tZXRyeUNvbGxlY3Rpb24pe2NvbnN0IHQ9cztmb3IobGV0IGU9MCxzPXQuZ2V0R2VvbWV0cnlDb3VudCgpO2U8cztlKyspdGhpcy5hZGRHZW9tZXRyeSh0LmdldEdlb21ldHJ5KGUpKX1lbHNlIHQobik/dGhpcy5hZGRNdWx0aVZlcnRleEdlb21ldHJ5KHMpOm0obik/dGhpcy5hZGRTZWdtZW50KHMsITEpOm49PT1pLmVudW1FbnZlbG9wZT90aGlzLmFkZEVudmVsb3BlKHMpOm49PT1pLmVudW1Qb2ludD90aGlzLmFkZFBvaW50KHMpOmUoXCJDb252ZXhfaHVsbDogZ2VvbWV0cnkgbm90IHN1cHBvcnRlZFwiKX1nZXRCb3VuZGluZ0dlb21ldHJ5KCl7Y29uc3QgdD1uZXcgRixlPXRoaXMubV90cmVlSHVsbC5nZXRGaXJzdCgpLHM9bmV3IG1yKHt2ZDp0aGlzLm1fc2hhcGUuZ2V0VmVydGV4RGVzY3JpcHRpb24oKX0pO2lmKDA9PT10aGlzLm1fdHJlZUh1bGwuc2l6ZSgpKXJldHVybiBzO3MucmVzZXJ2ZSh0aGlzLm1fdHJlZUh1bGwuc2l6ZSgpKSx0aGlzLm1fc2hhcGUucXVlcnlQb2ludCh0aGlzLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChlKSx0KSxzLnN0YXJ0UGF0aFBvaW50KHQpO2ZvcihsZXQgbj10aGlzLm1fdHJlZUh1bGwuZ2V0TmV4dChlKTstMSE9PW47bj10aGlzLm1fdHJlZUh1bGwuZ2V0TmV4dChuKSl0aGlzLm1fc2hhcGUucXVlcnlQb2ludCh0aGlzLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChuKSx0KSxzLmxpbmVUb1BvaW50KHQpO3JldHVybiBzfWdldEFudGlwb2RhbFBhaXJzSXRlcmF0b3IoKXtyZXR1cm4gcygwKSxuZXcgd3IodGhpcyl9Z2V0WFkodCl7cmV0dXJuIHMoMCksbmV3IEp9Z2V0WFlXaXRoSW5kZXgodCl7cmV0dXJuIHMoMCksbmV3IEp9Z2V0Rmlyc3QoKXtyZXR1cm4gcygwKSwwfWdldExhc3QoKXtyZXR1cm4gcygwKSwwfWdldE5leHQodCl7cmV0dXJuIHMoMCksMH1nZXRQcmV2KHQpe3JldHVybiBzKDApLDB9Z2V0VmVydGV4SW5kZXgodCl7cmV0dXJuIHMoMCksMH1nZXRQb2ludENvdW50KCl7cmV0dXJuIHMoMCksMH1hZGRNdWx0aVZlcnRleEdlb21ldHJ5KHQpe2NvbnN0IGU9bmV3IEYscz10LmdldEltcGwoKSxuPW5ldyBKO2ZvcihsZXQgaT0wO2k8dC5nZXRQb2ludENvdW50KCk7aSsrKXtzLnF1ZXJ5WFkoaSxuKTtjb25zdCByPXRoaXMuYWRkUG9pbnQyRChuKTtpZigtMSE9PXIpe3QuZ2V0UG9pbnRCeVZhbChpLGUpO2NvbnN0IHM9dGhpcy5tX3NoYXBlLmFkZFBvaW50KHRoaXMubV9wYXRoSGFuZGxlLGUpO3RoaXMubV90cmVlSHVsbC5zZXRFbGVtZW50KHIscyl9fWlmKGModC5nZXRHZW9tZXRyeVR5cGUoKSkpe2NvbnN0IGU9dDtpZihlLmhhc05vbkxpbmVhclNlZ21lbnRzKCkpe2NvbnN0IHQ9ZS5xdWVyeVNlZ21lbnRJdGVyYXRvcigpO2Zvcig7dC5uZXh0UGF0aCgpOylmb3IoO3QuaGFzTmV4dFNlZ21lbnQoKTspe2NvbnN0IGU9dC5uZXh0Q3VydmUoKTtudWxsIT09ZSYmdGhpcy5hZGRTZWdtZW50KGUsITApfX19fWFkZEVudmVsb3BlKHQpe2NvbnN0IGU9bmV3IEY7Zm9yKGxldCBzPTA7czw0O3MrKyl7Y29uc3Qgbj1uZXcgSjt0LnF1ZXJ5Q29ybmVyKHMsbik7Y29uc3QgaT10aGlzLmFkZFBvaW50MkQobik7aWYoLTEhPT1pKXt0LnF1ZXJ5Q29ybmVyQnlWYWwocyxlKTtjb25zdCBuPXRoaXMubV9zaGFwZS5hZGRQb2ludCh0aGlzLm1fcGF0aEhhbmRsZSxlKTt0aGlzLm1fdHJlZUh1bGwuc2V0RWxlbWVudChpLG4pfX19c3RhdGljIHF1ZXJ5U2VnbWVudENvbnRyb2xQb2ludHModCxuLHIpe2NvbnN0IG89dC5nZXRHZW9tZXRyeVR5cGUoKTtpZihzKG8hPT1pLmVudW1MaW5lKSxvPT09aS5lbnVtRWxsaXB0aWNBcmMpe2NvbnN0IGU9dCxzPTYwKk1hdGguUEkvMTgwLGk9TWF0aC5hYnMoZS5nZXRTd2VlcEFuZ2xlKCkpO2lmKGk+cyl7Y29uc3QgdD1NYXRoLm1pbig2LE1hdGguY2VpbChpL3MpKSxyPTEvdCxvPW5ldyBQbTtlLnF1ZXJ5U3RhcnQoblswXSk7bGV0IGE9MTtmb3IobGV0IHM9MDtzPHQ7cysrKXtlLnF1ZXJ5Q3V0KHMqciwocysxKSpyLG8pO2NvbnN0IGk9Y3QoSiwzKTtrdShvLmdldCgpLGkpO2NvbnN0IGg9Si5jYWxjdWxhdGVMZW5ndGgoaSwzKSx1PUouY2FsY3VsYXRlTGVuZ3RoKGksMiksbT1oPjA/dS9oOi41O3M8dC0xP28uZ2V0KCkucXVlcnlFbmQoblthKzFdKTplLnF1ZXJ5RW5kKG5bYSsxXSksRi5sZXJwKG5bYS0xXSxuW2ErMV0sbSxuW2FdKSxuW2FdLnNldFhZKGlbMV0pLGErPTJ9cmV0dXJuIGF9e2NvbnN0IGU9Y3QoSiwzKTtrdSh0LGUpO2NvbnN0IHM9Si5jYWxjdWxhdGVMZW5ndGgoZSwzKTt0LnF1ZXJ5U3RhcnQoblswXSksdC5xdWVyeUVuZChuWzJdKTtjb25zdCBpPUouY2FsY3VsYXRlTGVuZ3RoKGUsMikscj1zPjA/aS9zOi41O3JldHVybiBGLmxlcnAoblswXSxuWzJdLHIsblsxXSksblsxXS5zZXRYWShlWzFdKSwzfX1pZihvPT09aS5lbnVtQmV6aWVyKXtjb25zdCBlPXQscz1jdChKLDQpO2UucXVlcnlDb250cm9sUG9pbnRzKHMpO2NvbnN0IGk9Si5jYWxjdWxhdGVMZW5ndGgocyw0KSxyPUouY2FsY3VsYXRlTGVuZ3RoKHMsMiksbz1KLmNhbGN1bGF0ZUxlbmd0aChzLDMpO3QucXVlcnlTdGFydChuWzBdKSx0LnF1ZXJ5RW5kKG5bM10pO2NvbnN0IGE9aT4wP3IvaTouNTtGLmxlcnAoblswXSxuWzNdLGEsblsxXSksblsxXS5zZXRYWShzWzFdKTtjb25zdCBoPWk+MD9vL2k6LjU7cmV0dXJuIEYubGVycChuWzBdLG5bM10saCxuWzJdKSxuWzJdLnNldFhZKHNbMl0pLDR9aWYobz09PWkuZW51bUJlemllcjIpe2NvbnN0IGU9dCxzPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMocyk7Y29uc3QgaT1KLmNhbGN1bGF0ZUxlbmd0aChzLDMpO3QucXVlcnlTdGFydChuWzBdKSx0LnF1ZXJ5RW5kKG5bMl0pO2NvbnN0IHI9Si5jYWxjdWxhdGVMZW5ndGgocywyKSxvPWk+MD9yL2k6LjU7cmV0dXJuIEYubGVycChuWzBdLG5bMl0sbyxuWzFdKSxuWzFdLnNldFhZKHNbMV0pLDN9aWYobz09PWkuZW51bVJhdGlvbmFsQmV6aWVyMil7Y29uc3QgZT10LHM9Y3QoSiwzKTtlLnF1ZXJ5Q29udHJvbFBvaW50cyhzKTtjb25zdCBpPUouY2FsY3VsYXRlTGVuZ3RoKHMsMyk7dC5xdWVyeVN0YXJ0KG5bMF0pLHQucXVlcnlFbmQoblsyXSk7Y29uc3Qgcj1KLmNhbGN1bGF0ZUxlbmd0aChzLDIpLG89aT4wP3IvaTouNTtyZXR1cm4gRi5sZXJwKG5bMF0sblsyXSxvLG5bMV0pLG5bMV0uc2V0WFkoc1sxXSksM31lKFwiQ29udmV4X2h1bGw6IHNlZ21lbnQgdHlwZSBub3Qgc3VwcG9ydGVkXCIpfWFkZFNlZ21lbnQodCxlKXtpZighZSl7Y29uc3QgZT1uZXcgRixzPXQuZ2V0U3RhcnRYWSgpLG49dGhpcy5hZGRQb2ludDJEKHMpO2lmKC0xIT09bil7dC5xdWVyeVN0YXJ0KGUpO2NvbnN0IHM9dGhpcy5tX3NoYXBlLmFkZFBvaW50KHRoaXMubV9wYXRoSGFuZGxlLGUpO3RoaXMubV90cmVlSHVsbC5zZXRFbGVtZW50KG4scyl9Y29uc3QgaT10LmdldEVuZFhZKCkscj10aGlzLmFkZFBvaW50MkQoaSk7aWYoLTEhPT1yKXt0LnF1ZXJ5RW5kKGUpO2NvbnN0IHM9dGhpcy5tX3NoYXBlLmFkZFBvaW50KHRoaXMubV9wYXRoSGFuZGxlLGUpO3RoaXMubV90cmVlSHVsbC5zZXRFbGVtZW50KHIscyl9fWlmKHQuaXNDdXJ2ZSgpKXtjb25zdCBlPWN0KEYsMTMpO2ZvcihsZXQgcz0xLG49QXIucXVlcnlTZWdtZW50Q29udHJvbFBvaW50cyh0LGUsZS5sZW5ndGgpLTE7czxuOysrcyl7Y29uc3QgdD1lW3NdLmdldFhZKCksbj10aGlzLmFkZFBvaW50MkQodCk7aWYoLTEhPT1uKXtjb25zdCB0PXRoaXMubV9zaGFwZS5hZGRQb2ludCh0aGlzLm1fcGF0aEhhbmRsZSxlW3NdKTt0aGlzLm1fdHJlZUh1bGwuc2V0RWxlbWVudChuLHQpfX19fWFkZFBvaW50KHQpe2NvbnN0IGU9dC5nZXRYWSgpLHM9dGhpcy5hZGRQb2ludDJEKGUpO2lmKC0xIT09cyl7Y29uc3QgZT10aGlzLm1fc2hhcGUuYWRkUG9pbnQodGhpcy5tX3BhdGhIYW5kbGUsdCk7dGhpcy5tX3RyZWVIdWxsLnNldEVsZW1lbnQocyxlKX19YWRkUG9pbnQyRCh0KXtsZXQgZT0tMTtpZigwPT09dGhpcy5tX3RyZWVIdWxsLnNpemUoKSlyZXR1cm4gZT10aGlzLm1fdHJlZUh1bGwuYWRkRWxlbWVudCgt
1NCksZTtpZigxPT09dGhpcy5tX3RyZWVIdWxsLnNpemUoKSl7Y29uc3Qgcz10aGlzLm1fdHJlZUh1bGwuZ2V0RWxlbWVudCh0aGlzLm1fdHJlZUh1bGwuZ2V0Rmlyc3QoKSksbj10aGlzLm1fc2hhcGUuZ2V0WFkocyk7cmV0dXJuIHQuZXF1YWxzKG4pfHwoZT10aGlzLm1fdHJlZUh1bGwuYWRkQmlnZ2VzdEVsZW1lbnQoLTUpKSxlfXJldHVybiBlPXRoaXMudHJlZUh1bGwodCksZX10cmVlSHVsbCh0KXtsZXQgZT0tMTtkb3tjb25zdCBzPXRoaXMubV90cmVlSHVsbC5nZXRGaXJzdCgpLG49dGhpcy5tX3RyZWVIdWxsLmdldExhc3QoKSxpPXRoaXMubV90cmVlSHVsbC5nZXRFbGVtZW50KHMpLHI9dGhpcy5tX3RyZWVIdWxsLmdldEVsZW1lbnQobiksbz10aGlzLm1fZ2V0WFkoaSksYT10aGlzLm1fZ2V0WFkociksaD1KLm9yaWVudGF0aW9uUm9idXN0KGEsdCxvKTtpZihZcihoKSl7ZT10aGlzLm1fdHJlZUh1bGwuYWRkQmlnZ2VzdEVsZW1lbnQoLTEpO2NvbnN0IGk9dGhpcy50cmVlSHVsbFdhbGtCYWNrd2FyZCh0LG4scyk7aSE9PXMmJnRoaXMudHJlZUh1bGxXYWxrRm9yd2FyZCh0LHMsdGhpcy5tX3RyZWVIdWxsLmdldFByZXYoaSkpO2JyZWFrfWlmKE5yKGgpKXtsZXQgaT10aGlzLm1fdHJlZUh1bGwuZ2V0Um9vdCgpLHI9dGhpcy5tX3RyZWVIdWxsLmdldEZpcnN0KCksYT10aGlzLm1fdHJlZUh1bGwuZ2V0TGFzdCgpLGg9LTEsdT0tMSxtPS0xO2Zvcig7ciE9PXRoaXMubV90cmVlSHVsbC5nZXRQcmV2KGEpOyl7dT10aGlzLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChpKTtjb25zdCBlPXRoaXMubV9nZXRYWSh1KTtOcihKLm9yaWVudGF0aW9uUm9idXN0KGUsdCxvKSk/KGE9aSxpPXRoaXMubV90cmVlSHVsbC5nZXRMZWZ0KGkpKToocj1pLGk9dGhpcy5tX3RyZWVIdWxsLmdldFJpZ2h0KGkpKX1pPWEsaD1yLHU9dGhpcy5tX3RyZWVIdWxsLmdldEVsZW1lbnQoaSksbT10aGlzLm1fdHJlZUh1bGwuZ2V0RWxlbWVudChoKTtjb25zdCBsPXRoaXMubV9
1nZXRYWSh1KSxjPXRoaXMubV9nZXRYWShtKTtpZihoIT09cyl7aWYoIVlyKEoub3JpZW50YXRpb25Sb2J1c3QoYyx0LGwpKSlicmVha31lPXRoaXMubV90cmVlSHVsbC5hZGRFbGVtZW50QXRQb3NpdGlvbihoLGksLTIsITAsITEpLHRoaXMudHJlZUh1bGxXYWxrRm9yd2FyZCh0LGksbiksdGhpcy50cmVlSHVsbFdhbGtCYWNrd2FyZCh0LGgscyk7YnJlYWt9e2NvbnN0IGk9WHIodCxhLG8pO2lmKC0xPT09aSl7Y29uc3QgaT10aGlzLm1fdHJlZUh1bGwuZ2V0UHJldihuKTt0aGlzLm1fdHJlZUh1bGwuZGVsZXRlTm9kZShuKSxlPXRoaXMubV90cmVlSHVsbC5hZGRCaWdnZXN0RWxlbWVudCgtMyksdGhpcy50cmVlSHVsbFdhbGtCYWNrd2FyZCh0LGkscyl9ZWxzZSBpZigxPT09aSl7Y29uc3QgaT10aGlzLm1fdHJlZUh1bGwuZ2V0TmV4dChzKTt0aGlzLm1fdHJlZUh1bGwuZGVsZXRlTm9kZShzKSxlPXRoaXMubV90cmVlSHVsbC5hZGRFbGVtZW50QXRQb3NpdGlvbigtMSxpLC0zLCEwLCExKSx0aGlzLnRyZWVIdWxsV2Fsa0ZvcndhcmQodCxpLG4pfWJyZWFrfX13aGlsZSgwKTtyZXR1cm4gZX10cmVlSHVsbFdhbGtGb3J3YXJkKHQsZSxzKXtpZihlPT09cylyZXR1cm4gcztsZXQgbj1lLGk9dGhpcy5tX3RyZWVIdWxsLmdldEVsZW1lbnQobikscj10aGlzLm1fdHJlZUh1bGwuZ2V0TmV4dChuKTtjb25zdCBvPXRoaXMubV9nZXRYWShpKTtmb3IoO24hPT1zJiZ0aGlzLm1fdHJlZUh1bGwuc2l6ZSgpPjI7KXtjb25zdCBlPXRoaXMubV90cmVlSHVsbC5nZXRFbGVtZW50KHIpLHM9dGhpcy5tX2dldFhZKGUpO2lmKFlyKEoub3JpZW50YXRpb25Sb2J1c3Qocyx0LG8pKSlicmVhaztjb25zdCBhPW47bj1yLGk9ZSxvLmFzc2lnbihzKSxyPXRoaXMubV90cmVlSHVsbC5nZXROZXh0KG4pLHRoaXMubV9kZWxldGVOb2RlKGEpfXJldHVybiBufXRyZWVIdWxsV2Fsa0JhY2t3YXJkKHQsZSxzKXtpZihlPT09cylyZXR1cm4gcztsZXQgbj1lLGk9dGhpcy5tX3RyZWVIdWxsLmdldEVsZW1lbnQobikscj10aGlzLm1fdHJlZUh1bGwuZ2V0UHJldihuKTtjb25zdCBvPXRoaXMubV9nZXRYWShpKTtmb3IoO24hPT1zJiZ0aGlzLm1fdHJlZUh1bGwuc2l6ZSgpPjI7KXtjb25zdCBlPXRoaXMubV90cmVlSHVsbC5nZXRFbGVtZW50KHIpLHM9dGhpcy5tX2dldFhZKGUpO2lmKFlyKEoub3JpZW50YXRpb25Sb2J1c3Qobyx0LHMpKSlicmVhaztjb25zdCBhPW47bj1yLGk9ZSxvLmFzc2lnbihzKSxyPXRoaXMubV90cmVlSHVsbC5nZXRQcmV2KG4pLHRoaXMubV9kZWxldGVOb2RlKGEpfXJldHVybiBufX1mdW5jdGlvbiBUcih0LGUscyl7Y29uc3Qgbj1lLnN1Yih0KSxpPXMuc3ViKGUpO2lmKDA9PT1uLngpcmV0dXJuIGkueD4wPy0xOjA7aWYoMD09PW4ueSlyZXR1cm4gaS55PjA/MTppLnk8MD8tMTowO2NvbnN0IHI9bi5jcm9zc1Byb2R1Y3QoaSksbz00Kk51bWJlci5FUFNJTE9OKihNYXRoLmFicyhpLngqbi55KStNYXRoLmFicyhpLnkqbi54KSk7cmV0dXJuIHI+bz8xOnI8LW8/LTE6Si5vcmllbnRhdGlvblJvYnVzdCh0LGUscyl9ZnVuY3Rpb24gSXIodCxlLHMpe2NvbnN0IG49ZS5zdWIodCksaT1zLnN1YihlKTtpZigwPT09bi54KXJldHVybiBpLng8MD8tMTowO2lmKDA9PT1uLnkpcmV0dXJuIGkueT4wPy0xOmkueTwwPzE6MDtjb25zdCByPW4uY3Jvc3NQcm9kdWN0KGkpLG89NCpOdW1iZXIuRVBTSUxPTiooTWF0aC5hYnMoaS54Km4ueSkrTWF0aC5hYnMoaS55Km4ueCkpO3JldHVybiByPm8/MTpyPC1vPy0xOkoub3JpZW50YXRpb25Sb2J1c3QodCxlLHMpfWZ1bmN0aW9uIE1yKHQsZSxzLG4pe2NvbnN0IGk9bmV3IEcoMCk7Zm9yKGxldCBoPTA7aDxlO2grKylpLmFkZChoKTtjb25zdCByPXt1c2VyU29ydChlLHMsbil7bi5zb3J0KGUscywoZSxzKT0+dFtlXS5jb21wYXJlWCh0W3NdKSl9LGdldFZhbHVlOmU9PnRbZV0ueH07bnx8Vy5zb3J0RXgoaSwwLGUscik7bGV0IG89MDt0OmZvcihsZXQgaD0wO2g8ZTsrK2gpe2NvbnN0IGU9aS5yZWFkKGgpO2Zvcig7bz49Mjspe2NvbnN0IG49c1tvLTJdLHI9c1tvLTFdO2lmKHRbcl0uZXF1YWxzKHRbZV0pKXtpLndyaXRlKGgsLTEpO2NvbnRpbnVlIHR9aWYoIShUcih0W25dLHRbcl0sdFtlXSk+PTApKXtyPT09aS5yZWFkKGgtMSkmJmkud3JpdGUoaC0xLC0xKTticmVha31vLS19c1tvKytdPWUsMj09PW8mJnRbZV0uZXF1YWxzKHRbc1swXV0pJiYoaS53cml0ZSgxLC0xKSxvLS0pfWNvbnN0IGE9bysxO3Q6Zm9yKGxldCBoPWUtMjtoPj0wOy0taCl7Y29uc3QgZT1pLnJlYWQoaCk7aWYoIShlPDApKXtmb3IoO28+PWE7KXtjb25zdCBuPXNbby0yXSxpPXNbby0xXTtpZih0W2ldLmVxdWFscyh0W2VdKSljb250aW51ZSB0O2lmKCEoSXIodFtuXSx0W2ldLHRbZV0pPj0wKSlicmVhaztvLS19aWYoMCE9PWgpe2NvbnN0IG49c1tvLTFdO3NbbysrXT1lLHRbZV0uZXF1YWxzKHRbbl0pJiZvLS19fX1yZXR1cm4gbz4xJiZ0W3NbMF1dLmVxdWFscyh0W3Nbby0xXV0pJiZvLS0sb31mdW5jdGlvbiBZcih0KXtyZXR1cm4gdDwwfWZ1bmN0aW9uIE5yKHQpe3JldHVybiB0PjB9ZnVuY3Rpb24gWHIodCxlLHMpe2xldCBuPS0xO2lmKGUueT09PXMueSluPTA7ZWxzZSBpZihlLng9PT1zLngpbj0xO2Vsc2V7bj1NYXRoLmFicyhlLngtcy54KT49TWF0aC5hYnMoZS55LXMueSk/MDoxfWxldCBpPS0xO3JldHVybiBpPWVbbl08c1tuXT90W25dPGVbbl0/LTE6c1tuXTx0W25dPzE6MDplW25dPHRbbl0/LTE6dFtuXTxzW25dPzE6MCxpfWZ1bmN0aW9uIHFyKHQpe3JldHVybih0PXQuY2xvbmUoKSkuZGl2VGhpcyhNYXRoLm1heChNYXRoLmFicyh0LngpLE1hdGguYWJzKHQueSkpKSx0Lm5vcm1hbGl6ZSgpLHR9ZnVuY3Rpb24gRnIodCxlLHMpe3QuaW5jKGUsMCk9PT1zJiZ0LnNldChlLDAsMCksdC5pbmMoZSwxKT09PXMmJnQuc2V0KGUsMSwwKX1mdW5jdGlvbiBWcih0LHMsbixpLHIpe3N3aXRjaChyKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnMucmlnaHRQZXJwZW5kaWN1bGFyVGhpcygpLHQucmlnaHRQZXJwZW5kaWN1bGFyVGhpcygpO2JyZWFrO2Nhc2UgMjpzLm5lZ2F0ZVRoaXMoKSx0Lm5lZ2F0ZVRoaXMoKTticmVhaztjYXNlIDM6cy5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSx0LmxlZnRQZXJwZW5kaWN1bGFyVGh
1pcygpO2JyZWFrO2RlZmF1bHQ6ZShcIlwiKX1yZXR1cm4gSi5vcmllbnRhdGlvblJvYnVzdEV4KHQscyxuLGkpfWNsYXNzIExye2NvbnN0cnVjdG9yKCl7dGhpcy5sZW5ndGg9TnVtYmVyLk5hTix0aGlzLnNwZWNpYWxQb2ludHM9W119c3BlY2lhbFBvaW50c0NvdW50KCl7cmV0dXJuIHRoaXMuc3BlY2lhbFBvaW50cy5sZW5ndGh9fWZ1bmN0aW9uIFJyKHQpe3JldHVybiB6cih0LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKSl9ZnVuY3Rpb24genIodCl7cmV0dXJuIDI1NipfdCgpKnR9ZnVuY3Rpb24gQnIodCl7Y29uc3QgZT1KLmRpc3RhbmNlKHQuZ2V0U3RhcnRYWSgpLHQuZ2V0RW5kWFkoKSkscz10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTtyZXR1cm4gcy1lPD04Kk51bWJlci5FUFNJTE9OKnN9ZnVuY3Rpb24ga3IodCxlLHM9ITEpe2VbMV0uc2V0Q29vcmRzKHQubV9jcFswXS54LXQuZ2V0U3RhcnRYKCksdC5tX2NwWzBdLnktdC5nZXRTdGFydFkoKSksZVsxXS5tdWxUaGlzKDMpLGVbMl0uc2V0Q29vcmRzKHQubV9jcFsxXS54LXQubV9jcFswXS54LHQubV9jcFsxXS55LXQubV9jcFswXS55KSxlWzJdLm11bFRoaXMoMyksZVszXT10LmdldEVuZFhZKCkuc3ViKHQuZ2V0U3RhcnRYWSgpKSxlWzNdLnN1YlRoaXMoZVsyXSksZVsyXS5zdWJUaGlzKGVbMV0pLHM/ZVswXS5zZXRDb29yZHMoMCwwKTplWzBdPXQuZ2V0U3RhcnRYWSgpfWZ1bmN0aW9uIEdyKHQsZSxzKXtjb25zdCBuPWN0KEosNCk7dC5xdWVyeUNvbnRyb2xQb2ludHMobiksanIobixlLHMpfWZ1bmN0aW9uIFdyKHQsZSxzKXtjb25zdCBuPWN0KEosNCk7dC5xdWVyeUNvbnRyb2xQb2ludHMobiksWnIobixlLHMpfWZ1bmN0aW9uIGpyKHQsZSxzKXtsZXQgbj10WzFdLng7bi09dFswXS54LG4qPTM7bGV0IGk9dFsyXS54O2ktPXRbMV0ueCxpKj0zO2xldCByPXRbM10ueDtyLT10WzBdLngsci09aSxpLT1uLGVbM10uc2V0V2l0aEVwcyhyKSxlWzJdLnNldFdpdGhFcHMoaSksZVsxXS5zZXRXaXRoRXBzKG4pLHM/ZVswXS5zZXQoMCk6ZVswXS5zZXQodFswXS54KX1mdW5jdGlvbiBacih0LGUscyl7bGV0IG49dFsxXS55O24tPXRbMF0ueSxuKj0zO2xldCBpPXRbMl0ueTtpLT10WzFdLnksaSo9MztsZXQgcj10WzNdLnk7ci09dFswXS55LHItPWksaS09bixlWzNdLnNldFdpdGhFcHMociksZVsyXS5zZXRXaXRoRXBzKGkpLGVbMV0uc2V0V2l0aEVwcyhuKSxzP2VbMF0uc2V0KDApOmVbMF0uc2V0KHRbMF0ueSl9ZnVuY3Rpb24gSHIodCxlLHM9ITEpe2NvbnN0IG49Y3QocWUsNCk7blswXS5hc3NpZ25Qb2ludDJEKHRbMF0pLG5bMV0uYXNzaWduUG9pbnQyRCh0WzFdKSxuWzJdLmFzc2lnblBvaW50MkQodFsyXSksblszXS5hc3NpZ25Qb2ludDJEKHRbM10pLGVbMV0uc2V0Q29vcmRzKG5bMV0ueC5zdWIoblswXS54KSxuWzFdLnkuc3ViKG5bMF0ueSkpLGVbMV0ubXVsVGhpcyhydC5jb25zdHJ1Y3RJbnQzMigzKSksZVsyXS5zZXRDb29yZHMoblsyXS54LnN1YihuWzFdLngpLG5bMl0ueS5zdWIoblsxXS55KSksZVsyXS5tdWxUaGlzKHJ0LmNvbnN0cnVjdEludDMyKDMpKSxlWzNdPW5bM10uc3ViKG5bMF0pLGVbM109ZVszXS5zdWIoZVsyXSksZVsyXT1lWzJdLnN1YihlWzFdKSxzP2VbMF0uc2V0Q29vcmRzKCR0LCR0KTplWzBdPW5bMF0uY2xvbmUoKX1mdW5jdGlvbiBVcih0LGUscyl7aWYocyl7aWYoZTwwKXJldHVybiBlO2lmKGU+MSlyZXR1cm4gZS0xK1VyKHQsMSwhMSl9aWYodC5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIDA7Y29uc3Qgbj0xPT09ZSxpPUpyKHQpO2lmKG4mJiFOdW1iZXIuaXNOYU4oaS5sZW5ndGgpJiYhTnVtYmVyLmlzTmFOKGkubGVuZ3RoKSlyZXR1cm4gaS5sZW5ndGg7Y29uc3Qgcj1Scih0KSxvPXIvdC5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCk7bGV0IGE9MCxoPTA7Zm9yKGxldCB1PTEsbT1pLnNwZWNpYWxQb2ludHNDb3VudCgpO3U8bTt1Kyspe2NvbnN0IHM9aS5zcGVjaWFsUG9pbnRzW3VdO2lmKGErPXRhKHQsaCxNYXRoLm1pbihlLHMpLG8sciksZTw9cylicmVhaztoPXN9cmV0dXJuIG4mJihpLmxlbmd0aD1hKSxhfWZ1bmN0aW9uIE9yKHQsZSxzKXtjb25zdCBuPVVyKHQsMSwhMSk7aWYoZTw9MClyZXR1cm4gZTtpZihlPj1uKXJldHVybiBlLW4rMTtjb25zdCBpPVswXTtyZXR1cm4gMSE9PWVuKG5ldyBLbyh0LGUpLFUudW5pdCgpLDEsaSkmJmgoXCJcIiksaVswXX1mdW5jdGlvbiBRcih0LHMsbil7dm9pZCAwPT09biYmKG49cyxzPTApO2NvbnN0IGk9bmV3IEo7aWYoczwwfHxuPjEpcmV0dXJuIGkuc2V0TkFOKCksaTtpZihzPm4mJmUoXCJjYWxjdWxhdGVfc3ViX3dlaWdodGVkQ2VudHJvaWRcIikscz09PW58fHQuaXNEZWdlbmVyYXRlKDApKXJldHVybiBpLnNldENvb3JkcygwLDApLGk7Y29uc3Qgcj1Kcih0KSxvPVJyKHQpLGE9by90LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTtsZXQgaD1zLHU9MDtmb3IobGV0IGU9MSxtPXIuc3BlY2lhbFBvaW50c0NvdW50KCk7ZTxtO2UrKylpZihzPHIuc3BlY2lhbFBvaW50c1tlXSl7dT1lLTE7YnJlYWt9aS5zZXRDb29yZHMoMCwwKTtmb3IobGV0IGU9dSsxLG09ci5zcGVjaWFsUG9pbnRzQ291bnQoKTtlPG07ZSsrKXtjb25zdCBzPU1hdGgubWluKHIuc3BlY2lhbFBvaW50c1tlXSxuKSx1PWVhKHQsaCxzLGEsbyk7aWYoaS5hZGRUaGlzKHUpLGg9cyxuPD1yLnNwZWNpYWxQb2ludHNbZV0pYnJlYWt9cmV0dXJuIGkuYWRkKHQuZ2V0U3RhcnRYWSgpLm11bCh0LmNhbGN1bGF0ZUxlbmd0aDJEKCkpKX1mdW5jdGlvbiBKcih0KXtpZih0Lm1fY2FjaGVkVmFsdWVzKXJldHVybiB0Lm1fY2FjaGVkVmFsdWVzO2NvbnN0IGU9bmV3IExyLHM9Y3QoaHQsOCksbj1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKG4pO2NvbnN0IGk9Wm8obixzKTtlLnNwZWNpYWxQb2ludHM9W107Zm9yKGxldCByPTA7cjxpO3IrKyllLnNwZWNpYWxQb2ludHMucHVzaChzW3JdLnZhbHVlKCkpO3JldHVybiAkcih0LGUpLGV9ZnVuY3Rpb24gS3IodCl7bGV0IGU9bnVsbDtyZXR1cm4gZT10Lm1fY2FjaGVkVmFsdWVzLGV9ZnVuY3Rpb24gJHIodCxlKXt0Lm1fY2FjaGVkVmFsdWVzPWV9ZnVuY3Rpb24gdG8odCl7dC5tX2NhY2hlZFZhbHVlcz1udWxsfWZ1bmN0aW9uIGVvKHQsZSl7ZS5tX2NhY2hlZFZhbHVlcz1zdCh0Lm1fY2FjaGVkVmFsdWVzLHQubV9jYWNoZWRWYWx1ZXM9ZS5tX2NhY2hlZFZhbHVlcyl9ZnVuY3Rpb24gc28odCxlLHMsbil7aWYoZS5pc0VxdWFsKHQubV9YU3RhcnQsdC5tX1lTdGFydCkmJnMuaXNFcXVhbCh0Lm1fWEVuZCx0Lm1fWUVuZCkpcmV0dXJuO2NvbnN0IGk9ISFuJiZ0LmlzTW9ub3RvbmVRdWlja0FuZERpcnR5KCkscj1uZXcgY2Usbz1jdChKLDMpO29bMF0uc2V0Q29vcmRzKHQubV9YU3RhcnQsdC5tX1lTdGFydCksb1syXS5zZXRDb29yZHModC5tX1hFbmQsdC5tX1lFbmQpO2NvbnN0IGE9bmV3IEo7YS5zZXRTdWIob1syXSxvWzBdKSxhLmxlZnRQZXJwZW5kaWN1bGFyVGh
1pcygpLG9bMV0uc2V0QWRkKG9bMF0sYSk7Y29uc3QgaD1jdChKLDMpO2hbMF0uc2V0Q29vcmRzUG9pbnQyRChlKSxoWzJdLnNldENvb3Jkc1BvaW50MkQocyksYS5zZXRTdWIoaFsyXSxoWzBdKSxhLmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpLGhbMV0uc2V0QWRkKGhbMF0sYSksci5zZXRGcm9tVHdvVHJpYW5nbGVzKG8saCk/ci50cmFuc2Zvcm1Qb2ludHMyRCh0Lm1fY3AsMix0Lm1fY3ApOihDdChlLHMsMS8zLHQubV9jcFswXSksQ3QoZSxzLDIvMyx0Lm1fY3BbMV0pKSx0LmNoYW5nZUVuZFBvaW50czJEKGUscyksaSYmY28odCl9ZnVuY3Rpb24gbm8odCxlLHMsbixpKXtyZXR1cm57dG1pbjp0LHRtYXg6ZSx0OnMsZDpuLHB0OmkuY2xvbmUoKX19ZnVuY3Rpb24gaW8odCxlLHMsbil7Y29uc3QgaT1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKGkpO2NvbnN0IHI9TygxOCxOYU4pLG89ZW4obmV3IExvKGksZSxOYU4pLFUuY29uc3RydWN0KHMsbiksMTgsciksYT1uZXcgSjt0LnF1ZXJ5Q29vcmQyRChzLGEpO2xldCBoPXMsdT1KLmRpc3RhbmNlKGEsZSk7Y29uc3QgbT1uZXcgSjt0LnF1ZXJ5Q29vcmQyRChuLG0pO2NvbnN0IGw9Si5kaXN0YW5jZShtLGUpO2w8dSYmKHU9bCxoPW4sYS5hc3NpZ24obSkpO2ZvcihsZXQgYz0wO2M8bztjKyspe3QucXVlcnlDb29yZDJEKHJbY10sbSk7Y29uc3Qgcz1KLmRpc3RhbmNlKG0sZSk7czx1JiYodT1zLGg9cltjXSxhLmFzc2lnbihtKSl9cmV0dXJuIG5vKHMsbixoLHUsYSl9ZnVuY3Rpb24gcm8odCxlKXtjb25zdCBuPWN0KGh0LDQpO0dyKHQsbiwhMCk7Y29uc3QgaT1jdChodCw0KTtXcih0LGksITApO2NvbnN0IHI9blszXS5jbG9uZSgpLG89blsyXS5jbG9uZSgpLGE9blsxXS5jbG9uZSgpLGg9aVszXS5jbG9uZSgpLHU9aVsyXS5jbG9uZSgpLG09aVsxXS5jbG9uZSgpLGw9by5tdWxFKGEpLmFkZEUodS5tdWxFKG0pKS5tdWwoNCksYz1vLm11bEUobykubXVsKDgpLmFkZEUoci5tdWxFKGEpLm11bCgxMikpLmFkZEUodS5tdWxFKHUpLm11bCg4KS5hZGRFKGgubXVsRShtKS5tdWwoMTIpKSksZz1yLm11bEUobykuYWRkRShoLm11bEUodSkpLm11bCgzNiksZD1yLm11bEUocikuYWRkRShoLm11bEUoaCkpLm11bCgzNiksXz1jdChodCwzKSxwPV9uKGQsZyxjLGwsbmV3IFUoMCwxKSwhMSxfKTtpZihzKHA8PTMpLHA+MCl7Y29uc3Qgcz1tbyh0LDEsMCkuc3FyTGVuZ3RoKCksbj1tbyh0LDEsMSkuc3FyTGVuZ3RoKCk7bGV0IGk9cztlLnNldCgwKSxpPG4mJihpPW4sZS5zZXQoMSkpO2ZvcihsZXQgcj0wO3I8cDtyKyspe2NvbnN0IHM9bW8odCwxLF9bcl0udmFsdWUoKSkuc3FyTGVuZ3RoKCk7czxpJiYoaT1zLGU9X1tyXSl9fX1mdW5jdGlvbiBvbyh0LGUscyxuKXtpZigxPT09ZSl7Y29uc3QgZT0xLXMsaT1lKmUscj1zKnMsbz10WzFdLnN1Yih0WzBdKSxhPXRbMl0uc3ViKHRbMV0pLGg9dFszXS5zdWIodFsyXSksdT1vLm11bChpKS5hZGQoYS5tdWwoMiplKnMpKS5hZGQoaC5tdWwocikpO24uYXNzaWduKHUubXVsKDMpKX1lbHNlIGlmKDI9PT1lKXtjb25zdCBlPTEtcyxpPXRbMl0uc3ViKHRbMV0pLnN1Yih0WzFdLnN1Yih0WzBdKSkscj10WzNdLnN1Yih0WzJdKS5zdWIodFsyXS5zdWIodFsxXSkpLG89aS5tdWwoZSkuYWRkKHIubXVsKHMpKTtuLmFzc2lnbihvLm11bCg2KSl9ZWxzZSBpZigzPT09ZSl7Y29uc3QgZT10WzJdLnN1Yih0WzFdKSxzPXRbM10uc3ViKGUubXVsKDMpKS5zdWIodFswXSk7bi5hc3NpZ24ocy5tdWwoNikpfWVsc2Ugbi5zZXRDb29yZHMoMCwwKX1mdW5jdGlvbiBhbyh0LGUscyxuKXt7Y29uc3QgZT11dC5zdWJFKHMpLGk9ZS5zcXIoKSxyPXMuc3FyKCksbz10WzFdLnN1YkUodFswXSkubXVsRShpKS5hZGRFKHRbMl0uc3ViRSh0WzFdKS5tdWxFKG5ldyBodCgyKS5tdWxFKGUpLm11bEUocykpKS5hZGRFKHRbM10uc3ViRSh0WzJdKS5tdWxFKHIpKTtuLnNldEUoby5tdWxFKG5ldyBodCgzKSkpfX1mdW5jdGlvbiBobyh0LGUscyl7Y29uc3Qgbj1uZXcgSjtyZXR1cm4gb28odCxlLHMsbiksbn1mdW5jdGlvbiB1byh0LGUscyl7Y29uc3Qgbj1bTmUuY29uc3RydWN0UG9pbnQyRCh0WzBdKSxOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMV0pLE5lLmNvbnN0cnVjdFBvaW50MkQodFsyXSksTmUuY29uc3RydWN0UG9pbnQyRCh0WzNdKV0saT1uZXcgTmU7cmV0dXJuIGFvKG4sZSxzLGkpLGl9ZnVuY3Rpb24gbW8odCxlLHMpe2NvbnN0IG49Y3QoSiw0KTtyZXR1cm4gdC5xdWVyeUNvbnRyb2xQb2ludHMobiksaG8obixlLHMpfWZ1bmN0aW9uIGxvKHQpe2NvbnN0IGU9dC5tX2NwWzBdLnN1Yih0LmdldFN0YXJ0WFkoKSkscz10Lm1fY3BbMV0uc3ViKHQubV9jcFswXSksbj10LmdldEVuZFhZKCkuc3ViKHQuZ2V0U3RhcnRYWSgpKTtlLm11bFRoaXMoMykscy5tdWxUaGlzKDMpLG4uc3ViVGhpcyhzKSxzLnN1YlRoaXMoZSk7cmV0dXJuKDMqbi54KigyKnMueSs1KmUueSktMypuLnkqKDIqcy54KzUqZS54KSsxMCoocy54KmUueS1zLnkqZS54KSkvNjB9ZnVuY3Rpb24gY28odCl7Y29uc3QgZT1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKGUpO2NvbnN0IHM9Z28oZSk7cmV0dXJuIHMmJih0Lm1fY3BbMF0uc2V0Q29vcmRzUG9pbnQyRChlWzFdKSx0Lm1fY3BbMV0uc2V0Q29vcmRzUG9pbnQyRChlWzJdKSx0LmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCkpLHN9ZnVuY3Rpb24gZ28odCl7cmV0dXJuIFZlKHQpfWZ1bmN0aW9uIF9vKHQpe3JldHVybiBMZSh0KX1mdW5jdGlvbiBwbyh0LGUscyl7Y29uc3Qgbj1uZXcgSixpPW5ldyBKLHI9bmV3IEosbz1uZXcgSixhPW5ldyBKO2U8PS41PyhYdCgyLHRbMF0sdFsxXSxlLG4pLFh0KDIsdFsxXSx0WzJdLGUsaSksWHQoMix0WzJdLHRbM10sZSxyKSxYdCgyLG4saSxlLG8pLFh0KDIsaSxyLGUsYSksWHQoMixvLGEsZSxzKSk6KHF0KDIsdFswXSx0WzFdLGUsbikscXQoMix0WzFdLHRbMl0sZSxpKSxxdCgyLHRbMl0sdFszXSxlLHIpLHF0KDIsbixpLGUsbykscXQoMixpLHIsZSxhKSxxdCgyLG8sYSxlLHMpKX1mdW5jdGlvbiBmbyh0LGUsbixpKXtzKGU+PTAmJmU8PTEpO2NvbnN0IHI9bmV3IEosbz1uZXcgSixhPW5ldyBKLGg9bmV3IEosdT1uZXcgSixtPW5ldyBKO2U8PS41PyhYdCgyLHRbMF0sdFsxXSxlLHIpLFh0KDIsdFsxXSx0WzJdLGUsbyksWHQ
1oMix0WzJdLHRbM10sZSxhKSxYdCgyLHIsbyxlLGgpLFh0KDIsbyxhLGUsdSksWHQoMixoLHUsZSxtKSk6KHF0KDIsdFswXSx0WzFdLGUscikscXQoMix0WzFdLHRbMl0sZSxvKSxxdCgyLHRbMl0sdFszXSxlLGEpLHF0KDIscixvLGUsaCkscXQoMixvLGEsZSx1KSxxdCgyLGgsdSxlLG0pKTtjb25zdCBsPXRbM10uY2xvbmUoKTtuJiYoblswXS5hc3NpZ24odFswXSksblsxXS5hc3NpZ24ociksblsyXS5hc3NpZ24oaCksblszXS5hc3NpZ24obSkpLGkmJihpWzBdLmFzc2lnbihtKSxpWzFdLmFzc2lnbih1KSxpWzJdLmFzc2lnbihhKSxpWzNdLmFzc2lnbihsKSl9ZnVuY3Rpb24gUG8odCxlLG4saSl7aWYocyhlPj0wJiZuPD0xJiZlPD1uKSxlPT09bil7Y29uc3Qgcz1uZXcgSjtyZXR1cm4geW8odCxlLHMpLGlbMF0uYXNzaWduKHMpLGlbMV0uYXNzaWduKHMpLGlbMl0uYXNzaWduKHMpLHZvaWQgaVszXS5hc3NpZ24ocyl9aWYoMD09PWUmJjE9PT1uKXtmb3IobGV0IGU9MDtlPDQ7KytlKWlbZV0uYXNzaWduKHRbZV0pO3JldHVybn1jb25zdCByPWN0KEosNCk7Zm8odCxuLHIsbnVsbCksZm8ocixuPjA/ZS9uOjAsbnVsbCxyKSx5byh0LGUsclswXSkseW8odCxuLHJbM10pLGlbMF0uc2V0Q29vcmRzUG9pbnQyRChyWzBdKSxpWzFdLnNldENvb3Jkc1BvaW50MkQoclsxXSksaVsyXS5zZXRDb29yZHNQb2ludDJEKHJbMl0pLGlbM10uc2V0Q29vcmRzUG9pbnQyRChyWzNdKX1mdW5jdGlvbiB5byh0LGUscyxuKXtpZihuKXtpZihlPDApe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dFswXSxlbmQ6dFswXS5hZGQodm8odCwwKS5nZXRVbml0VmVjdG9yKCkpfSksZSxzKX1pZihlPjEpe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dFszXSxlbmQ6dFszXS5hZGQodm8odCwxKS5nZXRVbml0VmVjdG9yKCkpfSksZS0xLHMpfX1pZihlPD0uNSl7Y29uc3Qgbj1uZXcgSjtYdCgyLHRbMF0sdFsxXSxlLG4pO2NvbnN0IGk9bmV3IEo7WHQoMix0WzFdLHRbMl0sZSxpKTtjb25zdCByPW5ldyBKO1h0KDIsdFsyXSx0WzN
1dLGUscik7Y29uc3Qgbz1uZXcgSjtYdCgyLG4saSxlLG8pO2NvbnN0IGE9bmV3IEo7WHQoMixpLHIsZSxhKSxYdCgyLG8sYSxlLHMpfWVsc2V7Y29uc3Qgbj1uZXcgSjtxdCgyLHRbMF0sdFsxXSxlLG4pO2NvbnN0IGk9bmV3IEo7cXQoMix0WzFdLHRbMl0sZSxpKTtjb25zdCByPW5ldyBKO3F0KDIsdFsyXSx0WzNdLGUscik7Y29uc3Qgbz1uZXcgSjtxdCgyLG4saSxlLG8pO2NvbnN0IGE9bmV3IEo7cXQoMixpLHIsZSxhKSxxdCgyLG8sYSxlLHMpfX1mdW5jdGlvbiB4byh0LGUscyl7aWYoZS52YWx1ZSgpPD0uNSl7Y29uc3Qgbj1uZXcgTmU7RnQoMixOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMF0pLE5lLmNvbnN0cnVjdFBvaW50MkQodFsxXSksZSxuKTtjb25zdCBpPW5ldyBOZTtGdCgyLE5lLmNvbnN0cnVjdFBvaW50MkQodFsxXSksTmUuY29uc3RydWN0UG9pbnQyRCh0WzJdKSxlLGkpO2NvbnN0IHI9bmV3IE5lO0Z0KDIsTmUuY29uc3RydWN0UG9pbnQyRCh0WzJdKSxOZS5jb25zdHJ1Y3RQb2ludDJEKHRbM10pLGUscik7Y29uc3Qgbz1uZXcgTmU7RnQoMixuLGksZSxvKTtjb25zdCBhPW5ldyBOZTtGdCgyLGkscixlLGEpLEZ0KDIsbyxhLGUscyl9ZWxzZXtjb25zdCBuPW5ldyBOZTtWdCgyLE5lLmNvbnN0cnVjdFBvaW50MkQodFswXSksTmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKSxlLG4pO2NvbnN0IGk9bmV3IE5lO1Z0KDIsTmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKSxOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pLGUsaSk7Y29uc3Qgcj1uZXcgTmU7VnQoMixOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pLE5lLmNvbnN0cnVjdFBvaW50MkQodFszXSksZSxyKTtjb25zdCBvPW5ldyBOZTtWdCgyLG4saSxlLG8pO2NvbnN0IGE9bmV3IE5lO1Z0KDIsaSxyLGUsYSksVnQoMixvLGEsZSxzKX19ZnVuY3Rpb24gQ28odCxlLHMpe2NvbnN0IG49Y3QoSiw0KTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSx4byhuLGUscyl9ZnVuY3Rpb24gdm8odCxlKXtjb25zdCBzPXB0KGUsMCwxKTtsZXQgbj1obyh0LDEscyk7cmV0dXJuIG4uaXNaZXJvKCkmJihuPWhvKHQsMixzKSxuLmlzWmVybygpP249aG8odCwzLHMpOjE9PT1zJiZuLm5lZ2F0ZVRoaXMoKSksbn1mdW5jdGlvbiBibyh0LGUscyl7Y29uc3Qgbj1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKG4pLFNvKG4sZSxzKX1mdW5jdGlvbiBTbyh0LGUscyl7ZS52YWx1ZSgpPDAmJmUuc2V0KDAsZS5lcHMoKSksZS52YWx1ZSgpPjEmJmUuc2V0KDEsZS5lcHMoKSkscy5zZXRFKHVvKHQsMSxlKSl9ZnVuY3Rpb24gRW8odCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gdD80OjJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09SW8odCxlLHMsbnVsbCxudWxsLG51bGwsbix2b2lkIDAhPT1pJiZpLCEwLCExKT80OjB9ZnVuY3Rpb24gRG8odCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gdD80OjJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09TW8odCxlLHMsbnVsbCxudWxsLG51bGwsbix2b2lkIDAhPT1pJiZpLCEwLCExKT80OjB9ZnVuY3Rpb24gd28odCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gMn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1Zbyh0LGUscyxudWxsLG51bGwsbnVsbCxuLHZvaWQgMCE9PWkmJmksITAsITEpPzQ6MH1mdW5jdGlvbiBBbyh0LGUscyxuLGkpe2lmKGkpe2lmKDAhPT1obShlLHMpKXJldHVybiB0PzQ6Mn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1Obyh0LGUscyxudWxsLG51bGwsbnVsbCxuLHZvaWQgMCE9PWkmJmksITAsITEpPzQ6MH1mdW5jdGlvbiBUbyh0LGUscyxuLGkpe2lmKGkpe2lmKDAhPT1obShlLHMpKXJldHVybiB0PzQ6Mn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1Ybyh0LGUscyxudWxsLG51bGwsbnVsbCxuLGk/PyExLCEwLCExKT80OjB9ZnVuY3Rpb24gSW8odCxlLHMsbixpLHIsbyxhLGgsdSl7aWYobnVsbCE9PWkmJihpLmxlbmd0aD0wKSxudWxsIT1yJiYoci5sZW5ndGg9MCksbnVsbCE9PW4mJihuLmxlbmd0aD0wKSxzLmlzRGVnZW5lcmF0ZSgwKSl7Y29uc3QgdD1bMCwwLDBdLGE9ZS5pbnRlcnNlY3RQb2ludChzLmdldFN0YXJ0WFkoKSx0LG8pO2lmKGE+MCl7aWYobnVsbCE9PWkpZm9yKGxldCBlPTA7ZTxhO2UrKylpLnB1c2godFtlXSk7aWYobnVsbCE9PXIpZm9yKGxldCB0PTA7dDxhO3QrKylyLnB1c2goMCk7aWYobnVsbCE9bilmb3IobGV0IHM9MDtzPGE7cysrKXtjb25zdCBpPW5ldyBKO2UucXVlcnlDb29yZDJEKHRbc10saSksbi5wdXNoKGkpfX1yZXR1cm4gYX1jb25zdCBtPW9zKGUscyk7aWYoYXMoZSxzLG89TWF0aC5tYXgobyxtKSkpcmV0dXJuIDA7Y29uc3QgbD1jdChKLDQpO2tyKGUsbCk7Y29uc3QgYz1zLmdldEVuZFhZKCk7Yy5zdWJUaGlzKHMuZ2V0U3RhcnRYWSgpKTtjb25zdCBnPWMuY2xvbmUoKTtnLmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpO2xldCBkPTMqbFszXS5kb3RQcm9kdWN0KGcpLF89MipsWzJdLmRvdFByb2R1Y3QoZykscD1sWzFdLmRvdFByb2R1Y3QoZyk7Y29uc3QgZj1PKDE1LE51bWJlci5OYU4pLFA9TygxNSxOdW1iZXIuTmFOKTtsZXQgeT1ubihkLF8scCxVLnVuaXQoKSwhMSxmKTt5PDAmJihmWzBdPTAsZlsxXT0xLHk9Mik7bGV0IHgsQz0wO2ZvcihsZXQgUz0wLEU9QztTPHk7KytTKXtjb25zdCB0PWUuZ2V0Q29vcmQyRChmW1MrRV0pO1BbQ109cy5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LCExKSxKLmRpc3RhbmNlKHQscy5nZXRDb29yZDJEKFBbQ10pKTw9byYmKGZbQ109ZltTK0VdLEMrKyl9aWYobFswXS5zdWJUaGlzKHMuZ2V0U3RhcnRYWSgpKSxNYXRoLmFicyhjLngpPj1NYXRoLmFicyhjLnkpKXtjb25zdCB0PWMueS9jLng7ZD1sWzNdLnktbFszXS54KnQsXz1sWzJdLnktbFsyXS54KnQscD1sWzFdLnktbFsxXS54KnQseD1sWzBdLnktbFswXS54KnR9ZWxzZXtjb25zdCB0PWMueC9jLnk7ZD1sWzNdLngtbFszXS55KnQsXz1sWzJdLngtbFsyXS55KnQscD1sWzFdLngtbFsxXS55KnQseD1sWzBdLngtbFswXS55KnR9Y29uc3Qgdj1lLmdldEVuZFhZKCkuZXF1YWxzKHMuZ2V0U3RhcnRYWSgpKXx8ZS5nZXRFbmRYWSgpLmVxdWFscyhzLmdldEVuZFhZKCkpLGI9WzAsMCwwXTt5PXJuKGQsXyxwLHgsVS51bml0KCksdixiKTtmb3IobGV0IFM9MCxFPUM7Uzx5OysrUyl7ZltTK0VdPWJbU107Y29uc3QgdD1lLmdldENvb3JkMkQoZltTK0VdKTtQW0NdPXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUodCwhMSk7Si5kaXN0YW5jZSh0LHMuZ2V0Q29vcmQyRChQW
10NdKSk8PW8mJihmW0NdPWZbUytFXSxDKyspfXk9ZS5pbnRlcnNlY3RQb2ludChzLmdldFN0YXJ0WFkoKSxiLG8pO2ZvcihsZXQgUz0wO1M8eTtTKyspZltDXT1iW1NdLFBbQysrXT0wO3k9ZS5pbnRlcnNlY3RQb2ludChzLmdldEVuZFhZKCksYixvKTtmb3IobGV0IFM9MDtTPHk7UysrKWZbQ109YltTXSxQW0MrK109MTtyZXR1cm4gMCE9PXMuaW50ZXJzZWN0UG9pbnQoZS5nZXRTdGFydFhZKCksYixvKSYmKFBbQ109YlswXSxmW0MrK109MCksMCE9PXMuaW50ZXJzZWN0UG9pbnQoZS5nZXRFbmRYWSgpLGIsbykmJihQW0NdPWJbMF0sZltDKytdPTEpLDA9PT1DPzA6Z20odCxlLHMsZixQLEMsbixpLHIsbyxhLGgsdSl9ZnVuY3Rpb24gTW8odCxlLHMsbixpLHIsbyxhLGgsdSl7aWYoRXUocykpe3JldHVybiBJbyh0LGUsbmV3IGZtKHtzdGFydDpzLmdldFN0YXJ0WFkoKSxlbmQ6cy5nZXRFbmRYWSgpfSksbixpLHIsbyxhLGgsdSl9Y29uc3QgbT1vcyhlLHMpO2lmKGFzKGUscyxvPU1hdGgubWF4KG8sbSkpKXJldHVybiAwO2NvbnN0IGw9W10sYz1bXSxnPVtdLGQ9Y3QoSiw0KTt7ZS5xdWVyeUNvbnRyb2xQb2ludHMoZCk7Y29uc3QgdD1jdChKLDQpLG49bmV3IGNlO3MuY2Fub25pY1RvV29ybGRUcmFuc2Zvcm1hdGlvbihuKTtjb25zdCBpPW5ldyBjZTtpLnNldEludmVydChuKSxpLnRyYW5zZm9ybVBvaW50czJEKGQsNCx0KTtjb25zdCByPWN0KHFlLDQpO0hyKHQscik7Y29uc3QgaD1bclswXS54LHJbMV0ueCxyWzJdLngsclszXS54XSx1PVtyWzBdLnksclsxXS55LHJbMl0ueSxyWzNdLnldLG09Y3QocnQsMyk7bVswXS5zZXREb3VibGUocy5nZXRTZW1pTWlub3JBeGlzKCkpLG1bMF0uc3FyVGhpcygpLG1bMV0uc2V0RG91YmxlKHMuZ2V0U2VtaU1ham9yQXhpcygpKSxtWzFdLnNxclRoaXMoKSxtWzJdLnNldFRoaXMobVswXSksbVsyXS5tdWxUaGlzKG1bMV0pLG1bMl0ubmVnYXRlVGhpcygpO2NvbnN0IF89Rm4oaCwzLHUsMyxudWxsLDAsbSwhMCxVLnVuaXQoKSxVLnVuaXQoKSxjLGEpO2lmKF8+MCl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPF87bisrKXtjb25zdCBpPW5ldyBKO2UucXVlcnlDb29yZDJEKGNbbl0saSk7Y29uc3Qgcj1zLmdldENsb3Nlc3RDb29yZGluYXRlKGksITEpLGE9bmV3IEo7cy5xdWVyeUNvb3JkMkQocixhKTtKLmRpc3RhbmNlKGksYSk8PW8mJihsLnB1c2goaS5jbG9uZSgpKSxjW3RdPWNbbl0sZy5wdXNoKHIpLHQrKyl9Yy5sZW5ndGg9dCxsLmxlbmd0aD10fX1jb25zdCBfPVswLDFdO2ZvcihsZXQgcD0wO3A8MjtwKyspe2NvbnN0IHQ9MD09PXA/cy5nZXRTdGFydFhZKCk6cy5nZXRFbmRYWSgpLGU9WzBdO1JvKGQsdCxVLnVuaXQoKSwhMSwtMSwxLGUpO2NvbnN0IG49bmV3IEo7eW8oZCxlWzBdLG4pO0ouZGlzdGFuY2UodCxuKTw9byYmKGMucHVzaChlWzBdKSxnLnB1c2goX1twXSksbC5wdXNoKG4uY2xvbmUoKSkpfWZvcihsZXQgcD0wO3A8MjtwKyspe2NvbnN0IHQ9WzAsM107e2NvbnN0IGU9cy5nZXRDbG9zZXN0Q29vcmRpbmF0ZShkW3RbcF1dLCExKSxuPW5ldyBKO3MucXVlcnlDb29yZDJEKGUsbik7Si5kaXN0YW5jZShkW3RbcF1dLG4pPD1vJiYoYy5wdXNoKF9bcF0pLGcucHVzaChlKSxsLnB1c2gobi5jbG9uZSgpKSl9fXJldHVybiBnbSh0LGUscyxjLGcsYy5sZW5ndGgsbixpLHIsbyxhLGgsdSl9ZnVuY3Rpb24gWW8odCxlLG4saSxyLG8sYSxoLHUsbSl7Y29uc3QgbD1jdChKLDQpO2UucXVlcnlDb250cm9sUG9pbnRzKGwpO2NvbnN0IGM9Y3QoSiw0KTtpZihuLnF1ZXJ5Q29udHJvbFBvaW50cyhjKSxocyhsLGMsNCk8MClyZXR1cm4gWW8odCxuLGUsaSxvLHIsYSxoLHUsIW0pO2NvbnN0IGc9b3MoZSxuKTtpZihhcyhlLG4sYT1NYXRoLm1heChhLGcpKSlyZXR1cm4gMDtpZihzYShlLG4saSxyLG8sYSxoLHUsbSkpcmV0dXJuIDI7Y29uc3QgZD1uZXcgVSgwLDEpLF89bmV3IFUoMCwxKTt7Y29uc3QgdD1uZXcgd2U7Vm8obCxuZXcgVSgwLDEpLHQpO2NvbnN0IGU9bmV3IHdlO1ZvKGMsbmV3IFUoMCwxKSxlKTtjb25zdCBzPU1hdGgubWF4KHQubWF4RGltKCksZS5tYXhEaW0oKSk7aWYodC5pbmZsYXRlKDMqYSksZS5pbmZsYXRlKDMqYSksIXQuaW50ZXJzZWN0VyhlKSlyZXR1cm4gMDtpZih0Lm1heERpbSgpPC4xKnMpe2lmKFFvKGwsdCxkKSxkLmlzRW1wdHkoKSlyZXR1cm4gMDtpZihRbyhjLHQsXyksXy5pc0VtcHR5KCkpcmV0dXJuIDA7UG8obCxkLnZtaW4sZC52bWF4LGwpLFBvKGMsXy52bWluLF8udm1heCxjKX19Y29uc3QgcD1fbShsLDMsYywzLGEpO2lmKDA9PT1wKXJldHVybiAwO2NvbnN0IGY9W10sUD1bXSx5PVtdO2xldCB4PSExO2lmKC0xPT09cCl7Y29uc3QgdD1jdChxZSw0KTtIcihsLHQpO2NvbnN0IGU9W3RbMF0ueCx0WzFdLngsdFsyXS54LHRbM10ueF0scz1bdFswXS55LHRbMV0ueSx0WzJdLnksdFszXS55XSxuPWN0KHFlLDQpO0hyKGMsbik7Y29uc3QgaT1bXSxyPVtdLG89Tm4oZSwzLHMsMyxudWxsLDAsW25bMF0ueCxuWzFdLngsblsyXS54LG5bM10ueF0sMyxbblswXS55LG5bMV0ueSxuWzJdLnksblszXS55XSwzLG51bGwsMCwhMCxVLnVuaXQoKSxVLnVuaXQoKSxpLHIsdSk7aWYobz4wKWZvcihsZXQgaD0wO2g8bztoKyspe2NvbnN0IHQ9bmV3IEo7eW8oYyxyW2hdLHQpO2NvbnN0IGU9bmV3IEo7eW8obCxpW2hdLGUpO0ouZGlzdGFuY2UoZSx0KTw9YSYmKGYucHVzaChlLmNsb25lKCkpLHkucHVzaChyW2hdKSxQLnB1c2goaVtoXSkpfWVsc2UtMT09PW8mJih4PSEwKX1mb3IobGV0IHM9MDtzPDI7cysrKXtjb25zdCB0PTA9PT1zP2w6YyxlPTA9PT1zP2M6bDtmb3IobGV0IG49MDtuPDI7bisrKXtjb25zdCBpPTA9PT1uPzA6MyxyPVswXTtSbyhlLHRbaV0sVS51bml0KCksITEsLTEsMSxyKTtjb25zdCBvPW5ldyBKO3lvKGUsclswXSxvKTtKLmRpc3RhbmNlKHRbaV0sbyk8PWEmJigwPT09cz8oUC5wdXNoKDA9PT1pPzA6MSkseS5wdXNoKHJbMF0pKTooeS5wdXNoKDA9PT1pPzA6MSksUC5wdXNoKHJbMF0pKSxmLnB1c2goby5jbG9uZSgpKSl9fWlmKDA9PT1QLmxlbmd0aCYmeCl7Y29uc3QgdD1lLmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKT5uLmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTt7Y29uc3QgaT1bMCwwXTtpZigyPT09V28odD9lOm4saSwhMCkmJihzKFUudW5pdCgpLmNvbnRhaW5zQ29vcmRpbmF0ZShpWzBdKSksIVUudW5pdCgpLmNvbnRhaW5zQ29vcmRpbmF0ZShpWzFdKSkpe2NvbnN0IGU9bmV3IEo7eW8odD9sOmMsaVswXSxlKTtjb25zdCBzPVswLDBdOzE9PT1Sbyh0P2M6b
1CxlLFUudW5pdCgpLCExLC0xLDIscykmJihmLnB1c2goZS5jbG9uZSgpKSxQLnB1c2godD9pWzBdOnNbMF0pLHkucHVzaCh0P3NbMF06aVswXSkpfX19aWYoMD09PVAubGVuZ3RoKXJldHVybiAwO2lmKCFkLmVxdWFsc1JhbmdlKDAsMSkpZm9yKGxldCBzPTA7czxQLmxlbmd0aDsrK3MpUFtzXT1yYS5yZWNhbGN1bGF0ZVBhcmVudFQoZC52bWluLGQudm1heCxQW3NdKTtpZighXy5lcXVhbHNSYW5nZSgwLDEpKWZvcihsZXQgcz0wO3M8eS5sZW5ndGg7KytzKXlbc109cmEucmVjYWxjdWxhdGVQYXJlbnRUKF8udm1pbixfLnZtYXgseVtzXSk7cmV0dXJuIGdtKHQsZSxuLFAseSxQLmxlbmd0aCxpLHIsbyxhLGgsdSxtKX1mdW5jdGlvbiBObyh0LGUsbixpLHIsbyxhLGgsdSxtKXtjb25zdCBsPW9zKGUsbik7aWYobi5pc0RlZ2VuZXJhdGVUb0xpbmVIZWxwZXIobCkpe2NvbnN0IHM9bmV3IGZtKHtzdGFydDpuLmdldFN0YXJ0WFkoKSxlbmQ6bi5nZXRFbmRYWSgpfSksbD1Jbyh0LGUscyxpLHIsbyxhLGgsdSxtKTtpZihvKWZvcihsZXQgdD0wO3Q8bDsrK3Qpe2NvbnN0IGU9cy5nZXRDb29yZDJEKG9bdF0pO29bdF09bi5nZXRDbG9zZXN0Q29vcmRpbmF0ZShlLCExKX1yZXR1cm4gbH1pZihhcyhlLG4sYT1NYXRoLm1heChhLGwpKSlyZXR1cm4gMDtjb25zdCBjPWN0KEosNCk7ZS5xdWVyeUNvbnRyb2xQb2ludHMoYyk7Y29uc3QgZz1jdChKLDMpO24ucXVlcnlDb250cm9sUG9pbnRzKGcpO2NvbnN0IGQ9bmV3IFUoMCwxKSxfPW5ldyBVKDAsMSkscD1bMCwwLDBdO24ucXVlcnlXZWlnaHRzKHApO2NvbnN0IGY9WzEsUGgocCksMV07e2NvbnN0IHQ9bmV3IHdlO1ZvKGMsbmV3IFUoMCwxKSx0KTtjb25zdCBlPW5ldyB3ZTtqYShnLGYsbmV3IFUoMCwxKSxlKTtjb25zdCBzPU1hdGgubWF4KHQubWF4RGltKCksZS5tYXhEaW0oKSk7aWYodC5pbmZsYXRlKDMqYSksZS5pbmZsYXRlKDMqYSksIXQuaW50ZXJzZWN0VyhlKSlyZXR1cm4gMDtpZih0Lm1heERpbSgpPC4xKnMpe2lmKFFvKGMsdCxkKSxkLmlzRW1wdHkoKSlyZXR1cm4gMDtpZihmaChnLGYsdCxfKSxfLmlzRW1wdHkoKSlyZXR1cm4gMDtQbyhjLGQudm1pbixkLnZtYXgsYyksSmEoZyxmLF8udm1pbixfLnZtYXgsZyxmKX19Y29uc3QgUD1fbShjLDMsZywyLGEpO2lmKDA9PT1QKXJldHVybiAwO2NvbnN0IHk9W10seD1bXSxDPVtdO2lmKC0xPT09UCl7Y29uc3QgdD1jdChxZSw0KTtIcihjLHQpO2NvbnN0IGU9W3RbMF0ueCx0WzFdLngsdFsyXS54LHRbM10ueF0scz1bdFswXS55LHRbMV0ueSx0WzJdLnksdFszXS55XSxuPWN0KHJ0LDMpLGk9Y3QocnQsMykscj1jdChydCwzKTt1aChnLGYsbixpLHIpO2NvbnN0IG89W10saD1bXSxtPU5uKG4sMixpLDIsciwyLGUsMyxzLDMsbnVsbCwwLCEwLFUudW5pdCgpLFUudW5pdCgpLGgsbyx1KTtpZihtPjApZm9yKGxldCB1PTA7dTxtO3UrKyl7Y29uc3QgdD1uZXcgSjt5byhjLG9bdV0sdCk7Y29uc3QgZT1uZXcgSjtwaChnLGYsaFt1XSxlKTtKLmRpc3RhbmNlKHQsZSk8PWEmJih5LnB1c2godC5jbG9uZSgpKSx4LnB1c2gob1t1XSksQy5wdXNoKGhbdV0pKX19Zm9yKGxldCB2PTA7djwyO3YrKyl7bGV0IHQsZTswPT09dj8odD1jLGU9Zyk6KGU9Yyx0PWcpO2ZvcihsZXQgbj0wO248MjtuKyspe2NvbnN0IGk9MD09PW4/MDp0Lmxlbmd0aC0xLHI9WzBdLG89bmV3IEo7aWYoMD09PXYpe2NvbnN0IG49QmEoZSxmLHRbaV0sVS51bml0KCksITEsLTEsMSxyKTtzKDE9PT1uKSxwaChlLGYsclswXSxvKX1lbHNle2NvbnN0IG49Um8oZSx0W2ldLFUudW5pdCgpLCExLC0xLDEscik7cygxPT09bikseW8oZSxyWzBdLG8pfUouZGlzdGFuY2UodFtpXSxvKTw9YSYmKDA9PT12Pyh4LnB1c2goMD09PWk/MDoxKSxDLnB1c2goclswXSkpOihDLnB1c2goMD09PWk/MDoxKSx4LnB1c2goclswXSkpLHkucHVzaChvLmNsb25lKCkpKX19aWYoMD09PXgubGVuZ3RoKXJldHVybiAwO2lmKCFkLmVxdWFsc1JhbmdlKDAsMSkpZm9yKGxldCBzPTA7czx4Lmxlbmd0aDsrK3MpeFtzXT1yYS5yZWNhbGN1bGF0ZVBhcmVudFQoZC52bWluLGQudm1heCx4W3NdKTtpZighXy5lcXVhbHNSYW5nZSgwLDEpKWZvcihsZXQgcz0wO3M8Qy5sZW5ndGg7KytzKUNbc109RG4ucmVjYWxjdWxhdGVQYXJlbnRUKF8udm1pbixfLnZtYXgsQ1tzXSk7Zm9yKGxldCBzPTA7czxDLmxlbmd0aDsrK3MpQ1tzXT15aChwLENbc10pO3JldHVybiBnbSh0LGUsbix4LEMseC5sZW5ndGgsaSxyLG8sYSxoLHUsbSl9ZnVuY3Rpb24gWG8odCxlLG4saSxyLG8sYSxoLHUsbSl7Y29uc3QgbD1vcyhlLG4pO2lmKGFzKGUsbixhPU1hdGgubWF4KGEsbCkpKXJldHVybiAwO2NvbnN0IGM9Y3QoSiw0KTtlLnF1ZXJ5Q29udHJvbFBvaW50cyhjKTtjb25zdCBnPWN0KEosMyk7bi5xdWVyeUNvbnRyb2xQb2ludHMoZyk7Y29uc3QgZD1fbShjLDMsZywyLGEpO2lmKDA9PT1kKXJldHVybiAwO2NvbnN0IF89W10scD1bXSxmPVtdO2lmKC0xPT09ZCl7Y29uc3QgdD1jdChxZSw0KTtIcihjLHQpO2NvbnN0IHM9W3RbMF0ueCx0WzFdLngsdFsyXS54LHRbM10ueF0saT1bdFswXS55LHRbMV0ueSx0WzJdLnksdFszXS55XSxyPWN0KHFlLDMpO2ppKGcscik7Y29uc3Qgbz1ObihbclswXS54LHJbMV0ueCxyWzJdLnhdLDIsW3JbMF0ueSxyWzFdLnksclsyXS55XSwyLG51bGwsMCxzLDMsaSwzLG51bGwsMCwhMCxVLnVuaXQoKSxVLnVuaXQoKSxmLHAsaCk7aWYobz4wKXtsZXQgdD0wO2ZvcihsZXQgcz0wO3M8bztzKyspe2NvbnN0IGk9bmV3IEo7ZS5xdWVyeUNvb3JkMkQocFtzXSxpKTtjb25zdCByPW5ldyBKO24ucXVlcnlDb29yZDJEKGZbc10scik7Si5kaXN0YW5jZShpLHIpPD1hJiYoXy5wdXNoKGkuY2xvbmUoKSkscFt0XT1wW3NdLGZbdF09ZltzXSx0KyspfXAubGVuZ3RoPXQsXy5sZW5ndGg9dH19Zm9yKGxldCBQPTA7UDwyO1ArKyl7bGV0IHQsZTswPT09UD8odD1jLGU9Zyk6KGU9Yyx0PWcpO2ZvcihsZXQgbj0wO248MjtuKyspe2NvbnN0IGk9MD09PW4/MDp0Lmxlbmd0aC0xLHI9WzBdLG89bmV3IEo7aWYoMD09PVApYmkoZSx0W2ldLHIpLFppKGUsclswXSxvKTtlbHNle2NvbnN0IG49Um8oZSx0W2ldLFUudW5pdCgpLCExLC0xLDEscik7cygxPT09bikseW8oZSxyWzBdLG8pfUouZGlzdGFuY2UodFtpXSxvKTw9YSYmKDA9PT1QPyhwLnB1c2goMD09PWk/MDoxKSxmLnB1c2goclswXSkpOihmLnB1c2goMD09PWk/MDoxKSxwLnB1c2goclswXSkpLF8ucHVzaChvLmNsb25lKCkpKX19cmV0dXJuIGdtKHQsZSxuLHAsZixwLmxlbmd0aCxpLHIsbyxhLGgsdSxtKX1mdW5jdGlvbiBxbyh0LGUsaSxyLG8pe2NvbnN0IGE9bmV3IHdlO2lmKEZvKHQsVS51bml0KCksYSksYS5pbmZsYXRlKHIpLCFhLmlzSW50ZXJzZWN0aW5nUG9pbnQyRChlKSlyZXR1cm4gMDtjb25zdCBoPUpyKHQpO2xldCB1PTAsbT1oLnNwZWNpYWxQb2ludHNbMF07Y29uc3QgbD1bXTtmb3IobGV0IG49MSxjPWguc3BlY2lhbFBvaW50cy5sZW5ndGg7bjxjOysrbil7Y29uc3QgaT1oLnNwZWNpYWxQb2ludHNbbl0scj1pbyh0LGUsbSxpKTtpZigwPT09bC5sZW5ndGgpbC5wdXNoKHIpO2Vsc2UgaWYoci50PT09ci50bWluKXMobC5hdCgtMSkuZDw9ci5kKSxsLmF0KC0xKS50bWF4PXIudG1heDtlbHNlIGlmKGwuYXQoLTEpLnQ9PT1sLmF0KC0xKS50bWF4KXtzKGwuYXQoLTEpLmQ+PXIuZCk7Y29uc3QgdD1sLmF0KC0xKS50bWluO2xbbC5sZW5ndGgtMV09cixsLmF0KC0xKS50bWluPXR9ZWxzZSBsLnB1c2gocik7bT1pfWZvcihjb25zdCBzIG9mIGwpaWYocy5kPD1yKXtjb25zdCB0PXMudDtpPyh1Pj1pLmxlbmd0aCYmbihcIlwiKSxpW3VdPXQsdSsrKTp1Kyt9cmV0dXJuIHV9ZnVuY3Rpb24gRm8odCxlLHMpe2NvbnN0IG49Y3QoSiw0KTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKSxWbyhuLGUscyl9ZnVuY3Rpb24gVm8odCxlLHMpe2lmKGUuZXF1YWxzUmFuZ2UoMCwxKSlyZXR1cm4gdm9pZCBzLnNldEZyb21Qb2ludHModCw0KTtjb25zdCBuPWN0KEosNCk7UG8odCxlLnZtaW4sZS52bWF4LG4pLHMuc2V0RnJvbVBvaW50cyhuLDQpfWxldCBMbz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUscyl7dGhpcy5kYmdDb3VudGVyPTAsdGhpcy5jb250cm9sUG9pbnRzPXQsdGhpcy5wb2ludD1lLmNsb25lKCksdGhpcy5tYXhEaXN0YW5jZT1zfWdldE1heERlcml2YXRpdmUoKXtyZXR1cm4gNn1nZXRWYWx1ZSh0LGUpe3N3aXRjaC
1h0KXtjYXNlIDA6e2NvbnN0IHQ9bmV3IEo7eW8odGhpcy5jb250cm9sUG9pbnRzLGUsdCk7Y29uc3Qgcz1obyh0aGlzLmNvbnRyb2xQb2ludHMsMSxlKTtyZXR1cm4gMip0LnN1Yih0aGlzLnBvaW50KS5kb3RQcm9kdWN0KHMpfWNhc2UgMTp7Y29uc3QgdD1uZXcgSjt5byh0aGlzLmNvbnRyb2xQb2ludHMsZSx0KTtjb25zdCBzPWhvKHRoaXMuY29udHJvbFBvaW50cywxLGUpLG49aG8odGhpcy5jb250cm9sUG9pbnRzLDIsZSk7cmV0dXJuIDIqKHQuc3ViKHRoaXMucG9pbnQpLmRvdFByb2R1Y3Qobikrcy5kb3RQcm9kdWN0KHMpKX1jYXNlIDI6e2NvbnN0IHQ9bmV3IEo7eW8odGhpcy5jb250cm9sUG9pbnRzLGUsdCk7Y29uc3Qgcz1obyh0aGlzLmNvbnRyb2xQb2ludHMsMSxlKSxuPWhvKHRoaXMuY29udHJvbFBvaW50cywyLGUpLGk9aG8odGhpcy5jb250cm9sUG9pbnRzLDMsZSk7cmV0dXJuIDIqKHQuc3ViKHRoaXMucG9pbnQpLmRvdFByb2R1Y3QoaSkrMypzLmRvdFByb2R1Y3QobikpfWNhc2UgMzp7Y29uc3QgdD1obyh0aGlzLmNvbnRyb2xQb2ludHMsMSxlKSxzPWhvKHRoaXMuY29udHJvbFBvaW50cywyLGUpLG49aG8odGhpcy5jb250cm9sUG9pbnRzLDMsZSk7cmV0dXJuIDIqKDQqdC5kb3RQcm9kdWN0KG4pKzMqcy5zcXJMZW5ndGgoKSl9Y2FzZSA0Ontjb25zdCB0PWhvKHRoaXMuY29udHJvbFBvaW50cywyLGUpLHM9aG8odGhpcy5jb250cm9sUG9pbnRzLDMsZSk7cmV0dXJuIDIqKDEwKnQuZG90UHJvZHVjdChzKSl9Y2FzZSA1Ontjb25zdCB0PWhvKHRoaXMuY29udHJvbFBvaW50cywzLGUpO3JldHVybiAyKigxMCp0LmRvdFByb2R1Y3QodCkpfWRlZmF1bHQ6cmV0dXJuIDB9fWdldEVycm9yKHQpe3JldHVybiAwfWlzSW50ZXJlc3RpbmdJbnRlcnZhbCh0LGUpe2lmKHQ+PTAmJmU8PTEpe2NvbnN0IHM9Y3QoSiw0KTtQbyh0aGlzLmNvbnRyb2xQb2ludHMsdCxlLHMpO2NvbnN0IG49bmV3IHdlO2lmKG4uc2V0RnJvbVBvaW50cyhzLDQpLE1hdGguc3FydChuLnNxck1pbkRpc3RhbmNlKHRoaXMucG9pbnQpKT50aGlzLm1heERpc3RhbmNlKXJldHVybiExfXJldHVybiEwfX07ZnVuY3Rpb24gUm8odCxlLG4saSxyLG8sYSl7XyhVLnVuaXQoKS5jb250YWlucyhuKSYmbz4wLFwiZ2V0Q2xvc2VzdENvb3JkaW5hdGVcIiksKHI8MHx8TnVtYmVyLmlzTmFOKHIpKSYmKHI9TnVtYmVyLk1BWF9WQUxVRSk7Y29uc3QgaD1bXSx1PW5ldyBKO3lvKHQsbi52bWluLHUpO2xldCBtPUouZGlzdGFuY2UodSxlKTtpZihtPD1yJiZoLnB1c2gobmV3IEoobi52bWluLG0pKSxuLnZtaW4hPT1uLnZtYXgmJih5byh0LG4udm1heCx1KSxtPUouZGlzdGFuY2UodSxlKSxtPD1yJiZoLnB1c2gobmV3IEoobi52bWF4LG0pKSksbi53aWR0aCgpPjApe2NvbnN0IHM9TygxOCxOdW1iZXIuTmFOKSxpPWVuKG5ldyBMbyh0LGUsciksbiwxOCxzKTtmb3IobGV0IG49MDtuPGk7bisrKXlvKHQsc1tuXSx1KSxtPUouZGlzdGFuY2UodSxlKSxtPnJ8fGgucHVzaChuZXcgSihzW25dLG0pKX1pZihpKXtzKG4uZXF1YWxzKFUudW5pdCgpKSk7e3lvKHQsLTEsdSwhMCk7Y29uc3Qgcz1uZXcgSjt5byh0LDAscyk7Y29uc3Qgbj1uZXcgZm0oe3N0YXJ0OnUsZW5kOnN9KSxpPW4uZ2V0Q2xvc2VzdENvb3JkaW5hdGUoZSwhMCk7aTwxJiYodS5hc3NpZ24obi5nZXRDb29yZDJEKGkpKSxtPUouZGlzdGFuY2UodSxlKSxtPD1yJiZoLnB1c2gobmV3IEooaS0xLG0pKSl9e3lvKHQsMix1LCEwKTtjb25zdCBzPW5ldyBKO3lvKHQsbi52bWF4LHMpO2NvbnN0IGk9bmV3IGZtKHtzdGFydDpzLGVuZDp1fSksbz1pLmdldENsb3Nlc3RDb29yZGluYXRlKGUsITApO28+MCYmKHUuYXNzaWduKGkuZ2V0Q29vcmQyRChvKSksbT1KLmRpc3RhbmNlKHUsZSksbTw9ciYmaC5wdXNoKG5ldyBKKDErbyxtKSkpfX1pZighaC5sZW5ndGgpcmV0dXJuIDA7aC5zb3J0KCh0LGUpPT50LmNvbXBhcmUoZSkpO2xldCBsPTA7Y29uc3QgYz1oWzBdLng7aWYoYVtsKytdPWMsbDxvKXtjb25zdCBlPUgodCw0LCExKS50b3RhbCgpLHM9aFswXS55O2ZvcihsZXQgdD0xLG49aC5sZW5ndGg7dDxuO3QrKylpZihoW3RdLnk+cytlKXtoLmxlbmd0aD10O2JyZWFrfWguc29ydCgodCxlKT0+QnQodC54LGUueCkpLGw9MCxhW2wrK109aFswXS54O2ZvcihsZXQgdD0xLG49aC5sZW5ndGg7dDxuO3QrKyloW3RdLnghPT1hW2wtMV0mJmw8byYmKGFbbCsrXT1oW3RdLngpfXJldHVybiBsfWZ1bmN0aW9uIHpvKHQsZSxzLG4saSxyLG8pe2NvbnN0IGE9Y3QoSiw0KTtyZXR1cm4gdC5xdWVyeUNvbnRyb2xQb2ludHMoYSksUm8oYSxlLHMsbixpLHIsbyl9ZnVuY3Rpb24gQm8odCl7cmV0dXJuIHQuZ2V0U3RhcnRYWSgpLm5vcm0oMSkrdC5nZXRFbmRYWSgpLm5vcm0oMSkrdC5tX2NwWzBdLm5vcm0oMSkrdC5tX2NwWzFdLm5vcm0oMSl9ZnVuY3Rpb24ga28odCl7cmV0dXJuIHRbMF0ubm9ybSgxKSt0WzFdLm5vcm0oMSkrdFsyXS5ub3JtKDEpK3RbM10ubm9ybSgxKX1mdW5jdGlvbiBHbyh0LGUsbil7aWYocyhuPj0yKSwyPT09bil7Y29uc3Qgcz1uZXcgSjtDdC
1hlWzBdLGVbbi0xXSwxLzMscyk7Y29uc3QgaT1uZXcgSjtyZXR1cm4gQ3QoZVswXSxlW24tMV0sMi8zLGkpLHZvaWQgdC5jb25zdHJ1Y3QoZVswXSxzLGksZVtuLTFdKX1jb25zdCBpPWVbMF0scj1lW24tMV0sbz1bMCwwXSxhPXpvKHQsaSxVLnVuaXQoKSwhMSxOdW1iZXIuTmFOLDIsbyksaD1bMCwwXSx1PXpvKHQscixVLnVuaXQoKSwhMSxOdW1iZXIuTmFOLDIsaCksbT1bXTtmb3IobGV0IHM9MDtzPGE7cysrKWZvcihsZXQgYT0wO2E8dTthKyspe2NvbnN0IHU9b1tzXSxsPWhbYV0sYz11PmwsZz0ocyxvKT0+e2NvbnN0IGE9TyhuLTIsTnVtYmVyLk5hTiksaD0oKT0+e2xldCB0PTA7Zm9yKGxldCBzPTEsaT1uLTE7czxpO3MrKyl7dCs9Si5kaXN0YW5jZShlW3MtMV0sZVtzXSk7Y29uc3Qgbj10O2Fbcy0xXT1ufXQrPUouZGlzdGFuY2UoZVtuLTJdLGVbbi0xXSksYyYmYS5yZXZlcnNlKCk7Zm9yKGxldCBlPTEscz1uLTE7ZTxzO2UrKylhW2UtMV0vPXQsYyYmKGFbZS0xXT0xLWFbZS0xXSl9O2xldCBtPSExLGc9ITE7e2NvbnN0IGU9bmV3IFBtO2M/KHQucXVlcnlDdXQobCx1LGUsITApLHMuYXNzaWduKGUuZ2V0KCkuZ2V0Q29udHJvbFBvaW50MigpKSxvLmFzc2lnbihlLmdldCgpLmdldENvbnRyb2xQb2ludDEoKSkpOih0LnF1ZXJ5Q3V0KHUsbCxlLCEwKSxzLmFzc2lnbihlLmdldCgpLmdldENvbnRyb2xQb2ludDEoKSksby5hc3NpZ24oZS5nZXQoKS5nZXRDb250cm9sUG9pbnQyKCkpKSxpLmVxdWFscyhzKSYmKG09ITApLHIuZXF1YWxzKG8pJiYoZz0hMCl9aCgpO2xldCBkPU51bWJlci5NQVhfVkFMVUU7Y29uc3QgXz1zLmNsb25lKCkscD1vLmNsb25lKCk7Zm9yKGxldCB0PTA7dDw1O3QrKyl7ZD1uYSghMCwhMSxpLF8scCxyLG0sZyxhLG4tMixlLG4pfWZvcihsZXQgdD0wO3Q8MzA7dCsrKXtjb25zdCB0PV8uY2xvbmUoKTtwLmNsb25lKCk7Y29uc3Qgcz1uYSghMCwhMCxpLF8scCxyLG0sZyxhLG4tMixlLG4pO2lmKGQ8PXMmJnQuZXF1YWxzKF8pJiZ0LmVxdWFscyhwKSlicmVhaztkPXN9aCgpO2xldCBmPSExLFA9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCB5PXMuY2xvbmUoKSx4PW8uY2xvbmUoKTtmb3IobGV0IHQ9MDt0PDMwO3QrKyl7Y29uc3QgdD15LmNsb25lKCk7eC5jbG9uZSgpO2NvbnN0IHM9bmEoZiwhMCxpLHkseCxyLG0sZyxhLG4tMixlLG4pO2lmKFA8PXMmJnQuZXF1YWxzKHkpJiZ0LmVxdWFscyh4KSlicmVhaztmPSEwLFA9c31yZXR1cm4gUDxkPyhzLmFzc2lnbih5KSxvLmFzc2lnbih4KSk6KHMuYXNzaWduKF8pLG8uYXNzaWduKHApLFA9ZCksUH0sZD1uZXcgSixfPW5ldyBKLHA9W2coZCxfKSxKLmRpc3RhbmNlKGksZCkrSi5kaXN0YW5jZShkLF8pK0ouZGlzdGFuY2UoXyxyKSxkLngsZC55LF8ueCxfLnldO20uc3BsaWNlKG0ubGVuZ3RoLDAsLi4ucCl9bGV0IGw9bVswXSxjPW1bMV0sZz0wO2ZvcihsZXQgcz02O3M8bS5sZW5ndGg7cys9NiltW3NdPGwmJihsPW1bc10sYz1tW3MrMV0sZz1zKTtsZXQgZD1nO2ZvcihsZXQgcz0wO3M8bS5sZW5ndGg7cys9NilzIT09ZyYmbVtzKzFdPGMmJk1hdGguYWJzKGwtbVtzXSk8MTAqbCYmKGM9bVtzKzFdLGQ9cyk7dC5jb25zdHJ1Y3QoaSxuZXcgSihtW2QrMl0sbVtkKzNdKSxuZXcgSihtW2QrNF0sbVtkKzVdKSxyKX1mdW5jdGlvbiBXbyh0LGUscz0hMSl7Y29uc3Qgbj1jdChKLDQpO3QucXVlcnlDb250cm9sUG9pbnRzKG4pO2NvbnN0IGk9Y3QocWUsNCk7bGV0IHIsbyxhO0hyKG4saSwhMCk7Y29uc3QgaD1pWzNdLnguaXNaZXJvKCksdT1pWzNdLnkuaXNaZXJvKCk7aWYoaHx8dSlpZihoJiYhdSl7aWYoaVsyXS54LmlzWmVybygpKXJldHVybiAwO3I9aVsxXS54LmRpdihpWzJdLngpLm5lZ2F0ZSgpLG89aVsyXS55LmRpdihpWzNdLnkpLGE9aVsxXS55LmRpdihpWzNdLnkpfWVsc2V7aWYoaHx8IXUpcmV0dXJuIDA7aWYoaVsyXS55LmlzWmVybygpKXJldHVybiAwO3I9aVsxXS55LmRpdihpWzJdLnkpLm5lZ2F0ZSgpLG89aVsyXS54LmRpdihpWzNdLngpLGE9aVsxXS54LmRpdihpWzNdLngpfWVsc2V7aVsyXS54LmRpdlRoaXMoaVszXS54KSxpWzFdLnguZGl2VGhpcyhpWzNdLngpLGlbMl0ueS5kaXZUaGlzKGlbM10ueSksaVsxXS55LmRpdlRoaXMoaVszXS55KTtjb25zdCB0PWlbMl0ueC5zdWIoaVsyXS55KTtpZih0LmlzWmVybygpKXJldHVybiAwO3I9aVsxXS54LnN1YihpWzFdLnkpLmRpdih0KS5uZWdhdGUoKSxvPWlbMl0ueC5jbG9uZSgpLGE9aVsxXS54LmNsb25lKCl9aWYoIXMmJnIuYWJzKCkudmFsdWUoKT4yKXJldHVybiAwO2NvbnN0IG09WzAsMF0sbD10LmdldFN0YXJ0WFkoKS5lcXVhbHModC5nZXRFbmRYWSgpKSxjPW5uKDEsLXIudG9Eb3VibGUoKSxyLmFkZChvKS5tdWwocikuYWRkKGEpLnRvRG91YmxlKCksVS51bml0KCksbCxtKTtpZigwPT09YylyZXR1cm4gMDtpZihtWzBdPj0wJiZtWzBdPD0xKXtjb25zdCB0PXIudG9Eb3VibGUoKS1tWzBdO2lmKHN8fHQ+PTAmJnQ8PTEpcmV0dXJuIGVbMF09bVswXSxlWzFdPXQsZVswXT5lWzFdJiYoZVsxXT1zdChlWzBdLGVbMF09ZVsxXSkpLDJ9aWYoMj09PWMmJm1bMV0+PTAmJm1bMV08PTEpe2NvbnN0IHQ9ci50b0RvdWJsZSgpLW1bMV07aWYoc3x8dD49MCYmdDw9MSlyZXR1cm4gZVswXT1tWzFdLGVbMV09dCxlWzBdPmVbMV0mJihlWzFdPXN0KGVbMF0sZVswXT1lWzFdKSksMn1yZXR1cm4gMH1mdW5jdGlvbiBqbyh0LGUscyl7Y29uc3Qgbj10WzFdLm11bEUoZVsyXSkuc3ViVGhpc0UodFsyXS5tdWxFKGVbMV0pKSxpPXRbMV0ubXVsRShlWzNdKS5zdWJUaGlzRSh0WzNdLm11bEUoZVsxXSkpLm11bFRoaXMoMykscj10WzJdLm11bEUoZVszXSkuc3ViVGhpc0UodFszXS5tdWxFKGVbMl0pKS5tdWxUaGlzKDMpLG89Y3QoaHQsMik7bGV0IGE9ZG4ocixpLG4sbmV3IFUoMCwxKSwhMSxvKTthPDAmJihhPTApO2xldCBoPTA7Zm9yKGxldCB1PTA7dTxhO3UrKylkdChvW3VdLnZhbHVlKCksMCwxKXx8KHNbaF0uc2V0RShvW3VdKSxoKyspO3JldHVybiBofWZ1bmN0aW9uIFpvKHQsZSl7ZVswXS5zZXQoMCk7bGV0IG49MTtjb25zdCBpPWN0KGh0LDQpO2pyKHQsaSwhMCk7Y29uc3Qgcj1jdChodCw0KTtacih0LHIsITApO3tjb25zdCB0PWlbM10ubXVsKDMpLHM9aVsyXS5tdWwoMikscj1pWzFdLmNsb25lKCksbz1jdChodCwyKTtsZXQgYT1kbih0LHMscixuZXcgVSgwLDEpLCExLG8pO2E8MCYmKGE9MCk7Zm9yKGxldCBpPTA7aTxhO2krKylkdChvW2ldLnZhbHVlKCksMCwxKXx8KGVbbl09b1tpXSxuKyspfXtjb25zdCB0PXJbM10ubXVsKDMpLHM9clsyXS5tdWwoMiksaT1yWzFdLmNsb25lKCksbz1jdChodCwyKTtsZXQgYT1kbih0LHMsaSxuZXcgVSgwLDEpLCExLG8pO2E8MCYmKGE9MCk7Zm9yKGxldCByPTA7cjxhO3IrKylkdChvW3JdLnZhbHVlKCksMCwxKXx8KGVbbl09b1tyXSxuKyspfWlmKG4rPWpvKGkscixlLnNsaWNlKG4pKSxlW25dLnNldCgxKSxuKyssbj4yKXtldChlLDAsbiwodCxlKT0+e2NvbnN0IHM9dC52YWx1ZSgpLG49ZS52YWx1ZSgpO3JldHVybiBzPG4/LTE6cz5uPzE6MH0pO2xldCBzPTA7Y29uc3QgaT1lWzBdLmNsb25lKCk7bGV0IHI9MDtjb25zdCBvPWtvKHQpKl90KCksYT1uZXcgSjtwbyh0LGVbMF0udmFsdWUoKSxhKTtmb3IobGV0IGg9MTtoPG47aCsrKXtjb25zdCBuPW5ldyBKO2lmKHBvKHQsZVtoXS52YWx1ZSgpLG4pLGVbaF0uZXEoaSl8fG4uaXNFcXVhbFBvaW50MkQoYSxvKSl7aWYoMCE9PXMpe2lmKDA9PT1lW2hdLmVwcygpKWkuc2V0RShlW2hdKSxyPTA7ZWxzZSBpZigwIT09cil7Y29uc3QgdD16dCgxL2VbaF0uZXBzKCkpLHM9MS9yLG49dCtzO2kuc2V0KChlW2hdLnZhbHVlKCkqdCtpLnZhbHVlKCkqcykvbikscj0xL24saS5zZXRFcnJvcihNYXRoLnNxcnQ
1ocikpfWVbc10uc2V0RShpKSxwbyh0LGkudmFsdWUoKSxhKX19ZWxzZSBzKyssZVtzXS5zZXRFKGVbaF0pLGkuc2V0RShlW2hdKSxwbyh0LGkudmFsdWUoKSxhKSxyPXp0KGVbaF0uZXBzKCkpfXMrKyxuPXN9cmV0dXJuIDE9PT1uJiYobj0yLGVbMV0uc2V0KDEpKSxzKDA9PT1lWzBdLnZhbHVlKCkpLHMoMT09PWVbbi0xXS52YWx1ZSgpKSxufWZ1bmN0aW9uIEhvKHQsZSxzLG4saSl7Y29uc3Qgcj1jdChodCw0KSxvPWN0KGh0LDMpLGE9bmV3IFUoMCwxKTtsZXQgaD0wO2lmKGUpe2lmKFpyKHQsciwhMSksaD1fbihyWzNdLHJbMl0sclsxXSxyWzBdLnN1YihzKSxhLCExLG8pLG4pZm9yKGxldCB1PTA7dTxoO3UrKyl7Y29uc3QgZT1uZXcgSjt5byh0LG9bdV0udmFsdWUoKSxlKSxuW3VdPWUueH19ZWxzZSBpZihqcih0LHIsITEpLGg9X24oclszXSxyWzJdLHJbMV0sclswXS5zdWIocyksYSwhMSxvKSxuKWZvcihsZXQgdT0wO3U8aDt1Kyspe2NvbnN0IGU9bmV3IEo7eW8odCxvW3VdLnZhbHVlKCksZSksblt1XT1lLnl9aWYoaSlmb3IobGV0IHU9MDt1PGg7dSsrKWlbdV09b1t1XS52YWx1ZSgpO2Vsc2UgbiYmZXQobiwwLGgsQnQpO3JldHVybiBofWZ1bmN0aW9uIFVvKHQsZSxzLG4pe2NvbnN0IGk9T28odCxlLHMsbi5nZXRFbnZlbG9wZTJEKCkpO2lmKGkuaXNFbXB0eSgpKXJldHVybiBuZXcgVShpKTtjb25zdCByPWN0KEoscyk7Zm9yKGxldCBhPTA7YTxzOysrYSluLnh5Um90KHRbYV0sclthXSk7Y29uc3Qgbz1PbyhyLGUscyxuLmdldFJvdGF0ZWRFbnZlbG9wZTJEKCkpO3JldHVybiBpLmludGVyc2VjdChuZXcgVShvKSksbmV3IFUoaSl9ZnVuY3Rpb24gT28odCxlLHMsbil7Y29uc3QgaT1jdChKLHMpO2ZvcihsZXQgYT0wO2E8czsrK2EpaVthXT1uZXcgSihhLyhzLTEpLDApO2NvbnN0IHI9KHQsZSxzLG4pPT57Y29uc3QgaT0uMSxyPW5ldyBodChlLngpLnN1YkUobmV3IGh0KHQueCkpLmRpdkUobmV3IGh0KGUueSkuc3ViRShuZXcgaHQodC55KSkpLm11bEUobmV3IGh0KHMpLnN1YkUobmV3IGh0KHQueSkpKS5hZGRFKG5ldyBodCh0LngpKTtpZihyLmVwcygpPmkpe2NvbnN0IG49KGUueC10LngpLyhlLnktdC55KSoocy10LnkpK3QueDtyLnNldChuLF90KCkpfWlmKHIubHQobmV3IGh0KDApKXx8ci5ndChuZXcgaHQoMSkpKXJldHVybiExO2xldCBvPXIudmFsdWUoKS1yLmVwcygpO289cHQobywwLDEpO2xldCBhPXIudmFsdWUoKStyLmVwcygpO3JldHVybiBhPXB0KGEsMCwxKSxuLm1lcmdlQ29vcmRpbmF0ZShvKSxuLm1lcmdlQ29vcmRpbmF0ZShhKSwhMH0sbz1bXTt7Y29uc3QgZT0odCxlKT0+e28ubGVuZ3RoPXM7Y29uc3Qgbj1DcihpLHMsbywhMCksYT1uZXcgVTthLnNldEVtcHR5KCk7Y29uc3QgaD1zPT5zLnk8dD8tMTpzLnk+ZT8xOjA7bGV0IHU9aVtvWzBdXSxtPWgodSk7MD09PW0mJmEubWVyZ2VDb29yZGluYXRlKHUueCk7Zm9yKGxldCBzPTE7czw9bjsrK3Mpe2NvbnN0IGw9aVtvW3Mlbl1dLGM9aChsKTswPT09YyYmYS5tZXJnZUNvb3JkaW5hdGUobC54KTtsZXQgZz0wO2MhPT1tJiYoZz1jKm09PT0wPzE9PT1jfHwxPT09bT8yOjE6MywxJmcmJnIodSxsLHQsYSksMiZnJiZyKHUsbCxlLGEpKSx1PWwsbT1jfXJldHVybiBhfTtmb3IobGV0IG49MDtuPHM7KytuKWlbbl0ueT10W25dLng7Y29uc3QgYT1lKG4ueG1pbixuLnhtYXgpO2lmKGEuaXNFbXB0eSgpKXJldHVybiBuZXcgVShhKTtmb3IobGV0IG49MDtuPHM7KytuKWlbbl0ueT10W25dLnk7Y29uc3QgaD1lKG4ueW1pbixuLnltYXgpO3JldHVybiBhLmludGVyc2VjdChuZXcgVShoKSksbmV3IFUoYSl9fWZ1bmN0aW9uIFFvKHQsZSxzKXtzLnNldEVtcHR5KCkscy5tZXJnZShVbyh0LG51bGwsNCxlKSl9ZnVuY3Rpb24gSm8odCxlLHMpe3MubGVuZ3RoPTA7e2NvbnN0IGU9bmV3IGh0O3JvKHQsZSk7Y29uc3Qgbj1uZXcgTmU7aWYoYm8odCxlLG4pLG4uaXNaZXJvKCkpcmV0dXJuIGUuaXNaZXJvKCl8fGUuZXEobmV3IGh0KDEpKT8wOihzLnB1c2goZS52YWx1ZSgpKSwxKX1jb25zdCBuPWN0KGh0LDQpO0dyKHQsbiwhMCk7Y29uc3QgaT1jdChodCw0KTtXcih0LGksITApO2NvbnN0IHI9Y3QoaHQsNiksbz1uWzNdLm5lZ2F0ZSgpLm11bEUoaVsxXSkuYWRkRShuWzJdLm11bEUoaVsyXSkubXVsKDIpKS5hZGRFKG5bMV0ubXVsRShpWzNdKSksYT1uWzNdLm5lZ2F0ZSgpLm11bEUoaVsxXSkuc3ViRShuWzJdLm11bEUoaVsyXSkubXVsKDIpKS5hZGRFKG5bMV0ubXVsRShpWzNdKSksaD1uWzJdLm11bEUoblsyXSkuc3ViRShpWzJdLm11bEUoaVsyXSkpO3JbMF09aVsxXS5tdWxFKGlbMV0pLm11bEUobykuYWRkRShuWzFdLm11bEUoblsxXSkubXVsRShhKSkuYWRkRShuWzFdLm11bEUoaVsxXSkubXVsRShoKS5tdWwoMikpLm11bCg2KSxyWzFdPW5bMl0ubXVsRShpWzFdKS5zdWJFKG5bMV0ubXVsRShpWzJdKSkubXVsRShuWzJdLm11bEUoblsyXSkuYWRkRShuWzFdLm11bEUoblszXSkubXVsKDIpKS5hZGRFKGlbMl0ubXVsRShpWzJdKSkuYWRkRShpWzFdLm11bEUoaVszXSkubXVsKDIpKSkubXVsKDI0KTtjb25zdCB1PW5bMV0ubXVsRShpWzJdKS5tdWxFKGlbMl0pLm11bEUoaVszXSksbT1uWzJdLm11bEUoblsyXSkubXVsRShuWzNdKS5tdWxFKGlbMV0pLnN1YkUodSkubXVsKDE1NiksbD1uWzNdLm11bEUoaVsxXSkuc3ViRShuWzFdLm11bEUoaVszXSkpLGM9blszXS5tdWxFKGlbMV0pLnN1YkUoblsxXS5tdWxFKGlbM10pKSxnPW5bMV0ubXVsRShuWzNdKS5tdWxFKGMpLmFkZEUoaVsxXS5tdWxFKGlbM10pLm11bEUobCkpLm11bCg3MiksZD1pWzFdLm11bEUoaVszXSkuc3ViRShuWzFdLm11bEUoblszXSkpLF89blsyXS5tdWxFKGlbMl0pLm11bEUoZCkubXVsKDEyMCkscD1uWzFdLm11bEUoblsyXSkubXVsRShuWzJdKS5tdWxFKGlbM10pLGY9blszXS5tdWxFKGlbMV0pLm11bEUoaVsyXSkubXVsRShpWzJdKS5zdWJFKHApLm11bCgzNik7clsyXT1tLmFkZEUoZykuYWRkRShfKS5hZGRFKGYpO2NvbnN0IFA9blsyXS5tdWxFKG5bM10pLm11bEUoblszXSkubXVsRShpWzFdKS5zdWJFKG5bMV0ubXVsRShpWzJdKS5tdWxFKGlbM10pLm11bEUoaVszXSkpLm11bCgzNjApLHk9blsyXS5tdWxFKGlbMl0pLm11bEUoblsyXS5tdWxFKG5bM10pLnN1YkUoaVsyXS5tdWxFKGlbM10pKSkuYWRkRShuWzNdLm11bEUoaVsyXSkubXVsRShpWzJdKS5tdWxFKGlbMl0pKS5zdWJFKG5bMl0ubXVsRShuWzJdKS5tdWxFKG5bMl0pLm11bEUoaVszXSkpLm11bCgyNCkseD1uWzJdLm11bEUoaVsxXSkubXVsRShpWzNdKS5tdWxFKGlbM10pLnN1YkUoblsxXS5tdWxFKG5bM10pLm11bEUoblszXSkubXVsRShpWzJdKSkubXVsKDcyKSxDPW5bM10ubXVsRShpWzNdKS5tdWxFKGlbMV0ubXVsRShpWzJdKS5zdWJFKG5bMV0ubXVsRShuWzJdKSkpLm11bCgyODgpO3JbM109UC5hZGR
1FKHkpLmFkZEUoeCkuYWRkRShDKSxyWzRdPWlbM10ubXVsRShpWzNdKS5hZGRFKG5bM10ubXVsRShuWzNdKSkubXVsRShuWzNdLm11bEUoaVsxXSkuc3ViRShuWzFdLm11bEUoaVszXSkpKS5tdWwoMjcwKS5hZGRFKG5bM10ubXVsRShpWzJdKS5zdWJFKG5bMl0ubXVsRShpWzNdKSkpLm11bEUoblsyXS5tdWxFKG5bM10pLmFkZEUoaVsyXS5tdWxFKGlbM10pKSkubXVsKDE4MCkscls1XT1uWzNdLm11bEUoaVsyXSkuc3ViRShuWzJdLm11bEUoaVszXSkpLm11bEUoblszXS5tdWxFKG5bM10pLmFkZEUoaVszXS5tdWxFKGlbM10pKSkubXVsKDIxNik7Y29uc3Qgdj1jdChodCw1KSxiPXBuKHIsNSxuZXcgVSgwLDEpLCExLHYsNSk7aWYoYj4wKXtsZXQgbj1NYXRoLmFicyh0LmdldEN1cnZhdHVyZSgwKSksaT0wO2NvbnN0IHI9TWF0aC5hYnModC5nZXRDdXJ2YXR1cmUoMSkpOyhyPm58fCFOdW1iZXIuaXNGaW5pdGUocikpJiYoaT0xKTtmb3IobGV0IGU9MDtlPGI7ZSsrKXtjb25zdCBzPU1hdGguYWJzKHQuZ2V0Q3VydmF0dXJlKHZbZV0udmFsdWUoKSkpO3QuZ2V0Q29vcmQyRCh2W2VdLnZhbHVlKCkpLChzPm58fCFOdW1iZXIuaXNGaW5pdGUocykpJiYobj1zLGk9dltlXS52YWx1ZSgpKX1pZigoIU51bWJlci5pc0Zpbml0ZShuKXx8MS9uPGUpJiYhZHQoaSwwLDEpKXtjb25zdCBlPXQuZ2V0Q29vcmQyRChpKTtpZighZS5lcXVhbHModC5nZXRTdGFydFhZKCkpJiYhZS5lcXVhbHModC5nZXRFbmRYWSgpKSlyZXR1cm4gcy5wdXNoKGkpLDF9fWlmKCF0LmlzQ2xvc2VkKCkpe2NvbnN0IGU9WzAsMF0sbj1Xbyh0LGUsITEpO2ZvcihsZXQgdD0wO3Q8bjt0KyspZVt0XT4wJiZlW3RdPDEmJnMucHVzaChlW3RdKTtyZXR1cm4gcy5sZW5ndGh9cmV0dXJuIDB9Y2xhc3MgS297Y29uc3RydWN0b3IodCxlKXt0aGlzLmI9dCx0aGlzLmxlbj1lfWdldE1heERlcml2YXRpdmUoKXtyZXR1cm4gMX1nZXRWYWx1ZSh0LGUpe3JldHVybiAwPT09dD90aGlzLmxlbi1Vcih0aGlzLmIsZSwhMSk6MH1nZXRFcnJvcih0KXtyZXR1cm4gMH19ZnVuY3Rpb24gJG8odCxlLG4saSxyLG8sYSl7Zm9yKDs7KXtjb25zdCBoPUouZGlzdGFuY2UoZVswXSxlWzNdKSx1PUouZGlzdGFuY2UoZVswXSxlWzFdKStKLmRpc3RhbmNlKGVbMV0sZVsyXSkrSi5kaXN0YW5jZShlWzJdLGVbM10pO2lmKHUtaDw9aStuKnUpcmV0dXJuIHQrb3QoaCx1LC41KTtjb25zdCBtPXQ9PmhvKGUsMSx0KS5sZW5ndGgoKTt7cyhhPDEyKTtsZXQgaD1tKDApLGw9bSgxKTtyWzBdKz0yLGg+bCYmKGw9c3QoaCxoPWwpLGVbM109c3QoZVswXSxlWzBdPWVbM10pLGVbMl09c3QoZVsxXSxlWzFdPWVbMl0pKTtsZXQgYz1oLyhoK2wpLGc9MSxkPXU7Zm9yKDtjPDEvMzImJmQ+PTMyKihpK24qZCk7KXtnLz00O2NvbnN0IHQ9bShnKTtyWzBdKyssYz1oLyh0K2gpO2NvbnN0IHM9bmV3IEo7aWYoeW8oZSwuNSpnLHMpLGQ9Si5kaXN0YW5jZShzLGVbMF0pLGQ8PWkpe2NvbnN0IHQ9bmV3IEo7eW8oZSxnLHQpLGQrPUouZGlzdGFuY2UodCxzKX19aWYoMSE9PWcpe2NvbnN0IHM9Y3QoSiw0KTtmbyhlLGcsZSxzKSx0PSRvKHQscyxuLGksciwwLGErMSksbysrLGErKztjb250aW51ZX19Y29uc3QgbD04O3JbMF0rPWw7Y29uc3QgYz11cihsLG0sMCwxKSxnPTE2O3JbMF0rPWc7Y29uc3QgZD11cihnLG0sMCwxKTtsZXQgXz1NYXRoLmFicyhjLWQpPmkrbip1O2lmKCFfKXJldHVybiB0K2Q7aWYobzwzKXtjb25zdCBzPWN0KEosNCk7Zm8oZSwuNSxlLHMpLHQ9JG8odCxzLG4saSxyLG8rMSxhKzEpLG8rKyxhKys7Y29udGludWV9Y29uc3QgcD0zMjtyWzBdKz1wO2NvbnN0IGY9dXIocCxtLDAsMSk7aWYoXz1NYXRoLmFicyhkLWYpPmkrbip1LCFfKXJldHVybiB0K2Y7Y29uc3QgUD02NDtyWzBdKz1QO2NvbnN0IHk9dXIoUCxtLDAsMSk7aWYoXz1NYXRoLmFicyhmLXkpPmkrbip1LCFfKXJldHVybiB0K3k7Y29uc3QgeD0xMjg7clswXSs9eDtjb25zdCBDPXVyKHgsbSwwLDEpO3JldHVybiBfPU1hdGguYWJzKHktQyk+aStuKnUsdCtDfX1mdW5jdGlvbiB0YSh0LGUscyxuLGkpe2lmKHM9PT1lKXJldHVybiAwO2NvbnN0IHI9Y3QoSiw0KTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhyKTtjb25zdCBvPWN0KEosNCk7UG8ocixlLHMsbyk7cmV0dXJuICRvKDAsbyxuLGksWzBdLDAsMCl9ZnVuY3Rpb24gZWEodCxlLHMsbixpKXtsZXQgcj0hMDtjb25zdCBvPUtuKDUsZSxzLG4saSxlPT57Y29uc3Qgcz1tbyh0LDEsZSk7cmV0dXJuKHI/dC5nZXRDb29yZFgoZSktdC5nZXRTdGFydFgoKTp0LmdldENvb3JkWShlKS10LmdldFN0YXJ0WSgpKSpzLmxlbmd0aCgpfSk7cj0hMTtjb25zdCBhPUtuKDUsZSxzLG4saSxlPT57Y29uc3Qgcz1tbyh0LDEsZSk7cmV0dXJuKHI/dC5nZXRDb29yZFgoZSktdC5nZXRTdGFydFgoKTp0LmdldENvb3JkWShlKS10LmdldFN0YXJ0WSgpKSpzLmxlbmd0aCgpfSk7cmV0dXJuIG5ldyBKKG8sYSl9ZnVuY3Rpb24gc2EodCxlLHMsbixpLHIsbyxhLGgpe2NvbnN0IHU9Y3QoSiw0KTt0LnF1ZXJ5Q29udHJvbFBvaW50cyh1KTtjb25zdCBtPWN0KEosNCk7aWYoZS5xdWVyeUNvbnRyb2xQb2ludHMobSksdVswXS5lcXVhbHMobVswXSkpe2lmKHVbMV0uZXF1YWxzKG1bMV0pJiZ1WzJdLmVxdWFscyhtWzJdKSYmdVszXS5lcXVhbHMobVszXSkpcmV0dXJuIHMmJihzLmxlbmd0aD0wLHMucHVzaCh1WzBdKSxzLnB1c2godVszXSkpLG4mJihuLmxlbmd0aD0wLG4ucHVzaCgwKSxuLnB1c2goMSkpLGkmJihpLmxlbmd0aD0wLGkucHVzaCgwKSxpLnB1c2goMSkpLCEwO2lmKCF1WzBdLmVxdWFscyhtWzNdKSlyZXR1cm4hMX1yZXR1cm4hISh1WzBdLmVxdWFscyhtWzNdKSYmdVsxXS5lcXVhbHMobVsyXSkmJnVbMl0uZXF1YWxzKG1bMV0pJiZ1WzNdLmVxdWFscyhtWzBdKSkmJihuJiYobi5sZW5ndGg9MCxuLnB1c2goMCksbi5wdXNoKDEpLGgmJihuWzFdPXN0KG5bMF0sblswXT1uWzFdKSkpLGkmJihpLmxlbmd0aD0wLGkucHVzaCgxKSxpLnB1c2goMCksaCYmKGlbMV09c3QoaVswXSxpWzBdPWlbMV0pKSkscyYmKHMubGVuZ3RoPTAscy5wdXNoKHVbMF0pLHMucHVzaCh1WzNdKSxoJiYoc1sxXT1zdChzWzBdLHNbMF09c1sxXSkpKSwhMCl9ZnVuY3Rpb24gbmEodCxlLG4saSxyLG8sYSxoLHUsbSxsLGMpe3MobSsyPT09Yyk7bGV0IGc9MCxkPTAsXz0wLHA9MCxmPTAsUD0wLHk9MDtjb25zdCB4PSh0LGUpPT57Y29uc3Qgcz0xLWUsYT1uLm11bChhZShzKSksaD1pLm11bCgzKmUqcypzKSx1PXIubXVsKDMqZSplKnMpLG09by5tdWwoYWUoZSkpO3JldHVybiBhLmFkZChoKS5hZGQodSkuYWRkKG0pLnN1YihsW3RdKS5zcXJMZW5ndGgoKX07Zm9yKGxldCBzPTEsdj1jLTE7czx2O3MrKyl7bGV0IGU9dVtzLTFdO2lmKHQpe3M+Mj8oZT1wdCgyKnVbcy0yXS11W3MtM10sMCwxKSx1W3MtMV09ZSk6Mj09PXMmJihlPXB0KDIqdVtzLTJdLDAsMSksdVtzLTFdPWUpO2NvbnN0IHQ9KHQsZSxzKT0+e2xldCBhPS0xO2ZvcihsZXQgaD0wOyEoTWF0aC5hYnMoZS1hKTwxZS0xMikmJjEwIT09aDtoKyspe2NvbnN0IGg9ZSplLHU9MS1lLG09dSp1LGM9bSp1LGc9bi54LTIqaS54K3IueCxkPW4ueC0zKmkueCszKnIueC1vLngsXz1uLnktMippLnkrci55LHA9bi55LTMqaS55KzMqci55LW8ueSxmPW4ueC1pLngtMipnKmUrZCpoLFA9LWxbdF0ueCtuLngqYytlKigzKmkueCptK2UqKDMqci54KnUrby54KmUpKSx5PW4ueS1pLnktMipfKmUrcCpoLHg9LWxbdF0ueStuLnkqYytlKigzKmkueSptK2UqKDMqci55KnUrby55KmUpKSxDPS02KihmKlAreSp4KSx2PTYqKDMqenQoZiktKC0yKmcrMipkKmUpKlApKzYqKDMqenQoeSktKC0yKl8rMipwKmUpKngpO2lmKGE9ZSwwPT09dilicmVhaztlPXB0KGUtQy92LHMsMSl9cmV0dXJuIGF9O3tjb25zdCBlPXgocyx1W3MtMV0pO2xldCBuPXQocyx1W3MtMV0sMCksaT14KHMsbik7aWYoMS4wMSplPGkpe2NvbnN0IGU9cz4xP3Vbcy0yXTowLHI9dChzLC4zKih1W3MtMV0tZSkrZSwwKSxvPXgocyxyKTtvPGkmJihpPW8sbj1yKX1lPmkmJih1W3MtMV09bil9fWNvbnN0IGE9dVtzLTFdLGg9YSphLG09aCphLGM9MS1hLEM9YypjLHY9QypjO2crPTMqaCpDKkMsZCs9MyptKnYsXys9MypoKmgqQztjb25zdCBiPS0odipuLngrbSpvLngtbFtzXS54KTtwKz1iKmEqQyxmKz1iKmgqYztjb25zdCBTPS0odipuLnkrbSpvLnktbFtzXS55KTtQKz1TKmEqQyx5Kz1TKmgqY31pZihlKXtjb25zdCB0PWcqXy1kKmQ7TWF0aC5hYnModCk+PTFlLTEyKihNYXRoLmFicyhnKl8pK01hdGguYWJzKGQqZCkpKzFlLTEwPyhhfHwoaS54PShwKl8tZipkKS90LGkueT0oUCpfLXkqZCkvdCksaHx8KHIueD0oZypmLWQqcCkvdCxyLnk9KGcqeS1kKlApL3QpKTooQ3QobixvLC4zLGkpLEN0KG4sbywuNixyKSl9bGV0IEM9MDtmb3IobGV0IHM9MSx2PWMtMTtzPHY7cysrKUMrPXgocyx1W3MtMV0pO3JldHVybiBDfXZhciBpYT1iO2NsYXNzIHJhIGV4dGVuZHMgZHN7Y29uc3RydWN0b3IodCl7dCYmdC5jcD8oc3VwZXIoe3N0YXJ0OnQuY3BbMF0sZW5kOnQuY3BbM10sdmQ6dC52ZH0pLHRoaXMubV9
1jcD1jdChKLDIpLHRoaXMubV9jcFswXS5hc3NpZ24odC5jcFsxXSksdGhpcy5tX2NwWzFdLmFzc2lnbih0LmNwWzJdKSk6dm9pZCAwPT09dHx8YnQodCxcInZkXCIpPyhzdXBlcih7dmQ6dD8udmQsWFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHRoaXMubV9jcD1jdChKLDIpLHRoaXMubV9jcFswXS5zZXRDb29yZHMoMCwwKSx0aGlzLm1fY3BbMV0uc2V0Q29vcmRzKDAsMCkpOnQuZnJvbT8oc3VwZXIoe3N0YXJ0OnQuZnJvbSxlbmQ6dC50byx2ZDp0LnZkfSksdGhpcy5tX2NwPWN0KEosMiksdGhpcy5tX2NwWzBdLmFzc2lnbih0LmNwMSksdGhpcy5tX2NwWzFdLmFzc2lnbih0LmNwMikpOihzdXBlcih7WFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MCx2ZDp0LnZkfSksaChcInVucmVjb2duaXplZCBjb25zdHJ1Y3RvciBwYXJhbXNcIiksdGhpcy5tX2NwPWN0KEosMiksdGhpcy5tX2NwWzBdLnNldENvb3JkcygwLDApLHRoaXMubV9jcFsxXS5zZXRDb29yZHMoMCwwKSksdGhpcy5tX2NhY2hlZFZhbHVlcz0wfWdldEJvdW5kYXJ5KCl7cmV0dXJuICRzKHRoaXMpfWNvbnN0cnVjdCh0LGUscyxuKXt0aGlzLm1fWFN0YXJ0PXQueCx0aGlzLm1fWVN0YXJ0PXQueSx0aGlzLm1fWEVuZD1uLngsdGhpcy5tX1lFbmQ9bi55LHRoaXMubV9jcFswXS5hc3NpZ24oZSksdGhpcy5tX2NwWzFdLmFzc2lnbihzKSx0aGlzLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl9Y29uc3RydWN0UG9pbnRzKHQpe3RoaXMubV9YU3RhcnQ9dFswXS54LHRoaXMubV9ZU3RhcnQ9dFswXS55LHRoaXMubV9YRW5kPXRbM10ueCx0aGlzLm1fWUVuZD10WzNdLnksdGhpcy5tX2NwWzBdLmFzc2lnbih0WzFdKSx0aGlzLm1fY3BbMV0uYXNzaWduKHRbMl0pLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1jb25zdHJ1Y3RGcm9tUXVhZHJhdGljKHQpe2NvbnN0IGU9Y3QoSiw0KTskaSh0LGUpLHRoaXMuY29uc3RydWN0UG9pbnRzKGUpfWNvbnN0cnVjdEZyb21RdWFkcmF0aWNTZWdtZW50KHQpe3RoaXMuZHJvcEFsbEF0dHJpYnV0ZXMoKSx0aGlzLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHQuZ2V0RGVzY3JpcHRpb24oKSksdGhpcy5tX1hTdGFydD10LmdldFN0YXJ0WCgpLHRoaXMubV9ZU3RhcnQ9dC5nZXRTdGFydFkoKSx0aGlzLm1fWEVuZD10LmdldEVuZFgoKSx0aGlzLm1fWUVuZD10LmdldEVuZFkoKSx3dCgyLHQuZ2V0U3RhcnRYWSgpLHQuZ2V0Q29udHJvbFBvaW50MSgpLDIvMyx0aGlzLm1fY3BbMF0pLHd0KDIsdC5nZXRDb250cm9sUG9pbnQxKCksdC5nZXRFbmRYWSgpLDEvMyx0aGlzLm1fY3BbMV0pLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSxucyh0aGlzLHQpfWdldEdlb21ldHJ5VHlwZSgpe3JldHVybiBpLmVudW1CZXppZXJ9cXVlcnlFbnZlbG9wZSh0KXtpZigyIT09dC5tX0VudmVsb3BlVHlwZSlyZXR1cm4gdm9pZCBzKDApO2lmKHQuc2V0Q29vcmRzKHRoaXMuZ2V0U3RhcnRYWSgpKSx0Lm1lcmdlTmUodGhpcy5nZXRFbmRYWSgpKSx0LmNvbnRhaW5zKHRoaXMubV9jcFswXSkmJnQuY29udGFpbnModGhpcy5tX2NwWzFdKSlyZXR1cm47Y29uc3QgZT1Lcih0aGlzKTtpZihudWxsIT09ZSl7Y29uc3Qgcz1uZXcgSjtmb3IoY29uc3QgbiBvZiBlLnNwZWNpYWxQb2ludHMpdGhpcy5xdWVyeUNvb3JkMkQobixzKSx0Lm1lcmdlTmUocyk7cmV0dXJufWNvbnN0IG49Y3QoaHQsOCksaT1jdChKLDQpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKGkpO2NvbnN0IHI9Wm8oaSxuKSxvPW5ldyBKO2ZvcihsZXQgcz0xO3M8ci0xO3MrKyl0aGlzLnF1ZXJ5Q29vcmQyRChuW3NdLnZhbHVlKCksbyksdC5tZXJnZU5lKG8pfWFwcGx5VHJhbnNmb3JtYXRpb24odCl7aWYoMT09PXQubV9UcmFuc2Zvcm1hdGlvblR5cGUpe2NvbnN0IGU9Y3QoSiw0KTtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksdC50cmFuc2Zvcm1Qb2ludHMyRChlLDQsZSksdGhpcy5zZXRTdGFydFhZKGVbMF0pLHRoaXMubV9jcFswXS5hc3NpZ24oZVsxXSksdGhpcy5tX2NwWzFdLmFzc2lnbihlWzJdKSx0aGlzLnNldEVuZFhZKGVbM10pLHZvaWQgdG8odGhpcyl9cygwKX1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgcmEoe3ZkOnRoaXMubV9kZXNjcmlwdGlvbn0pfWNhbGN1bGF0ZUxlbmd0aDJEKCl7cmV0dXJuIFVyKHRoaXMsMSwhMSl9Y2FsY3VsYXRlTG93ZXJMZW5ndGgyRCgpe3JldHVybiBKLmRpc3RhbmNlKHRoaXMuZ2V0U3RhcnRYWSgpLHRoaXMuZ2V0RW5kWFkoKSl9Y2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpe3JldHVybiBKLmRpc3RhbmNlKHRoaXMuZ2V0U3RhcnRYWSgpLHRoaXMubV9jcFswXSkrSi5kaXN0YW5jZSh0aGlzLm1fY3BbMF0sdGhpcy5tX2NwWzFdKStKLmRpc3RhbmNlKHRoaXMuZ2V0RW5kWFkoKSx0aGlzLm1fY3BbMV0pfXF1ZXJ5Q29vcmQyRCh0LGUpe3JldHVybiB0aGlzLnF1ZXJ5Q29vcmQyREV4dGVuZHModCxlLCEwKX1xdWVyeUNvb3JkMkRNUCh0LGUpe3MoMCl9cXVlcnlDb29yZDJERXh0ZW5kcyh0LGUscyl7Y29uc3Qgbj1jdChKLDQpO3RoaXMucXVlcnlDb250cm9sUG9pbnRzKG4pLHlvKG4sdCxlLHMpfXF1ZXJ5Q29vcmQyREUodCxlKXtDbyh0aGlzLHQsZSl9Z2V0Q29vcmRYKHQpe2lmKHQ8MHx8dD4xKXtjb25zdCBlPW5ldyBKO3JldHVybiB0aGlzLnF1ZXJ5Q29vcmQyREV4dGVuZHModCxlLCEwKSxlLnh9Y29uc3QgZT1vdCh0aGlzLmdldFN0YXJ0WCgpLHRoaXMubV9jcFswXS54LHQpLHM9b3QodGhpcy5tX2NwWzBdLngsdGhpcy5tX2NwWzFdLngsdCksbj1vdCh0aGlzLm1fY3BbMV0ueCx0aGlzLmdldEVuZFgoKSx0KSxpPW90KGUscyx0KSxyPW90KHMsbix0KTtyZXR1cm4gb3QoaSxyLHQpfWdldENvb3JkWSh0KXtpZih0PDB8fHQ+MSl7Y29uc3QgZT1uZXcgSjtyZXR1cm4gdGhpcy5xdWVyeUNvb3JkMkRFeHRlbmRzKHQsZSwhMCksZS55fWNvbnN0IGU9b3QodGhpcy5nZXRTdGFydFkoKSx0aGlzLm1fY3BbMF0ueSx0KSxzPW90KHRoaXMubV9jcFswXS55LHRoaXMubV9jcFsxXS55LHQpLG49b3QodGhpcy5tX2NwWzFdLnksdGhpcy5nZXRFbmRZKCksdCksaT1vdChlLHMsdCkscj1vdChzLG4sdCk7cmV0dXJuIG90KGkscix0KX1jdXQodCxlLHMpe2NvbnN0IG49bmV3IFBtO3JldHVybiB0aGlzLnF1ZXJ5Q3V0KHQsZSxuLHMpLG4ucmVsZWFzZVNlZ21lbnQoKX1xdWVyeUN1dCh0LGUscyxuKXtjb25zdCBpPXMuY3JlYXRlQ3ViaWNCZXppZXIoKTtpZih0aGlzLmN1dEJlemllcklnbm9yZUF0dHJpYnV0ZXModCxlLGkpLG4pcmV0dXJuO2kuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odGhpcy5tX2Rlc2NyaXB0aW9uKTtjb25zdCByPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO2lmKHI+MSl7Zm9yKGxldCBlPTE7ZTxyO2UrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLG49aWEuZ2V0Q29tcG9uZW50Q291bnQocyk7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3Qgbj10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKHQscyxlKTtpLnNldFN0YXJ0QXR0cmlidXRlKHMsZSxuKX19Zm9yKGxldCB0PTE7dDxyO3QrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHQpLG49aWEuZ2V0Q29tcG9uZW50Q291bnQocyk7Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3Qgbj10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKGUscyx0KTtpLnNldEVuZEF0dHJpYnV0ZShzLHQsbil9fX19cXVlcnlEZXJpdmF0aXZlKHQsZSl7Ym8odGhpcyx0LGUpfWN1dEJlemllcklnbm9yZUF0dHJpYnV0ZXModCxzLG4peyh0PDB8fHM+MXx8dD5zKSYmZShcIkN1YmljX2Jlemllci5jdXRfYmV6aWVyX2lnbm9yZV9hdHRyaWJ1dGVzXCIpO2NvbnN0IGk9Y3QoSiw0KTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhpKTtjb25zdCByPWN0KEosNCk7UG8oaSx0LHMsciksbi5zZXR
1Db250cm9sUG9pbnRzKHIpfXNwbGl0QmV6aWVySWdub3JlQXR0cmlidXRlcyh0LHMsbil7dGhpcz09PXMmJnRoaXM9PT1uJiZlKFwiQ3ViaWNfYmV6aWVyLnNwbGl0X2Jlemllcl9pZ25vcmVfYXR0cmlidXRlc1wiKTtjb25zdCBpPWN0KEosNCk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoaSk7Y29uc3Qgcj1jdChKLDQpLG89Y3QoSiw0KTtmbyhpLHQscixvKSxzJiZzLnNldENvbnRyb2xQb2ludHMociksbiYmbi5zZXRDb250cm9sUG9pbnRzKG8pfWdldEF0dHJpYnV0ZUFzRGJsKHQsZSxzKXtpZigwPT09ZSlyZXR1cm4gMD09PXM/dGhpcy5nZXRDb29yZFgodCk6dGhpcy5nZXRDb29yZFkodCk7aWYoMD09PXQpcmV0dXJuIHRoaXMuZ2V0U3RhcnRBdHRyaWJ1dGVBc0RibChlLHMpO2lmKDE9PT10KXJldHVybiB0aGlzLmdldEVuZEF0dHJpYnV0ZUFzRGJsKGUscyk7Y29uc3Qgbj10aGlzLmdldFN0YXJ0QXR0cmlidXRlQXNEYmwoZSxzKSxpPXRoaXMuZ2V0RW5kQXR0cmlidXRlQXNEYmwoZSxzKSxyPXRoaXMuY2FsY3VsYXRlTGVuZ3RoMkQoKSxvPXI+MD90aGlzLnRUb0xlbmd0aCh0KS9yOjAsYT1pYS5nZXRJbnRlcnBvbGF0aW9uKGUpO3JldHVybiB2dChhLG4saSxvLGlhLmdldERlZmF1bHRWYWx1ZShlKSl9Z2V0Q2xvc2VzdENvb3JkaW5hdGUodCxlKXtjb25zdCBzPVtOdW1iZXIuTmFOXTtyZXR1cm4gem8odGhpcyx0LFUudW5pdCgpLGUsLTEsMSxzKSxzWzBdfWdldENsb3Nlc3RDb29yZGluYXRlT25JbnRlcnZhbCh0LGUscz0tMSl7Y29uc3Qgbj1bTnVtYmVyLk5hTl07cmV0dXJuIDA9PT16byh0aGlzLHQsZSwhMSxzLDEsbik/TnVtYmVyLk5hTjpuWzBdfWdldFlNb25vdG9uaWNQYXJ0cyh0LGU9ITEpe3JldHVybiB0aGlzLmdldE1vbm90b25pY1BhcnRzKHQsZSl9Z2V0TW9ub3RvbmljUGFydHModCxuKXt0Lmxlbmd0aDwyJiZlKFwiXCIpO2NvbnN0IGk9SnIodGhpcyk7aWYoMj09PWkuc3BlY2lhbFBvaW50c0NvdW50KCkmJnRoaXMuaXNNb25vdG9uZVF1aWNrQW5kRGlydHkoKSlyZXR1cm4gMDtsZXQgcj0wO3ModC5sZW5ndGg+PWkuc3BlY2lhbFBvaW50c0NvdW50KCktMSk7Zm9yKGxldCBlPTEscz1pLnNwZWNpYWxQb2ludHNDb3VudCgpO2U8czsrK2UpdGhpcy5xdWVyeUN1dChpLnNwZWNpYWxQb2ludHNbZS0xXSxpLnNwZWNpYWxQb2ludHNbZV0sdFtyXSxuKSxyKys7Zm9yKGxldCBlPTA7ZTxyOysrZSl7Y28odFtlXS5nZXQoKSl9cmV0dXJuIHJ9aW50ZXJzZWN0aW9uV2l0aEF4aXMyRCh0LGUscyxuKXtjb25zdCBpPWN0KEosNCk7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKGkpLEhvKGksdCxlLHMsbil9aW50ZXJzZWN0aW9uT2ZZTW9ub3RvbmljV2l0aEF4aXNYKHQsZSl7aWYodGhpcy5tX1lTdGFydD09PXRoaXMubV9ZRW5kKXJldHVybiB0PT09dGhpcy5tX1lTdGFydD9lOk51bWJlci5OYU47aWYodD09PXRoaXMubV9ZU3RhcnQpcmV0dXJuIHRoaXMubV9YU3RhcnQ7aWYodD09PXRoaXMubV9ZRW5kKXJldHVybiB0aGlzLm1fWEVuZDtjb25zdCBuPVswLDBdLGk9dGhpcy5pbnRlcnNlY3Rpb25XaXRoQXhpczJEKCEwLHQsbixudWxsKTtyZXR1cm4gcygyIT09aSksLTE9PT1pP2U6blswXX1pc0N1cnZlKCl7cmV0dXJuITB9aXNEZWdlbmVyYXRlKHQpe3JldHVybiB6ZSh0aGlzLHQpfWlzRGVnZW5lcmF0ZTNEKHQsZSl7cmV0dXJuIHMoMCksITF9cXVlcnlMb29zZUVudmVsb3BlKHQpe2lmKDI9PT10Lm1fRW52ZWxvcGVUeXBlKXJldHVybi
1B0LnNldENvb3Jkcyh7cHQ6dGhpcy5nZXRTdGFydFhZKCl9KSx0Lm1lcmdlTmUodGhpcy5tX2NwWzBdKSx0Lm1lcmdlTmUodGhpcy5tX2NwWzFdKSx2b2lkIHQubWVyZ2VOZSh0aGlzLmdldEVuZFhZKCkpO3MoMCl9Y2xvbmUodCl7Y29uc3QgZT10aGlzLmNyZWF0ZUluc3RhbmNlKCk7cmV0dXJuIHRoaXMuY29weVRvKGUpLGV9cXVlcnlJbnRlcnZhbCh0LGUpe2lmKDA9PT10KXtjb25zdCB0PWxlLmNvbnN0cnVjdEVtcHR5KCk7dGhpcy5xdWVyeUVudmVsb3BlKHQpO2NvbnN0IHM9VS5jb25zdHJ1Y3RFbXB0eSgpO3JldHVybiAwPT09ZT90LnF1ZXJ5SW50ZXJ2YWxYKHMpOnQucXVlcnlJbnRlcnZhbFkocyksc31yZXR1cm4gc3VwZXIucXVlcnlJbnRlcnZhbCh0LGUpfXF1ZXJ5TG9vc2VFbnZlbG9wZU9uSW50ZXJ2YWwodCxlKXtjb25zdCBzPWN0KEosNCk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMocyksUG8ocyx0LnZtaW4sdC52bWF4LHMpLGUuc2V0RnJvbVBvaW50cyhzLDQpfWNoYW5nZUVuZFBvaW50czJEKHQsZSl7aWYodC5pc0VxdWFsKHRoaXMubV9YU3RhcnQsdGhpcy5tX1lTdGFydCkmJmUuaXNFcXVhbCh0aGlzLm1fWEVuZCx0aGlzLm1fWUVuZCkpcmV0dXJuO2NvbnN0IHM9dGhpcy5tX2NwWzBdLmlzRXF1YWwodGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0KSxuPXRoaXMubV9jcFswXS5pc0VxdWFsKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kKSxpPXRoaXMubV9jcFsxXS5pc0VxdWFsKHRoaXMubV9YU3RhcnQsdGhpcy5tX1lTdGFydCkscj10aGlzLm1fY3BbMV0uaXNFcXVhbCh0aGlzLm1fWEVuZCx0aGlzLm1fWUVuZCk7dGhpcy5zZXRTdGFydFhZKHQpLHRoaXMuc2V0RW5kWFkoZSkscz90aGlzLm1fY3BbMF0uc2V0Q29vcmRzUG9pbnQyRCh0KTpuJiZ0aGlzLm1fY3BbMF0uc2V0Q29vcmRzUG9pbnQyRChlKSxyP3RoaXMubV9jcFsxXS5zZXRDb29yZHNQb2ludDJEKGUpOmkmJnRoaXMubV9jcFsxXS5zZXRDb29yZHNQb2ludDJEKHQpLHRoaXMubm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpfXRUb0xlbmd0aCh0KXtyZXR1cm4gVXIodGhpcyx0LCEwKX1sZW5ndGhUb1QodCl7cmV0dXJuIE9yKHRoaXMsdCl9Y2FsY3VsYXRlV2VpZ2h0ZWRBcmVhQ2VudHJvaWQyRCh0KXtjb25zdCBlPWN0KEosNCk7a3IodGhpcyxlKTtjb25zdCBzPWVbM10sbj1lWzJdLGk9ZVsxXSxyPW5ldyBKO3IueD0oNSpzLngqcy54Kig3Km4ueSsxNippLnkpK3MueCooLTM1KnMueSpuLngrNDAqbi54Km4ueS04MCpzLnkqaS54KzE0MCpuLngqaS55KzExMippLngqaS55KS0yKihzLnkqKDIwKm4ueCpuLngrNzAqbi54KmkueCs1NippLngqaS54KS03Kig0Km4ueCs1KmkueCkqKC1uLnkqaS54K24ueCppLnkpKSkvODQwLHIueT0oLTUqcy55KnMueSooNypuLngrMTYqaS54KStzLnkqKDUqcy54Kig3Km4ueSsxNippLnkpLTQqKDEwKm4ueCpuLnkrMzUqbi55KmkueCsyOCppLngqaS55KSkrMiooLTcqKDQqbi55KzUqaS55KSoobi55KmkueC1uLngqaS55KStzLngqKDIwKm4ueSpuLnkrNzAqbi55KmkueSs1NippLnkqaS55KSkpLzg0MDtjb25zdCBvPWxvKHRoaXMpO3JldHVybiByLngrPShlWzBdLngtdC54KSpvLHIueSs9KGVbMF0ueS10LnkpKm8scn1jYWxjdWxhdGVXZWlnaHRlZENlbnRyb2lkMkQoKXtjb25zdCB0PW5ldyBKO3JldHVybiB0aGlzLmlzRGVnZW5lcmF0ZSgwKT8odC5zZXRDb29yZHMoMCwwKSx0KTpCcih0aGlzKT8odC5hc3NpZ24odGhpcy5nZXRDb29yZDJEKC41KS5tdWwodGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpKSksdCk6KHQuYXNzaWduKFFyKHRoaXMsMSkpLHQpfWdldENvbnRyb2xQb2ludDEoKXtyZXR1cm4gdGhpcy5tX2NwWzBdLmNsb25lKCl9c2V0Q29udHJvbFBvaW50MSh0KXt0aGlzLm1fY3BbMF0uc2V0Q29vcmRzUG9pbnQyRCh0KSx0aGlzLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl9Z2V0Q29udHJvbFBvaW50Migpe3JldHVybiB0aGlzLm1fY3BbMV0uY2xvbmUoKX1zZXRDb250cm9sUG9pbnQyKHQpe3RoaXMubV9jcFsxXS5zZXRDb29yZHNQb2ludDJEKHQpLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1xdWVyeUNvbnRyb2xQb2ludHModCl7dFswXS5hc3NpZ24odGhpcy5nZXRTdGFydFhZKCkpLHRbMV0uYXNzaWduKHRoaXMubV9jcFswXSksdFsyXS5hc3NpZ24odGhpcy5tX2NwWzFdKSx0WzNdLmFzc2lnbih0aGlzLmdldEVuZFhZKCkpfXF1ZXJ5Q29udHJvbFBvaW50c0hlbHBlcih0KXtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHModCksNH1zZXRDb250cm9sUG9pbnRzKHQpe2ZvcihsZXQgcz0wO3M8NDtzKyspdFtzXS5pc05BTigpJiZlKFwiTkFOIGNvbnRyb2wgcG9pbnRzIGluIGJlemllciBhcmUgbm90IHN1cHBvcnRlZFwiKTt0aGlzLm1fWFN0YXJ0PXRbMF0ueCx0aGlzLm1fWVN0YXJ0PXRbMF0ueSx0aGlzLm1fY3BbMF0uc2V0Q29vcmRzUG9pbnQyRCh0WzFdKSx0aGlzLm1fY3BbMV0uc2V0Q29vcmRzUG9pbnQyRCh0WzJdKSx0aGlzLm1fWEVuZD10WzNdLngsdGhpcy5tX1lFbmQ9dFszXS55LHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKX1nZXRUYW5nZW50KHQpe2NvbnN0IGU9Y3QoSiw0KTtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksdm8oZSx0KX1nZXREZXJpdmF0aXZlKHQpe2NvbnN0IGU9Y3QoSiw0KTtyZXR1cm4gdGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksaG8oZSwxLHQpfWdldEN1cnZhdHVyZSh0KXtjb25zdCBlPW1vKHRoaXMsMSx0KSxzPW1vKHRoaXMsMix0KSxuPWUuc3FyTGVuZ3RoKCk7aWYoMD09PW4pcmV0dXJuIE51bWJlci5OYU47ZS5kaXZUaGlzKE1hdGguc3FydChuKSk7cmV0dXJuIGUuY3Jvc3NQcm9kdWN0KHMpL259aXNJbnRlcnNlY3RpbmdQb2ludCh0LGUscyl7aWYocyYmKHQuZXF1YWxzKHRoaXMuZ2V0U3RhcnRYWSgpKXx8dC5lcXVhbHModGhpcy5nZXRFbmRYWSgpKSkpcmV0dXJuITE7Y29uc3Qgbj1uZXcgbGU7aWYodGhpcy5xdWVyeUxvb3NlRW52ZWxvcGUobiksbi5pbmZsYXRlQ29vcmRzKGUsZSksIW4uY29udGFpbnModCkpcmV0dXJuITE7Y29uc3QgaT10aGlzLmdldENsb3Nlc3RDb29yZGluYX
1RlKHQsITEpLHI9bmV3IEo7dGhpcy5xdWVyeUNvb3JkMkQoaSxyKTtyZXR1cm4gSi5kaXN0YW5jZShyLHQpPD1lfWlzSW50ZXJzZWN0aW5nUG9pbnQzRCh0LGUsbixpLHI9MSl7cmV0dXJuIHMoMCksITF9aXNNb25vdG9uZVF1aWNrQW5kRGlydHkoKXtjb25zdCB0PWN0KEosNCk7cmV0dXJuIHRoaXMucXVlcnlDb250cm9sUG9pbnRzKHQpLF9vKHQpfWdldE1vbm90b25pY1BhcnRQYXJhbXModCxuKXtjb25zdCBpPUpyKHRoaXMpLHI9aS5zcGVjaWFsUG9pbnRzQ291bnQoKTtpZihzKG1zLnNfbWF4TW9ub3RvbmljUGFydFBhcmFtcz49ciksIW4pcmV0dXJuIGkuc3BlY2lhbFBvaW50c0NvdW50KCk7dDxyJiZlKFwiXCIpO2ZvcihsZXQgZT0wO2U8cjtlKyspbltlXT1pLnNwZWNpYWxQb2ludHNbZV07cmV0dXJuIHJ9bm9ybWFsaXplQWZ0ZXJFbmRwb2ludENoYW5nZSgpe3JldHVybiExfW9yaWVudEJvdHRvbVVwKCl7aWYodGhpcy5tX1lFbmQ8dGhpcy5tX1lTdGFydHx8dGhpcy5tX1lFbmQ9PT10aGlzLm1fWVN0YXJ0JiZ0aGlzLm1fWEVuZDx0aGlzLm1fWFN0YXJ0KXt0aGlzLm1fWEVuZD1zdCh0aGlzLm1fWFN0YXJ0LHRoaXMubV9YU3RhcnQ9dGhpcy5tX1hFbmQpLHRoaXMubV9ZRW5kPXN0KHRoaXMubV9ZU3RhcnQsdGhpcy5tX1lTdGFydD10aGlzLm1fWUVuZCk7Zm9yKGxldCB0PTAsZT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0VG90YWxDb21wb25lbnRDb3VudCgpLTI7dDxlO3QrKyl0aGlzLm1fYXR0cmlidXRlc1t0K2VdPXN0KHRoaXMubV9hdHRyaWJ1dGVzW3RdLHRoaXMubV9hdHRyaWJ1dGVzW3RdPXRoaXMubV9hdHRyaWJ1dGVzW3QrZV0pO3RoaXMubV9jcFsxXT1zdCh0aGlzLm1fY3BbMF0sdGhpcy5tX2NwWzBdPXRoaXMubV9jcFsxXSksdGhpcy5tX2NhY2hlZFZhbHVlcz1udWxsfX1maW5kTWluRGVyaXYoKXtjb25zdCB0PW5ldyBodDtyZXR1cm4gcm8odGhpcyx0KSx0LnZhbHVlKCl9aXNMaW5lKCl7cmV0dXJuITF9aXNEZWdlbmVyYXRlVG9MaW5lSGVscGVyKHQpe2NvbnN0IGU9Y3QoSiw0KTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhlKTtjb25zdCBzPWVbM10uc3ViKGVbMF0pLG49cy5sZW5ndGgoKTtpZihKLmRpc3RhbmNlKGVbMF0sZVsxXSkrSi5kaXN0YW5jZShlWzJdLGVbMV0pK0ouZGlzdGFuY2UoZVsyXSxlWzNdKS1uPnQpcmV0dXJuITE7Y29uc3QgaT10O2xldCByPWVbMV0uY2xvbmUoKTtyLnN1YlRoaXMoZVswXSk7bGV0IG89TWF0aC5hYnMoci5jcm9zc1Byb2R1Y3QocykpL247cmV0dXJuIShvPmkpJiYocj1lWzJdLmNsb25lKCksci5zdWJUaGlzKGVbMV0pLG89TWF0aC5hYnMoci5jcm9zc1Byb2R1Y3QocykpL24sIShvPmkpKX1jb3B5SWdub3JlQXR0cmlidXRlcyh0KXtjb25zdCBlPWN0KEosNCk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSksdC5zZXRDb250cm9sUG9pbnRzKGUpfWNhbGN1bGF0ZUFyZWEyREhlbHBlcigpe3JldHVybiBsbyh0aGlzKX1hYnNOb3JtKCl7cmV0dXJuIEJvKHRoaXMpfXF1ZXJ5RW52ZWxvcGVXKHQsZSl7Rm8odGhpcyx0LGUpfXNldFNlZ21lbnRGcm9tQ29vcmRzRm9yU3RpdGNoZXIodCxlKXtHbyh0aGlzLHQsZSl9d3JpdGVJbkJ1ZmZlclN0cmVhbSh0LGUpe2NvbnN0IHM9bmV3IEZsb2F0NjRBcnJheSg0KTtyZXR1cm4gdGhpcy53cml0ZUluQnVmZmVyXyhzKSx0LndyaXRlUmFuZ2VGcm9tQXJyYXkoZSxzLmxlbmd0aCxzLCEwLDEpLGUrcy5sZW5ndGh9d3JpdGVJbkJ1ZmZlcl8odCl7cmV0dXJuIHRbMF09dGhpcy5tX2NwWzBdLngsdFsxXT10aGlzLm1fY3BbMF0ueSx0WzJdPXRoaXMubV9jcFsxXS54LHRbM109dGhpcy5tX2NwWzFdLnksNH1yZWFkRnJvbUJ1ZmZlclN0cmVhbSh0LGUpe2NvbnN0IHM9bmV3IEZsb2F0NjRBcnJheSg0KTt0LnF1ZXJ5UmFuZ2UoZSxzLmxlbmd0aCxzLCEwLDEpLHRoaXMucmVhZEZyb21CdWZmZXJfKHMpfXJlYWRGcm9tQnVmZmVyXyh0KXt0aGlzLm1fY3A9Y3QoSiwyKSx0aGlzLm1fY3BbMF0ueD10WzBdLHRoaXMubV9jcFswXS55PXRbMV0sdGhpcy5tX2NwWzFdLng9dFsyXSx0aGlzLm1fY3BbMV0ueT10WzNdLHRoaXMubV9jYWNoZWRWYWx1ZXM9bnVsbH1zbmFwQ29udHJvbFBvaW50cyh0KXtjb25zdCBlPWN0KEosNCk7dGhpcy5xdWVyeUNvbnRyb2xQb2ludHMoZSk7Y29uc3Qgcz0oZSxzLG4pPT57bGV0IGk9ITE7aWYoSi5zcXJEaXN0YW5jZShlLG4pPD10KXtpPSFlLmVxdWFscyhuKSxlLnNldENvb3Jkc1BvaW50MkQobik7Si5zcXJEaXN0YW5jZShzLG4pPD10JiYoaXx8PSFzLmVxdWFscyhuKSxzLnNldENvb3Jkc1BvaW50MkQobikpfXJldHVybiBpfSxuPXMoZVsxXSxlWzJdLGVbMF0pLGk9cyhlWzJdLGVbMV0sZVszXSk7cmV0dXJuKG58fGkpJiZ0aGlzLnNldENvbnRyb2xQb2ludHMoZSksbnx8aX1uZWVkc1NuYXBDb250cm9sUG9pbnRzKHQpe2lmKCF0KXJldHVybiExO2NvbnN0IGU9Y3QoSiw0KTt0aGlzLnF1ZXJ5Q29udHJvbFBvaW50cyhlKTtjb25zdCBzPShlLHMsbik9PntsZXQgaT0hMTtpZihKLnNxckRpc3RhbmNlKGUsbik8PXQpe2k9IWUuZXF1YWxzKG4pLGUuc2V0Q29vcmRzUG9pbnQyRChuKTtKLnNxckRpc3RhbmNlKHMsbik8PXQmJihpfHw9IXMuZXF1YWxzKG4pLHMuc2V0Q29vcmRzUG9pbnQyRChuKSl9cmV0dXJuIGl9LG49cyhlWzFdLGVbMl0sZVswXSksaT1zKGVbMl0sZVsxXSxlWzNdKTtyZXR1cm4gbnx8aX1jYWxjdWxhdGVTcGVjaWFsUG9pbnRzRm9yQ3JhY2tpbmcodCxlKXtyZXR1cm4gSm8odGhpcyx0LGUpfWVuc3VyZVhZTW9ub3RvbmUoKXtyZXR1cm4gY28odGhpcyl9c2V0Q29vcmRzRm9ySW50ZXJzZWN0b3IodCxlLHMpe3NvKHRoaXMsdCxlLHMpfWNvcHlUb0ltcGwodCl7Y29uc3QgZT10O2UubV9jcFswXS5hc3NpZ24odGhpcy5tX2NwWzBdKSxlLm1fY3BbMV0uYXNzaWduKHRoaXMubV9jcFsxXSksJHIoZSxLcih0aGlzKSl9cmV2ZXJzZUltcGwoKXt0aGlzLm1fY3BbMV09c3QodGhpcy5tX2NwWzBdLHRoaXMubV9jcFswXT10aGlzLm1fY3BbMV0pfWVxdWFsc0ltcGwodCl7Y29uc3QgZT10LHM9MCxuPTE7cmV0dXJuISF0aGlzLm1fY3BbMF0uZXF1YWxzKGUubV9jcFtzXSkmJiEhdGhpcy5tX2NwWzFdLmVxdWFscyhlLm1fY3Bbbl0pfWVxdWFsc0ltcGxUb2wodCxlKXtjb25zdCBzPXQsbj0wLGk9MTtyZXR1cm4hIXRoaXMubV9
1jcFswXS5pc0VxdWFsUG9pbnQyRChzLm1fY3Bbbl0sZSkmJiEhdGhpcy5tX2NwWzFdLmlzRXF1YWxQb2ludDJEKHMubV9jcFtpXSxlKX1zd2FwSW1wbCh0KXtjb25zdCBlPXQ7ZS5tX2NwWzBdPXN0KHRoaXMubV9jcFswXSx0aGlzLm1fY3BbMF09ZS5tX2NwWzBdKSxlLm1fY3BbMV09c3QodGhpcy5tX2NwWzFdLHRoaXMubV9jcFsxXT1lLm1fY3BbMV0pLGVvKHRoaXMsZSl9YWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKXt0byh0aGlzKX1pc0ludGVyc2VjdGluZyh0LGUscyl7cmV0dXJuIDAhPT1vbSghMSx0aGlzLHQsZSxzKX1pbnRlcnNlY3QodCxlLHMsbixpKXtyZXR1cm4gbW0oITEsdGhpcyx0LGUscyxuLGkpfWludGVyc2VjdFBvaW50KHQsZSxzKXtyZXR1cm4gcW8odGhpcyx0LGUscyl9ZW5kUG9pbnRNb2RpZmllZCgpe3RvKHRoaXMpfWNsZWFyRW5kUG9pbnRNb2RpZmllZCgpe319cmEudHlwZT1pLmVudW1CZXppZXI7Y2xhc3Mgb2F7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aD1OdW1iZXIuTmFOLHRoaXMuYXJlYT1OdW1iZXIuTmFOLHRoaXMuY2VudHJvaWRYPU51bWJlci5OYU4sdGhpcy5jZW50cm9pZFk9MCx0aGlzLnNwZWNpYWxQb2ludHM9W10sdGhpcy5zcGVjaWFsUG9pbnRzTGVuZ3RoPVtdfXNwZWNpYWxQb2ludHNDb3VudCgpe3JldHVybiB0aGlzLnNwZWNpYWxQb2ludHMubGVuZ3RofX1mdW5jdGlvbiBhYSh0LGUsbixpLHIsbyxhLGgpe2Zvcig7Oyl7Y29uc3QgdT1KLmRpc3RhbmNlKGVbMF0sZVsyXSksbT1KLmRpc3RhbmNlKGVbMF0sZVsxXSkrSi5kaXN0YW5jZShlWzFdLGVbMl0pO2lmKG0tdTw9citpKm0pcmV0dXJuIHQrb3QodSxtLC41KTtjb25zdCBsPWN0KEosNCksYz10PT57UGEoZSxuLDEsdCxsKTtyZXR1cm4gbFsxXS5sZW5ndGgoKX07aWYoMD09PWEmJmg8OCl7cyhoPDgpO2xldCB1PWMoMCksbD1jKDEpO29bMF0rPTIsdT5sJiYobD1zdCh1LHU9bCksZVsyXT1zdChlWzBdLGVbMF09ZVsyXSksblsyXT1zdChuWzBdLG5bMF09blsyXSkpO2xldCBnPXUvKHUrbCksZD0xLF89bTtmb3IoO2c8MS8zMiYmXz49citpKl87KXtkLz00O2NvbnN0IHQ9YyhkKTtvWzBdKyssZz11Lyh0K3UpO2NvbnN0IHM9bmV3IEo7aWYocGgoZSxuLC41KmQscyksXz1KLmRpc3RhbmNlKHMsZVswXSksXzw9cil7Y29uc3QgdD1uZXcgSjtwaChlLG4sZCx0KSxfKz1KLmRpc3RhbmNlKHQscyl9fWlmKDEhPT1kKXtjb25zdCBzPWN0KEosMyksdT1bMCwwLDB
1dO1FhKGUsbixkLGUsbixzLHUpLHQ9YWEodCxzLHUsaSxyLG8sMCxoKzEpLGErKyxoKys7Y29udGludWV9fWxldCBnPSExO2NvbnN0IGQ9ODtvWzBdKz1kO2NvbnN0IF89dXIoZCxjLDAsMSkscD0xNjtvWzBdKz1wO2NvbnN0IGY9dXIocCxjLDAsMSk7aWYoZz1NYXRoLmFicyhfLWYpPnIraSptLCFnKXJldHVybiB0K2Y7aWYoYTw4JiZoPDkpe2NvbnN0IHM9Y3QoSiwzKSx1PVswLDAsMF07UWEoZSxuLC41LGUsbixzLHUpLHQ9YWEodCxzLHUsaSxyLG8sYSsxLGgrMSksYSsrLGgrKztjb250aW51ZX1jb25zdCBQPTMyO29bMF0rPVA7Y29uc3QgeT11cihQLGMsMCwxKTtpZihnPU1hdGguYWJzKGYteSk+citpKm0sIWcpcmV0dXJuIHQreTtjb25zdCB4PTY0O29bMF0rPXg7Y29uc3QgQz11cih4LGMsMCwxKTtpZihnPU1hdGguYWJzKHktQyk+citpKm0sIWcpcmV0dXJuIHQrQztjb25zdCB2PTEyODtvWzBdKz12O2NvbnN0IGI9dXIodixjLDAsMSk7cmV0dXJuIGc9TWF0aC5hYnMoQy1iKT5yK2kqbSx0K2J9fWZ1bmN0aW9uIGhhKHQsZSxzLG4saSl7aWYocz09PWUpcmV0dXJuIDA7Y29uc3Qgcj1jdChKLDMpLG89WzAsMCwwXTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhyKSx0LnF1ZXJ5V2VpZ2h0cyhvKTtjb25zdCBhPVswLDAsMF0saD1jdChKLDMpO0phKHIsbyxlLHMsaCxhKTtyZXR1cm4gYWEoMCxoLGEsbixpLFswXSwwLDApfWNsYXNzIHVhe2NvbnN0cnVjdG9yKHQsZSxzKXt0aGlzLmNvbnRyb2xQb2ludHM9Z3QodCwzKSx0aGlzLndlaWdodHM9WzAsMCwwXSwkKHRoaXMud2VpZ2h0cyxlLDAsMCwzKSx0aGlzLnBvaW50PXMuY2xvbmUoKX1nZXRNYXhEZXJpdmF0aXZlKCl7cmV0dXJuIDN9Z2V0VmFsdWUodCxlKXtpZigwPT09dCl7Y29uc3QgdD1uZXcgSjtwaCh0aGlzLmNvbnRyb2xQb2ludHMsdGhpcy53ZWlnaHRzLGUsdCk7Y29uc3Qgcz1jdChKLDQpO1BhKHRoaXMuY29udHJvbFBvaW50cyx0aGlzLndlaWdodHMsMSxlLHMpO3JldHVybiAyKnQuc3ViKHRoaXMucG9pbnQpLmRvdFByb2R1Y3Qoc1sxXSl9aWYoMT09PXQpe2NvbnN0IHQ9bmV3IEo7cGgodGhpcy5jb250cm9sUG9pbnRzLHRoaXMud2VpZ2h0cyxlLHQpO2NvbnN0IHM9Y3QoSiw0KTtQYSh0aGlzLmNvbnRyb2xQb2ludHMsdGhpcy53ZWlnaHRzLDIsZSxzKTtyZXR1cm4gMioodC5zdWIodGhpcy5wb2ludCkuZG90UHJvZHVjdChzWzJdKStzWzFdLmRvdFByb2R1Y3Qoc1sxXSkpfWlmKDI9PT10KXtjb25zdCB0PW5ldyBKO3BoKHRoaXMuY29udHJvbFBvaW50cyx0aGlzLndlaWdodHMsZSx0KTtjb25zdCBzPWN0KEosNCk7UGEodGhpcy5jb250cm9sUG9pbnRzLHRoaXMud2VpZ2h0cywzLGUscyk7cmV0dXJuIDIqKHQuc3ViKHRoaXMucG9pbnQpLmRvdFByb2R1Y3Qoc1szXSkrMypzWzFdLmRvdFByb2R1Y3Qoc1syXSkpfXJldHVybiAwfWdldEVycm9yKHQpe3JldHVybiBzKDApLDB9fWZ1bmN0aW9uIG1hKHQsZSxzLG4pe2NvbnN0IGk9a2EoMCwwLDAsMCxKLmdldE5BTigpKSxyPU8oMTgsTnVtYmVyLk5hTiksbz1jdChKLDMpO3QucXVlcnlDb250cm9sUG9pbnRzKG8pLG9bMl0uc3ViVGhpcyhlKSxvWzFdLnN1YlRoaXMoZSksb1swXS5zdWJUaGlzKGUpO2NvbnN0IGE9WzAsMCwwXTt0LnF1ZXJ5V2VpZ2h0cyhhKTtjb25zdCBoPVsxLFBoKGEpLDFdLHU9eGgoYSxzKSxtPXhoKGEsbiksbD1lbihuZXcgdWEobyxoLG5ldyBKKDAsMCkpLFUuY29uc3RydWN0KHUsbSksMTgscik7cGgobyxoLHUsaS5wdCksaS50PXUsaS5kPUouZGlzdGFuY2UoaS5wdCxuZXcgSigwLDApKTtjb25zdCBjPW5ldyBKO3BoKG8saCxtLGMpO2NvbnN0IGc9Si5kaXN0YW5jZShjLG5ldyBKKDAsMCkpO2c8aS5kJiYoaS5kPWcsaS50PW0saS5wdC5hc3NpZ24oYykpO2ZvcihsZXQgZD0wO2Q8bDtkKyspe3BoKG8saCxyW2RdLGMpO2NvbnN0IHQ9Si5kaXN0YW5jZShjLG5ldyBKKDAsMCkpO3Q8aS5kJiYoaS5kPXQsaS50PXloKGEscltkXSksaS5wdC5hc3NpZ24oYykpfXJldHVybiBpfWZ1bmN0aW9uIGxhKHQsZSxzLG4saSl7bGV0IHI9ITA7Y29uc3Qgbz1jdChKLDQpLGE9S24oNSxlLHMsbixpLGU9PntmYSh0LDEsZSxvKTtyZXR1cm4ocj90LmdldENvb3JkWChlKS10LmdldFN0YXJ0WCgpOnQuZ2V0Q29vcmRZKGUpLXQuZ2V0U3RhcnRZKCkpKm9bMV0ubGVuZ3RoKCl9KTtyPSExO2NvbnN0IGg9S24oNSxlLHMsbixpLGU9PntmYSh0LDEsZSxvKTtyZXR1cm4ocj90LmdldENvb3JkWChlKS10LmdldFN0YXJ0WCgpOnQuZ2V0Q29vcmRZKGUpLXQuZ2V0U3RhcnRZKCkpKm9bMV0ubGVuZ3RoKCl9KTtyZXR1cm4gbmV3IEooYSxoKX1mdW5jdGlvbiBjYSh0KXt0Lm1fY2FjaGVkVmFsdWVzPW51bGx9ZnVuY3Rpb24gZ2EodCxlKXtlLm1fY2FjaGVkVmFsdWVzPXN0KHQubV9jYWNoZWRWYWx1ZXMsdC5tX2NhY2hlZFZhbHVlcz1lLm1fY2FjaGVkVmFsdWVzKX1mdW5jdGlvbiBkYSh0KXtpZih0Lm1fY2FjaGVkVmFsdWVzKXJldHVybiB0Lm1fY2FjaGVkVmFsdWVzO2NvbnN0IGU9bmV3IG9hLHM9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhzKTtjb25zdCBuPVswLDAsMF07cmV0dXJuIHQucXVlcnlXZWlnaHRzKG4pLF9hKHMsbixlLnNwZWNpYWxQb2ludHMpLFJhKHQsZSksZX1mdW5jdGlvbiBfYSh0LGUscyl7aWYoMD09PWVbMV0pcmV0dXJuIHMubGVuZ3RoPTAscy5wdXNoKDApLHZvaWQgcy5wdXNoKDEpO2NvbnN0IG49Y3QoaHQsOCk7blswXS5zZXQoMCk7bGV0IGk9MTt7Y29uc3Qgcz1uZXcgaHQodFsxXS54KS5zdWJUaGlzKHRbMF0ueCkubXVsVGhpcyhlWzFdKS5tdWxUaGlzKGVbMF0pLHI9bmV3IGh0KH
1RbMl0ueCkuc3ViVGhpcyh0WzBdLngpLm11bFRoaXMoZVsyXSkubXVsVGhpcyhlWzBdKSxvPXMuc3ViRShyKS5hZGRUaGlzRShuZXcgaHQodFsyXS54KS5zdWJUaGlzKHRbMV0ueCkubXVsVGhpcyhlWzJdKS5tdWxUaGlzKGVbMV0pKTtyLnN1YlRoaXNFKHMubXVsKDIpKTtjb25zdCBhPWN0KGh0LDIpO2xldCBoPWRuKG8scixzLG5ldyBVKDAsMSksITEsYSk7aDwwJiYoaD0wKTtmb3IobGV0IHQ9MDt0PGg7dCsrKWR0KGFbdF0udmFsdWUoKSwwLDEpfHwobltpXT1hW3RdLGkrKyl9e2NvbnN0IHM9bmV3IGh0KHRbMV0ueSkuc3ViVGhpcyh0WzBdLnkpLm11bFRoaXMoZVsxXSkubXVsVGhpcyhlWzBdKSxyPW5ldyBodCh0WzJdLnkpLnN1YlRoaXModFswXS55KS5tdWxUaGlzKGVbMl0pLm11bFRoaXMoZVswXSksbz1zLnN1YkUocikuYWRkVGhpc0UobmV3IGh0KHRbMl0ueSkuc3ViVGhpcyh0WzFdLnkpLm11bFRoaXMoZVsyXSkubXVsVGhpcyhlWzFdKSk7ci5zdWJUaGlzRShzLm11bCgyKSk7Y29uc3QgYT1jdChodCwyKTtsZXQgaD1kbihvLHIscyxuZXcgVSgwLDEpLCExLGEpO2g8MCYmKGg9MCk7Zm9yKGxldCB0PTA7dDxoO3QrKylkdChhW3RdLnZhbHVlKCksMCwxKXx8KG5baV09YVt0XSxpKyspfWlmKG5baV0uc2V0KDEpLGkrKyxpPjIpe2V0KG4sMCxpLCh0LGUpPT5CdCh0LnZhbHVlKCksZS52YWx1ZSgpKSk7bGV0IHQ9MCxlPW5bMF0udmFsdWUoKSxzPTE7Zm9yKGxldCByPTE7cjxpO3IrKyluW3JdLmVxKG5bci0xXSk/KGUrPW5bcl0udmFsdWUoKSxzKyspOihzPjEmJihlLz1zLG5bdF0uc2V0KGUpKSx0Kyssblt0XT1uW3JdLGU9bltyXS52YWx1ZSgpLHM9MSk7dCsrLGk9dH1uWzBdLnNldCgwKSxuW2ktMV0uc2V0KDEpLHMubGVuZ3RoPWk7Zm9yKGxldCByPTA7cjxpO3IrKylzW3JdPW5bcl0udmFsdWUoKX1mdW5jdGlvbiBwYSh0LGUscyl7aWYocyl7aWYoZTwwKXJldHVybiBlO2lmKGU+MSlyZXR1cm4gZS0xK3BhKHQsMSwhMSl9aWYodC5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIDA7Y29uc3Qgbj0xPT09ZSxpPWRhKHQpO2lmKG4mJiFOdW1iZXIuaXNOYU4oaS5sZW5ndGgpKXJldHVybiBpLmxlbmd0aDtjb25zdCByPXFhKHQpLG89ci90LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTtsZXQgYT0wLGg9MDtmb3IobGV0IHU9MSxtPWkuc3BlY2lhbFBvaW50c0NvdW50KCk7dTxtO3UrKyl7Y29uc3Qgcz1pLnNwZWNpYWxQb2ludHNbdV07aWYoYSs9aGEodCxoLE1hdGgubWluKGUscyksbyxyKSxlPD1zKWJyZWFrO2g9c31yZXR1cm4gbiYmKGkubGVuZ3RoPWEpLGF9ZnVuY3Rpb24gZmEodCxlLHMsbil7Y29uc3QgaT1jdChKLDMpO3QucXVlcnlDb250cm9sUG9pbnRzKGkpO2NvbnN0IHI9WzAsMCwwXTt0LnF1ZXJ5V2VpZ2h0cyhyKSxQYShpLHIsZSxzLG4pfWZ1bmN0aW9uIFBhKHQsZSxzLG4saSl7Y29uc3Qgcj1bdFswXSx0WzFdLHRbMl1dLG89W2VbMF0sZVsxXSxlWzJdXSxhPWN0KEosNCk7eWEocixvLHMsbixhKTtmb3IobGV0IGg9MDtoPD1zO2grKylpW2hdLnNldENvb3JkcyhhW2hdLngsYVtoXS55KX1mdW5jdGlvbiB5YSh0LGUsbixpLHIpe3Mobj4wKTtjb25zdCBvPVt0WzBdLmNsb25lKCksdFsxXS5jbG9uZSgpLHRbMl0uY2xvbmUoKV07aWYoIW9bMF0uaXNaZXJvKCkpe2ZvcihsZXQgdD0xO3Q8MzsrK3Qpb1t0XS5zdWJUaGlzKG9bMF0pO29bMF0uc2V0Q29vcmRzKDAsMCl9Y29uc3QgYT14YShvLGUsMCxpKSx1PXZhKGUsMCxpKSxtPWEuZGl2aWRlKHUpO2lmKHJbMF0uYXNzaWduKG0pLDA9PT1uKXJldHVybjtjb25zdCBsPVtlWzFdKmVbMF0sZVsyXSplWzBdKi41LGVbMV0qZVsyXV0sYz1bdFsxXS5zdWIodFswXSksdFsyXS5zdWIodFswXSksdFsyXS5zdWIodFsxXSldLGc9dSp1LGQ9eGEoYyxsLDAsaSkubXVsKDIpLmRpdmlkZShnKTtpZihyWzFdLmFzc2lnbihkKSwxPT09bilyZXR1cm47Y29uc3QgXz12YShlLDEsaSkscD0yKnUqXyxmPXhhKGMsbCwxLGkpLm11bCgyKS5zdWIoZC5tdWwocCkpLmRpdmlkZShnKTtpZihyWzJdLmFzc2lnbihmKSwyPT09bilyZXR1cm47Y29uc3QgUD14YShjLGwsMixpKS5tdWwoMikseT0yKihfKl8rdSp2YShlLDIsaSkpLHg9UC5zdWIoZi5tdWwocCkubXVsKDIpKS5zdWIoZC5tdWwoeSkpLmRpdmlkZShnKTtyWzNdLmFzc2lnbih4KSwzIT09biYmaChcIlwiKX1mdW5jdGlvbiB4YSh0LGUscyxuKXtpZigwPT09cyl7aWYobjw9LjUpe2NvbnN0IHM9bmV3IEo7WHQoMix0WzBdLm11bChlWzBdKSx0WzFdLm11bChlWzFdKSxuLHMpO2NvbnN0IGk9bmV3IEo7WHQoMix0WzFdLm11bChlWzFdKSx0WzJdLm11bChlWzJdKSxuLGkpO2NvbnN0IHI9bmV3IEo7cmV0dXJuIFh0KDIscyxpLG4scikscn17Y29uc3Qgcz1uZXcgSjtxdCgyLHRbMF0ubXVsKGVbMF0pLHRbMV0ubXVsKGVbMV0pLG4scyk7Y29uc3QgaT1uZXcgSjtxdCgyLHRbMV0ubXVsKGVbMV0pLHRbMl0ubXVsKGVbMl0pLG4saSk7Y29uc3Qgcj1uZXcgSjtyZXR1cm4gcXQoMixzLGksbixyKSxyfX1pZigxPT09cyl7Y29uc3Qgcz10WzFdLm11bChlWzFdKSxpPXMuc3ViKHRbMF0ubXVsKGVbMF0pKS5tdWwoMS1uKS5hZGQodFsyXS5tdWwoZVsyXSkuc3ViKHMpLm11bChuKSk7cmV0dXJuIGkubXVsVGhpcygyKSxpfWlmKDI9PT1zKXtjb25zdCBzPXRbMV0ubXVsKGVbMV0pLG49dFsyXS5tdWwoZVsyXSkuc3ViKHMpLnN1YihzLnN1Yih0WzBdLm11bChlWzBdKSkpO3JldHVybiBuLm11bFRoaXMoMiksbn1oKFwiXCIpfWZ1bmN0aW9uIENhKHQsZSxzLG4pe2lmKG4udG9Eb3VibGUoKTw9LjUpe2NvbnN0IHM9bmV3IE5lO0Z0KDIsdFswXS5tdWxFKGVbMF0pLHRbMV0ubXVsRShlWzFdKSxuLHMpO2NvbnN0IGk9bmV3IE5lO0Z0KDIsdFsxXS5tdWxFKGVbMV0pLHRbMl0ubXVsRShlWzJdKSxuLGkpO2NvbnN0IHI9bmV3IE5lO3JldHVybiBGdCgyLHMsaSxuLHIpLHJ9e2NvbnN0IHM9bmV3IE5lO1Z0KDIsdFswXS5tdWxFKGVbMF0pLHRbMV0ubXVsRShlWzFdKSxuLHMpO2NvbnN0IGk9bmV3IE5lO1Z0KDIsdFsxXS5tdWxFKGVbMV0pLHRbMl0ubXVsRShlWzJdKSxuLGkpO2NvbnN0IHI9bmV3IE5lO3JldHVybiBWdCgyLHMsaSxuLHIpLHJ9fWZ1bmN0aW9uIHZhKHQsZSxzKXtpZigwPT09ZSl7Y29uc3QgZT1vdCh0WzBdLHRbMV0scyksbj1vdCh0WzFdLHRbMl0scyk7cmV0dXJuIG90KGUsbi
1xzKX1pZigxPT09ZSl7cmV0dXJuIDIqKCgxLXMpKih0WzFdLXRbMF0pKyh0WzJdLXRbMV0pKnMpfWlmKDI9PT1lKXtyZXR1cm4gMioodFsyXS10WzFdLSh0WzFdLXRbMF0pKX1oKFwiXCIpfWZ1bmN0aW9uIGJhKHQsZSxzKXtpZihzLnRvRG91YmxlKCk8PS41KXtjb25zdCBlPU90KHRbMF0sdFsxXSxzKSxuPU90KHRbMV0sdFsyXSxzKTtyZXR1cm4gT3QoZSxuLHMpfXtjb25zdCBlPVF0KHRbMF0sdFsxXSxzKSxuPVF0KHRbMV0sdFsyXSxzKTtyZXR1cm4gUXQoZSxuLHMpfX1mdW5jdGlvbiBTYSh0LGUscyxuLGkpe2NvbnN0IHI9W05lLmNvbnN0cnVjdFBvaW50MkQodFswXSksTmUuY29uc3RydWN0UG9pbnQyRCh0WzFdKSxOZS5jb25zdHJ1Y3RQb2ludDJEKHRbMl0pXTtyWzJdLnN1YlRoaXNFKHJbMF0pLHJbMV0uc3ViVGhpc0UoclswXSksclswXS5zZXRDb29yZHMoMCwwKTtFYShyLFtuZXcgaHQoZVswXSksbmV3IGh0KGVbMV0pLG5ldyBodChlWzJdKV0scyxuLGkpfWZ1bmN0aW9uIEVhKHQsZSxuLGkscil7cyhuPjApO2NvbnN0IG89W3RbMF0uY2xvbmUoKSx0WzFdLmNsb25lKCksdFsyXS5jbG9uZSgpXTtpZighb1swXS5pc1plcm8oKSl7Zm9yKGxldCB0PTE7dDwzOysrdClvW3RdLnN1YlRoaXNFKG9bMF0pO29bMF09TmUuY29uc3RydWN0Q29vcmRzKDAsMCl9Y29uc3QgYT1DYShvLGUsMCxpKSxoPWJhKGUsMCxpKSx1PWEuZGl2RShoKTtyWzBdLnNldEUodSk7Y29uc3QgbT1bZVsxXS5tdWxFKGVbMF0pLGVbMl0ubXVsRShlWzBdKS5tdWwoLjUpLGVbMV0ubXVsRShlWzJdKV0sbD1DYShbdFsxXS5zdWJFKHRbMF0pLHRbMl0uc3ViRSh0WzBdKSx0WzJdLnN1YkUodFsxXSldLG0sMCxpKS5tdWwoMiksYz1oLnNxcigpLGc9bC5kaXZFKGMpO3JbMV0uc2V0RShnKX1mdW5jdGlvbiBEYSh0LGUscyl7Y29uc3Qgbj1jdChKLDMpO3QucXVlcnlDb250cm9sUG9pbnRzKG4pO2NvbnN0IGk9TygzLE51bWJlci5OYU4pO3QucXVlcnlXZWlnaHRzKGkpLHdhKG4saSxlLHMpfWZ1bmN0aW9uIHdhKHQsZSxzLG4pe3MudmFsdWUoKTwwJiZzLnNldCgwLHMuZXBzKCkpLHMudmFsdWUoKT4xJiZzLnNldCgxLHMuZXBzKCkpO2NvbnN0IGk9Y3QoTmUsNCk7U2EodCxlLDEscyxpKSxuLnNldEUoaVsxXSl9ZnVuY3Rpb24gQWEodCxlLHMpe2NvbnN0IG49cHQocywwLDEpLGk9Y3QoSiw0KTtpZihQYSh0LGUsMyxuLGkpLGlbMV0uaXNaZXJvKCkpe2lmKGlbMl0uaXNaZXJvKCkpcmV0dXJuIGlbM107e2NvbnN0IHQ9aVsyXS5jbG9uZSgpO3JldHVybiAxPT09biYmdC5uZWdhdGVUaGlzKCksdH19cmV0dXJuIGlbMV19Y2xhc3MgVGF7Y29uc3RydWN0b3IodCxlKXt0aGlzLmxlbj0wLHRoaXMuYj10LHRoaXMubGVuPWV9Z2V0TWF4RGVyaXZhdGl2ZSgpe3JldHVybiAxfWdldFZhbHVlKHQsZSl7cmV0dXJuIDA9PT10P3RoaXMubGVuLXBhKHRoaXMuYixlLCExKTowfWdldEVycm9yKHQpe3JldHVybiBzKDApLDB9fWZ1bmN0aW9uIElhKHQsZSxzKXtjb25zdCBuPXBhKHQsMSwhMSk7aWYoZTw9MClyZXR1cm4gZTtpZihlPj1uKXJldHVybiBlLW4rMTtjb25zdCBpPVswXTtyZXR1cm4gMSE9PWVuKG5ldyBUYSh0LGUpLFUudW5pdCgpLDEsaSkmJmgoXCJcIiksaVswXX1mdW5jdGlvbiBNYSh0KXtjb25zdCBlPWN0KEosMykscz1bMCwwLDBdO3JldHVybiB0LnF1ZXJ5Q29udHJvbFBvaW50cyhlKSx0LnF1ZXJ5V2VpZ2h0cyhzKSxZYShlLHMpfWZ1bmN0aW9uIFlhKHQsZSl7Y29uc3Qgbj1QaChlKTtpZigxPT09bil7cmV0dXJuIFBpKHQpfWlmKDA9PT1uKXJldHVybiAwO2NvbnN0IGk9W25ldyBKKDAsMCksdFsxXS5zdWIodFswXSksdFsyXS5zdWIodFswXSldLHI9aVsxXS5jcm9zc1Byb2R1Y3QoaVsyXSk7aWYobjwxKXtzKG4+MCk7Y29uc3QgdD0xLW47bGV0IGU7aWYodDwuMDEpZT0tMS8zK3QqKDIvMTUrdCooMy8zNSt0KigxNi8zMTUrdCooMjAvNjkzK3QqKDE2LzEwMDErdCooNTYvNjQzNSkpKSkpKTtlbHNle2NvbnN0IHM9dCooMStuKSxpPU1hdGguYXRhbjIoTWF0aC5zcXJ0KHQpLE1hdGguc3FydCgxK24pKTtlPW4qKC41Km4tdWUocykqaSkvc31yZXR1cm4gciplfXtjb25zdCB0PShuLTEpKihuKzEpO3JldHVybi4yNSpuL01hdGgucG93KHQsMS41KSooLTIqbipNYXRoLnNxcnQodCkqci00KmlbMV0ueSppWzJdLngqTWF0aC5hdGFuaChNYXRoLnNxcnQoKG4tMSkvKG4rMSkpKS1pWzFdLngqaVsyXS55Kk1hdGgubG9nKDIqbioobi1NYXRoLnNxcnQodCkpLTEpKX19ZnVuY3Rpb24gTmEodCxlKXtjb25zdCBuPVBoKGUpO2lmKDE9PT1uKXtjb25zdCBlPWN0KEosMyk7QmkodCxlKTtjb25zdCBzPWVbMl0uY2xvbmUoKSxuPWVbMV0uY2xvbmUoKSxpPW5ldyBKLHI9cy55Km4ueC1zLngqbi55O3JldHVybiBpLng9LSg0KnMueCs1Km4ueCkqci82MCxpLnk9LSg0KnMueSs1Km4ueSkqci82MCxpfWlmKDA9PT1uKXJldHVybi
1BuZXcgSigwLDApO3Mobj4wKTtjb25zdCBpPXRbMV0uc3ViKHRbMF0pLHI9dFsyXS5zdWIodFswXSk7aWYobjwxKXtjb25zdCB0PU1hdGguc3FydCgxLW4pLGU9TWF0aC5zcXJ0KDErbikscz0oaS55KnIueC1pLngqci55KSpuL01hdGgucG93KHQqZSw1KS8xMixvPU1hdGguYXRhbjIodCxlKSxhPW4qdCplLGg9bipuLHU9aS5tdWwoMiooMitoKSksbT1yLm11bCgyKmgtNSksbD11LmFkZChtKS5tdWwoYSksYz1yLnN1YihpLm11bCgyKmgpKS5tdWwoNipvKTtyZXR1cm4gbC5hZGQoYykubXVsKHMpfXtjb25zdCB0PU1hdGguc3FydChuLTEpLGU9TWF0aC5zcXJ0KG4rMSkscz0oaS55KnIueC1pLngqci55KSpuL01hdGgucG93KHQqZSw1KS8xMixvPU1hdGguYXRhbmgodC9lKSxhPW4qdCplLGg9bipuLHU9aS5tdWwoNCkuc3ViKHIubXVsKDUpKSxtPWkuYWRkKHIpLm11bCgyKmgpLGw9dS5hZGQobSkubXVsKGEpLGM9ci5zdWIoaS5tdWwoMipoKSkubXVsKDYqbyk7cmV0dXJuIGwuYWRkKGMpLm11bChzKX19ZnVuY3Rpb24gWGEodCl7Y29uc3QgZT1jdChKLDMpLHM9WzAsMCwwXTtyZXR1cm4gdC5xdWVyeUNvbnRyb2xQb2ludHMoZSksdC5xdWVyeVdlaWdodHMocyksTmEoZSxzKX1mdW5jdGlvbiBxYSh0KXtyZXR1cm4gRmEodC5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCkpfWZ1bmN0aW9uIEZhKHQpe3JldHVybiAyNTYqX3QoKSp0fWZ1bmN0aW9uIFZhKHQpe2lmKDA9PT10Lm1fd2VpZ2h0c1sxXSlyZXR1cm4hMDtjb25zdCBlPUouZGlzdGFuY2UodC5nZXRTdGFydFhZKCksdC5nZXRFbmRYWSgpKSxzPXQuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO3JldHVybiBzLWU8PTgqTnVtYmVyLkVQU0lMT04qc31mdW5jdGlvbiBMYSh0KXtyZXR1cm4gdC5tX2NhY2hlZFZhbHVlc31mdW5jdGlvbiBSYSh0LGUpe3QubV9jYWNoZWRWYWx1ZXM9ZX1mdW5jdGlvbiB6YSh0LGUscyxuLGkpe2NvbnN0IHI9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhyKTtjb25zdCBvPVswLDAsMF07dC5xdWVyeVdlaWdodHMobyk7Y29uc3QgYT1bMF07cmV0dXJuIDE9PT1CYShyLG8sZSxVLnVuaXQoKSxuLGksMSxhKT9hWzBdOk51bWJlci5OYU59ZnVuY3Rpb24gQmEodCxlLG4saSxyLG8sYSxoKXtfKFUudW5pdCgpLmNvbnRhaW5zKGkpJiZhPjAsXCJcIiksKG88MHx8TnVtYmVyLmlzTmFOKG8pKSYmKG89TnVtYmVyLk1BWF9WQUxVRSk7Y29uc3QgdT1uZXcgQXJyYXkoMyk7Zm9yKGxldCBzPTA7czwzOysrcyl1W3NdPXRbc10uc3ViKG4pO2NvbnN0IG09UGgoZSksbD1xZS5jb25zdHJ1Y3RQb2ludDJEKHVbMF0pLGM9cWUuY29uc3RydWN0UG9pbnQyRCh1WzFdKSxnPXFlLmNvbnN0cnVjdFBvaW50MkQodVsyXSksZD1ydC5jb25zdHJ1Y3REb3VibGUobSkscD1kLmNsb25lKCk7cC5sZGV4cFRoaXMoMSk7Y29uc3QgZj1sLmRvdFByb2R1Y3QoYy5zdWIobCkpLm11bChkKSxQPWQubXVsKGQuYWRkRG91YmxlKDIpKSx5PWcuc3ViKGMubXVsKFAubGRleHAoMSkpKSx4PWMuc3FyTGVuZ3RoKCkubXVsKGQubXVsKGQpLmxkZXhwKDEpKS5hZGQobC5zcXJMZW5ndGgoKS5tdWwoZC5sZGV4cCgyKS5zdWJEb3VibGUoMSkpKS5hZGQobC5kb3RQcm9kdWN0KHkpKSxDPWcuc3ViKGMubXVsKHApKS5hZGQobC5tdWwocC5zdWJEb3VibGUoMSkpKSx2PWMubXVsKGQpLnN1YihsKS5kb3RQcm9kdWN0KEMpLm11bERvdWJsZSgzKSxiPWMuZG90UHJvZHVjdChnKS5tdWwoZC5zdWJEb3VibGUoMykubXVsKGQpKS5sZGV4cCgxKSxTPWMuc3FyTGVuZ3RoKCkubXVsKGQubXVsKGQpLmxkZXhwKDIpKSxFPWwuc3FyTGVuZ3RoKCkubXVsKGQubGRleHAoMikuc3ViRG91YmxlKDMpKSxEPWwuZG90UHJvZHVjdChnLnN1YihjLm11bChkLm11bERvdWJsZSgzKS5zdWJEb3VibGUoMSkpLm11bChkKSkpLmxkZXhwKDEpLHc9Zy5zcXJMZW5ndGgoKS5hZGRUaGlzKGIpLmFkZFRoaXMoUykuYWRkVGhpcyhFKS5hZGRUaGlzKEQpLEE9bC5hZGQoZykuc3ViKGMubXVsKHApKSxUPWQuc3ViRG91YmxlKDEpLEk9Zy5zdWIobCkuZG90UHJvZHVjdChBKS5tdWwoVCksTT1uZXcgSigwLDApLFk9W107bGV0IE49bmV3IEo7cGgodSxlLGkudm1pbixOKTtsZXQgWD1KLmRpc3RhbmNlKE4sTSk7aWYoWDw9byYmWS5wdXNoKG5ldyBKKGkudm1pbixYKSksaS52bWluIT09aS52bWF4JiYocGgodSxlLGkudm1heCxOKSxYPUouZGlzdGFuY2UoTixNKSxYPD1vJiZZLnB1c2gobmV3IEooaS52bWF4LFgpKSksaS53aWR0aCgpPjApe2NvbnN0IHQ9dVsyXS5pc1plcm8oKSxzPWN0KHJ0LDQpLG49em4oSSx3LHYseCxmLDU4LGksdCxzKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZighaS5jb250YWluc0V4Y2x1c2l2ZUNvb3JkaW5hdGUoc1tyXS50b0RvdWJsZSgpKSljb250aW51ZTtsZXQgdD1zW3JdLnRvRG91YmxlKCk7dD15aChlLHQpO2NvbnN0IG49bmV3IEo7cGgodSxlLHQsbiksWD1KLmRpc3RhbmNlKG4sTSksWDw9byYmWS5wdXNoKG5ldyBKKHQsWCkpfX1pZihyKXtzKGkuZXF1YWxzKFUudW5pdCgpKSk7e3BoKHUsZSwtMSxOLCEwKTtjb25zdCB0PW5ldyBKO3BoKHUsZSwwLHQpO2NvbnN0IHM9bmV3IGZtKHtzdGFydDpOLGVuZDp0fSksbj1zLmdldENsb3Nlc3RDb29yZGluYXRlKE0sITApO248MSYmKE49cy5nZXRDb29yZDJEKG4pLFg9Si5kaXN0YW5jZShOLE0pLFg8PW8mJlkucHVzaChuZXcgSihuLTEsWCkpKX17cGgodSxlLDIsTiwhMCk7Y29uc3QgdD1uZXcgSjtwaCh1LGUsaS52bWF4LHQpO2NvbnN0IHM9bmV3IGZtKHtzdGFydDp0LGVuZDpOfSksbj1zLmdldENsb3Nlc3RDb29yZGluYXRlKE0sITApO24+MCYmKE49cy5nZXRDb29yZDJEKG4pLFg9Si5kaXN0YW5jZShOLE0pLFg8PW8mJlkucHVzaChuZXcgSigxK24sWCkpKX19aWYoIVkubGVuZ3RoKXJldHVybiAwO1kuc29ydCgodCxlKT0+dC5jb21wYXJlKGUpKTtsZXQgcT0wO2NvbnN0IEY9WVswXS54O2lmKGhbcSsrXT1GLHE8YSl7Y29uc3QgdD1IKHUsNCwhMSkudG90YWwoKSxlPVlbMF0ueTtmb3IobGV0IHM9MSxuPVkubGVuZ3RoO3M8bjtzKyspaWYoWVtzXS55PmUrdCl7WS5sZW5ndGg9czticmVha31ZLnNvcnQoKHQsZSk9PkJ0KHQueCxlLngpKSxxPTAsaFtxKytdPVlbMF0ueDtmb3IobGV0IHM9MSxuPVkubGVuZ3RoO3M8bjtz
1KyspWVtzXS54IT09aFtxLTFdJiZxPGEmJihoW3ErK109WVtzXS54KX1yZXR1cm4gcX1mdW5jdGlvbiBrYSh0LGUscyxuLGkpe3JldHVybnt0bWluOnQsdG1heDplLHQ6cyxkOm4scHQ6aS5jbG9uZSgpfX1mdW5jdGlvbiBHYSh0LGUsbixpLHIpe2NvbnN0IG89bmV3IHdlO2lmKFdhKHQsVS51bml0KCksbyksby5pbmZsYXRlKGkpLCFvLmlzSW50ZXJzZWN0aW5nUG9pbnQyRChlKSlyZXR1cm4gMDtjb25zdCBhPWRhKHQpO2xldCBoPTA7Y29uc3QgdT1bXTtsZXQgbT1hLnNwZWNpYWxQb2ludHNbMF07Zm9yKGxldCBsPTEsYz1hLnNwZWNpYWxQb2ludHMubGVuZ3RoO2w8YzsrK2wpe2NvbnN0IG49YS5zcGVjaWFsUG9pbnRzW2xdLGk9bWEodCxlLG0sbik7aWYoMD09PXUubGVuZ3RoKXUucHVzaChpKTtlbHNlIGlmKGkudD09PWkudG1pbilzKHUuYXQoLTEpLmQ8PWkuZCksdS5hdCgtMSkudG1heD1pLnRtYXg7ZWxzZSBpZih1LmF0KC0xKS50PT09dS5hdCgtMSkudG1heCl7cyh1LmF0KC0xKS5kPj1pLmQpO2NvbnN0IHQ9dS5hdCgtMSkudG1pbjt1W3UubGVuZ3RoLTFdPWksdS5hdCgtMSkudG1pbj10fWVsc2UgdS5wdXNoKGkpO209bn1mb3IoY29uc3QgcyBvZiB1KWlmKHMuZDw9aSl7Y29uc3QgdD1zLnQ7bj8obltoXT10LGgrKyk6aCsrfXJldHVybiBofWZ1bmN0aW9uIFdhKHQsZSxzKXtjb25zdCBuPWN0KEosMyk7dC5xdWVyeUNvbnRyb2xQb2ludHMobik7Y29uc3QgaT1bMCwwLDBdO3QucXVlcnlXZWlnaHRzKGkpLGphKG4saSxlLHMpfWZ1bmN0aW9uIGphKHQsZSxzLG4pe2lmKHMuZXF1YWxzUmFuZ2UoMCwxKSlyZXR1cm4gdm9pZCBuLnNldEZyb21Qb2ludHModCwzKTtjb25zdCBpPWN0KEosMykscj1bMCwwLDBdO0phKHQsZSxzLnZtaW4scy52bWF4LGksciksbi5zZXRGcm9tUG9pbnRzKGksMyl9ZnVuY3Rpb24gWmEodCl7Y29uc3QgZT1pdCh0WzBdLnksdFsxXS55KSxzPWl0KHRbMV0ueSx0WzJdLnkpO2lmKGU+PTAmJnM+PTB8fGU8PTAmJnM8PTApe2NvbnN0IGU9aXQodFswXS54LHRbMV0ueCkscz1pdCh0WzFdLngsdFsyXS54KTtpZihlPj0wJiZzPj0wfHxlPD0wJiZzPD0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEhhKHQpe2NvbnN0IGU9Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhlKTtjb25zdCBzPVVhKGUpO3JldHVybiBzJiYodC5tX2NwLnNldENvb3Jkc1BvaW50MkQoZVsxXSksdC5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpKSxzfWZ1bmN0aW9uIFVhKHQpe2xldCBlPSExO2ZvcihsZXQgcz0wO3M8MjtzKyspe2NvbnN0IG49aXQodFswXVtzXSx0WzJdW3NdKTtuPjA/KGl0KHRbMF1bc10sdFsxXVtzXSk8MCYmKHRbMV1bc109dFswXVtzXSxlPSEwKSxpdCh0WzFdW3NdLHRbMl1bc10pPDAmJih0WzFdW3NdPXRbMl1bc10sZT0hMCkpOm48MD8oaXQodFswXVtzXSx0WzFdW3NdKT4wJiYodFsxXVtzXT10WzBdW3NdLGU9ITApLGl0KHRbMV1bc10sdFsyXVtzXSk+MCYmKHRbMV1bc109dFsyXVtzXSxlPSEwKSk6dFsxXVtzXSE9PXRbMF1bc10mJih0WzFdW3NdPXRbMF1bc10sZT0hMCl9cmV0dXJuIGV9ZnVuY3Rpb24gT2EodCxzLG4pe3ZvaWQgMD09PW4mJihuPXMscz0wKTtjb25zdCBpPW5ldyBKO2lmKHM8MHx8bj4xKXJldHVybiBpLnNldE5BTigpLGk7aWYocz5uJiZlKFwiY2FsY3VsYXRlX3N1Yl93ZWlnaHRlZF9jZW50cm9pZFwiKSxzPT09bnx8dC5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIGkuc2V0Q29vcmRzKDAsMCksaTtjb25zdCByPWRhKHQpLG89cWEodCksYT1vL3QuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO2xldCBoPXMsdT0wO2ZvcihsZXQgZT0xLG09ci5zcGVjaWFsUG9pbnRzQ291bnQoKTtlPG07ZSsrKWlmKHM8ci5zcGVjaWFsUG9pbnRzW2VdKXt1PWUtMTticmVha31pLnNldENvb3JkcygwLDApO2ZvcihsZXQgZT11KzEsbT1yLnNwZWNpYWxQb2ludHNDb3VudCgpO2U8bTtlKyspe2NvbnN0IHM9TWF0aC5taW4oci5zcGVjaWFsUG9pbnRzW2VdLG4pLHU9bGEodCxoLHMsYSxvKTtpZihpLmFkZFRoaXModSksaD1zLG48PXIuc3BlY2lhbFBvaW50c1tlXSlicmVha31yZXR1cm4gaS5hZGQodC5nZXRTdGFydFhZKCkubXVsKHQuY2FsY3VsYXRlTGVuZ3RoMkQoKSkpfWZ1bmN0aW9uIFFhKHQsZSxuLGkscixvLGEpe3Mobj49MCYmbjw9MSYmaSE9PW8mJnIhPT1hKSxzKGVbMF0+MCYmZVsyXT4wJiZlWzFdPj0wKTtjb25zdCBoPVsxLFBoKGUpLDFdLHU9eGgoZSxuKSxtPWd0KHQsMyksbD1jdChZLDMpO21oKG0saCxsKTtjb25zdCBjPWN0KFksMyksZz1jdChZLDMpO0NoKGwsdSxpP2M6bnVsbCxvP2c6bnVsbCksdmgoZSxuLHIsYSk7Y29uc3QgZD1aYShtKTtpZihpKXtmb3IobGV0IHQ9MDt0PDM7Kyt0KV9oKGNbdF0saVt0XSk7U2gobSxpKSxkJiZVYShpKX1pZihvKXtmb3IobGV0IHQ9MDt0PDM7Kyt0KV9oKGdbdF0sb1t0XSk7U2gobSxvKSxkJiZVYShvKX19ZnVuY3Rpb24gSmEodCxlLG4saSxyLG8pe2lmKHMobj49MCYmaTw9MSYmbjw9aSksbj09PWkpe2NvbnN0IHM9bmV3IEosaT1saCh0LGUsbixzKTtyZXR1cm4gYmgodCxzKSxyWzBdLmFzc2lnbihzKSxyWzFdLmFzc2lnbihzKSxyWzJdLmFzc2lnbihzKSxvWzBdPWksb1sxXT1pLHZvaWQob1syXT1pKX1pZigwPT09biYmMT09PWkpcmV0dXJuIHJbMF0uYXNzaWduKHRbMF0pLHJbMV0uYXNzaWduKHRbMV0pLHJbMl0uYXNzaWduKHRbMl0pLG9bMF09ZVswXSxvWzFdPWVbMV0sdm9pZChvWzJdPWVbMl0pO2NvbnN0IGE9Y3QoWSwzKTt7Y29uc3Qgcz1bMSxQaChlKSwxXSxyPXhoKGUsbiksbz14aChlLGkpO21oKHQscyxhKSxDaChhLG8sYSxudWxsKTtDaChhLHI+PW8/MTpyL28sbnVsbCxhKX1jb25zdCBoPVswLDAsMF07dmgoZSxpLGgsbnVsbCksdmgoaCxuL2ksbnVsbCxoKTtjb25zdCB1PVphKHQpLG09Y3QoSiwzKTtfaChhWzFdLG1bMV0pLHBoKHQsZSxuLG1bMF0pLHBoKHQsZSxpLG1bMl0pLFNoKHQsbSk7Zm9yKGxldCBzPTA7czwzOysrcylyW3NdLmFzc2lnbihtW3NdKSxvW3NdPWhbc107dSYmVWEocil9ZnVuY3Rpb24gS2EodCxlLHMpe2NvbnN0IG49UGgoZSksaT1bMSxuLDFdLHI9NCpuLygzKigxK24pKTtzWzBdLmFzc2lnbih0WzBdKSxzWzNdLmFzc2lnbih0WzJdKSxDdCh0WzBdLHRbMV0scixzWzFdKSxDdCh0WzJdLHRbMV0scixzWzJdKSxuZXcgcmEoe2NwOnN9KSxuZXcgRG4oe3BvaW50czp0LHdlaWdodDpufSk7bGV0IG89MCxhPS4xLGg9MDtmb3IobGV0IHU9MDt1PDk7dSsrLGErPS4xKXtjb25zdCBlPW5ldyBKO3BoKHQsaSxhLGUpO2
1NvbnN0IG49bmV3IEo7eW8ocyxhLG4pO2NvbnN0IHI9Si5zcXJEaXN0YW5jZShlLG4pO3I+byYmKG89cixoPWEpfXtjb25zdCBlPW5ldyBKO3BoKHQsaSxoLGUpO2NvbnN0IG49WzBdO1JvKHMsZSxVLnVuaXQoKSwhMSwtMSwxLG4pO2NvbnN0IHI9bmV3IEo7cmV0dXJuIHlvKHMsblswXSxyKSxvPUouc3FyRGlzdGFuY2UoZSxyKSxNYXRoLnNxcnQobyl9fWZ1bmN0aW9uICRhKHQsZSxzLG4pe2lmKGUuaXNFcXVhbCh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpJiZzLmlzRXF1YWwodC5tX1hFbmQsdC5tX1lFbmQpKXJldHVybjtjb25zdCBpPSEhbiYmdC5pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpLHI9bmV3IGNlLG89Y3QoSiwzKTtvWzBdLnNldENvb3Jkcyh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpLG9bMl0uc2V0Q29vcmRzKHQubV9YRW5kLHQubV9ZRW5kKTtjb25zdCBhPW5ldyBKO2Euc2V0U3ViKG9bMl0sb1swXSksYS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSxvWzFdLnNldEFkZChvWzBdLGEpO2NvbnN0IGg9Y3QoSiwzKTtoWzBdLnNldENvb3Jkc1BvaW50MkQoZSksaFsyXS5zZXRDb29yZHNQb2ludDJEKHMpLGEuc2V0U3ViKGhbMl0saFswXSksYS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSxoWzFdLnNldEFkZChoWzBdLGEpLHIuc2V0RnJvbVR3b1RyaWFuZ2xlcyhvLGgpP3IudHJhbnNmb3JtSW5QbGFjZSh0Lm1fY3ApOkN0KGUscywuNSx0Lm1fY3ApLHQuY2hhbmdlRW5kUG9pbnRzMkQoZSxzKSxpJiZIYSh0KX1mdW5jdGlvbiB0aCh0LGUscyxuLGkpe2lmKGkpe2lmKDAhPT1obShlLHMpKXJldHVybiB0PzQ6Mn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1paCh0LGUscyxudWxsLG51bGwsbnVsbCxuLHZvaWQgMCE9PWkmJmksITAsITEpPzQ6MH1mdW5jdGlvbiBlaCh0LGUscyxuLGkpe2lmKGkpe2lmKDAhPT1obShlLHMpKXJldHVybiB0PzQ6Mn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1yaCh0LGUscyxudWxsLG51bGwsbnVsbCxuLGk/PyExLCEwLCExKT80OjB9ZnVuY3Rpb24gc2godCxlLHMsbixpKXtpZihpKXtjb25zdCBuPWhtKGUscyk7aWYoMCE9PW4pe2lmKHQpe2lmKDE9PT1uKXtpZihlLm1fd2VpZ2h0c1swXT09PXMubV93ZWlnaHRzWzBdJiZlLm1fd2VpZ2h0c1sxXT09PXMubV93ZWlnaHRzWzFdJiZlLm1fd2VpZ2h0c1syXT09PXMubV93ZWlnaHRzWzJdKXJldHVybiAyfWVsc2UgaWYoZS5tX3dlaWdodHNbMF09PT1zLm1fd2VpZ2h0c1syXSYmZS5tX3dlaWdodHNbMV09PT1zLm1fd2VpZ2h0c1sxXSYmZS5tX3dlaWdodHNbMl09PT1zLm1fd2VpZ2h0c1swXSlyZXR1cm4gMjtyZXR1cm4gNH1yZXR1cm4gMn19ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09b2godCxlLHMsbnVsbCxudWxsLG51bGwsbix2b2lkIDAhPT1pJiZpLCEwLCExKT80OjB9ZnVuY3Rpb24gbmgodCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gdD80OjJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09YWgodCxlLHMsbnVsbCxudWxsLG51bGwsbixpPz8hMSwhMCwhMSk/NDowfWZ1bmN0aW9uIGloKHQsZSxuLGkscixvLGEsaCx1LG0pe2lmKG51bGwhPT1yJiYoci5sZW5ndGg9MCksbnVsbCE9PW8mJihvLmxlbmd0aD0wKSxudWxsIT09aSYmKGkubGVuZ3RoPTApLG4uaXNEZWdlbmVyYXRlKDApKXtjb25zdCB0PVswLDBdLHM9ZS5pbnRlcnNlY3RQb2ludChuLmdldFN0YXJ0WFkoKSx0LGEpO2lmKHM+MCl7aWYobnVsbCE9PXIpZm9yKGxldCBlPTA7ZTxzO2UrKylyLnB1c2godFtlXSk7aWYobnVsbCE9bylmb3IobGV0IHQ9MDt0PHM7dCsrKW8ucHVzaCgwKTtpZihudWxsIT1pKWZvcihsZXQgbj0wO248cztuKyspe2NvbnN0IHM9bmV3IEo7ZS5xdWVyeUNvb3JkMkQodFtuXSxzKSxpLnB1c2gocyl9fXJldHVybiBzfWNvbnN0IGw9b3MoZSxuKTtpZihhPU1hdGgubWF4KGEsbCksZS5pc0RlZ2VuZXJhdGVUb0xpbmVIZWxwZXIobCkpe2NvbnN0IHQ9bmV3IGZtKHtzdGFydDplLmdldFN0YXJ0WFkoKSxlbmQ6ZS5nZXRFbmRYWSgpfSkscz13cyh0LG4saSxyLG8sYSxoLG0pO2lmKHIpZm9yKGxldCBuPTA7bjxzOysrbil7Y29uc3Qgcz10LmdldENvb3JkMkQocltuXSk7cltuXT1lLmdldENsb3Nlc3RDb29yZGluYXRlKHMsITEpfXJldHVybiBzfWlmKGFzKGUsbixhKSlyZXR1cm4gMDtjb25zdCBjPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMoYyk7Y29uc3QgZz1bMCwwLDBdO2UucXVlcnlXZWlnaHRzKGcpO2NvbnN0IGQ9WzEsUGgoZyksMV0sXz1uLmdldEVuZFhZKCkuc3ViKG4uZ2V0U3RhcnRYWSgpKSxwPV8uY2xvbmUoKTtwLmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpO2NvbnN0IGY9Y1swXS5jbG9uZSgpLFA9Y1sxXS5jbG9uZSgpLHk9Y1syXS5jbG9uZSgpLHg9UC5zdWIoZiksQz15LnN1YihmKSx2PXkuc3ViKFApLGI9ZFswXSxTPWRbMV0sRT1kWzJdLEQ9YipTLHc9YipFLEE9UypFLFQ9eC5kb3RQcm9kdWN0KHApKkQsST1DLmRvdFByb2R1Y3QocCkqdztsZXQgTT1ULFk9SS0yKlQsTj12LmRvdFByb2R1Y3QocCkqQStJLUk7Y29uc3QgWD1PKDEzLE51bWJlci5OYU4pLHE9TygxMyxOdW1iZXIuTmFOKTtsZXQgRj1ubihOLFksTSxVLnVuaXQoKSwhMSxYKTtGPDAmJihYWzBdPTAsWFsxXT0xLEY9Mik7bGV0IFY9MDtmb3IobGV0IHM9MCxrPVY7czxGOysrcyl7Y29uc3QgdD1uZXcgSjtwaChjLGQsWFtzK2tdLHQpLHFbVl09bi5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LCExKTtKLmRpc3RhbmNlKHQsbi5nZXRDb29yZDJEKHFbVl0pKTw9YSYmKFhbVl09WFtzK2tdLFYrKyl9Y29uc3QgTD1jdChKLDMpLFI9Y3QoSiwzKTtpZihlLnF1ZXJ5Q29udHJvbFBvaW50cyhSKSxSWzBdLnN1YlRoaXMobi5nZXRTdGFydFhZKCkpLFJbMV0uc3ViVGhpcyhuLmdldFN0YXJ0WFkoKSksUlsyXS5zdWJUaGlzKG4uZ2V0U3RhcnRYWSgpKSxoaChSLGQsTCwhMSksTWF0aC5hYnMoXy54KT49TWF0aC5hYnMoXy55KSl7Y29uc3QgdD1fLnkvXy54O049TFsyXS55LUxbMl0ueCp0LFk9TFsxXS55LUxbMV0ueCp0LE09TFswXS55LUxbMF0ueCp0fWVsc2V7Y29uc3QgdD1fLngvXy55O049TFsyXS54LUxbMl0ueSp0LFk9TFsxXS54LUxbMV0ueSp0LE09TFswXS54LUxbMF0ueSp0fWNvbnN0IHo9ZS5nZXRFbmRYWSgpLmVxdWFscyhuLmdldFN0YXJ0WFkoKSl8fGUuZ2V0RW5kWFkoKS5lcXVhbHMobi5nZXRFbmRYWSgpKSxCPVswLDBdO0Y9bm4oTixZLE0sVS51bml0KCkseixCKTtmb3IobGV0IHM9MCxrPVY7czxGOysrcyl7WFtzK2tdPUJbc107Y29uc3QgdD1uZXcgSjtwaChjLGQsWFtzK2tdLHQpLHFbVl09bi5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LCExKTtKLmRpc3RhbmNlKHQsbi5nZXRDb29yZDJEKHFbVl0pKTw9YSYmKFhbVl09WFtzK2tdLFYrKyl9cyhWPFgubGVuZ3RoKzQpO2ZvcihsZXQgcz0wO3M8VjtzKyspWFtzXT15aChnLFhbc10pO0Y9ZS5pbnRlcnNlY3RQb2ludChuLmdldFN0YXJ0WFkoKSxCLGEpO2ZvcihsZXQgcz0wO3M8RjtzKyspWFtWXT1CW3NdLHFbVisrXT0wO0Y9ZS5pbnRlcnNlY3RQb2ludChuLmdldEVuZFhZKCksQixhKTtmb3IobGV0IHM9MDtzPEY7cysrKVhbVl09QltzXSxxW1YrK109MTtGPW4uaW50ZXJzZWN0UG9pbnQoZS5nZXRTdGFydFhZKCksQixhKTtmb3IobGV0IHM9MDtzPEY7cysrKXFbVl09QltzXSxYW1YrK109MDtGPW4uaW50ZXJzZWN0UG9pbnQoZS5nZXRFbmRYWSgpLEIsYSk7Zm9yKGxldCBzPTA7czxGO3MrKylxW1ZdPUJbc10sWFtWKytdPTE7cmV0dXJuIDA9PT1WPzA6Z20odCxlLG4sWCxxLFYsaSxyLG8sYSxoLHUsbSl9ZnVuY3Rpb24gcmgodCxlLHMsbixpLHIsbyxhLGgsdSl7aWYoRXUocykpe3JldHVybiBpaCh0LGUsbmV3IGZtKHtzdGFydDpzLmdldFN0YXJ0WFkoKSxlbmQ6cy5nZXRFbmRYWSgpfSksbixpLHIsbyxhLGgsdSl9Y29uc3QgbT1vcyhlLHMpO2lmKGFzKGUscyxvPU1hdGgubWF4KG8sbSkpKXJldHVybiAwO2NvbnN0IGw9W10sYz1b
1XSxnPWN0KEosNCk7e2UucXVlcnlDb250cm9sUG9pbnRzKGcpO2NvbnN0IHQ9Y3QoSiw0KSxuPW5ldyBjZTtzLmNhbm9uaWNUb1dvcmxkVHJhbnNmb3JtYXRpb24obik7Y29uc3QgaT1uZXcgY2U7aS5zZXRJbnZlcnQobiksaS50cmFuc2Zvcm1Qb2ludHMyRChnLDQsdCk7Y29uc3Qgcj1jdChydCwzKSxoPWN0KHJ0LDMpLHU9Y3QocnQsMyksbT1bMCwwLDBdO2UucXVlcnlXZWlnaHRzKG0pLHVoKHQsbSxyLGgsdSk7Y29uc3QgZD1jdChydCwzKTtkWzBdLnNldERvdWJsZShzLmdldFNlbWlNaW5vckF4aXMoKSksZFswXS5zcXJUaGlzKCksZFsxXS5zZXREb3VibGUocy5nZXRTZW1pTWFqb3JBeGlzKCkpLGRbMV0uc3FyVGhpcygpLGRbMl0uc2V0VGhpcyhkWzBdKSxkWzJdLm11bFRoaXMoZFsxXSksZFsyXS5uZWdhdGVUaGlzKCk7Y29uc3QgXz1GbihyLDIsaCwyLHUsMixkLCEwLFUudW5pdCgpLFUudW5pdCgpLGwsYSk7aWYoXz4wKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248XztuKyspe2NvbnN0IGk9bmV3IEo7ZS5xdWVyeUNvb3JkMkQobFtuXSxpKTtjb25zdCByPXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUoaSwhMSksYT1uZXcgSjtzLnF1ZXJ5Q29vcmQyRChyLGEpO0ouZGlzdGFuY2UoaSxhKTw9byYmKGxbdF09bFtuXSxjLnB1c2gociksdCsrKX1sLmxlbmd0aD10fX1jb25zdCBkPVswLDFdO2ZvcihsZXQgXz0wO188MjtfKyspe2NvbnN0IHQ9MD09PV8/cy5nZXRTdGFydFhZKCk6cy5nZXRFbmRYWSgpLG49emEoZSx0LFUudW5pdCgpLCExLC0xKSxpPW5ldyBKO2UucXVlcnlDb29yZDJEKG4saSk7Si5kaXN0YW5jZSh0LGkpPD1vJiYobC5wdXNoKG4pLGMucHVzaChkW19dKSl9Zm9yKGxldCBfPTA7XzwyO18rKyl7Y29uc3QgdD1bMCwzXTt7Y29uc3QgZT1zLmdldENsb3Nlc3RDb29yZGluYXRlKGdbdFtfXV0sITEpLG49bmV3IEo7cy5xdWVyeUNvb3JkMkQoZSxuKTtKLmRpc3RhbmNlKGdbdFtfXV0sbik8PW8mJihsLnB1c2goZFtfXSksYy5wdXNoKGUpKX19cmV0dXJuIGdtKHQsZSxzLGwsYyxsLmxlbmd0aCxuLGkscixvLGEsaCx1KX1mdW5jdGlvbiBvaCh0LGUsbixpLHIsbyxhLGgsdSxtKXtjb25zdCBsPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMobCk7Y29uc3QgYz1jdChKLDMpO2lmKG4ucXVlcnlDb250cm9sUG9pbnRzKGMpLGhzKGwsYywzKTwwKXJldHVybiBvaCh0LG4sZSxpLG8scixhLGgsdSwhbSk7Y29uc3QgZz1vcyhlLG4pO2lmKGUuaXNEZWdlbmVyYXRlVG9MaW5lSGVscGVyKGcpKXtjb25zdCBzPW5ldyBmbSh7c3RhcnQ6ZS5nZXRTdGFydFhZKCksZW5kOmUuZ2V0RW5kWFkoKX0pLGw9aWgodCxuLHMsaSxvLHIsYSxoLHUsIW0pO2lmKHIpZm9yKGxldCB0PTA7dDxsOysrdCl7Y29uc3Qgbj1zLmdldENvb3JkMkQoclt0XSk7clt0XT1lLmdldENsb3Nlc3RDb29yZGluYXRlKG4sITEpfXJldHVybiBsfWlmKG4uaXNEZWdlbmVyYXRlVG9MaW5lSGVscGVyKGcpKXtjb25zdCBzPW5ldyBmbSh7c3RhcnQ6bi5nZXRTdGFydFhZKCksZW5kOm4uZ2V0RW5kWFkoKX0pLGw9aWgodCxlLHMsaSxyLG8sYSxoLHUsbSk7aWYobylmb3IobGV0IHQ9MDt0PGw7Kyt0KXtjb25zdCBlPXMuZ2V0Q29vcmQyRChvW3RdKTtvW3RdPW4uZ2V0Q2xvc2VzdENvb3JkaW5hdGUoZSwhMSl9cmV0dXJuIGx9aWYoYXMoZSxuLGE9TWF0aC5tYXgoYSxnKSkpcmV0dXJuIDA7Y29uc3QgZD1PKDMsTnVtYmVyLk5hTik7ZS5xdWVyeVdlaWdodHMoZCk7Y29uc3QgXz1PKDMsTnVtYmVyLk5hTik7bi5xdWVyeVdlaWdodHMoXyk7Y29uc3QgcD1bMSxQaChkKSwxXSxmPVsxLFBoKF8pLDFdLFA9bmV3IFUoMCwxKSx5PW5ldyBVKDAsMSk7e2NvbnN0IHQ9d2UuY29uc3RydWN0RW1wdHkoKTtqYShsLHAsbmV3IFUoMCwxKSx0KTtjb25zdCBlPXdlLmNvbnN0cnVjdEVtcHR5KCk7amEoYyxmLG5ldyBVKDAsMSksZSk7Y29uc3Qgcz1NYXRoLm1heCh0Lm1heERpbSgpLGUubWF4RGltKCkpO2lmKHQuaW5mbGF0ZSgzKmEpLGUuaW5mbGF0ZSgzKmEpLCF0LmludGVyc2VjdFcoZSkpcmV0dXJuIDA7aWYodC5tYXhEaW0oKTwuMSpzKXtpZihmaChsLHAsdCxQKSxmaChjLGYsdCx5KSxQLmlzRW1wdHkoKXx8eS5pc0VtcHR5KCkpcmV0dXJuIDA7SmEobCxwLFAudm1pbixQLnZtYXgsbCxwKSxKYShjLGYseS52bWluLHkudm1heCxjLGYpfX1jb25zdCB4PV9tKGwsMixjLDIsYSk7aWYoMD09PXgpcmV0dXJuIDA7Y29uc3QgQz1bXSx2PVtdO2lmKC0xPT09eCl7Y29uc3QgdD1jdChydCwzKSxlPWN0KHJ0LDMpLHM9Y3QocnQsMyk7dWgobCxwLHQsZSxzKTtjb25zdCBuPWN0KHJ0LDMpLGk9Y3QocnQsMykscj1jdChydCwzKTt1aChjLGYsbixpLHIpO2NvbnN0IG89W10sZz1bXSxkPU5uKHQsMixlLDIscywyLG4sMixpLDIsciwyLCEwLFUudW5pdCgpLFUudW5pdCgpLG8sZyxoLHUsbSk7aWYoZD4wKWZvcihsZXQgaD0wO2g8ZDtoKyspe2NvbnN0IHQ9bmV3IEo7cGgoYyxmLGdbaF0sdCk7Y29uc3QgZT1uZXcgSjtwaChsLHAsb1toXSxlKTtKLmRpc3RhbmNlKGUsdCk8PWEmJihDLnB1c2gob1toXSksdi5wdXNoKGdbaF0pKX19Zm9yKGxldCBiPTA7YjwyO2IrKyl7bGV0IHQsZSxuOzA9PT1iPyh0PWwsZT1jLG49Zik6KHQ9YyxlPWwsbj1wKTtmb3IobGV0IGk9MDtpPDI7aSsrKXtjb25zdCByPTA9PT1pPzA6dC5sZW5ndGgtMSxvPW5ldyBKLGg9WzBdLHU9QmEoZSxuLHRbcl0sVS51bml0KCksITEsLTEsMSxoKTtzKDE9PT11KSxwaChlLG4saFswXSxvKSxKLmRpc3RhbmNlKHRbcl0sbyk8PWEmJigwPT09Yj8oQy5wdXNoKDA9PT1yPzA6MSksdi5wdXNoKGhbMF0pKToodi5wdXNoKDA9PT1yPzA6MSksQy5wdXNoKGhbMF0pKSl9fWlmKDA9PT1DLmxlbmd0aClyZXR1cm4gMDtpZighUC5lcXVhbHNSYW5nZSgwLDEpKWZvcihsZXQgcz0wO3M8Qy5sZW5ndGg7KytzKUNbc109RG4ucmVjYWxjdWxhdGVQYXJlbnRUKFAudm1pbixQLnZtYXgsQ1tzXSk7aWYoIXkuZXF1YWxzUmFuZ2UoMCwxKSlmb3IobGV0IHM9MDtzPHYubGVuZ3RoOysrcyl2W3NdPURuLnJlY2FsY3VsYXRlUGFyZW50VCh5LnZtaW4seS52bWF4LHZbc10pO2ZvcihsZXQgcz0wO3M8Qy5sZW5ndGg7KytzKUNbc109eWgoZCxDW3NdKTtmb3IobGV0IHM9MDtzPHYubGVuZ3RoOysrcyl2W3NdPXloKF8sdltzXSk7cmV0dXJuIGdtKHQsZSxuLEMsdixDLmxlbmd0aCxpLHIsbyxhLGgsdSxtKX1mdW5jdGlvbiBhaCh0LGUscyxuLGkscixvLGEsaCx1KXtpZihlLmlzTGluZSgpKXtyZXR1cm4gTGkodCxzLG5ldyBmbSh7c3RhcnQ6ZS5nZXRTdGFydFhZKCksZW5kOmUuZ2V0RW5kWFkoKX0pLG4scixpLG8sYSxoLCF1KX1pZihzLmlzTGluZSgpKXtyZXR1cm4gaWgodCxlLG5ldyBmbSh7c3RhcnQ6cy5nZXRTdGFydFhZKCksZW5kOnMuZ2V0RW5kWFkoKX0pLG4saSxyLG8sYSxoLHUpfWNvbnN0IG09b3MoZSxzKTtpZihhcyhlLHMsbz1NYXRoLm1heChvLG0pKSlyZXR1cm4gMDtjb25zdCBsPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMobCk7Y29uc3QgYz1jdChKLDMpO3MucXVlcnlDb250cm9sUG9pbnRzKGMpO2NvbnN0IGc9X20obCwyLGMsMixvKTtpZigwPT09ZylyZXR1cm4gMDtjb25zdCBkPVtdLF89W107aWYoLTE9PT1nKXtjb25zdCB0PWN0KHJ0LDMpLG49Y3QocnQsMyksaT1jdChydCwzKSxyPVswLDAsMF07ZS5xdWVyeVdlaWdodHMociksdWgobCxyLHQsbixpKTtjb25zdCBtPWN0KHFlLDMpO2ppKGMsbSk7Y29uc3QgZz1Obih0LDIsbiwyLGksMixbbVswXS54LG1bMV0ueCxtWzJdLnhdLDIsW21bMF0ueSxtWzFdLnksbVsyXS55XSwyLG51bGwsMCwhMCxVLnVuaXQoKSxVLnVuaXQoKSxkLF8sYSx
1oLHUpO2lmKGc+MCl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGc7bisrKXtjb25zdCBpPW5ldyBKO3MucXVlcnlDb29yZDJEKF9bbl0saSk7Y29uc3Qgcj1uZXcgSjtlLnF1ZXJ5Q29vcmQyRChkW25dLHIpLEouZGlzdGFuY2UocixpKTw9byYmKGRbdF09ZFtuXSxfW3RdPV9bbl0sdCsrKX1kLmxlbmd0aD10LF8ubGVuZ3RoPXR9fWZvcihsZXQgcD0wO3A8MjtwKyspe2xldCB0O3Q9MD09PXA/bDpjO2ZvcihsZXQgbj0wO248MjtuKyspe2NvbnN0IGk9MD09PW4/MDp0Lmxlbmd0aC0xO2xldCByO2NvbnN0IGE9bmV3IEo7MD09PXA/KHI9dmkocyx0W2ldLFUudW5pdCgpLCExKSxzLnF1ZXJ5Q29vcmQyRChyLGEpKToocj16YShlLHRbaV0sVS51bml0KCksITEsLTEpLGUucXVlcnlDb29yZDJEKHIsYSkpLEouZGlzdGFuY2UodFtpXSxhKTw9byYmKDA9PT1wPyhkLnB1c2goMD09PWk/MDoxKSxfLnB1c2gocikpOihfLnB1c2goMD09PWk/MDoxKSxkLnB1c2gocikpKX19cmV0dXJuIGdtKHQsZSxzLGQsXyxkLmxlbmd0aCxuLGkscixvLGEsaCx1KX1mdW5jdGlvbiBoaCh0LGUscyxuPSExKXtjb25zdCBpPWN0KEosMyk7bj8oaVswXS5zZXRDb29yZHNQb2ludDJEKHRbMF0pLGlbMV0uc2V0Q29vcmRzUG9pbnQyRCh0WzFdKSxpWzFdLnN1YlRoaXMoaVswXSksaVsyXS5zZXRDb29yZHNQb2ludDJEKHRbMl0pLGlbMl0uc3ViVGhpcyhpWzBdKSxpWzBdLnNldENvb3JkcygwLDApKTooaVswXS5zZXRDb29yZHNQb2ludDJEKHRbMF0pLGlbMV0uc2V0Q29vcmRzUG9pbnQyRCh0WzFdKSxpWzJdLnNldENvb3Jkc1BvaW50MkQodFsyXSkpLGlbMF0ubXVsVGhpcyhlWzBdKSxpWzFdLm11bFRoaXMoZVsxXSksaVsyXS5tdWxUaGlzKGVbMl0pLHNbMV0uc2V0Q29vcmRzKGlbMV0ueC1pWzBdLngsaVsxXS55LWlbMF0ueSksc1syXS5zZXRDb29yZHNQb2ludDJEKGlbMl0uc3ViKGlbMV0pKSxzWzJdLnN1YlRoaXMoc1sxXSksc1sxXS54Kj0yLHNbMV0ueSo9MixzWzBdLnNldENvb3Jkc1BvaW50MkQoaVswXSl9ZnVuY3Rpb24gdWgodCxlLHMsbixpKXtjb25zdCByPXJ0LmNvbnN0cnVjdERvdWJsZShlWzBdKSxvPXJ0LmNvbnN0cnVjdERvdWJsZShlWzFdKSxhPXJ0LmNvbnN0cnVjdERvdWJsZShlWzJdKTtzWzBdLnNldERvdWJsZSh0WzBdLngpLHNbMF0ubXVsVGhpcyhyKSxzWzFdLnNldERvdWJsZSh0WzFdLngpLHNbMV0ubXVsVGhpcyhvKSxzWzJdLnNldERvdWJsZSh0WzJdLngpLHNbMl0ubXVsVGhpcyhhKSxzWzJdLnN1YlRoaXMoc1sxXSksc1sxXS5zdWJUaGlzKHNbMF0pLHNbMl0uc3ViVGhpcyhzWzFdKSxzWzFdLmxkZXhwVGhpcygxKSxuWzBdLnNldERvdWJsZSh0WzBdLnkpLG5bMF0ubXVsVGhpcyhyKSxuWzFdLnNldERvdWJsZSh0WzFdLnkpLG5bMV0ubXVsVGhpcyhvKSxuWzJdLnNldERvdWJsZSh0WzJdLnkpLG5bMl0ubXVsVGhpcyhhKSxuWzJdLnN1YlRoaXMoblsxXSksblsxXS5zdWJUaGlzKG5bMF0pLG5bMl0uc3ViVGhpcyhuWzFdKSxuWzFdLmxkZXhwVGhpcygxKSxpWzBdLnNldERvdWJsZShlWzBdKSxpWzFdLnNldERvdWJsZShlWzFdKSxpWzJdLnNldFRoaXMoaVsxXSksaVsyXS5sZGV4cFRoaXMoMSksaVsyXS5uZWdhdGVUaGlzKCksaVsyXS5hZGRUaGlzKGlbMF0pLGlbMl0uYWRkRG91YmxlVGhpcyhlWzJdKSxpWzFdLnN1YlRoaXMoaVswXSksaVsxXS5sZGV4cFRoaXMoMSl9ZnVuY3Rpb24gbWgodCxlLHMpe2ZvcihsZXQgbj0wO248MzsrK24pc1tuXS5zZXRDb29yZHNQb2ludDJEWih0W25dLm11bChlW25dKSxlW25dKX1mdW5jdGlvbiBsaCh0LGUscyxuKXtpZigwPT09cylyZXR1cm4gbi5hc3NpZ24odFswXSksZVswXTtpZigxPT09cylyZXR1cm4gbi5hc3NpZ24odFsyXSksZVsyXTtjb25zdCBpPVt0WzBdLngqZVswXSx0WzFdLngqZVsxXSx0WzJdLngqZVsyXV0scj1bdFswXS55KmVbMF0sdFsxXS55KmVbMV0sdFsyXS55KmVbMl1dLG89W2VbMF0sZVsxXSxlWzJdXSxhPXM7bGV0IGgsdSxtO2lmKHM8PS41KXtjb25zdCB0PVN0KGlbMF0saVsxXSxhKSxlPVN0KGlbMV0saVsyXSxhKTtoPW90KHQsZSxhKTtjb25zdCBzPVN0KHJbMF0sclsxXSxhKSxuPVN0KHJbMV0sclsyXSxhKTt1PW90KHMsbixhKTtjb25zdCBsPVN0KG9bMF0sb1sxXSxhKSxjPVN0KG9bMV0sb1syXSxhKTttPVN0KGwsYyxhKX1lbHNle2NvbnN0IHQ9RXQoaVswXSxpWzFdLGEpLGU9RXQoaVsxXSxpWzJdLGEpO2g9RXQodCxlLGEpO2NvbnN0IHM9RXQoclswXSxyWzFdLGEpLG49RXQoclsxXSxyWzJdLGEpO3U9RXQocyxuLGEpO2NvbnN0IGw9RXQob1swXSxvWzFdLGEpLGM9RXQob1sxXSxvWzJdLGEpO209RXQobCxjLGEpfXJldHVybiBoLz1tLHUvPW0sbi5zZXRDb29yZHMoaCx1KSxiaCh0LG4pLG19ZnVuY3Rpb24gY2godCxlLHMpe2NvbnN0IG49Y3QoSiwzKTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhuKTtjb25zdCBpPVswLDAsMF07dC5xdWVyeVdlaWdodHMoaSk7Z2goW05lLmNvbnN0cnVjdFBvaW50MkQoblswXSksTmUuY29uc3RydWN0UG9pbnQyRChuWzFdKSxOZS5jb25zdHJ1Y3RQb2ludDJEKG5bMl0pXSxbbmV3IGh0KGlbMF0pLG5ldyBodChpWzFdKSxuZXcgaHQoaVsyXSldLGUscyl9ZnVuY3Rpb24gZ2godCxlLHMsbil7aWYoMD09PXMudmFsdWUoKSlyZXR1cm4gdm9pZCBuLnNldEUodFswXSk7aWYoMT09PXMudmFsdWUoKSlyZXR1cm4gdm9pZCBuLnNldEUodFsyXSk7Y29uc3QgaT1bdFswXS54Lm11bEUoZVswXSksdFsxXS54Lm11bEUoZVsxXSksdFsyXS54Lm11bEUoZVsyXSldLHI9W3RbMF0ueS5tdWxFKGVbMF0pLHRbMV0ueS5tdWxFKGVbMV0pLHRbMl0ueS5tdWxFKGVbMl0pXSxvPVtlWzBdLmNsb25lKCksZVsxXS5jbG9uZSgpLGVbMl0uY2xvbmUoKV0sYT1uZXcgaHQsaD1uZXcgaHQsdT1uZXcgaHQ7aWYocy52YWx1ZSgpPD0uNSl7Y29uc3QgdD1PdChpWzBdLGlbMV0scyksZT1PdChpWzFdLGlbMl0scyk7YS5zZXRFKE90KHQsZSxzKSk7Y29uc3Qgbj1PdChyWzBdLHJbMV0scyksbT1PdChyWzFdLHJbMl0scyk7aC5zZXRFKE90KG4sbSxzKSk7Y29uc3QgbD1PdChvWzBdLG9bMV0scyksYz1PdChvWzFdLG9bMl0scyk7dS5zZXRFKE90KGwsYyxzKSl9ZWxzZXtjb25zdCB0PVF0KGlbMF0saVsxXSxzKSxlPVF0KGlbMV0saVsyXSxzKTthLnNldEUoUXQodCxlLHMpKTtjb25zdCBuPVF0KHJbMF0sclsxXSxzKSxtPVF0KHJbMV0sclsyXSxzKTtoLnNldEUoUXQobixtLHMpKTtjb25zdCBsPVF0KG9bMF0sb1sxXSxzKSxjPVF0KG9bMV0sb1syXSxzKTt1LnNldEUoUXQobCxjLHMpKX1hLmRpdlRoaXNFKHUpLGguZGl2VGhpc0UodSk7Y29uc3QgbT1uZXcgSihhLnZhbHVlKCksaC52YWx1ZSgpKTtiaChbdFswXS52YWx1ZSgpLHRbMV0udmFsdWUoKSx0WzJdLnZhbHVlKCldLG0pLG4ueC5zZXQobS54LGEuZXBzKCkpLG4ueS5zZXQobS55LGguZXBzKCkpfWZ1bmN0aW9uIGRoKHQsZSxzLG4pe2NvbnN0IGk9cy5sdGUoUnQpP3J0LmxlcnBMbzpydC5sZXJwSGksW3IsbyxhXT1bZS5tYXAoKGUscyk9PnRbc10ueC5tdWwoZSkpLGUubWFwKChlLHMpPT50W3NdLnkubXVsKGUpKSxlXS5tYXAoKFt0LGUsbl0pPT5pKGkodCxlLHMpLGkoZSxuLHMpLHMpKSxoPW5ldyBKKHIuZGl2VGhpcyhhKS52YWx1ZSgpLG8uZGl2VGhpcyhhKS52YWx1ZSgpKTtiaCh0Lm1hcCh0PT50LmFzUG9pbnQyRCgpKSxoKSxuLng9cnQuY29uc3RydWN0RG91YmxlKGgueCksbi55PXJ0LmNvbnN0cnVjdERvdWJsZShoLnkpfWZ1bmN0aW9uIF9oKHQsZSl7cmV0dXJuIGUuc2V0Q29vcmRzKHQueC90LnosdC55L3QueiksdC56fWZ1bmN0aW9uIHBoKHQsZSxzLG4saSl7aWYoaSl7aWYoczwwKXtyZXR1cm4gdm9pZCBwcyhuZXcgZm0oe3N0YXJ0OnRbMF0sZW5kOnRbMF0uYWRkKEFhKHQsZSwwKS5nZXRVbml0VmVjdG9yKCkpfSkscyxuKX1pZihzPjEpe3JldHVybiB2b2lkIHBzKG5ldyBmbSh7c3RhcnQ6dFsyXSxlbmQ6dFsyXS5hZGQoQWEodCxlLDEpLmdldFVuaXRWZWN0b3IoKSl9KSxzLTEsbil9fWxoKHQsZSxzLG4pfWZ1bmN0aW9uIGZoKHQsZSxzLG4pe24uc2V0RW1wdHkoKTtjb25zdCBpPVtdO2kucHVzaChuZXcgVSgwLDEpKTtjb25zdCByPS41Kk1hdGgubWF4KHMud2lkdGgoKSxzLmhlaWdodCgpKTtmb3IoO2kubGVuZ3RoOyl7Y29uc3Qgbz1pLmF0KC0xKTtpLnBvcCgpO2NvbnN0IGE9bmV3IHdlO2lmKGphKHQsZSxvLGEpLGEuaXNJbnRlcnNlY3RpbmdXKHMpKXtjb25zdCB0PU1hdGgubWF4KGEud2lkdGgoKSxhLmhlaWdodCgpKTtpZihzLmNvbnRhaW5zVyhhKXx8dDw9cnx8by53aWR0aCgpPDFlLTEyKW4ubWVyZ2Uobyk7ZWxzZXtjb25zdCB0PW8uZ2V0Q2VudGVyKCk7aS5wdXNoKFUuY29uc3RydWN0KG8udm1pbix0KSksaS5wdXNoKFUuY29uc3RydWN0KHQsby52bWF4KSl9fX19ZnVuY3Rpb24gUGgodCl7cmV0dXJuIHRbMV0vTWF0aC5zcXJ0KHRbMF0qdFsyXSl9ZnVuY3Rpb24geWgodCxlKXtjb25zdCBzPU1hdGguc3FydCh0WzJdL3RbM
1F0pO3JldHVybiBlL290KHMsMSxlKX1mdW5jdGlvbiB4aCh0LGUpe2NvbnN0IHM9TWF0aC5zcXJ0KHRbMF0vdFsyXSk7cmV0dXJuIGUvb3QocywxLGUpfWZ1bmN0aW9uIENoKHQsZSxuLGkpe3MoZT49MCYmZTw9MSk7KG5ldyBZKS5zZXRDb29yZHNQb2ludDNEKHRbMF0pOyhuZXcgWSkuc2V0Q29vcmRzUG9pbnQzRCh0WzFdKTsobmV3IFkpLnNldENvb3Jkc1BvaW50M0QodFsyXSk7Y29uc3Qgcj1uZXcgWSxvPW5ldyBZLGE9bmV3IFk7d3QoMyx0WzBdLHRbMV0sZSxyKSx3dCgzLHRbMV0sdFsyXSxlLG8pLHd0KDMscixvLGUsYSk7Y29uc3QgaD10WzJdLmNsb25lKCk7biYmKG5bMF0uYXNzaWduKHRbMF0pLG5bMV0uYXNzaWduKHIpLG5bMl0uYXNzaWduKGEpKSxpJiYoaVswXS5hc3NpZ24oYSksaVsxXS5hc3NpZ24obyksaVsyXS5hc3NpZ24oaCkpfWZ1bmN0aW9uIHZoKHQsZSxuLGkpe2NvbnN0IHI9W3RbMF0sdFsxXSx0WzJdXTtzKGU+PTAmJmU8PTEmJm4hPT1pKTtjb25zdCBvPW90KHJbMF0sclsxXSxlKSxhPW90KHJbMV0sclsyXSxlKSxoPW90KG8sYSxlKTtuJiYoblswXT1yWzBdLG5bMV09byxuWzJdPWgpLGkmJihpWzBdPWgsaVsxXT1hLGlbMl09clsyXSl9ZnVuY3Rpb24gYmgodCxlKXtjb25zdCBzPVUuY29uc3RydWN0RW1wdHkoKTtzLnZtaW49cy52bWF4PXRbMF0ueCxzLm1lcmdlTmVDb29yZGluYXRlKHRbMV0ueCkscy5tZXJnZU5lQ29vcmRpbmF0ZSh0WzJdLngpLGUueD1wdChlLngscy52bWluLHMudm1heCkscy52bWluPXMudm1heD10WzBdLnkscy5tZXJnZU5lQ29vcmRpbmF0ZSh0WzFdLnkpLHMubWVyZ2VOZUNvb3JkaW5hdGUodFsyXS55KSxlLnk9cHQoZS55LHMudm1pbixzLnZtYXgpfWZ1bmN0aW9uIFNoKHQsZSl7Y29uc3Qgcz1uZXcgVTtzLnZtaW49cy52bWF4PXRbMF0ueCxzLm1lcmdlTmVDb29yZGluYXRlKHRbMV0ueCkscy5tZXJnZU5lQ29vcmRpbmF0ZSh0WzJdLngpLGVbMF0ueD1wdChlWzBdLngscy52bWluLHMudm1heCksZVsxXS54PXB0KGVbMV0ueCxzLnZtaW4scy52bWF4KSxlWzJdLng9cHQoZVsyXS54LHMudm1pbixzLnZtYXgpLHMudm1pbj1zLnZtYXg9dFswXS55LHMubWVyZ2VOZUNvb3JkaW5hdGUodFsxXS55KSxzLm1lcmdlTmVDb29yZGluYXRlKHRbMl0ueSksZVswXS55PXB0KGVbMF0ueSxzLnZtaW4scy52bWF4KSxlWzFdLnk9cHQoZVsxXS55LHMudm1pbixzLnZtYXgpLGVbMl0ueT1wdChlWzJdLnkscy52bWluLHMudm1heCl9Y29uc3QgRWg9S3QvMTgwLERoPTE4MC9LdDtmdW5jdGlvbiB3aCh0KXtsZXQgZT10O3JldHVybiBlPj0tMzYwJiZlPDcyMD8oZTwwP2UrPTM2MDplPj0zNjAmJihlLT0zNjApLGUpOihlPW5lKGUsMzYwKSxlPDAmJihlKz0zNjApLGUpfWZ1bmN0aW9uIEFoKHQpe2xldCBlPXQ7cmV0dXJuIGU9d2goZSksZT4xODAmJihlLT0zNjApLGV9ZnVuY3Rpb24gVGgodCl7cmV0dXJuIHQqRWh9ZnVuY3Rpb24gSWgodCl7cmV0dXJuIHQqRGh9ZnVuY3Rpb24gTWgodCl7Y29uc3QgZT1HdCgpO2xldCBzPXQ7cmV0dXJuIHM+PS1lJiZzPDIqZT8oczwwJiYocys9ZSkscz49ZSYmKHMtPWUpLHMpOihzPW5lKHMsZSksczwwJiYocys9ZSkscyl9ZnVuY3Rpb24gWWgodCl7Y29uc3QgZT1BdCgpO2xldCBzPXQ7cmV0dXJuIHM+LWUmJnM8PWV8fChzPU1oKHMpLHM+ZSYmKHMtPUd0KCkpKSxzfWZ1bmN0aW9uIE5oKHQsZSl7cmV0dXJuIEFoKGUtdCl9dmFyIFhoPWI7Y2xhc3MgcWggZXh0ZW5kcyBkc3tjb25zdHJ1Y3Rvcih0KXtpZih2b2lkIDA9PT10fHxidCh0LFwidmRcIikpcmV0dXJuIHN1cGVyKHt2ZDp0Py52ZCxYU3RhcnQ6MCxZU3RhcnQ6MCxYRW5kOjAsWUVuZDowfSksdGhpcy5tX3NlbWlNYWpvckF4aXM9MCx0aGlzLm1fbWlub3JNYWpvclJhdGlvPTEsdGhpcy5tX3JvdGF0aW9uPTAsdGhpcy5tX2Nvc3I9MSx0aGlzLm1fc2lucj0wLHRoaXMubV9jZW50ZXI9bmV3IEooMCwwKSx0aGlzLm1fc3dlZXBBbmdsZT0wLHRoaXMubV9zdGFydEFuZ2xlPTAsdGhpcy5tX2ludGVyaW9yPW5ldyBKKDAsMCksdm9pZCh0aGlzLm1fYml0cz0wKTtpZih0LmNvcHkpcmV0dXJuIHN1cGVyKHQpLHZvaWQodGhpcyE9PXQuY29weSYmKHRoaXMubV9jZW50ZXI9bmV3IEooMCwwKSx0aGlzLm1faW50ZXJpb3I9bmV3IEooMCwwKSx0LmNvcHkuY29weVRvSW1wbCh0aGlzKSkpO2lmKHQubW92ZSlzdXBlcih0KSx0aGlzLm1fc2VtaU1ham9yQXhpcz10Lm1vdmUubV9zZW1pTWFqb3JBeGlzLHRoaXMubV9taW5vck1ham9yUmF0aW89dC5tb3ZlLm1fbWlub3JNYWpvclJhdGlvLHRoaXMubV9yb3RhdGlvbj10Lm1vdmUubV9yb3RhdGlvbix0aGlzLm1fY29zcj10Lm1vdmUubV9jb3NyLHRoaXMubV9zaW5yPXQubW92ZS5tX3NpbnIsdGhpcy5tX2NlbnRlcj10Lm1vdmUubV9jZW50ZXIuY2xvbmUoKSx0aGlzLm1fc3dlZXBBbmdsZT10Lm1vdmUubV9zd2VlcEFuZ2xlLHRoaXMubV9zdGFydEFuZ2xlPXQubW92ZS5tX3N0YXJ0QW5nbGUsdGhpcy5tX2ludGVyaW9yPXQubW92ZS5tX2ludGVyaW9yLmNsb25lKCksdGhpcy5tX2JpdHM9dC5tb3ZlLm1fYml0cyx0aGlzLm1fY2FjaGVkVmFsdWVzPXQubW92ZS5tX2NhY2hlZFZhbHVlcyx0Lm1vdmUubV9jYWNoZWRWYWx1ZXM9bnVsbDtlbHNle2lmKHQuZnJvbVBvaW50KXJldHVybiBzdXBlcih7WFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHRoaXMubV9jZW50ZXI9bmV3IEooMCwwKSx0aGlzLm1faW50ZXJpb3I9bmV3IEooMCwwKSx2b2lkIHRoaXMuY29uc3RydWN0Q2lyY3VsYXJBcmNUaHJlZVBvaW50KHQuZnJvbVBvaW50LHQudG9Qb2ludCx0LmludGVyaW9yUG9pbnQpO2lmKHQuY2VudGVyKXJldHVybiBzdXBlcih7WFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHRoaXMubV9jZW50ZXI9bmV3IEooMCwwKSx0aGlzLm1faW50ZXJpb3I9bmV3IEooMCwwKSx2b2lkIHRoaXMuY29uc3RydWN0Q2lyY2xlUmFkaXVzKHQucmFkaXVzLHQuY2VudGVyLHQuYklzQ291bnRlckNsb2Nrd2lzZSk7aWYodC5zZW1pTWFqb3JBeGlzKXJldHVybi
1BzdXBlcih7WFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pLHZvaWQgdGhpcy5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50cyh0LmZyb21Qb2ludCx0LnRvUG9pbnQsdC5zZW1pTWFqb3JBeGlzLHQubWlub3JNYWpvclJhdGlvLHQuYXhpc1hSb3RhdGlvblJhZCx0LmJCaWdBcmMsdC5iSXNDb3VudGVyQ2xvY2t3aXNlKX19Z2V0Qm91bmRhcnkoKXtyZXR1cm4gJHModGhpcyl9YXNzaWduQ29weSh0KXtyZXR1cm4gdGhpcyE9PXQmJnQuY29weVRvKHRoaXMpLHRoaXN9Y29uc3RydWN0Q2lyY2xlUmFkaXVzKHQsZSxzPSExKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RFbGxpcHNlKHQsMSxlLDAscyksdGhpcy5zZXRQcm9qZWN0aW9uQmVoYXZpb3IoMCksdGhpcy5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpLHRoaXN9Y29uc3RydWN0Q2lyY2xlQ2VudGVyQW5kUG9pbnQodCxlLHM9ITEpe2NvbnN0IG49Si5kaXN0YW5jZSh0LGUpO3JldHVybiB0aGlzLmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKGUsZSxuLDEsMCwhMCxzLHQpLHRoaXMuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDApLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSx0aGlzfWNvbnN0cnVjdFR3b1BvaW50Q2lyY2xlKHQsZSxzPSExKXtjb25zdCBuPUoubGVycCh0LGUsLjUpO3JldHVybiB0aGlzLmNvbnN0cnVjdENpcmNsZUNlbnRlckFuZFBvaW50KG4sdCxzKSx0aGlzfWNvbnN0cnVjdExpbmVFbGxpcHRpY0FyYyh0LGUpe3JldHVybiBTdSh0aGlzLHQsZSwxKSx0aGlzfWNvbnN0cnVjdExpbmVDaXJjdWxhckFyYyh0LGUpe3JldHVybiBTdSh0aGlzLHQsZSwwKSx0aGlzfWNvbnN0cnVjdEVsbGlwc2UodCxlLHMsbixpPSExKXt0aGlzLm1fc2VtaU1ham9yQXhpcz1NYXRoLmFicyh0KSx0aGlzLm1fbWlub3JNYWpvclJhdGlvPU1hdGguYWJzKGUpLHRoaXMubV9taW5vck1ham9yUmF0aW8+MSYmKHRoaXMubV9zZW1pTWFqb3JBeGlzKj10aGlzLm1fbWlub3JNYWpvclJhdGlvLHRoaXMubV9taW5vck1ham9yUmF0aW89MS90aGlzLm1fbWlub3JNYWpvclJhdGlvKTtjb25zdCByPW5ldyBKKDAsdGhpcy5tX21pbm9yTWFqb3JSYXRpbyp0aGlzLm1fc2VtaU1ham9yQXhpcyksbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pO3JldHVybiByLnJvdGF0ZURpcmVjdChvLGEpLHIuYWRkVGhpcyhzKSx0aGlzLmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKHIscix0aGlzLm1fc2VtaU1ham9yQXhpcyx0aGlzLm1fbWlub3JNYWpvclJhdGlvLG4sITAsaSxzKSx0aGlzfWluZmxhdGUodCl7aWYodGhpcy5pc0RlZ2VuZXJhdGVUb0xpbmUoKSlyZXR1cm47bGV0IGU9dGhpcy5nZXRTZW1pTWlub3JBeGlzKCkrdDtpZihlPWU8PTA/MDoodGhpcy5nZXRTZW1pTWFqb3JBeGlzKCkrdCkvdGhpcy5nZXRTZW1pTWFqb3JBeGlzKCksdGhpcy5pc0NpcmN1bGFyKCkpe2NvbnN0IHQ9bmV3IGNlO3Quc2V0U2hpZnRDb29yZHMoLXRoaXMubV9jZW50ZXIueCwtdGhpcy5tX2NlbnRlci55KSx0LnNjYWxlKGUsZSksdC5zaGlmdENvb3Jkcyh0aGlzLm1fY2VudGVyLngsdGhpcy5tX2NlbnRlci55KSx0aGlzLmFwcGx5VHJhbnNmb3JtYXRpb24odCl9ZWxzZXtjb25zdCB0PW5ldyBjZTt0aGlzLmNhbm9uaWNUb1dvcmxkVHJhbnNmb3JtYXRpb24odCk7Y29uc3Qgcz10LmNsb25lKCk7cy5pbnZlcnRQcmVjaXNlVGhpcygpLHMuc2NhbGUoZSxlKSxzLm11bHRpcGx5KHQpLHRoaXMuYXBwbHlUcmFuc2Zvcm1hdGlvbihzKX19Y29uc3RydWN0RW5jbG9zaW5nQ2lyY2xlKHQsZSxzPSExKXtyZXR1cm4gWnUodGhpcyx0LGUscyksdGhpc31jb25zdHJ1Y3RUaHJlZVBvaW50Q2lyY2xlKHQsZSxzLG49ITEpe2lmKHQuZXF1YWxzKGUpfHxlLmVxdWFscyhzKXx8dC5lcXVhbHMocykpe2NvbnN0IGk9dC5jbG9uZSgpLHI9ZS5jbG9uZSgpLG89cy5jbG9uZSgpO3JldHVybiBpLmVxdWFscyhyKSYmci5hc3NpZ24obyksdGhpcy5jb25zdHJ1Y3RUd29Qb2ludENpcmNsZShpLHIsbil9e2NvbnN0IGk9Si5jYWxjdWxhdGVDaXJjbGVDZW50ZXJGcm9tVGhyZWVQb2ludHModCxlLHMpO2lmKCFpLmlzRmluaXRlKCl8fCFOdW1iZXIuaXNGaW5pdGUoSi5kaXN0YW5jZSh0LGkpKSl7Y29uc3Qgbj1KLmRpc3RhbmNlKHQsZSksaT1KLmRpc3RhbmNlKHQscyk7dGhpcy5jb25zdHJ1Y3RMaW5lQ2lyY3VsYXJBcmModCxuPj1pP2U6cyl9cmV0dXJuIHRoaXMuY29uc3RydWN0Q2lyY2xlQ2VudGVyQW5kUG9pbnQoaSx0LG4pfX1jb25zdHJ1Y3RDaXJjdWxhckFyY1RocmVlUG9pbnQodCxlLHMpe2NvbnN0IG49bmV3IGh0KHQueCksaT1uZXcgaHQoZS54KSxyPW5ldyBodChzLngpLG89bmV3IGh0KHQueSksYT1uZXcgaHQoZS55KSxoPW5ldyBodChzLnkpLHU9bmV3IGh0KC41KSxtPWkuc3ViRShuKSxsPWEuc3ViRShvKSxjPXIuc3ViRShuKSxnPWguc3ViRShvKSxkPW0ubXVsRShnKS5zdWJUaGlzRShsLm11bEUoYykpO2lmKGQuc2NhbGVFcnJvcigxMCksZC5pc1plcm8oKSl7aWYoIW0uaXNaZXJvKCl8fCFsLmlzWmVybygpKXJldHVybiBTdSh0aGlzLHQsZSwwKSx0aGlzO3tjb25zdCBuPXQuY2xvbmUoKS5hZGRUaGlzKGUpLm11bFRoaXMoLjUpLmFkZFRoaXMocykubXVsVGhpcyguNSksaT1zLnN1YihuKS5sZW5ndGgoKTt0aGlzLmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKHQsZSxpLDEsMCwhMCwhMSxuKSx0aGlzLm1faW50ZXJpb3IuYXNzaWduKHMpfXJldHVybiB0aGlzLnNldFByb2plY3Rpb25CZWhhdmlvcigwKSx0aGlzfWNvbnN0IF89bS5zcXIoKS5hZGRUaGlzRShsLnNxcigpKS5tdWxUaGlzRSh1KSxwPWMuc3FyKCkuYWRkVGhpc0UoZy5zcXIoKSkubXVsVGhpc0UodSksZj1fLm11bEUoZykuc3ViVGhpc0UocC5tdWxFKGwpKSxQPW0ubXVsRShwKS5zdWJUaGlzRShjLm11bEUoXykpO2YuZGl2VGhpc0UoZCksUC5kaXZUaGlzRShkKTtjb25zdCB5PWYuc3FyKCkuYWRkVGhpc0UoUC5zcXIoKSk7eS5zcXJ0VGhpcygpO2NvbnN0IHg9Zi5hZGRFKG4pLEM9UC5hZGRFKG8pO2xldCB2PXQueC14LnZhbHVlKCksYj10LnktQy52YWx1ZSgpO2NvbnN0IFM9TWF0aC5hdGFuMihiLHYpO3Y9ZS54LXgudmFsdWUoKSxiPWUueS1DLnZhbHVlKCk7Y29uc3QgRT1NYXRoLmF0YW4yKGIsdik7dj1zLngteC52YWx1ZSgpLGI9cy55LUMudmFsdWUoKTtjb25zdCBEPU1hdGguYXRhbjIoYix2KTtsZXQgdz1ELTIqQXQoKTtmb3IoO3c8Uzspdys9MipBdCgpO2xldCBBPUUtMipBdCgpO2Zvcig7QTx3OylBKz0yKkF0KCk7bGV0IFQ9RCsyKkF0KCk7Zm9yKDtUPlM7KVQtPTIqQXQoKTtsZXQgSSxNPUUrMipBdCgpO2Zvcig7TT5UOylNLT0yKkF0KCk7ST1BLVM8Uy1NP0EtUzpNLVM7Y29uc3QgWT1uZXcgSih4LnZhbHVlKCksQy52YWx1ZSgpKTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcih0LGUseS52YWx1ZSgpLDEsMCxNYXRoLmFicyhJKT5BdCgpLEk+MCxZKSx0aGlzLm1faW50ZXJpb3IuYXNzaWduKHMpLHRoaXMuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDApLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSx0aGlzfWNvbnN0cnVjdENpcmN1bGFyQXJjKHQsZSxzLG4pe3JldHVybiB0aGlzLmNvbnN0cnVjdEVsbGlwdGljQXJjR2VuZXJhbCh0LDEsZSxzLG4sMCksdGhpcy5zZXRQcm9qZWN0aW9uQmVoYXZpb3IoMCksdGhpcy5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpLHRoaXN9Y29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHModCxlLHMsbixpLHIsbyl7cmV0dXJuIGJ1KHRoaXMsdCxlLHMsbixpLHIsbyl9Y29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHNDZW50ZXIodCxlLHMsbixpLHIsbyxhKXtyZXR1cm4gYnUodGhpcyx0LGUscyxuLGkscixvLGEpfWNvbnN0cnVjdEVsbGlwdGljQXJjR2VuZXJhbCh0LGUscyxuLGkscil7dGhpcy5tX3NlbWlNYWpvckF4aXM9TWF0aC5hYnModCksdGhpcy5tX21pbm9yTWFqb3JSYXRpbz1NYXRoLmFicyhlKSx0aGlzLm1fbWlub3JNYWpvclJhdGlvPjEmJih0aGlzLm1fc2VtaU1ham9yQXhpcyo9dGhpcy5tX21pbm9yTWFqb3JSYXRpbyx0aGlzLm1fbWlub3JNYWpvclJhdGlvPTEvdGhpcy5tX21pbm9yTWFqb3JSYXRpbyk7Y29uc3Qgbz1ZaChyKSxhPU1hdGguY29zKG8pLGg9TWF0aC5zaW4obyksdT1uZXcgSih0aGlzLm1fc2VtaU1ham9yQXhpcyx0aGlzLm1fbWlub3JNYWpvclJhdGlvKnRoaXMubV9zZW1pTWFqb3JBeGlzKSxtPUouZ2V0TkFOKCksbD1ZaChuKTttLng9dS54Kk1hdGguY29zKGwpLG0ueT11LnkqTWF0aC5zaW4obCksbS5yb3RhdGVEaXJlY3QoYSxoKSxtLmFkZFRoaXMocyk7Y29uc3QgYz1rdChpLEd0KCkpO2xldCBnPWM7TWF0aC5hYnMoZyk9PT1HdCgpJiYoZz0wKTtjb25zdCBkPUouZ2V0TkFOKCk7cmV0dXJuIGQueD11LngqTWF0aC5jb3MobCtnKSxkLnk9dS55Kk1hdGguc2luKGwrZyksZC5yb3RhdGVEaXJlY3QoYSxoKSxkLmFkZFRoaXMocyksdGhpcy5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcihtLGQsdGhpcy5tX3NlbWlNYWpvckF4aXMsdGhpcy5tX21pbm9yTWFqb3JSYXRpbyxvLE1hdGguYWJzKGMpPkF0KCksYz4wLHMpfWNvbnN0cnVjdEVsbGlwdGljQXJjQXNOVVJCKHQscyxuLGkpeyhpPj0xfHxpPDApJiZlKFwiY29uc3RydWN0X2VsbGlwdGljX2FyY19hc19OVVJCOiB3ZWlnaHRcIikscy5pc0Zpbml0ZSgpfHxlKFwiY29uc3RydWN0X2VsbGlwdGljX2FyY19hc19OVVJCOiBjb250cm9sX3BvaW50XCIpO3JldHVybiBHdShbdCxzLG5dLGkqaSxudWxsLCExLHRoaXMpLHRoaXN9Y29uc3RydWN0Q2Fub25pYyh0KXtyZXR1cm4gdGhpcy5hc3NpZ25Db3B5KHQpLHQuaXNEZWdlbmVyYXRlVG9MaW5lKCl8fHQubV9jZW50ZXIuaXNFcXVhbCgwLDApJiYwPT09dGhpcy5tX3JvdGF0aW9ufHwodGhpcy5tX1hTdGFydD10LmdldFNlbWlNYWpvckF4aXMoKSpNYXRoLmNvcyh0Lm1fc3RhcnRBbmdsZSksdGhpcy5tX1lTdGFydD10LmdldFNlbWlNaW5vckF4aXMoKSpNYXRoLnNpbih0Lm1fc3RhcnRBbmdsZSksdGhpcy5tX1hFbmQ9dC5nZXRTZW1pTWFqb3JBeGlzKCkqTWF0aC5jb3ModC5nZXRFbmRBbmdsZSgpKSx0aGlzLm1fWUVuZD10LmdldFNlbWlNaW5vckF4aXMoKSpNYXRoLnNpbih0LmdldEVuZEFuZ2xlKCkpLHRoaXMubV9
1jZW50ZXIuc2V0Q29vcmRzKDAsMCksdGhpcy5tX3JvdGF0aW9uPTAsdGhpcy5tX2Nvc3I9MSx0aGlzLm1fc2lucj0wLFV1KHRoaXMpLHRoaXMuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSx0IT09dGhpcyYmbnModGhpcyx0KSksdGhpc31pc0NpcmN1bGFyKCl7cmV0dXJuIDE9PT10aGlzLm1fbWlub3JNYWpvclJhdGlvJiYwPT09dGhpcy5tX3JvdGF0aW9uJiYhdGhpcy5pc0RlZ2VuZXJhdGVUb0xpbmUoKX1pc0RlZ2VuZXJhdGVUb0xpbmVIZWxwZXIodCl7aWYodGhpcy5pc0xpbmUoKSlyZXR1cm4hMDtpZih0aGlzLmlzTWFqb3IoKSlyZXR1cm4hMTtjb25zdCBlPXRoaXMuZ2V0RW5kWFkoKS5zdWIodGhpcy5nZXRTdGFydFhZKCkpLmxlbmd0aCgpO3JldHVybiEodGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpLWU+dCl9aXNEZWdlbmVyYXRlVG9MaW5lKCl7cmV0dXJuIEV1KHRoaXMpfWdldENlbnRlcigpe3JldHVybiB0aGlzLm1fY2VudGVyLmNsb25lKCl9c2V0Q2VudGVyKHQpe2lmKCF0aGlzLm1fY2VudGVyLmlzTkFOKCkpe2NvbnN0IGU9dC5zdWIodGhpcy5tX2NlbnRlcik7dGhpcy5tX1hTdGFydCs9ZS54LHRoaXMubV9ZU3RhcnQrPWUueSx0aGlzLm1fWEVuZCs9ZS54LHRoaXMubV9ZRW5kKz1lLnksdGhpcy5tX2ludGVyaW9yLmFkZFRoaXMoZSksdGhpcy5tX2NlbnRlci5hc3NpZ24odCksdGhpcy5lbmRQb2ludE1vZGlmaWVkKCksdGhpcy5ub3JtYWxpemVBZnRlckVuZHBvaW50Q2hhbmdlKCl9fWdldEF4aXNYUm90YXRpb24oKXtyZXR1cm4gdGhpcy5tX3JvdGF0aW9ufWdldFNlbWlBeGVzKCl7cmV0dXJuIEouY29uc3RydWN0KHRoaXMubV9zZW1pTWFqb3JBeGlzLHRoaXMubV9zZW1pTWFqb3JBeGlzKnRoaXMubV9taW5vck1ham9yUmF0aW8pfWdldFNlbWlNYWpvckF4aXMoKXtyZXR1cm4gdGhpcy5tX3NlbWlNYWpvckF4aXN9Z2V0U2VtaU1pbm9yQXhpcygpe3JldHVybiB0aGlzLm1fc2VtaU1ham9yQXhpcyp0aGlzLm1fbWlub3JNYWpvclJhdGlvfWdldE1pbm9yTWFqb3JSYXRpbygpe3JldHVybiB0aGlzLm1fbWlub3JNYWpvclJhdGlvfWlzQ2xvY2t3aXNlKCl7cmV0dXJuIXF1KHRoaXMpfWlzTWFqb3IoKXtyZXR1cm4gVnUodGhpcyl9Z2V0U3dlZXBBbmdsZSgpe3JldHVybiB0aGlzLm1fc3dlZXBBbmdsZX1nZXRTdGFydEFuZ2xlKCl7cmV0dXJuIHRoaXMubV9zdGFydEFuZ2xlfWdldEVuZEFuZ2xlKCl7cmV0dXJuIHRoaXMubV9zdGFydEFuZ2xlK3RoaXMubV9zd2VlcEFuZ2xlfWdldEdlb21ldHJ5VHlwZSgpe3JldHVybiBpLmVudW1FbGxpcHRpY0FyY31xdWVyeUVudmVsb3BlKHQpe2lmKDQ9PT10Lm1fRW52ZWxvcGVUeXBlKXt0LnNldEVtcHR5KCksdC5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pO2NvbnN0IGU9bGUuY29uc3RydWN0RW1wdHkoKTt0aGlzLnF1ZXJ5RW52ZWxvcGUoZSksdC5zZXRFbnZlbG9wZShlKTtmb3IobGV0IHM9MSxuPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO3M8bjtzKyspe2NvbnN0IGU9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhzKTtmb3IobGV0IG49MCxpPVhoLmdldENvbXBvbmVudENvdW50KGUpO3M8aTtzKyspe2NvbnN0IHM9dGhpcy5xdWVyeUludGVydmFsKGUsbik7dC5zZXRJbnRlcnZhbEVudmVsb3BlKGUsbixzKX19fWVsc2UgMj09PXQubV9FbnZlbG9wZVR5cGU/JHUodGhpcyxVLnVuaXQoKSx0KTphKFwiM2Qgbm90IGltcGxcIil9YXBwbHlUcmFuc2Zvcm1hdGlvbih0KXtUdSh0aGlzLHQsITEsbnVsbCxudWxsKX1jcmVhdGVJbnN0YW5jZSgpe3JldHVybiBuZXcgcWh9Y2FsY3VsYXRlTGVuZ3RoMkQoKXtyZXR1cm4gZnUodGhpcywwLDEpfXF1ZXJ5Q29udHJvbFBvaW50c0hlbHBlcih0KXtoKFwiXCIpfXF1ZXJ5Q29vcmQyRCh0LGUpe2lmKEV1KHRoaXMpKWZzKHQsdGhpcy5nZXRTdGFydFhZKCksdGhpcy5nZXRFbmRYWSgpLGUpO2Vsc2UgaWYoMD09PXQpZS5hc3NpZ24oSi5jb25zdHJ1Y3QodGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0KSk7ZWxzZSBpZigxPT09dCllLmFzc2lnbihKLmNvbnN0cnVjdCh0aGlzLm1fWEVuZCx0aGlzLm1fWUVuZCkpO2Vsc2V7Y29uc3Qgcz1ndSh0aGlzLHQpLG49bmV3IEoodGhpcy5tX3NlbWlNYWpvckF4aXMqTWF0aC5jb3MocyksdGhpcy5nZXRTZW1pTWlub3JBeGlzKCkqTWF0aC5zaW4ocykpO24ucm90YXRlRGlyZWN0KHRoaXMubV9jb3NyLHRoaXMubV9zaW5yKSxuLmFkZFRoaXModGhpcy5tX2NlbnRlciksZS5hc3NpZ24obil9fXF1ZXJ5Q29vcmQyREUodCxlKXtpdSh0aGlzLHQsZSl9cXVlcnlDb29yZDJETVAodCxlKXthKFwiXCIpfWdldENvb3JkWCh0KXtjb25zdCBlPW5ldyBKO3JldHVybiB0aGlzLnF1ZXJ5Q29vcmQyRCh0LGUpLGUueH1nZXRDb29yZFkodCl7Y29uc3QgZT1uZXcgSjtyZXR1cm4gdGhpcy5xdWVyeUNvb3JkMkQodCxlKSxlLnl9Y3V0KHQsZSxzKXtjb25zdCBuPW5ldyBQbTtyZXR1cm4gdGhpcy5xdWVyeUN1dCh0LGUsbixzKSxuLnJlbGVhc2VTZWdtZW50KCl9cXVlcnlDdXQodCxlLHMsbil7Y29uc3QgaT1zLmNyZWF0ZUVsbGlwdGljQXJjKCk7biYmaS5kcm9wQWxsQXR0cmlidXRlcygpO2xldCByPTA9PT10JiYxPT09ZTtpZihyJiYhbilyZXR1cm4gdm9pZCB0aGlzLmNvcHlUbyhpKTtjb25zdCBvPUouZ2V0TkFOKCk7dGhpcy5xdWVyeUNvb3JkMkQodCxvKTtjb25zdCBhPUouZ2V0TkFOKCk7aWYodGhpcy5xdWVyeUNvb3JkMkQoZSxhKSwhcilpZihvLmVxdWFscyhhKSllLXQ+LjUmJnRoaXMuaXNNYWpvcigpJiZ0aGlzLmlzQ2xvc2VkKCk/KHI9ITAsdD0wLGU9MSk6MT09PWU/dD1lOmU9dDtlbHNlIGlmKHQ+MCYmby5pc0VxdWFsKHRoaXMubV9YU3RhcnQsdGhpcy5tX1lTdGFydCkmJih0PTApLGU8MSYmYS5pc0VxdWFsKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kKSYmKGU9MSkscj0wPT09dCYmMT09PWUsciYmIW4pcmV0dXJuIHZvaWQgdGhpcy5jb3B5VG8oaSk7aWYoaS5tX2NlbnRlci5hc3NpZ24odGhpcy5tX2NlbnRlciksaS5tX3NlbWlNYWpvckF4aXM9dGhpcy5tX3NlbWlNYWpvckF4aXMsaS5tX21pbm9yTWFqb3JSYXRpbz10aGlzLm1fbWlub3JNYWpvclJhdGlvLGkubV9pbnRlcmlvci5hc3NpZ24odGhpcy5tX2ludGVyaW9yKSxpLm1fcm90YXRpb249dGhpcy5tX3JvdGF0aW9uLGkubV9jb3NyPXRoaXMubV9
1jb3NyLGkubV9zaW5yPXRoaXMubV9zaW5yLGkubV9zd2VlcEFuZ2xlPXRoaXMubV9zd2VlcEFuZ2xlLGkubV9zdGFydEFuZ2xlPXRoaXMubV9zdGFydEFuZ2xlLGkubV9iaXRzPXRoaXMubV9iaXRzLFplKGksby54LG8ueSksVWUoaSxhLngsYS55KSxyKXJldHVybiB2b2lkIE11KGksUHUodGhpcykpO2kubV9zdGFydEFuZ2xlPWd1KHRoaXMsdCksaS5tX3N3ZWVwQW5nbGU9Z3UodGhpcyxlKS1pLm1fc3RhcnRBbmdsZSxpLm1fc3RhcnRBbmdsZT1odShpLm1fc3RhcnRBbmdsZSksRnUoaSxNYXRoLmFicyhpLm1fc3dlZXBBbmdsZSk+QXQoKSksbiYmaS5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbih0aGlzLm1fZGVzY3JpcHRpb24pLFV1KGkpLGx1KGkpO2NvbnN0IGg9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7aWYoaD4xJiYhbil7Zm9yKGxldCBlPTE7ZTxoO2UrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKGUpLG49WGguZ2V0Q29tcG9uZW50Q291bnQocyk7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3Qgbj10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKHQscyxlKTtpLnNldFN0YXJ0QXR0cmlidXRlKHMsZSxuKX19Zm9yKGxldCB0PTE7dDxoO3QrKyl7Y29uc3Qgcz10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHQpLG49WGguZ2V0Q29tcG9uZW50Q291bnQocyk7Zm9yKGxldCB0PTA7dDxuO3QrKyl7Y29uc3Qgbj10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKGUscyx0KTtpLnNldEVuZEF0dHJpYnV0ZShzLHQsbil9fX1pLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCl9cXVlcnlEZXJpdmF0aXZlKHQsZSl7bm0odGhpcyx0LGUpfWN1dEFyY0lnbm9yZUF0dHJpYnV0ZXModCxlLHMpe2xldCBuPTA9PT10JiYxPT09ZTtjb25zdCBpPW5ldyBKO3RoaXMucXVlcnlDb29yZDJEKHQsaSk7Y29uc3Qgcj1uZXcgSjt0aGlzLnF1ZXJ5Q29vcmQyRChlLHIpLG58fChpLmVxdWFscyhyKT9lLXQ+LjUmJnRoaXMuaXNNYWpvcigpJiZ0aGlzLmlzQ2xvc2VkKCk/KG49ITAsdD0wLGU9MSk6MT09PWU/dD1lOmU9dDoodD4wJiZpLmlzRXF1YWwodGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0KSYmKHQ9MCksZTwxJiZyLmlzRXF1YWwodGhpcy5tX1hFbmQsdGhpcy5tX1lFbmQpJiYoZT0xKSxuPTA9PT10JiYxPT09ZSkpLHMubV9jZW50ZXIuYXNzaWduKHRoaXMubV9jZW50ZXIpLHMubV9zZW1pTWFqb3JBeGlzPXRoaXMubV9zZW1pTWFqb3JBeGlzLHMubV9taW5vck1ham9yUmF0aW89dGhpcy5tX21pbm9yTWFqb3JSYXRpbyxzLm1faW50ZXJpb3IuYXNzaWduKHRoaXMubV9pbnRlcmlvcikscy5tX3JvdGF0aW9uPXRoaXMubV9yb3RhdGlvbixzLm1fY29zcj10aGlzLm1fY29zcixzLm1fc2lucj10aGlzLm1fc2lucixzLm1fc3dlZXBBbmdsZT10aGlzLm1fc3dlZXBBbmdsZSxzLm1fc3RhcnRBbmdsZT10aGlzLm1fc3RhcnRBbmdsZSxzLm1fYml0cz10aGlzLm1fYml0cyxaZShzLGkueCxpLnkpLFVlKHMsci54LHIueSksbj9NdShzLFB1KHRoaXMpKToocy5tX3N0YXJ0QW5nbGU9Z3UodGhpcyx0KSxzLm1fc3dlZXBBbmdsZT1ndSh0aGlzLGUpLXMubV9zdGFydEFuZ2xlLHMubV9zdGFydEFuZ2xlPWh1KHMubV9zdGFydEFuZ2xlKSxGdShzLE1hdGguYWJzKHMubV9zd2VlcEFuZ2xlKT5NYXRoLlBJKSxVdShzKSxzLmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCkpfWNoYW5nZUVuZFBvaW50czJEKHQsZSl7eHUodGhpcyx0LGUsITEpfWdldEF0dHJpYnV0ZUFzRGJsKHQsZSxzKXtpZigwPT09ZSlyZXR1cm4gMD09PXM/dGhpcy5nZXRDb29yZFgodCk6dGhpcy5nZXRDb29yZFkodCk7aWYoMD09PXQpcmV0dXJuIHRoaXMuZ2V0U3RhcnRBdHRyaWJ1dGVBc0RibChlLHMpO2lmKDE9PT10KXJldHVybiB0aGlzLmdldEVuZEF0dHJpYnV0ZUFzRGJsKGUscyk7Y29uc3Qgbj10aGlzLmNhbGN1bGF0ZUxlbmd0aDJEKCksaT1uPjA/dGhpcy50VG9MZW5ndGgodCkvbjowLHI9WGguZ2V0SW50ZXJwb2xhdGlvbihlKSxvPXRoaXMuZ2V0U3RhcnRBdHRyaWJ1dGVBc0RibChlLHMpLGE9dGhpcy5nZXRFbmRBdHRyaWJ1dGVBc0RibChlLHMpO3JldHVybiB2dChyLG8sYSxpLFhoLmdldERlZmF1bHRWYWx1ZShlKSl9Z2V0Q2xvc2VzdENvb3JkaW5hdGUodCxlKXtyZXR1cm4gdG0odGhpcyx0LFUudW5pdCgpLGUpfWdldENsb3Nlc3RDb29yZGluYXRlT25JbnRlcnZhbCh0LGUscz0tMSl7cmV0dXJuIHRtKHRoaXMsdCxlLCExKX1nZXRZTW9ub3RvbmljUGFydHModCxuPSExKXt0Lmxlbmd0aDwyJiZlKFwiXCIpO2NvbnN0IGk9dGhpcy5nZXRTZW1pQXhlcygpLHI9TWF0aC5hdGFuMihpLnkqdGhpcy5tX2Nvc3IsaS54KnRoaXMubV9zaW5yKSxvPXIrQXQoKSxhPU8oMyxOdW1iZXIuTmFOKTtsZXQgaD0wO2lmKGFbMF09Y3UodGhpcyxyKSxhWzBdPjAmJmFbMF08MSYmaCsrLGFbMV09Y3UodGhpcyxvKSxhWzFdPjAmJmFbMV08MSYmKGFbaF09YVsxXSxoKyspLDA9PT1oKXJldHVybiAwO2FbaF09MSxoKysscyh0Lmxlbmd0aD49aCk7bGV0IHU9MDtmb3IobGV0IGU9MDtlPGg7ZSsrKXtjb25zdCBzPWFbZV07dGhpcy5xdWVyeUN1dCh1LHMsdFtlXSxuKSx1PXN9cmV0dXJuIGh9Z2V0TW9ub3RvbmljUGFydHModCxuKXtpZih0Lmxlbmd0aDw0JiZlKFwiXCIpLHRoaXMuaXNEZWdlbmVyYXRlVG9MaW5lKCkpcmV0dXJuIHRbMF0uY3JlYXRlRWxsaXB0aWNBcmMoKS5hc3NpZ25Db3B5KHRoaXMpLG4mJnRbMF0uZ2V0KCkuZHJvcEFsbEF0dHJpYnV0ZXMoKSwxO2NvbnN0IGk9dGhpcy5nZXRTZW1pQXhlcygpLHI9Tyg0LE51bWJlci5OYU4pO3JbMF09TWF0aC5hdGFuMihpLnkqdGhpcy5tX2Nvc3IsaS54KnRoaXMubV9zaW5yKSxyWzFdPXJbMF0rQXQoKSxyWzJdPU1hdGguYXRhbjIoLWkueSp0aGlzLm1fc2lucixpLngqdGhpcy5tX2Nvc3IpLHJbM109clsyXStBdCgpO2NvbnN0IG89Tyg1LE51bWJlci5OYU4pO2xldCBhPTA7Zm9yKGxldCBlPTA7ZTw0O2UrKylvW2FdPWN1KHRoaXMscltlXSksb1thXT4wJiZvW2FdPDEmJmErKztpZigwPT09YSlyZXR1cm4gMDtEdChvLGEpLG9bYS0xXTwxJiYob1thXT0xLGErKykscyh0Lmxlbmd0aD49YSk7bGV0IGg9MDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtjb25zdCBzPW9bZV07dGhpcy5xdWVyeUN1dChoLHMsdFtlXSxuKSxoPXN9cmV0dXJuIGF9aW50ZXJzZWN0aW9uV2l0aEF4aXMyRCh0LGUscyxuKXtpZihFdSh0aGlzKSl7cmV0dXJuIG5ldyBmbSh7c3RhcnQ6dGhpcy5nZXRTdGFydFhZKCksZW5kOnRoaXMuZ2V0RW5kWFkoKX0pLmludGVyc2VjdGlvbldpdGhBeGlzMkQodCxlLHMsbil9bGV0IGkscjtjb25zdCBvPW5ldyBodChlKSxhPXRoaXMuZ2V0U2VtaUF4ZXMoKTtpZih0KXtpZihlPnRoaXMubV9
1jZW50ZXIueSthLnh8fGU8dGhpcy5tX2NlbnRlci55LWEueClyZXR1cm4gMDtpPW5ldyBodChhLngpLm11bFRoaXModGhpcy5tX3NpbnIpLHI9bmV3IGh0KGEueSkubXVsVGhpcyh0aGlzLm1fY29zciksby5zdWJUaGlzKHRoaXMubV9jZW50ZXIueSl9ZWxzZXtpZihlPnRoaXMubV9jZW50ZXIueCthLnh8fGU8dGhpcy5tX2NlbnRlci54LWEueClyZXR1cm4gMDtpPW5ldyBodChhLngpLm11bFRoaXModGhpcy5tX2Nvc3IpLHI9bmV3IGh0KGEueSkubXVsVGhpcygtdGhpcy5tX3NpbnIpLG8uc3ViVGhpcyh0aGlzLm1fY2VudGVyLngpfWNvbnN0IGg9aS5zcXIoKSx1PXIuc3FyKCksbT1oLmFkZEUodSksbD1yLm11bEUobykubXVsVGhpcygtMiksYz1vLnNxcigpLnN1YlRoaXNFKGgpLGc9bC5zcXIoKS5zdWJUaGlzRShtLm11bEUoYykubXVsVGhpcyg0KSksZD1pLm11bEUobykubXVsVGhpcygtMiksXz1vLnNxcigpLnN1YlRoaXNFKHUpLHA9ZC5zcXIoKS5zdWJUaGlzRShtLm11bEUoXykubXVsVGhpcyg0KSk7bGV0IGY9Zy5lcHMoKSpNYXRoLmFicyhwLnZhbHVlKCkpPD1wLmVwcygpKk1hdGguYWJzKGcudmFsdWUoKSk7Zj9pLmlzWmVybygpJiYoZj0hMSk6ci5pc1plcm8oKSYmKGY9ITApLGZ8fChsLnNldEUoZCksYy5zZXRFKF8pKTtjb25zdCBQPWN0KGh0LDIpO2xldCB5PWRuKG0sbCxjLFUuY29uc3RydWN0KC0xLDEpLCExLFApO2lmKDA9PT15KXJldHVybiAwO2NvbnN0IHg9WzAsMF07bGV0IEM9MDtmb3IobGV0IHY9MDt2PHk7disrKXtjb25zdCB0PW5ldyBodCxlPW5ldyBodDtmPyh0LnNldEUoUFt2XSksZS5zZXRFKG8uc3ViRShyLm11bEUoUFt2XSkpLmRpdlRoaXNFKGkpKSk6KGUuc2V0RShQW3ZdKSx0LnNldEUoby5zdWJFKGkubXVsRShQW3ZdKSkuZGl2VGhpc0UocikpKTtjb25zdCBzPWN1KHRoaXMsTWF0aC5hdGFuMih0LnZhbHVlKCksZS52YWx1ZSgpKSk7cz49MCYmczw9MSYmKHhbQ109cyxDKyspfXJldHVybiB5PUMsMD09PXk/MDooMj09PXkmJnhbMF0+eFsxXSYmKHhbMV09c3QoeFswXSx4WzBdPXhbMV0pKSxuJiYkKG4seCwwLDAseSkscyYmKHNbMF09dD90aGlzLmdldENvb3JkWCh4WzBdKTp0aGlzLmdldENvb3JkWSh4WzBdKSx5PjEmJihzWzFdPXQ/dGhpcy5nZXRDb29yZFgoeFsxXSk6dGhpcy5nZXRDb29yZFkoeFsxXSksIW4mJnNbMF0+c1sxXSYmKHNbMV09c3Qoc1swXSxzWzBdPXNbMV0pKSkpLHkpfWludGVyc2VjdGlvbk9mWU1vbm90b25pY1dpdGhBeGlzWCh0LGUpe2lmKHRoaXMubV9ZU3RhcnQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdD09PXRoaXMubV9ZU3RhcnQ/ZTpOdW1iZXIuTmFOO2lmKHQ9PT10aGlzLm1fWVN0YXJ0KXJldHVybiB0aGlzLm1fWFN0YXJ0O2lmKHQ9PT10aGlzLm1fWUVuZClyZXR1cm4gdGhpcy5tX1hFbmQ7Y29uc3Qgcz1bMCwwXTtyZXR1cm4tMT09PXRoaXMuaW50ZXJzZWN0aW9uV2l0aEF4aXMyRCghMCx0LHMsbnVsbCk/ZTpzWzBdfWlzQ3VydmUoKXtyZXR1cm4hMH1pc0RlZ2VuZXJhdGUodCl7cmV0dXJuIHplKHRoaXMsdCl9aXNEZWdlbmVyYXRlM0QodCxlKXtyZXR1cm4gcygwKSwhMX1xdWVyeUxvb3NlRW52ZWxvcGUodCl7MyE9PXQubV9FbnZlbG9wZVR5cGU/dGhpcy5xdWVyeUxvb3NlRW52ZWxvcGVPbkludGVydmFsKG5ldyBVKDAsMSksdCk6YShcIjNkIG5vdCBpbXBsXCIpfWNsb25lKHQpe2NvbnN0IGU9bmV3IHFoO3JldHVybiB0aGlzLmNvcHlUbyhlKSxlfXF1ZXJ5SW50ZXJ2YWwodCxlKXtpZigwPT09dCl7aWYoRXUodGhpcykpcmV0dXJuIDA9PT1lP1UuY29uc3RydWN0KHRoaXMuZ2V0U3RhcnRYKCksdGhpcy5nZXRFbmRYKCkpOlUuY29uc3RydWN0KHRoaXMuZ2V0U3RhcnRZKCksdGhpcy5nZXRFbmRZKCkpO2xldCB0O2NvbnN0IHM9dGhpcy5nZXRTZW1pQXhlcygpO3Q9MD09PWU/TWF0aC5hdGFuMigtcy55KnRoaXMubV9zaW5yLHMueCp0aGlzLm1fY29zcik6TWF0aC5hdGFuMihzLnkqdGhpcy5tX2Nvc3Iscy54KnRoaXMubV9zaW5yKTtjb25zdCBuPXQrTWF0aC5QSSxpPVswLDBdO2lbMF09Y3UodGhpcyx0KSxpWzFdPWN1KHRoaXMsbik7Y29uc3Qgcj0wPT09ZT9VLmNvbnN0cnVjdCh0aGlzLmdldFN0YXJ0WCgpLHRoaXMuZ2V0RW5kWCgpKTpVLmNvbnN0cnVjdCh0aGlzLmdldFN0YXJ0WSgpLHRoaXMuZ2V0RW5kWSgpKSxvPW5ldyBKO2ZvcihsZXQgYT0wO2E8MjthKyspe2NvbnN0IHQ9aVthXTt0PjAmJnQ8MSYmKHRoaXMucXVlcnlDb29yZDJEKHQsbyksci5tZXJnZU5lQ29vcmRpbmF0ZSgwPT09ZT9vLng6by55KSl9cmV0dXJuIHJ9cmV0dXJuIHN1cGVyLnF1ZXJ5SW50ZXJ2YWwodCxlKX1xdWVyeUxvb3NlRW52ZWxvcGVPbkludGVydmFsKHQsZSl7Y29uc3Qgcz1uZXcgVSgwLDEpO2lmKHMuaW50ZXJzZWN0KHQpLHMuaXNFbXB0eSgpKXJldHVybiB2b2lkIGUuc2V0RW1wdHkoKTtpZihFdSh0aGlzKSlyZXR1cm4gZS5zZXRDb29yZHModGhpcy5nZXRDb29yZDJEKHMudm1pbikpLHZvaWQgZS5tZXJnZU5lKHRoaXMuZ2V0Q29vcmQyRChzLnZtYXgpKTtjb25zdCBuPXRoaXMuZ2V0Q29vcmQyRChzLnZtaW4pLGk9dGhpcy5nZXRDb29yZDJEKHMudm1heCk7aWYoMT09PXRoaXMubV9taW5vck1ham9yUmF0aW8mJk1hdGguYWJzKHRoaXMubV9zd2VlcEFuZ2xlKSpzLndpZHRoKCk8PVR0KXtsZXQgdD1KLmxlcnAobixpLC41KTtjb25zdCBzPXQuc3ViKHRoaXMubV9jZW50ZXIpO3JldHVybiBzLm5vcm1hbGl6ZSgpLHQ9dC5hZGQocy5tdWwoLjUqSi5kaXN0YW5jZShuLGkpKSksZS5zZXRDb29yZHMobiksZS5tZXJnZU5lKGkpLHZvaWQgZS5tZXJnZU5lKHQpfSR1KHRoaXMscyxlKX10VG9MZW5ndGgodCl7cmV0dXJuIEV1KHRoaXMpP3QqSi5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCkpOjE9PT10aGlzLm1fbWlub3JNYWpvclJhdGlvP01hdGguYWJzKHRoaXMuZ2V0U3dlZXBBbmdsZSgpKnQpKnRoaXMubV9zZW1pTWFqb3JBeGlzOkR1KHRoaXMsdCl9cGFyYW1ldHJpY0FuZ2xlVG9UKHQpe3JldHVybiBjdSh0aGlzLHQpfXRUb1BhcmFtZXRyaWNBbmdsZSh0KXtyZXR1cm4gZ3UodGhpcyx0KX1sZW5ndGhUb1QodCl7aWYoRXUodGhpcykpe2NvbnN0IGU9Si5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCkpO3JldHVybiAwPT09ZT8wOnQvZX1pZigxPT09dGhpcy5tX21pbm9yTWFqb3JSYXRpbyl7Y29uc3QgZT1NYXRoLmFicyh0aGlzLmdldFN3ZWVwQW5nbGUoKSkqdGhpcy5tX3NlbWlNYWpvckF4aXM7cmV0dXJuIDA9PT1lPzA6dC9lfXJldHVybi
1B3dSh0aGlzLHQpfWNhbGN1bGF0ZVdlaWdodGVkQXJlYUNlbnRyb2lkMkQodCl7aWYoRXUodGhpcykpe2NvbnN0IHQ9bmV3IEo7cmV0dXJuIHQuc2V0Q29vcmRzKDAsMCksdH1jb25zdCBlPUh1KHRoaXMpLHM9dGhpcy5nZXRTdGFydFhZKCkuc3ViKHRoaXMubV9jZW50ZXIpLG49dGhpcy5nZXRFbmRYWSgpLnN1Yih0aGlzLm1fY2VudGVyKSxpPXRoaXMubV9zZW1pTWFqb3JBeGlzLHI9dGhpcy5nZXRTZW1pTWlub3JBeGlzKCksbz10aGlzLm1fc3RhcnRBbmdsZSt0aGlzLm1fc3dlZXBBbmdsZSxhPW5ldyBKO2EueD1pKnIqKGkqdGhpcy5tX2Nvc3IqKC1NYXRoLnNpbihvKStNYXRoLnNpbih0aGlzLm1fc3RhcnRBbmdsZSkpK3IqKC1NYXRoLmNvcyhvKStNYXRoLmNvcyh0aGlzLm1fc3RhcnRBbmdsZSkpKnRoaXMubV9zaW5yKS8zLGEueT1pKnIqKHIqKE1hdGguY29zKG8pLU1hdGguY29zKHRoaXMubV9zdGFydEFuZ2xlKSkqdGhpcy5tX2Nvc3IraSooLU1hdGguc2luKG8pK01hdGguc2luKHRoaXMubV9zdGFydEFuZ2xlKSkqdGhpcy5tX3NpbnIpLzM7Y29uc3QgaD1uLmFkZChzKS5tdWwobi5jcm9zc1Byb2R1Y3QocykvNik7cmV0dXJuIGEueC09aC54LGEueS09aC55LGEuYWRkKHRoaXMubV9jZW50ZXIuc3ViKHQpLm11bChlKSl9Y2FsY3VsYXRlV2VpZ2h0ZWRDZW50cm9pZDJEKCl7Y29uc3QgdD1uZXcgSjtpZih0aGlzLmlzRGVnZW5lcmF0ZSgwKSlyZXR1cm4gdC5zZXRDb29yZHMoMCwwKSx0O2lmKEV1KHRoaXMpKXJldHVybiB0LmFzc2lnbih0aGlzLmdldENvb3JkMkQoLjUpLm11bCh0aGlzLmNhbGN1bGF0ZUxlbmd0aDJEKCkpKSx0O2xldCBlPXRoaXMubV9zdGFydEFuZ2xlLHM9dGhpcy5tX3N0YXJ0QW5nbGUrdGhpcy5tX3N3ZWVwQW5nbGU7aWYoczxlKXtjb25zdCB0PWU7ZT1zLHM9dH1jb25zdCBuPU1hdGguc2luKGUpLGk9TWF0aC5zaW4ocykscj1NYXRoLmNvcyhlKSxvPU1hdGguY29zKHMpO2lmKDE9PT10aGlzLm1fbWlub3JNYWpvclJhdGlvKXtjb25zdCBlPXRoaXMuZ2V0U2VtaU1ham9yQXhpcygpLHM9ZSplLGE9cyooaS1uKSxoPXMqKHItbyk7dC5zZXRDb29yZHMoYSxoKX1lbHNle2NvbnN0IGU9dGhpcy5nZXRTZW1pTWFqb3JBeGlzKCkscz10aGlzLmdldFNlbWlNaW5vckF4aXMoKSxhPWUqZSxoPXMqcyx1PWUqcyxtPWEtaCxsPW0vaCxjPW0vYSxnPU1hdGguc3FydChsKSxkPU1hdGguc3FydChjKSxfPS41KnUqKE1hdGguYXNpbmgoZyppKS9nK2kqTWF0aC5zcXJ0KDErbCppKmkpKS0uNSp1KihNYXRoLmFzaW5oKGcqbikvZytuKk1hdGguc3FydCgxK2wqbipuKSkscD0tLjUqdSooTWF0aC5hc2luKGQqbykvZCtvKk1hdGguc3FydCgxLWMqbypvKSktIC0uNSp1KihNYXRoLmFzaW4oZCpyKS9kK3IqTWF0aC5zcXJ0KDEtYypyKnIpKTt0LnNldENvb3JkcyhfLHApfXJldHVybiB0LnJvdGF0ZURpcmVjdCh0aGlzLm1fY29zcix0aGlzLm1fc2luciksdC5hc3NpZ24odC5hZGQodGhpcy5tX2NlbnRlci5tdWwodGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpKSkpLHR9aXNJbnRlcnNlY3RpbmdQb2ludCh0LGUscyl7aWYocyYmKHQuaXNFcXVhbFBvaW50MkQodGhpcy5nZXRTdGFydFhZKCkpfHx0LmlzRXF1YWxQb2ludDJEKHRoaXMuZ2V0RW5kWFkoKSkpKXJldHVybiExO2lmKCFFdSh0aGlzKSl7Y29uc3Qgcz1KLmRpc3RhbmNlKHQsdGhpcy5tX2NlbnRlciksbj10aGlzLmdldFNlbWlBeGVzKCk7aWYoczxuLngtZXx8cz5uLnkrZSlyZXR1cm4hMX1jb25zdCBuPXRoaXMuZ2V0Q2xvc2VzdENvb3JkaW5hdGUodCwhMSksaT1uZXcgSjt0aGlzLnF1ZXJ5Q29vcmQyRChuLGkpO3JldHVybiBKLmRpc3RhbmNlKGksdCk8PWV9aXNJbnRlcnNlY3RpbmdQb2ludDNEKHQsZSxuLGkscj0xKXtyZXR1cm4gcygwKSwhMX1nZXRUYW5nZW50KHQpe2lmKEV1KHRoaXMpKXJldHVybiB0aGlzLmdldEVuZFhZKCkuc3ViKHRoaXMuZ2V0U3RhcnRYWSgpKTt7Y29uc3QgZT1ndSh0aGlzLHQpLHM9bmV3IEo7cmV0dXJuIHMuc2
1V0Q29vcmRzKC10aGlzLm1fc2VtaU1ham9yQXhpcypNYXRoLnNpbihlKSx0aGlzLmdldFNlbWlNaW5vckF4aXMoKSpNYXRoLmNvcyhlKSksdGhpcy5tX3JvdGF0aW9uJiZzLnJvdGF0ZURpcmVjdCh0aGlzLm1fY29zcix0aGlzLm1fc2lucikscy5zY2FsZSh0aGlzLmdldFN3ZWVwQW5nbGUoKSksc319Z2V0RGVyaXZhdGl2ZSh0KXtpZihFdSh0aGlzKSlyZXR1cm4gdGhpcy5nZXRFbmRYWSgpLnN1Yih0aGlzLmdldFN0YXJ0WFkoKSk7e2NvbnN0IGU9Z3UodGhpcyx0KSxzPW5ldyBKO3JldHVybiBzLnNldENvb3JkcygtdGhpcy5tX3NlbWlNYWpvckF4aXMqTWF0aC5zaW4oZSksdGhpcy5nZXRTZW1pTWlub3JBeGlzKCkqTWF0aC5jb3MoZSkpLHRoaXMubV9yb3RhdGlvbiYmcy5yb3RhdGVEaXJlY3QodGhpcy5tX2Nvc3IsdGhpcy5tX3NpbnIpLHMuc2NhbGUodGhpcy5nZXRTd2VlcEFuZ2xlKCkpLHN9fW5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKXtyZXR1cm4hIVJ1KHRoaXMpJiYoRXUodGhpcyk/KHp1KHRoaXMpLCExKTpCdSh0aGlzLCExKSl9cHJvamVjdGlvbkJlaGF2aW9yKCl7cmV0dXJuKDQmdGhpcy5tX2JpdHMpPj4yfXNldFByb2plY3Rpb25CZWhhdmlvcih0KXt0aGlzLm1fYml0cz0tNSZ0aGlzLm1fYml0c3x0PDwyfWNvbnZlcnRUb0Nhbm9uaWModCl7Y29uc3QgZT1uZXcgSih0LngsdC55KTtyZXR1cm4gZS5zdWJUaGlzKHRoaXMubV9jZW50ZXIpLGUucm90YXRlUmV2ZXJzZSh0aGlzLm1fY29zcix0aGlzLm1fc2luciksZX1jb252ZXJ0RnJvbUNhbm9uaWModCl7Y29uc3QgZT1uZXcgSih0LngsdC55KTtyZXR1cm4gZS5yb3RhdGVEaXJlY3QodGhpcy5tX2Nvc3IsdGhpcy5tX3NpbnIpLGUuYWRkVGhpcyh0aGlzLm1fY2VudGVyKSxlfWNhbm9uaWNUb1dvcmxkVHJhbnNmb3JtYXRpb24odCl7dC5zZXRSb3RhdGUodGhpcy5tX2Nvc3IsdGhpcy5tX3NpbnIpLHQuc2hpZnRDb29yZHModGhpcy5tX2NlbnRlci54LHRoaXMubV9jZW50ZXIueSl9Z2V0Q3VydmF0dXJlKHQpe2NvbnN0IGU9Z3UodGhpcyx0KSxzPW5ldyBKLG49dGhpcy5nZXRTZW1pTWlub3JBeGlzKCk7cy5zZXRDb29yZHMoLXRoaXMubV9zZW1pTWFqb3JBeGlzKk1hdGguc2luKGUpLG4qTWF0aC5jb3MoZSkpO2NvbnN0IGk9bmV3IEo7aS5zZXRDb29yZHMoLXRoaXMubV9zZW1pTWFqb3JBeGlzKk1hdGguY29zKGUpLC1uKk1hdGguc2luKGUpKSx0aGlzLm1fcm90YXRpb24mJihzLnJvdGF0ZURpcmVjdCh0aGlzLm1fY29zcix0aGlzLm1fc2luciksaS5yb3RhdGVEaXJlY3QodGhpcy5tX2Nvc3IsdGhpcy5tX3NpbnIpKTtjb25zdCByPXMuc3FyTGVuZ3RoKCk7aWYoMD09PXIpcmV0dXJuIE51bWJlci5OYU47Y29uc3Qgbz1NYXRoLnNxcnQocik7cy5kaXZUaGlzKG8pO3JldHVybiBzLmNyb3NzUHJvZHVjdChpKS9yfWdldE1vbm90b25pY1BhcnRQYXJhbXModCxzKXtjb25zdCBuPU8oNixOdW1iZXIuTmFOKTtuWzBdPTA7bGV0IGk9MTtpZih0aGlzLmlzRGVnZW5lcmF0ZVRvTGluZSgpKW5bMV09MSxpPTI7ZWxzZXtjb25zdCB0PXRoaXMuZ2V0U2VtaUF4ZXMoKSxlPU8oNCxOdW1iZXIuTmFOKTt0aGlzLm1fcm90YXRpb24/KGVbMF09TWF0aC5hdGFuMih0LnkqdGhpcy5tX2Nvc3IsdC54KnRoaXMubV9zaW5yKSxlWzFdPWVbMF0rTWF0aC5QSSxlWzJdPU1hdGguYXRhbjIoLXQueSp0aGlzLm1fc2lucix0LngqdGhpcy5tX2Nvc3IpLGVbM109ZVsyXStNYXRoLlBJKTooZVswXT0wLGVbMV09TWF0aC5QSSxlWzJdPS41Kk1hdGguUEksZVszXT1JdCgpKTtmb3IobGV0IHM9MDtzPDQ7cysrKXtjb25zdCB0PWN1KHRoaXMsZVtzXSk7dD4wJiZ0PDEmJihuW2ldPXQsaSsrKX1pPjImJkR0KG4saSksbltpXT0xLGkrK31pZihzKXt0PGkmJmUoXCJcIik7Zm9yKGxldCB0PTA7dDxpO3QrKylzW3RdPW5bdF19cmV0dXJuIGl9Y2FsY3VsYXRlTG93ZXJMZW5ndGgyRCgpe2NvbnN0IHQ9Si5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCkpO2lmKHRoaXMuaXNEZWdlbmVyYXRlVG9MaW5lKCkpcmV0dXJuIHQ7Y29uc3QgZT1NYXRoLmFicyh0aGlzLm1fc3dlZXBBbmdsZSkqdGhpcy5nZXRTZW1pTWlub3JBeGlzKCk7cmV0dXJuIE1hdGgubWF4KGUsdCl9Y2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpe2NvbnN0IHQ9Si5kaXN0YW5jZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCkpO2lmKHRoaXMuaXNEZWdlbmVyYXRlVG9MaW5lKCkpcmV0dXJuIHQ7Y29uc3QgZT1NYXRoLmFicyh0aGlzLm1fc3dlZXBBbmdsZSkqdGhpcy5nZXRTZW1pTWFqb3JBeGlzKCk7cmV0dXJuIE1hdGgubWF4KGUsdCl9b3JpZW50Qm90dG9tVXAoKXtpZih0aGlzLm1fWUVuZDx0aGlzLm1fWVN0YXJ0fHx0aGlzLm1fWUVuZD09PXRoaXMubV9ZU3RhcnQmJnRoaXMubV9YRW5kPHRoaXMubV9YU3RhcnQpe3RoaXMubV9YRW5kPXN0KHRoaXMubV9YU3RhcnQsdGhpcy5tX1hTdGFydD10aGlzLm1fWEVuZCksdGhpcy5tX1lFbmQ9c3QodGhpcy5tX1lTdGFydCx0aGlzLm1fWVN0YXJ0PXRoaXMubV9ZRW5kKTtmb3IobGV0IHQ9MCxlPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRUb3RhbENvbXBvbmVudENvdW50KCktMjt0PGU7dCsrKXRoaXMubV9hdHRyaWJ1dGVzW3QrZV09c3QodGhpcy5tX2F0dHJpYnV0ZXNbdF0sdGhpcy5tX2F0dHJpYnV0ZXNbdF09dGhpcy5tX2F0dHJpYnV0ZXNbdCtlXSk7dGhpcy5tX3N0YXJ0QW5nbGU9dGhpcy5tX3N0YXJ0QW5nbGUrdGhpcy5tX3N3ZWVwQW5nbGUsdGhpcy5tX3N3ZWVwQW5nbGU9LXRoaXMubV9zd2VlcEFuZ2xlfX1pc0xpbmUoKXtyZXR1cm4gRXUodGhpcyl9Y29weUlnbm9yZUF0dHJpYnV0ZXModCl7dC5tX1hTdGFydD10aGlzLm1fWFN0YXJ0LHQubV9ZU3RhcnQ9dGhpcy5tX1lTdGFydCx0Lm1fWEVuZD10aGlzLm1fWEVuZCx0Lm1fWUVuZD10aGlzLm1fWUVuZCx0Lm1fY2VudGVyLmFzc2lnbih0aGlzLm1fY2VudGVyKSx0Lm1fc2VtaU1ham9yQXhpcz10aGlzLm1fc2VtaU1ham9yQXhpcyx0Lm1fbWlub3JNYWpvclJhdGlvPXRoaXMubV9taW5vck1ham9yUmF0aW8sdC5tX2ludGVyaW9yLmFzc2lnbih0aGlzLm1faW50ZXJpb3IpLHQubV9yb3RhdGlvbj10aGlzLm1fcm90YXRpb24sdC5tX2Nvc3I9dGhpcy5tX2Nvc3IsdC5tX3NpbnI9dGhpcy5tX3NpbnIsdC5tX3N3ZWVwQW5nbGU9dGhpcy5tX3N3ZWVwQW5nbGUsdC5tX3N0YXJ0QW5nbGU9dGhpcy5tX3N0YXJ0QW5nbGUsdC5tX2JpdHM9dGhpcy5tX2JpdHMsWXUodCl9Y2FsY3VsYXRlQXJlYTJESGVscGVyKCl7cmV0dXJuIEh1KHRoaXMpfWFic05vcm0oKXtsZXQgdD10aGlzLmdldFN0YXJ0WFkoKS5ub3JtKDEpK3RoaXMuZ2V0RW5kWFkoKS5ub3JtKDEpO3JldHVybiB0aGlzLmlzRGVnZW5lcmF0ZVRvTGluZSgpfHwodCs9dGhpcy5tX2NlbnRlci5ub3JtKDEpLHQrPXRoaXMubV9zZW1pTWFqb3JBeGlzKSx0fXF1ZXJ5RW52ZWxvcGVXKHQsZSl7aWYoZS5zZXRDb29yZHModGhpcy5nZXRDb29yZDJEKHQudm1pbikpLGUubWVyZ2VOZSh0aGlzLmdldENvb3JkMkQodC52bWF4KSksRXUodGhpcykpcmV0dXJuO2NvbnN0IHM9dGhpcy5nZXRTZW1pQXhlcygpLG49Tyg4LE51bWJlci5OYU4pO3tjb25zdCB0PU1hdGguYXRhbjIoLXMueSp0aGlzLm1fc2lucixzLngqdGhpcy5tX2Nvc3IpLGU9dCtNYXRoLlBJLGk9TWF0aC5hdGFuMihzLnkqdGhpcy5tX2Nvc3Iscy54KnRoaXMubV9zaW5yKSxyPWkrTWF0aC5QSTtuWzBdPWN1KHRoaXMsdCksblsxXT1jdSh0aGlzLGUpLG5bMl09Y3UodGhpcyxpKSxuWzNdPW
1N1KHRoaXMscil9e2NvbnN0IHQ9dGhpcy5tX2Nvc3IrdGhpcy5tX3NpbnIsZT10aGlzLm1fY29zci10aGlzLm1fc2lucixpPU1hdGguYXRhbjIoLXMueSp0LHMueCplKSxyPWkrTWF0aC5QSSxvPU1hdGguYXRhbjIocy55KmUscy54KnQpLGE9bytNYXRoLlBJO25bNF09Y3UodGhpcyxpKSxuWzVdPWN1KHRoaXMsciksbls2XT1jdSh0aGlzLG8pLG5bN109Y3UodGhpcyxhKX1jb25zdCBpPUouZ2V0TkFOKCk7Zm9yKGxldCByPTA7cjw4O3IrKyl7Y29uc3Qgcz1uW3JdO3QuY29udGFpbnNFeGNsdXNpdmVDb29yZGluYXRlKHMpJiYodGhpcy5xdWVyeUNvb3JkMkQocyxpKSxlLm1lcmdlTmUoaSkpfX1zZXRTZWdtZW50RnJvbUNvb3Jkc0ZvclN0aXRjaGVyKHQsZSl7Q3UodGhpcyx0LGUpfXdyaXRlSW5CdWZmZXJTdHJlYW0odCxlKXtjb25zdCBzPW5ldyBGbG9hdDY0QXJyYXkoMTApO3JldHVybiBzWzBdPXRoaXMubV9iaXRzLHNbMV09dGhpcy5tX3NlbWlNYWpvckF4aXMsc1syXT10aGlzLm1fbWlub3JNYWpvclJhdGlvLHNbM109dGhpcy5tX3JvdGF0aW9uLHNbNF09dGhpcy5tX2NlbnRlci54LHNbNV09dGhpcy5tX2NlbnRlci55LHNbNl09dGhpcy5tX3N3ZWVwQW5nbGUsc1s3XT10aGlzLm1fc3RhcnRBbmdsZSxzWzhdPXRoaXMubV9pbnRlcmlvci54LHNbOV09dGhpcy5tX2ludGVyaW9yLnksdC53cml0ZVJhbmdlRnJvbUFycmF5KGUscy5sZW5ndGgscywhMCwxKSxlK3MubGVuZ3RofXJlYWRGcm9tQnVmZmVyU3RyZWFtKHQsZSl7Y29uc3Qgcz1uZXcgRmxvYXQ2NEFycmF5KDEwKTt0LnF1ZXJ5UmFuZ2UoZSxzLmxlbmd0aCxzLCEwLDEpLHRoaXMubV9iaXRzPXNbMF0sdGhpcy5tX3NlbWlNYWpvckF4aXM9c1sxXSx0aGlzLm1fbWlub3JNYWpvclJhdGlvPXNbMl0sdGhpcy5tX3JvdGF0aW9uPXNbM10sdGhpcy5tX2NlbnRlci54PXNbNF0sdGhpcy5tX2NlbnRlci55PXNbNV0sdGhpcy5tX3N3ZWVwQW5nbGU9c1s2XSx0aGlzLm1fc3RhcnRBbmdsZT1zWzddLHRoaXMubV9pbnRlcmlvci54PXNbOF0sdGhpcy5tX2ludGVyaW9yLnk9c1s5XSx0aGlzLm1fY29zcj1NYXRoLmNvcyh0aGlzLm1fcm90YXRpb24pLHRoaXMubV9zaW5yPU1hdGguc2luKHRoaXMubV9yb3RhdGlvbiksdGhpcy5tX2NhY2hlZFZhbHVlcz1udWxsfXNuYXBDb250cm9sUG9pbnRzKHQpe3JldHVybiExfW5lZWRzU25hcENvbnRyb2xQb2ludHModCl7cmV0dXJuITF9Y2FsY3VsYXRlU3BlY2lhbFBvaW50c0ZvckNyYWNraW5nKHQsZSl7cmV0dXJuIGgoXCJzaG91bGQgbm90MTsgYmUgY2FsbGVkXCIpLDB9ZW5zdXJlWFlNb25vdG9uZSgpe2lmKEV1KHRoaXMpKXJldHVybiExO2lmKHRoaXMuZ2V0U3RhcnRYWSgpLmVxdWFscyh0aGlzLmdldEVuZFhZKCkpKXJldHVybiBTdSh0aGlzLHRoaXMuZ2V0U3RhcnRYWSgpLHRoaXMuZ2V0RW5kWFkoKSx0aGlzLnByb2plY3Rpb25CZWhhdmlvcigpKSwhMDtjb25zdCB0PWN0KEosMyk7bGV0IGU9a3UodGhpcyx0KTtpZihVYSh0KSl7bGV0IHM9ITE7aWYoMD09PXRoaXMucHJvamVjdGlvbkJlaGF2aW9yKCkpe2NvbnN0IG49bmV3IGxlO24uc2V0Q29vcmRzKHtwdDp0WzBdfSksbi5tZXJnZU5lKHRbMl0pO2NvbnN0IGk9bmV3IEo7aS5zZXRTdWIodFsyXSx0WzBdKSxpLmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpLGkubm9ybWFsaXplKCksaS5zY2FsZShKLmRpc3RhbmNlKHRbMl0sdFswXSkpO2NvbnN0IHI9Si5sZXJwKHRbMl0sdFswXSwuNSksbz1yLnN1YihpKSxhPXIuYWRkKGkpO24uY2xpcExpbmUobyxhKTtjb25zdCBoPUouZ2V0Q2xvc2VzdENvb3JkaW5hdGUobyxhLHRbMV0sITEpO3RbMV09Si5sZXJwKG8sYSxoKTtjb25zdCB1PXRbMl0uc3ViKHRbMV0pLG09dFswXS5zdWIodFsxXSksbD11LmNyb3NzUHJvZHVjdChtKSxjPXUuZG90UHJvZHVjdChtKTtlPXh0KCktTWF0aC5hYnMoLjUqTWF0aC5hdGFuMihsLGMpKSxzPSEwfXJldHVybiBHdSh0LGUqZSxudWxsLHMsdGhpcyksITB9cmV0dXJuITF9c2V0Q29vcmRzRm9ySW50ZXJzZWN0b3IodCxlLHMpe3h1KHRoaXMsdCxlLHMpfWdldEludGVyaW9yUG9pbnQoKXtyZXR1cm4gdGhpcy5tX2ludGVyaW9yLmNsb25lKCl9Y29weVRvSW1wbCh0KXtjb25zdCBlPXQ7ZS5tX2NlbnRlci5hc3NpZ24odGhpcy5tX2NlbnRlciksZS5tX3NlbWlNYWpvckF4aXM9dGhpcy5tX3NlbWlNYWpvckF4aXMsZS5tX21pbm9yTWFqb3JSYXRpbz10aGlzLm1fbWlub3JNYWpvclJhdGlvLGUubV9pbnRlcmlvci5hc3NpZ24odGhpcy5tX2ludGVyaW9yKSxlLm1fcm90YXRpb249dGhpcy5tX3JvdGF0aW9uLGUubV9jb3NyPXRoaXMubV9jb3NyLGUubV9zaW5yPXRoaXMubV9zaW5yLGUubV9zd2VlcEFuZ2xlPXRoaXMubV9zd2VlcEFuZ2xlLGUubV9zdGFydEFuZ2xlPXRoaXMubV9zdGFydEFuZ2xlLGUubV9iaXRzPXRoaXMubV9iaXRzLE11KGUsUHUodGhpcykpfXJldmVyc2VJbXBsKCl7WHUodGhpcywhcXUodGhpcykpLGx1KHRoaXMpLCgwIT09dGhpcy5wcm9qZWN0aW9uQmVoYXZpb3IoKXx8dGhpcy5nZXRTdGFydFhZKCkuZXF1YWxzKHRoaXMuZ2V0RW5kWFkoKSkpJiZVdSh0aGlzKX1lcXVhbHNJbXBsKHQpe2NvbnN0IGU9dDtpZih0aGlzLm1fYml0cyE9PWUubV9iaXRzKXJldHVybiExO2lmKHRoaXMubV9zZW1pTWFqb3JBeGlzIT09ZS5tX3NlbWlNYWpvckF4aXMpcmV0dXJuITE7aWYodGhpcy5tX21pbm9yTWFqb3JSYXRpbyE9PWUubV9taW5vck1ham9yUmF0aW8pcmV0dXJuITE7aWYoISh0aGlzLm1fY2VudGVyLmlzRXF1YWxQb2ludDJEKGUubV9jZW50ZXIpfHx0aGlzLm1fY2VudGVyLmlzTkFOKCkmJmUubV9jZW50ZXIuaXNOQU4oKSkpcmV0dXJuITE7aWYodGhpcy5tX3JvdGF0aW9uIT09ZS5tX3JvdGF0aW9uKXJldHVybiExO2lmKCF0aGlzLm1faW50ZXJpb3IuZXF1YWxzKGUubV9pbnRlcmlvcikpcmV0dXJuITE7Y29uc3Qgcz1lLm1fc3dlZXBBbmdsZTtpZih0aGlzLm1fc3dlZXBBbmdsZSE9PXMpcmV0dXJuITE7Y29uc3Qgbj1lLm1fc3RhcnRBbmdsZTtyZXR1cm4gdGhpcy5tX3N0YXJ0QW5nbGU9PT1ufWVxdWFsc0ltcGxUb2wodCxlKXtjb25zdCBzPXQ7aWYodGhpcy5tX2JpdHMhPT1zLm1fYml0cylyZXR1cm4hMTtpZih0aGlzLm1fY2VudGVyLmlzTkFOKCkmJnMubV9jZW50ZXIuaXNOQU4oKSlyZXR1cm4hMDtpZih0aGlzLm1fY2VudGVyLmlzTkFOKCkhPT1zLm1fY2VudGVyLmlzTkFOKCkpcmV0dXJuITE7aWYoIXRoaXMuZ2V0U2VtaUF4ZXMoKS5pc0VxdWFsUG9pbnQyRChzLmdldFNlbWlBeGVzKCksZSkpcmV0dXJuITE7aWYoIXRoaXMubV9
1jZW50ZXIuaXNFcXVhbFBvaW50MkQocy5tX2NlbnRlcixlKSlyZXR1cm4hMTtjb25zdCBuPU1hdGguYWJzKFRoKEFoKEloKHRoaXMubV9yb3RhdGlvbi1zLm1fcm90YXRpb24pKSkpLGk9TWF0aC5hYnMoQXQoKS1uKSxyPU1hdGgubWluKG4saSk7aWYodGhpcy5tX3NlbWlNYWpvckF4aXMqTWF0aC5hYnMocik+ZSlyZXR1cm4hMTtjb25zdCBvPXRoaXMuZ2V0Q29vcmQyRCguNSksYT1zLmdldENvb3JkMkQoLjUpO3JldHVybiEhby5pc0VxdWFsUG9pbnQyRChhLGUpfXN3YXBJbXBsKHQpe2NvbnN0IGU9dDt0aGlzLm1fY2VudGVyPXN0KGUubV9jZW50ZXIsZS5tX2NlbnRlcj10aGlzLm1fY2VudGVyKSx0aGlzLm1fc2VtaU1ham9yQXhpcz1zdChlLm1fc2VtaU1ham9yQXhpcyxlLm1fc2VtaU1ham9yQXhpcz10aGlzLm1fc2VtaU1ham9yQXhpcyksdGhpcy5tX21pbm9yTWFqb3JSYXRpbz1zdChlLm1fbWlub3JNYWpvclJhdGlvLGUubV9taW5vck1ham9yUmF0aW89dGhpcy5tX21pbm9yTWFqb3JSYXRpbyksdGhpcy5tX2ludGVyaW9yPXN0KGUubV9pbnRlcmlvcixlLm1faW50ZXJpb3I9dGhpcy5tX2ludGVyaW9yKSx0aGlzLm1fcm90YXRpb249c3QoZS5tX3JvdGF0aW9uLGUubV9yb3RhdGlvbj10aGlzLm1fcm90YXRpb24pLHRoaXMubV9jb3NyPXN0KGUubV9jb3NyLGUubV9jb3NyPXRoaXMubV9jb3NyKSx0aGlzLm1fc2lucj1zdChlLm1fc2lucixlLm1fc2lucj10aGlzLm1fc2luciksdGhpcy5tX3N3ZWVwQW5nbGU9c3QoZS5tX3N3ZWVwQW5nbGUsZS5tX3N3ZWVwQW5nbGU9dGhpcy5tX3N3ZWVwQW5nbGUpLHRoaXMubV9zdGFydEFuZ2xlPXN0KGUubV9zdGFydEFuZ2xlLGUubV9zdGFydEFuZ2xlPXRoaXMubV9zdGFydEFuZ2xlKSx0aGlzLm1fYml0cz1zdChlLm1fYml0cyxlLm1fYml0cz10aGlzLm1fYml0cyksTnUodGhpcyxlKX1hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpe3p1KHRoaXMpLFl1KHRoaXMpfWludGVyc2VjdCh0LGUscyxuLGkpe3JldHVybiBtbSghMSx0aGlzLHQsZSxzLG4saSl9aW50ZXJzZWN0UG9pbnQodCxlLHMpe2lmKGUubGVuZ3RoPDImJm4oXCJcIiksRXUodGhpcykpe3JldHVybiBuZXcgZm0oe3N0YXJ0OnRoaXMuZ2V0U3RhcnRYWSgpLGVuZDp0aGlzLmdldEVuZFhZKCl9KS5pbnRlcnNlY3RQb2ludCh0LGUscyl9e2NvbnN0IGU9Si5kaXN0YW5jZSh0LHRoaXMubV9jZW50ZXIpO2lmKGU+dGhpcy5tX3NlbWlNYWpvckF4aXMrc3x8ZTx0aGlzLmdldFNlbWlNaW5vckF4aXMoKS1zKXJldHVybiAwfWNvbnN0IGk9dGhpcy5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0LCExKSxyPUouZ2V0TkFOKCk7cmV0dXJuIHRoaXMucXVlcnlDb29yZDJEKGksciksSi5kaXN0YW5jZShyLHQpPD1zP2R0KGksMCwxKSYmKHRoaXMucXVlcnlDb29yZDJEKDA9PT1pPzE6MCxyKSxKLmRpc3RhbmNlKHIsdCk8PXMpPyhlJiYoZVswXT0wLGVbMV09MSksMik6KGUmJihlWzBdPWkpLDEpOjB9aXNJbnRlcnNlY3RpbmcodCxlLHMpe3JldHVybiAwIT09b20oITEsdGhpcyx0LGUscyl9ZW5kUG9pbnRNb2RpZmllZCgpe3RoaXMubV9iaXRzfD04LFl1KHRoaXMpfWNsZWFyRW5kUG9pbnRNb2RpZmllZCgpe3p1KHRoaXMpfX1mdW5jdGlvbiBGaCh0LGUscyl7dC5pc0VtcHR5KCkmJm8oXCJcIiksZih0KTtjb25zdCBuPXQuZ2V0SW1wbCgpLGk9W107cmV0dXJuIFJoKG4uZ2V0UG9pbnRDb3VudCgpLGkpLHpoKExoKG4pLGksbi5nZXRQb2ludENvdW50KCksZSl9ZnVuY3Rpb24gVmgodCxlLHMsbil7Y29uc3QgaT1bXTtyZXR1cm4gUmgoZSxpKSx6aCh0LGksZSxzKX1mdW5jdGlvbiBMaCh0KXtyZXR1cm57YXQ6ZT0+dC5nZXRYWShlKX19ZnVuY3Rpb24gUmgodCxlKXtlLmxlbmd0aD10O2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7KytzKWVbc109czt0PjMmJmZlKHQsZSl9ZnVuY3Rpb24gemgodCxlLHMsbixpKXtsZXQgcj0wO2NvbnN0IG89WzAsMCwwXTtsZXQgYT0wO2NvbnN0IGg9MztsZXQgdT0wO2ZvcihsZXQgbT0wO208aDsrK20pe2xldCBpPSExO2Zvcig7dTxzOyl7Y29uc3Qgcz10LmF0KGVbdV0pO2xldCBsPTE7aWYoMz09PXI/bD1KLmluQ2lyY2xlUm9idXN0KHQuYXQoblswXSksdC5hdChuWzFdKSx0LmF0KG5bMl0pLHMpOjI9PT1yP2w9Si5pbkNpcmNsZVJvYnVzdDNQb2ludCh0LmF0KG5bMF0pLHQuYXQoblsxXSkscyk6MT09PXImJnMuZXF1YWxzKHQuYXQoblswXSkpJiYobD0wKSxsPD0wKXtpZihsPDAmJm0rMTxoKXtlW2FdPXN0KGVbdV0sZVt1XT1lW2FdKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWlmKG5bdF09PT1lW3VdKXtvW3RdPXU7YnJlYWt9YSsrfXUrKztjb250aW51ZX1pPSEwO2xldCBjPTA7Zm9yKGxldCB0PTA7dDxyO3QrKylvW3RdPnUmJihuW2NdPW5bdF0sb1tjXT1vW3RdLGMrKyk7cj1jLG5bcl09ZVt1XSxvW3JdPXUscisrLHI8Mz91PWE6KDE9PT1KLm9yaWVudGF0aW9uUm9idXN0KHQuYXQoblswXSksdC5hdChuWzFdKSx0LmF0KG5bMl0pKSYmKG5bMl09c3QoblswXSxuWzBdPW5bMl0pLG9bMl09c3Qob1swXSxvWzBdPW9bMl0pKSx1KyspfWlmKCFpKWJyZWFrO2lmKG0rMTxoKXthPTA7bGV0IHM9ITE7Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9dCsxO2U8cjtlKyspb1t0XT5vW2VdJiYob1tlXT1zdChvW3RdLG9bdF09b1tlXSksbltlXT1zdChuW3RdLG5bdF09bltlXSkscz0hMCk7Zm9yKGxldCB0PTA7dDxyO3QrKyllW29bdF1dPXN0KGVbdF0sZVt0XT1lW29bdF1dKSxvW3RdPXQ7cyYmMz09PXImJjE9PT1KLm9yaWVudGF0aW9uUm9idXN0KHQuYXQoblswXSksdC5hdChuWzFdKSx0LmF0KG5bMl0pKSYmKG5bMl09c3QoblswXSxuWzBdPW5bMl0pLG9bMl09c3Qob1swXSxvWzBdPW9bMl0pKX11PXJ9cmV0dXJuIHJ9ZnVuY3Rpb24gQmgodCxlLHMsbixpLHIpe3JldHVybiBuZXcgWmgoMCwwLDAsbnVsbCwhMSxLKCkpLmRlbnNpZnlFeCh0LGUscyxuLCExLHIpfWZ1bmN0aW9uIGtoKHQscyxuLHIpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUocyl8fGUoXCJyZXBsYWNlX2FsbF9jdXJ2ZXNfd2l0aF9iZXppZXJzOiBtYXhEZXZpYXRpb25cIiksUWgoaS5lbnVtQmV6aWVyLHQscyxuKX1mdW5jdGlvbiBHaCh0LGUsbixyLG8saCx1LG0pe2gmJihoLmxlbmd0aD0wKSx1JiYodS5sZW5ndGg9MCk7Y29uc3QgbD10LmdldEdlb21ldHJ5VHlwZSgpO2lmKGw9PT1pLmVudW1MaW5lKXJldHVybi
1BoJiYoaC5wdXNoKHQuZ2V0U3RhcnRYWSgpKSxoLnB1c2goSi5nZXROQU4oKSksaC5wdXNoKEouZ2V0TkFOKCkpLGgucHVzaCh0LmdldEVuZFhZKCkpKSx1JiYodS5wdXNoKDApLHUucHVzaCgxKSksMTtpZihsPT09aS5lbnVtQmV6aWVyKXtpZighcilyZXR1cm4gaCYmKGgucHVzaCh0LmdldFN0YXJ0WFkoKSksaC5wdXNoKHQuZ2V0Q29udHJvbFBvaW50MSgpKSxoLnB1c2godC5nZXRDb250cm9sUG9pbnQyKCkpLGgucHVzaCh0LmdldEVuZFhZKCkpKSx1JiYodS5wdXNoKDApLHUucHVzaCgxKSksMTtjb25zdCBlPU8oOSxOdW1iZXIuTmFOKTtsZXQgcz10LmdldE1vbm90b25pY1BhcnRQYXJhbXMoZS5sZW5ndGgsZSk7aWYoZS5sZW5ndGg9cyxzPUhoKHQsbixlKSwyPT09cyYmbyYmKGVbMV09LjUsZS5wdXNoKDEpLHM9MyksdSYmdS5zcGxpY2UoMCwwLC4uLmUuc2xpY2UoMCxzKSksaCl7Y29uc3Qgbj1uZXcgUG07Zm9yKGxldCBpPTE7aTxzO2krKyl7Y29uc3Qgcz1lW2ktMV0scj1lW2ldO3QucXVlcnlDdXQocyxyLG4sITApO2NvbnN0IG89bi5nZXQoKTtjbyhvKSwxPT09aSYmaC5wdXNoKG8uZ2V0U3RhcnRYWSgpKSxoLnB1c2goby5nZXRDb250cm9sUG9pbnQxKCkpLGgucHVzaChvLmdldENvbnRyb2xQb2ludDIoKSksaC5wdXNoKG8uZ2V0RW5kWFkoKSl9fXJldHVybiBzLTF9aWYobD09PWkuZW51bUVsbGlwdGljQXJjKXtjb25zdCBpPXQ7aWYoaS5pc0RlZ2VuZXJhdGVUb0xpbmUoKXx8aS5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIGgmJihoLnB1c2godC5nZXRTdGFydFhZKCkpLGgucHVzaChKLmdldE5BTigpKSxoLnB1c2goSi5nZXROQU4oKSksaC5wdXNoKHQuZ2V0RW5kWFkoKSkpLHUmJih1LnB1c2goMCksdS5wdXNoKDEpKSwxO2lmKHImJihvfHwhaS5pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpKSl7Y29uc3QgYT1PKDYsTnVtYmVyLk5hTik7bGV0IG09aS5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKGEubGVuZ3RoLGEpO2EubGVuZ3RoPW0sbT1IaCh0LG4sYSksMj09PW0mJm8mJihhWzFdPS41LGEucHVzaCgxKSxtPTMpO2xldCBsPTA7aWYobT4yKXtjb25zdCB0PW5ldyBQbSxvPXV8fFtdO2xldCBjPTA7Zm9yKGxldCBnPTE7ZzxtO2crKyl7Y29uc3QgZD1hW2NdLF89YVtnXTtpZihpLnF1ZXJ5Q3V0KGQsXyx0LCEwKSx0LmdldCgpLmlzRGVnZW5lcmF0ZSgwKSljb250aW51ZTtjb25zdCBwPW8ubGVuZ3RoLGY9SmgoMT09PWcsdC5nZXQoKSxlLG4scixoLHUpO3MoZj4wKSxsKz1mO2NvbnN0IFA9Zz09PW0tMSx5PWFbY10seD10LmdldCgpLmdldFN3ZWVwQW5nbGUoKS9pLmdldFN3ZWVwQW5nbGUoKTtmb3IobGV0IHQ9cCxlPW8ubGVuZ3RoO3Q8ZTt0KyspaWYob1t0XT0hUHx8dCsxPGU/eStvW3RdKng6MSxoKXtjb25zdCBlPTMqdCxzPWkuZ2V0Q29vcmQyRChvW3RdKTtpZihoW2VdLnNldENvb3Jkc1BvaW50MkQocyksZT4wKXtnbyhoLnNsaWNlKGUtMykpfX1jPWd9cmV0dXJuIGx9fXJldHVybiBKaCghMCxpLGUsbi
1xyLGgsdSl9aWYobD09PWkuZW51bVJhdGlvbmFsQmV6aWVyMil7Y29uc3Qgcz10O2lmKHImJihvfHwhcy5pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpKSl7Y29uc3QgaT1PKDYsTnVtYmVyLk5hTik7bGV0IHI9cy5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKGkubGVuZ3RoLGkpO2kubGVuZ3RoPXIscj1IaCh0LG4saSksMj09PXImJm8mJihpWzFdPS41LGkucHVzaCgxKSxyPTMpO2xldCBhPTA7aWYocj4yKXtjb25zdCB0PW5ldyBQbSxvPXV8fFtdO2ZvcihsZXQgbT0xO208cjttKyspe2NvbnN0IGw9aVttLTFdLGM9aVttXTtzLnF1ZXJ5Q3V0KGwsYyx0LCEwKTtjb25zdCBnPW8ubGVuZ3RoO2ErPSRoKDE9PT1tLHQuZ2V0KCksZSxuLCExLGgsdSk7Y29uc3QgZD1tPT09ci0xLF89aVttLTFdO2ZvcihsZXQgdD1nLGU9by5sZW5ndGg7dDxlO3QrKylpZihvW3RdPSFkfHx0KzE8ZT9fK29bdF06MSxoKXtjb25zdCBlPTMqdCxuPXMuZ2V0Q29vcmQyRChvW3RdKTtpZihoW2VdLnNldENvb3Jkc1BvaW50MkQobiksZT4wKXtUaShoLnNsaWNlKGUtMykpfX19cmV0dXJuIGF9fXJldHVybiAkaCghMCxzLGUsbixyLGgsdSl9aWYobD09PWkuZW51bUJlemllcjIpe2NvbnN0IHM9dCxpPWN0KEosMyk7cy5xdWVyeUNvbnRyb2xQb2ludHMoaSk7Y29uc3QgYT1uZXcgcmE7YS5jb25zdHJ1Y3RGcm9tUXVhZHJhdGljKGkpO2NvbnN0IG09R2goYSxlLG4scixvLGgsdSk7aWYobnVsbCE9aCYmbnVsbCE9dSl7Y29uc3QgdD0zO2ZvcihsZXQgZT0xLG49MDtlPG07KytlLG4rPXQpe2NvbnN0IGk9bmV3IEo7cy5xdWVyeUNvb3JkMkQodVtlXSxpKTtjb25zdCBvPWhbbit
10XTtpZighaS5lcXVhbHMobykmJihoW24rdF0uc2V0Q29vcmRzUG9pbnQyRChpKSxyKSl7Z28oaC5zbGljZShuLG4rNCkpfX19cmV0dXJuIG19YShcIlwiKX1mdW5jdGlvbiBXaCh0LGUscyxuLHIsbyxoLHUpe28mJihvLmxlbmd0aD0wKSxoJiYoaC5sZW5ndGg9MCk7Y29uc3QgbT10LmdldEdlb21ldHJ5VHlwZSgpO2lmKG09PT1pLmVudW1MaW5lKXJldHVybiBvJiYoby5wdXNoKHQuZ2V0U3RhcnRYWSgpKSxvLnB1c2goSi5nZXROQU4oKSksby5wdXNoKHQuZ2V0RW5kWFkoKSkpLGgmJihoLnB1c2goMCksaC5wdXNoKDEpKSwxO2lmKG09PT1pLmVudW1CZXppZXIyKXtjb25zdCBlPU8oOSxOdW1iZXIuTmFOKTtsZXQgbj10LmdldE1vbm90b25pY1BhcnRQYXJhbXMoZS5sZW5ndGgsZSk7aWYoZS5sZW5ndGg9bixuPUhoKHQscyxlKSxoJiZoLnNwbGljZSgwLDAsLi4uZS5zbGljZSgwLG4pKSxvKXtjb25zdCBzPW5ldyBQbTtmb3IobGV0IGk9MTtpPG47aSsrKXtjb25zdCBuPWVbaS0xXSxyPWVbaV07dC5xdWVyeUN1dChuLHIscywhMCk7Y29uc3QgYT1zLmdldCgpO0FpKGEpLDE9PT1pJiZvLnB1c2goYS5nZXRTdGFydFhZKCkpLG8ucHVzaChhLmdldENvbnRyb2xQb2ludDEoKSksby5wdXNoKGEuZ2V0RW5kWFkoKSl9fXJldHVybiBuLTF9aWYobT09PWkuZW51bUVsbGlwdGljQXJjKXtjb25zdCBpPXQ7aWYoaS5pc0RlZ2VuZXJhdGVUb0xpbmUoKXx8aS5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIG8mJihvLnB1c2godC5nZXRTdGFydFhZKCkpLG8ucHVzaChKLmdldE5BTigpKSxvLnB1c2godC5nZXRFbmRYWSgpKSksaCYmKGgucHVzaCgwKSxoLnB1c2goMSkpLDE7aWYoIWkuaXNNb25vdG9uZVF1aWNrQW5kRGlydHkoKSl7Y29uc3Qgbj1PKDYsTnVtYmVyLk5hTik7bGV0IHI9aS5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKG4ubGVuZ3RoLG4pO24ubGVuZ3RoPXIscj1IaCh0LHMsbik7bGV0IGE9MDtpZihyPjIpe2NvbnN0IHQ9bmV3IFBtLHU9aHx8W107Zm9yKGxldCBtPTE7bTxyO20rKyl7Y29uc3QgbD1uW20tMV0sYz1uW21dO2kucXVlcnlDdXQobCxjLHQsITApO2NvbnN0IGc9dS5sZW5ndGg7YSs9dHUoMT09PW0sdC5nZXQoKSxlLHMsITEsbyxoKTtjb25zdCBkPW09PT1yLTEsXz1uW20tMV0scD10LmdldCgpLmdldFN3ZWVwQW5nbGUoKS9pLmdldFN3ZWVwQW5nbGUoKTtmb3IobGV0IHQ9ZyxlPXUubGVuZ3RoO3Q8ZTt0KyspaWYodVt0XT0hZHx8dCsxPGU/Xyt1W3RdKnA6MSxvKXtjb25zdCBlPTIqdCxzPWkuZ2V0Q29vcmQyRCh1W3RdKTtpZihvW2VdLnNldENvb3Jkc1BvaW50MkQocyksZT4wKXtUaShvLnNsaWNlKGUtMikpfX19cmV0dXJuIGF9fXJldHVybiBKaCghMCxpLGUscyxuLG8saCl9aWYobT09PWkuZW51bUJlemllcil7Y29uc3QgaT10O2lmKCFpLmlzTW9ub3RvbmVRdWlja0FuZERpcnR5KCkpe2NvbnN0IG49Tyg2LE51bWJlci5OYU4pO2xldCByPWkuZ2V0TW9ub3RvbmljUGFydFBhcmFtcyhuLmxlbmd0aCxuKTtuLmxlbmd0aD1yLHI9SGgodCxzLG4pO2xldCBhPTA7aWYocj4yKXtjb25zdCB0PW5ldyBQbSx1PWh8fFtdO2ZvcihsZXQgbT0xO208cjttKyspe2NvbnN0IGw9blttLTFdLGM9blttXTtpLnF1ZXJ5Q3V0KGwsYyx0LCEwKTtjb25zdCBnPXUubGVuZ3RoO2ErPWV1KDE9PT1tLHQuZ2V0KCksZSxzLCExLG8saCk7Y29uc3QgZD1tPT09ci0xLF89blttLTFdO2ZvcihsZXQgdD1nLGU9dS5sZW5ndGg7dDxlO3QrKylpZih1W3RdPSFkfHx0KzE8ZT9fK3VbdF06MSxvKXtjb25zdCBlPTIqdCxzPWkuZ2V0Q29vcmQyRCh1W3RdKTtpZihvW2VdLnNldENvb3Jkc1BvaW50MkQocyksZT4wKXtUaShvLnNsaWNlKGUtMikpfX19cmV0dXJuIGF9fXJldHVybiBldSghMCxpLGUscyxuLG8saCl9aWYobT09PWkuZW51bVJhdGlvbmFsQmV6aWVyMil7Y29uc3QgaT10O2lmKCFpLmlzTW9ub3RvbmVRdWlja0FuZERpcnR5KCkpe2NvbnN0IG49Tyg2LE51bWJlci5OYU4pO2xldCByPWkuZ2V0TW9ub3RvbmljUGFydFBhcmFtcyhuLmxlbmd0aCxuKTtuLmxlbmd0aD1yLHI9SGgodCxzLG4pO2xldCBhPTA7aWYocj4yKXtjb25zdCB0PW5ldyBQbSx1PWh8fFtdO2ZvcihsZXQgbT0xO208cjttKyspe2NvbnN0IGw9blttLTFdLGM9blttXTtpLnF1ZXJ5Q3V0KGwsYyx0LCEwKTtjb25zdCBnPXUubGVuZ3RoO2ErPUtoKDE9PT1tLHQuZ2V0KCksZSxzLCExLG8saCk7Y29uc3QgZD1tPT09ci0xLF89blttLTFdO2ZvcihsZXQgdD1nLGU9dS5sZW5ndGg7dDxlO3QrKylpZih1W3RdPSFkfHx0KzE8ZT9fK3VbdF06MSxvKXtjb25zdCBlPTIqdCxzPWkuZ2V0Q29vcmQyRCh1W3RdKTtpZihvW2VdLnNldENvb3Jkc1BvaW50MkQocyksZT4wKXtUaShvLnNsaWNlKGUtMikpfX19cmV0dXJuIGF9fXJldHVybiBLaCghMCxpLGUscyxuLG8saCl9YShcIlwiKX1mdW5jdGlvbiBqaCh0LGUsbixyLG8sYSxoLHUsbSl7Y29uc3QgbD10LmdldEdlb21ldHJ5VHlwZSgpO2lmKGEmJihhLmxlbmd0aD0wLGgubGVuZ3RoPTApLHUmJih1Lmxlbmd0aD0wKSxsPT09aS5lbnVtRWxsaXB0aWNBcmMpe2NvbnN0IGU9dDtpZihlLmlzRGVnZW5lcmF0ZVRvTGluZSgpfHxlLmlzRGVnZW5lcmF0ZSgwKSlyZXR1cm4gYSYmKGEucHVzaCh0LmdldFN0YXJ0WFkoKSksYS5wdXNoKEouZ2V0TkFOKCkpLGEucHVzaCh0LmdldEVuZFhZKCkpLGgucHVzaChOdW1iZXIuTmFOKSxoLnB1c2goTnVtYmVyLk5hTiksaC5wdXNoKE51bWJlci5OYU4pKSx1JiYodS5wdXNoKDApLHUucHVzaCgxKSksMX1jb25zdCBjPU8oOSxOdW1iZXIuTmFOKTtsZXQgZztpZihvKWc9dC5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKGMubGVuZ3RoLGMpLGMubGVuZ3RoPWcsZz1IaCh0LG4sYyk7ZWxzZXtpZihnPTIsY1swXT0wLGNbMV09MSxsPT09cWgudHlwZSl7Y29uc3QgZT10LmdldFN3ZWVwQW5nbGUoKTtpZihlPi45Kk1hdGguUEkpe2NvbnN0IHQ9MipNYXRoLlBJLzM7TWF0aC5taW4oMyxNYXRoLnRydW5jKGUvdCsuNSkpPjI/KGNbMF09MCxjWzFdPTEvMyxjWzJdPTIvMyxjWzNdPTEsZz00KTooY1swXT0wLGNbMV09LjUsY1syXT0xLGc9Myl9fWVsc2UgcyhsPT09RG4udHlwZSk7Yy5sZW5ndGg9Z31pZigyPT09ZyYmciYmKGNbMV09LjUsYy5wdXNoKDEpLGc9MyksYSl7Y29uc3QgZT1uZXcgUG07bGV0IHM9MTtmb3IoO3M8Zzspe2NvbnN0IG49Y1tzLTFdLHI9Y1tzXTt0LnF1ZXJ5Q3V0KG4scixlLCEwKTtjb25zdCB1PWN0KEosMyksbT1bMSwxLDFdO2lmKGw9PT1pLmVudW1FbGxpcHRpY0FyYyl7Y29uc3QgdD1lLmdldCgpO2lmKE1hdGguYWJzKHQuZ2V0U3dlZXBBbmdsZSgpKT4uOSpNYXRoLlBJKXtjb25zdCB0PShyLW4pLzM7Yy5zcGxpY2UocywwLG4rdCksYy5zcGxpY2UocysxLDAsbisyKnQpLGcrPTI7Y29udGludWV9bVsxXT1rdSh0LHUpfWVsc2V7Y29uc3QgdD1lLmdldCgpO3QucXVlcnlDb250cm9sUG9pbnRzKHUpLHQucXVlcnlXZWlnaHRzKG0pfW8mJlVhKHUpLDE9PT1zJiYoYS5wdXNoKHVbMF0uY2xvbmUoKSksaC5wdXNoKG1bMF0pKSxhLnB1c2godVsxXS5jbG9uZSgpKSxhLnB1c2godVsyXS5jbG9uZSgpKSxoLnB1c2gobVsxXSksaC5wdXNoKG1bMl0pLHMrK319cmV0dXJuIHUmJih1Lmxlbmd0aD1nLC
1QodSxjLDAsMCxnKSksZy0xfXFoLnR5cGU9aS5lbnVtRWxsaXB0aWNBcmM7Y2xhc3MgWmh7c3RhdGljIGNvbnN0cnVjdERlZmF1bHQodCl7cmV0dXJuIG5ldyBaaCgwLDAsMCx0LCExLEsoKSl9Y29uc3RydWN0b3IodCxlLHMsbixpLHIpe3RoaXMubV9zZWdtZW50QnVmZmVyPW51bGwsdGhpcy5tX2R1bW15UG9pbnQ9bmV3IEYsdGhpcy5tX3Byb2dyZXNzQ291bnRlcj0wLHRoaXMubV9wcm9ncmVzc1RyYWNrZXI9bix0aGlzLm1fYlNldERlbnNpZnlGbGFnPWksdGhpcy5tX21heExlbmd0aD10LHRoaXMubV9tYXhEZXZpYXRpb249ZSx0aGlzLm1fbWF4QW5nbGU9cz54dCgpP3h0KCk6cyx0aGlzLm1fY29zTWF4QW5nbGU9TWF0aC5jb3ModGhpcy5tX21heEFuZ2xlKSx0aGlzLm1fYk9ubHlDdXJ2ZURlbnNpZnk9dGhpcy5tX21heEFuZ2xlPjB8fHRoaXMubV9tYXhEZXZpYXRpb24+MCx0aGlzLm1fbWF4U2VnbWVudHNQZXJDdXJ2ZT1yLF8odGhpcy5tX21heFNlZ21lbnRzUGVyQ3VydmU+MCxcInRoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlID4gMFwiKSx0aGlzLm1fbWluU3RlcD0xL3RoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlfWRlbnNpZnkodCl7cmV0dXJuIHRoaXMuZGVuc2lmeUdlb20odCl9ZGVuc2lmeVNlZ21lbnQodCxlKXt0aGlzLmRlbnNpZnlTZWdtZW50RXgodCxudWxsLCEwLCExLGUpfWRlbnNpZnlFeCh0LGUscyxuLGkscil7cmV0dXJuIHRoaXMubV9tYXhMZW5ndGg9ZSx0aGlzLm1fbWF4RGV2aWF0aW9uPXMsdGhpcy5tX21heEFuZ2xlPW4+eHQoKT94dCgpOm4sdGhpcy5tX2Nvc01heEFuZ2xlPU1hdGguY29zKHRoaXMubV9tYXhBbmdsZSksdGhpcy5tX2JPbmx5Q3VydmVEZW5zaWZ5PXRoaXMubV9tYXhBbmdsZT4wfHx0aGlzLm1fbWF4RGV2aWF0aW9uPjAsdGhpcy5tX2JTZXREZW5zaWZ5RmxhZz1pLHRoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlPXIsXyh0aGlzLm1fbWF4U2VnbWVudHNQZXJDdXJ2ZT4wLFwidGhpcy5tX21heFNlZ21lbnRzUGVyQ3VydmUgPiAwXCIpLHRoaXMubV9taW5TdGVwPTEvdGhpcy5tX21heFNlZ21lbnRzUGVyQ3VydmUsdGhpcy5kZW5zaWZ5R2VvbSh0KX1kZW5zaWZ5R2VvbSh0KXtpZih0LmlzRW1wdHkoKXx8dC5nZXREaW1lbnNpb24oKTwxKXJldHVybiB0O2NvbnN0IGU9dC5nZXRHZW9tZXRyeVR5cGUoKTtyZXR1cm4gcChlKT90OmMoZSk/dGhpcy5kZW5zaWZ5TXVsdGlQYXRoKHQpOm0oZSk/dGhpcy5kZW5zaWZ5U2VnbWVudEltcGwodCk6ZT09PWkuZW51bUVudmVsb3BlP3RoaXMuZGVuc2lmeUVudmVsb3BlKHQpOnZvaWQgaChcIlwiKX1kZW5zaWZ5U2VnbWVudEV4KHQsZSxzLG4scil7Y29uc3Qgbz10LmdldEdlb21ldHJ5VHlwZSgpO2lmKCEodGhpcy5tX21heExlbmd0aD4wfHx0aGlzLm1fYk9ubHlDdXJ2ZURlbnNpZnkmJm8hPT1pLmVudW1MaW5lKSYmKCFufHxzKSlyZXR1cm4gdm9pZChlP289PT1pLmVudW1MaW5lP2UuYWRkU2VnbWVudCh0LHMpOihzJiYodC5xdWVyeVN0YXJ0KHRoaXMubV9kdW1teVBvaW50KSxlLnN0YXJ0UGF0aFBvaW50KHRoaXMubV9kdW1teVBvaW50KSksdC5xdWVyeUVuZCh0aGlzLm1fZHVtbXlQb2ludCksZS5saW5lVG9Qb2ludCh0aGlzLm1fZHVtbXlQb2ludCkpOihzJiZyLnB1c2goMCksci5wdXNoKDEpKSk7aWYobz09PWkuZW51bUJlemllcilyZXR1cm4gdm9pZCB0aGlzLmRlbnNpZnlDdWJpY0Jlemllcih0LGUscyxuLHIpO2lmKG89PT1pLmVudW1SYXRpb25hbEJlemllcjIpcmV0dXJuIHZvaWQgdGhpcy5kZW5zaWZ5UmF0aW9uYWxCZXppZXIyKHQsZSxzLG4scik7aWYobz09PWkuZW51bUJlemllcjIpcmV0dXJuIHZvaWQgdGhpcy5kZW5zaWZ5QmV6aWVyMih0LGUscyxuLHIpO2lmKG89PT1pLmVudW1FbGxpcHRpY0FyYyYmIXQuaXNMaW5lKCkmJnQuZ2V0TWlub3JNYWpvclJhdGlvKCk8LjI1KXJldHVybiB2b2lkIHRoaXMuZGVuc2lmeUVsbGlwdGljQXJjKHQsZSxzLG4scik7bGV0IGE9MTt0aGlzLm1fbWF4TGVuZ3RoPjAmJihhPXRoaXMuY2FsY3VsYXRlTGVuZ3RoU3ViZGl2aXNpb25TdGVwKHQsdGhpcy5tX21heExlbmd0aCkpLHRoaXMubV9tYXhEZXZpYXRpb24+MCYmKGE9TWF0aC5taW4oYSx0aGlzLmNhbGN1bGF0ZURldmlhdGlvblN1YmRpdmlzaW9uU3RlcCh0LHRoaXMubV9tYXhEZXZpYXRpb24pKSksdGhpcy5tX21heEFuZ2xlPjAmJihhPU1hdGgubWluKGEsdGhpcy5jYWxjdWxhdGVBbmd1bGFyU3ViZGl2aXNpb25TdGVwKHQsdGhpcy5tX21heEFuZ2xlKSkpLHRoaXMuZGVuc2lmeVNlZ21lbnRCeUxlbmd0aCh0LGEsZSxzLG4scil9ZGVuc2lmeU11bHRpUGF0aCh0KXtpZighdC5oYXNOb25MaW5lYXJTZWdtZW50cygpKXtpZigxPT09dC5nZXREZXNjcmlwdGlvbigpLmdldEF0dHJpYnV0ZUNvdW50KCkpcmV0dXJuIHRoaXMuZGVuc2lmeU11bHRpUGF0aExpbmVhcih0KTtpZighKHRoaXMubV9tYXhMZW5ndGg+MCkpcmV0dXJuIHR9Y29uc3QgZT10LmNyZWF0ZUluc3RhbmNlKCk7aWYoZS5nZXRHZW9tZXRyeVR5cGUoKT09PWkuZW51bVBvbHlnb24pe2Uuc2V0RmlsbFJ1bGUodC5nZXRGaWxsUnVsZSgpKX1lLnJlc2VydmUodC5nZXRQb2ludENvdW50KCkpO2NvbnN0IHM9dC5nZXRJbXBsKCkucXVlcnlTZWdtZW50SXRlcmF0b3IoKTtmb3IoO3MubmV4dFBhdGgoKTspe2xldCB0PSEwO2Zvcig7cy5oYXNOZXh0U2VnbWVudCgpOyl7Y29uc3Qgbj1zLm5leHRTZWdtZW50KCksaT1zLmlzQ2xvc2luZ1NlZ21lbnQoKTt0aGlzLmRlbnNpZnlTZWdtZW50RXgobixlLHQsaSxudWxsKSxpJiZlLmNsb3NlUGF0aFdpdGhMaW5lKCksdD0hMX19cmV0dXJuIGV9ZGVuc2lmeVNlZ21lbnRJbXBsKHQpe2NvbnN0IGU9bmV3IFFzKHt2ZDp0LmdldERlc2NyaXB0aW9uKCl9KSxzPVswXTtyZXR1cm4gdGhpcy5kZW5zaWZ5U2VnbWVudEV4KHQsZSwhMCwhMSxzKSxlfWRlbnNpZnlFbnZlbG9wZSh0KXtjb25zdCBlPW5ldyBtcih7dmQ6dC5nZXREZXNjcmlwdGlvbigpfSk7ZS5hZGRFbnZlbG9wZSh0LCExKTtjb25zdCBzPWxlLmNvbnN0cnVjdEVtcHR5KCk7dC5xdWVyeUVudmVsb3BlKHMpO2NvbnN0IG49cy53aWR0aCgpLGk9cy5oZWlnaHQoKTtyZXR1cm4hKHRoaXMubV9tYXhMZW5ndGg+MCl8fG48PXRoaXMubV9tYXhMZW5ndGgmJmk8PXRoaXMubV9tYXhMZW5ndGg/ZTp0aGlzLmRlbnNpZnlNdWx0aVBhdGgoZSl9ZGVuc2lmeU11bHRpUGF0aExpbmVhcih0KXtpZighKHRoaXMubV9tYXhMZW5ndGg+MCkpcmV0dXJuIHQ7Y29uc3QgZT10LmNyZWF0ZUluc3RhbmNlKCk7
1aWYoZS5nZXRHZW9tZXRyeVR5cGUoKT09PWkuZW51bVBvbHlnb24pe2Uuc2V0RmlsbFJ1bGUodC5nZXRGaWxsUnVsZSgpKX1lLnJlc2VydmUodC5nZXRQb2ludENvdW50KCkpO2NvbnN0IHM9ZS5nZXRJbXBsKCksbj10LmdldEltcGwoKSxyPW4uZ2V0QXR0cmlidXRlU3RyZWFtUmVmKDApLG89bmV3IGZtO2ZvcihsZXQgaT0wLGE9bi5nZXRQYXRoQ291bnQoKTtpPGE7aSsrKXtjb25zdCB0PW4uaXNDbG9zZWRQYXRoKGkpO2lmKDA9PT1uLmdldFBhdGhTaXplKGkpKWNvbnRpbnVlO2NvbnN0IGE9bi5nZXRQYXRoU3RhcnQoaSksaD1yLnJlYWRQb2ludDJEKDIqYSksdT1oLmNsb25lKCk7cy5zdGFydFBhdGgoaCk7Zm9yKGxldCBtPWErMSxsPW4uZ2V0UGF0aEVuZChpKTttPGw7bSsrKXtjb25zdCB0PXIucmVhZFBvaW50MkQoMiptKSxuPUouZGlzdGFuY2UodSx0KTtpZihuPnRoaXMubV9tYXhMZW5ndGgpe2xldCBlPU1hdGguY2VpbChuL3RoaXMubV9tYXhMZW5ndGgpO2U+SygpJiYoZT1LKCkpO2NvbnN0IGk9MS9lO2xldCByLGEsaDt1LmNvbXBhcmUodCk8MD8oby5zZXRTdGFydFhZKHUpLG8uc2V0RW5kWFkodCkscj0wLGE9MSk6KG8uc2V0U3RhcnRYWSh0KSxvLnNldEVuZFhZKHUpLHI9ZS0yLGE9LTEpO2ZvcihsZXQgdD0wLG49ZS0xO3Q8bjt0Kysscis9YSl7dGhpcy5wcm9ncmVzc18oKSxoPWkqKHIrMSk7Y29uc3QgdD1uZXcgSjtvLnF1ZXJ5Q29vcmQyRChoLHQpLHMubGluZVRvKHQpLHRoaXMubV9iU2V0RGVuc2lmeUZsYWcmJnMuc2V0QXR0cmlidXRlTm9DdXJ2ZXMoMTAscy5nZXRQb2ludENvdW50KCktMSwwLDEpfX1lbHNlIHRoaXMucHJvZ3Jlc3NfKCk7ZS5saW5lVG8odCksdS5hc3NpZ24odCl9aWYodCl7Y29uc3QgdD1KLmRpc3RhbmNlKHUsaCk7aWYodD50aGlzLm1fbWF4TGVuZ3RoKXtjb25zdCBlPWg7bGV0IG49TWF0aC5jZWlsKHQvdGhpcy5tX21heExlbmd0aCk7bj5LKCkmJihuPUsoKSk7Y29uc3QgaT0xL247bGV0IHIsYTt1LmNvbXBhcmUoZSk8MD8oby5zZXRTdGFydFhZKHUpLG8uc2V0RW5kWFkoZSkscj0wLGE9MSk6KG8uc2V0U3RhcnRYWShlKSxvLnNldEVuZFhZKHUpLHI9bi0yLGE9LTEpO2NvbnN0IG09bmV3IEooMCwwKTtsZXQgbDtmb3IobGV0IHQ9MCxoPW4tMTt0PGg7dCsrLHIrPWEpdGhpcy5wcm9ncmVzc18oKSxsPWkqKHIrMSksby5xdWVyeUNvb3JkMkQobCxtKSxzLmxpbmVUbyhtKSx0aGlzLm1fYlNldERlbnNpZnlGbGFnJiZzLnNldEF0dHJpYnV0ZU5vQ3VydmVzKDEwLHMuZ2V0UG9pbnRDb3VudCgpLTEsMCwxKX1zLmNsb3NlUGF0aFdpdGhMaW5lKCl9fXJldHVybiBlfWRlbnNpZnlTZWdtZW50QnlMZW5ndGgodCxlLG4scixvLGgpe3ModC5nZXRHZW9tZXRyeVR5cGUoKSE9PWkuZW51bUJlemllcik7bGV0IHU9dC5nZXRTdGFydFhZKCkuY29tcGFyZSh0LmdldEVuZFhZKCkpO2lmKDA9PT11JiZlPDEpe3QuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1FbGxpcHRpY0FyYz91PXQuZ2V0U3dlZXBBbmdsZSgpPDA/MTotMTphKFwiZGVuc2lmeSBzZWdtZW50IGJ5IGxlbmd0aFwiKX1sZXQgbT0wO2lmKHImJihuPyh0LnF1ZXJ5U3RhcnQodGhpcy5tX2R1bW15UG9pbnQpLG4uc3RhcnRQYXRoUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpKTpoLnB1c2goMCksKyttKSxlKnRoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlPDEmJihlPTEvdGhpcy5tX21heFNlZ21lbnRzUGVyQ3VydmUpLGU8MSl7dGhpcy5tX3NlZ21lbnRCdWZmZXJ8fCh0aGlzLm1fc2VnbWVudEJ1ZmZlcj1uZXcgUG0pO2xldCBzPU1hdGguY2VpbCgxL2UpO3M+SygpJiYocz1LKCkpLGU9MS9zLHRoaXMubV9zZWdtZW50QnVmZmVyLmNyZWF0ZSh0LmdldEdlb21ldHJ5VHlwZSgpKTtsZXQgaSxyLG8sYT10O3U8MD8oaT0wLHI9MSk6KHQuY29weVRvKHRoaXMubV9zZWdtZW50QnVmZmVyLmdldCgpKSx0aGlzLm1fc2VnbWVudEJ1ZmZlci5nZXQoKS5yZXZlcnNlKCksaT1zLTIscj0tMSxhPXRoaXMubV9zZWdtZW50QnVmZmVyLmdldCgpKTtjb25zdCBsPXMtMTtmb3IobGV0IHQ9MDt0PGw7dCsrLGkrPXIpbz1lKihpKzEpLG4/KGEucXVlcnlDb29yZChvLHRoaXMubV9kdW1teVBvaW50KSxuLmxpbmVUb1BvaW50KHRoaXMubV9kdW1teVBvaW50KSx0aGlzLm1fYlNldERlbnNpZnlGbGFnJiYxIT09byYmMCE9PW8mJm4uc2V0QXR0cmlidXRlKDEwLG4uZ2V0UG9pbnRDb3VudCgpLTEsMCwxKSk6aC5wdXNoKHU+MD8xLW86byksdGhpcy5wcm9ncmVzc18oKTtvPTEsbSs9bH0oIW98fG8mJnImJm08MikmJihuPyh0LnF1ZXJ5RW5kKHRoaXMubV9kdW1teVBvaW50KSxuLmxpbmVUb1BvaW50KHRoaXMubV9kdW1teVBvaW50KSk6aC5wdXNoKDEpKX1kZW5zaWZ5Q3ViaWNCZXppZXIodCxlLHMsbixpKXtjb25zdCByPW5ldyByYTtsZXQgbz10O2NvbnN0IGE9dC5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCk7bGV0IGg9dC5nZXRTdGFydFhZKCkuY29tcGFyZSh0LmdldEVuZFhZKCkpO2lmKDA9PT1oJiZhPjApe2NvbnN0IGU9Y3QoSiw0KTt0LnF1ZXJ5Q29udHJvbFBvaW50cyhlKSxoPWVbMV0uY29tcGFyZShlWzJdKSwwPT09aCYmKGg9ZVsxXS5jb21wYXJlKGVbMF0pKX1oPjAmJih0LmNvcHlUbyhyKSxyLnJldmVyc2UoKSxvPXIpO2xldCB1PTA7cyYmKGU/KHQucXVlcnlTdGFydCh0aGlzLm1fZHVtbXlQb2ludCksZS5zdGFydFBhdGhQb2ludCh0aGlzLm1fZHVtbXlQb2ludCkpOmkucHVzaCgwKSwrK3UpO2NvbnN0IG09W10sbD1bXSxjPU1hdGgudHJ1bmMoTWF0aC5sb2cyKHRoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlKSk7bGV0IGc9ITAsZD0wO2lmKGg+MClmb3IobS5wdXNoKFtvLmdldFN0YXJ0WFkoKSxvLmdldENvbnRyb2xQb2ludDEoKSxvLmdldENvbnRyb2xQb2ludDIoKSxvLmdldEVuZFhZKCksbmV3IEooMCwxKV0pLGwucHVzaCgwKTttLmxlbmd0aDspe3RoaXMucHJvZ3Jlc3NfKCk7Y29uc3QgdD1tLmF0KC0xKSxyPWwuYXQoLTEpLGE9dFs0XS54LGg9dFs0XS55O2lmKHI8YyYmdGhpcy5iZXppZXJOZWVkc1NwbGl0KHQpKXtnJiYoZD1vLmZpbmRNaW5EZXJpdigpLGc9ITEpO2xldCBlPS41KihhK2gpO01hdGguYWJzKGQtZSk8LjQqKGgtYSkmJihlPWQpO2NvbnN0IHM9KGUtYSkvKGgtYSksbj10WzBdLm11bCgxLXMpLmFkZCh0WzFdLm11bChzKSksaT10WzFdLm11bCgxLXMpLmFkZCh0WzJdLm11bChzKSksdT10WzJdLm11bCgxLXMpLmFkZCh0WzNdLm11bChzKSksYz1uLm11bCgxLXMpLmFkZChpLm11bChzKSksXz1pLm11bCgxLXMpLmFkZCh1Lm11bChzKSkscD1jLm11bCgxLXMpLmFkZChfLm11bChzKSksZj10WzNdO3RbMV09bix0WzJdPWMsdFszXT1wLHRbNF0uc2V0Q29vcmRzKGEsZSk7Y29uc3QgUD1bcCxfLHUsZixuZXcgSihlLGgpXTttLnB1c2goUCksbFtsLmxlbmd0aC0xXT1yKzEsbC5wdXNoKHIrMSk7Y29udGludWV9bS5wb3AoKSxsLnBvcCgpLChtLmxlbmd0aD4wfHwhbnx8biYmcyYmdTwyKSYmKGU/KG8ucXVlcnlDb29yZChhLHRoaXMubV9kdW1teVBvaW50KSxlLmxpbmVUb1BvaW50KHRoaXMubV9kdW1teVBvaW50KSx0aGlzLm1fYlNldERlbnNpZnlGbGFnJiYxIT09YSYmMCE9PWEmJmUuc2V0QXR0cmlidXRlKDEwLGUuZ2V0UG9pbnRDb3VudCgpLTEsMCwxKSk6aS5wdXNoKDEtYSksKyt1KX1lbHNlIGZvcihtLnB1c2goW28uZ2V0U3RhcnRYWSgpLG8uZ2V0Q29udHJvbFBvaW50MSgpLG8uZ2V0Q29udHJvbFBvaW50MigpLG8uZ2V0RW5kWFkoKSxuZXcgSigwLDEpXSksbC5wdXNoKDApO20ubGVuZ3RoOyl7dGhpcy5wcm9ncmVzc18oKTtjb25zdCB0PW0uYXQoLTEpLHI9bC5hdCgtMSksYT10WzRdLngsaD10WzRdLnk7aWYocjxjJiZ0aGlzLmJlemllck5lZWRzU3BsaXQodCkpe2cmJihkPW8uZmluZE1pbkRlcml2KCksZz0hMSk7bGV0IGU9
1LjUqKGEraCk7TWF0aC5hYnMoZC1lKTwuNCooaC1hKSYmKGU9ZCk7Y29uc3Qgcz0oZS1hKS8oaC1hKSxuPXRbMF0ubXVsKDEtcykuYWRkKHRbMV0ubXVsKHMpKSxpPXRbMV0ubXVsKDEtcykuYWRkKHRbMl0ubXVsKHMpKSx1PXRbMl0ubXVsKDEtcykuYWRkKHRbM10ubXVsKHMpKSxjPW4ubXVsKDEtcykuYWRkKGkubXVsKHMpKSxfPWkubXVsKDEtcykuYWRkKHUubXVsKHMpKSxwPWMubXVsKDEtcykuYWRkKF8ubXVsKHMpKSxmPXRbMF07dFswXT1wLHRbMV09Xyx0WzJdPXUsdFs0XS5zZXRDb29yZHMoZSxoKTtjb25zdCBQPVtmLG4sYyxwLG5ldyBKKGEsZSldO20ucHVzaChQKSxsW2wubGVuZ3RoLTFdPXIrMSxsLnB1c2gocisxKTtjb250aW51ZX1tLnBvcCgpLGwucG9wKCksKG0ubGVuZ3RoPjB8fCFufHxuJiZzJiZ1PDIpJiYoZT8oby5xdWVyeUNvb3JkKGgsdGhpcy5tX2R1bW15UG9pbnQpLGUubGluZVRvUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpLHRoaXMubV9iU2V0RGVuc2lmeUZsYWcmJjEhPT1oJiYwIT09aCYmZS5zZXRBdHRyaWJ1dGUoMTAsZS5nZXRQb2ludENvdW50KCktMSwwLDEpKTppLnB1c2goaCksKyt1KX19ZGVuc2lmeVJhdGlvbmFsQmV6aWVyMih0LGUscyxuLGkpe2NvbnN0IHI9bmV3IERuO2xldCBvPXQ7Y29uc3QgYT10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTtsZXQgaD10LmdldFN0YXJ0WFkoKS5jb21wYXJlKHQuZ2V0RW5kWFkoKSk7MD09PWgmJmE+MCYmKGg9MCksaD4wJiYodC5jb3B5VG8ociksci5yZXZlcnNlKCksbz1yKTtsZXQgdT0wO3MmJihlPyh0LnF1ZXJ5U3RhcnQodGhpcy5tX2R1bW15UG9pbnQpLGUuc3RhcnRQYXRoUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpKTppLnB1c2goMCksKyt1KTtjb25zdCBtPU1hdGgudHJ1bmMoTWF0aC5sb2cyKHRoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlKSksbD1uZXcgRG4sYz1bXSxnPVtdO2ZvcihjLnB1c2gobmV3IFUoMCwxKSksZy5wdXNoKDApO2MubGVuZ3RoOyl7dGhpcy5wcm9ncmVzc18oKTtjb25zdCB0PWMuYXQoLTEpLmNsb25lKCkscj1nLmF0KC0xKTtpZihyPG0mJnRoaXMucmF0aW9uYWxCZXppZXIyTmVlZHNTcGxpdChvLGwsdC52bWluLHQudm1heCkpe2NvbnN0IGU9dC5nZXRDZW50ZXIoKTtoPjA/KGMuYXQoLTEpLnZtYXg9ZSxjLnB1c2gobmV3IFUoZSx0LnZtYXgpKSk6KGMuYXQoLTEpLnZtaW49ZSxjLnB1c2gobmV3IFUodC52bWluLGUpKSksZ1tnLmxlbmd0aC0xXT1yKzEsZy5wdXNoKHIrMSk7Y29udGludWV9aWYoYy5wb3AoKSxnLnBvcCgpLGMubGVuZ3RoPjB8fCFufHxuJiZzJiZ1PDIpe2NvbnN0IHM9aD4wP3Qudm1pbjp0LnZtYXg7ZT8oby5xdWVyeUNvb3JkKHMsdGhpcy5tX2R1bW15UG9pbnQpLGUubGluZVRvUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpLHRoaXMubV9iU2V0RGVuc2lmeUZsYWcmJjEhPT1zJiYwIT09cyYmZS5zZXRBdHRyaWJ1dGUoMTAsZS5nZXRQb2ludENvdW50KCktMSwwLDEpKTppLnB1c2goaD4wPzEtczpzKSwrK3V9fX1kZW5zaWZ5QmV6aWVyMih0LGUscyxuLGkpe2NvbnN0IHI9bmV3IEFuO2xldCBvPXQ7Y29uc3QgYT10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKTtsZXQgaD10LmdldFN0YXJ0WFkoKS5jb21wYXJlKHQuZ2V0RW5kWFkoKSk7MD09PWgmJmE+MCYmKGg9MCksaD4wJiYodC5jb3B5VG8ociksci5yZXZlcnNlKCksbz1yKTtsZXQgdT0wO3MmJihlPyh0LnF1ZXJ5U3RhcnQodGhpcy5tX2R1bW15UG9pbnQpLGUuc3RhcnRQYXRoUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpKTppLnB1c2goMCksKyt1KTtjb25zdCBtPU1hdGguY2VpbChNYXRoLmxvZzIodGhpcy5tX21heFNlZ21lbnRzUGVyQ3VydmUpKSxsPW5ldyBBbixjPVtdLGc9W107Zm9yKGMucHVzaChuZXcgVSgwLDEpKSxnLnB1c2goMCk7Yy5sZW5ndGg7KXt0aGlzLnByb2dyZXNzXygpO2NvbnN0IHQ9Yy5hdCgtMSkuY2xvbmUoKSxyPWcuYXQoLTEpO2lmKHI8bSYmdGhpcy5iZXppZXIyTmVlZHNTcGxpdChvLGwsdC52bWluLHQudm1heCkpe2NvbnN0IGU9dC5nZXRDZW50ZXIoKTtoPjA/KGMuYXQoLTEpLnZtYXg9ZSxjLnB1c2gobmV3IFUoZSx0LnZtYXgpKSk6KGMuYXQoLTEpLnZtaW49ZSxjLnB1c2gobmV3IFUodC52bWluLGUpKSksZ1tnLmxlbmd0aC0xXT1yKzEsZy5wdXNoKHIrMSk7Y29udGludWV9aWYoYy5wb3AoKSxnLnBvcCgpLGMubGVuZ3RoPjB8fCFufHxuJiZzJiZ1PDIpe2NvbnN0IHM9aD4wP3Qudm1pbjp0LnZtYXg7ZT8oby5xdWVyeUNvb3JkKHMsdGhpcy5tX2R1bW15UG9pbnQpLGUubGluZVRvUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpLHRoaXMubV9iU2V0RGVuc2lmeUZsYWcmJjEhPT1zJiYwIT09cyYmZS5zZXRBdHRyaWJ1dGUoMTAsZS5nZXRQb2ludENvdW50KCktMSwwLDEpKTppLnB1c2goaD4wPzEtczpzKSwrK3V9fX1kZW5zaWZ5RWxsaXB0aWNBcmModCxlLHMsbixpKXtjb25zdCByPW5ldyBxaDtsZXQgbz10O2NvbnN0IGE9dC5jYWxjdWxhdGVVcHBlckxlbmd0aDJEKCk7bGV0IGg9dC5nZXRTdGFydFhZKCkuY29tcGFyZSh0LmdldEVuZFhZKCkpOzA9PT1oJiZhPjAmJihoPXQuaXNDbG9ja3dpc2UoKT8wOjEpLGg+MCYmKHQuY29weVRvKHIpLHIucmV2ZXJzZSgpLG89cik7bGV0IHU9MDtzJiYoZT8odC5xdWVyeVN0YXJ0KHRoaXMubV9kdW1teVBvaW50KSxlLnN0YXJ0UGF0aFBvaW50KHRoaXMubV9kdW1teVBvaW50KSk6aS5wdXNoKDApLCsrdSk7Y29uc3QgbT1NYXRoLnRydW5jKE1hdGgubG9nMih0aGlzLm1fbWF4U2VnbWVudHNQZXJDdXJ2ZSkpLGw9bmV3IHFoLGM9W10sZz1bXTtmb3IoYy5wdXNoKG5ldyBVKDAsMSkpLGcucHVzaCgwKTtjLmxlbmd0aDspe3RoaXMucHJvZ3Jlc3NfKCk7Y29uc3QgdD1jLmF0KC0xKS5jbG9uZSgpLHI9Zy5hdCgtMSk7aWYocjxtJiZ0aGlzLmVsbGlwdGljQXJjTmVlZHNTcGxpdChvLGwsdC52bWluLHQudm1heCkpe2NvbnN0IGU9dC5nZXRDZW50ZXIoKTtoPjA/KGMuYXQoLTEpLnZtYXg9ZSxjLnB1c2gobmV3IFUoZSx0LnZtYXgpKSk6KGMuYXQoLTEpLnZtaW49ZSxjLnB1c2gobmV3IFUodC52bWluLGUpKSksZ1tnLmxlbmd0aC0xXT1yKzEsZy5wdXNoKHIrMSk7Y29udGludWV9aWYoYy5wb3AoKSxnLnBvcCgpLGMubGVuZ3RoPjB8fCFufHxuJiZzJiZ1PDIpe2NvbnN0IHM9aD4wP3Qudm1pbjp0LnZtYXg7ZT8oby5xdWVyeUNvb3JkKHMsdGhpcy5tX2R1bW15UG9pbnQpLGUubGluZVRvUG9pbnQodGhpcy5tX2R1bW15UG9pbnQpLHRoaXMubV9iU2V0RGVuc2lmeUZsYWcmJjEhPT1zJiYwIT09cyYmZS5zZXRBdHRyaWJ1dGUoMTAsZS5nZXRQb2ludENvdW50KCktMSwwLDEpKTppLnB1c2goaD4wPzEtczpzKSwrK3V9fX1jYWxjdWxhdGVMZW5ndGhTdWJkaXZpc2lvblN0ZXAodCxlKXtjb25zdCBzPXQuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO2lmKCF0LmlzQ3VydmUoKSlyZXR1cm4gcz9lL3M6MTtpZih0LmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtRWxsaXB0aWNBcmMpe2NvbnN0IG49dDtpZihuLmlzQ2lyY3VsYXIoKXx8bi5pc0RlZ2VuZXJhdGUoMCl8fG4uaXNEZWdlbmVyYXRlVG9MaW5lKCkpe2xldCB0PWUvcztyZXR1cm4gdDx0aGlzLm1fbWluU3RlcCYmKHQ9dGhpcy5tX21pblN0ZXApLHR9cmV0dXJuIGUvcypuLmdldFNlbWlBeGVzKCkueS9uLmdldFNlbWlBeGVzKCkueH10LmdldEdlb21ldHJ5VHlwZSgpPT09aS5lbnVtQmV6aWVyJiZhKFwiXCIpLGEoXCJcIil9Y2FsY3VsYXRlRGV2aWF0aW9uU3ViZGl2aXNpb25TdGVwKHQsZSl7aWYoIXQuaXNDdXJ2ZSgpKXJldHVybiAxO2lmKHQuZ2V0R2VvbWV0cnlUeXBlKCk9PT
11pLmVudW1FbGxpcHRpY0FyYyl7Y29uc3Qgcz10O2lmKHMuaXNEZWdlbmVyYXRlKDApfHxzLmlzRGVnZW5lcmF0ZVRvTGluZSgpKXJldHVybiAxO3tjb25zdCBuPXMuZ2V0U2VtaU1ham9yQXhpcygpLGk9MS1lL247bGV0IHI9TWF0aC5QSS8yO2lmKGk+MCl7Y29uc3QgdD00Kk1hdGguc3FydChlL24qLjUpO3I9TWF0aC5taW4oTWF0aC5QSS8yLE1hdGguYWJzKHQpKX1yPU1hdGgubWF4KHIsMipNYXRoLlBJL3RoaXMubV9tYXhTZWdtZW50c1BlckN1cnZlKTtjb25zdCBvPXIqbjtyZXR1cm4gdGhpcy5jYWxjdWxhdGVMZW5ndGhTdWJkaXZpc2lvblN0ZXAodCxvKX19YShcIlwiKX1jYWxjdWxhdGVBbmd1bGFyU3ViZGl2aXNpb25TdGVwKHQsZSl7aWYoIXQuaXNDdXJ2ZSgpKXJldHVybiAxO2lmKHQuZ2V0R2VvbWV0cnlUeXBlKCk9PT1pLmVudW1FbGxpcHRpY0FyYyl7Y29uc3Qgcz10O3JldHVybiBzLmlzRGVnZW5lcmF0ZSgwKXx8cy5pc0RlZ2VuZXJhdGVUb0xpbmUoKT8xOnRoaXMuY2FsY3VsYXRlTGVuZ3RoU3ViZGl2aXNpb25TdGVwKHQsZSpzLmdldFNlbWlNaW5vckF4aXMoKSl9YShcIlwiKX1yYXRpb25hbEJlemllcjJOZWVkc1NwbGl0KHQsZSxzLG4pe3QuY3V0QmV6aWVySWdub3JlQXR0cmlidXRlcyhzLG4sZSk7bGV0IGk9ITE7aWYodGhpcy5tX21heExlbmd0aD4wKXtpZihlLmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKT50aGlzLm1fbWF4TGVuZ3RoKXJldHVybiBpPSEwLCEwfWNvbnN0IHI9Y3QoSiwzKTtlLnF1ZXJ5Q29udHJvbFBvaW50cyhyKTtjb25zdCBvPVswLDAsMF07cmV0dXJuIGUucXVlcnlXZWlnaHRzKG8pLCFpJiZ0aGlzLm1fbWF4RGV2aWF0aW9uPjAmJihpPSFaaC5jaGVja1JhdGlvbmFsQmV6aWVyMk1heERldmlhdGlvbihyLG8sdGhpcy5tX21heERldmlhdGlvbikpLCFpJiZ0aGlzLm1fbWF4QW5nbGU+MCYmKGk9IVpoLmNoZWNrUmF0aW9uYWxCZXppZXIyTWF4QW5nbGUocixvLHRoaXMubV9jb3NNYXhBbmdsZSkpLGl9YmV6aWVyMk5lZWRzU3BsaXQodCxlLHMsbil7dC5jdXRCZXppZXJJZ25vcmVBdHRyaWJ1dGVzKHMsbixlKTtsZXQgaT0hMTtpZih0aGlzLm1fbWF4TGVuZ3RoPjApe2lmKGUuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpPnRoaXMubV9tYXhMZW5ndGgpcmV0dXJuIGk9ITAsITB9Y29uc3Qgcj1jdChKLDMpO3JldHVybiBlLnF1ZXJ5Q29udHJvbFBvaW50cyhyKSwhaSYmdGhpcy5tX21heERldmlhdGlvbj4wJiYoaT0hWmguY2hlY2tCZXppZXIyTWF4RGV2aWF0aW9uKHIsdGhpcy5tX21heERldmlhdGlvbikpLCFpJiZ0aGlzLm1fbWF4QW5nbGU+MCYmKGk9IVpoLmNoZWNrQmV6aWVyMk1heEFuZ2xlKHIsdGhpcy5tX2Nvc01heEFuZ2xlKSksaX1lbGxpcHRpY0FyY05lZWRzU3BsaXQodCxlLHMsbil7dC5jdXRBcmNJZ25vcmVBdHRyaWJ1dGVzKHMsbixlKTtsZXQgaT0hMTtpZih0aGlzLm1fbWF4TGVuZ3RoPjApe2lmKGUuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpPnRoaXMubV9tYXhMZW5ndGgpcmV0dXJuIGk9ITAsITB9cmV0dXJuIWkmJnRoaXMubV9tYXhEZXZpYXRpb24+MCYmKGk9IVpoLmNoZWNrRWxsaXB0aWNBcmNNYXhEZXZpYXRpb24oZSx0aGlzLm1fbWF4RGV2aWF0aW9uKSksIWkmJnRoaXMubV9tYXhBbmdsZT4wJiYoaT0hWmguY2hlY2tFbGxpcHRpY0FyY01heEFuZ2xlKGUsdGhpcy5tX2Nvc01heEFuZ2xlKSksaX1iZXppZXJOZWVkc1NwbGl0KHQpe2xldCBlPSExO2lmKHRoaXMubV9tYXhMZW5ndGg+MCl7aWYoSi5kaXN0YW5jZSh0WzBdLHRbMV0pK0ouZGlzdGFuY2UodFsxXSx0WzJdKStKLmRpc3RhbmNlKHRbMl0sdFszXSk+dGhpcy5tX21heExlbmd0aClyZXR1cm4gZT0hMCwhMH1yZXR1cm4hZSYmdGhpcy5tX21heERldmlhdGlvbj4wJiYoZT0hWmguY2hlY2tCZXppZXJNYXhEZXZpYXRpb24odCx0aGlzLm1fbWF4RGV2aWF0aW9uKSksIWUmJnRoaXMubV9tYXhBbmdsZT4wJiYoZT0hWmguY2hlY2tCZXppZXJNYXhBbmdsZSh0LHRoaXMubV9jb3NNYXhBbmdsZSkpLGV9cHJvZ3Jlc3NfKCl7fXN0YXRpYyBjaGVja0Jlemllck1heERldmlhdGlvbih0LGUpe2NvbnN0IHM9dFszXS5zdWIodFswXSk7aWYocy5zcXJMZW5ndGgoKT4wKXtjb25zdCBuPXMuY2xvbmUoKTtuLmxlZnRQZXJwZW5kaWN1bGFyVGhpcygpLG4ubm9ybWFsaXplKCk7Y29uc3QgaT1uLmRvdFByb2R1Y3QodFswXS5zdWIodFsxXSkpLHI9bi5kb3RQcm9kdWN0KHRbMF0uc3ViKHRbMl0pKTtpZihNYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyhyKSk8PWUpe2NvbnN0IGU9bmV3IEo7eW8odCwuNSxlLCExKTtjb25zdCBuPWUuc3ViKHRbMF0pLmRvdFByb2R1Y3Qocyk7cmV0dXJuIG4+PTAmJm48PXMuc3FyTGVuZ3RoKCl9cmV0dXJuITF9cmV0dXJuIE1hdGgubWF4KHRbMF0uc3ViKHRbMV0pLnNxckxlbmd0aCgpLHRbMF0uc3ViKHRbMl0pLnNxckxlbmd0aCgpKTw9ZSplfXN0YXRpYyBjaGVja0Jlemllck1heEFuZ2xlKHQsZSl7aWYodFswXS5lcXVhbHModFszXSkpcmV0dXJuISghdFswXS5lcXVhbHModFsxXSl8fCF0WzFdLmVxdWFscyh0WzJdKSk7Y29uc3Qgcz10WzNdLnN1Yih0WzBdKTtzLm5vcm1hbGl6ZSgpO3tjb25zdCBuPXRbMV0uc3ViKHRbMF0pLGk9bi5kb3RQcm9kdWN0KHMpO2lmKGk8MClyZXR1cm4hMTtpZihuLmxlbmd0aCgpKmU+aSlyZXR1cm4hMX17Y29uc3Qgbj10WzJdLnN1Yih0WzBdKSxpPW4uZG90UHJvZHVjdChzKTtpZihpPDApcmV0dXJuITE7aWYobi5sZW5ndGgoKSplPmkpcmV0dXJuITF9e2NvbnN0IG49dFsyXS5zdWIodFsxXSksaT1uLmRvdFByb2R1Y3Qocyk7aWYoaTwwKXJldHVybiExO2lmKG4ubGVuZ3RoKCkqZT5pKXJldHVybiExfXJldHVybiEwfXN0YXRpYyBjaGVja1JhdGlvbmFsQmV6aWVyMk1heERldmlhdGlvbih0LGUscyl7aWYoMD09PWVbMV0pcmV0dXJuITE7Y29uc3Qgbj10WzJdLnN1Yih0WzBdKTtpZihuLnNxckxlbmd0aCgpPjApe2NvbnN0IGU9bi5jbG9uZSgpO2UubGVmdFBlcnBlbmRpY3VsYXJUaGlzKCksZS5ub3JtYWxpemUoKTtjb25zdCBpPWUuZG90UHJvZHVjdCh0WzBdLnN1Yih0WzFdKSk7aWYoTWF0aC5hYnMoaSk8PXMpe2NvbnN0IGU9dFsxXS5zdWIodFswXSkuZG90UHJvZHVjdChuKTtyZXR1cm4gZT49MCYmZTw9bi5zcXJMZW5ndGgoKX1yZXR1cm4hMX1yZXR1cm4gdFswXS5zdWIodFsxXSkuc3FyTGVuZ3RoKCk8PXMqc31zdGF0aWMgY2hlY2tSYXRpb25hbEJlemllcjJNYXhBbmdsZSh0LGUscyl7aWYoMD09PWVbMV0pcmV0dXJuITE7aWYodFswXS5lcXVhbHModFsyXSkpcmV0dXJuISF0WzBdLmVxdWFscyh0WzFdKTtjb25zdCBuPXRbMl0uc3ViKHRbMF0pO24ubm9ybWFsaXplKCk7e2NvbnN0IGU9dFsxXS5zdWIodFswXSksaT1lLmRvdFByb2R1Y3Qobik7aWYoaTwwKXJldHVybiExO2lmKGUubGVuZ3RoKCkqcz5pKXJldHVybiExfXJldHVybiEwfXN0YXRpYyBjaGVja0JlemllcjJNYXhEZXZpYXRpb24odCxlKXtjb25zdCBzPXRbMl0uc3ViKHRbMF0pO2lmKHMuc3FyTGVuZ3RoKCk+MCl7Y29uc3Qgbj1zLmNsb25lKCk7bi5sZWZ0UGVycGVuZGljdWxhclRoaXMoKSxuLm5vcm1hbGl6ZSgpO2NvbnN0IGk9bi5kb3RQcm9kdWN0KHRbMF0uc3ViKHRbMV0pKTtpZihNYXRoLmFicyhpKTw9ZSl7Y29uc3QgZT10WzFdLnN1Yih0WzBdKS5kb3RQcm9kdWN0KHMpO3JldHVybiBlPj0wJiZlPD1zLnNxckxlbmd0aCgpfXJldHVybiExfXJldHVybi
1B0WzBdLnN1Yih0WzFdKS5zcXJMZW5ndGgoKTw9ZSplfXN0YXRpYyBjaGVja0JlemllcjJNYXhBbmdsZSh0LGUpe2lmKHRbMF0uZXF1YWxzKHRbMl0pKXJldHVybiEhdFswXS5lcXVhbHModFsxXSk7Y29uc3Qgcz10WzJdLnN1Yih0WzBdKTtzLm5vcm1hbGl6ZSgpO3tjb25zdCBuPXRbMV0uc3ViKHRbMF0pLGk9bi5kb3RQcm9kdWN0KHMpO2lmKGk8MClyZXR1cm4hMTtpZihuLmxlbmd0aCgpKmU+aSlyZXR1cm4hMX1yZXR1cm4hMH1zdGF0aWMgY2hlY2tFbGxpcHRpY0FyY01heERldmlhdGlvbih0LGUpe2lmKE1hdGguYWJzKHQuZ2V0U3dlZXBBbmdsZSgpKTxNYXRoLlBJKXtjb25zdCBzPXQuZ2V0RW5kWFkoKS5zdWIodC5nZXRTdGFydFhZKCkpLG49WzAsMF07aWYoMT09PWVtKHQscyxuKSl7Y29uc3Qgcz10LmdldENvb3JkMkQoblswXSksaT1KLmdldENsb3Nlc3RDb29yZGluYXRlKHQuZ2V0U3RhcnRYWSgpLHQuZ2V0RW5kWFkoKSxzKSxyPW5ldyBKO0N0KHQuZ2V0U3RhcnRYWSgpLHQuZ2V0RW5kWFkoKSxpLHIpO3JldHVybiBKLmRpc3RhbmNlKHMscik8PWV9fWNvbnN0IHM9dC5nZXRDb29yZDJEKC41KSxuPW5ldyBKO0N0KHQuZ2V0RW5kWFkoKSx0LmdldFN0YXJ0WFkoKSwuNSxuKTtyZXR1cm4gSi5kaXN0YW5jZShzLG4pPD1lfXN0YXRpYyBjaGVja0VsbGlwdGljQXJjTWF4QW5nbGUodCxlKXtjb25zdCBzPXQuZ2V0VGFuZ2VudCgwKSxuPXQuZ2V0VGFuZ2VudCgxKSxpPXMuZG90UHJvZHVjdChuKTtyZXR1cm4hKGk8MCkmJiEocy5sZW5ndGgoKSpuLmxlbmd0aCgpKmU+aSl9c3RhdGljIGNoZWNrVHlwZUZvclJlcGxhY2UodCxlKXtyZXR1cm4gdC5nZXRHZW9tZXRyeVR5cGUoKT09PWUmJihlIT09aS5lbnVtRWxsaXB0aWNBcmN8fHQuaXNDaXJjdWxhcigpKX19ZnVuY3Rpb24gSGgodCxlLHMpe2NvbnN0IG49cy5sZW5ndGg7aWYoZTw9MHx8bjw9MilyZXR1cm4gbjtsZXQgaT0wO2NvbnN0IHI9TyhuLTEsTnVtYmVyLk5hTik7Zm9yKGxldCBvPTEsYT1uO288YTtvKyspe2NvbnN0IGU9dC50VG9MZW5ndGgoc1tvXSk7cltvLTFdPWUtaSxpPWV9Zm9yKDtyLmxlbmd0aD4xOyl7Y29uc3QgdD1yLmZpbmRJbmRleCh0PT50PD0yKmUpO2lmKC0xPT09dClicmVhaztsZXQgbj10KzEsaT10KzE7aWYodD4wKXtjb25zdCBlPXQtMTsoaT09PXIubGVuZ3RofHxyW2VdPnJbaV0pJiYoaT1lLG4tLSl9cltpXSs9clt0XSxyLnNwbGljZSh0LDEpLHMuc3BsaWNlKG4sMSl9cmV0dXJuIHMubGVuZ3RofWZ1bmN0aW9uIFVoKHQsZSxzLG4saSl7Y29uc3Qgcj1bXSxvPVtdLGE9R2goZSxzLDAsbiwhMSxyLG8pLGg9bmV3IHJhO2xldCB1PWk7Y29uc3QgbT1lLmdldERlc2NyaXB0aW9uKCk7aC5hc3NpZ25WZXJ0ZXhEZXNjcmlwdGlvbihtKTtjb25zdCBsPW0uZ2V0QXR0cmlidXRlQ291bnQoKT4xLGM9bmV3IEYsZz1uZXcgZm07Zm9yKGxldCBkPTAsXz0wO2Q8YTtkKyspe2lmKHJbXysxXS5pc05BTigpKXtpZihsKXtsZXQgdD1vW2RdO2UucXVlcnlDb29yZCh0LGMpLGcuc2V0U3RhcnQoYyksdD1vW2QrMV0sZS5xdWVyeUNvb3JkKHQsYyksZy5zZXRFbmQoYyl9Zy5zZXRTdGFydFhZKHJbX10pLGcuc2V0RW5kWFkocltfKzNdKSx0LmFkZFNlZ21lbnQoZyx1KX1lbHNle2lmKGwpe2xldCB0PW9bZF07ZS5xdWVyeUNvb3JkKHQsYyksaC5zZXRTdGFydChjKSx0PW9bZCsxXSxlLnF1ZXJ5Q29vcmQodCxjKSxoLnNldEVuZChjKX1oLnNldFN0YXJ0WFkocltfXSksaC5zZXRDb250cm9sUG9pbnQxKHJbXysxXSksaC5zZXRDb250cm9sUG9pbnQyKHJbXysyXSksaC5zZXRFbmRYWShyW18rM10pLHQuYWRkU2VnbWVudChoLHUpfV8rPTMsdT0hMX19ZnVuY3Rpb24gT2godCxlLHMsbixpKXtjb25zdCByPVtdLG89W10sYT1XaChlLHMsMCxuLCExLHIsbyksaD1uZXcgQW47bGV0IHU9aTtjb25zdCBtPWUuZ2V0RGVzY3JpcHRpb24oKTtoLmFzc2lnblZlcnRleERlc2NyaXB0aW9uKG0pO2NvbnN0IGw9bS5nZXRBdHRyaWJ1dGVDb3VudCgpPjEsYz1uZXcgRixnPW5ldyBmbTtmb3IobGV0IGQ9MCxfPTA7ZDxhO2QrKyl7aWYocltfKzFdLmlzTkFOKCkpe2lmKGwpe2xldCB0PW9bZF07ZS5xdWVyeUNvb3JkKHQsYyksZy5zZXRTdGFydChjKSx0PW9bZCsxXSxlLnF1ZXJ5Q29vcmQodCxjKSxnLnNldEVuZChjKX1nLnNldFN0YXJ0WFkocltfXSksZy5zZXRFbmRYWShyW18rMl0pLHQuYWRkU2VnbWVudChnLHUpfWVsc2V7aWYobCl7bGV0IHQ9b1tkXTtlLnF1ZXJ5Q29vcmQodCxjKSxoLnNldFN0YXJ0KGMpLHQ9b1tkKzFdLGUucXVlcnlDb29yZCh0LGMpLGguc2V0RW5kKGMpfWguc2V0U3RhcnRYWShyW19dKSxoLnNldENvbnRyb2xQb2ludDEocltfKzFdKSxoLnNldEVuZFhZKHJbXysyXSksdC5hZGRTZWdtZW50KGgsdSl9Xys9Mix1PSExfX1mdW5jdGlvbiBRaCh0LGUsbixyLG8pe3ModD09PWkuZW51bUJlemllcnx8dD09PWkuZW51bUVsbGlwdGljQXJjfHx0PT09aS5lbnVtQmV6aWVyMik7Y29uc3QgYT1lLmNyZWF0ZUluc3RhbmNlKCk7YS5nZXRHZW9tZXRyeVR5cGUoKT09PWkuZW51bVBvbHlnb24mJmEuc2V0RmlsbFJ1bGUoZS5nZXRGaWxsUnVsZSgpKTtjb25zdCB1PWUucXVlcnlTZWdtZW50SXRlcmF0b3IoKTtmb3IobGV0IG09MCxsPWUuZ2V0UGF0aENvdW50KCk7bTxsOysrbSl7aWYoIWUuaGFzTm9uTGluZWFyU2VnbWVudHNQYXRoKG0pKXthLmFkZFBhdGgoZSxtLCEwKTtjb250aW51ZX1jb25zdCBvPWUuZ2V0UGF0aFN0YXJ0KG0pO2xldCBsPSEwLGM9MDtmb3IodS5yZXNldFRvUGF0aChtKSxzKHUubmV4dFBhdGgoKSk7dS5oYXNOZXh0U2VnbWVudCgpOyl7Y29uc3Qgcz11Lm5leHRDdXJ2ZSgpO2lmKCFzKWJyZWFrO3tjb25zdCBnPXUuZ2V0U3RhcnRQb2ludEluZGV4KCktbyxkPWctYztkPjAmJihhLmFkZFNlZ21lbnRzRnJvbVBhdGgoZSxtLGMsZCxsKSxsPSExKSxjPWcrMSx0PT09aS5lbnVtQmV6aWVyP1VoKGEscyxuLHIsbCk6dD09PWkuZW51bUJlemllcjI/T2goYSxzLG4scixsKTpoKFwiXCIpLGw9ITF9fWNvbnN0IGc9ZS5nZXRTZWdtZW50Q291bnRQYXRoKG0pO2ctYyE9PTAmJmEuYWRkU2VnbWVudHNGcm9tUGF0aChlLG0sYyxnLWMsbCl9cmV0dXJuIGF9ZnVuY3Rpb24gSmgodCxlLHMsbixpLHIsbyxhKXtjb25zdCBoPWUuY2xvbmUoKTtoLmRyb3BBbGxBdHRyaWJ1dGVzKCk7Y29uc3QgdT0odCxlLHMsbik9PihlJiYodCYmZS5wdXNoKG4uZ2V0U3RhcnRYWSgpKSxlLnB1c2goSi5nZXROQU4oKSksZS5wdXNoKEouZ2V0TkFOKCkpLGUucHVzaChuLmdldEVuZFhZKCkpKSxzJiYodCYmcy5wdXNoKDApLHMucHVzaCgxKSksMSk7aWYoaC5pc0RlZ2VuZXJhdGVUb0xpbmUoKXx8aC5pc0RlZ2VuZXJhdGUoMCkpcmV0dXJuIHUodCxyLG8sZSk7Y29uc3QgbT1oLmdldFN0YXJ0WFkoKSxsPWguZ2V0RW5kWFkoKSxjPWguZ2V0U2VtaUF4ZXMoKSxnPW5ldyBjZTtpZihoLmlzQ2lyY3VsYXIoKSlnLnNldElkZW50aXR5KCk7ZWxzZXtjb25zdCB0PWguZ2V0QXhpc1hSb3RhdGlvbigpO2cuc2V0U2NhbGVDb29yZHMoMSxoLmdldE1pbm9yTWFqb3JSYXRpbygpKSxnLnJvdGF0ZUFuZ2xlKHQpfWNvbnN0IGQ9aC5nZXRDZW50ZXIoKTtnLnNoaWZ0KGQpO2NvbnN0IF89Zy5jbG9uZSgpO18uaW52ZXJ0VGhpcygpLGguYXBwbHlUcmFuc2Zvcm1hdGlvbihfKTtjb25zdCBwPWguZ2V0U3dlZXBBbmdsZSgpO2lmKDA9PT1wKXJldHVybi
1B1KHQscixvLGUpO2NvbnN0IGY9bGUuY29uc3RydWN0RW1wdHkoKTtmLnNldENvb3Jkcyh7Y2VudGVyOmQsd2lkdGg6MipjLngsaGVpZ2h0OjIqYy54fSk7Y29uc3QgUD0uMDUqZi5jYWxjdWxhdGVUb2xlcmFuY2VGcm9tRW52ZWxvcGUoKSx5PU1hdGgubWF4KHMvYy54LFAvYy54KTtsZXQgeD00Kk1hdGgucG93KHkvLjA3NDEsMS82KTt4PU1hdGgubWluKHgsTWF0aC5QSS8yKTtjb25zdCBDPU1oKGguZ2V0U3RhcnRBbmdsZSgpKTtsZXQgdj1wPjA/TWF0aC5mbG9vcihDL3gpOk1hdGguY2VpbChDL3gpO3YqPXg7Y29uc3QgYj1wPjA/eDoteDt2K2I9PT1DJiYodis9Yik7bGV0IFM9NC8zKk1hdGgudGFuKE1hdGguYWJzKHgpLzQpO3A+MCYmKFM9LVMpLG8mJnQmJm8ucHVzaCgwKTtjb25zdCBFPXgvTWF0aC5hYnMocCk7bGV0IEQ9KHYtQykvcDtjb25zdCB3PW0uY2xvbmUoKSxBPW5ldyBKO2gucXVlcnlDb29yZDJEKDAsQSk7Y29uc3QgVD1BLmNsb25lKCksST0xLS4wMSpFO2xldCBNPTAsWT0wO2Zvcig7RDwxOyl7bGV0IHM7aWYoRCs9RSxZPjAmJkQ8SSlzPVM7ZWxzZXtEPj1JJiYoRD0xKTtjb25zdCB0PShELVkpKnA7cz00LzMqTWF0aC50YW4oTWF0aC5hYnModCkvNCkscD4wJiYocz0tcyl9aC5xdWVyeUNvb3JkMkQoRCxBKTtjb25zdCBhPW5ldyBKO2cucXVlcnlUcmFuc2Zvcm0oQSxhKTtjb25zdCB1PWUuZ2V0Q2xvc2VzdENvb3JkaW5hdGUoYSwhMSk7aWYoZS5xdWVyeUNvb3JkMkQodSxhKSwxIT09RCYmKEouZGlzdGFuY2UodyxhKTw9MipufHxKLmRpc3RhbmNlKGEsbCk8PTIqbikpY29udGludWU7dy5zZXRDb29yZHNQb2ludDJEKGEpO2NvbnN0IGM9Y3QoSiw0KTtjWzBdLmFzc2lnbihUKSxjWzNdLmFzc2lnbihBKSxjWzFdLnJpZ2h0UGVycGVuZGljdWxhck90aGVyKFQpLGNbMV0uc2NhbGVBZGRUaGlzKHMsVCksY1syXS5sZWZ0UGVycGVuZGljdWxhck90aGVyKEEpLGNbMl0uc2NhbGVBZGRUaGlzKHMsQSksZy50cmFuc2Zvcm1Qb2ludHMyRChjLDMsYyksY1szXS5hc3NpZ24oYSksMD09PVkmJmNbMF0uc2V0Q29vcmRzUG9pbnQyRChtKSwxPT09RCYmY1szXS5zZXRDb29yZHNQb2ludDJEKGwpLGkmJmdvKGMpO2xldCBkPSEwO2ZvcihsZXQgdD0xO3Q8NDt0KyspaWYoIWNbdF0uaXNFcXVhbFBvaW50MkQoY1swXSkpe2Q9ITE7YnJlYWt9ZHx8KG8mJm8ucHVzaCh1KSxyJiYoMD09PVkmJnQmJnIucHVzaChjWzBdLmNsb25lKCkpLHIucHVzaChjWzFdLmNsb25lKCkpLHIucHVzaChjWzJdLmNsb25lKCkpLHIucHVzaChjWzNdLmNsb25lKCkpKSxNKyspLFk9RCxULnNldENvb3Jkc1BvaW50MkQoQSl9cmV0dXJuIE19ZnVuY3Rpb24gS2godCxlLHMsbixpLHIsbyxhKXtlLmNsb25lKCkuZHJvcEFsbEF0dHJpYnV0ZXMoKTtjb25zdCBoPW5ldyBsZTtlLnF1ZXJ5TG9vc2VFbnZlbG9wZShoKTtjb25zdCB1PS4wNSpoLmNhbGN1bGF0ZVRvbGVyYW5jZUZyb21FbnZlbG9wZSgpLG09TWF0aC5tYXgocyx1KTtvJiZ0JiZvLnB1c2goMCk7bGV0IGw9MDtjb25zdCBjPWN0KEosMyk7ZS5xdWVyeUNvbnRyb2xQb2ludHMoYyk7Y29uc3QgZz1bMCwwLDBdO2UucXVlcnlXZWlnaHRzKGcpO2NvbnN0IGQ9W10sXz1PKDksTnVtYmVyLk5hTik7bGV0IHA9ZS5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKF8ubGVuZ3RoLF8pO18ubGVuZ3RoPXAscD1IaChlLG4sXyk7bGV0IGY9MCxQPXQ7Zm9yKGxldCB5PTE7eTxwO3krKyl7Y29uc3QgdD1fW3ldO2ZvcihkLnB1c2goZiksZC5wdXNoKHQpO2QubGVuZ3RoPjE7KXtjb25zdCB0PWQuYXQoLTEpO2QucG9wKCk7Y29uc3QgZT1kLmF0KC0xKSxzPWN0KEosMyk7SmEoYyxnLHQsZSxzLFswLDAsMF0pO2NvbnN0IG49Y3QoSiwzKSxpPUtpKHMsZyxuKSxhPTE2LGg9ZC5sZW5ndGg+YTttPj1pfHxoPyhvLnB1c2goZSksciYmKFAmJihyLnB1c2goblswXSksUD0hMSksci5wdXNoKG5bMV0pLHIucHVzaChuWzJdKSksbCsrKTooZC5wdXNoKC41Kih0K2UpKSxkLnB1c2godCkpfWY9dH1yZXR1cm4gbH1mdW5jdGlvbiAkaCh0LGUscyxuLGkscixvLGEpe2UuY2xvbmUoKS5kcm9wQWxsQXR0cmlidXRlcygpO2NvbnN0IGg9bmV3IGxlO2UucXVlcnlMb29zZUVudmVsb3BlKGgpO2NvbnN0IHU9LjA1KmguY2FsY3VsYXRlVG9sZXJhbmNlRnJvbUVudmVsb3BlKCksbT1NYXRoLm1heChzLHUpO28mJnQmJm8ucHVzaCgwKTtsZXQgbD0wO2NvbnN0IGM9Y3QoSiwzKTtlLnF1ZXJ5Q29udHJvbFBvaW50cyhjKTtjb25zdCBnPVswLDAsMF07ZS5xdWVyeVdlaWdodHMoZyk7Y29uc3QgZD1bXSxfPU8oOSxOdW1iZXIuTmFOKTtsZXQgcD0wO2k/KHA9ZS5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKF8ubGVuZ3RoLF8pLF8ubGVuZ3RoPXAscD1IaChlLG4sXykpOihfLmxlbmd0aD0yLHA9MixfWzBdPTAsX1sxXT0xKTtsZXQgZj0wLFA9dDtmb3IobGV0IHk9MTt5PHA7eSsrKXtjb25zdCB0PV9beV07Zm9yKGQubGVuZ3RoPTAsZC5wdXNoKHQpLGQucHVzaChmKTtkLmxlbmd0aD4xOyl7Y29uc3QgdD1kLmF0KC0xKTtkLnBvcCgpO2NvbnN0IGU9ZC5hdCgtMSkscz1jdChKLDMpLG49WzAsMCwwXTtKYShjLGcsdCxlLHMsbik7Y29uc3QgaT1jdChKLDQpLGE9S2EocyxuLGkpLGg9MTYsdT1kLmxlbmd0aD5oO20+PWF8fHU/KG8ucHVzaChlKSxyJiYoUCYmKHIucHVzaChpWzBdKSxQPSExKSxyLnB1c2goaVsxXSksci5wdXNoKGlbMl0pLHIucHVzaChpWzNdKSksbCsrKTooZC5wdXNoKC41Kih0K2UpKSxkLnB1c2godCkpfWY9dH1yZXR1cm4gbH1mdW5jdGlvbiB0dSh0LGUscyxuLGkscixvLGEpe2NvbnN0IGg9ZS5jbG9uZSgpO2lmKGguZHJvcEFsbEF0dHJpYnV0ZXMoKSxoLmlzRGVnZW5lcmF0ZVRvTGluZSgpfHwwPT09aC5nZXRTd2VlcEFuZ2xlKCkpcmV0dXJuIHImJih0JiZyLnB1c2goZS5nZXRTdGFydFhZKCkpLHIucHVzaChKLmdldE5BTigpKSxyLnB1c2goZS5nZXRFbmRYWSgpKSksbyYmKHQmJm8ucHVzaCgwKSxvLnB1c2goMSkpLDE7Y29uc3QgdT1oLmdldFN0YXJ0WFkoKSxtPWguZ2V0RW5kWFkoKSxsPWguZ2V0U2VtaUF4ZXMoKSxjPW5ldyBjZTtpZihoLmlzQ2lyY3VsYXIoKSljLnNldElkZW50aXR5KCk7ZWxzZXtjb25zdCB0PWguZ2V0QXhpc1hSb3RhdGlvbigpO2Muc2V0U2NhbGVDb29yZHMoMSxoLmdldE1pbm9yTWFqb3JSYXRpbygpKSxjLnJvdGF0ZUFuZ2xlKHQpfWNvbnN0IGc9aC5nZXRDZW50ZXIoKTtjLnNoaWZ0KGcpO2NvbnN0IGQ9Yy5jbG9uZSgpO2QuaW52ZXJ0VGhpcygpLGguYXBwbHlUcmFuc2Zvcm1hdGlvbihkKTtjb25zdCBfPWxlLmNvbnN0cnVjdEVtcHR5KCk7Xy5zZXRDb29yZHMoe2NlbnRlcjpnLHdpZHRoOjIqbC54LGhlaWdodDoyKmwueH0pO2NvbnN0IHA9LjA1Kl8uY2FsY3VsYXRlVG9sZXJhbmNlRnJvbUVudmVsb3BlKCksZj1NYXRoLm1heChzL2wueCxwL2wueCksUD1NYXRoLnNxcnQ
1oMipmK2YqZik7bGV0IHk9MipNYXRoLnNxcnQoMipQKigxK2YtUCkpO3k9TWF0aC5taW4oeSxNYXRoLlBJLzIpO2NvbnN0IHg9aC5nZXRTd2VlcEFuZ2xlKCksQz1NYXRoLmNlaWwoTWF0aC5hYnMoeCkveSksdj1NYXRoLm1heChDLDEpO3k9eC92O2NvbnN0IGI9MS92O2xldCBTPU1hdGgudGFuKE1hdGguYWJzKHkpLzIpO3g+MCYmKFM9LVMpLG8mJnQmJm8ucHVzaCgwKTtjb25zdCBFPW5ldyBKO2gucXVlcnlDb29yZDJEKDAsRSk7Zm9yKGxldCBEPTA7RDx2O0QrKyl7Y29uc3QgZT1FLmNsb25lKCkscz0oRCsxKSpiO2lmKG8mJm8ucHVzaChzKSwhciljb250aW51ZTtoLnF1ZXJ5Q29vcmQyRChzLEUpO2NvbnN0IG49Y3QoSiwzKTtuWzBdLmFzc2lnbihlKSxuWzJdLmFzc2lnbihFKSxuWzFdLnJpZ2h0UGVycGVuZGljdWxhck90aGVyKG5bMF0pLG5bMV0ubXVsVGhpcyhTKSxuWzFdLmFkZFRoaXMoblswXSksYy50cmFuc2Zvcm1Qb2ludHMyRChuLDMsbiksMD09PUQmJm5bMF0uc2V0Q29vcmRzUG9pbnQyRCh1KSxEPT09di0xJiZuWzJdLnNldENvb3Jkc1BvaW50MkQobSksMD09PUQmJnQmJnIucHVzaChuWzBdKSxyLnB1c2goblsxXSksci5wdXNoKG5bMl0pfXJldHVybiB2fWZ1bmN0aW9uIGV1KHQsZSxzLG4saSxyLG8sYSl7ZS5jbG9uZSgpLmRyb3BBbGxBdHRyaWJ1dGVzKCk7Y29uc3QgaD1uZXcgbGU7ZS5xdWVyeUxvb3NlRW52ZWxvcGUoaCk7Y29uc3QgdT0uMDUqaC5jYWxjdWxhdGVUb2xlcmFuY2VGcm9tRW52ZWxvcGUoKSxtPU1hdGgubWF4KHMsdSk7byYmdCYmby5wdXNoKDApO2xldCBsPTA7Y29uc3QgYz1jdChKLDQpO2UucXVlcnlDb250cm9sUG9pbnRzKGMpO2NvbnN0IGc9W10sZD1PKDksTnVtYmVyLk5hTik7bGV0IF89ZS5nZXRNb25vdG9uaWNQYXJ0UGFyYW1zKGQubGVuZ3RoLGQpO2QubGVuZ3RoPV8sXz1IaChlLG4sZCk7bGV0IHA9MCxmPXQ7Zm9yKGxldCBQPTE7UDxfO1ArKyl7Y29uc3QgdD1kW1BdO2ZvcihnLnB1c2gocCksZy5wdXNoKHQpO2cubGVuZ3RoPjE7KXtjb25zdCB0PWcuYXQoLTEpO2cucG9wKCk7Y29uc3QgZT1nLmF0KC0xKSxzPWN0KEosNCk7UG8oYyx0LGUscyk7Y29uc3Qgbj1jdChKLDMpLGk9SmkocyxuKSxhPTE2LGg9Zy5sZW5ndGg+YTttPj1pfHxoPyhvLnB1c2goZSksciYmKGYmJihyLnB1c2goblswXSksZj0hMSksci5wdXNoKG5bMV0pLHIucHVzaChuWzJdKSksbCsrKTooZy5wdXNoKC41Kih0K2UpKSxnLnB1c2godCkpfXA9dH1yZXR1cm4gbH1mdW5jdGlvbiBzdSgpe3JldHVybntlMjowLGNvbXBsZXRlRTowfX1jbGFzcyBudXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMubV9hcmM9dCx0aGlzLm1fc3FyQ2hvcmRMZW5ndGg9ZX1nZXRNYXhEZXJpdmF0aXZlKCl7cmV0dXJuIDF9Z2V0VmFsdWUodCxlKXtyZXR1cm4gMD09PXQ/Si5zcXJEaXN0YW5jZSh0aGlzLm1fYXJjLmdldENvb3JkMkQoZSksdGhpcy5tX2FyYy5nZXRDb29yZDJEKDEtZSkpLXRoaXMubV9zcXJDaG9yZExlbmd0aDowfWdldEVycm9yKHQpe3JldHVybiAwfX1mdW5jdGlvbiBpdSh0LGUscyl7aWYoRXUodCkpe3JldHVybiB2b2lkIHZzKG5ldyBmbSh7c3RhcnQ6dC5nZXRTdGFydFhZKCksZW5kOnQuZ2V0RW5kWFkoKX0pLGUscyl9aWYoMD09PWUudmFsdWUoKSlzLnNldCh0LmdldFN0YXJ0WFkoKSk7ZWxzZSBpZigxPT09ZS52YWx1ZSgpKXMuc2V0KHQuZ2V0RW5kWFkoKSk7ZWxzZXtjb25zdCBuPW5ldyBodDtkdSh0LGUsbik7Y29uc3QgaT1uZXcgaHQscj1uZXcgaHQ7aHQuc3RfY29zQW5kU2luKG4saSxyKTtjb25zdCBvPU5lLmNvbnN0cnVjdENvb3Jkc0UobmV3IGh0KHQubV9zZW1pTWFqb3JBeGlzKS5tdWxUaGlzRShpKSxuZXcgaHQodC5tX3NlbWlNYWpvckF4aXMpLm11bFRoaXModC5tX21pbm9yTWFqb3JSYXRpbykubXVsVGhpc0UocikpLGE9bmV3IGh0KHQubV9yb3RhdGlvbik7aHQuc3RfY29zQW5kU2luKGEsaSxyKSxvLnJvdGF0ZURpcmVjdChpLHIpLG8uYWRkVGhpc0UoTmUuY29uc3RydWN0UG9pbnQyRCh0Lm1fY2VudGVyKSkscy5zZXRFKG8pfX1mdW5jdGlvbiBydSh0LGUpe3JldHVybiB0LmNvbnZlcnRUb0Nhbm9uaWMoZSl9ZnVuY3Rpb24gb3UodCxlKXtjb25zdCBzPW5ldyBVKHQuZ2V0U3RhcnRBbmdsZSgpLHQuZ2V0RW5kQW5nbGUoKSk7cy5ub3JtYWxpemUoKTtjb25zdCBuPUd0KCksaT1uZShlLG4pO2lmKGk8cy52bWluKXtsZXQgdD1pK247Zm9yKDt0PHMudm1pbjspdCs9bjtyZXR1cm4gcy5jb250YWluc0Nvb3JkaW5hdGUodCk/dDpzLnZtaW4taTx0LXMudm1heD9pOnR9aWYoaT5zLnZtYXgpe2xldCB0PWktbjtmb3IoO3Q+cy52bWF4Oyl0LT1uO3JldHVybiBzLmNvbnRhaW5zQ29vcmRpbmF0ZSh0KXx8cy52bWluLXQ8aS1zLnZtYXg/dDppfXJldHVybiBpfWZ1bmN0aW9uIGF1KHQsZSxzLG4pe2xldCBpPXQubV9zdGFydEFuZ2xlLHI9dC5tX3N3ZWVwQW5nbGU7Y29uc3Qgbz0xZS0xMjtmb3IoO2k+QXQoKTspaS09MipBdCgpO2Zvcig7aTw9LUF0KCk7KWkrPTIqQXQoKTtpZighTnVtYmVyLmlzTmFOKGUpKXtmb3IoO2U+QXQoKTspZS09MipBdCgpO2Zvcig7ZTw9LUF0KCk7KWUrPTIqQXQoKTshcyYmZT5pJiYoZS09MipBdCgpKSxzJiZlPGkmJihlKz0yKkF0KCkpLHI9ZS1pLE1hdGguYWJzKHIpPG8mJiFuJiYocj1zPzIqQXQoKTotMipBdCgpKSxNYXRoLmFicyhyKT4yKkF0KCktbyYmbiYmKHI9MCl9TWF0aC5hYnMocik+MipBdCgpLW8mJihyPXI+PTA/MipBdCgpOi0yKkF0KCksdC5zZXRFbmRYWSh0LmdldFN0YXJ0WFkoKSkpLE1hdGguYWJzKHIpPG8mJihyPTAsdC5zZXRFbmRYWSh0LmdldFN0YXJ0WFkoKSkpLG49TWF0aC5hYnMocik8PUF0KCksciYmKHM9cj4wKSx0Lm1fc3RhcnRBbmdsZT1odShpKSx0Lm1fc3dlZXBBbmdsZT1yLEZ1KHQsIW4pLFh1KHQscyl9ZnVuY3Rpb24gaHUodCl7bGV0IGU9dCxzPSExO3JldHVybiBlPD0tQXQoKT8oZSs9R3QoKSxzPSEwKTplPkF0KCkmJihlLT1HdCgpLHM9ITApLGU8PS1BdCgpPyhlPW5lKGUsR3QoKSksZTw9LUF0KCkmJihlKz1HdCgpKSxzPSEwKTplPkF0KCkmJihlPW5lKGUsR3QoKSksZT5BdCgpJiYoZS09R3QoKSkscz0hMCkscyYmKGU+QXQoKXx8ZTw9LUF0KCkpJiYoZT1BdCgpKSxlfWZ1bmN0aW9uIHV1KHQsZSxzKXtjb25zdCBuPXMsaT1uLmdldFNlbWlBeGVzKCk7bGV0IHI9bmV3IEooaS54Kk1hdGguY29zKHRbMF0pLGkueSpNYXRoLnNpbih0WzBdKSk7cmV0dXJuIHI9bi5jb252ZXJ0RnJvbUNhbm9uaWMociksSi5zcXJEaXN0YW5jZShyLG4uZ2V0U3RhcnRYWSgpKX1mdW5jdGlvbiBtdSh0LGUscyl7Y29uc3Qgbj1zLGk9bi5nZXRTZW1pQXhlcygpLHI9dFswXStuLmdldFN0YXJ0QW5nbGUoKTtsZXQgbz1uZXcgSihpLngqTWF0aC5jb3MociksaS55Kk1hdGguc2luKHIpKTtyZXR1cm4gbz1uLmNvbnZlcnRGcm9tQ2Fub25pYyhvKSxKLnNxckRpc3RhbmNlKG8sbi5nZXRFbmRYWSgpKX1mdW5jdGlvbiBsdSh0KXtpZih0Lm1fY2VudGVyLmlzTkFOKCkpcmV0dXJuIHQubV9zdGFydEFuZ2xlPTAsdm9pZCh0Lm1fc3dlZXBBbmdsZT0wKTtjb25zdCBlPXQuZ2V0U3RhcnRYWSgpLHM9dC5nZXRFbmRYWSgpLG49ZS5lcXVhbHMocyksaT1WdSh0KSxyPXF1KHQpLG89dC5wcm9qZWN0aW9uQmVoYXZpb3IoKTtpZihuKXtjb25zdCBzPXQuY29udmVydFRvQ2Fub25pYyhlKSxuPW5ldyBKKHQubV9zZW1pTWFqb3JBeGlzLHQubV9zZW1pTWFqb3JBeGlzKnQubV9taW5vck1ham9yUmF0aW8pO3MueC89bi54LHMueS89bi55LHQubV9zdGFydEFuZ2xlPWh1KE1hdGguYXRhbjIocy55LHMueCkpLHQubV9zd2VlcEFuZ2xlPWk/cj9HdCgpOi1HdCgpOjB9ZWxzZXtjb25zdCBuPXQuY29udmVydFRvQ2Fub25pYyhlKSxhPW5ldyBKKHQubV9zZW1pTWFqb3JBeGlzLHQubV9zZW1pTWFqb3JBeGlzKnQubV9taW5vck1ham9yUmF0aW8pO24ueC89YS54LG4ueS89YS55O2NvbnN0IGg9dC5jb252ZXJ0VG9DYW5vbmljKHMpO2gueC89YS54LGgueS89YS55LHQubV9zdGFydEFuZ2xlPU1hdGguYXRhbjIobi55LG4ueCksdC5tX3N3ZWVwQW5nbGU9Si5jYWxjdWxhdGVBbmdsZShuLGgpLHI/dC5tX3N3ZWVwQW5nbGU8MCYmKHQubV9zd2VlcEFuZ2xlKz1HdCgpKTp0Lm1fc3dlZXBBbmdsZT4wJiYodC5tX3N3ZWVwQW5nbGUtPUd0KCkpLHQubV9zdGFydEFuZ2xlPWh1KHQubV9zdGFydEFuZ2xlKTtsZXQgdT11dShbdC5tX3N0YXJ0QW5nbGVdLDEsdCk7aWYodT1NYXRoLnNxcnQ
1odSksdT4uMjUqcnModCkpe2NvbnN0IGU9dC5tX3N0YXJ0QW5nbGUtMWUtNCxzPXQubV9zdGFydEFuZ2xlKzFlLTQsbj1bMF07b24odXUsdCwxLFt0Lm1fc3RhcnRBbmdsZV0sW2VdLFtzXSwxZS0xNCxuKSx0Lm1fc3RhcnRBbmdsZT1odShuWzBdKX1pZih1PW11KFt0Lm1fc3dlZXBBbmdsZV0sMSx0KSx1PU1hdGguc3FydCh1KSx1Pi4yNSpycyh0KSl7Y29uc3QgZT10Lm1fc3dlZXBBbmdsZS0xZS00LHM9dC5tX3N3ZWVwQW5nbGUrMWUtNCxuPVswXTtvbihtdSx0LDEsW3QubV9zd2VlcEFuZ2xlXSxbZV0sW3NdLDFlLTE0LG4pLHQubV9zd2VlcEFuZ2xlPW5bMF19Y29uc3QgbT1NYXRoLmFicyh0Lm1fc3dlZXBBbmdsZSk+QXQoKTtpZihGdSh0LG0pLGkhPT1tJiYhaSYmTWF0aC5hYnModC5tX3N3ZWVwQW5nbGUpPjEuNSpBdCgpKXJldHVybiB2b2lkIFN1KHQsZSxzLG8pO2lmKDA9PT10Lm1fc3dlZXBBbmdsZXx8ciE9PXQubV9zd2VlcEFuZ2xlPjApcmV0dXJuIHZvaWQgU3UodCxlLHMsbyl9fWZ1bmN0aW9uIGN1KHQsZSl7cmV0dXJuKG91KHQsZSktdC5nZXRTdGFydEFuZ2xlKCkpL3QuZ2V0U3dlZXBBbmdsZSgpfWZ1bmN0aW9uIGd1KHQsZSl7cmV0dXJuIHQubV9zdGFydEFuZ2xlK2UqdC5tX3N3ZWVwQW5nbGV9ZnVuY3Rpb24gZHUodCxlLHMpe3MuYXNzaWduKG5ldyBodCh0Lm1fc3RhcnRBbmdsZSkuYWRkRShlLm11bEUobmV3IGh0KHQubV9zd2VlcEFuZ2xlKSkpKX1mdW5jdGlvbiBfdSh0LGUpe2NvbnN0IHM9bmV3IGh0KHQubV9jb3NyKS5zcXJUaGlzKCksbj1uZXcgaHQodC5tX3NpbnIpLnNxclRoaXMoKSxpPW5ldyBodCh0Lm1fbWlub3JNYWpvclJhdGlvKSxyPW5ldyBodCgxL3QubV9taW5vck1ham9yUmF0aW8pLG89aS5tdWxFKHMpLmFkZFRoaXNFKHIubXVsRShuKSksYT1pLnN1YkUocikubXVsVGhpcygyKnQubV9jb3NyKnQubV9zaW5yKSxoPWkubXVsRShuKS5hZGRUaGlzRShyLm11bEUocykpO2VbMF09byxlWzFdPWEsZVsyXT1oLGVbM109bmV3IGh0KC10Lm1fc2VtaU1ham9yQXhpcykubXVsVGhpcyh0Lm1fc2VtaU1ham9yQXhpcykubXVsVGhpcyh0Lm1fbWlub3JNYWpvclJhdGlvKX1mdW5jdGlvbiBwdSh0LGUpe2NvbnN0IHM9bmV3IFhlO3MuYTExLnNldEUodFswXSkscy5hMTI9aHQuc3RfbXVsQnlQb3dlcjIodFsxXSwuNSkscy5hMjEuc2V0RShzLmExMikscy5hMjIuc2V0RSh0WzJdKTtjb25zdCBuPVtKLmdldE5BTigpLEouZ2V0TkFOKCldLGk9W25ldyBodCxuZXcgaHRdO3MuZWlnZW5TeW1tZXRyaWMoaSxuKTtjb25zdCByPXRbM10uY2xvbmUoKTtyLm5lZ2F0ZVRoaXMoKSxyLmludlRoaXMoKSxpWzBdLm11bFRoaXNFKHIpLGlbMV0ubXVsVGhpc0UociksaVswXS5zcXJ0VGhpcygpLmludlRoaXMoKSxpWzFdLnNxcnRUaGlzKCkuaW52VGhpcygpLGUueD1pWzBdLnRvRG91YmxlKCksZS55PWlbMV0udG9Eb3VibGUoKTtyZXR1cm4gTWF0aC5hdGFuMihuWzBdLnksblswXS54KX1mdW5jdGlvbiBmdSh0LGUscyl7aWYoRXUodCkpcmV0dXJuKHMtZSkqSi5kaXN0YW5jZSh0LmdldFN0YXJ0WFkoKSx0LmdldEVuZFhZKCkpO2lmKDE9PT10Lm1fbWlub3JNYWpvclJhdGlvKXJldHVybiBNYXRoLmFicyh0LmdldFN3ZWVwQW5nbGUoKSooZS1zKSkqdC5tX3NlbWlNYWpvckF4aXM7Y29uc3Qgbj1EdSh0LGUpO3JldHVybiBEdSh0LHMpLW59ZnVuY3Rpb24gUHUodCl7cmV0dXJuIHQubV9jYWNoZWRWYWx1ZXN9ZnVuY3Rpb24geXUodCl7aWYodC5tX2NhY2hlZFZhbHVlcylyZXR1cm4gdC5tX2NhY2hlZFZhbHVlcztjb25zdCBlPXN1KCk7cmV0dXJuIGUuZTI9dnUodCksZS5jb21wbGV0ZUU9SnQoZS5lMiksdC5tX2NhY2hlZFZhbHVlcz1lLGV9ZnVuY3Rpb24geHUodCxlLHMsbil7aWYoIWUuaXNFcXVhbCh0Lm1fWFN0YXJ0LHQubV9ZU3RhcnQpfHwhcy5pc0VxdWFsKHQubV9YRW5kLHQubV9ZRW5kKSl7aWYoRXUodCkpcmV0dXJuIHQubV9YU3RhcnQ9ZS54LHQubV9ZU3RhcnQ9ZS55LHQubV9YRW5kPXMueCx0Lm1fWUVuZD1zLnksVXUodCksdm9pZCB0LmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCk7aWYobiYmTWF0aC5hYnModC5nZXRTd2VlcEFuZ2xlKCkpPD0xLjAxKnh0KCkpe2NvbnN0IG49Y3QoSiwzKSxpPWt1KHQsbik7aWYoWmEobikpe25bMF0uYXNzaWduKGUpLG5bMl0uYXNzaWduKHMpLFVhKG4pO2lmKDA9PT10LnByb2plY3Rpb25CZWhhdmlvcigpKXtsZXQgZT0wLHM9MjtKLnNxckRpc3RhbmNlKG5bMV0sblswXSk8Si5zcXJEaXN0YW5jZShuWzFdLG5bMl0pJiYocz1zdChlLGU9cykpO2NvbnN0IGk9bltzXS5zdWIobltlXSkscj1pLmxlbmd0aCgpO2kuZGl2VGhpcyhyKTtjb25zdCBvPW5bMV0uc3ViKG5bZV0pLGE9by5sZW5ndGgoKSxoPW8uZG90UHJvZHVjdChpKS9hLHU9by5jcm9zc1Byb2R1Y3QoaSkvYSxtPW5ldyBKO0N0KG5bZV0sbltzXSwuNSxtKTtjb25zdCBsPS41KnIvdSpwdCgxLWgsMCwxKSxjPW5bMV0uc2lkZShuW2VdLG5bc10pLGc9aS5jbG9uZSgpO2M/Zy5sZWZ0UGVycGVuZGljdWxhclRoaXMoKTpnLnJpZ2h0UGVycGVuZGljdWxhclRoaXMoKTtjb25zdCBkPW0uc3ViKGcubXVsKGwpKTt0LmNvbnN0cnVjdENpcmN1bGFyQXJjVGhyZWVQb2ludChuWzBdLG5bMl0sZCl9ZWxzZSBHdShuLGkqaSxudWxsLCExLHQpO3JldHVybn19MD09PXQucHJvamVjdGlvbkJlaGF2aW9yKCk/aW0odCxlLHMpOnJtKHQsZSxzKX19ZnVuY3Rpb24gQ3UodCxlLHMpe2NvbnN0IG49MD09PXQucHJvamVjdGlvbkJlaGF2aW9yKCk7aWYoczw9MilyZXR1cm4gdm9pZCBTdSh0LGVbMF0sZVtzLTFdLG4/MDoxKTtpZihuKXt0LmNvbnN0cnVjdENpcmN1bGFyQXJjVGhyZWVQb2ludChlWzBdLGVbcy0xXSxlW01hdGgudHJ1bmMocy8yKV0pO2NvbnN0IG49bmV3IEo7cmV0dXJuIHQucXVlcnlDb29yZDJEKC41LG4pLHZvaWQgdC5tX2ludGVyaW9yLnNldENvb3Jkc1BvaW50MkQobil9Y29uc3QgaT10LmdldFNlbWlNYWpvckF4aXMoKSxyPXQuZ2V0TWlub3JNYWpvclJhdGlvKCksbz10LmdldEF4aXNYUm90YXRpb24oKSxhPXQuZ2V0Q2VudGVyKCksaD1uZXcgQXJyYXkoNCk7aFswXT10LmlzTWFqb3IoKSxoWzFdPSFoWzBdLGhbMl09aFswXSxoWzNdPSFoWzBdO2NvbnN0IHU9bmV3IEFycmF5KDQpO3VbMF09dC5pc0Nsb2Nrd2lzZSgpLHVbMV09dVswXSx1WzJdPSF1WzBdLHVbM109IXVbMF07Y29uc3QgbT1NYXRoLnRydW5jKHM8NT8xOihzKzQpLzUpLGw9Y3QocWgsNCksYz1PKDQsTnVtYmVyLk5hTik7bGV0IGc9MDtmb3IobGV0IGQ9MDtkPDQ7ZCsrKXtsW2RdLmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKGVbMF0sZVtzLTFdLGkscixvLGhbZF0sdVtkXSxhKSxjW2RdPTA7bGV0IHQ9MDtmb3IobGV0IG49bTtuPHMtMTtuKz1tKXtjb25zdCBzPWxbZF0uZ2V0Q2xvc2VzdENvb3JkaW5hdGUoZVtuXSwhMSk7Y1tkXSs9Si5zcXJEaXN0YW5jZShsW2RdLmdldENvb3JkMkQocyksZVtuXSksdCsrfWNbZF0vPXQsY1tkXTxjW2ddJiYoZz1kKX10LmFzc2lnbkNvcHkobFtnXSl9ZnVuY3Rpb24gdnUodCl7cmV0dXJuIDEtenQodC5tX21pbm9yTWFqb3JSYXRpbyl9ZnVuY3Rpb24gYnUodCxlLHMsbixpLHIsbyxhLGgpe3JldHVybiB0Lm1fYml0cz0wLHQubV9yb3RhdGlvbj1yLGplKHQsZSksSGUodCxzKSx0Lm1fY29zcj1NYXRoLmNvcyhyKSx0Lm1fc2lucj1NYXRoLnNpbihyKSxGdSh0LG8pLFh1KHQsYSksdm9pZCAwIT09aD90Lm1fY2VudGVyLmFzc2lnbihoKTp0Lm1fY2VudGVyLnNldE5BTigpLHQuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDEpLHQubV9zZW1pTWFqb3JBeGlzPW4sdC5tX21pbm9yTWFqb3JSYXRpbz1pLEJ1KHQsdm9pZCAwPT09aCl9ZnVuY3Rpb24gU3UodCxlLHMsbil7dC5t
1X2JpdHM9MCx0Lm1fcm90YXRpb249MCxqZSh0LGUpLEhlKHQscyksdC5tX2ludGVyaW9yLmFzc2lnbihlLmFkZChzKS5tdWwoLjUpKSx0Lm1fc3RhcnRBbmdsZT0wLHQubV9zd2VlcEFuZ2xlPTAsdC5tX2Nvc3I9MSx0Lm1fc2lucj0wLEZ1KHQsITEpLFh1KHQsITEpLHQubV9jZW50ZXIuc2V0TkFOKCksdC5tX3NlbWlNYWpvckF4aXM9MSx0Lm1fbWlub3JNYWpvclJhdGlvPTAsdC5zZXRQcm9qZWN0aW9uQmVoYXZpb3IobiksdC5hZnRlckNvbXBsZXRlZE1vZGlmaWNhdGlvbigpfWZ1bmN0aW9uIEV1KHQpe3JldHVybiB0Lm1fY2VudGVyLmlzTkFOKCl9ZnVuY3Rpb24gRHUodCxlKXtpZigwPT09ZSlyZXR1cm4gMDtjb25zdCBzPXl1KHQpLG49Z3UodCxlKSxpPXh0KCkscj1BdSh0KSxvPWp0KG4raSxzLmUyLHMuY29tcGxldGVFKSxhPXQubV9zZW1pTWFqb3JBeGlzKihvLXIpO3JldHVybiBNYXRoLmFicyhhKX1mdW5jdGlvbiB3dSh0LGUpe2lmKEV1KHQpKXtjb25zdCBzPUouZGlzdGFuY2UodC5nZXRTdGFydFhZKCksdC5nZXRFbmRYWSgpKTtyZXR1cm4gMD09PXM/MDplL3N9aWYoMT09PXQubV9taW5vck1ham9yUmF0aW8pe2NvbnN0IHM9TWF0aC5hYnModC5nZXRTd2VlcEFuZ2xlKCkqdC5tX3NlbWlNYWpvckF4aXMpO3JldHVybiAwPT09cz8wOmUvc31pZigwPT09ZSlyZXR1cm4gMDtjb25zdCBzPXQuZ2V0U3dlZXBBbmdsZSgpO2lmKDA9PT1zKXJldHVybi41O2NvbnN0IG49eXUodCksaT14dCgpLHI9QXUodCk7czwwJiYoZT0tZSk7Y29uc3Qgbz1lL3QubV9zZW1pTWFqb3JBeGlzK3I7bGV0IGE9WnQobyxuLmUyLG4uY29tcGxldGVFKTthLT1pLGEtPXQuZ2V0U3RhcnRBbmdsZSgpO3JldHVybiBhL3N9ZnVuY3Rpb24gQXUodCl7Y29uc3QgZT15dSh0KTtyZXR1cm4ganQodC5nZXRTdGFydEFuZ2xlKCkreHQoKSxlLmUyLGUuY29tcGxldGVFKX1mdW5jdGlvbiBUdSh0LGUsbixpLHIpe2lmKDI9PT1lLm1fVHJhbnNmb3JtYXRpb25UeXBlKXJldHVybi
1B2b2lkIHMoMCk7aWYocyghUnUodCkpLGUuaXNJZGVudGl0eSgpJiYoIWl8fGkuZXF1YWxzKHQuZ2V0U3RhcnRYWSgpKSYmci5lcXVhbHModC5nZXRFbmRYWSgpKSkpcmV0dXJuO1l1KHQpO2xldCBvPUouZ2V0TkFOKCksYT1KLmdldE5BTigpO2lmKG51bGw9PT1pPyhvLng9dC5tX1hTdGFydCxvLnk9dC5tX1lTdGFydCxlLnRyYW5zZm9ybUluUGxhY2UobyksYS54PXQubV9YRW5kLGEueT10Lm1fWUVuZCxlLnRyYW5zZm9ybUluUGxhY2UoYSkpOihvPWksYT1yKSxFdSh0KSlyZXR1cm4gdC5tX1hTdGFydD1vLngsdC5tX1lTdGFydD1vLnksdC5tX1hFbmQ9YS54LHZvaWQodC5tX1lFbmQ9YS55KTtjb25zdCBoPXQubV9jZW50ZXIuY2xvbmUoKTtpZihlLnRyYW5zZm9ybUluUGxhY2UoaCksbnx8ZS5pc1VuaWZvcm1Ob1JvdGF0aW9uKCkpe2xldCBzPXF1KHQpO2UuaXNSZWZsZWN0aXZlKCkmJihzPSFzKTtpZigwPT09dC5wcm9qZWN0aW9uQmVoYXZpb3IoKSl7aWYoIW8uZXF1YWxzKGEpKXtjb25zdCBzPXQubV9pbnRlcmlvci5jbG9uZSgpO3JldHVybiBlLnRyYW5zZm9ybUluUGxhY2Uocyksdm9pZCB0LmNvbnN0cnVjdENpcmN1bGFyQXJjVGhyZWVQb2ludChvLGEscyl9cmV0dXJuIHZvaWQgSXUodCxvLGEsaCxzLCExKX1jb25zdCBuPW5ldyBKKHQubV9jb3NyLHQubV9zaW5yKTtlLnRyYW5zZm9ybVdpdGhvdXRUcmFuc2xhdGVJblBsYWNlKG4pO2NvbnN0IGk9TWF0aC5hdGFuMihuLnksbi54KSxyPXQuZ2V0U2VtaUF4ZXMoKTtlLnRyYW5zZm9ybVdpdGhvdXRUcmFuc2xhdGVJblBsYWNlKHIpO2NvbnN0IHU9dC5tX2NlbnRlci5jbG9uZSgpO3JldHVybiBlLnRyYW5zZm9ybUluUGxhY2UodSksdm9pZCB0LmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKG8sYSxyLngsci55L3IueCxpLHQuaXNNYWpvcigpLHMsdSl9e3tjb25zdCBzPW5ldyBBcnJheSg0KTtfdSh0LHMpO2NvbnN0IG49bmV3IFhlO24uYTExLnNldEUoc1swXSksbi5hMTIuc2V0RShzWzFdKSxuLmExMi5tdWxUaGlzQnlQb3dlcjIoLjUpLG4uYTIxLnNldEUobi5hMTIpLG4uYTIyLnNldEUoc1syXSk7aWYoIW4uZGV0KCkuaXNaZXJvKCkpe2NvbnN0IGk9bmV3IFhlO2lmKGkuYTExLnNldChlLnh4KSxpLmExMi5zZXQoZS54eSksaS5hMjEuc2V0KGUueXgpLGkuYTIyLnNldChlLnl5KSxpLmludmVydFRoaXMoKSl7Y29uc3Qgcj1pLmNsb25lKCk7ci50cmFuc3Bvc2VUaGlzKCk7Y29uc3QgdT1uLmNsb25lKCk7dS5tdWxUaGlzKGkpLHUubXVsTGVmdFRoaXMocik7aWYoIXUuZGV0KCkuaXNaZXJvKCkpe2NvbnN0IG49Y3QoaHQsNCk7blswXS5zZXRFKHUuYTExKSxuWzFdLnNldEUodS5hMTIpLG5bMV0ubXVsVGhpc0J5UG93ZXIyKDIpLG5bMl0uc2V0RSh1LmEyMiksblszXS5zZXRFKHNbM10pO2NvbnN0IGk9Si5nZXROQU4oKSxyPXB1KG4saSk7bGV0IG09cXUodCk7cmV0dXJuIGUuaXNSZWZsZWN0aXZlKCkmJihtPSFtKSx2b2lkIHQuY29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHNDZW50ZXIobyxhLGkueCxpLnkvaS54LHIsdC5pc01ham9yKCksbSxoKX19fX1jb25zdCBzPVtKLmdldE5BTigpLEouZ2V0TkFOKCksSi5nZXROQU4oKV07c1swXS5zZXRDb29yZHModC5nZXRTZW1pTWFqb3JBeGlzKCksMCksc1swXS5yb3RhdGVEaXJlY3QodC5tX2Nvc3IsdC5tX3NpbnIpLHNbMV0uc2V0Q29vcmRzKHQuZ2V0U2VtaU1ham9yQXhpcygpLHQuZ2V0U2VtaU1pbm9yQXhpcygpKSxzWzFdLnJvdGF0ZURpcmVjdCh0Lm1fY29zcix0Lm1fc2luciksc1syXS5zZXRDb29yZHMoMCx0LmdldFNlbWlNaW5vckF4aXMoKSksc1syXS5yb3RhdGVEaXJlY3QodC5tX2Nvc3IsdC5tX3NpbnIpO2xldCBuPXQuaXNDbG9ja3dpc2UoKTtuJiYoc1syXT1zdChzWzBdLHNbMF09c1syXSkpO2NvbnN0IGk9LjU7ZS50cmFuc2Zvcm1XaXRob3V0VHJhbnNsYXRlQXJyYXkocywzLHMpLGUuaXNSZWZsZWN0aXZlKCkmJihuPSFuKTtjb25zdCByPW5ldyBKKDAsMCksdT10LmNyZWF0ZUluc3RhbmNlKCk7R3UocyxpLHIsITEsdSksdC5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcihvLGEsdS5nZXRTZW1pTWFqb3JBeGlzKCksdS5nZXRNaW5vck1ham9yUmF0aW8oKSx1LmdldEF4aXNYUm90YXRpb24oKSx0LmlzTWFqb3IoKSwhbixoKX19ZnVuY3Rpb24gSXUodCxlLHMsbixpLHIpe2NvbnN0IG89LjUqKG4uc3ViKGUpLmxlbmd0aCgpK24uc3ViKHMpLmxlbmd0aCgpKTt0Lm1fY2VudGVyLmFzc2lnbihuKSx0Lm1fc3RhcnRBbmdsZT1NYXRoLmF0YW4yKGUueS10Lm1fY2VudGVyLnksZS54LXQubV9jZW50ZXIueCk7YXUodCxNYXRoLmF0YW4yKHMueS10Lm1fY2VudGVyLnkscy54LXQubV9jZW50ZXIueCksaSxyKTtjb25zdCBhPXQuY29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHNDZW50ZXIoZSxzLG8sMSwwLE1hdGguYWJzKHQubV9zd2VlcEFuZ2xlKT5NYXRoLlBJLHQubV9zd2VlcEFuZ2xlPjAsbik7cmV0dXJuIHQuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDApLGF9ZnVuY3Rpb24gTXUodCxlKXt0Lm1fY2FjaGVkVmFsdWVzPWV9ZnVuY3Rpb24gWXUodCl7dC5tX2NhY2hlZFZhbHVlcz1udWxsfWZ1bmN0aW9uIE51KHQsZSl7ZS5tX2NhY2hlZFZhbHVlcz1zdCh0Lm1fY2FjaGVkVmFsdWVzLHQubV9jYWNoZWRWYWx1ZXM9ZS5tX2NhY2hlZFZhbHVlcyl9ZnVuY3Rpb24gWHUodCxlKXtjb25zdCBzPWU/MTowO3QubV9iaXRzPS0yJnQubV9iaXRzfHN9ZnVuY3Rpb24gcXUodCl7cmV0dXJuISEoMSZ0Lm1fYml0cyl9ZnVuY3Rpb24gRnUodCxlKXtjb25zdCBzPWU/MTowO3QubV9iaXRzPS0zJnQubV9iaXRzfHM8PDF9ZnVuY3Rpb24gVnUodCl7cmV0dXJuISEoMiZ0Lm1fYml0cyl9ZnVuY3Rpb24gTHUodCl7aWYodC5tX2NlbnRlci5pc05BTigpKXJldHVybiExO2NvbnN0IGU9OCxzPW5ldyBOZTtzLnNldFdpdGhFcHModC5nZXRTdGFydFhZKCksZSkscy5zdWJUaGlzRSgobmV3IE5lKS5zZXRXaXRoRXBzKHQubV9jZW50ZXIsZSkpO2NvbnN0IG49bmV3IGh0O24uc2V0V2l0aEVwcyh0Lm1fcm90YXRpb24sZSk7Y29uc3QgaT1uZXcgaHQscj1uZXcgaHQ7aHQuc3RfY29zQW5kU2luKG4saSxyKSxzLnJvdGF0ZVJldmVyc2UoaSxyKTtjb25zdCBvPW5ldyBOZTtvLnNldFdpdGhFcHModC5nZXRFbmRYWSgpKSxvLnN1YlRoaXNFKE5lLmNvbnN0cnVjdFBvaW50MkQodC5tX2NlbnRlcikpLG8ucm90YXRlUmV2ZXJzZShpLHIpO2NvbnN0IGE9bmV3IGh0O2Euc2V0V2l0aEVwcyh0Lm1fc2VtaU1ham9yQXhpcyxlKTtjb25zdCBoPWEuY2xvbmUoKSx1PW5ldyBodDt1LnNldFdpdGhFcHModC5tX21pbm9yTWFqb3JSYXRpbyksaC5tdWxUaGlzRSh1KSxzLnguZGl2VGhpc0UoYSkscy55LmRpdlRoaXNFKGgpLG8ueC5kaXZUaGlzRShhKSxvLnkuZGl2VGhpc0UoaCk7Y29uc3QgbT1zLnguc3FyKCkuYWRkVGhpc0Uocy55LnNxcigpKS5zdWJUaGlzRSh1dCksbD1vLnguc3FyKCkuYWRkVGhpc0Uoby55LnNxcigpKS5zdWJUaGlzRSh1dCk7cmV0dXJuIW0uaXNaZXJvKCl8fCFsLmlzWmVybygpfWZ1bmN0aW9uIFJ1KHQpe3JldHVybiEhKDgmdC5tX2JpdHMpfWZ1bmN0aW9uIHp1KHQpe3QubV9iaXRzJj0tOX1mdW5jdGlvbiBCdSh0LGUpe3p1KHQpO2NvbnN0IG49dC5nZXRTdGFydFhZKCksaT10LmdldEVuZFhZKCk7bGV0IHI9ITE7Y29uc3Qgbz1WdSh0KSxhPXF1KHQpLGg9dC5wcm9qZWN0aW9uQmVoYXZpb3IoKSx1PW4uZXF1YWxzKGkpO2xldCBtPTA9PT10Lm1fbWlub3JNYWpvclJhdGlvfHwwPT09dC5tX3NlbWlNYWpvckF4aXM7aWYoTnVtYmVyLmlzTmFOKHQubV9taW5vck1ham9yUmF0aW8pJiYoMD09PXQubV9zZW1pTWFqb3JBeGlzP3QubV9taW5vck1ham9yUmF0aW89MTpnKFwiTkFOIG1pbm9yIG1ham9yIHJhdGlvIGFuZCBub24temVybyBtYWpvciBheGlzXCIpKSxtfHw9ZT91OnQubV9jZW50ZXIuaXNOQU4oKSxtKXJldHVybi
1BTdSh0LG4saSxoKSwhMDt0Lm1fc2VtaU1ham9yQXhpcz1NYXRoLmFicyh0Lm1fc2VtaU1ham9yQXhpcyksdC5tX21pbm9yTWFqb3JSYXRpbz1NYXRoLmFicyh0Lm1fbWlub3JNYWpvclJhdGlvKSx0Lm1fbWlub3JNYWpvclJhdGlvPjEmJih0Lm1fc2VtaU1ham9yQXhpcyo9dC5tX21pbm9yTWFqb3JSYXRpbyx0Lm1fbWlub3JNYWpvclJhdGlvPTEvdC5tX21pbm9yTWFqb3JSYXRpbyk7Y29uc3QgbD1uZXcgSih0Lm1fc2VtaU1ham9yQXhpcyx0Lm1fc2VtaU1ham9yQXhpcyp0Lm1fbWlub3JNYWpvclJhdGlvKTtpZihzKGwueT4wJiZsLng+PWwueSksdSl7Y29uc3QgZT10LmNvbnZlcnRUb0Nhbm9uaWMobik7cyghbC5pc1plcm8oKSksZS54Lz1sLngsZS55Lz1sLnk7Y29uc3QgaT1NYXRoLnNxcnQoenQoZS54KSt6dChlLnkpKTtpZihyPTEhPT1pLHQubV9zZW1pTWFqb3JBeGlzKj1pLGwubXVsVGhpcyhpKSx0Lm1fc3RhcnRBbmdsZT1odShNYXRoLmF0YW4yKGUueSxlLngpKSwhbylyZXR1cm4gdC5tX2ludGVyaW9yLmFzc2lnbihuKSx0Lm1fc3dlZXBBbmdsZT0wLHQuYWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKSxyO3QubV9zd2VlcEFuZ2xlPWE/R3QoKTotR3QoKX1lbHNle2xldCBlPXQubV9jZW50ZXIuaXNOQU4oKXx8THUodCk7aWYoIWUpe2NvbnN0IHM9dC5jb252ZXJ0VG9DYW5vbmljKG4pO3MueC89bC54LHMueS89bC55O2NvbnN0IHI9bmV3IEooMSwwKTt0Lm1fc3RhcnRBbmdsZT1KLmNhbGN1bGF0ZUFuZ2xlKHIscyk7Y29uc3Qgbz10LmNvbnZlcnRUb0Nhbm9uaWMoaSk7by54Lz1sLngsby55Lz1sLnksdC5tX3N3ZWVwQW5nbGU9Si5jYWxjdWxhdGVBbmdsZShzLG8pLGU9IWp1KHQpfWlmKGUpe3I9ITA7Y29uc3QgZT1uLnN1YihpKS5tdWxUaGlzKC41KTtlLnJvdGF0ZVJldmVyc2UodC5tX2Nvc3IsdC5tX3NpbnIpO2xldCBzPXp0KGUueC9sLngpK3p0KGUueS9sLnkpO3M+MSYmKHM9TWF0aC5zcXJ0KHMpLHQubV9zZW1pTWFqb3JBeGlzKj1zLGwubXVsVGhpcyhzKSk7Y29uc3QgaD1uZXcgSigwLDApO3tjb25zdCB0PWwueCpsLngscz1sLnkqbC55LG49dCplLnkqZS55K3MqZS54KmUueCxpPXQqcy1uO2lmKGk+MCl7Y29uc3QgdD1NYXRoLnNxcnQoaS9uKTtoLnNldENvb3JkcyhsLngqZS55L2wueSwtbC55KmUueC9sLngpLGgubXVsVGhpcyh0KSxvPT09YSYmaC5uZWdhdGVUaGlzKCl9fXtjb25zdCBlPW5ldyBKKGgueCxoLnkpO2Uucm90YXRlRGlyZWN0KHQubV9jb3NyLHQubV9zaW5yKSxlLmFkZFRoaXMobi5hZGQoaSkubXVsVGhpcyguNSkpLHQubV9jZW50ZXIuYXNzaWduKGUpfX1pZihsdSh0KSwhanUodCkpcmV0dXJuIFN1KHQsbixpLGgpLCEwfXJldHVybiBVdSh0KSx0LmFmdGVyQ29tcGxldGVkTW9kaWZpY2F0aW9uKCkscn1mdW5jdGlvbiBrdSh0LGUpe3MoTWF0aC5hYnModC5nZXRTd2VlcEFuZ2xlKCkpPDE1Kk1hdGguUEkvMTYpO2NvbnN0IG49dC5nZXRTZW1pTWFqb3JBeGlzKCksaT10LmdldFNlbWlNaW5vckF4aXMoKTtsZXQgcjtpZigwPT09bilyZXR1cm4gZVswXS5zZXRDb29yZHNQb2ludDJEKHQuZ2V0U3RhcnRYWSgpKSxlWzFdLnNldENvb3Jkc1BvaW50MkQodC5nZXRTdGFydFhZKCkpLGVbMl0uc2V0Q29vcmRzUG9pbnQyRCh0LmdldFN0YXJ0WFkoKSkscj0xLHI7aWYoMD09PWkpcmV0dXJuIGVbMF0uc2V0Q29vcmRzUG9pbnQyRCh0LmdldFN0YXJ0WFkoKSksZVsyXS5zZXRDb29yZHNQb2ludDJEKHQuZ2V0RW5kWFkoKSksZVsxXT1KLmxlcnAoZVswXSxlWzJdLC41KSxyPTEscjtjb25zdCBvPXQuZ2V0U3dlZXBBbmdsZSgpLGE9dC5nZXRTdGFydEFuZ2xlKCksaD1hK28sdT1uZXcgSigtbipNYXRoLnNpbihhKSxpKk1hdGguY29zKGEpKSxtPW5ldyBKKC1uKk1hdGguc2luKGgpLGkqTWF0aC5jb3MoaCkpO3Uubm9ybWFsaXplKCksbS5ub3JtYWxpemUoKSx1LnJvdGF0ZURpcmVjdCh0Lm1fY29zcix0Lm1fc2luciksbS5yb3RhdGVEaXJlY3QodC5tX2Nvc3IsdC5tX3NpbnIpLGVbMF0uc2V0Q29vcmRzUG9pbnQyRCh0LmdldFN0YXJ0WFkoKSksZVsyXS5zZXRDb29yZHNQb2ludDJEKHQuZ2V0RW5kWFkoKSksZVsxXS5zZXRTdWIoZVsyXSxlWzBdKTtjb25zdCBsPXUuY3Jvc3NQcm9kdWN0KG0pO2VbMV0uYXNzaWduKHUubXVsKGVbMV0uY3Jvc3NQcm9kdWN0KG0pL2wpKSxlWzFdLmFkZFRoaXMoZVswXSk7cmV0dXJuIHI9TWF0aC5jb3MoLjUqbykscn1mdW5jdGlvbiBHdSh0LGUsbixpLHIpe2lmKGkpe2NvbnN0IHM9LjUsbj1NYXRoLnNxcnQoZSksaT16dCgxLXMpKzIqbipzKigxLXMpK3p0KHMpLG89dFswXS5tdWwoenQoMS1zKSkuYWRkKHRbMV0ubXVsKDIqbipzKigxLXMpKSkuYWRkKHRbMl0ubXVsKHp0KHMpKSkuZGl2VGhpcyhpKTtyZXR1cm4gci5jb25zdHJ1Y3RDaXJjdWxhckFyY1RocmVlUG9pbnQodFswXSx0WzJdLG8pLCEwfWNvbnN0IG89dFswXS5zdWIodFsxXSksYT10WzJdLnN1Yih0WzFdKSxoPW8uY3Jvc3NQcm9kdWN0KGEpLHU9by5kb3RQcm9kdWN0KGEpLG09ZTtzKG08PTEpLHMobT4wKTtjb25zdCBsPS41LygxLW0pLGM9by5zcXJMZW5ndGgoKSxnPXUsZD1hLnNxckxlbmd0aCgpLF89enQoaCkscD1vLnN1YihhKS5zcXJMZW5ndGgoKTtpZigwPT09XylyZXR1cm4gU3Uocix0WzBdLHRbMl0sMSksITE7aWYodTw9LU1hdGguc3FydChjKSpNYXRoLnNxcnQoZCkpcmV0dXJuIFN1KHIsdFswXSx0WzJdLDEpLCExO2NvbnN0IGY9WzAsMF0sUD1uZXcgVTtQLnNldEluZmluaXRlKCk7Y29uc3QgeT1ubigyKl8sLShwL20rNCpnKSwyKigxLW0pL20sUCwhMSxmKTtpZigwPT09eSlyZXR1cm4gU3Uocix0WzBdLHRbMl0sMSksITE7MT09PXkmJihmWzFdPWZbMF0pO2NvbnN0IHg9TWF0aC5zcXJ0KGwvZlswXSksQz1NYXRoLnNxcnQobC9mWzFdKSx2PS41L207bGV0IGI9di1kKmZbMF0sUz12LWMqZlswXTtNYXRoLmFicyhiKT5NYXRoLmFicyhTKT9TPWcqZlswXS12KzE6Yj1nKmZbMF0tdisxO2NvbnN0IEU9by5tdWwoYikuYWRkKGEubXVsKFMpKSxEPUUubm9ybSgxKTwxZS0xNSp4PzA6TWF0aC5hdGFuMihFLnksRS54KStNYXRoLlBJLHc9by5hZGQoYSksQT1uP24uY2xvbmUoKTp0WzFdLmFkZCh3Lm11bChsKSksVD10WzBdLnN1YihBKSxJPXRbMl0uc3ViKEEpLE09VC5jcm9zc1Byb2R1Y3QoSSk8MCxZPSExO25ldyBxaDtyZXR1cm4gci5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcih0WzBdLHRbMl0seCxDL3gsRCxZLCFNLEEpfWZ1bmN0aW9uIFd1KHQsZSxzLG4saSl7cmV0dXJuIEd1KHQsZSxzLG4saSl9ZnVuY3Rpb24ganUodCl7Y29uc3QgZT1ycyh0KTtsZXQgcz0hMTt7Y29uc3Qgbj1uZXcgSih0Lm1fc2VtaU1ham9yQXhpcypNYXRoLmNvcyh0Lm1fc3RhcnRBbmdsZSksdC5nZXRTZW1pTWlub3JBeGlzKCkqTWF0aC5zaW4odC5tX3N0YXJ0QW5nbGUpKTtuLnJvdGF0ZURpcmVjdCh0Lm1fY29zcix0Lm1fc2luciksbi5hZGRUaGlzKHQubV9
1jZW50ZXIpO3M9Si5kaXN0YW5jZSh0LmdldFN0YXJ0WFkoKSxuKT5lfWxldCBuPSExO2lmKCFzKXtjb25zdCBzPW5ldyBKKHQubV9zZW1pTWFqb3JBeGlzKk1hdGguY29zKHQubV9zdGFydEFuZ2xlK3QubV9zd2VlcEFuZ2xlKSx0LmdldFNlbWlNaW5vckF4aXMoKSpNYXRoLnNpbih0Lm1fc3RhcnRBbmdsZSt0Lm1fc3dlZXBBbmdsZSkpO3Mucm90YXRlRGlyZWN0KHQubV9jb3NyLHQubV9zaW5yKSxzLmFkZFRoaXModC5tX2NlbnRlcik7bj1KLmRpc3RhbmNlKHQuZ2V0RW5kWFkoKSxzKT5lfXJldHVybiFzJiYhbn1mdW5jdGlvbiBadSh0LHMsbixpKXswPT09biYmZShcImNvbnN0cnVjdF9lbmNsb3NpbmdfY2lyY2xlXCIpO2NvbnN0IHI9WzAsMCwwXSxvPVZoKHMsbixyKTtpZigxPT09byl0LmNvbnN0cnVjdENpcmNsZVJhZGl1cygwLHNbclswXV0saSk7ZWxzZSBpZigyPT09byl7Y29uc3QgZT1KLmxlcnAoc1tyWzBdXSxzW3JbMV1dLC41KSxuPUouZGlzdGFuY2Uoc1tyWzBdXSxlKSxvPUouZGlzdGFuY2Uoc1tyWzFdXSxlKTt0LmNvbnN0cnVjdENpcmNsZVJhZGl1cyhNYXRoLm1heChuLG8pLGUsaSl9ZWxzZSBpZigzPT09byl7Y29uc3QgZT1KLmNhbGN1bGF0ZUNpcmNsZUNlbnRlckZyb21UaHJlZVBvaW50cyhzW3JbMF1dLHNbclsxXV0sc1tyWzJdXSksbj1KLmRpc3RhbmNlKHNbclswXV0sZSksbz1KLmRpc3RhbmNlKHNbclsxXV0sZSksYT1KLmRpc3RhbmNlKHNbclsyXV0sZSk7dC5jb25zdHJ1Y3RDaXJjbGVSYWRpdXMoTWF0aC5tYXgobixvLGEpLGUsaSl9ZWxzZSBoKFwidW5leHBlY3RlZFwiKX1mdW5jdGlvbiBIdSh0KXtpZihFdSh0KSlyZXR1cm4gMDtpZih0LmlzRGVnZW5lcmF0ZSgwKSlyZXR1cm4gMDtjb25zdCBlPXQubV9zZW1pTWFqb3JBeGlzLHM9dC5nZXRTZW1pTWlub3JBeGlzKCksbj1lKmUrcypzLGk9dC5nZXRTdGFydEFuZ2xlKCkscj10LmdldEVuZEFuZ2xlKCksbz10Lm1fY2VudGVyLnktdC5tX1lTdGFydCxhPXQubV9jb3NyLGg9dC5tX3NpbnI7bGV0IHU9MSxtPTA7dC5tX3JvdGF0aW9uJiYodT0oYS1oKSooYStoKSxtPTIqYSpoKTtjb25zdCBsPSgoLS41KihyLWkpKy4yNSp1KigyKk1hdGguY29zKHIraSkqTWF0aC5zaW4oci1pKSkpKnMrLTIqTWF0aC5zaW4oLjUqKHIraSkpKk1hdGguc2luKC41KihyLWkpKSphKm8pKmUvbjtsZXQgYz0wO2lmKHQubV9yb3RhdGlvbil7Yz0uMTI1KigtMipNYXRoLnNpbihyK2kpKk1hdGguc2luKHItaSkpKm0tcypvL24qKDIqTWF0aC5jb3MoLjUqKHIraSkpKk1hdGguc2luKC41KihyLWkpKSkqaH1yZXR1cm4gbioobCtjKSstLjUqKHQubV9YRW5kLXQubV9YU3RhcnQpKih0Lm1fWUVuZC10Lm1fWVN0YXJ0KX1mdW5jdGlvbiBVdSh0KXt0LnF1ZXJ5Q29vcmQyRCguNSx0Lm1faW50ZXJpb3IpfWZ1bmN0aW9uIE91KHQsZSxzLG4saSl7aWYoaSl7aWYoMCE9PWhtKGUscykpcmV0dXJuIDJ9ZWxzZSBpZihSZShlLHMpKXJldHVybiAxO3JldHVybiAwIT09SnUodCxlLHMsbnVsbCxudWxsLG51bGwsbix2b2lkIDAhPT1pJiZpLCEwLCExKT80OjB9ZnVuY3Rpb24gUXUodCxlLHMsbixpKXtpZihpKXtpZigwIT09aG0oZSxzKSlyZXR1cm4gMn1lbHNlIGlmKFJlKGUscykpcmV0dXJuIDE7cmV0dXJuIDAhPT1LdSh0LGUscyxudWxsLG51bGwsbnVsbCxuLHZvaWQgMCE9PWkmJmksITAsITEpPzQ6MH1mdW5jdGlvbiBKdSh0LGUsbixpLHIsbyxhLGgsdSxtKXtpZihFdShlKSl7cmV0dXJuIHdzKG5ldyBmbSh7c3RhcnQ6ZS5nZXRTdGFydFhZKCksZW5kOmUuZ2V0RW5kWFkoKX0pLG4saSxyLG8sYSxoLG0pfW51bGwhPT1yJiYoci5sZW5ndGg9MCksbnVsbCE9PW8mJihvLmxlbmd0aD0wKSxudWxsIT09aSYmKGkubGVuZ3RoPTApO2NvbnN0IGw9b3MoZSxuKTtpZihhcyhlLG4sYT1NYXRoLm1heChsLGEpKSlyZXR1cm4gMDtjb25zdCBjPW4uZ2V0U3RhcnRYWSgpO2Muc3ViVGhpcyhlLm1fY2VudGVyKTtjb25zdCBnPW4uZ2V0RW5kWFkoKTtnLnN1YlRoaXMoZS5tX2NlbnRlciksYy5yb3RhdGVSZXZlcnNlKGUubV9jb3NyLGUubV9zaW5yKSxnLnJvdGF0ZVJldmVyc2UoZS5tX2Nvc3IsZS5tX3NpbnIpO2NvbnN0IGQ9Zy5jbG9uZSgpO2Quc3ViVGhpcyhjKTtjb25zdCBfPWUubV9zZW1pTWFqb3JBeGlzLHA9MS9fLGY9ZS5nZXRTZW1pTWlub3JBeGlzKCksUD0xL2YseT1kLmNsb25lKCk7eS5sZWZ0UGVycGVuZGljdWxhclRoaXMoKTtjb25zdCB4PU1hdGguYXRhbjIoZip5LnksXyp5LngpLEM9TygxNixOdW1iZXIuTmFOKSx2PU8oMTYsTnVtYmVyLk5hTik7bGV0IGI9MDtjb25zdCBTPVt4LHgrTWF0aC5QSV07Zm9yKGxldCBzPTA7czwyOysrcyl7Y29uc3QgdD1jdShlLFNbc10pO2lmKHQ+PTAmJnQ8PTEpe0NbYl09dDtjb25zdCBzPWUuZ2V0Q29vcmQyRChDW2JdKTt2W2JdPW4uZ2V0Q2xvc2VzdENvb3JkaW5hdGUocywhMSksSi5kaXN0YW5jZShzLG4uZ2V0Q29vcmQyRCh2W2JdKSk8PWEmJmIrK319Y29uc3QgRT1jLngqcCxEPWMueSpQLHc9ZC54KnAsQT1kLnkqUDtsZXQgVD1ubih3KncrQSpBLDIqKEUqdytEKkEpLEUqRStEKkQtMSxVLnVuaXQoKSwhMSx2KTtzKFQ+PTApO2ZvcihsZXQgcz0wO3M8VDtzKyspe2NvbnN0IHQ9ZC5tdWwodltzXSkuYWRkKGMpO3QueCo9cCx0LnkqPVA7Y29uc3QgaT1jdShlLE1hdGguYXRhbjIodC55LHQueCkpO2lmKGk+PTAmJmk8PTEpe0NbYl09aTtjb25zdCB0PWUuZ2V0Q29vcmQyRChpKTt2W2JdPW4uZ2V0Q2xvc2VzdENvb3JkaW5hdGUodCwhMSksSi5kaXN0YW5jZSh0LG4uZ2V0Q29vcmQyRCh2W2JdKSk8PWEmJmIrK319cyhiPEMubGVuZ3RoKzQpO2NvbnN0IEk9TygxNixOdW1iZXIuTmFOKTtUPWUuaW50ZXJzZWN0UG9pbnQobi5nZXRTdGFydFhZKCksSSxhKTtmb3IobGV0IHM9MDtzPFQ7cysrLGIrKylDW2JdPUlbc10sdltiXT0wO1Q9ZS5pbnRlcnNlY3RQb2ludChuLmdldEVuZFhZKCksSSxhKTtmb3IobGV0IHM9MDtzPFQ7cysrLGIrKylDW2JdPUlbc10sdltiXT0xO1Q9bi5pbnRlcnNlY3RQb2ludChlLmdldFN0YXJ0WFkoKSxJLGEpO2ZvcihsZXQgcz0wO3M8VDtzKyssYisrKUNbYl09MCx2W2JdPUlbc107VD1uLmludGVyc2VjdFBvaW50KGUuZ2V0RW5kWFkoKSxJLGEpO2ZvcihsZXQgcz0wO3M8VDtzKyssYisrKUNbYl09MSx2W2JdPUlbc107cmV0dXJuIDA9PT1iPzA6Z20odCxlLG4sQyx2LGIsaSxyLG8sYSxoLHUsbSl9ZnVuY3Rpb24gS3Uo
1dCxlLG4saSxyLG8sYSxoLHUsbSl7aWYoRXUoZSkpe2NvbnN0IHM9bmV3IGZtKHtzdGFydDplLmdldFN0YXJ0WFkoKSxlbmQ6ZS5nZXRFbmRYWSgpfSk7cmV0dXJuIEp1KHQsbixzLGksbyxyLGEsaCx1LCFtKX1pZihFdShuKSl7Y29uc3Qgcz1uZXcgZm0oe3N0YXJ0Om4uZ2V0U3RhcnRYWSgpLGVuZDpuLmdldEVuZFhZKCl9KTtyZXR1cm4gSnUodCxlLHMsaSxyLG8sYSxoLHUsbSl9Y29uc3QgbD1vcyhlLG4pO2E9TWF0aC5tYXgoYSxsKTtsZXQgYz0hMTt7Y29uc3QgdD1lLmdldFNlbWlBeGVzKCksaT1lLmdldENlbnRlcigpLG09bi5nZXRTZW1pQXhlcygpLGw9bi5nZXRDZW50ZXIoKSxnPUouZGlzdGFuY2UobCxpKSxkPXQueCttLng7aWYoZz5kK2EpcmV0dXJuIDA7aWYodC55Pm0ueCl7aWYoZyttLngrYTx0LnkpcmV0dXJuIDB9ZWxzZSBpZihtLnk+dC54JiZnK3QueCthPG0ueSlyZXR1cm4gMDtpZih1JiYhaCl7Y29uc3QgaT0xPT09ZS5tX21pbm9yTWFqb3JSYXRpbyYmZS5pc0Nsb3NlZCgpJiZlLmlzTWFqb3IoKSxhPTE9PT1uLm1fbWlub3JNYWpvclJhdGlvJiZuLmlzQ2xvc2VkKCkmJm4uaXNNYWpvcigpO2lmKGkmJmEmJihjPSEwLGc8PWQpKXtpZihNYXRoLm1heCh0LngsbS54KTw9TWF0aC5taW4odC54LG0ueCkrZylyZXR1cm4gcyghciYmIW8pLDF9fX1pZighYyYmYXMoZSxuLGEpKXJldHVybiAwO2NvbnN0IGc9W10sZD1bXSxfPSExLHA9ITEsZj1qaChlLDAsMCxfLHAsZyxkLG51bGwpLFA9W10seT1bXSx4PWpoKG4sMCwwLF8scCxQLHksbnVsbCk7aWYoMT09PWYmJjE9PT14KXtjb25zdCB0PW5ldyBEbih7cG9pbnRzOmcsd2VpZ2h0czpkfSkscz1uZXcgRG4oe3BvaW50czpQLHdlaWdodHM6eX0pLGw9W10sYz1bXSxfPW9oKCExLHQscyxpLG51bGw9PT1yP251bGw6bCxudWxsPT09bz9udWxsOmMsYSxoLHUsbSk7aWYoXz4wJiZudWxsIT09cnx8bnVsbCE9PW8pe3ImJihyLmxlbmd0aD0wKSxvJiYoby5sZW5ndGg9MCk7Zm9yKGxldCBpPTA7aTxfOysraSl7aWYocilpZihkdChsW2ldLDAsMSkpci5wdXNoKGxbaV0pO2Vsc2V7Y29uc3Qgcz10LnRUb0xlbmd0aChsW2ldKSxuPWUubGVuZ3RoVG9UKHMpO3IucHVzaChuKX1pZihvKWlmKGR0KGNbaV0sMCwxKSlvLnB1c2goY1tpXSk7ZWxzZXtjb25zdCB0PXMudFRvTGVuZ3RoKGNbaV0pLGU9bi5sZW5ndGhUb1QodCk7by5wdXNoKGUpfX19cmV0dXJuIF99bGV0IEM9W107Y29uc3Qgdj1bXTtsZXQgYj0wO2NvbnN0IFM9dSYmIWg7Zm9yKGxldCBzPTA7czxmO3MrKyl7Y29uc3QgdD1uZXcgRG4oe3BvaW50czpnLnNsaWNlKDIqcywyKnMrMyksd2VpZ2h0czpkLnNsaWNlKDIqcywyKnMrMyl9KTtsZXQgaT0wO2ZvcihsZXQgcj0wO3I8eDtyKyspe3YubGVuZ3RoPD1yJiZ2LnB1c2gobmV3IERuKHtwb2ludHM6UC5zbGljZSgyKnIsMipyKzMpLHdlaWdodHM6eS5zbGljZSgyKnIsMipyKzMpfSkpO2NvbnN0IG89W10saD1bXSx1PVM/bnVsbDpvLG09Uz9udWxsOmgsbD1vaCghMSx0LHZbcl0sbnVsbCx1LG0sYSwhMSxTLCExKTtpZihsPjAmJlMpcmV0dXJuIDE7Zm9yKGxldCBhPTA7YTxsOysrYSl7aWYoMD09PW9bYV0mJjA9PT1zKW9bYV09MDtlbHNlIGlmKDE9PT1vW2FdJiZzPT09Zi0xKW9bYV09MTtlbHNle2NvbnN0IHM9dC50VG9MZW5ndGgob1thXSkrYixuPWUubGVuZ3RoVG9UKHMpO29bYV09bn1pZigwPT09aFthXSYmMD09PXIpaFthXT0wO2Vsc2UgaWYoMT09PWhbYV0mJnI9PT14LTEpaFthXT0xO2Vsc2V7Y29uc3QgdD12W3JdLnRUb0xlbmd0aChoW2FdKStpLGU9bi5sZW5ndGhUb1QodCk7aFthXT1lfUMucHVzaChZdChvW2FdLGhbYV0pKX1pKz12W3JdLmNhbGN1bGF0ZUxlbmd0aDJEKCl9Yis9dC5jYWxjdWxhdGVMZW5ndGgyRCgpfWlmKDA9PT1DLmxlbmd0aClyZXR1cm4gMDtpZihoJiYoQz1DLmZpbHRlcih0PT4hZHQodC5maXJzdCwwLDEpfHwhZHQodC5zZWNvbmQsMCwxKXx8IWUuZ2V0Q29vcmQyRCh0LmZpcnN0KS5lcXVhbHMobi5nZXRDb29yZDJEKHQuc2Vjb25kKSkpKSx1KXJldHVybiBDLmxlbmd0aDtjb25zdCBFPVtdLEQ9W107Zm9yKGNvbnN0IHMgb2YgQylFLnB1c2gocy5maXJzdCksRC5wdXNoKHMuc2Vjb25kKTtyZXR1cm4gZ20odCxlLG4sRSxELEUubGVuZ3RoLGkscixvLGEsaCx1LG0pfWZ1bmN0aW9uICR1KHQsZSxzKXtpZihzLnNldENvb3Jkcyh0LmdldENvb3JkMkQoZS52bWluKSkscy5tZXJnZU5lKHQuZ2V0Q29vcmQyRChlLnZtYXgpKSxFdSh0KSlyZXR1cm47Y29uc3Qgbj10LmdldFNlbWlBeGVzKCksaT1bMCwwLDAsMF07e2NvbnN0IGU9TWF0aC5hdGFuMigtbi55KnQubV9zaW5yLG4ueCp0Lm1fY29zcikscz1lK01hdGguUEkscj1NYXRoLmF0YW4yKG4ueSp0Lm1fY29zcixuLngqdC5tX3NpbnIpLG89citNYXRoLlBJO2lbMF09Y3UodCxlKSxpWzFdPWN1KHQscyksaVsyXT1jdSh0LHIpLGlbM109Y3UodCxvKX1jb25zdCByPW5ldyBKO2ZvcihsZXQgbz0wO288NDtvKyspe2NvbnN0IG49aVtvXTtlLmNvbnRhaW5zRXhjbHVzaXZlQ29vcmRpbmF0ZShuKSYmKHQucXVlcnlDb29yZDJEKG4scikscy5tZXJnZU5lKHIpKX19ZnVuY3Rpb24gdG0odCxlLG4saSxyKXtpZigwPT09dC5tX3NlbWlNYWpvckF4aXMpcmV0dXJuIG4udm1pbjtsZXQgbz1KLmdldE5BTigpO3QucXVlcnlDb29yZDJEKG4udm1pbixvKTtsZXQgYT1KLmdldE5BTigpO2lmKHQucXVlcnlDb29yZDJEKG4udm1heCxhKSxFdSh0KSl7cmV0dXJuIG5ldyBmbSh7c3RhcnQ6byxlbmQ6YX0pLmdldENsb3Nlc3RDb29yZGluYXRlKGUsaSl9Y29uc3QgaD1ydSh0LGUpO2lmKG89cnUodCxvKSxhPXJ1KHQsYSksMT09PXQubV9taW5vck1ham9yUmF0aW8pe2lmKGguaXNFcXVhbCgwLDApKXJldHVybiBuLnZtaW47Y29uc3QgZT1jdSh0LE1hdGguYXRhbjIoaC55LGgueCkpO2lmKGl8fG4uY29udGFpbnNDb29yZGluYXRlKGUpKXJldHVybiBlO3JldHVybiBKLmRpc3RhbmNlKGgsbyk8PUouZGlzdGFuY2UoaCxhKT9uLnZtaW46bi52bWF4fWNvbnN0IHU9dC5nZXRTZW1pTWFqb3JBeGlzKCksbT10LmdldFNlbWlNaW5vckF4aXMoKSxsPSh1LW0pKih1K20pLGM9enQobCksZz1oLngsZD1oLnksXz16dChtKmQpLHA9bSpsKmQqMixmPVtuZXcgaHQoXyksbmV3IGh0KHApLG5ldyBodChjLXp0KHUqZyktXyksbmV3IGh0KC1wKSxuZXcgaHQoLWMpXSxQPWN0KGh0LDQpLHk9cG4oZiw0LG5ldyBVKC0xLDEpLCExLFAsNCk7bGV0IHg9bi52bWluLEM9Si5zcXJEaXN0YW5jZShoLG8pO3tjb25zdCB0PUouc3FyRGlzdGFuY2UoaCxhKTt0PEMmJih4PW4udm1heCxDPXQpfXMoIWkpO2xldCB2PU8oOCxOdW1iZXIuTmFOKTtmb3IobGV0IHM9MDtzPHk7KytzKXtjb25zdCBlPVBbc10udmFsdWUoKSxuPU1hdGguc3FydCgxLWUqZSksaT1NYXRoLmF0YW4yKGUsbikscj1NYXRoLmF0YW4yKGUsLW4pO3ZbMipzXT1jdSh0LGkpLHZbMipzKzFdPWN1KHQscil9dj12LnNsaWNlKDAsMip5KSxXdCh2KTtmb3IobGV0IHM9MCxiPTIqeTtzPGI7KytzKWlmKHZbc10+bi52bWluJiZ2W3NdPG4udm1heCl7Y29uc3Qgbj1KLnNxckRpc3RhbmNlKGUsdC5nZXRDb29yZDJEKHZbc10pKTtDPm4mJihDPW4seD12W3NdKX1yZXR1cm4geH1mdW5jdGlvbiBlbSh0LGUsbil7cyghRXUodCkpO2NvbnN0IGk9bmV3IGNlO2kuc2V0Um90YXRlQW5nbGUoLXQuZ2V0QXhpc1hSb3RhdGlvbigpKTtjb25zdCByPW5ldyBKO2kucXVlcnlUcmFuc2Zvcm0oZSxyKTtjb25zdCBvPU1hdGguYXRhbjIoLXIueCp0LmdldE1pbm9yTWFqb3JSYXRpbygpLHIueSksYT1vK0F0KCk7bGV0IGg9Y3UodCxvKSx1PWN1KHQsYSk7dTxoJiYodT1zdChoLGg9dSkpO2xldCBtPTA7cmV0dXJuIGg+PTAmJmg8PTEmJihuW20rK109aCksdT49MCYmdTw9MSYmKG5bbSsrXT11KSxtfWZ1bmN0aW9uIHNtKHQsZSxzKXtyZXR1cm4gdC5tX3NlbWlNYWpvckF4aXM9PT1lLm1fc2VtaU1ham9yQXhpcyYmKHQuaXNNYWpvcigpIT09ZS5pc01ham9yKCkmJighIXQubV9jZW50ZXIuZXF1YWxzKGUubV9jZW50ZXIpJiYodC5tX3NpbnI9PT1lLm1fc2luciYmKHQubV9jb3NyPT09ZS5tX2Nvc3ImJih0Lm1fbWlub3JNYWpvclJhdGlvPT09ZS5tX21pbm9yTWFqb3JSYXRpbyYmKH
1M/dC5pc0Nsb2Nrd2lzZSgpIT09ZS5pc0Nsb2Nrd2lzZSgpOnQuaXNDbG9ja3dpc2UoKT09PWUuaXNDbG9ja3dpc2UoKSkpKSkpKX1mdW5jdGlvbiBubSh0LGUscyl7aWYoRXUodCkpcy5zZXRFKE5lLmNvbnN0cnVjdFBvaW50MkQodC5nZXRFbmRYWSgpKS5zdWJFKE5lLmNvbnN0cnVjdFBvaW50MkQodC5nZXRTdGFydFhZKCkpKSk7ZWxzZXtjb25zdCBuPW5ldyBodDtkdSh0LGUsbik7Y29uc3QgaT1uZXcgTmU7aWYoaS5zZXRDb29yZHNFKG5ldyBodCh0Lm1fc2VtaU1ham9yQXhpcykubmVnYXRlKCkubXVsRSgobmV3IGh0KS5zZXRTaW4obikpLG5ldyBodCh0LmdldFNlbWlNaW5vckF4aXMoKSkubXVsRSgobmV3IGh0KS5zZXRDb3MobikpKSx0Lm1fcm90YXRpb24pe2NvbnN0IGU9bmV3IGh0KHQubV9yb3RhdGlvbik7aS5yb3RhdGVEaXJlY3QoKG5ldyBodCkuc2V0Q29zKGUpLChuZXcgaHQpLnNldFNpbihlKSl9aS5zY2FsZVRoaXMobmV3IGh0KHQuZ2V0U3dlZXBBbmdsZSgpKSkscy5zZXRFKGkpfX1mdW5jdGlvbiBpbSh0LGUscyxuKXtjb25zdCBpPXQuZ2V0U3RhcnRYWSgpLHI9dC5nZXRFbmRYWSgpLG89aS5lcXVhbHMociksYT1lLmVxdWFscyhzKTtpZighbyYmIWEpe2NvbnN0IG49bmV3IGNlO24uc2V0U2hpZnRDb29yZHMoLXQubV9YU3RhcnQsLXQubV9ZU3RhcnQpO2NvbnN0IG89Si5kaXN0YW5jZShlLHMpLGE9Si5kaXN0YW5jZShpLHIpLGg9by9hO24uc2NhbGUoaCxoKTtjb25zdCB1PXIuc3ViKGkpO3UuZGl2VGhpcyhhKTtjb25zdCBtPXMuc3ViKGUpO20uZGl2VGhpcyhvKTtjb25zdCBsPXUuY3Jvc3NQcm9kdWN0KG0pLGM9bS5kb3RQcm9kdWN0KHUpO3JldHVybiBuLnJvdGF0ZShjLGwpLG4uc2hpZnRDb29yZHMoZS54LGUueSksdm9pZCBUdSh0LG4sITAsZSxzKX1jb25zdCBoPW5ldyBKO2lmKHQucXVlcnlDb29yZDJEKC41LGgpLGEpe2lmKG8pe2NvbnN0IG49dC5tX2NlbnRlci5hZGQoZS5zdWIoaSkpO3QuY29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHNDZW50ZXIoZSxzLHQuZ2V0U2VtaU1ham9yQXhpcygpLDEsMCwhMCwhdC5pc0Nsb2Nrd2lzZSgpLG4pLHQuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDApfWVsc2UgaWYodC5pc01ham9yKCkpe2NvbnN0IG49aC5zdWIoZSkuZ2V0VW5pdFZlY3RvcigpLm11bCgyKnQuZ2V0U2VtaU1ham9yQXhpcygpKS5hZGQoZSk7dC5jb25zdHJ1Y3RDaXJjdWxhckFyY1RocmVlUG9pbnQoZSxzLG4pfWVsc2UgdC5jb25zdHJ1Y3RDaXJjdWxhckFyY1RocmVlUG9pbnQoZSxzLGUpO3JldHVybn1jb25zdCB1PWUuYWRkKHMpLm11bCguNSksbT1zLnN1YihlKTttLnJpZ2h0UGVycGVuZGljdWxhclRoaXMoKTtjb25zdCBsPXUuYWRkKG0pLGM9Si5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh1LGwsdC5nZXRDZW50ZXIoKSwhMCksZz1uZXcgSjtDdC
1h1LGwsYyxnKTtjb25zdCBkPUouZGlzdGFuY2UoZSxnKTt0LmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKGUscyxkLDEsMCwhMCwhdC5pc0Nsb2Nrd2lzZSgpLGcpLHQuc2V0UHJvamVjdGlvbkJlaGF2aW9yKDApfWZ1bmN0aW9uIHJtKHQsZSxuLGkpe2NvbnN0IHI9dC5nZXRTdGFydFhZKCksbz10LmdldEVuZFhZKCksYT1yLmVxdWFscyhvKSxoPWUuZXF1YWxzKG4pO2lmKCFhJiYhaCl7Y29uc3Qgcz1uZXcgY2U7cmV0dXJuIHMuaW5pdGlhbGl6ZUZyb21Ud29Qb2ludHMocixvLGUsbiksVHUodCxzLCEwLGUsbiksdC5lbmRQb2ludE1vZGlmaWVkKCksdm9pZCB0Lm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKX1pZighdC5pc01ham9yKCkpcmV0dXJuIHZvaWQgU3UodCxlLG4sMSk7aWYoYSYmaCl7Y29uc3Qgcz10Lm1fY2VudGVyLmFkZChlLnN1YihyKSk7cmV0dXJuIHZvaWQgdC5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcihlLG4sdC5nZXRTZW1pTWFqb3JBeGlzKCksdC5nZXRNaW5vck1ham9yUmF0aW8oKSx0LmdldEF4aXNYUm90YXRpb24oKSwhMCwhdC5pc0Nsb2Nrd2lzZSgpLHMpfWlmKCFhKXtjb25zdCBzPS41KihHdCgpLU1hdGguYWJzKHQuZ2V0U3dlZXBBbmdsZSgpKSksaT0odC5nZXRTd2VlcEFuZ2xlKCkrcypOdCh0LmdldFN3ZWVwQW5nbGUoKSkpL3QuZ2V0U3dlZXBBbmdsZSgpLHI9bmV3IEo7dC5xdWVyeUNvb3JkMkQoaSxyKSx0LmNvbnN0cnVjdEVsbGlwdGljQXJjRW5kUG9pbnRzQ2VudGVyKHIscix0LmdldFNlbWlNYWpvckF4aXMoKSx0LmdldE1pbm9yTWFqb3JSYXRpbygpLHQuZ2V0QXhpc1hSb3RhdGlvbigpLCEwLCF0LmlzQ2xvY2t3aXNlKCksdC5nZXRDZW50ZXIoKSk7Y29uc3Qgbz10LmdldENlbnRlcigpLmFkZChlLnN1YihyKSk7cmV0dXJuIHZvaWQgdC5jb25zdHJ1Y3RFbGxpcHRpY0FyY0VuZFBvaW50c0NlbnRlcihlLG4sdC5nZXRTZW1pTWFqb3JBeGlzKCksdC5nZXRNaW5vck1ham9yUmF0aW8oKSx0LmdldEF4aXNYUm90YXRpb24oKSwhMCwhdC5pc0Nsb2Nrd2lzZSgpLG8pfWNvbnN0IHU9Si5zcXJEaXN0YW5jZShlLG4pO2xldCBtPS4yNSxsPS43NTtpZih1PEouc3FyRGlzdGFuY2UodC5nZXRDb29yZDJEKC4yNSksdC5nZXRDb29yZDJEKC43NSkpKXtjb25zdCBlPVswXSxuPWVuKG5ldyBudSh0LHUpLFUuY29uc3RydWN0KDAsLjI1KSwxLGUpO24+MCYmKHMoMT09PW4pLG09ZVswXSxsPTEtZVswXSl9Y29uc3QgYz10LmdldENvb3JkMkQobSksZz10LmdldENvb3JkMkQobCk7cyghYy5lcXVhbHMoZykpLHQuY29uc3RydWN0RWxsaXB0aWNBcmNFbmRQb2ludHNDZW50ZXIoYyxnLHQuZ2V0U2VtaU1ham9yQXhpcygpLHQuZ2V0TWlub3JNYWpvclJhdGlvKCksdC5nZXRBeGlzWFJvdGF0aW9uKCksITAsIXQuaXNDbG9ja3dpc2UoKSx0Lm1fY2VudGVyKSxybSh0LGUsbil9ZnVuY3Rpb24gb20odCxlLHMsbixpKXtyZXR1cm4gYW0odCwhMSxlLHMsbixpKX1mdW5jdGlvbiBhbSh0LGUscyxuLHIsbyl7Y29uc3QgYT1zLmdldEdlb21ldHJ5VHlwZSgpLHU9bi5nZXRHZW9tZXRyeVR5cGUoKSxtPU1hdGgubWF4KHIsb3MocyxuKSk7aWYoYT09PWkuZW51bUxpbmUmJnU9PT1pLmVudW1MaW5lKXJldHVybiBEcyhzLG4sbSxvKTtsZXQgbD1zLGM9bixnPXMuZ2V0U3RhcnRYWSgpLGQ9cy5nZXRFbmRYWSgpO2lmKGcuY29tcGFyZShkKT4wJiYobD1zLmNsb25lKCkucmV2ZXJzZSgpKSxnPW4uZ2V0U3RhcnRYWSgpLGQ9bi5nZXRFbmRYWSgpLGcuY29tcGFyZShkKT4wJiYoYz1uLmNsb25lKCkucmV2ZXJzZSgpKSxlKXtpZihzLmVxdWFscyhuKSlyZXR1cm4gMjtpZihXZShzLG4sbSkpcmV0dXJuIDR9c3dpdGNoKGEpe2Nhc2UgaS5lbnVtTGluZTpzd2l0Y2godSl7Y2FzZSBpLmVudW1FbGxpcHRpY0FyYzpyZXR1cm4gT3UodCxjLGwsbSxvKTtjYXNlIGkuZW51bUJlemllcjpyZXR1cm4gRW8odCxjLGwsbSxvKTtjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjpyZXR1cm4gdGgodCxjLGwsbSxvKTtjYXNlIGkuZW51bUJlemllcjI6cmV0dXJuIHFpKHQsYyxsLG0sbyk7ZGVmYXVsdDpoKFwiXCIpfWJyZWFrO2Nhc2UgaS5lbnVtRWxsaXB0aWNBcmM6c3dpdGNoKHUpe2Nhc2UgaS5lbnVtTGluZTpyZXR1cm4gT3UodCxsLGMsbSxvKTtjYXNlIGkuZW51bUVsbGlwdGljQXJjOnJldHVybiBRdSh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyOnJldHVybiBEbyh0LGMsbCxtLG8pO2Nhc2UgaS5lbnVtUmF0aW9uYWxCZXppZXIyOnJldHVybiBlaCh0LGMsbCxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyMjpyZXR1cm4gRmkodCxjLGwsbSxvKTtkZWZhdWx0OmgoXCJcIil9YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6c3dpdGNoKHUpe2Nhc2UgaS5lbnVtTGluZTpyZXR1cm4gRW8odCxsLGMsbSxvKTtjYXNlIGkuZW51bUVsbGlwdGljQXJjOnJldHVybiBEbyh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyOnJldHVybiB3byh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtUmF0aW9uYWxCZXppZXIyOnJldHVybiBBbyh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyMjpyZXR1cm4gVG8odCxsLGMsbSxvKTtkZWZhdWx0OmgoXCJcIil9YnJlYWs7Y2FzZSBpLmVudW1SYXRpb25hbEJlemllcjI6c3dpdGNoKHUpe2Nhc2UgaS5lbnVtTGluZTpyZXR1cm4gdGgodCxsLGMsbSxvKTtjYXNlIGkuZW51bUVsbGlwdGljQXJjOnJldHVybiBlaCh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyOnJldHVybiBBbyh0LGMsbCxtLG8pO2Nhc2UgaS5lbnVtUmF0aW9uYWxCZXppZXIyOnJldHVybiBzaCh0LGwsYyxtLG8pO2Nhc2UgaS5lbnVtQmV6aWVyMjpyZXR1cm4gbmgodCxsLGMsbSxvKTtkZWZhdWx0OmgoXCJcIil9YnJlYWs7Y2FzZSBpLmVudW1CZXppZXIyOnN3aXRjaCh1KXtjYXNlIGkuZW51bUxpbmU6cmV0dXJuIHFpKHQsbCxjLG0sbyk7Y2FzZSBpLmVudW1FbGxpcHRpY0FyYzpyZXR1cm4gRmkodCxsLGMsbSxvKTtjYXNlIGkuZW51bUJlemllcjpyZXR1cm4gVG8odCxjLGwsbSxvKTtjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjpyZXR1cm4gbmgodCxjLGwsbSxvKTtjYXNlIGkuZW51bUJlemllcjI6cmV0dXJuIFZpKHQsbCxjLG0sbyk7ZGVmYXVsdDpoKFwiXCIpfWJyZWFrO2RlZmF1bHQ6aChcIlwiKX19ZnVuY3Rpb24gaG0odCxlLHM9ITApe2lmKCFzJiYhdW0odCxlKSlyZXR1cm4gMDtjb25zdCBuPXQuaXNMaW5lKCkmJmUuaXNMaW5lKCk7aWYodC5nZXRTdGFydFhZKCkuZXF1YWxzKGUuZ2V0U3RhcnRYWSgpKSYmdC5nZXRFbmRYWSgpLmVxdWFscyhlLmdldEVuZFhZKCkpKXtjb25zdCBzPTE7aWYobilyZXR1cm4gcztjb25zdCByPXQuZ2V0R2VvbWV0cnlUeXBlKCk7aWYociE9PWUuZ2V0R2VvbWV0cnlUeXBlKCkpcmV0dXJuIDA7aWYocj09PWkuZW51bUJlemllcil7Y29uc3Qgbj10LGk9ZTtyZXR1cm4gbi5nZXRDb250cm9sUG9pbnQxKCkuZXF1YWxzKGkuZ2V0Q29udHJvbFBvaW50MSgpKSYmbi5nZXRDb250cm9sUG9pbnQyKCkuZXF1YWxzKGkuZ2V0Q29udHJvbFBvaW50MigpKT9zOjB9aWYocj09PWkuZW51bUVsbGlwdGljQXJjKXtyZXR1cm4gc20odCxlLCExKT9zOjB9aWYocj09PWkuZW51bVJhdGlvbmFsQmV6aWVyMil7Y29uc3Qgbj10LGk9ZTtpZihuLmdldENvbnRyb2xQb2ludDEoKS5lcXVhbHMoaS5nZXRDb250cm9sUG9pbnQxKCkpJiZuLmdldFN0YW5kYXJkRm9ybVdlaWdodCgpPT09aS5nZXRTdGFuZGFyZEZvcm1XZWlnaHQoKSlyZXR1cm4gc31lbHNlIGlmKHI9PT1pLmVudW1CZXppZXIyKXtjb25zdCBuPWU7aWYodC5nZXRDb250cm9sUG9pbnQxKCkuZXF1YWxzKG4uZ2V0Q29udHJvbFBvaW50MSgpKSlyZXR1cm4gc31yZXR1cm4gMH1pZih0LmdldFN0YXJ0WFkoKS5lcXVhbHMoZS5nZXRFbmRYWSgpKSYmdC5nZXRFbmRYWSgpLmVxdWFscyhlLmdldFN0YXJ0WFkoKSkpe2NvbnN0IHM9LTE7aWYobilyZXR1cm4gcztjb25zdCByPXQuZ2V0R2VvbWV0cnlUeXBlKCk7aWYociE9PWUuZ2V0R2VvbWV0cnlUeXBlKCkpcmV0dXJuIDA7aWYocj09PWkuZW51bUJlemllcil7Y29uc3Qgbj10LGk9ZTtyZXR1cm4gbi5nZXRDb250cm9sUG9pbnQxKCkuZXF1YWxzKGkuZ2V0Q29udHJvbFBvaW50MigpKSYmbi5nZXRDb250cm9sUG9pbnQyKCkuZXF1YWxzKGkuZ2V0Q29udHJvbFBvaW50MSgpKT9zOjB9aWYocj09PWkuZW51bUVsbGlwdGljQXJjKXtyZXR1cm4gc20odCxlLCEwKT9zOi0xfWlmKHI9PT1pLmVudW1SYXRpb25hbEJlemllcjIpe2NvbnN0IG49dCxpPWU7aWYobi5nZXRDb250cm9sUG9pbnQxKCkuZXF1YWxzKGkuZ2V0Q29udHJvbFBvaW50MSgpKSYmbi5nZXRTdGFuZGFyZEZvcm1XZWlnaHQoKT09PWkuZ2V0U3RhbmRhcmRGb3JtV2VpZ2h0KCkpcmV0dXJuIHN9ZWxzZSBpZihyPT09aS5lbnVtQmV6aWVyMil7Y29uc3Qgbj1lO2lmKHQuZ2V0Q29udHJvbFBvaW50MSgpLmVxdWFscyhuLmdldENvbnRyb2xQb2ludDEoKSkpcmV0dXJuIHN9cmV0dXJuIDB9cmV0dXJuIDB9ZnVuY3Rpb24gdW0odCxlKXtjb25zdCBzPXQuZ2V0R2VvbWV0cnlUeXBlKCk7cmV0dXJuIHM9PT1lLmdldEdlb21ldHJ5VHlwZSgpJ
1iYocyE9PWkuZW51bUVsbGlwdGljQXJjfHx0LnByb2plY3Rpb25CZWhhdmlvcigpPT09ZS5wcm9qZWN0aW9uQmVoYXZpb3IoKSl9ZnVuY3Rpb24gbW0odCxzLG4scixvLGEsdSl7IW8mJmEmJmUoXCJcIik7Y29uc3QgbT1zLmdldEdlb21ldHJ5VHlwZSgpLGw9bi5nZXRHZW9tZXRyeVR5cGUoKSxjPU1hdGgubWF4KHUsb3MocyxuKSk7aWYociYmKHIubGVuZ3RoPTApLG8mJihvLmxlbmd0aD0wKSxhJiYoYS5sZW5ndGg9MCksbT09PWkuZW51bUxpbmUmJmw9PT1pLmVudW1MaW5lKXJldHVybiB3cyhzLG4scixvLGEsYywhMSwhMSk7bGV0IGc9cyxkPW4sXz1zLmdldFN0YXJ0WFkoKSxwPXMuZ2V0RW5kWFkoKSxmPSExLFA9ITE7Xy5jb21wYXJlKHApPjAmJihnPXMuY2xvbmUoITApLnJldmVyc2UoKSxmPSEwKSxfPW4uZ2V0U3RhcnRYWSgpLHA9bi5nZXRFbmRYWSgpLF8uY29tcGFyZShwKT4wJiYoZD1uLmNsb25lKCEwKS5yZXZlcnNlKCksUD0hMCk7bGV0IHk9MDtzd2l0Y2gobSl7Y2FzZSBpLmVudW1MaW5lOnN3aXRjaChsKXtjYXNlIGkuZW51bUVsbGlwdGljQXJjOnk9SnUodCxkLGcscixhLG8sYywhMSwhMSwhMCk7YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6eT1Jbyh0LGQsZyxyLGEsbyxjLCExLCExLCEwKTticmVhaztjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjp5PWloKHQsZCxnLHIsYSxvLGMsITEsITEsITApO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyMjp5PUxpKHQsZCxnLHIsYSxvLGMsITEsITEsITApO2JyZWFrO2RlZmF1bHQ6aChcIlwiKX1icmVhaztjYXNlIGkuZW51bUVsbGlwdGljQXJjOnN3aXRjaChsKXtjYXNlIGkuZW51bUxpbmU6eT1KdSh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztjYXNlIGkuZW51bUVsbGlwdGljQXJjOnk9S3UodCxnLGQscixvLGEsYywhMSwhMSwhMSk7YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6eT1Nbyh0LGQsZyxyLGEsbyxjLCExLCExLCEwKTticmVhaztjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjp5PXJoKHQsZCxnLHIsYSxvLGMsITEsITEsITApO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyMjp5PVJpKHQsZCxnLHIsYSxvLGMsITEsITEsITApO2JyZWFrO2RlZmF1bHQ6aChcIlwiKX1icmVhaztjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjpzd2l0Y2gobCl7Y2FzZSBpLmVudW1MaW5lOnk9aWgodCxnLGQscixvLGEsYywhMSwhMSwhMSk7YnJlYWs7Y2FzZSBpLmVudW1FbGxpcHRpY0FyYzp5PXJoKHQsZyxkLHIsbyxhLGMsITEsITEsITEpO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyOnk9Tm8odCxkLGcscixhLG8sYywhMSwhMSwhMCk7YnJlYWs7Y2FzZSBpLmVudW1SYXRpb25hbEJlemllcjI6eT1vaCh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztjYXNlIGkuZW51bUJlemllcjI6eT1haCh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztkZWZhdWx0OmgoXCJcIil9YnJlYWs7Y2FzZSBpLmVudW1CZXppZXIyOnN3aXRjaChsKXtjYXNlIGkuZW51bUxpbmU6eT1MaSh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztjYXNlIGkuZW51bUVsbGlwdGljQXJjOnk9UmkodCxnLGQscixvLGEsYywhMSwhMSwhMSk7YnJlYWs7Y2FzZSBpLmVudW1CZXppZXI6eT1Ybyh0LGQsZyxyLGEsbyxjLCExLCExLCEwKTticmVhaztjYXNlIGkuZW51bVJhdGlvbmFsQmV6aWVyMjp5PWFoKHQsZCxnLHIsYSxvLGMsITEsITEsITApO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyMjp5PXppKHQsZyxkLHIsbyxhLGMsITEsITEsITEpO2JyZWFrO2RlZmF1bHQ6aChcIlwiKX1icmVhaztjYXNlIGkuZW51bUJlemllcjpzd2l0Y2gobCl7Y2FzZSBpLmVudW1MaW5lOnk9SW8odCxnLGQscixvLGEsYywhMSwhMSwhMSk7YnJlYWs7Y2FzZSBpLmVudW1FbGxpcHRpY0FyYzp5PU1vKHQsZyxkLHIsbyxhLGMsITEsITEsITEpO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyOnk9WW8odCxnLGQscixvLGEsYywhMSwhMSwhMSk7YnJlYWs7Y2FzZSBpLmVudW1SYXRpb25hbEJlemllcjI6eT1Obyh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztjYXNlIGkuZW51bUJlemllcjI6eT1Ybyh0LGcsZCxyLG8sYSxjLCExLCExLCExKTticmVhaztkZWZhdWx0OmgoXCJcIil9YnJlYWs7ZGVmYXVsdDpoKFwiXCIpfWlmKGYpe2lmKG8pe2ZvcihsZXQgdD0wO3Q8eTt0Kyspb1t0XT0xLW9bdF07by5yZXZlcnNlKCl9ciYmci5yZXZlcnNlKCksYSYmYS5yZXZlcnNlKCl9aWYoUCYmYSlmb3IobGV0IGU9MDtlPHk7ZSsrKWFbZV09MS1hW2VdO3JldHVybiB5fWZ1bmN0aW9uIGxtKHQsZSxzKXtpZihlPT09cylyZXR1cm4gMDtlPnMmJihzPXN0KGUsZT1zKSk7cmV0dXJuIHQuY3V0KGUscywhMCkuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpfWZ1bmN0aW9uIGNtKHQsZSxzLG4saSl7Y29uc3Qgcj1bXSxvPVtdLGE9W107Zm9yKGxldCB1PTAsbT1pO3U8bTt1Kyspci5wdXNoKHQuY2FsY3VsYXRlU3ViTGVuZ3RoRnJvbVN0YXJ0KHNbdV0pKSxvLnB1c2goZS5jYWxjdWxhdGVTdWJMZW5ndGhGcm9tU3RhcnQoblt1XSkpLGR0KHNbdV0sMCwxKSYmZHQoblt1XSwwLDEpJiZ0LmdldENvb3JkMkQoc1t1XSkuZXF1YWxzKGUuZ2V0Q29vcmQyRChuW3VdKSkmJmEucHVzaCh1KTtpZigwPT09YS5sZW5ndGh8fGEubGVuZ3RoPT09aSlyZXR1cm47YS5zb3J0KCh0LGUpPT5zW3RdPHNbZV0/LTE6c1t0XT5zW2VdPzE6blt0XTxuW2VdPy0xOm5bdF0+bltlXT8xOjApO2xldCBoPS0xO2Zvcihjb25zdCB1IG9mIGEpe2lmKGg+PTAmJnNbdV09PT1zW2hdJiZzW3VdPT09c1toXSl7aD11O2NvbnRpbnVlfWg9dTtjb25zdCBhPVtdO2EubGVuZ3RoPWk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDsrK3QpYVt0XT10O2Euc29ydCgodCxlKT0+e2NvbnN0IHM9clt1XSxuPW9bdV0saT1yW3RdLXMsYT1vW3RdLW4saD1pKmkrYSphLG09cltlXS1zLGw9b1tlXS1uLGM9bSptK2wqbDtyZXR1cm4gaDxjPy0xOmg+Yz8xOjB9KTtmb3IobGV0IHI9MDtyPGk7cisrKXtjb25zdCBpPWFbcl07aWYoaT09PXV8fHNbaV09PT1zW3VdJiZuW2ldPT09blt1XXx8ZHQoc1tpXSwwLDEpJiZkdChuW2ldLDAsMSkpY29udGludWU7Y29uc3Qgbz0ocyxuLGkscik9Pntjb25zdCBvPW5ldyBOZSxhPW5ldyBodDthLnNldFdpdGhFcHMoMSk7Y29uc3QgaD1uZXcgaHQ7aC5zZXQobixhLmVwcygpKSx0LnF1ZXJ5Q29vcmQyREUoaCxvKTtjb25zdCB1PW5ldyBOZTt0LnF1ZXJ5Q29vcmQyREUobmV3IGh0KHMpLHUpO2xldCBtPSExO3JldHVybiBvLmVxKHUpJiYoaC5zZXQocixhLmVwcygpKSxlLnF1ZXJ5Q29vcmQyREUoaCxvKSxlLnF1ZXJ5Q29vcmQyREUobmV3IGh0KGkpLHUpLG09by5lcSh1KSksIW
119LGg9Si5nZXROQU4oKTt0LnF1ZXJ5Q29vcmQyRChzW2ldLGgpO2NvbnN0IG09Si5nZXROQU4oKTtlLnF1ZXJ5Q29vcmQyRChuW2ldLG0pO2lmKDA9PT1KLmRpc3RhbmNlKGgsbSkmJm8oc1t1XSxzW2ldLG5bdV0sbltpXSkpYnJlYWs7Y29uc3QgbD1uZXcgVShuW2ldLG5bdV0pO2wubm9ybWFsaXplTm9OQU4oKTtjb25zdCBjPW5ldyBVKHNbaV0sc1t1XSk7Yy5ub3JtYWxpemVOb05BTigpO2xldCBnPS0xLGQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLF89TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHA9c1tpXTtoLmFzc2lnbih0LmdldENvb3JkMkQocCkpO2ZvcihsZXQgcj0wO3I8NTtyKyspe2NvbnN0IHI9ZS5nZXRDbG9zZXN0Q29vcmRpbmF0ZU9uSW50ZXJ2YWwoaCxsLC0xKTttLmFzc2lnbihlLmdldENvb3JkMkQocikpO2NvbnN0IGE9Si5kaXN0YW5jZShoLG0pO2lmKHA9dC5nZXRDbG9zZXN0Q29vcmRpbmF0ZU9uSW50ZXJ2YWwobSxjLC0xKSxwPT09c1t1XSYmcj09PW5bdV0pe2c9MTticmVha31oLmFzc2lnbih0LmdldENvb3JkMkQocCkpO2NvbnN0IGY9Si5kaXN0YW5jZShtLGgpO2lmKCEoZjxfJiZhPGQpKXtnPTA7YnJlYWt9aWYoMD09PWYmJjA9PT1hKXtvKHNbdV0sc1tpXSxuW3VdLG5baV0pPyhzW2ldPXAsbltpXT1yLGc9MCk6Zz0xO2JyZWFrfV89ZixkPWF9aWYoLTE9PT1nJiYoZz1kdChzW2ldLDAsMSl8fGR0KG5baV0sMCwxKT8wOjEpLDEhPT1nKWJyZWFrO3NbaV09c1t1XSxuW2ldPW5bdV19fX1mdW5jdGlvbiBnbSh0LGUscyxuLGkscixvLGEsaCx1LG0sbCxjKXtpZighcilyZXR1cm4gMDtjb25zdCBnPSh0LGUpPT57Zm9yKGxldCBzPTA7czxyOysrcyl7bGV0IG49ZVtzXTtpZihkdChuLDAsMSkpe249aWUobik7Y29udGludWV9Y29uc3QgaT10LmdldENvb3JkMkQobik7bjwuNT9pLmVxdWFscyh0LmdldFN0YXJ0WFkoKSkmJmxtKHQsMCxuKTw9cnModCkmJihlW3NdPTApOmkuZXF1YWxzKHQuZ2V0RW5kWFkoKSkmJmxtKHQsbiwxKTw9cnModCkmJihlW3NdPTEpfX07ZyhlLG4pLGcocyxpKSxjbShlLHMsbixpLHIpO2NvbnN0IGQ9W107Zm9yKGxldCBmPTAsUD1yO2Y8UDtmKyspZC5wdXNoKGYpO2NvbnN0IF89KHQsZSk9PmM/cmUoaVt0XSxuW3RdLGlbZV0sbltlXSk6cmUoblt0XSxpW3RdLG5bZV0saVtlXSk7aWYoZC5sZW5ndGg+MSl7ZC5zb3J0KF8pO2NvbnN0IHQ9TWF0aC5tYXgocnMoZSkscnMocykpO2xldCByPTA7Zm9yKGxldCBvPTEsYT1kLmxlbmd0aDtvPGE7bysrKXtjb25zdCBhPW5bZFtyXV0saD1uW2Rbb11dLHU9aVtkW3JdXSxtPWlbZFtvXV07aWYoYSE9PWh8fHUhPT1tKXtpZihsbShlLGEsaCk8PXQmJmxtKHMsdSxtKTw9dCYmIShkdChhLDAsMSkmJmR0KHUsMCwxKXx8ZHQoaCwwLDEpJiZkdChtLDAsMSkpKXtjb25zdCB0PUouZGlzdGFuY2UoZS5nZXRDb29yZDJEKGEpLHMuZ2V0Q29vcmQyRCh1KSksbj1KLmRpc3RhbmNlKGUuZ2V0Q29vcmQyRChoKSxzLmdldENvb3JkMkQobSkpO2lmKHQ8PW4pY29udGludWU7aWYobjx0KXtkW3JdPWRbb107Y29udGludWV9Y29udGludWV9cisrLGRbcl09ZFtvXX19aWYoZC5sZW5ndGg9cisxLDE9PT1kLmxlbmd0aCYmMCE9PWRbMF0mJihuWzBdPW5bZFswXV0saVswXT1pW2RbMF1dLGRbMF09MCksZC5sZW5ndGg+Mil7Y29uc3QgdD1VLmNvbnN0cnVjdEVtcHR5KCkscj1VLmNvbnN0cnVjdEVtcHR5KCk7dC5zZXRDb29yZHMobltkWzBdXSxuW2QuYXQoLTEpXSksci5zZXRDb29yZHMoaVtkWzBdXSxpW2QuYXQoLTEpXSk7bGV0IG89ITA7Zm9yKGxldCBlPTEscz1kLmxlbmd0aC0xO2U8cztlKyspaWYoIXQuY29udGFpbnNDb29yZGluYXRlKG5bZFtlXV0pfHwhci5jb250YWluc0Nvb3JkaW5hdGUoaVtkW2VdXSkpe289ITE7YnJlYWt9aWYobyl7Y29uc3Qgbj1bLjUsLjIsLjcsLjEsLjMsLjQsLjYsLjgsLjldO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgYT1vdCh0LnZtaW4sdC52bWF4LG5baV0pO2NvbnN0IGg9ZS5nZXRDb29yZDJEKGEpO2lmKCFzLmlzQ2xvc2VyVGhhbkRpc3RhbmNlKGgscix1KSl7bz0hMTticmVha31hPW90KHIudm1pbixyLnZtYXgsbltpXSk7Y29uc3QgbT1zLmdldENvb3JkMkQoYSk7aWYoIWUuaXNDbG9zZXJUaGFuRGlzdGFuY2UobSx0LHUpKXtvPSExO2JyZWFrfX19byYmKGRbMV09ZC5hdCgtMSksZC5sZW5ndGg9Mil9fWlmKDE9PT1kLmxlbmd0aCYmdCl7Y29uc3QgdD0wLHI9MDtHZShlLHMsblswXSxpWzBdLHUsMSxbdF0sW3JdKSYmKGQucHVzaCgxKSxuWzFdPXQsaVsxXT1yLGQuc29ydChfKSl9aWYobSYmMT09PWQubGVuZ3RoKXtsZXQgdD0hMDtmb3IobGV0IHI9MCxvPWQubGVuZ3RoO3I8bztyKyspe2lmKGR0KG5bZFtyXV0sMCwxKSYmZHQoaVtkW3JdXSwwLDEpKXtpZigwPT09Si5kaXN0YW5jZShlLmdldENvb3JkMkQobltkW3JdXSkscy5nZXRDb29yZDJEKGlbZFtyXV0pKSljb250aW51ZX10PSExO2JyZWFrfWlmKHQpcmV0dXJuIDB9bGV0IHA9MDtmb3IobGV0IGY9MCxQPWQubGVuZ3RoO2Y8UDtmKyspe2lmKGEmJmEucHVzaChuW2RbZl1dKSxoJiZoLnB1c2goaVtkW2ZdXSksbyl7Y29uc3QgdD1KLmdldE5BTigpO2UucXVlcnlDb29yZDJEKG5bZFtmXV0sdCksby5wdXNoKHQpfXArK31yZXR1cm4gcH1mdW5jdGlvbiBkbSh0LGUscyxuLGkscixvLGEsaCl7aWYoZHQocywwLDEpJiZkdChuLDAsMSkpe2lmKDA9PT1KLmRpc3RhbmNlKHQuZ2V0Q29vcmQyRChzKSxlLmdldENvb3JkMkQobikpKXtjb25zdCB1PTFlLTEyLG09bmV3IE5lLGw9TnVtYmVyLkVQU0lMT047aWYodC5xdWVyeURlcml2YXRpdmUobmV3IGh0KHMsbCksbSksbS5pc1RydWVaZXJvKCkpe2NvbnN0IGU9MT09PXM/LXU6dTt0LnF1ZXJ5RGVyaXZhdGl2ZShuZXcgaHQocyxsKS5hZGQoZSksbSl9MT09PXMmJm0ubmVnYXRlVGhpcygpO2NvbnN0IGM9bmV3IE5lO2lmKGUucXVlcnlEZXJpdmF0aXZlKG5ldyBodChuLGwpLGMpLGMuaXNUcnVlWmVybygpKXtjb25zdCB0PTE9PT1zPy11OnU7ZS5xdWVyeURlcml2YXRpdmUobmV3IGh0KG4sbCkuYWRkKHQpLGMpfTE9PT1uJiZjLm5lZ2F0ZVRoaXMoKSxtLmlzWmVybygpfHxtLm5vcm1hbGl6ZSgpLGMuaXNaZXJvKCl8fGMubm9ybWFsaXplKCk7Y29uc3QgZz1tLmRvdFByb2R1Y3QoYyksZD1tLmNyb3NzUHJvZHVjdChjKTtkLnNjYWxlRXJyb3IoMyk7Y29uc3QgXz0oKT0+e2lmKGgpcmV0dXJuLjAwMTt7Y29uc3Qgcz10LmNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKSxuPWUuY2FsY3VsYXRlVXBwZXJMZW5ndGgyRCgpO3JldHVybiBNYXRoLm1pbiguMDEqaS9NYXRoLm1pbihzLG4pLDFlLTEwKX19O2lmKGcuZ2UobXQpJiYoZC5pc1plcm8oKXx8TWF0aC5hYnMoZC52YWx1ZSgpKTxfKCkpKXtyZXR1cm4ga2UodCxlLHMsbixpLHIsbyxhKX19fXJldHVybiAwfWZ1bmN0aW9uIF9tKHQsZSxuLGkscil7bGV0IG89LTEsYT0tMSxoPS0xLHU9LTE7e2NvbnN0IHM9WzAsZV0scj1bZSwwXSxtPVswLGldLGw9W2ksMF07Zm9yKGxldCBlPTA7ZTwyJiYtMT09PW87KytlKWZvcihsZXQgaT0wO2k8MjsrK2kpaWYodFtzW2VdXS5lcXVhbHMoblttW2ldXSkpe289c1tlXSxhPXJbZV0saD1tW2ldLHU9bFtpXTticmVha319aWYoLTE9PT1vKXtjb25zdCBzPW5ldyB3ZTtzLnNldEZyb21Qb2ludHModCxlKzEpO2
1NvbnN0IG89bmV3IHdlO3JldHVybiBvLnNldEZyb21Qb2ludHMobixpKzEpLG8uaW5mbGF0ZShyKSxzLmlzSW50ZXJzZWN0aW5nVyhvKT8tMTowfXtjb25zdCBtPU8oZSsxLE51bWJlci5OYU4pLGw9Q3IodCxlKzEsbSk7cyhsPjEpO2xldCBjPTAsZz0wO2ZvcihsZXQgdD0wO3Q8bDsrK3Qpbz09PW1bdF0mJihnPXQsYysrKSxhPT09bVt0XSYmYysrO2lmKDIhPT1jKXJldHVybi0xO2NvbnN0IGQ9TyhpKzEsTnVtYmVyLk5hTiksXz1DcihuLGkrMSxkKTtzKF8+MSksYz0wO2xldCBwPTA7Zm9yKGxldCB0PTA7dDxfOysrdCloPT09ZFt0XSYmKHA9dCxjKyspLHU9PT1kW3RdJiZjKys7aWYoMiE9PWMpcmV0dXJuLTE7Y29uc3QgZj10W21bKGcrbC0xKSVsXV0sUD10W21bKGcrMSklbF1dLHk9bltkWyhwK18tMSklX11dLHg9bltkWyhwKzEpJV9dXSxDPXRbb10sdj1bZixQLHkseF0sYj1bMCwxLDIsM107Yi5zb3J0KCh0LGUpPT5KLmNvbXBhcmVWZWN0b3JzT3JpZ2luKEMsdlt0XSx2W2VdKSk7bGV0IFM9YlswXTtmb3IobGV0IHQ9MTt0PDQ7dCsrKXtpZihiW3RdIT09KFMrMSklNClyZXR1cm4tMTtTPWJbdF19e2NvbnN0IHQ9Zi5zdWIoQyksZT14LnN1YihDKSxzPWUuZG90UHJvZHVjdCh0KTtpZihzPjApe2NvbnN0IG49ZS5jcm9zc1Byb2R1Y3QodCksaT1NYXRoLmFicyhNYXRoLmF0YW4yKG4scykpLG89aSp0Lmxlbmd0aCgpLGE9aSplLmxlbmd0aCgpO2lmKG88PXJ8fGE8PXIpcmV0dXJuLTF9fXtjb25zdCB0PVAuc3ViKEMpLGU9eS5zdWIoQykscz1lLmRvdFByb2R1Y3QodCk7aWYocz4wKXtjb25zdCBuPWUuY3Jvc3NQcm9kdWN0KHQpLGk9TWF0aC5hYnMoTWF0aC5hdGFuMihuLHMpKSxvPWkqdC5sZW5ndGgoKSxhPWkqZS5sZW5ndGgoKTtpZihvPD1yfHxhPD1yKXJldHVybi0xfX1yZXR1cm4gMX19dmFyIHBtPWI7Y2xhc3MgZm0gZXh0ZW5kcyBfc3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0fHx7WFN0YXJ0OjAsWVN0YXJ0OjAsWEVuZDowLFlFbmQ6MH0pfWFzc2lnbk1vdmUodCl7cmV0dXJuIHRoaXMhPT10JiYodGhpcy5tX2Rlc2NyaXB0aW9uPXQubV9kZXNjcmlwdGlvbix0Lm1fZGVzY3JpcHRpb249bnVsbCx0aGlzLm1fYXR0cmlidXRlcz10Lm1fYXR0cmlidXRlcyx0Lm1fYXR0cmlidXRlcz1udWxsLHRoaXMubV9YU3RhcnQ9dC5tX1hTdGFydCx0Lm1fWFN0YXJ0PU51bWJlci5OYU4sdGhpcy5tX1lTdGFydD10Lm1fWVN0YXJ0LHRoaXMubV9YRW5kPXQubV9YRW5kLHQubV9YRW5kPU51bWJlci5OYU4sdGhpcy5tX1lFbmQ9dC5tX1lFbmQpLHRoaXN9YXNzaWduQ29weSh0KXtyZXR1cm4gdGhpcyE9PXQmJnQuY29weVRvKHRoaXMpLHRoaXN9Y2FsY3VsYXRlTG93ZXJMZW5ndGgzRCgpe3JldHVybiBzKDApLDB9Y2FsY3VsYXRlVXBwZXJMZW5ndGgzRCgpe3JldHVybiBzKDApLDB9Y2hhbmdlRW5kUG9pbnRzM0QodCxlKXtzKDApfWdldENsb3Nlc3RDb29yZGluYXRlM0QodCxlLG4pe3JldHVybiBzKDApLDB9Z2V0Qm91bmRhcnkoKXtyZXR1cm4gJHModGhpcyl9Z2V0QXR0cmlidXRlQXNEYmwodCxlLHMpe2lmKDA9PT1lKXJldHVybiAwPT09cz9Qcyh0aGlzLHQpOnlzKHRoaXMsdCk7Y29uc3Qgbj1wbS5nZXRJbnRlcnBvbGF0aW9uKGUpLGk9dGhpcy5nZXRTdGFydEF0dHJpYnV0ZUFzRGJsKGUscykscj10aGlzLmdldEVuZEF0dHJpYnV0ZUFzRGJsKGUscyk7cmV0dXJuIHZ0KG4saSxyLHQscG0uZ2V0RGVmYXVsdFZhbHVlKGUpKX1jb25zdHJ1Y3RGcm9tQ29vcmRzKHQsZSxzLG4pe3RoaXMuZHJvcEFsbEF0dHJpYnV0ZXMoKSx0aGlzLnNldFN0YXJ0WFlDb29yZHModCxlKSx0aGlzLnNldEVuZFhZQ29vcmRzKHMsbil9Y29uc3RydWN0KHQsZSl7dGhpcy5kcm9wQWxsQXR0cmlidXRlcygpLHRoaXMuc2V0U3RhcnRYWSh0KSx0aGlzLnNldEVuZFhZKGUpfWNvbnN0cnVjdDNEKHQsZSl7cygwKX1jb25zdHJ1Y3RQb2ludCh0LGUpe3RoaXMuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odC5nZXREZXNjcmlwdGlvbigpKSx0aGlzLm1lcmdlVmVydGV4RGVzY3JpcHRpb24oZS5nZXREZXNjcmlwdGlvbigpKSx0aGlzLnNldFN0YXJ0KHQpLHRoaXMuc2V0RW5kKGUpfWdldEdlb21ldHJ5VHlwZSgpe3JldHVybiBmbS50eXBlfXF1ZXJ5RW52ZWxvcGUodCl7aWYoND09PXQubV9FbnZlbG9wZVR5cGUpe3Quc2V0RW1wdHkoKSx0LmFzc2lnblZlcnRleERlc2NyaXB0aW9uKHRoaXMubV9kZXNjcmlwdGlvbik7Y29uc3QgZT1sZS5jb25zdHJ1Y3RFbXB0eSgpO3RoaXMucXVlcnlFbnZlbG9wZShlKSx0LnNldEVudmVsb3BlKGUpO2ZvcihsZXQgcz0xLG49dGhpcy5tX2Rlc2NyaXB0aW9uLmdldEF0dHJpYnV0ZUNvdW50KCk7czxuO3MrKyl7Y29uc3QgZT10aGlzLm1fZGVzY3JpcHRpb24uZ2V0U2VtYW50aWNzKHMpO2ZvcihsZXQgbj0wLGk9cG0uZ2V0Q29tcG9uZW50Q291bnQoZSk7czxpO3MrKyl7Y29uc3Qgcz10aGlzLnF1ZXJ5SW50ZXJ2YWwoZSxuKTt0LnNldEludGVydmFsRW52ZWxvcGUoZSxuLHMpfX19ZWxzZSAyPT09dC5tX0VudmVsb3BlVHlwZT90LnNldENvb3Jkcyh7eG1pbjp0aGlzLm1fWFN0YXJ0LHltaW46dGhpcy5tX1lTdGFydCx4bWF4OnRoaXMubV9YRW5kLHltYXg6dGhpcy5tX1lFbmR9KTozPT09dC5tX0VudmVsb3BlVHlwZT8odC5zZXRFbXB0eSgpLHQubWVyZ2VDb29yZHModGhpcy5tX1hTdGFydCx0aGlzLm1fWVN0YXJ0LGVzKHRoaXMsMCwxLDApKSx0Lm1lcmdlQ29vcmRzKHRoaXMubV9YRW5kLHRoaXMubV9ZRW5kLGVzKHRoaXMsMSwxLDApKSk6YShcImVudiB0eXBlIG5vdCBpbXBsXCIpfWFwcGx5VHJhbnNmb3JtYXRpb24odCl7cyh0IGluc3RhbmNlb2YgY2UpO2NvbnN0IGU9bmV3IEo7ZS54PXRoaXMubV9YU3RhcnQsZS55PXRoaXMubV9ZU3RhcnQsdC50cmFuc2Zvcm1JblBsYWNlKGUpLHRoaXMubV9YU3RhcnQ9ZS54LHRoaXMubV9ZU3RhcnQ9ZS55LGUueD10aGlzLm1fWEVuZCxlLnk9dGhpcy5tX1lFbmQsdC50cmFuc2Zvcm1JblBsYWNlKGUpLHRoaXMubV9YRW5kPWUueCx0aGlzLm1fWUVuZD1lLnl9Y3JlYXRlSW5zdGFuY2UoKXtyZXR1cm4gbmV3IGZtKHt2ZDp0aGlzLm1fZGVzY3JpcHRpb259KX1jYWxjdWxhdGVMZW5ndGgyRCgpe3JldHVybiBNYXRoLnNxcnQ
1ocXModGhpcykpfWNhbGN1bGF0ZUxlbmd0aDNEKHQpe3JldHVybiBzKDApLDB9Y2hhbmdlRW5kUG9pbnRzMkQodCxlKXt0aGlzLnNldFN0YXJ0WFkodCksdGhpcy5zZXRFbmRYWShlKSx0aGlzLm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKX1xdWVyeUNvbnRyb2xQb2ludHNIZWxwZXIodCl7cmV0dXJuIHModC5sZW5ndGg+PTIpLHRbMF09dGhpcy5nZXRTdGFydFhZKCksdFsxXT10aGlzLmdldEVuZFhZKCksMn1xdWVyeUNvb3JkMkQodCxlKXtyZXR1cm4gcHModGhpcyx0LGUpfXF1ZXJ5Q29vcmQzRCh0LGUpe3MoMCl9Z2V0Q29vcmRaKHQpe3JldHVybiB4cyh0aGlzLHQpfXF1ZXJ5Q29vcmQyREUodCxlKXt2cyh0aGlzLHQsZSl9cXVlcnlDb29yZDJETVAodCxlKXtlLmFzc2lnblBvaW50MkQodGhpcy5nZXRTdGFydFhZKCkpO2NvbnN0IHM9cWUuY29uc3RydWN0UG9pbnQyRCh0aGlzLmdldEVuZFhZKCkpO3Muc3ViVGhpcyhlKSxzLm11bFRoaXMocnQuY29uc3RydWN0RG91YmxlKHQpKSxlLmFkZFRoaXMocyl9Z2V0Q29vcmRYKHQpe3JldHVybiBQcyh0aGlzLHQpfWdldENvb3JkWSh0KXtyZXR1cm4geXModGhpcyx0KX1jdXQodCxlLHMpe2NvbnN0IG49bmV3IFBtO3JldHVybiB0aGlzLnF1ZXJ5Q3V0KHQsZSxuLHMpLG4ucmVsZWFzZVNlZ21lbnQoKX1xdWVyeUN1dCh0LGUscyxuKXtjb25zdCBpPXMuY3JlYXRlTGluZSgpO24mJmkuYXNzaWduVmVydGV4RGVzY3JpcHRpb24odGhpcy5tX2Rlc2NyaXB0aW9uKTtjb25zdCByPUouZ2V0TkFOKCk7aWYocHModGhpcyx0LHIpLGkuc2V0U3RhcnRYWUNvb3JkcyhyLngsci55KSxwcyh0aGlzLGUsciksaS5zZXRFbmRYWUNvb3JkcyhyLngsci55KSwhbilmb3IobGV0IG89MSxhPXRoaXMubV9kZXNjcmlwdGlvbi5nZXRBdHRyaWJ1dGVDb3VudCgpO288YTtvKyspe2NvbnN0IHM9dGhpcy5tX2Rlc2NyaXB0aW9uLmdldFNlbWFudGljcyhvKSxuPXBtLmdldENvbXBvbmVudENvdW50KHMpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IG49dGhpcy5nZXRBdHRyaWJ1dGVBc0RibCh0LHMscik7aS5zZXRTdGFydEF0dHJpYnV0ZShzLHIsbik7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZUFzRGJsKGUscyxyKTtpLnNldEVuZEF0dHJpYnV0ZShzLHIsbyl9fX1xdWVyeURlcml2YXRpdmUodCxlKXtDcyh0aGlzLHQsZSl9Z2V0Q2xvc2VzdENvb3JkaW5hdGUodCxlKXtyZXR1cm4gSi5nZXRDbG9zZXN0Q29vcmRpbmF0ZSh0aGlzLmdldFN0YXJ0WFkoKSx0aGlzLmdldEVuZFhZKCksdCxlKX1nZXRDbG9zZXN0Q29vcmRpbmF0ZU9uSW50ZXJ2YWwodCxlLHM9LTEpe2NvbnN0IG49bmV3IEo7dGhpcy5xdWVyeUNvb3JkMkQoZS52bWluLG4pO2NvbnN0IGk9bmV3IEo7dGhpcy5xdWVyeUNvb3JkMkQoZS52bWF4LGkpO2NvbnN0IHI9Si5nZXRDbG9zZXN0Q29vcmRpbmF0ZShuLGksdCwhMSk7cmV0dXJuIG1zLnJlY2FsY3VsYXRlUGFyZW50VChlLnZtaW4sZS52bWF4LHIpfWludGVyc2VjdGlvbk9mWU1vbm90b25pY1dpdGhBeGlzWCh0LGUpe2NvbnN0IHM9dGhpcy5tX1lFbmQtdGhpcy5tX1lTdGFydDtpZighcylyZXR1cm4gdD09PXRoaXMubV9ZRW5kP2U6TnVtYmVyLk5hTjtjb25zdCBuPSh0LXRoaXMubV9ZU3RhcnQpL3M7bGV0IGk9UHModGhpcyxuKTtyZXR1cm4gMT09PW4mJihpPXRoaXMubV9YRW5kKSxpfWlzQ3VydmUoKXtyZXR1cm4hMX1pc01vbm90b25lUXVpY2tBbmREaXJ0eSgpe3JldHVybiEwfWlzRGVnZW5lcmF0ZSh0KXtjb25zdCBlPXRoaXMubV9YU3RhcnQtdGhpcy5tX1hFbmQscz10aGlzLm1fWVN0YXJ0LXRoaXMubV9ZRW5kO3JldHVybiBNYXRoLnNxcnQoZSplK3Mqcyk8PXR9aXNEZWdlbmVyYXRlM0QodCxlKXtyZXR1cm4gcygwKSwhMX1xdWVyeUxvb3NlRW52ZWxvcGUodCl7dGhpcy5xdWVyeUVudmVsb3BlKHQpfWNsb25lKHQpe2NvbnN0IGU9bmV3IGZtO3JldHVybiB0aGlzLmNvcHlUbyhlKSxlfXRUb0xlbmd0aCh0KXtyZXR1cm4gdCp0aGlzLmNhbGN1bGF0ZUxlbmd0aDJEKCl9bGVuZ3RoVG9UKHQpe2NvbnN0IGU9dGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpO3JldHVybiAwIT09ZT90L2U6MH1jYWxjdWxhdGVXZWlnaHRlZEFyZWFDZW50cm9pZDJEKHQpe2NvbnN0IGU9bmV3IEo7cmV0dXJuIGUuc2V0Q29vcmRzKDAsMCksZX1jYWxjdWxhdGVXZWlnaHRlZENlbnRyb2lkMkQoKXtyZXR1cm4gdGhpcy5nZXRDb29yZDJEKC41KS5tdWwodGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpKX1nZXRUYW5nZW50KHQpe2NvbnN0IGU9Si5nZXROQU4oKTtyZXR1cm4gZS5zZXRTdWIodGhpcy5nZXRFbmRYWSgpLHRoaXMuZ2V0U3RhcnRYWSgpKSxlfWdldERlcml2YXRpdmUodCl7Y29uc3QgZT1uZXcgSjtyZXR1cm4gZS5zZXRTdWIodGhpcy5nZXRFbmRYWSgpLHRoaXMuZ2V0U3RhcnRYWSgpKSxlfWdldEN1cnZhdHVyZSh0KXtyZXR1cm4gMH1pc0ludGVyc2VjdGluZ1BvaW50KHQsZSxzKXtyZXR1cm4gTXModGhpcyx0LGUscyk+PTB9aXNJbnRlcnNlY3RpbmdQb2ludDNEKHQsZSxuLGkscj0xKXtyZXR1cm4gcygwKSwhMX1nZXRZTW9ub3RvbmljUGFydHModCxlKXtyZXR1cm4gMH1nZXRNb25vdG9uaWNQYXJ0cyh0LGUpe3JldHVybiAwfWdldE1vbm90b25pY1BhcnRQYXJhbXModCxzKXtyZXR1cm4gcyYmKHQ8MiYmZShcIlwiKSxzWzBdPTAsc1sxXT0xKSwyfWludGVyc2VjdGlvbldpdGhBeGlzMkQodCxlLHMsbil7aWYodCl7Y29uc3QgdD10aGlzLm1fWUVuZC10aGlzLm1fWVN0YXJ0O2lmKCF0KXJldHVybiBlPT09dGhpcy5tX1lFbmQ/LTE6MDtjb25zdCBpPShlLXRoaXMubV9ZU3RhcnQpL3Q7cmV0dXJuIGk8MHx8aT4xPzA6KHMmJihzWzBdPVBzKHRoaXMsaSkpLG4mJihuWzBdPWkpLDEpfXtjb25zdCB0PXRoaXMubV9YRW5kLXRoaXMubV9YU3RhcnQ7aWYoIXQpcmV0dXJuIGU9PT10aGlzLm1fWEVuZD8tMTowO2NvbnN0IGk9KGUtdGhpcy5tX1hTdGFydCkvdDtyZXR1cm4gaTwwfHxpPjE/MDoocyYmKHNbMF09eXModGhpcyxpKSksbiYmKG5bMF09aSksMSl9fWNhbGN1bGF0ZVVwcGVyTGVuZ3RoMkQoKXtyZXR1cm4gdGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpfWNhbGN1bGF0ZUxvd2VyTGVuZ3RoMkQoKXtyZXR1cm4gdGhpcy5jYWxjdWxhdGVMZW5ndGgyRCgpfW5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKXtyZXR1cm4hMX1xdWVyeUxvb3NlRW52ZWxvcGVPbkludGVydmFsKHQsZSl7aWYoMj09PWUubV9FbnZlbG9wZVR5cGUpe2xldCBzPXB0KHQudm1pbiwwLDEpO2NvbnN0IG49bmV3IEo7cmV0dXJuIHRoaXMucXVlcnlDb29yZDJEKHMsbiksZS5zZXRDb29yZHMoe3B0Om59KSxzPXB0KHQudm1heCwwLDEpLHRoaXMucXVlcnlDb29yZDJEKHMsbiksdm9p
1ZCBlLm1lcmdlTmUobil9YShcIjNkIGRzdCBub3QgaW1wbFwiKX1vcmllbnRCb3R0b21VcCgpe0VzKHRoaXMpfWlzTGluZSgpe3JldHVybiEwfWlzRGVnZW5lcmF0ZVRvTGluZUhlbHBlcih0KXtyZXR1cm4hMH1jb3B5SWdub3JlQXR0cmlidXRlcyh0KXt0LnNldFN0YXJ0WFkodGhpcy5nZXRTdGFydFhZKCkpLHQuc2V0RW5kWFkodGhpcy5nZXRFbmRYWSgpKSx0Lm5vcm1hbGl6ZUFmdGVyRW5kcG9pbnRDaGFuZ2UoKX1jYWxjdWxhdGVBcmVhMkRIZWxwZXIoKXtyZXR1cm4gMH1hYnNOb3JtWFlaKHQpe3JldHVybiBTcyh0aGlzLHQpfWFic05vcm0oKXtyZXR1cm4gdGhpcy5nZXRTdGFydFhZKCkubm9ybSgxKSt0aGlzLmdldEVuZFhZKCkubm9ybSgxKX1xdWVyeUVudmVsb3BlVyh0LGUpe2Uuc2V0Q29vcmRzKHRoaXMuZ2V0Q29vcmQyRCh0LnZtaW4pKSxlLm1lcmdlTmUodGhpcy5nZXRDb29yZDJEKHQudm1heCkpfXNldFNlZ21lbnRGcm9tQ29vcmRzRm9yU3RpdGNoZXIodCxlKXticyh0aGlzLHRbMF0sdFtlLTFdKX13cml0ZUluQnVmZmVyU3RyZWFtKHQsZSl7cmV0dXJuIHMoMCksMH1yZWFkRnJvbUJ1ZmZlclN0cmVhbSh0LGUpe3MoMCl9c25hcENvbnRyb2xQb2ludHModCl7cmV0dXJuITF9bmVlZHNTbmFwQ29udHJvbFBvaW50cyh0KXtyZXR1cm4hMX1jYWxjdWxhdGVTcGVjaWFsUG9pbnRzRm9yQ3JhY2tpbmcodCxlKXtyZXR1cm4gMH1lbnN1cmVYWU1vbm90b25lKCl7cmV0dXJuITF9c2V0Q29vcmRzRm9ySW50ZXJzZWN0b3IodCxlLHMpe2JzKHRoaXMsdCxlKX1zdGF0aWMgaXNJbnRlcnNlY3RpbmdMaW5lTGluZSh0LGUscyxuKXtyZXR1cm4gRHModCxlLHMsbil9c3RhdGljIGlzSW50ZXJzZWN0aW5nTGluZUxpbmVfKHQsZSxzLG4pe3JldHVybiBEcyh0LGUscyxuKX1jb3B5VG9JbXBsKHQpe31yZXZlcnNlSW1wbCgpe31lcXVhbHNJbXBsKHQpe3JldHVybiEwfWVxdWFsc0ltcGxUb2wodCxlKXtyZXR1cm4hMH1zd2FwSW1wbCh0KXt9YWZ0ZXJDb21wbGV0ZWRNb2RpZmljYXRpb24oKXt9ZW5kUG9pbnRNb2RpZmllZCgpe31jbGVhckVuZFBvaW50TW9kaWZpZWQoKXt9aW50ZXJzZWN0KHQsZSxzLG4saSl7cmV0dXJuIG1tKCExLHRoaXMsdCxlLHMsbixpKX1pbnRlcnNlY3RQb2ludCh0LGUscyl7ZS5sZW5ndGg8MSYmbihcIlwiKTtjb25zdCBpPU1zKHRoaXMsdCxzLCExKTtyZXR1cm4gaT49MD8oZSYmKGVbMF09aSksMSk6MH1pc0ludGVyc2VjdGluZyh0LGUscyl7cmV0dXJuIDAhPT1vbSghMSx0aGlzLHQsZSxzKX19Zm0udHlwZT1pLmVudW1MaW5lO2NsYXNzIFBte2NvbnN0cnVjdG9yKHQpe3RoaXMubV9zZWc9bnVsbCx0aGlzLm1fY3VydmVzPW51bGwsdGhpcy5tX2xpbmVCdWZmZXI9bmV3IGZtLHRoaXMubV9tYXNrPTAsdGhpcy5tX2FjdGl2ZT0wLHZvaWQgMCE9PXQmJih0LmNvcHk/dC5jb3B5LmNvcHlUbyh0aGlzLCExKTp0Lm1vdmU/dGhpcy5hc3NpZ25Nb3ZlKHQubW92ZSk6dC5zZWdtZW50P3RoaXMuY29weUZyb20odC5zZWdtZW50LCEhdC5iSWdub3JlQXR0cmlidXRlcyk6aChcImJhZCBjb25zdHJ1Y3RvciBwYXJhbXNcIikpfWFzc2lnbkNvcHkodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQbT90aGlzIT09dCYmdC5jb3B5VG8odGhpcywhMSk6dGhpcy5jb3B5RnJvbSh0LCExKSx0aGlzfWFzc2lnbk1vdmUodCl7aWYodCBpbnN0YW5jZW9mIFBtKXtpZih0aGlzPT09dClyZXR1cm4gdGhpczt0aGlzLnJlc2V0KCksMSZ0Lm1fbWFzayYmKHRoaXMubV9saW5lQnVmZmVyPXQubV9saW5lQnVmZmVyLHQubV9saW5lQnVmZmVyPW51bGwsdGhpcy5tX21hc2s9MSksdGhpcy5tX2N1cnZlcz10Lm1fY3VydmVzLHRoaXMubV9tYXNrPXQubV9tYXNrLHRoaXMubV9hY3RpdmU9dC5tX2FjdGl2ZSx0LnJlc2V0KCksdGhpcy5tX3NlZz10aGlzLmFjdGl2ZVNlZ21lbnQoKSx0Lm1fc2VnPW51bGx9ZWxzZXtpZih0aGlzLm1fc2VnPT09dClyZXR1cm4gdGhpczt0aGlzLmNyZWF0ZSh0LmdldEdlb21ldHJ5VHlwZSgpKSx0aGlzLm1fc2VnLnN3YXAodCl9cmV0dXJuIHRoaXN9YWN0aXZlU2VnbWVudCgpe3N3aXRjaCh0aGlzLm1fYWN0aXZlKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAxOnJldHVybiB0aGlzLmxpbmUoKTtjYXNlIDI6cmV0dXJuIHRoaXMuYXJjKCk7Y2FzZSA0OnJldHVybiB0aGlzLmJlemllcjMoKTtjYXNlIDg6cmV0dXJuIHRoaXMuYmV6aWVyMigpO2Nhc2UgMTY6cmV0dXJuIHRoaXMucmJlemllcjIoKTtkZWZhdWx0OmgoXCJcIil9fWdldCgpe3JldHVybiB0aGlzLm1fc2VnfXJlc2V0KCl7MSZ0aGlzLm1fbWFzayYmKHRoaXMubV9saW5lQnVmZmVyPW51bGwpLHRoaXMubV9tYXNrPjEmJih0aGlzLm1fY3VydmVzPW51bGwpLHRoaXMubV9tYXNrPTAsdGhpcy5tX2FjdGl2ZT0wfWVtcHR5KCl7cmV0dXJuIG51bGw9PT10aGlzLm1fc2VnfWNvcHlUbyh0LGUpe3RoaXMhPT10JiYodGhpcy5lbXB0eSgpP3QubV9zZWc9bnVsbDp0LmNvcHlGcm9tKHRoaXMubV9zZWcsZSkpfWNvcHlUb1dpdGhaKHQsZSl7cygwKX1jcmVhdGVJbXBsKHQpe3N3aXRjaCh0KXtjYXNlIGkuZW51bUxpbmU6MSZ0aGlzLm1fbWFza3x8KHRoaXMubV9saW5lQnVmZmVyPW5ldyBmbSx0aGlzLm1fbWFza3w9MSx0aGlzLm1fYWN0aXZlPTEpO2JyZWFrO2Nhc2UgaS5lbnVtRWxsaXB0aWNBcmM6MiZ0aGlzLm1fbWFza3x8KHRoaXMubV9jdXJ2ZXM9bmV3IHFoLHRoaXMubV9tYXNrPTEmdGhpcy5tX21hc2t8Mix0aGlzLm1fYWN0aXZlPTIpO2JyZWFrO2Nhc2UgaS5lbnVtQmV6aWVyOjQmdGhpcy5tX21hc2t8fCh0aGlzLm1fY3VydmVzPW5ldyByYSx0aGlzLm1fbWFzaz0xJnRoaXMubV9tYXNrfDQsdGhpcy5tX2FjdGl2ZT00KTticmVhaztjYXNlIGkuZW51bUJlemllcjI6OCZ0aGlzLm1fbWFza3x8KHRoaXMubV9jdXJ2ZXM9bmV3IEFuLHRoaXMubV9tYXNrPTEmdGhpcy5tX21hc2t8OCx0aGlzLm1fYWN0aXZlPTgpO2JyZWFrO2Nhc2UgaS5lbnVtUmF0aW9uYWxCZXppZXIyOjE2JnRoaXMubV9tYXNrfHwodGhpcy5tX2N1cnZlcz1uZXcgRG4sdGhpcy5tX21hc2s9MSZ0aGlzLm1fbWFza3wxNix0aGlzLm1fYWN0aXZlPTE2KTticmVhaztkZWZhdWx0OmUoXCJcIil9fWNyZWF0ZSh0KXt0PT09aS5lbnVtTGluZT90aGlzLmNyZWF0ZUxpbmUoKTp0PT09aS5lbnVtRWxsaXB0aWNBcmM/dGhpcy5jcmVhdGVFbGxpcHRpY0FyYygpOnQ9PT1pLmVudW1CZXppZXI/dGhpcy5jcmVhdGVDdWJpY0JlemllcigpOnQ9PT1pLmVudW1SYXRpb25hbEJlemllcjI/dGhpcy5jcmVhdGVRdWFkcmF0aWNSYXRpb25hbEJlemllcigpOnQ9PT1pLmVudW1CZXppZXIyP3RoaXMuY3JlYXRlUXVhZHJhdGljQmV6aWVyKCk6ZShcIlNlZ21lbnRfYnVmZmVyLmNyZWF0ZVwiKX1jb3B5RnJvbSh0LGUpe3RoaXMubV9zZWchPT10JiYodGhpcy5jcmVhdGUodC5nZXRHZW9tZXRyeVR5cGUoKSksZT90LmNvcHlJZ25vcmVBdHRyaWJ1dGVzKHRoaXMubV9zZWcpOnQuY29weVRvKHRoaXMubV9zZWcpKX1jb3B5RnJvbVdpdGhaKHQsZSl7cygwKX1saW5lKCl7cmV0dXJuIHRoaXMubV9saW5lQnVmZmVyfWFyYygpe3JldHVybiB0aGlzLm1fY3VydmVzfWJlemllcjMoKXtyZXR1cm4gdGhpcy5tX2N1cnZlc31iZX
1ppZXIyKCl7cmV0dXJuIHRoaXMubV9jdXJ2ZXN9cmJlemllcjIoKXtyZXR1cm4gdGhpcy5tX2N1cnZlc31jcmVhdGVMaW5lKCl7cmV0dXJuIHRoaXMuY3JlYXRlSW1wbChpLmVudW1MaW5lKSx0aGlzLm1fc2VnPXRoaXMubGluZSgpLHRoaXMubGluZSgpfWNyZWF0ZUVsbGlwdGljQXJjKCl7cmV0dXJuIHRoaXMuY3JlYXRlSW1wbChpLmVudW1FbGxpcHRpY0FyYyksdGhpcy5tX3NlZz10aGlzLmFyYygpLHRoaXMuYXJjKCl9Y3JlYXRlQ3ViaWNCZXppZXIoKXtyZXR1cm4gdGhpcy5jcmVhdGVJbXBsKGkuZW51bUJlemllciksdGhpcy5tX3NlZz10aGlzLmJlemllcjMoKSx0aGlzLmJlemllcjMoKX1jcmVhdGVRdWFkcmF0aWNSYXRpb25hbEJlemllcigpe3JldHVybiB0aGlzLmNyZWF0ZUltcGwoaS5lbnVtUmF0aW9uYWxCZXppZXIyKSx0aGlzLm1fc2VnPXRoaXMucmJlemllcjIoKSx0aGlzLnJiZXppZXIyKCl9Y3JlYXRlUXVhZHJhdGljQmV6aWVyKCl7cmV0dXJuIHRoaXMuY3JlYXRlSW1wbChpLmVudW1CZXppZXIyKSx0aGlzLm1fc2VnPXRoaXMuYmV6aWVyMigpLHRoaXMuYmV6aWVyMigpfXJlbGVhc2VTZWdtZW50KCl7aWYodGhpcy5tX3NlZz1udWxsLDA9PT10aGlzLm1fYWN0aXZlJiZoKFwicmVsZWFzZVNlZ21lbnRcIiksMSZ0aGlzLm1fYWN0aXZlKXtjb25zdCB0PXRoaXMubGluZSgpO3JldHVybiB0aGlzLm1fbWFzay09MSx0aGlzLm1fYWN0aXZlPTAsdGhpcy5tX2xpbmVCdWZmZXI9bnVsbCx0fWxldCB0O3JldHVybiAyJnRoaXMubV9hY3RpdmU/dD10aGlzLmFyYygpOjQmdGhpcy5tX2FjdGl2ZT90PXRoaXMuYmV6aWVyMygpOjgmdGhpcy5tX2FjdGl2ZT90PXRoaXMuYmV6aWVyMigpOjE2JnRoaXMubV9hY3RpdmU/dD10aGlzLnJiZXppZXIyKCk6aChcInJlbGVhc2VTZWdtZW50XCIpLHRoaXMubV9tYXNrLT10aGlzLm1fYWN0aXZlLHRoaXMubV9hY3RpdmU9MCx0aGlzLm1fY3VydmVzPW51bGwsdH1lcXVhbHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQbT90aGlzPT09dHx8KHRoaXMuZW1wdHkoKT90LmVtcHR5KCk6IXQuZW1wdHkoKSYmdGhpcy5nZXQoKS5lcXVhbHModC5nZXQoKSkpOihhKFwic2VnIGNvbXBhcmlzb24gbm90IHlldCBpbXBsXCIpLCExKX19ZXhwb3J0e3JzIGFzICQsenUgYXMgQSxJdSBhcyBCLEFyIGFzIEMsWmggYXMgRCx5ciBhcyBFLGF1IGFzIEYsY3MgYXMgRyxHcyBhcyBILFJzIGFzIEksenMgYXMgSixLcyBhcyBLLGZtIGFzIEwsRGUgYXMgTSxHaCBhcyBOLGpoIGFzIE8sbXIgYXMgUCxvbSBhcyBRLEJlIGFzIFIsUG0gYXMgUyxEbiBhcyBULFBoIGFzIFUsV3UgYXMgVixtcyBhcyBXLGZyIGFzIFgsYW0gYXMgWSxtbSBhcyBaLE5lIGFzIF8sUXMgYXMgYSxFcyBhcyBhMCxobSBhcyBhMSx1bSBhcyBhMixkbSBhcyBhMyxOaCBhcyBhNCxxZSBhcyBhNSxndSBhcyBhNixQciBhcyBhNyxJaCBhcyBhOCxwZSBhcyBhOSxUaCBhcyBiLCRzIGFzIGMsQmggYXMgZCxFciBhcyBlLHhyIGFzIGYsZ3MgYXMgZyx5ZSBhcyBoLGJyIGFzIGksSXMgYXMgaixGaCBhcyBrLHFoIGFzIGwsVmggYXMgbSxnciBhcyBuLGRyIGFzIG8sa2ggYXMgcCxubiBhcyBxLENlIGFzIHIsZmUgYXMgcyxlbiBhcyB0LGNvIGFzIHUsUGUgYXMgdixrciBhcyB3LEtuIGFzIHgscmEgYXMgeSxSdSBhcyB6fTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///592368\n'))}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.