{"version":3,"sources":["webpack://mapping-impactful-media/./node_modules/paper/dist/paper-core.js"],"names":["self","undefined","window","document","Base","hidden","array","_slice","slice","create","Object","describe","getOwnPropertyDescriptor","define","defineProperty","forEach","iter","bind","i","l","this","length","call","forIn","hasOwnProperty","set","assign","dst","arguments","src","key","_each","obj","desc","value","_inject","dest","enumerable","beans","preserve","beansNames","field","name","val","get","substring","bean","isFunc","res","prev","base","match","toLowerCase","isPlainObject","writable","configurable","test","part","inject","statics","prototype","extend","ctor","proto","initialize","apply","each","clone","constructor","pick","a","b","list","begin","end","module","exports","toString","_id","_class","_name","type","push","Formatter","instance","number","join","getClassName","importJSON","json","exportJSON","options","toJSON","serialize","props","exclude","filter","_prioritize","equals","obj1","obj2","Array","isArray","keys","read","start","amount","peek","__index","readIndex","_readIndex","readNull","__read","filtered","__filtered","remain","readList","entry","readNamed","getNamed","hasValue","source","getSource","__unfiltered","readSupported","that","__source","arg","hasNamed","prioritize","processed","handleKey","isPlainValue","asString","compact","dictionary","isRoot","formatter","precision","definitions","references","add","item","id","ref","unshift","_serialize","_compactSerialize","deserialize","_data","_setDictionary","_isRoot","isFirst","hasDictionary","isDictionary","args","JSON","stringify","target","parse","useTarget","Item","Layer","insert","concat","items","itemsLength","startLength","splice","index","remove","append","_index","removed","capitalize","str","replace","toUpperCase","camelize","chr","hyphenate","Emitter","on","func","types","_eventTypes","handlers","_callbacks","indexOf","install","off","uninstall","once","handler","emit","event","setTarget","currentTarget","stop","responds","attach","detach","fire","_installEvents","events","_events","isString","PaperScope","paper","settings","applyMatrix","insertItems","handleSize","hitTolerance","project","projects","tools","_scopes","support","ctx","CanvasProvider","getContext","nativeDash","nativeBlendModes","BlendMode","nativeModes","release","agent","user","navigator","userAgent","os","exec","platform","browser","n","v1","v2","rv","chrome","v","version","versionNumber","parseFloat","trident","jsdom","webkit","atom","getView","_view","getPaper","execute","code","scope","setup","element","Project","createCanvas","width","height","getCanvas","activate","clear","handleAttribute","el","attr","getAttribute","hasAttribute","PaperScopeItem","_scope","_list","_reference","isActive","CollisionDetection","findItemBoundsCollisions","items1","items2","tolerance","getBounds","bounds","rect","left","top","right","bottom","bounds1","bounds2","findBoundsCollisions","findCurveBoundsCollisions","curves1","curves2","bothAxis","curves","min","Math","max","hor","ver","boundsA","boundsB","sweepVertical","onlySweepAxisCollisions","allBounds","lengthA","lengthAll","binarySearch","indices","coord","lo","hi","mid","pri0","pri1","sec0","sec1","allIndicesByPri0","sort","i1","i2","activeIndicesByPri1","allCollisions","curIndex","curBounds","origIndex","isCurrentA","isCurrentB","curCollisions","pruneCount","j","activeIndex","curSec1","curSec0","activeBounds","isActiveA","isActiveB","collisions","multiplier","pow","round","pair","val1","val2","separator","point","x","y","size","rectangle","Numerical","abscissas","weights","abs","sqrt","log2","log","LOG2E","EPSILON","MACHINE_EPSILON","clamp","getDiscriminant","c","split","D","E","ad","bd","cd","p","q","getNormalizationFactor","norm","CURVETIME_EPSILON","GEOMETRIC_EPSILON","TRIGONOMETRIC_EPSILON","KAPPA","isZero","isMachineZero","integrate","f","w","A","B","m","sum","Ax","findRoot","df","fx","dx","nx","solveQuadratic","roots","x1","x2","Infinity","Q","R","count","boundless","minB","maxB","isFinite","solveCubic","d","b1","c2","qd","evaluate","x0","tmp","t","r","s","td","rd","UID","_pools","pool","Point","arg0","arg1","reading","hasY","_set","setAngle","angle","getLength","setLength","_angle","cos","sin","scale","getAngle","getAngleInRadians","PI","setAngleInRadians","getAngleInDegrees","setAngleInDegrees","div","NaN","dot","acos","atan2","getQuadrant","getDirectedAngle","cross","getDistance","squared","normalize","current","rotate","center","subtract","transform","matrix","_transformPoint","multiply","divide","modulo","negate","isInside","_Rectangle","contains","isClose","isCollinear","isColinear","isOrthogonal","isNaN","_isNaN","isInQuadrant","point1","point2","random","y1","y2","op","LinkedPoint","owner","setter","_x","_y","_owner","_setter","_dontNotify","getX","setX","getY","setY","isSelected","_selection","_getSelection","setSelected","selected","_changeSelection","Size","hasHeight","_isNaN2","size1","size2","LinkedSize","_width","_height","getWidth","setWidth","getHeight","setHeight","arg2","arg3","from","to","frm","next","rt","getPoint","_dontLink","setPoint","getSize","_fw","_fh","setSize","sx","_sx","sy","_sy","h","getLeft","setLeft","getTop","setTop","getRight","setRight","getBottom","setBottom","getCenterX","setCenterX","getCenterY","setCenterY","getCenter","setCenter","getArea","isEmpty","_containsRectangle","_containsPoint","intersects","epsilon","intersect","unite","include","expand","parts","xFirst","LinkedRectangle","internal","Matrix","ok","_a","_b","_c","_d","_tx","_ty","reset","Error","tx","ty","_changed","getValues","_applyMatrix","mx","recursively","_setApplyMatrix","isIdentity","translate","shear","skew","toRadians","tan","a1","c1","d1","a2","b2","d2","tx2","ty2","prepend","tx1","ty1","appended","prepended","invert","det","inverted","concatenate","preConcatenate","chain","_shiftless","_orNullIfIdentity","isInvertible","isSingular","_transformCoordinates","_transformCorners","coords","_transformBounds","inverseTransform","_inverseTransform","decompose","degrees","asin","translation","getTranslation","rotation","scaling","skewing","getScaling","getRotation","applyToContext","prop","Line","arg4","asVector","_px","_py","_vx","_vy","getVector","line","isInfinite","getSide","getSignedDistance","p1x","p1y","v1x","v1y","p2x","p2y","v2x","v2y","dy","u1","u2","uMin","uMax","px","py","vx","vy","ccw","_children","_namedChildren","_activeLayer","_currentStyle","Style","View","_selectionItems","_selectionCount","_updateVersion","flags","view","_needsUpdate","_requested","_autoUpdate","requestUpdate","changes","_changes","changesById","_changesById","children","getCurrentStyle","setCurrentStyle","style","getIndex","getOptions","getLayers","getActiveLayer","getSymbolDefinitions","ids","getItems","class","SymbolItem","definition","_definition","getSymbols","getSelectedItems","selectionItems","selection","isInserted","_updateSelection","selectAll","setFullySelected","deselectAll","addLayer","layer","insertLayer","_remove","_setProject","setName","_insertItem","_created","NO_INSERT","insertChild","_getItems","getItem","removeOn","sets","_removeSets","mousedrag","other","draw","pixelRatio","save","param","offset","viewMatrix","matrices","updateMatrix","restore","strokeWidth","_drawSelection","_serializeFields","_canApplyMatrix","_canScaleStroke","_pivot","_visible","_blendMode","_opacity","_locked","_guide","_clipMask","_selectBounds","_selectChildren","pivot","visible","blendMode","opacity","locked","guide","clipMask","data","_countItemEvent","onFrame","_animateItem","onLoad","onError","_itemHandlers","_initialize","hasProps","_matrix","_parent","_style","parent","fields","fontSize","Group","_defaults","symbol","_symbol","cacheParent","_project","_bounds","_position","_decomposed","_globalMatrix","_clearBoundsCache","getId","getName","_removeNamed","_getOwner","namedChildren","getStyle","setStyle","getSelection","setSelection","flag","isFullySelected","isClipMask","setClipMask","setFillColor","setStrokeColor","getData","setData","getPosition","position","_getPositionFromBounds","setPosition","getPivot","setPivot","getStrokeBounds","stroke","getHandleBounds","handle","getInternalBounds","hasMatrix","opts","_boundsOptions","getStrokeScaling","cacheItem","_getCachedBounds","setBounds","_backup","_getBounds","_updateBoundsCache","_getBoundsCacheKey","noInternal","cacheKey","cached","nonscaling","hasStroke","_getStrokeMatrix","_item","getViewMatrix","_boundsCache","cache","_decompose","decomposed","setRotation","setScaling","getMatrix","setMatrix","getGlobalMatrix","_dontClone","parents","getApplyMatrix","setApplyMatrix","getTransformContent","setTransformContent","getProject","installEvents","getLayer","getParent","setParent","addChild","getChildren","setChildren","removeChildren","addChildren","getFirstChild","getLastChild","getNextSibling","getPreviousSibling","_equals","copy","deep","copyAttributes","copyContent","insertAbove","orig","excludeMatrix","rasterize","resolution","raster","Raster","getResolution","topLeft","getTopLeft","floor","bottomRight","getBottomRight","ceil","boundsSize","rasterSize","_contains","_asPathItem","Path","Rectangle","getIntersections","hitTest","_hitTest","HitResult","hitTestAll","all","hitTestChildren","_exclude","child","_hitTestChildren","parentViewMatrix","guides","tolerancePadding","_tolerancePadding","_getStrokePadding","checkSelf","hit","checkPoint","pt","checkPosition","checkCenter","checkBounds","points","_hitTestSelf","fill","hasFill","matches","compare","matchObject","firstOnly","overlapping","inside","recursive","path","childMatrix","insertChildren","inserted","notifySelf","_insertAt","insertBelow","sendToBack","bringToFront","appendTop","appendBottom","moveAbove","moveBelow","addTo","copyTo","reduce","namedArray","notifyParent","_dispose","replaceWith","reverseChildren","reverse","numChildren","isEditable","hasShadow","_getOrder","getList","list1","list2","hasChildren","isAbove","isBelow","isParent","isChild","isDescendant","isAncestor","isSibling","isGroupedWith","_applyRecursively","transformMatrix","fillColor","getFillColor","strokeColor","getStrokeColor","_transformContent","decomp","applyRecursively","globalToLocal","localToGlobal","parentToLocal","localToParent","fitBounds","itemRatio","rectRatio","newBounds","_setStyles","fillStyle","toCanvasStyle","strokeStyle","lineWidth","getStrokeWidth","strokeJoin","getStrokeJoin","strokeCap","getStrokeCap","miterLimit","getMiterLimit","lineJoin","lineCap","dashArray","getDashArray","dashOffset","getDashOffset","setLineDash","lineDashOffset","mozDash","mozDashOffset","blur","getShadowBlur","getShadowOffset","shadowColor","getShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","parentStrokeMatrix","globalMatrix","mainCtx","itemOffset","prevOffset","normalBlend","nativeBlend","direct","dontStart","clip","_canComposite","pop","strokeMatrix","clipItem","globalAlpha","globalCompositeOperation","setTransform","_draw","dontFinish","getFillRule","process","_isUpdated","updateVersion","CompoundPath","updated","itemSelected","boundsSelected","positionSelected","_drawSelected","color","getSelectedColor","half","pos","beginPath","arc","deltas","delta","moveTo","lineTo","closePath","fillRect","hash","tween","easing","duration","Tween","_handleFrame","time","running","tweenTo","tweenFrom","_clipItem","_getClipItem","isClipped","setClipped","clipped","Shape","radius","_type","_size","_radius","setType","setRadius","getType","getShape","setShape","getRadius","rad","toPath","toShape","dontPaint","untransformed","isCircle","rx","ry","kappa","cx","cy","bezierCurveTo","getCornerCenter","halfSize","dir","corner","quadrant","isOnEllipseStroke","padding","vector","hitStroke","hitFill","strokeRadius","strokePadding","outer","inner","createShape","Circle","Ellipse","ellipse","_readEllipse","crossOrigin","_smoothing","image","object","getElementById","naturalHeight","setImage","setSource","_loaded","_image","canvas","_canvas","_setImage","copyCanvas","drawImage","_crossOrigin","_clear","getElement","getLoaded","u","getPpi","getImage","Event","setTimeout","DomEvent","load","error","complete","naturalWidth","_context","e","setCanvas","_change","setContext","context","toDataURL","Image","getCrossOrigin","setCrossOrigin","getSmoothing","setSmoothing","smoothing","getSubCanvas","getSubRaster","getAverageColor","PathItem","_sampleContext","clearRect","sampleSize","pixels","getImageData","channels","total","alpha","Color","getPixel","setPixel","components","_convert","_alpha","imageData","createImageData","putImageData","setImageData","disabled","DomElement","setPrefixed","setDefinition","SymbolDefinition","getDefinition","getSymbol","setSymbol","dontCenter","setItem","_dontCenter","place","values","segments","handles","ends","Segment","arg5","handleIn","handleOut","SegmentPoint","_point","hasHandles","_handleIn","_handleOut","_path","curve","_curves","_closed","getHandleIn","setHandleIn","getHandleOut","setHandleOut","isSmooth","clearHandles","oldSelection","getPath","getCurve","_segments","getCurves","getLocation","CurveLocation","_segment1","getNext","smooth","_first","_last","factor","getPrevious","p0","p1","p2","k","d1_a","d1_2a","d2_a","d2_2a","N","isLast","reversed","removeSegment","segment","interpolate","handleIn1","handleIn2","handleOut2","handleOut1","change","Curve","arg6","arg7","seg1","seg2","handle1","handle2","segment1","segment2","_segment2","getPoint1","getHandle1","getHandle2","getPoint2","_length","classify","setPoint1","setPoint2","setHandle1","setHandle2","getSegment1","getSegment2","getPoints","getLine","getPart","getPartLength","divideAt","location","divideAtTime","getTimeAt","_setHandles","subdivide","setHandles","splitAt","splitAtTime","getLocationAtTime","isTime","straight","h1","h2","y0","x3","y3","x4","y4","x5","y5","x6","y6","x7","y7","x8","y8","x9","y9","getMonoCurves","io","o0","o1","o2","o3","isStraight","v0","v3","getTimeOf","p3","geomEpsilon","getNearestTime","minDist","minT","refine","dist","step","flip","isFlatEnough","flatness","ux","uy","_addBounds","minPad","maxPad","s1","s2","isLinear","third","hasLength","isHorizontal","getTangentAtTime","isVertical","getLocationAt","_isTime","getParameterAt","getTimesWithTangent","tangent","getOffsetAtTime","getLocationOf","getOffsetOf","loc","getOffset","getParameterOf","getNearestLocation","getNearestPoint","methods","_evaluateMethods","getLengthIntegrand","ax","bx","ay","by","getIterations","normalized","tMin","tMax","len","d3","serpentine","t1","t2","hasRoots","t1Ok","t2Ok","f1","f2","ds","forward","rangeLength","diff","guess","getTangent","getWeightedTangent","getNormal","getWeightedNormal","getCurvature","getPeaks","addLocation","locations","overlap","excludeStart","excludeEnd","loc1","loc2","_intersection","addCurveIntersections","recursion","calls","tMinClip","tMaxClip","q0x","q0y","q3x","q3y","dMin","dMax","dp0","dp1","dp2","dp3","hull","dq0","dq1","dq2","dq3","dist1","dist2","distRatio","getConvexHull","clipConvexHull","tMinNew","tMaxNew","uDiff","hullTop","hullBottom","clipConvexHullPart","threshold","qx","qy","getCurveLineIntersections","addCurveLineIntersections","addLineIntersection","getCurveIntersections","overlaps","getOverlaps","straight1","straight2","before","getSelfIntersection","info","getSquaredLineLength","straightBoth","l1","l2","pairs","matrix1","matrix2","_returnFirst","length1","length2","values1","values2","boundsCollisions","index1","curve1","collisions1","index2","curve2","den","times","t0","_overlap","_distance","_setCurve","_time","getPointAtTime","_next","_previous","_setPath","_version","_curve","_segment","_setSegment","getSegment","getTime","trySegment","_offset","_curveOffset","getParameter","getCurveOffset","getIntersection","getLastSegment","_ignoreOther","isTouching","inter","isCrossing","t1Inside","t2Inside","c4","c3","offsets","addOffsets","isInRange","getPointAt","v4","a3","a4","hasOverlap","merge","search","found","path1","path2","expanded","compound","pathData","first","isClockwise","setClockwise","clockwise","setPathData","previous","control","relative","getCoord","command","lower","move","cubicCurveTo","quadraticCurveTo","arcTo","winding","_getWinding","onPath","windingL","windingR","getCrossings","minLoc","isPath","itemsFrom","itemsTo","setClosed","paths1","paths2","matched","boundsOverlaps","pathBoundsOverlaps","closed","setSegments","_segmentSelection","_area","getSegments","fullySelected","last","_add","getFirstSegment","_countCurves","getFirstCurve","getLastCurve","isClosed","getPathData","_precision","curX","curY","prevX","prevY","inX","inY","outX","outY","addSegment","skipLine","segs","_adjustCurves","insertSegment","addSegments","insertSegments","removeSegments","_includeCurves","area","_selectSegments","newSelection","last1","last2","first2","first1","simplify","flatten","PathFlattener","PathFitter","fit","_default","loop","asymmetric","paddingLeft","paddingRight","knots","n_1","rf","hx","hy","topCenter","seg3","seg4","isArc","pt1","pt2","shape","pos2","end2","pos1","end1","start2","cap","numSegments","hitCurves","isCloseEnough","checkSegmentPoint","seg","anchor","checkSegmentPoints","addToArea","checkSegmentStroke","isJoin","_addBevelJoin","_addSquareCap","getOffsetsWithTangent","curveStart","curveTimes","drawSegments","drawSegment","dashLength","flattener","drawPart","pX","pY","miniSize","miniHalf","drawHandle","hX","hY","drawHandles","getCurrentSegment","moveBy","curveTo","through","extent","middle","large","rxSq","rySq","xSq","ySq","throughSide","centerSide","ext","inc","z","out","_in","lineBy","curveBy","parameter","cubicCurveBy","quadraticCurveBy","arcBy","method","prevCoords","processSegment","joinBounds","addPoint","addRound","addJoin","addCap","phi","isArea","normal1","getNormalAtTime","normal2","normal","joinPadding","joinRadius","SQRT2","paddingX","paddingY","xn","xx","yn","yx","ellipseSegments","createPath","createEllipse","bl","getBottomLeft","tl","tr","getTopRight","br","RoundRectangle","Oval","Arc","RegularPolygon","sides","three","Star","radius1","radius2","paths","getCurrentPath","check","operators","getPaths","preparePath","resolve","resolveCrossings","reorient","createResult","result","filterIntersection","traceBoolean","operation","trace","splitBoolean","_path1","_path2","operator","crossings","divideLocations","collectPaths","_overlapsOnly","curvesValues","curveCollisions","curveCollisionsMap","propagateWinding","_winding","tracePaths","reorientPaths","added","addPath","linkIntersections","clearCurveHandles","lookup","container","sorted","entry1","containerWinding","getInteriorPoint","entry2","clearLater","renormalizeLocs","prevCurve","prevTime","results","clearCurves","clearLookup","origTime","newCurve","getWinding","dontFlip","vPrev","vClose","curvesList","ia","pv","pa","po","qualityEpsilon","paL","paR","pathWindingL","pathWindingR","onAnyPath","quality","addWinding","a0","windingPrev","a3Prev","handleCurve","monoCurves","totalLength","curveLength","operand","SQRT1_2","wind","pathWinding","starts","isValid","_visited","isStart","visitPath","getCrossingSegments","collectStarts","collect","nextInter","inter1","inter2","over1","over2","branch","visited","valid","finished","branches","shift","hasOverlaps","hasCrossings","intersections","nonZero","intercepts","mv","mo0","mo3","maxRecursion","ignoreStraight","minSpan","addCurve","computeParts","halves","tMid","_get","fitCubic","tan1","tan2","uPrime","chordLengthParameterize","maxError","parametersInOrder","generateBezier","findMaxError","reparameterize","tanCenter","C","X","b0","b3","alpha1","alpha2","detC0C1","detC0X","c0","segLength","eps","degree","maxDist","TextItem","content","_content","_lines","setContent","getContent","getCharacterStyle","setCharacterStyle","getParagraphStyle","setParagraphStyle","PointText","lines","leading","getLeading","font","getFontStyle","textAlign","getJustification","fillText","strokeText","numLines","justification","getTextWidth","colorCtx","gray","rgb","hsb","hsl","gradient","componentParsers","namedColors","transparent","fromCSS","string","parseInt","trim","isHSL","component","unit","turn","grad","hsbIndices","converters","g","achromatic","t3s","t3","properties","parser","_components","Gradient","_removeOwner","_addOwner","_properties","argType","converted","parsers","stops","radial","getComponents","_canvasStyle","converter","convert","getAlpha","setAlpha","hasAlpha","col","isGradient","toCSS","hex","canvasGradient","_stops","origin","destination","highlight","inverse","_radial","createRadialGradient","createLinearGradient","addColorStop","_color","_types","_setOwner","components1","components2","setStops","setRadial","_owners","getStops","GradientStop","getRadial","stops1","stops2","rampPoint","setColor","setOffset","getRampPoint","setRampPoint","getColor","itemDefaults","fillRule","strokeScaling","shadowOffset","selectedColor","groupDefaults","fontFamily","fontWeight","textDefaults","_values","isColor","isPoint","applyToChildren","old","_dontMerge","childValue","Font","WindingRule","isStyle","style1","style2","secondary","defaults2","value1","value2","getFontSize","getFontWeight","getFontFamily","getFont","setFont","getPixelSize","handlePrefix","prefixes","suffix","prefix","getStyles","doc","nodeType","ownerDocument","defaultView","getComputedStyle","viewport","body","html","documentElement","getBoundingClientRect","clientLeft","clientTop","pageXOffset","scrollLeft","pageYOffset","scrollTop","getViewportBounds","innerWidth","clientWidth","innerHeight","clientHeight","isInvisible","isInView","getPrefixed","passive","addEventListener","removeEventListener","targetTouches","changedTouches","pageX","clientX","pageY","clientY","getTarget","srcElement","getRelatedTarget","relatedTarget","toElement","requestAnimationFrame","timer","nativeRequest","requested","callbacks","handleCallbacks","functions","callback","setInterval","getCanvasSize","setAttribute","_viewEvents","none","userDrag","userSelect","touchCallout","contentZooming","tapHighlightColor","_windowEvents","resize","setViewSize","Stats","_stats","stats","domElement","appendChild","_element","_pixelRatio","devicePixelRatio","_setElementSize","_viewSize","_views","_viewsById","_focused","_frameItems","_frameItemCount","_itemEvents","native","virtual","node","_animate","play","pause","_count","getAutoUpdate","setAutoUpdate","autoUpdate","update","now","Date","animate","_handleFrameItems","getPixelRatio","getViewSize","isVisible","parentNode","temp","createElement","removeChild","getZoom","setZoom","zoom","scrollBy","projectToView","viewToProject","getEventPoint","CanvasView","prevFocus","tempFocus","mousedown","mousemove","mouseup","dragging","mouseDown","pointerEnabled","msPointerEnabled","viewEvents","docEvents","mouseout","nodeName","handleMouseMove","scroll","updateFocus","_handleMouseEvent","downPoint","lastPoint","downItem","overItem","dragItem","clickItem","clickTime","dblClick","called","prevented","fallbacks","doubleclick","wasInView","itemEventsMap","click","mouseenter","mouseleave","itemEvents","hitItems","nativeMove","tool","inView","hitItem","mouse","substr","emitMouseEvent","drag","emitMouseEvents","down","up","cancelable","preventDefault","_handleKeyEvent","character","keyEvent","KeyEvent","sign","_resetState","prevPoint","stopItem","mouseEvent","stopped","MouseEvent","fallback","HTMLCanvasElement","deviceRatio","backingStoreRatio","firefox","prevFont","measureText","stopPropagation","getTimeStamp","timeStamp","getModifiers","Key","modifiers","metaFixMap","downKey","keyLookup","charLookup","keyMap","charMap","alt","meta","capsLock","space","option","mac","getKey","keyIdentifier","String","fromCharCode","keyCode","keydown","altKey","metaKey","ctrlKey","keypress","charCode","keyup","isDown","ToolEvent","_choosePoint","toolPoint","getLastPoint","_lastPoint","setLastPoint","getDownPoint","_downPoint","setDownPoint","getMiddlePoint","_middlePoint","setMiddlePoint","middlePoint","getDelta","_delta","setDelta","getCount","setCount","_moveCount","_downCount","getMinDistance","_minDistance","setMinDistance","minDistance","_maxDistance","getMaxDistance","setMaxDistance","maxDistance","getFixedDistance","setFixedDistance","distance","easings","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","isFunction","_then","_startTime","state","_keys","_parsedKeys","_parseKeys","_from","_getState","_to","then","progress","getValue","__add","__subtract","__multiply","_setProperty","onUpdate","startTime","_getProperty","resolved","_resolveValue","_calculate","parsed","PaperScript","calculateBinary","Http","xhr","XMLHttpRequest","open","url","async","mimeType","overrideMimeType","onload","status","responseText","onerror","message","send","canvases","sr","sg","sb","sa","bg","bb","ba","dr","dg","db","getLum","setLum","mn","lmn","ln","mxl","getSat","setSat","md","modes","screen","overlay","darken","lighten","difference","exclusion","hue","saturation","luminosity","average","negation","mode","srcContext","dstContext","srcCanvas","dstData","SvgElement","svg","xmlns","xlink","attributeNamespace","href","attributes","namespace","setAttributeNS","tag","createElementNS","getAttributeNS","SvgStyles","true","false","property","attribute","toSVG","fromSVG","exportFilter","getTransform","coordinates","attrs","trans","exportGroup","childNode","_exportSVG","exportShape","exporters","embedImages","matchShapes","definitionItem","viewBox","overflow","textContent","applyStyle","gradientNode","getGradient","getOrigin","getDestination","getHighlight","fy","gradientUnits","stopColor","exportGradient","visibility","svgs","__id","typeId","exportDefinitions","defs","insertBefore","firstChild","XMLSerializer","serializeToString","exporter","onExport","setOptions","exportSVG","rootSize","allowNull","allowPercent","defaultValue","defaultX","defaultY","convertValue","map","importGroup","nodes","childNodes","isClip","isDefs","currentStyle","applyAttributes","querySelectorAll","importNode","importPoly","importGradient","scaleToBounds","_scaleToBounds","importers","clippath","polygon","polyline","lineargradient","radialgradient","use","circle","text","switch","applyTransform","transforms","applyOpacity","gradientTransform","setVisible","display","percent","styles","group","tagName","isElement","nextSibling","importer","onImport","expandShapes","_importSVG","DOMParser","parseFromString","File","reader","FileReader","readAsText","importSVG","Symbol","PlacedSymbol"],"mappings":";0HAAA,SA+BY,SAAUA,EAAMC,GAE1B,IAAIC,GADJF,EAAOA,GAAQ,EAAQ,OACLE,OACdC,EAAWH,EAAKG,SAChBC,EAAO,IAAI,WACb,IAAIC,EAAS,wCACTC,EAAQ,GACRC,EAASD,EAAME,MACfC,EAASC,OAAOD,OAChBE,EAAWD,OAAOE,yBAClBC,EAASH,OAAOI,eAChBC,EAAUT,EAAMS,SAAW,SAAUC,EAAMC,GAC7C,IAAK,IAAIC,EAAI,EAAGC,EAAIC,KAAKC,OAAQH,EAAIC,EAAGD,IACtCF,EAAKM,KAAKL,EAAMG,KAAKF,GAAIA,EAAGE,OAG5BG,EAAQ,SAAeP,EAAMC,GAC/B,IAAK,IAAIC,KAAKE,KACRA,KAAKI,eAAeN,IAAIF,EAAKM,KAAKL,EAAMG,KAAKF,GAAIA,EAAGE,OAGxDK,EAAMf,OAAOgB,QAAU,SAAUC,GACnC,IAAK,IAAIT,EAAI,EAAGC,EAAIS,UAAUP,OAAQH,EAAIC,EAAGD,IAAK,CAChD,IAAIW,EAAMD,UAAUV,GAEpB,IAAK,IAAIY,KAAOD,EACVA,EAAIL,eAAeM,KAAMH,EAAIG,GAAOD,EAAIC,IAIhD,OAAOH,GAELI,EAAQ,SAAcC,EAAKhB,EAAMC,GACnC,GAAIe,EAAK,CACP,IAAIC,EAAOtB,EAASqB,EAAK,WACxBC,GAA8B,iBAAfA,EAAKC,MAAqBnB,EAAUQ,GAAOD,KAAKU,EAAKhB,EAAMC,EAAOA,GAAQe,GAG5F,OAAOf,GAGT,SAASkB,EAAQC,EAAMP,EAAKQ,EAAYC,EAAOC,GAC7C,IAAIC,EAAa,GAEjB,SAASC,EAAMC,EAAMC,GAEA,iBADnBA,EAAMA,IAAQA,EAAMhC,EAASkB,EAAKa,MAAWC,EAAIC,IAAMD,EAAMA,EAAIT,SACvB,MAAXS,EAAI,KAAYA,EAAMP,EAAKO,EAAIE,UAAU,KAAOF,GAC/E,IAGIG,EAHAC,EAAwB,mBAARJ,EAChBK,EAAML,EACNM,EAAOV,GAAYQ,IAAWJ,EAAIO,KAAOP,GAAOA,EAAIC,IAAMF,KAAQN,EAAOA,EAAKM,GAAQ,KAGrFH,GAAaU,IACZF,GAAUE,IAAMN,EAAIO,KAAOD,GAC3BF,IAAoB,IAAVT,IAAoBQ,EAAOJ,EAAKS,MAAM,iCAAgCX,EAAWM,EAAK,GAAGM,cAAgBN,EAAK,IAAMA,EAAK,IAElIE,IAAOD,GAAWC,EAAIJ,KAA0B,mBAAZI,EAAIJ,KAAuBxC,EAAKiD,cAAcL,KACrFA,EAAM,CACJd,MAAOc,EACPM,UAAU,KAIT3C,EAASyB,EAAMM,IAAS,CAC3Ba,cAAc,IACbA,eACDP,EAAIO,cAAe,EACnBP,EAAIX,WAA2B,MAAdA,EAAqBA,GAAcS,GAGtDjC,EAAOuB,EAAMM,EAAMM,IAIvB,GAAInB,EAAK,CACP,IAAK,IAAIa,KAAQb,EACXA,EAAIL,eAAekB,KAAUrC,EAAOmD,KAAKd,IAAOD,EAAMC,GAG5D,IAAK,IAAIA,KAAQF,EAAY,CAC3B,IAAIiB,EAAOjB,EAAWE,GAClBjB,EAAMW,EAAK,MAAQqB,GACnBb,EAAMR,EAAK,MAAQqB,IAAShC,GAAOW,EAAK,KAAOqB,IAC/Cb,IAAkB,IAAVN,GAAiC,IAAfM,EAAIvB,QAAeoB,EAAMC,EAAM,CAC3DE,IAAKA,EACLnB,IAAKA,KAKX,OAAOW,EAGT,SAAShC,IACP,IAAK,IAAIc,EAAI,EAAGC,EAAIS,UAAUP,OAAQH,EAAIC,EAAGD,IAAK,CAChD,IAAIW,EAAMD,UAAUV,GAChBW,GAAKJ,EAAIL,KAAMS,GAGrB,OAAOT,KAGT,OAAOe,EAAQ/B,EAAM,CACnBsD,OAAQ,SAAgB7B,GACtB,GAAIA,EAAK,CACP,IAAI8B,GAA0B,IAAhB9B,EAAI8B,QAAmB9B,EAAMA,EAAI8B,QAC3CrB,EAAQT,EAAIS,MACZC,EAAWV,EAAIU,SACfoB,IAAY9B,GAAKM,EAAQf,KAAKwC,UAAW/B,EAAKA,EAAIQ,WAAYC,EAAOC,GAEzEJ,EAAQf,KAAMuC,EAAS,KAAMrB,EAAOC,GAGtC,IAAK,IAAIrB,EAAI,EAAGC,EAAIS,UAAUP,OAAQH,EAAIC,EAAGD,IAC3CE,KAAKsC,OAAO9B,UAAUV,IAGxB,OAAOE,MAETyC,OAAQ,WAKN,IAJA,IACIC,EACAC,EAEY/B,EAJZkB,EAAO9B,KAIFF,EAAI,EAAQC,EAAIS,UAAUP,OAAQH,EAAIC,KAAO2C,IAAQC,GAAQ7C,IACpEc,EAAMJ,UAAUV,GAChB4C,EAAOA,GAAQ9B,EAAIgC,WACnBD,EAAQA,GAAS/B,EAAI4B,UAkBvB,OAXAG,GAJAD,EAAOA,GAAQ,WACbZ,EAAKe,MAAM7C,KAAMQ,aAGNgC,UAAYG,GAAStD,EAAOW,KAAKwC,WAC9C/C,EAAOkD,EAAO,cAAe,CAC3B7B,MAAO4B,EACPR,UAAU,EACVC,cAAc,IAGhBpB,EAAQ2B,EAAM1C,MAEVQ,UAAUP,QAAQD,KAAKsC,OAAOO,MAAMH,EAAMlC,WAC9CkC,EAAKZ,KAAOA,EACLY,KAERJ,OAAO,CACRrB,YAAY,EACZ2B,WAAY5D,EACZqB,IAAKrB,EACLsD,OAAQ,WACN,IAAK,IAAIxC,EAAI,EAAGC,EAAIS,UAAUP,OAAQH,EAAIC,EAAGD,IAAK,CAChD,IAAIW,EAAMD,UAAUV,GAEhBW,GACFM,EAAQf,KAAMS,EAAKA,EAAIQ,WAAYR,EAAIS,MAAOT,EAAIU,UAItD,OAAOnB,MAETyC,OAAQ,WACN,IAAIb,EAAMvC,EAAOW,MACjB,OAAO4B,EAAIU,OAAOO,MAAMjB,EAAKpB,YAE/BsC,KAAM,SAAclD,EAAMC,GACxB,OAAOc,EAAMX,KAAMJ,EAAMC,IAE3BkD,MAAO,WACL,OAAO,IAAI/C,KAAKgD,YAAYhD,OAE9BuC,QAAS,CACPlC,IAAKA,EACLyC,KAAMnC,EACNtB,OAAQA,EACRI,OAAQA,EACRF,SAAUA,EACVwD,MAAO,SAAenC,GACpB,OAAOP,EAAI,IAAIO,EAAIoC,YAAepC,IAEpCqB,cAAe,SAAuBrB,GACpC,IAAI8B,EAAc,MAAP9B,GAAeA,EAAIoC,YAC9B,OAAON,IAASA,IAASpD,QAAUoD,IAAS1D,GAAsB,WAAd0D,EAAKpB,OAE3D2B,KAAM,SAAcC,EAAGC,GACrB,OAAOD,IAAMrE,EAAYqE,EAAIC,GAE/B/D,MAAO,SAAegE,EAAMC,EAAOC,GACjC,OAAOnE,EAAOe,KAAKkD,EAAMC,EAAOC,QAKLC,EAAOC,QAAUxE,EACpDA,EAAKsD,OAAO,CACVrB,YAAY,EACZwC,SAAU,WACR,OAAmB,MAAZzD,KAAK0D,KAAe1D,KAAK2D,QAAU,WAAa3D,KAAK4D,MAAQ,KAAO5D,KAAK4D,MAAQ,IAAM,KAAO5D,KAAK0D,KAAO,KAAO1E,EAAK8D,KAAK9C,MAAM,SAAUc,EAAOJ,GACvJ,IAAK,KAAK0B,KAAK1B,GAAM,CACnB,IAAImD,SAAc/C,EAClBd,KAAK8D,KAAKpD,EAAM,MAAiB,WAATmD,EAAoBE,EAAUC,SAASC,OAAOnD,GAAkB,WAAT+C,EAAoB,IAAM/C,EAAQ,IAAMA,OAExH,IAAIoD,KAAK,MAAQ,MAEtBC,aAAc,WACZ,OAAOnE,KAAK2D,QAAU,IAExBS,WAAY,SAAoBC,GAC9B,OAAOrF,EAAKoF,WAAWC,EAAMrE,OAE/BsE,WAAY,SAAoBC,GAC9B,OAAOvF,EAAKsF,WAAWtE,KAAMuE,IAE/BC,OAAQ,WACN,OAAOxF,EAAKyF,UAAUzE,OAExBK,IAAK,SAAaqE,EAAOC,GAEvB,OADID,GAAO1F,EAAK4F,OAAO5E,KAAM0E,EAAOC,EAAS3E,KAAK6E,aAC3C7E,OAER,CACDkB,OAAO,EACPqB,QAAS,CACPiB,QAAS,GACTf,OAAQ,SAASA,IACf,IAAIb,EAAMa,EAAOX,KAAKe,MAAM7C,KAAMQ,WAC9Bc,EAAOM,EAAIY,UAAUmB,OAEzB,OADIrC,IAAStC,EAAKwE,QAAQlC,KAAOtC,EAAKwE,QAAQlC,GAAQM,GAC/CA,GAETkD,OAAQ,SAAgBC,EAAMC,GAC5B,GAAID,IAASC,EAAM,OAAO,EAC1B,GAAID,GAAQA,EAAKD,OAAQ,OAAOC,EAAKD,OAAOE,GAC5C,GAAIA,GAAQA,EAAKF,OAAQ,OAAOE,EAAKF,OAAOC,GAE5C,GAAIA,GAAQC,GAAwB,iBAATD,GAAqC,iBAATC,EAAmB,CACxE,GAAIC,MAAMC,QAAQH,IAASE,MAAMC,QAAQF,GAAO,CAE9C,IADI/E,EAAS8E,EAAK9E,UACH+E,EAAK/E,OAAQ,OAAO,EAEnC,KAAOA,KACL,IAAKjB,EAAK8F,OAAOC,EAAK9E,GAAS+E,EAAK/E,IAAU,OAAO,MAElD,CACL,IACIA,EADAkF,EAAO7F,OAAO6F,KAAKJ,GAEvB,IADI9E,EAASkF,EAAKlF,UACHX,OAAO6F,KAAKH,GAAM/E,OAAQ,OAAO,EAEhD,KAAOA,KAAU,CACf,IAAIS,EAAMyE,EAAKlF,GACf,IAAM+E,EAAK5E,eAAeM,KAAQ1B,EAAK8F,OAAOC,EAAKrE,GAAMsE,EAAKtE,IAAQ,OAAO,GAIjF,OAAO,EAGT,OAAO,GAET0E,KAAM,SAAchC,EAAMiC,EAAOd,EAASe,GACxC,GAAItF,OAAShB,EAAM,CACjB,IAAI8B,EAAQd,KAAKuF,KAAKnC,EAAMiC,GAE5B,OADAjC,EAAKoC,UACE1E,EAGT,IAAI6B,EAAQ3C,KAAKwC,UACbiD,EAAY9C,EAAM+C,WAClBrC,EAAQgC,GAASI,GAAarC,EAAKoC,SAAW,EAC9CvF,EAASmD,EAAKnD,OACdW,EAAMwC,EAAKC,GAGf,GAFAiC,EAASA,GAAUrF,EAASoD,EAExBzC,aAAeZ,MAAQuE,GAAWA,EAAQoB,UAAmB,MAAP/E,GAAe0E,GAAU,EAEjF,OADIG,IAAWrC,EAAKoC,QAAUnC,EAAQ,GAC/BzC,GAAO2D,GAAWA,EAAQxB,MAAQnC,EAAImC,QAAUnC,EAOzD,GAJAA,EAAM5B,EAAKK,OAAOsD,GACd8C,IAAW7E,EAAIgF,QAAS,GAC5BhF,EAAMA,EAAIgC,WAAWC,MAAMjC,EAAKyC,EAAQ,GAAKA,EAAQiC,EAASrF,EAASjB,EAAKI,MAAMgE,EAAMC,EAAOA,EAAQiC,GAAUlC,IAASxC,EAEtH6E,EAAW,CACbrC,EAAKoC,QAAUnC,EAAQzC,EAAIgF,OAC3B,IAAIC,EAAWjF,EAAIkF,WAEfD,IACFzC,EAAK0C,WAAaD,EAClBjF,EAAIkF,WAAajH,GAGnB+B,EAAIgF,OAAS/G,EAGf,OAAO+B,GAET2E,KAAM,SAAcnC,EAAMiC,GACxB,OAAOjC,EAAKA,EAAKoC,QAAUH,GAASjC,EAAKoC,SAAW,IAEtDO,OAAQ,SAAgB3C,GACtB,OAAOA,EAAKnD,QAAUmD,EAAKoC,SAAW,IAExCQ,SAAU,SAAkB5C,EAAMiC,EAAOd,EAASe,GAMhD,IALA,IACIW,EADArE,EAAM,GAENyB,EAAQgC,GAAS,EACjB/B,EAAMgC,EAASjC,EAAQiC,EAASlC,EAAKnD,OAEhCH,EAAIuD,EAAOvD,EAAIwD,EAAKxD,IAC3B8B,EAAIkC,KAAKmB,MAAMC,QAAQe,EAAQ7C,EAAKtD,IAAME,KAAKoF,KAAKa,EAAO,EAAG1B,GAAWvE,KAAKoF,KAAKhC,EAAMtD,EAAGyE,EAAS,IAGvG,OAAO3C,GAETsE,UAAW,SAAmB9C,EAAM9B,EAAM+D,EAAOd,EAASe,GACxD,IAAIxE,EAAQd,KAAKmG,SAAS/C,EAAM9B,GAC5B8E,EAAWtF,IAAUjC,EAEzB,GAAIuH,EAAU,CACZ,IAAIP,EAAWzC,EAAK0C,WAEpB,IAAKD,EAAU,CACb,IAAIQ,EAASrG,KAAKsG,UAAUlD,IAC5ByC,EAAWzC,EAAK0C,WAAa9G,EAAKK,OAAOgH,IAChCE,aAAeF,EAG1BR,EAASvE,GAAQzC,EAGnB,OAAOmB,KAAKoF,KAAKgB,EAAW,CAACtF,GAASsC,EAAMiC,EAAOd,EAASe,IAE9DkB,cAAe,SAAuBpD,EAAMpC,GAC1C,IAAIqF,EAASrG,KAAKsG,UAAUlD,GACxBqD,EAAOzG,KACPoF,GAAO,EAgBX,OAdIiB,GACF/G,OAAO6F,KAAKkB,GAAQ1G,SAAQ,SAAUe,GACpC,GAAIA,KAAOM,EAAM,CACf,IAAIF,EAAQ2F,EAAKP,UAAU9C,EAAM1C,GAE7BI,IAAUjC,IACZmC,EAAKN,GAAOI,GAGdsE,GAAO,MAKNA,GAETkB,UAAW,SAAmBlD,GAC5B,IAAIiD,EAASjD,EAAKsD,SAElB,GAAIL,IAAWxH,EAAW,CACxB,IAAI8H,EAAsB,IAAhBvD,EAAKnD,QAAgBmD,EAAK,GACpCiD,EAASjD,EAAKsD,SAAWC,GAAO3H,EAAKiD,cAAc0E,GAAOA,EAAM,KAGlE,OAAON,GAETF,SAAU,SAAkB/C,EAAM9B,GAChC,IAAI+E,EAASrG,KAAKsG,UAAUlD,GAE5B,GAAIiD,EACF,OAAO/E,EAAO+E,EAAO/E,GAAQ8B,EAAK0C,YAAcO,GAGpDO,SAAU,SAAkBxD,EAAM9B,GAChC,QAAStB,KAAKmG,SAAS/C,EAAM9B,IAE/BsD,OAAQ,SAAgB5D,EAAMqF,EAAQ1B,EAASkC,GAC7C,IAAIC,EAEJ,SAASC,EAAUrG,GACjB,KAAMiE,GAAWjE,KAAOiE,GAAcmC,GAAapG,KAAOoG,GAAY,CACpE,IAAIhG,EAAQuF,EAAO3F,GACfI,IAAUjC,IAAWmC,EAAKN,GAAOI,IAIzC,GAAI+F,EAAY,CAGd,IAFA,IAEgBnG,EAFZyE,EAAO,GAEFrF,EAAI,EAAQC,EAAI8G,EAAW5G,OAAQH,EAAIC,EAAGD,KAC5CY,EAAMmG,EAAW/G,MAAOuG,IAC3BU,EAAUrG,GACVyE,EAAKzE,IAAO,GAIhBoG,EAAY3B,EAId,OADA7F,OAAO6F,KAAKkB,EAAOE,cAAgBF,GAAQ1G,QAAQoH,GAC5C/F,GAETgG,aAAc,SAAsBpG,EAAKqG,GACvC,OAAOjI,EAAKiD,cAAcrB,IAAQqE,MAAMC,QAAQtE,IAAQqG,GAA2B,iBAARrG,GAE7E6D,UAAW,SAAmB7D,EAAK2D,EAAS2C,EAASC,GACnD5C,EAAUA,GAAW,GACrB,IACI3C,EADAwF,GAAUD,EA2Bd,GAxBIC,IACF7C,EAAQ8C,UAAY,IAAItD,EAAUQ,EAAQ+C,WAC1CH,EAAa,CACXlH,OAAQ,EACRsH,YAAa,GACbC,WAAY,GACZC,IAAK,SAAaC,EAAMrI,GACtB,IAAIsI,EAAK,IAAMD,EAAKhE,IAChBkE,EAAM5H,KAAKwH,WAAWG,GAE1B,IAAKC,EAAK,CACR5H,KAAKC,SACL,IAAI2B,EAAMvC,EAAOa,KAAKwH,GAClBpG,EAAOoG,EAAK/D,OACZrC,GAAQM,EAAI,KAAON,GAAMM,EAAIiG,QAAQvG,GACzCtB,KAAKuH,YAAYI,GAAM/F,EACvBgG,EAAM5H,KAAKwH,WAAWG,GAAM,CAACA,GAG/B,OAAOC,KAKThH,GAAOA,EAAIkH,WAAY,CACzBlG,EAAMhB,EAAIkH,WAAWvD,EAAS4C,GAC9B,IAAI7F,EAAOV,EAAI+C,QAEXrC,GAASV,EAAImH,oBAAsBX,GAAWF,GAAYtF,EAAI,KAAON,GACvEM,EAAIiG,QAAQvG,QAET,GAAI2D,MAAMC,QAAQtE,GAAM,CAC7BgB,EAAM,GAEN,IAAK,IAAI9B,EAAI,EAAGC,EAAIa,EAAIX,OAAQH,EAAIC,EAAGD,IACrC8B,EAAI9B,GAAKd,EAAKyF,UAAU7D,EAAId,GAAIyE,EAAS2C,EAASC,QAE/C,GAAInI,EAAKiD,cAAcrB,GAAM,CAClCgB,EAAM,GACN,IAAIuD,EAAO7F,OAAO6F,KAAKvE,GAEvB,IAASd,EAAI,EAAGC,EAAIoF,EAAKlF,OAAQH,EAAIC,EAAGD,IAAK,CAC3C,IAAIY,EAAMyE,EAAKrF,GACf8B,EAAIlB,GAAO1B,EAAKyF,UAAU7D,EAAIF,GAAM6D,EAAS2C,EAASC,SAGxDvF,EADwB,iBAARhB,EACV2D,EAAQ8C,UAAUpD,OAAOrD,EAAK2D,EAAQ+C,WAEtC1G,EAGR,OAAOwG,GAAUD,EAAWlH,OAAS,EAAI,CAAC,CAAC,aAAckH,EAAWI,aAAc3F,GAAOA,GAE3FoG,YAAa,SAAqB3D,EAAMhF,EAAQ4I,EAAOC,EAAgBC,GACrE,IAAIvG,EAAMyC,EACN+D,GAAWH,EACXI,EAAgBD,GAAW/D,GAAQA,EAAKpE,QAAyB,eAAfoE,EAAK,GAAG,GAG9D,GAFA4D,EAAQA,GAAS,GAEbhD,MAAMC,QAAQb,GAAO,CACvB,IAAIR,EAAOQ,EAAK,GACZiE,EAAwB,eAATzE,EAEnB,GAAmB,GAAfQ,EAAKpE,QAAe,KAAKmC,KAAKyB,GAChC,OAAOoE,EAAMd,WAAWtD,GAI1BjC,EAAM,GAEN,IAAK,IAAI9B,GAHT+D,EAAO7E,EAAKwE,QAAQK,IAGA,EAAI,EAAG9D,EAAIsE,EAAKpE,OAAQH,EAAIC,EAAGD,IACjD8B,EAAIkC,KAAK9E,EAAKgJ,YAAY3D,EAAKvE,GAAIT,EAAQ4I,EAAOK,EAAcD,IAGlE,GAAIxE,EAAM,CACR,IAAI0E,EAAO3G,EAGTA,EADEvC,EACIA,EAAOwE,EAAM0E,EAAMH,GAAWD,GAE9B,IAAItE,EAAK0E,SAGd,GAAIvJ,EAAKiD,cAAcoC,GAI5B,IAAK,IAAI3D,KAHTkB,EAAM,GACFsG,IAAgBD,EAAMd,WAAavF,GAEvByC,EACdzC,EAAIlB,GAAO1B,EAAKgJ,YAAY3D,EAAK3D,GAAMrB,EAAQ4I,GAInD,OAAOI,EAAgBzG,EAAI,GAAKA,GAElC0C,WAAY,SAAoB1D,EAAK2D,GACnC,IAAIF,EAAOrF,EAAKyF,UAAU7D,EAAK2D,GAC/B,OAAOA,GAA+B,GAApBA,EAAQ0C,SAAoB5C,EAAOmE,KAAKC,UAAUpE,IAEtED,WAAY,SAAoBC,EAAMqE,GACpC,OAAO1J,EAAKgJ,YAA4B,iBAAT3D,EAAoBmE,KAAKG,MAAMtE,GAAQA,GAAM,SAAU3B,EAAM6F,EAAMnB,GAChG,IAAIwB,EAAYxB,GAAUsB,GAAUA,EAAO1F,cAAgBN,EACvD9B,EAAMgI,EAAYF,EAAS1J,EAAKK,OAAOqD,EAAKF,WAEhD,GAAoB,IAAhB+F,EAAKtI,QAAgBW,aAAeiI,IAASD,KAAehI,aAAekI,IAAS,CACtF,IAAInC,EAAM4B,EAAK,GAEXvJ,EAAKiD,cAAc0E,KACrBA,EAAIoC,QAAS,EAETH,IACFL,EAAOA,EAAKS,OAAO,CAAC,CAClBD,QAAQ,OAQhB,OAFCH,EAAYhI,EAAIP,IAAMqC,GAAMG,MAAMjC,EAAK2H,GACpCK,IAAWF,EAAS,MACjB9H,MAGXkD,KAAM,SAAcV,EAAM6F,GACxB,IAAIC,EAAcD,EAAMhJ,OAExB,GAAIiJ,EAAc,KAChB9F,EAAKU,KAAKjB,MAAMO,EAAM6F,OACjB,CACL,IAAIE,EAAc/F,EAAKnD,OACvBmD,EAAKnD,QAAUiJ,EAEf,IAAK,IAAIpJ,EAAI,EAAGA,EAAIoJ,EAAapJ,IAC/BsD,EAAK+F,EAAcrJ,GAAKmJ,EAAMnJ,GAIlC,OAAOsD,GAETgG,OAAQ,SAAgBhG,EAAM6F,EAAOI,EAAOC,GAC1C,IAAIhE,EAAS2D,GAASA,EAAMhJ,OACxBsJ,EAASF,IAAUxK,GACvBwK,EAAQE,EAASnG,EAAKnD,OAASoJ,GACnBjG,EAAKnD,SAAQoJ,EAAQjG,EAAKnD,QAEtC,IAAK,IAAIH,EAAI,EAAGA,EAAIwF,EAAQxF,IAC1BmJ,EAAMnJ,GAAG0J,OAASH,EAAQvJ,EAG5B,GAAIyJ,EAEF,OADAvK,EAAK8E,KAAKV,EAAM6F,GACT,GAEP,IAAIV,EAAO,CAACc,EAAOC,GACfL,GAAOjK,EAAK8E,KAAKyE,EAAMU,GAG3B,IAFA,IAAIQ,EAAUrG,EAAKgG,OAAOvG,MAAMO,EAAMmF,GAEtBxI,GAAPD,EAAI,EAAO2J,EAAQxJ,QAAQH,EAAIC,EAAGD,IACzC2J,EAAQ3J,GAAG0J,OAAS3K,EAGtB,IAASiB,EAAIuJ,EAAQ/D,EAAQvF,EAAIqD,EAAKnD,OAAQH,EAAIC,EAAGD,IACnDsD,EAAKtD,GAAG0J,OAAS1J,EAGnB,OAAO2J,GAGXC,WAAY,SAAoBC,GAC9B,OAAOA,EAAIC,QAAQ,YAAY,SAAU7H,GACvC,OAAOA,EAAM8H,kBAGjBC,SAAU,SAAkBH,GAC1B,OAAOA,EAAIC,QAAQ,SAAS,SAAU7H,EAAOgI,GAC3C,OAAOA,EAAIF,kBAGfG,UAAW,SAAmBL,GAC5B,OAAOA,EAAIC,QAAQ,kBAAmB,SAAS5H,kBAIrD,IAAIiI,EAAU,CACZC,GAAI,SAAYrG,EAAMsG,GACpB,GAAoB,iBAATtG,EACT7E,EAAK8D,KAAKe,GAAM,SAAU/C,EAAOJ,GAC/BV,KAAKkK,GAAGxJ,EAAKI,KACZd,UACE,CACL,IAAIoK,EAAQpK,KAAKqK,YACbpE,EAAQmE,GAASA,EAAMvG,GACvByG,EAAWtK,KAAKuK,WAAavK,KAAKuK,YAAc,IAGpB,KAFhCD,EAAWA,EAASzG,GAAQyG,EAASzG,IAAS,IAEjC2G,QAAQL,KACnBG,EAASxG,KAAKqG,GACVlE,GAASA,EAAMwE,SAA+B,IAApBH,EAASrK,QAAcgG,EAAMwE,QAAQvK,KAAKF,KAAM6D,IAIlF,OAAO7D,MAET0K,IAAK,SAAa7G,EAAMsG,GACtB,GAAoB,iBAATtG,EAAX,CAOA,IAGIwF,EAHAe,EAAQpK,KAAKqK,YACbpE,EAAQmE,GAASA,EAAMvG,GACvByG,EAAWtK,KAAKuK,YAAcvK,KAAKuK,WAAW1G,GAYlD,OATIyG,KACGH,IAA8C,KAArCd,EAAQiB,EAASE,QAAQL,KAAqC,IAApBG,EAASrK,QAC3DgG,GAASA,EAAM0E,WAAW1E,EAAM0E,UAAUzK,KAAKF,KAAM6D,UAClD7D,KAAKuK,WAAW1G,KACH,IAAXwF,GACTiB,EAASlB,OAAOC,EAAO,IAIpBrJ,KApBLhB,EAAK8D,KAAKe,GAAM,SAAU/C,EAAOJ,GAC/BV,KAAK0K,IAAIhK,EAAKI,KACbd,OAoBP4K,KAAM,SAAc/G,EAAMsG,GACxB,OAAOnK,KAAKkK,GAAGrG,GAAM,SAASgH,IAC5BV,EAAKtH,MAAM7C,KAAMQ,WACjBR,KAAK0K,IAAI7G,EAAMgH,OAGnBC,KAAM,SAAcjH,EAAMkH,GACxB,IAAIT,EAAWtK,KAAKuK,YAAcvK,KAAKuK,WAAW1G,GAClD,IAAKyG,EAAU,OAAO,EACtB,IAAI/B,EAAOvJ,EAAKI,MAAMoB,UAAW,GAC7BwK,EAAYD,GAASA,EAAMrC,SAAWqC,EAAME,cAChDX,EAAWA,EAASlL,QAChB4L,IAAWD,EAAME,cAAgBjL,MAErC,IAAK,IAAIF,EAAI,EAAGC,EAAIuK,EAASrK,OAAQH,EAAIC,EAAGD,IAC1C,GAAqC,GAAjCwK,EAASxK,GAAG+C,MAAM7C,KAAMuI,GAAgB,CACtCwC,GAASA,EAAMG,MAAMH,EAAMG,OAC/B,MAKJ,OADIF,UAAkBD,EAAME,eACrB,GAETE,SAAU,SAAkBtH,GAC1B,SAAU7D,KAAKuK,aAAcvK,KAAKuK,WAAW1G,KAE/CuH,OAAQ,MACRC,OAAQ,OACRC,KAAM,QACNC,eAAgB,SAAwBd,GACtC,IAAIL,EAAQpK,KAAKqK,YACbC,EAAWtK,KAAKuK,WAChB7J,EAAM+J,EAAU,UAAY,YAEhC,GAAIL,EACF,IAAK,IAAIvG,KAAQyG,EACf,GAAIA,EAASzG,GAAM5D,OAAS,EAAG,CAC7B,IAAIgG,EAAQmE,EAAMvG,GACdsG,EAAOlE,GAASA,EAAMvF,GACtByJ,GAAMA,EAAKjK,KAAKF,KAAM6D,KAKlCtB,QAAS,CACPD,OAAQ,SAASA,EAAO7B,GACtB,IAAI+K,EAAS/K,EAAIgL,QAEjB,GAAID,EAAQ,CACV,IAAIpB,EAAQ,GACZpL,EAAK8D,KAAK0I,GAAQ,SAAUvF,EAAOvF,GACjC,IAAIgL,EAA4B,iBAAVzF,EAClB3E,EAAOoK,EAAWzF,EAAQvF,EAC1B2B,EAAOrD,EAAK0K,WAAWpI,GACvBuC,EAAOvC,EAAKG,UAAU,GAAGO,cAC7BoI,EAAMvG,GAAQ6H,EAAW,GAAKzF,EAC9B3E,EAAO,IAAMA,EAEbb,EAAI,MAAQ4B,GAAQ,WAClB,OAAOrC,KAAKsB,IAGdb,EAAI,MAAQ4B,GAAQ,SAAU8H,GAC5B,IAAItI,EAAO7B,KAAKsB,GACZO,GAAM7B,KAAK0K,IAAI7G,EAAMhC,GACrBsI,GAAMnK,KAAKkK,GAAGrG,EAAMsG,GACxBnK,KAAKsB,GAAQ6I,MAGjB1J,EAAI4J,YAAcD,EAGpB,OAAO9H,EAAOR,KAAKe,MAAM7C,KAAMQ,cAIjCmL,EAAa3M,EAAKyD,OAAO,CAC3BkB,OAAQ,aACRf,WAAY,SAAS+I,IACnBC,GAAQ5L,KACRA,KAAK6L,SAAW,IAAI7M,EAAK,CACvB8M,aAAa,EACbC,aAAa,EACbC,WAAY,EACZC,aAAc,IAEhBjM,KAAKkM,QAAU,KACflM,KAAKmM,SAAW,GAChBnM,KAAKoM,MAAQ,GACbpM,KAAK0D,IAAMiI,EAAWjI,MACtBiI,EAAWU,QAAQrM,KAAK0D,KAAO1D,KAC/B,IAAI2C,EAAQgJ,EAAWnJ,UAEvB,IAAKxC,KAAKsM,QAAS,CACjB,IAAIC,EAAMC,GAAeC,WAAW,EAAG,IAAM,GAC7C9J,EAAM2J,QAAU,CACdI,WAAY,gBAAiBH,GAAO,YAAaA,EACjDI,iBAAkBC,GAAUC,aAE9BL,GAAeM,QAAQP,GAGzB,IAAKvM,KAAK+M,MAAO,CACf,IAAIC,EAAOpO,EAAKqO,UAAUC,UAAUlL,cAChCmL,GAAM,uCAAuCC,KAAKJ,IAAS,IAAI,GAC/DK,EAAkB,WAAPF,EAAkB,MAAQA,EACrCJ,EAAQpK,EAAMoK,MAAQpK,EAAM2K,QAAU,CACxCD,SAAUA,GAERA,IAAUN,EAAMM,IAAY,GAChCL,EAAKpD,QAAQ,iIAAiI,SAAU7H,EAAOwL,EAAGC,EAAIC,EAAIC,GACxK,IAAKX,EAAMY,OAAQ,CACjB,IAAIC,EAAU,UAANL,EAAgBE,EAAK,mBAAmBrL,KAAKmL,GAAKG,EAAKF,EAC/DT,EAAMc,QAAUD,EAChBb,EAAMe,cAAgBC,WAAWH,GACjCL,EAAI,CACFS,QAAS,OACTC,MAAO,QACPV,IAAMA,EACRR,EAAMzL,KAAOiM,EACbR,EAAMQ,IAAK,MAGXR,EAAMY,eAAeZ,EAAMmB,OAC3BnB,EAAMoB,aAAapB,EAAMY,SAGjCE,QAAS,UACTO,QAAS,WACP,IAAIlC,EAAUlM,KAAKkM,QACnB,OAAOA,GAAWA,EAAQmC,OAE5BC,SAAU,WACR,OAAOtO,MAETuO,QAAS,SAAiBC,EAAMjK,KAChCkG,QAAS,SAAiBgE,GACxB,IAAIhI,EAAOzG,KAUX,IAAK,IAAIU,KATT1B,EAAK8D,KAAK,CAAC,UAAW,OAAQ,SAAS,SAAUpC,GAC/C1B,EAAKS,OAAOgP,EAAO/N,EAAK,CACtByB,cAAc,EACdX,IAAK,WACH,OAAOiF,EAAK/F,SAKFV,MACT,KAAKoC,KAAK1B,IAAQV,KAAKU,KAAM+N,EAAM/N,GAAOV,KAAKU,KAGxDgO,MAAO,SAAeC,GAGpB,OAFA/C,GAAQ5L,KACRA,KAAKkM,QAAU,IAAI0C,EAAQD,GACpB3O,MAET6O,aAAc,SAAsBC,EAAOC,GACzC,OAAOvC,GAAewC,UAAUF,EAAOC,IAEzCE,SAAU,WACRrD,GAAQ5L,MAEVkP,MAAO,WAIL,IAHA,IAAI/C,EAAWnM,KAAKmM,SAChBC,EAAQpM,KAAKoM,MAERtM,EAAIqM,EAASlM,OAAS,EAAGH,GAAK,EAAGA,IACxCqM,EAASrM,GAAGwJ,SAGd,IAASxJ,EAAIsM,EAAMnM,OAAS,EAAGH,GAAK,EAAGA,IACrCsM,EAAMtM,GAAGwJ,UAGbA,OAAQ,WACNtJ,KAAKkP,eACEvD,EAAWU,QAAQrM,KAAK0D,MAEjCnB,QAAS,IAAI,WACX,SAAS4M,EAAgB7N,GAEvB,OADAA,GAAQ,YACD,SAAU8N,EAAIC,GACnB,OAAOD,EAAG9N,GAAM+N,IAASD,EAAG9N,GAAM,cAAgB+N,IAItD,MAAO,CACLhD,QAAS,GACT3I,IAAK,EACLlC,IAAK,SAAamG,GAChB,OAAO3H,KAAKqM,QAAQ1E,IAAO,MAE7B2H,aAAcH,EAAgB,OAC9BI,aAAcJ,EAAgB,WAIhCK,EAAiBxQ,EAAKyD,OAAOwH,EAAS,CACxCrH,WAAY,SAAoBqM,GAC9BjP,KAAKyP,OAAS7D,GACd5L,KAAKwJ,OAASxJ,KAAKyP,OAAOzP,KAAK0P,OAAO5L,KAAK9D,MAAQ,GAC/CiP,GAAajP,KAAKyP,OAAOzP,KAAK2P,aAAa3P,KAAKiP,YAEtDA,SAAU,WACR,IAAKjP,KAAKyP,OAAQ,OAAO,EACzB,IAAI5N,EAAO7B,KAAKyP,OAAOzP,KAAK2P,YAI5B,OAHI9N,GAAQA,IAAS7B,MAAM6B,EAAKiJ,KAAK,cACrC9K,KAAKyP,OAAOzP,KAAK2P,YAAc3P,KAC/BA,KAAK8K,KAAK,WAAYjJ,IACf,GAET+N,SAAU,WACR,OAAO5P,KAAKyP,OAAOzP,KAAK2P,cAAgB3P,MAE1CsJ,OAAQ,WACN,OAAmB,MAAftJ,KAAKwJ,SACTxK,EAAKoK,OAAOpJ,KAAKyP,OAAOzP,KAAK0P,OAAQ,KAAM1P,KAAKwJ,OAAQ,GACpDxJ,KAAKyP,OAAOzP,KAAK2P,aAAe3P,OAAMA,KAAKyP,OAAOzP,KAAK2P,YAAc,MACzE3P,KAAKyP,OAAS,MACP,IAETrB,QAAS,WACP,OAAOpO,KAAKyP,OAAOrB,aAGnByB,EAAqB,CACvBC,yBAA0B,SAAkCC,EAAQC,EAAQC,GAC1E,SAASC,EAAUjH,GAGjB,IAFA,IAAIkH,EAAS,IAAIlL,MAAMgE,EAAMhJ,QAEpBH,EAAI,EAAGA,EAAImJ,EAAMhJ,OAAQH,IAAK,CACrC,IAAIsQ,EAAOnH,EAAMnJ,GAAGoQ,YACpBC,EAAOrQ,GAAK,CAACsQ,EAAKC,KAAMD,EAAKE,IAAKF,EAAKG,MAAOH,EAAKI,QAGrD,OAAOL,EAGT,IAAIM,EAAUP,EAAUH,GACpBW,EAAWV,GAAUA,IAAWD,EAAmBG,EAAUF,GAApBS,EAC7C,OAAOzQ,KAAK2Q,qBAAqBF,EAASC,EAAST,GAAa,IAElEW,0BAA2B,SAAmCC,EAASC,EAASb,EAAWc,GACzF,SAASb,EAAUc,GAKjB,IAJA,IAAIC,EAAMC,KAAKD,IACXE,EAAMD,KAAKC,IACXhB,EAAS,IAAIlL,MAAM+L,EAAO/Q,QAErBH,EAAI,EAAGA,EAAIkR,EAAO/Q,OAAQH,IAAK,CACtC,IAAI8N,EAAIoD,EAAOlR,GACfqQ,EAAOrQ,GAAK,CAACmR,EAAIrD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAKqD,EAAIrD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAKuD,EAAIvD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAKuD,EAAIvD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,KAG9H,OAAOuC,EAGT,IAAIM,EAAUP,EAAUW,GACpBH,EAAWI,GAAWA,IAAYD,EAAoBX,EAAUY,GAApBL,EAEhD,GAAIM,EAAU,CAKZ,IAJA,IAAIK,EAAMpR,KAAK2Q,qBAAqBF,EAASC,EAAST,GAAa,GAAG,GAAO,GACzEoB,EAAMrR,KAAK2Q,qBAAqBF,EAASC,EAAST,GAAa,GAAG,GAAM,GACxE7M,EAAO,GAEFtD,EAAI,EAAGC,EAAIqR,EAAInR,OAAQH,EAAIC,EAAGD,IACrCsD,EAAKtD,GAAK,CACRsR,IAAKA,EAAItR,GACTuR,IAAKA,EAAIvR,IAIb,OAAOsD,EAGT,OAAOpD,KAAK2Q,qBAAqBF,EAASC,EAAST,GAAa,IAElEU,qBAAsB,SAA8BW,EAASC,EAAStB,EAAWuB,EAAeC,GAC9F,IAAI7S,GAAQ2S,GAAWD,IAAYC,EAC/BG,EAAY9S,EAAO0S,EAAUA,EAAQtI,OAAOuI,GAC5CI,EAAUL,EAAQrR,OAClB2R,EAAYF,EAAUzR,OAE1B,SAAS4R,EAAaC,EAASC,EAAOjR,GAIpC,IAHA,IAAIkR,EAAK,EACLC,EAAKH,EAAQ7R,OAEV+R,EAAKC,GAAI,CACd,IAAIC,EAAMD,EAAKD,IAAO,EAElBN,EAAUI,EAAQI,IAAMH,GAASjR,EACnCkR,EAAKE,EAAM,EAEXD,EAAKC,EAIT,OAAOF,EAAK,EASd,IANA,IAAIG,EAAOX,EAAgB,EAAI,EAC3BY,EAAOD,EAAO,EACdE,EAAOb,EAAgB,EAAI,EAC3Bc,EAAOD,EAAO,EACdE,EAAmB,IAAItN,MAAM2M,GAExB9R,EAAI,EAAGA,EAAI8R,EAAW9R,IAC7ByS,EAAiBzS,GAAKA,EAGxByS,EAAiBC,MAAK,SAAUC,EAAIC,GAClC,OAAOhB,EAAUe,GAAIN,GAAQT,EAAUgB,GAAIP,MAE7C,IAAIQ,EAAsB,GACtBC,EAAgB,IAAI3N,MAAM0M,GAE9B,IAAS7R,EAAI,EAAGA,EAAI8R,EAAW9R,IAAK,CAClC,IAAI+S,EAAWN,EAAiBzS,GAC5BgT,EAAYpB,EAAUmB,GACtBE,EAAYnU,EAAOiU,EAAWA,EAAWlB,EACzCqB,EAAaH,EAAWlB,EACxBsB,EAAarU,IAASoU,EACtBE,EAAgBF,EAAa,GAAK,KAEtC,GAAIL,EAAoB1S,OAAQ,CAC9B,IAAIkT,EAAatB,EAAac,EAAqBP,EAAMU,EAAUX,GAAQlC,GAAa,EAGxF,GAFA0C,EAAoBvJ,OAAO,EAAG+J,GAE1BvU,GAAQ6S,EAAyB,CACnCyB,EAAgBA,EAAclK,OAAO2J,GAErC,IAAK,IAAIS,EAAI,EAAGA,EAAIT,EAAoB1S,OAAQmT,IAAK,CAEnDR,EADIS,EAAcV,EAAoBS,IACXtP,KAAKiP,QAGlC,KAAIO,EAAUR,EAAUR,GACpBiB,EAAUT,EAAUT,GAExB,IAASe,EAAI,EAAGA,EAAIT,EAAoB1S,OAAQmT,IAAK,CACnD,IAAIC,EAAcV,EAAoBS,GAClCI,EAAe9B,EAAU2B,GACzBI,EAAYJ,EAAc1B,EAC1B+B,EAAY9U,GAAQyU,GAAe1B,GAEnCF,IAA4BuB,GAAcU,GAAaT,GAAcQ,IAAcH,GAAWE,EAAanB,GAAQpC,GAAasD,GAAWC,EAAalB,GAAQrC,KAC9J+C,GAAcU,GAChBR,EAAcpP,KAAKlF,EAAOyU,EAAcA,EAAc1B,GAGpDsB,GAAcQ,GAChBb,EAAcS,GAAavP,KAAKiP,MAe1C,GARIC,IACE1B,IAAYC,GACd2B,EAAcpP,KAAK+O,GAGrBD,EAAcC,GAAYK,GAGxBP,EAAoB1S,OAAQ,CAC9B,IACIoJ,EAAQwI,EAAac,EAAqBP,EADhCU,EAAUV,IAExBO,EAAoBvJ,OAAOC,EAAQ,EAAG,EAAGwJ,QAEzCF,EAAoB7O,KAAK+O,GAI7B,IAAS/S,EAAI,EAAGA,EAAI8S,EAAc3S,OAAQH,IAAK,CAC7C,IAAI6T,EAAaf,EAAc9S,GAE3B6T,GACFA,EAAWnB,MAAK,SAAUC,EAAIC,GAC5B,OAAOD,EAAKC,KAKlB,OAAOE,IAGP7O,EAAY/E,EAAKyD,OAAO,CAC1BG,WAAY,SAAoB0E,GAC9BtH,KAAKsH,UAAYtI,EAAKiE,KAAKqE,EAAW,GACtCtH,KAAK4T,WAAa1C,KAAK2C,IAAI,GAAI7T,KAAKsH,YAEtCrD,OAAQ,SAAgB1C,GACtB,OAAOvB,KAAKsH,UAAY,GAAK4J,KAAK4C,MAAMvS,EAAMvB,KAAK4T,YAAc5T,KAAK4T,WAAarS,GAErFwS,KAAM,SAAcC,EAAMC,EAAMC,GAC9B,OAAOlU,KAAKiE,OAAO+P,IAASE,GAAa,KAAOlU,KAAKiE,OAAOgQ,IAE9DE,MAAO,SAAe5S,EAAK2S,GACzB,OAAOlU,KAAKiE,OAAO1C,EAAI6S,IAAMF,GAAa,KAAOlU,KAAKiE,OAAO1C,EAAI8S,IAEnEC,KAAM,SAAc/S,EAAK2S,GACvB,OAAOlU,KAAKiE,OAAO1C,EAAIuN,QAAUoF,GAAa,KAAOlU,KAAKiE,OAAO1C,EAAIwN,SAEvEwF,UAAW,SAAmBhT,EAAK2S,GACjC,OAAOlU,KAAKmU,MAAM5S,EAAK2S,IAAcA,GAAa,KAAOlU,KAAKsU,KAAK/S,EAAK2S,MAG5EnQ,EAAUC,SAAW,IAAID,EACzB,IAAIyQ,EAAY,IAAI,WAClB,IAAIC,EAAY,CAAC,CAAC,mBAA8B,CAAC,EAAG,mBAA8B,CAAC,mBAA6B,mBAA8B,CAAC,EAAG,kBAA6B,kBAA8B,CAAC,kBAA6B,kBAA6B,kBAA8B,CAAC,EAAG,kBAA6B,kBAA6B,mBAA8B,CAAC,kBAA6B,iBAA6B,kBAA6B,mBAA8B,CAAC,EAAG,kBAA6B,kBAA6B,kBAA6B,mBAA8B,CAAC,mBAA6B,kBAA6B,kBAA6B,kBAA6B,mBAA8B,CAAC,EAAG,mBAA6B,kBAA6B,kBAA6B,kBAA6B,kBAA8B,CAAC,kBAA6B,kBAA6B,kBAA6B,kBAA6B,kBAA6B,mBAA8B,CAAC,EAAG,kBAA6B,mBAA6B,kBAA6B,kBAA6B,kBAA6B,mBAA8B,CAAC,mBAA6B,mBAA6B,kBAA6B,kBAA6B,iBAA6B,kBAA6B,mBAA8B,CAAC,EAAG,mBAA6B,kBAA6B,kBAA6B,kBAA6B,kBAA6B,iBAA6B,mBAA8B,CAAC,mBAA6B,kBAA6B,mBAA6B,kBAA6B,iBAA6B,kBAA6B,kBAA6B,oBACl2DC,EAAU,CAAC,CAAC,GAAI,CAAC,kBAA6B,mBAA8B,CAAC,kBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,oBAA8B,CAAC,mBAA6B,kBAA6B,oBAA8B,CAAC,kBAA6B,kBAA6B,mBAA6B,mBAA8B,CAAC,iBAA6B,mBAA6B,mBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,mBAA6B,kBAA6B,oBAA8B,CAAC,mBAA6B,mBAA6B,mBAA6B,kBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,mBAA6B,mBAA6B,kBAA6B,oBAA8B,CAAC,mBAA6B,kBAA6B,mBAA6B,mBAA6B,mBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,kBAA6B,mBAA6B,mBAA6B,mBAA6B,oBAA8B,CAAC,kBAA6B,kBAA6B,mBAA6B,mBAA6B,mBAA6B,mBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,kBAA6B,mBAA6B,mBAA6B,mBAA6B,mBAA6B,oBAA8B,CAAC,kBAA6B,mBAA6B,mBAA6B,mBAA6B,mBAA6B,mBAA6B,oBAA6B,sBAE5/DC,EAAMzD,KAAKyD,IACXC,EAAO1D,KAAK0D,KACZf,EAAM3C,KAAK2C,IACXgB,EAAO3D,KAAK2D,MAAQ,SAAUT,GAChC,OAAOlD,KAAK4D,IAAIV,GAAKlD,KAAK6D,OAExBC,EAAU,MACVC,EAAkB,QAEtB,SAASC,EAAMpU,EAAOmQ,EAAKE,GACzB,OAAOrQ,EAAQmQ,EAAMA,EAAMnQ,EAAQqQ,EAAMA,EAAMrQ,EAGjD,SAASqU,EAAgBjS,EAAGC,EAAGiS,GAC7B,SAASC,EAAMzH,GACb,IAAIwG,EAAQ,UAAJxG,EAEJqE,EADIrE,EAAIwG,EACCA,EAEb,MAAO,CAACnC,EADCrE,EAAIqE,GAIf,IAAIqD,EAAInS,EAAIA,EAAID,EAAIkS,EAChBG,EAAIpS,EAAIA,EAAID,EAAIkS,EAEpB,GAAa,EAATT,EAAIW,GAASC,EAAG,CAClB,IAAIC,EAAKH,EAAMnS,GACXuS,EAAKJ,EAAMlS,GACXuS,EAAKL,EAAMD,GACXO,EAAIxS,EAAIA,EAERyS,EAAI1S,EAAIkS,EAEZE,EAAIK,EAAIC,GAHCH,EAAG,GAAKA,EAAG,GAAKE,EAAI,EAAIF,EAAG,GAAKA,EAAG,GAAKA,EAAG,GAAKA,EAAG,IAEnDD,EAAG,GAAKE,EAAG,GAAKE,EAAIJ,EAAG,GAAKE,EAAG,GAAKF,EAAG,GAAKE,EAAG,GAAKF,EAAG,GAAKE,EAAG,KAI1E,OAAOJ,EAGT,SAASO,IACP,IAAIC,EAAO5E,KAAKC,IAAItO,MAAMqO,KAAM1Q,WAChC,OAAOsV,IAASA,EAAO,MAAQA,EAAO,KAAOjC,EAAI,GAAI3C,KAAK4C,MAAMe,EAAKiB,KAAU,EAGjF,MAAO,CACLd,QAASA,EACTC,gBAAiBA,EACjBc,kBAAmB,KACnBC,kBAAmB,KACnBC,sBAAuB,KACvBC,MAAO,GAAKtB,EAAK,GAAK,GAAK,EAC3BuB,OAAQ,SAAgB5U,GACtB,OAAOA,IAAO,OAAYA,GAAOyT,GAEnCoB,cAAe,SAAuB7U,GACpC,OAAOA,IAAO,SAAoBA,GAAO0T,GAE3CC,MAAOA,EACPmB,UAAW,SAAmBC,EAAGpT,EAAGC,EAAGoK,GASrC,IARA,IAAI6G,EAAIK,EAAUlH,EAAI,GAClBgJ,EAAI7B,EAAQnH,EAAI,GAChBiJ,EAAc,IAATrT,EAAID,GACTuT,EAAID,EAAItT,EACRpD,EAAI,EACJ4W,EAAInJ,EAAI,GAAK,EACboJ,EAAU,EAAJpJ,EAAQgJ,EAAEzW,KAAOwW,EAAEG,GAAK,EAE3B3W,EAAI4W,GAAG,CACZ,IAAIE,EAAKJ,EAAIpC,EAAEtU,GACf6W,GAAOJ,EAAEzW,MAAQwW,EAAEG,EAAIG,GAAMN,EAAEG,EAAIG,IAGrC,OAAOJ,EAAIG,GAEbE,SAAU,SAAkBP,EAAGQ,EAAI1C,EAAGlR,EAAGC,EAAGoK,EAAG0C,GAC7C,IAAK,IAAInQ,EAAI,EAAGA,EAAIyN,EAAGzN,IAAK,CAC1B,IAAIiX,EAAKT,EAAElC,GACP4C,EAAKD,EAAKD,EAAG1C,GACb6C,EAAK7C,EAAI4C,EAEb,GAAIrC,EAAIqC,GAAM/G,EAAW,CACvBmE,EAAI6C,EACJ,MAGEF,EAAK,GACP5T,EAAIiR,EACJA,EAAI6C,GAAM/T,EAAc,IAATA,EAAIC,GAAW8T,IAE9B/T,EAAIkR,EACJA,EAAI6C,GAAM9T,EAAc,IAATD,EAAIC,GAAW8T,GAIlC,OAAO/B,EAAMd,EAAGlR,EAAGC,IAErB+T,eAAgB,SAAwBhU,EAAGC,EAAGiS,EAAG+B,EAAOlG,EAAKE,GAC3D,IAAIiG,EACAC,EAAKC,IAET,GAAI3C,EAAIzR,GAAK8R,EAAS,CACpB,GAAIL,EAAIxR,GAAK6R,EAAS,OAAOL,EAAIS,GAAKJ,GAAW,EAAI,EACrDoC,GAAMhC,EAAIjS,MACL,CAEL,IAAImS,EAAIH,EAAgBjS,EADxBC,IAAM,GACwBiS,GAE9B,GAAIE,GAAKX,EAAIW,GAAKL,EAAiB,CACjC,IAAIqB,EAAIT,EAAuBlB,EAAIzR,GAAIyR,EAAIxR,GAAIwR,EAAIS,IAE/CkB,IAIFhB,EAAIH,EAHJjS,GAAKoT,EACLnT,GAAKmT,EACLlB,GAAKkB,IAKT,GAAIhB,IAAK,QAAkB,CACzB,IAAIiC,EAAIjC,EAAI,EAAI,EAAIV,EAAKU,GACrBkC,EAAIrU,GAAKA,EAAI,GAAKoU,EAAIA,GAEhB,IAANC,EAEFH,IADAD,EAAKhC,EAAIlS,IAGTkU,EAAKI,EAAItU,EACTmU,EAAKjC,EAAIoC,IAKf,IAAIC,EAAQ,EACRC,EAAmB,MAAPzG,EACZ0G,EAAO1G,EAAM+D,EACb4C,EAAOzG,EAAM6D,EAGjB,OAFI6C,SAAST,KAAQM,GAAaN,EAAKO,GAAQP,EAAKQ,KAAOT,EAAMM,KAAWC,EAAYN,EAAKlC,EAAMkC,EAAInG,EAAKE,IACxGkG,IAAOD,GAAMS,SAASR,KAAQK,GAAaL,EAAKM,GAAQN,EAAKO,KAAOT,EAAMM,KAAWC,EAAYL,EAAKnC,EAAMmC,EAAIpG,EAAKE,IAClHsG,GAETK,WAAY,SAAoB5U,EAAGC,EAAGiS,EAAG2C,EAAGZ,EAAOlG,EAAKE,GACtD,IACIiD,EACA4D,EACAC,EACAC,EACAtC,EALAU,EAAIT,EAAuBlB,EAAIzR,GAAIyR,EAAIxR,GAAIwR,EAAIS,GAAIT,EAAIoD,IAc3D,SAASI,EAASC,GAEhB,IAAIC,EAAMnV,GADVkR,EAAIgE,GAIJF,GAAMG,GAFNL,EAAKK,EAAMlV,IAEOiR,GADlB6D,EAAKD,EAAK5D,EAAIgB,GAEdQ,EAAIqC,EAAK7D,EAAI2D,EAGf,GAhBIzB,IACFpT,GAAKoT,EACLnT,GAAKmT,EACLlB,GAAKkB,EACLyB,GAAKzB,GAYH3B,EAAIzR,GAAK8R,EACX9R,EAAIC,EACJ6U,EAAK5C,EACL6C,EAAKF,EACL3D,EAAIkD,SACC,GAAI3C,EAAIoD,GAAK/C,EAClBgD,EAAK7U,EACL8U,EAAK7C,EACLhB,EAAI,MACC,CACL+D,GAAWhV,EAAID,EAAK,GACpB,IAAIoV,EAAI1C,EAAI1S,EACRqV,EAAI1E,EAAIc,EAAI2D,GAAI,EAAI,GACpBE,EAAIF,EAAI,GAAK,EAAI,EACjBG,GAAMP,EAAKhV,EACXwV,EAAKD,EAAK,EAAI,kBAAoBvH,KAAKC,IAAIoH,EAAG3D,EAAK6D,IAAOF,EAC1DH,EAAKhE,EAAIoE,EAAIE,EAEjB,GAAIN,IAAOhE,EAAG,CACZ,GACE+D,EAASC,GACTA,EAAY,IAAPF,EAAW9D,EAAIA,EAAIwB,EAAIsC,GAAM,EAAIjD,SAC/BuD,EAAIJ,EAAKI,EAAIpE,GAElBO,EAAIzR,GAAKkR,EAAIA,EAAIO,EAAIoD,EAAI3D,KAE3B4D,IADAC,GAAMF,EAAI3D,GACCgB,GAAKhB,IAKtB,IAAIqD,EAAQjD,EAAU0C,eAAehU,EAAG8U,EAAIC,EAAId,EAAOlG,EAAKE,GACxDuG,EAAmB,MAAPzG,EAEhB,OADI4G,SAASzD,KAAiB,IAAVqD,GAAeA,EAAQ,GAAKrD,IAAM+C,EAAM,IAAM/C,IAAM+C,EAAM,MAAQO,GAAatD,EAAInD,EAAM+D,GAAWZ,EAAIjD,EAAM6D,KAAUmC,EAAMM,KAAWC,EAAYtD,EAAIc,EAAMd,EAAGnD,EAAKE,IACpLsG,KAITkB,EAAM,CACRjV,IAAK,EACLkV,OAAQ,GACRpX,IAAK,SAAaF,GAChB,GAAIA,EAAM,CACR,IAAIuX,EAAO7Y,KAAK4Y,OAAOtX,GAIvB,OAHKuX,IAAMA,EAAO7Y,KAAK4Y,OAAOtX,GAAQ,CACpCoC,IAAK,IAEAmV,EAAKnV,MAEZ,OAAO1D,KAAK0D,QAIdoV,EAAQ9Z,EAAKyD,OAAO,CACtBkB,OAAQ,QACR+B,YAAY,EACZ9C,WAAY,SAAemW,EAAMC,GAC/B,IAAInV,SAAckV,EACdE,EAAUjZ,KAAK4F,OACfR,EAAO,EAEX,GAAa,WAATvB,EAAmB,CACrB,IAAIqV,EAAuB,iBAATF,EAElBhZ,KAAKmZ,KAAKJ,EAAMG,EAAOF,EAAOD,GAE1BE,IAAS7T,EAAO8T,EAAO,EAAI,QAC1B,GAAa,cAATrV,GAAiC,OAATkV,EACjC/Y,KAAKmZ,KAAK,EAAG,GAETF,IAAS7T,EAAgB,OAAT2T,EAAgB,EAAI,OACnC,CACL,IAAInY,EAAe,WAATiD,EAAoBkV,EAAK1D,MAAM,WAAa,GAAK0D,EAC3D3T,EAAO,EAEHH,MAAMC,QAAQtE,GAChBZ,KAAKmZ,MAAMvY,EAAI,KAAMA,EAAIX,OAAS,EAAIW,EAAI,GAAKA,EAAI,KAC1C,MAAOA,EAChBZ,KAAKmZ,KAAKvY,EAAIwT,GAAK,EAAGxT,EAAIyT,GAAK,GACtB,UAAWzT,EACpBZ,KAAKmZ,KAAKvY,EAAIkO,OAAS,EAAGlO,EAAImO,QAAU,GAC/B,UAAWnO,GACpBZ,KAAKmZ,KAAKvY,EAAIX,QAAU,EAAG,GAE3BD,KAAKoZ,SAASxY,EAAIyY,OAAS,KAE3BrZ,KAAKmZ,KAAK,EAAG,GAEb/T,EAAO,GAKX,OADI6T,IAASjZ,KAAK4F,OAASR,GACpBpF,MAETK,IAAK,cACL8Y,KAAM,SAAc/E,EAAGC,GAGrB,OAFArU,KAAKoU,EAAIA,EACTpU,KAAKqU,EAAIA,EACFrU,MAET8E,OAAQ,SAAgBqP,GACtB,OAAOnU,OAASmU,GAASA,IAAUnU,KAAKoU,IAAMD,EAAMC,GAAKpU,KAAKqU,IAAMF,EAAME,GAAKpP,MAAMC,QAAQiP,IAAUnU,KAAKoU,IAAMD,EAAM,IAAMnU,KAAKqU,IAAMF,EAAM,MAAO,GAExJpR,MAAO,WACL,OAAO,IAAI+V,EAAM9Y,KAAKoU,EAAGpU,KAAKqU,IAEhC5Q,SAAU,WACR,IAAI6S,EAAIvS,EAAUC,SAClB,MAAO,QAAUsS,EAAErS,OAAOjE,KAAKoU,GAAK,QAAUkC,EAAErS,OAAOjE,KAAKqU,GAAK,MAEnEvM,WAAY,SAAoBvD,GAC9B,IAAI+R,EAAI/R,EAAQ8C,UAChB,MAAO,CAACiP,EAAErS,OAAOjE,KAAKoU,GAAIkC,EAAErS,OAAOjE,KAAKqU,KAE1CiF,UAAW,WACT,OAAOpI,KAAK0D,KAAK5U,KAAKoU,EAAIpU,KAAKoU,EAAIpU,KAAKqU,EAAIrU,KAAKqU,IAEnDkF,UAAW,SAAmBtZ,GAC5B,GAAID,KAAKmW,SAAU,CACjB,IAAIkD,EAAQrZ,KAAKwZ,QAAU,EAE3BxZ,KAAKmZ,KAAKjI,KAAKuI,IAAIJ,GAASpZ,EAAQiR,KAAKwI,IAAIL,GAASpZ,OACjD,CACL,IAAI0Z,EAAQ1Z,EAASD,KAAKsZ,YACtB9E,EAAU2B,OAAOwD,IAAQ3Z,KAAK4Z,WAElC5Z,KAAKmZ,KAAKnZ,KAAKoU,EAAIuF,EAAO3Z,KAAKqU,EAAIsF,KAGvCC,SAAU,WACR,OAAuD,IAAhD5Z,KAAK6Z,kBAAkBhX,MAAM7C,KAAMQ,WAAmB0Q,KAAK4I,IAEpEV,SAAU,SAAkBC,GAC1BrZ,KAAK+Z,kBAAkB7Z,KAAKF,KAAMqZ,EAAQnI,KAAK4I,GAAK,MAEtDE,kBAAmB,YACnBC,kBAAmB,YACnBJ,kBAAmB,WACjB,GAAKrZ,UAAUP,OAER,CACL,IAAIkU,EAAQ2E,EAAM1T,KAAK5E,WACnB0Z,EAAMla,KAAKsZ,YAAcnF,EAAMmF,YAEnC,GAAI9E,EAAU2B,OAAO+D,GACnB,OAAOC,IAEP,IAAIjX,EAAIlD,KAAKoa,IAAIjG,GAAS+F,EAC1B,OAAOhJ,KAAKmJ,KAAKnX,GAAK,GAAK,EAAIA,EAAI,EAAI,EAAIA,GAT7C,OAAOlD,KAAKmW,SAAWnW,KAAKwZ,QAAU,EAAIxZ,KAAKwZ,OAAStI,KAAKoJ,MAAMta,KAAKqU,EAAGrU,KAAKoU,IAapF2F,kBAAmB,SAA2BV,GAG5C,GAFArZ,KAAKwZ,OAASH,GAETrZ,KAAKmW,SAAU,CAClB,IAAIlW,EAASD,KAAKsZ,YAElBtZ,KAAKmZ,KAAKjI,KAAKuI,IAAIJ,GAASpZ,EAAQiR,KAAKwI,IAAIL,GAASpZ,KAG1Dsa,YAAa,WACX,OAAOva,KAAKoU,GAAK,EAAIpU,KAAKqU,GAAK,EAAI,EAAI,EAAIrU,KAAKqU,GAAK,EAAI,EAAI,IAE9D,CACDnT,OAAO,EACPsZ,iBAAkB,WAChB,IAAIrG,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAwD,IAAjD0Q,KAAKoJ,MAAMta,KAAKya,MAAMtG,GAAQnU,KAAKoa,IAAIjG,IAAgBjD,KAAK4I,IAErEY,YAAa,WACX,IAAInS,EAAO/H,UACP2T,EAAQ2E,EAAM1T,KAAKmD,GACnB6L,EAAID,EAAMC,EAAIpU,KAAKoU,EACnBC,EAAIF,EAAME,EAAIrU,KAAKqU,EACnB0D,EAAI3D,EAAIA,EAAIC,EAAIA,EAChBsG,EAAU3b,EAAKoG,KAAKmD,GACxB,OAAOoS,EAAU5C,EAAI7G,KAAK0D,KAAKmD,IAEjC6C,UAAW,SAAmB3a,GACxBA,IAAWpB,IAAWoB,EAAS,GACnC,IAAI4a,EAAU7a,KAAKsZ,YACfK,EAAoB,IAAZkB,EAAgB5a,EAAS4a,EAAU,EAC3C1G,EAAQ,IAAI2E,EAAM9Y,KAAKoU,EAAIuF,EAAO3Z,KAAKqU,EAAIsF,GAE/C,OADIA,GAAS,IAAGxF,EAAMqF,OAASxZ,KAAKwZ,QAC7BrF,GAET2G,OAAQ,SAAgBzB,EAAO0B,GAC7B,GAAc,IAAV1B,EAAa,OAAOrZ,KAAK+C,QAC7BsW,EAAQA,EAAQnI,KAAK4I,GAAK,IAC1B,IAAI3F,EAAQ4G,EAAS/a,KAAKgb,SAASD,GAAU/a,KACzC0Z,EAAMxI,KAAKwI,IAAIL,GACfI,EAAMvI,KAAKuI,IAAIJ,GAEnB,OADAlF,EAAQ,IAAI2E,EAAM3E,EAAMC,EAAIqF,EAAMtF,EAAME,EAAIqF,EAAKvF,EAAMC,EAAIsF,EAAMvF,EAAME,EAAIoF,GACpEsB,EAAS5G,EAAM1M,IAAIsT,GAAU5G,GAEtC8G,UAAW,SAAmBC,GAC5B,OAAOA,EAASA,EAAOC,gBAAgBnb,MAAQA,MAEjDyH,IAAK,WACH,IAAI0M,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAO,IAAIsY,EAAM9Y,KAAKoU,EAAID,EAAMC,EAAGpU,KAAKqU,EAAIF,EAAME,IAEpD2G,SAAU,WACR,IAAI7G,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAO,IAAIsY,EAAM9Y,KAAKoU,EAAID,EAAMC,EAAGpU,KAAKqU,EAAIF,EAAME,IAEpD+G,SAAU,WACR,IAAIjH,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAO,IAAIsY,EAAM9Y,KAAKoU,EAAID,EAAMC,EAAGpU,KAAKqU,EAAIF,EAAME,IAEpDgH,OAAQ,WACN,IAAIlH,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAO,IAAIsY,EAAM9Y,KAAKoU,EAAID,EAAMC,EAAGpU,KAAKqU,EAAIF,EAAME,IAEpDiH,OAAQ,WACN,IAAInH,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAO,IAAIsY,EAAM9Y,KAAKoU,EAAID,EAAMC,EAAGpU,KAAKqU,EAAIF,EAAME,IAEpDkH,OAAQ,WACN,OAAO,IAAIzC,GAAO9Y,KAAKoU,GAAIpU,KAAKqU,IAElCmH,SAAU,WACR,OAAOC,EAAWrW,KAAK5E,WAAWkb,SAAS1b,OAE7C2b,QAAS,WACP,IAAIpT,EAAO/H,UACP2T,EAAQ2E,EAAM1T,KAAKmD,GACnB0H,EAAYjR,EAAKoG,KAAKmD,GAC1B,OAAOvI,KAAK0a,YAAYvG,IAAUlE,GAEpC2L,YAAa,WACX,IAAIzH,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAOsY,EAAM8C,YAAY5b,KAAKoU,EAAGpU,KAAKqU,EAAGF,EAAMC,EAAGD,EAAME,IAE1DwH,WAAY,eACZC,aAAc,WACZ,IAAI3H,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAOsY,EAAMgD,aAAa9b,KAAKoU,EAAGpU,KAAKqU,EAAGF,EAAMC,EAAGD,EAAME,IAE3D8B,OAAQ,WACN,IAAIA,EAAS3B,EAAU2B,OACvB,OAAOA,EAAOnW,KAAKoU,IAAM+B,EAAOnW,KAAKqU,IAEvC0H,MAAO,SAAUC,GACf,SAASD,IACP,OAAOC,EAAOnZ,MAAM7C,KAAMQ,WAO5B,OAJAub,EAAMtY,SAAW,WACf,OAAOuY,EAAOvY,YAGTsY,EATF,EAUL,WACA,OAAOA,MAAM/b,KAAKoU,IAAM2H,MAAM/b,KAAKqU,MAErC4H,aAAc,SAAsBrG,GAClC,OAAO5V,KAAKoU,GAAKwB,EAAI,GAAKA,EAAI,GAAK,EAAI,IAAM,GAAK5V,KAAKqU,GAAKuB,EAAI,GAAK,EAAI,IAAM,GAEjFwE,IAAK,WACH,IAAIjG,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAOR,KAAKoU,EAAID,EAAMC,EAAIpU,KAAKqU,EAAIF,EAAME,GAE3CoG,MAAO,WACL,IAAItG,EAAQ2E,EAAM1T,KAAK5E,WACvB,OAAOR,KAAKoU,EAAID,EAAME,EAAIrU,KAAKqU,EAAIF,EAAMC,GAE3ClI,QAAS,WACP,IAAIiI,EAAQ2E,EAAM1T,KAAK5E,WACnBmZ,EAAQxF,EAAMgC,SAAW,EAAInW,KAAKoa,IAAIjG,GAASA,EAAMiG,IAAIjG,GAC7D,OAAO,IAAI2E,EAAM3E,EAAMC,EAAIuF,EAAOxF,EAAME,EAAIsF,IAE9CpX,QAAS,CACP0O,IAAK,WACH,IAAI1I,EAAO/H,UACP0b,EAASpD,EAAM1T,KAAKmD,GACpB4T,EAASrD,EAAM1T,KAAKmD,GACxB,OAAO,IAAIuQ,EAAM5H,KAAKD,IAAIiL,EAAO9H,EAAG+H,EAAO/H,GAAIlD,KAAKD,IAAIiL,EAAO7H,EAAG8H,EAAO9H,KAE3ElD,IAAK,WACH,IAAI5I,EAAO/H,UACP0b,EAASpD,EAAM1T,KAAKmD,GACpB4T,EAASrD,EAAM1T,KAAKmD,GACxB,OAAO,IAAIuQ,EAAM5H,KAAKC,IAAI+K,EAAO9H,EAAG+H,EAAO/H,GAAIlD,KAAKC,IAAI+K,EAAO7H,EAAG8H,EAAO9H,KAE3E+H,OAAQ,WACN,OAAO,IAAItD,EAAM5H,KAAKkL,SAAUlL,KAAKkL,WAEvCR,YAAa,SAAqBxE,EAAIiF,EAAIhF,EAAIiF,GAC5C,OAAOpL,KAAKyD,IAAIyC,EAAKkF,EAAKD,EAAKhF,IAA8D,KAAvDnG,KAAK0D,MAAMwC,EAAKA,EAAKiF,EAAKA,IAAOhF,EAAKA,EAAKiF,EAAKA,KAExFR,aAAc,SAAsB1E,EAAIiF,EAAIhF,EAAIiF,GAC9C,OAAOpL,KAAKyD,IAAIyC,EAAKC,EAAKgF,EAAKC,IAA8D,KAAvDpL,KAAK0D,MAAMwC,EAAKA,EAAKiF,EAAKA,IAAOhF,EAAKA,EAAKiF,EAAKA,OAGzFtd,EAAK8D,KAAK,CAAC,QAAS,OAAQ,QAAS,QAAQ,SAAUpC,GACxD,IAAI6b,EAAKrL,KAAKxQ,GAEdV,KAAKU,GAAO,WACV,OAAO,IAAIoY,EAAMyD,EAAGvc,KAAKoU,GAAImI,EAAGvc,KAAKqU,OAEtC,KACCmI,EAAc1D,EAAMrW,OAAO,CAC7BG,WAAY,SAAewR,EAAGC,EAAGoI,EAAOC,GACtC1c,KAAK2c,GAAKvI,EACVpU,KAAK4c,GAAKvI,EACVrU,KAAK6c,OAASJ,EACdzc,KAAK8c,QAAUJ,GAEjBvD,KAAM,SAAc/E,EAAGC,EAAG0I,GAIxB,OAHA/c,KAAK2c,GAAKvI,EACVpU,KAAK4c,GAAKvI,EACL0I,GAAa/c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,MACrCA,MAETgd,KAAM,WACJ,OAAOhd,KAAK2c,IAEdM,KAAM,SAAc7I,GAClBpU,KAAK2c,GAAKvI,EAEVpU,KAAK6c,OAAO7c,KAAK8c,SAAS9c,OAE5Bkd,KAAM,WACJ,OAAOld,KAAK4c,IAEdO,KAAM,SAAc9I,GAClBrU,KAAK4c,GAAKvI,EAEVrU,KAAK6c,OAAO7c,KAAK8c,SAAS9c,OAE5Bod,WAAY,WACV,SAAUpd,KAAK6c,OAAOQ,WAAard,KAAKsd,kBAE1CC,YAAa,SAAqBC,GAChCxd,KAAK6c,OAAOY,iBAAiBzd,KAAKsd,gBAAiBE,IAErDF,cAAe,WACb,MAAwB,gBAAjBtd,KAAK8c,QAA4B,EAAI,KAG5CY,EAAO1e,EAAKyD,OAAO,CACrBkB,OAAQ,OACR+B,YAAY,EACZ9C,WAAY,SAAcmW,EAAMC,GAC9B,IAAInV,SAAckV,EACdE,EAAUjZ,KAAK4F,OACfR,EAAO,EAEX,GAAa,WAATvB,EAAmB,CACrB,IAAI8Z,EAA4B,iBAAT3E,EAEvBhZ,KAAKmZ,KAAKJ,EAAM4E,EAAY3E,EAAOD,GAE/BE,IAAS7T,EAAOuY,EAAY,EAAI,QAC/B,GAAa,cAAT9Z,GAAiC,OAATkV,EACjC/Y,KAAKmZ,KAAK,EAAG,GAETF,IAAS7T,EAAgB,OAAT2T,EAAgB,EAAI,OACnC,CACL,IAAInY,EAAe,WAATiD,EAAoBkV,EAAK1D,MAAM,WAAa,GAAK0D,EAC3D3T,EAAO,EAEHH,MAAMC,QAAQtE,GAChBZ,KAAKmZ,MAAMvY,EAAI,KAAMA,EAAIX,OAAS,EAAIW,EAAI,GAAKA,EAAI,KAC1C,UAAWA,EACpBZ,KAAKmZ,KAAKvY,EAAIkO,OAAS,EAAGlO,EAAImO,QAAU,GAC/B,MAAOnO,EAChBZ,KAAKmZ,KAAKvY,EAAIwT,GAAK,EAAGxT,EAAIyT,GAAK,IAE/BrU,KAAKmZ,KAAK,EAAG,GAEb/T,EAAO,GAKX,OADI6T,IAASjZ,KAAK4F,OAASR,GACpBpF,MAETK,IAAK,cACL8Y,KAAM,SAAcrK,EAAOC,GAGzB,OAFA/O,KAAK8O,MAAQA,EACb9O,KAAK+O,OAASA,EACP/O,MAET8E,OAAQ,SAAgBwP,GACtB,OAAOA,IAAStU,MAAQsU,IAAStU,KAAK8O,QAAUwF,EAAKxF,OAAS9O,KAAK+O,SAAWuF,EAAKvF,QAAU9J,MAAMC,QAAQoP,IAAStU,KAAK8O,QAAUwF,EAAK,IAAMtU,KAAK+O,SAAWuF,EAAK,MAAO,GAE5KvR,MAAO,WACL,OAAO,IAAI2a,EAAK1d,KAAK8O,MAAO9O,KAAK+O,SAEnCtL,SAAU,WACR,IAAI6S,EAAIvS,EAAUC,SAClB,MAAO,YAAcsS,EAAErS,OAAOjE,KAAK8O,OAAS,aAAewH,EAAErS,OAAOjE,KAAK+O,QAAU,MAErFjH,WAAY,SAAoBvD,GAC9B,IAAI+R,EAAI/R,EAAQ8C,UAChB,MAAO,CAACiP,EAAErS,OAAOjE,KAAK8O,OAAQwH,EAAErS,OAAOjE,KAAK+O,UAE9CtH,IAAK,WACH,IAAI6M,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAO,IAAIkd,EAAK1d,KAAK8O,MAAQwF,EAAKxF,MAAO9O,KAAK+O,OAASuF,EAAKvF,SAE9DiM,SAAU,WACR,IAAI1G,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAO,IAAIkd,EAAK1d,KAAK8O,MAAQwF,EAAKxF,MAAO9O,KAAK+O,OAASuF,EAAKvF,SAE9DqM,SAAU,WACR,IAAI9G,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAO,IAAIkd,EAAK1d,KAAK8O,MAAQwF,EAAKxF,MAAO9O,KAAK+O,OAASuF,EAAKvF,SAE9DsM,OAAQ,WACN,IAAI/G,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAO,IAAIkd,EAAK1d,KAAK8O,MAAQwF,EAAKxF,MAAO9O,KAAK+O,OAASuF,EAAKvF,SAE9DuM,OAAQ,WACN,IAAIhH,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAO,IAAIkd,EAAK1d,KAAK8O,MAAQwF,EAAKxF,MAAO9O,KAAK+O,OAASuF,EAAKvF,SAE9DwM,OAAQ,WACN,OAAO,IAAImC,GAAM1d,KAAK8O,OAAQ9O,KAAK+O,SAErCoH,OAAQ,WACN,IAAIA,EAAS3B,EAAU2B,OACvB,OAAOA,EAAOnW,KAAK8O,QAAUqH,EAAOnW,KAAK+O,SAE3CgN,MAAO,SAAU6B,GACf,SAAS7B,IACP,OAAO6B,EAAQ/a,MAAM7C,KAAMQ,WAO7B,OAJAub,EAAMtY,SAAW,WACf,OAAOma,EAAQna,YAGVsY,EATF,EAUL,WACA,OAAOA,MAAM/b,KAAK8O,QAAUiN,MAAM/b,KAAK+O,WAEzCxM,QAAS,CACP0O,IAAK,SAAa4M,EAAOC,GACvB,OAAO,IAAIJ,EAAKxM,KAAKD,IAAI4M,EAAM/O,MAAOgP,EAAMhP,OAAQoC,KAAKD,IAAI4M,EAAM9O,OAAQ+O,EAAM/O,UAEnFoC,IAAK,SAAa0M,EAAOC,GACvB,OAAO,IAAIJ,EAAKxM,KAAKC,IAAI0M,EAAM/O,MAAOgP,EAAMhP,OAAQoC,KAAKC,IAAI0M,EAAM9O,OAAQ+O,EAAM/O,UAEnFqN,OAAQ,WACN,OAAO,IAAIsB,EAAKxM,KAAKkL,SAAUlL,KAAKkL,aAGvCpd,EAAK8D,KAAK,CAAC,QAAS,OAAQ,QAAS,QAAQ,SAAUpC,GACxD,IAAI6b,EAAKrL,KAAKxQ,GAEdV,KAAKU,GAAO,WACV,OAAO,IAAIgd,EAAKnB,EAAGvc,KAAK8O,OAAQyN,EAAGvc,KAAK+O,YAEzC,KACCgP,EAAaL,EAAKjb,OAAO,CAC3BG,WAAY,SAAckM,EAAOC,EAAQ0N,EAAOC,GAC9C1c,KAAKge,OAASlP,EACd9O,KAAKie,QAAUlP,EACf/O,KAAK6c,OAASJ,EACdzc,KAAK8c,QAAUJ,GAEjBvD,KAAM,SAAcrK,EAAOC,EAAQgO,GAIjC,OAHA/c,KAAKge,OAASlP,EACd9O,KAAKie,QAAUlP,EACVgO,GAAa/c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,MACrCA,MAETke,SAAU,WACR,OAAOle,KAAKge,QAEdG,SAAU,SAAkBrP,GAC1B9O,KAAKge,OAASlP,EAEd9O,KAAK6c,OAAO7c,KAAK8c,SAAS9c,OAE5Boe,UAAW,WACT,OAAOpe,KAAKie,SAEdI,UAAW,SAAmBtP,GAC5B/O,KAAKie,QAAUlP,EAEf/O,KAAK6c,OAAO7c,KAAK8c,SAAS9c,SAI1Byb,EAAazc,EAAKyD,OAAO,CAC3BkB,OAAQ,YACR+B,YAAY,EACZxE,OAAO,EACP0B,WAAY,SAAmBmW,EAAMC,EAAMsF,EAAMC,GAC/C,IAEInZ,EAFAmD,EAAO/H,UACPqD,SAAckV,EA6BlB,GA1Ba,WAATlV,GACF7D,KAAKmZ,KAAKJ,EAAMC,EAAMsF,EAAMC,GAE5BnZ,EAAO,GACW,cAATvB,GAAiC,OAATkV,GACjC/Y,KAAKmZ,KAAK,EAAG,EAAG,EAAG,GAEnB/T,EAAgB,OAAT2T,EAAgB,EAAI,GACF,IAAhBxQ,EAAKtI,SACVgF,MAAMC,QAAQ6T,IAChB/Y,KAAKmZ,KAAKtW,MAAM7C,KAAM+Y,GAEtB3T,EAAO,GACE2T,EAAK3E,IAAMvV,GAAaka,EAAKjK,QAAUjQ,GAChDmB,KAAKmZ,KAAKJ,EAAK3E,GAAK,EAAG2E,EAAK1E,GAAK,EAAG0E,EAAKjK,OAAS,EAAGiK,EAAKhK,QAAU,GAEpE3J,EAAO,GACE2T,EAAKyF,OAAS3f,GAAaka,EAAK0F,KAAO5f,IAChDmB,KAAKmZ,KAAK,EAAG,EAAG,EAAG,GAEfna,EAAKwH,cAAc+B,EAAMvI,QAC3BoF,EAAO,KAKTA,IAASvG,EAAW,CACtB,IAIIiQ,EACAC,EALA2P,EAAM5F,EAAM5S,UAAUqC,EAAM,QAC5BoW,EAAO3f,EAAKuG,KAAKgD,GACjB6L,EAAIsK,EAAItK,EACRC,EAAIqK,EAAIrK,EAIZ,GAAIsK,GAAQA,EAAKvK,IAAMvV,GAAaG,EAAK4H,SAAS2B,EAAM,MAAO,CAC7D,IAAIkW,EAAK3F,EAAM5S,UAAUqC,EAAM,MAC/BuG,EAAQ2P,EAAGrK,EAAIA,EACfrF,EAAS0P,EAAGpK,EAAIA,EAEZvF,EAAQ,IACVsF,EAAIqK,EAAGrK,EACPtF,GAASA,GAGPC,EAAS,IACXsF,EAAIoK,EAAGpK,EACPtF,GAAUA,OAEP,CACL,IAAIuF,EAAOoJ,EAAKtY,KAAKmD,GACrBuG,EAAQwF,EAAKxF,MACbC,EAASuF,EAAKvF,OAGhB/O,KAAKmZ,KAAK/E,EAAGC,EAAGvF,EAAOC,GAEvB3J,EAAOmD,EAAK/C,QAGd,IAAIK,EAAW0C,EAAKzC,WAGpB,OAFID,IAAU7F,KAAK8F,WAAaD,GAC5B7F,KAAK4F,SAAQ5F,KAAK4F,OAASR,GACxBpF,MAETK,IAAK,cACL8Y,KAAM,SAAc/E,EAAGC,EAAGvF,EAAOC,GAK/B,OAJA/O,KAAKoU,EAAIA,EACTpU,KAAKqU,EAAIA,EACTrU,KAAK8O,MAAQA,EACb9O,KAAK+O,OAASA,EACP/O,MAET+C,MAAO,WACL,OAAO,IAAI0Y,EAAWzb,KAAKoU,EAAGpU,KAAKqU,EAAGrU,KAAK8O,MAAO9O,KAAK+O,SAEzDjK,OAAQ,SAAgBsL,GACtB,IAAIwO,EAAK5f,EAAKgI,aAAaoJ,GAAQqL,EAAWrW,KAAK5E,WAAa4P,EAChE,OAAOwO,IAAO5e,MAAQ4e,GAAM5e,KAAKoU,IAAMwK,EAAGxK,GAAKpU,KAAKqU,IAAMuK,EAAGvK,GAAKrU,KAAK8O,QAAU8P,EAAG9P,OAAS9O,KAAK+O,SAAW6P,EAAG7P,SAAU,GAE5HtL,SAAU,WACR,IAAI6S,EAAIvS,EAAUC,SAClB,MAAO,QAAUsS,EAAErS,OAAOjE,KAAKoU,GAAK,QAAUkC,EAAErS,OAAOjE,KAAKqU,GAAK,YAAciC,EAAErS,OAAOjE,KAAK8O,OAAS,aAAewH,EAAErS,OAAOjE,KAAK+O,QAAU,MAE/IjH,WAAY,SAAoBvD,GAC9B,IAAI+R,EAAI/R,EAAQ8C,UAChB,MAAO,CAACiP,EAAErS,OAAOjE,KAAKoU,GAAIkC,EAAErS,OAAOjE,KAAKqU,GAAIiC,EAAErS,OAAOjE,KAAK8O,OAAQwH,EAAErS,OAAOjE,KAAK+O,UAElF8P,SAAU,SAAkBC,GAE1B,OAAO,IADIA,EAAYhG,EAAQ0D,GACfxc,KAAKoU,EAAGpU,KAAKqU,EAAGrU,KAAM,aAExC+e,SAAU,WACR,IAAI5K,EAAQ2E,EAAM1T,KAAK5E,WACvBR,KAAKoU,EAAID,EAAMC,EACfpU,KAAKqU,EAAIF,EAAME,GAEjB2K,QAAS,SAAiBF,GAExB,OAAO,IADIA,EAAYpB,EAAOK,GACd/d,KAAK8O,MAAO9O,KAAK+O,OAAQ/O,KAAM,YAEjDif,IAAK,EACLC,IAAK,EACLC,QAAS,WACP,IAAI7K,EAAOoJ,EAAKtY,KAAK5E,WACjB4e,EAAKpf,KAAKqf,IACVC,EAAKtf,KAAKuf,IACVhJ,EAAIjC,EAAKxF,MACT0Q,EAAIlL,EAAKvF,OAETqQ,IACFpf,KAAKoU,IAAMpU,KAAK8O,MAAQyH,GAAK6I,GAG3BE,IACFtf,KAAKqU,IAAMrU,KAAK+O,OAASyQ,GAAKF,GAGhCtf,KAAK8O,MAAQyH,EACbvW,KAAK+O,OAASyQ,EACdxf,KAAKif,IAAMjf,KAAKkf,IAAM,GAExBO,QAAS,WACP,OAAOzf,KAAKoU,GAEdsL,QAAS,SAAiBrP,GACxB,IAAKrQ,KAAKif,IAAK,CACb,IAAI3Z,EAAS+K,EAAOrQ,KAAKoU,EACzBpU,KAAK8O,OAAsB,KAAb9O,KAAKqf,IAAuB,EAAT/Z,EAAaA,EAGhDtF,KAAKoU,EAAI/D,EACTrQ,KAAKqf,IAAMrf,KAAKif,IAAM,GAExBU,OAAQ,WACN,OAAO3f,KAAKqU,GAEduL,OAAQ,SAAgBtP,GACtB,IAAKtQ,KAAKkf,IAAK,CACb,IAAI5Z,EAASgL,EAAMtQ,KAAKqU,EACxBrU,KAAK+O,QAAuB,KAAb/O,KAAKuf,IAAuB,EAATja,EAAaA,EAGjDtF,KAAKqU,EAAI/D,EACTtQ,KAAKuf,IAAMvf,KAAKkf,IAAM,GAExBW,SAAU,WACR,OAAO7f,KAAKoU,EAAIpU,KAAK8O,OAEvBgR,SAAU,SAAkBvP,GAC1B,IAAKvQ,KAAKif,IAAK,CACb,IAAI3Z,EAASiL,EAAQvQ,KAAKoU,EAC1BpU,KAAK8O,MAAqB,KAAb9O,KAAKqf,IAAuB,EAAT/Z,EAAaA,EAG/CtF,KAAKoU,EAAI7D,EAAQvQ,KAAK8O,MACtB9O,KAAKqf,IAAM,EACXrf,KAAKif,IAAM,GAEbc,UAAW,WACT,OAAO/f,KAAKqU,EAAIrU,KAAK+O,QAEvBiR,UAAW,SAAmBxP,GAC5B,IAAKxQ,KAAKkf,IAAK,CACb,IAAI5Z,EAASkL,EAASxQ,KAAKqU,EAC3BrU,KAAK+O,OAAsB,KAAb/O,KAAKuf,IAAuB,EAATja,EAAaA,EAGhDtF,KAAKqU,EAAI7D,EAASxQ,KAAK+O,OACvB/O,KAAKuf,IAAM,EACXvf,KAAKkf,IAAM,GAEbe,WAAY,WACV,OAAOjgB,KAAKoU,EAAIpU,KAAK8O,MAAQ,GAE/BoR,WAAY,SAAoB9L,GAC1BpU,KAAKif,KAAoB,KAAbjf,KAAKqf,IACnBrf,KAAKoU,EAAIA,EAAIpU,KAAK8O,MAAQ,GAEtB9O,KAAKqf,MACPrf,KAAKoU,GAAoB,GAAdA,EAAIpU,KAAKoU,GAASpU,KAAKqf,KAGpCrf,KAAK8O,MAAuB,GAAdsF,EAAIpU,KAAKoU,IAGzBpU,KAAKqf,IAAM,GACXrf,KAAKif,IAAM,GAEbkB,WAAY,WACV,OAAOngB,KAAKqU,EAAIrU,KAAK+O,OAAS,GAEhCqR,WAAY,SAAoB/L,GAC1BrU,KAAKkf,KAAoB,KAAblf,KAAKuf,IACnBvf,KAAKqU,EAAIA,EAAIrU,KAAK+O,OAAS,GAEvB/O,KAAKuf,MACPvf,KAAKqU,GAAoB,GAAdA,EAAIrU,KAAKqU,GAASrU,KAAKuf,KAGpCvf,KAAK+O,OAAwB,GAAdsF,EAAIrU,KAAKqU,IAG1BrU,KAAKuf,IAAM,GACXvf,KAAKkf,IAAM,GAEbmB,UAAW,SAAmBvB,GAE5B,OAAO,IADIA,EAAYhG,EAAQ0D,GACfxc,KAAKigB,aAAcjgB,KAAKmgB,aAAcngB,KAAM,cAE9DsgB,UAAW,WACT,IAAInM,EAAQ2E,EAAM1T,KAAK5E,WAGvB,OAFAR,KAAKkgB,WAAW/L,EAAMC,GACtBpU,KAAKogB,WAAWjM,EAAME,GACfrU,MAETugB,QAAS,WACP,OAAOvgB,KAAK8O,MAAQ9O,KAAK+O,QAE3ByR,QAAS,WACP,OAAsB,IAAfxgB,KAAK8O,OAA+B,IAAhB9O,KAAK+O,QAElC2M,SAAU,SAAkB/U,GAC1B,OAAOA,GAAOA,EAAImI,QAAUjQ,GAA+D,KAAjDoG,MAAMC,QAAQyB,GAAOA,EAAMnG,WAAWP,OAAeD,KAAKygB,mBAAmBhF,EAAWrW,KAAK5E,YAAcR,KAAK0gB,eAAe5H,EAAM1T,KAAK5E,aAEtLkgB,eAAgB,SAAwBvM,GACtC,IAAIC,EAAID,EAAMC,EACVC,EAAIF,EAAME,EACd,OAAOD,GAAKpU,KAAKoU,GAAKC,GAAKrU,KAAKqU,GAAKD,GAAKpU,KAAKoU,EAAIpU,KAAK8O,OAASuF,GAAKrU,KAAKqU,EAAIrU,KAAK+O,QAEtF0R,mBAAoB,SAA4BrQ,GAC9C,IAAIgE,EAAIhE,EAAKgE,EACTC,EAAIjE,EAAKiE,EACb,OAAOD,GAAKpU,KAAKoU,GAAKC,GAAKrU,KAAKqU,GAAKD,EAAIhE,EAAKtB,OAAS9O,KAAKoU,EAAIpU,KAAK8O,OAASuF,EAAIjE,EAAKrB,QAAU/O,KAAKqU,EAAIrU,KAAK+O,QAEjH4R,WAAY,WACV,IAAIvQ,EAAOqL,EAAWrW,KAAK5E,WACvBogB,EAAU5hB,EAAKoG,KAAK5E,YAAc,EAEtC,OAAO4P,EAAKgE,EAAIhE,EAAKtB,MAAQ9O,KAAKoU,EAAIwM,GAAWxQ,EAAKiE,EAAIjE,EAAKrB,OAAS/O,KAAKqU,EAAIuM,GAAWxQ,EAAKgE,EAAIpU,KAAKoU,EAAIpU,KAAK8O,MAAQ8R,GAAWxQ,EAAKiE,EAAIrU,KAAKqU,EAAIrU,KAAK+O,OAAS6R,GAExKC,UAAW,WACT,IAAIzQ,EAAOqL,EAAWrW,KAAK5E,WACvB4W,EAAKlG,KAAKC,IAAInR,KAAKoU,EAAGhE,EAAKgE,GAC3BiI,EAAKnL,KAAKC,IAAInR,KAAKqU,EAAGjE,EAAKiE,GAC3BgD,EAAKnG,KAAKD,IAAIjR,KAAKoU,EAAIpU,KAAK8O,MAAOsB,EAAKgE,EAAIhE,EAAKtB,OACjDwN,EAAKpL,KAAKD,IAAIjR,KAAKqU,EAAIrU,KAAK+O,OAAQqB,EAAKiE,EAAIjE,EAAKrB,QAEtD,OAAO,IAAI0M,EAAWrE,EAAIiF,EAAIhF,EAAKD,EAAIkF,EAAKD,IAE9CyE,MAAO,WACL,IAAI1Q,EAAOqL,EAAWrW,KAAK5E,WACvB4W,EAAKlG,KAAKD,IAAIjR,KAAKoU,EAAGhE,EAAKgE,GAC3BiI,EAAKnL,KAAKD,IAAIjR,KAAKqU,EAAGjE,EAAKiE,GAC3BgD,EAAKnG,KAAKC,IAAInR,KAAKoU,EAAIpU,KAAK8O,MAAOsB,EAAKgE,EAAIhE,EAAKtB,OACjDwN,EAAKpL,KAAKC,IAAInR,KAAKqU,EAAIrU,KAAK+O,OAAQqB,EAAKiE,EAAIjE,EAAKrB,QAEtD,OAAO,IAAI0M,EAAWrE,EAAIiF,EAAIhF,EAAKD,EAAIkF,EAAKD,IAE9C0E,QAAS,WACP,IAAI5M,EAAQ2E,EAAM1T,KAAK5E,WACnB4W,EAAKlG,KAAKD,IAAIjR,KAAKoU,EAAGD,EAAMC,GAC5BiI,EAAKnL,KAAKD,IAAIjR,KAAKqU,EAAGF,EAAME,GAC5BgD,EAAKnG,KAAKC,IAAInR,KAAKoU,EAAIpU,KAAK8O,MAAOqF,EAAMC,GACzCkI,EAAKpL,KAAKC,IAAInR,KAAKqU,EAAIrU,KAAK+O,OAAQoF,EAAME,GAC9C,OAAO,IAAIoH,EAAWrE,EAAIiF,EAAIhF,EAAKD,EAAIkF,EAAKD,IAE9C2E,OAAQ,WACN,IAAI1b,EAASoY,EAAKtY,KAAK5E,WACnB4Q,EAAM9L,EAAOwJ,MACbuC,EAAM/L,EAAOyJ,OACjB,OAAO,IAAI0M,EAAWzb,KAAKoU,EAAIhD,EAAM,EAAGpR,KAAKqU,EAAIhD,EAAM,EAAGrR,KAAK8O,MAAQsC,EAAKpR,KAAK+O,OAASsC,IAE5FsI,MAAO,SAAevI,EAAKC,GACzB,OAAOrR,KAAKghB,OAAOhhB,KAAK8O,MAAQsC,EAAMpR,KAAK8O,MAAO9O,KAAK+O,QAAUsC,IAAQxS,EAAYuS,EAAMC,GAAOrR,KAAK+O,UAExG/P,EAAK8D,KAAK,CAAC,CAAC,MAAO,QAAS,CAAC,MAAO,SAAU,CAAC,SAAU,QAAS,CAAC,SAAU,SAAU,CAAC,OAAQ,UAAW,CAAC,MAAO,UAAW,CAAC,QAAS,UAAW,CAAC,SAAU,YAAY,SAAUme,EAAO5X,GAC5L,IAAIhH,EAAO4e,EAAM/c,KAAK,IAClBgd,EAAS,QAAQ9e,KAAKC,GACtBgH,GAAS,IAAG4X,EAAM,IAAMC,EAAS,IAAM,KAC3C,IAAI9M,EAAI6M,EAAMC,EAAS,EAAI,GACvB7M,EAAI4M,EAAMC,EAAS,EAAI,GACvBlE,EAAO,MAAQ5I,EACf8I,EAAO,MAAQ7I,EACf4I,EAAO,MAAQ7I,EACf+I,EAAO,MAAQ9I,EAEfhU,EAAM,MAAQgC,EAElBrC,KAHU,MAAQqC,GAGN,SAAUyc,GAEpB,OAAO,IADIA,EAAYhG,EAAQ0D,GACfxc,KAAKgd,KAAShd,KAAKkd,KAASld,KAAMK,IAGpDL,KAAKK,GAAO,WACV,IAAI8T,EAAQ2E,EAAM1T,KAAK5E,WACvBR,KAAKid,GAAM9I,EAAMC,GACjBpU,KAAKmd,GAAMhJ,EAAME,MAElB,CACDnT,OAAO,KAGLigB,EAAkB1F,EAAWhZ,OAAO,CACtCG,WAAY,SAAmBwR,EAAGC,EAAGvF,EAAOC,EAAQ0N,EAAOC,GACzD1c,KAAKmZ,KAAK/E,EAAGC,EAAGvF,EAAOC,GAAQ,GAE/B/O,KAAK6c,OAASJ,EACdzc,KAAK8c,QAAUJ,GAEjBvD,KAAM,SAAc/E,EAAGC,EAAGvF,EAAOC,EAAQgO,GAMvC,OALA/c,KAAK2c,GAAKvI,EACVpU,KAAK4c,GAAKvI,EACVrU,KAAKge,OAASlP,EACd9O,KAAKie,QAAUlP,EACVgO,GAAa/c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,MACrCA,OAER,IAAI,WACL,IAAI2C,EAAQ8Y,EAAWjZ,UACvB,OAAOxD,EAAK8D,KAAK,CAAC,IAAK,IAAK,QAAS,WAAW,SAAUpC,GACxD,IAAI2B,EAAOrD,EAAK0K,WAAWhJ,GACvB0gB,EAAW,IAAM1gB,EAErBV,KAAK,MAAQqC,GAAQ,WACnB,OAAOrC,KAAKohB,IAGdphB,KAAK,MAAQqC,GAAQ,SAAUvB,GAC7Bd,KAAKohB,GAAYtgB,EACZd,KAAK+c,aAAa/c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,SAElDhB,EAAK8D,KAAK,CAAC,QAAS,OAAQ,SAAU,OAAQ,MAAO,QAAS,SAAU,UAAW,UAAW,UAAW,WAAY,aAAc,cAAe,aAAc,YAAa,cAAe,iBAAiB,SAAUpC,GACxN,IAAIY,EAAO,MAAQZ,EAEnBV,KAAKsB,GAAQ,WACXtB,KAAK+c,aAAc,EACnBpa,EAAMrB,GAAMuB,MAAM7C,KAAMQ,WACxBR,KAAK+c,aAAc,EAEnB/c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,SAE3B,CACDod,WAAY,WACV,SAAmC,EAAzBpd,KAAK6c,OAAOQ,aAExBE,YAAa,SAAqBC,GAChC,IAAIf,EAAQzc,KAAK6c,OAEbJ,EAAMgB,kBACRhB,EAAMgB,iBAAiB,EAAGD,SAM9B6D,EAASriB,EAAKyD,OAAO,CACvBkB,OAAQ,SACRf,WAAY,SAASye,EAAO1a,EAAKoW,GAC/B,IAAIxU,EAAO/H,UACPiX,EAAQlP,EAAKtI,OACbqhB,GAAK,EAkBT,GAhBI7J,GAAS,EACXzX,KAAKmZ,KAAKtW,MAAM7C,KAAMuI,GACH,IAAVkP,GAAyB,IAAVA,EACpB9Q,aAAe0a,EACjBrhB,KAAKmZ,KAAKxS,EAAI4a,GAAI5a,EAAI6a,GAAI7a,EAAI8a,GAAI9a,EAAI+a,GAAI/a,EAAIgb,IAAKhb,EAAIib,IAAK7E,GACnD9X,MAAMC,QAAQyB,GACvB3G,KAAKmZ,KAAKtW,MAAM7C,KAAM+c,EAAcpW,EAAIqC,OAAO,CAAC+T,IAAgBpW,GAEhE2a,GAAK,EAEG7J,EAGV6J,GAAK,EAFLthB,KAAK6hB,SAKFP,EACH,MAAM,IAAIQ,MAAM,iCAGlB,OAAO9hB,MAETK,IAAK,cACL8Y,KAAM,SAAcjW,EAAGC,EAAGiS,EAAG2C,EAAGgK,EAAIC,EAAIjF,GAQtC,OAPA/c,KAAKuhB,GAAKre,EACVlD,KAAKwhB,GAAKre,EACVnD,KAAKyhB,GAAKrM,EACVpV,KAAK0hB,GAAK3J,EACV/X,KAAK2hB,IAAMI,EACX/hB,KAAK4hB,IAAMI,EACNjF,GAAa/c,KAAKiiB,WAChBjiB,MAET8H,WAAY,SAAoBvD,EAAS4C,GACvC,OAAOnI,EAAKyF,UAAUzE,KAAKkiB,YAAa3d,GAAS,EAAM4C,IAEzD8a,SAAU,WACR,IAAIxF,EAAQzc,KAAK6c,OAEbJ,IACEA,EAAM0F,aACR1F,EAAMxB,UAAU,MAAM,GAEtBwB,EAAMwF,SAAS,MAIrBlf,MAAO,WACL,OAAO,IAAIse,EAAOrhB,KAAKuhB,GAAIvhB,KAAKwhB,GAAIxhB,KAAKyhB,GAAIzhB,KAAK0hB,GAAI1hB,KAAK2hB,IAAK3hB,KAAK4hB,MAEvE9c,OAAQ,SAAgBsd,GACtB,OAAOA,IAAOpiB,MAAQoiB,GAAMpiB,KAAKuhB,KAAOa,EAAGb,IAAMvhB,KAAKwhB,KAAOY,EAAGZ,IAAMxhB,KAAKyhB,KAAOW,EAAGX,IAAMzhB,KAAK0hB,KAAOU,EAAGV,IAAM1hB,KAAK2hB,MAAQS,EAAGT,KAAO3hB,KAAK4hB,MAAQQ,EAAGR,KAEzJne,SAAU,WACR,IAAI6S,EAAIvS,EAAUC,SAClB,MAAO,KAAO,CAACsS,EAAErS,OAAOjE,KAAKuhB,IAAKjL,EAAErS,OAAOjE,KAAKyhB,IAAKnL,EAAErS,OAAOjE,KAAK2hB,MAAMzd,KAAK,MAAQ,OAAS,CAACoS,EAAErS,OAAOjE,KAAKwhB,IAAKlL,EAAErS,OAAOjE,KAAK0hB,IAAKpL,EAAErS,OAAOjE,KAAK4hB,MAAM1d,KAAK,MAAQ,MAEzK2d,MAAO,SAAe9E,GAIpB,OAHA/c,KAAKuhB,GAAKvhB,KAAK0hB,GAAK,EACpB1hB,KAAKwhB,GAAKxhB,KAAKyhB,GAAKzhB,KAAK2hB,IAAM3hB,KAAK4hB,IAAM,EACrC7E,GAAa/c,KAAKiiB,WAChBjiB,MAET6C,MAAO,SAAewf,EAAaC,GACjC,IAAI7F,EAAQzc,KAAK6c,OAEjB,QAAIJ,IACFA,EAAMxB,UAAU,KAAMjc,EAAKiE,KAAKof,GAAa,GAAOC,GAC7CtiB,KAAKuiB,eAKhBC,UAAW,WACT,IAAIrO,EAAQ2E,EAAM1T,KAAK5E,WACnB4T,EAAID,EAAMC,EACVC,EAAIF,EAAME,EAMd,OALArU,KAAK2hB,KAAOvN,EAAIpU,KAAKuhB,GAAKlN,EAAIrU,KAAKyhB,GACnCzhB,KAAK4hB,KAAOxN,EAAIpU,KAAKwhB,GAAKnN,EAAIrU,KAAK0hB,GAEnC1hB,KAAKiiB,WAEEjiB,MAET2Z,MAAO,WACL,IAAIpR,EAAO/H,UACPmZ,EAAQb,EAAM1T,KAAKmD,GACnBwS,EAASjC,EAAM1T,KAAKmD,EAAM,EAAG,CAC/B5C,UAAU,IAWZ,OATIoV,GAAQ/a,KAAKwiB,UAAUzH,GAC3B/a,KAAKuhB,IAAM5H,EAAMvF,EACjBpU,KAAKwhB,IAAM7H,EAAMvF,EACjBpU,KAAKyhB,IAAM9H,EAAMtF,EACjBrU,KAAK0hB,IAAM/H,EAAMtF,EACb0G,GAAQ/a,KAAKwiB,UAAUzH,EAAOQ,UAElCvb,KAAKiiB,WAEEjiB,MAET8a,OAAQ,SAAgBzB,GACtBA,GAASnI,KAAK4I,GAAK,IACnB,IAAIiB,EAASjC,EAAM1T,KAAK5E,UAAW,GAC/B4T,EAAI2G,EAAO3G,EACXC,EAAI0G,EAAO1G,EACXoF,EAAMvI,KAAKuI,IAAIJ,GACfK,EAAMxI,KAAKwI,IAAIL,GACf0I,EAAK3N,EAAIA,EAAIqF,EAAMpF,EAAIqF,EACvBsI,EAAK3N,EAAID,EAAIsF,EAAMrF,EAAIoF,EACvBvW,EAAIlD,KAAKuhB,GACTpe,EAAInD,KAAKwhB,GACTpM,EAAIpV,KAAKyhB,GACT1J,EAAI/X,KAAK0hB,GAUb,OATA1hB,KAAKuhB,GAAK9H,EAAMvW,EAAIwW,EAAMtE,EAC1BpV,KAAKwhB,GAAK/H,EAAMtW,EAAIuW,EAAM3B,EAC1B/X,KAAKyhB,IAAM/H,EAAMxW,EAAIuW,EAAMrE,EAC3BpV,KAAK0hB,IAAMhI,EAAMvW,EAAIsW,EAAM1B,EAC3B/X,KAAK2hB,KAAOI,EAAK7e,EAAI8e,EAAK5M,EAC1BpV,KAAK4hB,KAAOG,EAAK5e,EAAI6e,EAAKjK,EAE1B/X,KAAKiiB,WAEEjiB,MAETyiB,MAAO,WACL,IAAIla,EAAO/H,UACPiiB,EAAQ3J,EAAM1T,KAAKmD,GACnBwS,EAASjC,EAAM1T,KAAKmD,EAAM,EAAG,CAC/B5C,UAAU,IAERoV,GAAQ/a,KAAKwiB,UAAUzH,GAC3B,IAAI7X,EAAIlD,KAAKuhB,GACTpe,EAAInD,KAAKwhB,GASb,OARAxhB,KAAKuhB,IAAMkB,EAAMpO,EAAIrU,KAAKyhB,GAC1BzhB,KAAKwhB,IAAMiB,EAAMpO,EAAIrU,KAAK0hB,GAC1B1hB,KAAKyhB,IAAMgB,EAAMrO,EAAIlR,EACrBlD,KAAK0hB,IAAMe,EAAMrO,EAAIjR,EACjB4X,GAAQ/a,KAAKwiB,UAAUzH,EAAOQ,UAElCvb,KAAKiiB,WAEEjiB,MAET0iB,KAAM,WACJ,IAAIna,EAAO/H,UACPkiB,EAAO5J,EAAM1T,KAAKmD,GAClBwS,EAASjC,EAAM1T,KAAKmD,EAAM,EAAG,CAC/B5C,UAAU,IAERgd,EAAYzR,KAAK4I,GAAK,IACtB2I,EAAQ,IAAI3J,EAAM5H,KAAK0R,IAAIF,EAAKtO,EAAIuO,GAAYzR,KAAK0R,IAAIF,EAAKrO,EAAIsO,IACtE,OAAO3iB,KAAKyiB,MAAMA,EAAO1H,IAE3BxR,OAAQ,SAAgB6Y,EAAIrF,GAC1B,GAAIqF,EAAI,CACN,IAAIS,EAAK7iB,KAAKuhB,GACVvJ,EAAKhY,KAAKwhB,GACVsB,EAAK9iB,KAAKyhB,GACVsB,EAAK/iB,KAAK0hB,GACVsB,EAAKZ,EAAGb,GACR0B,EAAKb,EAAGX,GACRxJ,EAAKmK,EAAGZ,GACR0B,EAAKd,EAAGV,GACRyB,EAAMf,EAAGT,IACTyB,EAAMhB,EAAGR,IACb5hB,KAAKuhB,GAAKyB,EAAKH,EAAK5K,EAAK6K,EACzB9iB,KAAKyhB,GAAKwB,EAAKJ,EAAKK,EAAKJ,EACzB9iB,KAAKwhB,GAAKwB,EAAKhL,EAAKC,EAAK8K,EACzB/iB,KAAK0hB,GAAKuB,EAAKjL,EAAKkL,EAAKH,EACzB/iB,KAAK2hB,KAAOwB,EAAMN,EAAKO,EAAMN,EAC7B9iB,KAAK4hB,KAAOuB,EAAMnL,EAAKoL,EAAML,EACxBhG,GAAa/c,KAAKiiB,WAGzB,OAAOjiB,MAETqjB,QAAS,SAAiBjB,EAAIrF,GAC5B,GAAIqF,EAAI,CACN,IAAIS,EAAK7iB,KAAKuhB,GACVvJ,EAAKhY,KAAKwhB,GACVsB,EAAK9iB,KAAKyhB,GACVsB,EAAK/iB,KAAK0hB,GACV4B,EAAMtjB,KAAK2hB,IACX4B,EAAMvjB,KAAK4hB,IACXoB,EAAKZ,EAAGb,GACR0B,EAAKb,EAAGX,GACRxJ,EAAKmK,EAAGZ,GACR0B,EAAKd,EAAGV,GACRyB,EAAMf,EAAGT,IACTyB,EAAMhB,EAAGR,IACb5hB,KAAKuhB,GAAKyB,EAAKH,EAAKI,EAAKjL,EACzBhY,KAAKyhB,GAAKuB,EAAKF,EAAKG,EAAKF,EACzB/iB,KAAKwhB,GAAKvJ,EAAK4K,EAAKK,EAAKlL,EACzBhY,KAAK0hB,GAAKzJ,EAAK6K,EAAKI,EAAKH,EACzB/iB,KAAK2hB,IAAMqB,EAAKM,EAAML,EAAKM,EAAMJ,EACjCnjB,KAAK4hB,IAAM3J,EAAKqL,EAAMJ,EAAKK,EAAMH,EAC5BrG,GAAa/c,KAAKiiB,WAGzB,OAAOjiB,MAETwjB,SAAU,SAAkBpB,GAC1B,OAAOpiB,KAAK+C,QAAQwG,OAAO6Y,IAE7BqB,UAAW,SAAmBrB,GAC5B,OAAOpiB,KAAK+C,QAAQsgB,QAAQjB,IAE9BsB,OAAQ,WACN,IAAIxgB,EAAIlD,KAAKuhB,GACTpe,EAAInD,KAAKwhB,GACTpM,EAAIpV,KAAKyhB,GACT1J,EAAI/X,KAAK0hB,GACTK,EAAK/hB,KAAK2hB,IACVK,EAAKhiB,KAAK4hB,IACV+B,EAAMzgB,EAAI6U,EAAI5U,EAAIiS,EAClBxT,EAAM,KAYV,OAVI+hB,IAAQ5H,MAAM4H,IAAQ9L,SAASkK,IAAOlK,SAASmK,KACjDhiB,KAAKuhB,GAAKxJ,EAAI4L,EACd3jB,KAAKwhB,IAAMre,EAAIwgB,EACf3jB,KAAKyhB,IAAMrM,EAAIuO,EACf3jB,KAAK0hB,GAAKxe,EAAIygB,EACd3jB,KAAK2hB,KAAOvM,EAAI4M,EAAKjK,EAAIgK,GAAM4B,EAC/B3jB,KAAK4hB,KAAOze,EAAI4e,EAAK7e,EAAI8e,GAAM2B,EAC/B/hB,EAAM5B,MAGD4B,GAETgiB,SAAU,WACR,OAAO5jB,KAAK+C,QAAQ2gB,UAEtBG,YAAa,UACbC,eAAgB,WAChBC,MAAO,YACPC,WAAY,WACV,OAAO,IAAI3C,EAAOrhB,KAAKuhB,GAAIvhB,KAAKwhB,GAAIxhB,KAAKyhB,GAAIzhB,KAAK0hB,GAAI,EAAG,IAE3DuC,kBAAmB,WACjB,OAAOjkB,KAAKuiB,aAAe,KAAOviB,MAEpCuiB,WAAY,WACV,OAAmB,IAAZviB,KAAKuhB,IAAwB,IAAZvhB,KAAKwhB,IAAwB,IAAZxhB,KAAKyhB,IAAwB,IAAZzhB,KAAK0hB,IAAyB,IAAb1hB,KAAK2hB,KAA0B,IAAb3hB,KAAK4hB,KAEpGsC,aAAc,WACZ,IAAIP,EAAM3jB,KAAKuhB,GAAKvhB,KAAK0hB,GAAK1hB,KAAKyhB,GAAKzhB,KAAKwhB,GAC7C,OAAOmC,IAAQ5H,MAAM4H,IAAQ9L,SAAS7X,KAAK2hB,MAAQ9J,SAAS7X,KAAK4hB,MAEnEuC,WAAY,WACV,OAAQnkB,KAAKkkB,gBAEfjJ,UAAW,SAAmBxa,EAAKF,EAAKkX,GACtC,OAAOjX,UAAUP,OAAS,EAAID,KAAKmb,gBAAgBrC,EAAM1T,KAAK5E,YAAcR,KAAKokB,sBAAsB3jB,EAAKF,EAAKkX,IAEnH0D,gBAAiB,SAAyBhH,EAAOnT,EAAM+b,GACrD,IAAI3I,EAAID,EAAMC,EACVC,EAAIF,EAAME,EAEd,OADKrT,IAAMA,EAAO,IAAI8X,GACf9X,EAAKmY,KAAK/E,EAAIpU,KAAKuhB,GAAKlN,EAAIrU,KAAKyhB,GAAKzhB,KAAK2hB,IAAKvN,EAAIpU,KAAKwhB,GAAKnN,EAAIrU,KAAK0hB,GAAK1hB,KAAK4hB,IAAK7E,IAE/FqH,sBAAuB,SAA+B3jB,EAAKF,EAAKkX,GAC9D,IAAK,IAAI3X,EAAI,EAAGqR,EAAM,EAAIsG,EAAO3X,EAAIqR,EAAKrR,GAAK,EAAG,CAChD,IAAIsU,EAAI3T,EAAIX,GACRuU,EAAI5T,EAAIX,EAAI,GAChBS,EAAIT,GAAKsU,EAAIpU,KAAKuhB,GAAKlN,EAAIrU,KAAKyhB,GAAKzhB,KAAK2hB,IAC1CphB,EAAIT,EAAI,GAAKsU,EAAIpU,KAAKwhB,GAAKnN,EAAIrU,KAAK0hB,GAAK1hB,KAAK4hB,IAGhD,OAAOrhB,GAET8jB,kBAAmB,SAA2BjU,GAC5C,IAAIgH,EAAKhH,EAAKgE,EACViI,EAAKjM,EAAKiE,EACVgD,EAAKD,EAAKhH,EAAKtB,MACfwN,EAAKD,EAAKjM,EAAKrB,OACfuV,EAAS,CAAClN,EAAIiF,EAAIhF,EAAIgF,EAAIhF,EAAIiF,EAAIlF,EAAIkF,GAC1C,OAAOtc,KAAKokB,sBAAsBE,EAAQA,EAAQ,IAEpDC,iBAAkB,SAA0BpU,EAAQnP,EAAM+b,GAKxD,IAJA,IAAIuH,EAAStkB,KAAKqkB,kBAAkBlU,GAChCc,EAAMqT,EAAOllB,MAAM,EAAG,GACtB+R,EAAMF,EAAI7R,QAELU,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIyB,EAAM+iB,EAAOxkB,GACbsT,EAAQ,EAAJtT,EAEJyB,EAAM0P,EAAImC,GACZnC,EAAImC,GAAK7R,EACAA,EAAM4P,EAAIiC,KACnBjC,EAAIiC,GAAK7R,GAKb,OADKP,IAAMA,EAAO,IAAIya,GACfza,EAAKmY,KAAKlI,EAAI,GAAIA,EAAI,GAAIE,EAAI,GAAKF,EAAI,GAAIE,EAAI,GAAKF,EAAI,GAAI8L,IAErEyH,iBAAkB,WAChB,OAAOxkB,KAAKykB,kBAAkB3L,EAAM1T,KAAK5E,aAE3CikB,kBAAmB,SAA2BtQ,EAAOnT,EAAM+b,GACzD,IAAI7Z,EAAIlD,KAAKuhB,GACTpe,EAAInD,KAAKwhB,GACTpM,EAAIpV,KAAKyhB,GACT1J,EAAI/X,KAAK0hB,GACTK,EAAK/hB,KAAK2hB,IACVK,EAAKhiB,KAAK4hB,IACV+B,EAAMzgB,EAAI6U,EAAI5U,EAAIiS,EAClBxT,EAAM,KAEV,GAAI+hB,IAAQ5H,MAAM4H,IAAQ9L,SAASkK,IAAOlK,SAASmK,GAAK,CACtD,IAAI5N,EAAID,EAAMC,EAAIpU,KAAK2hB,IACnBtN,EAAIF,EAAME,EAAIrU,KAAK4hB,IAClB5gB,IAAMA,EAAO,IAAI8X,GACtBlX,EAAMZ,EAAKmY,MAAM/E,EAAI2D,EAAI1D,EAAIe,GAAKuO,GAAMtP,EAAInR,EAAIkR,EAAIjR,GAAKwgB,EAAK5G,GAGhE,OAAOnb,GAET8iB,UAAW,WACT,IAQI5J,EACAnB,EACA+I,EAVAxf,EAAIlD,KAAKuhB,GACTpe,EAAInD,KAAKwhB,GACTpM,EAAIpV,KAAKyhB,GACT1J,EAAI/X,KAAK0hB,GACTiC,EAAMzgB,EAAI6U,EAAI5U,EAAIiS,EAClBR,EAAO1D,KAAK0D,KACZ0F,EAAQpJ,KAAKoJ,MACbqK,EAAU,IAAMzT,KAAK4I,GAKzB,GAAU,IAAN5W,GAAiB,IAANC,EAAS,CACtB,IAAIoV,EAAI3D,EAAK1R,EAAIA,EAAIC,EAAIA,GACzB2X,EAAS5J,KAAKmJ,KAAKnX,EAAIqV,IAAMpV,EAAI,EAAI,GAAK,GAC1CwW,EAAQ,CAACpB,EAAGoL,EAAMpL,GAClBmK,EAAO,CAACpI,EAAMpX,EAAIkS,EAAIjS,EAAI4U,EAAGQ,EAAIA,GAAI,QAChC,GAAU,IAANnD,GAAiB,IAAN2C,EAAS,CAC7B,IAAIS,EAAI5D,EAAKQ,EAAIA,EAAI2C,EAAIA,GACzB+C,EAAS5J,KAAK0T,KAAKxP,EAAIoD,IAAMT,EAAI,EAAI,GAAK,GAC1C4B,EAAQ,CAACgK,EAAMnL,EAAGA,GAClBkK,EAAO,CAAC,EAAGpI,EAAMpX,EAAIkS,EAAIjS,EAAI4U,EAAGS,EAAIA,SAEpCsC,EAAS,EACT4H,EAAO/I,EAAQ,CAAC,EAAG,GAGrB,MAAO,CACLkL,YAAa7kB,KAAK8kB,iBAClBC,SAAUjK,EAAS6J,EACnBK,QAAS,IAAIlM,EAAMa,GACnBsL,QAAS,IAAInM,EAAM4J,EAAK,GAAKiC,EAASjC,EAAK,GAAKiC,KAGpDzC,UAAW,WACT,MAAO,CAACliB,KAAKuhB,GAAIvhB,KAAKwhB,GAAIxhB,KAAKyhB,GAAIzhB,KAAK0hB,GAAI1hB,KAAK2hB,IAAK3hB,KAAK4hB,MAE7DkD,eAAgB,WACd,OAAO,IAAIhM,EAAM9Y,KAAK2hB,IAAK3hB,KAAK4hB,MAElCsD,WAAY,WACV,OAAOllB,KAAK0kB,YAAYM,SAE1BG,YAAa,WACX,OAAOnlB,KAAK0kB,YAAYK,UAE1BK,eAAgB,SAAwB7Y,GACjCvM,KAAKuiB,cACRhW,EAAI0O,UAAUjb,KAAKuhB,GAAIvhB,KAAKwhB,GAAIxhB,KAAKyhB,GAAIzhB,KAAK0hB,GAAI1hB,KAAK2hB,IAAK3hB,KAAK4hB,OAGpE5iB,EAAK8D,KAAK,CAAC,IAAK,IAAK,IAAK,IAAK,KAAM,OAAO,SAAUpC,GACvD,IAAI2B,EAAOrD,EAAK0K,WAAWhJ,GACvB2kB,EAAO,IAAM3kB,EAEjBV,KAAK,MAAQqC,GAAQ,WACnB,OAAOrC,KAAKqlB,IAGdrlB,KAAK,MAAQqC,GAAQ,SAAUvB,GAC7Bd,KAAKqlB,GAAQvkB,EAEbd,KAAKiiB,cAEN,KACCqD,EAAOtmB,EAAKyD,OAAO,CACrBkB,OAAQ,OACRf,WAAY,SAAcmW,EAAMC,EAAMsF,EAAMC,EAAMgH,GAChD,IAAIC,GAAW,EAEXhlB,UAAUP,QAAU,GACtBD,KAAKylB,IAAM1M,EACX/Y,KAAK0lB,IAAM1M,EACXhZ,KAAK2lB,IAAMrH,EACXte,KAAK4lB,IAAMrH,EACXiH,EAAWD,IAEXvlB,KAAKylB,IAAM1M,EAAK3E,EAChBpU,KAAK0lB,IAAM3M,EAAK1E,EAChBrU,KAAK2lB,IAAM3M,EAAK5E,EAChBpU,KAAK4lB,IAAM5M,EAAK3E,EAChBmR,EAAWlH,GAGRkH,IACHxlB,KAAK2lB,KAAO3lB,KAAKylB,IACjBzlB,KAAK4lB,KAAO5lB,KAAK0lB,MAGrB7G,SAAU,WACR,OAAO,IAAI/F,EAAM9Y,KAAKylB,IAAKzlB,KAAK0lB,MAElCG,UAAW,WACT,OAAO,IAAI/M,EAAM9Y,KAAK2lB,IAAK3lB,KAAK4lB,MAElCtM,UAAW,WACT,OAAOtZ,KAAK6lB,YAAYvM,aAE1BuH,UAAW,SAAmBiF,EAAMC,GAClC,OAAOT,EAAKzE,UAAU7gB,KAAKylB,IAAKzlB,KAAK0lB,IAAK1lB,KAAK2lB,IAAK3lB,KAAK4lB,IAAKE,EAAKL,IAAKK,EAAKJ,IAAKI,EAAKH,IAAKG,EAAKF,KAAK,EAAMG,IAE9GC,QAAS,SAAiB7R,EAAO4R,GAC/B,OAAOT,EAAKU,QAAQhmB,KAAKylB,IAAKzlB,KAAK0lB,IAAK1lB,KAAK2lB,IAAK3lB,KAAK4lB,IAAKzR,EAAMC,EAAGD,EAAME,GAAG,EAAM0R,IAEtFrL,YAAa,SAAqBvG,GAChC,OAAOjD,KAAKyD,IAAI3U,KAAKimB,kBAAkB9R,KAEzC8R,kBAAmB,SAA2B9R,GAC5C,OAAOmR,EAAKW,kBAAkBjmB,KAAKylB,IAAKzlB,KAAK0lB,IAAK1lB,KAAK2lB,IAAK3lB,KAAK4lB,IAAKzR,EAAMC,EAAGD,EAAME,GAAG,IAE1FuH,YAAa,SAAqBkK,GAChC,OAAOhN,EAAM8C,YAAY5b,KAAK2lB,IAAK3lB,KAAK4lB,IAAKE,EAAKH,IAAKG,EAAKF,MAE9D9J,aAAc,SAAsBgK,GAClC,OAAOhN,EAAMgD,aAAa9b,KAAK2lB,IAAK3lB,KAAK4lB,IAAKE,EAAKH,IAAKG,EAAKF,MAE/DrjB,QAAS,CACPse,UAAW,SAAmBqF,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKjB,EAAUO,GACzEP,IACHY,GAAOF,EACPG,GAAOF,EACPK,GAAOF,EACPG,GAAOF,GAGT,IAAI9L,EAAQ2L,EAAMK,EAAMJ,EAAMG,EAE9B,IAAKhS,EAAU4B,cAAcqE,GAAQ,CACnC,IAAIzD,EAAKkP,EAAMI,EACXI,EAAKP,EAAMI,EACXI,GAAMH,EAAME,EAAKD,EAAMzP,GAAMyD,EAC7BmM,GAAMR,EAAMM,EAAKL,EAAMrP,GAAMyD,EAE7BoM,GADU,MAEVC,EAAO,EAFG,MAId,GAAIf,GAAcc,EAAOF,GAAMA,EAAKG,GAAQD,EAAOD,GAAMA,EAAKE,EAK5D,OAJKf,IACHY,EAAKA,GAAM,EAAI,EAAIA,GAAM,EAAI,EAAIA,GAG5B,IAAI7N,EAAMoN,EAAMS,EAAKP,EAAKD,EAAMQ,EAAKN,KAIlDL,QAAS,SAAiBe,EAAIC,EAAIC,EAAIC,EAAI9S,EAAGC,EAAGmR,EAAUO,GACnDP,IACHyB,GAAMF,EACNG,GAAMF,GAGR,IAAIR,EAAMpS,EAAI2S,EAEVI,EAAMX,EAAMU,GADN7S,EAAI2S,GACaC,EAO3B,OALKlB,GAAcvR,EAAU4B,cAAc+Q,KACzCA,GAAOX,EAAMS,EAAKT,EAAMS,IAAOA,EAAKA,EAAKC,EAAKA,KACnC,GAAKC,GAAO,IAAGA,EAAM,GAG3BA,EAAM,GAAK,EAAIA,EAAM,EAAI,EAAI,GAEtClB,kBAAmB,SAA2Bc,EAAIC,EAAIC,EAAIC,EAAI9S,EAAGC,EAAGmR,GAMlE,OALKA,IACHyB,GAAMF,EACNG,GAAMF,GAGM,IAAPC,EAAWC,EAAK,EAAI9S,EAAI2S,EAAKA,EAAK3S,EAAW,IAAP8S,EAAWD,EAAK,EAAI5S,EAAI2S,EAAKA,EAAK3S,IAAMD,EAAI2S,GAAMG,GAAM7S,EAAI2S,GAAMC,IAAOC,EAAKD,EAAKC,EAAKhW,KAAK0D,KAAK,EAAIqS,EAAKA,GAAMC,EAAKA,IAAOD,EAAK/V,KAAK0D,KAAK,EAAIsS,EAAKA,GAAMD,EAAKA,MAE/MvM,YAAa,SAAqBqM,EAAIC,EAAIC,EAAIC,EAAI9S,EAAGC,EAAGmR,GACtD,OAAOtU,KAAKyD,IAAI2Q,EAAKW,kBAAkBc,EAAIC,EAAIC,EAAIC,EAAI9S,EAAGC,EAAGmR,QAI/D5W,EAAUY,EAAe/M,OAAO,CAClCkB,OAAQ,UACR+L,MAAO,WACPC,WAAY,UACZ5H,mBAAmB,EACnBnF,WAAY,SAAiB+L,GAC3Ba,EAAetP,KAAKF,MAAM,GAC1BA,KAAKonB,UAAY,GACjBpnB,KAAKqnB,eAAiB,GACtBrnB,KAAKsnB,aAAe,KACpBtnB,KAAKunB,cAAgB,IAAIC,EAAM,KAAM,KAAMxnB,MAC3CA,KAAKqO,MAAQoZ,EAAKpoB,OAAOW,KAAM2O,GAAWnC,GAAewC,UAAU,EAAG,IACtEhP,KAAK0nB,gBAAkB,GACvB1nB,KAAK2nB,gBAAkB,EACvB3nB,KAAK4nB,eAAiB,GAExB9f,WAAY,SAAoBvD,EAAS4C,GACvC,OAAOnI,EAAKyF,UAAUzE,KAAKonB,UAAW7iB,GAAS,EAAM4C,IAEvD8a,SAAU,SAAkB4F,EAAOngB,GACjC,GAAY,EAARmgB,EAAW,CACb,IAAIC,EAAO9nB,KAAKqO,MAEZyZ,IACFA,EAAKC,cAAe,GACfD,EAAKE,YAAcF,EAAKG,aAAaH,EAAKI,iBAInD,IAAIC,EAAUnoB,KAAKooB,SAEnB,GAAID,GAAWzgB,EAAM,CACnB,IAAI2gB,EAAcroB,KAAKsoB,aACnB3gB,EAAKD,EAAKhE,IACVuC,EAAQoiB,EAAY1gB,GAEpB1B,EACFA,EAAM4hB,OAASA,EAEfM,EAAQrkB,KAAKukB,EAAY1gB,GAAM,CAC7BD,KAAMA,EACNmgB,MAAOA,MAKf3Y,MAAO,WAGL,IAFA,IAAIqZ,EAAWvoB,KAAKonB,UAEXtnB,EAAIyoB,EAAStoB,OAAS,EAAGH,GAAK,EAAGA,IACxCyoB,EAASzoB,GAAGwJ,UAGhBkX,QAAS,WACP,OAAQxgB,KAAKonB,UAAUnnB,QAEzBqJ,OAAQ,SAASA,IACf,QAAKA,EAAOxH,KAAK5B,KAAKF,QAClBA,KAAKqO,OAAOrO,KAAKqO,MAAM/E,UACpB,IAET8E,QAAS,WACP,OAAOpO,KAAKqO,OAEdma,gBAAiB,WACf,OAAOxoB,KAAKunB,eAEdkB,gBAAiB,SAAyBC,GACxC1oB,KAAKunB,cAAclnB,IAAIqoB,IAEzBC,SAAU,WACR,OAAO3oB,KAAKwJ,QAEdof,WAAY,WACV,OAAO5oB,KAAKyP,OAAO5D,UAErBgd,UAAW,WACT,OAAO7oB,KAAKonB,WAEd0B,eAAgB,WACd,OAAO9oB,KAAKsnB,cAAgB,IAAIxe,EAAM,CACpCoD,QAASlM,KACT+I,QAAQ,KAGZggB,qBAAsB,WACpB,IAAIxhB,EAAc,GACdyhB,EAAM,GAeV,OAdAhpB,KAAKipB,SAAS,CACZC,MAAOC,EACPpnB,MAAO,SAAe2F,GACpB,IAAI0hB,EAAa1hB,EAAK2hB,YAClB1hB,EAAKyhB,EAAW1lB,IAOpB,OALKslB,EAAIrhB,KACPqhB,EAAIrhB,IAAM,EACVJ,EAAYzD,KAAKslB,KAGZ,KAGJ7hB,GAET+hB,WAAY,uBACZC,iBAAkB,WAChB,IAAIC,EAAiBxpB,KAAK0nB,gBACtBze,EAAQ,GAEZ,IAAK,IAAItB,KAAM6hB,EAAgB,CAC7B,IAAI9hB,EAAO8hB,EAAe7hB,GACtB8hB,EAAY/hB,EAAK2V,WAEL,EAAZoM,GAAiB/hB,EAAKgiB,aACxBzgB,EAAMnF,KAAK4D,GACD+hB,GACVzpB,KAAK2pB,iBAAiBjiB,GAI1B,OAAOuB,GAET0gB,iBAAkB,SAA0BjiB,GAC1C,IAAIC,EAAKD,EAAKhE,IACV8lB,EAAiBxpB,KAAK0nB,gBAEtBhgB,EAAK2V,WACHmM,EAAe7hB,KAAQD,IACzB1H,KAAK2nB,kBACL6B,EAAe7hB,GAAMD,GAEd8hB,EAAe7hB,KAAQD,IAChC1H,KAAK2nB,yBACE6B,EAAe7hB,KAG1BiiB,UAAW,WAGT,IAFA,IAAIrB,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAG+pB,kBAAiB,IAGjCC,YAAa,WACX,IAAIN,EAAiBxpB,KAAK0nB,gBAE1B,IAAK,IAAI5nB,KAAK0pB,EACZA,EAAe1pB,GAAG+pB,kBAAiB,IAGvCE,SAAU,SAAkBC,GAC1B,OAAOhqB,KAAKiqB,YAAYprB,EAAWmrB,IAErCC,YAAa,SAAqB5gB,EAAO2gB,GACvC,GAAIA,aAAiBlhB,EAAO,CAC1BkhB,EAAME,SAAQ,GAAO,GAErBlrB,EAAKoK,OAAOpJ,KAAKonB,UAAW,CAAC4C,GAAQ3gB,EAAO,GAE5C2gB,EAAMG,YAAYnqB,MAAM,GAExB,IAAIsB,EAAO0oB,EAAMpmB,MACbtC,GAAM0oB,EAAMI,QAAQ9oB,GACpBtB,KAAKooB,UAAU4B,EAAM/H,SAAS,GAC7BjiB,KAAKsnB,eAActnB,KAAKsnB,aAAe0C,QAE5CA,EAAQ,KAGV,OAAOA,GAETK,YAAa,SAAqBhhB,EAAO3B,EAAM4iB,GAG7C,OAFA5iB,EAAO1H,KAAKiqB,YAAY5gB,EAAO3B,KAAU1H,KAAKsnB,cAAgBtnB,KAAKqqB,YAAYxrB,EAAW,IAAIiK,EAAMD,EAAK0hB,YAAY,IAAOC,YAAYnhB,EAAO3B,GAC3I4iB,GAAY5iB,EAAKuH,UAAUvH,EAAKuH,WAC7BvH,GAETuhB,SAAU,SAAkB1kB,GAC1B,OAAOsE,EAAK4hB,UAAUzqB,KAAMuE,IAE9BmmB,QAAS,SAAiBnmB,GACxB,OAAOsE,EAAK4hB,UAAUzqB,KAAMuE,EAAS,KAAM,MAAM,GAAM,IAAM,MAE/DH,WAAY,SAAoBC,GAC9BrE,KAAKiP,WACL,IAAI+a,EAAQhqB,KAAKsnB,aACjB,OAAOtoB,EAAKoF,WAAWC,EAAM2lB,GAASA,EAAMxJ,WAAawJ,IAE3DW,SAAU,SAAkB9mB,GAC1B,IAAI+mB,EAAO5qB,KAAK6qB,YAEhB,GAAID,EAAM,CACK,YAAT/mB,IAAoB+mB,EAAKE,UAAY,MACzC,IAAIzqB,EAAMuqB,EAAK/mB,GAEf,GAAIxD,EAAK,CACP,IAAK,IAAIsH,KAAMtH,EAAK,CAClB,IAAIqH,EAAOrH,EAAIsH,GAEf,IAAK,IAAIjH,KAAOkqB,EAAM,CACpB,IAAIG,EAAQH,EAAKlqB,GACbqqB,GAASA,GAAS1qB,UAAY0qB,EAAMrjB,EAAKhE,KAG/CgE,EAAK4B,SAGPshB,EAAK/mB,GAAQ,QAInBmnB,KAAM,SAAcze,EAAK2O,EAAQ+P,GAC/BjrB,KAAK4nB,iBACLrb,EAAI2e,OACJhQ,EAAOkK,eAAe7Y,GAUtB,IATA,IAAIgc,EAAWvoB,KAAKonB,UAChB+D,EAAQ,IAAInsB,EAAK,CACnBosB,OAAQ,IAAItS,EAAM,EAAG,GACrBmS,WAAYA,EACZI,WAAYnQ,EAAOqH,aAAe,KAAOrH,EACzCoQ,SAAU,CAAC,IAAIjK,GACfkK,cAAc,IAGPzrB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAGkrB,KAAKze,EAAK4e,GAKxB,GAFA5e,EAAIif,UAEAxrB,KAAK2nB,gBAAkB,EAAG,CAC5Bpb,EAAI2e,OACJ3e,EAAIkf,YAAc,EAClB,IAAIxiB,EAAQjJ,KAAK0nB,gBACbpT,EAAOtU,KAAKyP,OAAO5D,SAASG,WAC5B6B,EAAU7N,KAAK4nB,eAEnB,IAAK,IAAIjgB,KAAMsB,EACbA,EAAMtB,GAAI+jB,eAAenf,EAAK2O,EAAQ5G,EAAMrL,EAAO4E,GAGrDtB,EAAIif,cAIN3iB,EAAO7J,EAAKyD,OAAOwH,EAAS,CAC9B1H,QAAS,CACPE,OAAQ,SAASA,EAAOhC,GAEtB,OADIA,EAAIkrB,mBAAkBlrB,EAAIkrB,iBAAmB3sB,EAAKqB,IAAI,GAAIL,KAAKwC,UAAUmpB,iBAAkBlrB,EAAIkrB,mBAC5FlpB,EAAOX,KAAKe,MAAM7C,KAAMQ,YAEjC+pB,UAAW,CACTxhB,QAAQ,IAGZpF,OAAQ,OACRC,MAAO,KACPue,cAAc,EACdyJ,iBAAiB,EACjBC,iBAAiB,EACjBC,OAAQ,KACRC,UAAU,EACVC,WAAY,SACZC,SAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,WAAW,EACX/O,WAAY,EACZgP,eAAe,EACfC,iBAAiB,EACjBX,iBAAkB,CAChBrqB,KAAM,KACNwK,YAAa,KACboP,OAAQ,IAAImG,EACZkL,MAAO,KACPC,SAAS,EACTC,UAAW,SACXC,QAAS,EACTC,QAAQ,EACRC,OAAO,EACPC,UAAU,EACVrP,UAAU,EACVsP,KAAM,IAERjoB,YAAa,CAAC,gBACb,IAAI,WACL,IAAIyF,EAAW,CAAC,cAAe,YAAa,cAAe,UAAW,gBAAiB,cAAe,eAAgB,gBACtH,OAAOtL,EAAK8D,KAAKwH,GAAU,SAAUhJ,GACnCtB,KAAKyL,QAAQnK,GAAQ,CACnBmJ,QAAS,SAAiB5G,GACxB7D,KAAKoO,UAAU2e,gBAAgBlpB,EAAM,IAEvC8G,UAAW,SAAmB9G,GAC5B7D,KAAKoO,UAAU2e,gBAAgBlpB,GAAO,OAGzC,CACD4H,QAAS,CACPuhB,QAAS,CACPviB,QAAS,WACPzK,KAAKoO,UAAU6e,aAAajtB,MAAM,IAEpC2K,UAAW,WACT3K,KAAKoO,UAAU6e,aAAajtB,MAAM,KAGtCktB,OAAQ,GACRC,QAAS,IAEX5qB,QAAS,CACP6qB,cAAe9iB,MAGhB,CACH1H,WAAY,aACZyqB,YAAa,SAAqB3oB,EAAOyP,GACvC,IAAImZ,EAAW5oB,GAAS1F,EAAKiD,cAAcyC,GACvC0c,EAAWkM,IAA+B,IAAnB5oB,EAAM0c,SAC7BlG,EAASlb,KAAKutB,QAAU,IAAIlM,EAC5BnV,EAAUohB,GAAY5oB,EAAMwH,SAAWN,GAAMM,QAC7CL,EAAWD,GAAMC,SAuBrB,OAtBA7L,KAAK0D,IAAM0d,EAAW,KAAOzI,EAAInX,MACjCxB,KAAKwtB,QAAUxtB,KAAKwJ,OAAS,KAC7BxJ,KAAKmiB,aAAeniB,KAAK4rB,iBAAmB/f,EAASC,YACjDqI,GAAO+G,EAAOsH,UAAUrO,GAC5B+G,EAAO2B,OAAS7c,KAChBA,KAAKytB,OAAS,IAAIjG,EAAMtb,EAAQqb,cAAevnB,KAAMkM,GAEjDkV,GAAYkM,GAA4B,GAAhB5oB,EAAMqE,SAAoB8C,EAASE,eAAiBuhB,IAA6B,IAAjB5oB,EAAMqE,QAChG/I,KAAKmqB,YAAYje,IAEhBohB,GAAY5oB,EAAMgpB,QAAUxhB,GAASme,YAAYxrB,EAAWmB,MAAM,GAGjEstB,GAAY5oB,IAAUmE,EAAK0hB,WAC7BvqB,KAAKK,IAAIqE,EAAO,CACd0c,UAAU,EACVrY,QAAQ,EACRmD,SAAS,EACTwhB,QAAQ,IAILJ,GAETxlB,WAAY,SAAoBvD,EAAS4C,GACvC,IAAIzC,EAAQ,GACR+B,EAAOzG,KAEX,SAASyE,EAAUkpB,GACjB,IAAK,IAAIjtB,KAAOitB,EAAQ,CACtB,IAAI7sB,EAAQ2F,EAAK/F,GAEZ1B,EAAK8F,OAAOhE,EAAe,YAARJ,EAAsC,IAAlBitB,EAAOC,SAAiBD,EAAOjtB,MACzEgE,EAAMhE,GAAO1B,EAAKyF,UAAU3D,EAAOyD,EAAiB,SAAR7D,EAAgByG,KAOlE,OAFA1C,EAAUzE,KAAK2rB,kBACT3rB,gBAAgB6tB,GAAQppB,EAAUzE,KAAKytB,OAAOK,WAC7C,CAAC9tB,KAAK2D,OAAQe,IAEvBud,SAAU,SAAkB4F,GAC1B,IAAIkG,EAAS/tB,KAAKguB,QACdC,EAAcjuB,KAAKwtB,SAAWO,EAC9B7hB,EAAUlM,KAAKkuB,SAEP,EAARrG,IACF7nB,KAAKmuB,QAAUnuB,KAAKouB,UAAYpuB,KAAKquB,YAAcxvB,GAGzC,GAARgpB,IACF7nB,KAAKsuB,cAAgBzvB,GAGnBovB,GAAuB,GAARpG,GACjBhf,EAAK0lB,kBAAkBN,GAGb,EAARpG,GACFhf,EAAK0lB,kBAAkBvuB,MAGrBkM,GAASA,EAAQ+V,SAAS4F,EAAO7nB,MACjC+tB,GAAQA,EAAO9L,SAAS4F,IAE9B2G,MAAO,WACL,OAAOxuB,KAAK0D,KAEd+qB,QAAS,WACP,OAAOzuB,KAAK4D,OAEdwmB,QAAS,SAAiB9oB,GAExB,GADItB,KAAK4D,OAAO5D,KAAK0uB,eACjBptB,KAAUA,EAAO,GAAI,MAAM,IAAIwgB,MAAM,uDAEzC,IAAIrF,EAAQzc,KAAK2uB,YAEjB,GAAIrtB,GAAQmb,EAAO,CACjB,IAAI8L,EAAW9L,EAAM2K,UACjBwH,EAAgBnS,EAAM4K,gBACzBuH,EAActtB,GAAQstB,EAActtB,IAAS,IAAIwC,KAAK9D,MACjDsB,KAAQinB,IAAWA,EAASjnB,GAAQtB,MAG5CA,KAAK4D,MAAQtC,GAAQzC,EAErBmB,KAAKiiB,SAAS,MAEhB4M,SAAU,WACR,OAAO7uB,KAAKytB,QAEdqB,SAAU,SAAkBpG,GAC1B1oB,KAAK6uB,WAAWxuB,IAAIqoB,KAErB1pB,EAAK8D,KAAK,CAAC,SAAU,UAAW,YAAa,UAAW,UAAU,SAAUxB,GAC7E,IAAIe,EAAOrD,EAAK0K,WAAWpI,GACvBZ,EAAM,IAAMY,EACZumB,EAAQ,CACV8E,OAAQ,IACRH,QAAS,KAGXxsB,KAAK,MAAQqC,GAAQ,WACnB,OAAOrC,KAAKU,IAGdV,KAAK,MAAQqC,GAAQ,SAAUvB,GACzBA,GAASd,KAAKU,KAChBV,KAAKU,GAAOI,EAEZd,KAAKiiB,SAAS4F,EAAMvmB,IAAS,SAGhC,IAAK,CACNJ,OAAO,EACP6tB,aAAc,WACZ,OAAO/uB,KAAKqd,YAEd2R,aAAc,SAAsBvF,GAClC,GAAIA,IAAczpB,KAAKqd,WAAY,CACjCrd,KAAKqd,WAAaoM,EAClB,IAAIvd,EAAUlM,KAAKkuB,SAEfhiB,IACFA,EAAQyd,iBAAiB3pB,MAEzBA,KAAKiiB,SAAS,QAIpBxE,iBAAkB,SAA0BwR,EAAMzR,GAChD,IAAIiM,EAAYzpB,KAAKqd,WACrBrd,KAAKgvB,aAAaxR,EAAWiM,EAAYwF,EAAOxF,GAAawF,IAE/D7R,WAAY,WACV,GAAIpd,KAAKssB,gBAGP,IAFA,IAAI/D,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C,GAAIyoB,EAASzoB,GAAGsd,aAAc,OAAO,EAIzC,SAA4B,EAAlBpd,KAAKqd,aAEjBE,YAAa,SAAqBC,GAChC,GAAIxd,KAAKssB,gBAGP,IAFA,IAAI/D,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAGyd,YAAYC,GAI5Bxd,KAAKyd,iBAAiB,EAAGD,IAE3B0R,gBAAiB,WACf,IAAI3G,EAAWvoB,KAAKonB,UAChB5J,KAAgC,EAAlBxd,KAAKqd,YAEvB,GAAIkL,GAAY/K,EAAU,CACxB,IAAK,IAAI1d,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C,IAAKyoB,EAASzoB,GAAGovB,kBAAmB,OAAO,EAG7C,OAAO,EAGT,OAAO1R,GAETqM,iBAAkB,SAA0BrM,GAC1C,IAAI+K,EAAWvoB,KAAKonB,UAEpB,GAAImB,EACF,IAAK,IAAIzoB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAG+pB,iBAAiBrM,GAIjCxd,KAAKyd,iBAAiB,EAAGD,IAE3B2R,WAAY,WACV,OAAOnvB,KAAKosB,WAEdgD,YAAa,SAAqBvC,GAC5B7sB,KAAKosB,YAAcS,IAAaA,KAClC7sB,KAAKosB,UAAYS,EAEbA,IACF7sB,KAAKqvB,aAAa,MAClBrvB,KAAKsvB,eAAe,OAGtBtvB,KAAKiiB,SAAS,KAEVjiB,KAAKwtB,SAASxtB,KAAKwtB,QAAQvL,SAAS,QAG5CsN,QAAS,WAEP,OADKvvB,KAAKiI,QAAOjI,KAAKiI,MAAQ,IACvBjI,KAAKiI,OAEdunB,QAAS,SAAiB1C,GACxB9sB,KAAKiI,MAAQ6kB,GAEf2C,YAAa,SAAqB3Q,GAChC,IAAIpc,EAAOoc,EAAYhG,EAAQ0D,EAE3BkT,EAAW1vB,KAAKouB,YAAcpuB,KAAKouB,UAAYpuB,KAAK2vB,0BAExD,OAAO,IAAIjtB,EAAKgtB,EAAStb,EAAGsb,EAASrb,EAAGrU,KAAM,gBAEhD4vB,YAAa,WACX5vB,KAAKwiB,UAAU1J,EAAM1T,KAAK5E,WAAWwa,SAAShb,KAAKyvB,aAAY,MAEjEE,uBAAwB,SAAgCxf,GACtD,OAAOnQ,KAAK8rB,OAAS9rB,KAAKutB,QAAQpS,gBAAgBnb,KAAK8rB,SAAW3b,GAAUnQ,KAAKkQ,aAAamQ,WAAU,IAE1GwP,SAAU,WACR,IAAItD,EAAQvsB,KAAK8rB,OACjB,OAAOS,EAAQ,IAAI/P,EAAY+P,EAAMnY,EAAGmY,EAAMlY,EAAGrU,KAAM,YAAc,MAEvE8vB,SAAU,WACR9vB,KAAK8rB,OAAShT,EAAM1T,KAAK5E,UAAW,EAAG,CACrCuC,OAAO,EACP4C,UAAU,IAEZ3F,KAAKouB,UAAYvvB,IAElBG,EAAK8D,KAAK,CACXitB,gBAAiB,CACfC,QAAQ,GAEVC,gBAAiB,CACfC,QAAQ,GAEVC,kBAAmB,CACjB/O,UAAU,KAEX,SAAU7c,EAAS7D,GACpBV,KAAKU,GAAO,SAAUwa,GACpB,OAAOlb,KAAKkQ,UAAUgL,EAAQ3W,MAE/B,CACDrD,OAAO,EACPgP,UAAW,SAAmBgL,EAAQ3W,GACpC,IAAI6rB,EAAY7rB,GAAW2W,aAAkBmG,EACzCgP,EAAOrxB,EAAKqB,IAAI,GAAI+vB,EAAY7rB,EAAU2W,EAAQlb,KAAKswB,gBACtDD,EAAKL,SAAUhwB,KAAKuwB,qBAAoBF,EAAKG,UAAYxwB,MAE9D,IAAIoQ,EAAOpQ,KAAKywB,iBAAiBL,GAAalV,EAAQmV,GAAMjgB,KAE5D,OAAQ5P,UAAUP,OAA2FmQ,EAAlF,IAAI+Q,EAAgB/Q,EAAKgE,EAAGhE,EAAKiE,EAAGjE,EAAKtB,MAAOsB,EAAKrB,OAAQ/O,KAAM,cAEhG0wB,UAAW,WACT,IAAItgB,EAAOqL,EAAWrW,KAAK5E,WACvB2P,EAASnQ,KAAKkQ,YACdqd,EAAUvtB,KAAKutB,QACfrS,EAAS,IAAImG,EACbtG,EAAS3K,EAAKiQ,YAElBnF,EAAOsH,UAAUzH,GAEb3K,EAAKtB,OAASqB,EAAOrB,OAASsB,EAAKrB,QAAUoB,EAAOpB,SACjDwe,EAAQrJ,iBACXqJ,EAAQltB,IAAIktB,EAAQoD,UAAW,IAAItP,GAASmB,UAAU+K,EAAQzI,mBAE9D3U,EAASnQ,KAAKkQ,aAGhBgL,EAAOvB,MAAuB,IAAjBxJ,EAAOrB,MAAcsB,EAAKtB,MAAQqB,EAAOrB,MAAQ,EAAqB,IAAlBqB,EAAOpB,OAAeqB,EAAKrB,OAASoB,EAAOpB,OAAS,IAGvHgM,EAAS5K,EAAOkQ,YAChBnF,EAAOsH,WAAWzH,EAAO3G,GAAI2G,EAAO1G,GACpCrU,KAAKib,UAAUC,IAEjB0V,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAIgkB,EAAWvoB,KAAKonB,UACpB,OAAKmB,GAAaA,EAAStoB,QAE3B4I,EAAKgoB,mBAAmB7wB,KAAMuE,EAAQisB,WAE/B3nB,EAAK+nB,WAAWrI,EAAUrN,EAAQ3W,IAJC,IAAIkX,GAMhDqV,mBAAoB,SAA4BvsB,EAAS6c,GACvD,MAAO,CAAC7c,EAAQyrB,OAAS,EAAI,EAAGzrB,EAAQ2rB,OAAS,EAAI,EAAG9O,EAAW,EAAI,GAAGld,KAAK,KAEjFusB,iBAAkB,SAA0BvV,EAAQ3W,EAASwsB,GAC3D7V,EAASA,GAAUA,EAAO+I,oBAE1B,IAAI7C,EAAW7c,EAAQ6c,WAAa2P,EAChCP,EAAYjsB,EAAQisB,UACpBjD,EAAUnM,EAAW,KAAOphB,KAAKutB,QAAQtJ,oBACzC+M,EAAWR,KAAetV,GAAUA,EAAOpW,OAAOyoB,KAAavtB,KAAK8wB,mBAAmBvsB,EAAS6c,GAChGjR,EAASnQ,KAAKmuB,QAIlB,GAFAtlB,EAAKgoB,mBAAmB7wB,KAAKwtB,SAAWxtB,KAAKguB,QAASwC,GAElDQ,GAAY7gB,GAAU6gB,KAAY7gB,EAEpC,MAAO,CACLC,MAFE6gB,EAAS9gB,EAAO6gB,IAEL5gB,KAAKrN,QAClBmuB,WAAYD,EAAOC,YAIvB,IAAItvB,EAAM5B,KAAK4wB,WAAW1V,GAAUqS,EAAShpB,GACzC6L,EAAOxO,EAAIwO,MAAQxO,EACnB8mB,EAAQ1oB,KAAKytB,OACbyD,EAAatvB,EAAIsvB,YAAcxI,EAAMyI,cAAgBzI,EAAM6H,mBAE/D,GAAIS,EAAU,CACP7gB,IACHnQ,KAAKmuB,QAAUhe,EAAS,IAG1B,IAAI8gB,EAAS9gB,EAAO6gB,GAAY,CAC9B5gB,KAAMA,EAAKrN,QACXmuB,WAAYA,EACZ9P,SAAUA,GAId,MAAO,CACLhR,KAAMA,EACN8gB,WAAYA,IAGhBE,iBAAkB,SAA0BlW,EAAQ3W,GAClD,IAAImpB,EAAS1tB,KAAKuwB,mBAAqB,KAAOhsB,GAAWA,EAAQ6c,SAAWphB,KAAOA,KAAKwtB,SAAWxtB,KAAKguB,SAAWhuB,KAAKguB,QAAQqD,MAC5HjP,EAAKsL,EAASA,EAAO4D,gBAAgB5N,SAAWxI,EACpD,OAAOkH,GAAMA,EAAG4B,cAElBzhB,QAAS,CACPsuB,mBAAoB,SAA4BnD,EAAQhmB,GACtD,GAAIgmB,GAAUhmB,EAAM,CAClB,IAAIC,EAAKD,EAAKhE,IACVkE,EAAM8lB,EAAO6D,aAAe7D,EAAO6D,cAAgB,CACrDvI,IAAK,GACL5lB,KAAM,IAGHwE,EAAIohB,IAAIrhB,KACXC,EAAIxE,KAAKU,KAAK4D,GACdE,EAAIohB,IAAIrhB,GAAMD,KAIpB6mB,kBAAmB,SAA2B7mB,GAC5C,IAAI8pB,EAAQ9pB,EAAK6pB,aAEjB,GAAIC,EAAO,CACT9pB,EAAKymB,QAAUzmB,EAAK0mB,UAAY1mB,EAAK6pB,aAAe1yB,EAEpD,IAAK,IAAIiB,EAAI,EAAGsD,EAAOouB,EAAMpuB,KAAMrD,EAAIqD,EAAKnD,OAAQH,EAAIC,EAAGD,IAAK,CAC9D,IAAIirB,EAAQ3nB,EAAKtD,GAEbirB,IAAUrjB,IACZqjB,EAAMoD,QAAUpD,EAAMqD,UAAYvvB,EAC9BksB,EAAMwG,cAAc1oB,EAAK0lB,kBAAkBxD,OAKvD6F,WAAY,SAAoB3nB,EAAOiS,EAAQ3W,GAC7C,IAAI6S,EAAKE,IACLD,GAAMD,EACNiF,EAAKjF,EACLkF,EAAKjF,EACL6Z,GAAa,EACjB3sB,EAAUA,GAAW,GAErB,IAAK,IAAIzE,EAAI,EAAGC,EAAIkJ,EAAMhJ,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAI4H,EAAOuB,EAAMnJ,GAEjB,GAAI4H,EAAKqkB,WAAarkB,EAAK8Y,SAAQ,GAAO,CACxC,IAAIrQ,EAASzI,EAAK+oB,iBAAiBvV,GAAUA,EAAOsI,SAAS9b,EAAK6lB,SAAUhpB,GAAS,GACjF6L,EAAOD,EAAOC,KAElBgH,EAAKlG,KAAKD,IAAIb,EAAKgE,EAAGgD,GACtBiF,EAAKnL,KAAKD,IAAIb,EAAKiE,EAAGgI,GACtBhF,EAAKnG,KAAKC,IAAIf,EAAKgE,EAAIhE,EAAKtB,MAAOuI,GACnCiF,EAAKpL,KAAKC,IAAIf,EAAKiE,EAAIjE,EAAKrB,OAAQuN,GAChCnM,EAAO+gB,aAAYA,GAAa,IAIxC,MAAO,CACL9gB,KAAMyH,SAAST,GAAM,IAAIqE,EAAWrE,EAAIiF,EAAIhF,EAAKD,EAAIkF,EAAKD,GAAM,IAAIZ,EACpEyV,WAAYA,OAIhB,CACFhwB,OAAO,EACPuwB,WAAY,WACV,OAAOzxB,KAAKmiB,aAAe,KAAOniB,KAAKquB,cAAgBruB,KAAKquB,YAAcruB,KAAKutB,QAAQ7I,cAEzFS,YAAa,WACX,IAAIuM,EAAa1xB,KAAKyxB,aAEtB,OAAOC,EAAaA,EAAW3M,SAAW,GAE5C4M,YAAa,SAAqB5M,GAChC,IAAIlK,EAAU7a,KAAKmlB,cAEnB,GAAe,MAAXtK,GAA+B,MAAZkK,EAAkB,CACvC,IAAI2M,EAAa1xB,KAAKquB,YACtBruB,KAAK8a,OAAOiK,EAAWlK,GAEnB6W,IACFA,EAAW3M,SAAWA,EACtB/kB,KAAKquB,YAAcqD,KAIzBxM,WAAY,WACV,IAAIwM,EAAa1xB,KAAKyxB,aAClBjZ,EAAIkZ,GAAcA,EAAW1M,QAEjC,OAAO,IAAIxI,EAAYhE,EAAIA,EAAEpE,EAAI,EAAGoE,EAAIA,EAAEnE,EAAI,EAAGrU,KAAM,eAEzD4xB,WAAY,WACV,IAAI/W,EAAU7a,KAAKklB,aACfF,EAAUlM,EAAM1T,KAAK5E,UAAW,EAAG,CACrCuC,OAAO,EACP4C,UAAU,IAGZ,GAAIkV,GAAWmK,IAAYnK,EAAQ/V,OAAOkgB,GAAU,CAClD,IAAID,EAAW/kB,KAAKmlB,cAChBuM,EAAa1xB,KAAKquB,YAClBnT,EAAS,IAAImG,EACblL,EAAS3B,EAAU2B,OAEvB,GAAIA,EAAO0E,EAAQzG,IAAM+B,EAAO0E,EAAQxG,GACtC6G,EAAOsH,UAAUkP,EAAW7M,aAExBE,GACF7J,EAAOJ,OAAOiK,GAGhB7J,EAAOvB,MAAMqL,EAAQ5Q,EAAG4Q,EAAQ3Q,GAEhCrU,KAAKutB,QAAQltB,IAAI6a,OACZ,CACL,IAAIH,EAAS/a,KAAKyvB,aAAY,GAC9BvU,EAAOsH,UAAUzH,GACbgK,GAAU7J,EAAOJ,OAAOiK,GAC5B7J,EAAOvB,MAAMqL,EAAQ5Q,EAAIyG,EAAQzG,EAAG4Q,EAAQ3Q,EAAIwG,EAAQxG,GACpD0Q,GAAU7J,EAAOJ,QAAQiK,GAC7B7J,EAAOsH,UAAUzH,EAAOQ,UACxBvb,KAAKib,UAAUC,GAGbwW,IACFA,EAAW1M,QAAUA,EACrBhlB,KAAKquB,YAAcqD,KAIzBG,UAAW,WACT,OAAO7xB,KAAKutB,SAEduE,UAAW,WACT,IAAI5W,EAASlb,KAAKutB,QAClBrS,EAAO7a,IAAIwC,MAAMqY,EAAQ1a,YAE3BuxB,gBAAiB,SAAyBC,GACxC,IAAI9W,EAASlb,KAAKsuB,cAElB,GAAIpT,EAIF,IAHA,IAAIwS,EAAS1tB,KAAKwtB,QACdyE,EAAU,GAEPvE,GAAQ,CACb,IAAKA,EAAOY,cAAe,CACzBpT,EAAS,KAET,IAAK,IAAIpb,EAAI,EAAGC,EAAIkyB,EAAQhyB,OAAQH,EAAIC,EAAGD,IACzCmyB,EAAQnyB,GAAGwuB,cAAgB,KAG7B,MAGF2D,EAAQnuB,KAAK4pB,GACbA,EAASA,EAAOF,QAIftS,IACHA,EAASlb,KAAKsuB,cAAgBtuB,KAAKutB,QAAQxqB,SACvC2qB,EAAS1tB,KAAKwtB,UACNtS,EAAOmI,QAAQqK,EAAOqE,iBAAgB,KAGpD,OAAOC,EAAa9W,EAASA,EAAOnY,SAEtCuuB,cAAe,WACb,OAAOtxB,KAAK+xB,kBAAkB1O,QAAQrjB,KAAKoO,UAAUmf,UAEvD2E,eAAgB,WACd,OAAOlyB,KAAKmiB,cAEdgQ,eAAgB,SAAwBtvB,IAClC7C,KAAKmiB,aAAeniB,KAAK4rB,mBAAqB/oB,IAAO7C,KAAKib,UAAU,MAAM,IAEhFmX,oBAAqB,kBACrBC,oBAAqB,mBACpB,CACDC,WAAY,WACV,OAAOtyB,KAAKkuB,UAEd/D,YAAa,SAAqBje,EAASqmB,GACzC,GAAIvyB,KAAKkuB,WAAahiB,EAAS,CACzBlM,KAAKkuB,UAAUluB,KAAKuL,gBAAe,GACvCvL,KAAKkuB,SAAWhiB,EAGhB,IAFA,IAAIqc,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,GAAYA,EAAStoB,OAAQH,EAAIC,EAAGD,IACtDyoB,EAASzoB,GAAGqqB,YAAYje,GAG1BqmB,GAAgB,EAGdA,GAAevyB,KAAKuL,gBAAe,IAEzC6C,QAAS,WACP,OAAOpO,KAAKkuB,SAAS7f,OAEvB9C,eAAgB,SAASA,EAAed,GACtCc,EAAezJ,KAAK5B,KAAKF,KAAMyK,GAI/B,IAFA,IAAI8d,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,GAAYA,EAAStoB,OAAQH,EAAIC,EAAGD,IACtDyoB,EAASzoB,GAAGyL,eAAed,IAG/B+nB,SAAU,WAGR,IAFA,IAAI9E,EAAS1tB,KAEN0tB,EAASA,EAAOF,SACrB,GAAIE,aAAkB5kB,EAAO,OAAO4kB,EAGtC,OAAO,MAET+E,UAAW,WACT,OAAOzyB,KAAKwtB,SAEdkF,UAAW,SAAmBhrB,GAC5B,OAAOA,EAAKirB,SAAS3yB,OAEvB2uB,UAAW,aACXiE,YAAa,WACX,OAAO5yB,KAAKonB,WAEdyL,YAAa,SAAqB5pB,GAChCjJ,KAAK8yB,iBACL9yB,KAAK+yB,YAAY9pB,IAEnB+pB,cAAe,WACb,OAAOhzB,KAAKonB,WAAapnB,KAAKonB,UAAU,IAAM,MAEhD6L,aAAc,WACZ,OAAOjzB,KAAKonB,WAAapnB,KAAKonB,UAAUpnB,KAAKonB,UAAUnnB,OAAS,IAAM,MAExEizB,eAAgB,WACd,IAAIzW,EAAQzc,KAAK2uB,YAEjB,OAAOlS,GAASA,EAAM2K,UAAUpnB,KAAKwJ,OAAS,IAAM,MAEtD2pB,mBAAoB,WAClB,IAAI1W,EAAQzc,KAAK2uB,YAEjB,OAAOlS,GAASA,EAAM2K,UAAUpnB,KAAKwJ,OAAS,IAAM,MAEtDmf,SAAU,WACR,OAAO3oB,KAAKwJ,QAEd1E,OAAQ,SAAgB4C,GACtB,OAAOA,IAAS1H,MAAQ0H,GAAQ1H,KAAK2D,SAAW+D,EAAK/D,QAAU3D,KAAKytB,OAAO3oB,OAAO4C,EAAK+lB,SAAWztB,KAAKutB,QAAQzoB,OAAO4C,EAAK6lB,UAAYvtB,KAAKksB,UAAYxkB,EAAKwkB,SAAWlsB,KAAK+rB,WAAarkB,EAAKqkB,UAAY/rB,KAAKgsB,aAAetkB,EAAKskB,YAAchsB,KAAKisB,WAAavkB,EAAKukB,UAAYjsB,KAAKosB,YAAc1kB,EAAK0kB,WAAapsB,KAAKmsB,SAAWzkB,EAAKykB,QAAUnsB,KAAKozB,QAAQ1rB,KAAS,GAEjX0rB,QAAS,SAAiB1rB,GACxB,OAAO1I,EAAK8F,OAAO9E,KAAKonB,UAAW1f,EAAK0f,YAE1CrkB,MAAO,SAAewB,GACpB,IAAI8uB,EAAO,IAAIrzB,KAAKgD,YAAY6F,EAAK0hB,WACjChC,EAAWvoB,KAAKonB,UAChBre,EAAS/J,EAAKiE,KAAKsB,EAAUA,EAAQwE,OAASlK,EAAW0F,IAAY1F,IAAyB,IAAZ0F,GAClF+uB,EAAOt0B,EAAKiE,KAAKsB,EAAUA,EAAQ+uB,KAAOz0B,GAAW,GACrD0pB,GAAU8K,EAAKE,eAAevzB,MAC7BuoB,IAAY+K,GAAMD,EAAKG,YAAYxzB,MACnCuoB,GAAU8K,EAAKE,eAAevzB,MAC/B+I,GAAQsqB,EAAKI,YAAYzzB,MAC7B,IAAIsB,EAAOtB,KAAK4D,MACZ8pB,EAAS1tB,KAAKwtB,QAElB,GAAIlsB,GAAQosB,EAAQ,CACdnF,EAAWmF,EAAOtG,UAItB,IAJA,IACIsM,EAAOpyB,EACPxB,EAAI,EAEDyoB,EAASjnB,IACdA,EAAOoyB,EAAO,IAAM5zB,IAGlBwB,IAASoyB,GAAML,EAAKjJ,QAAQ9oB,GAGlC,OAAO+xB,GAETG,YAAa,SAAqBntB,GAGhC,IAFA,IAAIkiB,EAAWliB,EAAO+gB,UAEbtnB,EAAI,EAAGC,EAAIwoB,GAAYA,EAAStoB,OAAQH,EAAIC,EAAGD,IACtDE,KAAK2yB,SAASpK,EAASzoB,GAAGiD,OAAM,IAAQ,IAG5CwwB,eAAgB,SAAwBltB,EAAQstB,GAC9C3zB,KAAK8uB,SAASzoB,EAAOonB,QAGrB,IAFA,IAAItoB,EAAO,CAAC,UAAW,WAAY,aAAc,WAAY,YAAa,UAEjErF,EAAI,EAAGC,EAAIoF,EAAKlF,OAAQH,EAAIC,EAAGD,IAAK,CAC3C,IAAIY,EAAMyE,EAAKrF,GACXuG,EAAOjG,eAAeM,KAAMV,KAAKU,GAAO2F,EAAO3F,IAGhDizB,GAAe3zB,KAAKutB,QAAQltB,IAAIgG,EAAOknB,SAAS,GACrDvtB,KAAKmyB,eAAe9rB,EAAO8b,cAC3BniB,KAAK8vB,SAASzpB,EAAOylB,QACrB9rB,KAAKgvB,aAAa3oB,EAAOgX,YACzB,IAAIyP,EAAOzmB,EAAO4B,MACd3G,EAAO+E,EAAOzC,MAClB5D,KAAKiI,MAAQ6kB,EAAO9tB,EAAK+D,MAAM+pB,GAAQ,KACnCxrB,GAAMtB,KAAKoqB,QAAQ9oB,IAEzBsyB,UAAW,SAAmB7a,EAAMC,GAClC,IAAI6a,EAAY9qB,EAAQ+qB,EAEpB90B,EAAKiD,cAAc8W,IACrB8a,EAAa9a,EAAK8a,WAClB9qB,EAASgQ,EAAKhQ,OACd+qB,EAAS/a,EAAK+a,SAEdD,EAAa9a,EACbhQ,EAASiQ,GAGP8a,EACFA,EAAO5Y,OAAO2G,OAAM,GAEpBiS,EAAS,IAAIC,EAAOlrB,EAAK0hB,WAG3B,IAAIpa,EAASnQ,KAAK+vB,kBACdpW,GAASka,GAAc7zB,KAAKoO,UAAU4lB,iBAAmB,GACzDC,EAAU9jB,EAAO+jB,aAAaC,QAC9BC,EAAcjkB,EAAOkkB,iBAAiBC,OACtCC,EAAa,IAAI7W,EAAK0W,EAAYpZ,SAASiZ,IAC3CO,EAAaD,EAAWnZ,SAASzB,GAGrC,GAFAma,EAAO3U,QAAQqV,GAAY,IAEtBA,EAAWre,SAAU,CACxB,IAAI5J,EAAMunB,EAAOrnB,YAAW,GACxByO,GAAS,IAAImG,GAAS1H,MAAMA,GAAO6I,UAAUyR,EAAQ1Y,UACzDhP,EAAI2e,OACJhQ,EAAOkK,eAAe7Y,GACtBvM,KAAKgrB,KAAKze,EAAK,IAAIvN,EAAK,CACtBssB,SAAU,CAACpQ,MAEb3O,EAAIif,UASN,OANAsI,EAAO7Y,WAAU,IAAIoG,GAASmB,UAAUyR,EAAQxsB,IAAI8sB,EAAWlZ,OAAO,KAAK1B,MAAM,EAAIA,KAEjF5Q,IAAWlK,GAAakK,IAC1B+qB,EAAOL,YAAYzzB,MAGd8zB,GAETpY,SAAU,WACR,IAAIR,EAASlb,KAAKutB,QAClB,OAAOrS,EAAOgJ,kBAAoBlkB,KAAKy0B,UAAUvZ,EAAOuJ,kBAAkB3L,EAAM1T,KAAK5E,cAEvFi0B,UAAW,SAAmBtgB,GAC5B,IAAIoU,EAAWvoB,KAAKonB,UAEpB,GAAImB,EAAU,CACZ,IAAK,IAAIzoB,EAAIyoB,EAAStoB,OAAS,EAAGH,GAAK,EAAGA,IACxC,GAAIyoB,EAASzoB,GAAG4b,SAASvH,GAAQ,OAAO,EAG1C,OAAO,EAGT,OAAOA,EAAMqH,SAASxb,KAAKmwB,sBAE7B3U,SAAU,WACR,OAAOC,EAAWrW,KAAK5E,WAAWkb,SAAS1b,KAAKkQ,cAElDwkB,YAAa,WACX,OAAO,IAAIC,EAAKC,UAAU,CACxBrgB,UAAWvU,KAAKmwB,oBAChBjV,OAAQlb,KAAKutB,QACbxkB,QAAQ,KAGZ4X,WAAY,SAAoBjZ,EAAM6lB,GACpC,OAAM7lB,aAAgBmB,GACf7I,KAAK00B,cAAcG,iBAAiBntB,EAAKgtB,cAAe,KAAMnH,GAAS,GAAMttB,OAAS,IAE9F,IAAI,WACL,SAAS60B,IACP,IAAIvsB,EAAO/H,UACX,OAAOR,KAAK+0B,SAASjc,EAAM1T,KAAKmD,GAAOysB,EAAUpM,WAAWrgB,IAG9D,SAAS0sB,IACP,IAAI1sB,EAAO/H,UACP2T,EAAQ2E,EAAM1T,KAAKmD,GACnBhE,EAAUywB,EAAUpM,WAAWrgB,GAC/B2sB,EAAM,GAMV,OAJAl1B,KAAK+0B,SAAS5gB,EAAO,IAAInV,EAAK,CAC5Bk2B,IAAKA,GACJ3wB,IAEI2wB,EAGT,SAASC,EAAgBhhB,EAAO5P,EAAS8mB,EAAY+J,GACnD,IAAI7M,EAAWvoB,KAAKonB,UAEpB,GAAImB,EACF,IAAK,IAAIzoB,EAAIyoB,EAAStoB,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC7C,IAAIu1B,EAAQ9M,EAASzoB,GAEjB8B,EAAMyzB,IAAUD,GAAYC,EAAMN,SAAS5gB,EAAO5P,EAAS8mB,GAE/D,GAAIzpB,IAAQ2C,EAAQ2wB,IAAK,OAAOtzB,EAIpC,OAAO,KAQT,OALAgN,EAAQtM,OAAO,CACbwyB,QAASA,EACTG,WAAYA,EACZF,SAAUI,IAEL,CACLL,QAASA,EACTG,WAAYA,EACZK,iBAAkBH,IAEjB,CACHJ,SAAU,SAAkB5gB,EAAO5P,EAASgxB,GAC1C,GAAIv1B,KAAKksB,UAAYlsB,KAAK+rB,UAAY/rB,KAAKmsB,SAAW5nB,EAAQixB,QAAUx1B,KAAKwgB,UAC3E,OAAO,KAGT,IAAItF,EAASlb,KAAKutB,QACdlC,EAAakK,EAAmBA,EAAiB/R,SAAStI,GAAUlb,KAAK+xB,kBAAkB1O,QAAQrjB,KAAKoO,UAAUmf,SAClHtd,EAAYiB,KAAKC,IAAI5M,EAAQ0L,UAAW,OACxCwlB,EAAmBlxB,EAAQmxB,kBAAoB,IAAIhY,EAAKiX,EAAKgB,kBAAkB1lB,EAAWiL,EAAO8I,aAAaN,WAGlH,KAFAvP,EAAQ+G,EAAOuJ,kBAAkBtQ,MAElBnU,KAAKonB,YAAcpnB,KAAKkQ,UAAU,CAC/CkR,UAAU,EACV4O,QAAQ,EACRE,QAAQ,IACPlP,OAAOyU,EAAiBra,SAAS,IAAIsF,eAAevM,GACrD,OAAO,KAGT,IAGIhE,EACAvO,EAJAg0B,IAAcrxB,EAAQixB,SAAWx1B,KAAKmsB,QAAU5nB,EAAQiZ,WAAaxd,KAAKod,cAAgB7Y,EAAQV,MAAQU,EAAQV,OAAS7E,EAAKgL,UAAUhK,KAAK2D,SAAWY,EAAQ2kB,SAAWlpB,gBAAgBuE,EAAQ2kB,QACrMnnB,EAAQwC,EAAQxC,MAChB0E,EAAOzG,KAIX,SAAS4E,EAAOixB,GAGd,OAFIA,GAAO9zB,IAAUA,EAAM8zB,KAAMA,EAAM,MACnCA,GAAOtxB,EAAQ2wB,KAAK3wB,EAAQ2wB,IAAIpxB,KAAK+xB,GAClCA,EAGT,SAASC,EAAWjyB,EAAMxB,GACxB,IAAI0zB,EAAK1zB,EAAO8N,EAAO,MAAQ9N,KAAUoE,EAAKgpB,cAE9C,GAAItb,EAAM6G,SAAS+a,GAAI1a,OAAOoa,GAAkBx1B,QAAU,EACxD,OAAO,IAAI+0B,EAAUnxB,EAAM4C,EAAM,CAC/BnF,KAAMe,EAAOrD,EAAKgL,UAAU3H,GAAQwB,EACpCsQ,MAAO4hB,IAKb,IAAIC,EAAgBzxB,EAAQmrB,SACxBuG,EAAc1xB,EAAQwW,OACtBmb,EAAc3xB,EAAQ4L,OAE1B,GAAIylB,GAAa51B,KAAKwtB,UAAYwI,GAAiBC,GAAeC,GAAc,CAO9E,IANID,GAAeC,KACjB/lB,EAASnQ,KAAKmwB,uBAGhBvuB,EAAMo0B,GAAiBF,EAAW,aAAeG,GAAeH,EAAW,SAAU,YAEzEI,EAGV,IAFA,IAAIC,EAAS,CAAC,UAAW,WAAY,aAAc,cAAe,aAAc,YAAa,cAAe,gBAEnGr2B,EAAI,EAAGA,EAAI,IAAM8B,EAAK9B,IAC7B8B,EAAMk0B,EAAW,SAAUK,EAAOr2B,IAItC8B,EAAMgD,EAAOhD,GAWf,OARKA,IACHA,EAAM5B,KAAKs1B,iBAAiBnhB,EAAO5P,EAAS8mB,IAAeuK,GAAahxB,EAAO5E,KAAKo2B,aAAajiB,EAAO5P,EAAS8mB,EAAYrrB,KAAKuwB,mBAAqB,KAAOlF,EAAWrH,aAAaN,YAAc,MAGlM9hB,GAAOA,EAAIuS,QACbvS,EAAIuS,MAAQ+G,EAAOD,UAAUrZ,EAAIuS,QAG5BvS,GAETw0B,aAAc,SAAsBjiB,EAAO5P,GACzC,GAAIA,EAAQ8xB,MAAQr2B,KAAKs2B,WAAat2B,KAAKy0B,UAAUtgB,GAAQ,OAAO,IAAI6gB,EAAU,OAAQh1B,OAE5Fu2B,QAAS,SAAiBj1B,EAAMk1B,GAkB9B,IAAI3yB,SAAcvC,EAElB,GAAa,WAATuC,EAAmB,CACrB,IAAK,IAAInD,KAAOY,EACd,GAAIA,EAAKlB,eAAeM,KAASV,KAAKu2B,QAAQ71B,EAAKY,EAAKZ,IAAO,OAAO,EAGxE,OAAO,EACF,GAAa,aAATmD,EACT,OAAOvC,EAAKtB,MACP,GAAa,UAATsB,EACT,OAAOk1B,EAAQx2B,MAEf,IAAIc,EAAQ,qBAAqBsB,KAAKd,GAAQtB,KAAK,KAAOhB,EAAK0K,WAAWpI,MAAoB,SAATA,EAAkBtC,EAAKgL,UAAUhK,KAAK2D,QAAU3D,KAAKsB,GAE1I,GAAa,UAATA,EAAkB,CACpB,GAAuB,mBAAZk1B,EAAwB,OAAOx2B,gBAAgBw2B,EAC1D11B,EAAQd,KAAK2D,OAGf,GAAuB,mBAAZ6yB,EACT,QAASA,EAAQ11B,GACZ,GAAI01B,EAAS,CAClB,GAAIA,EAAQp0B,KACV,OAAOo0B,EAAQp0B,KAAKtB,GACf,GAAI9B,EAAKiD,cAAcu0B,GAC5B,OA3CN,SAASC,EAAY1xB,EAAMC,GACzB,IAAK,IAAIlF,KAAKiF,EACZ,GAAIA,EAAK3E,eAAeN,GAAI,CAC1B,IAAIkU,EAAOjP,EAAKjF,GACZmU,EAAOjP,EAAKlF,GAEhB,GAAId,EAAKiD,cAAc+R,IAAShV,EAAKiD,cAAcgS,IACjD,IAAKwiB,EAAYziB,EAAMC,GAAO,OAAO,OAChC,IAAKjV,EAAK8F,OAAOkP,EAAMC,GAC5B,OAAO,EAKb,OAAO,EA6BIwiB,CAAYD,EAAS11B,GAIhC,OAAO9B,EAAK8F,OAAOhE,EAAO01B,IAG9BvN,SAAU,SAAkB1kB,GAC1B,OAAOsE,EAAK4hB,UAAUzqB,KAAMuE,EAASvE,KAAKutB,UAE5C7C,QAAS,SAAiBnmB,GACxB,OAAOsE,EAAK4hB,UAAUzqB,KAAMuE,EAASvE,KAAKutB,QAAS,MAAM,GAAM,IAAM,MAEvEhrB,QAAS,CACPkoB,UAAW,SAASA,EAAU/iB,EAAMnD,EAAS2W,EAAQiQ,EAAOuL,GAC1D,IAAKvL,EAAO,CACV,IAAIvqB,EAAyB,iBAAZ2D,GAAwBA,EACrCoyB,EAAc/1B,GAAOA,EAAI+1B,YACzBC,EAASh2B,GAAOA,EAAIg2B,OAEpBxmB,GADAD,EAASwmB,GAAeC,IACPnb,EAAWrW,KAAK,CAAC+K,IAEtCgb,EAAQ,CACNliB,MAAO,GACP4tB,UAAWj2B,IAAyB,IAAlBA,EAAIi2B,UACtBD,SAAUA,EACVD,cAAeA,EACfvmB,KAAMA,EACN0mB,KAAMH,GAAe,IAAIhC,EAAKC,UAAU,CACtCrgB,UAAWnE,EACXrH,QAAQ,KAIRnI,IACF2D,EAAUvF,EAAK4F,OAAO,GAAIL,EAAS,CACjCsyB,WAAW,EACXD,QAAQ,EACRD,aAAa,KAKnB,IAAIpO,EAAW7gB,EAAK0f,UAChBne,EAAQkiB,EAAMliB,MAElBiS,GADI9K,EAAO+a,EAAM/a,QACC8K,GAAU,IAAImG,GAEhC,IAAK,IAAIvhB,EAAI,EAAGC,EAAIwoB,GAAYA,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC3D,IAAIu1B,EAAQ9M,EAASzoB,GACjBi3B,EAAc7b,GAAUA,EAAOsI,SAAS6R,EAAM9H,SAC9C9lB,GAAM,EAEV,GAAI2I,EAAM,CACR,IAAID,EAASklB,EAAMnlB,UAAU6mB,GAC7B,IAAK3mB,EAAKuQ,WAAWxQ,GAAS,SACxBC,EAAKsL,SAASvL,IAAWgb,EAAMwL,cAAgBxmB,EAAOuL,SAAStL,IAAS+a,EAAM2L,KAAKnW,WAAW0U,EAAO0B,MAAgBtvB,GAAM,GAGnI,GAAIA,GAAO4tB,EAAMkB,QAAQhyB,KACvB0E,EAAMnF,KAAKuxB,GACPqB,GAAW,MAOjB,IAJwB,IAApBvL,EAAM0L,WACRpM,EAAU4K,EAAO9wB,EAASwyB,EAAa5L,EAAOuL,GAG5CA,GAAaztB,EAAMhJ,OAAS,EAAG,MAGrC,OAAOgJ,KAGV,CACD7E,WAAY,SAAoBC,GAC9B,IAAIzC,EAAM5C,EAAKoF,WAAWC,EAAMrE,MAChC,OAAO4B,IAAQ5B,KAAOA,KAAK2yB,SAAS/wB,GAAOA,GAE7C+wB,SAAU,SAAkBjrB,GAC1B,OAAO1H,KAAKwqB,YAAY3rB,EAAW6I,IAErC8iB,YAAa,SAAqBnhB,EAAO3B,GACvC,IAAI9F,EAAM8F,EAAO1H,KAAKg3B,eAAe3tB,EAAO,CAAC3B,IAAS,KACtD,OAAO9F,GAAOA,EAAI,IAEpBmxB,YAAa,SAAqB9pB,GAChC,OAAOjJ,KAAKg3B,eAAeh3B,KAAKonB,UAAUnnB,OAAQgJ,IAEpD+tB,eAAgB,SAAwB3tB,EAAOJ,GAC7C,IAAIsf,EAAWvoB,KAAKonB,UAEpB,GAAImB,GAAYtf,GAASA,EAAMhJ,OAAS,EAAG,CAIzC,IAFA,IAAIg3B,EAAW,GAENn3B,GAHTmJ,EAAQjK,EAAKI,MAAM6J,IAGAhJ,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC1C,IACI6H,GADAD,EAAOuB,EAAMnJ,KACA4H,EAAKhE,KAEjBgE,GAAQuvB,EAAStvB,GACpBsB,EAAMG,OAAOtJ,EAAG,IAEhB4H,EAAKwiB,SAAQ,GAAO,GAEpB+M,EAAStvB,IAAM,GAInB3I,EAAKoK,OAAOmf,EAAUtf,EAAOI,EAAO,GAIpC,IAHA,IAAI6C,EAAUlM,KAAKkuB,SACfgJ,EAAahrB,EAAQkc,SAETroB,GAAPD,EAAI,EAAOmJ,EAAMhJ,QAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAI4H,EACApG,GADAoG,EAAOuB,EAAMnJ,IACD8D,MAChB8D,EAAK8lB,QAAUxtB,KAEf0H,EAAKyiB,YAAYje,GAAS,GAEtB5K,GAAMoG,EAAK0iB,QAAQ9oB,GACnB41B,GAAYxvB,EAAKua,SAAS,GAGhCjiB,KAAKiiB,SAAS,SAEdhZ,EAAQ,KAGV,OAAOA,GAETohB,YAAa,eACb8M,UAAW,SAAmBzvB,EAAM0jB,GAClC,IAAI3O,EAAQ/U,GAAQA,EAAKinB,YACrB/sB,EAAM8F,IAAS1H,MAAQyc,EAAQzc,KAAO,KAQ1C,OANI4B,IACFA,EAAIsoB,SAAQ,GAAO,GAEnBzN,EAAM4N,YAAY3iB,EAAK8B,OAAS4hB,EAAQxpB,IAGnCA,GAET6xB,YAAa,SAAqB/rB,GAChC,OAAO1H,KAAKm3B,UAAUzvB,EAAM,IAE9B0vB,YAAa,SAAqB1vB,GAChC,OAAO1H,KAAKm3B,UAAUzvB,EAAM,IAE9B2vB,WAAY,WACV,IAAI5a,EAAQzc,KAAK2uB,YAEjB,OAAOlS,EAAQA,EAAM4N,YAAY,EAAGrqB,MAAQ,MAE9Cs3B,aAAc,WACZ,IAAI7a,EAAQzc,KAAK2uB,YAEjB,OAAOlS,EAAQA,EAAM4N,YAAYxrB,EAAWmB,MAAQ,MAEtDu3B,UAAW,YACXC,aAAc,SAAsB9vB,GAClC,OAAO1H,KAAKwqB,YAAY,EAAG9iB,IAE7B+vB,UAAW,eACXC,UAAW,eACXC,MAAO,SAAelb,GACpB,OAAOA,EAAM4N,YAAYxrB,EAAWmB,OAEtC43B,OAAQ,SAAgBnb,GACtB,OAAOzc,KAAK+C,OAAM,GAAO40B,MAAMlb,IAEjCob,OAAQ,SAAgBtzB,GACtB,IAAIgkB,EAAWvoB,KAAKonB,UAEpB,GAAImB,GAAgC,IAApBA,EAAStoB,OAAc,CACrC,IAAIo1B,EAAQ9M,EAAS,GAAGsP,OAAOtzB,GAS/B,OAPIvE,KAAKwtB,SACP6H,EAAM5B,YAAYzzB,MAClBA,KAAKsJ,UAEL+rB,EAAM/rB,SAGD+rB,EAGT,OAAOr1B,MAET0uB,aAAc,WACZ,IAAIjS,EAAQzc,KAAK2uB,YAEjB,GAAIlS,EAAO,CACT,IAAI8L,EAAW9L,EAAM2K,UACjBwH,EAAgBnS,EAAM4K,eACtB/lB,EAAOtB,KAAK4D,MACZk0B,EAAalJ,EAActtB,GAC3B+H,EAAQyuB,EAAaA,EAAWttB,QAAQxK,OAAS,GAEtC,IAAXqJ,IACEkf,EAASjnB,IAAStB,aAAauoB,EAASjnB,GAC5Cw2B,EAAW1uB,OAAOC,EAAO,GAErByuB,EAAW73B,OACbsoB,EAASjnB,GAAQw2B,EAAW,UAErBlJ,EAActtB,MAK7B4oB,QAAS,SAAiBgN,EAAYa,GACpC,IAAItb,EAAQzc,KAAK2uB,YACbziB,EAAUlM,KAAKkuB,SACf7kB,EAAQrJ,KAAKwJ,OAIjB,OAFIxJ,KAAKytB,QAAQztB,KAAKytB,OAAOuK,aAEzBvb,IACEzc,KAAK4D,OAAO5D,KAAK0uB,eAER,MAATrlB,IACE6C,EAAQob,eAAiBtnB,OAAMkM,EAAQob,aAAetnB,KAAKkzB,kBAAoBlzB,KAAKmzB,sBACxFn0B,EAAKoK,OAAOqT,EAAM2K,UAAW,KAAM/d,EAAO,IAG5CrJ,KAAKuL,gBAAe,GAEhB2rB,GAAchrB,EAAQkc,UAAUpoB,KAAKiiB,SAAS,GAC9C8V,GAActb,EAAMwF,SAAS,GAAIjiB,MACrCA,KAAKwtB,QAAU,MACR,IAKXlkB,OAAQ,WACN,OAAOtJ,KAAKkqB,SAAQ,GAAM,IAE5B+N,YAAa,SAAqBvwB,GAChC,IAAI4Z,EAAK5Z,GAAQA,EAAK0vB,YAAYp3B,MAElC,OADIshB,GAAIthB,KAAKsJ,SACNgY,GAETwR,eAAgB,SAAwBztB,EAAO/B,GAC7C,IAAKtD,KAAKonB,UAAW,OAAO,KAC5B/hB,EAAQA,GAAS,EACjB/B,EAAMtE,EAAKiE,KAAKK,EAAKtD,KAAKonB,UAAUnnB,QAGpC,IAFA,IAAIwJ,EAAUzK,EAAKoK,OAAOpJ,KAAKonB,UAAW,KAAM/hB,EAAO/B,EAAM+B,GAEpDvF,EAAI2J,EAAQxJ,OAAS,EAAGH,GAAK,EAAGA,IACvC2J,EAAQ3J,GAAGoqB,SAAQ,GAAM,GAI3B,OADIzgB,EAAQxJ,OAAS,GAAGD,KAAKiiB,SAAS,IAC/BxY,GAETyF,MAAO,kBACPgpB,gBAAiB,WACf,GAAIl4B,KAAKonB,UAAW,CAClBpnB,KAAKonB,UAAU+Q,UAEf,IAAK,IAAIr4B,EAAI,EAAGC,EAAIC,KAAKonB,UAAUnnB,OAAQH,EAAIC,EAAGD,IAChDE,KAAKonB,UAAUtnB,GAAG0J,OAAS1J,EAG7BE,KAAKiiB,SAAS,MAGlBzB,QAAS,SAAiB6B,GACxB,IAAIkG,EAAWvoB,KAAKonB,UAChBgR,EAAc7P,EAAWA,EAAStoB,OAAS,EAE/C,GAAIoiB,EAAa,CACf,IAAK,IAAIviB,EAAI,EAAGA,EAAIs4B,EAAat4B,IAC/B,IAAKyoB,EAASzoB,GAAG0gB,QAAQ6B,GACvB,OAAO,EAIX,OAAO,EAGT,OAAQ+V,GAEVC,WAAY,WAGV,IAFA,IAAI3wB,EAAO1H,KAEJ0H,GAAM,CACX,IAAKA,EAAKqkB,UAAYrkB,EAAKwkB,QAAS,OAAO,EAC3CxkB,EAAOA,EAAK8lB,QAGd,OAAO,GAET8I,QAAS,WACP,OAAOt2B,KAAK6uB,WAAWyH,WAEzBnF,UAAW,WACT,OAAOnxB,KAAK6uB,WAAWsC,aAEzBmH,UAAW,WACT,OAAOt4B,KAAK6uB,WAAWyJ,aAEzBC,UAAW,SAAmB7wB,GAC5B,SAAS8wB,EAAQ9wB,GACf,IAAItE,EAAO,GAEX,GACEA,EAAKyE,QAAQH,SACNA,EAAOA,EAAK8lB,SAErB,OAAOpqB,EAMT,IAHA,IAAIq1B,EAAQD,EAAQx4B,MAChB04B,EAAQF,EAAQ9wB,GAEX5H,EAAI,EAAGC,EAAImR,KAAKD,IAAIwnB,EAAMx4B,OAAQy4B,EAAMz4B,QAASH,EAAIC,EAAGD,IAC/D,GAAI24B,EAAM34B,IAAM44B,EAAM54B,GACpB,OAAO24B,EAAM34B,GAAG0J,OAASkvB,EAAM54B,GAAG0J,OAAS,GAAK,EAIpD,OAAO,GAETmvB,YAAa,WACX,OAAO34B,KAAKonB,WAAapnB,KAAKonB,UAAUnnB,OAAS,GAEnDypB,WAAY,WACV,QAAO1pB,KAAKwtB,SAAUxtB,KAAKwtB,QAAQ9D,cAErCkP,QAAS,SAAiBlxB,GACxB,OAAiC,IAA1B1H,KAAKu4B,UAAU7wB,IAExBmxB,QAAS,SAAiBnxB,GACxB,OAAgC,IAAzB1H,KAAKu4B,UAAU7wB,IAExBoxB,SAAU,SAAkBpxB,GAC1B,OAAO1H,KAAKwtB,UAAY9lB,GAE1BqxB,QAAS,SAAiBrxB,GACxB,OAAOA,GAAQA,EAAK8lB,UAAYxtB,MAElCg5B,aAAc,SAAsBtxB,GAGlC,IAFA,IAAIgmB,EAAS1tB,KAEN0tB,EAASA,EAAOF,SACrB,GAAIE,IAAWhmB,EAAM,OAAO,EAG9B,OAAO,GAETuxB,WAAY,SAAoBvxB,GAC9B,QAAOA,GAAOA,EAAKsxB,aAAah5B,OAElCk5B,UAAW,SAAmBxxB,GAC5B,OAAO1H,KAAKwtB,UAAY9lB,EAAK8lB,SAE/B2L,cAAe,SAAuBzxB,GAGpC,IAFA,IAAIgmB,EAAS1tB,KAAKwtB,QAEXE,GAAQ,CACb,GAAIA,EAAOF,SAAW,+BAA+BprB,KAAKsrB,EAAO/pB,SAAW+D,EAAKsxB,aAAatL,GAAS,OAAO,EAC9GA,EAASA,EAAOF,QAGlB,OAAO,IAERxuB,EAAK8D,KAAK,CAAC,SAAU,QAAS,QAAS,SAAS,SAAUpC,GAC3D,IAAIoa,EAAiB,WAARpa,EAEbV,KAAKU,GAAO,WACV,IAAI6H,EAAO/H,UACPM,GAASga,EAAS9b,EAAO8Z,GAAO1T,KAAKmD,GACrCwS,EAASjC,EAAM1T,KAAKmD,EAAM,EAAG,CAC/B5C,UAAU,IAEZ,OAAO3F,KAAKib,WAAU,IAAIoG,GAAS3gB,GAAKI,EAAOia,GAAU/a,KAAKyvB,aAAY,QAE3E,CACDjN,UAAW,WACT,IAAIJ,EAAK,IAAIf,EACb,OAAOrhB,KAAKib,UAAUmH,EAAGI,UAAU3f,MAAMuf,EAAI5hB,aAE/Cya,UAAW,SAAmBC,EAAQke,EAAmB9W,GACvD,IAAIiL,EAAUvtB,KAAKutB,QACf8L,EAAkBne,IAAWA,EAAOqH,aACpCzW,EAAcwW,GAAmBtiB,KAAK4rB,iBAAmB5rB,KAAKmiB,eAAiBkX,IAAoB9L,EAAQhL,cAAgB6W,GAAqBp5B,KAAKonB,WACzJ,IAAKiS,IAAoBvtB,EAAa,OAAO9L,KAE7C,GAAIq5B,EAAiB,EACdne,EAAOgJ,gBAAkBqJ,EAAQrJ,iBAAgBqJ,EAAQoD,QAAUpD,EAAQrL,aAEhFqL,EAAQlK,QAAQnI,GAAQ,GAExB,IAAIwN,EAAQ1oB,KAAKytB,OACb6L,EAAY5Q,EAAM6Q,cAAa,GAC/BC,EAAc9Q,EAAM+Q,gBAAe,GACnCH,GAAWA,EAAUre,UAAUC,GAC/Bse,GAAaA,EAAYve,UAAUC,GAGzC,GAAIpP,IAAgBA,EAAc9L,KAAK05B,kBAAkBnM,EAAS6L,EAAmB9W,IAAmB,CACtG,IAAIiK,EAAQvsB,KAAK8rB,OACbS,GAAOgB,EAAQpS,gBAAgBoR,EAAOA,GAAO,GAEjDgB,EAAQ1L,OAAM,GAEVS,GAAmBtiB,KAAK4rB,kBAAiB5rB,KAAKmiB,cAAe,GAGnE,IAAIhS,EAASnQ,KAAKmuB,QACduB,EAAW1vB,KAAKouB,WAEhBiL,GAAmBvtB,IACrB9L,KAAKiiB,SAAS,IAGhB,IAAI0X,EAASN,GAAmBlpB,GAAU+K,EAAOwJ,YAEjD,GAAIiV,GAAUA,EAAO1U,QAAQ9O,UAAYwjB,EAAO5U,SAAW,IAAO,EAAG,CACnE,IAAK,IAAIrkB,KAAOyP,EAAQ,CACtB,IAAIqhB,EAAQrhB,EAAOzP,GAEnB,GAAI8wB,EAAMN,kBACD/gB,EAAOzP,QACT,GAAIoL,IAAgB0lB,EAAMpQ,SAAU,CACzC,IAAIhR,EAAOohB,EAAMphB,KAEjB8K,EAAOqJ,iBAAiBnU,EAAMA,IAIlCpQ,KAAKmuB,QAAUhe,EAEf,IAAI8gB,EAAS9gB,EAAOnQ,KAAK8wB,mBAAmB9wB,KAAKswB,gBAAkB,KAE/DW,IACFjxB,KAAKouB,UAAYpuB,KAAK2vB,uBAAuBsB,EAAO7gB,YAE7CipB,GAAmB3J,GAAY1vB,KAAK8rB,SAC7C9rB,KAAKouB,UAAYlT,EAAOC,gBAAgBuU,EAAUA,IAGpD,OAAO1vB,MAET05B,kBAAmB,SAA2Bxe,EAAQ0e,EAAkBzH,GACtE,IAAI5J,EAAWvoB,KAAKonB,UAEpB,GAAImB,EAAU,CACZ,IAAK,IAAIzoB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAGmb,UAAUC,EAAQ0e,EAAkBzH,GAGlD,OAAO,IAGX0H,cAAe,WACb,OAAO75B,KAAK+xB,iBAAgB,GAAMtN,kBAAkB3L,EAAM1T,KAAK5E,aAEjEs5B,cAAe,WACb,OAAO95B,KAAK+xB,iBAAgB,GAAM5W,gBAAgBrC,EAAM1T,KAAK5E,aAE/Du5B,cAAe,WACb,OAAO/5B,KAAKutB,QAAQ9I,kBAAkB3L,EAAM1T,KAAK5E,aAEnDw5B,cAAe,WACb,OAAOh6B,KAAKutB,QAAQpS,gBAAgBrC,EAAM1T,KAAK5E,aAEjDy5B,UAAW,SAAmB1lB,EAAW8hB,GACvC9hB,EAAYkH,EAAWrW,KAAK5E,WAC5B,IAAI2P,EAASnQ,KAAKkQ,YACdgqB,EAAY/pB,EAAOpB,OAASoB,EAAOrB,MACnCqrB,EAAY5lB,EAAUxF,OAASwF,EAAUzF,MACzC6K,GAAS0c,EAAO6D,EAAYC,EAAYD,EAAYC,GAAa5lB,EAAUzF,MAAQqB,EAAOrB,MAAQyF,EAAUxF,OAASoB,EAAOpB,OAC5HqrB,EAAY,IAAI3e,EAAW,IAAI3C,EAAS,IAAI4E,EAAKvN,EAAOrB,MAAQ6K,EAAOxJ,EAAOpB,OAAS4K,IAC3FygB,EAAU9Z,UAAU/L,EAAU8L,aAC9BrgB,KAAK0wB,UAAU0J,MAEf,CACFC,WAAY,SAAoB9tB,EAAK4e,EAAOE,GAC1C,IAAI3C,EAAQ1oB,KAAKytB,OACbvS,EAASlb,KAAKutB,QAMlB,GAJI7E,EAAM4N,YACR/pB,EAAI+tB,UAAY5R,EAAM6Q,eAAegB,cAAchuB,EAAK2O,IAGtDwN,EAAMyI,YAAa,CACrB5kB,EAAIiuB,YAAc9R,EAAM+Q,iBAAiBc,cAAchuB,EAAK2O,GAC5D3O,EAAIkuB,UAAY/R,EAAMgS,iBACtB,IAAIC,EAAajS,EAAMkS,gBACnBC,EAAYnS,EAAMoS,eAClBC,EAAarS,EAAMsS,gBAKvB,GAJIL,IAAYpuB,EAAI0uB,SAAWN,GAC3BE,IAAWtuB,EAAI2uB,QAAUL,GACzBE,IAAYxuB,EAAIwuB,WAAaA,GAE7BnvB,GAAMU,QAAQI,WAAY,CAC5B,IAAIyuB,EAAYzS,EAAM0S,eAClBC,EAAa3S,EAAM4S,gBAEnBH,GAAaA,EAAUl7B,SACrB,gBAAiBsM,GACnBA,EAAIgvB,YAAYJ,GAChB5uB,EAAIivB,eAAiBH,IAErB9uB,EAAIkvB,QAAUN,EACd5uB,EAAImvB,cAAgBL,KAM5B,GAAI3S,EAAM4P,YAAa,CACrB,IAAIrN,EAAaE,EAAMF,YAAc,EACjC7I,EAAKiJ,EAAWrH,aAAaX,SAAQ,IAAIhC,GAAS1H,MAAMsR,EAAYA,IACpE0Q,EAAOvZ,EAAGnH,UAAU,IAAInC,EAAM4P,EAAMkT,gBAAiB,IACrDxQ,EAAShJ,EAAGnH,UAAUjb,KAAK67B,mBAE/BtvB,EAAIuvB,YAAcpT,EAAMqT,iBAAiBxB,cAAchuB,GACvDA,EAAIyvB,WAAaL,EAAKriB,YACtB/M,EAAI0vB,cAAgB7Q,EAAOhX,EAC3B7H,EAAI2vB,cAAgB9Q,EAAO/W,IAG/B2W,KAAM,SAAcze,EAAK4e,EAAOgR,GACVn8B,KAAK4nB,eAAiB5nB,KAAKkuB,SAAStG,eACxD,GAAK5nB,KAAK+rB,UAA8B,IAAlB/rB,KAAKisB,SAA3B,CACA,IAAIX,EAAWH,EAAMG,SACjBD,EAAaF,EAAME,WACnBnQ,EAASlb,KAAKutB,QACd6O,EAAe9Q,EAASA,EAASrrB,OAAS,GAAGujB,SAAStI,GAC1D,GAAKkhB,EAAalY,eAAlB,CACAmH,EAAaA,EAAaA,EAAW7H,SAAS4Y,GAAgBA,EAC9D9Q,EAASxnB,KAAKs4B,GAEVjR,EAAMI,eACRvrB,KAAKsuB,cAAgB8N,GAGvB,IAMIC,EACAC,EACAC,EARA9P,EAAYzsB,KAAKgsB,WACjBU,EAAUlY,EAAUU,MAAMlV,KAAKisB,SAAU,EAAG,GAC5CuQ,EAA4B,WAAd/P,EACdgQ,EAAc7vB,GAAUC,YAAY4f,GACpCiQ,EAASF,GAA2B,IAAZ9P,GAAiBvB,EAAMwR,WAAaxR,EAAMyR,OAASH,GAAeD,GAAe9P,EAAU,IAAM1sB,KAAK68B,gBAC9H5R,EAAaE,EAAMF,YAAc,EAKrC,IAAKyR,EAAQ,CACX,IAAIvsB,EAASnQ,KAAK+vB,gBAAgB1E,GAElC,IAAKlb,EAAOrB,QAAUqB,EAAOpB,OAE3B,YADAuc,EAASwR,MAIXP,EAAapR,EAAMC,OACnBkR,EAAanR,EAAMC,OAASjb,EAAO+jB,aAAaC,QAChDkI,EAAU9vB,EACVA,EAAMC,GAAeC,WAAW0D,EAAO6O,UAAUsV,OAAO7sB,IAAI,GAAG2T,SAAS6P,IACrD,IAAfA,GAAkB1e,EAAIoN,MAAMsR,EAAYA,GAG9C1e,EAAI2e,OACJ,IAAI6R,EAAeZ,EAAqBA,EAAmB3Y,SAAStI,GAAUlb,KAAK6rB,kBAAoB7rB,KAAKuwB,kBAAiB,IAASlF,EAClIuR,GAAQF,GAAUvR,EAAM6R,SACxB/hB,GAAa8hB,GAAgBH,EAmBjC,GAjBIF,GACFnwB,EAAI0wB,YAAcvQ,EACd+P,IAAalwB,EAAI2wB,yBAA2BzQ,IACvCxR,GACT1O,EAAIiW,WAAW8Z,EAAWloB,GAAIkoB,EAAWjoB,GAGvC4G,IACDyhB,EAASxhB,EAASmQ,GAAYjG,eAAe7Y,GAG5CqwB,GACFzR,EAAM6R,SAAShS,KAAKze,EAAK4e,EAAM1oB,OAAO,CACpCm6B,MAAM,KAING,EAAc,CAChBxwB,EAAI4wB,aAAalS,EAAY,EAAG,EAAGA,EAAY,EAAG,GAClD,IAAIG,EAASD,EAAMC,OACfA,GAAQ7e,EAAIiW,WAAW4I,EAAOhX,GAAIgX,EAAO/W,GAG/CrU,KAAKo9B,MAAM7wB,EAAK4e,EAAOE,EAAY0R,GAEnCxwB,EAAIif,UACJF,EAASwR,MAEL3R,EAAMyR,OAASzR,EAAMkS,YACvB9wB,EAAIqwB,KAAK58B,KAAKs9B,eAGXZ,IACH9vB,GAAU2wB,QAAQ9Q,EAAWlgB,EAAK8vB,EAAS3P,EAAS4P,EAAWthB,SAASuhB,GAAYnhB,SAAS6P,IAC7Fze,GAAeM,QAAQP,GACvB4e,EAAMC,OAASmR,MAGnBiB,WAAY,SAAoBC,GAC9B,IAAI/P,EAAS1tB,KAAKwtB,QAClB,GAAIE,aAAkBgQ,EAAc,OAAOhQ,EAAO8P,WAAWC,GAC7D,IAAIE,EAAU39B,KAAK4nB,iBAAmB6V,EAOtC,OALKE,GAAWjQ,GAAUA,EAAO3B,UAAY2B,EAAO8P,WAAWC,KAC7Dz9B,KAAK4nB,eAAiB6V,EACtBE,GAAU,GAGLA,GAETjS,eAAgB,SAAwBnf,EAAK2O,EAAQ5G,EAAMkV,EAAgBiU,GACzE,IAAIhU,EAAYzpB,KAAKqd,WACjBugB,EAA2B,EAAZnU,EACfoU,EAA6B,EAAZpU,GAAiBmU,GAAgB59B,KAAKqsB,cACvDyR,EAA+B,EAAZrU,EAGvB,GAFKzpB,KAAK+9B,gBAAeH,GAAe,IAEnCA,GAAgBC,GAAkBC,IAAqB99B,KAAKw9B,WAAWC,GAAgB,CAC1F,IAAIzT,EACAgU,EAAQh+B,KAAKi+B,kBAAiB,KAAUjU,EAAQhqB,KAAKwyB,aAAexI,EAAMiU,kBAAiB,GAC3F7b,EAAKlH,EAAOsI,SAASxjB,KAAK+xB,iBAAgB,IAC1CmM,EAAO5pB,EAAO,EAIlB,GAHA/H,EAAIiuB,YAAcjuB,EAAI+tB,UAAY0D,EAAQA,EAAMzD,cAAchuB,GAAO,UACjEqxB,GAAc59B,KAAK+9B,cAAcxxB,EAAK6V,EAAIoH,GAE1CsU,EAAkB,CACpB,IAAIK,EAAMn+B,KAAKyvB,aAAY,GACvB/B,EAAS1tB,KAAKwtB,QACdrZ,EAAQuZ,EAASA,EAAOoM,cAAcqE,GAAOA,EAC7C/pB,EAAID,EAAMC,EACVC,EAAIF,EAAME,EACd9H,EAAI6xB,YACJ7xB,EAAI8xB,IAAIjqB,EAAGC,EAAG6pB,EAAM,EAAa,EAAVhtB,KAAK4I,IAAQ,GACpCvN,EAAIyjB,SAKJ,IAJA,IAAIsO,EAAS,CAAC,CAAC,GAAI,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,EAAE,EAAG,IACxCj5B,EAAQ64B,EACR56B,EAAMgR,EAAO,EAERxU,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIy+B,EAAQD,EAAOx+B,GACfkX,EAAKunB,EAAM,GACX7X,EAAK6X,EAAM,GACfhyB,EAAIiyB,OAAOpqB,EAAI4C,EAAK3R,EAAOgP,EAAIqS,EAAKrhB,GACpCkH,EAAIkyB,OAAOrqB,EAAI4C,EAAK1T,EAAK+Q,EAAIqS,EAAKpjB,GAClCiJ,EAAIyjB,UAIR,GAAI6N,EAAgB,CAClB,IAAIvZ,EAASlC,EAAGiC,kBAAkBrkB,KAAKmwB,qBAEvC5jB,EAAI6xB,YAEJ,IAASt+B,EAAI,EAAGA,EAAI,EAAGA,IACrByM,EAAKzM,EAAe,SAAX,UAAqBwkB,EAAOxkB,GAAIwkB,IAASxkB,IAGpDyM,EAAImyB,YACJnyB,EAAIyjB,SAEJ,IAASlwB,EAAI,EAAGA,EAAI,EAAGA,IACrByM,EAAIoyB,SAASra,EAAOxkB,GAAKo+B,EAAM5Z,IAASxkB,GAAKo+B,EAAM5pB,EAAMA,MAKjEuoB,cAAe,WACb,OAAO,IAER79B,EAAK8D,KAAK,CAAC,OAAQ,OAAQ,KAAM,SAAS,SAAUpC,GACrDV,KAAK,WAAahB,EAAK0K,WAAWhJ,IAAQ,WACxC,IAAIk+B,EAAO,GAEX,OADAA,EAAKl+B,IAAO,EACLV,KAAK2qB,SAASiU,MAEtB,CACDjU,SAAU,SAAkB/pB,GAC1B,IAAK,IAAIU,KAAQV,EACf,GAAIA,EAAIU,GAAO,CACb,IAAIZ,EAAM,QAAUY,EAChB4K,EAAUlM,KAAKkuB,SACftD,EAAO1e,EAAQ2e,YAAc3e,EAAQ2e,aAAe,GACxDD,EAAKlqB,GAAOkqB,EAAKlqB,IAAQ,GACzBkqB,EAAKlqB,GAAKV,KAAK0D,KAAO1D,KAI1B,OAAOA,QAEP,CACF6+B,MAAO,SAAergB,EAAMC,EAAIla,GACzBA,IACHA,EAAUka,EACVA,EAAKD,EACLA,EAAO,KAEFja,IACHA,EAAUka,EACVA,EAAK,OAIT,IAAIqgB,EAASv6B,GAAWA,EAAQu6B,OAC5Bz5B,EAAQd,GAAWA,EAAQc,MAC3B05B,EAAsB,MAAXx6B,IAAuC,iBAAZA,EAAuBA,EAAUA,EAAQw6B,UAC/EF,EAAQ,IAAIG,GAAMh/B,KAAMwe,EAAMC,EAAIsgB,EAAUD,EAAQz5B,GAcxD,OAJI05B,GACF/+B,KAAKkK,GAAG,SATV,SAAS8iB,EAAQjiB,GACf8zB,EAAMI,aAA0B,IAAbl0B,EAAMm0B,MAEpBL,EAAMM,SACTn/B,KAAK0K,IAAI,QAASsiB,MAQf6R,GAETO,QAAS,SAAiB3gB,EAAIla,GAC5B,OAAOvE,KAAK6+B,MAAM,KAAMpgB,EAAIla,IAE9B86B,UAAW,SAAmB7gB,EAAMja,GAClC,OAAOvE,KAAK6+B,MAAMrgB,EAAM,KAAMja,MAG9BspB,EAAQhlB,EAAKpG,OAAO,CACtBkB,OAAQ,QACR0oB,eAAe,EACfC,iBAAiB,EACjBX,iBAAkB,CAChBpD,SAAU,IAEZ3lB,WAAY,SAAe+D,GACzB3G,KAAKonB,UAAY,GACjBpnB,KAAKqnB,eAAiB,GACjBrnB,KAAKqtB,YAAY1mB,IAAM3G,KAAK+yB,YAAY9tB,MAAMC,QAAQyB,GAAOA,EAAMnG,YAE1EyhB,SAAU,SAASA,EAAS4F,GAC1B5F,EAASngB,KAAK5B,KAAKF,KAAM6nB,GAEb,KAARA,IACF7nB,KAAKs/B,UAAYzgC,IAGrB0gC,aAAc,WACZ,IAAIvC,EAAWh9B,KAAKs/B,UAEpB,GAAItC,IAAan+B,EAAW,CAC1Bm+B,EAAW,KAGX,IAFA,IAAIzU,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C,GAAIyoB,EAASzoB,GAAGssB,UAAW,CACzB4Q,EAAWzU,EAASzoB,GACpB,MAIJE,KAAKs/B,UAAYtC,EAGnB,OAAOA,GAETwC,UAAW,WACT,QAASx/B,KAAKu/B,gBAEhBE,WAAY,SAAoBC,GAC9B,IAAIrK,EAAQr1B,KAAKgzB,gBACbqC,GAAOA,EAAMjG,YAAYsQ,IAE/B9O,WAAY,SAASA,EAAW1V,EAAQ3W,GACtC,IAAIy4B,EAAWh9B,KAAKu/B,eAEpB,OAAOvC,EAAWA,EAASvM,iBAAiBuM,EAASzP,QAAQ9J,UAAUvI,GAASlc,EAAKqB,IAAI,GAAIkE,EAAS,CACpGyrB,QAAQ,KACJY,EAAW9uB,KAAK5B,KAAKF,KAAMkb,EAAQ3W,IAE3C+wB,iBAAkB,SAASA,EAAiBnhB,EAAO5P,EAAS8mB,GAC1D,IAAI2R,EAAWh9B,KAAKu/B,eAEpB,QAASvC,GAAYA,EAASthB,SAASvH,KAAWmhB,EAAiBxzB,KAAK5B,KAAKF,KAAMmU,EAAO5P,EAAS8mB,EAAY2R,IAEjHI,MAAO,SAAe7wB,EAAK4e,GACzB,IAAIyR,EAAOzR,EAAMyR,KACbI,GAAYJ,GAAQ58B,KAAKu/B,eAE7BpU,EAAQA,EAAM1oB,OAAO,CACnBu6B,SAAUA,EACVJ,MAAM,IAGJA,GACFrwB,EAAI6xB,YACJjT,EAAMwR,UAAYxR,EAAMkS,YAAa,GAC5BL,GACTA,EAAShS,KAAKze,EAAK4e,EAAM1oB,OAAO,CAC9Bm6B,MAAM,KAMV,IAFA,IAAIrU,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAI4H,EAAO6gB,EAASzoB,GAChB4H,IAASs1B,GAAUt1B,EAAKsjB,KAAKze,EAAK4e,OAIxCriB,EAAQ+kB,EAAMprB,OAAO,CACvBkB,OAAQ,QACRf,WAAY,WACVirB,EAAMhrB,MAAM7C,KAAMQ,YAEpBmuB,UAAW,WACT,OAAO3uB,KAAKwtB,SAA0B,MAAfxtB,KAAKwJ,QAAkBxJ,KAAKkuB,UAErDxE,WAAY,SAASA,IACnB,OAAO1pB,KAAKwtB,QAAU9D,EAAW5nB,KAAK5B,KAAKF,MAAuB,MAAfA,KAAKwJ,QAE1DyF,SAAU,WACRjP,KAAKkuB,SAAS5G,aAAetnB,MAE/Bo2B,aAAc,eAEZuJ,EAAQ92B,EAAKpG,OAAO,CACtBkB,OAAQ,QACRwe,cAAc,EACdyJ,iBAAiB,EACjBC,iBAAiB,EACjBF,iBAAkB,CAChB9nB,KAAM,KACNyQ,KAAM,KACNsrB,OAAQ,MAEVh9B,WAAY,SAAe8B,EAAOyP,GAChCnU,KAAKqtB,YAAY3oB,EAAOyP,IAE1Bif,QAAS,SAAiB1rB,GACxB,OAAO1H,KAAK6/B,QAAUn4B,EAAKm4B,OAAS7/B,KAAK8/B,MAAMh7B,OAAO4C,EAAKo4B,QAAU9gC,EAAK8F,OAAO9E,KAAK+/B,QAASr4B,EAAKq4B,UAEtGvM,YAAa,SAAqBntB,GAChCrG,KAAKggC,QAAQ35B,EAAOw5B,OACpB7/B,KAAKmf,QAAQ9Y,EAAOy5B,OACpB9/B,KAAKigC,UAAU55B,EAAO05B,UAExBG,QAAS,WACP,OAAOlgC,KAAK6/B,OAEdG,QAAS,SAAiBn8B,GACxB7D,KAAK6/B,MAAQh8B,GAEfs8B,SAAU,WACVC,SAAU,WACVphB,QAAS,WACP,IAAI1K,EAAOtU,KAAK8/B,MAChB,OAAO,IAAI/hB,EAAWzJ,EAAKxF,MAAOwF,EAAKvF,OAAQ/O,KAAM,YAEvDmf,QAAS,WACP,IAAI7K,EAAOoJ,EAAKtY,KAAK5E,WAErB,GAAKR,KAAK8/B,OAEH,IAAK9/B,KAAK8/B,MAAMh7B,OAAOwP,GAAO,CACnC,IAAIzQ,EAAO7D,KAAK6/B,MACZ/wB,EAAQwF,EAAKxF,MACbC,EAASuF,EAAKvF,OAEL,cAATlL,EACF7D,KAAK+/B,QAAQ1/B,IAAIqd,EAAKzM,IAAIjR,KAAK+/B,QAASzrB,EAAK+G,OAAO,GAAG1G,QACrC,WAAT9Q,GACTiL,EAAQC,GAAUD,EAAQC,GAAU,EACpC/O,KAAK+/B,QAAUjxB,EAAQ,GACL,YAATjL,GACT7D,KAAK+/B,QAAQ5mB,KAAKrK,EAAQ,EAAGC,EAAS,GAGxC/O,KAAK8/B,MAAM3mB,KAAKrK,EAAOC,GAEvB/O,KAAKiiB,SAAS,SAjBdjiB,KAAK8/B,MAAQxrB,EAAKvR,SAoBtBs9B,UAAW,WACT,IAAIC,EAAMtgC,KAAK+/B,QACf,MAAsB,WAAf//B,KAAK6/B,MAAqBS,EAAM,IAAIviB,EAAWuiB,EAAIxxB,MAAOwxB,EAAIvxB,OAAQ/O,KAAM,cAErFigC,UAAW,SAAmBL,GAC5B,IAAI/7B,EAAO7D,KAAK6/B,MAEhB,GAAa,WAATh8B,EAAmB,CACrB,GAAI+7B,IAAW5/B,KAAK+/B,QAAS,OAC7B,IAAIzrB,EAAgB,EAATsrB,EACX5/B,KAAK+/B,QAAUH,EAEf5/B,KAAK8/B,MAAM3mB,KAAK7E,EAAMA,QAItB,GAFAsrB,EAASliB,EAAKtY,KAAK5E,WAEdR,KAAK+/B,QAEH,CACL,GAAI//B,KAAK+/B,QAAQj7B,OAAO86B,GAAS,OAIjC,GAFA5/B,KAAK+/B,QAAQ1/B,IAAIu/B,GAEJ,cAAT/7B,EAAsB,CACpByQ,EAAOoJ,EAAKvM,IAAInR,KAAK8/B,MAAOF,EAAOxkB,SAAS,IAEhDpb,KAAK8/B,MAAMz/B,IAAIiU,OACG,YAATzQ,GACT7D,KAAK8/B,MAAM3mB,KAAoB,EAAfymB,EAAO9wB,MAA2B,EAAhB8wB,EAAO7wB,aAX3C/O,KAAK+/B,QAAUH,EAAO78B,QAgB1B/C,KAAKiiB,SAAS,IAEhBzB,QAAS,WACP,OAAO,GAET+f,OAAQ,SAAgBx3B,GACtB,IAAI+tB,EAAO,IAAInC,EAAK31B,EAAK0K,WAAW1J,KAAK6/B,SAAQ,CAC/C9kB,OAAQ,IAAIjC,EACZxE,KAAMtU,KAAK8/B,MACXF,OAAQ5/B,KAAK+/B,QACbh3B,QAAQ,IAKV,OAHA+tB,EAAKvD,eAAevzB,MAChB4L,GAAMC,SAASC,aAAagrB,EAAK3E,gBAAe,IAChDppB,IAAWlK,GAAakK,IAAQ+tB,EAAKrD,YAAYzzB,MAC9C82B,GAET0J,QAAS,SACT9L,YAAa,WACX,OAAO10B,KAAKugC,QAAO,IAErBnD,MAAO,SAAe7wB,EAAK4e,EAAOE,EAAY0R,GAC5C,IAAIrU,EAAQ1oB,KAAKytB,OACb6I,EAAU5N,EAAM4N,UAChBnF,EAAYzI,EAAMyI,YAClBsP,EAAYtV,EAAMkS,YAAclS,EAAMyR,KACtC8D,GAAiB3D,EAErB,GAAIzG,GAAWnF,GAAasP,EAAW,CACrC,IAAI58B,EAAO7D,KAAK6/B,MACZD,EAAS5/B,KAAK+/B,QACdY,EAAoB,WAAT98B,EAGf,GAFKsnB,EAAMwR,WAAWpwB,EAAI6xB,YAEtBsC,GAAiBC,EACnBp0B,EAAI8xB,IAAI,EAAG,EAAGuB,EAAQ,EAAa,EAAV1uB,KAAK4I,IAAQ,OACjC,CACL,IAAI8mB,EAAKD,EAAWf,EAASA,EAAO9wB,MAChC+xB,EAAKF,EAAWf,EAASA,EAAO7wB,OAChCuF,EAAOtU,KAAK8/B,MACZhxB,EAAQwF,EAAKxF,MACbC,EAASuF,EAAKvF,OAElB,GAAI2xB,GAA0B,cAAT78B,GAA+B,IAAP+8B,GAAmB,IAAPC,EACvDt0B,EAAI6D,MAAMtB,EAAQ,GAAIC,EAAS,EAAGD,EAAOC,OACpC,CACL,IAAIqF,EAAItF,EAAQ,EACZuF,EAAItF,EAAS,EACb+xB,EAAQ,mBACRC,EAAKH,EAAKE,EACVE,EAAKH,EAAKC,EACV1rB,EAAI,EAAEhB,GAAIC,EAAIwsB,GAAKzsB,GAAIC,EAAI2sB,GAAK5sB,EAAI2sB,GAAK1sB,GAAID,EAAIwsB,GAAKvsB,EAAGD,EAAIwsB,GAAKvsB,EAAGD,EAAI2sB,GAAK1sB,EAAGD,GAAIC,EAAI2sB,EAAI5sB,GAAIC,EAAIwsB,EAAIzsB,EAAGC,EAAIwsB,EAAIzsB,EAAGC,EAAI2sB,EAAI5sB,EAAI2sB,EAAI1sB,EAAGD,EAAIwsB,EAAIvsB,GAAID,EAAIwsB,EAAIvsB,GAAID,EAAI2sB,EAAI1sB,GAAID,EAAGC,EAAI2sB,GAAK5sB,EAAGC,EAAIwsB,GACjM9D,GAAcA,EAAa9hB,UAAU7F,EAAGA,EAAG,IAC/C7I,EAAIiyB,OAAOppB,EAAE,GAAIA,EAAE,IACnB7I,EAAI00B,cAAc7rB,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAC9ChB,IAAMwsB,GAAIr0B,EAAIkyB,OAAOrpB,EAAE,GAAIA,EAAE,IACjC7I,EAAI00B,cAAc7rB,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,KACnDf,IAAMwsB,GAAIt0B,EAAIkyB,OAAOrpB,EAAE,IAAKA,EAAE,KAClC7I,EAAI00B,cAAc7rB,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,KACnDhB,IAAMwsB,GAAIr0B,EAAIkyB,OAAOrpB,EAAE,IAAKA,EAAE,KAClC7I,EAAI00B,cAAc7rB,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,MAI3D7I,EAAImyB,YAGD+B,IAAcnK,IAAWnF,IAC5BnxB,KAAKq6B,WAAW9tB,EAAK4e,EAAOE,GAExBiL,IACF/pB,EAAI8pB,KAAK3N,EAAM4U,eACf/wB,EAAIuvB,YAAc,iBAGhB3K,GAAW5kB,EAAIyjB,WAGvB6M,cAAe,WACb,QAAS78B,KAAKs2B,WAAat2B,KAAKmxB,cAElCP,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAI6L,EAAO,IAAIqL,EAAWzb,KAAK8/B,OAAOxf,UAAU,EAAG,GAC/CoI,EAAQ1oB,KAAKytB,OACbhC,EAAclnB,EAAQyrB,QAAUtH,EAAMyI,aAAezI,EAAMgS,iBAE/D,OADIxf,IAAQ9K,EAAO8K,EAAOqJ,iBAAiBnU,IACpCqb,EAAcrb,EAAK4Q,OAAO2T,EAAKgB,kBAAkBlK,EAAazrB,KAAKoxB,iBAAiBlW,EAAQ3W,KAAa6L,IAEjH,IAAI,WACL,SAAS8wB,EAAgBz6B,EAAM0N,EAAO6M,GACpC,IAAI4e,EAASn5B,EAAKs5B,QAElB,IAAKH,EAAOzpB,SAGV,IAFA,IAAIgrB,EAAW16B,EAAKq5B,MAAMzkB,OAAO,GAExBzF,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,IAAIwrB,EAAM,IAAItoB,EAAMlD,EAAI,GAAKA,EAAI,GAAK,EAAI,EAAGA,EAAI,GAAK,EAAI,GACtDyrB,EAASD,EAAIhmB,SAAS+lB,GACtBpmB,EAASsmB,EAAOrmB,SAASomB,EAAIhmB,SAASwkB,IAE1C,GADW,IAAInkB,EAAWuF,EAASqgB,EAAO55B,IAAI25B,EAAIhmB,SAAS4F,IAAWqgB,EAAQtmB,GACrEW,SAASvH,GAAQ,MAAO,CAC/BA,MAAO4G,EACPumB,SAAU1rB,IAMlB,SAAS2rB,EAAkBptB,EAAOyrB,EAAQ4B,EAASF,GACjD,IAAIG,EAASttB,EAAMkH,OAAOukB,GAC1B,QAAS0B,GAAYG,EAAOxlB,aAAaqlB,KAAcG,EAAOzmB,SAASymB,EAAO7mB,aAAaQ,SAASwkB,GAAQvkB,OAAOmmB,GAASvhC,QAAU,EAGxI,MAAO,CACLw0B,UAAW,SAASA,EAAUtgB,GAC5B,GAAmB,cAAfnU,KAAK6/B,MAAuB,CAC9B,IAAI9kB,EAASmmB,EAAgBlhC,KAAMmU,GACnC,OAAO4G,EAAS5G,EAAM6G,SAASD,EAAO5G,OAAOkH,OAAOrb,KAAK+/B,SAASzmB,aAAe,EAAImb,EAAU3yB,KAAK5B,KAAKF,KAAMmU,GAE/G,OAAOA,EAAMkH,OAAOrb,KAAKsU,MAAMgF,aAAe,IAGlD8c,aAAc,SAASA,EAAajiB,EAAO5P,EAAS8mB,EAAY0R,GAC9D,IAAIlH,GAAM,EACNnN,EAAQ1oB,KAAKytB,OACbiU,EAAYn9B,EAAQyrB,QAAUtH,EAAMyI,YACpCwQ,EAAUp9B,EAAQ8xB,MAAQ3N,EAAM4N,UAEpC,GAAIoL,GAAaC,EAAS,CACxB,IAAI99B,EAAO7D,KAAK6/B,MACZD,EAAS5/B,KAAK+/B,QACd6B,EAAeF,EAAYhZ,EAAMgS,iBAAmB,EAAI,EACxDmH,EAAgBt9B,EAAQmxB,kBAAkBjuB,IAAIktB,EAAKgB,kBAAkBiM,GAAelZ,EAAM6H,oBAAsBwM,IAEpH,GAAa,cAATl5B,EAAsB,CACxB,IAAI29B,EAAUK,EAAczmB,SAAS,GACjCL,EAASmmB,EAAgBlhC,KAAMmU,EAAOqtB,GAE1C,GAAIzmB,EACF8a,EAAM0L,EAAkBptB,EAAM6G,SAASD,EAAO5G,OAAQyrB,EAAQiC,EAAe9mB,EAAOumB,cAC/E,CACL,IAAIlxB,EAAO,IAAIqL,EAAWzb,KAAK8/B,OAAOxf,UAAU,EAAG,GAC/CwhB,EAAQ1xB,EAAK4Q,OAAOwgB,GACpBO,EAAQ3xB,EAAK4Q,OAAOwgB,EAAQjmB,UAChCsa,EAAMiM,EAAMphB,eAAevM,KAAW4tB,EAAMrhB,eAAevM,SAG7D0hB,EAAM0L,EAAkBptB,EAAOyrB,EAAQiC,GAI3C,OAAOhM,EAAM,IAAIb,EAAU0M,EAAY,SAAW,OAAQ1hC,MAAQo2B,EAAat0B,KAAKe,MAAM7C,KAAMQ,cAGjG,CACH+B,QAAS,IAAI,WACX,SAASy/B,EAAYn+B,EAAMsQ,EAAOG,EAAMsrB,EAAQr3B,GAC9C,IAAIb,EAAO1I,EAAKK,OAAOsgC,EAAMn9B,WAO7B,OANAkF,EAAKm4B,MAAQh8B,EACb6D,EAAKo4B,MAAQxrB,EACb5M,EAAKq4B,QAAUH,EAEfl4B,EAAK2lB,YAAYruB,EAAKmH,SAASoC,GAAO4L,GAE/BzM,EAGT,MAAO,CACLu6B,OAAQ,WACN,IAAI15B,EAAO/H,UACPua,EAASjC,EAAM5S,UAAUqC,EAAM,UAC/Bq3B,EAAS5gC,EAAKkH,UAAUqC,EAAM,UAClC,OAAOy5B,EAAY,SAAUjnB,EAAQ,IAAI2C,EAAc,EAATkiB,GAAaA,EAAQr3B,IAErEqsB,UAAW,WACT,IAAIrsB,EAAO/H,UACP4P,EAAOqL,EAAWvV,UAAUqC,EAAM,aAClCq3B,EAASliB,EAAKzM,IAAIyM,EAAKxX,UAAUqC,EAAM,UAAW6H,EAAK4O,SAAQ,GAAM3D,OAAO,IAEhF,OAAO2mB,EAAY,YAAa5xB,EAAKiQ,WAAU,GAAOjQ,EAAK4O,SAAQ,GAAO4gB,EAAQr3B,IAEpF25B,QAAS,WACP,IAAI35B,EAAO/H,UACP2hC,EAAUxC,EAAMyC,aAAa75B,GAC7Bq3B,EAASuC,EAAQvC,OAErB,OAAOoC,EAAY,UAAWG,EAAQpnB,OAAQ6kB,EAAOxkB,SAAS,GAAIwkB,EAAQr3B,IAE5E65B,aAAc,SAAsB75B,GAClC,IAAIwS,EAAQ6kB,EAEZ,GAAI5gC,EAAK4H,SAAS2B,EAAM,UACtBwS,EAASjC,EAAM5S,UAAUqC,EAAM,UAC/Bq3B,EAASliB,EAAKxX,UAAUqC,EAAM,cACzB,CACL,IAAI6H,EAAOqL,EAAWvV,UAAUqC,EAAM,aAEtCwS,EAAS3K,EAAKiQ,WAAU,GACxBuf,EAASxvB,EAAK4O,SAAQ,GAAM3D,OAAO,GAGrC,MAAO,CACLN,OAAQA,EACR6kB,OAAQA,QAMd7L,EAASlrB,EAAKpG,OAAO,CACvBkB,OAAQ,SACRwe,cAAc,EACdyJ,iBAAiB,EACjB0E,eAAgB,CACdN,QAAQ,EACRE,QAAQ,GAEVvE,iBAAkB,CAChB0W,YAAa,KACbh8B,OAAQ,MAEVxB,YAAa,CAAC,eACdy9B,WAAY,MACZphC,OAAO,EACP0B,WAAY,SAAgByD,EAAQqpB,GAClC,IAAK1vB,KAAKqtB,YAAYhnB,EAAQqpB,IAAa7wB,GAAaia,EAAM1T,KAAK5E,YAAa,CAC9E,IAAI+hC,EACA1+B,SAAcwC,EACdm8B,EAAkB,WAAT3+B,EAAoB9E,EAAS0jC,eAAep8B,GAAmB,WAATxC,EAAoBwC,EAAS,KAEhG,GAAIm8B,GAAUA,IAAW35B,EAAK0hB,UAC5B,GAAIiY,EAAO/1B,YAAsC,MAAxB+1B,EAAOE,cAC9BH,EAAQC,OACH,GAAIA,EAAQ,CACjB,IAAIluB,EAAOoJ,EAAKtY,KAAK5E,WAEhB8T,EAAK6B,WACRosB,EAAQ/1B,GAAewC,UAAUsF,IAKnCiuB,EACFviC,KAAK2iC,SAASJ,GAEdviC,KAAK4iC,UAAUv8B,GAIdrG,KAAK8/B,QACR9/B,KAAK8/B,MAAQ,IAAIpiB,EACjB1d,KAAK6iC,SAAU,IAGnBzP,QAAS,SAAiB1rB,GACxB,OAAO1H,KAAKsG,cAAgBoB,EAAKpB,aAEnCktB,YAAa,SAAqBntB,GAChC,IAAIk8B,EAAQl8B,EAAOy8B,OACfC,EAAS18B,EAAO28B,QAEpB,GAAIT,EACFviC,KAAKijC,UAAUV,QACV,GAAIQ,EAAQ,CACjB,IAAIG,EAAa12B,GAAewC,UAAU3I,EAAOy5B,OACjDoD,EAAWz2B,WAAW,MAAM02B,UAAUJ,EAAQ,EAAG,GAEjD/iC,KAAKijC,UAAUC,GAGjBljC,KAAKojC,aAAe/8B,EAAO+8B,cAE7BpkB,QAAS,WACP,IAAI1K,EAAOtU,KAAK8/B,MAChB,OAAO,IAAI/hB,EAAWzJ,EAAOA,EAAKxF,MAAQ,EAAGwF,EAAOA,EAAKvF,OAAS,EAAG/O,KAAM,YAE7Emf,QAAS,SAAiB2gB,EAAOuD,GAC/B,IAAI/uB,EAAOoJ,EAAKtY,KAAK5E,WAErB,GAAK8T,EAAKxP,OAAO9E,KAAK8/B,OAaXuD,GACTrjC,KAAKkP,aAbL,GAAIoF,EAAKxF,MAAQ,GAAKwF,EAAKvF,OAAS,EAAG,CACrC,IAAIJ,GAAW00B,GAAUrjC,KAAKsjC,aAE9BtjC,KAAKijC,UAAUz2B,GAAewC,UAAUsF,IAEpC3F,GACF3O,KAAKyM,YAAW,GAAM02B,UAAUx0B,EAAS,EAAG,EAAG2F,EAAKxF,MAAOwF,EAAKvF,aAG9D/O,KAAKgjC,SAASx2B,GAAeM,QAAQ9M,KAAKgjC,SAC9ChjC,KAAK8/B,MAAQxrB,EAAKvR,SAMxBmb,SAAU,WACR,OAAOle,KAAK8/B,MAAQ9/B,KAAK8/B,MAAMhxB,MAAQ,GAEzCqP,SAAU,SAAkBrP,GAC1B9O,KAAKmf,QAAQrQ,EAAO9O,KAAKoe,cAE3BA,UAAW,WACT,OAAOpe,KAAK8/B,MAAQ9/B,KAAK8/B,MAAM/wB,OAAS,GAE1CsP,UAAW,SAAmBtP,GAC5B/O,KAAKmf,QAAQnf,KAAKke,WAAYnP,IAEhCw0B,UAAW,WACT,OAAOvjC,KAAK6iC,SAEdriB,QAAS,WACP,IAAIlM,EAAOtU,KAAK8/B,MAChB,OAAQxrB,GAAuB,IAAfA,EAAKxF,OAA+B,IAAhBwF,EAAKvF,QAE3CilB,cAAe,WACb,IAAI9Y,EAASlb,KAAKutB,QACdmG,EAAO,IAAI5a,EAAM,EAAG,GAAGmC,UAAUC,GACjCsoB,EAAI,IAAI1qB,EAAM,EAAG,GAAGmC,UAAUC,GAAQF,SAAS0Y,GAC/C9lB,EAAI,IAAIkL,EAAM,EAAG,GAAGmC,UAAUC,GAAQF,SAAS0Y,GACnD,OAAO,IAAIhW,EAAK,GAAK8lB,EAAElqB,YAAa,GAAK1L,EAAE0L,cAE7CmqB,OAAQ,iBACRC,SAAU,WACR,OAAO1jC,KAAK8iC,QAEdH,SAAU,SAAkBJ,GAC1B,IAAI97B,EAAOzG,KAEX,SAAS8K,EAAKC,GACZ,IAAI+c,EAAOrhB,EAAK2H,UACZvK,EAAOkH,GAASA,EAAMlH,MAAQ,OAE9BikB,GAAQrhB,EAAK0E,SAAStH,KACxB+H,GAAQkc,EAAKrY,OACbhJ,EAAKqE,KAAKjH,EAAM,IAAI8/B,EAAM54B,KAI9B/K,KAAKijC,UAAUV,GAEXviC,KAAK6iC,QACPe,WAAW94B,EAAM,GACRy3B,GACTsB,EAASp8B,IAAI86B,EAAO,CAClBuB,KAAM,SAAc/4B,GAClBtE,EAAKw8B,UAAUV,GAEfz3B,EAAKC,IAEPg5B,MAAOj5B,KAIbm4B,UAAW,SAAmBV,GACxBviC,KAAKgjC,SAASx2B,GAAeM,QAAQ9M,KAAKgjC,SAE1CT,GAASA,EAAM91B,YACjBzM,KAAK8iC,OAAS,KACd9iC,KAAKgjC,QAAUT,EACfviC,KAAK6iC,SAAU,IAEf7iC,KAAK8iC,OAASP,EACdviC,KAAKgjC,QAAU,KACfhjC,KAAK6iC,WAAaN,GAASA,EAAM9hC,KAAO8hC,EAAMyB,WAGhDhkC,KAAK8/B,MAAQ,IAAIpiB,EAAK6kB,EAAQA,EAAM0B,cAAgB1B,EAAMzzB,MAAQ,EAAGyzB,EAAQA,EAAMG,eAAiBH,EAAMxzB,OAAS,GACnH/O,KAAKkkC,SAAW,KAEhBlkC,KAAKiiB,SAAS,OAEhBjT,UAAW,WACT,IAAKhP,KAAKgjC,QAAS,CACjB,IAAIz2B,EAAMC,GAAeC,WAAWzM,KAAK8/B,OAEzC,IACM9/B,KAAK8iC,QAAQv2B,EAAI42B,UAAUnjC,KAAK8iC,OAAQ,EAAG,GAC/C9iC,KAAKgjC,QAAUz2B,EAAIw2B,OACnB,MAAOoB,GACP33B,GAAeM,QAAQP,IAI3B,OAAOvM,KAAKgjC,SAEdoB,UAAW,YACX33B,WAAY,SAAoB43B,GAS9B,OARKrkC,KAAKkkC,WAAUlkC,KAAKkkC,SAAWlkC,KAAKgP,YAAYvC,WAAW,OAE5D43B,IACFrkC,KAAK8iC,OAAS,KAEd9iC,KAAKiiB,SAAS,OAGTjiB,KAAKkkC,UAEdI,WAAY,SAAoBC,GAC9BvkC,KAAKkkC,SAAWK,GAElBj+B,UAAW,WACT,IAAIi8B,EAAQviC,KAAK8iC,OACjB,OAAOP,GAASA,EAAM9hC,KAAOT,KAAKwkC,aAEpC5B,UAAW,SAAmBniC,GAC5B,IAAI8hC,EAAQ,IAAI3jC,EAAK6lC,MACjBpC,EAAcriC,KAAKojC,aACnBf,IAAaE,EAAMF,YAAcA,GACjC5hC,IAAK8hC,EAAM9hC,IAAMA,GACrBT,KAAK2iC,SAASJ,IAEhBmC,eAAgB,WACd,IAAInC,EAAQviC,KAAK8iC,OACjB,OAAOP,GAASA,EAAMF,aAAeriC,KAAKojC,cAAgB,IAE5DuB,eAAgB,SAAwBtC,GACtCriC,KAAKojC,aAAef,EACpB,IAAIE,EAAQviC,KAAK8iC,OACbP,IAAOA,EAAMF,YAAcA,IAEjCuC,aAAc,WACZ,OAAO5kC,KAAKsiC,YAEduC,aAAc,SAAsBC,GAClC9kC,KAAKsiC,WAAkC,iBAAdwC,EAAyBA,EAAYA,EAAY,MAAQ,MAElF9kC,KAAKiiB,SAAS,MAEhBqhB,WAAY,WACV,OAAOtjC,KAAKgjC,SAAWhjC,KAAK6iC,SAAW7iC,KAAK8iC,SAE7C,CACD5hC,OAAO,EACP6jC,aAAc,WACZ,IAAI30B,EAAOqL,EAAWrW,KAAK5E,WACvB+L,EAAMC,GAAeC,WAAW2D,EAAK4O,WAGzC,OADAzS,EAAI42B,UAAUnjC,KAAKgP,YAAaoB,EAAKgE,EAAGhE,EAAKiE,EAAGjE,EAAKtB,MAAOsB,EAAKrB,OAAQ,EAAG,EAAGqB,EAAKtB,MAAOsB,EAAKrB,QACzFxC,EAAIw2B,QAEbiC,aAAc,WACZ,IAAI50B,EAAOqL,EAAWrW,KAAK5E,WACvBszB,EAAS,IAAIC,EAAOlrB,EAAK0hB,WAS7B,OAPAuJ,EAAOmP,UAAUjjC,KAAK+kC,aAAa30B,IAEnC0jB,EAAOtR,UAAUpS,EAAKiQ,YAAYrF,SAAShb,KAAKgf,UAAU3D,OAAO,KAEjEyY,EAAOvG,QAAQlK,QAAQrjB,KAAKutB,SAE5BuG,EAAOL,YAAYzzB,MACZ8zB,GAET0Q,UAAW,WACT,IAAIjC,EAAQviC,KAAK8iC,OACbriC,EAAM8hC,GAASA,EAAM9hC,IACzB,GAAI,SAAS2B,KAAK3B,GAAM,OAAOA,EAC/B,IAAIsiC,EAAS/iC,KAAKgP,YAClB,OAAO+zB,EAASA,EAAOyB,UAAU3hC,MAAMkgC,EAAQviC,WAAa,MAE9D2iC,UAAW,SAAmBZ,GAC5B,IAAIpuB,EAAQ2E,EAAM1T,KAAK5E,UAAW,GAClCR,KAAKyM,YAAW,GAAM02B,UAAUZ,EAAOpuB,EAAMC,EAAGD,EAAME,IAExD4wB,gBAAiB,SAAyBzC,GACxC,IAAIryB,EAAQ2mB,EAeZ,GAbK0L,EAEMA,aAAkB0C,GAC3BpO,EAAO0L,EACPryB,EAASqyB,EAAOtyB,aACW,iBAAXsyB,IACZ,UAAWA,EACbryB,EAAS,IAAIsL,EAAW+mB,GACf,MAAOA,IAChBryB,EAAS,IAAIsL,EAAW+mB,EAAOpuB,EAAI,GAAKouB,EAAOnuB,EAAI,GAAK,EAAG,KAR7DlE,EAASnQ,KAAKkQ,aAYXC,EAAQ,OAAO,KACpB,IACIrB,EAAQoC,KAAKD,IAAId,EAAOrB,MADX,IAEbC,EAASmC,KAAKD,IAAId,EAAOpB,OAFZ,IAGbxC,EAAMwnB,EAAOoR,eAEZ54B,EAGHA,EAAI64B,UAAU,EAAG,EAAGC,GAAgBA,IAFpC94B,EAAMwnB,EAAOoR,eAAiB34B,GAAeC,WAAW,IAAIiR,EAN7C,KAWjBnR,EAAI2e,OACJ,IAAIhQ,GAAS,IAAImG,GAAS1H,MAAM7K,EAAQqB,EAAOrB,MAAOC,EAASoB,EAAOpB,QAAQyT,WAAWrS,EAAOiE,GAAIjE,EAAOkE,GAC3G6G,EAAOkK,eAAe7Y,GAClBuqB,GAAMA,EAAK9L,KAAKze,EAAK,IAAIvN,EAAK,CAChC49B,MAAM,EACNtR,SAAU,CAACpQ,MAGblb,KAAKutB,QAAQnI,eAAe7Y,GAE5B,IAAIoC,EAAU3O,KAAKsjC,aACfhvB,EAAOtU,KAAK8/B,MACZnxB,GAASpC,EAAI42B,UAAUx0B,GAAU2F,EAAKxF,MAAQ,GAAIwF,EAAKvF,OAAS,GACpExC,EAAIif,UAKJ,IAJA,IAAI8Z,EAAS/4B,EAAIg5B,aAAa,GAAK,GAAKr0B,KAAKojB,KAAKxlB,GAAQoC,KAAKojB,KAAKvlB,IAAS+d,KACzE0Y,EAAW,CAAC,EAAG,EAAG,GAClBC,EAAQ,EAEH3lC,EAAI,EAAGC,EAAIulC,EAAOrlC,OAAQH,EAAIC,EAAGD,GAAK,EAAG,CAChD,IAAI4lC,EAAQJ,EAAOxlC,EAAI,GACvB2lC,GAASC,EACTA,GAAS,IACTF,EAAS,IAAMF,EAAOxlC,GAAK4lC,EAC3BF,EAAS,IAAMF,EAAOxlC,EAAI,GAAK4lC,EAC/BF,EAAS,IAAMF,EAAOxlC,EAAI,GAAK4lC,EAGjC,IAAS5lC,EAAI,EAAGA,EAAI,EAAGA,IACrB0lC,EAAS1lC,IAAM2lC,EAGjB,OAAOA,EAAQE,EAAMvgC,KAAKogC,GAAY,MAExCI,SAAU,WACR,IAAIzxB,EAAQ2E,EAAM1T,KAAK5E,WACnBssB,EAAO9sB,KAAKyM,aAAa84B,aAAapxB,EAAMC,EAAGD,EAAME,EAAG,EAAG,GAAGyY,KAClE,OAAO,IAAI6Y,EAAM,MAAO,CAAC7Y,EAAK,GAAK,IAAKA,EAAK,GAAK,IAAKA,EAAK,GAAK,KAAMA,EAAK,GAAK,MAEnF+Y,SAAU,WACR,IAAIt9B,EAAO/H,UACP2T,EAAQ2E,EAAM1T,KAAKmD,GACnBy1B,EAAQ2H,EAAMvgC,KAAKmD,GACnBu9B,EAAa9H,EAAM+H,SAAS,OAC5BL,EAAQ1H,EAAMgI,OACdz5B,EAAMvM,KAAKyM,YAAW,GACtBw5B,EAAY15B,EAAI25B,gBAAgB,EAAG,GACnCpZ,EAAOmZ,EAAUnZ,KAErBA,EAAK,GAAqB,IAAhBgZ,EAAW,GACrBhZ,EAAK,GAAqB,IAAhBgZ,EAAW,GACrBhZ,EAAK,GAAqB,IAAhBgZ,EAAW,GACrBhZ,EAAK,GAAc,MAAT4Y,EAAwB,IAARA,EAAc,IACxCn5B,EAAI45B,aAAaF,EAAW9xB,EAAMC,EAAGD,EAAME,IAE7CnF,MAAO,WACL,IAAIoF,EAAOtU,KAAK8/B,MAChB9/B,KAAKyM,YAAW,GAAM24B,UAAU,EAAG,EAAG9wB,EAAKxF,MAAQ,EAAGwF,EAAKvF,OAAS,IAEtEm3B,gBAAiB,WACf,IAAI5xB,EAAOoJ,EAAKtY,KAAK5E,WACrB,OAAOR,KAAKyM,aAAay5B,gBAAgB5xB,EAAKxF,MAAOwF,EAAKvF,SAE5Dw2B,aAAc,WACZ,IAAIn1B,EAAOqL,EAAWrW,KAAK5E,WAG3B,OADI4P,EAAKoQ,YAAWpQ,EAAO,IAAIqL,EAAWzb,KAAK8/B,QACxC9/B,KAAKyM,aAAa84B,aAAan1B,EAAKgE,EAAGhE,EAAKiE,EAAGjE,EAAKtB,MAAOsB,EAAKrB,SAEzEq3B,aAAc,SAAsBtZ,GAClC,IAAI3Y,EAAQ2E,EAAM1T,KAAK5E,UAAW,GAClCR,KAAKyM,YAAW,GAAM05B,aAAarZ,EAAM3Y,EAAMC,EAAGD,EAAME,IAE1Duc,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAI6L,EAAO,IAAIqL,EAAWzb,KAAK8/B,OAAOxf,UAAU,EAAG,GACnD,OAAOpF,EAASA,EAAOqJ,iBAAiBnU,GAAQA,GAElDgmB,aAAc,SAAsBjiB,GAClC,GAAInU,KAAKy0B,UAAUtgB,GAAQ,CACzB,IAAI1N,EAAOzG,KACX,OAAO,IAAIg1B,EAAU,QAASvuB,EAAM,CAClC2kB,OAAQjX,EAAM1M,IAAIhB,EAAKq5B,MAAMzkB,OAAO,IAAIvH,QACxCkqB,MAAO,CACLx8B,IAAK,WACH,OAAOiF,EAAKm/B,SAAS5lC,KAAKorB,cAMpCgS,MAAO,SAAe7wB,EAAK4e,EAAOE,GAChC,IAAI1c,EAAU3O,KAAKsjC,aAEnB,GAAI30B,GAAWA,EAAQG,MAAQ,GAAKH,EAAQI,OAAS,EAAG,CACtDxC,EAAI0wB,YAAczoB,EAAUU,MAAMlV,KAAKisB,SAAU,EAAG,GAEpDjsB,KAAKq6B,WAAW9tB,EAAK4e,EAAOE,GAE5B,IAAIyZ,EAAY9kC,KAAKsiC,WACjB+D,EAAyB,QAAdvB,EACfwB,EAAWC,YAAYh6B,EAAK85B,EAAW,wBAA0B,yBAAyBA,GAAmBvB,GAC7Gv4B,EAAI42B,UAAUx0B,GAAU3O,KAAK8/B,MAAMhxB,MAAQ,GAAI9O,KAAK8/B,MAAM/wB,OAAS,KAGvE8tB,cAAe,WACb,OAAO,KAGP1T,EAAatgB,EAAKpG,OAAO,CAC3BkB,OAAQ,aACRwe,cAAc,EACdyJ,iBAAiB,EACjB0E,eAAgB,CACdN,QAAQ,GAEVrE,iBAAkB,CAChBoC,OAAQ,MAEVnrB,WAAY,SAAoBmW,EAAMC,GAC/BhZ,KAAKqtB,YAAYtU,EAAMC,IAASna,GAAaia,EAAM1T,KAAK5E,UAAW,KAAKR,KAAKwmC,cAAcztB,aAAgB0tB,EAAmB1tB,EAAO,IAAI0tB,EAAiB1tB,KAEjKqa,QAAS,SAAiB1rB,GACxB,OAAO1H,KAAKqpB,cAAgB3hB,EAAK2hB,aAEnCmK,YAAa,SAAqBntB,GAChCrG,KAAKwmC,cAAcngC,EAAOgjB,cAE5Bqd,cAAe,WACb,OAAO1mC,KAAKqpB,aAEdmd,cAAe,SAAuBpd,GACpCppB,KAAKqpB,YAAcD,EAEnBppB,KAAKiiB,SAAS,IAEhB0kB,UAAW,iBACXC,UAAW,iBACXpmB,QAAS,WACP,OAAOxgB,KAAKqpB,YAAYgI,MAAM7Q,WAEhCoQ,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAImD,EAAO1H,KAAKqpB,YAAYgI,MAC5B,OAAO3pB,EAAK+oB,iBAAiB/oB,EAAK6lB,QAAQ9J,UAAUvI,GAAS3W,IAE/D6xB,aAAc,SAAsBjiB,EAAO5P,EAAS8mB,GAClD,IAAIgF,EAAO9rB,EAAQ9B,OAAO,CACxByyB,KAAK,IAGHtzB,EAAM5B,KAAKqpB,YAAYgI,MAAM0D,SAAS5gB,EAAOkc,EAAMhF,GAGvD,OADIzpB,IAAKA,EAAI8F,KAAO1H,MACb4B,GAETw7B,MAAO,SAAe7wB,EAAK4e,GACzBnrB,KAAKqpB,YAAYgI,MAAMrG,KAAKze,EAAK4e,MAGjCsb,EAAmBznC,EAAKyD,OAAO,CACjCkB,OAAQ,mBACRf,WAAY,SAA0B8E,EAAMm/B,GAC1C7mC,KAAK0D,IAAMiV,EAAInX,MACfxB,KAAKkM,QAAUN,GAAMM,QACjBxE,GAAM1H,KAAK8mC,QAAQp/B,EAAMm/B,IAE/B/+B,WAAY,SAAoBvD,EAAS4C,GACvC,OAAOA,EAAWM,IAAIzH,MAAM,WAC1B,OAAOhB,EAAKyF,UAAU,CAACzE,KAAK2D,OAAQ3D,KAAKqxB,OAAQ9sB,GAAS,EAAO4C,OAGrE8a,SAAU,SAAkB4F,GACd,EAARA,GAAWhf,EAAK0lB,kBAAkBvuB,MAC1B,EAAR6nB,GAAW7nB,KAAKkM,QAAQ+V,SAAS4F,IAEvC6C,QAAS,WACP,OAAO1qB,KAAKqxB,OAEdyV,QAAS,SAAiBp/B,EAAMq/B,GAC1Br/B,EAAKsmB,UAAStmB,EAAOA,EAAK3E,SAC1B/C,KAAKqxB,QAAOrxB,KAAKqxB,MAAMrD,QAAU,MACrChuB,KAAKqxB,MAAQ3pB,EACbA,EAAK4B,SACL5B,EAAK6V,aAAY,GACZwpB,GAAar/B,EAAKkoB,YAAY,IAAI9W,GACvCpR,EAAKsmB,QAAUhuB,KAEfA,KAAKiiB,SAAS,IAEhBykB,cAAe,WACfF,cAAe,WACfQ,MAAO,SAAetX,GACpB,OAAO,IAAIvG,EAAWnpB,KAAM0vB,IAE9B3sB,MAAO,WACL,OAAO,IAAI0jC,EAAiBzmC,KAAKqxB,MAAMtuB,OAAM,KAE/C+B,OAAQ,SAAgBipB,GACtB,OAAOA,IAAW/tB,MAAQ+tB,GAAU/tB,KAAKqxB,MAAMvsB,OAAOipB,EAAOsD,SAAU,KAGvE2D,EAAYh2B,EAAKyD,OAAO,CAC1BkB,OAAQ,YACRf,WAAY,SAAmBiB,EAAM6D,EAAMu/B,GACzCjnC,KAAK6D,KAAOA,EACZ7D,KAAK0H,KAAOA,EACRu/B,GAAQjnC,KAAKsC,OAAO2kC,IAE1B1kC,QAAS,CACPqmB,WAAY,SAAoBrgB,GAC9B,IAAIhE,EAAUgE,GAAQvJ,EAAKoG,KAAKmD,GAChC,OAAO,IAAIvJ,EAAK,CACd6E,KAAM,KACNoM,UAAWrE,GAAMC,SAASI,aAC1BoqB,MAAO9xB,EACPyrB,QAASzrB,EACT2iC,UAAW3iC,EACX4iC,SAAS,EACTC,MAAM,EACN1X,UAAU,EACV3U,QAAQ,EACR5K,QAAQ,EACRqlB,QAAQ,EACRhY,UAAU,GACTjZ,OAIL8iC,EAAUroC,EAAKyD,OAAO,CACxBkB,OAAQ,UACRzC,OAAO,EACPmc,WAAY,EACZza,WAAY,SAAiBmW,EAAMC,EAAMsF,EAAMC,EAAMgH,EAAM+hB,GACzD,IACInzB,EACAozB,EACAC,EACA/d,EAJAhS,EAAQjX,UAAUP,OAMlBwX,EAAQ,IACE,MAARsB,GAAgC,iBAATA,EACX,IAAVtB,GAAesB,GAAQ,UAAWA,GACpC5E,EAAQ4E,EAAK5E,MACbozB,EAAWxuB,EAAKwuB,SAChBC,EAAYzuB,EAAKyuB,UACjB/d,EAAY1Q,EAAK0Q,YAEjBtV,EAAQ4E,EACRwuB,EAAWvuB,EACXwuB,EAAYlpB,EACZmL,EAAYlL,IAGdpK,EAAQ,CAAC4E,EAAMC,GACfuuB,EAAWjpB,IAASzf,EAAY,CAACyf,EAAMC,GAAQ,KAC/CipB,EAAYjiB,IAAS1mB,EAAY,CAAC0mB,EAAM+hB,GAAQ,OAIpD,IAAIG,EAAatzB,EAAOnU,KAAM,UAC9B,IAAIynC,EAAaF,EAAUvnC,KAAM,aACjC,IAAIynC,EAAaD,EAAWxnC,KAAM,cAC9BypB,GAAWzpB,KAAKgvB,aAAavF,IAEnC3hB,WAAY,SAAoBvD,EAAS4C,GACvC,IAAIgN,EAAQnU,KAAK0nC,OACbje,EAAYzpB,KAAKqd,WACjBzc,EAAM6oB,GAAazpB,KAAK2nC,aAAe,CAACxzB,EAAOnU,KAAK4nC,UAAW5nC,KAAK6nC,YAAc1zB,EAEtF,OADIsV,GAAW7oB,EAAIkD,KAAK2lB,GACjBzqB,EAAKyF,UAAU7D,EAAK2D,GAAS,EAAM4C,IAE5C8a,SAAU,SAAkB9N,GAC1B,IAAI2iB,EAAO92B,KAAK8nC,MAChB,GAAKhR,EAAL,CACA,IAEIiR,EAFA/2B,EAAS8lB,EAAKkR,QACd3+B,EAAQrJ,KAAKwJ,OAGbwH,IACImD,GAASA,IAAUnU,KAAK0nC,QAAUvzB,IAAUnU,KAAK4nC,aAAeG,EAAQ1+B,EAAQ,EAAI2H,EAAO3H,EAAQ,GAAKytB,EAAKmR,QAAUj3B,EAAOA,EAAO/Q,OAAS,GAAK,OAAO8nC,EAAM9lB,WAChK9N,GAASA,IAAUnU,KAAK0nC,QAAUvzB,IAAUnU,KAAK6nC,cAAgBE,EAAQ/2B,EAAO3H,KAAS0+B,EAAM9lB,YAGvG6U,EAAK7U,SAAS,MAEhBpD,SAAU,WACR,OAAO7e,KAAK0nC,QAEd3oB,SAAU,WACR/e,KAAK0nC,OAAOrnC,IAAIyY,EAAM1T,KAAK5E,aAE7B0nC,YAAa,WACX,OAAOloC,KAAK4nC,WAEdO,YAAa,WACXnoC,KAAK4nC,UAAUvnC,IAAIyY,EAAM1T,KAAK5E,aAEhC4nC,aAAc,WACZ,OAAOpoC,KAAK6nC,YAEdQ,aAAc,WACZroC,KAAK6nC,WAAWxnC,IAAIyY,EAAM1T,KAAK5E,aAEjCmnC,WAAY,WACV,OAAQ3nC,KAAK4nC,UAAUzxB,WAAanW,KAAK6nC,WAAW1xB,UAEtDmyB,SAAU,WACR,IAAIf,EAAWvnC,KAAK4nC,UAChBJ,EAAYxnC,KAAK6nC,WACrB,OAAQN,EAASpxB,WAAaqxB,EAAUrxB,UAAYoxB,EAAS3rB,YAAY4rB,IAE3Ee,aAAc,WACZvoC,KAAK4nC,UAAUzuB,KAAK,EAAG,GAEvBnZ,KAAK6nC,WAAW1uB,KAAK,EAAG,IAE1B4V,aAAc,WACZ,OAAO/uB,KAAKqd,YAEd2R,aAAc,SAAsBvF,GAClC,IAAI+e,EAAexoC,KAAKqd,WACpByZ,EAAO92B,KAAK8nC,MAChB9nC,KAAKqd,WAAaoM,EAAYA,GAAa,EAEvCqN,GAAQrN,IAAc+e,IACxB1R,EAAKnN,iBAAiB3pB,KAAMwoC,EAAc/e,GAE1CqN,EAAK7U,SAAS,OAGlBxE,iBAAkB,SAA0BwR,EAAMzR,GAChD,IAAIiM,EAAYzpB,KAAKqd,WACrBrd,KAAKgvB,aAAaxR,EAAWiM,EAAYwF,EAAOxF,GAAawF,IAE/D7R,WAAY,WACV,SAA4B,EAAlBpd,KAAKqd,aAEjBE,YAAa,SAAqBC,GAChCxd,KAAKyd,iBAAiB,EAAGD,IAE3BmL,SAAU,WACR,OAAO3oB,KAAKwJ,SAAW3K,EAAYmB,KAAKwJ,OAAS,MAEnDi/B,QAAS,WACP,OAAOzoC,KAAK8nC,OAAS,MAEvBY,SAAU,WACR,IAAI5R,EAAO92B,KAAK8nC,MACZz+B,EAAQrJ,KAAKwJ,OAEjB,OAAIstB,GACEztB,EAAQ,IAAMytB,EAAKmR,SAAW5+B,IAAUytB,EAAK6R,UAAU1oC,OAAS,GAAGoJ,IAChEytB,EAAK8R,YAAYv/B,IAAU,MAG7B,MAETw/B,YAAa,WACX,IAAId,EAAQ/nC,KAAK0oC,WACjB,OAAOX,EAAQ,IAAIe,EAAcf,EAAO/nC,OAAS+nC,EAAMgB,UAAY,EAAI,GAAK,MAE9EC,QAAS,WACP,IAAI9B,EAAWlnC,KAAK8nC,OAAS9nC,KAAK8nC,MAAMa,UACxC,OAAOzB,IAAaA,EAASlnC,KAAKwJ,OAAS,IAAMxJ,KAAK8nC,MAAMG,SAAWf,EAAS,KAAO,MAEzF+B,OAAQ,SAAgB1kC,EAAS2kC,EAAQC,GACvC,IAAI9Y,EAAO9rB,GAAW,GAClBV,EAAOwsB,EAAKxsB,KACZulC,EAAS/Y,EAAK+Y,OACdvnC,EAAO7B,KAAKqpC,cACZ1qB,EAAO3e,KAAKgpC,UACZM,GAAMznC,GAAQ7B,MAAM0nC,OACpB6B,EAAKvpC,KAAK0nC,OACV8B,GAAM7qB,GAAQ3e,MAAM0nC,OACpB3kB,EAAKumB,EAAG5uB,YAAY6uB,GACpBrmB,EAAKqmB,EAAG7uB,YAAY8uB,GAExB,GAAK3lC,GAAiB,gBAATA,EAkBN,IAAa,cAATA,EAST,MAAM,IAAIie,MAAM,qBAAwBje,EAAO,oBAR/C,GAAIhC,GAAQ8c,EAAM,CAChB,IAAI8iB,EAAS6H,EAAGtuB,SAASwuB,GACrBlxB,EAAI8wB,IAAWvqC,EAAY,GAAMuqC,EACjCK,EAAInxB,EAAIyK,GAAMA,EAAKG,GAClBgmB,GAAQlpC,KAAKmoC,YAAY1G,EAAOrmB,SAASquB,IACzCN,GAAOnpC,KAAKqoC,aAAa5G,EAAOrmB,SAASquB,EAAInxB,SAxBjB,CACnC,IAAIpV,EAAIkmC,IAAWvqC,EAAY,GAAMuqC,EACjCM,EAAOx4B,KAAK2C,IAAIkP,EAAI7f,GACpBymC,EAAQD,EAAOA,EACfE,EAAO14B,KAAK2C,IAAIqP,EAAIhgB,GACpB2mC,EAAQD,EAAOA,EAEnB,IAAKV,GAAUrnC,EAAM,CACnB,IAAI2U,EAAI,EAAIqzB,EAAQ,EAAID,EAAOF,EAAOC,EAClCG,EAAI,EAAIF,GAAQA,EAAOF,GAC3B1pC,KAAKmoC,YAAkB,IAAN2B,EAAU,IAAIhxB,GAAO+wB,EAAQP,EAAG3sB,GAAKnG,EAAI+yB,EAAG5sB,GAAKgtB,EAAQH,EAAG7sB,IAAMmtB,EAAIP,EAAG5sB,IAAKktB,EAAQP,EAAG1sB,GAAKpG,EAAI+yB,EAAG3sB,GAAK+sB,EAAQH,EAAG5sB,IAAMktB,EAAIP,EAAG3sB,IAAM,IAAI9D,GAG/J,IAAKqwB,GAASxqB,EAAM,CACdnI,EAAI,EAAImzB,EAAQ,EAAID,EAAOE,EAAOC,EAClCC,EAAI,EAAIJ,GAAQA,EAAOE,GAC3B5pC,KAAKqoC,aAAmB,IAANyB,EAAU,IAAIhxB,GAAO6wB,EAAQH,EAAG7sB,GAAKnG,EAAI+yB,EAAG5sB,GAAKktB,EAAQP,EAAG3sB,IAAMmtB,EAAIP,EAAG5sB,IAAKgtB,EAAQH,EAAG5sB,GAAKpG,EAAI+yB,EAAG3sB,GAAKitB,EAAQP,EAAG1sB,IAAMktB,EAAIP,EAAG3sB,IAAM,IAAI9D,MAcpKuwB,YAAa,WACX,IAAInC,EAAWlnC,KAAK8nC,OAAS9nC,KAAK8nC,MAAMa,UACxC,OAAOzB,IAAaA,EAASlnC,KAAKwJ,OAAS,IAAMxJ,KAAK8nC,MAAMG,SAAWf,EAASA,EAASjnC,OAAS,KAAO,MAE3GmI,QAAS,WACP,OAAQpI,KAAKwJ,QAEfugC,OAAQ,WACN,IAAIjT,EAAO92B,KAAK8nC,MAChB,OAAOhR,GAAQ92B,KAAKwJ,SAAWstB,EAAK6R,UAAU1oC,OAAS,IAAK,GAE9Dk4B,QAAS,WACP,IAAIoP,EAAWvnC,KAAK4nC,UAChBJ,EAAYxnC,KAAK6nC,WACjBxvB,EAAMkvB,EAASxkC,QACnBwkC,EAASlnC,IAAImnC,GACbA,EAAUnnC,IAAIgY,IAEhB2xB,SAAU,WACR,OAAO,IAAI3C,EAAQrnC,KAAK0nC,OAAQ1nC,KAAK6nC,WAAY7nC,KAAK4nC,YAExDt+B,OAAQ,WACN,QAAOtJ,KAAK8nC,SAAU9nC,KAAK8nC,MAAMmC,cAAcjqC,KAAKwJ,SAEtDzG,MAAO,WACL,OAAO,IAAIskC,EAAQrnC,KAAK0nC,OAAQ1nC,KAAK4nC,UAAW5nC,KAAK6nC,aAEvD/iC,OAAQ,SAAgBolC,GACtB,OAAOA,IAAYlqC,MAAQkqC,GAAWlqC,KAAK2D,SAAWumC,EAAQvmC,QAAU3D,KAAK0nC,OAAO5iC,OAAOolC,EAAQxC,SAAW1nC,KAAK4nC,UAAU9iC,OAAOolC,EAAQtC,YAAc5nC,KAAK6nC,WAAW/iC,OAAOolC,EAAQrC,cAAe,GAE1MpkC,SAAU,WACR,IAAIwd,EAAQ,CAAC,UAAYjhB,KAAK0nC,QAG9B,OAFK1nC,KAAK4nC,UAAUzxB,UAAU8K,EAAMnd,KAAK,aAAe9D,KAAK4nC,WACxD5nC,KAAK6nC,WAAW1xB,UAAU8K,EAAMnd,KAAK,cAAgB9D,KAAK6nC,YACxD,KAAO5mB,EAAM/c,KAAK,MAAQ,MAEnC+W,UAAW,SAAmBC,GAC5Blb,KAAKokB,sBAAsBlJ,EAAQ,IAAIjW,MAAM,IAAI,GAEjDjF,KAAKiiB,YAEPkoB,YAAa,SAAqB3rB,EAAMC,EAAI2qB,GAC1C,IAAI5F,EAAI,EAAI4F,EACRx7B,EAAIw7B,EACJltB,EAASsC,EAAKkpB,OACdvrB,EAASsC,EAAGipB,OACZ0C,EAAY5rB,EAAKopB,UACjByC,EAAY5rB,EAAGmpB,UACf0C,EAAa7rB,EAAGopB,WAChB0C,EAAa/rB,EAAKqpB,WAEtB7nC,KAAK0nC,OAAOvuB,KAAKqqB,EAAItnB,EAAOS,GAAK/O,EAAIuO,EAAOQ,GAAI6mB,EAAItnB,EAAOU,GAAKhP,EAAIuO,EAAOS,IAAI,GAE/E5c,KAAK4nC,UAAUzuB,KAAKqqB,EAAI4G,EAAUztB,GAAK/O,EAAIy8B,EAAU1tB,GAAI6mB,EAAI4G,EAAUxtB,GAAKhP,EAAIy8B,EAAUztB,IAAI,GAE9F5c,KAAK6nC,WAAW1uB,KAAKqqB,EAAI+G,EAAW5tB,GAAK/O,EAAI08B,EAAW3tB,GAAI6mB,EAAI+G,EAAW3tB,GAAKhP,EAAI08B,EAAW1tB,IAAI,GAEnG5c,KAAKiiB,YAEPmC,sBAAuB,SAA+BlJ,EAAQoJ,EAAQkmB,GACpE,IAAIr2B,EAAQnU,KAAK0nC,OACbH,EAAYiD,GAAWxqC,KAAK4nC,UAAUzxB,SAA4B,KAAjBnW,KAAK4nC,UACtDJ,EAAagD,GAAWxqC,KAAK6nC,WAAW1xB,SAA6B,KAAlBnW,KAAK6nC,WACxDzzB,EAAID,EAAMwI,GACVtI,EAAIF,EAAMyI,GACV9c,EAAI,EA+CR,OA9CAwkB,EAAO,GAAKlQ,EACZkQ,EAAO,GAAKjQ,EAERkzB,IACFjjB,EAAOxkB,KAAOynC,EAAS5qB,GAAKvI,EAC5BkQ,EAAOxkB,KAAOynC,EAAS3qB,GAAKvI,GAG1BmzB,IACFljB,EAAOxkB,KAAO0nC,EAAU7qB,GAAKvI,EAC7BkQ,EAAOxkB,KAAO0nC,EAAU5qB,GAAKvI,GAG3B6G,IACFA,EAAOkJ,sBAAsBE,EAAQA,EAAQxkB,EAAI,GAEjDsU,EAAIkQ,EAAO,GACXjQ,EAAIiQ,EAAO,GAEPkmB,GACFr2B,EAAMwI,GAAKvI,EACXD,EAAMyI,GAAKvI,EACXvU,EAAI,EAEAynC,IACFA,EAAS5qB,GAAK2H,EAAOxkB,KAAOsU,EAC5BmzB,EAAS3qB,GAAK0H,EAAOxkB,KAAOuU,GAG1BmzB,IACFA,EAAU7qB,GAAK2H,EAAOxkB,KAAOsU,EAC7BozB,EAAU5qB,GAAK0H,EAAOxkB,KAAOuU,KAG1BkzB,IACHjjB,EAAOxkB,KAAOsU,EACdkQ,EAAOxkB,KAAOuU,GAGXmzB,IACHljB,EAAOxkB,KAAOsU,EACdkQ,EAAOxkB,KAAOuU,KAKbiQ,KAGPmjB,EAAe3uB,EAAMrW,OAAO,CAC9BG,WAAY,SAAsBuR,EAAOsI,EAAO/b,GAC9C,IAAI0T,EAAGC,EAAGmJ,EAEV,GAAKrJ,EAEE,IAAKC,EAAID,EAAM,MAAQtV,EAC5BwV,EAAIF,EAAM,OACL,CACL,IAAI4hB,EAAK5hB,GAEJC,EAAI2hB,EAAG3hB,KAAOvV,IAEjBuV,GADA2hB,EAAKjd,EAAM1T,KAAK5E,YACT4T,GAGTC,EAAI0hB,EAAG1hB,EACPmJ,EAAWuY,EAAGvY,cAZdpJ,EAAIC,EAAI,EAeVrU,KAAK2c,GAAKvI,EACVpU,KAAK4c,GAAKvI,EACVrU,KAAK6c,OAASJ,EACdA,EAAM/b,GAAOV,KACTwd,GAAUxd,KAAKud,aAAY,IAEjCpE,KAAM,SAAc/E,EAAGC,GAMrB,OALArU,KAAK2c,GAAKvI,EACVpU,KAAK4c,GAAKvI,EAEVrU,KAAK6c,OAAOoF,SAASjiB,MAEdA,MAETgd,KAAM,WACJ,OAAOhd,KAAK2c,IAEdM,KAAM,SAAc7I,GAClBpU,KAAK2c,GAAKvI,EAEVpU,KAAK6c,OAAOoF,SAASjiB,OAEvBkd,KAAM,WACJ,OAAOld,KAAK4c,IAEdO,KAAM,SAAc9I,GAClBrU,KAAK4c,GAAKvI,EAEVrU,KAAK6c,OAAOoF,SAASjiB,OAEvBmW,OAAQ,WACN,IAAIA,EAAS3B,EAAU2B,OACvB,OAAOA,EAAOnW,KAAK2c,KAAOxG,EAAOnW,KAAK4c,KAExCQ,WAAY,WACV,SAAUpd,KAAK6c,OAAOQ,WAAard,KAAKsd,kBAE1CC,YAAa,SAAqBC,GAChCxd,KAAK6c,OAAOY,iBAAiBzd,KAAKsd,gBAAiBE,IAErDF,cAAe,WACb,IAAIb,EAAQzc,KAAK6c,OACjB,OAAO7c,OAASyc,EAAMirB,OAAS,EAAI1nC,OAASyc,EAAMmrB,UAAY,EAAI5nC,OAASyc,EAAMorB,WAAa,EAAI,KAGlG4C,EAAQzrC,EAAKyD,OAAO,CACtBkB,OAAQ,QACRzC,OAAO,EACP0B,WAAY,SAAemW,EAAMC,EAAMsF,EAAMC,EAAMgH,EAAM+hB,EAAMoD,EAAMC,GACnE,IACIC,EACAC,EACA3uB,EACAC,EACA2uB,EACAC,EANAtzB,EAAQjX,UAAUP,OAQR,IAAVwX,GACFzX,KAAK8nC,MAAQ/uB,EACb6xB,EAAO5xB,EACP6xB,EAAOvsB,GACG7G,EAGS,IAAVA,EACL,aAAcsB,GAChB6xB,EAAO,IAAIvD,EAAQtuB,EAAKiyB,UACxBH,EAAO,IAAIxD,EAAQtuB,EAAKkyB,WACf,WAAYlyB,GACrBmD,EAASnD,EAAKmD,OACd4uB,EAAU/xB,EAAK+xB,QACfC,EAAUhyB,EAAKgyB,QACf5uB,EAASpD,EAAKoD,QACLlX,MAAMC,QAAQ6T,KACvBmD,EAAS,CAACnD,EAAK,GAAIA,EAAK,IACxBoD,EAAS,CAACpD,EAAK,GAAIA,EAAK,IACxB+xB,EAAU,CAAC/xB,EAAK,GAAKA,EAAK,GAAIA,EAAK,GAAKA,EAAK,IAC7CgyB,EAAU,CAAChyB,EAAK,GAAKA,EAAK,GAAIA,EAAK,GAAKA,EAAK,KAE5B,IAAVtB,GACTmzB,EAAO,IAAIvD,EAAQtuB,GACnB8xB,EAAO,IAAIxD,EAAQruB,IACA,IAAVvB,GACTyE,EAASnD,EACT+xB,EAAU9xB,EACV+xB,EAAUzsB,EACVnC,EAASoC,GACU,IAAV9G,IACTyE,EAAS,CAACnD,EAAMC,GAChBmD,EAAS,CAACuuB,EAAMC,GAChBG,EAAU,CAACxsB,EAAOvF,EAAMwF,EAAOvF,GAC/B+xB,EAAU,CAACxlB,EAAOmlB,EAAMpD,EAAOqD,KA7B/BC,EAAO,IAAIvD,EACXwD,EAAO,IAAIxD,GA+BbrnC,KAAK+oC,UAAY6B,GAAQ,IAAIvD,EAAQnrB,EAAQ,KAAM4uB,GACnD9qC,KAAKkrC,UAAYL,GAAQ,IAAIxD,EAAQlrB,EAAQ4uB,EAAS,OAExDjjC,WAAY,SAAoBvD,EAAS4C,GACvC,OAAOnI,EAAKyF,UAAUzE,KAAK2nC,aAAe,CAAC3nC,KAAKmrC,YAAanrC,KAAKorC,aAAcprC,KAAKqrC,aAAcrrC,KAAKsrC,aAAe,CAACtrC,KAAKmrC,YAAanrC,KAAKsrC,aAAc/mC,GAAS,EAAM4C,IAE9K8a,SAAU,WACRjiB,KAAKurC,QAAUvrC,KAAKmuB,QAAUtvB,GAEhCkE,MAAO,WACL,OAAO,IAAI0nC,EAAMzqC,KAAK+oC,UAAW/oC,KAAKkrC,YAExCznC,SAAU,WACR,IAAIwd,EAAQ,CAAC,WAAajhB,KAAK+oC,UAAUrB,QAIzC,OAHK1nC,KAAK+oC,UAAUlB,WAAW1xB,UAAU8K,EAAMnd,KAAK,YAAc9D,KAAK+oC,UAAUlB,YAC5E7nC,KAAKkrC,UAAUtD,UAAUzxB,UAAU8K,EAAMnd,KAAK,YAAc9D,KAAKkrC,UAAUtD,WAChF3mB,EAAMnd,KAAK,WAAa9D,KAAKkrC,UAAUxD,QAChC,KAAOzmB,EAAM/c,KAAK,MAAQ,MAEnCsnC,SAAU,WACR,OAAOf,EAAMe,SAASxrC,KAAKkiB,cAE7B5Y,OAAQ,WACN,IAAIG,GAAU,EAEd,GAAIzJ,KAAK8nC,MAAO,CACd,IAAImD,EAAWjrC,KAAKkrC,UAChB1D,EAAYyD,EAASpD,YACzBp+B,EAAUwhC,EAAS3hC,WACNtJ,KAAK+oC,UAAUlB,WAAWxnC,IAAImnC,GAG7C,OAAO/9B,GAET0hC,UAAW,WACT,OAAOnrC,KAAK+oC,UAAUrB,QAExB+D,UAAW,WACTzrC,KAAK+oC,UAAUrB,OAAOrnC,IAAIyY,EAAM1T,KAAK5E,aAEvC8qC,UAAW,WACT,OAAOtrC,KAAKkrC,UAAUxD,QAExBgE,UAAW,WACT1rC,KAAKkrC,UAAUxD,OAAOrnC,IAAIyY,EAAM1T,KAAK5E,aAEvC4qC,WAAY,WACV,OAAOprC,KAAK+oC,UAAUlB,YAExB8D,WAAY,WACV3rC,KAAK+oC,UAAUlB,WAAWxnC,IAAIyY,EAAM1T,KAAK5E,aAE3C6qC,WAAY,WACV,OAAOrrC,KAAKkrC,UAAUtD,WAExBgE,WAAY,WACV5rC,KAAKkrC,UAAUtD,UAAUvnC,IAAIyY,EAAM1T,KAAK5E,aAE1CqrC,YAAa,WACX,OAAO7rC,KAAK+oC,WAEd+C,YAAa,WACX,OAAO9rC,KAAKkrC,WAEdzC,QAAS,WACP,OAAOzoC,KAAK8nC,OAEdnf,SAAU,WACR,OAAO3oB,KAAK+oC,UAAUv/B,QAExBw/B,QAAS,WACP,IAAIh4B,EAAShR,KAAK8nC,OAAS9nC,KAAK8nC,MAAME,QACtC,OAAOh3B,IAAWA,EAAOhR,KAAK+oC,UAAUv/B,OAAS,IAAMxJ,KAAK8nC,MAAMG,SAAWj3B,EAAO,KAAO,MAE7Fq4B,YAAa,WACX,IAAIr4B,EAAShR,KAAK8nC,OAAS9nC,KAAK8nC,MAAME,QACtC,OAAOh3B,IAAWA,EAAOhR,KAAK+oC,UAAUv/B,OAAS,IAAMxJ,KAAK8nC,MAAMG,SAAWj3B,EAAOA,EAAO/Q,OAAS,KAAO,MAE7GmI,QAAS,WACP,OAAQpI,KAAK+oC,UAAUv/B,QAEzBugC,OAAQ,WACN,IAAIjT,EAAO92B,KAAK8nC,MAChB,OAAOhR,GAAQ92B,KAAK+oC,UAAUv/B,SAAWstB,EAAKkR,QAAQ/nC,OAAS,IAAK,GAEtEmd,WAAY,WACV,OAAOpd,KAAKmrC,YAAY/tB,cAAgBpd,KAAKorC,aAAahuB,cAAgBpd,KAAKqrC,aAAajuB,cAAgBpd,KAAKsrC,YAAYluB,cAE/HG,YAAa,SAAqBC,GAChCxd,KAAKmrC,YAAY5tB,YAAYC,GAC7Bxd,KAAKorC,aAAa7tB,YAAYC,GAC9Bxd,KAAKqrC,aAAa9tB,YAAYC,GAC9Bxd,KAAKsrC,YAAY/tB,YAAYC,IAE/B0E,UAAW,SAAmBhH,GAC5B,OAAOuvB,EAAMvoB,UAAUliB,KAAK+oC,UAAW/oC,KAAKkrC,UAAWhwB,IAEzD6wB,UAAW,WAIT,IAHA,IAAIznB,EAAStkB,KAAKkiB,YACdiU,EAAS,GAEJr2B,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAC1Bq2B,EAAOryB,KAAK,IAAIgV,EAAMwL,EAAOxkB,GAAIwkB,EAAOxkB,EAAI,KAG9C,OAAOq2B,IAER,CACD7c,UAAW,WAET,OADoB,MAAhBtZ,KAAKurC,UAAiBvrC,KAAKurC,QAAUd,EAAMnxB,UAAUtZ,KAAKkiB,YAAa,EAAG,IACvEliB,KAAKurC,SAEdhrB,QAAS,WACP,OAAOkqB,EAAMlqB,QAAQvgB,KAAKkiB,cAE5B8pB,QAAS,WACP,OAAO,IAAI1mB,EAAKtlB,KAAK+oC,UAAUrB,OAAQ1nC,KAAKkrC,UAAUxD,SAExDuE,QAAS,SAAiBztB,EAAMC,GAC9B,OAAO,IAAIgsB,EAAMA,EAAMwB,QAAQjsC,KAAKkiB,YAAa1D,EAAMC,KAEzDytB,cAAe,SAAuB1tB,EAAMC,GAC1C,OAAOgsB,EAAMnxB,UAAUtZ,KAAKkiB,YAAa1D,EAAMC,IAEjD0tB,SAAU,SAAkBC,GAC1B,OAAOpsC,KAAKqsC,aAAaD,GAAYA,EAASrE,QAAU/nC,KAAOosC,EAASlN,KAAOl/B,KAAKssC,UAAUF,KAEhGC,aAAc,SAAsBnN,EAAMqN,GACxC,IAEI3qC,EAAM,KAEV,GAAIs9B,GAJO,MAISA,GAHT,UAGuB,CAChC,IAAIje,EAAQwpB,EAAM+B,UAAUxsC,KAAKkiB,YAAagd,GAC1C7uB,EAAO4Q,EAAM,GACb1Q,EAAQ0Q,EAAM,GACdwrB,EAAaF,GAAevsC,KAAK2nC,aACjCiD,EAAO5qC,KAAK+oC,UACZ8B,EAAO7qC,KAAKkrC,UACZpU,EAAO92B,KAAK8nC,MAEZ2E,IACF7B,EAAK/C,WAAW1uB,KAAK9I,EAAK,GAAKA,EAAK,GAAIA,EAAK,GAAKA,EAAK,IAEvDw6B,EAAKjD,UAAUzuB,KAAK5I,EAAM,GAAKA,EAAM,GAAIA,EAAM,GAAKA,EAAM,KAG5D,IAAI6D,EAAI/D,EAAK,GACTgE,EAAIhE,EAAK,GACT65B,EAAU,IAAI7C,EAAQ,IAAIvuB,EAAM1E,EAAGC,GAAIo4B,GAAc,IAAI3zB,EAAMzI,EAAK,GAAK+D,EAAG/D,EAAK,GAAKgE,GAAIo4B,GAAc,IAAI3zB,EAAMvI,EAAM,GAAK6D,EAAG7D,EAAM,GAAK8D,IAE3IyiB,GACFA,EAAK/tB,OAAO6hC,EAAKphC,OAAS,EAAG0gC,GAC7BtoC,EAAM5B,KAAKgpC,YAEXhpC,KAAKkrC,UAAYhB,EAEjBlqC,KAAKiiB,WAELrgB,EAAM,IAAI6oC,EAAMP,EAASW,IAI7B,OAAOjpC,GAET8qC,QAAS,SAAiBN,GACxB,IAAItV,EAAO92B,KAAK8nC,MAChB,OAAOhR,EAAOA,EAAK4V,QAAQN,GAAY,MAEzCO,YAAa,SAAqBzN,GAChC,OAAOl/B,KAAK0sC,QAAQ1sC,KAAK4sC,kBAAkB1N,KAE7C7jB,OAAQ,SAAgB+P,EAAQyhB,GAC9B,OAAO7sC,KAAKqsC,aAAajhB,IAAWvsB,EAAY,GAAMguC,EAASzhB,EAASprB,KAAKssC,UAAUlhB,KAEzF/V,MAAO,SAAe+V,EAAQyhB,GAC5B,OAAO7sC,KAAK2sC,YAAYvhB,IAAWvsB,EAAY,GAAMguC,EAASzhB,EAASprB,KAAKssC,UAAUlhB,KAExF4e,SAAU,WACR,OAAO,IAAIS,EAAMzqC,KAAKkrC,UAAUlB,WAAYhqC,KAAK+oC,UAAUiB,aAE7DzB,aAAc,WACZvoC,KAAK+oC,UAAUlB,WAAW1uB,KAAK,EAAG,GAElCnZ,KAAKkrC,UAAUtD,UAAUzuB,KAAK,EAAG,IAEnC5W,QAAS,CACP2f,UAAW,SAAmB8oB,EAAUC,EAAU/vB,EAAQ4xB,GACxD,IAAIvD,EAAKyB,EAAStD,OACdqF,EAAK/B,EAASnD,WACdmF,EAAK/B,EAASrD,UACd4B,EAAKyB,EAASvD,OACdtwB,EAAKmyB,EAAGn1B,EACRiI,EAAKktB,EAAGl1B,EACRgD,EAAKmyB,EAAGp1B,EACRkI,EAAKktB,EAAGn1B,EACR4yB,EAAS6F,EAAW,CAAC11B,EAAIiF,EAAIjF,EAAIiF,EAAIhF,EAAIiF,EAAIjF,EAAIiF,GAAM,CAAClF,EAAIiF,EAAIjF,EAAK21B,EAAGpwB,GAAIN,EAAK0wB,EAAGnwB,GAAIvF,EAAK21B,EAAGrwB,GAAIL,EAAK0wB,EAAGpwB,GAAIvF,EAAIiF,GAExH,OADIpB,GAAQA,EAAOkJ,sBAAsB6iB,EAAQA,EAAQ,GAClDA,GAETuF,UAAW,SAAmB5+B,EAAG0K,GAC/B,IAAIF,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACP0K,IAAMzZ,IAAWyZ,EAAI,IACzB,IAAIkrB,EAAI,EAAIlrB,EACR80B,EAAK5J,EAAIprB,EAAKE,EAAIlB,EAClBi2B,EAAK7J,EAAIyJ,EAAK30B,EAAI+D,EAClBixB,EAAK9J,EAAIpsB,EAAKkB,EAAIjB,EAClBk2B,EAAK/J,EAAInnB,EAAK/D,EAAIgE,EAClBkxB,EAAKhK,EAAInsB,EAAKiB,EAAI40B,EAClBO,EAAKjK,EAAIlnB,EAAKhE,EAAI60B,EAClBO,EAAKlK,EAAI4J,EAAK90B,EAAIg1B,EAClBK,EAAKnK,EAAI6J,EAAK/0B,EAAIi1B,EAClBK,EAAKpK,EAAI8J,EAAKh1B,EAAIk1B,EAClBK,EAAKrK,EAAI+J,EAAKj1B,EAAIm1B,EAClBK,EAAKtK,EAAIkK,EAAKp1B,EAAIs1B,EAClBG,EAAKvK,EAAImK,EAAKr1B,EAAIu1B,EACtB,MAAO,CAAC,CAACz1B,EAAI60B,EAAIG,EAAIC,EAAIK,EAAIC,EAAIG,EAAIC,GAAK,CAACD,EAAIC,EAAIH,EAAIC,EAAIL,EAAIC,EAAIP,EAAIC,KAEzEa,cAAe,SAAuBpgC,EAAGwzB,GACvC,IAAIpwB,EAAS,GACTi9B,EAAK7M,EAAM,EAAI,EACf8M,EAAKtgC,EAAEqgC,EAAK,GACZE,EAAKvgC,EAAEqgC,EAAK,GACZG,EAAKxgC,EAAEqgC,EAAK,GACZI,EAAKzgC,EAAEqgC,EAAK,GAEhB,GAAIC,GAAMC,GAAOA,GAAMC,GAAMD,GAAMC,GAAOA,GAAMC,GAAM5D,EAAM6D,WAAW1gC,GACrEoD,EAAOlN,KAAK8J,OACP,CACL,IAAI1K,EAAI,GAAKirC,EAAKC,GAAMF,EAAKG,EACzBlrC,EAAI,GAAK+qC,EAAKE,GAAM,EAAID,EACxB/4B,EAAI+4B,EAAKD,EAGT/2B,EAAQ,GACR5J,EAAIiH,EAAU0C,eAAehU,EAAGC,EAAGiS,EAAG+B,EAH/B,KACA,WAIX,GAAK5J,EAEE,CACL4J,EAAM3E,OACN,IAAI8F,EAAInB,EAAM,GACV8J,EAAQwpB,EAAM+B,UAAU5+B,EAAG0K,GAC/BtH,EAAOlN,KAAKmd,EAAM,IAEd1T,EAAI,IACN+K,GAAKnB,EAAM,GAAKmB,IAAM,EAAIA,GAC1B2I,EAAQwpB,EAAM+B,UAAUvrB,EAAM,GAAI3I,GAClCtH,EAAOlN,KAAKmd,EAAM,KAGpBjQ,EAAOlN,KAAKmd,EAAM,SAblBjQ,EAAOlN,KAAK8J,GAiBhB,OAAOoD,GAET8G,WAAY,SAAoBlK,EAAGmE,EAAOxQ,EAAK4V,EAAOlG,EAAKE,GACzD,IAAIo9B,EAAK3gC,EAAEmE,GACPvE,EAAKI,EAAEmE,EAAQ,GACftE,EAAKG,EAAEmE,EAAQ,GACfy8B,EAAK5gC,EAAEmE,EAAQ,GACfnQ,EAAM,EAEV,KAAM2sC,EAAKhtC,GAAOitC,EAAKjtC,GAAOiM,EAAKjM,GAAOkM,EAAKlM,GAAOgtC,EAAKhtC,GAAOitC,EAAKjtC,GAAOiM,EAAKjM,GAAOkM,EAAKlM,GAAM,CACnG,IAAI6T,EAAI,GAAK5H,EAAK+gC,GACdprC,EAAI,GAAKsK,EAAKD,GAAM4H,EACpBlS,EAAIsrC,EAAKD,EAAKn5B,EAAIjS,EACtBvB,EAAM4S,EAAUsD,WAAW5U,EAAGC,EAAGiS,EAAGm5B,EAAKhtC,EAAK4V,EAAOlG,EAAKE,GAG5D,OAAOvP,GAET6sC,UAAW,SAAmB7gC,EAAGuG,GAC/B,IAAIm1B,EAAK,IAAIxwB,EAAMlL,EAAE,GAAIA,EAAE,IACvB8gC,EAAK,IAAI51B,EAAMlL,EAAE,GAAIA,EAAE,IAEvB+gC,EAAc,KAGlB,GAAU,QAFFx6B,EAAMwH,QAAQ2tB,EAFR,OAEuB,EAAIn1B,EAAMwH,QAAQ+yB,EAFzC,OAEwD,EAAI,MAMxE,IAHA,IAAIpqB,EAAS,CAACnQ,EAAMC,EAAGD,EAAME,GACzB8C,EAAQ,GAEH/B,EAAI,EAAGA,EAAI,EAAGA,IAGrB,IAFA,IAAIqC,EAAQgzB,EAAM3yB,WAAWlK,EAAGwH,EAAGkP,EAAOlP,GAAI+B,EAAO,EAAG,GAE/CrX,EAAI,EAAGA,EAAI2X,EAAO3X,IAAK,CAC9B,IAAI0jC,EAAIrsB,EAAMrX,GACd,GAAIqU,EAAMwH,QAAQ8uB,EAAM5rB,SAASjR,EAAG41B,GAAImL,GAAc,OAAOnL,EAKnE,OAAOrvB,EAAMwH,QAAQ2tB,EAAIqF,GAAe,EAAIx6B,EAAMwH,QAAQ+yB,EAAIC,GAAe,EAAI,MAEnFC,eAAgB,SAAwBhhC,EAAGuG,GACzC,GAAIs2B,EAAM6D,WAAW1gC,GAAI,CACvB,IAAIwK,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GAGPqZ,EAFKrZ,EAAE,GAEGwK,EACV8O,EAFKtZ,EAAE,GAEGq/B,EACVtpB,EAAMsD,EAAKA,EAAKC,EAAKA,EACzB,GAAY,IAARvD,EAAW,OAAO,EACtB,IAAI6f,IAAMrvB,EAAMC,EAAIgE,GAAM6O,GAAM9S,EAAME,EAAI44B,GAAM/lB,GAAMvD,EACtD,OAAO6f,EAAI,MAAQ,EAAIA,EAAI,cAAiB,EAAIiH,EAAMgE,UAAU7gC,EAAG,IAAIkL,EAAMV,EAAKorB,EAAIvc,EAAIgmB,EAAKzJ,EAAItc,IAGrG,IACI2nB,EAAUv3B,IACVw3B,EAAO,EAEX,SAASC,EAAOz2B,GACd,GAAIA,GAAK,GAAKA,GAAK,EAAG,CACpB,IAAI02B,EAAO76B,EAAMuG,YAAY+vB,EAAM5rB,SAASjR,EAAG0K,IAAI,GAEnD,GAAI02B,EAAOH,EAGT,OAFAA,EAAUG,EACVF,EAAOx2B,GACA,GAKb,IAAK,IAAIxY,EAAI,EAAGA,GAhBJ,IAgBgBA,IAC1BivC,EAAOjvC,EAjBG,KAsBZ,IAFA,IAAImvC,EAAO,KAEJA,EAAO,MACPF,EAAOD,EAAOG,IAAUF,EAAOD,EAAOG,KAAOA,GAAQ,GAG5D,OAAOH,GAET7C,QAAS,SAAiBr+B,EAAG4Q,EAAMC,GACjC,IAAIywB,EAAO1wB,EAAOC,EAElB,GAAIywB,EAAM,CACR,IAAI72B,EAAMmG,EACVA,EAAOC,EACPA,EAAKpG,EAKP,OAFImG,EAAO,IAAG5Q,EAAI68B,EAAM+B,UAAU5+B,EAAG4Q,GAAM,IACvCC,EAAK,IAAG7Q,EAAI68B,EAAM+B,UAAU5+B,GAAI6Q,EAAKD,IAAS,EAAIA,IAAO,IACtD0wB,EAAO,CAACthC,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAMA,GAEnEuhC,aAAc,SAAsBvhC,EAAGwhC,GACrC,IAAIh3B,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACPyhC,EAAK,EAAIj4B,EAAK,EAAIgB,EAAK80B,EACvBoC,EAAK,EAAIjzB,EAAK,EAAI4wB,EAAKE,EACvBlmB,EAAK,EAAI5P,EAAK,EAAI61B,EAAK90B,EACvB8O,EAAK,EAAI5K,EAAK,EAAI6wB,EAAKF,EAC3B,OAAO/7B,KAAKC,IAAIk+B,EAAKA,EAAIpoB,EAAKA,GAAM/V,KAAKC,IAAIm+B,EAAKA,EAAIpoB,EAAKA,IAAO,GAAKkoB,EAAWA,GAEpF7uB,QAAS,SAAiB3S,GACxB,IAAIwK,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACX,OAAO,IAAMu/B,EAAKF,IAAO71B,EAAKC,IAAO61B,EAAK90B,IAAOiE,EAAKC,GAAMD,GAAMjE,EAAKf,GAAMD,GAAM61B,EAAK3wB,GAAM6wB,GAAM91B,EAAKe,EAAK,GAAK80B,GAAM5wB,EAAK2wB,EAAK,IAAM,IAE3I/8B,UAAW,SAAmBtC,GAK5B,IAJA,IAAIqD,EAAMrD,EAAExO,MAAM,EAAG,GACjB+R,EAAMF,EAAI7R,QACV+X,EAAQ,CAAC,EAAG,GAEPrX,EAAI,EAAGA,EAAI,EAAGA,IACrB2qC,EAAM8E,WAAW3hC,EAAE9N,GAAI8N,EAAE9N,EAAI,GAAI8N,EAAE9N,EAAI,GAAI8N,EAAE9N,EAAI,GAAIA,EAAG,EAAGmR,EAAKE,EAAKgG,GAGvE,OAAO,IAAIsE,EAAWxK,EAAI,GAAIA,EAAI,GAAIE,EAAI,GAAKF,EAAI,GAAIE,EAAI,GAAKF,EAAI,KAEtEs+B,WAAY,SAAoBhB,EAAI/gC,EAAIC,EAAI+gC,EAAIz8B,EAAOyvB,EAASvwB,EAAKE,EAAKgG,GACxE,SAAS1P,EAAI3G,EAAO0gC,GAClB,IAAInxB,EAAOvP,EAAQ0gC,EACfjxB,EAAQzP,EAAQ0gC,EAChBnxB,EAAOY,EAAIc,KAAQd,EAAIc,GAAS1B,GAChCE,EAAQY,EAAIY,KAAQZ,EAAIY,GAASxB,GAGvCixB,GAAW,EACX,IAAIgO,EAASv+B,EAAIc,GAASyvB,EACtBiO,EAASt+B,EAAIY,GAASyvB,EAE1B,GAAI+M,EAAKiB,GAAUhiC,EAAKgiC,GAAU/hC,EAAK+hC,GAAUhB,EAAKgB,GAAUjB,EAAKkB,GAAUjiC,EAAKiiC,GAAUhiC,EAAKgiC,GAAUjB,EAAKiB,EAChH,GAAIjiC,EAAK+gC,GAAM/gC,EAAKghC,GAAM/gC,EAAK8gC,GAAM9gC,EAAK+gC,EACxC/mC,EAAI8mC,EAAI,GACR9mC,EAAI+mC,EAAI,OACH,CACL,IAAItrC,EAAI,GAAKsK,EAAKC,GAAM8gC,EAAKC,EACzBrrC,EAAI,GAAKorC,EAAK9gC,GAAM,EAAID,EACxB4H,EAAI5H,EAAK+gC,EACT92B,EAAQjD,EAAU0C,eAAehU,EAAGC,EAAGiS,EAAG+B,GAG9C1P,EAAI+mC,EAAI,GAER,IAAK,IAAI1uC,EAAI,EAAGA,EAAI2X,EAAO3X,IAAK,CAC9B,IAAIwY,EAAInB,EAAMrX,GACV0jC,EAAI,EAAIlrB,EANH,MAOGA,GAAKA,GANR,WAMmB7Q,EAAI+7B,EAAIA,EAAIA,EAAI+K,EAAK,EAAI/K,EAAIA,EAAIlrB,EAAI9K,EAAK,EAAIg2B,EAAIlrB,EAAIA,EAAI7K,EAAK6K,EAAIA,EAAIA,EAAIk2B,EAAIhN,QAMpHxiC,EAAK8D,KAAK,CAAC,YAAa,kBAAmB,oBAAoB,SAAUxB,GAC1EtB,KAAKsB,GAAQ,WACNtB,KAAKmuB,UAASnuB,KAAKmuB,QAAU,IAClC,IAAIhe,EAASnQ,KAAKmuB,QAAQ7sB,GAM1B,OAJK6O,IACHA,EAASnQ,KAAKmuB,QAAQ7sB,GAAQqzB,EAAKrzB,GAAM,CAACtB,KAAK+oC,UAAW/oC,KAAKkrC,YAAY,EAAOlrC,KAAK8nC,QAGlF33B,EAAOpN,WAEf,IAAK/D,EAAK8D,KAAK,CAChBwrC,WAAY,SAAoB/E,EAAIwD,EAAIC,EAAIxD,GAC1C,GAAIuD,EAAG52B,UAAY62B,EAAG72B,SACpB,OAAO,EAEP,IAAIvI,EAAI47B,EAAGxuB,SAASuuB,GAEpB,GAAI37B,EAAEuI,SACJ,OAAO,EACF,GAAIvI,EAAEgO,YAAYmxB,IAAOn/B,EAAEgO,YAAYoxB,GAAK,CACjD,IAAIjtC,EAAI,IAAIulB,EAAKikB,EAAIC,GAGrB,GAAIzpC,EAAE2a,YAAY6uB,EAAG9hC,IAAIslC,IAFX,MAE6BhtC,EAAE2a,YAAY8uB,EAAG/hC,IAAIulC,IAFlD,KAEkE,CAC9E,IAAI9yB,EAAMtM,EAAEwM,IAAIxM,GACZ8hC,EAAK9hC,EAAEwM,IAAI2yB,GAAM7yB,EACjBy1B,EAAK/hC,EAAEwM,IAAI4yB,GAAM9yB,EACrB,OAAOw1B,GAAM,GAAKA,GAAM,GAAKC,GAAM,GAAKA,IAAO,GAKrD,OAAO,GAETC,SAAU,SAAkBrG,EAAIwD,EAAIC,EAAIxD,GACtC,IAAIqG,EAAQrG,EAAGxuB,SAASuuB,GAAIluB,OAAO,GACnC,OAAO0xB,EAAGjoC,OAAO+qC,IAAU7C,EAAGzxB,SAASzW,OAAO+qC,MAE/C,SAAUztC,EAAMd,GACjBtB,KAAKsB,GAAQ,SAAUsf,GACrB,IAAIgqB,EAAO5qC,KAAK+oC,UACZ8B,EAAO7qC,KAAKkrC,UAChB,OAAO9oC,EAAKwoC,EAAKlD,OAAQkD,EAAK/C,WAAYgD,EAAKjD,UAAWiD,EAAKnD,OAAQ9mB,IAGzE5gB,KAAKuC,QAAQjB,GAAQ,SAAUsM,EAAGgT,GAChC,IAAIxI,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACX,OAAOxL,EAAK,IAAI0W,EAAMV,EAAI60B,GAAK,IAAIn0B,EAAMlL,EAAE,GAAKwK,EAAIxK,EAAE,GAAKq/B,GAAK,IAAIn0B,EAAMlL,EAAE,GAAKs/B,EAAIt/B,EAAE,GAAKu/B,GAAK,IAAIr0B,EAAMo0B,EAAIC,GAAKvsB,MAErH,CACDre,QAAS,GACTolC,WAAY,WACV,OAAQ3nC,KAAK+oC,UAAUlB,WAAW1xB,WAAanW,KAAKkrC,UAAUtD,UAAUzxB,UAE1E25B,UAAW,SAAmBlvB,GAC5B,QAAS5gB,KAAKmrC,YAAYrmC,OAAO9E,KAAKsrC,cAAgBtrC,KAAK2nC,eAAiB3nC,KAAKsZ,aAAesH,GAAW,IAE7GhF,YAAa,SAAqBmsB,GAChC,OAAOA,GAAS/nC,KAAKsuC,cAAgBvG,EAAMuG,cAAgBtuC,KAAKgsC,UAAUpwB,YAAYmsB,EAAMiE,YAE9F+D,aAAc,WACZ,OAAO/vC,KAAKsuC,cAAgBp9B,KAAKyD,IAAI3U,KAAKgwC,iBAAiB,IAAK37B,GAAK,MAEvE47B,WAAY,WACV,OAAOjwC,KAAKsuC,cAAgBp9B,KAAKyD,IAAI3U,KAAKgwC,iBAAiB,IAAK57B,GAAK,QAErE,CACFlT,OAAO,EACPgvC,cAAe,SAAuB9kB,EAAQ+kB,GAC5C,OAAOnwC,KAAK4sC,kBAAkBuD,EAAU/kB,EAASprB,KAAKssC,UAAUlhB,KAElEwhB,kBAAmB,SAA2Bt0B,GAC5C,OAAY,MAALA,GAAaA,GAAK,GAAKA,GAAK,EAAI,IAAIwwB,EAAc9oC,KAAMsY,GAAK,MAEtEg0B,UAAW,SAAmBlhB,EAAQ/lB,GACpC,OAAOolC,EAAM6B,UAAUtsC,KAAKkiB,YAAakJ,EAAQ/lB,IAEnD+qC,eAAgB,aAChBC,oBAAqB,WACnB,IAAIC,EAAUx3B,EAAM1T,KAAK5E,WACzB,OAAO8vC,EAAQn6B,SAAW,GAAKs0B,EAAM4F,oBAAoBrwC,KAAKkiB,YAAaouB,IAE7EC,gBAAiB,SAAyBj4B,GACxC,OAAOtY,KAAKksC,cAAc,EAAG5zB,IAE/Bk4B,cAAe,WACb,OAAOxwC,KAAK4sC,kBAAkB5sC,KAAKyuC,UAAU31B,EAAM1T,KAAK5E,cAE1DiwC,YAAa,WACX,IAAIC,EAAM1wC,KAAKwwC,cAAc3tC,MAAM7C,KAAMQ,WACzC,OAAOkwC,EAAMA,EAAIC,YAAc,MAEjClC,UAAW,WACT,OAAOhE,EAAMgE,UAAUzuC,KAAKkiB,YAAapJ,EAAM1T,KAAK5E,aAEtDowC,eAAgB,aAChBC,mBAAoB,WAClB,IAAI18B,EAAQ2E,EAAM1T,KAAK5E,WACnBymC,EAASjnC,KAAKkiB,YACd5J,EAAImyB,EAAMmE,eAAe3H,EAAQ9yB,GACjC4hB,EAAK0U,EAAM5rB,SAASooB,EAAQ3uB,GAChC,OAAO,IAAIwwB,EAAc9oC,KAAMsY,EAAGyd,EAAI,KAAM5hB,EAAMuG,YAAYqb,KAEhE+a,gBAAiB,WACf,IAAIJ,EAAM1wC,KAAK6wC,mBAAmBhuC,MAAM7C,KAAMQ,WAC9C,OAAOkwC,EAAMA,EAAI7xB,WAAa6xB,IAE/B,IAAI,WACL,IAAIK,EAAU,CAAC,WAAY,aAAc,YAAa,qBAAsB,oBAAqB,gBACjG,OAAO/xC,EAAK8D,KAAKiuC,GAAS,SAAUzvC,GAClCtB,KAAKsB,EAAO,MAAQ,SAAU8qC,EAAU+D,GACtC,IAAIlJ,EAASjnC,KAAKkiB,YAClB,OAAOuoB,EAAMnpC,GAAM2lC,EAAQkJ,EAAU/D,EAAW3B,EAAM6B,UAAUrF,EAAQmF,KAG1EpsC,KAAKsB,EAAO,UAAY,SAAU49B,GAChC,OAAOuL,EAAMnpC,GAAMtB,KAAKkiB,YAAagd,MAEtC,CACD38B,QAAS,CACPyuC,iBAAkBD,MAGnB,IAAI,WACP,SAASE,EAAmBrjC,GAC1B,IAAIwK,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACPsjC,EAAK,GAAK95B,EAAKC,GAAM,GAAK61B,EAAK90B,GAC/B+4B,EAAK,GAAK/4B,EAAKf,GAAM,GAAKD,EAC1B2pB,EAAK,GAAK3pB,EAAKgB,GACfg5B,EAAK,GAAK/0B,EAAKC,GAAM,GAAK6wB,EAAKF,GAC/BoE,EAAK,GAAKpE,EAAK3wB,GAAM,GAAKD,EAC1B2kB,EAAK,GAAK3kB,EAAK4wB,GACnB,OAAO,SAAU30B,GACf,IAAItB,GAAMk6B,EAAK54B,EAAI64B,GAAM74B,EAAIyoB,EACzBra,GAAM0qB,EAAK94B,EAAI+4B,GAAM/4B,EAAI0oB,EAC7B,OAAO9vB,KAAK0D,KAAKoC,EAAKA,EAAK0P,EAAKA,IAIpC,SAAS4qB,EAAcpuC,EAAGC,GACxB,OAAO+N,KAAKC,IAAI,EAAGD,KAAKD,IAAI,GAAIC,KAAKojB,KAAuB,GAAlBpjB,KAAKyD,IAAIxR,EAAID,MAGzD,SAASiV,EAASvK,EAAG0K,EAAGzU,EAAM0tC,GAC5B,GAAS,MAALj5B,GAAaA,EAAI,GAAKA,EAAI,EAAG,OAAO,KACxC,IAAIF,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACPuI,EAAS3B,EAAU2B,OAEnBA,EAAOiB,EAAKgB,IAAOjC,EAAOkG,EAAK4wB,KACjC71B,EAAKgB,EACLiE,EAAK4wB,GAGH92B,EAAOkB,EAAK61B,IAAO/2B,EAAOmG,EAAK6wB,KACjC91B,EAAK61B,EACL5wB,EAAK6wB,GAGP,IAMI/4B,EACAC,EAPA0sB,EAAK,GAAK3pB,EAAKgB,GACf+4B,EAAK,GAAK95B,EAAKD,GAAM2pB,EACrBmQ,EAAKhE,EAAK90B,EAAK2oB,EAAKoQ,EACpBnQ,EAAK,GAAK3kB,EAAK4wB,GACfoE,EAAK,GAAK/0B,EAAKD,GAAM2kB,EACrBoQ,EAAKjE,EAAKF,EAAKjM,EAAKqQ,EAIxB,GAAa,IAATxtC,EACFuQ,EAAU,IAANkE,EAAUF,EAAW,IAANE,EAAU40B,IAAOgE,EAAK54B,EAAI64B,GAAM74B,EAAIyoB,GAAMzoB,EAAIF,EACjE/D,EAAU,IAANiE,EAAU20B,EAAW,IAAN30B,EAAU60B,IAAOiE,EAAK94B,EAAI+4B,GAAM/4B,EAAI0oB,GAAM1oB,EAAI20B,MAC5D,CACL,IAAIuE,EAAO,KACPC,EAAO,EAAID,EAaf,GAXIl5B,EAAIk5B,GACNp9B,EAAI2sB,EACJ1sB,EAAI2sB,GACK1oB,EAAIm5B,GACbr9B,EAAI,GAAK84B,EAAK71B,GACdhD,EAAI,GAAK84B,EAAK7wB,KAEdlI,GAAK,EAAI88B,EAAK54B,EAAI,EAAI64B,GAAM74B,EAAIyoB,EAChC1sB,GAAK,EAAI+8B,EAAK94B,EAAI,EAAI+4B,GAAM/4B,EAAI0oB,GAG9BuQ,EAAY,CACJ,IAANn9B,GAAiB,IAANC,IAAYiE,EAAIk5B,GAAQl5B,EAAIm5B,KACzCr9B,EAAIiD,EAAKD,EACT/C,EAAIiI,EAAKD,GAGX,IAAIq1B,EAAMxgC,KAAK0D,KAAKR,EAAIA,EAAIC,EAAIA,GAE5Bq9B,IACFt9B,GAAKs9B,EACLr9B,GAAKq9B,GAIT,GAAa,IAAT7tC,EAAY,CACVwT,EAAK,EAAI65B,EAAK54B,EAAI,EAAI64B,EACtB70B,EAAK,EAAI80B,EAAK94B,EAAI,EAAI+4B,EAD1B,IAEIt5B,EAAI7G,KAAK2C,IAAIO,EAAIA,EAAIC,EAAIA,EAAG,KAChCD,EAAU,IAAN2D,GAAW3D,EAAIkI,EAAKjI,EAAIgD,GAAMU,EAAI,EACtC1D,EAAI,GAIR,OAAgB,IAATxQ,EAAa,IAAIiV,EAAMzE,GAAID,GAAK,IAAI0E,EAAM1E,EAAGC,GAGtD,MAAO,CACL9R,QAAS,CACPipC,SAAU,SAAkB59B,GAC1B,IAAIwK,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GAEPoV,EAAK5L,GAAM61B,EAAKE,GAAM9wB,GAAM6wB,EAAK90B,GAAMA,EAAK+0B,EAAKF,EAAKC,EAEtDyE,EAAK,GADAt6B,GAAMgF,EAAK4wB,GAAM3wB,GAAMlE,EAAKhB,GAAMA,EAAK61B,EAAK5wB,EAAKjE,GAEtD8K,EAAKyuB,EAAK3uB,EACVD,EAAKG,EAAKF,GALL5K,GAAM+0B,EAAK7wB,GAAM2wB,GAAM51B,EAAK61B,GAAMA,EAAK5wB,EAAK6wB,EAAK91B,GAMtDtX,EAAImR,KAAK0D,KAAKmO,EAAKA,EAAKG,EAAKA,EAAKyuB,EAAKA,GACvCn5B,EAAU,IAANzY,EAAU,EAAIA,EAAI,EACtBoW,EAAS3B,EAAU2B,OACnBy7B,EAAa,aAKjB,SAAS/tC,EAAKA,EAAMguC,EAAIC,GACtB,IAAIC,EAAWF,IAAOhzC,EAClBmzC,EAAOD,GAAYF,EAAK,GAAKA,EAAK,EAClCI,EAAOF,GAAYD,EAAK,GAAKA,EAAK,EAOtC,OALIC,IAAeC,GAAQC,KAAkB,SAATpuC,GAAqBmuC,GAAQC,KAC/DpuC,EAAO,OACPmuC,EAAOC,GAAO,GAGT,CACLpuC,KAAMA,EACNsT,MAAO66B,GAAQC,EAAOD,GAAQC,EAAOJ,EAAKC,EAAK,CAACD,EAAIC,GAAM,CAACA,EAAID,GAAM,CAACG,EAAOH,EAAKC,GAAM,MAI5F,GAnBA5uB,GAAM1K,EACNm5B,GAAMn5B,EAkBFrC,EApBJ4M,GAAMvK,GAqBJ,OAAOrC,EAAO+M,GAAMrf,EAAKsS,EAAOw7B,GAAM,OAAS,aAAe9tC,EAAK+tC,EAAYD,GAAM,EAAIzuB,IAG3F,IAAInL,EAAI,EAAImL,EAAKA,EAAK,EAAIH,EAAK4uB,EAE/B,GAAIx7B,EAAO4B,GACT,OAAOlU,EAAK,OAAQqf,GAAM,EAAIH,IAGhC,IAAImvB,EAAKn6B,EAAI,EAAI7G,KAAK0D,KAAKmD,EAAI,GAAK7G,KAAK0D,MAAMmD,GAC3Co6B,EAAK,EAAIpvB,EACb,OAAOlf,EAAKkU,EAAI,EAAI65B,EAAa,QAAS1uB,EAAKgvB,GAAMC,GAAKjvB,EAAKgvB,GAAMC,IAEvE74B,UAAW,SAAmB1L,EAAG1K,EAAGC,EAAGivC,GAIrC,GAHIlvC,IAAMrE,IAAWqE,EAAI,GACrBC,IAAMtE,IAAWsE,EAAI,GAErBsnC,EAAM6D,WAAW1gC,GAAI,CACvB,IAAIwH,EAAIxH,EAEJzK,EAAI,IACNiS,EAAIq1B,EAAM+B,UAAUp3B,EAAGjS,GAAG,GAC1BD,GAAKC,GAGHD,EAAI,IACNkS,EAAIq1B,EAAM+B,UAAUp3B,EAAGlS,GAAG,IAG5B,IAAI8T,EAAK5B,EAAE,GAAKA,EAAE,GACdsR,EAAKtR,EAAE,GAAKA,EAAE,GAClB,OAAOlE,KAAK0D,KAAKoC,EAAKA,EAAK0P,EAAKA,GAGlC,OAAOlS,EAAU6B,UAAU+7B,GAAMnB,EAAmBrjC,GAAI1K,EAAGC,EAAGmuC,EAAcpuC,EAAGC,KAEjFmpC,UAAW,SAAmB1+B,EAAGwd,EAAQ/lB,GAEvC,GADIA,IAAUxG,IAAWwG,EAAQ+lB,EAAS,EAAI,EAAI,GACnC,IAAXA,EAAc,OAAO/lB,EACzB,IAAIsP,EAAMzD,KAAKyD,IAEX09B,EAAUjnB,EAAS,EACnBloB,EAAImvC,EAAUhtC,EAAQ,EACtBlC,EAAIkvC,EAAU,EAAIhtC,EAClB+sC,EAAKnB,EAAmBrjC,GACxB0kC,EAAc7H,EAAMnxB,UAAU1L,EAAG1K,EAAGC,EAAGivC,GACvCG,EAAO59B,EAAIyW,GAAUknB,EAEzB,GAAI39B,EAAI49B,GARM,MASZ,OAAOF,EAAUlvC,EAAID,EAChB,GAAIqvC,EAVG,MAWZ,OAAO,KAGT,IAAIC,EAAQpnB,EAASknB,EACjBryC,EAAS,EAQb,OAAOuU,EAAUqC,UANjB,SAAWyB,GAGT,OAFArY,GAAUuU,EAAU6B,UAAU+7B,EAAI/sC,EAAOiT,EAAGg5B,EAAcjsC,EAAOiT,IACjEjT,EAAQiT,EACDrY,EAASmrB,IAGWgnB,EAAI/sC,EAAQmtC,EAAOtvC,EAAGC,EAAG,GAAI,QAE5D0b,SAAU,SAAkBjR,EAAG0K,GAC7B,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,IAE3Bm6B,WAAY,SAAoB7kC,EAAG0K,GACjC,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,IAE3Bo6B,mBAAoB,SAA4B9kC,EAAG0K,GACjD,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,IAE3Bq6B,UAAW,SAAmB/kC,EAAG0K,GAC/B,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,IAE3Bs6B,kBAAmB,SAA2BhlC,EAAG0K,GAC/C,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,IAE3Bu6B,aAAc,SAAsBjlC,EAAG0K,GACrC,OAAOH,EAASvK,EAAG0K,EAAG,GAAG,GAAOlE,GAElC0+B,SAAU,SAAkBllC,GAC1B,IAAIwK,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GAGPsjC,EAAW,EAAI95B,EAATgB,EAAc,EAAIf,EAFnBzJ,EAAE,GAGPujC,EAAK,EAAI/4B,EAAK,EAAIhB,EAAK,EAAIC,EAC3B0pB,GAAM,EAAI3oB,EAAK,EAAIhB,EACnBg6B,EAAW,EAAI/0B,EAAT4wB,EAAc,EAAI3wB,EAJnB1O,EAAE,GAKPyjC,EAAK,EAAIpE,EAAK,EAAI5wB,EAAK,EAAIC,EAC3B0kB,GAAM,EAAIiM,EAAK,EAAI5wB,EAGnBlF,EAAQ,GAEZ,OADA3C,EAAUsD,WAAW,GAAKo5B,EAAKA,EAAKE,EAAKA,GAAK,GAAKF,EAAKC,EAAKE,EAAKD,GAAK,GAAKD,EAAKA,EAAKE,EAAKA,GAAM,GAAKtQ,EAAKmQ,EAAKlQ,EAAKoQ,GAAKrQ,EAAKoQ,EAAKE,EAAKrQ,EAAI7pB,EAHlI,KACA,WAGJA,EAAM3E,WAIhB,IAAI,WACP,SAASugC,EAAYC,EAAWjyB,EAAS+B,EAAI+uB,EAAI55B,EAAI65B,EAAImB,GACvD,IAAIC,GAAgBD,GAAWnwB,EAAGumB,gBAAkBpxB,EAChDk7B,GAAcF,GAAWnwB,IAAO7K,GAAM6K,EAAGkmB,YAAc/wB,EACvDu5B,EAAO,KACPC,EAAO,EAAID,EAEf,GAAW,OAAPK,GAAeA,IAAOqB,EAAe1B,EAAO,IAAMK,IAAOsB,EAAa1B,EAAO,IACpE,OAAPK,GAAeA,IAAOqB,EAAa3B,EAAO,IAAMM,IAAOoB,EAAezB,EAAO,GAAI,CACnF,IAAI2B,EAAO,IAAItK,EAAchmB,EAAI+uB,EAAI,KAAMoB,GACvCI,EAAO,IAAIvK,EAAc7wB,EAAI65B,EAAI,KAAMmB,GAC3CG,EAAKE,cAAgBD,EACrBA,EAAKC,cAAgBF,EAEhBryB,IAAWA,EAAQqyB,IACtBtK,EAAc//B,OAAOiqC,EAAWI,GAAM,IAM9C,SAASG,EAAsB/lC,EAAIC,EAAIqV,EAAI7K,EAAI+6B,EAAWjyB,EAASmuB,EAAMsE,EAAWC,EAAOjC,EAAMC,EAAM5qB,EAAMC,GAC3G,KAAM2sB,GAAS,QAAUD,GAAa,GAAI,OAAOC,EACjD,IAkBIC,EACAC,EAlBAC,EAAMnmC,EAAG,GACTomC,EAAMpmC,EAAG,GACTqmC,EAAMrmC,EAAG,GACTsmC,EAAMtmC,EAAG,GACTwY,EAAoBX,EAAKW,kBACzBlD,EAAKkD,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKtmC,EAAG,GAAIA,EAAG,IACrDyV,EAAK+C,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKtmC,EAAG,GAAIA,EAAG,IACrD27B,EAASrmB,EAAKG,EAAK,EAAI,EAAI,EAAI,EAAI,EACnC8wB,EAAO5K,EAASl4B,KAAKD,IAAI,EAAG8R,EAAIG,GAChC+wB,EAAO7K,EAASl4B,KAAKC,IAAI,EAAG4R,EAAIG,GAChCgxB,EAAMjuB,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKvmC,EAAG,GAAIA,EAAG,IACtD2mC,EAAMluB,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKvmC,EAAG,GAAIA,EAAG,IACtD4mC,EAAMnuB,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKvmC,EAAG,GAAIA,EAAG,IACtD6mC,EAAMpuB,EAAkB2tB,EAAKC,EAAKC,EAAKC,EAAKvmC,EAAG,GAAIA,EAAG,IACtD8mC,EAyCN,SAAuBC,EAAKC,EAAKC,EAAKC,GACpC,IAMIJ,EANAhL,EAAK,CAAC,EAAGiL,GACThL,EAAK,CAAC,EAAI,EAAGiL,GACbhL,EAAK,CAAC,EAAI,EAAGiL,GACb/F,EAAK,CAAC,EAAGgG,GACTC,EAAQH,GAAO,EAAID,EAAMG,GAAO,EAChCE,EAAQH,GAAOF,EAAM,EAAIG,GAAO,EAGpC,GAAIC,EAAQC,EAAQ,EAClBN,EAAO,CAAC,CAAChL,EAAIC,EAAImF,GAAK,CAACpF,EAAIE,EAAIkF,QAC1B,CACL,IAAImG,EAAYF,EAAQC,EACxBN,EAAO,CAACO,GAAa,EAAI,CAACvL,EAAIC,EAAImF,GAAMmG,GAAa,GAAM,CAACvL,EAAIE,EAAIkF,GAAM,CAACpF,EAAIC,EAAIC,EAAIkF,GAAK,CAACpF,EAAIoF,IAGnG,OAAQiG,GAASC,GAAS,EAAIN,EAAKnc,UAAYmc,EAzDpCQ,CAAcZ,EAAKC,EAAKC,EAAKC,GACpC/jC,EAAMgkC,EAAK,GACX9jC,EAAS8jC,EAAK,GAGlB,GAAW,IAAPvxB,GAAmB,IAAPG,GAAoB,IAARgxB,GAAqB,IAARC,GAAqB,IAARC,GAAqB,IAARC,GAAqE,OAAvDX,EAAWqB,EAAezkC,EAAKE,EAAQwjC,EAAMC,KAA8F,OAA3EN,EAAWoB,EAAezkC,EAAI6nB,UAAW3nB,EAAO2nB,UAAW6b,EAAMC,IAAgB,OAAOR,EACzO,IAAIuB,EAAUxD,GAAQC,EAAOD,GAAQkC,EACjCuB,EAAUzD,GAAQC,EAAOD,GAAQmC,EAErC,GAAIziC,KAAKC,IAAI2V,EAAOD,EAAMouB,EAAUD,GAxBf,KAwB0C,CAC7D,IAAI18B,GAAK08B,EAAUC,GAAW,EAC1BzR,GAAK3c,EAAOC,GAAQ,EACxBisB,EAAYC,EAAWjyB,EAASmuB,EAAOj3B,EAAK6K,EAAIosB,EAAO1L,EAAIlrB,EAAG42B,EAAOpsB,EAAK7K,EAAIi3B,EAAO52B,EAAIkrB,OACpF,CACLh2B,EAAKi9B,EAAMwB,QAAQz+B,EAAIkmC,EAAUC,GACjC,IAAIuB,EAAQpuB,EAAOD,EAEnB,GAAI8sB,EAAWD,EAAW,GACxB,GAAIuB,EAAUD,EAAUE,EAAO,CAEzB58B,GAAK08B,EAAUC,GAAW,EAC9BxB,EAAQF,EAAsB9lC,GAF1BwT,EAAQwpB,EAAM+B,UAAUh/B,EAAI,KAEQ,GAAIyK,EAAI6K,EAAIkwB,EAAWjyB,GAAUmuB,EAAMsE,EAAWC,EAAO5sB,EAAMC,EAAMkuB,EAAS18B,GACtHm7B,EAAQF,EAAsB9lC,EAAIwT,EAAM,GAAIhJ,EAAI6K,EAAIkwB,EAAWjyB,GAAUmuB,EAAMsE,EAAWC,EAAO5sB,EAAMC,EAAMxO,EAAG28B,OAC3G,CACL,IAAIh0B,EACAuiB,GAAK3c,EAAOC,GAAQ,EACxB2sB,EAAQF,GAFJtyB,EAAQwpB,EAAM+B,UAAU/+B,EAAI,KAEI,GAAID,EAAIyK,EAAI6K,EAAIkwB,EAAWjyB,GAAUmuB,EAAMsE,EAAWC,EAAO5sB,EAAM2c,EAAGwR,EAASC,GACnHxB,EAAQF,EAAsBtyB,EAAM,GAAIzT,EAAIyK,EAAI6K,EAAIkwB,EAAWjyB,GAAUmuB,EAAMsE,EAAWC,EAAOjQ,EAAG1c,EAAMkuB,EAASC,QAInHxB,EADY,IAAVyB,GAAeA,GA7CF,KA8CP3B,EAAsB9lC,EAAID,EAAIyK,EAAI6K,EAAIkwB,EAAWjyB,GAAUmuB,EAAMsE,EAAWC,EAAO5sB,EAAMC,EAAMkuB,EAASC,GAExG1B,EAAsB/lC,EAAIC,EAAIqV,EAAI7K,EAAI+6B,EAAWjyB,EAASmuB,EAAMsE,EAAWC,EAAOuB,EAASC,EAASpuB,EAAMC,GAKxH,OAAO2sB,EAsBT,SAASsB,EAAeI,EAASC,EAAYpB,EAAMC,GACjD,OAAIkB,EAAQ,GAAG,GAAKnB,EACXqB,EAAmBF,GAAS,EAAMnB,GAChCoB,EAAW,GAAG,GAAKnB,EACrBoB,EAAmBD,GAAY,EAAOnB,GAEtCkB,EAAQ,GAAG,GAItB,SAASE,EAAmBhzC,EAAMiO,EAAKglC,GAIrC,IAHA,IAAIvuB,EAAK1kB,EAAK,GAAG,GACb2kB,EAAK3kB,EAAK,GAAG,GAERvC,EAAI,EAAGC,EAAIsC,EAAKpC,OAAQH,EAAIC,EAAGD,IAAK,CAC3C,IAAIy1C,EAAKlzC,EAAKvC,GAAG,GACb01C,EAAKnzC,EAAKvC,GAAG,GAEjB,GAAIwQ,EAAMklC,GAAMF,EAAYE,GAAMF,EAChC,OAAOE,IAAOF,EAAYC,EAAKxuB,GAAMuuB,EAAYtuB,IAAOuuB,EAAKxuB,IAAOyuB,EAAKxuB,GAG3ED,EAAKwuB,EACLvuB,EAAKwuB,EAGP,OAAO,KAGT,SAASC,EAA0B7nC,EAAGmZ,EAAIC,EAAIC,EAAIC,GAChD,IAAI/Q,EAAS3B,EAAU2B,OAEvB,GAAIA,EAAO8Q,IAAO9Q,EAAO+Q,GAAK,CAC5B,IAAI5O,EAAImyB,EAAMgE,UAAU7gC,EAAG,IAAIkL,EAAMiO,EAAIC,IACzC,OAAa,OAAN1O,EAAa,GAAK,CAACA,GAS5B,IANA,IAAIe,EAAQnI,KAAKoJ,OAAO4M,EAAID,GACxBvN,EAAMxI,KAAKwI,IAAIL,GACfI,EAAMvI,KAAKuI,IAAIJ,GACf3L,EAAK,GACLyJ,EAAQ,GAEHrX,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAG,CAC7B,IAAIsU,EAAIxG,EAAE9N,GAAKinB,EACX1S,EAAIzG,EAAE9N,EAAI,GAAKknB,EACnBtZ,EAAG5J,KAAKsQ,EAAIqF,EAAMpF,EAAIqF,EAAKtF,EAAIsF,EAAMrF,EAAIoF,GAI3C,OADAgxB,EAAM3yB,WAAWpK,EAAI,EAAG,EAAGyJ,EAAO,EAAG,GAC9BA,EAGT,SAASu+B,EAA0BloC,EAAIC,EAAIqV,EAAI7K,EAAI+6B,EAAWjyB,EAASmuB,GAOrE,IANA,IAAI93B,EAAK3J,EAAG,GACR4O,EAAK5O,EAAG,GAGR0J,EAAQs+B,EAA0BjoC,EAAI4J,EAAIiF,EAFrC5O,EAAG,GAE2C2J,EAD9C3J,EAAG,GACoD4O,GAEvDvc,EAAI,EAAGC,EAAIoX,EAAMlX,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAI+xC,EAAK16B,EAAMrX,GACXypC,EAAKkB,EAAM5rB,SAASrR,EAAIqkC,GACxBC,EAAKrH,EAAMgE,UAAUhhC,EAAI87B,GAElB,OAAPuI,GACFiB,EAAYC,EAAWjyB,EAASmuB,EAAOj3B,EAAK6K,EAAIosB,EAAO4C,EAAKD,EAAI3C,EAAOpsB,EAAK7K,EAAIi3B,EAAO2C,EAAKC,IAKlG,SAAS6D,EAAoBnoC,EAAIC,EAAIqV,EAAI7K,EAAI+6B,EAAWjyB,GACtD,IAAIgV,EAAKzQ,EAAKzE,UAAUrT,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIC,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAExEsoB,GACFgd,EAAYC,EAAWjyB,EAAS+B,EAAI2nB,EAAMgE,UAAUjhC,EAAIuoB,GAAK9d,EAAIwyB,EAAMgE,UAAUhhC,EAAIsoB,IAIzF,SAAS6f,EAAsBpoC,EAAIC,EAAIqV,EAAI7K,EAAI+6B,EAAWjyB,GACxD,IAAIH,EAAU,MACV3P,EAAMC,KAAKD,IACXE,EAAMD,KAAKC,IAEf,GAAIA,EAAI3D,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAAMoT,EAAU3P,EAAIxD,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,KAAOwD,EAAIzD,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAAMoT,EAAUzP,EAAI1D,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,KAAO0D,EAAI3D,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAAMoT,EAAU3P,EAAIxD,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,KAAOwD,EAAIzD,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAAMoT,EAAUzP,EAAI1D,EAAG,GAAIA,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAAK,CAC5T,IAAIooC,EAAWC,EAAYtoC,EAAIC,GAE/B,GAAIooC,EACF,IAAK,IAAI/1C,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAImzC,EAAU4C,EAAS/1C,GACvBizC,EAAYC,EAAWjyB,EAAS+B,EAAImwB,EAAQ,GAAIh7B,EAAIg7B,EAAQ,IAAI,OAE7D,CACL,IAAI8C,EAAYtL,EAAM6D,WAAW9gC,GAC7BwoC,EAAYvL,EAAM6D,WAAW7gC,GAC7Bq/B,EAAWiJ,GAAaC,EACxB9G,EAAO6G,IAAcC,EACrBC,EAASjD,EAAU/yC,OAGvB,IAFC6sC,EAAW6I,EAAsBI,GAAaC,EAAYN,EAA4BnC,GAAuBrE,EAAOzhC,EAAKD,EAAI0hC,EAAO1hC,EAAKC,EAAIyhC,EAAOj3B,EAAK6K,EAAIosB,EAAOpsB,EAAK7K,EAAI+6B,EAAWjyB,EAASmuB,EAAM,EAAG,EAAG,EAAG,EAAG,EAAG,IAElNpC,GAAYkG,EAAU/yC,SAAWg2C,EACpC,IAASn2C,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAI+xC,EAAK/xC,GAAK,EACVgyC,EAAS,EAAJhyC,EACL2S,EAAU,EAALo/B,EACLn/B,EAAU,EAALo/B,EACLvI,EAAK,IAAIzwB,EAAMtL,EAAGiF,GAAKjF,EAAGiF,EAAK,IAC/B+2B,EAAK,IAAI1wB,EAAMrL,EAAGiF,GAAKjF,EAAGiF,EAAK,IAE/B62B,EAAG5tB,QAAQ6tB,EAAI5oB,IACjBmyB,EAAYC,EAAWjyB,EAAS+B,EAAI+uB,EAAI55B,EAAI65B,KAOtD,OAAOkB,EAGT,SAASkD,EAAoB1oC,EAAIsV,EAAIkwB,EAAWjyB,GAC9C,IAAIo1B,EAAO1L,EAAMe,SAASh+B,GAE1B,GAAkB,SAAd2oC,EAAKtyC,KAAiB,CACxB,IAAIsT,EAAQg/B,EAAKh/B,MACjB47B,EAAYC,EAAWjyB,EAAS+B,EAAI3L,EAAM,GAAI2L,EAAI3L,EAAM,IAG1D,OAAO67B,EAoDT,SAAS8C,EAAYtoC,EAAIC,GACvB,SAAS2oC,EAAqBxoC,GAC5B,IAAIwG,EAAIxG,EAAE,GAAKA,EAAE,GACbyG,EAAIzG,EAAE,GAAKA,EAAE,GACjB,OAAOwG,EAAIA,EAAIC,EAAIA,EAGrB,IAAIM,EAAMzD,KAAKyD,IACX+F,EAAc4K,EAAK5K,YAEnBi0B,EAAc,KACdoH,EAAYtL,EAAM6D,WAAW9gC,GAC7BwoC,EAAYvL,EAAM6D,WAAW7gC,GAC7B4oC,EAAeN,GAAaC,EAC5B9G,EAAOkH,EAAqB5oC,GAAM4oC,EAAqB3oC,GACvD6oC,EAAKpH,EAAOzhC,EAAKD,EACjB+oC,EAAKrH,EAAO1hC,EAAKC,EACjBsZ,EAAKuvB,EAAG,GACRtvB,EAAKsvB,EAAG,GACRrvB,EAAKqvB,EAAG,GAAKvvB,EACbG,EAAKovB,EAAG,GAAKtvB,EAEjB,GAAItM,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIqvB,EAAG,GAAIA,EAAG,IAAI,GAAQ5H,GAAej0B,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIqvB,EAAG,GAAIA,EAAG,IAAI,GAAQ5H,GAChH0H,GAAgB37B,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIovB,EAAG,GAAIA,EAAG,IAAI,GAAQ3H,GAAej0B,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIovB,EAAG,GAAIA,EAAG,IAAI,GAAQ3H,GAAej0B,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIqvB,EAAG,GAAIA,EAAG,IAAI,GAAQ5H,GAAej0B,EAAYqM,EAAIC,EAAIC,EAAIC,EAAIqvB,EAAG,GAAIA,EAAG,IAAI,GAAQ5H,IACxQoH,EAAYC,EAAYK,GAAe,QAEpC,GAAIA,EACT,OAAO,KAGT,GAAIN,EAAYC,EACd,OAAO,KAMT,IAHA,IAAIpoC,EAAI,CAACJ,EAAIC,GACT+oC,EAAQ,GAEH12C,EAAI,EAAGA,EAAI,GAAK02C,EAAMv2C,OAAS,EAAGH,IAAK,CAC9C,IAAI2S,EAAS,EAAJ3S,EACL4S,EAAU,EAALD,EACLo/B,EAAK/xC,GAAK,EACVgyC,EAAKrH,EAAMgE,UAAU7gC,EAAE6E,GAAK,IAAIqG,EAAMlL,EAAE8E,GAAIm/B,EAAK,EAAI,GAAIjkC,EAAE8E,GAAIm/B,EAAK,EAAI,KAE5E,GAAU,MAANC,EAAY,CACd,IAAI/9B,EAAOtB,EAAK,CAACo/B,EAAIC,GAAM,CAACA,EAAID,KAE3B2E,EAAMv2C,QAAU0U,EAAIZ,EAAK,GAAKyiC,EAAM,GAAG,IArC9B,MAqCmD7hC,EAAIZ,EAAK,GAAKyiC,EAAM,GAAG,IArC1E,OAsCZA,EAAM1yC,KAAKiQ,GAIf,GAAIjU,EAAI,IAAM02C,EAAMv2C,OAAQ,MAG9B,GAAqB,IAAjBu2C,EAAMv2C,OACRu2C,EAAQ,UACH,IAAKH,EAAc,CACxB,IAAIlI,EAAK1D,EAAMwB,QAAQz+B,EAAIgpC,EAAM,GAAG,GAAIA,EAAM,GAAG,IAC7CpI,EAAK3D,EAAMwB,QAAQx+B,EAAI+oC,EAAM,GAAG,GAAIA,EAAM,GAAG,KAC7C7hC,EAAIy5B,EAAG,GAAKD,EAAG,IAAMQ,GAAeh6B,EAAIy5B,EAAG,GAAKD,EAAG,IAAMQ,GAAeh6B,EAAIy5B,EAAG,GAAKD,EAAG,IAAMQ,GAAeh6B,EAAIy5B,EAAG,GAAKD,EAAG,IAAMQ,KAAa6H,EAAQ,MAG5J,OAAOA,EAgDT,MAAO,CACL3hB,iBAAkB,SAA0BkT,GAC1C,IAAIv6B,EAAKxN,KAAKkiB,YACVzU,EAAKs6B,GAASA,IAAU/nC,MAAQ+nC,EAAM7lB,YAC1C,OAAOzU,EAAKmoC,EAAsBpoC,EAAIC,EAAIzN,KAAM+nC,EAAO,IAAMmO,EAAoB1oC,EAAIxN,KAAM,KAE7FuC,QAAS,CACPuzC,YAAaA,EACbjhB,iBAvKJ,SAA0BhkB,EAASC,EAASiQ,EAAS01B,EAASC,EAASC,GACrE,IACI/3C,GAAQkS,EACRlS,IAAMkS,EAAUD,GAOpB,IANA,IAAI+lC,EAAU/lC,EAAQ5Q,OAClB42C,EAAU/lC,EAAQ7Q,OAClB62C,EAAU,IAAI7xC,MAAM2xC,GACpBG,EAAUn4C,EAAOk4C,EAAU,IAAI7xC,MAAM4xC,GACrC7D,EAAY,GAEPlzC,EAAI,EAAGA,EAAI82C,EAAS92C,IAC3Bg3C,EAAQh3C,GAAK+Q,EAAQ/Q,GAAGoiB,UAAUu0B,GAGpC,IAAK73C,EACH,IAASkB,EAAI,EAAGA,EAAI+2C,EAAS/2C,IAC3Bi3C,EAAQj3C,GAAKgR,EAAQhR,GAAGoiB,UAAUw0B,GAMtC,IAFA,IAAIM,EAAmBnnC,EAAmBe,0BAA0BkmC,EAASC,EAnB/D,MAqBLE,EAAS,EAAGA,EAASL,EAASK,IAAU,CAC/C,IAAIC,EAASrmC,EAAQomC,GACjBzpC,EAAKspC,EAAQG,GAEbr4C,GACFs3C,EAAoB1oC,EAAI0pC,EAAQlE,EAAWjyB,GAG7C,IAAIo2B,EAAcH,EAAiBC,GAEnC,GAAIE,EACF,IAAK,IAAI/jC,EAAI,EAAGA,EAAI+jC,EAAYl3C,OAAQmT,IAAK,CAC3C,GAAIujC,GAAgB3D,EAAU/yC,OAAQ,OAAO+yC,EAC7C,IAAIoE,EAASD,EAAY/jC,GAEzB,IAAKxU,GAAQw4C,EAASH,EAAQ,CAC5B,IAAII,EAASvmC,EAAQsmC,GAErBxB,EAAsBpoC,EADbupC,EAAQK,GACaF,EAAQG,EAAQrE,EAAWjyB,KAMjE,OAAOiyB,GA0HLyC,0BAA2BA,EAC3BpF,oBAvDJ,SAA6BziC,EAAG0iC,GAC9B,IAAIl4B,EAAKxK,EAAE,GACPq/B,EAAKr/B,EAAE,GACPwJ,EAAKxJ,EAAE,GACPyO,EAAKzO,EAAE,GACPyJ,EAAKzJ,EAAE,GACP0O,EAAK1O,EAAE,GACPs/B,EAAKt/B,EAAE,GACPu/B,EAAKv/B,EAAE,GACP2jC,EAAajB,EAAQ11B,YACrBmH,EAAKwvB,EAAWn9B,EAChB4N,EAAKuvB,EAAWl9B,EAChB68B,EAAK,EAAIhE,EAAK,EAAI71B,EAAK,EAAID,EAAK,EAAIgB,EACpCg5B,EAAK,EAAIjE,EAAK,EAAI7wB,EAAK,EAAID,EAAK,EAAI4wB,EACpCkE,EAAK,EAAI95B,EAAK,GAAKD,EAAK,EAAIgB,EAC5Bi5B,EAAK,EAAI/0B,EAAK,GAAKD,EAAK,EAAI4wB,EAC5BlM,EAAK,EAAI3pB,EAAK,EAAIgB,EAClB4oB,EAAK,EAAI3kB,EAAK,EAAI4wB,EAClBqK,EAAM,EAAIpG,EAAKlvB,EAAK,EAAIovB,EAAKrvB,EAC7Bw1B,EAAQ,GAEZ,GAAIrmC,KAAKyD,IAAI2iC,GAAO9iC,EAAUuB,kBAAmB,CAI/C,GAAW,IAFPuhC,EAAMpG,EAAKG,EAAKD,EAAKD,GAEX,CACZ,IAAI74B,IAJI44B,EAAKlQ,EAAKoQ,EAAKrQ,GAIRuW,EACXh/B,GAAK,GAAKA,GAAK,GAAGi/B,EAAMzzC,KAAKwU,QAE9B,CACL,IAAIimB,GAAS4S,EAAKA,EAAK,EAAID,EAAKnQ,GAAM/e,EAAKA,IAAO,EAAImvB,EAAKE,EAAK,EAAID,EAAKrQ,EAAK,EAAImQ,EAAKlQ,GAAMjf,EAAKC,GAAMqvB,EAAKA,EAAK,EAAID,EAAKpQ,GAAMjf,EAAKA,EAClI0nB,EAAI0H,EAAKnvB,EAAKqvB,EAAKtvB,EAEvB,GAAIwc,GAAS,GAAY,GAAP+Y,EAAU,CAC1B,IAAIv/B,EAAI7G,KAAK0D,KAAK2pB,GACdiZ,IAAO/N,EAAI1xB,GAAKu/B,EAChBzF,IAAOpI,EAAI1xB,GAAKu/B,EAChBE,GAAM,GAAKA,GAAM,GAAGD,EAAMzzC,KAAK0zC,GAC/B3F,GAAM,GAAKA,GAAM,GAAG0F,EAAMzzC,KAAK+tC,IAIvC,OAAO0F,OAiBPzO,EAAgB9pC,EAAKyD,OAAO,CAC9BkB,OAAQ,gBACRf,WAAY,SAAuBmlC,EAAO7I,EAAM/qB,EAAOsjC,EAAUC,GAC/D,GAAIxY,GAAQ,UAAY,CACtB,IAAIvgB,EAAOopB,EAAMiB,UAEbrqB,IACFugB,EAAO,EACP6I,EAAQppB,GAIZ3e,KAAK23C,UAAU5P,GAEf/nC,KAAK43C,MAAQ1Y,EACbl/B,KAAK0nC,OAASvzB,GAAS4zB,EAAM8P,eAAe3Y,GAC5Cl/B,KAAKy3C,SAAWA,EAChBz3C,KAAK03C,UAAYA,EACjB13C,KAAKszC,cAAgBtzC,KAAK83C,MAAQ93C,KAAK+3C,UAAY,MAErDC,SAAU,SAAkBlhB,GAC1B92B,KAAK8nC,MAAQhR,EACb92B,KAAKi4C,SAAWnhB,EAAOA,EAAKmhB,SAAW,GAEzCN,UAAW,SAAmB5P,GAC5B/nC,KAAKg4C,SAASjQ,EAAMD,OAEpB9nC,KAAKk4C,OAASnQ,EACd/nC,KAAKm4C,SAAW,KAChBn4C,KAAK+oC,UAAYhB,EAAMgB,UACvB/oC,KAAKkrC,UAAYnD,EAAMmD,WAEzBkN,YAAa,SAAqBlO,GAChC,IAAInC,EAAQmC,EAAQxB,WAEhBX,EACF/nC,KAAK23C,UAAU5P,IAEf/nC,KAAKg4C,SAAS9N,EAAQpC,OAEtB9nC,KAAK+oC,UAAYmB,EACjBlqC,KAAKkrC,UAAY,MAGnBlrC,KAAKm4C,SAAWjO,EAChBlqC,KAAK43C,MAAQ1N,IAAYlqC,KAAK+oC,UAAY,EAAI,EAC9C/oC,KAAK0nC,OAASwC,EAAQxC,OAAO3kC,SAE/Bs1C,WAAY,WACV,IAAInO,EAAUlqC,KAAKm4C,SAEnB,IAAKjO,EAAS,CACZ,IAAInC,EAAQ/nC,KAAK0oC,WACbxJ,EAAOl/B,KAAKs4C,UAEH,IAATpZ,EACFgL,EAAUnC,EAAMgB,UACE,IAAT7J,EACTgL,EAAUnC,EAAMmD,UACC,MAARhM,IACTgL,EAAUnC,EAAMmE,cAAc,EAAGhN,GAAQ6I,EAAMmE,cAAchN,EAAM,GAAK6I,EAAMgB,UAAYhB,EAAMmD,WAGlGlrC,KAAKm4C,SAAWjO,EAGlB,OAAOA,GAETxB,SAAU,WACR,IAAI5R,EAAO92B,KAAK8nC,MACZrhC,EAAOzG,KAMX,SAASu4C,EAAWrO,GAClB,IAAInC,EAAQmC,GAAWA,EAAQxB,WAE/B,GAAIX,GAAwD,OAA9CthC,EAAKmxC,MAAQ7P,EAAM0G,UAAUhoC,EAAKihC,SAG9C,OAFAjhC,EAAKkxC,UAAU5P,GAERA,EAIX,OAdIjR,GAAQA,EAAKmhB,WAAaj4C,KAAKi4C,WACjCj4C,KAAK43C,MAAQ53C,KAAKw4C,QAAUx4C,KAAKy4C,aAAez4C,KAAKk4C,OAAS,MAazDl4C,KAAKk4C,QAAUK,EAAWv4C,KAAKm4C,WAAaI,EAAWv4C,KAAK+oC,YAAcwP,EAAWv4C,KAAKkrC,UAAU7B,gBAE7GZ,QAAS,WACP,IAAIV,EAAQ/nC,KAAK0oC,WACjB,OAAOX,GAASA,EAAMD,OAExBnf,SAAU,WACR,IAAIof,EAAQ/nC,KAAK0oC,WACjB,OAAOX,GAASA,EAAMpf,YAExB2vB,QAAS,WACP,IAAIvQ,EAAQ/nC,KAAK0oC,WACbxJ,EAAOl/B,KAAK43C,MAChB,OAAO7P,GAAiB,MAAR7I,EAAel/B,KAAK43C,MAAQ7P,EAAM0G,UAAUzuC,KAAK0nC,QAAUxI,GAE7EwZ,aAAc,WACd75B,SAAU,WACR,OAAO7e,KAAK0nC,QAEdiJ,UAAW,WACT,IAAIvlB,EAASprB,KAAKw4C,QAElB,GAAc,MAAVptB,EAAgB,CAClBA,EAAS,EACT,IAAI0L,EAAO92B,KAAKyoC,UACZp/B,EAAQrJ,KAAK2oB,WAEjB,GAAImO,GAAiB,MAATztB,EAGV,IAFA,IAAI2H,EAAS8lB,EAAK8R,YAET9oC,EAAI,EAAGA,EAAIuJ,EAAOvJ,IACzBsrB,GAAUpa,EAAOlR,GAAGwZ,YAIxBtZ,KAAKw4C,QAAUptB,GAAUprB,KAAK24C,iBAGhC,OAAOvtB,GAETutB,eAAgB,WACd,IAAIvtB,EAASprB,KAAKy4C,aAElB,GAAc,MAAVrtB,EAAgB,CAClB,IAAI2c,EAAQ/nC,KAAK0oC,WACbxJ,EAAOl/B,KAAKs4C,UAChBt4C,KAAKy4C,aAAertB,EAAiB,MAAR8T,GAAgB6I,GAASA,EAAMmE,cAAc,EAAGhN,GAG/E,OAAO9T,GAETwtB,gBAAiB,WACf,OAAO54C,KAAKszC,eAEd54B,YAAa,WACX,OAAO1a,KAAK03C,WAEdr8B,OAAQ,WACN,IAAI0sB,EAAQ/nC,KAAK0oC,WACb9mC,EAAMmmC,GAASA,EAAMsE,aAAarsC,KAAKs4C,WAM3C,OAJI12C,GACF5B,KAAKo4C,YAAYx2C,EAAImnC,WAGhBnnC,GAETyT,MAAO,WACL,IAAI0yB,EAAQ/nC,KAAK0oC,WACb5R,EAAOiR,EAAMD,MACblmC,EAAMmmC,GAASA,EAAM4E,YAAY3sC,KAAKs4C,WAM1C,OAJI12C,GACF5B,KAAKo4C,YAAYthB,EAAK+hB,kBAGjBj3C,GAETkD,OAAQ,SAAgB4rC,EAAKoI,GAC3B,IAAIl3C,EAAM5B,OAAS0wC,EAEnB,IAAK9uC,GAAO8uC,aAAe5H,EAAe,CACxC,IAAIhmB,EAAK9iB,KAAK0oC,WACVzwB,EAAKy4B,EAAIhI,WACTa,EAAKzmB,EAAGglB,MAGZ,GAAIyB,IAFKtxB,EAAG6vB,MAEG,CACb,IAAInzB,EAAMzD,KAAKyD,IAEX49B,EAAO59B,EAAI3U,KAAK2wC,YAAcD,EAAIC,aAClCl+B,GAAMqmC,GAAgB94C,KAAKszC,cAC3B5gC,GAAMomC,GAAgBpI,EAAI4C,cAC9B1xC,GAAO2wC,EAJO,MAIWhJ,GAAM50B,EAAI40B,EAAGjwB,YAAci5B,GAJtC,SAI4D9/B,IAAOC,GAAMD,GAAMC,GAAMD,EAAG3N,OAAO4N,GAAI,KAIrH,OAAO9Q,GAET6B,SAAU,WACR,IAAIwd,EAAQ,GACR9M,EAAQnU,KAAK6e,WACbvI,EAAIvS,EAAUC,SACdmQ,GAAO8M,EAAMnd,KAAK,UAAYqQ,GAClC,IAAI9K,EAAQrJ,KAAK2oB,WACJ,MAATtf,GAAe4X,EAAMnd,KAAK,UAAYuF,GAC1C,IAAI61B,EAAOl/B,KAAKs4C,UAGhB,OAFY,MAARpZ,GAAcje,EAAMnd,KAAK,SAAWwS,EAAErS,OAAOi7B,IAC3B,MAAlBl/B,KAAK03C,WAAmBz2B,EAAMnd,KAAK,aAAewS,EAAErS,OAAOjE,KAAK03C,YAC7D,KAAOz2B,EAAM/c,KAAK,MAAQ,MAEnC60C,WAAY,WACV,IAAIC,EAAQh5C,KAAKszC,cAEjB,GAAI0F,GAASh5C,KAAKyyC,aAAa72B,YAAYo9B,EAAMvG,cAAe,CAC9D,IAAIyE,EAASl3C,KAAK0oC,WACd2O,EAAS2B,EAAMtQ,WACnB,QAASwO,EAAO5I,cAAgB+I,EAAO/I,cAAgB4I,EAAOlL,UAAUnrB,UAAUw2B,EAAOrL,YAG3F,OAAO,GAETiN,WAAY,WACV,IAAID,EAAQh5C,KAAKszC,cACjB,IAAK0F,EAAO,OAAO,EACnB,IAAInH,EAAK7xC,KAAKs4C,UACVxG,EAAKkH,EAAMV,UACX9G,EAAO,KACPC,EAAO,EAAID,EACX0H,EAAWrH,GAAML,GAAQK,GAAMJ,EAC/B0H,EAAWrH,GAAMN,GAAQM,GAAML,EACnC,GAAIyH,GAAYC,EAAU,OAAQn5C,KAAK+4C,aACvC,IAAI9gC,EAAKjY,KAAK0oC,WACV5lB,EAAK7K,GAAM45B,EAAKL,EAAOv5B,EAAGoxB,cAAgBpxB,EAC1CmhC,EAAKJ,EAAMtQ,WACX2Q,EAAKD,GAAMtH,EAAKN,EAAO4H,EAAG/P,cAAgB+P,EAG9C,GAFIvH,EAAKJ,IAAMx5B,EAAKA,EAAG+wB,WACnB8I,EAAKL,IAAM2H,EAAKA,EAAGpQ,aAClBlmB,GAAO7K,GAAOohC,GAAOD,GAAI,OAAO,EACrC,IAAIE,EAAU,GAEd,SAASC,EAAWxR,EAAOzkC,GACzB,IAAIsK,EAAIm6B,EAAM7lB,YACV/K,EAAQszB,EAAMe,SAAS59B,GAAGuJ,OAASszB,EAAMqI,SAASllC,GAClD6J,EAAQN,EAAMlX,OACdmrB,EAASqf,EAAMnxB,UAAU1L,EAAGtK,GAAOmU,EAAQN,EAAMM,EAAQ,GAAK,GAAInU,GAAOmU,EAAQN,EAAM,GAAK,GAChGmiC,EAAQx1C,KAAK2T,EAAQ2T,EAASA,EAAS,IAGzC,SAASouB,EAAUngC,EAAOpI,EAAKE,GAC7B,OAAOF,EAAME,EAAMkI,EAAQpI,GAAOoI,EAAQlI,EAAMkI,EAAQpI,GAAOoI,EAAQlI,EAGpE+nC,IACHK,EAAWz2B,GAAI,GACfy2B,EAAWthC,GAAI,IAGZkhC,IACHI,EAAWF,GAAI,GACfE,EAAWH,GAAI,IAGjB,IAAIrjB,EAAK/1B,KAAK6e,WACVuM,EAASla,KAAKD,IAAIpO,MAAMqO,KAAMooC,GAC9B7rC,EAAKyrC,EAAWjhC,EAAG+3B,iBAAiB6B,GAAM55B,EAAGwhC,WAAWruB,GAAQpQ,SAAS+a,GACzEvoB,EAAK0rC,EAAWzrC,EAAG8N,SAAWuH,EAAG22B,YAAYruB,GAAQpQ,SAAS+a,GAC9D2jB,EAAKP,EAAWC,EAAGpJ,iBAAiB8B,GAAMsH,EAAGK,WAAWruB,GAAQpQ,SAAS+a,GACzEyY,EAAK2K,EAAWO,EAAGn+B,SAAW89B,EAAGI,YAAYruB,GAAQpQ,SAAS+a,GAC9DlT,EAAKrV,EAAGoM,WACRoJ,EAAKvV,EAAGmM,WACR+/B,EAAKnL,EAAG50B,WACRggC,EAAKF,EAAG9/B,WACZ,SAAUs/B,EAAWM,EAAU32B,EAAI82B,EAAIC,GAAMJ,EAAUx2B,EAAI22B,EAAIC,IAAOJ,EAAU32B,EAAI+2B,EAAID,GAAMH,EAAUx2B,EAAI42B,EAAID,GAAMH,EAAUG,EAAI92B,EAAIG,GAAMw2B,EAAUI,EAAI/2B,EAAIG,IAAOw2B,EAAUG,EAAI32B,EAAIH,GAAM22B,EAAUI,EAAI52B,EAAIH,KAEnNg3B,WAAY,WACV,QAAS75C,KAAKy3C,WAEfz4C,EAAK8D,KAAK2nC,EAAMuG,kBAAkB,SAAU1vC,GAC7C,IAAIE,EAAMF,EAAO,KAEjBtB,KAAKsB,GAAQ,WACX,IAAIymC,EAAQ/nC,KAAK0oC,WACbxJ,EAAOl/B,KAAKs4C,UAChB,OAAe,MAARpZ,GAAgB6I,GAASA,EAAMvmC,GAAK09B,GAAM,MAElD,CACD/9B,UAAU,IACR,IAAI,WACN,SAAS4H,EAAOiqC,EAAWtC,EAAKoJ,GAC9B,IAAI75C,EAAS+yC,EAAU/yC,OACnBF,EAAI,EACJwY,EAAItY,EAAS,EAEjB,SAAS85C,EAAO1wC,EAAO+3B,GACrB,IAAK,IAAIthC,EAAIuJ,EAAQ+3B,EAAKthC,IAAM,GAAKA,GAAKG,EAAQH,GAAKshC,EAAK,CAC1D,IAAIiS,EAAOL,GAAWlzC,EAAIG,EAASA,GAAUA,GAC7C,IAAKywC,EAAI7xB,WAAWlD,QAAQ03B,EAAKx0B,WAAY,MAAO,MACpD,GAAI6xB,EAAI5rC,OAAOuuC,GAAO,OAAOA,EAG/B,OAAO,KAGT,KAAOtzC,GAAKwY,GAAG,CACb,IAEIyhC,EAFAtjC,EAAI3W,EAAIwY,IAAM,EACd86B,EAAOL,EAAUt8B,GAGrB,GAAIojC,IAAUE,EAAQtJ,EAAI5rC,OAAOuuC,GAAQA,EAAO0G,EAAOrjC,GAAI,IAAMqjC,EAAOrjC,EAAG,IAKzE,OAJIg6B,EAAI+G,WACNuC,EAAMvC,SAAWuC,EAAM1G,cAAcmE,UAAW,GAG3CuC,EAGT,IAAIC,EAAQvJ,EAAIjI,UACZyR,EAAQ7G,EAAK5K,WACNwR,IAAUC,EAAQD,EAAMv2C,IAAMw2C,EAAMx2C,IAAMgtC,EAAI/nB,WAAa+nB,EAAI4H,WAAajF,EAAK1qB,WAAa0qB,EAAKiF,YAEnG,EACT//B,EAAI7B,EAAI,EAER3W,EAAI2W,EAAI,EAKZ,OADAs8B,EAAU5pC,OAAOrJ,EAAG,EAAG2wC,GAChBA,EAGT,MAAO,CACLnuC,QAAS,CACPwG,OAAQA,EACRiY,OAAQ,SAAgBgyB,GAGtB,IAFA,IAAImH,EAAWnH,EAAU5zC,QAEhBU,EAAIkzC,EAAU/yC,OAAS,EAAGH,GAAK,EAAGA,IACzCiJ,EAAOoxC,EAAUnH,EAAUlzC,GAAGwzC,eAAe,GAG/C,OAAO6G,OAKXjV,EAAWr8B,EAAKpG,OAAO,CACzBkB,OAAQ,WACR0oB,eAAe,EACfR,iBAAiB,EACjB3qB,OAAO,EACP0B,WAAY,aACZL,QAAS,CACPlD,OAAQ,SAAgBsH,GACtB,IAAImmB,EAAMoa,EAAUkT,EAWpB,GATIp7C,EAAKiD,cAAc0E,IACrBugC,EAAWvgC,EAAIugC,SACfpa,EAAOnmB,EAAI0zC,UACFp1C,MAAMC,QAAQyB,GACvBugC,EAAWvgC,EACa,iBAARA,IAChBmmB,EAAOnmB,GAGLugC,EAAU,CACZ,IAAIoT,EAAQpT,EAAS,GACrBkT,EAAWE,GAASr1C,MAAMC,QAAQo1C,EAAM,SAC/BxtB,IACTstB,GAAYttB,EAAK/qB,MAAM,QAAU,IAAI9B,OAAS,GAAK,WAAWmC,KAAK0qB,IAIrE,OAAO,IADIstB,EAAW1c,EAAe/I,GACrBhuB,KAGpB+tB,YAAa,WACX,OAAO10B,MAETu6C,YAAa,WACX,OAAOv6C,KAAKugB,WAAa,GAE3Bi6B,aAAc,SAAsBC,GAC9Bz6C,KAAKu6C,gBAAkBE,IAAcA,IAAYz6C,KAAKm4B,WAE5DuiB,YAAa,SAAqB5tB,GAChC,IACIxI,EAEAq2B,EACAC,EAJA35B,EAAQ6L,GAAQA,EAAK/qB,MAAM,gCAE3B84C,GAAW,EAGXhgC,EAAU,IAAI/B,EACdzT,EAAQ,IAAIyT,EAEhB,SAASgiC,EAASzxC,EAAO0I,GACvB,IAAIxQ,GAAO+iB,EAAOjb,GAElB,OADIwxC,IAAUt5C,GAAOsZ,EAAQ9I,IACtBxQ,EAGT,SAASsd,EAASxV,GAChB,OAAO,IAAIyP,EAAMgiC,EAASzxC,EAAO,KAAMyxC,EAASzxC,EAAQ,EAAG,MAG7DrJ,KAAKkP,QAEL,IAAK,IAAIpP,EAAI,EAAGC,EAAIkhB,GAASA,EAAMhhB,OAAQH,EAAIC,EAAGD,IAAK,CACrD,IAAIuC,EAAO4e,EAAMnhB,GACbi7C,EAAU14C,EAAK,GACf24C,EAAQD,EAAQ/4C,cAEhB/B,GADJqkB,EAASjiB,EAAKN,MAAM,gDACGuiB,EAAOrkB,OAI9B,OAHA46C,EAAWE,IAAYC,EACN,MAAbL,GAAqB,OAAOv4C,KAAK44C,IAAQh7C,KAAKw+B,OAAO3jB,GAEjDmgC,GACN,IAAK,IACL,IAAK,IAGH,IAFA,IAAIC,EAAiB,MAAVD,EAEF5nC,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKi7C,EAAO,SAAW,UAAUpgC,EAAUgE,EAASzL,IAEhD6nC,IACF51C,EAAQwV,EACRogC,GAAO,GAIXL,EAAU//B,EACV,MAEF,IAAK,IACL,IAAK,IACH,IAAI9I,EAAkB,MAAVipC,EAAgB,IAAM,IAClCngC,EAAUA,EAAQ9X,QAElB,IAASqQ,EAAI,EAAGA,EAAInT,EAAQmT,IAC1ByH,EAAQ9I,GAAS+oC,EAAS1nC,EAAGrB,GAC7B/R,KAAKy+B,OAAO5jB,GAGd+/B,EAAU//B,EACV,MAEF,IAAK,IACH,IAASzH,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKk7C,aAAar8B,EAASzL,GAAIwnC,EAAU/7B,EAASzL,EAAI,GAAIyH,EAAUgE,EAASzL,EAAI,IAGnF,MAEF,IAAK,IACH,IAASA,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKk7C,aAAa,OAAO94C,KAAKu4C,GAAY9/B,EAAQO,SAAS,GAAGJ,SAAS4/B,GAAW//B,EAAS+/B,EAAU/7B,EAASzL,GAAIyH,EAAUgE,EAASzL,EAAI,IACzIunC,EAAWK,EAGb,MAEF,IAAK,IACH,IAAS5nC,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKm7C,iBAAiBP,EAAU/7B,EAASzL,GAAIyH,EAAUgE,EAASzL,EAAI,IAGtE,MAEF,IAAK,IACH,IAASA,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKm7C,iBAAiBP,EAAU,OAAOx4C,KAAKu4C,GAAY9/B,EAAQO,SAAS,GAAGJ,SAAS4/B,GAAW//B,EAASA,EAAUgE,EAASzL,IAC5HunC,EAAWK,EAGb,MAEF,IAAK,IACH,IAAS5nC,EAAI,EAAGA,EAAInT,EAAQmT,GAAK,EAC/BpT,KAAKo7C,MAAMvgC,EAAUgE,EAASzL,EAAI,GAAI,IAAIsK,GAAM4G,EAAOlR,IAAKkR,EAAOlR,EAAI,KAAMkR,EAAOlR,EAAI,IAAKkR,EAAOlR,EAAI,IAAKkR,EAAOlR,EAAI,IAG1H,MAEF,IAAK,IACHpT,KAAK0+B,UAAU,OACf7jB,EAAUxV,EAIds1C,EAAWK,IAGfne,cAAe,WACb,QAAS78B,KAAKs2B,WAAat2B,KAAKmxB,cAElCsD,UAAW,SAAmBtgB,GAC5B,IAAIknC,EAAUlnC,EAAMqH,SAASxb,KAAKkQ,UAAU,CAC1CkR,UAAU,EACV8O,QAAQ,KACJlwB,KAAKs7C,YAAYnnC,GAAS,GAChC,OAAOknC,EAAQE,WAAoC,YAAvBv7C,KAAKs9B,cAAiD,EAAnB+d,EAAQG,UAAmC,EAAnBH,EAAQI,SAAeJ,EAAQA,UAExHxmB,iBAAkB,SAA0BiC,EAAM/V,EAASwM,EAASopB,GAClE,IAAI/3C,EAAOoB,OAAS82B,IAASA,EACzB2f,EAAUz2C,KAAKutB,QAAQtJ,oBACvByyB,EAAU93C,EAAO63C,GAAWlpB,GAAWuJ,EAAKvJ,SAAStJ,oBAEzD,OAAOrlB,GAAQoB,KAAKkQ,UAAUumC,GAAS91B,WAAWmW,EAAK5mB,UAAUwmC,GAAU,OAASjM,EAAM5V,iBAAiB70B,KAAK4oC,aAAchqC,GAAQk4B,EAAK8R,YAAa7nB,EAAS01B,EAASC,EAASC,GAAgB,IAErM+E,aAAc,SAAsB5kB,GAClC,OAAO92B,KAAK60B,iBAAiBiC,GAAM,SAAUkiB,GAC3C,OAAOA,EAAMC,iBAGjBpI,mBAAoB,WAMlB,IALA,IAAI18B,EAAQ2E,EAAM1T,KAAK5E,WACnBwQ,EAAShR,KAAK4oC,YACdiG,EAAUv3B,IACVqkC,EAAS,KAEJ77C,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IAAK,CAC7C,IAAI4wC,EAAM1/B,EAAOlR,GAAG+wC,mBAAmB18B,GAEnCu8B,EAAIgH,UAAY7I,IAClBA,EAAU6B,EAAIgH,UACdiE,EAASjL,GAIb,OAAOiL,GAET7K,gBAAiB,WACf,IAAIJ,EAAM1wC,KAAK6wC,mBAAmBhuC,MAAM7C,KAAMQ,WAC9C,OAAOkwC,EAAMA,EAAI7xB,WAAa6xB,GAEhCvG,YAAa,SAAqB3rB,EAAMC,EAAI2qB,GAC1C,IAAIwS,GAAU57C,KAAKonB,UACf9lB,EAAOs6C,EAAS,YAAc,YAC9BC,EAAYr9B,EAAKld,GACjBw6C,EAAUr9B,EAAGnd,GACb2H,EAAQjJ,KAAKsB,GAEjB,IAAKu6C,IAAcC,GAAWD,EAAU57C,SAAW67C,EAAQ77C,OACzD,MAAM,IAAI6hB,MAAM,2CAA6CtD,EAAO,KAAOC,GAG7E,IAAI5D,EAAU5R,EAAMhJ,OAChBA,EAAS67C,EAAQ77C,OAErB,GAAI4a,EAAU5a,EAGZ,IAFA,IAAIyC,EAAOk5C,EAASvU,EAAU1S,EAErB70B,EAAI+a,EAAS/a,EAAIG,EAAQH,IAChCE,KAAKyH,IAAI,IAAI/E,QAENmY,EAAU5a,GACnBD,KAAK47C,EAAS,iBAAmB,kBAAkB37C,EAAQ4a,GAG7D,IAAS/a,EAAI,EAAGA,EAAIG,EAAQH,IAC1BmJ,EAAMnJ,GAAGqqC,YAAY0R,EAAU/7C,GAAIg8C,EAAQh8C,GAAIspC,GAG7CwS,IACF57C,KAAK+7C,UAAUv9B,EAAKypB,SAEpBjoC,KAAKiiB,SAAS,KAGlBuU,QAAS,SAAiBM,GACxB,IAAIxV,GAAK,EAET,GAAIwV,EAAM,CACR,IAAIklB,EAASh8C,KAAKonB,WAAa,CAACpnB,MAC5Bi8C,EAASnlB,EAAK1P,UAAY0P,EAAK1P,UAAUhoB,QAAU,CAAC03B,GACpD8f,EAAUoF,EAAO/7C,OACjB42C,EAAUoF,EAAOh8C,OACjBi8C,EAAU,GACVzkC,EAAQ,EACZ6J,GAAK,EAGL,IAFA,IAAI66B,EAAiBtsC,EAAmBC,yBAAyBksC,EAAQC,EAAQznC,EAAUwB,mBAElFvD,EAAKmkC,EAAU,EAAGnkC,GAAM,GAAK6O,EAAI7O,IAAM,CAC9C,IAAIwnC,EAAQ+B,EAAOvpC,GACnB6O,GAAK,EACL,IAAI86B,EAAqBD,EAAe1pC,GAExC,GAAI2pC,EACF,IAAK,IAAI1pC,EAAK0pC,EAAmBn8C,OAAS,EAAGyS,GAAM,IAAM4O,EAAI5O,IACvDunC,EAAMzjB,QAAQylB,EAAOG,EAAmB1pC,OACrCwpC,EAAQE,EAAmB1pC,MAC9BwpC,EAAQE,EAAmB1pC,KAAO,EAClC+E,KAGF6J,GAAK,GAMbA,EAAKA,GAAM7J,IAAUo/B,EAGvB,OAAOv1B,KAGPqT,EAAOuQ,EAASziC,OAAO,CACzBkB,OAAQ,OACRgoB,iBAAkB,CAChBub,SAAU,GACVmV,QAAQ,GAEVz5C,WAAY,SAAc+D,GACxB3G,KAAKioC,SAAU,EACfjoC,KAAK2oC,UAAY,GACjB3oC,KAAKi4C,SAAW,EAChB,IAAI1vC,EAAO/H,UACP0mC,EAAWjiC,MAAMC,QAAQyB,GAAyB,iBAAXA,EAAI,GAAkBA,EAAM4B,GAAO5B,GAAOA,EAAI2N,OAASzV,GAAc8H,EAAIyN,IAAMvV,GAAa8H,EAAIwN,QAAUtV,EAAoB,KAAP0J,EAE9J2+B,GAAYA,EAASjnC,OAAS,EAChCD,KAAKs8C,YAAYpV,IAEjBlnC,KAAKgoC,QAAUnpC,EACfmB,KAAKu8C,kBAAoB,EAEpBrV,GAA2B,iBAARvgC,IACtB3G,KAAK06C,YAAY/zC,GACjBA,EAAM,OAIV3G,KAAKqtB,aAAa6Z,GAAYvgC,IAEhCysB,QAAS,SAAiB1rB,GACxB,OAAO1H,KAAKioC,UAAYvgC,EAAKugC,SAAWjpC,EAAK8F,OAAO9E,KAAK2oC,UAAWjhC,EAAKihC,YAE3EnV,YAAa,SAAqBntB,GAChCrG,KAAKs8C,YAAYj2C,EAAOsiC,WACxB3oC,KAAKioC,QAAU5hC,EAAO4hC,SAExBhmB,SAAU,SAASA,EAAS4F,GAG1B,GAFA5F,EAASngB,KAAK5B,KAAKF,KAAM6nB,GAEb,EAARA,GAGF,GAFA7nB,KAAKurC,QAAUvrC,KAAKw8C,MAAQ39C,EAEhB,GAARgpB,EACF7nB,KAAKi4C,gBACA,GAAIj4C,KAAKgoC,QACd,IAAK,IAAIloC,EAAI,EAAGC,EAAIC,KAAKgoC,QAAQ/nC,OAAQH,EAAIC,EAAGD,IAC9CE,KAAKgoC,QAAQloC,GAAGmiB,gBAGH,GAAR4F,IACT7nB,KAAKmuB,QAAUtvB,IAGnBgwB,SAAU,WACR,IAAInB,EAAS1tB,KAAKwtB,QAClB,OAAQE,aAAkBgQ,EAAehQ,EAAS1tB,MAAMytB,QAE1DgvB,YAAa,WACX,OAAOz8C,KAAK2oC,WAEd2T,YAAa,SAAqBpV,GAChC,IAAIwV,EAAgB18C,KAAKkvB,kBACrBjvB,EAASinC,GAAYA,EAASjnC,OAKlC,GAJAD,KAAK2oC,UAAU1oC,OAAS,EACxBD,KAAKu8C,kBAAoB,EACzBv8C,KAAKgoC,QAAUnpC,EAEXoB,EAAQ,CACV,IAAI08C,EAAOzV,EAASjnC,EAAS,GAET,kBAAT08C,IACT38C,KAAK+7C,UAAUY,GACf18C,KAGFD,KAAK48C,KAAKvV,EAAQrhC,SAASkhC,EAAU,EAAG,GAAIjnC,IAG1Cy8C,GAAe18C,KAAK6pB,kBAAiB,IAE3CgzB,gBAAiB,WACf,OAAO78C,KAAK2oC,UAAU,IAExBkQ,eAAgB,WACd,OAAO74C,KAAK2oC,UAAU3oC,KAAK2oC,UAAU1oC,OAAS,IAEhD2oC,UAAW,WACT,IAAI53B,EAAShR,KAAKgoC,QACdd,EAAWlnC,KAAK2oC,UAEpB,IAAK33B,EAAQ,CACX,IAAI/Q,EAASD,KAAK88C,eAElB9rC,EAAShR,KAAKgoC,QAAU,IAAI/iC,MAAMhF,GAElC,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAQH,IAC1BkR,EAAOlR,GAAK,IAAI2qC,EAAMzqC,KAAMknC,EAASpnC,GAAIonC,EAASpnC,EAAI,IAAMonC,EAAS,IAIzE,OAAOl2B,GAET+rC,cAAe,WACb,OAAO/8C,KAAK4oC,YAAY,IAE1BoU,aAAc,WACZ,IAAIhsC,EAAShR,KAAK4oC,YAClB,OAAO53B,EAAOA,EAAO/Q,OAAS,IAEhCg9C,SAAU,WACR,OAAOj9C,KAAKioC,SAEd8T,UAAW,SAAmBM,GAC5B,GAAIr8C,KAAKioC,UAAYoU,IAAWA,GAAS,CAGvC,GAFAr8C,KAAKioC,QAAUoU,EAEXr8C,KAAKgoC,QAAS,CAChB,IAAI/nC,EAASD,KAAKgoC,QAAQ/nC,OAASD,KAAK88C,eAEpCT,IAAQr8C,KAAKgoC,QAAQ/nC,EAAS,GAAK,IAAIwqC,EAAMzqC,KAAMA,KAAK2oC,UAAU1oC,EAAS,GAAID,KAAK2oC,UAAU,KAGpG3oC,KAAKiiB,SAAS,OAGjB,CACD/gB,OAAO,EACPg8C,YAAa,SAAqB3vB,EAAS4vB,GACzC,IAKIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAZAzW,EAAWlnC,KAAK2oC,UAChB1oC,EAASinC,EAASjnC,OAClBqW,EAAI,IAAIvS,EAAUo5C,GAClB74B,EAAS,IAAIrf,MAAM,GACnBq1C,GAAQ,EASRr5B,EAAQ,GAEZ,SAAS28B,EAAW1T,EAAS2T,GAM3B,GALA3T,EAAQ9lB,sBAAsBmJ,EAASjJ,GAEvC84B,EAAO94B,EAAO,GACd+4B,EAAO/4B,EAAO,GAEVg2B,EACFr5B,EAAMnd,KAAK,IAAMwS,EAAEvC,KAAKqpC,EAAMC,IAC9B/C,GAAQ,OAKR,GAHAkD,EAAMl5B,EAAO,GACbm5B,EAAMn5B,EAAO,GAETk5B,IAAQJ,GAAQK,IAAQJ,GAAQK,IAASJ,GAASK,IAASJ,GAC7D,IAAKM,EAAU,CACb,IAAI7mC,EAAKomC,EAAOE,EACZ52B,EAAK22B,EAAOE,EAChBt8B,EAAMnd,KAAY,IAAPkT,EAAW,IAAMV,EAAErS,OAAOyiB,GAAa,IAAPA,EAAW,IAAMpQ,EAAErS,OAAO+S,GAAM,IAAMV,EAAEvC,KAAKiD,EAAI0P,UAG9FzF,EAAMnd,KAAK,IAAMwS,EAAEvC,KAAK2pC,EAAOJ,EAAOK,EAAOJ,GAAS,IAAMjnC,EAAEvC,KAAKypC,EAAMF,EAAOG,EAAMF,GAAS,IAAMjnC,EAAEvC,KAAKqpC,EAAOE,EAAOD,EAAOE,IAIrID,EAAQF,EACRG,EAAQF,EACRK,EAAOp5B,EAAO,GACdq5B,EAAOr5B,EAAO,GAGhB,IAAKrkB,EAAQ,MAAO,GAEpB,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAQH,IAC1B89C,EAAW1W,EAASpnC,IAQtB,OALIE,KAAKioC,SAAWhoC,EAAS,IAC3B29C,EAAW1W,EAAS,IAAI,GACxBjmB,EAAMnd,KAAK,MAGNmd,EAAM/c,KAAK,KAEpBsc,QAAS,WACP,OAAQxgB,KAAK2oC,UAAU1oC,QAEzBy5B,kBAAmB,SAA2Bxe,GAI5C,IAHA,IAAIgsB,EAAWlnC,KAAK2oC,UAChBrkB,EAAS,IAAIrf,MAAM,GAEdnF,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC1ConC,EAASpnC,GAAGskB,sBAAsBlJ,EAAQoJ,GAAQ,GAGpD,OAAO,GAETs4B,KAAM,SAAckB,EAAMz0C,GAOxB,IANA,IAAI69B,EAAWlnC,KAAK2oC,UAChB33B,EAAShR,KAAKgoC,QACd1iC,EAASw4C,EAAK79C,OACdsJ,EAAkB,MAATF,EAGJvJ,GAFLuJ,EAAQE,EAAS29B,EAASjnC,OAASoJ,EAE1B,GAAGvJ,EAAIwF,EAAQxF,IAAK,CAC/B,IAAIoqC,EAAU4T,EAAKh+C,GACfoqC,EAAQpC,QAAOoC,EAAU4T,EAAKh+C,GAAKoqC,EAAQnnC,SAC/CmnC,EAAQpC,MAAQ9nC,KAChBkqC,EAAQ1gC,OAASH,EAAQvJ,EACrBoqC,EAAQ7sB,YAAYrd,KAAK2pB,iBAAiBugB,EAAS,EAAGA,EAAQ7sB,YAGpE,GAAI9T,EACFvK,EAAK8E,KAAKojC,EAAU4W,OACf,CACL5W,EAAS99B,OAAOvG,MAAMqkC,EAAU,CAAC79B,EAAO,GAAGL,OAAO80C,IAEzCh+C,EAAIuJ,EAAQ/D,EAArB,IAAK,IAAwBvF,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IACvDonC,EAASpnC,GAAG0J,OAAS1J,EAIzB,GAAIkR,EAAQ,CACV,IAAIy0B,EAAQzlC,KAAK88C,eACbz3C,EAAQgE,EAAQ,GAAKA,EAAQ/D,EAAS,IAAMmgC,EAAQp8B,EAAQ,EAAIA,EAChEN,EAAS1D,EACT/B,EAAM4N,KAAKD,IAAI5L,EAAQC,EAAQmgC,GAE/BqY,EAAK9V,UACPh3B,EAAO5H,OAAOvG,MAAMmO,EAAQ,CAAC3L,EAAO,GAAG2D,OAAO80C,EAAK9V,UACnDj/B,GAAU+0C,EAAK9V,QAAQ/nC,QAGzB,IAASH,EAAIiJ,EAAQjJ,EAAIwD,EAAKxD,IAC5BkR,EAAO5H,OAAOtJ,EAAG,EAAG,IAAI2qC,EAAMzqC,KAAM,KAAM,OAG5CA,KAAK+9C,cAAc14C,EAAO/B,GAK5B,OAFAtD,KAAKiiB,SAAS,IAEP67B,GAETC,cAAe,SAAuB14C,EAAO/B,GAK3C,IAJA,IAEIykC,EAFAb,EAAWlnC,KAAK2oC,UAChB33B,EAAShR,KAAKgoC,QAGTloC,EAAIuF,EAAOvF,EAAIwD,EAAKxD,KAC3BioC,EAAQ/2B,EAAOlR,IACTgoC,MAAQ9nC,KACd+nC,EAAMgB,UAAY7B,EAASpnC,GAC3BioC,EAAMmD,UAAYhE,EAASpnC,EAAI,IAAMonC,EAAS,GAE9Ca,EAAM9lB,YAGJ8lB,EAAQ/2B,EAAOhR,KAAKioC,UAAY5iC,EAAQ6hC,EAASjnC,OAAS,EAAIoF,EAAQ,MACxE0iC,EAAMmD,UAAYhE,EAAS7hC,IAAU6hC,EAAS,GAE9Ca,EAAM9lB,aAGJ8lB,EAAQ/2B,EAAO1N,MACjBykC,EAAMgB,UAAY7B,EAAS5jC,GAE3BykC,EAAM9lB,aAGV66B,aAAc,WACZ,IAAI78C,EAASD,KAAK2oC,UAAU1oC,OAC5B,OAAQD,KAAKioC,SAAWhoC,EAAS,EAAIA,EAAS,EAAIA,GAEpDwH,IAAK,SAAaujC,GAChB,IAAIziC,EAAO/H,UACX,OAAO+H,EAAKtI,OAAS,GAAyB,iBAAb+qC,EAAwBhrC,KAAK48C,KAAKvV,EAAQrhC,SAASuC,IAASvI,KAAK48C,KAAK,CAACvV,EAAQjiC,KAAKmD,KAAQ,IAE/HQ,OAAQ,SAAgBM,EAAO2hC,GAC7B,IAAIziC,EAAO/H,UACX,OAAO+H,EAAKtI,OAAS,GAAyB,iBAAb+qC,EAAwBhrC,KAAK48C,KAAKvV,EAAQrhC,SAASuC,EAAM,GAAIc,GAASrJ,KAAK48C,KAAK,CAACvV,EAAQjiC,KAAKmD,EAAM,IAAKc,GAAO,IAEnJu0C,WAAY,WACV,OAAO59C,KAAK48C,KAAK,CAACvV,EAAQjiC,KAAK5E,aAAa,IAE9Cw9C,cAAe,SAAuB30C,GACpC,OAAOrJ,KAAK48C,KAAK,CAACvV,EAAQjiC,KAAK5E,UAAW,IAAK6I,GAAO,IAExD40C,YAAa,SAAqB/W,GAChC,OAAOlnC,KAAK48C,KAAKvV,EAAQrhC,SAASkhC,KAEpCgX,eAAgB,SAAwB70C,EAAO69B,GAC7C,OAAOlnC,KAAK48C,KAAKvV,EAAQrhC,SAASkhC,GAAW79B,IAE/C4gC,cAAe,SAAuB5gC,GACpC,OAAOrJ,KAAKm+C,eAAe90C,EAAOA,EAAQ,GAAG,IAAM,MAErD80C,eAAgB,SAAwB94C,EAAO/B,EAAK86C,GAClD/4C,EAAQA,GAAS,EACjB/B,EAAMtE,EAAKiE,KAAKK,EAAKtD,KAAK2oC,UAAU1oC,QACpC,IAAIinC,EAAWlnC,KAAK2oC,UAChB33B,EAAShR,KAAKgoC,QACdvwB,EAAQyvB,EAASjnC,OACjBwJ,EAAUy9B,EAAS99B,OAAO/D,EAAO/B,EAAM+B,GACvCC,EAASmE,EAAQxJ,OACrB,IAAKqF,EAAQ,OAAOmE,EAEpB,IAAK,IAAI3J,EAAI,EAAGA,EAAIwF,EAAQxF,IAAK,CAC/B,IAAIoqC,EAAUzgC,EAAQ3J,GAClBoqC,EAAQ7sB,YAAYrd,KAAK2pB,iBAAiBugB,EAASA,EAAQ7sB,WAAY,GAC3E6sB,EAAQ1gC,OAAS0gC,EAAQpC,MAAQ,KAG1BhoC,EAAIuF,EAAb,IAAK,IAAetF,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC9ConC,EAASpnC,GAAG0J,OAAS1J,EAGvB,GAAIkR,EAAQ,CACV,IAAI3H,EAAQhE,EAAQ,GAAK/B,IAAQmU,GAASzX,KAAKioC,QAAU,EAAI,GAAK5iC,EAAQ,EAAIA,EAG9E,IAASvF,GAFLkR,EAASA,EAAO5H,OAAOC,EAAO/D,IAEdrF,OAAS,EAAGH,GAAK,EAAGA,IACtCkR,EAAOlR,GAAGgoC,MAAQ,KAGhBsW,IAAgB30C,EAAQu+B,QAAUh3B,EAAO5R,MAAM,IAEnDY,KAAK+9C,cAAc10C,EAAOA,GAK5B,OAFArJ,KAAKiiB,SAAS,IAEPxY,GAETyF,MAAO,kBACPy4B,WAAY,WAGV,IAFA,IAAIT,EAAWlnC,KAAK2oC,UAEX7oC,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC1C,GAAIonC,EAASpnC,GAAG6nC,aAAc,OAAO,EAGvC,OAAO,GAETY,aAAc,WAGZ,IAFA,IAAIrB,EAAWlnC,KAAK2oC,UAEX7oC,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC1ConC,EAASpnC,GAAGyoC,gBAGhBjvB,UAAW,WACT,GAAoB,MAAhBtZ,KAAKurC,QAAiB,CAIxB,IAHA,IAAIv6B,EAAShR,KAAK4oC,YACd3oC,EAAS,EAEJH,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IACxCG,GAAU+Q,EAAOlR,GAAGwZ,YAGtBtZ,KAAKurC,QAAUtrC,EAGjB,OAAOD,KAAKurC,SAEdhrB,QAAS,WACP,IAAI89B,EAAOr+C,KAAKw8C,MAEhB,GAAY,MAAR6B,EAAc,CAChB,IAAInX,EAAWlnC,KAAK2oC,UAChB0T,EAASr8C,KAAKioC,QAClBoW,EAAO,EAEP,IAAK,IAAIv+C,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAI68C,EAAO78C,EAAI,IAAMC,EACrBs+C,GAAQ5T,EAAMlqB,QAAQkqB,EAAMvoB,UAAUglB,EAASpnC,GAAIonC,EAASyV,EAAO,EAAI78C,EAAI,GAAI,KAAM68C,IAASN,IAGhGr8C,KAAKw8C,MAAQ6B,EAGf,OAAOA,GAETnvB,gBAAiB,WACf,IAAIjvB,EAASD,KAAK2oC,UAAU1oC,OAC5B,OAAOD,KAAKod,cAAgBnd,EAAS,GAAKD,KAAKu8C,oBAA+B,EAATt8C,GAEvE4pB,iBAAkB,SAA0BrM,GACtCA,GAAUxd,KAAKs+C,iBAAgB,GACnCt+C,KAAKud,YAAYC,IAEnBwR,aAAc,SAASA,EAAavF,GAChB,EAAZA,GAAgBzpB,KAAKs+C,iBAAgB,GAC3CtvB,EAAaltB,KAAK5B,KAAKF,KAAMypB,IAE/B60B,gBAAiB,SAAyB9gC,GACxC,IAAI0pB,EAAWlnC,KAAK2oC,UAChB1oC,EAASinC,EAASjnC,OAClBwpB,EAAYjM,EAAW,EAAI,EAC/Bxd,KAAKu8C,kBAAoB9yB,EAAYxpB,EAErC,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAQH,IAC1BonC,EAASpnC,GAAGud,WAAaoM,GAG7BE,iBAAkB,SAA0BugB,EAAS1B,EAAc+V,GACjErU,EAAQ7sB,WAAakhC,GACLv+C,KAAKu8C,mBAAqBgC,EAAe/V,GACzC,GAAGxoC,KAAKud,aAAY,IAEtC4uB,SAAU,SAAkBC,GAC1B,IACIrE,EADA2I,EAAM1wC,KAAKkwC,cAAc9D,GAE7B,OAAOsE,IAAQ3I,EAAQ2I,EAAIhI,WAAWyD,SAASuE,EAAIiI,mBAAqB5Q,EAAMgB,UAAY,MAE5F2D,QAAS,SAAiBN,GACxB,IAAIsE,EAAM1wC,KAAKkwC,cAAc9D,GACzB/iC,EAAQqnC,GAAOA,EAAIrnC,MACnB61B,EAAOwR,GAAOA,EAAIxR,KAIlBA,EAFO,YAGT71B,IACA61B,EAAO,GAGT,IAAIluB,EAAShR,KAAK4oC,YAElB,GAAIv/B,GAAS,GAAKA,EAAQ2H,EAAO/Q,OAAQ,CACnCi/B,GAXK,MAYPluB,EAAO3H,KAASgjC,aAAanN,GAG/B,IACIpI,EADAgnB,EAAO99C,KAAKm+C,eAAe90C,EAAOrJ,KAAK2oC,UAAU1oC,QAAQ,GAe7D,OAZID,KAAKioC,SACPjoC,KAAK+7C,WAAU,GACfjlB,EAAO92B,QAEP82B,EAAO,IAAInC,EAAK9rB,EAAK0hB,YAChBkJ,YAAYzzB,MACjB82B,EAAKvD,eAAevzB,OAGtB82B,EAAK8lB,KAAKkB,EAAM,GAEhB99C,KAAK49C,WAAWE,EAAK,IACdhnB,EAGT,OAAO,MAETzhB,MAAO,SAAehM,EAAO61B,GAC3B,IAAI6I,EACAqE,EAAWlN,IAASrgC,EAAYwK,GAAS0+B,EAAQ/nC,KAAK4oC,YAAYv/B,KAAW0+B,EAAM6E,kBAAkB1N,GACzG,OAAmB,MAAZkN,EAAmBpsC,KAAK0sC,QAAQN,GAAY,MAErDloC,KAAM,SAAc4yB,EAAM7mB,GACxB,IAAI2Q,EAAU3Q,GAAa,EAE3B,GAAI6mB,GAAQA,IAAS92B,KAAM,CACzB,IAAIknC,EAAWpQ,EAAK6R,UAChB6V,EAAQx+C,KAAK64C,iBACb4F,EAAQ3nB,EAAK+hB,iBACjB,IAAK4F,EAAO,OAAOz+C,KACfw+C,GAASA,EAAM9W,OAAO/rB,QAAQ8iC,EAAM/W,OAAQ9mB,IAAUkW,EAAKqB,UAC/D,IAAIumB,EAAS5nB,EAAK+lB,kBAElB,GAAI2B,GAASA,EAAM9W,OAAO/rB,QAAQ+iC,EAAOhX,OAAQ9mB,GAC/C49B,EAAMnW,aAAaqW,EAAO7W,YAE1B7nC,KAAK48C,KAAK1V,EAAS9nC,MAAM,QACpB,CACL,IAAIu/C,EAAS3+C,KAAK68C,kBACd8B,GAAUA,EAAOjX,OAAO/rB,QAAQ+iC,EAAOhX,OAAQ9mB,IAAUkW,EAAKqB,UAClEsmB,EAAQ3nB,EAAK+hB,iBAET8F,GAAUA,EAAOjX,OAAO/rB,QAAQ8iC,EAAM/W,OAAQ9mB,IAChD+9B,EAAOxW,YAAYsW,EAAM7W,WAEzB5nC,KAAK48C,KAAK1V,EAAS9nC,MAAM,EAAG8nC,EAASjnC,OAAS,GAAI,IAElDD,KAAK48C,KAAK1V,EAAS9nC,SAInB03B,EAAKmR,SAASjoC,KAAK48C,KAAK,CAAC1V,EAAS,KACtCpQ,EAAKxtB,SAGP,IAAIgxC,EAAQt6C,KAAK68C,kBACbF,EAAO38C,KAAK64C,iBAQhB,OANIyB,IAAUqC,GAAQrC,EAAM5S,OAAO/rB,QAAQghC,EAAKjV,OAAQ9mB,KACtD05B,EAAMnS,YAAYwU,EAAK/U,WACvB+U,EAAKrzC,SACLtJ,KAAK+7C,WAAU,IAGV/7C,MAET63B,OAAQ,SAAgBtzB,GAKtB,IAJA,IAAIyM,EAAShR,KAAK4oC,YACdgW,EAAWr6C,GAAWA,EAAQq6C,SAC9B3uC,EAAY2uC,EAAW,KAAO,EAEzB9+C,EAAIkR,EAAO/Q,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC3C,IAAIioC,EAAQ/2B,EAAOlR,IACdioC,EAAMJ,gBAAkBI,EAAM+H,UAAU7/B,IAAc2uC,GAAY7W,EAAMnsB,YAAYmsB,EAAMiB,aAAajB,EAAMz+B,SAGpH,OAAOtJ,MAETm4B,QAAS,WACPn4B,KAAK2oC,UAAUxQ,UAEf,IAAK,IAAIr4B,EAAI,EAAGC,EAAIC,KAAK2oC,UAAU1oC,OAAQH,EAAIC,EAAGD,IAAK,CACrD,IAAIoqC,EAAUlqC,KAAK2oC,UAAU7oC,GACzBynC,EAAW2C,EAAQtC,UACvBsC,EAAQtC,UAAYsC,EAAQrC,WAC5BqC,EAAQrC,WAAaN,EACrB2C,EAAQ1gC,OAAS1J,EAGnBE,KAAKgoC,QAAU,KAEfhoC,KAAKiiB,SAAS,IAEhB48B,QAAS,SAAiBzP,GAMxB,IALA,IACInuB,EADY,IAAI69B,EAAc9+C,KAAMovC,GAAY,IAAM,KAAK,GACzCnuB,MAClBhhB,EAASghB,EAAMhhB,OACfinC,EAAW,GAENpnC,EAAI,EAAGA,EAAIG,EAAQH,IAC1BonC,EAASpjC,KAAK,IAAIujC,EAAQpmB,EAAMnhB,GAAGioC,MAAM3oC,MAAM,EAAG,MAG/CY,KAAKioC,SAAWhoC,EAAS,GAC5BinC,EAASpjC,KAAK,IAAIujC,EAAQpmB,EAAMhhB,EAAS,GAAG8nC,MAAM3oC,MAAM,KAG1DY,KAAKs8C,YAAYpV,IAEnB0X,SAAU,SAAkB3uC,GAC1B,IAAIi3B,EAAW,IAAI6X,EAAW/+C,MAAMg/C,IAAI/uC,GAAa,KAErD,OADIi3B,GAAUlnC,KAAKs8C,YAAYpV,KACtBA,GAEX+B,OAAQ,SAAgB1kC,GACtB,IAAIkC,EAAOzG,KACPqwB,EAAO9rB,GAAW,GAClBV,EAAOwsB,EAAKxsB,MAAQ,aACpBqjC,EAAWlnC,KAAK2oC,UAChB1oC,EAASinC,EAASjnC,OAClBo8C,EAASr8C,KAAKioC,QAElB,SAAStf,EAAS7nB,EAAOm+C,GACvB,IAAI51C,EAAQvI,GAASA,EAAMuI,MAE3B,GAAa,MAATA,EAAe,CACjB,IAAIytB,EAAOh2B,EAAMg2B,KACjB,GAAIA,GAAQA,IAASrwB,EAAM,MAAM,IAAIqb,MAAMhhB,EAAM6C,OAAS,IAAM0F,EAAQ,OAASytB,EAAO,mBAAqBrwB,GACzGw4C,GAAYn+C,aAAiB2pC,GAAOphC,SAExCA,EAAyB,iBAAVvI,EAAqBA,EAAQm+C,EAG9C,OAAO/tC,KAAKD,IAAI5H,EAAQ,GAAKgzC,EAAShzC,EAAQpJ,EAASoJ,EAAQ,EAAIA,EAAQpJ,EAASoJ,EAAOpJ,EAAS,GAGtG,IAAIi/C,EAAO7C,GAAUhsB,EAAK7R,OAAS3f,GAAawxB,EAAK5R,KAAO5f,EACxD2f,EAAOmK,EAAS0H,EAAK7R,KAAM,GAC3BC,EAAKkK,EAAS0H,EAAK5R,GAAIxe,EAAS,GAEpC,GAAIue,EAAOC,EACT,GAAI49B,EACF79B,GAAQve,MACH,CACL,IAAIoY,EAAMmG,EACVA,EAAOC,EACPA,EAAKpG,EAIT,GAAI,8BAA8BjW,KAAKyB,GAAO,CAC5C,IAAIs7C,EAAsB,eAATt7C,EACboN,EAAMC,KAAKD,IACX3L,EAASmZ,EAAKD,EAAO,EACrBjR,EAAIjI,EAAS,EACbk8B,EAAU0d,EAAOjuC,EAAI3L,EAAQ,GAAK,EAClC85C,EAAc5d,EACd6d,EAAe7d,EACf8d,EAAQ,GAQZ,GANKjD,IACH+C,EAAcnuC,EAAI,EAAGuN,GACrB6gC,EAAepuC,EAAI,EAAGhR,EAASwe,EAAK,KAGtClR,GAAK6xC,EAAcC,IACV,EAAG,OAEZ,IAAK,IAAIv/C,EAAI,EAAGsT,EAAIoL,EAAO4gC,EAAat/C,GAAKyN,EAAGzN,IAAKsT,IACnDksC,EAAMx/C,GAAKonC,GAAU9zB,EAAI,EAAIA,EAAInT,EAASmT,GAAKnT,GAAQynC,OAGzD,IAAItzB,EAAIkrC,EAAM,GAAG3iC,GAAK,EAAI2iC,EAAM,GAAG3iC,GAC/BtI,EAAIirC,EAAM,GAAG1iC,GAAK,EAAI0iC,EAAM,GAAG1iC,GAC/BtG,EAAI,EACJipC,EAAMhyC,EAAI,EACVqzB,EAAK,CAACxsB,GACNysB,EAAK,CAACxsB,GACNmrC,EAAK,CAAClpC,GACNyQ,EAAK,GACLC,EAAK,GAET,IAASlnB,EAAI,EAAGA,EAAIyN,EAAGzN,IAAK,CAC1B,IAAIshB,EAAWthB,EAAIy/C,EAEfp8C,EAAIie,EAAW,EAAI+9B,EAAa,EAAI,EACpC3b,EAAIpiB,EAAW,EAAI+9B,EAAa,EAAI,EACpCvxC,EAAIwT,EAAW,EAAI+9B,EAAa,EAAI,EACpCzoC,GAJI0K,GAAe+9B,EAAJ,EAAqB,GAI5B7oC,EACZA,EAAIkpC,EAAG1/C,GAAKqD,EAAIuT,EAChBtC,EAAIwsB,EAAG9gC,GAAK0jC,EAAI8b,EAAMx/C,GAAG6c,GAAK/O,EAAI0xC,EAAMx/C,EAAI,GAAG6c,GAAKjG,EAAItC,EACxDC,EAAIwsB,EAAG/gC,GAAK0jC,EAAI8b,EAAMx/C,GAAG8c,GAAKhP,EAAI0xC,EAAMx/C,EAAI,GAAG8c,GAAKlG,EAAIrC,EAG1D0S,EAAGw4B,GAAO3e,EAAG2e,GAAOC,EAAGD,GACvBv4B,EAAGu4B,GAAO1e,EAAG0e,GAAOC,EAAGD,GAEvB,IAASz/C,EAAIyN,EAAI,EAAGzN,GAAK,EAAGA,IAC1BinB,EAAGjnB,IAAM8gC,EAAG9gC,GAAKinB,EAAGjnB,EAAI,IAAM0/C,EAAG1/C,GACjCknB,EAAGlnB,IAAM+gC,EAAG/gC,GAAKknB,EAAGlnB,EAAI,IAAM0/C,EAAG1/C,GAGnCinB,EAAGxZ,IAAM,EAAI+xC,EAAM/xC,GAAGoP,GAAKoK,EAAGw4B,IAAQ,EACtCv4B,EAAGzZ,IAAM,EAAI+xC,EAAM/xC,GAAGqP,GAAKoK,EAAGu4B,IAAQ,EAE7Bz/C,EAAIs/C,EAAR,IAAqBjuC,EAAM5D,EAAI8xC,EAApC,IAAkDjsC,EAAIoL,EAAM1e,GAAKqR,EAAKrR,IAAKsT,IAAK,CAC9E,IAAI82B,EAAUhD,EAAS9zB,EAAI,EAAIA,EAAInT,EAASmT,GACxC2iB,EAAKmU,EAAQxC,OACb+X,EAAK14B,EAAGjnB,GAAKi2B,EAAGpZ,GAChB+iC,EAAK14B,EAAGlnB,GAAKi2B,EAAGnZ,IAChBsiC,GAAQp/C,EAAIqR,IAAK+4B,EAAQ7B,aAAaoX,EAAIC,IAC1CR,GAAQp/C,EAAIs/C,IAAalV,EAAQ/B,aAAasX,GAAKC,SAGzD,IAAS5/C,EAAI0e,EAAM1e,GAAK2e,EAAI3e,IAC1BonC,EAASpnC,EAAI,EAAIA,EAAIG,EAASH,GAAGmpC,OAAO5Y,GAAO6uB,GAAQp/C,IAAM0e,GAAO0gC,GAAQp/C,IAAM2e,IAIxF+hB,QAAS,SAAiBz3B,GACxB,IAAK/I,KAAKioC,QAAS,OAAO,KAC1B,IACIpkC,EACAyQ,EACAsrB,EACA+f,EAWE9U,EACAD,EACAgV,EAjBF1Y,EAAWlnC,KAAK2oC,UAMpB,SAAS/sB,EAAY9b,EAAGsT,GACtB,IAAIw3B,EAAO1D,EAASpnC,GAChB+qC,EAAOD,EAAK5B,UACZ4W,EAAO1Y,EAAS9zB,GAChBysC,EAAOD,EAAK5W,UAChB,OAAO4B,EAAK/C,WAAW1xB,UAAY00B,EAAKjD,UAAUzxB,UAAYypC,EAAK/X,WAAW1xB,UAAY0pC,EAAKjY,UAAUzxB,UAAY00B,EAAKnD,OAAO1sB,SAAS4vB,EAAKlD,QAAQ9rB,YAAYikC,EAAKnY,OAAO1sB,SAAS4kC,EAAKlY,SAU/L,SAASoY,EAAMhgD,GACb,IAAI8qC,EAAO1D,EAASpnC,GAChB+qC,EAAOD,EAAK5B,UACZ8B,EAAUF,EAAK/C,WACfkD,EAAUF,EAAKjD,UACf9G,EAAQ,kBAEZ,GAAIgK,EAAQhvB,aAAaivB,GAAU,CACjC,IAAIgV,EAAMnV,EAAKlD,OACXsY,EAAMnV,EAAKnD,OACXrG,EAAS,IAAI/b,EAAKy6B,EAAKjV,GAAS,GAAMjqB,UAAU,IAAIyE,EAAK06B,EAAKjV,GAAS,IAAO,GAClF,OAAO1J,GAAU7sB,EAAU2B,OAAO20B,EAAQxxB,YAAc+nB,EAAOrmB,SAAS+kC,GAAKzmC,YAAcwnB,IAAUtsB,EAAU2B,OAAO40B,EAAQzxB,YAAc+nB,EAAOrmB,SAASglC,GAAK1mC,YAAcwnB,GAGjL,OAAO,EAGT,SAASpmB,EAAY5a,EAAGsT,GACtB,OAAO8zB,EAASpnC,GAAG4nC,OAAOhtB,YAAYwsB,EAAS9zB,GAAGs0B,QAwBpD,IArBK1nC,KAAK2nC,cAAoC,IAApBT,EAASjnC,QAAgB2b,EAAY,EAAG,IAAMA,EAAY,EAAG,KA3BjFivB,EAAO3D,EA2B6F,GA1BpG0D,EAAOC,EAAKxB,cACZuW,EAAO/U,EAAK7B,UACT4B,EAAK/C,WAAW1xB,UAAY00B,EAAKjD,UAAUzxB,UAAY00B,EAAKhD,WAAW1xB,UAAYypC,EAAKhY,UAAUzxB,UAAY00B,EAAKnD,OAAO1sB,SAAS4vB,EAAKlD,QAAQ5rB,aAAa8jC,EAAKlY,OAAO1sB,SAAS6vB,EAAKnD,WAyB9L7jC,EAAO87B,EAAM/K,UACbtgB,EAAO,IAAIoJ,EAAKhD,EAAY,EAAG,GAAIA,EAAY,EAAG,IAClDilC,EAAYzY,EAAS,GAAGQ,OAAOjgC,IAAIy/B,EAAS,GAAGQ,QAAQrsB,OAAO,IACjC,IAApB6rB,EAASjnC,QAAgB6/C,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMlkC,EAAY,EAAG,IAAMA,EAAY,EAAG,IACtH/X,EAAO87B,EAAM/K,UAEbgL,GADAtrB,EAAO,IAAIoJ,EAAKhD,EAAY,EAAG,GAAIA,EAAY,EAAG,KACpCM,SAAS,IAAI0C,EAAKhD,EAAY,EAAG,GAAIA,EAAY,EAAG,KAAKW,OAAO,GAC9EskC,EAAYzY,EAAS,GAAGQ,OAAOjgC,IAAIy/B,EAAS,GAAGQ,QAAQrsB,OAAO,IACjC,IAApB6rB,EAASjnC,QAAgB6/C,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAMA,EAAM,KACxEtrC,EAAU2B,OAAOuE,EAAY,EAAG,GAAKA,EAAY,EAAG,KACtD7W,EAAO87B,EAAMsC,OACbrC,EAASllB,EAAY,EAAG,GAAK,IAE7B7W,EAAO87B,EAAMuC,QACbtC,EAAS,IAAIliB,EAAKhD,EAAY,EAAG,GAAK,EAAGA,EAAY,EAAG,GAAK,IAG/DilC,EAAYzY,EAAS,GAAGQ,QAGtB7jC,EAAM,CACR,IAAIkX,EAAS/a,KAAKyvB,aAAY,GAC1BwwB,EAAQ,IAAIp8C,EAAK,CACnBkX,OAAQA,EACRzG,KAAMA,EACNsrB,OAAQA,EACR72B,QAAQ,IAQV,OANAk3C,EAAM1sB,eAAevzB,MAAM,GAE3BigD,EAAM1yB,QAAQlK,QAAQrjB,KAAKutB,SAE3B0yB,EAAMnlC,OAAO6kC,EAAU3kC,SAASD,GAAQnB,WAAa,KACjD7Q,IAAWlK,GAAakK,IAAQk3C,EAAMxsB,YAAYzzB,MAC/CigD,EAGT,OAAO,MAET1f,OAAQ,SACR/J,QAAS,SAASA,EAAQM,GACxB,IAAKA,GAAQA,aAAgB4G,EAAc,OAAOlH,EAAQ10B,KAAK5B,KAAKF,KAAM82B,GAC1E,IAAIjmB,EAAU7Q,KAAK4oC,YACf93B,EAAUgmB,EAAK8R,YACfgO,EAAU/lC,EAAQ5Q,OAClB42C,EAAU/lC,EAAQ7Q,OAEtB,IAAK22C,IAAYC,EACf,OAAOD,GAAWC,EAUpB,IAPA,IAGIqJ,EAEAC,EALA3yC,EAAKqD,EAAQ,GAAGqR,YAChB60B,EAAU,GACVqJ,EAAO,EAEPC,EAAO,EAGFvgD,EAAI,EAAGA,EAAI+2C,EAAS/2C,IAAK,CAChC,IAAI2N,EAAKqD,EAAQhR,GAAGoiB,YAIpB,GAHA60B,EAAQjzC,KAAK2J,GACTooC,EAAWpL,EAAMqL,YAAYtoC,EAAIC,GAEvB,CACZyyC,GAAQpgD,GAAK+1C,EAAS,GAAG,GAAK,EAAIgB,EAAU,EAAI/2C,EAChDqgD,EAAOtK,EAAS,GAAG,GACnB,OAIJ,IAGIyK,EAHA3rC,EAAMzD,KAAKyD,IAKf,IAHIlH,EAAKspC,EAAQmJ,GAGV1yC,GAAMC,GAAI,CACf,IAAIooC,EAEJ,GAFIA,EAAWpL,EAAMqL,YAAYtoC,EAAIC,GAKnC,GAAIkH,EAFKkhC,EAAS,GAAG,GAERwK,GAVH,KAUoB,CAGf,KAFbA,EAAOxK,EAAS,GAAG,MAGjBroC,IAAO4yC,EAAOxJ,EAAU/lC,EAAQuvC,GAAMl+B,YAAc,KACpDm+B,EAAO,GAGT,IAAIvO,EAAK+D,EAAS,GAAG,GAErB,GAAIlhC,EAAIm9B,EAAKqO,GApBL,KAoBsB,CAU5B,GATKG,IAAQA,EAAS,CAACJ,EAAMpO,IAGhB,KAFbqO,EAAOtK,EAAS,GAAG,QAGXqK,GAAQrJ,IAASqJ,EAAO,GAC9BzyC,EAAKspC,EAAQmJ,IAASpvC,EAAQovC,GAAMh+B,YACpCi+B,EAAO,IAGJ3yC,EACH,OAAO8yC,EAAO,KAAOJ,GAAQI,EAAO,KAAOH,EAG7C,UAKN,MAGF,OAAO,GAET/pB,aAAc,SAAsBjiB,EAAO5P,EAAS8mB,EAAY0R,GAC9D,IAOI74B,EACAq8C,EACAxlB,EACAsjB,EACA3N,EACA9uC,EAZA6E,EAAOzG,KACP0oB,EAAQ1oB,KAAK6uB,WACbqY,EAAWlnC,KAAK2oC,UAChB6X,EAActZ,EAASjnC,OACvBo8C,EAASr8C,KAAKioC,QACdxS,EAAmBlxB,EAAQmxB,kBAC3BmM,EAAgBpM,EAOhBiM,EAAYn9B,EAAQyrB,QAAUtH,EAAMyI,YACpCwQ,EAAUp9B,EAAQ8xB,MAAQ3N,EAAM4N,UAChCmqB,EAAYl8C,EAAQyM,OACpB4wB,EAAeF,EAAYhZ,EAAMgS,iBAAmB,EAAIiH,GAAWp9B,EAAQ0L,UAAY,GAAKwwC,EAAY,EAAI,KAahH,SAASC,EAAc3qB,EAAIyL,GACzB,OAAOrtB,EAAM6G,SAAS+a,GAAI1a,OAAOmmB,GAASvhC,QAAU,EAGtD,SAAS0gD,EAAkBC,EAAK7qB,EAAIz0B,GAClC,IAAKiD,EAAQiZ,UAAYuY,EAAG3Y,aAAc,CACxC,IAAIyjC,EAASD,EAAIlZ,OAGjB,GAFI3R,IAAO8qB,IAAQ9qB,EAAKA,EAAGtuB,IAAIo5C,IAE3BH,EAAc3qB,EAAI8L,GACpB,OAAO,IAAI7M,EAAU1zB,EAAMmF,EAAM,CAC/ByjC,QAAS0W,EACTzsC,MAAO4hB,KAMf,SAAS+qB,EAAmBF,EAAKxZ,GAC/B,OAAQA,GAAQ7iC,EAAQ2iC,WAAayZ,EAAkBC,EAAKA,EAAIlZ,OAAQ,aAAeN,GAAQ7iC,EAAQ4iC,UAAYwZ,EAAkBC,EAAKA,EAAIhZ,UAAW,cAAgB+Y,EAAkBC,EAAKA,EAAI/Y,WAAY,eAGlN,SAASkZ,EAAU5sC,GACjBkqC,EAAK52C,IAAI0M,GAGX,SAAS6sC,EAAmB9W,GAC1B,IAmBQwG,EAnBJuQ,EAAS5E,GAAUnS,EAAQ1gC,OAAS,GAAK0gC,EAAQ1gC,OAASg3C,EAAc,EAE5E,MAA8B,WAAzBS,EAAS/8C,EAAOq8C,GACZG,EAAcxW,EAAQxC,OAAQ7F,IAErCwc,EAAO,IAAI1pB,EAAK,CACdvT,UAAU,EACVi7B,QAAQ,IAGN4E,EACG/W,EAAQ5B,YACX3T,EAAKusB,cAAchX,EAAShmC,EAAM09B,EAAc7G,EAAY,KAAMgC,EAAcgkB,GAAW,GAE5E,WAARR,GACT5rB,EAAKwsB,cAAcjX,EAASqW,EAAK3e,EAAc,KAAM7E,EAAcgkB,GAAW,GAG3E1C,EAAK79B,eAAV,EAES69B,EAAK3iC,SAASvH,KAAWu8B,EAAM2N,EAAKxN,mBAAmB18B,KAAWusC,EAAchQ,EAAI7xB,WAAY4W,IAK7G,GA/DqB,OAAjBmM,IACEA,EAAe,GACjB19B,EAAOwkB,EAAMkS,gBACb2lB,EAAM73B,EAAMoS,eACZC,EAAarS,EAAMsS,gBACnB6G,EAAgBA,EAAcp6B,IAAIktB,EAAKgB,kBAAkBiM,EAAc7E,KAEvE74B,EAAOq8C,EAAM,UAwDbh8C,EAAQ6iC,MAAS7iC,EAAQ2iC,UAAamV,GAEnC,GAAI93C,EAAQ2iC,UAAY3iC,EAAQ4iC,QACrC,IAAK,IAAIrnC,EAAI,EAAGA,EAAI0gD,EAAa1gD,IAC/B,GAAI8B,EAAMk/C,EAAmB5Z,EAASpnC,IAAK,OAAO8B,OAHpD,GAAIA,EAAMk/C,EAAmB5Z,EAAS,IAAI,IAAS4Z,EAAmB5Z,EAASsZ,EAAc,IAAI,GAAO,OAAO5+C,EAOjH,GAAqB,OAAjBggC,EAAuB,CAGzB,GAFA8O,EAAM1wC,KAAK6wC,mBAAmB18B,GAErB,CACP,IAAI+qB,EAAOwR,EAAI4H,UAEF,IAATpZ,GAAuB,IAATA,GAAcshB,EAAc,EACvCQ,EAAmBtQ,EAAI2H,gBAAe3H,EAAM,MACvCgQ,EAAchQ,EAAI7xB,WAAYgjB,KACxC6O,EAAM,MAIV,IAAKA,GAAgB,UAATxsC,GAAoBs8C,EAAc,EAC5C,IAAS1gD,EAAI,EAAGA,EAAI0gD,EAAa1gD,IAAK,CACpC,IAAIoqC,EAAUhD,EAASpnC,GAEvB,GAAIqU,EAAMuG,YAAYwvB,EAAQxC,SAAW3M,EAAa6G,GAAgBof,EAAmB9W,GAAU,CACjGwG,EAAMxG,EAAQrB,cACd,QAMR,OAAQ6H,GAAO/O,GAAW3hC,KAAKy0B,UAAUtgB,IAAUu8B,IAAQhP,IAAc+e,EAAY,IAAIzrB,EAAU,OAAQh1B,MAAQ0wC,EAAM,IAAI1b,EAAU0M,EAAY,SAAW,QAAS1hC,KAAM,CAC3KosC,SAAUsE,EACVv8B,MAAOu8B,EAAI7xB,aACR,OAEN7f,EAAK8D,KAAK2nC,EAAMuG,kBAAkB,SAAU1vC,GAC7CtB,KAAKsB,EAAO,MAAQ,SAAU8pB,GAC5B,IAAIslB,EAAM1wC,KAAKkwC,cAAc9kB,GAC7B,OAAOslB,GAAOA,EAAIpvC,QAEnB,CACDJ,OAAO,EACPsvC,cAAe,WAIb,IAHA,IAAIr8B,EAAQ2E,EAAM1T,KAAK5E,WACnBwQ,EAAShR,KAAK4oC,YAET9oC,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IAAK,CAC7C,IAAI4wC,EAAM1/B,EAAOlR,GAAG0wC,cAAcr8B,GAClC,GAAIu8B,EAAK,OAAOA,EAGlB,OAAO,MAETD,YAAa,WACX,IAAIC,EAAM1wC,KAAKwwC,cAAc3tC,MAAM7C,KAAMQ,WACzC,OAAOkwC,EAAMA,EAAIC,YAAc,MAEjCT,cAAe,SAAuB9kB,GACpC,GAAsB,iBAAXA,EAAqB,CAI9B,IAHA,IAAIpa,EAAShR,KAAK4oC,YACd3oC,EAAS,EAEJH,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IAAK,CAC7C,IAAIuF,EAAQpF,EACR8nC,EAAQ/2B,EAAOlR,GAGnB,IAFAG,GAAU8nC,EAAMzuB,aAEH8R,EACX,OAAO2c,EAAMmI,cAAc9kB,EAAS/lB,GAIxC,GAAI2L,EAAO/Q,OAAS,GAAKmrB,GAAUprB,KAAKsZ,YACtC,OAAO,IAAIwvB,EAAc93B,EAAOA,EAAO/Q,OAAS,GAAI,QAEjD,GAAImrB,GAAUA,EAAOqd,SAAWrd,EAAOqd,YAAczoC,KAC1D,OAAOorB,EAGT,OAAO,MAETg2B,sBAAuB,WACrB,IAAI9Q,EAAUx3B,EAAM1T,KAAK5E,WAEzB,GAAI8vC,EAAQn6B,SACV,MAAO,GAOT,IAJA,IAAImjC,EAAU,GACV+H,EAAa,EACbrwC,EAAShR,KAAK4oC,YAET9oC,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IAAK,CAI7C,IAHA,IAAIioC,EAAQ/2B,EAAOlR,GACfwhD,EAAavZ,EAAMsI,oBAAoBC,GAElCl9B,EAAI,EAAGsD,EAAI4qC,EAAWrhD,OAAQmT,EAAIsD,EAAGtD,IAAK,CACjD,IAAIgY,EAASi2B,EAAatZ,EAAMwI,gBAAgB+Q,EAAWluC,IAEvDkmC,EAAQ9uC,QAAQ4gB,GAAU,GAC5BkuB,EAAQx1C,KAAKsnB,GAIjBi2B,GAActZ,EAAM9nC,OAGtB,OAAOq5C,KAEP,IAAI,WA8CN,SAASiI,EAAah1C,EAAKuqB,EAAM5b,GAC/B,IAIIkiC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAXAzW,EAAWpQ,EAAK6R,UAChB1oC,EAASinC,EAASjnC,OAClBqkB,EAAS,IAAIrf,MAAM,GACnBq1C,GAAQ,EAUZ,SAASkH,EAAYtX,GACnB,GAAIhvB,EACFgvB,EAAQ9lB,sBAAsBlJ,EAAQoJ,GAEtC84B,EAAO94B,EAAO,GACd+4B,EAAO/4B,EAAO,OACT,CACL,IAAInQ,EAAQ+1B,EAAQxC,OACpB0V,EAAOjpC,EAAMwI,GACb0gC,EAAOlpC,EAAMyI,GAGf,GAAI09B,EACF/tC,EAAIiyB,OAAO4e,EAAMC,GACjB/C,GAAQ,MACH,CACL,GAAIp/B,EACFsiC,EAAMl5B,EAAO,GACbm5B,EAAMn5B,EAAO,OACR,CACL,IAAI4L,EAASga,EAAQtC,UACrB4V,EAAMJ,EAAOltB,EAAOvT,GACpB8gC,EAAMJ,EAAOntB,EAAOtT,GAGlB4gC,IAAQJ,GAAQK,IAAQJ,GAAQK,IAASJ,GAASK,IAASJ,EAC7DhxC,EAAIkyB,OAAO2e,EAAMC,GAEjB9wC,EAAI00B,cAAcyc,EAAMC,EAAMH,EAAKC,EAAKL,EAAMC,GAOlD,GAHAC,EAAQF,EACRG,EAAQF,EAEJniC,EACFwiC,EAAOp5B,EAAO,GACdq5B,EAAOr5B,EAAO,OACT,CACD4L,EAASga,EAAQrC,WACrB6V,EAAOJ,EAAQptB,EAAOvT,GACtBghC,EAAOJ,EAAQrtB,EAAOtT,IAI1B,IAAK,IAAI9c,EAAI,EAAGA,EAAIG,EAAQH,IAC1B0hD,EAAYta,EAASpnC,IAGnBg3B,EAAKmR,SAAWhoC,EAAS,GAAGuhD,EAAYta,EAAS,IAGvD,MAAO,CACL9J,MAAO,SAAe7wB,EAAK4e,EAAOE,EAAY0R,GAC5C,IAAIJ,EAAYxR,EAAMwR,UAClB8D,EAAYtV,EAAMkS,YAAclS,EAAMyR,KACtClU,EAAQ1oB,KAAK6uB,WACbyH,EAAU5N,EAAM4N,UAChBnF,EAAYzI,EAAMyI,YAClBgK,EAAYzS,EAAM0S,eAClBqmB,GAAc71C,GAAMU,QAAQI,YAAcykB,GAAagK,GAAaA,EAAUl7B,OAQlF,SAAS0wC,EAAU7wC,GACjB,OAAOq7B,GAAWr7B,EAAI2hD,EAAaA,GAAcA,GAGnD,GAXK9kB,GAAWpwB,EAAI6xB,aAEhB9H,GAAWnF,IAAcswB,GAAchhB,KACzC8gB,EAAah1C,EAAKvM,KAAM+8B,GACpB/8B,KAAKioC,SAAS17B,EAAImyB,cAOnB+B,IAAcnK,GAAWnF,KAC5BnxB,KAAKq6B,WAAW9tB,EAAK4e,EAAOE,GAExBiL,IACF/pB,EAAI8pB,KAAK3N,EAAM4U,eACf/wB,EAAIuvB,YAAc,iBAGhB3K,GAAW,CACb,GAAIswB,EAAY,CACT9kB,GAAWpwB,EAAI6xB,YAOpB,IANA,IAGI3f,EAHAijC,EAAY,IAAI5C,EAAc9+C,KAAM,IAAM,IAAI,EAAO+8B,GACrD98B,EAASyhD,EAAUzhD,OACnBue,GAAQkK,EAAM4S,gBAEdx7B,EAAI,EAED0e,EAAO,GACZA,GAAQmyB,EAAU7wC,KAAO6wC,EAAU7wC,KAGrC,KAAO0e,EAAOve,GACZwe,EAAKD,EAAOmyB,EAAU7wC,MAClB0e,EAAO,GAAKC,EAAK,IAAGijC,EAAUC,SAASp1C,EAAK2E,KAAKC,IAAIqN,EAAM,GAAItN,KAAKC,IAAIsN,EAAI,IAChFD,EAAOC,EAAKkyB,EAAU7wC,KAI1ByM,EAAIyjB,WAIV+N,cAAe,SAAuBxxB,EAAK2O,GACzC3O,EAAI6xB,YACJmjB,EAAah1C,EAAKvM,KAAMkb,GACxB3O,EAAIyjB,SAtKR,SAAqBzjB,EAAK26B,EAAUhsB,EAAQ5G,GAC1C,KAAIA,GAAQ,GAuBZ,IAtBA,IAIIstC,EACAC,EALA3jB,EAAO5pB,EAAO,EACdwtC,EAAWxtC,EAAO,EAClBytC,EAAW7jB,EAAO,EAClB5Z,EAAS,IAAIrf,MAAM,GAmBdnF,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIoqC,EAAUhD,EAASpnC,GACnB2pB,EAAYygB,EAAQ7sB,WAUxB,GARA6sB,EAAQ9lB,sBAAsBlJ,EAAQoJ,GAEtCs9B,EAAKt9B,EAAO,GACZu9B,EAAKv9B,EAAO,GACI,EAAZmF,GAAeu4B,EAAW,GACd,EAAZv4B,GAAeu4B,EAAW,GAC9Bz1C,EAAIoyB,SAASijB,EAAK1jB,EAAM2jB,EAAK3jB,EAAM5pB,EAAMA,GAErCwtC,EAAW,KAAmB,EAAZr4B,GAAgB,CACpC,IAAI6Q,EAAY/tB,EAAI+tB,UACpB/tB,EAAI+tB,UAAY,UAChB/tB,EAAIoyB,SAASijB,EAAKG,EAAUF,EAAKE,EAAUD,EAAUA,GACrDv1C,EAAI+tB,UAAYA,GA/BpB,SAAS0nB,EAAW34C,GAClB,IAAI44C,EAAK39B,EAAOjb,GACZ64C,EAAK59B,EAAOjb,EAAQ,GAEpBu4C,GAAMK,GAAMJ,GAAMK,IACpB31C,EAAI6xB,YACJ7xB,EAAIiyB,OAAOojB,EAAIC,GACft1C,EAAIkyB,OAAOwjB,EAAIC,GACf31C,EAAIyjB,SACJzjB,EAAI6xB,YACJ7xB,EAAI8xB,IAAI4jB,EAAIC,EAAIhkB,EAAM,EAAa,EAAVhtB,KAAK4I,IAAQ,GACtCvN,EAAI8pB,SAmJN8rB,CAAY51C,EAAKvM,KAAK2oC,UAAWztB,EAAQtP,GAAMC,SAASG,eAGzD,IAAI,WACP,SAASo2C,EAAkB37C,GACzB,IAAIygC,EAAWzgC,EAAKkiC,UACpB,IAAKzB,EAASjnC,OAAQ,MAAM,IAAI6hB,MAAM,gCACtC,OAAOolB,EAASA,EAASjnC,OAAS,GAGpC,MAAO,CACLu+B,OAAQ,WACN,IAAI0I,EAAWlnC,KAAK2oC,UACI,IAApBzB,EAASjnC,QAAcD,KAAKiqC,cAAc,GACzC/C,EAASjnC,QAAQD,KAAK48C,KAAK,CAAC,IAAIvV,EAAQvuB,EAAM1T,KAAK5E,eAE1D6hD,OAAQ,WACN,MAAM,IAAIvgC,MAAM,2CAElB2c,OAAQ,WACNz+B,KAAK48C,KAAK,CAAC,IAAIvV,EAAQvuB,EAAM1T,KAAK5E,eAEpC06C,aAAc,WACZ,IAAI3yC,EAAO/H,UACPsqC,EAAUhyB,EAAM1T,KAAKmD,GACrBwiC,EAAUjyB,EAAM1T,KAAKmD,GACrBkW,EAAK3F,EAAM1T,KAAKmD,GAChBsS,EAAUunC,EAAkBpiD,MAChC6a,EAAQwtB,aAAayC,EAAQ9vB,SAASH,EAAQ6sB,SAE9C1nC,KAAK48C,KAAK,CAAC,IAAIvV,EAAQ5oB,EAAIssB,EAAQ/vB,SAASyD,OAE9C08B,iBAAkB,WAChB,IAAI5yC,EAAO/H,UACP0vB,EAASpX,EAAM1T,KAAKmD,GACpBkW,EAAK3F,EAAM1T,KAAKmD,GAChBsS,EAAUunC,EAAkBpiD,MAAM0nC,OAEtC1nC,KAAKk7C,aAAahrB,EAAOzoB,IAAIoT,EAAQG,SAASkV,GAAQ9U,SAAS,EAAI,IAAK8U,EAAOzoB,IAAIgX,EAAGzD,SAASkV,GAAQ9U,SAAS,EAAI,IAAKqD,IAE3H6jC,QAAS,WACP,IAAI/5C,EAAO/H,UACP+hD,EAAUzpC,EAAM1T,KAAKmD,GACrBkW,EAAK3F,EAAM1T,KAAKmD,GAChB+P,EAAItZ,EAAKiE,KAAKjE,EAAKoG,KAAKmD,GAAO,IAC/BspC,EAAK,EAAIv5B,EACTuC,EAAUunC,EAAkBpiD,MAAM0nC,OAClCxX,EAASqyB,EAAQvnC,SAASH,EAAQO,SAASy2B,EAAKA,IAAK72B,SAASyD,EAAGrD,SAAS9C,EAAIA,IAAI+C,OAAO,EAAI/C,EAAIu5B,GAErG,GAAI3hB,EAAOnU,QAAS,MAAM,IAAI+F,MAAM,sDAAwDxJ,GAC5FtY,KAAKm7C,iBAAiBjrB,EAAQzR,IAEhC28B,MAAO,WACL,IASIrgC,EACAynC,EACA/gB,EACAvmB,EAZA3S,EAAO/H,UACPmU,EAAMzD,KAAKyD,IACXC,EAAO1D,KAAK0D,KACZiG,EAAUunC,EAAkBpiD,MAC5Bwe,EAAO3D,EAAQ6sB,OACfjpB,EAAK3F,EAAM1T,KAAKmD,GAEhBhD,EAAOvG,EAAKuG,KAAKgD,GAOrB,GAAyB,kBANrBkyC,EAAYz7C,EAAKiE,KAAKsC,GAAM,IAO9B,IACIg9C,GADAE,EAASjkC,EAAK/W,IAAIgX,GAAIpD,OAAO,IACZ5T,IAAIg7C,EAAOznC,SAASwD,GAAM1D,OAAO2/B,GAAa,GAAK,UACnE,GAAIz7C,EAAK+G,OAAOwC,IAAS,EAC9Bg6C,EAAU9jC,EACVA,EAAK3F,EAAM1T,KAAKmD,QACX,IAAKiW,EAAK1Z,OAAO2Z,GAAK,CAC3B,IAAImhB,EAASliB,EAAKtY,KAAKmD,GACnB4N,EAAS3B,EAAU2B,OACvB,GAAIA,EAAOypB,EAAO9wB,QAAUqH,EAAOypB,EAAO7wB,QAAS,OAAO/O,KAAKy+B,OAAOhgB,GACtE,IAAIsG,EAAW/lB,EAAKoG,KAAKmD,GACrBkyC,IAAcz7C,EAAKoG,KAAKmD,GACxBm6C,IAAU1jD,EAAKoG,KAAKmD,GACpBk6C,EAASjkC,EAAK/W,IAAIgX,GAAIpD,OAAO,GAE7BjH,GADA2hB,EAAKvX,EAAKxD,SAASynC,GAAQ3nC,QAAQiK,IAC5B3Q,EACPC,EAAI0hB,EAAG1hB,EACPusB,EAAKjsB,EAAIirB,EAAO9wB,OAChB+xB,EAAKlsB,EAAIirB,EAAO7wB,QAChB4zC,EAAO/hB,EAAKA,EACZgiB,EAAO/hB,EAAKA,EACZgiB,EAAMzuC,EAAIA,EACV0uC,EAAMzuC,EAAIA,EACV+0B,EAASx0B,EAAKiuC,EAAMF,EAAOG,EAAMF,GAWrC,GATIxZ,EAAS,IAGXuZ,GAFA/hB,GAAMwI,GAEMxI,EACZgiB,GAFA/hB,GAAMuI,GAEMvI,GAIVlsB,EADJy0B,GAAUuZ,EAAOC,EAAOD,EAAOG,EAAMF,EAAOC,IAAQF,EAAOG,EAAMF,EAAOC,IACtD,QAAOzZ,EAAS,GAC9BA,EAAS,EAAG,MAAM,IAAItnB,MAAM,iDAChC/G,EAAS,IAAIjC,EAAM8nB,EAAKvsB,EAAIwsB,GAAKA,EAAKzsB,EAAIwsB,GAAIxlB,UAAUsnC,IAAUjI,GAAa,EAAI,GAAK7lC,EAAKw0B,IAAStuB,OAAOiK,GAAUtd,IAAIg7C,GAG3HD,GADA/gB,GADAvmB,GAAS,IAAImG,GAASmB,UAAUzH,GAAQD,OAAOiK,GAAUpL,MAAMinB,EAAIC,IACnDpc,kBAAkBjG,IAClBhE,iBAAiBU,EAAOuJ,kBAAkBhG,KACrDg8B,GAAa+H,EAAS,EAAGA,GAAU,IAAa/H,GAAa+H,EAAS,IAAGA,GAAU,KAG1F,GAAID,EAAS,CACX,IAAIjM,EAAK,IAAIhxB,EAAK9G,EAAK/W,IAAI86C,GAASlnC,OAAO,GAAIknC,EAAQvnC,SAASwD,GAAM1D,OAAO,KAAK,GAC9Ey7B,EAAK,IAAIjxB,EAAKi9B,EAAQ96C,IAAIgX,GAAIpD,OAAO,GAAIoD,EAAGzD,SAASunC,GAASznC,OAAO,KAAK,GAC1EgL,EAAO,IAAIR,EAAK9G,EAAMC,GACtBskC,EAAcj9B,EAAKE,QAAQu8B,GAG/B,KAFAxnC,EAASu7B,EAAGz1B,UAAU01B,GAAI,IAEb,CACX,IAAKwM,EAAa,OAAO/iD,KAAKy+B,OAAOhgB,GACrC,MAAM,IAAIqD,MAAM,iDAIlB0gC,GADA/gB,EAASjjB,EAAKxD,SAASD,IACPP,iBAAiBiE,EAAGzD,SAASD,IAC7C,IAAIioC,EAAal9B,EAAKE,QAAQjL,GAAQ,GAEnB,IAAfioC,EACFR,EAASO,EAAcpuC,EAAI6tC,GAClBO,IAAgBC,IACzBR,GAAUA,EAAS,EAAI,KAAO,KAIlC,GAAIA,EAAQ,CASV,IARA,IAAI5hC,EAAU,KACVqiC,EAAMtuC,EAAI6tC,GACV/qC,EAAQwrC,GAAO,IAAM,EAAI/xC,KAAKojB,MAAM2uB,EAAMriC,GAAW,IACrDsiC,EAAMV,EAAS/qC,EACfymB,EAAOglB,EAAMhyC,KAAK4I,GAAK,IACvBqpC,EAAI,EAAI,EAAIjyC,KAAKwI,IAAIwkB,IAAS,EAAIhtB,KAAKuI,IAAIykB,IAC3CgJ,EAAW,GAENpnC,EAAI,EAAGA,GAAK2X,EAAO3X,IAAK,CAC/B,IAAIi2B,EAAKtX,EACL2kC,EAAM,KAaV,GAXItjD,EAAI2X,IACN2rC,EAAM3hB,EAAO3mB,OAAO,IAAIM,SAAS+nC,GAE7BjoC,GACF6a,EAAK7a,EAAOC,gBAAgBsmB,GAC5B2hB,EAAMloC,EAAOC,gBAAgBsmB,EAAOh6B,IAAI27C,IAAMpoC,SAAS+a,IAEvDA,EAAKhb,EAAOtT,IAAIg6B,IAIf3hC,EAEE,CACL,IAAIujD,EAAM5hB,EAAO3mB,QAAQ,IAAIM,SAAS+nC,GAElCjoC,IACFmoC,EAAMnoC,EAAOC,gBAAgBsmB,EAAOh6B,IAAI47C,IAAMroC,SAAS+a,IAGzDmR,EAASpjC,KAAK,IAAIujC,EAAQtR,EAAIstB,EAAKD,SARnCvoC,EAAQwtB,aAAa+a,GAWvB3hB,EAASA,EAAO3mB,OAAOooC,GAGzBljD,KAAK48C,KAAK1V,KAGdoc,OAAQ,WACN,IAAI7kC,EAAK3F,EAAM1T,KAAK5E,WAChBqa,EAAUunC,EAAkBpiD,MAAM0nC,OAEtC1nC,KAAKy+B,OAAO5jB,EAAQpT,IAAIgX,KAE1B8kC,QAAS,WACP,IAAIh7C,EAAO/H,UACP+hD,EAAUzpC,EAAM1T,KAAKmD,GACrBkW,EAAK3F,EAAM1T,KAAKmD,GAChBi7C,EAAYxkD,EAAKoG,KAAKmD,GACtBsS,EAAUunC,EAAkBpiD,MAAM0nC,OAEtC1nC,KAAKsiD,QAAQznC,EAAQpT,IAAI86C,GAAU1nC,EAAQpT,IAAIgX,GAAK+kC,IAEtDC,aAAc,WACZ,IAAIl7C,EAAO/H,UACPsqC,EAAUhyB,EAAM1T,KAAKmD,GACrBwiC,EAAUjyB,EAAM1T,KAAKmD,GACrBkW,EAAK3F,EAAM1T,KAAKmD,GAChBsS,EAAUunC,EAAkBpiD,MAAM0nC,OAEtC1nC,KAAKk7C,aAAargC,EAAQpT,IAAIqjC,GAAUjwB,EAAQpT,IAAIsjC,GAAUlwB,EAAQpT,IAAIgX,KAE5EilC,iBAAkB,WAChB,IAAIn7C,EAAO/H,UACP0vB,EAASpX,EAAM1T,KAAKmD,GACpBkW,EAAK3F,EAAM1T,KAAKmD,GAChBsS,EAAUunC,EAAkBpiD,MAAM0nC,OAEtC1nC,KAAKm7C,iBAAiBtgC,EAAQpT,IAAIyoB,GAASrV,EAAQpT,IAAIgX,KAEzDklC,MAAO,WACL,IAAIp7C,EAAO/H,UACPqa,EAAUunC,EAAkBpiD,MAAM0nC,OAClCvzB,EAAQ0G,EAAQpT,IAAIqR,EAAM1T,KAAKmD,IAC/BkyC,EAAYz7C,EAAKiE,KAAKjE,EAAKuG,KAAKgD,IAAO,GAElB,kBAAdkyC,EACTz6C,KAAKo7C,MAAMjnC,EAAOsmC,GAElBz6C,KAAKo7C,MAAMjnC,EAAO0G,EAAQpT,IAAIqR,EAAM1T,KAAKmD,MAG7Cm2B,UAAW,SAAmBzuB,GAC5BjQ,KAAK+7C,WAAU,GACf/7C,KAAKkE,KAAKlE,KAAMiQ,MAGjB,CACH2gB,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAIq/C,EAASr/C,EAAQ2rB,OAAS,kBAAoB3rB,EAAQyrB,OAAS,kBAAoB,YACvF,OAAO2E,EAAKivB,GAAQ5jD,KAAK2oC,UAAW3oC,KAAKioC,QAASjoC,KAAMkb,EAAQ3W,IAElEhC,QAAS,CACP2N,UAAW,SAAmBg3B,EAAUmV,EAAQvlB,EAAM5b,EAAQ3W,EAASs9B,GACrE,IAAIyY,EAAQpT,EAAS,GACrB,IAAKoT,EAAO,OAAO,IAAI7+B,EAEvB,IAAI6I,EAAS,IAAIrf,MAAM,GACnB4+C,EAAavJ,EAAMl2B,sBAAsBlJ,EAAQ,IAAIjW,MAAM,IAC3DgM,EAAM4yC,EAAWzkD,MAAM,EAAG,GAC1B+R,EAAMF,EAAI7R,QACV+X,EAAQ,IAAIlS,MAAM,GAEtB,SAAS6+C,EAAe5Z,GACtBA,EAAQ9lB,sBAAsBlJ,EAAQoJ,GAEtC,IAAK,IAAIxkB,EAAI,EAAGA,EAAI,EAAGA,IACrB2qC,EAAM8E,WAAWsU,EAAW/jD,GAAI+jD,EAAW/jD,EAAI,GAAIwkB,EAAOxkB,EAAI,GAAIwkB,EAAOxkB,GAAIA,EAAG+hC,EAAgBA,EAAc/hC,GAAK,EAAGmR,EAAKE,EAAKgG,GAGlI,IAAIkB,EAAMwrC,EACVA,EAAav/B,EACbA,EAASjM,EAGX,IAAK,IAAIvY,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC1CgkD,EAAe5c,EAASpnC,IAI1B,OADIu8C,GAAQyH,EAAexJ,GACpB,IAAI7+B,EAAWxK,EAAI,GAAIA,EAAI,GAAIE,EAAI,GAAKF,EAAI,GAAIE,EAAI,GAAKF,EAAI,KAEtE8e,gBAAiB,SAAyBmX,EAAUmV,EAAQvlB,EAAM5b,EAAQ3W,GACxE,IAAImkB,EAAQoO,EAAKjI,WACbmB,EAAStH,EAAMyI,YACf1F,EAAc/C,EAAMgS,iBACpBqC,EAAe/M,GAAU8G,EAAK1F,iBAAiBlW,EAAQ3W,GACvDs9B,EAAgB7R,GAAU2E,EAAKgB,kBAAkBlK,EAAasR,GAC9D5sB,EAASwkB,EAAKzkB,UAAUg3B,EAAUmV,EAAQvlB,EAAM5b,EAAQ3W,EAASs9B,GAErE,IAAK7R,EAAQ,OAAO7f,EACpB,IAAIyxB,EAAenW,EAAc,EAC7BvnB,EAAOwkB,EAAMkS,gBACb2lB,EAAM73B,EAAMoS,eACZC,EAAarS,EAAMsS,gBACnB+oB,EAAa,IAAItoC,EAAW,IAAIiC,EAAKmkB,IAEzC,SAASmiB,EAAS7vC,GAChBhE,EAASA,EAAO4Q,QAAQ5M,GAG1B,SAAS8vC,EAAS/Z,GAChB/5B,EAASA,EAAO2Q,MAAMijC,EAAWzjC,UAAU4pB,EAAQxC,OAAOzsB,UAAUC,KAGtE,SAASgpC,EAAQha,EAAShmC,GACX,UAATA,GAAoBgmC,EAAQ5B,WAC9B2b,EAAS/Z,GAETvV,EAAKusB,cAAchX,EAAShmC,EAAM09B,EAAc7G,EAAY7f,EAAQ6hB,EAAcinB,GAItF,SAASG,EAAOja,EAASqW,GACX,UAARA,EACF0D,EAAS/Z,GAETvV,EAAKwsB,cAAcjX,EAASqW,EAAK3e,EAAc1mB,EAAQ6hB,EAAcinB,GAIzE,IAAI/jD,EAASinC,EAASjnC,QAAUo8C,EAAS,EAAI,GAE7C,GAAIp8C,EAAS,EAAG,CACd,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAQH,IAC1BokD,EAAQhd,EAASpnC,GAAIoE,GAGnBm4C,EACF6H,EAAQhd,EAAS,GAAIhjC,IAErBigD,EAAOjd,EAAS,GAAIqZ,GACpB4D,EAAOjd,EAASA,EAASjnC,OAAS,GAAIsgD,IAI1C,OAAOpwC,GAETwlB,kBAAmB,SAA2BiK,EAAQ1kB,GACpD,IAAKA,EAAQ,MAAO,CAAC0kB,EAAQA,GAC7B,IAAIxuB,EAAM,IAAI0H,EAAM8mB,EAAQ,GAAG3kB,UAAUC,GACrC7J,EAAM,IAAIyH,EAAM,EAAG8mB,GAAQ3kB,UAAUC,GACrCkpC,EAAMhzC,EAAIyI,oBACV3W,EAAIkO,EAAIkI,YACRnW,EAAIkO,EAAIiI,YACRI,EAAMxI,KAAKwI,IAAI0qC,GACf3qC,EAAMvI,KAAKuI,IAAI2qC,GACfxhC,EAAM1R,KAAK0R,IAAIwhC,GACfriC,EAAK7Q,KAAKoJ,MAAMnX,EAAIyf,EAAK1f,GACzB8e,EAAK9Q,KAAKoJ,MAAMnX,EAAGyf,EAAM1f,GAC7B,MAAO,CAACgO,KAAKyD,IAAIzR,EAAIgO,KAAKuI,IAAIsI,GAAMtI,EAAMtW,EAAI+N,KAAKwI,IAAIqI,GAAMrI,GAAMxI,KAAKyD,IAAIxR,EAAI+N,KAAKwI,IAAIsI,GAAMvI,EAAMvW,EAAIgO,KAAKuI,IAAIuI,GAAMtI,KAE1HwnC,cAAe,SAAuBhX,EAAShmC,EAAM07B,EAAQ7E,EAAY7f,EAAQ6hB,EAAcinB,EAAUK,GACvG,IAAIhN,EAASnN,EAAQxB,WACjBwO,EAASG,EAAOhO,cAChBl1B,EAAQkjC,EAAOlM,YAAYlwB,UAAUC,GACrCopC,EAAUpN,EAAOqN,gBAAgB,GAAGnpC,SAASwkB,GAAQ3kB,UAAU8hB,GAC/DynB,EAAUnN,EAAOkN,gBAAgB,GAAGnpC,SAASwkB,GAAQ3kB,UAAU8hB,GAC/D1jB,EAAQirC,EAAQ9pC,iBAAiBgqC,GAUrC,IARInrC,EAAQ,GAAKA,GAAS,OACxBirC,EAAUA,EAAQ/oC,SAClBipC,EAAUA,EAAQjpC,UAGhB8oC,GAAQL,EAAS7vC,GACrB6vC,EAAS7vC,EAAM1M,IAAI68C,IAEN,UAATpgD,EAAkB,CACpB,IAAIm9B,EAAS,IAAI/b,EAAKnR,EAAM1M,IAAI68C,GAAU,IAAIxrC,GAAOwrC,EAAQjwC,EAAGiwC,EAAQlwC,IAAI,GAAMyM,UAAU,IAAIyE,EAAKnR,EAAM1M,IAAI+8C,GAAU,IAAI1rC,GAAO0rC,EAAQnwC,EAAGmwC,EAAQpwC,IAAI,IAAO,GAE9JitB,GAAUltB,EAAMuG,YAAY2mB,IAAWtG,EAAa6E,GACtDokB,EAAS3iB,GAIb2iB,EAAS7vC,EAAM1M,IAAI+8C,KAErBrD,cAAe,SAAuBjX,EAASqW,EAAK3gB,EAAQ1kB,EAAQ6hB,EAAcinB,EAAUK,GAC1F,IAAIlwC,EAAQ+1B,EAAQxC,OAAOzsB,UAAUC,GACjCw1B,EAAMxG,EAAQrB,cACd4b,EAAS/T,EAAIiC,YAAYv3B,SAA2B,IAAlBs1B,EAAI4H,UAAkB1Y,GAAUA,GAAQ3kB,UAAU8hB,GAE5E,WAARwjB,IACE8D,IACFL,EAAS7vC,EAAM6G,SAASypC,IACxBT,EAAS7vC,EAAM1M,IAAIg9C,KAGrBtwC,EAAQA,EAAM1M,IAAIg9C,EAAO3pC,QAAQ,MAGnCkpC,EAAS7vC,EAAM1M,IAAIg9C,IACnBT,EAAS7vC,EAAM6G,SAASypC,KAE1Bx0B,gBAAiB,SAAyBiX,EAAUmV,EAAQvlB,EAAM5b,EAAQ3W,GACxE,IAEIs9B,EACA6iB,EAHAh8B,EAAQoO,EAAKjI,WAKjB,GAJatqB,EAAQyrB,QAAUtH,EAAMyI,YAIzB,CACV,IAAI4L,EAAejG,EAAK1F,iBAAiBlW,EAAQ3W,GAC7Cq9B,EAAelZ,EAAMgS,iBAAmB,EACxCiqB,EAAa/iB,EAEa,UAA1BlZ,EAAMkS,kBAA6B+pB,EAAa/iB,EAAelZ,EAAMsS,iBAC5C,WAAzBtS,EAAMoS,iBAA6B6pB,EAAazzC,KAAKC,IAAIwzC,EAAY/iB,EAAe1wB,KAAK0zC,QAC7F/iB,EAAgBlN,EAAKgB,kBAAkBiM,EAAc7E,GACrD2nB,EAAc/vB,EAAKgB,kBAAkBgvB,EAAY5nB,GASnD,IANA,IAAIzY,EAAS,IAAIrf,MAAM,GACnBmS,EAAKE,IACLD,GAAMD,EACNiF,EAAKjF,EACLkF,EAAKjF,EAEAvX,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CACjConC,EAASpnC,GAEfskB,sBAAsBlJ,EAAQoJ,GAEtC,IAAK,IAAIlR,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAG,CAC7B,IAAIouB,EAAWpuB,EAAkByuB,EAAd6iB,EACfG,EAAWrjB,EAAUA,EAAQ,GAAK,EAClCsjB,EAAWtjB,EAAUA,EAAQ,GAAK,EAClCptB,EAAIkQ,EAAOlR,GACXiB,EAAIiQ,EAAOlR,EAAI,GACf2xC,EAAK3wC,EAAIywC,EACTG,EAAK5wC,EAAIywC,EACTI,EAAK5wC,EAAIywC,EACTI,EAAK7wC,EAAIywC,EACTC,EAAK3tC,IAAIA,EAAK2tC,GACdC,EAAK3tC,IAAIA,EAAK2tC,GACdC,EAAK5oC,IAAIA,EAAK4oC,GACdC,EAAK5oC,IAAIA,EAAK4oC,IAItB,OAAO,IAAIzpC,EAAWrE,EAAIiF,EAAIhF,EAAKD,EAAIkF,EAAKD,OAIlDsY,EAAKryB,OAAO,CACVC,QAAS,IAAI,WACX,IAAIu+B,EAAQ,kBACRqkB,EAAkB,CAAC,IAAI9d,EAAQ,EAAE,EAAG,GAAI,CAAC,EAAGvG,GAAQ,CAAC,GAAIA,IAAS,IAAIuG,EAAQ,CAAC,GAAI,GAAI,EAAEvG,EAAO,GAAI,CAACA,EAAO,IAAK,IAAIuG,EAAQ,CAAC,EAAG,GAAI,CAAC,GAAIvG,GAAQ,CAAC,EAAGA,IAAS,IAAIuG,EAAQ,CAAC,EAAG,GAAI,CAACvG,EAAO,GAAI,EAAEA,EAAO,KAE5M,SAASskB,EAAWle,EAAUmV,EAAQ9zC,GACpC,IAAI7D,EAAQ1F,EAAKmH,SAASoC,GACtBuuB,EAAO,IAAInC,EAAKjwB,GAAyB,GAAhBA,EAAMqE,QAAmBF,EAAK0hB,WAK3D,OAHAuM,EAAK8lB,KAAK1V,GAEVpQ,EAAKmR,QAAUoU,EACRvlB,EAAKz2B,IAAIqE,EAAO,CACrBqE,QAAQ,IAIZ,SAASs8C,EAActqC,EAAQ6kB,EAAQr3B,GAGrC,IAFA,IAAI2+B,EAAW,IAAIjiC,MAAM,GAEhBnF,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIoqC,EAAUib,EAAgBrlD,GAC9BonC,EAASpnC,GAAK,IAAIunC,EAAQ6C,EAAQxC,OAAOtsB,SAASwkB,GAAQn4B,IAAIsT,GAASmvB,EAAQtC,UAAUxsB,SAASwkB,GAASsK,EAAQrC,WAAWzsB,SAASwkB,IAGzI,OAAOwlB,EAAWle,GAAU,EAAM3+B,GAGpC,MAAO,CACL+c,KAAM,WACJ,IAAI/c,EAAO/H,UACX,OAAO4kD,EAAW,CAAC,IAAI/d,EAAQvuB,EAAM5S,UAAUqC,EAAM,SAAU,IAAI8+B,EAAQvuB,EAAM5S,UAAUqC,EAAM,SAAS,EAAOA,IAEnH05B,OAAQ,WACN,IAAI15B,EAAO/H,UACPua,EAASjC,EAAM5S,UAAUqC,EAAM,UAC/Bq3B,EAAS5gC,EAAKkH,UAAUqC,EAAM,UAClC,OAAO88C,EAActqC,EAAQ,IAAI2C,EAAKkiB,GAASr3B,IAEjDqsB,UAAW,WACT,IASIsS,EATA3+B,EAAO/H,UACP4P,EAAOqL,EAAWvV,UAAUqC,EAAM,aAClCq3B,EAASliB,EAAKxX,UAAUqC,EAAM,SAAU,EAAG,CAC7C5C,UAAU,IAER2/C,EAAKl1C,EAAKm1C,eAAc,GACxBC,EAAKp1C,EAAK8jB,YAAW,GACrBuxB,EAAKr1C,EAAKs1C,aAAY,GACtBC,EAAKv1C,EAAKikB,gBAAe,GAG7B,IAAKuL,GAAUA,EAAOzpB,SACpB+wB,EAAW,CAAC,IAAIG,EAAQie,GAAK,IAAIje,EAAQme,GAAK,IAAIne,EAAQoe,GAAK,IAAIpe,EAAQse,QACtE,CAEL,IAAI/kB,GADJhB,EAASliB,EAAKzM,IAAI2uB,EAAQxvB,EAAK4O,SAAQ,GAAM3D,OAAO,KACpCvM,MACZ+xB,EAAKjB,EAAO7wB,OACZ0wC,EAAK7e,EAAKE,EACV4e,EAAK7e,EAAKC,EACdoG,EAAW,CAAC,IAAIG,EAAQie,EAAG79C,IAAIm5B,EAAI,GAAI,KAAM,EAAE6e,EAAI,IAAK,IAAIpY,EAAQie,EAAGtqC,SAAS,EAAG6lB,GAAK,CAAC,EAAG6e,IAAM,IAAIrY,EAAQme,EAAG/9C,IAAI,EAAGo5B,GAAK,KAAM,CAAC,GAAI6e,IAAM,IAAIrY,EAAQme,EAAG/9C,IAAIm5B,EAAI,GAAI,EAAE6e,EAAI,GAAI,MAAO,IAAIpY,EAAQoe,EAAGzqC,SAAS4lB,EAAI,GAAI,KAAM,CAAC6e,EAAI,IAAK,IAAIpY,EAAQoe,EAAGh+C,IAAI,EAAGo5B,GAAK,CAAC,GAAI6e,GAAK,MAAO,IAAIrY,EAAQse,EAAG3qC,SAAS,EAAG6lB,GAAK,KAAM,CAAC,EAAG6e,IAAM,IAAIrY,EAAQse,EAAG3qC,SAAS4lB,EAAI,GAAI,CAAC6e,EAAI,KAG7W,OAAO2F,EAAWle,GAAU,EAAM3+B,IAEpCq9C,eAAgB,aAChB1jB,QAAS,WACP,IAAI35B,EAAO/H,UACP2hC,EAAUxC,EAAMyC,aAAa75B,GAEjC,OAAO88C,EAAcljB,EAAQpnB,OAAQonB,EAAQvC,OAAQr3B,IAEvDs9C,KAAM,WACNC,IAAK,WACH,IAAIv9C,EAAO/H,UACPge,EAAO1F,EAAM5S,UAAUqC,EAAM,QAC7Bg6C,EAAUzpC,EAAM5S,UAAUqC,EAAM,WAChCkW,EAAK3F,EAAM5S,UAAUqC,EAAM,MAC3B7D,EAAQ1F,EAAKmH,SAASoC,GACtBuuB,EAAO,IAAInC,EAAKjwB,GAAyB,GAAhBA,EAAMqE,QAAmBF,EAAK0hB,WAG3D,OAFAuM,EAAK0H,OAAOhgB,GACZsY,EAAKskB,MAAMmH,EAAS9jC,GACbqY,EAAKz2B,IAAIqE,IAElBqhD,eAAgB,WAWd,IAVA,IAAIx9C,EAAO/H,UACPua,EAASjC,EAAM5S,UAAUqC,EAAM,UAC/By9C,EAAQhnD,EAAKkH,UAAUqC,EAAM,SAC7Bq3B,EAAS5gC,EAAKkH,UAAUqC,EAAM,UAC9B0mC,EAAO,IAAM+W,EACbC,EAAQD,EAAQ,GAAM,EACtBvkB,EAAS,IAAI3oB,EAAM,EAAGmtC,GAASrmB,EAASA,GACxCxU,EAAS66B,GAAS,EAAI,GACtB/e,EAAW,IAAIjiC,MAAM+gD,GAEhBlmD,EAAI,EAAGA,EAAIkmD,EAAOlmD,IACzBonC,EAASpnC,GAAK,IAAIunC,EAAQtsB,EAAOtT,IAAIg6B,EAAO3mB,QAAQhb,EAAIsrB,GAAU6jB,KAGpE,OAAOmW,EAAWle,GAAU,EAAM3+B,IAEpC29C,KAAM,WAUJ,IATA,IAAI39C,EAAO/H,UACPua,EAASjC,EAAM5S,UAAUqC,EAAM,UAC/B4tB,EAA0C,EAAjCn3B,EAAKkH,UAAUqC,EAAM,UAC9B49C,EAAUnnD,EAAKkH,UAAUqC,EAAM,WAC/B69C,EAAUpnD,EAAKkH,UAAUqC,EAAM,WAC/B0mC,EAAO,IAAM9Y,EACbsL,EAAS,IAAI3oB,EAAM,GAAI,GACvBouB,EAAW,IAAIjiC,MAAMkxB,GAEhBr2B,EAAI,EAAGA,EAAIq2B,EAAQr2B,IAC1BonC,EAASpnC,GAAK,IAAIunC,EAAQtsB,EAAOtT,IAAIg6B,EAAO3mB,OAAOm0B,EAAOnvC,GAAGsb,SAAStb,EAAI,EAAIsmD,EAAUD,KAG1F,OAAOf,EAAWle,GAAU,EAAM3+B,QAK1C,IAAIm1B,EAAewH,EAASziC,OAAO,CACjCkB,OAAQ,eACRgoB,iBAAkB,CAChBpD,SAAU,IAEZrnB,OAAO,EACP0B,WAAY,SAAsB+D,GAChC3G,KAAKonB,UAAY,GACjBpnB,KAAKqnB,eAAiB,GAEjBrnB,KAAKqtB,YAAY1mB,KACD,iBAARA,EACT3G,KAAK06C,YAAY/zC,GAEjB3G,KAAK+yB,YAAY9tB,MAAMC,QAAQyB,GAAOA,EAAMnG,aAIlDw2B,eAAgB,SAASA,EAAe3tB,EAAOJ,GAC7C,IAAI7F,EAAO6F,EACPqxC,EAAQl3C,EAAK,GACbk3C,GAA6B,iBAAbA,EAAM,KAAiBl3C,EAAO,CAACA,IAEnD,IAAK,IAAItD,EAAImJ,EAAMhJ,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC1C,IAAI4H,EAAOtE,EAAKtD,GACZsD,IAAS6F,GAAWvB,aAAgBitB,IAAOvxB,EAAOpE,EAAKI,MAAMgE,IAE7D6B,MAAMC,QAAQwC,GAChBtE,EAAKtD,GAAK,IAAI60B,EAAK,CACjBuS,SAAUx/B,EACVqB,QAAQ,IAEDrB,aAAgBg2B,IACzBt6B,EAAKgG,OAAOvG,MAAMO,EAAM,CAACtD,EAAG,GAAGkJ,OAAOtB,EAAKorB,mBAC3CprB,EAAK4B,UAIT,OAAO0tB,EAAel1B,KAAK5B,KAAKF,KAAMqJ,EAAOjG,IAE/Cy0B,OAAQ,SAASA,EAAOtzB,GAGtB,IAFA,IAAIgkB,EAAWvoB,KAAKonB,UAEXtnB,EAAIyoB,EAAStoB,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC7C,IAAIg3B,KAAOvO,EAASzoB,GAAG+3B,OAAOtzB,IACrBic,WAAWsW,EAAKxtB,SAG3B,OAAKif,EAAStoB,OAQP43B,EAAO/1B,KAAK5B,KAAKF,QAPlB82B,EAAO,IAAInC,EAAK9rB,EAAK0hB,YACpBgJ,eAAevzB,MACpB82B,EAAKrD,YAAYzzB,MACjBA,KAAKsJ,SACEwtB,IAKXmmB,SAAU,WAGR,IAFA,IAAI10B,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C,IAAKyoB,EAASzoB,GAAGmoC,QAAS,OAAO,EAGnC,OAAO,GAET8T,UAAW,SAAmBM,GAG5B,IAFA,IAAI9zB,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAGi8C,UAAUM,IAG1BQ,gBAAiB,WACf,IAAIvC,EAAQt6C,KAAKgzB,gBACjB,OAAOsnB,GAASA,EAAMuC,mBAExBhE,eAAgB,WACd,IAAI8D,EAAO38C,KAAKizB,eAChB,OAAO0pB,GAAQA,EAAK9D,kBAEtBjQ,UAAW,WAIT,IAHA,IAAIrgB,EAAWvoB,KAAKonB,UAChBpW,EAAS,GAEJlR,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1Cd,EAAK8E,KAAKkN,EAAQuX,EAASzoB,GAAG8oC,aAGhC,OAAO53B,GAET+rC,cAAe,WACb,IAAIzC,EAAQt6C,KAAKgzB,gBACjB,OAAOsnB,GAASA,EAAMyC,iBAExBC,aAAc,WACZ,IAAIL,EAAO38C,KAAKizB,eAChB,OAAO0pB,GAAQA,EAAKK,gBAEtBz8B,QAAS,WAIP,IAHA,IAAIgI,EAAWvoB,KAAKonB,UAChBi3B,EAAO,EAEFv+C,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1Cu+C,GAAQ91B,EAASzoB,GAAGygB,UAGtB,OAAO89B,GAET/kC,UAAW,WAIT,IAHA,IAAIiP,EAAWvoB,KAAKonB,UAChBnnB,EAAS,EAEJH,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CG,GAAUsoB,EAASzoB,GAAGwZ,YAGxB,OAAOrZ,GAETi9C,YAAa,SAAqB3vB,EAAS4vB,GAIzC,IAHA,IAAI50B,EAAWvoB,KAAKonB,UAChBi/B,EAAQ,GAEHvmD,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIu1B,EAAQ9M,EAASzoB,GACjBsiB,EAAKiT,EAAM9H,QACf84B,EAAMviD,KAAKuxB,EAAM6nB,YAAY3vB,IAAYnL,EAAGG,aAAegL,EAAQ/J,SAASpB,GAAMmL,EAAS4vB,IAG7F,OAAOkJ,EAAMniD,KAAK,KAEpBoxB,iBAAkB,SAASA,EAAiBnhB,EAAO5P,EAAS8mB,GAC1D,OAAOiK,EAAiBxzB,KAAK5B,KAAKF,KAAMmU,EAAO5P,EAAQ2kB,QAAUyL,GAAyB,SAAjBpwB,EAAQV,KAAkBU,EAAUvF,EAAKqB,IAAI,GAAIkE,EAAS,CACjI8xB,MAAM,IACJhL,IAEN+R,MAAO,SAAe7wB,EAAK4e,EAAOE,EAAY0R,GAC5C,IAAIxU,EAAWvoB,KAAKonB,UACpB,GAAKmB,EAAStoB,OAAd,CACAkrB,EAAQA,EAAM1oB,OAAO,CACnBk6B,WAAW,EACXU,YAAY,IAEd9wB,EAAI6xB,YAEJ,IAAK,IAAIt+B,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAGkrB,KAAKze,EAAK4e,EAAO4R,GAG/B,IAAK5R,EAAMyR,KAAM,CACf58B,KAAKq6B,WAAW9tB,EAAK4e,EAAOE,GAE5B,IAAI3C,EAAQ1oB,KAAKytB,OAEb/E,EAAM4N,YACR/pB,EAAI8pB,KAAK3N,EAAM4U,eACf/wB,EAAIuvB,YAAc,iBAGhBpT,EAAMyI,aAAa5kB,EAAIyjB,YAG/B+N,cAAe,SAAuBxxB,EAAK2O,EAAQsO,GAGjD,IAFA,IAAIjB,EAAWvoB,KAAKonB,UAEXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIu1B,EAAQ9M,EAASzoB,GACjBsiB,EAAKiT,EAAM9H,QAEV/D,EAAe6L,EAAM3xB,MACxB2xB,EAAM0I,cAAcxxB,EAAK6V,EAAGG,aAAerH,EAASA,EAAOsI,SAASpB,OAIzE,IAAI,WACL,SAASkkC,EAAe7/C,EAAM8/C,GAC5B,IAAIh+B,EAAW9hB,EAAK2gB,UACpB,GAAIm/B,IAAUh+B,EAAStoB,OAAQ,MAAM,IAAI6hB,MAAM,gCAC/C,OAAOyG,EAASA,EAAStoB,OAAS,GAGpC,OAAOjB,EAAK8D,KAAK,CAAC,SAAU,eAAgB,mBAAoB,UAAW,QAAS,SAAU,eAAgB,mBAAoB,UAAW,UAAU,SAAUpC,GAC/JV,KAAKU,GAAO,WACV,IAAIo2B,EAAOwvB,EAAetmD,MAAM,GAChC82B,EAAKp2B,GAAKmC,MAAMi0B,EAAMt2B,cAEvB,CACDg+B,OAAQ,WACN,IAAI3jB,EAAUyrC,EAAetmD,MACzB82B,EAAOjc,GAAWA,EAAQ2F,UAAY3F,EAAU,IAAI8Z,EAAK9rB,EAAK0hB,WAC9DuM,IAASjc,GAAS7a,KAAK2yB,SAASmE,GACpCA,EAAK0H,OAAO37B,MAAMi0B,EAAMt2B,YAE1B6hD,OAAQ,WACN,IAAIxnC,EAAUyrC,EAAetmD,MAAM,GAC/B28C,EAAO9hC,GAAWA,EAAQg+B,iBAC1B1kC,EAAQ2E,EAAM1T,KAAK5E,WACvBR,KAAKw+B,OAAOme,EAAOxoC,EAAM1M,IAAIk1C,EAAKjV,QAAUvzB,IAE9CuqB,UAAW,SAAmBzuB,GAC5Bq2C,EAAetmD,MAAM,GAAM0+B,UAAUzuB,OAGtCjR,EAAK8D,KAAK,CAAC,UAAW,UAAW,WAAY,WAAW,SAAUpC,GACrEV,KAAKU,GAAO,SAAUyqB,GAIpB,IAHA,IACIvpB,EADA2mB,EAAWvoB,KAAKonB,UAGXtnB,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C8B,EAAM2mB,EAASzoB,GAAGY,GAAKyqB,IAAUvpB,EAGnC,OAAOA,KAER,KACHsjC,EAAS5iC,OAAO,IAAI,WAClB,IAAI2O,EAAMC,KAAKD,IACXE,EAAMD,KAAKC,IACXwD,EAAMzD,KAAKyD,IACX6xC,EAAY,CACd1lC,MAAO,CACL,GAAK,EACL,GAAK,GAEPD,UAAW,CACT,GAAK,GAEP7F,SAAU,CACR,GAAK,GAEPrW,QAAS,CACP,GAAK,EACL,MAAM,IAIV,SAAS8hD,EAAS3vB,GAChB,OAAOA,EAAK1P,WAAa,CAAC0P,GAG5B,SAAS4vB,EAAY5vB,EAAM6vB,GACzB,IAAI/kD,EAAMk1B,EAAK/zB,OAAM,GAAO80B,OAAO,CACjC+mB,UAAU,IACT3jC,UAAU,MAAM,GAAM,GAEzB,GAAI0rC,EAAS,CAGX,IAFA,IAAIN,EAAQI,EAAS7kD,GAEZ9B,EAAI,EAAGC,EAAIsmD,EAAMpmD,OAAQH,EAAIC,EAAGD,IAAK,EACxCg3B,EAAOuvB,EAAMvmD,IAEPmoC,SAAYnR,EAAKtW,YACzBsW,EAAK4H,UAAU,OACf5H,EAAK+lB,kBAAkB1U,YAAY,EAAG,GACtCrR,EAAK+hB,iBAAiBxQ,aAAa,EAAG,IAI1CzmC,EAAMA,EAAIglD,mBAAmBC,SAA+B,YAAtBjlD,EAAI07B,eAA6B,GAGzE,OAAO17B,EAGT,SAASklD,EAAaT,EAAOzH,EAAU3E,EAAOC,EAAO31C,GACnD,IAAIwiD,EAAS,IAAIrpB,EAAa70B,EAAK0hB,WAWnC,OAVAw8B,EAAOh0B,YAAYszB,GAAO,GAC1BU,EAASA,EAAOlvB,OAAO,CACrB+mB,SAAUA,IAGNr6C,GAA6B,GAAlBA,EAAQwE,QACvBg+C,EAAOtzB,YAAYymB,GAASD,EAAM/gB,UAAUghB,IAAUD,EAAMtxB,WAAauxB,EAAMvxB,WAAauxB,EAAQD,GAGtG8M,EAAOxzB,eAAe0mB,GAAO,GACtB8M,EAGT,SAASC,EAAmBhO,GAC1B,OAAOA,EAAMa,cAAgBb,EAAMC,aAGrC,SAASgO,EAAahN,EAAOC,EAAOgN,EAAW3iD,GAC7C,GAAIA,IAA6B,GAAjBA,EAAQ4iD,OAAkB5iD,EAAQyrB,SAAW,yBAAyB5tB,KAAK8kD,GAAY,OAAOE,EAAanN,EAAOC,EAAOgN,GAEzI,IAAIG,EAASX,EAAYzM,GAAO,GAC5BqN,EAASpN,GAASD,IAAUC,GAASwM,EAAYxM,GAAO,GACxDqN,EAAWf,EAAUU,GAEzBK,EAASL,IAAa,EAClBI,IAAWC,EAASvsC,UAAYusC,EAAS5iD,SAAY2iD,EAAO/M,cAAgB8M,EAAO9M,eAAgB+M,EAAOnvB,UAE9G,IAKIkuB,EALAmB,EAAYC,EAAgB3e,EAAc9nB,OAAOqmC,EAAOxyB,iBAAiByyB,EAAQN,KACjFhL,EAASyK,EAASY,GAClBpL,EAASqL,GAAUb,EAASa,GAC5BpgB,EAAW,GACXl2B,EAAS,GAGb,SAAS02C,EAAarB,GACpB,IAAK,IAAIvmD,EAAI,EAAGC,EAAIsmD,EAAMpmD,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIg3B,EAAOuvB,EAAMvmD,GACjBd,EAAK8E,KAAKojC,EAAUpQ,EAAK6R,WACzB3pC,EAAK8E,KAAKkN,EAAQ8lB,EAAK8R,aACvB9R,EAAK6wB,eAAgB,GAIzB,SAAS/e,EAAU92B,GAGjB,IAFA,IAAI1O,EAAO,GAEFtD,EAAI,EAAGC,EAAI+R,GAAWA,EAAQ7R,OAAQH,EAAIC,EAAGD,IACpDsD,EAAKU,KAAKkN,EAAOc,EAAQhS,KAG3B,OAAOsD,EAGT,GAAIokD,EAAUvnD,OAAQ,CACpBynD,EAAa1L,GACTC,GAAQyL,EAAazL,GAGzB,IAFA,IAAI2L,EAAe,IAAI3iD,MAAM+L,EAAO/Q,QAE3BH,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IACxC8nD,EAAa9nD,GAAKkR,EAAOlR,GAAGoiB,YAG9B,IAAI2lC,EAAkBh4C,EAAmBe,0BAA0Bg3C,EAAcA,EAAc,GAAG,GAC9FE,EAAqB,GAEzB,IAAShoD,EAAI,EAAGA,EAAIkR,EAAO/Q,OAAQH,IAAK,CACtC,IAAIioC,EAAQ/2B,EAAOlR,GACf6H,EAAKogC,EAAMD,MAAMpkC,KACXokD,EAAmBngD,GAAMmgD,EAAmBngD,IAAO,IACzDogC,EAAMpf,YAAc,CACtBvX,IAAKw3B,EAAUif,EAAgB/nD,GAAGsR,KAClCC,IAAKu3B,EAAUif,EAAgB/nD,GAAGuR,MAItC,IAASvR,EAAI,EAAGC,EAAIynD,EAAUvnD,OAAQH,EAAIC,EAAGD,IAC3CioD,EAAiBP,EAAU1nD,GAAGq4C,SAAUkP,EAAQC,EAAQQ,EAAoBP,GAG9E,IAASznD,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIoqC,EAAUhD,EAASpnC,GACnBk5C,EAAQ9O,EAAQoJ,cAEfpJ,EAAQ8d,UACXD,EAAiB7d,EAASmd,EAAQC,EAAQQ,EAAoBP,GAG1DvO,GAASA,EAAMvB,WAAWvN,EAAQpC,MAAM6f,eAAgB,GAGhEtB,EAAQ4B,EAAW/gB,EAAUqgB,QAE7BlB,EAAQ6B,EAAcjM,EAASD,EAAOhzC,OAAOizC,GAAUD,EAAO58C,SAAS,SAAUmX,GAC/E,QAASgxC,EAAShxC,MAItB,OAAOuwC,EAAaT,GAAO,EAAMpM,EAAOC,EAAO31C,GAGjD,SAAS6iD,EAAanN,EAAOC,EAAOgN,GAClC,IAAIG,EAASX,EAAYzM,GACrBqN,EAASZ,EAAYxM,GACrBsN,EAAYH,EAAOxyB,iBAAiByyB,EAAQN,GAC5ChsC,EAAyB,aAAdksC,EACX7rC,EAAuB,WAAd6rC,EACTiB,EAAQ,GACR9B,EAAQ,GAEZ,SAAS+B,EAAQtxB,GACf,IAAKqxB,EAAMrxB,EAAKpzB,OAAS2X,GAAUisC,EAAO5rC,SAASob,EAAK2iB,WAAW3iB,EAAKxd,YAAc,IAAM0B,GAE1F,OADAqrC,EAAMx+C,QAAQivB,GACPqxB,EAAMrxB,EAAKpzB,MAAO,EAI7B,IAAK,IAAI5D,EAAI0nD,EAAUvnD,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC9C,IAAIg3B,EAAO0wB,EAAU1nD,GAAGuV,QAEpByhB,IACEsxB,EAAQtxB,IAAOA,EAAK+lB,kBAAkB1U,YAAY,EAAG,GAEzDkf,EAAOxO,iBAAiBxQ,aAAa,EAAG,IAK5C,OADA+f,EAAQf,GACDP,EAAaT,GAAO,EAAOpM,EAAOC,GAG3C,SAASmO,EAAkB7pC,EAAMC,GAG/B,IAFA,IAAI5c,EAAO2c,EAEJ3c,GAAM,CACX,GAAIA,IAAS4c,EAAI,OACjB5c,EAAOA,EAAKk2C,UAGd,KAAOv5B,EAAKs5B,OAASt5B,EAAKs5B,QAAUr5B,GAClCD,EAAOA,EAAKs5B,MAGd,IAAKt5B,EAAKs5B,MAAO,CACf,KAAOr5B,EAAGs5B,WACRt5B,EAAKA,EAAGs5B,UAGVv5B,EAAKs5B,MAAQr5B,EACbA,EAAGs5B,UAAYv5B,GAInB,SAAS8pC,EAAkBt3C,GACzB,IAAK,IAAIlR,EAAIkR,EAAO/Q,OAAS,EAAGH,GAAK,EAAGA,IACtCkR,EAAOlR,GAAGyoC,eAId,SAAS2f,EAAc7B,EAAO7qC,EAAUi/B,GACtC,IAAIx6C,EAASomD,GAASA,EAAMpmD,OAE5B,GAAIA,EAAQ,CACV,IAAIsoD,EAASvpD,EAAK8D,KAAKujD,GAAO,SAAUvvB,EAAMh3B,GAC5CE,KAAK82B,EAAKpzB,KAAO,CACf8kD,UAAW,KACXnN,QAASvkB,EAAKyjB,cAAgB,GAAK,EACnClxC,MAAOvJ,KAER,IACC2oD,EAASpC,EAAMjnD,QAAQoT,MAAK,SAAUtP,EAAGC,GAC3C,OAAOwR,EAAIxR,EAAEod,WAAa5L,EAAIzR,EAAEqd,cAE9B+5B,EAAQmO,EAAO,GACf90C,EAAa9D,EAAmBC,yBAAyB24C,EAAQ,KAAMj0C,EAAUwB,mBACpE,MAAbykC,IAAmBA,EAAYH,EAAMC,eAEzC,IAAK,IAAIz6C,EAAI,EAAGA,EAAIG,EAAQH,IAAK,CAC/B,IAAIm6C,EAAQwO,EAAO3oD,GACf4oD,EAASH,EAAOtO,EAAMv2C,KACtBilD,EAAmB,EACnB72C,EAAU6B,EAAW7T,GAEzB,GAAIgS,EAGF,IAFA,IAAIqC,EAAQ,KAEHf,EAAItB,EAAQ7R,OAAS,EAAGmT,GAAK,EAAGA,IACvC,GAAItB,EAAQsB,GAAKtT,EAAG,CAClBqU,EAAQA,GAAS8lC,EAAM2O,mBACvB,IAAI1O,EAAQuO,EAAO32C,EAAQsB,IAE3B,GAAI8mC,EAAMx+B,SAASvH,GAAQ,CACzB,IAAI00C,EAASN,EAAOrO,EAAMx2C,KAC1BilD,EAAmBE,EAAOxN,QAC1BqN,EAAOrN,SAAWsN,EAClBD,EAAOF,UAAYK,EAAOlkD,QAAUkkD,EAAOL,UAAYtO,EACvD,OAMR,GAAI1+B,EAASktC,EAAOrN,WAAa7/B,EAASmtC,GACxCD,EAAO/jD,SAAU,EACjB0hD,EAAMqC,EAAOr/C,OAAS,SACjB,CACL,IAAIm/C,EAAYE,EAAOF,UACvBvO,EAAMO,aAAagO,GAAaA,EAAUjO,cAAgBE,KAKhE,OAAO4L,EAGT,SAASoB,EAAgBzU,EAAWjyB,EAAS+nC,GAC3C,IAMIC,EACAC,EACAC,EARAC,EAAUnoC,GAAW,GACrBywB,EAAO,KAEPjJ,GAAe,EACf4gB,EAAcL,GAAc,GAC5BM,EAAcN,GAAc,GAKhC,SAASt6B,EAAMuZ,GACb,OAAOA,EAAMD,MAAMpkC,IAAM,IAAMqkC,EAAMgB,UAAUv/B,OAGjD,IAAK,IAAI1J,GAAKgpD,GAAcA,EAAW7oD,QAAU,EAAGH,GAAK,EAAGA,IAAK,EAC3DioC,EAAQ+gB,EAAWhpD,IACbgoC,QAAOshB,EAAY56B,EAAMuZ,KAAU,GAG/C,IAASjoC,EAAIkzC,EAAU/yC,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC9C,IAIIioC,EACAmC,EALAwG,EAAMsC,EAAUlzC,GAChBo/B,EAAOwR,EAAIkH,MACXyR,EAAWnqB,EACXv6B,EAAUoc,IAAYA,EAAQ2vB,GAelC,IAdI3I,EAAQ2I,EAAIwH,UAIVnQ,IAAUihB,GACZzgB,GAAgBR,EAAMJ,cAAgByhB,GAAeA,EAAY56B,EAAMuZ,IACvEghB,EAAkB,GAClBE,EAAW,KACXD,EAAYjhB,GACHkhB,GAAYzX,IACrBtS,GAAQ+pB,IAIRtkD,EACEokD,GAAiBA,EAAgBjlD,KAAK4sC,OAD5C,CASA,GANW3vB,GACTmoC,EAAQrhD,QAAQ6oC,GAGlBuY,EAAWI,EAEPnqB,EAAOsS,EACTtH,EAAUnC,EAAMgB,eACX,GAAI7J,EA/CF,UAgDPgL,EAAUnC,EAAMmD,cACX,CACL,IAAIoe,EAAWvhB,EAAMsE,aAAanN,GAAM,GACpCqJ,GAAc4gB,EAAYrlD,KAAKikC,EAAOuhB,GAC1Cpf,EAAUof,EAASvgB,UAEnB,IAAK,IAAI31B,EAAI21C,EAAgB9oD,OAAS,EAAGmT,GAAK,EAAGA,IAAK,CACpD,IAAIrT,EAAIgpD,EAAgB31C,GACxBrT,EAAE63C,OAAS73C,EAAE63C,MAAQ1Y,IAAS,EAAIA,IAItCwR,EAAI0H,YAAYlO,GAEhB,IAAI8O,EAAQ9O,EAAQoJ,cAChBtyC,EAAO0vC,EAAI4C,cAEf,GAAI0F,EAAO,CACTqP,EAAkBrP,EAAOh4C,GAGzB,IAFA,IAAI+pB,EAAQiuB,EAELjuB,GACLs9B,EAAkBt9B,EAAMuoB,cAAe0F,GACvCjuB,EAAQA,EAAM+sB,WAGhB5N,EAAQoJ,cAAgBtyC,GAK5B,OADK8nD,GAAYR,EAAkBa,GAC5BD,GAAWlW,EAGpB,SAASuW,EAAWp1C,EAAOnD,EAAQowB,EAAKib,EAAQmN,GAC9C,IAkBIC,EACAC,EAnBAC,EAAa1kD,MAAMC,QAAQ8L,GAAUA,EAASA,EAAOowB,EAAM,MAAQ,OACnEwoB,EAAKxoB,EAAM,EAAI,EACf6M,EAAU,EAAL2b,EACLC,EAAK,CAAC11C,EAAMC,EAAGD,EAAME,GACrBy1C,EAAKD,EAAGD,GACRG,EAAKF,EAAG5b,GAER+b,EAAiB,KACjBC,EAAMH,EAFW,KAGjBI,EAAMJ,EAHW,KAIjBtO,EAAW,EACXC,EAAW,EACX0O,EAAe,EACfC,EAAe,EACf7O,GAAS,EACT8O,GAAY,EACZC,EAAU,EACVnzC,EAAQ,GAIZ,SAASozC,EAAW38C,GAClB,IAAIsgC,EAAKtgC,EAAEqgC,EAAK,GACZI,EAAKzgC,EAAEqgC,EAAK,GAEhB,KAAI8b,EAAK94C,EAAIi9B,EAAIG,IAAO0b,EAAK54C,EAAI+8B,EAAIG,IAArC,CAIA,IAAImc,EAAK58C,EAAEg8C,EAAK,GACZ/mC,EAAKjV,EAAEg8C,EAAK,GACZ5mC,EAAKpV,EAAEg8C,EAAK,GACZjQ,EAAK/rC,EAAEg8C,EAAK,GAEhB,GAAI1b,IAAOG,EAAX,CAQA,IAAI/1B,EAAIyxC,IAAO7b,EAAK,EAAI6b,IAAO1b,GAAS4b,EAAM94C,EAAIq5C,EAAI3nC,EAAIG,EAAI22B,IAAOuQ,EAAMj5C,EAAIu5C,EAAI3nC,EAAIG,EAAI22B,GAAvD,EAAiElP,EAAM3yB,WAAWlK,EAAGqgC,EAAI8b,EAAI5yC,EAAO,EAAG,GAAK,EAAIA,EAAM,GAAK,EAC3JjU,EAAU,IAANoV,EAAUkyC,EAAW,IAANlyC,EAAUqhC,EAAKlP,EAAM5rB,SAASjR,EAAG0K,GAAG8oB,EAAM,IAAM,KACnEia,EAAUnN,EAAKG,EAAK,GAAK,EACzBoc,EAAchB,EAAMxb,GAAMwb,EAAMxb,EAAK,GAAK,GAAK,EAC/Cyc,EAASjB,EAAMG,EAAK,GAiCxB,OA/BIG,IAAO7b,GACLhrC,EAAI+mD,EACNE,GAAgB9O,EACPn4C,EAAIgnD,EACbE,GAAgB/O,EAEhBE,GAAS,EAGPr4C,EAAI4mD,EAAKE,GAAkB9mD,EAAI4mD,EAAKE,IAAgBM,GAAW,KAE/DjP,IAAYoP,EACVD,EAAKP,EACPE,GAAgB9O,EACPmP,EAAKN,IACdE,GAAgB/O,GAETmP,GAAME,IACXA,EAASR,GAAOhnD,EAAIgnD,GACtBE,GAAgB/O,EAChBE,GAAS,GACAmP,EAAST,GAAO/mD,EAAI+mD,IAC7BE,GAAgB9O,EAChBE,GAAS,IAIb+O,GAAW,GAGbb,EAAQ77C,GACA47C,GAAYtmD,EAAI+mD,GAAO/mD,EAAIgnD,GAAmD,IAA5Czf,EAAMgI,WAAW7kC,EAAG0K,GAAG8oB,EAAM,IAAM,MAAcmoB,EAAWp1C,EAAOnD,GAASowB,EAAKib,GAAQ,IA5C7HmO,EAAKN,GAAOvQ,EAAKsQ,GAAOtQ,EAAKuQ,GAAOM,EAAKP,KAC3C1O,GAAS,IA8Cf,SAASoP,EAAY/8C,GACnB,IAAIsgC,EAAKtgC,EAAEqgC,EAAK,GACZE,EAAKvgC,EAAEqgC,EAAK,GACZG,EAAKxgC,EAAEqgC,EAAK,GACZI,EAAKzgC,EAAEqgC,EAAK,GAEhB,GAAI8b,GAAM54C,EAAI+8B,EAAIC,EAAIC,EAAIC,IAAO0b,GAAM94C,EAAIi9B,EAAIC,EAAIC,EAAIC,GAQrD,IAPA,IAKIzsC,EALA4oD,EAAK58C,EAAEg8C,EAAK,GACZ/mC,EAAKjV,EAAEg8C,EAAK,GACZ5mC,EAAKpV,EAAEg8C,EAAK,GACZjQ,EAAK/rC,EAAEg8C,EAAK,GACZgB,EAAaX,EAAM94C,EAAIq5C,EAAI3nC,EAAIG,EAAI22B,IAAOuQ,EAAMj5C,EAAIu5C,EAAI3nC,EAAIG,EAAI22B,GAAM,CAAC/rC,GAAK68B,EAAMuD,cAAcpgC,EAAGwzB,GAG9FthC,EAAI,EAAGC,EAAI6qD,EAAW3qD,OAAQH,EAAIC,EAAGD,IAC5C,GAAI8B,EAAM2oD,EAAWK,EAAW9qD,IAAK,OAAO8B,EAKlD,IAAK,IAAI9B,EAAI,EAAGC,EAAI4pD,EAAW1pD,OAAQH,EAAIC,EAAGD,IAAK,CACjD,IAGI8B,EAHAmmC,EAAQ4hB,EAAW7pD,GACnBg3B,EAAOiR,EAAMD,MACbl6B,EAAIm6B,EAAM7lB,YAGd,KAAKpiB,GAAK6pD,EAAW7pD,EAAI,GAAGgoC,QAAUhR,IACpC2yB,EAAQ,KAEH3yB,EAAKmR,UACRyhB,EAASjf,EAAMvoB,UAAU4U,EAAKkmB,eAAelR,cAAe/D,EAAM8D,cAAe,MAAOwQ,IAE7EpO,KAAQyb,EAAOzb,EAAK,KAC7Bwb,EAAQC,GAIPD,IAAO,CACVA,EAAQ77C,EAGR,IAFA,IAAI/L,EAAOi1B,EAAKkmB,eAETn7C,GAAQA,IAASkmC,GAAO,CAC7B,IAAIt6B,EAAK5L,EAAKqgB,YAEd,GAAIzU,EAAGwgC,KAAQxgC,EAAGwgC,EAAK,GAAI,CACzBwb,EAAQh8C,EACR,MAGF5L,EAAOA,EAAKwnC,eAKlB,GAAIznC,EAAM+oD,EAAY/8C,GAAI,OAAOhM,EAEjC,GAAI9B,EAAI,IAAMC,GAAK4pD,EAAW7pD,EAAI,GAAGgoC,QAAUhR,EAAM,CACnD,GAAI4yB,IAAW9nD,EAAM+oD,EAAYjB,IAAU,OAAO9nD,GAE9C25C,GAAW4O,GAAiBC,IAC9BD,EAAeC,EAAetzB,EAAKyjB,YAAY8B,GAAUjb,EAAM,GAAK,GAGtEoa,GAAY2O,EACZ1O,GAAY2O,EACZD,EAAeC,EAAe,EAE1B7O,IACF8O,GAAY,EACZ9O,GAAS,GAGXmO,EAAS,MAMb,OAFAlO,EAAW7mC,EAAI6mC,GACfC,EAAW9mC,EAAI8mC,GACR,CACLJ,QAASlqC,EAAIqqC,EAAUC,GACvBD,SAAUA,EACVC,SAAUA,EACV6O,QAASA,EACT/O,OAAQ8O,GAIZ,SAAStC,EAAiB7d,EAAS+P,EAAOC,EAAO4N,EAAoBP,GACnE,IAAIxjC,EAAQ,GACR1e,EAAQ6kC,EACR2gB,EAAc,EAGlB,EAAG,CAGD,GAFI9iB,EAAQmC,EAAQxB,WAET,CACT,IAAIzoC,EAAS8nC,EAAMzuB,YACnByK,EAAMjgB,KAAK,CACTomC,QAASA,EACTnC,MAAOA,EACP9nC,OAAQA,IAEV4qD,GAAe5qD,EAGjBiqC,EAAUA,EAAQlB,gBACXkB,IAAYA,EAAQoJ,eAAiBpJ,IAAY7kC,GAU1D,IARA,IAAIi0C,EAAU,CAAC,GAAK,IAAM,KACtB+B,EAAU,CACZA,QAAS,EACTiP,SAAU,GAKHxqD,EAAI,EAAGA,EAAIw5C,EAAQr5C,QAAUo7C,EAAQiP,QAAU,GAAKxqD,IAC3D,CAAIG,EAAS4qD,EAAcvR,EAAQx5C,GAEnC,IAFA,IAESsT,EAAI,EAAGrT,EAAIgkB,EAAM9jB,OAAQmT,EAAIrT,EAAGqT,IAAK,CAC5C,IAAInN,EAAQ8d,EAAM3Q,GACd03C,EAAc7kD,EAAMhG,OAExB,GAAIA,GAAU6qD,EAAa,CACzB,IAAI/iB,EACAjR,GADAiR,EAAQ9hC,EAAM8hC,OACDD,MACbpa,EAASoJ,EAAKtJ,QACdu9B,EAAUr9B,aAAkBgQ,EAAehQ,EAASoJ,EACpDxe,EAAI9D,EAAUU,MAAM6yB,EAAMuE,UAAUrsC,GAfnC,KACA,MAeD81B,EAAKgS,EAAM8P,eAAev/B,GAC1B8oB,EAAMzsB,EAAIozB,EAAMiI,iBAAiB13B,GAAGjE,GAAKnD,KAAK85C,QAC9CC,EAAO,KAEX,GAAI1D,EAASvsC,UAAYk/B,EAAO,CAC9B,IACIgR,GADYH,IAAY9Q,EAAQC,EAAQD,GAChBqB,YAAYvlB,EAAIqL,GAAK,GAEjD,GAAI2pB,IAAY9Q,GAASiR,EAAY7P,SAAW0P,IAAY7Q,IAAUgR,EAAY7P,QAAS,CACzF,GAAI6P,EAAYZ,QAAU,EACxB,SAEAW,EAAO,CACL5P,QAAS,EACTiP,QAAS,KAMjBW,EAAOA,GAAQ1B,EAAWxzB,EAAI+xB,EAAmBhxB,EAAKpzB,KAAKqkC,EAAMpf,YAAayY,GAAK,IAC1EkpB,QAAUjP,EAAQiP,UAASjP,EAAU4P,GAC9C,MAGFhrD,GAAU6qD,GAId,IAAS13C,EAAI2Q,EAAM9jB,OAAS,EAAGmT,GAAK,EAAGA,IACrC2Q,EAAM3Q,GAAG82B,QAAQ8d,SAAW3M,EAIhC,SAAS4M,EAAW/gB,EAAUqgB,GAC5B,IACI4D,EADA9E,EAAQ,GAGZ,SAAS+E,EAAQxK,GACf,IAAIvF,EACJ,SAAUuF,GAAQA,EAAIyK,UAAc9D,KAAYA,GAAUlM,EAAUuF,EAAIoH,UAAY,IAAI3M,UAAckM,EAASzmC,OAA6B,IAApBu6B,EAAQA,SAAiBA,EAAQG,UAAYH,EAAQI,WAG/K,SAAS6P,EAAQ1K,GACf,GAAIA,EACF,IAAK,IAAI9gD,EAAI,EAAGC,EAAIorD,EAAOlrD,OAAQH,EAAIC,EAAGD,IACxC,GAAI8gD,IAAQuK,EAAOrrD,GAAI,OAAO,EAIlC,OAAO,EAGT,SAASyrD,EAAUz0B,GAGjB,IAFA,IAAIoQ,EAAWpQ,EAAK6R,UAEX7oC,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAC1ConC,EAASpnC,GAAGurD,UAAW,EAI3B,SAASG,EAAoBthB,EAASuhB,GACpC,IAAIzS,EAAQ9O,EAAQoJ,cAChBjuC,EAAQ2zC,EACRwO,EAAY,GAGhB,SAASkE,EAAQ1S,EAAO11C,GACtB,KAAO01C,GAASA,IAAU11C,GAAK,CAC7B,IAAIynB,EAAQiuB,EAAMb,SACdrhB,EAAO/L,GAASA,EAAM+c,MAE1B,GAAIhR,EAAM,CACR,IAAInY,EAAOoM,EAAMie,WAAalS,EAAK+lB,kBAC/B8O,EAAYhtC,EAAK20B,cAEjBvoB,IAAUmf,IAAYohB,EAAQvgC,IAAUugC,EAAQ3sC,IAASA,GAAQysC,EAAQrgC,KAAWqgC,EAAQzsC,IAASgtC,GAAaP,EAAQO,EAAUxT,aACtIqP,EAAU1jD,KAAKinB,GAGb0gC,GAAeN,EAAOrnD,KAAKinB,GAGjCiuB,EAAQA,EAAMlB,OAIlB,GAtBI2T,IAAeN,EAAS,CAACjhB,IAsBzB8O,EAAO,CAGT,IAFA0S,EAAQ1S,GAEDA,GAASA,EAAMjB,WACpBiB,EAAQA,EAAMjB,UAGhB2T,EAAQ1S,EAAO3zC,GAGjB,OAAOmiD,EAGTtgB,EAAS10B,MAAK,SAAUo4B,EAAMC,GAC5B,IAAI+gB,EAAShhB,EAAK0I,cACduY,EAAShhB,EAAKyI,cACdwY,KAAWF,IAAUA,EAAOnU,UAC5BsU,KAAWF,IAAUA,EAAOpU,UAC5BwC,EAAQrP,EAAK9C,MACboS,EAAQrP,EAAK/C,MACjB,OAAOgkB,EAAQC,EAAQD,EAAQ,GAAK,GAAKF,GAAUC,EAASD,EAAS,GAAK,EAAI3R,IAAUC,EAAQD,EAAMv2C,IAAMw2C,EAAMx2C,IAAMknC,EAAKphC,OAASqhC,EAAKrhC,UAG7I,IAAK,IAAI1J,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAMIksD,EACAC,EACA1kB,EARAqZ,EAAM1Z,EAASpnC,GACfosD,EAAQd,EAAQxK,GAChB9pB,EAAO,KACPq1B,GAAW,EACX9P,GAAS,EACT+P,EAAW,GAKf,GAAIF,GAAStL,EAAI9Y,MAAM6f,cAAe,CACpC,IAAI1N,EAAQ2G,EAAI9Y,MACZoS,EAAQ0G,EAAItN,cAAc6E,SAASrQ,MAEnCmS,EAAMzjB,QAAQ0jB,KACZD,EAAM15B,WAAW8lC,EAAMviD,KAAKm2C,EAAMl3C,OAAM,IAC5CwoD,EAAUtR,GACVsR,EAAUrR,GACVgS,GAAQ,GAIZ,KAAOA,GAAO,CACZ,IAAI5R,GAASxjB,EACT0wB,EAAYgE,EAAoB5K,EAAKtG,GACrCvvB,EAAQy8B,EAAU6E,QAElB5xC,IADA0xC,GAAY7R,IAAUgR,EAAQ1K,IAAQ0K,EAAQvgC,MACzBA,EAOzB,GALIuvB,IACFxjB,EAAO,IAAInC,EAAK9rB,EAAK0hB,WACrByhC,EAAS,MAGPG,EAAU,EACRvL,EAAIx4C,WAAaw4C,EAAI7W,YAAUsS,EAASuE,EAAI9Y,MAAMG,SACtD2Y,EAAIyK,UAAW,EACf,MAoBF,GAjBI5wC,GAASuxC,IACXI,EAAStoD,KAAKkoD,GACdA,EAAS,MAGNA,IACCvxC,GAAO+sC,EAAU1jD,KAAK88C,GAC1BoL,EAAS,CACP3mD,MAAOyxB,EAAK6R,UAAU1oC,OACtBunD,UAAWA,EACXyE,QAASA,EAAU,GACnB1kB,SAAUA,IAIV9sB,IAAOmmC,EAAM71B,IAEZqgC,EAAQxK,GAAM,CACjB9pB,EAAKqnB,eAAe6N,EAAO3mD,OAE3B,IAAK,IAAI+N,EAAI,EAAGq2B,EAAIwiB,EAAQhsD,OAAQmT,EAAIq2B,EAAGr2B,IACzC64C,EAAQ74C,GAAGi4C,UAAW,EAGxBY,EAAQhsD,OAAS,EAEjB,IACE2gD,EAAMoL,GAAUA,EAAOxE,UAAU6E,UAEpBzL,EAAI9Y,QACf8Y,EAAM,MACNoL,EAASI,EAAStvB,SAGhBmvB,EAAUD,EAAOC,QACjB1kB,EAAWykB,EAAOzkB,iBAGfykB,IAAWZ,EAAQxK,IAE5B,IAAKA,EAAK,MAGZ,IAAIjiC,EAAOiiC,EAAI5X,UACflS,EAAKrvB,IAAI,IAAI4/B,EAAQuZ,EAAIlZ,OAAQH,EAAU5oB,GAAQiiC,EAAI/Y,aACvD+Y,EAAIyK,UAAW,EACfY,EAAQnoD,KAAK88C,GACbA,EAAMjiC,GAAQiiC,EAAI9Y,MAAM+U,kBACxBtV,EAAW5oB,GAAQA,EAAKipB,UAGtBukB,IACE9P,IACFvlB,EAAK+lB,kBAAkB1U,YAAYZ,GACnCzQ,EAAKilB,UAAUM,IAGM,IAAnBvlB,EAAKvW,WACP8lC,EAAMviD,KAAKgzB,IAKjB,OAAOuvB,EAGT,MAAO,CACL/K,YAAa,SAAqBnnC,EAAOitB,EAAKib,GAC5C,OAAOkN,EAAWp1C,EAAOnU,KAAK4oC,YAAaxH,EAAKib,IAElDv7B,MAAO,SAAegW,EAAMvyB,GAC1B,OAAO0iD,EAAajnD,KAAM82B,EAAM,QAASvyB,IAE3Csc,UAAW,SAAmBiW,EAAMvyB,GAClC,OAAO0iD,EAAajnD,KAAM82B,EAAM,YAAavyB,IAE/CyW,SAAU,SAAkB8b,EAAMvyB,GAChC,OAAO0iD,EAAajnD,KAAM82B,EAAM,WAAYvyB,IAE9CI,QAAS,SAAiBmyB,EAAMvyB,GAC9B,OAAO0iD,EAAajnD,KAAM82B,EAAM,UAAWvyB,IAE7C8W,OAAQ,SAAgByb,EAAMvyB,GAC5B,OAAOA,IAA6B,GAAjBA,EAAQ4iD,OAAkB5iD,EAAQyrB,QAAUo3B,EAAapnD,KAAM82B,EAAM,UAAYgwB,EAAa,CAAC9mD,KAAKgb,SAAS8b,EAAMvyB,GAAUvE,KAAK6gB,UAAUiW,EAAMvyB,KAAW,EAAMvE,KAAM82B,EAAMvyB,IAEpMqiD,iBAAkB,WAChB,IAAIr+B,EAAWvoB,KAAKonB,UAChBi/B,EAAQ99B,GAAY,CAACvoB,MAEzB,SAAS65C,EAAW+G,EAAK9pB,GACvB,IAAIkiB,EAAQ4H,GAAOA,EAAItN,cACvB,OAAO0F,GAASA,EAAMvB,UAAYuB,EAAMlR,QAAUhR,EAGpD,IAAIw1B,GAAc,EACdC,GAAe,EACfC,EAAgBxsD,KAAK60B,iBAAiB,MAAM,SAAUmkB,GACxD,OAAOA,EAAMa,eAAiByS,GAAc,IAAStT,EAAMC,eAAiBsT,GAAe,MAEzFpD,EAAcmD,GAAeC,GAAgB,GAGjD,GAFAC,EAAgB1jB,EAAc9nB,OAAOwrC,GAEjCF,EAKF,IAJA,IAAIzW,EAAW4R,EAAgB+E,GAAe,SAAUxT,GACtD,OAAOA,EAAMa,eACZsP,GAEMrpD,EAAI+1C,EAAS51C,OAAS,EAAGH,GAAK,EAAGA,IAAK,CAC7C,IAAImzC,EAAU4C,EAAS/1C,GACnBg3B,EAAOmc,EAAQnL,MACf8Y,EAAM3N,EAAQkF,SACdt2C,EAAO++C,EAAIvX,cACX1qB,EAAOiiC,EAAI5X,UAEX6Q,EAAWh4C,EAAMi1B,IAAS+iB,EAAWl7B,EAAMmY,KAC7C8pB,EAAIt3C,SAEJzH,EAAKgmC,WAAW1uB,KAAK,EAAG,GAExBwF,EAAKipB,UAAUzuB,KAAK,EAAG,GAEnBtX,IAAS++C,GAAQ/+C,EAAK6mC,WAAWoH,cACnCnxB,EAAKipB,UAAUvnC,IAAIwB,EAAK+lC,WAExB/lC,EAAKyH,WAMTijD,IACF9E,EAAgB+E,EAAeF,GAAe,SAAUtT,GACtD,IAAI9B,EAAS8B,EAAMtQ,WACfkC,EAAOoO,EAAMX,aACbttB,EAAQiuB,EAAM1F,cACd+D,EAAStsB,EAAMmtB,OACfrN,EAAO9f,EAAMotB,SACjB,GAAIjB,GAAUG,GAAUH,EAAOpP,OAASuP,EAAOvP,MAAO,OAAO,EACzD8C,IAAMA,EAAK0I,cAAgB,MAC3BzI,IAAMA,EAAKyI,cAAgB,OAC9B6V,GACCA,GAAab,EAAkBa,GACnC9C,EAAQ4B,EAAWjpD,EAAK8D,KAAKujD,GAAO,SAAUvvB,GAC5C93B,EAAK8E,KAAK9D,KAAM82B,EAAK6R,aACpB,MAGL,IACIjhC,EADAzH,EAASomD,EAAMpmD,OAmBnB,OAhBIA,EAAS,GAAKsoB,GACZ89B,IAAU99B,GAAUvoB,KAAK6yB,YAAYwzB,GACzC3+C,EAAO1H,MACa,IAAXC,GAAiBsoB,IACtB89B,EAAM,KAAOrmD,MAAMA,KAAKs8C,YAAY+J,EAAM,GAAGlI,kBACjDz2C,EAAO1H,MAGJ0H,KACHA,EAAO,IAAIg2B,EAAa70B,EAAK0hB,YACxBwI,YAAYszB,IACjB3+C,EAAOA,EAAKmwB,UACPtE,eAAevzB,MACpBA,KAAKi4B,YAAYvwB,IAGZA,GAETm/C,SAAU,SAAkB4F,EAAShS,GACnC,IAAIlyB,EAAWvoB,KAAKonB,UAUpB,OARImB,GAAYA,EAAStoB,OACvBD,KAAK6yB,YAAYq1B,EAAcloD,KAAK8yB,kBAAkB,SAAUvc,GAC9D,SAAUk2C,EAAUl2C,EAAQ,EAAJA,KACvBkkC,IACMA,IAAc57C,GACvBmB,KAAKw6C,aAAaC,GAGbz6C,MAET4oD,iBAAkB,WAChB,IACIz0C,EADSnU,KAAKkQ,YACCmQ,WAAU,GAE7B,IAAKrgB,KAAK0b,SAASvH,GAAQ,CAMzB,IALA,IAAInD,EAAShR,KAAK4oC,YACdv0B,EAAIF,EAAME,EACVq4C,EAAa,GACbv1C,EAAQ,GAEHrX,EAAI,EAAGC,EAAIiR,EAAO/Q,OAAQH,EAAIC,EAAGD,IAAK,CAC7C,IAAI8N,EAAIoD,EAAOlR,GAAGoiB,YACdgsB,EAAKtgC,EAAE,GACPugC,EAAKvgC,EAAE,GACPwgC,EAAKxgC,EAAE,GACPygC,EAAKzgC,EAAE,GAEX,GAAIyG,GAAKpD,EAAIi9B,EAAIC,EAAIC,EAAIC,IAAOh6B,GAAKlD,EAAI+8B,EAAIC,EAAIC,EAAIC,GAGnD,IAFA,IAAIuc,EAAangB,EAAMuD,cAAcpgC,GAE5BwF,EAAI,EAAGsD,EAAIk0C,EAAW3qD,OAAQmT,EAAIsD,EAAGtD,IAAK,CACjD,IAAIu5C,EAAK/B,EAAWx3C,GAChBw5C,EAAMD,EAAG,GACTE,EAAMF,EAAG,GAEb,GAAIC,IAAQC,IAAQx4C,GAAKu4C,GAAOv4C,GAAKw4C,GAAOx4C,GAAKw4C,GAAOx4C,GAAKu4C,GAAM,CACjE,IAAIx4C,EAAIC,IAAMu4C,EAAMD,EAAG,GAAKt4C,IAAMw4C,EAAMF,EAAG,GAAiD,IAA5CliB,EAAM3yB,WAAW60C,EAAI,EAAGt4C,EAAG8C,EAAO,EAAG,GAAWszB,EAAM5rB,SAAS8tC,EAAIx1C,EAAM,IAAI/C,GAAKu4C,EAAG,GAAKA,EAAG,IAAM,EACnJD,EAAW5oD,KAAKsQ,KAMpBs4C,EAAWzsD,OAAS,IACtBysD,EAAWl6C,MAAK,SAAUtP,EAAGC,GAC3B,OAAOD,EAAIC,KAEbgR,EAAMC,GAAKs4C,EAAW,GAAKA,EAAW,IAAM,GAIhD,OAAOv4C,MAIb,IAAI2qC,EAAgB9/C,EAAKyD,OAAO,CAC9BkB,OAAQ,gBACRf,WAAY,SAAoBk0B,EAAMsY,EAAU0d,EAAcC,EAAgB7xC,GAC5E,IAMI+vB,EANAj6B,EAAS,GACTiQ,EAAQ,GACRhhB,EAAS,EACT+sD,EAAU,GAAKF,GAAgB,IAC/B5lB,EAAWpQ,EAAK6R,UAChBqC,EAAW9D,EAAS,GAGxB,SAAS+lB,EAASjiB,EAAUC,GAC1B,IAAIlD,EAAQ0C,EAAMvoB,UAAU8oB,EAAUC,EAAU/vB,GAChDlK,EAAOlN,KAAKikC,GACZmlB,EAAanlB,EAAOiD,EAASxhC,OAAQ,EAAG,GAG1C,SAAS0jD,EAAanlB,EAAO1+B,EAAOwoC,EAAIC,GACtC,KAAIA,EAAKD,EAAKmb,IAAaD,GAAkBtiB,EAAM6D,WAAWvG,IAAY0C,EAAM0E,aAAapH,EAAOqH,GAAY,KAKzG,CACL,IAAIp4B,EAAK+wB,EAAM,GAAKA,EAAM,GACtBrhB,EAAKqhB,EAAM,GAAKA,EAAM,GACtBiH,EAAO99B,KAAK0D,KAAKoC,EAAKA,EAAK0P,EAAKA,GAEhCsoB,EAAO,IACT/uC,GAAU+uC,EACV/tB,EAAMnd,KAAK,CACTsnB,OAAQnrB,EACR8nC,MAAOA,EACP1+B,MAAOA,EACP61B,KAAM4S,SAhB2G,CACrH,IAAIqb,EAAS1iB,EAAM+B,UAAUzE,EAAO,IAChCqlB,GAAQvb,EAAKC,GAAM,EACvBob,EAAaC,EAAO,GAAI9jD,EAAOwoC,EAAIub,GACnCF,EAAaC,EAAO,GAAI9jD,EAAO+jD,EAAMtb,IAkBzC,IAAK,IAAIhyC,EAAI,EAAGC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAE1CmtD,EAASjiB,EADTC,EAAW/D,EAASpnC,IAEpBkrC,EAAWC,EAGTnU,EAAKmR,SAASglB,EAAShiB,GAAYD,EAAU9D,EAAS,IAC1DlnC,KAAKgR,OAASA,EACdhR,KAAKihB,MAAQA,EACbjhB,KAAKC,OAASA,EACdD,KAAKqJ,MAAQ,GAEfgkD,KAAM,SAAcjiC,GAOlB,IANA,IAGItrB,EAHAmhB,EAAQjhB,KAAKihB,MACbhhB,EAASghB,EAAMhhB,OAGfmT,EAAIpT,KAAKqJ,MAGXvJ,EAAIsT,EACCA,KAAK6N,IAAQ7N,GAAGgY,OAASA,KAGhC,KAAOtrB,EAAIG,EAAQH,IAAK,CACtB,IAAIuC,EAAO4e,EAAMnhB,GAEjB,GAAIuC,EAAK+oB,QAAUA,EAAQ,CACzBprB,KAAKqJ,MAAQvJ,EACb,IAAI+B,EAAOof,EAAMnhB,EAAI,GACjBmpD,EAAWpnD,GAAQA,EAAKwH,QAAUhH,EAAKgH,MAAQxH,EAAKq9B,KAAO,EAC3D3C,EAAa16B,EAAOA,EAAKupB,OAAS,EACtC,MAAO,CACL/hB,MAAOhH,EAAKgH,MACZ61B,KAAM+pB,GAAY5mD,EAAK68B,KAAO+pB,IAAa79B,EAASmR,IAAel6B,EAAK+oB,OAASmR,KAKvF,MAAO,CACLlzB,MAAO4X,EAAMhhB,EAAS,GAAGoJ,MACzB61B,KAAM,IAGVyiB,SAAU,SAAkBp1C,EAAKiS,EAAMC,GAIrC,IAHA,IAAIpZ,EAAQrF,KAAKqtD,KAAK7uC,GAClBlb,EAAMtD,KAAKqtD,KAAK5uC,GAEX3e,EAAIuF,EAAMgE,MAAOtJ,EAAIuD,EAAI+F,MAAOvJ,GAAKC,EAAGD,IAAK,CACpD,IAAIioC,EAAQ0C,EAAMwB,QAAQjsC,KAAKgR,OAAOlR,GAAIA,IAAMuF,EAAMgE,MAAQhE,EAAM65B,KAAO,EAAGp/B,IAAMwD,EAAI+F,MAAQ/F,EAAI47B,KAAO,GACvGp/B,IAAMuF,EAAMgE,OAAOkD,EAAIiyB,OAAOuJ,EAAM,GAAIA,EAAM,IAClDx7B,EAAI00B,cAAcp+B,MAAM0J,EAAKw7B,EAAM3oC,MAAM,OAG5CJ,EAAK8D,KAAK2nC,EAAMuG,kBAAkB,SAAU1vC,GAC7CtB,KAAKsB,EAAO,MAAQ,SAAU8pB,GAC5B,IAAID,EAAQnrB,KAAKqtD,KAAKjiC,GAEtB,OAAOqf,EAAMnpC,GAAMtB,KAAKgR,OAAOma,EAAM9hB,OAAQ8hB,EAAM+T,SAEpD,KACC6f,EAAa//C,EAAKyD,OAAO,CAC3BG,WAAY,SAAoBk0B,GAK9B,IAJA,IAIgBj1B,EAJZs0B,EAASn2B,KAAKm2B,OAAS,GACvB+Q,EAAWpQ,EAAK6R,UAChB0T,EAASvlB,EAAKmR,QAETnoC,EAAI,EAASC,EAAImnC,EAASjnC,OAAQH,EAAIC,EAAGD,IAAK,CACrD,IAAIqU,EAAQ+yB,EAASpnC,GAAGqU,MAEnBtS,GAASA,EAAKiD,OAAOqP,IACxBgiB,EAAOryB,KAAKjC,EAAOsS,EAAMpR,SAIzBs5C,IACFlmB,EAAOtuB,QAAQsuB,EAAOA,EAAOl2B,OAAS,IACtCk2B,EAAOryB,KAAKqyB,EAAO,KAGrBn2B,KAAKq8C,OAASA,GAEhB2C,IAAK,SAAajb,GAChB,IAAI5N,EAASn2B,KAAKm2B,OACdl2B,EAASk2B,EAAOl2B,OAChBinC,EAAW,KAef,OAbIjnC,EAAS,IACXinC,EAAW,CAAC,IAAIG,EAAQlR,EAAO,KAE3Bl2B,EAAS,IACXD,KAAKstD,SAASpmB,EAAUnD,EAAO,EAAG9jC,EAAS,EAAGk2B,EAAO,GAAGnb,SAASmb,EAAO,IAAKA,EAAOl2B,EAAS,GAAG+a,SAASmb,EAAOl2B,EAAS,KAErHD,KAAKq8C,SACPnV,EAASmlB,QACTnlB,EAASpK,SAKRoK,GAETomB,SAAU,SAAkBpmB,EAAUnD,EAAOuW,EAAOqC,EAAM4Q,EAAMC,GAC9D,IAAIr3B,EAASn2B,KAAKm2B,OAElB,GAAIwmB,EAAOrC,GAAU,EAArB,CAaA,IALA,IAEIjlC,EAFAo4C,EAASztD,KAAK0tD,wBAAwBpT,EAAOqC,GAC7CgR,EAAWz8C,KAAKC,IAAI4yB,EAAOA,EAAQA,GAEnC6pB,GAAoB,EAEf9tD,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,IAAIioC,EAAQ/nC,KAAK6tD,eAAevT,EAAOqC,EAAM8Q,EAAQF,EAAMC,GACvDr8C,EAAMnR,KAAK8tD,aAAaxT,EAAOqC,EAAM5U,EAAO0lB,GAEhD,GAAIt8C,EAAI4yB,MAAQA,GAAS6pB,EAEvB,YADA5tD,KAAKitD,SAAS/lB,EAAUa,GAK1B,GADA1yB,EAAQlE,EAAI9H,MACR8H,EAAI4yB,OAAS4pB,EAAU,MAC3BC,EAAoB5tD,KAAK+tD,eAAezT,EAAOqC,EAAM8Q,EAAQ1lB,GAC7D4lB,EAAWx8C,EAAI4yB,MAGjB,IAAIiqB,EAAY73B,EAAO9gB,EAAQ,GAAG2F,SAASmb,EAAO9gB,EAAQ,IAC1DrV,KAAKstD,SAASpmB,EAAUnD,EAAOuW,EAAOjlC,EAAOk4C,EAAMS,GACnDhuD,KAAKstD,SAASpmB,EAAUnD,EAAO1uB,EAAOsnC,EAAMqR,EAAUzyC,SAAUiyC,OA9BhE,CACE,IAAIzN,EAAM5pB,EAAOmkB,GACb0F,EAAM7pB,EAAOwmB,GACb3N,EAAO+Q,EAAIrlC,YAAYslC,GAAO,EAClChgD,KAAKitD,SAAS/lB,EAAU,CAAC6Y,EAAKA,EAAIt4C,IAAI8lD,EAAK3yC,UAAUo0B,IAAQgR,EAAIv4C,IAAI+lD,EAAK5yC,UAAUo0B,IAAQgR,MA4BhGiN,SAAU,SAAkB/lB,EAAUa,GACzBb,EAASA,EAASjnC,OAAS,GACjCooC,aAAaN,EAAM,GAAG/sB,SAAS+sB,EAAM,KAC1Cb,EAASpjC,KAAK,IAAIujC,EAAQU,EAAM,GAAIA,EAAM,GAAG/sB,SAAS+sB,EAAM,OAE9D8lB,eAAgB,SAAwBvT,EAAOqC,EAAM8Q,EAAQF,EAAMC,GASjE,IARA,IAAI5sC,EAAU,MACVjM,EAAMzD,KAAKyD,IACXwhB,EAASn2B,KAAKm2B,OACd4pB,EAAM5pB,EAAOmkB,GACb0F,EAAM7pB,EAAOwmB,GACbsR,EAAI,CAAC,CAAC,EAAG,GAAI,CAAC,EAAG,IACjBC,EAAI,CAAC,EAAG,GAEHpuD,EAAI,EAAGC,EAAI48C,EAAOrC,EAAQ,EAAGx6C,EAAIC,EAAGD,IAAK,CAChD,IAAI0jC,EAAIiqB,EAAO3tD,GACXwY,EAAI,EAAIkrB,EACRrgC,EAAI,EAAIqgC,EAAIlrB,EACZ61C,EAAK71C,EAAIA,EAAIA,EACbN,EAAK7U,EAAImV,EACT2K,EAAK9f,EAAIqgC,EACT4qB,EAAK5qB,EAAIA,EAAIA,EACb3gB,EAAK0qC,EAAK3yC,UAAU5C,GACpBgL,EAAKwqC,EAAK5yC,UAAUqI,GACpB5K,EAAM8d,EAAOmkB,EAAQx6C,GAAGkb,SAAS+kC,EAAI3kC,SAAS+yC,EAAKn2C,IAAKgD,SAASglC,EAAI5kC,SAAS6H,EAAKmrC,IACvFH,EAAE,GAAG,IAAMprC,EAAGzI,IAAIyI,GAClBorC,EAAE,GAAG,IAAMprC,EAAGzI,IAAI4I,GAClBirC,EAAE,GAAG,GAAKA,EAAE,GAAG,GACfA,EAAE,GAAG,IAAMjrC,EAAG5I,IAAI4I,GAClBkrC,EAAE,IAAMrrC,EAAGzI,IAAI/B,GACf61C,EAAE,IAAMlrC,EAAG5I,IAAI/B,GAGjB,IACIg2C,EACAC,EAFAC,EAAUN,EAAE,GAAG,GAAKA,EAAE,GAAG,GAAKA,EAAE,GAAG,GAAKA,EAAE,GAAG,GAIjD,GAAIt5C,EAAI45C,GAAW3tC,EAAS,CAC1B,IAAI4tC,EAASP,EAAE,GAAG,GAAKC,EAAE,GAAKD,EAAE,GAAG,GAAKC,EAAE,GAE1CG,GADaH,EAAE,GAAKD,EAAE,GAAG,GAAKC,EAAE,GAAKD,EAAE,GAAG,IACxBM,EAClBD,EAASE,EAASD,MACb,CACL,IAAIE,EAAKR,EAAE,GAAG,GAAKA,EAAE,GAAG,GACpBnrC,EAAKmrC,EAAE,GAAG,GAAKA,EAAE,GAAG,GACxBI,EAASC,EAAS35C,EAAI85C,GAAM7tC,EAAUstC,EAAE,GAAKO,EAAK95C,EAAImO,GAAMlC,EAAUstC,EAAE,GAAKprC,EAAK,EAGpF,IAEIgoB,EACAC,EAHA2jB,EAAY1O,EAAItlC,YAAYqlC,GAC5B4O,EAAM/tC,EAAU8tC,EAIpB,GAAIL,EAASM,GAAOL,EAASK,EAC3BN,EAASC,EAASI,EAAY,MACzB,CACL,IAAI5oC,EAAOk6B,EAAIhlC,SAAS+kC,GACxBjV,EAAUyiB,EAAK3yC,UAAUyzC,GACzBtjB,EAAUyiB,EAAK5yC,UAAU0zC,GAErBxjB,EAAQ1wB,IAAI0L,GAAQilB,EAAQ3wB,IAAI0L,GAAQ4oC,EAAYA,IACtDL,EAASC,EAASI,EAAY,EAC9B5jB,EAAUC,EAAU,MAIxB,MAAO,CAACgV,EAAKA,EAAIt4C,IAAIqjC,GAAWyiB,EAAK3yC,UAAUyzC,IAAUrO,EAAIv4C,IAAIsjC,GAAWyiB,EAAK5yC,UAAU0zC,IAAUtO,IAEvG+N,eAAgB,SAAwBzT,EAAOqC,EAAMnZ,EAAGuE,GACtD,IAAK,IAAIjoC,EAAIw6C,EAAOx6C,GAAK68C,EAAM78C,IAC7B0jC,EAAE1jC,EAAIw6C,GAASt6C,KAAK6W,SAASkxB,EAAO/nC,KAAKm2B,OAAOr2B,GAAI0jC,EAAE1jC,EAAIw6C,IAGnDx6C,EAAI,EAAb,IAAK,IAAWC,EAAIyjC,EAAEvjC,OAAQH,EAAIC,EAAGD,IACnC,GAAI0jC,EAAE1jC,IAAM0jC,EAAE1jC,EAAI,GAAI,OAAO,EAG/B,OAAO,GAET+W,SAAU,SAAkBkxB,EAAO5zB,EAAOqvB,GAIxC,IAHA,IAAI0T,EAAS,GACTG,EAAS,GAEJv3C,EAAI,EAAGA,GAAK,EAAGA,IACtBo3C,EAAOp3C,GAAKioC,EAAMjoC,EAAI,GAAGkb,SAAS+sB,EAAMjoC,IAAIsb,SAAS,GAGvD,IAAStb,EAAI,EAAGA,GAAK,EAAGA,IACtBu3C,EAAOv3C,GAAKo3C,EAAOp3C,EAAI,GAAGkb,SAASk8B,EAAOp3C,IAAIsb,SAAS,GAGzD,IAAI2a,EAAK/1B,KAAKmY,SAAS,EAAG4vB,EAAOvE,GAC7Buc,EAAM//C,KAAKmY,SAAS,EAAG++B,EAAQ1T,GAC/Bwc,EAAMhgD,KAAKmY,SAAS,EAAGk/B,EAAQ7T,GAC/B+O,EAAOxc,EAAG/a,SAAS7G,GACnB2C,EAAKipC,EAAI3lC,IAAI2lC,GAAOxN,EAAKn4B,IAAI4lC,GACjC,OAAOxrC,EAAU4B,cAAcU,GAAM0sB,EAAIA,EAAI+O,EAAKn4B,IAAI2lC,GAAOjpC,GAE/DqB,SAAU,SAAkBy2C,EAAQ7mB,EAAOzvB,GAGzC,IAFA,IAAID,EAAM0vB,EAAM3oC,QAEPU,EAAI,EAAGA,GAAK8uD,EAAQ9uD,IAC3B,IAAK,IAAIsT,EAAI,EAAGA,GAAKw7C,EAAS9uD,EAAGsT,IAC/BiF,EAAIjF,GAAKiF,EAAIjF,GAAGgI,SAAS,EAAI9C,GAAG7Q,IAAI4Q,EAAIjF,EAAI,GAAGgI,SAAS9C,IAI5D,OAAOD,EAAI,IAEbq1C,wBAAyB,SAAiCpT,EAAOqC,GAG/D,IAFA,IAAInZ,EAAI,CAAC,GAEA1jC,EAAIw6C,EAAQ,EAAGx6C,GAAK68C,EAAM78C,IACjC0jC,EAAE1jC,EAAIw6C,GAAS9W,EAAE1jC,EAAIw6C,EAAQ,GAAKt6C,KAAKm2B,OAAOr2B,GAAG4a,YAAY1a,KAAKm2B,OAAOr2B,EAAI,IAGtEA,EAAI,EAAb,IAAK,IAAW4W,EAAIimC,EAAOrC,EAAOx6C,GAAK4W,EAAG5W,IACxC0jC,EAAE1jC,IAAM0jC,EAAE9sB,GAGZ,OAAO8sB,GAETsqB,aAAc,SAAsBxT,EAAOqC,EAAM5U,EAAOvE,GAItD,IAHA,IAAIn6B,EAAQ6H,KAAKijB,OAAOwoB,EAAOrC,EAAQ,GAAK,GACxCuU,EAAU,EAEL/uD,EAAIw6C,EAAQ,EAAGx6C,EAAI68C,EAAM78C,IAAK,CACrC,IACI8N,EADI5N,KAAKmY,SAAS,EAAG4vB,EAAOvE,EAAE1jC,EAAIw6C,IAC5Bt/B,SAAShb,KAAKm2B,OAAOr2B,IAC3BkvC,EAAOphC,EAAEwG,EAAIxG,EAAEwG,EAAIxG,EAAEyG,EAAIzG,EAAEyG,EAE3B26B,GAAQ6f,IACVA,EAAU7f,EACV3lC,EAAQvJ,GAIZ,MAAO,CACLikC,MAAO8qB,EACPxlD,MAAOA,MAITylD,EAAWjmD,EAAKpG,OAAO,CACzBkB,OAAQ,WACRwe,cAAc,EACdyJ,iBAAiB,EACjBD,iBAAkB,CAChBojC,QAAS,MAEXz+B,eAAgB,CACdN,QAAQ,EACRE,QAAQ,GAEVttB,WAAY,SAAkB+D,GAC5B3G,KAAKgvD,SAAW,GAChBhvD,KAAKivD,OAAS,GACd,IAAI3hC,EAAW3mB,GAAO3H,EAAKiD,cAAc0E,IAAQA,EAAIyN,IAAMvV,GAAa8H,EAAI0N,IAAMxV,EAElFmB,KAAKqtB,YAAYC,GAAY3mB,GAAM2mB,GAAYxU,EAAM1T,KAAK5E,aAE5D4yB,QAAS,SAAiB1rB,GACxB,OAAO1H,KAAKgvD,WAAatnD,EAAKsnD,UAEhCx7B,YAAa,SAAqBntB,GAChCrG,KAAKkvD,WAAW7oD,EAAO2oD,WAEzBG,WAAY,WACV,OAAOnvD,KAAKgvD,UAEdE,WAAY,SAAoBH,GAC9B/uD,KAAKgvD,SAAW,GAAKD,EACrB/uD,KAAKivD,OAASjvD,KAAKgvD,SAAS35C,MAAM,gBAElCrV,KAAKiiB,SAAS,MAEhBzB,QAAS,WACP,OAAQxgB,KAAKgvD,UAEfI,kBAAmB,YACnBC,kBAAmB,YACnBC,kBAAmB,YACnBC,kBAAmB,cAEjBC,EAAYV,EAASrsD,OAAO,CAC9BkB,OAAQ,YACRf,WAAY,WACVksD,EAASjsD,MAAM7C,KAAMQ,YAEvBqe,SAAU,WACR,IAAI1K,EAAQnU,KAAKutB,QAAQzI,iBAEzB,OAAO,IAAItI,EAAYrI,EAAMC,EAAGD,EAAME,EAAGrU,KAAM,aAEjD+e,SAAU,WACR,IAAI5K,EAAQ2E,EAAM1T,KAAK5E,WACvBR,KAAKwiB,UAAUrO,EAAM6G,SAAShb,KAAKutB,QAAQzI,oBAE7CsY,MAAO,SAAe7wB,EAAK4e,EAAOE,GAChC,GAAKrrB,KAAKgvD,SAAV,CAEAhvD,KAAKq6B,WAAW9tB,EAAK4e,EAAOE,GAE5B,IAAIokC,EAAQzvD,KAAKivD,OACbvmC,EAAQ1oB,KAAKytB,OACb6I,EAAU5N,EAAM4N,UAChBnF,EAAYzI,EAAMyI,YAClBu+B,EAAUhnC,EAAMinC,aAChB7zB,EAAcvvB,EAAIuvB,YACtBvvB,EAAIqjD,KAAOlnC,EAAMmnC,eACjBtjD,EAAIujD,UAAYpnC,EAAMqnC,mBAEtB,IAAK,IAAIjwD,EAAI,EAAGC,EAAI0vD,EAAMxvD,OAAQH,EAAIC,EAAGD,IAAK,CAC5CyM,EAAIuvB,YAAcA,EAClB,IAAIhW,EAAO2pC,EAAM3vD,GAEbw2B,IACF/pB,EAAIyjD,SAASlqC,EAAM,EAAG,GACtBvZ,EAAIuvB,YAAc,iBAGhB3K,GAAW5kB,EAAI0jD,WAAWnqC,EAAM,EAAG,GACvCvZ,EAAIiW,UAAU,EAAGktC,MAGrB9+B,WAAY,SAAoB1V,EAAQ3W,GACtC,IAAImkB,EAAQ1oB,KAAKytB,OACbgiC,EAAQzvD,KAAKivD,OACbiB,EAAWT,EAAMxvD,OACjBkwD,EAAgBznC,EAAMqnC,mBACtBL,EAAUhnC,EAAMinC,aAChB7gD,EAAQ9O,KAAKoO,UAAUgiD,aAAa1nC,EAAMmnC,eAAgBJ,GAC1Dr7C,EAAI,EACc,SAAlB+7C,IAA0B/7C,GAAKtF,GAA2B,WAAlBqhD,EAA6B,EAAI,IAC7E,IAAI//C,EAAO,IAAIqL,EAAWrH,EAAG87C,GAAY,IAAOR,EAAU,EAAG5gD,EAAOohD,EAAWR,GAC/E,OAAOx0C,EAASA,EAAOqJ,iBAAiBnU,EAAMA,GAAQA,KAGtDu1B,EAAQ3mC,EAAKyD,OAAO,IAAI,WAC1B,IAWI4tD,EAXAjmD,EAAQ,CACVkmD,KAAM,CAAC,QACPC,IAAK,CAAC,MAAO,QAAS,QACtBC,IAAK,CAAC,MAAO,aAAc,cAC3BC,IAAK,CAAC,MAAO,aAAc,aAC3BC,SAAU,CAAC,WAAY,SAAU,cAAe,cAE9CC,EAAmB,GACnBC,EAAc,CAChBC,YAAa,CAAC,EAAG,EAAG,EAAG,IAIzB,SAASC,EAAQC,GACf,IAEIjrB,EAFA/jC,EAAQgvD,EAAOhvD,MAAM,0DAA4DgvD,EAAOhvD,MAAM,6CAC9F8B,EAAO,MAGX,GAAI9B,EAAO,CACT,IAAIuD,EAASvD,EAAM,GAAK,EAAI,EAC5B+jC,EAAa,IAAI7gC,MAAMK,GAEvB,IAAK,IAAIxF,EAAI,EAAGA,EAAIwF,EAAQxF,IAAK,CAC/B,IAAIgB,EAAQiB,EAAMjC,EAAI,GACtBgmC,EAAWhmC,GAAKkxD,SAAyB,GAAhBlwD,EAAMb,OAAca,EAAQA,EAAQA,EAAO,IAAM,UAEvE,GAAIiB,EAAQgvD,EAAOhvD,MAAM,yBAA0B,CACxD8B,EAAO9B,EAAM,GACb+jC,EAAa/jC,EAAM,GAAGkvD,OAAO57C,MAAM,WAGnC,IAFA,IAAI67C,EAAiB,QAATrtD,EAEI9D,GAAPD,EAAI,EAAOoR,KAAKD,IAAI60B,EAAW7lC,OAAQ,IAAIH,EAAIC,EAAGD,IAAK,CAC9D,IAAIqxD,EAAYrrB,EAAWhmC,GACvBgB,EAAQiN,WAAWojD,GAEvB,GAAID,EACF,GAAU,IAANpxD,EAAS,CACX,IAAIsxD,EAAOD,EAAUpvD,MAAM,aAAa,GACxCjB,GAAS,CACPuwD,KAAM,IACN/wB,IAAK,IAAMpvB,KAAK4I,GAChBw3C,KAAM,IACNF,IAAS,OACFtxD,EAAI,IACbgB,GAAS,UAEFhB,EAAI,IACbgB,GAAS,KAAKsB,KAAK+uD,GAAa,IAAM,KAGxCrrB,EAAWhmC,GAAKgB,OAEb,CACL,IAAIk9B,EAAQ4yB,EAAYG,GAExB,IAAK/yB,EACH,GAAIl/B,EAAQ,CACLuxD,KACHA,EAAW7jD,GAAeC,WAAW,EAAG,IAC/BywB,yBAA2B,QAGtCmzB,EAAS/1B,UAAY,gBACrB+1B,EAAS/1B,UAAYy2B,EACrBV,EAAS1xB,SAAS,EAAG,EAAG,EAAG,GAC3B,IAAI7R,EAAOujC,EAAS9qB,aAAa,EAAG,EAAG,EAAG,GAAGzY,KAC7CkR,EAAQ4yB,EAAYG,GAAU,CAACjkC,EAAK,GAAK,IAAKA,EAAK,GAAK,IAAKA,EAAK,GAAK,UAEvEkR,EAAQ,CAAC,EAAG,EAAG,GAInB8H,EAAa9H,EAAM5+B,QAGrB,MAAO,CAACyE,EAAMiiC,GAGhB,IAAIyrB,EAAa,CAAC,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,IAC5EC,EAAa,CACf,UAAW,SAAgBj5C,EAAGk5C,EAAGtuD,GAC/B,IAAIgO,EAAMD,KAAKC,IAAIoH,EAAGk5C,EAAGtuD,GAErBo7B,EAAQptB,EADFD,KAAKD,IAAIsH,EAAGk5C,EAAGtuD,GAGzB,MAAO,CADW,IAAVo7B,EAAc,EAA4G,IAAvGptB,GAAOoH,GAAKk5C,EAAItuD,GAAKo7B,GAASkzB,EAAItuD,EAAI,EAAI,GAAKgO,GAAOsgD,GAAKtuD,EAAIoV,GAAKgmB,EAAQ,GAAKhmB,EAAIk5C,GAAKlzB,EAAQ,GAC1G,IAARptB,EAAY,EAAIotB,EAAQptB,EAAKA,IAE1C,UAAW,SAAgBqO,EAAGhH,EAAGrV,GAE/B,IAEIrD,EADAwW,GAFJkJ,GAAKA,EAAI,GAAK,EAAI,GAAK,IACnB1f,EAAIoR,KAAKijB,MAAM3U,IAGf5R,EAAI,CAACzK,EAAGA,GAAK,EAAIqV,GAAIrV,GAAK,EAAIqV,EAAIlC,GAAInT,GAAK,EAAIqV,GAAK,EAAIlC,KAC5D,MAAO,CAAC1I,GAFJ9N,EAAIyxD,EAAWzxD,IAEP,IAAK8N,EAAE9N,EAAE,IAAK8N,EAAE9N,EAAE,MAEhC,UAAW,SAAgByY,EAAGk5C,EAAGtuD,GAC/B,IAAIgO,EAAMD,KAAKC,IAAIoH,EAAGk5C,EAAGtuD,GACrB8N,EAAMC,KAAKD,IAAIsH,EAAGk5C,EAAGtuD,GACrBo7B,EAAQptB,EAAMF,EACdygD,EAAuB,IAAVnzB,EAEbx+B,GAAKoR,EAAMF,GAAO,EAEtB,MAAO,CAHCygD,EAAa,EAA4G,IAAvGvgD,GAAOoH,GAAKk5C,EAAItuD,GAAKo7B,GAASkzB,EAAItuD,EAAI,EAAI,GAAKgO,GAAOsgD,GAAKtuD,EAAIoV,GAAKgmB,EAAQ,GAAKhmB,EAAIk5C,GAAKlzB,EAAQ,GAEpHmzB,EAAa,EAAI3xD,EAAI,GAAMw+B,GAASptB,EAAMF,GAAOstB,GAAS,EAAIptB,EAAMF,GAC9DlR,IAEhB,UAAW,SAAgByf,EAAGhH,EAAGzY,GAE/B,GAAU,IAANyY,EAAS,MAAO,CAACzY,EAAGA,EAAGA,GAM3B,IALA,IAAI4xD,EAAM,EAFVnyC,GAAKA,EAAI,IAAM,EAAI,GAAK,GAET,EAAI,EAAGA,EAAGA,EAAI,EAAI,GAC7BsyB,EAAK/xC,EAAI,GAAMA,GAAK,EAAIyY,GAAKzY,EAAIyY,EAAIzY,EAAIyY,EACzCq5B,EAAK,EAAI9xC,EAAI+xC,EACb18B,EAAI,GAECtV,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAI8xD,EAAKD,EAAI7xD,GACT8xD,EAAK,IAAGA,GAAM,GACdA,EAAK,IAAGA,GAAM,GAClBx8C,EAAEtV,GAAK,EAAI8xD,EAAK,EAAI/f,EAAiB,GAAXC,EAAKD,GAAU+f,EAAK,EAAIA,EAAK,EAAI9f,EAAK,EAAI8f,EAAK,EAAI/f,GAAMC,EAAKD,IAAO,EAAI,EAAI+f,GAAM,EAAI/f,EAGnH,OAAOz8B,GAET,WAAY,SAAiBmD,EAAGk5C,EAAGtuD,GACjC,MAAO,CAAK,MAAJoV,EAAiB,KAAJk5C,EAAgB,KAAJtuD,IAEnC,WAAY,SAAiBsuD,GAC3B,MAAO,CAACA,EAAGA,EAAGA,IAEhB,WAAY,SAAiBA,GAC3B,MAAO,CAAC,EAAG,EAAGA,IAEhB,WAAY,SAAiBA,GAC3B,MAAO,CAAC,EAAG,EAAGA,IAEhB,eAAgB,WACd,MAAO,IAET,eAAgB,WACd,MAAO,KAGX,OAAOzyD,EAAK8D,KAAKsH,GAAO,SAAUynD,EAAYhuD,GAC5C8sD,EAAiB9sD,GAAQ,GACzB7E,EAAK8D,KAAK+uD,GAAY,SAAUvwD,EAAM+H,GACpC,IAAIhH,EAAOrD,EAAK0K,WAAWpI,GACvBu4C,EAAa,qBAAqBz3C,KAAKd,GACvCwwD,EAASnB,EAAiB9sD,GAAMwF,GAAkB,aAATxF,EAA+B,aAATvC,EAAsB,SAAUR,GACjG,IAAI+Z,EAAU7a,KAAK+xD,YAAY,GAU/B,OALIl3C,KAJJ/Z,EAAQkxD,EAAS5sD,KAAKH,MAAMC,QAAQpE,GAASA,EAAQN,UAAW,EAAG,CACjEmF,UAAU,OAINkV,GAASA,EAAQo3C,aAAajyD,MAC9Bc,GAAOA,EAAMoxD,UAAUlyD,OAGtBc,GACL,WACF,OAAOgY,EAAM1T,KAAK5E,UAAW,EAAG,CAC9BmF,SAAmB,cAATrE,EACVyB,OAAO,KAEP,SAAUjC,GACZ,OAAgB,MAATA,GAAiBib,MAAMjb,GAAS,GAAKA,GAG9Cd,KAAK,MAAQqC,GAAQ,WACnB,OAAOrC,KAAK6/B,QAAUh8B,GAAQg2C,GAAc,WAAWz3C,KAAKpC,KAAK6/B,OAAS7/B,KAAK+xD,YAAY1oD,GAASrJ,KAAK+lC,SAASliC,GAAMwF,IAG1HrJ,KAAK,MAAQqC,GAAQ,SAAUvB,GACzBd,KAAK6/B,QAAUh8B,GAAUg2C,GAAc,WAAWz3C,KAAKpC,KAAK6/B,SAC9D7/B,KAAK+xD,YAAc/xD,KAAK+lC,SAASliC,GACjC7D,KAAKmyD,YAAc/nD,EAAMvG,GACzB7D,KAAK6/B,MAAQh8B,GAGf7D,KAAK+xD,YAAY1oD,GAASyoD,EAAO5xD,KAAKF,KAAMc,GAE5Cd,KAAKiiB,cAENjiB,QACF,CACD2D,OAAQ,QACR+B,YAAY,EACZ9C,WAAY,SAAS+iC,EAAMh/B,GACzB,IAGI9C,EACAiiC,EACAJ,EACAuB,EANA1+B,EAAO/H,UACPyY,EAAUjZ,KAAK4F,OACfR,EAAO,EAMPH,MAAMC,QAAQyB,KAEhBA,GADA4B,EAAO5B,GACI,IAGb,IAAIyrD,EAAiB,MAAPzrD,UAAsBA,EAgBpC,GAdgB,WAAZyrD,GAAwBzrD,KAAOyD,IACjCvG,EAAO8C,EACPA,EAAM4B,EAAK,GAEPtD,MAAMC,QAAQyB,IAChBm/B,EAAan/B,EACb++B,EAAQn9B,EAAK,KAET0Q,IAAS7T,EAAO,GACpBmD,EAAOvJ,EAAKI,MAAMmJ,EAAM,GACxB6pD,SAAiBzrD,KAIhBm/B,EAAY,CAGf,GAFAmB,EAAqB,WAAZmrB,EAAuB7pD,EAAmB,WAAZ6pD,GAAsC,MAAdzrD,EAAI1G,OAAiB0G,EAAM,KAE9E,CACL9C,IAAMA,EAAOojC,EAAOhnC,QAAU,EAAI,MAAQ,QAC/C,IAAIA,EAASmK,EAAMvG,GAAM5D,OACzBylC,EAAQuB,EAAOhnC,GAEXgZ,IACF7T,GAAQ6hC,IAAWzmC,UAAYP,GAAmB,MAATylC,EAAgB,EAAI,GAAK,GAGhEuB,EAAOhnC,OAASA,IAAQgnC,EAASjoC,EAAKI,MAAM6nC,EAAQ,EAAGhnC,SACtD,GAAgB,WAAZmyD,EAAsB,CAC/B,IAAIC,EAAYvB,EAAQnqD,GACxB9C,EAAOwuD,EAAU,GAGS,KAF1BvsB,EAAausB,EAAU,IAERpyD,SACbylC,EAAQI,EAAW,GACnBA,EAAW7lC,eAER,GAAgB,WAAZmyD,EACT,GAAIzrD,EAAI3D,cAAgB2iC,GAKtB,GAJA9hC,EAAO8C,EAAIk5B,MACXiG,EAAan/B,EAAIorD,YAAY3yD,QAC7BsmC,EAAQ/+B,EAAIq/B,OAEC,aAATniC,EACF,IAAK,IAAI/D,EAAI,EAAGC,EAAI+lC,EAAW7lC,OAAQH,EAAIC,EAAGD,IAAK,CACjD,IAAIqU,EAAQ2xB,EAAWhmC,GACnBqU,IAAO2xB,EAAWhmC,GAAKqU,EAAMpR,eAGhC,GAAI4D,EAAI3D,cAAgBgvD,EAC7BnuD,EAAO,WACPojC,EAAS1+B,MACJ,CAEL,IAAIspD,EAAaznD,EADjBvG,EAAO,QAAS8C,EAAM,cAAeA,EAAM,MAAQ,MAAQ,aAAcA,GAAO,UAAWA,GAAO,WAAYA,EAAM,WAAa,SAAUA,EAAM,OAAS,OAEtJ2rD,EAAU3B,EAAiB9sD,GAC/B7D,KAAK+xD,YAAcjsB,EAAa,GAEhC,IAAShmC,EAAI,EAAGC,EAAI8xD,EAAW5xD,OAAQH,EAAIC,EAAGD,IAAK,CAGpC,OAFTgB,EAAQ6F,EAAIkrD,EAAW/xD,OAELA,GAAc,aAAT+D,GAAuB,UAAW8C,IAC3D7F,EAAQ,CACNyxD,MAAO5rD,EAAI4rD,MACXC,OAAQ7rD,EAAI6rD,SAKH,OADb1xD,EAAQwxD,EAAQxyD,GAAGI,KAAKF,KAAMc,MACXglC,EAAWhmC,GAAKgB,GAGrC4kC,EAAQ/+B,EAAI++B,MAIZzsB,GAAWpV,IAAMuB,EAAO,GAK9B,GAFApF,KAAK6/B,MAAQh8B,GAAQ,OAEhBiiC,EAAY,CACf9lC,KAAK+xD,YAAcjsB,EAAa,GAGhC,IAAShmC,EAAI,EAAGC,GAFZuyD,EAAU3B,EAAiB3wD,KAAK6/B,QAER5/B,OAAQH,EAAIC,EAAGD,IAAK,CAC9C,IAAIgB,EACS,OADTA,EAAQwxD,EAAQxyD,GAAGI,KAAKF,KAAMinC,GAAUA,EAAOnnC,OAChCgmC,EAAWhmC,GAAKgB,IAQvC,OAJAd,KAAK+xD,YAAcjsB,EACnB9lC,KAAKmyD,YAAc/nD,EAAMpK,KAAK6/B,OAC9B7/B,KAAKgmC,OAASN,EACVzsB,IAASjZ,KAAK4F,OAASR,GACpBpF,MAETK,IAAK,cACLyH,WAAY,SAAoBvD,EAAS4C,GACvC,IAAI2+B,EAAa9lC,KAAKyyD,gBACtB,OAAOzzD,EAAKyF,UAAU,eAAerC,KAAKpC,KAAK6/B,OAASiG,EAAa,CAAC9lC,KAAK6/B,OAAO72B,OAAO88B,GAAavhC,GAAS,EAAM4C,IAEvH8a,SAAU,WACRjiB,KAAK0yD,aAAe,KAEhB1yD,KAAK6c,SACH7c,KAAK8c,QACP9c,KAAK6c,OAAO7c,KAAK8c,SAAS9c,MAE1BA,KAAK6c,OAAOoF,SAAS,OAI3B8jB,SAAU,SAAkBliC,GAC1B,IAAI8uD,EACJ,OAAO3yD,KAAK6/B,QAAUh8B,EAAO7D,KAAK+xD,YAAY3yD,SAAWuzD,EAAYnB,EAAWxxD,KAAK6/B,MAAQ,IAAMh8B,IAAS8uD,EAAU9vD,MAAM7C,KAAMA,KAAK+xD,aAAeP,EAAW,OAAS3tD,GAAMhB,MAAM7C,KAAMwxD,EAAWxxD,KAAK6/B,MAAQ,QAAQh9B,MAAM7C,KAAMA,KAAK+xD,eAE/Oa,QAAS,SAAiB/uD,GACxB,OAAO,IAAI8hC,EAAM9hC,EAAM7D,KAAK+lC,SAASliC,GAAO7D,KAAKgmC,SAEnD9F,QAAS,WACP,OAAOlgC,KAAK6/B,OAEdG,QAAS,SAAiBn8B,GACxB7D,KAAK+xD,YAAc/xD,KAAK+lC,SAASliC,GACjC7D,KAAKmyD,YAAc/nD,EAAMvG,GACzB7D,KAAK6/B,MAAQh8B,GAEf4uD,cAAe,WACb,IAAI3sB,EAAa9lC,KAAK+xD,YAAY3yD,QAGlC,OADmB,MAAfY,KAAKgmC,QAAgBF,EAAWhiC,KAAK9D,KAAKgmC,QACvCF,GAET+sB,SAAU,WACR,OAAsB,MAAf7yD,KAAKgmC,OAAiBhmC,KAAKgmC,OAAS,GAE7C8sB,SAAU,SAAkBptB,GAC1B1lC,KAAKgmC,OAAkB,MAATN,EAAgB,KAAOx0B,KAAKD,IAAIC,KAAKC,IAAIu0B,EAAO,GAAI,GAElE1lC,KAAKiiB,YAEP8wC,SAAU,WACR,OAAsB,MAAf/yD,KAAKgmC,QAEdlhC,OAAQ,SAAgBk5B,GACtB,IAAIg1B,EAAMh0D,EAAKgI,aAAag3B,GAAO,GAAQ2H,EAAMvgC,KAAK5E,WAAaw9B,EACnE,OAAOg1B,IAAQhzD,MAAQgzD,GAAOhzD,KAAK2D,SAAWqvD,EAAIrvD,QAAU3D,KAAK6/B,QAAUmzB,EAAInzB,OAAS7/B,KAAK6yD,aAAeG,EAAIH,YAAc7zD,EAAK8F,OAAO9E,KAAK+xD,YAAaiB,EAAIjB,eAAgB,GAElLtuD,SAAU,WAMR,IALA,IAAIouD,EAAa7xD,KAAKmyD,YAClBlxC,EAAQ,GACRgyC,EAA4B,aAAfjzD,KAAK6/B,MAClBvpB,EAAIvS,EAAUC,SAETlE,EAAI,EAAGC,EAAI8xD,EAAW5xD,OAAQH,EAAIC,EAAGD,IAAK,CACjD,IAAIgB,EAAQd,KAAK+xD,YAAYjyD,GAChB,MAATgB,GAAemgB,EAAMnd,KAAK+tD,EAAW/xD,GAAK,MAAQmzD,EAAanyD,EAAQwV,EAAErS,OAAOnD,KAItF,OADmB,MAAfd,KAAKgmC,QAAgB/kB,EAAMnd,KAAK,UAAYwS,EAAErS,OAAOjE,KAAKgmC,SACvD,KAAO/kB,EAAM/c,KAAK,MAAQ,MAEnCgvD,MAAO,SAAeC,GACpB,IAAIrtB,EAAa9lC,KAAK+lC,SAAS,OAC3BL,EAAQytB,GAAsB,MAAfnzD,KAAKgmC,OAAiB,EAAIhmC,KAAKgmC,OAElD,SAAS4sB,EAAQrxD,GACf,OAAO2P,KAAK4C,MAA0C,KAAnCvS,EAAM,EAAI,EAAIA,EAAM,EAAI,EAAIA,IAKjD,OAFAukC,EAAa,CAAC8sB,EAAQ9sB,EAAW,IAAK8sB,EAAQ9sB,EAAW,IAAK8sB,EAAQ9sB,EAAW,KAC7EJ,EAAQ,GAAGI,EAAWhiC,KAAK4hC,EAAQ,EAAI,EAAIA,GACxCytB,EAAM,MAAQ,GAAK,KAAOrtB,EAAW,IAAM,KAAOA,EAAW,IAAM,GAAKA,EAAW,IAAIriC,SAAS,IAAIrE,MAAM,IAA2B,GAArB0mC,EAAW7lC,OAAc,QAAU,QAAU6lC,EAAW5hC,KAAK,KAAO,KAE7Lq2B,cAAe,SAAuBhuB,EAAK2O,GACzC,GAAIlb,KAAK0yD,aAAc,OAAO1yD,KAAK0yD,aACnC,GAAmB,aAAf1yD,KAAK6/B,MAAsB,OAAO7/B,KAAK0yD,aAAe1yD,KAAKkzD,QAC/D,IAOIE,EAPAttB,EAAa9lC,KAAK+xD,YAClBrB,EAAW5qB,EAAW,GACtBysB,EAAQ7B,EAAS2C,OACjBC,EAASxtB,EAAW,GACpBytB,EAAcztB,EAAW,GACzB0tB,EAAY1tB,EAAW,GACvB2tB,EAAUv4C,GAAUA,EAAO0I,WAS/B,GANI6vC,IACFH,EAASG,EAAQt4C,gBAAgBm4C,GACjCC,EAAcE,EAAQt4C,gBAAgBo4C,GAClCC,IAAWA,EAAYC,EAAQt4C,gBAAgBq4C,KAGjD9C,EAASgD,QAAS,CACpB,IAAI9zB,EAAS2zB,EAAY74C,YAAY44C,GAErC,GAAIE,EAAW,CACb,IAAI/xB,EAAS+xB,EAAUx4C,SAASs4C,GAC5B7xB,EAAOnoB,YAAcsmB,IAAQ4zB,EAAYF,EAAO7rD,IAAIg6B,EAAO7mB,UAAUglB,EAAS,MAGpF,IAAIv6B,EAAQmuD,GAAaF,EACzBF,EAAiB7mD,EAAIonD,qBAAqBtuD,EAAM+O,EAAG/O,EAAMgP,EAAG,EAAGi/C,EAAOl/C,EAAGk/C,EAAOj/C,EAAGurB,QAEnFwzB,EAAiB7mD,EAAIqnD,qBAAqBN,EAAOl/C,EAAGk/C,EAAOj/C,EAAGk/C,EAAYn/C,EAAGm/C,EAAYl/C,GAG3F,IAAK,IAAIvU,EAAI,EAAGC,EAAIwyD,EAAMtyD,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIoL,EAAOqnD,EAAMzyD,GACbsrB,EAASlgB,EAAKstC,QAClB4a,EAAeS,aAAuB,MAAVzoC,EAAiBtrB,GAAKC,EAAI,GAAKqrB,EAAQlgB,EAAK4oD,OAAOv5B,iBAGjF,OAAOv6B,KAAK0yD,aAAeU,GAE7Bn4C,UAAW,SAAmBC,GAC5B,GAAmB,aAAflb,KAAK6/B,MAAsB,CAG7B,IAFA,IAAIiG,EAAa9lC,KAAK+xD,YAEbjyD,EAAI,EAAGC,EAAI+lC,EAAW7lC,OAAQH,EAAIC,EAAGD,IAAK,CACjD,IAAIqU,EAAQ2xB,EAAWhmC,GAEvBob,EAAOC,gBAAgBhH,EAAOA,GAAO,GAGvCnU,KAAKiiB,aAGT1f,QAAS,CACPwxD,OAAQ3pD,EACRgS,OAAQ,WACN,IAAIA,EAASlL,KAAKkL,OAClB,OAAO,IAAIupB,EAAMvpB,IAAUA,IAAUA,MAEvC43C,UAAW,SAAmBh2B,EAAOvhB,EAAOC,GAY1C,OAXIshB,IACEA,EAAMnhB,QAAUJ,GAASuhB,EAAMnhB,SAAWJ,IAC5CuhB,EAAQA,EAAMj7B,UAGXi7B,EAAMnhB,QAAUJ,IACnBuhB,EAAMnhB,OAASJ,GAAS,KACxBuhB,EAAMlhB,QAAUJ,GAAU,OAIvBshB,OAIV,IAAI,WAeP,OAAOh/B,EAAK8D,KAdI,CACd2E,IAAK,SAAavE,EAAGC,GACnB,OAAOD,EAAIC,GAEb6X,SAAU,SAAkB9X,EAAGC,GAC7B,OAAOD,EAAIC,GAEbiY,SAAU,SAAkBlY,EAAGC,GAC7B,OAAOD,EAAIC,GAEbkY,OAAQ,SAAgBnY,EAAGC,GACzB,OAAOD,EAAIC,KAGa,SAAUokD,EAAUjmD,GAC9CtB,KAAKsB,GAAQ,SAAU08B,GACrBA,EAAQ2H,EAAMvgC,KAAK5E,WAMnB,IAJA,IAAIqD,EAAO7D,KAAK6/B,MACZo0B,EAAcj0D,KAAK+xD,YACnBmC,EAAcl2B,EAAM+H,SAASliC,GAExB/D,EAAI,EAAGC,EAAIk0D,EAAYh0D,OAAQH,EAAIC,EAAGD,IAC7Co0D,EAAYp0D,GAAKynD,EAAS0M,EAAYn0D,GAAIo0D,EAAYp0D,IAGxD,OAAO,IAAI6lC,EAAM9hC,EAAMqwD,EAA4B,MAAfl0D,KAAKgmC,OAAiBuhB,EAASvnD,KAAKgmC,OAAQhI,EAAM60B,YAAc,SAErG,MAEDb,EAAWhzD,EAAKyD,OAAO,CACzBkB,OAAQ,WACRf,WAAY,SAAkB2vD,EAAOC,GACnCxyD,KAAK0D,IAAMiV,EAAInX,MAEX+wD,GAASvzD,EAAKiD,cAAcswD,KAC9BvyD,KAAKK,IAAIkyD,GACTA,EAAQC,EAAS,MAGA,MAAfxyD,KAAKqzD,QACPrzD,KAAKm0D,SAAS5B,GAAS,CAAC,QAAS,UAGf,MAAhBvyD,KAAK0zD,SACP1zD,KAAKo0D,UAA4B,iBAAX5B,GAAkC,WAAXA,GAAuBA,IAAU,IAGlF1qD,WAAY,SAAoBvD,EAAS4C,GACvC,OAAOA,EAAWM,IAAIzH,MAAM,WAC1B,OAAOhB,EAAKyF,UAAU,CAACzE,KAAKqzD,OAAQrzD,KAAK0zD,SAAUnvD,GAAS,EAAM4C,OAGtE8a,SAAU,WACR,IAAK,IAAIniB,EAAI,EAAGC,EAAIC,KAAKq0D,SAAWr0D,KAAKq0D,QAAQp0D,OAAQH,EAAIC,EAAGD,IAC9DE,KAAKq0D,QAAQv0D,GAAGmiB,YAGpBiwC,UAAW,SAAmBl0B,GACvBh+B,KAAKq0D,UAASr0D,KAAKq0D,QAAU,IAElCr0D,KAAKq0D,QAAQvwD,KAAKk6B,IAEpBi0B,aAAc,SAAsBj0B,GAClC,IAAI30B,EAAQrJ,KAAKq0D,QAAUr0D,KAAKq0D,QAAQ7pD,QAAQwzB,IAAU,GAE5C,GAAV30B,IACFrJ,KAAKq0D,QAAQjrD,OAAOC,EAAO,GAEtBrJ,KAAKq0D,QAAQp0D,SAAQD,KAAKq0D,QAAUx1D,KAG7CkE,MAAO,WAGL,IAFA,IAAIwvD,EAAQ,GAEHzyD,EAAI,EAAGC,EAAIC,KAAKqzD,OAAOpzD,OAAQH,EAAIC,EAAGD,IAC7CyyD,EAAMzyD,GAAKE,KAAKqzD,OAAOvzD,GAAGiD,QAG5B,OAAO,IAAIivD,EAASO,EAAOvyD,KAAK0zD,UAElCY,SAAU,WACR,OAAOt0D,KAAKqzD,QAEdc,SAAU,SAAkB5B,GAC1B,GAAIA,EAAMtyD,OAAS,EACjB,MAAM,IAAI6hB,MAAM,2DAGlB,IAAIuxC,EAASrzD,KAAKqzD,OAElB,GAAIA,EACF,IAAK,IAAIvzD,EAAI,EAAGC,EAAIszD,EAAOpzD,OAAQH,EAAIC,EAAGD,IACxCuzD,EAAOvzD,GAAG+c,OAAShe,EAQvB,IAASiB,EAAI,EAAGC,GAJhBszD,EAASrzD,KAAKqzD,OAASkB,EAAavuD,SAASusD,EAAO,EAAG,CACrDxvD,OAAO,KAGkB9C,OAAQH,EAAIC,EAAGD,IACxCuzD,EAAOvzD,GAAG+c,OAAS7c,KAGrBA,KAAKiiB,YAEPuyC,UAAW,WACT,OAAOx0D,KAAK0zD,SAEdU,UAAW,SAAmB5B,GAC5BxyD,KAAK0zD,QAAUlB,EAEfxyD,KAAKiiB,YAEPnd,OAAQ,SAAgB4rD,GACtB,GAAIA,IAAa1wD,KAAM,OAAO,EAE9B,GAAI0wD,GAAY1wD,KAAK2D,SAAW+sD,EAAS/sD,OAAQ,CAC/C,IAAI8wD,EAASz0D,KAAKqzD,OACdqB,EAAShE,EAAS2C,OAClBpzD,EAASw0D,EAAOx0D,OAEpB,GAAIA,IAAWy0D,EAAOz0D,OAAQ,CAC5B,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAQH,IAC1B,IAAK20D,EAAO30D,GAAGgF,OAAO4vD,EAAO50D,IAAK,OAAO,EAG3C,OAAO,GAIX,OAAO,KAGPy0D,EAAev1D,EAAKyD,OAAO,CAC7BkB,OAAQ,eACRf,WAAY,SAAsBmW,EAAMC,GACtC,IAAIglB,EAAQjlB,EACRqS,EAASpS,EAEO,iBAATD,GAAqBC,IAASna,IACnCoG,MAAMC,QAAQ6T,IAA4B,iBAAZA,EAAK,IACrCilB,EAAQjlB,EAAK,GACbqS,EAASrS,EAAK,KACL,UAAWA,GAAQ,WAAYA,GAAQ,cAAeA,KAC/DilB,EAAQjlB,EAAKilB,MACb5S,EAASrS,EAAKqS,QAAUrS,EAAK47C,WAAa,IAI9C30D,KAAK40D,SAAS52B,GACdh+B,KAAK60D,UAAUzpC,IAEjBroB,MAAO,WACL,OAAO,IAAIwxD,EAAav0D,KAAK8zD,OAAO/wD,QAAS/C,KAAKw4C,UAEpD1wC,WAAY,SAAoBvD,EAAS4C,GACvC,IAAI62B,EAAQh+B,KAAK8zD,OACb1oC,EAASprB,KAAKw4C,QAClB,OAAOx5C,EAAKyF,UAAoB,MAAV2mB,EAAiB,CAAC4S,GAAS,CAACA,EAAO5S,GAAS7mB,GAAS,EAAM4C,IAEnF8a,SAAU,WACJjiB,KAAK6c,QAAQ7c,KAAK6c,OAAOoF,SAAS,MAExC0uB,UAAW,WACT,OAAO3wC,KAAKw4C,SAEdqc,UAAW,SAAmBzpC,GAC5BprB,KAAKw4C,QAAUptB,EAEfprB,KAAKiiB,YAEP6yC,aAAc,aACdC,aAAc,aACdC,SAAU,WACR,OAAOh1D,KAAK8zD,QAEdc,SAAU,WACRjvB,EAAMquB,UAAUh0D,KAAK8zD,OAAQ,MAE7B9zD,KAAK8zD,OAASnuB,EAAMquB,UAAUruB,EAAMvgC,KAAK5E,UAAW,GAAIR,KAAM,YAE9DA,KAAKiiB,YAEPnd,OAAQ,SAAgBoG,GACtB,OAAOA,IAASlL,MAAQkL,GAAQlL,KAAK2D,SAAWuH,EAAKvH,QAAU3D,KAAK8zD,OAAOhvD,OAAOoG,EAAK4oD,SAAW9zD,KAAKw4C,SAAWttC,EAAKstC,UAAW,KAGlIhxB,EAAQxoB,EAAKyD,OAAO,IAAI,WAC1B,IAAIwyD,EAAe,CACjB37B,UAAW,KACX47B,SAAU,UACV17B,YAAa,KACb/N,YAAa,EACboP,UAAW,OACXF,WAAY,QACZw6B,eAAe,EACfp6B,WAAY,GACZM,WAAY,EACZF,UAAW,GACXW,YAAa,KACbE,WAAY,EACZo5B,aAAc,IAAIt8C,EAClBu8C,cAAe,MAEbC,EAAgBt2D,EAAKqB,IAAI,GAAI40D,EAAc,CAC7CM,WAAY,aACZC,WAAY,SACZ5nC,SAAU,GACV8hC,QAAS,KACTS,cAAe,SAEbsF,EAAez2D,EAAKqB,IAAI,GAAIi1D,EAAe,CAC7Ch8B,UAAW,IAAIqM,IAEb9d,EAAQ,CACV4D,YAAa,IACboP,UAAW,IACXF,WAAY,IACZw6B,cAAe,IACfp6B,WAAY,IACZw6B,WAAY,EACZC,WAAY,EACZ5nC,SAAU,EACVgiC,KAAM,EACNF,QAAS,EACTS,cAAe,GAEbzoD,EAAO,CACTxG,OAAO,GAELysB,EAAS,CACXhqB,OAAQ,QACRzC,OAAO,EACP0B,WAAY,SAAe8lB,EAAO7L,EAAQqR,GACxCluB,KAAK01D,QAAU,GACf11D,KAAK6c,OAASA,EACd7c,KAAKkuB,SAAWrR,GAAUA,EAAOqR,UAAYA,GAAYtiB,GAAMM,QAC/DlM,KAAK8tB,WAAajR,GAAUA,aAAkBgR,EAAQynC,EAAgBz4C,aAAkBiyC,EAAW2G,EAAeR,EAC9GvsC,GAAO1oB,KAAKK,IAAIqoB,KA0GxB,OAvGA1pB,EAAK8D,KAAKwyD,GAAe,SAAUx0D,EAAOJ,GACxC,IAAIi1D,EAAU,SAASvzD,KAAK1B,GACxBk1D,EAAkB,iBAARl1D,EACV2B,EAAOrD,EAAK0K,WAAWhJ,GACvBuuB,EAAOpH,EAAMnnB,GACbL,EAAM,MAAQgC,EACdb,EAAM,MAAQa,EAElBsrB,EAAOttB,GAAO,SAAUS,GACtB,IAAI2b,EAAQzc,KAAK6c,OACb0L,EAAW9L,GAASA,EAAM2K,UAC1ByuC,EAAkBttC,GAAYA,EAAStoB,OAAS,KAAOwc,aAAiBihB,GAE5E,GAAIm4B,EACF,IAAK,IAAI/1D,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1CyoB,EAASzoB,GAAG2tB,OAAOptB,GAAKS,GAI5B,IAAa,kBAARJ,IAA4Bm1D,IAAoBn1D,KAAOV,KAAK8tB,UAAW,CAC1E,IAAIgoC,EAAM91D,KAAK01D,QAAQh1D,GAEnBo1D,IAAQh1D,IACN60D,IACEG,IACFnwB,EAAMquB,UAAU8B,EAAK,MAErBA,EAAIpD,aAAe,MAGjB5xD,GAASA,EAAMkC,cAAgB2iC,IACjC7kC,EAAQ6kC,EAAMquB,UAAUlzD,EAAO2b,EAAOo5C,GAAmBx1D,KAI7DL,KAAK01D,QAAQh1D,GAAOI,EAChB2b,GAAOA,EAAMwF,SAASgN,GAAQ,QAKxCtB,EAAOnsB,GAAO,SAAUu0D,GACtB,IAAIt5C,EAAQzc,KAAK6c,OACb0L,EAAW9L,GAASA,EAAM2K,UAC1ByuC,EAAkBttC,GAAYA,EAAStoB,OAAS,KAAOwc,aAAiBihB,GAG5E,GAAIm4B,IAAoBE,EACtB,IAAK,IAAIj2D,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIk2D,EAAaztC,EAASzoB,GAAG2tB,OAAOjsB,KAEpC,GAAK1B,GAEE,IAAKd,EAAK8F,OAAOhE,EAAOk1D,GAC7B,OAAOn3D,OAFPiC,EAAQk1D,OAKP,GAAIt1D,KAAOV,KAAK8tB,UAAW,CAChC,IAAIhtB,EAEJ,IAFIA,EAAQd,KAAK01D,QAAQh1D,MAEX7B,GACZiC,EAAQd,KAAK8tB,UAAUptB,KAEVI,EAAMiC,QACjBjC,EAAQA,EAAMiC,aAEX,CACL,IAAIL,EAAOizD,EAAUhwB,EAAQiwB,EAAU98C,EAAQ,MAE3CpW,GAAU5B,GAASA,EAAMkC,cAAgBN,IAC3C1C,KAAK01D,QAAQh1D,GAAOI,EAAQ4B,EAAK0C,KAAK,CAACtE,GAAQ,EAAG,CAChD6E,UAAU,EACV5C,OAAO,MAUf,OAJIjC,GAAS60D,IACX70D,EAAQ6kC,EAAMquB,UAAUlzD,EAAO2b,EAAOo5C,GAAmBx1D,IAGpDS,GAGT4G,EAAKlG,GAAO,SAAUu0D,GACpB,OAAO/1D,KAAKytB,OAAOjsB,GAAKu0D,IAG1BruD,EAAKrH,GAAO,SAAUS,GACpBd,KAAKytB,OAAOptB,GAAKS,OAGrB9B,EAAK8D,KAAK,CACRmzD,KAAM,aACNC,YAAa,aACZ,SAAUp1D,EAAOJ,GAClB,IAAIc,EAAM,MAAQd,EACdL,EAAM,MAAQK,EAClBitB,EAAOnsB,GAAOkG,EAAKlG,GAAO,OAASV,EACnC6sB,EAAOttB,GAAOqH,EAAKrH,GAAO,OAASS,KAErC+H,EAAKvG,OAAOoF,GACLimB,GACJ,CACHttB,IAAK,SAAaqoB,GAChB,IAAIytC,EAAUztC,aAAiBlB,EAC3Byf,EAASkvB,EAAUztC,EAAMgtC,QAAUhtC,EAEvC,GAAIue,EACF,IAAK,IAAIvmC,KAAOumC,EACd,GAAIvmC,KAAOV,KAAK8tB,UAAW,CACzB,IAAIhtB,EAAQmmC,EAAOvmC,GACnBV,KAAKU,GAAOI,GAASq1D,GAAWr1D,EAAMiC,MAAQjC,EAAMiC,QAAUjC,IAKtEgE,OAAQ,SAAgB4jB,GACtB,SAAS8N,EAAQ4/B,EAAQC,EAAQC,GAC/B,IAAIxf,EAAUsf,EAAOV,QACjB3e,EAAUsf,EAAOX,QACjBa,EAAYF,EAAOvoC,UAEvB,IAAK,IAAIptB,KAAOo2C,EAAS,CACvB,IAAI0f,EAAS1f,EAAQp2C,GACjB+1D,EAAS1f,EAAQr2C,GACrB,KAAM41D,GAAa51D,KAAOq2C,GAAa/3C,EAAK8F,OAAO0xD,EAAQC,IAAW53D,EAAY03D,EAAU71D,GAAO+1D,IAAS,OAAO,EAGrH,OAAO,EAGT,OAAO/tC,IAAU1oB,MAAQ0oB,GAAS1oB,KAAK2D,SAAW+kB,EAAM/kB,QAAU6yB,EAAQx2B,KAAM0oB,IAAU8N,EAAQ9N,EAAO1oB,MAAM,KAAS,GAE1Hg4B,SAAU,WACR,IAAIgG,GACJA,EAAQh+B,KAAKu5B,kBACFyE,EAAM00B,aAAe,OAChC10B,EAAQh+B,KAAKy5B,oBACFuE,EAAM00B,aAAe,OAChC10B,EAAQh+B,KAAK+7B,oBACFiC,EAAM00B,aAAe,OAElCp8B,QAAS,WACP,IAAI0H,EAAQh+B,KAAKu5B,eACjB,QAASyE,GAASA,EAAM0H,MAAQ,GAElCvU,UAAW,WACT,IAAI6M,EAAQh+B,KAAKy5B,iBACjB,QAASuE,GAASA,EAAM0H,MAAQ,GAAK1lC,KAAK06B,iBAAmB,GAE/DpC,UAAW,WACT,IAAI0F,EAAQh+B,KAAK+7B,iBACjB,QAASiC,GAASA,EAAM0H,MAAQ,IAAM1lC,KAAK47B,gBAAkB,IAAM57B,KAAK67B,kBAAkB1lB,WAE5F/H,QAAS,WACP,OAAOpO,KAAKkuB,SAAS7f,OAEvBwhD,aAAc,WACZ,IAAIjiC,EAAW5tB,KAAK02D,cACpB,OAAO12D,KAAK22D,gBAAkB,IAAM/oC,GAAY,SAASxrB,KAAKwrB,EAAW,IAAM,IAAM,OAAS5tB,KAAK42D,iBAErGC,QAAS,iBACTC,QAAS,iBACTnH,WAAY,SAASA,IACnB,IAAID,EAAUC,EAAW7tD,KAAK5B,KAAKF,MAC/B4tB,EAAW5tB,KAAK02D,cAEpB,MADI,aAAat0D,KAAKwrB,KAAWA,EAAW5tB,KAAKoO,UAAU2oD,aAAanpC,IACtD,MAAX8hC,EAAkBA,EAAqB,IAAX9hC,KAGnC0Y,EAAa,IAAI,WACnB,SAAS0wB,EAAa5nD,EAAI9N,EAAMjB,EAAKS,GAInC,IAHA,IAAIm2D,EAAW,CAAC,GAAI,SAAU,MAAO,MAAO,KAAM,KAC9CC,EAAS51D,EAAK,GAAGuI,cAAgBvI,EAAKG,UAAU,GAE3C3B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIq3D,EAASF,EAASn3D,GAClBY,EAAMy2D,EAASA,EAASD,EAAS51D,EAErC,GAAIZ,KAAO0O,EAAI,CACb,IAAI/O,EAGF,OAAO+O,EAAG1O,GAFV0O,EAAG1O,GAAOI,EAKZ,QAKN,MAAO,CACLs2D,UAAW,SAAmBhoD,GAC5B,IAAIioD,EAAMjoD,GAAsB,IAAhBA,EAAGkoD,SAAiBloD,EAAGmoD,cAAgBnoD,EACnD0Y,EAAOuvC,GAAOA,EAAIG,YACtB,OAAO1vC,GAAQA,EAAK2vC,iBAAiBroD,EAAI,KAE3Cc,UAAW,SAAmBd,EAAIsoD,GAChC,IAGItnD,EAHAinD,EAAMjoD,EAAGmoD,cACTI,EAAON,EAAIM,KACXC,EAAOP,EAAIQ,gBAGf,IACEznD,EAAOhB,EAAG0oD,wBACV,MAAO3zB,GACP/zB,EAAO,CACLC,KAAM,EACNC,IAAK,EACLxB,MAAO,EACPC,OAAQ,GAIZ,IAAIqF,EAAIhE,EAAKC,MAAQunD,EAAKG,YAAcJ,EAAKI,YAAc,GACvD1jD,EAAIjE,EAAKE,KAAOsnD,EAAKI,WAAaL,EAAKK,WAAa,GAExD,IAAKN,EAAU,CACb,IAAI5vC,EAAOuvC,EAAIG,YACfpjD,GAAK0T,EAAKmwC,aAAeL,EAAKM,YAAcP,EAAKO,WACjD7jD,GAAKyT,EAAKqwC,aAAeP,EAAKQ,WAAaT,EAAKS,UAGlD,OAAO,IAAI38C,EAAWrH,EAAGC,EAAGjE,EAAKtB,MAAOsB,EAAKrB,SAE/CspD,kBAAmB,SAA2BjpD,GAC5C,IAAIioD,EAAMjoD,EAAGmoD,cACTzvC,EAAOuvC,EAAIG,YACXI,EAAOP,EAAIQ,gBACf,OAAO,IAAIp8C,EAAW,EAAG,EAAGqM,EAAKwwC,YAAcV,EAAKW,YAAazwC,EAAK0wC,aAAeZ,EAAKa,eAE5F9nB,UAAW,SAAmBvhC,EAAIsoD,GAChC,OAAOpxB,EAAWp2B,UAAUd,EAAIsoD,GAAU74C,YAE5CG,QAAS,SAAiB5P,GACxB,OAAOk3B,EAAWp2B,UAAUd,GAAI,GAAM4P,WAExC05C,YAAa,SAAqBtpD,GAChC,OAAOk3B,EAAWtnB,QAAQ5P,GAAItK,OAAO,IAAI4Y,EAAK,EAAG,KAEnDi7C,SAAU,SAAkBvpD,GAC1B,OAAQk3B,EAAWoyB,YAAYtpD,IAAOk3B,EAAW+xB,kBAAkBjpD,GAAIuR,WAAW2lB,EAAWp2B,UAAUd,GAAI,KAE7Gsa,WAAY,SAAoBta,GAC9B,OAAOrQ,EAAS44D,KAAKj8C,SAAStM,IAEhCwpD,YAAa,SAAqBxpD,EAAI9N,GACpC,OAAO8N,GAAM4nD,EAAa5nD,EAAI9N,IAEhCilC,YAAa,SAAqBn3B,EAAI9N,EAAMR,GAC1C,GAAoB,iBAATQ,EACT,IAAK,IAAIZ,KAAOY,EACd01D,EAAa5nD,EAAI1O,GAAK,EAAMY,EAAKZ,SAGnCs2D,EAAa5nD,EAAI9N,GAAM,EAAMR,MAKjC+iC,EAAW,CACbp8B,IAAK,SAAa2H,EAAI5D,GACpB,GAAI4D,EACF,IAAK,IAAIvL,KAAQ2H,EAIf,IAHA,IAAIrB,EAAOqB,EAAO3H,GACdod,EAAQpd,EAAKwR,MAAM,WAEdvV,EAAI,EAAGC,EAAIkhB,EAAMhhB,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIwB,EAAO2f,EAAMnhB,GACbyE,EAAU6K,IAAOrQ,IAAsB,eAATuC,GAAkC,cAATA,IAAwB,CACjFu3D,SAAS,GAEXzpD,EAAG0pD,iBAAiBx3D,EAAM6I,EAAM5F,KAKxC+E,OAAQ,SAAgB8F,EAAI5D,GAC1B,GAAI4D,EACF,IAAK,IAAIvL,KAAQ2H,EAIf,IAHA,IAAIrB,EAAOqB,EAAO3H,GACdod,EAAQpd,EAAKwR,MAAM,WAEdvV,EAAI,EAAGC,EAAIkhB,EAAMhhB,OAAQH,EAAIC,EAAGD,IACvCsP,EAAG2pD,oBAAoB93C,EAAMnhB,GAAIqK,GAAM,IAK/C0U,SAAU,SAAkB9T,GAC1B,IAAIozB,EAAMpzB,EAAMiuD,cAAgBjuD,EAAMiuD,cAAc/4D,OAAS8K,EAAMiuD,cAAc,GAAKjuD,EAAMkuD,eAAe,GAAKluD,EAChH,OAAO,IAAI+N,EAAMqlB,EAAI+6B,OAAS/6B,EAAIg7B,QAAUp6D,EAAS84D,gBAAgBK,WAAY/5B,EAAIi7B,OAASj7B,EAAIk7B,QAAUt6D,EAAS84D,gBAAgBO,YAEvIkB,UAAW,SAAmBvuD,GAC5B,OAAOA,EAAMrC,QAAUqC,EAAMwuD,YAE/BC,iBAAkB,SAA0BzuD,GAC1C,OAAOA,EAAM0uD,eAAiB1uD,EAAM2uD,WAEtC/oB,UAAW,SAAmB5lC,EAAOrC,GACnC,OAAOm7B,EAAShlB,SAAS9T,GAAOiQ,SAASsrB,EAAWqK,UAAUjoC,GAAUm7B,EAASy1B,UAAUvuD,OAG/F84B,EAAS81B,sBAAwB,IAAI,WACnC,IAGIC,EAHAC,EAAgBvzB,EAAWsyB,YAAY95D,EAAQ,yBAC/Cg7D,GAAY,EACZC,EAAY,GAGhB,SAASC,IACP,IAAIC,EAAYF,EAChBA,EAAY,GAEZ,IAAK,IAAIj6D,EAAI,EAAGC,EAAIk6D,EAAUh6D,OAAQH,EAAIC,EAAGD,IAC3Cm6D,EAAUn6D,MAGZg6D,EAAYD,GAAiBE,EAAU95D,SACxB45D,EAAcG,GAG/B,OAAO,SAAUE,GACfH,EAAUj2D,KAAKo2D,GAEXL,EACGC,IACHD,EAAcG,GACdF,GAAY,GAEJF,IACVA,EAAQO,YAAYH,EAAiB,IAAO,OAIlD,IAAIvyC,EAAOzoB,EAAKyD,OAAOwH,EAAS,CAC9BtG,OAAQ,OACRf,WAAY,SAAS6kB,EAAKvb,EAASyC,GACjC,SAASqQ,EAAQ1d,GACf,OAAOqN,EAAQrN,IAAS0vD,SAASriD,EAAQW,aAAahO,GAAO,IAG/D,SAAS84D,IACP,IAAI9lD,EAAOgyB,EAAWtnB,QAAQrQ,GAC9B,OAAO2F,EAAKyH,SAAWzH,EAAK6B,SAAW,IAAIuH,EAAKsB,EAAQ,SAAUA,EAAQ,WAAa1K,EAGzF,IAAIA,EAEJ,GAAIxV,GAAU6P,EAAS,CACrB3O,KAAK0D,IAAMiL,EAAQW,aAAa,MAChB,MAAZtP,KAAK0D,KAAaiL,EAAQ0rD,aAAa,KAAMr6D,KAAK0D,IAAM,cAAgB+jB,EAAK/jB,OACjFmgC,EAASp8B,IAAIkH,EAAS3O,KAAKs6D,aAC3B,IAAIC,EAAO,OASX,GARAj0B,EAAWC,YAAY53B,EAAQ+Z,MAAO,CACpC8xC,SAAUD,EACVE,WAAYF,EACZG,aAAcH,EACdI,eAAgBJ,EAChBK,kBAAmB,kBAGjBjvD,EAAW4D,aAAaZ,EAAS,UAAW,CAC9C,IAAIlI,EAAOzG,KACX6jC,EAASp8B,IAAI3I,EAAQkB,KAAK66D,cAAgB,CACxCC,OAAQ,WACNr0D,EAAKs0D,YAAYX,QAOvB,GAFA9lD,EAAO8lD,IAEHzuD,EAAW4D,aAAaZ,EAAS,UAA6B,oBAAVqsD,MAAuB,CAC7Eh7D,KAAKi7D,OAAS,IAAID,MAClB,IAAIE,EAAQl7D,KAAKi7D,OAAOE,WACpBzyC,EAAQwyC,EAAMxyC,MACd0C,EAASkb,EAAWqK,UAAUhiC,GAClC+Z,EAAMgH,SAAW,WACjBhH,EAAMrY,KAAO+a,EAAOhX,EAAI,KACxBsU,EAAMpY,IAAM8a,EAAO/W,EAAI,KACvBtV,EAAS44D,KAAKyD,YAAYF,SAG5B5mD,EAAO,IAAIoJ,EAAK/O,GAChBA,EAAU,KAGZ3O,KAAKkuB,SAAWhiB,EAChBlM,KAAKyP,OAASvD,EAAQuD,OACtBzP,KAAKq7D,SAAW1sD,EACX3O,KAAKs7D,cAAat7D,KAAKs7D,YAAcx8D,GAAUA,EAAOy8D,kBAAoB,GAE/Ev7D,KAAKw7D,gBAAgBlnD,EAAKxF,MAAOwF,EAAKvF,QAEtC/O,KAAKy7D,UAAYnnD,EAEjBmT,EAAKi0C,OAAO53D,KAAK9D,MAEjBynB,EAAKk0C,WAAW37D,KAAK0D,KAAO1D,MAC3BA,KAAKutB,QAAU,IAAIlM,GAAUxE,OAAS7c,KAClCynB,EAAKm0C,WAAUn0C,EAAKm0C,SAAW57D,MACpCA,KAAK67D,YAAc,GACnB77D,KAAK87D,gBAAkB,EACvB97D,KAAK+7D,YAAc,CACjBC,OAAQ,GACRC,QAAS,IAEXj8D,KAAKioB,aAAerc,GAAMmB,MAAMmvD,KAChCl8D,KAAK+nB,cAAe,GAEtBze,OAAQ,WACN,IAAKtJ,KAAKkuB,SAAU,OAAO,EACvBzG,EAAKm0C,WAAa57D,OAAMynB,EAAKm0C,SAAW,MAE5Cn0C,EAAKi0C,OAAOtyD,OAAOqe,EAAKi0C,OAAOlxD,QAAQxK,MAAO,UAEvCynB,EAAKk0C,WAAW37D,KAAK0D,KAC5B,IAAIwI,EAAUlM,KAAKkuB,SAQnB,OAPIhiB,EAAQmC,QAAUrO,OAAMkM,EAAQmC,MAAQ,MAC5Cw1B,EAASv6B,OAAOtJ,KAAKq7D,SAAUr7D,KAAKs6D,aACpCz2B,EAASv6B,OAAOxK,EAAQkB,KAAK66D,eAC7B76D,KAAKq7D,SAAWr7D,KAAKkuB,SAAW,KAChCluB,KAAK0K,IAAI,SACT1K,KAAKm8D,UAAW,EAChBn8D,KAAK67D,YAAc,IACZ,GAETpwD,QAASzM,EAAK8D,KAAK+F,EAAKukB,cAAcpkB,OAAO,CAAC,WAAY,YAAa,aAAa,SAAU1H,GAC5FtB,KAAKsB,GAAQ,KACZ,CACD0rB,QAAS,CACPviB,QAAS,WACPzK,KAAKo8D,QAEPzxD,UAAW,WACT3K,KAAKq8D,YAIXF,UAAU,EACVvkB,MAAO,EACP0kB,OAAQ,EACRC,cAAe,WACb,OAAOv8D,KAAKioB,aAEdu0C,cAAe,SAAuBC,GACpCz8D,KAAKioB,YAAcw0C,EACfA,GAAYz8D,KAAKkoB,iBAEvBw0C,OAAQ,aACR1xC,KAAM,WACJhrB,KAAK08D,UAEPx0C,cAAe,WACb,IAAKloB,KAAKgoB,WAAY,CACpB,IAAIvhB,EAAOzG,KACX6jC,EAAS81B,uBAAsB,WAG7B,GAFAlzD,EAAKuhB,YAAa,EAEdvhB,EAAK01D,SAAU,CACjB11D,EAAKyhB,gBACL,IAAIvZ,EAAUlI,EAAK40D,SAEb/0B,EAAWsyB,YAAY75D,EAAU,WAA+D,SAAlD4M,EAAW2D,aAAaX,EAAS,eAA4B23B,EAAWqyB,SAAShqD,IACnIlI,EAAKw4B,eAILx4B,EAAKwhB,aAAaxhB,EAAKi2D,YAE7B18D,KAAKgoB,YAAa,IAGtBo0C,KAAM,WACJp8D,KAAKm8D,UAAW,EAChBn8D,KAAKkoB,iBAEPm0C,MAAO,WACLr8D,KAAKm8D,UAAW,GAElBl9B,aAAc,WACZrzB,GAAQ5L,KAAKyP,OACb,IAAIktD,EAAMC,KAAKD,MAAQ,IACnBp+B,EAAQv+B,KAAKmpC,MAAQwzB,EAAM38D,KAAKmpC,MAAQ,EAC5CnpC,KAAKmpC,MAAQwzB,EACb38D,KAAK8K,KAAK,QAAS,IAAI9L,EAAK,CAC1Bu/B,MAAOA,EACPW,KAAMl/B,KAAK43C,OAASrZ,EACpB9mB,MAAOzX,KAAKs8D,YAEVt8D,KAAKi7D,QAAQj7D,KAAKi7D,OAAOyB,UAE/BzvC,aAAc,SAAsBvlB,EAAMm1D,GACxC,IAAI5zD,EAAQjJ,KAAK67D,YAEbgB,GACF5zD,EAAMvB,EAAKhE,KAAO,CAChBgE,KAAMA,EACNw3B,KAAM,EACNznB,MAAO,GAEsB,KAAzBzX,KAAK87D,iBAAuB97D,KAAKkK,GAAG,QAASlK,KAAK88D,4BAEjD7zD,EAAMvB,EAAKhE,KAEa,KAAzB1D,KAAK87D,iBACT97D,KAAK0K,IAAI,QAAS1K,KAAK88D,qBAI7BA,kBAAmB,SAA2B/xD,GAC5C,IAAK,IAAIjL,KAAKE,KAAK67D,YAAa,CAC9B,IAAI51D,EAAQjG,KAAK67D,YAAY/7D,GAC7BmG,EAAMyB,KAAKoD,KAAK,QAAS,IAAI9L,EAAK+L,EAAO,CACvCm0B,KAAMj5B,EAAMi5B,MAAQn0B,EAAMwzB,MAC1B9mB,MAAOxR,EAAMwR,aAInBwK,SAAU,WACRjiB,KAAKkuB,SAASjM,SAAS,MAEvBjiB,KAAKmuB,QAAUnuB,KAAKquB,YAAcxvB,GAEpCykC,WAAY,WACV,OAAOtjC,KAAKq7D,UAEd0B,cAAe,WACb,OAAO/8D,KAAKs7D,aAEdtnC,cAAe,WACb,OAA0B,GAAnBh0B,KAAKs7D,aAEd0B,YAAa,WACX,IAAI1oD,EAAOtU,KAAKy7D,UAChB,OAAO,IAAI19C,EAAWzJ,EAAKxF,MAAOwF,EAAKvF,OAAQ/O,KAAM,gBAEvD+6D,YAAa,WACX,IAAIzmD,EAAOoJ,EAAKtY,KAAK5E,WACjB+9B,EAAQjqB,EAAK0G,SAAShb,KAAKy7D,WAC3Bl9B,EAAMpoB,WAEVnW,KAAKw7D,gBAAgBlnD,EAAKxF,MAAOwF,EAAKvF,QAEtC/O,KAAKy7D,UAAUp7D,IAAIiU,GAEnBtU,KAAKiiB,WAELjiB,KAAK8K,KAAK,SAAU,CAClBwJ,KAAMA,EACNiqB,MAAOA,IAGLv+B,KAAKioB,aACPjoB,KAAK08D,WAGTlB,gBAAiB,SAAyB1sD,EAAOC,GAC/C,IAAIJ,EAAU3O,KAAKq7D,SAEf1sD,IACEA,EAAQG,QAAUA,IAAOH,EAAQG,MAAQA,GACzCH,EAAQI,SAAWA,IAAQJ,EAAQI,OAASA,KAGpDmB,UAAW,WAET,OADKlQ,KAAKmuB,UAASnuB,KAAKmuB,QAAUnuB,KAAKutB,QAAQ3J,WAAWW,iBAAiB,IAAI9I,EAAW,IAAI3C,EAAS9Y,KAAKy7D,aACrGz7D,KAAKmuB,SAEdnP,QAAS,WACP,OAAOhf,KAAKkQ,YAAY8O,WAE1Bi+C,UAAW,WACT,OAAO32B,EAAWqyB,SAAS34D,KAAKq7D,WAElC3xC,WAAY,WACV,OAAO4c,EAAW5c,WAAW1pB,KAAKq7D,WAEpCtE,aAAc,SAAsBziD,GAClC,IACIgxB,EADA32B,EAAU3O,KAAKq7D,SAGnB,GAAI1sD,EAAS,CACX,IAAI+e,EAAS/e,EAAQuuD,WACjBC,EAAOp+D,EAASq+D,cAAc,OAClCD,EAAKz0C,MAAMkF,SAAWtZ,EACtBoZ,EAAO0tC,YAAY+B,GACnB73B,EAASv3B,WAAWu4B,EAAW8wB,UAAU+F,GAAMvvC,UAC/CF,EAAO2vC,YAAYF,QAEnB73B,EAASv3B,WAAWu3B,GAGtB,OAAOA,GAET8qB,aAAc,SAAsBR,EAAMH,GACxC,OAAO,IAERzwD,EAAK8D,KAAK,CAAC,SAAU,QAAS,QAAS,SAAS,SAAUpC,GAC3D,IAAIoa,EAAiB,WAARpa,EAEbV,KAAKU,GAAO,WACV,IAAI6H,EAAO/H,UACPM,GAASga,EAAS9b,EAAO8Z,GAAO1T,KAAKmD,GACrCwS,EAASjC,EAAM1T,KAAKmD,EAAM,EAAG,CAC/B5C,UAAU,IAEZ,OAAO3F,KAAKib,WAAU,IAAIoG,GAAS3gB,GAAKI,EAAOia,GAAU/a,KAAKqgB,WAAU,QAEzE,CACDoR,WAAY,WACV,OAAOzxB,KAAKquB,cAAgBruB,KAAKquB,YAAcruB,KAAKutB,QAAQ7I,cAE9DlC,UAAW,WACT,IAAIJ,EAAK,IAAIf,EACb,OAAOrhB,KAAKib,UAAUmH,EAAGI,UAAU3f,MAAMuf,EAAI5hB,aAE/C6f,UAAW,WACT,OAAOrgB,KAAKkQ,YAAYmQ,aAE1BC,UAAW,WACT,IAAIvF,EAASjC,EAAM1T,KAAK5E,WACxBR,KAAKwiB,UAAUxiB,KAAKqgB,YAAYrF,SAASD,KAE3CuiD,QAAS,WACP,IAAIt4C,EAAUhlB,KAAKyxB,aAAazM,QAEhC,OAAQA,EAAQ5Q,EAAI4Q,EAAQ3Q,GAAK,GAEnCkpD,QAAS,SAAiBC,GACxBx9D,KAAKib,WAAU,IAAIoG,GAAS1H,MAAM6jD,EAAOx9D,KAAKs9D,UAAWt9D,KAAKqgB,eAEhE8E,YAAa,WACX,OAAOnlB,KAAKyxB,aAAa1M,UAE3B4M,YAAa,SAAqB5M,GAChC,IAAIlK,EAAU7a,KAAKmlB,cAEJ,MAAXtK,GAA+B,MAAZkK,GACrB/kB,KAAK8a,OAAOiK,EAAWlK,IAG3BqK,WAAY,WACV,IAAIF,EAAUhlB,KAAKyxB,aAAazM,QAEhC,OAAO,IAAIxI,EAAYwI,EAAQ5Q,EAAG4Q,EAAQ3Q,EAAGrU,KAAM,eAErD4xB,WAAY,WACV,IAAI/W,EAAU7a,KAAKklB,aACfF,EAAUlM,EAAM1T,KAAK5E,UAAW,EAAG,CACrCuC,OAAO,EACP4C,UAAU,IAGRkV,GAAWmK,GACbhlB,KAAK2Z,MAAMqL,EAAQ5Q,EAAIyG,EAAQzG,EAAG4Q,EAAQ3Q,EAAIwG,EAAQxG,IAG1Dwd,UAAW,WACT,OAAO7xB,KAAKutB,SAEduE,UAAW,WACT,IAAI5W,EAASlb,KAAKutB,QAClBrS,EAAO7a,IAAIwC,MAAMqY,EAAQ1a,YAE3Bya,UAAW,SAAmBC,GAC5Blb,KAAKutB,QAAQhkB,OAAO2R,IAEtBuiD,SAAU,WACRz9D,KAAKwiB,UAAU1J,EAAM1T,KAAK5E,WAAW+a,aAErC,CACFmiD,cAAe,WACb,OAAO19D,KAAKutB,QAAQpS,gBAAgBrC,EAAM1T,KAAK5E,aAEjDm9D,cAAe,WACb,OAAO39D,KAAKutB,QAAQ9I,kBAAkB3L,EAAM1T,KAAK5E,aAEnDo9D,cAAe,SAAuB7yD,GACpC,OAAO/K,KAAK29D,cAAc95B,EAAS8M,UAAU5lC,EAAO/K,KAAKq7D,aAE1D,CACD94D,QAAS,CACPm5D,OAAQ,GACRC,WAAY,GACZj4D,IAAK,EACLrE,OAAQ,SAAgB6M,EAASyC,GAG/B,OAFI5P,GAA+B,iBAAZ4P,IAAsBA,EAAU5P,EAAS0jC,eAAe9zB,IAExE,IADI7P,EAAS++D,EAAap2C,GACjBvb,EAASyC,MAG5B,IAAI,WACL,GAAK7P,EAAL,CACA,IAAIg/D,EACAC,EA2BAC,EACAC,EACAC,EA5BAC,GAAW,EACXC,GAAY,EAwBZnxD,EAAYnO,EAAOmO,UAKnBA,EAAUoxD,gBAAkBpxD,EAAUqxD,kBACxCN,EAAY,4BACZC,EAAY,4BACZC,EAAU,wDAEVF,EAAY,aACZC,EAAY,YACZC,EAAU,uBAEJ,iBAAkBp/D,GAAUmO,EAAUC,UAAUnL,MAAM,gDAC1Di8D,GAAa,aACbC,GAAa,aACbC,GAAW,aAIf,IAAIK,EAAa,GACbC,EAAY,CACdC,SAAU,SAAkB1zD,GAC1B,IAAI+c,EAAOL,EAAKm0C,SACZlzD,EAASm7B,EAAS21B,iBAAiBzuD,GAEvC,GAAI+c,KAAUpf,GAA8B,SAApBA,EAAOg2D,UAAsB,CACnD,IAAItzC,EAASyY,EAAS8M,UAAU5lC,EAAO+c,EAAKuzC,UACxCjnD,EAAIgX,EAAOhX,EACXO,EAAMzD,KAAKyD,IACXu8B,EAAKv8B,EAAIP,GAETm+B,EAAOrB,GADD,GAAK,IAEf9lB,EAAOhX,EAAIO,EAAI49B,GAAQrB,EAAKqB,GAAQn+B,EAAI,GAAK,EAAI,GAAKA,EACtDuqD,EAAgB72C,EAAM/c,EAAO+c,EAAK61C,cAAcvyC,MAGpDwzC,OAAQC,GAGVN,EAAWP,GAAa,SAAUjzD,GAChC,IAAI+c,EAAOL,EAAKm0C,SAAWxtD,EAAQrD,GAE9BozD,IACHA,GAAW,EAEXr2C,EAAKg3C,kBAAkB,YAAa/zD,KAIxCyzD,EAAUP,GAAa,SAAUlzD,GAC/B,IAAI+c,EAAOL,EAAKm0C,SAEhB,IAAKwC,EAAW,CACd,IAAI11D,EAAS0F,EAAQrD,GAEjBrC,EACEof,IAASpf,IACPof,GAAM62C,EAAgB72C,EAAM/c,GAC3B+yD,IAAWA,EAAYh2C,GAC5BA,EAAOL,EAAKm0C,SAAWmC,EAAYr1D,GAE5Bq1D,GAAaA,IAAcj2C,IAChCg2C,IAAcA,EAAUp0C,eAAco0C,EAAY,MACtDh2C,EAAOL,EAAKm0C,SAAWkC,EACvBA,EAAY,KACZe,KAIA/2C,GAAM62C,EAAgB72C,EAAM/c,IAGlCyzD,EAAUR,GAAa,WACrBI,GAAY,GAGdI,EAAUN,GAAW,SAAUnzD,GAC7B,IAAI+c,EAAOL,EAAKm0C,SACZ9zC,GAAQq2C,GAAUr2C,EAAKg3C,kBAAkB,UAAW/zD,GACxDqzD,EAAYD,GAAW,GAGzBt6B,EAASp8B,IAAI1I,EAAUy/D,GACvB36B,EAASp8B,IAAI3I,EAAQ,CACnBglC,KAAM+6B,IAER,IAQIE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAfAC,GAAS,EACTC,GAAY,EACZC,EAAY,CACdC,YAAa,QACb50C,UAAW,aAET60C,GAAY,EA+CZC,EAAgB,CAClB5B,UAAW,CACTA,UAAW,EACXlzC,UAAW,EACX+0C,MAAO,EACPH,YAAa,GAEfxB,QAAS,CACPA,QAAS,EACTpzC,UAAW,EACX+0C,MAAO,EACPH,YAAa,GAEfzB,UAAW,CACTnzC,UAAW,EACXmzC,UAAW,EACX6B,WAAY,EACZC,WAAY,IAGhB,MAAO,CACLzF,YAAaiE,EACbO,kBAAmB,SAA2Bj7D,EAAMkH,EAAOoJ,GACzD,IAAI6rD,EAAahgE,KAAK+7D,YAClBkE,EAAWD,EAAWhE,OAAOn4D,GAC7Bq8D,EAAsB,cAATr8D,EACbs8D,EAAOngE,KAAKyP,OAAO0wD,KACnBr4C,EAAO9nB,KAEX,SAASmL,EAAStH,GAChB,OAAOm8D,EAAW/D,QAAQp4D,IAASikB,EAAK3c,SAAStH,IAASs8D,GAAQA,EAAKh1D,SAAStH,GAG9Eq8D,GAAc/B,GAAYhzD,EAAS,eAActH,EAAO,aACvDsQ,IAAOA,EAAQnU,KAAK49D,cAAc7yD,IAEvC,IAAIq1D,EAASpgE,KAAKkQ,YAAYwL,SAASvH,GACnC0hB,EAAMoqC,GAAYG,GAAUt4C,EAAKoG,SAAS4G,QAAQ3gB,EAAO,CAC3DlE,UAAW,EACXomB,MAAM,EACNrG,QAAQ,IAENqwC,EAAUxqC,GAAOA,EAAInuB,MAAQ,KAC7BwoB,GAAS,EACTowC,EAAQ,GA6BZ,GA3BAA,EAAMz8D,EAAK08D,OAAO,KAAM,EAEpBN,GAAYI,IAAYnB,IACtBA,GACFsB,EAAetB,EAAU,KAAM,aAAcn0D,EAAOoJ,GAGlDksD,GACFG,EAAeH,EAAS,KAAM,aAAct1D,EAAOoJ,GAGrD+qD,EAAWmB,GAGTV,EAAYS,IACdI,EAAexgE,KAAM,KAAMogE,EAAS,aAAe,aAAcr1D,EAAOoJ,GAC7DisD,EAASpgE,KAAO,KAC3BkwB,GAAS,IAGNkwC,IAAUE,EAAMG,MAAUtsD,EAAMrP,OAAOk6D,KAC1C0B,EAAgB1gE,KAAMqgE,EAASH,EAAar8D,EAAO,YAAakH,EAAOoJ,EAAO6qD,GAC9E9uC,GAAS,GAGXyvC,EAAYS,EAERE,EAAMK,MAAQP,GAAUE,EAAMM,IAAM7B,EAAW,CAGjD,GAFA2B,EAAgB1gE,KAAMqgE,EAASx8D,EAAMkH,EAAOoJ,EAAO4qD,GAE/CuB,EAAMK,KAAM,CAId,GAHArB,EAAWe,IAAYjB,GAAaxC,KAAKD,MAAQ0C,EAAY,IAC7DJ,EAAWG,EAAYiB,GAElBb,GAAaa,EAAS,CAGzB,IAFA,IAAI34D,EAAO24D,EAEJ34D,IAASA,EAAKyD,SAAS,cAC5BzD,EAAOA,EAAK8lB,QAGV9lB,IAAMy3D,EAAWkB,GAGvBtB,EAAY5qD,OACHmsD,EAAMM,KACVpB,GAAaa,IAAYpB,IAC5BI,EAAYzC,KAAKD,MACjB+D,EAAgB1gE,KAAMqgE,EAASf,EAAW,cAAgB,QAASv0D,EAAOoJ,EAAO4qD,GACjFO,GAAW,GAGbL,EAAWE,EAAW,MAGxBQ,GAAY,EACZzvC,GAAS,EAGX8uC,EAAY7qD,EAER+b,GAAUiwC,IACZZ,EAASY,EAAKrB,kBAAkBj7D,EAAMkH,EAAOoJ,EAAOmsD,IAAUf,IAGvC,IAArBx0D,EAAM81D,aAAyBtB,IAAWe,EAAMrlB,MAAQqlB,EAAMK,MAAQx1D,EAAS,aACjFJ,EAAM+1D,kBAGVC,gBAAiB,SAAyBl9D,EAAMkH,EAAOrK,EAAKsgE,GAC1D,IAEIC,EAFAxyD,EAAQzO,KAAKyP,OACb0wD,EAAO1xD,EAAM0xD,KAGjB,SAASr1D,EAAKlK,GACRA,EAAIuK,SAAStH,KACf+H,GAAQ6C,EACR7N,EAAIkK,KAAKjH,EAAMo9D,EAAWA,GAAY,IAAIC,GAASr9D,EAAMkH,EAAOrK,EAAKsgE,KAIrEhhE,KAAKi9D,cACPnyD,EAAK9K,MACDmgE,GAAQA,EAAKh1D,SAAStH,IAAOiH,EAAKq1D,KAG1CpzC,gBAAiB,SAAyBlpB,EAAMs9D,GAC9C,IAAInB,EAAahgE,KAAK+7D,YAClBC,EAASgE,EAAWhE,OACpBC,EAAU+D,EAAW/D,QAEzB,IAAK,IAAIv7D,KAAOk/D,EACd5D,EAAOt7D,IAAQs7D,EAAOt7D,IAAQ,IAAMk/D,EAAcl/D,GAAKmD,IAAS,GAAKs9D,EAGvElF,EAAQp4D,IAASo4D,EAAQp4D,IAAS,GAAKs9D,GAEzC5+D,QAAS,CACPs8D,YAAaA,EACbuC,YAAa,WACXjD,EAAWC,EAAYmB,EAASI,GAAY,EAC5C7B,EAAYC,EAAuBgB,EAAYC,EAAYC,EAAWC,EAAWC,EAAWC,EAAYC,EAAYC,EAAW,QAtTrI,SAASlxD,EAAQrD,GACf,IAAIrC,EAASm7B,EAASy1B,UAAUvuD,GAChC,OAAOrC,EAAO4G,cAAgBmY,EAAKk0C,WAAWjzD,EAAO4G,aAAa,OAGpE,SAASuvD,IACP,IAAI/2C,EAAOL,EAAKm0C,SAEhB,IAAK9zC,IAASA,EAAKm1C,YACjB,IAAK,IAAIn9D,EAAI,EAAGC,EAAI0nB,EAAKi0C,OAAOz7D,OAAQH,EAAIC,EAAGD,IAC7C,IAAKgoB,EAAOL,EAAKi0C,OAAO57D,IAAIm9D,YAAa,CACvCx1C,EAAKm0C,SAAWmC,EAAYj2C,EAC5B,OAMR,SAAS62C,EAAgB72C,EAAM/c,EAAOoJ,GACpC2T,EAAKg3C,kBAAkB,YAAa/zD,EAAOoJ,GA4G7C,SAASqsD,EAAe5/D,EAAK8H,EAAQ7E,EAAMkH,EAAOoJ,EAAOktD,EAAWC,GAClE,IACIC,EADAC,GAAU,EAGd,SAAS12D,EAAKlK,EAAKiD,GACjB,GAAIjD,EAAIuK,SAAStH,IAKf,GAJK09D,IACHA,EAAa,IAAIE,GAAW59D,EAAMkH,EAAOoJ,EAAOzL,GAAU9H,EAAKygE,EAAYltD,EAAM6G,SAASqmD,GAAa,OAGrGzgE,EAAIkK,KAAKjH,EAAM09D,KACjBhC,GAAS,EACLgC,EAAW/B,YAAWA,GAAY,GAClC+B,EAAWC,SAAS,OAAOA,GAAU,MAEtC,CACL,IAAIE,EAAWjC,EAAU57D,GACzB,GAAI69D,EAAU,OAAO52D,EAAKlK,EAAK8gE,IAInC,KAAO9gE,GAAOA,IAAQ0gE,IAChBx2D,EAAKlK,EAAKiD,IACdjD,EAAMA,EAAI4sB,QAGZ,OAAOg0C,EAGT,SAASd,EAAgB54C,EAAMu4C,EAASx8D,EAAMkH,EAAOoJ,EAAOktD,GAI1D,OAHAv5C,EAAKoG,SAASvD,SAAS9mB,GAEvB27D,EAAYD,GAAS,EACdJ,GAAYqB,EAAerB,EAAU,KAAMt7D,EAAMkH,EAAOoJ,EAAOktD,IAAchB,GAAWA,IAAYlB,IAAakB,EAAQrnC,aAAammC,IAAaqB,EAAeH,EAAS,KAAe,cAATx8D,EAAuB,YAAcA,EAAMkH,EAAOoJ,EAAOktD,EAAWlC,IAAaqB,EAAe14C,EAAMq3C,GAAYkB,GAAWv4C,EAAMjkB,EAAMkH,EAAOoJ,EAAOktD,MA2J/UxD,EAAap2C,EAAKhlB,OAAO,CAC3BkB,OAAQ,aACRf,WAAY,SAAoBsJ,EAAS62B,GACvC,KAAMA,aAAkBjkC,EAAO6iE,mBAAoB,CACjD,IAAIrtD,EAAOoJ,EAAKtY,KAAK5E,UAAW,GAChC,GAAI8T,EAAK6B,SAAU,MAAM,IAAI2L,MAAM,wDAA0D9iB,EAAKI,MAAMoB,UAAW,IACnHuiC,EAASv2B,GAAewC,UAAUsF,GAGpC,IAAI/H,EAAMvM,KAAKkkC,SAAWnB,EAAOt2B,WAAW,MAI5C,GAHAF,EAAI2e,OACJlrB,KAAKs7D,YAAc,GAEd,cAAcl5D,KAAKuJ,EAAW2D,aAAayzB,EAAQ,UAAW,CACjE,IAAI6+B,EAAc9iE,EAAOy8D,kBAAoB,EACzCsG,EAAoBv7B,EAAWsyB,YAAYrsD,EAAK,2BAA6B,EACjFvM,KAAKs7D,YAAcsG,EAAcC,EAGnCp6C,EAAKvnB,KAAKF,KAAMkM,EAAS62B,GACzB/iC,KAAK+nB,cAAe,GAEtBze,OAAQ,SAASA,IAGf,OAFAtJ,KAAKkkC,SAAS1Y,UAEPliB,EAAOxH,KAAK5B,KAAKF,OAE1Bw7D,gBAAiB,SAASA,EAAgB1sD,EAAOC,GAC/C,IAAIkc,EAAajrB,KAAKs7D,YAItB,GAFAE,EAAgB15D,KAAK5B,KAAKF,KAAM8O,EAAQmc,EAAYlc,EAASkc,GAE1C,IAAfA,EAAkB,CACpB,IAAItc,EAAU3O,KAAKq7D,SACf9uD,EAAMvM,KAAKkkC,SAEf,IAAKv4B,EAAW4D,aAAaZ,EAAS,UAAW,CAC/C,IAAI+Z,EAAQ/Z,EAAQ+Z,MACpBA,EAAM5Z,MAAQA,EAAQ,KACtB4Z,EAAM3Z,OAASA,EAAS,KAG1BxC,EAAIif,UACJjf,EAAI2e,OACJ3e,EAAIoN,MAAMsR,EAAYA,KAG1Bxe,WAAY,WACV,OAAOzM,KAAKkkC,UAEd6yB,aAAc,SAASA,EAAaziD,GAClC,IACIgxB,EADAv4B,EAAQnB,GAAMmB,MAGlB,GAAIA,GAASA,EAAM+0D,QACjBx8B,EAASyxB,EAAaj1D,KAAK5B,KAAKF,KAAMsU,OACjC,CACL,IAAI/H,EAAMvM,KAAKkkC,SACX69B,EAAWx1D,EAAIqjD,KACnBrjD,EAAIqjD,KAAOt7C,EAAO,SAClBgxB,EAASv3B,WAAWxB,EAAIqjD,MACxBrjD,EAAIqjD,KAAOmS,EAGb,OAAOz8B,GAET8qB,aAAc,SAAsBR,EAAMH,GACxC,IAAIljD,EAAMvM,KAAKkkC,SACX69B,EAAWx1D,EAAIqjD,KACf9gD,EAAQ,EACZvC,EAAIqjD,KAAOA,EAEX,IAAK,IAAI9vD,EAAI,EAAGC,EAAI0vD,EAAMxvD,OAAQH,EAAIC,EAAGD,IACvCgP,EAAQoC,KAAKC,IAAIrC,EAAOvC,EAAIy1D,YAAYvS,EAAM3vD,IAAIgP,OAIpD,OADAvC,EAAIqjD,KAAOmS,EACJjzD,GAET4tD,OAAQ,WACN,IAAK18D,KAAK+nB,aAAc,OAAO,EAC/B,IAAI7b,EAAUlM,KAAKkuB,SACf3hB,EAAMvM,KAAKkkC,SACX5vB,EAAOtU,KAAKy7D,UAIhB,OAHAlvD,EAAI64B,UAAU,EAAG,EAAG9wB,EAAKxF,MAAQ,EAAGwF,EAAKvF,OAAS,GAC9C7C,GAASA,EAAQ8e,KAAKze,EAAKvM,KAAKutB,QAASvtB,KAAKs7D,aAClDt7D,KAAK+nB,cAAe,GACb,KAGP4b,EAAQ3kC,EAAKyD,OAAO,CACtBkB,OAAQ,QACRf,WAAY,SAAemI,GACzB/K,KAAK+K,MAAQA,EACb/K,KAAK6D,KAAOkH,GAASA,EAAMlH,MAE7B27D,WAAW,EACXgC,SAAS,EACTV,eAAgB,WACd9gE,KAAKw/D,WAAY,EACjBx/D,KAAK+K,MAAM+1D,kBAEbmB,gBAAiB,WACfjiE,KAAKwhE,SAAU,EACfxhE,KAAK+K,MAAMk3D,mBAEb/2D,KAAM,WACJlL,KAAKiiE,kBACLjiE,KAAK8gE,kBAEPoB,aAAc,WACZ,OAAOliE,KAAK+K,MAAMo3D,WAEpBC,aAAc,WACZ,OAAOC,GAAIC,aAGXpB,GAAWv9B,EAAMlhC,OAAO,CAC1BkB,OAAQ,WACRf,WAAY,SAAkBiB,EAAMkH,EAAOrK,EAAKsgE,GAC9ChhE,KAAK6D,KAAOA,EACZ7D,KAAK+K,MAAQA,EACb/K,KAAKU,IAAMA,EACXV,KAAKghE,UAAYA,GAEnBv9D,SAAU,WACR,MAAO,YAAczD,KAAK6D,KAAO,YAAc7D,KAAKU,IAAM,kBAAoBV,KAAKghE,UAAY,iBAAmBhhE,KAAKoiE,eAAiB,QAGxIC,GAAM,IAAI,WACZ,IAiBIE,EACAC,EAlBAC,EAAY,CACd,KAAM,MACN,IAAK,QACL,KAAM,YACN,IAAQ,SACR,SAAY,QACZ,IAAO,SACP,IAAO,OACP,IAAO,UAELC,EAAa,CACf,IAAO,KACP,MAAS,IACT,MAAS,MAEPC,EAAS,GACTC,EAAU,GAGVN,EAAY,IAAItjE,EAAK,CACvBqtD,OAAO,EACPzR,SAAS,EACTioB,KAAK,EACLC,MAAM,EACNC,UAAU,EACVC,OAAO,IACN1gE,OAAO,CACR2gE,OAAQ,CACNzhE,IAAK,WACH,OAAOxB,KAAK6iE,MAGhB9nB,QAAS,CACPv5C,IAAK,WACH,IAAIuL,EAAQnB,IAASA,GAAMmB,MAC3B,OAAOA,GAASA,EAAMm2D,IAAMljE,KAAK8iE,KAAO9iE,KAAK46C,YAKnD,SAASuoB,EAAOp4D,GACd,IAAIrK,EAAMqK,EAAMrK,KAAOqK,EAAMq4D,cAE7B,OADA1iE,EAAM,OAAO0B,KAAK1B,GAAO2iE,OAAOC,aAAatS,SAAStwD,EAAI6/D,OAAO,GAAI,KAAO,cAAcn+D,KAAK1B,GAAOA,EAAI6/D,OAAO,GAAa,iBAAR7/D,GAA0BA,IAAQ7B,EAAYwkE,OAAOC,aAAav4D,EAAMw4D,SAAW7iE,EAClM+hE,EAAU/hE,KAASA,EAAIT,OAAS,EAAIjB,EAAKgL,UAAUtJ,GAAOA,EAAIsB,eAGvE,SAAS+E,EAAU45D,EAAMjgE,EAAKsgE,EAAWj2D,GACvC,IAEIzJ,EADAwmB,EAAOL,EAAKm0C,SAUhB,GARA+G,EAAOjiE,GAAOigE,EAEVA,EACFiC,EAAQliE,GAAOsgE,SAER4B,EAAQliE,GAGbA,EAAIT,OAAS,IAAMqB,EAAOtC,EAAK8K,SAASpJ,MAAS4hE,EAAW,CAC9DA,EAAUhhE,GAAQq/D,EAClB,IAAI5zD,EAAQnB,IAASA,GAAMmB,MAE3B,GAAa,SAATzL,GAAmByL,GAASA,EAAMm2D,IACpC,GAAIvC,EACF4B,EAAa,OACR,CACL,IAAK,IAAI94B,KAAK84B,EACR94B,KAAKm5B,GAAS77D,GAAU,EAAO0iC,EAAG84B,EAAW94B,GAAI1+B,GAGvDw3D,EAAa,WAGR5B,GAAQ4B,IACjBA,EAAW7hE,GAAOsgE,GAGhBl5C,GACFA,EAAKi5C,gBAAgBJ,EAAO,UAAY,QAAS51D,EAAOrK,EAAKsgE,GAyCjE,OArCAn9B,EAASp8B,IAAI1I,EAAU,CACrBykE,QAAS,SAAiBz4D,GACxB,IAAIrK,EAAMyiE,EAAOp4D,GACbgC,EAAQnB,IAASA,GAAMmB,MAEvBrM,EAAIT,OAAS,GAAK8M,GAASA,EAAMY,SAAW5C,EAAM04D,QAAU12D,EAAMm2D,KAAOn4D,EAAM24D,UAAY32D,EAAMm2D,KAAOn4D,EAAM44D,SAChH58D,GAAU,EAAMrG,EAAKgiE,EAAWhiE,KAASA,EAAIT,OAAS,EAAI,GAAKS,GAAMqK,GAErEy3D,EAAU9hE,GAGdkjE,SAAU,SAAkB74D,GAC1B,GAAIy3D,EAAS,CACX,IAAI9hE,EAAMyiE,EAAOp4D,GACbyD,EAAOzD,EAAM84D,SACb7C,EAAYxyD,GAAQ,GAAK60D,OAAOC,aAAa90D,GAAQ9N,EAAIT,OAAS,EAAI,GAAKS,EAE3EA,IAAQ8hE,IACV9hE,EAAMsgE,EAAUh/D,eAGlB+E,GAAU,EAAMrG,EAAKsgE,EAAWj2D,GAChCy3D,EAAU,OAGdsB,MAAO,SAAe/4D,GACpB,IAAIrK,EAAMyiE,EAAOp4D,GACbrK,KAAOkiE,GAAS77D,GAAU,EAAOrG,EAAKkiE,EAAQliE,GAAMqK,MAG5D84B,EAASp8B,IAAI3I,EAAQ,CACnB68B,KAAM,SAAc5wB,GAClB,IAAK,IAAIrK,KAAOkiE,EACd77D,GAAU,EAAOrG,EAAKkiE,EAAQliE,GAAMqK,MAInC,CACLu3D,UAAWA,EACXyB,OAAQ,SAAgBrjE,GACtB,QAASiiE,EAAOjiE,MAIlB+gE,GAAa99B,EAAMlhC,OAAO,CAC5BkB,OAAQ,aACRf,WAAY,SAAoBiB,EAAMkH,EAAOoJ,EAAOzL,EAAQ61B,GAC1Dv+B,KAAK6D,KAAOA,EACZ7D,KAAK+K,MAAQA,EACb/K,KAAKmU,MAAQA,EACbnU,KAAK0I,OAASA,EACd1I,KAAKu+B,MAAQA,GAEf96B,SAAU,WACR,MAAO,YAAczD,KAAK6D,KAAO,aAAe7D,KAAKmU,MAAQ,aAAenU,KAAK0I,QAAU1I,KAAKu+B,MAAQ,YAAcv+B,KAAKu+B,MAAQ,IAAM,gBAAkBv+B,KAAKoiE,eAAiB,QAGjL4B,GAAYrgC,EAAMlhC,OAAO,CAC3BkB,OAAQ,YACR0tB,MAAO,KACPzuB,WAAY,SAAmBu9D,EAAMt8D,EAAMkH,GACzC/K,KAAKmgE,KAAOA,EACZngE,KAAK6D,KAAOA,EACZ7D,KAAK+K,MAAQA,GAEfk5D,aAAc,SAAsB9vD,EAAO+vD,GACzC,OAAO/vD,IAAgB+vD,EAAYA,EAAUnhE,QAAU,OAEzD8b,SAAU,WACR,OAAO7e,KAAKikE,aAAajkE,KAAK0nC,OAAQ1nC,KAAKmgE,KAAKz4B,SAElD3oB,SAAU,SAAkB5K,GAC1BnU,KAAK0nC,OAASvzB,GAEhBgwD,aAAc,WACZ,OAAOnkE,KAAKikE,aAAajkE,KAAKokE,WAAYpkE,KAAKmgE,KAAKiE,aAEtDC,aAAc,SAAsBrF,GAClCh/D,KAAKokE,WAAapF,GAEpBsF,aAAc,WACZ,OAAOtkE,KAAKikE,aAAajkE,KAAKukE,WAAYvkE,KAAKmgE,KAAKoE,aAEtDC,aAAc,SAAsBzF,GAClC/+D,KAAKukE,WAAaxF,GAEpB0F,eAAgB,WACd,OAAKzkE,KAAK0kE,cAAgB1kE,KAAKmgE,KAAKiE,WAC3BpkE,KAAKmgE,KAAKz4B,OAAOjgC,IAAIzH,KAAKmgE,KAAKiE,YAAY/oD,OAAO,GAGpDrb,KAAK0kE,cAEdC,eAAgB,SAAwBC,GACtC5kE,KAAK0kE,aAAeE,GAEtBC,SAAU,WACR,OAAQ7kE,KAAK8kE,QAAU9kE,KAAKmgE,KAAKiE,WAAapkE,KAAKmgE,KAAKz4B,OAAO1sB,SAAShb,KAAKmgE,KAAKiE,YAAcpkE,KAAK8kE,QAEvGC,SAAU,SAAkBxmC,GAC1Bv+B,KAAK8kE,OAASvmC,GAEhBymC,SAAU,WACR,OAAOhlE,KAAKmgE,KAAK,mBAAmB/9D,KAAKpC,KAAK6D,MAAQ,aAAe,eAEvEohE,SAAU,SAAkBxtD,GAC1BzX,KAAKmgE,KAAK,mBAAmB/9D,KAAKpC,KAAK6D,MAAQ,YAAc,SAAW4T,GAE1EiT,QAAS,WACP,IAAK1qB,KAAKqxB,MAAO,CACf,IAAI01B,EAAS/mD,KAAKmgE,KAAK1wD,OAAOvD,QAAQ4oB,QAAQ90B,KAAK6e,YAEnD,GAAIkoC,EAAQ,CAIV,IAHA,IAAIr/C,EAAOq/C,EAAOr/C,KACdgmB,EAAShmB,EAAK8lB,QAEX,yBAAyBprB,KAAKsrB,EAAO/pB,SAC1C+D,EAAOgmB,EACPA,EAASA,EAAOF,QAGlBxtB,KAAKqxB,MAAQ3pB,GAIjB,OAAO1H,KAAKqxB,OAEdyV,QAAS,SAAiBp/B,GACxB1H,KAAKqxB,MAAQ3pB,GAEfjE,SAAU,WACR,MAAO,WAAazD,KAAK6D,KAAO,YAAc7D,KAAK6e,WAAa,YAAc7e,KAAKglE,WAAa,gBAAkBhlE,KAAKoiE,eAAiB,QAyGxIpjC,IAtGOxvB,EAAe/M,OAAO,CAC/BkB,OAAQ,OACR+L,MAAO,QACPC,WAAY,OACZlE,QAAS,CAAC,cAAe,YAAa,cAAe,cAAe,aAAc,eAAgB,gBAAiB,YAAa,WAChI7I,WAAY,SAAc8B,GACxB8K,EAAetP,KAAKF,MACpBA,KAAKklE,YAAc,EACnBllE,KAAKmlE,YAAc,EACnBnlE,KAAKK,IAAIqE,IAEX0gE,eAAgB,WACd,OAAOplE,KAAKqlE,cAEdC,eAAgB,SAAwBC,GACtCvlE,KAAKqlE,aAAeE,EAED,MAAfA,GAA4C,MAArBvlE,KAAKwlE,cAAwBD,EAAcvlE,KAAKwlE,eACzExlE,KAAKwlE,aAAeD,IAGxBE,eAAgB,WACd,OAAOzlE,KAAKwlE,cAEdE,eAAgB,SAAwBC,GACtC3lE,KAAKwlE,aAAeG,EAEK,MAArB3lE,KAAKqlE,cAAuC,MAAfM,GAAuBA,EAAc3lE,KAAKqlE,eACzErlE,KAAKqlE,aAAeM,IAGxBC,iBAAkB,WAChB,OAAO5lE,KAAKqlE,cAAgBrlE,KAAKwlE,aAAexlE,KAAKqlE,aAAe,MAEtEQ,iBAAkB,SAA0BC,GAC1C9lE,KAAKqlE,aAAerlE,KAAKwlE,aAAeM,GAE1ChH,kBAAmB,SAA2Bj7D,EAAMkH,EAAOoJ,EAAOmsD,GAChE10D,GAAQ5L,KAAKyP,OACT6wD,EAAMG,OAASzgE,KAAKmL,SAAStH,KAAOA,EAAO,aAC/C,IAAIo3C,EAAOqlB,EAAMrlB,MAAQqlB,EAAMG,KAC3Bt1D,EAAWnL,KAAKmL,SAAStH,GACzB0hE,EAAcvlE,KAAKulE,YACnBI,EAAc3lE,KAAK2lE,YACnBpG,GAAS,EACTY,EAAOngE,KAEX,SAAS08D,EAAO6I,EAAaI,GAC3B,IAAI5vC,EAAK5hB,EACL+vD,EAAYjpB,EAAOklB,EAAKz4B,OAASy4B,EAAKoE,YAAcxuC,EAExD,GAAIklB,EAAM,CACR,GAAIklB,EAAK+E,YAAc,GAAKnvC,EAAGjxB,OAAOo/D,GACpC,OAAO,EAGT,GAAIA,IAA6B,MAAfqB,GAAsC,MAAfI,GAAsB,CAC7D,IAAIlkC,EAAS1L,EAAG/a,SAASkpD,GACrB4B,EAAWrkC,EAAOnoB,YACtB,GAAIwsD,GAAYP,GAAe,GAAI,OAAO,EAEtCI,IACF5vC,EAAKmuC,EAAUz8D,IAAIg6B,EAAO7mB,UAAU1J,KAAKD,IAAI60D,EAAUH,MAI3DxF,EAAK+E,aAYP,OATA/E,EAAKz4B,OAAS3R,EACdoqC,EAAKiE,WAAaF,GAAanuC,EAE3BuqC,EAAMK,OACRR,EAAK+E,YAAc,EACnB/E,EAAKoE,WAAaxuC,EAClBoqC,EAAKgF,eAGA,EAGT,SAASr6D,IACHK,IACFo0D,EAASY,EAAKr1D,KAAKjH,EAAM,IAAImgE,GAAU7D,EAAMt8D,EAAMkH,KAAWw0D,GAIlE,GAAIe,EAAMK,KACRjE,IACA5xD,SACK,GAAIw1D,EAAMM,GACflE,EAAO,KAAMiJ,GACb76D,SACK,GAAIK,EACT,KAAOuxD,EAAO6I,EAAaI,IACzB76D,IAIJ,OAAOy0D,KAGCvgE,EAAKyD,OAAOwH,EAAS,CAC/BtG,OAAQ,QACRpB,QAAS,CACPwjE,QAAS,IAAI/mE,EAAK,CAChBgnE,OAAQ,SAAgB1tD,GACtB,OAAOA,GAET2tD,WAAY,SAAoB3tD,GAC9B,OAAOA,EAAIA,GAEb4tD,YAAa,SAAqB5tD,GAChC,OAAOA,GAAK,EAAIA,IAElB6tD,cAAe,SAAuB7tD,GACpC,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAS,GAAK,EAAIA,GAAKA,EAAlB,GAEhC8tD,YAAa,SAAqB9tD,GAChC,OAAOA,EAAIA,EAAIA,GAEjB+tD,aAAc,SAAsB/tD,GAClC,QAASA,EAAIA,EAAIA,EAAI,GAEvBguD,eAAgB,SAAwBhuD,GACtC,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,GAEzEiuD,YAAa,SAAqBjuD,GAChC,OAAOA,EAAIA,EAAIA,EAAIA,GAErBkuD,aAAc,SAAsBluD,GAClC,OAAO,KAAMA,EAAIA,EAAIA,EAAIA,GAE3BmuD,eAAgB,SAAwBnuD,GACtC,OAAOA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAMA,EAAIA,EAAIA,EAAIA,GAE7DouD,YAAa,SAAqBpuD,GAChC,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,GAEzBquD,aAAc,SAAsBruD,GAClC,OAAO,IAAMA,EAAIA,EAAIA,EAAIA,EAAIA,GAE/BsuD,eAAgB,SAAwBtuD,GACtC,OAAOA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAOA,EAAIA,EAAIA,EAAIA,EAAIA,MAI3E1V,WAAY,SAASo8B,EAAMwD,EAAQhkB,EAAMC,EAAIsgB,EAAUD,EAAQz5B,GAC7DrF,KAAKwiC,OAASA,EACd,IAAI3+B,SAAci7B,EACd+nC,EAAsB,aAAThjE,EACjB7D,KAAK6D,KAAOgjE,EAAahjE,EAAgB,WAATA,EAAoBi7B,EAAS,SAC7D9+B,KAAK8+B,OAAS+nC,EAAa/nC,EAASE,EAAM+mC,QAAQ/lE,KAAK6D,MACvD7D,KAAK++B,SAAWA,EAChB/+B,KAAKm/B,SAAU,EACfn/B,KAAK8mE,MAAQ,KACb9mE,KAAK+mE,WAAa,KAClB,IAAIC,EAAQxoD,GAAQC,EACpBze,KAAKinE,MAAQD,EAAQ1nE,OAAO6F,KAAK6hE,GAAS,GAC1ChnE,KAAKknE,YAAclnE,KAAKmnE,WAAWnnE,KAAKinE,OACxCjnE,KAAKonE,MAAQJ,GAAShnE,KAAKqnE,UAAU7oD,GACrCxe,KAAKsnE,IAAMN,GAAShnE,KAAKqnE,UAAU5oD,IAErB,IAAVpZ,GACFrF,KAAKqF,SAGTkiE,KAAM,SAAcT,GAElB,OADA9mE,KAAK8mE,MAAQA,EACN9mE,MAETqF,MAAO,WAGL,OAFArF,KAAK+mE,WAAa,KAClB/mE,KAAKm/B,SAAU,EACRn/B,MAETkL,KAAM,WAEJ,OADAlL,KAAKm/B,SAAU,EACRn/B,MAET08D,OAAQ,SAAgB8K,GACtB,GAAIxnE,KAAKm/B,QAAS,CACZqoC,GAAY,IACdA,EAAW,EACXxnE,KAAKm/B,SAAU,GASjB,IANA,IAAIiK,EAASppC,KAAK8+B,OAAO0oC,GACrBriE,EAAOnF,KAAKinE,MACZQ,EAAW,SAAkB3mE,GAC/B,MAAwB,mBAAVA,EAAuBA,EAAMsoC,EAAQo+B,GAAY1mE,GAGxDhB,EAAI,EAAGC,EAAIoF,GAAQA,EAAKlF,OAAQH,EAAIC,EAAGD,IAAK,CACnD,IAAIY,EAAMyE,EAAKrF,GACX0e,EAAOipD,EAASznE,KAAKonE,MAAM1mE,IAC3B+d,EAAKgpD,EAASznE,KAAKsnE,IAAI5mE,IACvBI,EAAQ0d,GAAQC,GAAMD,EAAKkpD,OAASjpD,EAAGipD,MAAQjpD,EAAGkpD,WAAWnpD,GAAMopD,WAAWx+B,GAAQs+B,MAAMlpD,IAASC,EAAKD,GAAQ4qB,EAAS5qB,EAE/Hxe,KAAK6nE,aAAa7nE,KAAKknE,YAAYxmE,GAAMI,GAGvCd,KAAKmL,SAAS,WAChBnL,KAAK8K,KAAK,SAAU,IAAI9L,EAAK,CAC3BwoE,SAAUA,EACVp+B,OAAQA,MAIPppC,KAAKm/B,SAAWn/B,KAAK8mE,OACxB9mE,KAAK8mE,MAAM9mE,KAAKwiC,QAIpB,OAAOxiC,MAETyL,QAAS,CACPq8D,SAAU,IAEZ7oC,aAAc,SAAsBC,GAClC,IAAI6oC,EAAY/nE,KAAK+mE,WACjBS,EAAWO,GAAa7oC,EAAO6oC,GAAa/nE,KAAK++B,SAAW,EAE3DgpC,IACH/nE,KAAK+mE,WAAa7nC,GAGpBl/B,KAAK08D,OAAO8K,IAEdH,UAAW,SAAmBL,GAI5B,IAHA,IAAI7hE,EAAOnF,KAAKinE,MACZlgB,EAAS,GAEJjnD,EAAI,EAAGC,EAAIoF,EAAKlF,OAAQH,EAAIC,EAAGD,IAAK,CAC3C,IAGIgB,EAHAJ,EAAMyE,EAAKrF,GACXg3B,EAAO92B,KAAKknE,YAAYxmE,GACxBma,EAAU7a,KAAKgoE,aAAalxC,GAGhC,GAAIkwC,EAAO,CACT,IAAIiB,EAAWjoE,KAAKkoE,cAAcrtD,EAASmsD,EAAMtmE,IAEjDV,KAAK6nE,aAAa/wC,EAAMmxC,GAGxBnnE,GADAA,EAAQd,KAAKgoE,aAAalxC,KACTh2B,EAAMiC,MAAQjC,EAAMiC,QAAUjC,EAE/Cd,KAAK6nE,aAAa/wC,EAAMjc,QAExB/Z,EAAQ+Z,GAAWA,EAAQ9X,MAAQ8X,EAAQ9X,QAAU8X,EAGvDksC,EAAOrmD,GAAOI,EAGhB,OAAOimD,GAETmhB,cAAe,SAAuBrtD,EAAS/Z,GAC7C,GAAIA,EAAO,CACT,GAAImE,MAAMC,QAAQpE,IAA2B,IAAjBA,EAAMb,OAAc,CAC9C,IAAIsnD,EAAWzmD,EAAM,GACrB,OAAOymD,GAAYA,EAASxlD,OAASwlD,EAASxlD,MAAM,eAAiB/B,KAAKmoE,WAAWttD,EAAS0sC,EAAS,GAAIzmD,EAAM,IAAMA,EAClH,GAAqB,iBAAVA,EAAoB,CACpC,IAAIiB,EAAQjB,EAAMiB,MAAM,iBAExB,GAAIA,EAAO,CACT,IAAIqmE,EAAS5/D,KAAKG,MAAM5G,EAAM,GAAG6H,QAAQ,kCAAmC,WAC5E,OAAO5J,KAAKmoE,WAAWttD,EAAS/Z,EAAM,GAAIsnE,KAKhD,OAAOtnE,GAETqnE,WAAY,SAAoB93D,EAAMk3C,EAAUh3C,GAC9C,OAAO3E,GAAMy8D,YAAYC,gBAAgBj4D,EAAMk3C,EAAUh3C,IAE3D42D,WAAY,SAAoBhiE,GAG9B,IAFA,IAAIijE,EAAS,GAEJtoE,EAAI,EAAGC,EAAIoF,EAAKlF,OAAQH,EAAIC,EAAGD,IAAK,CAC3C,IAAIY,EAAMyE,EAAKrF,GACXg3B,EAAOp2B,EAAIkJ,QAAQ,aAAc,OAAOA,QAAQ,4BAA6B,OACjFw+D,EAAO1nE,GAAOo2B,EAAKzhB,MAAM,KAG3B,OAAO+yD,GAETJ,aAAc,SAAsBlxC,EAAM1L,GAGxC,IAFA,IAAIxqB,EAAMZ,KAAKwiC,OAEN1iC,EAAI,EAAGC,EAAI+2B,EAAK72B,QAAUmrB,GAAU,GAAItrB,EAAIC,GAAKa,EAAKd,IAC7Dc,EAAMA,EAAIk2B,EAAKh3B,IAGjB,OAAOc,GAETinE,aAAc,SAAsB/wC,EAAMh2B,GACxC,IAAIE,EAAOhB,KAAKgoE,aAAalxC,EAAM,GAE/B91B,IACFA,EAAK81B,EAAKA,EAAK72B,OAAS,IAAMa,OAIhCynE,GACO,SAAiBhkE,GACxB,IAAIikE,EAAM,IAAI5pE,EAAK6pE,eA2BnB,OA1BAD,EAAIE,MAAMnkE,EAAQq/C,QAAU,OAAO/5C,cAAetF,EAAQokE,IAAK3pE,EAAKiE,KAAKsB,EAAQqkE,OAAO,IACpFrkE,EAAQskE,UAAUL,EAAIM,iBAAiBvkE,EAAQskE,UAEnDL,EAAIO,OAAS,WACX,IAAIC,EAASR,EAAIQ,OAEF,IAAXA,GAA2B,MAAXA,EACdzkE,EAAQ2oB,QACV3oB,EAAQ2oB,OAAOhtB,KAAKsoE,EAAKA,EAAIS,cAG/BT,EAAIU,WAIRV,EAAIU,QAAU,WACZ,IAAIF,EAASR,EAAIQ,OACbG,EAAU,mBAAqB5kE,EAAQokE,IAAM,cAAgBK,EAAS,IAE1E,IAAIzkE,EAAQ4oB,QAGV,MAAM,IAAIrL,MAAMqnD,GAFhB5kE,EAAQ4oB,QAAQg8C,EAASH,IAMtBR,EAAIY,KAAK,OAGhB58D,GAAiBxN,EAAKwE,QAAQgJ,eAAiB,CACjD68D,SAAU,GACVr6D,UAAW,SAAmBF,EAAOC,GACnC,IAAKjQ,EAAQ,OAAO,KACpB,IAAIikC,EACA7zB,GAAQ,EAES,iBAAVJ,IACTC,EAASD,EAAMC,OACfD,EAAQA,EAAMA,OAGZ9O,KAAKqpE,SAASppE,OAChB8iC,EAAS/iC,KAAKqpE,SAASvsC,OAEvBiG,EAAShkC,EAASq+D,cAAc,UAChCluD,GAAQ,GAGV,IAAI3C,EAAMw2B,EAAOt2B,WAAW,MAE5B,IAAKF,EACH,MAAM,IAAIuV,MAAM,UAAYihB,EAAS,uCAWvC,OARIA,EAAOj0B,QAAUA,GAASi0B,EAAOh0B,SAAWA,EAC1CG,GAAO3C,EAAI64B,UAAU,EAAG,EAAGt2B,EAAQ,EAAGC,EAAS,IAEnDg0B,EAAOj0B,MAAQA,EACfi0B,EAAOh0B,OAASA,GAGlBxC,EAAI2e,OACG6X,GAETt2B,WAAY,SAAoBqC,EAAOC,GACrC,IAAIg0B,EAAS/iC,KAAKgP,UAAUF,EAAOC,GACnC,OAAOg0B,EAASA,EAAOt2B,WAAW,MAAQ,MAE5CK,QAAS,SAAiBlM,GACxB,IAAImiC,EAASniC,GAAOA,EAAImiC,OAASniC,EAAImiC,OAASniC,EAE1CmiC,GAAUA,EAAOt2B,aACnBs2B,EAAOt2B,WAAW,MAAM+e,UACxBxrB,KAAKqpE,SAASvlE,KAAKi/B,MAIrBn2B,GAAY,IAAI,WAClB,IAGI08D,EACAC,EACAC,EACAC,EACA9jB,EACA+jB,EACAC,EACAC,EACAC,EACAC,EACAC,EAbA94D,EAAMC,KAAKD,IACXE,EAAMD,KAAKC,IACXwD,EAAMzD,KAAKyD,IAaf,SAASq1D,EAAOzxD,EAAGk5C,EAAGtuD,GACpB,MAAO,MAASoV,EAAI,KAAQk5C,EAAI,KAAQtuD,EAG1C,SAAS8mE,EAAO1xD,EAAGk5C,EAAGtuD,EAAGpD,GACvB,IAAIgY,EAAIhY,EAAIiqE,EAAOzxD,EAAGk5C,EAAGtuD,GAKrB+mE,GADAnqE,EAAIiqE,EAHRH,EAAKtxD,EAAIR,EACT+xD,EAAKrY,EAAI15C,EACTgyD,EAAK5mE,EAAI4U,GAEA9G,EAAI44D,EAAIC,EAAIC,IACjB3nD,EAAKjR,EAAI04D,EAAIC,EAAIC,GAErB,GAAIG,EAAK,EAAG,CACV,IAAIC,EAAMpqE,EAAImqE,EACdL,EAAK9pE,GAAK8pE,EAAK9pE,GAAKA,EAAIoqE,EACxBL,EAAK/pE,GAAK+pE,EAAK/pE,GAAKA,EAAIoqE,EACxBJ,EAAKhqE,GAAKgqE,EAAKhqE,GAAKA,EAAIoqE,EAG1B,GAAI/nD,EAAK,IAAK,CACZ,IAAIgoD,EAAK,IAAMrqE,EACXsqE,EAAMjoD,EAAKriB,EACf8pE,EAAK9pE,GAAK8pE,EAAK9pE,GAAKqqE,EAAKC,EACzBP,EAAK/pE,GAAK+pE,EAAK/pE,GAAKqqE,EAAKC,EACzBN,EAAKhqE,GAAKgqE,EAAKhqE,GAAKqqE,EAAKC,GAI7B,SAASC,EAAO/xD,EAAGk5C,EAAGtuD,GACpB,OAAOgO,EAAIoH,EAAGk5C,EAAGtuD,GAAK8N,EAAIsH,EAAGk5C,EAAGtuD,GAGlC,SAASonE,EAAOhyD,EAAGk5C,EAAGtuD,EAAGqV,GACvB,IAGIgyD,EAHAxX,EAAM,CAACz6C,EAAGk5C,EAAGtuD,GACbif,EAAKjR,EAAIoH,EAAGk5C,EAAGtuD,GACf+mE,EAAKj5D,EAAIsH,EAAGk5C,EAAGtuD,GAInBqnE,EAAqB,IAAhBv5D,EAFLi5D,EAAKA,IAAO3xD,EAAI,EAAI2xD,IAAOzY,EAAI,EAAI,EACnCrvC,EAAKA,IAAO7J,EAAI,EAAI6J,IAAOqvC,EAAI,EAAI,GACM,IAAhBtgD,EAAI+4D,EAAI9nD,GAAY,EAAI,EAAI,EAEjD4wC,EAAI5wC,GAAM4wC,EAAIkX,IAChBlX,EAAIwX,IAAOxX,EAAIwX,GAAMxX,EAAIkX,IAAO1xD,GAAKw6C,EAAI5wC,GAAM4wC,EAAIkX,IACnDlX,EAAI5wC,GAAM5J,GAEVw6C,EAAIwX,GAAMxX,EAAI5wC,GAAM,EAGtB4wC,EAAIkX,GAAM,EACVL,EAAK7W,EAAI,GACT8W,EAAK9W,EAAI,GACT+W,EAAK/W,EAAI,GAGX,IAAIyX,EAAQ,CACVrvD,SAAU,WACRyuD,EAAKlkB,EAAK2jB,EAAK,IACfQ,EAAKJ,EAAKH,EAAK,IACfQ,EAAKJ,EAAKH,EAAK,KAEjBkB,OAAQ,WACNb,EAAKlkB,EAAK2jB,EAAK3jB,EAAK2jB,EAAK,IACzBQ,EAAKJ,EAAKH,EAAKG,EAAKH,EAAK,IACzBQ,EAAKJ,EAAKH,EAAKG,EAAKH,EAAK,KAE3BmB,QAAS,WACPd,EAAKlkB,EAAK,IAAM,EAAIA,EAAK2jB,EAAK,IAAM,IAAM,GAAK,IAAM3jB,IAAO,IAAM2jB,GAAM,IACxEQ,EAAKJ,EAAK,IAAM,EAAIA,EAAKH,EAAK,IAAM,IAAM,GAAK,IAAMG,IAAO,IAAMH,GAAM,IACxEQ,EAAKJ,EAAK,IAAM,EAAIA,EAAKH,EAAK,IAAM,IAAM,GAAK,IAAMG,IAAO,IAAMH,GAAM,KAE1E,aAAc,WACZ,IAAIlxD,EAAIgxD,EAAK3jB,EAAK,IAClBkkB,EAAKvxD,EAAIqtC,GAAM,KAAO,IAAMA,IAAO,IAAM2jB,GAAM,IAAMhxD,GAAK,IAE1DwxD,GADAxxD,EAAIixD,EAAKG,EAAK,KACLA,GAAM,KAAO,IAAMA,IAAO,IAAMH,GAAM,IAAMjxD,GAAK,IAE1DyxD,GADAzxD,EAAIkxD,EAAKG,EAAK,KACLA,GAAM,KAAO,IAAMA,IAAO,IAAMH,GAAM,IAAMlxD,GAAK,KAE5D,aAAc,WACZuxD,EAAKP,EAAK,IAAM,EAAIA,EAAK3jB,EAAK,IAAM,IAAM,GAAK,IAAM2jB,IAAO,IAAM3jB,GAAM,IACxEmkB,EAAKP,EAAK,IAAM,EAAIA,EAAKG,EAAK,IAAM,IAAM,GAAK,IAAMH,IAAO,IAAMG,GAAM,IACxEK,EAAKP,EAAK,IAAM,EAAIA,EAAKG,EAAK,IAAM,IAAM,GAAK,IAAMH,IAAO,IAAMG,GAAM,KAE1E,cAAe,WACbE,EAAY,IAAPlkB,EAAW,EAAW,MAAP2jB,EAAa,IAAMr4D,EAAI,IAAK,IAAM00C,GAAM,IAAM2jB,IAClEQ,EAAY,IAAPJ,EAAW,EAAW,MAAPH,EAAa,IAAMt4D,EAAI,IAAK,IAAMy4D,GAAM,IAAMH,IAClEQ,EAAY,IAAPJ,EAAW,EAAW,MAAPH,EAAa,IAAMv4D,EAAI,IAAK,IAAM04D,GAAM,IAAMH,KAEpE,aAAc,WACZK,EAAY,MAAPlkB,EAAa,IAAa,IAAP2jB,EAAW,EAAIn4D,EAAI,EAAG,IAAmB,KAAZ,IAAMw0C,GAAY2jB,GACvEQ,EAAY,MAAPJ,EAAa,IAAa,IAAPH,EAAW,EAAIp4D,EAAI,EAAG,IAAmB,KAAZ,IAAMu4D,GAAYH,GACvEQ,EAAY,MAAPJ,EAAa,IAAa,IAAPH,EAAW,EAAIr4D,EAAI,EAAG,IAAmB,KAAZ,IAAMw4D,GAAYH,IAEzEoB,OAAQ,WACNf,EAAKlkB,EAAK2jB,EAAK3jB,EAAK2jB,EACpBQ,EAAKJ,EAAKH,EAAKG,EAAKH,EACpBQ,EAAKJ,EAAKH,EAAKG,EAAKH,GAEtBqB,QAAS,WACPhB,EAAKlkB,EAAK2jB,EAAK3jB,EAAK2jB,EACpBQ,EAAKJ,EAAKH,EAAKG,EAAKH,EACpBQ,EAAKJ,EAAKH,EAAKG,EAAKH,GAEtBsB,WAAY,YACVjB,EAAKlkB,EAAK2jB,GACD,IAAGO,GAAMA,IAClBC,EAAKJ,EAAKH,GACD,IAAGO,GAAMA,IAClBC,EAAKJ,EAAKH,GACD,IAAGO,GAAMA,IAEpBgB,UAAW,WACTlB,EAAKlkB,EAAK2jB,GAAM,IAAM3jB,EAAKA,GAAM,IACjCmkB,EAAKJ,EAAKH,GAAM,IAAMG,EAAKA,GAAM,IACjCK,EAAKJ,EAAKH,GAAM,IAAMG,EAAKA,GAAM,KAEnCqB,IAAK,WACHT,EAAOjB,EAAIC,EAAIC,EAAIc,EAAO3kB,EAAI+jB,EAAIC,IAClCM,EAAOJ,EAAIC,EAAIC,EAAIC,EAAOrkB,EAAI+jB,EAAIC,KAEpCsB,WAAY,WACVV,EAAO5kB,EAAI+jB,EAAIC,EAAIW,EAAOhB,EAAIC,EAAIC,IAClCS,EAAOJ,EAAIC,EAAIC,EAAIC,EAAOrkB,EAAI+jB,EAAIC,KAEpCuB,WAAY,WACVjB,EAAOtkB,EAAI+jB,EAAIC,EAAIK,EAAOV,EAAIC,EAAIC,KAEpCxrC,MAAO,WACLisC,EAAOX,EAAIC,EAAIC,EAAIQ,EAAOrkB,EAAI+jB,EAAIC,KAEpCliE,IAAK,WACHoiE,EAAK54D,EAAI00C,EAAK2jB,EAAI,KAClBQ,EAAK74D,EAAIy4D,EAAKH,EAAI,KAClBQ,EAAK94D,EAAI04D,EAAKH,EAAI,MAEpBxuD,SAAU,WACR6uD,EAAK14D,EAAIw0C,EAAK2jB,EAAI,GAClBQ,EAAK34D,EAAIu4D,EAAKH,EAAI,GAClBQ,EAAK54D,EAAIw4D,EAAKH,EAAI,IAEpB2B,QAAS,WACPtB,GAAMlkB,EAAK2jB,GAAM,EACjBQ,GAAMJ,EAAKH,GAAM,EACjBQ,GAAMJ,EAAKH,GAAM,GAEnB4B,SAAU,WACRvB,EAAK,IAAMl1D,EAAI,IAAM20D,EAAK3jB,GAC1BmkB,EAAK,IAAMn1D,EAAI,IAAM40D,EAAKG,GAC1BK,EAAK,IAAMp1D,EAAI,IAAM60D,EAAKG,KAG1B98D,EAAc7M,KAAK6M,YAAc7N,EAAK8D,KAAK,CAAC,cAAe,YAAa,aAAc,cAAe,mBAAoB,iBAAkB,kBAAmB,mBAAoB,UAAW,SAAU,OAAQ,QAAQ,SAAUuoE,GACnOrrE,KAAKqrE,IAAQ,IACZ,IACC9+D,EAAMC,GAAeC,WAAW,EAAG,GAEnCF,IACFvN,EAAK8D,KAAK2nE,GAAO,SAAUtgE,EAAMkhE,GAC/B,IAAIT,EAAkB,WAATS,EACT/pD,GAAK,EACT/U,EAAI2e,OAEJ,IACE3e,EAAI+tB,UAAYswC,EAAS,OAAS,OAClCr+D,EAAIoyB,SAAS,EAAG,EAAG,EAAG,GACtBpyB,EAAI2wB,yBAA2BmuC,EAE3B9+D,EAAI2wB,2BAA6BmuC,IACnC9+D,EAAI+tB,UAAYswC,EAAS,OAAS,OAClCr+D,EAAIoyB,SAAS,EAAG,EAAG,EAAG,GACtBrd,EAAK/U,EAAIg5B,aAAa,EAAG,EAAG,EAAG,GAAGzY,KAAK,KAAO89C,EAAS,IAAM,IAE/D,MAAOzmC,IAET53B,EAAIif,UACJ3e,EAAYw+D,GAAQ/pD,KAEtB9U,GAAeM,QAAQP,IAGzBvM,KAAKu9B,QAAU,SAAU8tC,EAAMC,EAAYC,EAAY7lC,EAAOta,GAC5D,IAAIogD,EAAYF,EAAWvoC,OACvB0hB,EAAkB,WAAT4mB,EAEb,GAAI5mB,GAAU53C,EAAYw+D,GACxBE,EAAWrgD,OACXqgD,EAAWpuC,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GACvCouC,EAAWtuC,YAAcyI,EACpB+e,IAAQ8mB,EAAWruC,yBAA2BmuC,GACnDE,EAAWpoC,UAAUqoC,EAAWpgD,EAAOhX,EAAGgX,EAAO/W,GACjDk3D,EAAW//C,cACN,CACL,IAAI+R,EAAUktC,EAAMY,GACpB,IAAK9tC,EAAS,OAKd,IAJA,IAAIkuC,EAAUF,EAAWhmC,aAAana,EAAOhX,EAAGgX,EAAO/W,EAAGm3D,EAAU18D,MAAO08D,EAAUz8D,QACjFxO,EAAMkrE,EAAQ3+C,KACdrsB,EAAM6qE,EAAW/lC,aAAa,EAAG,EAAGimC,EAAU18D,MAAO08D,EAAUz8D,QAAQ+d,KAElEhtB,EAAI,EAAGC,EAAIQ,EAAIN,OAAQH,EAAIC,EAAGD,GAAK,EAAG,CAC7CwpE,EAAK7oE,EAAIX,GACT6lD,EAAKplD,EAAIT,GACTypE,EAAK9oE,EAAIX,EAAI,GACb4pE,EAAKnpE,EAAIT,EAAI,GACb0pE,EAAK/oE,EAAIX,EAAI,GACb6pE,EAAKppE,EAAIT,EAAI,GACb2pE,EAAKhpE,EAAIX,EAAI,GACb8pE,EAAKrpE,EAAIT,EAAI,GACby9B,IACA,IAAI1a,EAAK4mD,EAAK/jC,EAAQ,IAClB1iB,EAAK,EAAIH,EACbtiB,EAAIT,GAAK+iB,EAAKgnD,EAAK7mD,EAAK2iC,EACxBplD,EAAIT,EAAI,GAAK+iB,EAAKinD,EAAK9mD,EAAK0mD,EAC5BnpE,EAAIT,EAAI,GAAK+iB,EAAKknD,EAAK/mD,EAAK2mD,EAC5BppE,EAAIT,EAAI,GAAK2pE,EAAK/jC,EAAQ1iB,EAAK4mD,EAGjC2B,EAAWplC,aAAaslC,EAASrgD,EAAOhX,EAAGgX,EAAO/W,MAIpDq3D,GAAa,IAAI,WACnB,IAAIC,EAAM,6BACNC,EAAQ,+BACRC,EAAQ,+BACRC,EAAqB,CACvBC,KAAMF,EACNA,MAAOD,EACPA,MAAOA,EAAQ,IACf,cAAeA,EAAQ,KAazB,SAASvrE,EAAI67D,EAAM8P,EAAY3kE,GAC7B,IAAK,IAAI/F,KAAQ0qE,EAAY,CAC3B,IAAIlrE,EAAQkrE,EAAW1qE,GACnB2qE,EAAYH,EAAmBxqE,GACd,iBAAVR,GAAsBuG,IAAWvG,EAAQuG,EAAUpD,OAAOnD,IAEjEmrE,EACF/P,EAAKgQ,eAAeD,EAAW3qE,EAAMR,GAErCo7D,EAAK7B,aAAa/4D,EAAMR,GAI5B,OAAOo7D,EAGT,MAAO,CACLyP,IAAKA,EACLC,MAAOA,EACPC,MAAOA,EACPxsE,OA9BF,SAAgB8sE,EAAKH,EAAY3kE,GAC/B,OAAOhH,EAAItB,EAASqtE,gBAAgBT,EAAKQ,GAAMH,EAAY3kE,IA8B3D7F,IA3BF,SAAa06D,EAAM56D,GACjB,IAAI2qE,EAAYH,EAAmBxqE,GAC/BR,EAAQmrE,EAAY/P,EAAKmQ,eAAeJ,EAAW3qE,GAAQ46D,EAAK5sD,aAAahO,GACjF,MAAiB,SAAVR,EAAmB,KAAOA,GAyBjCT,IAAKA,IAGLisE,GAAYttE,EAAK8D,KAAK,CACxBw2B,UAAW,CAAC,OAAQ,SACpB47B,SAAU,CAAC,YAAa,UACxB17B,YAAa,CAAC,SAAU,SACxB/N,YAAa,CAAC,eAAgB,UAC9BoP,UAAW,CAAC,iBAAkB,UAC9BF,WAAY,CAAC,kBAAmB,UAChCw6B,cAAe,CAAC,gBAAiB,SAAU,CACzCoX,KAAM,OACNC,MAAO,sBACN,SAAU9kE,EAAM5G,GACjB,OAAQA,IAAU4G,aAAgBw9B,GAAYx9B,aAAgBi4B,GAASj4B,aAAgBonD,KAEzF/zB,WAAY,CAAC,oBAAqB,UAClCI,UAAW,CAAC,mBAAoB,SAChCE,WAAY,CAAC,oBAAqB,UAClCk6B,WAAY,CAAC,cAAe,UAC5BC,WAAY,CAAC,cAAe,UAC5B5nC,SAAU,CAAC,YAAa,UACxBuiC,cAAe,CAAC,cAAe,SAAU,CACvC9/C,KAAM,QACN0K,OAAQ,SACRxK,MAAO,QAETmc,QAAS,CAAC,UAAW,UACrBD,UAAW,CAAC,iBAAkB,WAC7B,SAAUxmB,EAAOvF,GAClB,IAAI2B,EAAOrD,EAAK0K,WAAWhJ,GACvB6nD,EAAStiD,EAAM,GACnBjG,KAAKU,GAAO,CACVmD,KAAMoC,EAAM,GACZwmE,SAAU/rE,EACVgsE,UAAWzmE,EAAM,GACjB0mE,MAAOpkB,EACPqkB,QAASrkB,GAAUvpD,EAAK8D,KAAKylD,GAAQ,SAAUznD,EAAOQ,GACpDtB,KAAKc,GAASQ,IACb,IACHurE,aAAc5mE,EAAM,GACpBzE,IAAK,MAAQa,EACbhC,IAAK,MAAQgC,KAEd,IACH,IAAI,WACF,IAAIgF,EAEJ,SAASylE,EAAa5xD,EAAQ6xD,EAAahyD,GACzC,IAIM5G,EAJF64D,EAAQ,IAAIhuE,EACZiuE,EAAQ/xD,EAAO4J,iBAEfioD,IAGE7xD,EAAOgJ,gBAET/P,GADA+G,EAASA,EAAO8I,cACDS,kBAAkBwoD,GACjCA,EAAQ,MAER94D,EAAQ,IAAI2E,EAGdk0D,EAAMjyD,EAAS,KAAO,KAAO5G,EAAMC,EACnC44D,EAAMjyD,EAAS,KAAO,KAAO5G,EAAME,GAGrC,IAAK6G,EAAOqH,aAAc,CACxB,IAAImP,EAAaxW,EAAOwJ,YAExB,GAAIgN,EAAY,CACd,IAAIzQ,EAAQ,GACR5H,EAAQqY,EAAW3M,SACnBpL,EAAQ+X,EAAW1M,QACnBtC,EAAOgP,EAAWzM,QAClBgoD,IAAUA,EAAM92D,UAAU8K,EAAMnd,KAAK,aAAeuD,EAAU8M,MAAM84D,GAAS,KAC7E5zD,GAAO4H,EAAMnd,KAAK,UAAYuD,EAAUpD,OAAOoV,GAAS,KACvD7E,EAAU2B,OAAOwD,EAAMvF,EAAI,IAAOI,EAAU2B,OAAOwD,EAAMtF,EAAI,IAAI4M,EAAMnd,KAAK,SAAWuD,EAAU8M,MAAMwF,GAAS,KACjH+I,EAAKtO,GAAG6M,EAAMnd,KAAK,SAAWuD,EAAUpD,OAAOye,EAAKtO,GAAK,KACzDsO,EAAKrO,GAAG4M,EAAMnd,KAAK,SAAWuD,EAAUpD,OAAOye,EAAKrO,GAAK,KAC7D24D,EAAM/xD,UAAYgG,EAAM/c,KAAK,UAE7B8oE,EAAM/xD,UAAY,UAAYC,EAAOgH,YAAYhe,KAAK,KAAO,IAIjE,OAAO8oE,EAGT,SAASE,EAAYxlE,EAAMnD,GAKzB,IAJA,IAAIyoE,EAAQF,EAAaplE,EAAK6lB,SAC1BhF,EAAW7gB,EAAK0f,UAChB80C,EAAOwP,GAAWrsE,OAAO,IAAK2tE,EAAO3lE,GAEhCvH,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAAK,CAC/C,IAAIu1B,EAAQ9M,EAASzoB,GAEjBqtE,EAAYC,EAAW/3C,EAAO9wB,GAElC,GAAI4oE,EACF,GAAI93C,EAAMlG,aAAc,CACtB,IAAIyN,EAAO8uC,GAAWrsE,OAAO,YAC7Bu9B,EAAKw+B,YAAY+R,GACjB3mC,EAAcnR,EAAOuH,EAAM,QAC3B8uC,GAAWrrE,IAAI67D,EAAM,CACnB,YAAa,QAAUt/B,EAAKj1B,GAAK,WAGnCu0D,EAAKd,YAAY+R,GAKvB,OAAOjR,EAyDT,SAASmR,EAAY3lE,GACnB,IAAI7D,EAAO6D,EAAKm4B,MACZD,EAASl4B,EAAKq4B,QACditC,EAAQF,EAAaplE,EAAK6lB,SAAS,EAAe,cAAT1pB,GAE7C,GAAa,cAATA,EAAsB,CACxBA,EAAO,OACP,IAAIyQ,EAAO5M,EAAKo4B,MACZhxB,EAAQwF,EAAKxF,MACbC,EAASuF,EAAKvF,OAClBi+D,EAAM54D,GAAKtF,EAAQ,EACnBk+D,EAAM34D,GAAKtF,EAAS,EACpBi+D,EAAMl+D,MAAQA,EACdk+D,EAAMj+D,OAASA,EACX6wB,EAAOzpB,WAAUypB,EAAS,MAYhC,OATIA,IACW,WAAT/7B,EACFmpE,EAAMz0D,EAAIqnB,GAEVotC,EAAMpsC,GAAKhB,EAAO9wB,MAClBk+D,EAAMnsC,GAAKjB,EAAO7wB,SAIf28D,GAAWrsE,OAAOwE,EAAMmpE,EAAO3lE,GA8FxC,IAwCIE,EAxCA+lE,EAAY,CACdz/C,MAAOq/C,EACPpkE,MAAOokE,EACPn5C,OAjLF,SAAsBrsB,EAAMnD,GAC1B,IAAIyoE,EAAQF,EAAaplE,EAAK6lB,SAAS,GACnCjZ,EAAO5M,EAAKsX,UACZujB,EAAQ76B,EAAKg8B,WAMjB,OALAspC,EAAM54D,GAAKE,EAAKxF,MAAQ,EACxBk+D,EAAM34D,GAAKC,EAAKvF,OAAS,EACzBi+D,EAAMl+D,MAAQwF,EAAKxF,MACnBk+D,EAAMj+D,OAASuF,EAAKvF,OACpBi+D,EAAMjB,KAA8B,GAAvBxnE,EAAQgpE,aAAwBhrC,GAASA,EAAM9hC,KAAOiH,EAAK88B,YACjEknC,GAAWrsE,OAAO,QAAS2tE,EAAO3lE,IAyKzCstB,KAtKF,SAAoBjtB,EAAMnD,GACxB,IAAIipE,EAAcjpE,EAAQipE,YAE1B,GAAIA,EAAa,CACf,IAAIvtB,EAAQv4C,EAAK84B,SAAQ,GACzB,GAAIyf,EAAO,OAAOotB,EAAYptB,GAGhC,IAEIp8C,EAFAqjC,EAAWx/B,EAAKihC,UAChB1oC,EAASinC,EAASjnC,OAElB+sE,EAAQF,EAAaplE,EAAK6lB,SAE9B,GAAIigD,GAAevtE,GAAU,IAAMyH,EAAKigC,aACtC,GAAI1nC,EAAS,EAAG,CACd4D,EAAO6D,EAAKugC,QAAU,UAAY,WAGlC,IAFA,IAAIhnB,EAAQ,GAEHnhB,EAAI,EAAGA,EAAIG,EAAQH,IAC1BmhB,EAAMnd,KAAKuD,EAAU8M,MAAM+yB,EAASpnC,GAAG4nC,SAGzCslC,EAAM72C,OAASlV,EAAM/c,KAAK,SACrB,CACLL,EAAO,OACP,IAAIwB,EAAQ6hC,EAAS,GAAGQ,OACpBpkC,EAAM4jC,EAAS,GAAGQ,OACtBslC,EAAM3sE,IAAI,CACR+W,GAAI/R,EAAM+O,EACViI,GAAIhX,EAAMgP,EACVgD,GAAI/T,EAAI8Q,EACRkI,GAAIhZ,EAAI+Q,SAIZxQ,EAAO,OACPmpE,EAAMj1D,EAAIrQ,EAAKw1C,YAAY,KAAM34C,EAAQ+C,WAG3C,OAAOokE,GAAWrsE,OAAOwE,EAAMmpE,EAAO3lE,IAgItCs4B,MAAO0tC,EACP3vC,aAjGF,SAA4Bh2B,EAAMnD,GAChC,IAAIyoE,EAAQF,EAAaplE,EAAK6lB,SAC1BT,EAAOplB,EAAKw1C,YAAY,KAAM34C,EAAQ+C,WAE1C,OADIwlB,IAAMkgD,EAAMj1D,EAAI+U,GACb4+C,GAAWrsE,OAAO,OAAQ2tE,EAAO3lE,IA8FxC8hB,WA3FF,SAA0BzhB,EAAMnD,GAC9B,IAAIyoE,EAAQF,EAAaplE,EAAK6lB,SAAS,GACnCnE,EAAa1hB,EAAK2hB,YAClB6yC,EAAOx1B,EAActd,EAAY,UACjCqkD,EAAiBrkD,EAAWiI,MAC5BlhB,EAASs9D,EAAe19C,kBAgB5B,OAdKmsC,KACHA,EAAOwP,GAAWrsE,OAAO,SAAU,CACjCquE,QAASrmE,EAAUkN,UAAUpE,MAE1BirD,YAAYgS,EAAWK,EAAgBlpE,IAC5CiiC,EAAcpd,EAAY8yC,EAAM,WAGlC8Q,EAAMjB,KAAO,IAAM7P,EAAKv0D,GACxBqlE,EAAM54D,GAAKjE,EAAOiE,EAClB44D,EAAM34D,GAAKlE,EAAOkE,EAClB24D,EAAMl+D,MAAQqB,EAAOrB,MACrBk+D,EAAMj+D,OAASoB,EAAOpB,OACtBi+D,EAAMW,SAAW,UACVjC,GAAWrsE,OAAO,MAAO2tE,EAAO3lE,IAuEvCmoD,UAdF,SAAoB9nD,GAClB,IAAIw0D,EAAOwP,GAAWrsE,OAAO,OAAQytE,EAAaplE,EAAK6lB,SAAS,GAAOlmB,GAEvE,OADA60D,EAAK0R,YAAclmE,EAAKsnD,SACjBkN,IAcT,SAAS2R,EAAWnmE,EAAMw0D,EAAM90D,GAC9B,IAAI4lE,EAAQ,GACRt/C,GAAUtmB,GAAUM,EAAK+qB,YACzB/J,EAAQ,GAuBZ,OAtBkB,MAAdhhB,EAAK9D,QAAeopE,EAAMrlE,GAAKD,EAAK9D,OACxC5E,EAAK8D,KAAKwpE,IAAW,SAAUrmE,GAC7B,IAAIzE,EAAMyE,EAAMzE,IACZqC,EAAOoC,EAAMpC,KACb/C,EAAQ4G,EAAKlG,KAEjB,GAAIyE,EAAM4mE,aAAe5mE,EAAM4mE,aAAanlE,EAAM5G,IAAU4sB,IAAW1uB,EAAK8F,OAAO4oB,EAAOlsB,KAAQV,GAAQ,CACxG,GAAa,UAAT+C,GAA6B,MAAT/C,EAAe,CACrC,IAAI4kC,EAAQ5kC,EAAM+xD,WACdntB,EAAQ,IAAGsnC,EAAM/mE,EAAMymE,UAAY,YAAchnC,GAG1C,UAAT7hC,EACF6kB,EAAM5kB,KAAKmC,EAAMymE,UAAY,KAAO5rE,GAEpCksE,EAAM/mE,EAAMymE,WAAsB,MAAT5rE,EAAgB,OAAkB,UAAT+C,EAAmB/C,EAAM4vD,SA1FnF,SAAwB1yB,GACtB,IAAI8vC,EAAepnC,EAAc1I,EAAO,SAExC,IAAK8vC,EAAc,CACjB,IAIId,EAJAtc,EAAW1yB,EAAM+vC,cACjBvb,EAAS9B,EAASgD,QAClBJ,EAASt1B,EAAMgwC,YACfza,EAAcv1B,EAAMiwC,iBAGxB,GAAIzb,EAAQ,CACVwa,EAAQ,CACNjsC,GAAIuyB,EAAOl/C,EACX4sB,GAAIsyB,EAAOj/C,EACXkE,EAAG+6C,EAAO54C,YAAY64C,IAExB,IAAIC,EAAYx1B,EAAMkwC,eAElB1a,IACFwZ,EAAMj2D,GAAKy8C,EAAUp/C,EACrB44D,EAAMmB,GAAK3a,EAAUn/C,QAGvB24D,EAAQ,CACN51D,GAAIk8C,EAAOl/C,EACXiI,GAAIi3C,EAAOj/C,EACXgD,GAAIk8C,EAAYn/C,EAChBkI,GAAIi3C,EAAYl/C,GAIpB24D,EAAMoB,cAAgB,iBACtBN,EAAepC,GAAWrsE,QAAQmzD,EAAS,SAAW,UAAY,WAAYwa,EAAO3lE,GAGrF,IAFA,IAAIkrD,EAAQ7B,EAAS2C,OAEZvzD,EAAI,EAAGC,EAAIwyD,EAAMtyD,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIoL,EAAOqnD,EAAMzyD,GACbuuE,EAAYnjE,EAAK4oD,OACjBpuB,EAAQ2oC,EAAUxb,WAClBznC,EAASlgB,EAAKstC,QAClBw0B,EAAQ,CACN5hD,OAAkB,MAAVA,EAAiBtrB,GAAKC,EAAI,GAAKqrB,GAErCijD,IAAWrB,EAAM,cAAgBqB,EAAUnb,OAAM,IACjDxtB,EAAQ,IAAGsnC,EAAM,gBAAkBtnC,GACvCooC,EAAa1S,YAAYsQ,GAAWrsE,OAAO,OAAQ2tE,EAAO3lE,IAG5Dm/B,EAAcxI,EAAO8vC,EAAc,SAGrC,MAAO,QAAUA,EAAanmE,GAAK,IAuCyD2mE,CAAextE,GAAeA,EAAMoyD,OAAM,GAAiB,UAATrvD,EAAmB/C,EAAMoD,KAAK,KAAgB,WAATL,EAAoBoC,EAAM0mE,MAAM7rE,GAASA,MAIxN4nB,EAAMzoB,SAAQ+sE,EAAMtkD,MAAQA,EAAMxkB,KAAK,MACrB,IAAlB8oE,EAAMtgD,gBAAsBsgD,EAAMtgD,QACjChlB,EAAKqkB,WAAUihD,EAAMuB,WAAa,UAChC7C,GAAWrrE,IAAI67D,EAAM8Q,EAAO3lE,GAKrC,SAASq/B,EAAch/B,EAAM7D,GAK3B,OAJK0D,IAAaA,EAAc,CAC9ByhB,IAAK,GACLwlD,KAAM,KAED9mE,GAAQH,EAAYinE,KAAK3qE,EAAO,KAAO6D,EAAKhE,KAAOgE,EAAK+mE,OAAS/mE,EAAK+mE,KAAO91D,EAAInX,IAAI,UAG9F,SAASglC,EAAc9+B,EAAMw0D,EAAMr4D,GAC5B0D,GAAam/B,IAClB,IAAIgoC,EAASnnE,EAAYyhB,IAAInlB,IAAS0D,EAAYyhB,IAAInlB,IAAS,GAAK,EACpEq4D,EAAKv0D,GAAK9D,EAAO,IAAM6qE,EACvBnnE,EAAYinE,KAAK3qE,EAAO,KAAO6D,EAAKhE,KAAOgE,EAAK+mE,OAASvS,EAG3D,SAASyS,EAAkBzS,EAAM33D,GAC/B,IAAIonE,EAAMzP,EACN0S,EAAO,KAEX,GAAIrnE,EAAa,CAGf,IAAK,IAAIzH,KAFT6rE,EAAsC,QAAhCzP,EAAKwC,SAAS18D,eAA2Bk6D,EAEjC30D,EAAYinE,KACnBI,IACEjD,IACHA,EAAMD,GAAWrsE,OAAO,QACpB+7D,YAAYc,GAGlB0S,EAAOjD,EAAIkD,aAAanD,GAAWrsE,OAAO,QAASssE,EAAImD,aAGzDF,EAAKxT,YAAY7zD,EAAYinE,KAAK1uE,IAGpCyH,EAAc,KAGhB,OAAOhD,EAAQ0C,UAAW,IAAIrI,EAAKmwE,eAAgBC,kBAAkBrD,GAAOA,EAG9E,SAASyB,EAAW1lE,EAAMnD,EAAS6C,GACjC,IAAI6nE,EAAW3B,EAAU5lE,EAAK/D,QAC1Bu4D,EAAO+S,GAAYA,EAASvnE,EAAMnD,GAEtC,GAAI23D,EAAM,CACR,IAAIgT,EAAW3qE,EAAQ2qE,SACnBA,IAAUhT,EAAOgT,EAASxnE,EAAMw0D,EAAM33D,IAAY23D,GACtD,IAAIpvC,EAAOtkB,KAAKC,UAAUf,EAAKO,OAC3B6kB,GAAiB,OAATA,GAA0B,SAATA,GAAiBovC,EAAK7B,aAAa,kBAAmBvtC,GAGrF,OAAOovC,GAAQ2R,EAAWnmE,EAAMw0D,EAAM90D,GAGxC,SAAS+nE,EAAW5qE,GAGlB,OAFKA,IAASA,EAAU,IACxB8C,EAAY,IAAItD,EAAUQ,EAAQ+C,WAC3B/C,EAGTsE,EAAKvG,OAAO,CACV8sE,UAAW,SAAmB7qE,GAE5B,OAAOoqE,EAAkBvB,EAAWptE,KADpCuE,EAAU4qE,EAAW5qE,IAC8B,GAAOA,MAG9DqK,EAAQtM,OAAO,CACb8sE,UAAW,SAAmB7qE,GAC5BA,EAAU4qE,EAAW5qE,GACrB,IAAIgkB,EAAWvoB,KAAKonB,UAChBU,EAAO9nB,KAAKoO,UACZ+B,EAASnR,EAAKiE,KAAKsB,EAAQ4L,OAAQ,QACnCiS,EAAK7d,EAAQ2W,QAAqB,SAAX/K,GAAqB2X,EAAKyF,QACjDrS,EAASkH,GAAMf,EAAOjc,KAAK,CAACgd,IAC5BhS,EAAkB,SAAXD,EAAoB,IAAIsL,EAAW,CAAC,EAAG,GAAIqM,EAAKk1C,eAA4B,YAAX7sD,EAAuBtH,EAAK+nB,WAAWrI,EAAUrN,EAAQ,CACnI8U,QAAQ,IACP5f,KAAOqL,EAAWrW,KAAK,CAAC+K,GAAS,EAAG,CACrCxK,UAAU,IAERqnE,EAAQ,CACVn/D,QAAS,MACT+9D,MAAOF,GAAWC,IAClB,cAAeD,GAAWG,OAGxBz7D,IACF48D,EAAMl+D,MAAQsB,EAAKtB,MACnBk+D,EAAMj+D,OAASqB,EAAKrB,QAChBqB,EAAKgE,GAAgB,IAAXhE,EAAKgE,GAAWhE,EAAKiE,GAAgB,IAAXjE,EAAKiE,KAAS24D,EAAMU,QAAUrmE,EAAUkN,UAAUnE,KAG5F,IAAI8rD,EAAOwP,GAAWrsE,OAAO,MAAO2tE,EAAO3lE,GACvCqmB,EAASwuC,EAEThhD,IAAWA,EAAOqH,eACpBmL,EAASwuC,EAAKd,YAAYsQ,GAAWrsE,OAAO,IAAKytE,EAAa5xD,GAAS7T,KAGzE,IAAK,IAAIvH,EAAI,EAAGC,EAAIwoB,EAAStoB,OAAQH,EAAIC,EAAGD,IAC1C4tB,EAAO0tC,YAAYgS,EAAW7kD,EAASzoB,GAAIyE,GAAS,IAGtD,OAAOoqE,EAAkBzS,EAAM33D,OAIrC,IAAI,WACF,IACI8qE,EADA9nE,EAAc,GAGlB,SAASkgE,EAASvL,EAAM56D,EAAMoK,EAAU4jE,EAAWC,EAAcC,GAC/D,IAAI1uE,EAAQ4qE,GAAWlqE,IAAI06D,EAAM56D,IAASkuE,EACtC5tE,EAAe,MAATd,EAAgBwuE,EAAY,KAAO5jE,EAAW,GAAK,EAAIA,EAAW5K,EAAQiN,WAAWjN,GAC/F,MAAO,QAAQsB,KAAKtB,GAASc,EAAM,KAAO2tE,EAAe,EAAIF,EAAS,WAAWjtE,KAAKd,GAAQ,QAAU,WAAaM,EAGvH,SAASid,EAASq9C,EAAM9nD,EAAGC,EAAGi7D,EAAWC,EAAcE,EAAUC,GAG/D,OAFAt7D,EAAIqzD,EAASvL,EAAM9nD,GAAK,KAAK,EAAOk7D,EAAWC,EAAcE,GAC7Dp7D,EAAIozD,EAASvL,EAAM7nD,GAAK,KAAK,EAAOi7D,EAAWC,EAAcG,IACtDJ,GAAmB,MAALl7D,GAAkB,MAALC,EAAoB,IAAIyE,EAAM1E,EAAGC,GAApB,KAGjD,SAAS2K,EAAQk9C,EAAM3lD,EAAGiJ,EAAG8vD,EAAWC,GAGtC,OAFAh5D,EAAIkxD,EAASvL,EAAM3lD,GAAK,SAAS,EAAO+4D,EAAWC,GACnD/vD,EAAIioD,EAASvL,EAAM18C,GAAK,UAAU,EAAO8vD,EAAWC,IAC7CD,GAAmB,MAAL/4D,GAAkB,MAALiJ,EAAoB,IAAI9B,EAAKnH,EAAGiJ,GAAnB,KAGjD,SAASmwD,EAAa7uE,EAAO+C,EAAM0kD,GACjC,MAAiB,SAAVznD,EAAmB,KAAgB,WAAT+C,EAAoBkK,WAAWjN,GAAkB,UAAT+C,EAAmB/C,EAAQA,EAAMuU,MAAM,WAAWu6D,IAAI7hE,YAAc,GAAc,UAATlK,EAAmB6iC,EAAc5lC,IAAUA,EAAiB,WAAT+C,EAAoB0kD,EAAOznD,GAASA,EAG3O,SAAS+uE,EAAY3T,EAAMr4D,EAAMU,EAAS6C,GACxC,IAAI0oE,EAAQ5T,EAAK6T,WACbC,EAAkB,aAATnsE,EACTosE,EAAkB,SAATpsE,EACT6D,EAAO,IAAImmB,EACX3hB,EAAUxE,EAAKwmB,SACfgiD,EAAehkE,EAAQqb,cACvBgB,EAAW,GAOf,GALKynD,GAAWC,IACdvoE,EAAOyoE,EAAgBzoE,EAAMw0D,EAAM90D,GACnC8E,EAAQqb,cAAgB7f,EAAK+lB,OAAO1qB,SAGlCqE,EAGF,IAFA,IAAIwnE,EAAO1S,EAAKkU,iBAAiB,QAExBtwE,EAAI,EAAGC,EAAI6uE,EAAK3uE,OAAQH,EAAIC,EAAGD,IACtCuwE,EAAWzB,EAAK9uE,GAAIyE,GAAS,GAIjC,IAASzE,EAAI,EAAGC,EAAI+vE,EAAM7vE,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IACIu1B,EADA83C,EAAY2C,EAAMhwE,GAEK,IAAvBqtE,EAAU7V,UAAmB,UAAUl1D,KAAK+qE,EAAUzO,aAAcrpC,EAAQg7C,EAAWlD,EAAW5oE,GAAS,KAAa8wB,aAAiBoR,GAAmBle,EAASzkB,KAAKuxB,GAYhL,OATA3tB,EAAKqrB,YAAYxK,GACbynD,IAAQtoE,EAAOyoE,EAAgBzoE,EAAKmwB,SAAUqkC,EAAM90D,IACxD8E,EAAQqb,cAAgB2oD,GAEpBF,GAAUC,KACZvoE,EAAK4B,SACL5B,EAAO,MAGFA,EAGT,SAAS4oE,EAAWpU,EAAMr4D,GAIxB,IAHA,IAAIygB,EAAS43C,EAAK5sD,aAAa,UAAUvN,MAAM,8CAC3Co0B,EAAS,GAEJr2B,EAAI,EAAGC,EAAIukB,EAAOrkB,OAAQH,EAAIC,EAAGD,GAAK,EAC7Cq2B,EAAOryB,KAAK,IAAIgV,EAAM/K,WAAWuW,EAAOxkB,IAAKiO,WAAWuW,EAAOxkB,EAAI,MAGrE,IAAIg3B,EAAO,IAAInC,EAAKwB,GAEpB,MADa,YAATtyB,GAAoBizB,EAAK4H,YACtB5H,EAOT,SAASy5C,EAAerU,EAAMr4D,GAC5B,IAEI6sD,EAFA/oD,GAAM8/D,EAASvL,EAAM,QAAQ,IAAS,IAAIz6D,UAAU,GACpD+wD,EAAkB,mBAAT3uD,EAGb,GAAI8D,GACF+oD,EAAWnpD,EAAYI,GAAIomE,eAEdra,QAAUlB,KACrB9B,EAAWA,EAAS3tD,SACX2wD,QAAUlB,OAEhB,CAIL,IAHA,IAAIsd,EAAQ5T,EAAK6T,WACbxd,EAAQ,GAEHzyD,EAAI,EAAGC,EAAI+vE,EAAM7vE,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIu1B,EAAQy6C,EAAMhwE,GACK,IAAnBu1B,EAAMiiC,UAAgB/E,EAAMzuD,KAAKqsE,EAAgB,IAAI5b,EAAgBl/B,IAG3Eq7B,EAAW,IAAIsB,EAASO,EAAOC,GAGjC,IAAIc,EACAC,EACAC,EACAgd,EAA0D,mBAA1C/I,EAASvL,EAAM,iBAAiB,GAapD,OAXI1J,GAEFe,GADAD,EAASz0C,EAASq9C,EAAM,KAAM,MAAM,EAAOsU,EAAe,MAAO,QAC5C/oE,IAAIggE,EAASvL,EAAM,KAAK,GAAO,EAAOsU,EAAe,OAAQ,GAClFhd,EAAY30C,EAASq9C,EAAM,KAAM,MAAM,EAAMsU,KAE7Cld,EAASz0C,EAASq9C,EAAM,KAAM,MAAM,EAAOsU,EAAe,KAAM,MAChEjd,EAAc10C,EAASq9C,EAAM,KAAM,MAAM,EAAOsU,EAAe,OAAQ,OAG7DL,EAAgB,IAAIxqC,EAAM+qB,EAAU4C,EAAQC,EAAaC,GAAY0I,GAC3EuU,eAAiBD,EAChB,KAGT,IAAIE,EAAY,CACd,YAAa,SAAkBxU,EAAMr4D,EAAMU,EAAS6C,GAGlD,IAFA,IAAI0oE,EAAQ5T,EAAK6T,WAERjwE,EAAI,EAAGC,EAAI+vE,EAAM7vE,OAAQH,EAAIC,EAAGD,IAAK,CAC5C,IAAIu1B,EAAQy6C,EAAMhwE,GAClB,GAAuB,IAAnBu1B,EAAMiiC,SAAgB,OAAO+Y,EAAWh7C,EAAO9wB,EAAS6C,KAGhEqqD,EAAGoe,EACHlE,IAAKkE,EACLc,SAAUd,EACVe,QAASN,EACTO,SAAUP,EACVx5C,KA7DF,SAAoBolC,GAClB,OAAOh3B,EAAS7lC,OAAO68D,EAAK5sD,aAAa,OA6DzCwhE,eAAgBP,EAChBQ,eAAgBR,EAChBhuC,MAAO,SAAe25B,GACpB,IAAIpoC,EAAS,IAAIC,EAAO0zC,EAASvL,EAAM,QAAQ,IAQ/C,OAPApoC,EAAO5pB,GAAG,QAAQ,WAChB,IAAIoK,EAAO0K,EAAQk9C,GACnBl8D,KAAKmf,QAAQ7K,GACb,IAAIyG,EAAS8D,EAASq9C,GAAMz0D,IAAI6M,EAAK+G,OAAO,IAE5Crb,KAAKutB,QAAQhkB,QAAO,IAAI8X,GAASmB,UAAUzH,OAEtC+Y,GAET/F,OAAQ,SAAgBmuC,EAAMr4D,EAAMU,EAAS6C,GAC3C,OAAO,IAAIq/B,EAAiBopC,EAAY3T,EAAMr4D,EAAMU,EAAS6C,IAAS,IAExEwnE,KAAMiB,EACNmB,IAAK,SAAa9U,GAChB,IAAIv0D,GAAM8/D,EAASvL,EAAM,QAAQ,IAAS,IAAIz6D,UAAU,GACpD2nB,EAAa7hB,EAAYI,GACzBwM,EAAQ0K,EAASq9C,GACrB,OAAO9yC,EAAaA,aAAsBqd,EAAmBrd,EAAW4d,MAAM7yB,GAASiV,EAAWrmB,QAAQyf,UAAUrO,GAAS,MAE/H88D,OAAQ,SAAgB/U,GACtB,OAAO,IAAIv8B,EAAMsC,OAAOpjB,EAASq9C,EAAM,KAAM,MAAOuL,EAASvL,EAAM,OAErE/5B,QAAS,SAAiB+5B,GACxB,OAAO,IAAIv8B,EAAMuC,QAAQ,CACvBnnB,OAAQ8D,EAASq9C,EAAM,KAAM,MAC7Bt8B,OAAQ5gB,EAAQk9C,EAAM,KAAM,SAGhC9rD,KAAM,SAAc8rD,GAClB,OAAO,IAAIv8B,EAAM/K,UAAU,IAAInZ,EAAWoD,EAASq9C,GAAOl9C,EAAQk9C,IAAQl9C,EAAQk9C,EAAM,KAAM,QAEhGp2C,KAAM,SAAco2C,GAClB,OAAO,IAAIvnC,EAAKrP,KAAKzG,EAASq9C,EAAM,KAAM,MAAOr9C,EAASq9C,EAAM,KAAM,QAExEgV,KAAM,SAAchV,GAClB,IAAIgV,EAAO,IAAI1hB,EAAU3wC,EAASq9C,GAAMz0D,IAAIoX,EAASq9C,EAAM,KAAM,QAEjE,OADAgV,EAAKhiB,WAAWgN,EAAK0R,YAAY3c,QAAU,IACpCigB,GAETC,OAAQtB,GAGV,SAASuB,EAAe1pE,EAAM5G,EAAOQ,EAAM46D,GACzC,GAAIx0D,EAAKuT,UAAW,CAIlB,IAHA,IAAIo2D,GAAcnV,EAAK5sD,aAAahO,IAAS,IAAI+T,MAAM,UACnD6F,EAAS,IAAImG,EAERvhB,EAAI,EAAGC,EAAIsxE,EAAWpxE,OAAQH,EAAIC,EAAGD,IAAK,CACjD,IAAImb,EAAYo2D,EAAWvxE,GAC3B,IAAKmb,EAAW,MAKhB,IAJA,IAAIgG,EAAQhG,EAAU5F,MAAM,SACxB0lC,EAAU95B,EAAM,GAChBrT,EAAIqT,EAAM,GAAG5L,MAAM,WAEdjC,EAAI,EAAGsD,EAAI9I,EAAE3N,OAAQmT,EAAIsD,EAAGtD,IACnCxF,EAAEwF,GAAKrF,WAAWH,EAAEwF,IAGtB,OAAQ2nC,GACN,IAAK,SACH7/B,EAAO3R,OAAO,IAAI8X,EAAOzT,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,KACzD,MAEF,IAAK,SACHsN,EAAOJ,OAAOlN,EAAE,GAAIA,EAAE,IAAM,EAAGA,EAAE,IAAM,GACvC,MAEF,IAAK,YACHsN,EAAOsH,UAAU5U,EAAE,GAAIA,EAAE,IAAM,GAC/B,MAEF,IAAK,QACHsN,EAAOvB,MAAM/L,GACb,MAEF,IAAK,QACHsN,EAAOwH,KAAK9U,EAAE,GAAI,GAClB,MAEF,IAAK,QACHsN,EAAOwH,KAAK,EAAG9U,EAAE,KAKvBlG,EAAKuT,UAAUC,IAInB,SAASo2D,EAAa5pE,EAAM5G,EAAOQ,GACjC,IAAIZ,EAAe,iBAATY,EAA0B,eAAiB,iBACjD08B,EAAQt2B,EAAKhH,IAAQgH,EAAKhH,KAC1Bs9B,GAAOA,EAAM80B,SAAS/kD,WAAWjN,IAGvC,IAAIkrE,EAAahtE,EAAKqB,IAAIrB,EAAK8D,KAAKwpE,IAAW,SAAUrmE,GACvDjG,KAAKiG,EAAMymE,WAAa,SAAUhlE,EAAM5G,GACtC,GAAI4G,EAAKzB,EAAM5F,OACbqH,EAAKzB,EAAM5F,KAAKsvE,EAAa7uE,EAAOmF,EAAMpC,KAAMoC,EAAM2mE,UAEnC,UAAf3mE,EAAMpC,MAAkB,CAC1B,IAAIm6B,EAAQt2B,EAAKzB,EAAMzE,OAEvB,GAAIw8B,GACEA,EAAMyyC,eAAgB,CACxB,IAAItgE,EAASzI,EAAKwI,YAClB8tB,EAAM/iB,WAAU,IAAIoG,GAASmB,UAAUrS,EAAO0O,YAAYlF,MAAMxJ,EAAO6O,iBAMhF,IAAK,CACNrX,GAAI,SAAYD,EAAM5G,GACpByG,EAAYzG,GAAS4G,EACjBA,EAAK0iB,SAAS1iB,EAAK0iB,QAAQtpB,IAEjC,YAAa,SAAkB4G,EAAM5G,GACnC,IAAI87B,EAAO8J,EAAc5lC,GAEzB,GAAI87B,EAAM,CAIR,IAHAA,EAAOA,EAAK75B,SACPqsB,aAAY,KAEb1nB,aAAgBmmB,GAGlB,OAAO,IAAIA,EAAM+O,EAAMl1B,GAFvBA,EAAK8iB,YAAY,EAAGoS,KAM1B20C,kBAAmBH,EACnBn2D,UAAWm2D,EACX,eAAgBE,EAChB,iBAAkBA,EAClB/C,WAAY,SAAoB7mE,EAAM5G,GAChC4G,EAAK8pE,YAAY9pE,EAAK8pE,WAAqB,YAAV1wE,IAEvC2wE,QAAS,SAAiB/pE,EAAM5G,GAC1B4G,EAAK8pE,YAAY9pE,EAAK8pE,WAAqB,OAAV1wE,IAEvC,aAAc,SAAmB4G,EAAM5G,GACjC4G,EAAKktD,UAAUltD,EAAKktD,SAAS9zD,IAEnC,eAAgB,SAAqB4G,EAAM5G,GACrC4G,EAAKosD,QAAQpsD,EAAKosD,OAAOhB,SAAS/kD,WAAWjN,KAEnDsqB,OAAQ,SAAgB1jB,EAAM5G,GAC5B,GAAI4G,EAAKmtD,UAAW,CAClB,IAAI6c,EAAU5wE,EAAMiB,MAAM,UAC1B2F,EAAKmtD,UAAU6c,EAAUA,EAAQ,GAAK,IAAM3jE,WAAWjN,MAG3D4sE,QAAS,SAAiBhmE,EAAM5G,EAAOQ,EAAM46D,EAAMyV,GACjD,IAEIC,EAFAxhE,EAAO,IAAIqL,EAAWk0D,EAAa7uE,EAAO,UAC1CwT,EAAO0K,EAAQk9C,EAAM,KAAM,MAAM,GAIrC,GAAIx0D,aAAgBmmB,EAAO,CACzB,IAAIlU,EAAQrF,EAAOA,EAAK+G,OAAOjL,EAAK4O,WAAa,EAC7C9D,GAAS,IAAImG,GAAS1H,MAAMA,GAAO6I,UAAUpS,EAAKyO,WAAWtD,UACjEq2D,EAAQlqE,OACCA,aAAgB++B,IACrBnyB,GAAMlE,EAAK+O,QAAQ7K,GACvBs9D,EAAQlqE,EAAK2pB,OAGf,GAAIugD,EAAO,CACT,GAA+C,YAA3CtiE,EAAa4sD,EAAM,WAAYyV,GAAuB,CACxD,IAAI/0C,EAAO,IAAI+C,EAAM/K,UAAUxkB,GAC/BwsB,EAAKxN,aAAY,GACjBwiD,EAAMj/C,SAASiK,GAGb1hB,GAAQ02D,EAAM32D,UAAUC,OAKlC,SAAS5L,EAAa4sD,EAAM56D,EAAMqwE,GAChC,IAAItiE,EAAO6sD,EAAK8P,WAAW1qE,GACvBR,EAAQuO,GAAQA,EAAKvO,MAEzB,IAAKA,GAASo7D,EAAKxzC,MAAO,CACxB,IAAIA,EAAQ1pB,EAAK8K,SAASxI,IAC1BR,EAAQo7D,EAAKxzC,MAAMA,KACLipD,EAAOzV,KAAKxzC,KAAWipD,EAAOjkD,OAAOhF,KAAQ5nB,EAAQ6wE,EAAOzV,KAAKxzC,IAGjF,OAAQ5nB,EAA8B,SAAVA,EAAmB,KAAOA,EAAtCjC,EAGlB,SAASsxE,EAAgBzoE,EAAMw0D,EAAM90D,GACnC,IAAIsmB,EAASwuC,EAAKgB,WACdyU,EAAS,CACXzV,KAAM51B,EAAW8wB,UAAU8E,IAAS,GACpCxuC,QAAStmB,IAAW,UAAUhF,KAAKsrB,EAAOmkD,UAAYvrC,EAAW8wB,UAAU1pC,IAAW,IAMxF,OAJA1uB,EAAK8D,KAAKkpE,GAAY,SAAUnpE,EAAOvB,GACrC,IAAIR,EAAQwO,EAAa4sD,EAAM56D,EAAMqwE,GACrCjqE,EAAO5G,IAAUjC,GAAagE,EAAM6E,EAAM5G,EAAOQ,EAAM46D,EAAMyV,IAAWjqE,KAEnEA,EAGT,SAASg/B,EAAc5lC,GACrB,IAAIiB,EAAQjB,GAASA,EAAMiB,MAAM,yBAC7BT,EAAOS,GAASA,EAAM,GACtBH,EAAMN,GAAQiG,EAAYzI,EAASwC,EAAKsI,QAAQ9K,EAAOstC,SAAS2/B,KAAK12D,MAAM,KAAK,GAAK,IAAK,IAAM/T,GAOpG,OALIM,GAAOA,EAAI6uE,kBACb7uE,EAAMA,EAAImB,SACN0tE,gBAAiB,GAGhB7uE,EAGT,SAASyuE,EAAWnU,EAAM33D,EAAS6C,GACjC,IAGIohD,EACA96B,EACA/O,EALA9a,EAAOq4D,EAAKwC,SAAS18D,cACrB8vE,EAAqB,cAATjuE,EACZ8zD,EAAO54D,EAAS44D,KAKhBvwD,GAAU0qE,IACZzC,EAAWzjE,GAAMwC,UAAU4Q,UAC3BqwD,EAAWrwD,EAAQk9C,EAAM,KAAM,MAAM,IAASmT,EAC9C7mB,EAAYkjB,GAAWrsE,OAAO,MAAO,CACnCqpB,MAAO,6CAETgF,EAASwuC,EAAKgB,WACdv+C,EAAOu9C,EAAK6V,YACZvpB,EAAU4S,YAAYc,GACtBvE,EAAKyD,YAAY5S,IAGnB,IAAI38C,EAAWD,GAAMC,SACjBC,EAAcD,EAASC,YACvBC,EAAcF,EAASE,YAC3BF,EAASC,aAAc,EACvBD,EAASE,aAAc,EACvB,IAAIimE,EAAWtB,EAAU7sE,GACrB6D,EAAOsqE,GAAYA,EAAS9V,EAAMr4D,EAAMU,EAAS6C,IAAW,KAIhE,GAHAyE,EAASE,YAAcA,EACvBF,EAASC,YAAcA,EAEnBpE,EAAM,EACJoqE,GAAepqE,aAAgBmmB,IAAQnmB,EAAOyoE,EAAgBzoE,EAAMw0D,EAAM90D,IAC9E,IAAI6qE,EAAW1tE,EAAQ0tE,SACnBnlD,EAAOglD,GAAa5V,EAAK5sD,aAAa,mBACtC2iE,IAAUvqE,EAAOuqE,EAAS/V,EAAMx0D,EAAMnD,IAAYmD,GAElDnD,EAAQ2tE,cAAgBxqE,aAAgBi4B,IAC1Cj4B,EAAK4B,SACL5B,EAAOA,EAAK64B,UAGVzT,IAAMplB,EAAKO,MAAQO,KAAKG,MAAMmkB,IAoBpC,OAjBI07B,IACFmP,EAAK0F,YAAY7U,GAEb96B,IACE/O,EACF+O,EAAOmhD,aAAa3S,EAAMv9C,GAE1B+O,EAAO0tC,YAAYc,KAKrB90D,IACFG,EAAc,GACVG,GAAQ1I,EAAKiE,KAAKsB,EAAQuH,YAAaA,IAAcpE,EAAKwT,OAAOrY,OAAM,GAAM,IAG5E6E,EAGT,SAASyqE,EAAW9rE,EAAQ9B,EAASkY,GACnC,IAAKpW,EAAQ,OAAO,KACpB9B,EAA6B,mBAAZA,EAAyB,CACxC2oB,OAAQ3oB,GACNA,GAAW,GACf,IAAIkK,EAAQ7C,GACRlE,EAAO,KAEX,SAASwlB,EAAOy+C,GACd,IACE,IAAIzP,EAAsB,iBAARyP,EAAmBA,GAAM,IAAI/sE,EAAKwzE,WAAYC,gBAAgB1G,EAAI1a,OAAQ,iBAE5F,IAAKiL,EAAKwC,SAER,MADAxC,EAAO,KACD,IAAIp6C,MAAM,2BAA6Bzb,GAG/CuF,GAAQ6C,EACR/G,EAAO2oE,EAAWnU,EAAM33D,GAAS,GAE5BA,IAA8B,IAAnBA,EAAQwE,QACtB0T,EAAM4N,YAAYxrB,EAAW6I,GAG/B,IAAIwlB,EAAS3oB,EAAQ2oB,OACjBA,GAAQA,EAAOxlB,EAAMikE,GACzB,MAAOxnC,GACPhX,EAAQgX,IAIZ,SAAShX,EAAQg8C,EAASH,GACxB,IAAI77C,EAAU5oB,EAAQ4oB,QAEtB,IAAIA,EAGF,MAAM,IAAIrL,MAAMqnD,GAFhBh8C,EAAQg8C,EAASH,GAMrB,GAAsB,iBAAX3iE,GAAwB,YAAYjE,KAAKiE,GAa7C,IAAoB,oBAATisE,MAAwBjsE,aAAkBisE,KAAM,CAChE,IAAIC,EAAS,IAAIC,WAUjB,OARAD,EAAOxJ,OAAS,WACd77C,EAAOqlD,EAAOxrB,SAGhBwrB,EAAOrJ,QAAU,WACf/7C,EAAQolD,EAAOxuC,QAGVwuC,EAAOE,WAAWpsE,GAEzB6mB,EAAO7mB,OA1BoD,CAC3D,IAAI61D,EAAOn9D,EAAS0jC,eAAep8B,GAE/B61D,EACFhvC,EAAOgvC,GAEPqM,GAAa,CACXI,IAAKtiE,EACLuiE,OAAO,EACP17C,OAAQA,EACRC,QAASA,IAmBf,OAAOzlB,EAGTmB,EAAKvG,OAAO,CACVowE,UAAW,SAAmBxW,EAAM33D,GAClC,OAAO4tE,EAAWjW,EAAM33D,EAASvE,SAGrC4O,EAAQtM,OAAO,CACbowE,UAAW,SAAmBxW,EAAM33D,GAElC,OADAvE,KAAKiP,WACEkjE,EAAWjW,EAAM33D,EAASvE,UAIvC,IAAI4L,GAAQ,IAAKD,EAAWrJ,OAAOtD,EAAKwE,QAAS,CAC/CxE,KAAMA,EACNwV,UAAWA,EACX6tD,IAAKA,GACLx+B,SAAUA,EACVyC,WAAYA,EACZvnC,SAAUA,EACVD,OAAQA,EACR6zE,OAAQlsC,EACRmsC,aAAczpD,KAahB,OAVIvd,GAAMmB,MAAMmvD,MACd,EAAQ,IAAR,CAA4BtwD,KAIP,qBAArB,MAAqB,sCAKhBA,KACP1L,KAAKF,KAAsB,iBAATpB,KAAoBA,KAAO","file":"580740db-0136bb05608086936c04.js","sourcesContent":["/*!\n * Paper.js v0.12.15 - The Swiss Army Knife of Vector Graphics Scripting.\n * http://paperjs.org/\n *\n * Copyright (c) 2011 - 2020, Jürg Lehni & Jonathan Puckey\n * http://juerglehni.com/ & https://puckey.studio/\n *\n * Distributed under the MIT license. See LICENSE file for details.\n *\n * All rights reserved.\n *\n * Date: Wed Mar 17 10:49:48 2021 +0100\n *\n ***\n *\n * Straps.js - Class inheritance library with support for bean-style accessors\n *\n * Copyright (c) 2006 - 2020 Jürg Lehni\n * http://juerglehni.com/\n *\n * Distributed under the MIT license.\n *\n ***\n *\n * Acorn.js\n * https://marijnhaverbeke.nl/acorn/\n *\n * Acorn is a tiny, fast JavaScript parser written in JavaScript,\n * created by Marijn Haverbeke and released under an MIT license.\n *\n */\nvar paper = function (self, undefined) {\n self = self || require('./node/self.js');\n var window = self.window,\n document = self.document;\n var Base = new function () {\n var hidden = /^(statics|enumerable|beans|preserve)$/,\n array = [],\n _slice = array.slice,\n create = Object.create,\n describe = Object.getOwnPropertyDescriptor,\n define = Object.defineProperty,\n forEach = array.forEach || function (iter, bind) {\n for (var i = 0, l = this.length; i < l; i++) {\n iter.call(bind, this[i], i, this);\n }\n },\n forIn = function forIn(iter, bind) {\n for (var i in this) {\n if (this.hasOwnProperty(i)) iter.call(bind, this[i], i, this);\n }\n },\n set = Object.assign || function (dst) {\n for (var i = 1, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n\n for (var key in src) {\n if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n }\n\n return dst;\n },\n _each = function each(obj, iter, bind) {\n if (obj) {\n var desc = describe(obj, 'length');\n (desc && typeof desc.value === 'number' ? forEach : forIn).call(obj, iter, bind = bind || obj);\n }\n\n return bind;\n };\n\n function _inject(dest, src, enumerable, beans, preserve) {\n var beansNames = {};\n\n function field(name, val) {\n val = val || (val = describe(src, name)) && (val.get ? val : val.value);\n if (typeof val === 'string' && val[0] === '#') val = dest[val.substring(1)] || val;\n var isFunc = typeof val === 'function',\n res = val,\n prev = preserve || isFunc && !val.base ? val && val.get ? name in dest : dest[name] : null,\n bean;\n\n if (!preserve || !prev) {\n if (isFunc && prev) val.base = prev;\n if (isFunc && beans !== false && (bean = name.match(/^([gs]et|is)(([A-Z])(.*))$/))) beansNames[bean[3].toLowerCase() + bean[4]] = bean[2];\n\n if (!res || isFunc || !res.get || typeof res.get !== 'function' || !Base.isPlainObject(res)) {\n res = {\n value: res,\n writable: true\n };\n }\n\n if ((describe(dest, name) || {\n configurable: true\n }).configurable) {\n res.configurable = true;\n res.enumerable = enumerable != null ? enumerable : !bean;\n }\n\n define(dest, name, res);\n }\n }\n\n if (src) {\n for (var name in src) {\n if (src.hasOwnProperty(name) && !hidden.test(name)) field(name);\n }\n\n for (var name in beansNames) {\n var part = beansNames[name],\n set = dest['set' + part],\n get = dest['get' + part] || set && dest['is' + part];\n if (get && (beans === true || get.length === 0)) field(name, {\n get: get,\n set: set\n });\n }\n }\n\n return dest;\n }\n\n function Base() {\n for (var i = 0, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n if (src) set(this, src);\n }\n\n return this;\n }\n\n return _inject(Base, {\n inject: function inject(src) {\n if (src) {\n var statics = src.statics === true ? src : src.statics,\n beans = src.beans,\n preserve = src.preserve;\n if (statics !== src) _inject(this.prototype, src, src.enumerable, beans, preserve);\n\n _inject(this, statics, null, beans, preserve);\n }\n\n for (var i = 1, l = arguments.length; i < l; i++) {\n this.inject(arguments[i]);\n }\n\n return this;\n },\n extend: function extend() {\n var base = this,\n ctor,\n proto;\n\n for (var i = 0, obj, l = arguments.length; i < l && !(ctor && proto); i++) {\n obj = arguments[i];\n ctor = ctor || obj.initialize;\n proto = proto || obj.prototype;\n }\n\n ctor = ctor || function () {\n base.apply(this, arguments);\n };\n\n proto = ctor.prototype = proto || create(this.prototype);\n define(proto, 'constructor', {\n value: ctor,\n writable: true,\n configurable: true\n });\n\n _inject(ctor, this);\n\n if (arguments.length) this.inject.apply(ctor, arguments);\n ctor.base = base;\n return ctor;\n }\n }).inject({\n enumerable: false,\n initialize: Base,\n set: Base,\n inject: function inject() {\n for (var i = 0, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n\n if (src) {\n _inject(this, src, src.enumerable, src.beans, src.preserve);\n }\n }\n\n return this;\n },\n extend: function extend() {\n var res = create(this);\n return res.inject.apply(res, arguments);\n },\n each: function each(iter, bind) {\n return _each(this, iter, bind);\n },\n clone: function clone() {\n return new this.constructor(this);\n },\n statics: {\n set: set,\n each: _each,\n create: create,\n define: define,\n describe: describe,\n clone: function clone(obj) {\n return set(new obj.constructor(), obj);\n },\n isPlainObject: function isPlainObject(obj) {\n var ctor = obj != null && obj.constructor;\n return ctor && (ctor === Object || ctor === Base || ctor.name === 'Object');\n },\n pick: function pick(a, b) {\n return a !== undefined ? a : b;\n },\n slice: function slice(list, begin, end) {\n return _slice.call(list, begin, end);\n }\n }\n });\n }();\n if (typeof module !== 'undefined') module.exports = Base;\n Base.inject({\n enumerable: false,\n toString: function toString() {\n return this._id != null ? (this._class || 'Object') + (this._name ? \" '\" + this._name + \"'\" : ' @' + this._id) : '{ ' + Base.each(this, function (value, key) {\n if (!/^_/.test(key)) {\n var type = typeof value;\n this.push(key + ': ' + (type === 'number' ? Formatter.instance.number(value) : type === 'string' ? \"'\" + value + \"'\" : value));\n }\n }, []).join(', ') + ' }';\n },\n getClassName: function getClassName() {\n return this._class || '';\n },\n importJSON: function importJSON(json) {\n return Base.importJSON(json, this);\n },\n exportJSON: function exportJSON(options) {\n return Base.exportJSON(this, options);\n },\n toJSON: function toJSON() {\n return Base.serialize(this);\n },\n set: function set(props, exclude) {\n if (props) Base.filter(this, props, exclude, this._prioritize);\n return this;\n }\n }, {\n beans: false,\n statics: {\n exports: {},\n extend: function extend() {\n var res = extend.base.apply(this, arguments),\n name = res.prototype._class;\n if (name && !Base.exports[name]) Base.exports[name] = res;\n return res;\n },\n equals: function equals(obj1, obj2) {\n if (obj1 === obj2) return true;\n if (obj1 && obj1.equals) return obj1.equals(obj2);\n if (obj2 && obj2.equals) return obj2.equals(obj1);\n\n if (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') {\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n var length = obj1.length;\n if (length !== obj2.length) return false;\n\n while (length--) {\n if (!Base.equals(obj1[length], obj2[length])) return false;\n }\n } else {\n var keys = Object.keys(obj1),\n length = keys.length;\n if (length !== Object.keys(obj2).length) return false;\n\n while (length--) {\n var key = keys[length];\n if (!(obj2.hasOwnProperty(key) && Base.equals(obj1[key], obj2[key]))) return false;\n }\n }\n\n return true;\n }\n\n return false;\n },\n read: function read(list, start, options, amount) {\n if (this === Base) {\n var value = this.peek(list, start);\n list.__index++;\n return value;\n }\n\n var proto = this.prototype,\n readIndex = proto._readIndex,\n begin = start || readIndex && list.__index || 0,\n length = list.length,\n obj = list[begin];\n amount = amount || length - begin;\n\n if (obj instanceof this || options && options.readNull && obj == null && amount <= 1) {\n if (readIndex) list.__index = begin + 1;\n return obj && options && options.clone ? obj.clone() : obj;\n }\n\n obj = Base.create(proto);\n if (readIndex) obj.__read = true;\n obj = obj.initialize.apply(obj, begin > 0 || begin + amount < length ? Base.slice(list, begin, begin + amount) : list) || obj;\n\n if (readIndex) {\n list.__index = begin + obj.__read;\n var filtered = obj.__filtered;\n\n if (filtered) {\n list.__filtered = filtered;\n obj.__filtered = undefined;\n }\n\n obj.__read = undefined;\n }\n\n return obj;\n },\n peek: function peek(list, start) {\n return list[list.__index = start || list.__index || 0];\n },\n remain: function remain(list) {\n return list.length - (list.__index || 0);\n },\n readList: function readList(list, start, options, amount) {\n var res = [],\n entry,\n begin = start || 0,\n end = amount ? begin + amount : list.length;\n\n for (var i = begin; i < end; i++) {\n res.push(Array.isArray(entry = list[i]) ? this.read(entry, 0, options) : this.read(list, i, options, 1));\n }\n\n return res;\n },\n readNamed: function readNamed(list, name, start, options, amount) {\n var value = this.getNamed(list, name),\n hasValue = value !== undefined;\n\n if (hasValue) {\n var filtered = list.__filtered;\n\n if (!filtered) {\n var source = this.getSource(list);\n filtered = list.__filtered = Base.create(source);\n filtered.__unfiltered = source;\n }\n\n filtered[name] = undefined;\n }\n\n return this.read(hasValue ? [value] : list, start, options, amount);\n },\n readSupported: function readSupported(list, dest) {\n var source = this.getSource(list),\n that = this,\n read = false;\n\n if (source) {\n Object.keys(source).forEach(function (key) {\n if (key in dest) {\n var value = that.readNamed(list, key);\n\n if (value !== undefined) {\n dest[key] = value;\n }\n\n read = true;\n }\n });\n }\n\n return read;\n },\n getSource: function getSource(list) {\n var source = list.__source;\n\n if (source === undefined) {\n var arg = list.length === 1 && list[0];\n source = list.__source = arg && Base.isPlainObject(arg) ? arg : null;\n }\n\n return source;\n },\n getNamed: function getNamed(list, name) {\n var source = this.getSource(list);\n\n if (source) {\n return name ? source[name] : list.__filtered || source;\n }\n },\n hasNamed: function hasNamed(list, name) {\n return !!this.getNamed(list, name);\n },\n filter: function filter(dest, source, exclude, prioritize) {\n var processed;\n\n function handleKey(key) {\n if (!(exclude && key in exclude) && !(processed && key in processed)) {\n var value = source[key];\n if (value !== undefined) dest[key] = value;\n }\n }\n\n if (prioritize) {\n var keys = {};\n\n for (var i = 0, key, l = prioritize.length; i < l; i++) {\n if ((key = prioritize[i]) in source) {\n handleKey(key);\n keys[key] = true;\n }\n }\n\n processed = keys;\n }\n\n Object.keys(source.__unfiltered || source).forEach(handleKey);\n return dest;\n },\n isPlainValue: function isPlainValue(obj, asString) {\n return Base.isPlainObject(obj) || Array.isArray(obj) || asString && typeof obj === 'string';\n },\n serialize: function serialize(obj, options, compact, dictionary) {\n options = options || {};\n var isRoot = !dictionary,\n res;\n\n if (isRoot) {\n options.formatter = new Formatter(options.precision);\n dictionary = {\n length: 0,\n definitions: {},\n references: {},\n add: function add(item, create) {\n var id = '#' + item._id,\n ref = this.references[id];\n\n if (!ref) {\n this.length++;\n var res = create.call(item),\n name = item._class;\n if (name && res[0] !== name) res.unshift(name);\n this.definitions[id] = res;\n ref = this.references[id] = [id];\n }\n\n return ref;\n }\n };\n }\n\n if (obj && obj._serialize) {\n res = obj._serialize(options, dictionary);\n var name = obj._class;\n\n if (name && !obj._compactSerialize && (isRoot || !compact) && res[0] !== name) {\n res.unshift(name);\n }\n } else if (Array.isArray(obj)) {\n res = [];\n\n for (var i = 0, l = obj.length; i < l; i++) {\n res[i] = Base.serialize(obj[i], options, compact, dictionary);\n }\n } else if (Base.isPlainObject(obj)) {\n res = {};\n var keys = Object.keys(obj);\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n res[key] = Base.serialize(obj[key], options, compact, dictionary);\n }\n } else if (typeof obj === 'number') {\n res = options.formatter.number(obj, options.precision);\n } else {\n res = obj;\n }\n\n return isRoot && dictionary.length > 0 ? [['dictionary', dictionary.definitions], res] : res;\n },\n deserialize: function deserialize(json, create, _data, _setDictionary, _isRoot) {\n var res = json,\n isFirst = !_data,\n hasDictionary = isFirst && json && json.length && json[0][0] === 'dictionary';\n _data = _data || {};\n\n if (Array.isArray(json)) {\n var type = json[0],\n isDictionary = type === 'dictionary';\n\n if (json.length == 1 && /^#/.test(type)) {\n return _data.dictionary[type];\n }\n\n type = Base.exports[type];\n res = [];\n\n for (var i = type ? 1 : 0, l = json.length; i < l; i++) {\n res.push(Base.deserialize(json[i], create, _data, isDictionary, hasDictionary));\n }\n\n if (type) {\n var args = res;\n\n if (create) {\n res = create(type, args, isFirst || _isRoot);\n } else {\n res = new type(args);\n }\n }\n } else if (Base.isPlainObject(json)) {\n res = {};\n if (_setDictionary) _data.dictionary = res;\n\n for (var key in json) {\n res[key] = Base.deserialize(json[key], create, _data);\n }\n }\n\n return hasDictionary ? res[1] : res;\n },\n exportJSON: function exportJSON(obj, options) {\n var json = Base.serialize(obj, options);\n return options && options.asString == false ? json : JSON.stringify(json);\n },\n importJSON: function importJSON(json, target) {\n return Base.deserialize(typeof json === 'string' ? JSON.parse(json) : json, function (ctor, args, isRoot) {\n var useTarget = isRoot && target && target.constructor === ctor,\n obj = useTarget ? target : Base.create(ctor.prototype);\n\n if (args.length === 1 && obj instanceof Item && (useTarget || !(obj instanceof Layer))) {\n var arg = args[0];\n\n if (Base.isPlainObject(arg)) {\n arg.insert = false;\n\n if (useTarget) {\n args = args.concat([{\n insert: true\n }]);\n }\n }\n }\n\n (useTarget ? obj.set : ctor).apply(obj, args);\n if (useTarget) target = null;\n return obj;\n });\n },\n push: function push(list, items) {\n var itemsLength = items.length;\n\n if (itemsLength < 4096) {\n list.push.apply(list, items);\n } else {\n var startLength = list.length;\n list.length += itemsLength;\n\n for (var i = 0; i < itemsLength; i++) {\n list[startLength + i] = items[i];\n }\n }\n\n return list;\n },\n splice: function splice(list, items, index, remove) {\n var amount = items && items.length,\n append = index === undefined;\n index = append ? list.length : index;\n if (index > list.length) index = list.length;\n\n for (var i = 0; i < amount; i++) {\n items[i]._index = index + i;\n }\n\n if (append) {\n Base.push(list, items);\n return [];\n } else {\n var args = [index, remove];\n if (items) Base.push(args, items);\n var removed = list.splice.apply(list, args);\n\n for (var i = 0, l = removed.length; i < l; i++) {\n removed[i]._index = undefined;\n }\n\n for (var i = index + amount, l = list.length; i < l; i++) {\n list[i]._index = i;\n }\n\n return removed;\n }\n },\n capitalize: function capitalize(str) {\n return str.replace(/\\b[a-z]/g, function (match) {\n return match.toUpperCase();\n });\n },\n camelize: function camelize(str) {\n return str.replace(/-(.)/g, function (match, chr) {\n return chr.toUpperCase();\n });\n },\n hyphenate: function hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n }\n }\n });\n var Emitter = {\n on: function on(type, func) {\n if (typeof type !== 'string') {\n Base.each(type, function (value, key) {\n this.on(key, value);\n }, this);\n } else {\n var types = this._eventTypes,\n entry = types && types[type],\n handlers = this._callbacks = this._callbacks || {};\n handlers = handlers[type] = handlers[type] || [];\n\n if (handlers.indexOf(func) === -1) {\n handlers.push(func);\n if (entry && entry.install && handlers.length === 1) entry.install.call(this, type);\n }\n }\n\n return this;\n },\n off: function off(type, func) {\n if (typeof type !== 'string') {\n Base.each(type, function (value, key) {\n this.off(key, value);\n }, this);\n return;\n }\n\n var types = this._eventTypes,\n entry = types && types[type],\n handlers = this._callbacks && this._callbacks[type],\n index;\n\n if (handlers) {\n if (!func || (index = handlers.indexOf(func)) !== -1 && handlers.length === 1) {\n if (entry && entry.uninstall) entry.uninstall.call(this, type);\n delete this._callbacks[type];\n } else if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n return this;\n },\n once: function once(type, func) {\n return this.on(type, function handler() {\n func.apply(this, arguments);\n this.off(type, handler);\n });\n },\n emit: function emit(type, event) {\n var handlers = this._callbacks && this._callbacks[type];\n if (!handlers) return false;\n var args = Base.slice(arguments, 1),\n setTarget = event && event.target && !event.currentTarget;\n handlers = handlers.slice();\n if (setTarget) event.currentTarget = this;\n\n for (var i = 0, l = handlers.length; i < l; i++) {\n if (handlers[i].apply(this, args) == false) {\n if (event && event.stop) event.stop();\n break;\n }\n }\n\n if (setTarget) delete event.currentTarget;\n return true;\n },\n responds: function responds(type) {\n return !!(this._callbacks && this._callbacks[type]);\n },\n attach: '#on',\n detach: '#off',\n fire: '#emit',\n _installEvents: function _installEvents(install) {\n var types = this._eventTypes,\n handlers = this._callbacks,\n key = install ? 'install' : 'uninstall';\n\n if (types) {\n for (var type in handlers) {\n if (handlers[type].length > 0) {\n var entry = types[type],\n func = entry && entry[key];\n if (func) func.call(this, type);\n }\n }\n }\n },\n statics: {\n inject: function inject(src) {\n var events = src._events;\n\n if (events) {\n var types = {};\n Base.each(events, function (entry, key) {\n var isString = typeof entry === 'string',\n name = isString ? entry : key,\n part = Base.capitalize(name),\n type = name.substring(2).toLowerCase();\n types[type] = isString ? {} : entry;\n name = '_' + name;\n\n src['get' + part] = function () {\n return this[name];\n };\n\n src['set' + part] = function (func) {\n var prev = this[name];\n if (prev) this.off(type, prev);\n if (func) this.on(type, func);\n this[name] = func;\n };\n });\n src._eventTypes = types;\n }\n\n return inject.base.apply(this, arguments);\n }\n }\n };\n var PaperScope = Base.extend({\n _class: 'PaperScope',\n initialize: function PaperScope() {\n paper = this;\n this.settings = new Base({\n applyMatrix: true,\n insertItems: true,\n handleSize: 4,\n hitTolerance: 0\n });\n this.project = null;\n this.projects = [];\n this.tools = [];\n this._id = PaperScope._id++;\n PaperScope._scopes[this._id] = this;\n var proto = PaperScope.prototype;\n\n if (!this.support) {\n var ctx = CanvasProvider.getContext(1, 1) || {};\n proto.support = {\n nativeDash: 'setLineDash' in ctx || 'mozDash' in ctx,\n nativeBlendModes: BlendMode.nativeModes\n };\n CanvasProvider.release(ctx);\n }\n\n if (!this.agent) {\n var user = self.navigator.userAgent.toLowerCase(),\n os = (/(darwin|win|mac|linux|freebsd|sunos)/.exec(user) || [])[0],\n platform = os === 'darwin' ? 'mac' : os,\n agent = proto.agent = proto.browser = {\n platform: platform\n };\n if (platform) agent[platform] = true;\n user.replace(/(opera|chrome|safari|webkit|firefox|msie|trident|atom|node|jsdom)\\/?\\s*([.\\d]+)(?:.*version\\/([.\\d]+))?(?:.*rv\\:v?([.\\d]+))?/g, function (match, n, v1, v2, rv) {\n if (!agent.chrome) {\n var v = n === 'opera' ? v2 : /^(node|trident)$/.test(n) ? rv : v1;\n agent.version = v;\n agent.versionNumber = parseFloat(v);\n n = {\n trident: 'msie',\n jsdom: 'node'\n }[n] || n;\n agent.name = n;\n agent[n] = true;\n }\n });\n if (agent.chrome) delete agent.webkit;\n if (agent.atom) delete agent.chrome;\n }\n },\n version: \"0.12.15\",\n getView: function getView() {\n var project = this.project;\n return project && project._view;\n },\n getPaper: function getPaper() {\n return this;\n },\n execute: function execute(code, options) {},\n install: function install(scope) {\n var that = this;\n Base.each(['project', 'view', 'tool'], function (key) {\n Base.define(scope, key, {\n configurable: true,\n get: function get() {\n return that[key];\n }\n });\n });\n\n for (var key in this) {\n if (!/^_/.test(key) && this[key]) scope[key] = this[key];\n }\n },\n setup: function setup(element) {\n paper = this;\n this.project = new Project(element);\n return this;\n },\n createCanvas: function createCanvas(width, height) {\n return CanvasProvider.getCanvas(width, height);\n },\n activate: function activate() {\n paper = this;\n },\n clear: function clear() {\n var projects = this.projects,\n tools = this.tools;\n\n for (var i = projects.length - 1; i >= 0; i--) {\n projects[i].remove();\n }\n\n for (var i = tools.length - 1; i >= 0; i--) {\n tools[i].remove();\n }\n },\n remove: function remove() {\n this.clear();\n delete PaperScope._scopes[this._id];\n },\n statics: new function () {\n function handleAttribute(name) {\n name += 'Attribute';\n return function (el, attr) {\n return el[name](attr) || el[name]('data-paper-' + attr);\n };\n }\n\n return {\n _scopes: {},\n _id: 0,\n get: function get(id) {\n return this._scopes[id] || null;\n },\n getAttribute: handleAttribute('get'),\n hasAttribute: handleAttribute('has')\n };\n }()\n });\n var PaperScopeItem = Base.extend(Emitter, {\n initialize: function initialize(activate) {\n this._scope = paper;\n this._index = this._scope[this._list].push(this) - 1;\n if (activate || !this._scope[this._reference]) this.activate();\n },\n activate: function activate() {\n if (!this._scope) return false;\n var prev = this._scope[this._reference];\n if (prev && prev !== this) prev.emit('deactivate');\n this._scope[this._reference] = this;\n this.emit('activate', prev);\n return true;\n },\n isActive: function isActive() {\n return this._scope[this._reference] === this;\n },\n remove: function remove() {\n if (this._index == null) return false;\n Base.splice(this._scope[this._list], null, this._index, 1);\n if (this._scope[this._reference] == this) this._scope[this._reference] = null;\n this._scope = null;\n return true;\n },\n getView: function getView() {\n return this._scope.getView();\n }\n });\n var CollisionDetection = {\n findItemBoundsCollisions: function findItemBoundsCollisions(items1, items2, tolerance) {\n function getBounds(items) {\n var bounds = new Array(items.length);\n\n for (var i = 0; i < items.length; i++) {\n var rect = items[i].getBounds();\n bounds[i] = [rect.left, rect.top, rect.right, rect.bottom];\n }\n\n return bounds;\n }\n\n var bounds1 = getBounds(items1),\n bounds2 = !items2 || items2 === items1 ? bounds1 : getBounds(items2);\n return this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n },\n findCurveBoundsCollisions: function findCurveBoundsCollisions(curves1, curves2, tolerance, bothAxis) {\n function getBounds(curves) {\n var min = Math.min,\n max = Math.max,\n bounds = new Array(curves.length);\n\n for (var i = 0; i < curves.length; i++) {\n var v = curves[i];\n bounds[i] = [min(v[0], v[2], v[4], v[6]), min(v[1], v[3], v[5], v[7]), max(v[0], v[2], v[4], v[6]), max(v[1], v[3], v[5], v[7])];\n }\n\n return bounds;\n }\n\n var bounds1 = getBounds(curves1),\n bounds2 = !curves2 || curves2 === curves1 ? bounds1 : getBounds(curves2);\n\n if (bothAxis) {\n var hor = this.findBoundsCollisions(bounds1, bounds2, tolerance || 0, false, true),\n ver = this.findBoundsCollisions(bounds1, bounds2, tolerance || 0, true, true),\n list = [];\n\n for (var i = 0, l = hor.length; i < l; i++) {\n list[i] = {\n hor: hor[i],\n ver: ver[i]\n };\n }\n\n return list;\n }\n\n return this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n },\n findBoundsCollisions: function findBoundsCollisions(boundsA, boundsB, tolerance, sweepVertical, onlySweepAxisCollisions) {\n var self = !boundsB || boundsA === boundsB,\n allBounds = self ? boundsA : boundsA.concat(boundsB),\n lengthA = boundsA.length,\n lengthAll = allBounds.length;\n\n function binarySearch(indices, coord, value) {\n var lo = 0,\n hi = indices.length;\n\n while (lo < hi) {\n var mid = hi + lo >>> 1;\n\n if (allBounds[indices[mid]][coord] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n return lo - 1;\n }\n\n var pri0 = sweepVertical ? 1 : 0,\n pri1 = pri0 + 2,\n sec0 = sweepVertical ? 0 : 1,\n sec1 = sec0 + 2;\n var allIndicesByPri0 = new Array(lengthAll);\n\n for (var i = 0; i < lengthAll; i++) {\n allIndicesByPri0[i] = i;\n }\n\n allIndicesByPri0.sort(function (i1, i2) {\n return allBounds[i1][pri0] - allBounds[i2][pri0];\n });\n var activeIndicesByPri1 = [],\n allCollisions = new Array(lengthA);\n\n for (var i = 0; i < lengthAll; i++) {\n var curIndex = allIndicesByPri0[i],\n curBounds = allBounds[curIndex],\n origIndex = self ? curIndex : curIndex - lengthA,\n isCurrentA = curIndex < lengthA,\n isCurrentB = self || !isCurrentA,\n curCollisions = isCurrentA ? [] : null;\n\n if (activeIndicesByPri1.length) {\n var pruneCount = binarySearch(activeIndicesByPri1, pri1, curBounds[pri0] - tolerance) + 1;\n activeIndicesByPri1.splice(0, pruneCount);\n\n if (self && onlySweepAxisCollisions) {\n curCollisions = curCollisions.concat(activeIndicesByPri1);\n\n for (var j = 0; j < activeIndicesByPri1.length; j++) {\n var activeIndex = activeIndicesByPri1[j];\n allCollisions[activeIndex].push(origIndex);\n }\n } else {\n var curSec1 = curBounds[sec1],\n curSec0 = curBounds[sec0];\n\n for (var j = 0; j < activeIndicesByPri1.length; j++) {\n var activeIndex = activeIndicesByPri1[j],\n activeBounds = allBounds[activeIndex],\n isActiveA = activeIndex < lengthA,\n isActiveB = self || activeIndex >= lengthA;\n\n if (onlySweepAxisCollisions || (isCurrentA && isActiveB || isCurrentB && isActiveA) && curSec1 >= activeBounds[sec0] - tolerance && curSec0 <= activeBounds[sec1] + tolerance) {\n if (isCurrentA && isActiveB) {\n curCollisions.push(self ? activeIndex : activeIndex - lengthA);\n }\n\n if (isCurrentB && isActiveA) {\n allCollisions[activeIndex].push(origIndex);\n }\n }\n }\n }\n }\n\n if (isCurrentA) {\n if (boundsA === boundsB) {\n curCollisions.push(curIndex);\n }\n\n allCollisions[curIndex] = curCollisions;\n }\n\n if (activeIndicesByPri1.length) {\n var curPri1 = curBounds[pri1],\n index = binarySearch(activeIndicesByPri1, pri1, curPri1);\n activeIndicesByPri1.splice(index + 1, 0, curIndex);\n } else {\n activeIndicesByPri1.push(curIndex);\n }\n }\n\n for (var i = 0; i < allCollisions.length; i++) {\n var collisions = allCollisions[i];\n\n if (collisions) {\n collisions.sort(function (i1, i2) {\n return i1 - i2;\n });\n }\n }\n\n return allCollisions;\n }\n };\n var Formatter = Base.extend({\n initialize: function initialize(precision) {\n this.precision = Base.pick(precision, 5);\n this.multiplier = Math.pow(10, this.precision);\n },\n number: function number(val) {\n return this.precision < 16 ? Math.round(val * this.multiplier) / this.multiplier : val;\n },\n pair: function pair(val1, val2, separator) {\n return this.number(val1) + (separator || ',') + this.number(val2);\n },\n point: function point(val, separator) {\n return this.number(val.x) + (separator || ',') + this.number(val.y);\n },\n size: function size(val, separator) {\n return this.number(val.width) + (separator || ',') + this.number(val.height);\n },\n rectangle: function rectangle(val, separator) {\n return this.point(val, separator) + (separator || ',') + this.size(val, separator);\n }\n });\n Formatter.instance = new Formatter();\n var Numerical = new function () {\n var abscissas = [[0.5773502691896257645091488], [0, 0.7745966692414833770358531], [0.3399810435848562648026658, 0.8611363115940525752239465], [0, 0.5384693101056830910363144, 0.9061798459386639927976269], [0.2386191860831969086305017, 0.6612093864662645136613996, 0.9324695142031520278123016], [0, 0.4058451513773971669066064, 0.7415311855993944398638648, 0.9491079123427585245261897], [0.1834346424956498049394761, 0.5255324099163289858177390, 0.7966664774136267395915539, 0.9602898564975362316835609], [0, 0.3242534234038089290385380, 0.6133714327005903973087020, 0.8360311073266357942994298, 0.9681602395076260898355762], [0.1488743389816312108848260, 0.4333953941292471907992659, 0.6794095682990244062343274, 0.8650633666889845107320967, 0.9739065285171717200779640], [0, 0.2695431559523449723315320, 0.5190961292068118159257257, 0.7301520055740493240934163, 0.8870625997680952990751578, 0.9782286581460569928039380], [0.1252334085114689154724414, 0.3678314989981801937526915, 0.5873179542866174472967024, 0.7699026741943046870368938, 0.9041172563704748566784659, 0.9815606342467192506905491], [0, 0.2304583159551347940655281, 0.4484927510364468528779129, 0.6423493394403402206439846, 0.8015780907333099127942065, 0.9175983992229779652065478, 0.9841830547185881494728294], [0.1080549487073436620662447, 0.3191123689278897604356718, 0.5152486363581540919652907, 0.6872929048116854701480198, 0.8272013150697649931897947, 0.9284348836635735173363911, 0.9862838086968123388415973], [0, 0.2011940939974345223006283, 0.3941513470775633698972074, 0.5709721726085388475372267, 0.7244177313601700474161861, 0.8482065834104272162006483, 0.9372733924007059043077589, 0.9879925180204854284895657], [0.0950125098376374401853193, 0.2816035507792589132304605, 0.4580167776572273863424194, 0.6178762444026437484466718, 0.7554044083550030338951012, 0.8656312023878317438804679, 0.9445750230732325760779884, 0.9894009349916499325961542]];\n var weights = [[1], [0.8888888888888888888888889, 0.5555555555555555555555556], [0.6521451548625461426269361, 0.3478548451374538573730639], [0.5688888888888888888888889, 0.4786286704993664680412915, 0.2369268850561890875142640], [0.4679139345726910473898703, 0.3607615730481386075698335, 0.1713244923791703450402961], [0.4179591836734693877551020, 0.3818300505051189449503698, 0.2797053914892766679014678, 0.1294849661688696932706114], [0.3626837833783619829651504, 0.3137066458778872873379622, 0.2223810344533744705443560, 0.1012285362903762591525314], [0.3302393550012597631645251, 0.3123470770400028400686304, 0.2606106964029354623187429, 0.1806481606948574040584720, 0.0812743883615744119718922], [0.2955242247147528701738930, 0.2692667193099963550912269, 0.2190863625159820439955349, 0.1494513491505805931457763, 0.0666713443086881375935688], [0.2729250867779006307144835, 0.2628045445102466621806889, 0.2331937645919904799185237, 0.1862902109277342514260976, 0.1255803694649046246346943, 0.0556685671161736664827537], [0.2491470458134027850005624, 0.2334925365383548087608499, 0.2031674267230659217490645, 0.1600783285433462263346525, 0.1069393259953184309602547, 0.0471753363865118271946160], [0.2325515532308739101945895, 0.2262831802628972384120902, 0.2078160475368885023125232, 0.1781459807619457382800467, 0.1388735102197872384636018, 0.0921214998377284479144218, 0.0404840047653158795200216], [0.2152638534631577901958764, 0.2051984637212956039659241, 0.1855383974779378137417166, 0.1572031671581935345696019, 0.1215185706879031846894148, 0.0801580871597602098056333, 0.0351194603317518630318329], [0.2025782419255612728806202, 0.1984314853271115764561183, 0.1861610000155622110268006, 0.1662692058169939335532009, 0.1395706779261543144478048, 0.1071592204671719350118695, 0.0703660474881081247092674, 0.0307532419961172683546284], [0.1894506104550684962853967, 0.1826034150449235888667637, 0.1691565193950025381893121, 0.1495959888165767320815017, 0.1246289712555338720524763, 0.0951585116824927848099251, 0.0622535239386478928628438, 0.0271524594117540948517806]];\n\n var abs = Math.abs,\n sqrt = Math.sqrt,\n pow = Math.pow,\n log2 = Math.log2 || function (x) {\n return Math.log(x) * Math.LOG2E;\n },\n EPSILON = 1e-12,\n MACHINE_EPSILON = 1.12e-16;\n\n function clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n }\n\n function getDiscriminant(a, b, c) {\n function split(v) {\n var x = v * 134217729,\n y = v - x,\n hi = y + x,\n lo = v - hi;\n return [hi, lo];\n }\n\n var D = b * b - a * c,\n E = b * b + a * c;\n\n if (abs(D) * 3 < E) {\n var ad = split(a),\n bd = split(b),\n cd = split(c),\n p = b * b,\n dp = bd[0] * bd[0] - p + 2 * bd[0] * bd[1] + bd[1] * bd[1],\n q = a * c,\n dq = ad[0] * cd[0] - q + ad[0] * cd[1] + ad[1] * cd[0] + ad[1] * cd[1];\n D = p - q + (dp - dq);\n }\n\n return D;\n }\n\n function getNormalizationFactor() {\n var norm = Math.max.apply(Math, arguments);\n return norm && (norm < 1e-8 || norm > 1e8) ? pow(2, -Math.round(log2(norm))) : 0;\n }\n\n return {\n EPSILON: EPSILON,\n MACHINE_EPSILON: MACHINE_EPSILON,\n CURVETIME_EPSILON: 1e-8,\n GEOMETRIC_EPSILON: 1e-7,\n TRIGONOMETRIC_EPSILON: 1e-8,\n KAPPA: 4 * (sqrt(2) - 1) / 3,\n isZero: function isZero(val) {\n return val >= -EPSILON && val <= EPSILON;\n },\n isMachineZero: function isMachineZero(val) {\n return val >= -MACHINE_EPSILON && val <= MACHINE_EPSILON;\n },\n clamp: clamp,\n integrate: function integrate(f, a, b, n) {\n var x = abscissas[n - 2],\n w = weights[n - 2],\n A = (b - a) * 0.5,\n B = A + a,\n i = 0,\n m = n + 1 >> 1,\n sum = n & 1 ? w[i++] * f(B) : 0;\n\n while (i < m) {\n var Ax = A * x[i];\n sum += w[i++] * (f(B + Ax) + f(B - Ax));\n }\n\n return A * sum;\n },\n findRoot: function findRoot(f, df, x, a, b, n, tolerance) {\n for (var i = 0; i < n; i++) {\n var fx = f(x),\n dx = fx / df(x),\n nx = x - dx;\n\n if (abs(dx) < tolerance) {\n x = nx;\n break;\n }\n\n if (fx > 0) {\n b = x;\n x = nx <= a ? (a + b) * 0.5 : nx;\n } else {\n a = x;\n x = nx >= b ? (a + b) * 0.5 : nx;\n }\n }\n\n return clamp(x, a, b);\n },\n solveQuadratic: function solveQuadratic(a, b, c, roots, min, max) {\n var x1,\n x2 = Infinity;\n\n if (abs(a) < EPSILON) {\n if (abs(b) < EPSILON) return abs(c) < EPSILON ? -1 : 0;\n x1 = -c / b;\n } else {\n b *= -0.5;\n var D = getDiscriminant(a, b, c);\n\n if (D && abs(D) < MACHINE_EPSILON) {\n var f = getNormalizationFactor(abs(a), abs(b), abs(c));\n\n if (f) {\n a *= f;\n b *= f;\n c *= f;\n D = getDiscriminant(a, b, c);\n }\n }\n\n if (D >= -MACHINE_EPSILON) {\n var Q = D < 0 ? 0 : sqrt(D),\n R = b + (b < 0 ? -Q : Q);\n\n if (R === 0) {\n x1 = c / a;\n x2 = -x1;\n } else {\n x1 = R / a;\n x2 = c / R;\n }\n }\n }\n\n var count = 0,\n boundless = min == null,\n minB = min - EPSILON,\n maxB = max + EPSILON;\n if (isFinite(x1) && (boundless || x1 > minB && x1 < maxB)) roots[count++] = boundless ? x1 : clamp(x1, min, max);\n if (x2 !== x1 && isFinite(x2) && (boundless || x2 > minB && x2 < maxB)) roots[count++] = boundless ? x2 : clamp(x2, min, max);\n return count;\n },\n solveCubic: function solveCubic(a, b, c, d, roots, min, max) {\n var f = getNormalizationFactor(abs(a), abs(b), abs(c), abs(d)),\n x,\n b1,\n c2,\n qd,\n q;\n\n if (f) {\n a *= f;\n b *= f;\n c *= f;\n d *= f;\n }\n\n function evaluate(x0) {\n x = x0;\n var tmp = a * x;\n b1 = tmp + b;\n c2 = b1 * x + c;\n qd = (tmp + b1) * x + c2;\n q = c2 * x + d;\n }\n\n if (abs(a) < EPSILON) {\n a = b;\n b1 = c;\n c2 = d;\n x = Infinity;\n } else if (abs(d) < EPSILON) {\n b1 = b;\n c2 = c;\n x = 0;\n } else {\n evaluate(-(b / a) / 3);\n var t = q / a,\n r = pow(abs(t), 1 / 3),\n s = t < 0 ? -1 : 1,\n td = -qd / a,\n rd = td > 0 ? 1.324717957244746 * Math.max(r, sqrt(td)) : r,\n x0 = x - s * rd;\n\n if (x0 !== x) {\n do {\n evaluate(x0);\n x0 = qd === 0 ? x : x - q / qd / (1 + MACHINE_EPSILON);\n } while (s * x0 > s * x);\n\n if (abs(a) * x * x > abs(d / x)) {\n c2 = -d / x;\n b1 = (c2 - c) / x;\n }\n }\n }\n\n var count = Numerical.solveQuadratic(a, b1, c2, roots, min, max),\n boundless = min == null;\n if (isFinite(x) && (count === 0 || count > 0 && x !== roots[0] && x !== roots[1]) && (boundless || x > min - EPSILON && x < max + EPSILON)) roots[count++] = boundless ? x : clamp(x, min, max);\n return count;\n }\n };\n }();\n var UID = {\n _id: 1,\n _pools: {},\n get: function get(name) {\n if (name) {\n var pool = this._pools[name];\n if (!pool) pool = this._pools[name] = {\n _id: 1\n };\n return pool._id++;\n } else {\n return this._id++;\n }\n }\n };\n var Point = Base.extend({\n _class: 'Point',\n _readIndex: true,\n initialize: function Point(arg0, arg1) {\n var type = typeof arg0,\n reading = this.__read,\n read = 0;\n\n if (type === 'number') {\n var hasY = typeof arg1 === 'number';\n\n this._set(arg0, hasY ? arg1 : arg0);\n\n if (reading) read = hasY ? 2 : 1;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0);\n\n if (reading) read = arg0 === null ? 1 : 0;\n } else {\n var obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n read = 1;\n\n if (Array.isArray(obj)) {\n this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n } else if ('x' in obj) {\n this._set(obj.x || 0, obj.y || 0);\n } else if ('width' in obj) {\n this._set(obj.width || 0, obj.height || 0);\n } else if ('angle' in obj) {\n this._set(obj.length || 0, 0);\n\n this.setAngle(obj.angle || 0);\n } else {\n this._set(0, 0);\n\n read = 0;\n }\n }\n\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n equals: function equals(point) {\n return this === point || point && (this.x === point.x && this.y === point.y || Array.isArray(point) && this.x === point[0] && this.y === point[1]) || false;\n },\n clone: function clone() {\n return new Point(this.x, this.y);\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.x), f.number(this.y)];\n },\n getLength: function getLength() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n setLength: function setLength(length) {\n if (this.isZero()) {\n var angle = this._angle || 0;\n\n this._set(Math.cos(angle) * length, Math.sin(angle) * length);\n } else {\n var scale = length / this.getLength();\n if (Numerical.isZero(scale)) this.getAngle();\n\n this._set(this.x * scale, this.y * scale);\n }\n },\n getAngle: function getAngle() {\n return this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI;\n },\n setAngle: function setAngle(angle) {\n this.setAngleInRadians.call(this, angle * Math.PI / 180);\n },\n getAngleInDegrees: '#getAngle',\n setAngleInDegrees: '#setAngle',\n getAngleInRadians: function getAngleInRadians() {\n if (!arguments.length) {\n return this.isZero() ? this._angle || 0 : this._angle = Math.atan2(this.y, this.x);\n } else {\n var point = Point.read(arguments),\n div = this.getLength() * point.getLength();\n\n if (Numerical.isZero(div)) {\n return NaN;\n } else {\n var a = this.dot(point) / div;\n return Math.acos(a < -1 ? -1 : a > 1 ? 1 : a);\n }\n }\n },\n setAngleInRadians: function setAngleInRadians(angle) {\n this._angle = angle;\n\n if (!this.isZero()) {\n var length = this.getLength();\n\n this._set(Math.cos(angle) * length, Math.sin(angle) * length);\n }\n },\n getQuadrant: function getQuadrant() {\n return this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3;\n }\n }, {\n beans: false,\n getDirectedAngle: function getDirectedAngle() {\n var point = Point.read(arguments);\n return Math.atan2(this.cross(point), this.dot(point)) * 180 / Math.PI;\n },\n getDistance: function getDistance() {\n var args = arguments,\n point = Point.read(args),\n x = point.x - this.x,\n y = point.y - this.y,\n d = x * x + y * y,\n squared = Base.read(args);\n return squared ? d : Math.sqrt(d);\n },\n normalize: function normalize(length) {\n if (length === undefined) length = 1;\n var current = this.getLength(),\n scale = current !== 0 ? length / current : 0,\n point = new Point(this.x * scale, this.y * scale);\n if (scale >= 0) point._angle = this._angle;\n return point;\n },\n rotate: function rotate(angle, center) {\n if (angle === 0) return this.clone();\n angle = angle * Math.PI / 180;\n var point = center ? this.subtract(center) : this,\n sin = Math.sin(angle),\n cos = Math.cos(angle);\n point = new Point(point.x * cos - point.y * sin, point.x * sin + point.y * cos);\n return center ? point.add(center) : point;\n },\n transform: function transform(matrix) {\n return matrix ? matrix._transformPoint(this) : this;\n },\n add: function add() {\n var point = Point.read(arguments);\n return new Point(this.x + point.x, this.y + point.y);\n },\n subtract: function subtract() {\n var point = Point.read(arguments);\n return new Point(this.x - point.x, this.y - point.y);\n },\n multiply: function multiply() {\n var point = Point.read(arguments);\n return new Point(this.x * point.x, this.y * point.y);\n },\n divide: function divide() {\n var point = Point.read(arguments);\n return new Point(this.x / point.x, this.y / point.y);\n },\n modulo: function modulo() {\n var point = Point.read(arguments);\n return new Point(this.x % point.x, this.y % point.y);\n },\n negate: function negate() {\n return new Point(-this.x, -this.y);\n },\n isInside: function isInside() {\n return _Rectangle.read(arguments).contains(this);\n },\n isClose: function isClose() {\n var args = arguments,\n point = Point.read(args),\n tolerance = Base.read(args);\n return this.getDistance(point) <= tolerance;\n },\n isCollinear: function isCollinear() {\n var point = Point.read(arguments);\n return Point.isCollinear(this.x, this.y, point.x, point.y);\n },\n isColinear: '#isCollinear',\n isOrthogonal: function isOrthogonal() {\n var point = Point.read(arguments);\n return Point.isOrthogonal(this.x, this.y, point.x, point.y);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this.x) && isZero(this.y);\n },\n isNaN: function (_isNaN) {\n function isNaN() {\n return _isNaN.apply(this, arguments);\n }\n\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n\n return isNaN;\n }(function () {\n return isNaN(this.x) || isNaN(this.y);\n }),\n isInQuadrant: function isInQuadrant(q) {\n return this.x * (q > 1 && q < 4 ? -1 : 1) >= 0 && this.y * (q > 2 ? -1 : 1) >= 0;\n },\n dot: function dot() {\n var point = Point.read(arguments);\n return this.x * point.x + this.y * point.y;\n },\n cross: function cross() {\n var point = Point.read(arguments);\n return this.x * point.y - this.y * point.x;\n },\n project: function project() {\n var point = Point.read(arguments),\n scale = point.isZero() ? 0 : this.dot(point) / point.dot(point);\n return new Point(point.x * scale, point.y * scale);\n },\n statics: {\n min: function min() {\n var args = arguments,\n point1 = Point.read(args),\n point2 = Point.read(args);\n return new Point(Math.min(point1.x, point2.x), Math.min(point1.y, point2.y));\n },\n max: function max() {\n var args = arguments,\n point1 = Point.read(args),\n point2 = Point.read(args);\n return new Point(Math.max(point1.x, point2.x), Math.max(point1.y, point2.y));\n },\n random: function random() {\n return new Point(Math.random(), Math.random());\n },\n isCollinear: function isCollinear(x1, y1, x2, y2) {\n return Math.abs(x1 * y2 - y1 * x2) <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) * 1e-8;\n },\n isOrthogonal: function isOrthogonal(x1, y1, x2, y2) {\n return Math.abs(x1 * x2 + y1 * y2) <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) * 1e-8;\n }\n }\n }, Base.each(['round', 'ceil', 'floor', 'abs'], function (key) {\n var op = Math[key];\n\n this[key] = function () {\n return new Point(op(this.x), op(this.y));\n };\n }, {}));\n var LinkedPoint = Point.extend({\n initialize: function Point(x, y, owner, setter) {\n this._x = x;\n this._y = y;\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(x, y, _dontNotify) {\n this._x = x;\n this._y = y;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n },\n getX: function getX() {\n return this._x;\n },\n setX: function setX(x) {\n this._x = x;\n\n this._owner[this._setter](this);\n },\n getY: function getY() {\n return this._y;\n },\n setY: function setY(y) {\n this._y = y;\n\n this._owner[this._setter](this);\n },\n isSelected: function isSelected() {\n return !!(this._owner._selection & this._getSelection());\n },\n setSelected: function setSelected(selected) {\n this._owner._changeSelection(this._getSelection(), selected);\n },\n _getSelection: function _getSelection() {\n return this._setter === 'setPosition' ? 4 : 0;\n }\n });\n var Size = Base.extend({\n _class: 'Size',\n _readIndex: true,\n initialize: function Size(arg0, arg1) {\n var type = typeof arg0,\n reading = this.__read,\n read = 0;\n\n if (type === 'number') {\n var hasHeight = typeof arg1 === 'number';\n\n this._set(arg0, hasHeight ? arg1 : arg0);\n\n if (reading) read = hasHeight ? 2 : 1;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0);\n\n if (reading) read = arg0 === null ? 1 : 0;\n } else {\n var obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n read = 1;\n\n if (Array.isArray(obj)) {\n this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n } else if ('width' in obj) {\n this._set(obj.width || 0, obj.height || 0);\n } else if ('x' in obj) {\n this._set(obj.x || 0, obj.y || 0);\n } else {\n this._set(0, 0);\n\n read = 0;\n }\n }\n\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(width, height) {\n this.width = width;\n this.height = height;\n return this;\n },\n equals: function equals(size) {\n return size === this || size && (this.width === size.width && this.height === size.height || Array.isArray(size) && this.width === size[0] && this.height === size[1]) || false;\n },\n clone: function clone() {\n return new Size(this.width, this.height);\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ width: ' + f.number(this.width) + ', height: ' + f.number(this.height) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.width), f.number(this.height)];\n },\n add: function add() {\n var size = Size.read(arguments);\n return new Size(this.width + size.width, this.height + size.height);\n },\n subtract: function subtract() {\n var size = Size.read(arguments);\n return new Size(this.width - size.width, this.height - size.height);\n },\n multiply: function multiply() {\n var size = Size.read(arguments);\n return new Size(this.width * size.width, this.height * size.height);\n },\n divide: function divide() {\n var size = Size.read(arguments);\n return new Size(this.width / size.width, this.height / size.height);\n },\n modulo: function modulo() {\n var size = Size.read(arguments);\n return new Size(this.width % size.width, this.height % size.height);\n },\n negate: function negate() {\n return new Size(-this.width, -this.height);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this.width) && isZero(this.height);\n },\n isNaN: function (_isNaN2) {\n function isNaN() {\n return _isNaN2.apply(this, arguments);\n }\n\n isNaN.toString = function () {\n return _isNaN2.toString();\n };\n\n return isNaN;\n }(function () {\n return isNaN(this.width) || isNaN(this.height);\n }),\n statics: {\n min: function min(size1, size2) {\n return new Size(Math.min(size1.width, size2.width), Math.min(size1.height, size2.height));\n },\n max: function max(size1, size2) {\n return new Size(Math.max(size1.width, size2.width), Math.max(size1.height, size2.height));\n },\n random: function random() {\n return new Size(Math.random(), Math.random());\n }\n }\n }, Base.each(['round', 'ceil', 'floor', 'abs'], function (key) {\n var op = Math[key];\n\n this[key] = function () {\n return new Size(op(this.width), op(this.height));\n };\n }, {}));\n var LinkedSize = Size.extend({\n initialize: function Size(width, height, owner, setter) {\n this._width = width;\n this._height = height;\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(width, height, _dontNotify) {\n this._width = width;\n this._height = height;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n },\n getWidth: function getWidth() {\n return this._width;\n },\n setWidth: function setWidth(width) {\n this._width = width;\n\n this._owner[this._setter](this);\n },\n getHeight: function getHeight() {\n return this._height;\n },\n setHeight: function setHeight(height) {\n this._height = height;\n\n this._owner[this._setter](this);\n }\n });\n\n var _Rectangle = Base.extend({\n _class: 'Rectangle',\n _readIndex: true,\n beans: true,\n initialize: function Rectangle(arg0, arg1, arg2, arg3) {\n var args = arguments,\n type = typeof arg0,\n read;\n\n if (type === 'number') {\n this._set(arg0, arg1, arg2, arg3);\n\n read = 4;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0, 0, 0);\n\n read = arg0 === null ? 1 : 0;\n } else if (args.length === 1) {\n if (Array.isArray(arg0)) {\n this._set.apply(this, arg0);\n\n read = 1;\n } else if (arg0.x !== undefined || arg0.width !== undefined) {\n this._set(arg0.x || 0, arg0.y || 0, arg0.width || 0, arg0.height || 0);\n\n read = 1;\n } else if (arg0.from === undefined && arg0.to === undefined) {\n this._set(0, 0, 0, 0);\n\n if (Base.readSupported(args, this)) {\n read = 1;\n }\n }\n }\n\n if (read === undefined) {\n var frm = Point.readNamed(args, 'from'),\n next = Base.peek(args),\n x = frm.x,\n y = frm.y,\n width,\n height;\n\n if (next && next.x !== undefined || Base.hasNamed(args, 'to')) {\n var to = Point.readNamed(args, 'to');\n width = to.x - x;\n height = to.y - y;\n\n if (width < 0) {\n x = to.x;\n width = -width;\n }\n\n if (height < 0) {\n y = to.y;\n height = -height;\n }\n } else {\n var size = Size.read(args);\n width = size.width;\n height = size.height;\n }\n\n this._set(x, y, width, height);\n\n read = args.__index;\n }\n\n var filtered = args.__filtered;\n if (filtered) this.__filtered = filtered;\n if (this.__read) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n return this;\n },\n clone: function clone() {\n return new _Rectangle(this.x, this.y, this.width, this.height);\n },\n equals: function equals(rect) {\n var rt = Base.isPlainValue(rect) ? _Rectangle.read(arguments) : rect;\n return rt === this || rt && this.x === rt.x && this.y === rt.y && this.width === rt.width && this.height === rt.height || false;\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ', width: ' + f.number(this.width) + ', height: ' + f.number(this.height) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.x), f.number(this.y), f.number(this.width), f.number(this.height)];\n },\n getPoint: function getPoint(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this.x, this.y, this, 'setPoint');\n },\n setPoint: function setPoint() {\n var point = Point.read(arguments);\n this.x = point.x;\n this.y = point.y;\n },\n getSize: function getSize(_dontLink) {\n var ctor = _dontLink ? Size : LinkedSize;\n return new ctor(this.width, this.height, this, 'setSize');\n },\n _fw: 1,\n _fh: 1,\n setSize: function setSize() {\n var size = Size.read(arguments),\n sx = this._sx,\n sy = this._sy,\n w = size.width,\n h = size.height;\n\n if (sx) {\n this.x += (this.width - w) * sx;\n }\n\n if (sy) {\n this.y += (this.height - h) * sy;\n }\n\n this.width = w;\n this.height = h;\n this._fw = this._fh = 1;\n },\n getLeft: function getLeft() {\n return this.x;\n },\n setLeft: function setLeft(left) {\n if (!this._fw) {\n var amount = left - this.x;\n this.width -= this._sx === 0.5 ? amount * 2 : amount;\n }\n\n this.x = left;\n this._sx = this._fw = 0;\n },\n getTop: function getTop() {\n return this.y;\n },\n setTop: function setTop(top) {\n if (!this._fh) {\n var amount = top - this.y;\n this.height -= this._sy === 0.5 ? amount * 2 : amount;\n }\n\n this.y = top;\n this._sy = this._fh = 0;\n },\n getRight: function getRight() {\n return this.x + this.width;\n },\n setRight: function setRight(right) {\n if (!this._fw) {\n var amount = right - this.x;\n this.width = this._sx === 0.5 ? amount * 2 : amount;\n }\n\n this.x = right - this.width;\n this._sx = 1;\n this._fw = 0;\n },\n getBottom: function getBottom() {\n return this.y + this.height;\n },\n setBottom: function setBottom(bottom) {\n if (!this._fh) {\n var amount = bottom - this.y;\n this.height = this._sy === 0.5 ? amount * 2 : amount;\n }\n\n this.y = bottom - this.height;\n this._sy = 1;\n this._fh = 0;\n },\n getCenterX: function getCenterX() {\n return this.x + this.width / 2;\n },\n setCenterX: function setCenterX(x) {\n if (this._fw || this._sx === 0.5) {\n this.x = x - this.width / 2;\n } else {\n if (this._sx) {\n this.x += (x - this.x) * 2 * this._sx;\n }\n\n this.width = (x - this.x) * 2;\n }\n\n this._sx = 0.5;\n this._fw = 0;\n },\n getCenterY: function getCenterY() {\n return this.y + this.height / 2;\n },\n setCenterY: function setCenterY(y) {\n if (this._fh || this._sy === 0.5) {\n this.y = y - this.height / 2;\n } else {\n if (this._sy) {\n this.y += (y - this.y) * 2 * this._sy;\n }\n\n this.height = (y - this.y) * 2;\n }\n\n this._sy = 0.5;\n this._fh = 0;\n },\n getCenter: function getCenter(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this.getCenterX(), this.getCenterY(), this, 'setCenter');\n },\n setCenter: function setCenter() {\n var point = Point.read(arguments);\n this.setCenterX(point.x);\n this.setCenterY(point.y);\n return this;\n },\n getArea: function getArea() {\n return this.width * this.height;\n },\n isEmpty: function isEmpty() {\n return this.width === 0 || this.height === 0;\n },\n contains: function contains(arg) {\n return arg && arg.width !== undefined || (Array.isArray(arg) ? arg : arguments).length === 4 ? this._containsRectangle(_Rectangle.read(arguments)) : this._containsPoint(Point.read(arguments));\n },\n _containsPoint: function _containsPoint(point) {\n var x = point.x,\n y = point.y;\n return x >= this.x && y >= this.y && x <= this.x + this.width && y <= this.y + this.height;\n },\n _containsRectangle: function _containsRectangle(rect) {\n var x = rect.x,\n y = rect.y;\n return x >= this.x && y >= this.y && x + rect.width <= this.x + this.width && y + rect.height <= this.y + this.height;\n },\n intersects: function intersects() {\n var rect = _Rectangle.read(arguments),\n epsilon = Base.read(arguments) || 0;\n\n return rect.x + rect.width > this.x - epsilon && rect.y + rect.height > this.y - epsilon && rect.x < this.x + this.width + epsilon && rect.y < this.y + this.height + epsilon;\n },\n intersect: function intersect() {\n var rect = _Rectangle.read(arguments),\n x1 = Math.max(this.x, rect.x),\n y1 = Math.max(this.y, rect.y),\n x2 = Math.min(this.x + this.width, rect.x + rect.width),\n y2 = Math.min(this.y + this.height, rect.y + rect.height);\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n unite: function unite() {\n var rect = _Rectangle.read(arguments),\n x1 = Math.min(this.x, rect.x),\n y1 = Math.min(this.y, rect.y),\n x2 = Math.max(this.x + this.width, rect.x + rect.width),\n y2 = Math.max(this.y + this.height, rect.y + rect.height);\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n include: function include() {\n var point = Point.read(arguments);\n var x1 = Math.min(this.x, point.x),\n y1 = Math.min(this.y, point.y),\n x2 = Math.max(this.x + this.width, point.x),\n y2 = Math.max(this.y + this.height, point.y);\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n expand: function expand() {\n var amount = Size.read(arguments),\n hor = amount.width,\n ver = amount.height;\n return new _Rectangle(this.x - hor / 2, this.y - ver / 2, this.width + hor, this.height + ver);\n },\n scale: function scale(hor, ver) {\n return this.expand(this.width * hor - this.width, this.height * (ver === undefined ? hor : ver) - this.height);\n }\n }, Base.each([['Top', 'Left'], ['Top', 'Right'], ['Bottom', 'Left'], ['Bottom', 'Right'], ['Left', 'Center'], ['Top', 'Center'], ['Right', 'Center'], ['Bottom', 'Center']], function (parts, index) {\n var part = parts.join(''),\n xFirst = /^[RL]/.test(part);\n if (index >= 4) parts[1] += xFirst ? 'Y' : 'X';\n var x = parts[xFirst ? 0 : 1],\n y = parts[xFirst ? 1 : 0],\n getX = 'get' + x,\n getY = 'get' + y,\n setX = 'set' + x,\n setY = 'set' + y,\n get = 'get' + part,\n set = 'set' + part;\n\n this[get] = function (_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this[getX](), this[getY](), this, set);\n };\n\n this[set] = function () {\n var point = Point.read(arguments);\n this[setX](point.x);\n this[setY](point.y);\n };\n }, {\n beans: true\n }));\n\n var LinkedRectangle = _Rectangle.extend({\n initialize: function Rectangle(x, y, width, height, owner, setter) {\n this._set(x, y, width, height, true);\n\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(x, y, width, height, _dontNotify) {\n this._x = x;\n this._y = y;\n this._width = width;\n this._height = height;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n }\n }, new function () {\n var proto = _Rectangle.prototype;\n return Base.each(['x', 'y', 'width', 'height'], function (key) {\n var part = Base.capitalize(key),\n internal = '_' + key;\n\n this['get' + part] = function () {\n return this[internal];\n };\n\n this['set' + part] = function (value) {\n this[internal] = value;\n if (!this._dontNotify) this._owner[this._setter](this);\n };\n }, Base.each(['Point', 'Size', 'Center', 'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY', 'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'], function (key) {\n var name = 'set' + key;\n\n this[name] = function () {\n this._dontNotify = true;\n proto[name].apply(this, arguments);\n this._dontNotify = false;\n\n this._owner[this._setter](this);\n };\n }, {\n isSelected: function isSelected() {\n return !!(this._owner._selection & 2);\n },\n setSelected: function setSelected(selected) {\n var owner = this._owner;\n\n if (owner._changeSelection) {\n owner._changeSelection(2, selected);\n }\n }\n }));\n }());\n\n var Matrix = Base.extend({\n _class: 'Matrix',\n initialize: function Matrix(arg, _dontNotify) {\n var args = arguments,\n count = args.length,\n ok = true;\n\n if (count >= 6) {\n this._set.apply(this, args);\n } else if (count === 1 || count === 2) {\n if (arg instanceof Matrix) {\n this._set(arg._a, arg._b, arg._c, arg._d, arg._tx, arg._ty, _dontNotify);\n } else if (Array.isArray(arg)) {\n this._set.apply(this, _dontNotify ? arg.concat([_dontNotify]) : arg);\n } else {\n ok = false;\n }\n } else if (!count) {\n this.reset();\n } else {\n ok = false;\n }\n\n if (!ok) {\n throw new Error('Unsupported matrix parameters');\n }\n\n return this;\n },\n set: '#initialize',\n _set: function _set(a, b, c, d, tx, ty, _dontNotify) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n this._tx = tx;\n this._ty = ty;\n if (!_dontNotify) this._changed();\n return this;\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this.getValues(), options, true, dictionary);\n },\n _changed: function _changed() {\n var owner = this._owner;\n\n if (owner) {\n if (owner._applyMatrix) {\n owner.transform(null, true);\n } else {\n owner._changed(25);\n }\n }\n },\n clone: function clone() {\n return new Matrix(this._a, this._b, this._c, this._d, this._tx, this._ty);\n },\n equals: function equals(mx) {\n return mx === this || mx && this._a === mx._a && this._b === mx._b && this._c === mx._c && this._d === mx._d && this._tx === mx._tx && this._ty === mx._ty;\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '[[' + [f.number(this._a), f.number(this._c), f.number(this._tx)].join(', ') + '], [' + [f.number(this._b), f.number(this._d), f.number(this._ty)].join(', ') + ']]';\n },\n reset: function reset(_dontNotify) {\n this._a = this._d = 1;\n this._b = this._c = this._tx = this._ty = 0;\n if (!_dontNotify) this._changed();\n return this;\n },\n apply: function apply(recursively, _setApplyMatrix) {\n var owner = this._owner;\n\n if (owner) {\n owner.transform(null, Base.pick(recursively, true), _setApplyMatrix);\n return this.isIdentity();\n }\n\n return false;\n },\n translate: function translate() {\n var point = Point.read(arguments),\n x = point.x,\n y = point.y;\n this._tx += x * this._a + y * this._c;\n this._ty += x * this._b + y * this._d;\n\n this._changed();\n\n return this;\n },\n scale: function scale() {\n var args = arguments,\n scale = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n if (center) this.translate(center);\n this._a *= scale.x;\n this._b *= scale.x;\n this._c *= scale.y;\n this._d *= scale.y;\n if (center) this.translate(center.negate());\n\n this._changed();\n\n return this;\n },\n rotate: function rotate(angle) {\n angle *= Math.PI / 180;\n var center = Point.read(arguments, 1),\n x = center.x,\n y = center.y,\n cos = Math.cos(angle),\n sin = Math.sin(angle),\n tx = x - x * cos + y * sin,\n ty = y - x * sin - y * cos,\n a = this._a,\n b = this._b,\n c = this._c,\n d = this._d;\n this._a = cos * a + sin * c;\n this._b = cos * b + sin * d;\n this._c = -sin * a + cos * c;\n this._d = -sin * b + cos * d;\n this._tx += tx * a + ty * c;\n this._ty += tx * b + ty * d;\n\n this._changed();\n\n return this;\n },\n shear: function shear() {\n var args = arguments,\n shear = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n if (center) this.translate(center);\n var a = this._a,\n b = this._b;\n this._a += shear.y * this._c;\n this._b += shear.y * this._d;\n this._c += shear.x * a;\n this._d += shear.x * b;\n if (center) this.translate(center.negate());\n\n this._changed();\n\n return this;\n },\n skew: function skew() {\n var args = arguments,\n skew = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n }),\n toRadians = Math.PI / 180,\n shear = new Point(Math.tan(skew.x * toRadians), Math.tan(skew.y * toRadians));\n return this.shear(shear, center);\n },\n append: function append(mx, _dontNotify) {\n if (mx) {\n var a1 = this._a,\n b1 = this._b,\n c1 = this._c,\n d1 = this._d,\n a2 = mx._a,\n b2 = mx._c,\n c2 = mx._b,\n d2 = mx._d,\n tx2 = mx._tx,\n ty2 = mx._ty;\n this._a = a2 * a1 + c2 * c1;\n this._c = b2 * a1 + d2 * c1;\n this._b = a2 * b1 + c2 * d1;\n this._d = b2 * b1 + d2 * d1;\n this._tx += tx2 * a1 + ty2 * c1;\n this._ty += tx2 * b1 + ty2 * d1;\n if (!_dontNotify) this._changed();\n }\n\n return this;\n },\n prepend: function prepend(mx, _dontNotify) {\n if (mx) {\n var a1 = this._a,\n b1 = this._b,\n c1 = this._c,\n d1 = this._d,\n tx1 = this._tx,\n ty1 = this._ty,\n a2 = mx._a,\n b2 = mx._c,\n c2 = mx._b,\n d2 = mx._d,\n tx2 = mx._tx,\n ty2 = mx._ty;\n this._a = a2 * a1 + b2 * b1;\n this._c = a2 * c1 + b2 * d1;\n this._b = c2 * a1 + d2 * b1;\n this._d = c2 * c1 + d2 * d1;\n this._tx = a2 * tx1 + b2 * ty1 + tx2;\n this._ty = c2 * tx1 + d2 * ty1 + ty2;\n if (!_dontNotify) this._changed();\n }\n\n return this;\n },\n appended: function appended(mx) {\n return this.clone().append(mx);\n },\n prepended: function prepended(mx) {\n return this.clone().prepend(mx);\n },\n invert: function invert() {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n tx = this._tx,\n ty = this._ty,\n det = a * d - b * c,\n res = null;\n\n if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n this._a = d / det;\n this._b = -b / det;\n this._c = -c / det;\n this._d = a / det;\n this._tx = (c * ty - d * tx) / det;\n this._ty = (b * tx - a * ty) / det;\n res = this;\n }\n\n return res;\n },\n inverted: function inverted() {\n return this.clone().invert();\n },\n concatenate: '#append',\n preConcatenate: '#prepend',\n chain: '#appended',\n _shiftless: function _shiftless() {\n return new Matrix(this._a, this._b, this._c, this._d, 0, 0);\n },\n _orNullIfIdentity: function _orNullIfIdentity() {\n return this.isIdentity() ? null : this;\n },\n isIdentity: function isIdentity() {\n return this._a === 1 && this._b === 0 && this._c === 0 && this._d === 1 && this._tx === 0 && this._ty === 0;\n },\n isInvertible: function isInvertible() {\n var det = this._a * this._d - this._c * this._b;\n return det && !isNaN(det) && isFinite(this._tx) && isFinite(this._ty);\n },\n isSingular: function isSingular() {\n return !this.isInvertible();\n },\n transform: function transform(src, dst, count) {\n return arguments.length < 3 ? this._transformPoint(Point.read(arguments)) : this._transformCoordinates(src, dst, count);\n },\n _transformPoint: function _transformPoint(point, dest, _dontNotify) {\n var x = point.x,\n y = point.y;\n if (!dest) dest = new Point();\n return dest._set(x * this._a + y * this._c + this._tx, x * this._b + y * this._d + this._ty, _dontNotify);\n },\n _transformCoordinates: function _transformCoordinates(src, dst, count) {\n for (var i = 0, max = 2 * count; i < max; i += 2) {\n var x = src[i],\n y = src[i + 1];\n dst[i] = x * this._a + y * this._c + this._tx;\n dst[i + 1] = x * this._b + y * this._d + this._ty;\n }\n\n return dst;\n },\n _transformCorners: function _transformCorners(rect) {\n var x1 = rect.x,\n y1 = rect.y,\n x2 = x1 + rect.width,\n y2 = y1 + rect.height,\n coords = [x1, y1, x2, y1, x2, y2, x1, y2];\n return this._transformCoordinates(coords, coords, 4);\n },\n _transformBounds: function _transformBounds(bounds, dest, _dontNotify) {\n var coords = this._transformCorners(bounds),\n min = coords.slice(0, 2),\n max = min.slice();\n\n for (var i = 2; i < 8; i++) {\n var val = coords[i],\n j = i & 1;\n\n if (val < min[j]) {\n min[j] = val;\n } else if (val > max[j]) {\n max[j] = val;\n }\n }\n\n if (!dest) dest = new _Rectangle();\n return dest._set(min[0], min[1], max[0] - min[0], max[1] - min[1], _dontNotify);\n },\n inverseTransform: function inverseTransform() {\n return this._inverseTransform(Point.read(arguments));\n },\n _inverseTransform: function _inverseTransform(point, dest, _dontNotify) {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n tx = this._tx,\n ty = this._ty,\n det = a * d - b * c,\n res = null;\n\n if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n var x = point.x - this._tx,\n y = point.y - this._ty;\n if (!dest) dest = new Point();\n res = dest._set((x * d - y * c) / det, (y * a - x * b) / det, _dontNotify);\n }\n\n return res;\n },\n decompose: function decompose() {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n det = a * d - b * c,\n sqrt = Math.sqrt,\n atan2 = Math.atan2,\n degrees = 180 / Math.PI,\n rotate,\n scale,\n skew;\n\n if (a !== 0 || b !== 0) {\n var r = sqrt(a * a + b * b);\n rotate = Math.acos(a / r) * (b > 0 ? 1 : -1);\n scale = [r, det / r];\n skew = [atan2(a * c + b * d, r * r), 0];\n } else if (c !== 0 || d !== 0) {\n var s = sqrt(c * c + d * d);\n rotate = Math.asin(c / s) * (d > 0 ? 1 : -1);\n scale = [det / s, s];\n skew = [0, atan2(a * c + b * d, s * s)];\n } else {\n rotate = 0;\n skew = scale = [0, 0];\n }\n\n return {\n translation: this.getTranslation(),\n rotation: rotate * degrees,\n scaling: new Point(scale),\n skewing: new Point(skew[0] * degrees, skew[1] * degrees)\n };\n },\n getValues: function getValues() {\n return [this._a, this._b, this._c, this._d, this._tx, this._ty];\n },\n getTranslation: function getTranslation() {\n return new Point(this._tx, this._ty);\n },\n getScaling: function getScaling() {\n return this.decompose().scaling;\n },\n getRotation: function getRotation() {\n return this.decompose().rotation;\n },\n applyToContext: function applyToContext(ctx) {\n if (!this.isIdentity()) {\n ctx.transform(this._a, this._b, this._c, this._d, this._tx, this._ty);\n }\n }\n }, Base.each(['a', 'b', 'c', 'd', 'tx', 'ty'], function (key) {\n var part = Base.capitalize(key),\n prop = '_' + key;\n\n this['get' + part] = function () {\n return this[prop];\n };\n\n this['set' + part] = function (value) {\n this[prop] = value;\n\n this._changed();\n };\n }, {}));\n var Line = Base.extend({\n _class: 'Line',\n initialize: function Line(arg0, arg1, arg2, arg3, arg4) {\n var asVector = false;\n\n if (arguments.length >= 4) {\n this._px = arg0;\n this._py = arg1;\n this._vx = arg2;\n this._vy = arg3;\n asVector = arg4;\n } else {\n this._px = arg0.x;\n this._py = arg0.y;\n this._vx = arg1.x;\n this._vy = arg1.y;\n asVector = arg2;\n }\n\n if (!asVector) {\n this._vx -= this._px;\n this._vy -= this._py;\n }\n },\n getPoint: function getPoint() {\n return new Point(this._px, this._py);\n },\n getVector: function getVector() {\n return new Point(this._vx, this._vy);\n },\n getLength: function getLength() {\n return this.getVector().getLength();\n },\n intersect: function intersect(line, isInfinite) {\n return Line.intersect(this._px, this._py, this._vx, this._vy, line._px, line._py, line._vx, line._vy, true, isInfinite);\n },\n getSide: function getSide(point, isInfinite) {\n return Line.getSide(this._px, this._py, this._vx, this._vy, point.x, point.y, true, isInfinite);\n },\n getDistance: function getDistance(point) {\n return Math.abs(this.getSignedDistance(point));\n },\n getSignedDistance: function getSignedDistance(point) {\n return Line.getSignedDistance(this._px, this._py, this._vx, this._vy, point.x, point.y, true);\n },\n isCollinear: function isCollinear(line) {\n return Point.isCollinear(this._vx, this._vy, line._vx, line._vy);\n },\n isOrthogonal: function isOrthogonal(line) {\n return Point.isOrthogonal(this._vx, this._vy, line._vx, line._vy);\n },\n statics: {\n intersect: function intersect(p1x, p1y, v1x, v1y, p2x, p2y, v2x, v2y, asVector, isInfinite) {\n if (!asVector) {\n v1x -= p1x;\n v1y -= p1y;\n v2x -= p2x;\n v2y -= p2y;\n }\n\n var cross = v1x * v2y - v1y * v2x;\n\n if (!Numerical.isMachineZero(cross)) {\n var dx = p1x - p2x,\n dy = p1y - p2y,\n u1 = (v2x * dy - v2y * dx) / cross,\n u2 = (v1x * dy - v1y * dx) / cross,\n epsilon = 1e-12,\n uMin = -epsilon,\n uMax = 1 + epsilon;\n\n if (isInfinite || uMin < u1 && u1 < uMax && uMin < u2 && u2 < uMax) {\n if (!isInfinite) {\n u1 = u1 <= 0 ? 0 : u1 >= 1 ? 1 : u1;\n }\n\n return new Point(p1x + u1 * v1x, p1y + u1 * v1y);\n }\n }\n },\n getSide: function getSide(px, py, vx, vy, x, y, asVector, isInfinite) {\n if (!asVector) {\n vx -= px;\n vy -= py;\n }\n\n var v2x = x - px,\n v2y = y - py,\n ccw = v2x * vy - v2y * vx;\n\n if (!isInfinite && Numerical.isMachineZero(ccw)) {\n ccw = (v2x * vx + v2x * vx) / (vx * vx + vy * vy);\n if (ccw >= 0 && ccw <= 1) ccw = 0;\n }\n\n return ccw < 0 ? -1 : ccw > 0 ? 1 : 0;\n },\n getSignedDistance: function getSignedDistance(px, py, vx, vy, x, y, asVector) {\n if (!asVector) {\n vx -= px;\n vy -= py;\n }\n\n return vx === 0 ? vy > 0 ? x - px : px - x : vy === 0 ? vx < 0 ? y - py : py - y : ((x - px) * vy - (y - py) * vx) / (vy > vx ? vy * Math.sqrt(1 + vx * vx / (vy * vy)) : vx * Math.sqrt(1 + vy * vy / (vx * vx)));\n },\n getDistance: function getDistance(px, py, vx, vy, x, y, asVector) {\n return Math.abs(Line.getSignedDistance(px, py, vx, vy, x, y, asVector));\n }\n }\n });\n var Project = PaperScopeItem.extend({\n _class: 'Project',\n _list: 'projects',\n _reference: 'project',\n _compactSerialize: true,\n initialize: function Project(element) {\n PaperScopeItem.call(this, true);\n this._children = [];\n this._namedChildren = {};\n this._activeLayer = null;\n this._currentStyle = new Style(null, null, this);\n this._view = View.create(this, element || CanvasProvider.getCanvas(1, 1));\n this._selectionItems = {};\n this._selectionCount = 0;\n this._updateVersion = 0;\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this._children, options, true, dictionary);\n },\n _changed: function _changed(flags, item) {\n if (flags & 1) {\n var view = this._view;\n\n if (view) {\n view._needsUpdate = true;\n if (!view._requested && view._autoUpdate) view.requestUpdate();\n }\n }\n\n var changes = this._changes;\n\n if (changes && item) {\n var changesById = this._changesById,\n id = item._id,\n entry = changesById[id];\n\n if (entry) {\n entry.flags |= flags;\n } else {\n changes.push(changesById[id] = {\n item: item,\n flags: flags\n });\n }\n }\n },\n clear: function clear() {\n var children = this._children;\n\n for (var i = children.length - 1; i >= 0; i--) {\n children[i].remove();\n }\n },\n isEmpty: function isEmpty() {\n return !this._children.length;\n },\n remove: function remove() {\n if (!remove.base.call(this)) return false;\n if (this._view) this._view.remove();\n return true;\n },\n getView: function getView() {\n return this._view;\n },\n getCurrentStyle: function getCurrentStyle() {\n return this._currentStyle;\n },\n setCurrentStyle: function setCurrentStyle(style) {\n this._currentStyle.set(style);\n },\n getIndex: function getIndex() {\n return this._index;\n },\n getOptions: function getOptions() {\n return this._scope.settings;\n },\n getLayers: function getLayers() {\n return this._children;\n },\n getActiveLayer: function getActiveLayer() {\n return this._activeLayer || new Layer({\n project: this,\n insert: true\n });\n },\n getSymbolDefinitions: function getSymbolDefinitions() {\n var definitions = [],\n ids = {};\n this.getItems({\n class: SymbolItem,\n match: function match(item) {\n var definition = item._definition,\n id = definition._id;\n\n if (!ids[id]) {\n ids[id] = true;\n definitions.push(definition);\n }\n\n return false;\n }\n });\n return definitions;\n },\n getSymbols: 'getSymbolDefinitions',\n getSelectedItems: function getSelectedItems() {\n var selectionItems = this._selectionItems,\n items = [];\n\n for (var id in selectionItems) {\n var item = selectionItems[id],\n selection = item._selection;\n\n if (selection & 1 && item.isInserted()) {\n items.push(item);\n } else if (!selection) {\n this._updateSelection(item);\n }\n }\n\n return items;\n },\n _updateSelection: function _updateSelection(item) {\n var id = item._id,\n selectionItems = this._selectionItems;\n\n if (item._selection) {\n if (selectionItems[id] !== item) {\n this._selectionCount++;\n selectionItems[id] = item;\n }\n } else if (selectionItems[id] === item) {\n this._selectionCount--;\n delete selectionItems[id];\n }\n },\n selectAll: function selectAll() {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setFullySelected(true);\n }\n },\n deselectAll: function deselectAll() {\n var selectionItems = this._selectionItems;\n\n for (var i in selectionItems) {\n selectionItems[i].setFullySelected(false);\n }\n },\n addLayer: function addLayer(layer) {\n return this.insertLayer(undefined, layer);\n },\n insertLayer: function insertLayer(index, layer) {\n if (layer instanceof Layer) {\n layer._remove(false, true);\n\n Base.splice(this._children, [layer], index, 0);\n\n layer._setProject(this, true);\n\n var name = layer._name;\n if (name) layer.setName(name);\n if (this._changes) layer._changed(5);\n if (!this._activeLayer) this._activeLayer = layer;\n } else {\n layer = null;\n }\n\n return layer;\n },\n _insertItem: function _insertItem(index, item, _created) {\n item = this.insertLayer(index, item) || (this._activeLayer || this._insertItem(undefined, new Layer(Item.NO_INSERT), true)).insertChild(index, item);\n if (_created && item.activate) item.activate();\n return item;\n },\n getItems: function getItems(options) {\n return Item._getItems(this, options);\n },\n getItem: function getItem(options) {\n return Item._getItems(this, options, null, null, true)[0] || null;\n },\n importJSON: function importJSON(json) {\n this.activate();\n var layer = this._activeLayer;\n return Base.importJSON(json, layer && layer.isEmpty() && layer);\n },\n removeOn: function removeOn(type) {\n var sets = this._removeSets;\n\n if (sets) {\n if (type === 'mouseup') sets.mousedrag = null;\n var set = sets[type];\n\n if (set) {\n for (var id in set) {\n var item = set[id];\n\n for (var key in sets) {\n var other = sets[key];\n if (other && other != set) delete other[item._id];\n }\n\n item.remove();\n }\n\n sets[type] = null;\n }\n }\n },\n draw: function draw(ctx, matrix, pixelRatio) {\n this._updateVersion++;\n ctx.save();\n matrix.applyToContext(ctx);\n var children = this._children,\n param = new Base({\n offset: new Point(0, 0),\n pixelRatio: pixelRatio,\n viewMatrix: matrix.isIdentity() ? null : matrix,\n matrices: [new Matrix()],\n updateMatrix: true\n });\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].draw(ctx, param);\n }\n\n ctx.restore();\n\n if (this._selectionCount > 0) {\n ctx.save();\n ctx.strokeWidth = 1;\n var items = this._selectionItems,\n size = this._scope.settings.handleSize,\n version = this._updateVersion;\n\n for (var id in items) {\n items[id]._drawSelection(ctx, matrix, size, items, version);\n }\n\n ctx.restore();\n }\n }\n });\n var Item = Base.extend(Emitter, {\n statics: {\n extend: function extend(src) {\n if (src._serializeFields) src._serializeFields = Base.set({}, this.prototype._serializeFields, src._serializeFields);\n return extend.base.apply(this, arguments);\n },\n NO_INSERT: {\n insert: false\n }\n },\n _class: 'Item',\n _name: null,\n _applyMatrix: true,\n _canApplyMatrix: true,\n _canScaleStroke: false,\n _pivot: null,\n _visible: true,\n _blendMode: 'normal',\n _opacity: 1,\n _locked: false,\n _guide: false,\n _clipMask: false,\n _selection: 0,\n _selectBounds: true,\n _selectChildren: false,\n _serializeFields: {\n name: null,\n applyMatrix: null,\n matrix: new Matrix(),\n pivot: null,\n visible: true,\n blendMode: 'normal',\n opacity: 1,\n locked: false,\n guide: false,\n clipMask: false,\n selected: false,\n data: {}\n },\n _prioritize: ['applyMatrix']\n }, new function () {\n var handlers = ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onClick', 'onDoubleClick', 'onMouseMove', 'onMouseEnter', 'onMouseLeave'];\n return Base.each(handlers, function (name) {\n this._events[name] = {\n install: function install(type) {\n this.getView()._countItemEvent(type, 1);\n },\n uninstall: function uninstall(type) {\n this.getView()._countItemEvent(type, -1);\n }\n };\n }, {\n _events: {\n onFrame: {\n install: function install() {\n this.getView()._animateItem(this, true);\n },\n uninstall: function uninstall() {\n this.getView()._animateItem(this, false);\n }\n },\n onLoad: {},\n onError: {}\n },\n statics: {\n _itemHandlers: handlers\n }\n });\n }(), {\n initialize: function Item() {},\n _initialize: function _initialize(props, point) {\n var hasProps = props && Base.isPlainObject(props),\n internal = hasProps && props.internal === true,\n matrix = this._matrix = new Matrix(),\n project = hasProps && props.project || paper.project,\n settings = paper.settings;\n this._id = internal ? null : UID.get();\n this._parent = this._index = null;\n this._applyMatrix = this._canApplyMatrix && settings.applyMatrix;\n if (point) matrix.translate(point);\n matrix._owner = this;\n this._style = new Style(project._currentStyle, this, project);\n\n if (internal || hasProps && props.insert == false || !settings.insertItems && !(hasProps && props.insert === true)) {\n this._setProject(project);\n } else {\n (hasProps && props.parent || project)._insertItem(undefined, this, true);\n }\n\n if (hasProps && props !== Item.NO_INSERT) {\n this.set(props, {\n internal: true,\n insert: true,\n project: true,\n parent: true\n });\n }\n\n return hasProps;\n },\n _serialize: function _serialize(options, dictionary) {\n var props = {},\n that = this;\n\n function serialize(fields) {\n for (var key in fields) {\n var value = that[key];\n\n if (!Base.equals(value, key === 'leading' ? fields.fontSize * 1.2 : fields[key])) {\n props[key] = Base.serialize(value, options, key !== 'data', dictionary);\n }\n }\n }\n\n serialize(this._serializeFields);\n if (!(this instanceof Group)) serialize(this._style._defaults);\n return [this._class, props];\n },\n _changed: function _changed(flags) {\n var symbol = this._symbol,\n cacheParent = this._parent || symbol,\n project = this._project;\n\n if (flags & 8) {\n this._bounds = this._position = this._decomposed = undefined;\n }\n\n if (flags & 16) {\n this._globalMatrix = undefined;\n }\n\n if (cacheParent && flags & 72) {\n Item._clearBoundsCache(cacheParent);\n }\n\n if (flags & 2) {\n Item._clearBoundsCache(this);\n }\n\n if (project) project._changed(flags, this);\n if (symbol) symbol._changed(flags);\n },\n getId: function getId() {\n return this._id;\n },\n getName: function getName() {\n return this._name;\n },\n setName: function setName(name) {\n if (this._name) this._removeNamed();\n if (name === +name + '') throw new Error('Names consisting only of numbers are not supported.');\n\n var owner = this._getOwner();\n\n if (name && owner) {\n var children = owner._children,\n namedChildren = owner._namedChildren;\n (namedChildren[name] = namedChildren[name] || []).push(this);\n if (!(name in children)) children[name] = this;\n }\n\n this._name = name || undefined;\n\n this._changed(256);\n },\n getStyle: function getStyle() {\n return this._style;\n },\n setStyle: function setStyle(style) {\n this.getStyle().set(style);\n }\n }, Base.each(['locked', 'visible', 'blendMode', 'opacity', 'guide'], function (name) {\n var part = Base.capitalize(name),\n key = '_' + name,\n flags = {\n locked: 256,\n visible: 265\n };\n\n this['get' + part] = function () {\n return this[key];\n };\n\n this['set' + part] = function (value) {\n if (value != this[key]) {\n this[key] = value;\n\n this._changed(flags[name] || 257);\n }\n };\n }, {}), {\n beans: true,\n getSelection: function getSelection() {\n return this._selection;\n },\n setSelection: function setSelection(selection) {\n if (selection !== this._selection) {\n this._selection = selection;\n var project = this._project;\n\n if (project) {\n project._updateSelection(this);\n\n this._changed(257);\n }\n }\n },\n _changeSelection: function _changeSelection(flag, selected) {\n var selection = this._selection;\n this.setSelection(selected ? selection | flag : selection & ~flag);\n },\n isSelected: function isSelected() {\n if (this._selectChildren) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].isSelected()) return true;\n }\n }\n\n return !!(this._selection & 1);\n },\n setSelected: function setSelected(selected) {\n if (this._selectChildren) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setSelected(selected);\n }\n }\n\n this._changeSelection(1, selected);\n },\n isFullySelected: function isFullySelected() {\n var children = this._children,\n selected = !!(this._selection & 1);\n\n if (children && selected) {\n for (var i = 0, l = children.length; i < l; i++) {\n if (!children[i].isFullySelected()) return false;\n }\n\n return true;\n }\n\n return selected;\n },\n setFullySelected: function setFullySelected(selected) {\n var children = this._children;\n\n if (children) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setFullySelected(selected);\n }\n }\n\n this._changeSelection(1, selected);\n },\n isClipMask: function isClipMask() {\n return this._clipMask;\n },\n setClipMask: function setClipMask(clipMask) {\n if (this._clipMask != (clipMask = !!clipMask)) {\n this._clipMask = clipMask;\n\n if (clipMask) {\n this.setFillColor(null);\n this.setStrokeColor(null);\n }\n\n this._changed(257);\n\n if (this._parent) this._parent._changed(2048);\n }\n },\n getData: function getData() {\n if (!this._data) this._data = {};\n return this._data;\n },\n setData: function setData(data) {\n this._data = data;\n },\n getPosition: function getPosition(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n\n var position = this._position || (this._position = this._getPositionFromBounds());\n\n return new ctor(position.x, position.y, this, 'setPosition');\n },\n setPosition: function setPosition() {\n this.translate(Point.read(arguments).subtract(this.getPosition(true)));\n },\n _getPositionFromBounds: function _getPositionFromBounds(bounds) {\n return this._pivot ? this._matrix._transformPoint(this._pivot) : (bounds || this.getBounds()).getCenter(true);\n },\n getPivot: function getPivot() {\n var pivot = this._pivot;\n return pivot ? new LinkedPoint(pivot.x, pivot.y, this, 'setPivot') : null;\n },\n setPivot: function setPivot() {\n this._pivot = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n this._position = undefined;\n }\n }, Base.each({\n getStrokeBounds: {\n stroke: true\n },\n getHandleBounds: {\n handle: true\n },\n getInternalBounds: {\n internal: true\n }\n }, function (options, key) {\n this[key] = function (matrix) {\n return this.getBounds(matrix, options);\n };\n }, {\n beans: true,\n getBounds: function getBounds(matrix, options) {\n var hasMatrix = options || matrix instanceof Matrix,\n opts = Base.set({}, hasMatrix ? options : matrix, this._boundsOptions);\n if (!opts.stroke || this.getStrokeScaling()) opts.cacheItem = this;\n\n var rect = this._getCachedBounds(hasMatrix && matrix, opts).rect;\n\n return !arguments.length ? new LinkedRectangle(rect.x, rect.y, rect.width, rect.height, this, 'setBounds') : rect;\n },\n setBounds: function setBounds() {\n var rect = _Rectangle.read(arguments),\n bounds = this.getBounds(),\n _matrix = this._matrix,\n matrix = new Matrix(),\n center = rect.getCenter();\n\n matrix.translate(center);\n\n if (rect.width != bounds.width || rect.height != bounds.height) {\n if (!_matrix.isInvertible()) {\n _matrix.set(_matrix._backup || new Matrix().translate(_matrix.getTranslation()));\n\n bounds = this.getBounds();\n }\n\n matrix.scale(bounds.width !== 0 ? rect.width / bounds.width : 0, bounds.height !== 0 ? rect.height / bounds.height : 0);\n }\n\n center = bounds.getCenter();\n matrix.translate(-center.x, -center.y);\n this.transform(matrix);\n },\n _getBounds: function _getBounds(matrix, options) {\n var children = this._children;\n if (!children || !children.length) return new _Rectangle();\n\n Item._updateBoundsCache(this, options.cacheItem);\n\n return Item._getBounds(children, matrix, options);\n },\n _getBoundsCacheKey: function _getBoundsCacheKey(options, internal) {\n return [options.stroke ? 1 : 0, options.handle ? 1 : 0, internal ? 1 : 0].join('');\n },\n _getCachedBounds: function _getCachedBounds(matrix, options, noInternal) {\n matrix = matrix && matrix._orNullIfIdentity();\n\n var internal = options.internal && !noInternal,\n cacheItem = options.cacheItem,\n _matrix = internal ? null : this._matrix._orNullIfIdentity(),\n cacheKey = cacheItem && (!matrix || matrix.equals(_matrix)) && this._getBoundsCacheKey(options, internal),\n bounds = this._bounds;\n\n Item._updateBoundsCache(this._parent || this._symbol, cacheItem);\n\n if (cacheKey && bounds && cacheKey in bounds) {\n var cached = bounds[cacheKey];\n return {\n rect: cached.rect.clone(),\n nonscaling: cached.nonscaling\n };\n }\n\n var res = this._getBounds(matrix || _matrix, options),\n rect = res.rect || res,\n style = this._style,\n nonscaling = res.nonscaling || style.hasStroke() && !style.getStrokeScaling();\n\n if (cacheKey) {\n if (!bounds) {\n this._bounds = bounds = {};\n }\n\n var cached = bounds[cacheKey] = {\n rect: rect.clone(),\n nonscaling: nonscaling,\n internal: internal\n };\n }\n\n return {\n rect: rect,\n nonscaling: nonscaling\n };\n },\n _getStrokeMatrix: function _getStrokeMatrix(matrix, options) {\n var parent = this.getStrokeScaling() ? null : options && options.internal ? this : this._parent || this._symbol && this._symbol._item,\n mx = parent ? parent.getViewMatrix().invert() : matrix;\n return mx && mx._shiftless();\n },\n statics: {\n _updateBoundsCache: function _updateBoundsCache(parent, item) {\n if (parent && item) {\n var id = item._id,\n ref = parent._boundsCache = parent._boundsCache || {\n ids: {},\n list: []\n };\n\n if (!ref.ids[id]) {\n ref.list.push(item);\n ref.ids[id] = item;\n }\n }\n },\n _clearBoundsCache: function _clearBoundsCache(item) {\n var cache = item._boundsCache;\n\n if (cache) {\n item._bounds = item._position = item._boundsCache = undefined;\n\n for (var i = 0, list = cache.list, l = list.length; i < l; i++) {\n var other = list[i];\n\n if (other !== item) {\n other._bounds = other._position = undefined;\n if (other._boundsCache) Item._clearBoundsCache(other);\n }\n }\n }\n },\n _getBounds: function _getBounds(items, matrix, options) {\n var x1 = Infinity,\n x2 = -x1,\n y1 = x1,\n y2 = x2,\n nonscaling = false;\n options = options || {};\n\n for (var i = 0, l = items.length; i < l; i++) {\n var item = items[i];\n\n if (item._visible && !item.isEmpty(true)) {\n var bounds = item._getCachedBounds(matrix && matrix.appended(item._matrix), options, true),\n rect = bounds.rect;\n\n x1 = Math.min(rect.x, x1);\n y1 = Math.min(rect.y, y1);\n x2 = Math.max(rect.x + rect.width, x2);\n y2 = Math.max(rect.y + rect.height, y2);\n if (bounds.nonscaling) nonscaling = true;\n }\n }\n\n return {\n rect: isFinite(x1) ? new _Rectangle(x1, y1, x2 - x1, y2 - y1) : new _Rectangle(),\n nonscaling: nonscaling\n };\n }\n }\n }), {\n beans: true,\n _decompose: function _decompose() {\n return this._applyMatrix ? null : this._decomposed || (this._decomposed = this._matrix.decompose());\n },\n getRotation: function getRotation() {\n var decomposed = this._decompose();\n\n return decomposed ? decomposed.rotation : 0;\n },\n setRotation: function setRotation(rotation) {\n var current = this.getRotation();\n\n if (current != null && rotation != null) {\n var decomposed = this._decomposed;\n this.rotate(rotation - current);\n\n if (decomposed) {\n decomposed.rotation = rotation;\n this._decomposed = decomposed;\n }\n }\n },\n getScaling: function getScaling() {\n var decomposed = this._decompose(),\n s = decomposed && decomposed.scaling;\n\n return new LinkedPoint(s ? s.x : 1, s ? s.y : 1, this, 'setScaling');\n },\n setScaling: function setScaling() {\n var current = this.getScaling(),\n scaling = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n\n if (current && scaling && !current.equals(scaling)) {\n var rotation = this.getRotation(),\n decomposed = this._decomposed,\n matrix = new Matrix(),\n isZero = Numerical.isZero;\n\n if (isZero(current.x) || isZero(current.y)) {\n matrix.translate(decomposed.translation);\n\n if (rotation) {\n matrix.rotate(rotation);\n }\n\n matrix.scale(scaling.x, scaling.y);\n\n this._matrix.set(matrix);\n } else {\n var center = this.getPosition(true);\n matrix.translate(center);\n if (rotation) matrix.rotate(rotation);\n matrix.scale(scaling.x / current.x, scaling.y / current.y);\n if (rotation) matrix.rotate(-rotation);\n matrix.translate(center.negate());\n this.transform(matrix);\n }\n\n if (decomposed) {\n decomposed.scaling = scaling;\n this._decomposed = decomposed;\n }\n }\n },\n getMatrix: function getMatrix() {\n return this._matrix;\n },\n setMatrix: function setMatrix() {\n var matrix = this._matrix;\n matrix.set.apply(matrix, arguments);\n },\n getGlobalMatrix: function getGlobalMatrix(_dontClone) {\n var matrix = this._globalMatrix;\n\n if (matrix) {\n var parent = this._parent;\n var parents = [];\n\n while (parent) {\n if (!parent._globalMatrix) {\n matrix = null;\n\n for (var i = 0, l = parents.length; i < l; i++) {\n parents[i]._globalMatrix = null;\n }\n\n break;\n }\n\n parents.push(parent);\n parent = parent._parent;\n }\n }\n\n if (!matrix) {\n matrix = this._globalMatrix = this._matrix.clone();\n var parent = this._parent;\n if (parent) matrix.prepend(parent.getGlobalMatrix(true));\n }\n\n return _dontClone ? matrix : matrix.clone();\n },\n getViewMatrix: function getViewMatrix() {\n return this.getGlobalMatrix().prepend(this.getView()._matrix);\n },\n getApplyMatrix: function getApplyMatrix() {\n return this._applyMatrix;\n },\n setApplyMatrix: function setApplyMatrix(apply) {\n if (this._applyMatrix = this._canApplyMatrix && !!apply) this.transform(null, true);\n },\n getTransformContent: '#getApplyMatrix',\n setTransformContent: '#setApplyMatrix'\n }, {\n getProject: function getProject() {\n return this._project;\n },\n _setProject: function _setProject(project, installEvents) {\n if (this._project !== project) {\n if (this._project) this._installEvents(false);\n this._project = project;\n var children = this._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n children[i]._setProject(project);\n }\n\n installEvents = true;\n }\n\n if (installEvents) this._installEvents(true);\n },\n getView: function getView() {\n return this._project._view;\n },\n _installEvents: function _installEvents(install) {\n _installEvents.base.call(this, install);\n\n var children = this._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n children[i]._installEvents(install);\n }\n },\n getLayer: function getLayer() {\n var parent = this;\n\n while (parent = parent._parent) {\n if (parent instanceof Layer) return parent;\n }\n\n return null;\n },\n getParent: function getParent() {\n return this._parent;\n },\n setParent: function setParent(item) {\n return item.addChild(this);\n },\n _getOwner: '#getParent',\n getChildren: function getChildren() {\n return this._children;\n },\n setChildren: function setChildren(items) {\n this.removeChildren();\n this.addChildren(items);\n },\n getFirstChild: function getFirstChild() {\n return this._children && this._children[0] || null;\n },\n getLastChild: function getLastChild() {\n return this._children && this._children[this._children.length - 1] || null;\n },\n getNextSibling: function getNextSibling() {\n var owner = this._getOwner();\n\n return owner && owner._children[this._index + 1] || null;\n },\n getPreviousSibling: function getPreviousSibling() {\n var owner = this._getOwner();\n\n return owner && owner._children[this._index - 1] || null;\n },\n getIndex: function getIndex() {\n return this._index;\n },\n equals: function equals(item) {\n return item === this || item && this._class === item._class && this._style.equals(item._style) && this._matrix.equals(item._matrix) && this._locked === item._locked && this._visible === item._visible && this._blendMode === item._blendMode && this._opacity === item._opacity && this._clipMask === item._clipMask && this._guide === item._guide && this._equals(item) || false;\n },\n _equals: function _equals(item) {\n return Base.equals(this._children, item._children);\n },\n clone: function clone(options) {\n var copy = new this.constructor(Item.NO_INSERT),\n children = this._children,\n insert = Base.pick(options ? options.insert : undefined, options === undefined || options === true),\n deep = Base.pick(options ? options.deep : undefined, true);\n if (children) copy.copyAttributes(this);\n if (!children || deep) copy.copyContent(this);\n if (!children) copy.copyAttributes(this);\n if (insert) copy.insertAbove(this);\n var name = this._name,\n parent = this._parent;\n\n if (name && parent) {\n var children = parent._children,\n orig = name,\n i = 1;\n\n while (children[name]) {\n name = orig + ' ' + i++;\n }\n\n if (name !== orig) copy.setName(name);\n }\n\n return copy;\n },\n copyContent: function copyContent(source) {\n var children = source._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n this.addChild(children[i].clone(false), true);\n }\n },\n copyAttributes: function copyAttributes(source, excludeMatrix) {\n this.setStyle(source._style);\n var keys = ['_locked', '_visible', '_blendMode', '_opacity', '_clipMask', '_guide'];\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n if (source.hasOwnProperty(key)) this[key] = source[key];\n }\n\n if (!excludeMatrix) this._matrix.set(source._matrix, true);\n this.setApplyMatrix(source._applyMatrix);\n this.setPivot(source._pivot);\n this.setSelection(source._selection);\n var data = source._data,\n name = source._name;\n this._data = data ? Base.clone(data) : null;\n if (name) this.setName(name);\n },\n rasterize: function rasterize(arg0, arg1) {\n var resolution, insert, raster;\n\n if (Base.isPlainObject(arg0)) {\n resolution = arg0.resolution;\n insert = arg0.insert;\n raster = arg0.raster;\n } else {\n resolution = arg0;\n insert = arg1;\n }\n\n if (raster) {\n raster.matrix.reset(true);\n } else {\n raster = new Raster(Item.NO_INSERT);\n }\n\n var bounds = this.getStrokeBounds(),\n scale = (resolution || this.getView().getResolution()) / 72,\n topLeft = bounds.getTopLeft().floor(),\n bottomRight = bounds.getBottomRight().ceil(),\n boundsSize = new Size(bottomRight.subtract(topLeft)),\n rasterSize = boundsSize.multiply(scale);\n raster.setSize(rasterSize, true);\n\n if (!rasterSize.isZero()) {\n var ctx = raster.getContext(true),\n matrix = new Matrix().scale(scale).translate(topLeft.negate());\n ctx.save();\n matrix.applyToContext(ctx);\n this.draw(ctx, new Base({\n matrices: [matrix]\n }));\n ctx.restore();\n }\n\n raster.transform(new Matrix().translate(topLeft.add(boundsSize.divide(2))).scale(1 / scale));\n\n if (insert === undefined || insert) {\n raster.insertAbove(this);\n }\n\n return raster;\n },\n contains: function contains() {\n var matrix = this._matrix;\n return matrix.isInvertible() && !!this._contains(matrix._inverseTransform(Point.read(arguments)));\n },\n _contains: function _contains(point) {\n var children = this._children;\n\n if (children) {\n for (var i = children.length - 1; i >= 0; i--) {\n if (children[i].contains(point)) return true;\n }\n\n return false;\n }\n\n return point.isInside(this.getInternalBounds());\n },\n isInside: function isInside() {\n return _Rectangle.read(arguments).contains(this.getBounds());\n },\n _asPathItem: function _asPathItem() {\n return new Path.Rectangle({\n rectangle: this.getInternalBounds(),\n matrix: this._matrix,\n insert: false\n });\n },\n intersects: function intersects(item, _matrix) {\n if (!(item instanceof Item)) return false;\n return this._asPathItem().getIntersections(item._asPathItem(), null, _matrix, true).length > 0;\n }\n }, new function () {\n function hitTest() {\n var args = arguments;\n return this._hitTest(Point.read(args), HitResult.getOptions(args));\n }\n\n function hitTestAll() {\n var args = arguments,\n point = Point.read(args),\n options = HitResult.getOptions(args),\n all = [];\n\n this._hitTest(point, new Base({\n all: all\n }, options));\n\n return all;\n }\n\n function hitTestChildren(point, options, viewMatrix, _exclude) {\n var children = this._children;\n\n if (children) {\n for (var i = children.length - 1; i >= 0; i--) {\n var child = children[i];\n\n var res = child !== _exclude && child._hitTest(point, options, viewMatrix);\n\n if (res && !options.all) return res;\n }\n }\n\n return null;\n }\n\n Project.inject({\n hitTest: hitTest,\n hitTestAll: hitTestAll,\n _hitTest: hitTestChildren\n });\n return {\n hitTest: hitTest,\n hitTestAll: hitTestAll,\n _hitTestChildren: hitTestChildren\n };\n }(), {\n _hitTest: function _hitTest(point, options, parentViewMatrix) {\n if (this._locked || !this._visible || this._guide && !options.guides || this.isEmpty()) {\n return null;\n }\n\n var matrix = this._matrix,\n viewMatrix = parentViewMatrix ? parentViewMatrix.appended(matrix) : this.getGlobalMatrix().prepend(this.getView()._matrix),\n tolerance = Math.max(options.tolerance, 1e-12),\n tolerancePadding = options._tolerancePadding = new Size(Path._getStrokePadding(tolerance, matrix._shiftless().invert()));\n point = matrix._inverseTransform(point);\n\n if (!point || !this._children && !this.getBounds({\n internal: true,\n stroke: true,\n handle: true\n }).expand(tolerancePadding.multiply(2))._containsPoint(point)) {\n return null;\n }\n\n var checkSelf = !(options.guides && !this._guide || options.selected && !this.isSelected() || options.type && options.type !== Base.hyphenate(this._class) || options.class && !(this instanceof options.class)),\n match = options.match,\n that = this,\n bounds,\n res;\n\n function filter(hit) {\n if (hit && match && !match(hit)) hit = null;\n if (hit && options.all) options.all.push(hit);\n return hit;\n }\n\n function checkPoint(type, part) {\n var pt = part ? bounds['get' + part]() : that.getPosition();\n\n if (point.subtract(pt).divide(tolerancePadding).length <= 1) {\n return new HitResult(type, that, {\n name: part ? Base.hyphenate(part) : type,\n point: pt\n });\n }\n }\n\n var checkPosition = options.position,\n checkCenter = options.center,\n checkBounds = options.bounds;\n\n if (checkSelf && this._parent && (checkPosition || checkCenter || checkBounds)) {\n if (checkCenter || checkBounds) {\n bounds = this.getInternalBounds();\n }\n\n res = checkPosition && checkPoint('position') || checkCenter && checkPoint('center', 'Center');\n\n if (!res && checkBounds) {\n var points = ['TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'];\n\n for (var i = 0; i < 8 && !res; i++) {\n res = checkPoint('bounds', points[i]);\n }\n }\n\n res = filter(res);\n }\n\n if (!res) {\n res = this._hitTestChildren(point, options, viewMatrix) || checkSelf && filter(this._hitTestSelf(point, options, viewMatrix, this.getStrokeScaling() ? null : viewMatrix._shiftless().invert())) || null;\n }\n\n if (res && res.point) {\n res.point = matrix.transform(res.point);\n }\n\n return res;\n },\n _hitTestSelf: function _hitTestSelf(point, options) {\n if (options.fill && this.hasFill() && this._contains(point)) return new HitResult('fill', this);\n },\n matches: function matches(name, compare) {\n function matchObject(obj1, obj2) {\n for (var i in obj1) {\n if (obj1.hasOwnProperty(i)) {\n var val1 = obj1[i],\n val2 = obj2[i];\n\n if (Base.isPlainObject(val1) && Base.isPlainObject(val2)) {\n if (!matchObject(val1, val2)) return false;\n } else if (!Base.equals(val1, val2)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n var type = typeof name;\n\n if (type === 'object') {\n for (var key in name) {\n if (name.hasOwnProperty(key) && !this.matches(key, name[key])) return false;\n }\n\n return true;\n } else if (type === 'function') {\n return name(this);\n } else if (name === 'match') {\n return compare(this);\n } else {\n var value = /^(empty|editable)$/.test(name) ? this['is' + Base.capitalize(name)]() : name === 'type' ? Base.hyphenate(this._class) : this[name];\n\n if (name === 'class') {\n if (typeof compare === 'function') return this instanceof compare;\n value = this._class;\n }\n\n if (typeof compare === 'function') {\n return !!compare(value);\n } else if (compare) {\n if (compare.test) {\n return compare.test(value);\n } else if (Base.isPlainObject(compare)) {\n return matchObject(compare, value);\n }\n }\n\n return Base.equals(value, compare);\n }\n },\n getItems: function getItems(options) {\n return Item._getItems(this, options, this._matrix);\n },\n getItem: function getItem(options) {\n return Item._getItems(this, options, this._matrix, null, true)[0] || null;\n },\n statics: {\n _getItems: function _getItems(item, options, matrix, param, firstOnly) {\n if (!param) {\n var obj = typeof options === 'object' && options,\n overlapping = obj && obj.overlapping,\n inside = obj && obj.inside,\n bounds = overlapping || inside,\n rect = bounds && _Rectangle.read([bounds]);\n\n param = {\n items: [],\n recursive: obj && obj.recursive !== false,\n inside: !!inside,\n overlapping: !!overlapping,\n rect: rect,\n path: overlapping && new Path.Rectangle({\n rectangle: rect,\n insert: false\n })\n };\n\n if (obj) {\n options = Base.filter({}, options, {\n recursive: true,\n inside: true,\n overlapping: true\n });\n }\n }\n\n var children = item._children,\n items = param.items,\n rect = param.rect;\n matrix = rect && (matrix || new Matrix());\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n var child = children[i],\n childMatrix = matrix && matrix.appended(child._matrix),\n add = true;\n\n if (rect) {\n var bounds = child.getBounds(childMatrix);\n if (!rect.intersects(bounds)) continue;\n if (!(rect.contains(bounds) || param.overlapping && (bounds.contains(rect) || param.path.intersects(child, childMatrix)))) add = false;\n }\n\n if (add && child.matches(options)) {\n items.push(child);\n if (firstOnly) break;\n }\n\n if (param.recursive !== false) {\n _getItems(child, options, childMatrix, param, firstOnly);\n }\n\n if (firstOnly && items.length > 0) break;\n }\n\n return items;\n }\n }\n }, {\n importJSON: function importJSON(json) {\n var res = Base.importJSON(json, this);\n return res !== this ? this.addChild(res) : res;\n },\n addChild: function addChild(item) {\n return this.insertChild(undefined, item);\n },\n insertChild: function insertChild(index, item) {\n var res = item ? this.insertChildren(index, [item]) : null;\n return res && res[0];\n },\n addChildren: function addChildren(items) {\n return this.insertChildren(this._children.length, items);\n },\n insertChildren: function insertChildren(index, items) {\n var children = this._children;\n\n if (children && items && items.length > 0) {\n items = Base.slice(items);\n var inserted = {};\n\n for (var i = items.length - 1; i >= 0; i--) {\n var item = items[i],\n id = item && item._id;\n\n if (!item || inserted[id]) {\n items.splice(i, 1);\n } else {\n item._remove(false, true);\n\n inserted[id] = true;\n }\n }\n\n Base.splice(children, items, index, 0);\n var project = this._project,\n notifySelf = project._changes;\n\n for (var i = 0, l = items.length; i < l; i++) {\n var item = items[i],\n name = item._name;\n item._parent = this;\n\n item._setProject(project, true);\n\n if (name) item.setName(name);\n if (notifySelf) item._changed(5);\n }\n\n this._changed(11);\n } else {\n items = null;\n }\n\n return items;\n },\n _insertItem: '#insertChild',\n _insertAt: function _insertAt(item, offset) {\n var owner = item && item._getOwner(),\n res = item !== this && owner ? this : null;\n\n if (res) {\n res._remove(false, true);\n\n owner._insertItem(item._index + offset, res);\n }\n\n return res;\n },\n insertAbove: function insertAbove(item) {\n return this._insertAt(item, 1);\n },\n insertBelow: function insertBelow(item) {\n return this._insertAt(item, 0);\n },\n sendToBack: function sendToBack() {\n var owner = this._getOwner();\n\n return owner ? owner._insertItem(0, this) : null;\n },\n bringToFront: function bringToFront() {\n var owner = this._getOwner();\n\n return owner ? owner._insertItem(undefined, this) : null;\n },\n appendTop: '#addChild',\n appendBottom: function appendBottom(item) {\n return this.insertChild(0, item);\n },\n moveAbove: '#insertAbove',\n moveBelow: '#insertBelow',\n addTo: function addTo(owner) {\n return owner._insertItem(undefined, this);\n },\n copyTo: function copyTo(owner) {\n return this.clone(false).addTo(owner);\n },\n reduce: function reduce(options) {\n var children = this._children;\n\n if (children && children.length === 1) {\n var child = children[0].reduce(options);\n\n if (this._parent) {\n child.insertAbove(this);\n this.remove();\n } else {\n child.remove();\n }\n\n return child;\n }\n\n return this;\n },\n _removeNamed: function _removeNamed() {\n var owner = this._getOwner();\n\n if (owner) {\n var children = owner._children,\n namedChildren = owner._namedChildren,\n name = this._name,\n namedArray = namedChildren[name],\n index = namedArray ? namedArray.indexOf(this) : -1;\n\n if (index !== -1) {\n if (children[name] == this) delete children[name];\n namedArray.splice(index, 1);\n\n if (namedArray.length) {\n children[name] = namedArray[0];\n } else {\n delete namedChildren[name];\n }\n }\n }\n },\n _remove: function _remove(notifySelf, notifyParent) {\n var owner = this._getOwner(),\n project = this._project,\n index = this._index;\n\n if (this._style) this._style._dispose();\n\n if (owner) {\n if (this._name) this._removeNamed();\n\n if (index != null) {\n if (project._activeLayer === this) project._activeLayer = this.getNextSibling() || this.getPreviousSibling();\n Base.splice(owner._children, null, index, 1);\n }\n\n this._installEvents(false);\n\n if (notifySelf && project._changes) this._changed(5);\n if (notifyParent) owner._changed(11, this);\n this._parent = null;\n return true;\n }\n\n return false;\n },\n remove: function remove() {\n return this._remove(true, true);\n },\n replaceWith: function replaceWith(item) {\n var ok = item && item.insertBelow(this);\n if (ok) this.remove();\n return ok;\n },\n removeChildren: function removeChildren(start, end) {\n if (!this._children) return null;\n start = start || 0;\n end = Base.pick(end, this._children.length);\n var removed = Base.splice(this._children, null, start, end - start);\n\n for (var i = removed.length - 1; i >= 0; i--) {\n removed[i]._remove(true, false);\n }\n\n if (removed.length > 0) this._changed(11);\n return removed;\n },\n clear: '#removeChildren',\n reverseChildren: function reverseChildren() {\n if (this._children) {\n this._children.reverse();\n\n for (var i = 0, l = this._children.length; i < l; i++) {\n this._children[i]._index = i;\n }\n\n this._changed(11);\n }\n },\n isEmpty: function isEmpty(recursively) {\n var children = this._children;\n var numChildren = children ? children.length : 0;\n\n if (recursively) {\n for (var i = 0; i < numChildren; i++) {\n if (!children[i].isEmpty(recursively)) {\n return false;\n }\n }\n\n return true;\n }\n\n return !numChildren;\n },\n isEditable: function isEditable() {\n var item = this;\n\n while (item) {\n if (!item._visible || item._locked) return false;\n item = item._parent;\n }\n\n return true;\n },\n hasFill: function hasFill() {\n return this.getStyle().hasFill();\n },\n hasStroke: function hasStroke() {\n return this.getStyle().hasStroke();\n },\n hasShadow: function hasShadow() {\n return this.getStyle().hasShadow();\n },\n _getOrder: function _getOrder(item) {\n function getList(item) {\n var list = [];\n\n do {\n list.unshift(item);\n } while (item = item._parent);\n\n return list;\n }\n\n var list1 = getList(this),\n list2 = getList(item);\n\n for (var i = 0, l = Math.min(list1.length, list2.length); i < l; i++) {\n if (list1[i] != list2[i]) {\n return list1[i]._index < list2[i]._index ? 1 : -1;\n }\n }\n\n return 0;\n },\n hasChildren: function hasChildren() {\n return this._children && this._children.length > 0;\n },\n isInserted: function isInserted() {\n return this._parent ? this._parent.isInserted() : false;\n },\n isAbove: function isAbove(item) {\n return this._getOrder(item) === -1;\n },\n isBelow: function isBelow(item) {\n return this._getOrder(item) === 1;\n },\n isParent: function isParent(item) {\n return this._parent === item;\n },\n isChild: function isChild(item) {\n return item && item._parent === this;\n },\n isDescendant: function isDescendant(item) {\n var parent = this;\n\n while (parent = parent._parent) {\n if (parent === item) return true;\n }\n\n return false;\n },\n isAncestor: function isAncestor(item) {\n return item ? item.isDescendant(this) : false;\n },\n isSibling: function isSibling(item) {\n return this._parent === item._parent;\n },\n isGroupedWith: function isGroupedWith(item) {\n var parent = this._parent;\n\n while (parent) {\n if (parent._parent && /^(Group|Layer|CompoundPath)$/.test(parent._class) && item.isDescendant(parent)) return true;\n parent = parent._parent;\n }\n\n return false;\n }\n }, Base.each(['rotate', 'scale', 'shear', 'skew'], function (key) {\n var rotate = key === 'rotate';\n\n this[key] = function () {\n var args = arguments,\n value = (rotate ? Base : Point).read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n return this.transform(new Matrix()[key](value, center || this.getPosition(true)));\n };\n }, {\n translate: function translate() {\n var mx = new Matrix();\n return this.transform(mx.translate.apply(mx, arguments));\n },\n transform: function transform(matrix, _applyRecursively, _setApplyMatrix) {\n var _matrix = this._matrix,\n transformMatrix = matrix && !matrix.isIdentity(),\n applyMatrix = _setApplyMatrix && this._canApplyMatrix || this._applyMatrix && (transformMatrix || !_matrix.isIdentity() || _applyRecursively && this._children);\n if (!transformMatrix && !applyMatrix) return this;\n\n if (transformMatrix) {\n if (!matrix.isInvertible() && _matrix.isInvertible()) _matrix._backup = _matrix.getValues();\n\n _matrix.prepend(matrix, true);\n\n var style = this._style,\n fillColor = style.getFillColor(true),\n strokeColor = style.getStrokeColor(true);\n if (fillColor) fillColor.transform(matrix);\n if (strokeColor) strokeColor.transform(matrix);\n }\n\n if (applyMatrix && (applyMatrix = this._transformContent(_matrix, _applyRecursively, _setApplyMatrix))) {\n var pivot = this._pivot;\n if (pivot) _matrix._transformPoint(pivot, pivot, true);\n\n _matrix.reset(true);\n\n if (_setApplyMatrix && this._canApplyMatrix) this._applyMatrix = true;\n }\n\n var bounds = this._bounds,\n position = this._position;\n\n if (transformMatrix || applyMatrix) {\n this._changed(25);\n }\n\n var decomp = transformMatrix && bounds && matrix.decompose();\n\n if (decomp && decomp.skewing.isZero() && decomp.rotation % 90 === 0) {\n for (var key in bounds) {\n var cache = bounds[key];\n\n if (cache.nonscaling) {\n delete bounds[key];\n } else if (applyMatrix || !cache.internal) {\n var rect = cache.rect;\n\n matrix._transformBounds(rect, rect);\n }\n }\n\n this._bounds = bounds;\n\n var cached = bounds[this._getBoundsCacheKey(this._boundsOptions || {})];\n\n if (cached) {\n this._position = this._getPositionFromBounds(cached.rect);\n }\n } else if (transformMatrix && position && this._pivot) {\n this._position = matrix._transformPoint(position, position);\n }\n\n return this;\n },\n _transformContent: function _transformContent(matrix, applyRecursively, setApplyMatrix) {\n var children = this._children;\n\n if (children) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].transform(matrix, applyRecursively, setApplyMatrix);\n }\n\n return true;\n }\n },\n globalToLocal: function globalToLocal() {\n return this.getGlobalMatrix(true)._inverseTransform(Point.read(arguments));\n },\n localToGlobal: function localToGlobal() {\n return this.getGlobalMatrix(true)._transformPoint(Point.read(arguments));\n },\n parentToLocal: function parentToLocal() {\n return this._matrix._inverseTransform(Point.read(arguments));\n },\n localToParent: function localToParent() {\n return this._matrix._transformPoint(Point.read(arguments));\n },\n fitBounds: function fitBounds(rectangle, fill) {\n rectangle = _Rectangle.read(arguments);\n var bounds = this.getBounds(),\n itemRatio = bounds.height / bounds.width,\n rectRatio = rectangle.height / rectangle.width,\n scale = (fill ? itemRatio > rectRatio : itemRatio < rectRatio) ? rectangle.width / bounds.width : rectangle.height / bounds.height,\n newBounds = new _Rectangle(new Point(), new Size(bounds.width * scale, bounds.height * scale));\n newBounds.setCenter(rectangle.getCenter());\n this.setBounds(newBounds);\n }\n }), {\n _setStyles: function _setStyles(ctx, param, viewMatrix) {\n var style = this._style,\n matrix = this._matrix;\n\n if (style.hasFill()) {\n ctx.fillStyle = style.getFillColor().toCanvasStyle(ctx, matrix);\n }\n\n if (style.hasStroke()) {\n ctx.strokeStyle = style.getStrokeColor().toCanvasStyle(ctx, matrix);\n ctx.lineWidth = style.getStrokeWidth();\n var strokeJoin = style.getStrokeJoin(),\n strokeCap = style.getStrokeCap(),\n miterLimit = style.getMiterLimit();\n if (strokeJoin) ctx.lineJoin = strokeJoin;\n if (strokeCap) ctx.lineCap = strokeCap;\n if (miterLimit) ctx.miterLimit = miterLimit;\n\n if (paper.support.nativeDash) {\n var dashArray = style.getDashArray(),\n dashOffset = style.getDashOffset();\n\n if (dashArray && dashArray.length) {\n if ('setLineDash' in ctx) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashOffset;\n } else {\n ctx.mozDash = dashArray;\n ctx.mozDashOffset = dashOffset;\n }\n }\n }\n }\n\n if (style.hasShadow()) {\n var pixelRatio = param.pixelRatio || 1,\n mx = viewMatrix._shiftless().prepend(new Matrix().scale(pixelRatio, pixelRatio)),\n blur = mx.transform(new Point(style.getShadowBlur(), 0)),\n offset = mx.transform(this.getShadowOffset());\n\n ctx.shadowColor = style.getShadowColor().toCanvasStyle(ctx);\n ctx.shadowBlur = blur.getLength();\n ctx.shadowOffsetX = offset.x;\n ctx.shadowOffsetY = offset.y;\n }\n },\n draw: function draw(ctx, param, parentStrokeMatrix) {\n var updateVersion = this._updateVersion = this._project._updateVersion;\n if (!this._visible || this._opacity === 0) return;\n var matrices = param.matrices,\n viewMatrix = param.viewMatrix,\n matrix = this._matrix,\n globalMatrix = matrices[matrices.length - 1].appended(matrix);\n if (!globalMatrix.isInvertible()) return;\n viewMatrix = viewMatrix ? viewMatrix.appended(globalMatrix) : globalMatrix;\n matrices.push(globalMatrix);\n\n if (param.updateMatrix) {\n this._globalMatrix = globalMatrix;\n }\n\n var blendMode = this._blendMode,\n opacity = Numerical.clamp(this._opacity, 0, 1),\n normalBlend = blendMode === 'normal',\n nativeBlend = BlendMode.nativeModes[blendMode],\n direct = normalBlend && opacity === 1 || param.dontStart || param.clip || (nativeBlend || normalBlend && opacity < 1) && this._canComposite(),\n pixelRatio = param.pixelRatio || 1,\n mainCtx,\n itemOffset,\n prevOffset;\n\n if (!direct) {\n var bounds = this.getStrokeBounds(viewMatrix);\n\n if (!bounds.width || !bounds.height) {\n matrices.pop();\n return;\n }\n\n prevOffset = param.offset;\n itemOffset = param.offset = bounds.getTopLeft().floor();\n mainCtx = ctx;\n ctx = CanvasProvider.getContext(bounds.getSize().ceil().add(1).multiply(pixelRatio));\n if (pixelRatio !== 1) ctx.scale(pixelRatio, pixelRatio);\n }\n\n ctx.save();\n var strokeMatrix = parentStrokeMatrix ? parentStrokeMatrix.appended(matrix) : this._canScaleStroke && !this.getStrokeScaling(true) && viewMatrix,\n clip = !direct && param.clipItem,\n transform = !strokeMatrix || clip;\n\n if (direct) {\n ctx.globalAlpha = opacity;\n if (nativeBlend) ctx.globalCompositeOperation = blendMode;\n } else if (transform) {\n ctx.translate(-itemOffset.x, -itemOffset.y);\n }\n\n if (transform) {\n (direct ? matrix : viewMatrix).applyToContext(ctx);\n }\n\n if (clip) {\n param.clipItem.draw(ctx, param.extend({\n clip: true\n }));\n }\n\n if (strokeMatrix) {\n ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n var offset = param.offset;\n if (offset) ctx.translate(-offset.x, -offset.y);\n }\n\n this._draw(ctx, param, viewMatrix, strokeMatrix);\n\n ctx.restore();\n matrices.pop();\n\n if (param.clip && !param.dontFinish) {\n ctx.clip(this.getFillRule());\n }\n\n if (!direct) {\n BlendMode.process(blendMode, ctx, mainCtx, opacity, itemOffset.subtract(prevOffset).multiply(pixelRatio));\n CanvasProvider.release(ctx);\n param.offset = prevOffset;\n }\n },\n _isUpdated: function _isUpdated(updateVersion) {\n var parent = this._parent;\n if (parent instanceof CompoundPath) return parent._isUpdated(updateVersion);\n var updated = this._updateVersion === updateVersion;\n\n if (!updated && parent && parent._visible && parent._isUpdated(updateVersion)) {\n this._updateVersion = updateVersion;\n updated = true;\n }\n\n return updated;\n },\n _drawSelection: function _drawSelection(ctx, matrix, size, selectionItems, updateVersion) {\n var selection = this._selection,\n itemSelected = selection & 1,\n boundsSelected = selection & 2 || itemSelected && this._selectBounds,\n positionSelected = selection & 4;\n if (!this._drawSelected) itemSelected = false;\n\n if ((itemSelected || boundsSelected || positionSelected) && this._isUpdated(updateVersion)) {\n var layer,\n color = this.getSelectedColor(true) || (layer = this.getLayer()) && layer.getSelectedColor(true),\n mx = matrix.appended(this.getGlobalMatrix(true)),\n half = size / 2;\n ctx.strokeStyle = ctx.fillStyle = color ? color.toCanvasStyle(ctx) : '#009dec';\n if (itemSelected) this._drawSelected(ctx, mx, selectionItems);\n\n if (positionSelected) {\n var pos = this.getPosition(true),\n parent = this._parent,\n point = parent ? parent.localToGlobal(pos) : pos,\n x = point.x,\n y = point.y;\n ctx.beginPath();\n ctx.arc(x, y, half, 0, Math.PI * 2, true);\n ctx.stroke();\n var deltas = [[0, -1], [1, 0], [0, 1], [-1, 0]],\n start = half,\n end = size + 1;\n\n for (var i = 0; i < 4; i++) {\n var delta = deltas[i],\n dx = delta[0],\n dy = delta[1];\n ctx.moveTo(x + dx * start, y + dy * start);\n ctx.lineTo(x + dx * end, y + dy * end);\n ctx.stroke();\n }\n }\n\n if (boundsSelected) {\n var coords = mx._transformCorners(this.getInternalBounds());\n\n ctx.beginPath();\n\n for (var i = 0; i < 8; i++) {\n ctx[!i ? 'moveTo' : 'lineTo'](coords[i], coords[++i]);\n }\n\n ctx.closePath();\n ctx.stroke();\n\n for (var i = 0; i < 8; i++) {\n ctx.fillRect(coords[i] - half, coords[++i] - half, size, size);\n }\n }\n }\n },\n _canComposite: function _canComposite() {\n return false;\n }\n }, Base.each(['down', 'drag', 'up', 'move'], function (key) {\n this['removeOn' + Base.capitalize(key)] = function () {\n var hash = {};\n hash[key] = true;\n return this.removeOn(hash);\n };\n }, {\n removeOn: function removeOn(obj) {\n for (var name in obj) {\n if (obj[name]) {\n var key = 'mouse' + name,\n project = this._project,\n sets = project._removeSets = project._removeSets || {};\n sets[key] = sets[key] || {};\n sets[key][this._id] = this;\n }\n }\n\n return this;\n }\n }), {\n tween: function tween(from, to, options) {\n if (!options) {\n options = to;\n to = from;\n from = null;\n\n if (!options) {\n options = to;\n to = null;\n }\n }\n\n var easing = options && options.easing,\n start = options && options.start,\n duration = options != null && (typeof options === 'number' ? options : options.duration),\n tween = new Tween(this, from, to, duration, easing, start);\n\n function onFrame(event) {\n tween._handleFrame(event.time * 1000);\n\n if (!tween.running) {\n this.off('frame', onFrame);\n }\n }\n\n if (duration) {\n this.on('frame', onFrame);\n }\n\n return tween;\n },\n tweenTo: function tweenTo(to, options) {\n return this.tween(null, to, options);\n },\n tweenFrom: function tweenFrom(from, options) {\n return this.tween(from, null, options);\n }\n });\n var Group = Item.extend({\n _class: 'Group',\n _selectBounds: false,\n _selectChildren: true,\n _serializeFields: {\n children: []\n },\n initialize: function Group(arg) {\n this._children = [];\n this._namedChildren = {};\n if (!this._initialize(arg)) this.addChildren(Array.isArray(arg) ? arg : arguments);\n },\n _changed: function _changed(flags) {\n _changed.base.call(this, flags);\n\n if (flags & 2050) {\n this._clipItem = undefined;\n }\n },\n _getClipItem: function _getClipItem() {\n var clipItem = this._clipItem;\n\n if (clipItem === undefined) {\n clipItem = null;\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i]._clipMask) {\n clipItem = children[i];\n break;\n }\n }\n\n this._clipItem = clipItem;\n }\n\n return clipItem;\n },\n isClipped: function isClipped() {\n return !!this._getClipItem();\n },\n setClipped: function setClipped(clipped) {\n var child = this.getFirstChild();\n if (child) child.setClipMask(clipped);\n },\n _getBounds: function _getBounds(matrix, options) {\n var clipItem = this._getClipItem();\n\n return clipItem ? clipItem._getCachedBounds(clipItem._matrix.prepended(matrix), Base.set({}, options, {\n stroke: false\n })) : _getBounds.base.call(this, matrix, options);\n },\n _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n var clipItem = this._getClipItem();\n\n return (!clipItem || clipItem.contains(point)) && _hitTestChildren.base.call(this, point, options, viewMatrix, clipItem);\n },\n _draw: function _draw(ctx, param) {\n var clip = param.clip,\n clipItem = !clip && this._getClipItem();\n\n param = param.extend({\n clipItem: clipItem,\n clip: false\n });\n\n if (clip) {\n ctx.beginPath();\n param.dontStart = param.dontFinish = true;\n } else if (clipItem) {\n clipItem.draw(ctx, param.extend({\n clip: true\n }));\n }\n\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n var item = children[i];\n if (item !== clipItem) item.draw(ctx, param);\n }\n }\n });\n var Layer = Group.extend({\n _class: 'Layer',\n initialize: function Layer() {\n Group.apply(this, arguments);\n },\n _getOwner: function _getOwner() {\n return this._parent || this._index != null && this._project;\n },\n isInserted: function isInserted() {\n return this._parent ? isInserted.base.call(this) : this._index != null;\n },\n activate: function activate() {\n this._project._activeLayer = this;\n },\n _hitTestSelf: function _hitTestSelf() {}\n });\n var Shape = Item.extend({\n _class: 'Shape',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _canScaleStroke: true,\n _serializeFields: {\n type: null,\n size: null,\n radius: null\n },\n initialize: function Shape(props, point) {\n this._initialize(props, point);\n },\n _equals: function _equals(item) {\n return this._type === item._type && this._size.equals(item._size) && Base.equals(this._radius, item._radius);\n },\n copyContent: function copyContent(source) {\n this.setType(source._type);\n this.setSize(source._size);\n this.setRadius(source._radius);\n },\n getType: function getType() {\n return this._type;\n },\n setType: function setType(type) {\n this._type = type;\n },\n getShape: '#getType',\n setShape: '#setType',\n getSize: function getSize() {\n var size = this._size;\n return new LinkedSize(size.width, size.height, this, 'setSize');\n },\n setSize: function setSize() {\n var size = Size.read(arguments);\n\n if (!this._size) {\n this._size = size.clone();\n } else if (!this._size.equals(size)) {\n var type = this._type,\n width = size.width,\n height = size.height;\n\n if (type === 'rectangle') {\n this._radius.set(Size.min(this._radius, size.divide(2).abs()));\n } else if (type === 'circle') {\n width = height = (width + height) / 2;\n this._radius = width / 2;\n } else if (type === 'ellipse') {\n this._radius._set(width / 2, height / 2);\n }\n\n this._size._set(width, height);\n\n this._changed(9);\n }\n },\n getRadius: function getRadius() {\n var rad = this._radius;\n return this._type === 'circle' ? rad : new LinkedSize(rad.width, rad.height, this, 'setRadius');\n },\n setRadius: function setRadius(radius) {\n var type = this._type;\n\n if (type === 'circle') {\n if (radius === this._radius) return;\n var size = radius * 2;\n this._radius = radius;\n\n this._size._set(size, size);\n } else {\n radius = Size.read(arguments);\n\n if (!this._radius) {\n this._radius = radius.clone();\n } else {\n if (this._radius.equals(radius)) return;\n\n this._radius.set(radius);\n\n if (type === 'rectangle') {\n var size = Size.max(this._size, radius.multiply(2));\n\n this._size.set(size);\n } else if (type === 'ellipse') {\n this._size._set(radius.width * 2, radius.height * 2);\n }\n }\n }\n\n this._changed(9);\n },\n isEmpty: function isEmpty() {\n return false;\n },\n toPath: function toPath(insert) {\n var path = new Path[Base.capitalize(this._type)]({\n center: new Point(),\n size: this._size,\n radius: this._radius,\n insert: false\n });\n path.copyAttributes(this);\n if (paper.settings.applyMatrix) path.setApplyMatrix(true);\n if (insert === undefined || insert) path.insertAbove(this);\n return path;\n },\n toShape: '#clone',\n _asPathItem: function _asPathItem() {\n return this.toPath(false);\n },\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var style = this._style,\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n dontPaint = param.dontFinish || param.clip,\n untransformed = !strokeMatrix;\n\n if (hasFill || hasStroke || dontPaint) {\n var type = this._type,\n radius = this._radius,\n isCircle = type === 'circle';\n if (!param.dontStart) ctx.beginPath();\n\n if (untransformed && isCircle) {\n ctx.arc(0, 0, radius, 0, Math.PI * 2, true);\n } else {\n var rx = isCircle ? radius : radius.width,\n ry = isCircle ? radius : radius.height,\n size = this._size,\n width = size.width,\n height = size.height;\n\n if (untransformed && type === 'rectangle' && rx === 0 && ry === 0) {\n ctx.rect(-width / 2, -height / 2, width, height);\n } else {\n var x = width / 2,\n y = height / 2,\n kappa = 1 - 0.5522847498307936,\n cx = rx * kappa,\n cy = ry * kappa,\n c = [-x, -y + ry, -x, -y + cy, -x + cx, -y, -x + rx, -y, x - rx, -y, x - cx, -y, x, -y + cy, x, -y + ry, x, y - ry, x, y - cy, x - cx, y, x - rx, y, -x + rx, y, -x + cx, y, -x, y - cy, -x, y - ry];\n if (strokeMatrix) strokeMatrix.transform(c, c, 32);\n ctx.moveTo(c[0], c[1]);\n ctx.bezierCurveTo(c[2], c[3], c[4], c[5], c[6], c[7]);\n if (x !== rx) ctx.lineTo(c[8], c[9]);\n ctx.bezierCurveTo(c[10], c[11], c[12], c[13], c[14], c[15]);\n if (y !== ry) ctx.lineTo(c[16], c[17]);\n ctx.bezierCurveTo(c[18], c[19], c[20], c[21], c[22], c[23]);\n if (x !== rx) ctx.lineTo(c[24], c[25]);\n ctx.bezierCurveTo(c[26], c[27], c[28], c[29], c[30], c[31]);\n }\n }\n\n ctx.closePath();\n }\n\n if (!dontPaint && (hasFill || hasStroke)) {\n this._setStyles(ctx, param, viewMatrix);\n\n if (hasFill) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) ctx.stroke();\n }\n },\n _canComposite: function _canComposite() {\n return !(this.hasFill() && this.hasStroke());\n },\n _getBounds: function _getBounds(matrix, options) {\n var rect = new _Rectangle(this._size).setCenter(0, 0),\n style = this._style,\n strokeWidth = options.stroke && style.hasStroke() && style.getStrokeWidth();\n if (matrix) rect = matrix._transformBounds(rect);\n return strokeWidth ? rect.expand(Path._getStrokePadding(strokeWidth, this._getStrokeMatrix(matrix, options))) : rect;\n }\n }, new function () {\n function getCornerCenter(that, point, expand) {\n var radius = that._radius;\n\n if (!radius.isZero()) {\n var halfSize = that._size.divide(2);\n\n for (var q = 1; q <= 4; q++) {\n var dir = new Point(q > 1 && q < 4 ? -1 : 1, q > 2 ? -1 : 1),\n corner = dir.multiply(halfSize),\n center = corner.subtract(dir.multiply(radius)),\n rect = new _Rectangle(expand ? corner.add(dir.multiply(expand)) : corner, center);\n if (rect.contains(point)) return {\n point: center,\n quadrant: q\n };\n }\n }\n }\n\n function isOnEllipseStroke(point, radius, padding, quadrant) {\n var vector = point.divide(radius);\n return (!quadrant || vector.isInQuadrant(quadrant)) && vector.subtract(vector.normalize()).multiply(radius).divide(padding).length <= 1;\n }\n\n return {\n _contains: function _contains(point) {\n if (this._type === 'rectangle') {\n var center = getCornerCenter(this, point);\n return center ? point.subtract(center.point).divide(this._radius).getLength() <= 1 : _contains.base.call(this, point);\n } else {\n return point.divide(this.size).getLength() <= 0.5;\n }\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix, strokeMatrix) {\n var hit = false,\n style = this._style,\n hitStroke = options.stroke && style.hasStroke(),\n hitFill = options.fill && style.hasFill();\n\n if (hitStroke || hitFill) {\n var type = this._type,\n radius = this._radius,\n strokeRadius = hitStroke ? style.getStrokeWidth() / 2 : 0,\n strokePadding = options._tolerancePadding.add(Path._getStrokePadding(strokeRadius, !style.getStrokeScaling() && strokeMatrix));\n\n if (type === 'rectangle') {\n var padding = strokePadding.multiply(2),\n center = getCornerCenter(this, point, padding);\n\n if (center) {\n hit = isOnEllipseStroke(point.subtract(center.point), radius, strokePadding, center.quadrant);\n } else {\n var rect = new _Rectangle(this._size).setCenter(0, 0),\n outer = rect.expand(padding),\n inner = rect.expand(padding.negate());\n hit = outer._containsPoint(point) && !inner._containsPoint(point);\n }\n } else {\n hit = isOnEllipseStroke(point, radius, strokePadding);\n }\n }\n\n return hit ? new HitResult(hitStroke ? 'stroke' : 'fill', this) : _hitTestSelf.base.apply(this, arguments);\n }\n };\n }(), {\n statics: new function () {\n function createShape(type, point, size, radius, args) {\n var item = Base.create(Shape.prototype);\n item._type = type;\n item._size = size;\n item._radius = radius;\n\n item._initialize(Base.getNamed(args), point);\n\n return item;\n }\n\n return {\n Circle: function Circle() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n radius = Base.readNamed(args, 'radius');\n return createShape('circle', center, new Size(radius * 2), radius, args);\n },\n Rectangle: function Rectangle() {\n var args = arguments,\n rect = _Rectangle.readNamed(args, 'rectangle'),\n radius = Size.min(Size.readNamed(args, 'radius'), rect.getSize(true).divide(2));\n\n return createShape('rectangle', rect.getCenter(true), rect.getSize(true), radius, args);\n },\n Ellipse: function Ellipse() {\n var args = arguments,\n ellipse = Shape._readEllipse(args),\n radius = ellipse.radius;\n\n return createShape('ellipse', ellipse.center, radius.multiply(2), radius, args);\n },\n _readEllipse: function _readEllipse(args) {\n var center, radius;\n\n if (Base.hasNamed(args, 'radius')) {\n center = Point.readNamed(args, 'center');\n radius = Size.readNamed(args, 'radius');\n } else {\n var rect = _Rectangle.readNamed(args, 'rectangle');\n\n center = rect.getCenter(true);\n radius = rect.getSize(true).divide(2);\n }\n\n return {\n center: center,\n radius: radius\n };\n }\n };\n }()\n });\n var Raster = Item.extend({\n _class: 'Raster',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _boundsOptions: {\n stroke: false,\n handle: false\n },\n _serializeFields: {\n crossOrigin: null,\n source: null\n },\n _prioritize: ['crossOrigin'],\n _smoothing: 'low',\n beans: true,\n initialize: function Raster(source, position) {\n if (!this._initialize(source, position !== undefined && Point.read(arguments))) {\n var image,\n type = typeof source,\n object = type === 'string' ? document.getElementById(source) : type === 'object' ? source : null;\n\n if (object && object !== Item.NO_INSERT) {\n if (object.getContext || object.naturalHeight != null) {\n image = object;\n } else if (object) {\n var size = Size.read(arguments);\n\n if (!size.isZero()) {\n image = CanvasProvider.getCanvas(size);\n }\n }\n }\n\n if (image) {\n this.setImage(image);\n } else {\n this.setSource(source);\n }\n }\n\n if (!this._size) {\n this._size = new Size();\n this._loaded = false;\n }\n },\n _equals: function _equals(item) {\n return this.getSource() === item.getSource();\n },\n copyContent: function copyContent(source) {\n var image = source._image,\n canvas = source._canvas;\n\n if (image) {\n this._setImage(image);\n } else if (canvas) {\n var copyCanvas = CanvasProvider.getCanvas(source._size);\n copyCanvas.getContext('2d').drawImage(canvas, 0, 0);\n\n this._setImage(copyCanvas);\n }\n\n this._crossOrigin = source._crossOrigin;\n },\n getSize: function getSize() {\n var size = this._size;\n return new LinkedSize(size ? size.width : 0, size ? size.height : 0, this, 'setSize');\n },\n setSize: function setSize(_size, _clear) {\n var size = Size.read(arguments);\n\n if (!size.equals(this._size)) {\n if (size.width > 0 && size.height > 0) {\n var element = !_clear && this.getElement();\n\n this._setImage(CanvasProvider.getCanvas(size));\n\n if (element) {\n this.getContext(true).drawImage(element, 0, 0, size.width, size.height);\n }\n } else {\n if (this._canvas) CanvasProvider.release(this._canvas);\n this._size = size.clone();\n }\n } else if (_clear) {\n this.clear();\n }\n },\n getWidth: function getWidth() {\n return this._size ? this._size.width : 0;\n },\n setWidth: function setWidth(width) {\n this.setSize(width, this.getHeight());\n },\n getHeight: function getHeight() {\n return this._size ? this._size.height : 0;\n },\n setHeight: function setHeight(height) {\n this.setSize(this.getWidth(), height);\n },\n getLoaded: function getLoaded() {\n return this._loaded;\n },\n isEmpty: function isEmpty() {\n var size = this._size;\n return !size || size.width === 0 && size.height === 0;\n },\n getResolution: function getResolution() {\n var matrix = this._matrix,\n orig = new Point(0, 0).transform(matrix),\n u = new Point(1, 0).transform(matrix).subtract(orig),\n v = new Point(0, 1).transform(matrix).subtract(orig);\n return new Size(72 / u.getLength(), 72 / v.getLength());\n },\n getPpi: '#getResolution',\n getImage: function getImage() {\n return this._image;\n },\n setImage: function setImage(image) {\n var that = this;\n\n function emit(event) {\n var view = that.getView(),\n type = event && event.type || 'load';\n\n if (view && that.responds(type)) {\n paper = view._scope;\n that.emit(type, new Event(event));\n }\n }\n\n this._setImage(image);\n\n if (this._loaded) {\n setTimeout(emit, 0);\n } else if (image) {\n DomEvent.add(image, {\n load: function load(event) {\n that._setImage(image);\n\n emit(event);\n },\n error: emit\n });\n }\n },\n _setImage: function _setImage(image) {\n if (this._canvas) CanvasProvider.release(this._canvas);\n\n if (image && image.getContext) {\n this._image = null;\n this._canvas = image;\n this._loaded = true;\n } else {\n this._image = image;\n this._canvas = null;\n this._loaded = !!(image && image.src && image.complete);\n }\n\n this._size = new Size(image ? image.naturalWidth || image.width : 0, image ? image.naturalHeight || image.height : 0);\n this._context = null;\n\n this._changed(1033);\n },\n getCanvas: function getCanvas() {\n if (!this._canvas) {\n var ctx = CanvasProvider.getContext(this._size);\n\n try {\n if (this._image) ctx.drawImage(this._image, 0, 0);\n this._canvas = ctx.canvas;\n } catch (e) {\n CanvasProvider.release(ctx);\n }\n }\n\n return this._canvas;\n },\n setCanvas: '#setImage',\n getContext: function getContext(_change) {\n if (!this._context) this._context = this.getCanvas().getContext('2d');\n\n if (_change) {\n this._image = null;\n\n this._changed(1025);\n }\n\n return this._context;\n },\n setContext: function setContext(context) {\n this._context = context;\n },\n getSource: function getSource() {\n var image = this._image;\n return image && image.src || this.toDataURL();\n },\n setSource: function setSource(src) {\n var image = new self.Image(),\n crossOrigin = this._crossOrigin;\n if (crossOrigin) image.crossOrigin = crossOrigin;\n if (src) image.src = src;\n this.setImage(image);\n },\n getCrossOrigin: function getCrossOrigin() {\n var image = this._image;\n return image && image.crossOrigin || this._crossOrigin || '';\n },\n setCrossOrigin: function setCrossOrigin(crossOrigin) {\n this._crossOrigin = crossOrigin;\n var image = this._image;\n if (image) image.crossOrigin = crossOrigin;\n },\n getSmoothing: function getSmoothing() {\n return this._smoothing;\n },\n setSmoothing: function setSmoothing(smoothing) {\n this._smoothing = typeof smoothing === 'string' ? smoothing : smoothing ? 'low' : 'off';\n\n this._changed(257);\n },\n getElement: function getElement() {\n return this._canvas || this._loaded && this._image;\n }\n }, {\n beans: false,\n getSubCanvas: function getSubCanvas() {\n var rect = _Rectangle.read(arguments),\n ctx = CanvasProvider.getContext(rect.getSize());\n\n ctx.drawImage(this.getCanvas(), rect.x, rect.y, rect.width, rect.height, 0, 0, rect.width, rect.height);\n return ctx.canvas;\n },\n getSubRaster: function getSubRaster() {\n var rect = _Rectangle.read(arguments),\n raster = new Raster(Item.NO_INSERT);\n\n raster._setImage(this.getSubCanvas(rect));\n\n raster.translate(rect.getCenter().subtract(this.getSize().divide(2)));\n\n raster._matrix.prepend(this._matrix);\n\n raster.insertAbove(this);\n return raster;\n },\n toDataURL: function toDataURL() {\n var image = this._image,\n src = image && image.src;\n if (/^data:/.test(src)) return src;\n var canvas = this.getCanvas();\n return canvas ? canvas.toDataURL.apply(canvas, arguments) : null;\n },\n drawImage: function drawImage(image) {\n var point = Point.read(arguments, 1);\n this.getContext(true).drawImage(image, point.x, point.y);\n },\n getAverageColor: function getAverageColor(object) {\n var bounds, path;\n\n if (!object) {\n bounds = this.getBounds();\n } else if (object instanceof PathItem) {\n path = object;\n bounds = object.getBounds();\n } else if (typeof object === 'object') {\n if ('width' in object) {\n bounds = new _Rectangle(object);\n } else if ('x' in object) {\n bounds = new _Rectangle(object.x - 0.5, object.y - 0.5, 1, 1);\n }\n }\n\n if (!bounds) return null;\n var sampleSize = 32,\n width = Math.min(bounds.width, sampleSize),\n height = Math.min(bounds.height, sampleSize);\n var ctx = Raster._sampleContext;\n\n if (!ctx) {\n ctx = Raster._sampleContext = CanvasProvider.getContext(new Size(sampleSize));\n } else {\n ctx.clearRect(0, 0, sampleSize + 1, sampleSize + 1);\n }\n\n ctx.save();\n var matrix = new Matrix().scale(width / bounds.width, height / bounds.height).translate(-bounds.x, -bounds.y);\n matrix.applyToContext(ctx);\n if (path) path.draw(ctx, new Base({\n clip: true,\n matrices: [matrix]\n }));\n\n this._matrix.applyToContext(ctx);\n\n var element = this.getElement(),\n size = this._size;\n if (element) ctx.drawImage(element, -size.width / 2, -size.height / 2);\n ctx.restore();\n var pixels = ctx.getImageData(0.5, 0.5, Math.ceil(width), Math.ceil(height)).data,\n channels = [0, 0, 0],\n total = 0;\n\n for (var i = 0, l = pixels.length; i < l; i += 4) {\n var alpha = pixels[i + 3];\n total += alpha;\n alpha /= 255;\n channels[0] += pixels[i] * alpha;\n channels[1] += pixels[i + 1] * alpha;\n channels[2] += pixels[i + 2] * alpha;\n }\n\n for (var i = 0; i < 3; i++) {\n channels[i] /= total;\n }\n\n return total ? Color.read(channels) : null;\n },\n getPixel: function getPixel() {\n var point = Point.read(arguments);\n var data = this.getContext().getImageData(point.x, point.y, 1, 1).data;\n return new Color('rgb', [data[0] / 255, data[1] / 255, data[2] / 255], data[3] / 255);\n },\n setPixel: function setPixel() {\n var args = arguments,\n point = Point.read(args),\n color = Color.read(args),\n components = color._convert('rgb'),\n alpha = color._alpha,\n ctx = this.getContext(true),\n imageData = ctx.createImageData(1, 1),\n data = imageData.data;\n\n data[0] = components[0] * 255;\n data[1] = components[1] * 255;\n data[2] = components[2] * 255;\n data[3] = alpha != null ? alpha * 255 : 255;\n ctx.putImageData(imageData, point.x, point.y);\n },\n clear: function clear() {\n var size = this._size;\n this.getContext(true).clearRect(0, 0, size.width + 1, size.height + 1);\n },\n createImageData: function createImageData() {\n var size = Size.read(arguments);\n return this.getContext().createImageData(size.width, size.height);\n },\n getImageData: function getImageData() {\n var rect = _Rectangle.read(arguments);\n\n if (rect.isEmpty()) rect = new _Rectangle(this._size);\n return this.getContext().getImageData(rect.x, rect.y, rect.width, rect.height);\n },\n setImageData: function setImageData(data) {\n var point = Point.read(arguments, 1);\n this.getContext(true).putImageData(data, point.x, point.y);\n },\n _getBounds: function _getBounds(matrix, options) {\n var rect = new _Rectangle(this._size).setCenter(0, 0);\n return matrix ? matrix._transformBounds(rect) : rect;\n },\n _hitTestSelf: function _hitTestSelf(point) {\n if (this._contains(point)) {\n var that = this;\n return new HitResult('pixel', that, {\n offset: point.add(that._size.divide(2)).round(),\n color: {\n get: function get() {\n return that.getPixel(this.offset);\n }\n }\n });\n }\n },\n _draw: function _draw(ctx, param, viewMatrix) {\n var element = this.getElement();\n\n if (element && element.width > 0 && element.height > 0) {\n ctx.globalAlpha = Numerical.clamp(this._opacity, 0, 1);\n\n this._setStyles(ctx, param, viewMatrix);\n\n var smoothing = this._smoothing,\n disabled = smoothing === 'off';\n DomElement.setPrefixed(ctx, disabled ? 'imageSmoothingEnabled' : 'imageSmoothingQuality', disabled ? false : smoothing);\n ctx.drawImage(element, -this._size.width / 2, -this._size.height / 2);\n }\n },\n _canComposite: function _canComposite() {\n return true;\n }\n });\n var SymbolItem = Item.extend({\n _class: 'SymbolItem',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _boundsOptions: {\n stroke: true\n },\n _serializeFields: {\n symbol: null\n },\n initialize: function SymbolItem(arg0, arg1) {\n if (!this._initialize(arg0, arg1 !== undefined && Point.read(arguments, 1))) this.setDefinition(arg0 instanceof SymbolDefinition ? arg0 : new SymbolDefinition(arg0));\n },\n _equals: function _equals(item) {\n return this._definition === item._definition;\n },\n copyContent: function copyContent(source) {\n this.setDefinition(source._definition);\n },\n getDefinition: function getDefinition() {\n return this._definition;\n },\n setDefinition: function setDefinition(definition) {\n this._definition = definition;\n\n this._changed(9);\n },\n getSymbol: '#getDefinition',\n setSymbol: '#setDefinition',\n isEmpty: function isEmpty() {\n return this._definition._item.isEmpty();\n },\n _getBounds: function _getBounds(matrix, options) {\n var item = this._definition._item;\n return item._getCachedBounds(item._matrix.prepended(matrix), options);\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix) {\n var opts = options.extend({\n all: false\n });\n\n var res = this._definition._item._hitTest(point, opts, viewMatrix);\n\n if (res) res.item = this;\n return res;\n },\n _draw: function _draw(ctx, param) {\n this._definition._item.draw(ctx, param);\n }\n });\n var SymbolDefinition = Base.extend({\n _class: 'SymbolDefinition',\n initialize: function SymbolDefinition(item, dontCenter) {\n this._id = UID.get();\n this.project = paper.project;\n if (item) this.setItem(item, dontCenter);\n },\n _serialize: function _serialize(options, dictionary) {\n return dictionary.add(this, function () {\n return Base.serialize([this._class, this._item], options, false, dictionary);\n });\n },\n _changed: function _changed(flags) {\n if (flags & 8) Item._clearBoundsCache(this);\n if (flags & 1) this.project._changed(flags);\n },\n getItem: function getItem() {\n return this._item;\n },\n setItem: function setItem(item, _dontCenter) {\n if (item._symbol) item = item.clone();\n if (this._item) this._item._symbol = null;\n this._item = item;\n item.remove();\n item.setSelected(false);\n if (!_dontCenter) item.setPosition(new Point());\n item._symbol = this;\n\n this._changed(9);\n },\n getDefinition: '#getItem',\n setDefinition: '#setItem',\n place: function place(position) {\n return new SymbolItem(this, position);\n },\n clone: function clone() {\n return new SymbolDefinition(this._item.clone(false));\n },\n equals: function equals(symbol) {\n return symbol === this || symbol && this._item.equals(symbol._item) || false;\n }\n });\n var HitResult = Base.extend({\n _class: 'HitResult',\n initialize: function HitResult(type, item, values) {\n this.type = type;\n this.item = item;\n if (values) this.inject(values);\n },\n statics: {\n getOptions: function getOptions(args) {\n var options = args && Base.read(args);\n return new Base({\n type: null,\n tolerance: paper.settings.hitTolerance,\n fill: !options,\n stroke: !options,\n segments: !options,\n handles: false,\n ends: false,\n position: false,\n center: false,\n bounds: false,\n guides: false,\n selected: false\n }, options);\n }\n }\n });\n var Segment = Base.extend({\n _class: 'Segment',\n beans: true,\n _selection: 0,\n initialize: function Segment(arg0, arg1, arg2, arg3, arg4, arg5) {\n var count = arguments.length,\n point,\n handleIn,\n handleOut,\n selection;\n\n if (count > 0) {\n if (arg0 == null || typeof arg0 === 'object') {\n if (count === 1 && arg0 && 'point' in arg0) {\n point = arg0.point;\n handleIn = arg0.handleIn;\n handleOut = arg0.handleOut;\n selection = arg0.selection;\n } else {\n point = arg0;\n handleIn = arg1;\n handleOut = arg2;\n selection = arg3;\n }\n } else {\n point = [arg0, arg1];\n handleIn = arg2 !== undefined ? [arg2, arg3] : null;\n handleOut = arg4 !== undefined ? [arg4, arg5] : null;\n }\n }\n\n new SegmentPoint(point, this, '_point');\n new SegmentPoint(handleIn, this, '_handleIn');\n new SegmentPoint(handleOut, this, '_handleOut');\n if (selection) this.setSelection(selection);\n },\n _serialize: function _serialize(options, dictionary) {\n var point = this._point,\n selection = this._selection,\n obj = selection || this.hasHandles() ? [point, this._handleIn, this._handleOut] : point;\n if (selection) obj.push(selection);\n return Base.serialize(obj, options, true, dictionary);\n },\n _changed: function _changed(point) {\n var path = this._path;\n if (!path) return;\n var curves = path._curves,\n index = this._index,\n curve;\n\n if (curves) {\n if ((!point || point === this._point || point === this._handleIn) && (curve = index > 0 ? curves[index - 1] : path._closed ? curves[curves.length - 1] : null)) curve._changed();\n if ((!point || point === this._point || point === this._handleOut) && (curve = curves[index])) curve._changed();\n }\n\n path._changed(41);\n },\n getPoint: function getPoint() {\n return this._point;\n },\n setPoint: function setPoint() {\n this._point.set(Point.read(arguments));\n },\n getHandleIn: function getHandleIn() {\n return this._handleIn;\n },\n setHandleIn: function setHandleIn() {\n this._handleIn.set(Point.read(arguments));\n },\n getHandleOut: function getHandleOut() {\n return this._handleOut;\n },\n setHandleOut: function setHandleOut() {\n this._handleOut.set(Point.read(arguments));\n },\n hasHandles: function hasHandles() {\n return !this._handleIn.isZero() || !this._handleOut.isZero();\n },\n isSmooth: function isSmooth() {\n var handleIn = this._handleIn,\n handleOut = this._handleOut;\n return !handleIn.isZero() && !handleOut.isZero() && handleIn.isCollinear(handleOut);\n },\n clearHandles: function clearHandles() {\n this._handleIn._set(0, 0);\n\n this._handleOut._set(0, 0);\n },\n getSelection: function getSelection() {\n return this._selection;\n },\n setSelection: function setSelection(selection) {\n var oldSelection = this._selection,\n path = this._path;\n this._selection = selection = selection || 0;\n\n if (path && selection !== oldSelection) {\n path._updateSelection(this, oldSelection, selection);\n\n path._changed(257);\n }\n },\n _changeSelection: function _changeSelection(flag, selected) {\n var selection = this._selection;\n this.setSelection(selected ? selection | flag : selection & ~flag);\n },\n isSelected: function isSelected() {\n return !!(this._selection & 7);\n },\n setSelected: function setSelected(selected) {\n this._changeSelection(7, selected);\n },\n getIndex: function getIndex() {\n return this._index !== undefined ? this._index : null;\n },\n getPath: function getPath() {\n return this._path || null;\n },\n getCurve: function getCurve() {\n var path = this._path,\n index = this._index;\n\n if (path) {\n if (index > 0 && !path._closed && index === path._segments.length - 1) index--;\n return path.getCurves()[index] || null;\n }\n\n return null;\n },\n getLocation: function getLocation() {\n var curve = this.getCurve();\n return curve ? new CurveLocation(curve, this === curve._segment1 ? 0 : 1) : null;\n },\n getNext: function getNext() {\n var segments = this._path && this._path._segments;\n return segments && (segments[this._index + 1] || this._path._closed && segments[0]) || null;\n },\n smooth: function smooth(options, _first, _last) {\n var opts = options || {},\n type = opts.type,\n factor = opts.factor,\n prev = this.getPrevious(),\n next = this.getNext(),\n p0 = (prev || this)._point,\n p1 = this._point,\n p2 = (next || this)._point,\n d1 = p0.getDistance(p1),\n d2 = p1.getDistance(p2);\n\n if (!type || type === 'catmull-rom') {\n var a = factor === undefined ? 0.5 : factor,\n d1_a = Math.pow(d1, a),\n d1_2a = d1_a * d1_a,\n d2_a = Math.pow(d2, a),\n d2_2a = d2_a * d2_a;\n\n if (!_first && prev) {\n var A = 2 * d2_2a + 3 * d2_a * d1_a + d1_2a,\n N = 3 * d2_a * (d2_a + d1_a);\n this.setHandleIn(N !== 0 ? new Point((d2_2a * p0._x + A * p1._x - d1_2a * p2._x) / N - p1._x, (d2_2a * p0._y + A * p1._y - d1_2a * p2._y) / N - p1._y) : new Point());\n }\n\n if (!_last && next) {\n var A = 2 * d1_2a + 3 * d1_a * d2_a + d2_2a,\n N = 3 * d1_a * (d1_a + d2_a);\n this.setHandleOut(N !== 0 ? new Point((d1_2a * p2._x + A * p1._x - d2_2a * p0._x) / N - p1._x, (d1_2a * p2._y + A * p1._y - d2_2a * p0._y) / N - p1._y) : new Point());\n }\n } else if (type === 'geometric') {\n if (prev && next) {\n var vector = p0.subtract(p2),\n t = factor === undefined ? 0.4 : factor,\n k = t * d1 / (d1 + d2);\n if (!_first) this.setHandleIn(vector.multiply(k));\n if (!_last) this.setHandleOut(vector.multiply(k - t));\n }\n } else {\n throw new Error('Smoothing method \\'' + type + '\\' not supported.');\n }\n },\n getPrevious: function getPrevious() {\n var segments = this._path && this._path._segments;\n return segments && (segments[this._index - 1] || this._path._closed && segments[segments.length - 1]) || null;\n },\n isFirst: function isFirst() {\n return !this._index;\n },\n isLast: function isLast() {\n var path = this._path;\n return path && this._index === path._segments.length - 1 || false;\n },\n reverse: function reverse() {\n var handleIn = this._handleIn,\n handleOut = this._handleOut,\n tmp = handleIn.clone();\n handleIn.set(handleOut);\n handleOut.set(tmp);\n },\n reversed: function reversed() {\n return new Segment(this._point, this._handleOut, this._handleIn);\n },\n remove: function remove() {\n return this._path ? !!this._path.removeSegment(this._index) : false;\n },\n clone: function clone() {\n return new Segment(this._point, this._handleIn, this._handleOut);\n },\n equals: function equals(segment) {\n return segment === this || segment && this._class === segment._class && this._point.equals(segment._point) && this._handleIn.equals(segment._handleIn) && this._handleOut.equals(segment._handleOut) || false;\n },\n toString: function toString() {\n var parts = ['point: ' + this._point];\n if (!this._handleIn.isZero()) parts.push('handleIn: ' + this._handleIn);\n if (!this._handleOut.isZero()) parts.push('handleOut: ' + this._handleOut);\n return '{ ' + parts.join(', ') + ' }';\n },\n transform: function transform(matrix) {\n this._transformCoordinates(matrix, new Array(6), true);\n\n this._changed();\n },\n interpolate: function interpolate(from, to, factor) {\n var u = 1 - factor,\n v = factor,\n point1 = from._point,\n point2 = to._point,\n handleIn1 = from._handleIn,\n handleIn2 = to._handleIn,\n handleOut2 = to._handleOut,\n handleOut1 = from._handleOut;\n\n this._point._set(u * point1._x + v * point2._x, u * point1._y + v * point2._y, true);\n\n this._handleIn._set(u * handleIn1._x + v * handleIn2._x, u * handleIn1._y + v * handleIn2._y, true);\n\n this._handleOut._set(u * handleOut1._x + v * handleOut2._x, u * handleOut1._y + v * handleOut2._y, true);\n\n this._changed();\n },\n _transformCoordinates: function _transformCoordinates(matrix, coords, change) {\n var point = this._point,\n handleIn = !change || !this._handleIn.isZero() ? this._handleIn : null,\n handleOut = !change || !this._handleOut.isZero() ? this._handleOut : null,\n x = point._x,\n y = point._y,\n i = 2;\n coords[0] = x;\n coords[1] = y;\n\n if (handleIn) {\n coords[i++] = handleIn._x + x;\n coords[i++] = handleIn._y + y;\n }\n\n if (handleOut) {\n coords[i++] = handleOut._x + x;\n coords[i++] = handleOut._y + y;\n }\n\n if (matrix) {\n matrix._transformCoordinates(coords, coords, i / 2);\n\n x = coords[0];\n y = coords[1];\n\n if (change) {\n point._x = x;\n point._y = y;\n i = 2;\n\n if (handleIn) {\n handleIn._x = coords[i++] - x;\n handleIn._y = coords[i++] - y;\n }\n\n if (handleOut) {\n handleOut._x = coords[i++] - x;\n handleOut._y = coords[i++] - y;\n }\n } else {\n if (!handleIn) {\n coords[i++] = x;\n coords[i++] = y;\n }\n\n if (!handleOut) {\n coords[i++] = x;\n coords[i++] = y;\n }\n }\n }\n\n return coords;\n }\n });\n var SegmentPoint = Point.extend({\n initialize: function SegmentPoint(point, owner, key) {\n var x, y, selected;\n\n if (!point) {\n x = y = 0;\n } else if ((x = point[0]) !== undefined) {\n y = point[1];\n } else {\n var pt = point;\n\n if ((x = pt.x) === undefined) {\n pt = Point.read(arguments);\n x = pt.x;\n }\n\n y = pt.y;\n selected = pt.selected;\n }\n\n this._x = x;\n this._y = y;\n this._owner = owner;\n owner[key] = this;\n if (selected) this.setSelected(true);\n },\n _set: function _set(x, y) {\n this._x = x;\n this._y = y;\n\n this._owner._changed(this);\n\n return this;\n },\n getX: function getX() {\n return this._x;\n },\n setX: function setX(x) {\n this._x = x;\n\n this._owner._changed(this);\n },\n getY: function getY() {\n return this._y;\n },\n setY: function setY(y) {\n this._y = y;\n\n this._owner._changed(this);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this._x) && isZero(this._y);\n },\n isSelected: function isSelected() {\n return !!(this._owner._selection & this._getSelection());\n },\n setSelected: function setSelected(selected) {\n this._owner._changeSelection(this._getSelection(), selected);\n },\n _getSelection: function _getSelection() {\n var owner = this._owner;\n return this === owner._point ? 1 : this === owner._handleIn ? 2 : this === owner._handleOut ? 4 : 0;\n }\n });\n var Curve = Base.extend({\n _class: 'Curve',\n beans: true,\n initialize: function Curve(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {\n var count = arguments.length,\n seg1,\n seg2,\n point1,\n point2,\n handle1,\n handle2;\n\n if (count === 3) {\n this._path = arg0;\n seg1 = arg1;\n seg2 = arg2;\n } else if (!count) {\n seg1 = new Segment();\n seg2 = new Segment();\n } else if (count === 1) {\n if ('segment1' in arg0) {\n seg1 = new Segment(arg0.segment1);\n seg2 = new Segment(arg0.segment2);\n } else if ('point1' in arg0) {\n point1 = arg0.point1;\n handle1 = arg0.handle1;\n handle2 = arg0.handle2;\n point2 = arg0.point2;\n } else if (Array.isArray(arg0)) {\n point1 = [arg0[0], arg0[1]];\n point2 = [arg0[6], arg0[7]];\n handle1 = [arg0[2] - arg0[0], arg0[3] - arg0[1]];\n handle2 = [arg0[4] - arg0[6], arg0[5] - arg0[7]];\n }\n } else if (count === 2) {\n seg1 = new Segment(arg0);\n seg2 = new Segment(arg1);\n } else if (count === 4) {\n point1 = arg0;\n handle1 = arg1;\n handle2 = arg2;\n point2 = arg3;\n } else if (count === 8) {\n point1 = [arg0, arg1];\n point2 = [arg6, arg7];\n handle1 = [arg2 - arg0, arg3 - arg1];\n handle2 = [arg4 - arg6, arg5 - arg7];\n }\n\n this._segment1 = seg1 || new Segment(point1, null, handle1);\n this._segment2 = seg2 || new Segment(point2, handle2, null);\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this.hasHandles() ? [this.getPoint1(), this.getHandle1(), this.getHandle2(), this.getPoint2()] : [this.getPoint1(), this.getPoint2()], options, true, dictionary);\n },\n _changed: function _changed() {\n this._length = this._bounds = undefined;\n },\n clone: function clone() {\n return new Curve(this._segment1, this._segment2);\n },\n toString: function toString() {\n var parts = ['point1: ' + this._segment1._point];\n if (!this._segment1._handleOut.isZero()) parts.push('handle1: ' + this._segment1._handleOut);\n if (!this._segment2._handleIn.isZero()) parts.push('handle2: ' + this._segment2._handleIn);\n parts.push('point2: ' + this._segment2._point);\n return '{ ' + parts.join(', ') + ' }';\n },\n classify: function classify() {\n return Curve.classify(this.getValues());\n },\n remove: function remove() {\n var removed = false;\n\n if (this._path) {\n var segment2 = this._segment2,\n handleOut = segment2._handleOut;\n removed = segment2.remove();\n if (removed) this._segment1._handleOut.set(handleOut);\n }\n\n return removed;\n },\n getPoint1: function getPoint1() {\n return this._segment1._point;\n },\n setPoint1: function setPoint1() {\n this._segment1._point.set(Point.read(arguments));\n },\n getPoint2: function getPoint2() {\n return this._segment2._point;\n },\n setPoint2: function setPoint2() {\n this._segment2._point.set(Point.read(arguments));\n },\n getHandle1: function getHandle1() {\n return this._segment1._handleOut;\n },\n setHandle1: function setHandle1() {\n this._segment1._handleOut.set(Point.read(arguments));\n },\n getHandle2: function getHandle2() {\n return this._segment2._handleIn;\n },\n setHandle2: function setHandle2() {\n this._segment2._handleIn.set(Point.read(arguments));\n },\n getSegment1: function getSegment1() {\n return this._segment1;\n },\n getSegment2: function getSegment2() {\n return this._segment2;\n },\n getPath: function getPath() {\n return this._path;\n },\n getIndex: function getIndex() {\n return this._segment1._index;\n },\n getNext: function getNext() {\n var curves = this._path && this._path._curves;\n return curves && (curves[this._segment1._index + 1] || this._path._closed && curves[0]) || null;\n },\n getPrevious: function getPrevious() {\n var curves = this._path && this._path._curves;\n return curves && (curves[this._segment1._index - 1] || this._path._closed && curves[curves.length - 1]) || null;\n },\n isFirst: function isFirst() {\n return !this._segment1._index;\n },\n isLast: function isLast() {\n var path = this._path;\n return path && this._segment1._index === path._curves.length - 1 || false;\n },\n isSelected: function isSelected() {\n return this.getPoint1().isSelected() && this.getHandle1().isSelected() && this.getHandle2().isSelected() && this.getPoint2().isSelected();\n },\n setSelected: function setSelected(selected) {\n this.getPoint1().setSelected(selected);\n this.getHandle1().setSelected(selected);\n this.getHandle2().setSelected(selected);\n this.getPoint2().setSelected(selected);\n },\n getValues: function getValues(matrix) {\n return Curve.getValues(this._segment1, this._segment2, matrix);\n },\n getPoints: function getPoints() {\n var coords = this.getValues(),\n points = [];\n\n for (var i = 0; i < 8; i += 2) {\n points.push(new Point(coords[i], coords[i + 1]));\n }\n\n return points;\n }\n }, {\n getLength: function getLength() {\n if (this._length == null) this._length = Curve.getLength(this.getValues(), 0, 1);\n return this._length;\n },\n getArea: function getArea() {\n return Curve.getArea(this.getValues());\n },\n getLine: function getLine() {\n return new Line(this._segment1._point, this._segment2._point);\n },\n getPart: function getPart(from, to) {\n return new Curve(Curve.getPart(this.getValues(), from, to));\n },\n getPartLength: function getPartLength(from, to) {\n return Curve.getLength(this.getValues(), from, to);\n },\n divideAt: function divideAt(location) {\n return this.divideAtTime(location && location.curve === this ? location.time : this.getTimeAt(location));\n },\n divideAtTime: function divideAtTime(time, _setHandles) {\n var tMin = 1e-8,\n tMax = 1 - tMin,\n res = null;\n\n if (time >= tMin && time <= tMax) {\n var parts = Curve.subdivide(this.getValues(), time),\n left = parts[0],\n right = parts[1],\n setHandles = _setHandles || this.hasHandles(),\n seg1 = this._segment1,\n seg2 = this._segment2,\n path = this._path;\n\n if (setHandles) {\n seg1._handleOut._set(left[2] - left[0], left[3] - left[1]);\n\n seg2._handleIn._set(right[4] - right[6], right[5] - right[7]);\n }\n\n var x = left[6],\n y = left[7],\n segment = new Segment(new Point(x, y), setHandles && new Point(left[4] - x, left[5] - y), setHandles && new Point(right[2] - x, right[3] - y));\n\n if (path) {\n path.insert(seg1._index + 1, segment);\n res = this.getNext();\n } else {\n this._segment2 = segment;\n\n this._changed();\n\n res = new Curve(segment, seg2);\n }\n }\n\n return res;\n },\n splitAt: function splitAt(location) {\n var path = this._path;\n return path ? path.splitAt(location) : null;\n },\n splitAtTime: function splitAtTime(time) {\n return this.splitAt(this.getLocationAtTime(time));\n },\n divide: function divide(offset, isTime) {\n return this.divideAtTime(offset === undefined ? 0.5 : isTime ? offset : this.getTimeAt(offset));\n },\n split: function split(offset, isTime) {\n return this.splitAtTime(offset === undefined ? 0.5 : isTime ? offset : this.getTimeAt(offset));\n },\n reversed: function reversed() {\n return new Curve(this._segment2.reversed(), this._segment1.reversed());\n },\n clearHandles: function clearHandles() {\n this._segment1._handleOut._set(0, 0);\n\n this._segment2._handleIn._set(0, 0);\n },\n statics: {\n getValues: function getValues(segment1, segment2, matrix, straight) {\n var p1 = segment1._point,\n h1 = segment1._handleOut,\n h2 = segment2._handleIn,\n p2 = segment2._point,\n x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n values = straight ? [x1, y1, x1, y1, x2, y2, x2, y2] : [x1, y1, x1 + h1._x, y1 + h1._y, x2 + h2._x, y2 + h2._y, x2, y2];\n if (matrix) matrix._transformCoordinates(values, values, 4);\n return values;\n },\n subdivide: function subdivide(v, t) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7];\n if (t === undefined) t = 0.5;\n var u = 1 - t,\n x4 = u * x0 + t * x1,\n y4 = u * y0 + t * y1,\n x5 = u * x1 + t * x2,\n y5 = u * y1 + t * y2,\n x6 = u * x2 + t * x3,\n y6 = u * y2 + t * y3,\n x7 = u * x4 + t * x5,\n y7 = u * y4 + t * y5,\n x8 = u * x5 + t * x6,\n y8 = u * y5 + t * y6,\n x9 = u * x7 + t * x8,\n y9 = u * y7 + t * y8;\n return [[x0, y0, x4, y4, x7, y7, x9, y9], [x9, y9, x8, y8, x6, y6, x3, y3]];\n },\n getMonoCurves: function getMonoCurves(v, dir) {\n var curves = [],\n io = dir ? 0 : 1,\n o0 = v[io + 0],\n o1 = v[io + 2],\n o2 = v[io + 4],\n o3 = v[io + 6];\n\n if (o0 >= o1 === o1 >= o2 && o1 >= o2 === o2 >= o3 || Curve.isStraight(v)) {\n curves.push(v);\n } else {\n var a = 3 * (o1 - o2) - o0 + o3,\n b = 2 * (o0 + o2) - 4 * o1,\n c = o1 - o0,\n tMin = 1e-8,\n tMax = 1 - tMin,\n roots = [],\n n = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax);\n\n if (!n) {\n curves.push(v);\n } else {\n roots.sort();\n var t = roots[0],\n parts = Curve.subdivide(v, t);\n curves.push(parts[0]);\n\n if (n > 1) {\n t = (roots[1] - t) / (1 - t);\n parts = Curve.subdivide(parts[1], t);\n curves.push(parts[0]);\n }\n\n curves.push(parts[1]);\n }\n }\n\n return curves;\n },\n solveCubic: function solveCubic(v, coord, val, roots, min, max) {\n var v0 = v[coord],\n v1 = v[coord + 2],\n v2 = v[coord + 4],\n v3 = v[coord + 6],\n res = 0;\n\n if (!(v0 < val && v3 < val && v1 < val && v2 < val || v0 > val && v3 > val && v1 > val && v2 > val)) {\n var c = 3 * (v1 - v0),\n b = 3 * (v2 - v1) - c,\n a = v3 - v0 - c - b;\n res = Numerical.solveCubic(a, b, c, v0 - val, roots, min, max);\n }\n\n return res;\n },\n getTimeOf: function getTimeOf(v, point) {\n var p0 = new Point(v[0], v[1]),\n p3 = new Point(v[6], v[7]),\n epsilon = 1e-12,\n geomEpsilon = 1e-7,\n t = point.isClose(p0, epsilon) ? 0 : point.isClose(p3, epsilon) ? 1 : null;\n\n if (t === null) {\n var coords = [point.x, point.y],\n roots = [];\n\n for (var c = 0; c < 2; c++) {\n var count = Curve.solveCubic(v, c, coords[c], roots, 0, 1);\n\n for (var i = 0; i < count; i++) {\n var u = roots[i];\n if (point.isClose(Curve.getPoint(v, u), geomEpsilon)) return u;\n }\n }\n }\n\n return point.isClose(p0, geomEpsilon) ? 0 : point.isClose(p3, geomEpsilon) ? 1 : null;\n },\n getNearestTime: function getNearestTime(v, point) {\n if (Curve.isStraight(v)) {\n var x0 = v[0],\n y0 = v[1],\n x3 = v[6],\n y3 = v[7],\n vx = x3 - x0,\n vy = y3 - y0,\n det = vx * vx + vy * vy;\n if (det === 0) return 0;\n var u = ((point.x - x0) * vx + (point.y - y0) * vy) / det;\n return u < 1e-12 ? 0 : u > 0.999999999999 ? 1 : Curve.getTimeOf(v, new Point(x0 + u * vx, y0 + u * vy));\n }\n\n var count = 100,\n minDist = Infinity,\n minT = 0;\n\n function refine(t) {\n if (t >= 0 && t <= 1) {\n var dist = point.getDistance(Curve.getPoint(v, t), true);\n\n if (dist < minDist) {\n minDist = dist;\n minT = t;\n return true;\n }\n }\n }\n\n for (var i = 0; i <= count; i++) {\n refine(i / count);\n }\n\n var step = 1 / (count * 2);\n\n while (step > 1e-8) {\n if (!refine(minT - step) && !refine(minT + step)) step /= 2;\n }\n\n return minT;\n },\n getPart: function getPart(v, from, to) {\n var flip = from > to;\n\n if (flip) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n\n if (from > 0) v = Curve.subdivide(v, from)[1];\n if (to < 1) v = Curve.subdivide(v, (to - from) / (1 - from))[0];\n return flip ? [v[6], v[7], v[4], v[5], v[2], v[3], v[0], v[1]] : v;\n },\n isFlatEnough: function isFlatEnough(v, flatness) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ux = 3 * x1 - 2 * x0 - x3,\n uy = 3 * y1 - 2 * y0 - y3,\n vx = 3 * x2 - 2 * x3 - x0,\n vy = 3 * y2 - 2 * y3 - y0;\n return Math.max(ux * ux, vx * vx) + Math.max(uy * uy, vy * vy) <= 16 * flatness * flatness;\n },\n getArea: function getArea(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7];\n return 3 * ((y3 - y0) * (x1 + x2) - (x3 - x0) * (y1 + y2) + y1 * (x0 - x2) - x1 * (y0 - y2) + y3 * (x2 + x0 / 3) - x3 * (y2 + y0 / 3)) / 20;\n },\n getBounds: function getBounds(v) {\n var min = v.slice(0, 2),\n max = min.slice(),\n roots = [0, 0];\n\n for (var i = 0; i < 2; i++) {\n Curve._addBounds(v[i], v[i + 2], v[i + 4], v[i + 6], i, 0, min, max, roots);\n }\n\n return new _Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n },\n _addBounds: function _addBounds(v0, v1, v2, v3, coord, padding, min, max, roots) {\n function add(value, padding) {\n var left = value - padding,\n right = value + padding;\n if (left < min[coord]) min[coord] = left;\n if (right > max[coord]) max[coord] = right;\n }\n\n padding /= 2;\n var minPad = min[coord] + padding,\n maxPad = max[coord] - padding;\n\n if (v0 < minPad || v1 < minPad || v2 < minPad || v3 < minPad || v0 > maxPad || v1 > maxPad || v2 > maxPad || v3 > maxPad) {\n if (v1 < v0 != v1 < v3 && v2 < v0 != v2 < v3) {\n add(v0, 0);\n add(v3, 0);\n } else {\n var a = 3 * (v1 - v2) - v0 + v3,\n b = 2 * (v0 + v2) - 4 * v1,\n c = v1 - v0,\n count = Numerical.solveQuadratic(a, b, c, roots),\n tMin = 1e-8,\n tMax = 1 - tMin;\n add(v3, 0);\n\n for (var i = 0; i < count; i++) {\n var t = roots[i],\n u = 1 - t;\n if (tMin <= t && t <= tMax) add(u * u * u * v0 + 3 * u * u * t * v1 + 3 * u * t * t * v2 + t * t * t * v3, padding);\n }\n }\n }\n }\n }\n }, Base.each(['getBounds', 'getStrokeBounds', 'getHandleBounds'], function (name) {\n this[name] = function () {\n if (!this._bounds) this._bounds = {};\n var bounds = this._bounds[name];\n\n if (!bounds) {\n bounds = this._bounds[name] = Path[name]([this._segment1, this._segment2], false, this._path);\n }\n\n return bounds.clone();\n };\n }, {}), Base.each({\n isStraight: function isStraight(p1, h1, h2, p2) {\n if (h1.isZero() && h2.isZero()) {\n return true;\n } else {\n var v = p2.subtract(p1);\n\n if (v.isZero()) {\n return false;\n } else if (v.isCollinear(h1) && v.isCollinear(h2)) {\n var l = new Line(p1, p2),\n epsilon = 1e-7;\n\n if (l.getDistance(p1.add(h1)) < epsilon && l.getDistance(p2.add(h2)) < epsilon) {\n var div = v.dot(v),\n s1 = v.dot(h1) / div,\n s2 = v.dot(h2) / div;\n return s1 >= 0 && s1 <= 1 && s2 <= 0 && s2 >= -1;\n }\n }\n }\n\n return false;\n },\n isLinear: function isLinear(p1, h1, h2, p2) {\n var third = p2.subtract(p1).divide(3);\n return h1.equals(third) && h2.negate().equals(third);\n }\n }, function (test, name) {\n this[name] = function (epsilon) {\n var seg1 = this._segment1,\n seg2 = this._segment2;\n return test(seg1._point, seg1._handleOut, seg2._handleIn, seg2._point, epsilon);\n };\n\n this.statics[name] = function (v, epsilon) {\n var x0 = v[0],\n y0 = v[1],\n x3 = v[6],\n y3 = v[7];\n return test(new Point(x0, y0), new Point(v[2] - x0, v[3] - y0), new Point(v[4] - x3, v[5] - y3), new Point(x3, y3), epsilon);\n };\n }, {\n statics: {},\n hasHandles: function hasHandles() {\n return !this._segment1._handleOut.isZero() || !this._segment2._handleIn.isZero();\n },\n hasLength: function hasLength(epsilon) {\n return (!this.getPoint1().equals(this.getPoint2()) || this.hasHandles()) && this.getLength() > (epsilon || 0);\n },\n isCollinear: function isCollinear(curve) {\n return curve && this.isStraight() && curve.isStraight() && this.getLine().isCollinear(curve.getLine());\n },\n isHorizontal: function isHorizontal() {\n return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).y) < 1e-8;\n },\n isVertical: function isVertical() {\n return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).x) < 1e-8;\n }\n }), {\n beans: false,\n getLocationAt: function getLocationAt(offset, _isTime) {\n return this.getLocationAtTime(_isTime ? offset : this.getTimeAt(offset));\n },\n getLocationAtTime: function getLocationAtTime(t) {\n return t != null && t >= 0 && t <= 1 ? new CurveLocation(this, t) : null;\n },\n getTimeAt: function getTimeAt(offset, start) {\n return Curve.getTimeAt(this.getValues(), offset, start);\n },\n getParameterAt: '#getTimeAt',\n getTimesWithTangent: function getTimesWithTangent() {\n var tangent = Point.read(arguments);\n return tangent.isZero() ? [] : Curve.getTimesWithTangent(this.getValues(), tangent);\n },\n getOffsetAtTime: function getOffsetAtTime(t) {\n return this.getPartLength(0, t);\n },\n getLocationOf: function getLocationOf() {\n return this.getLocationAtTime(this.getTimeOf(Point.read(arguments)));\n },\n getOffsetOf: function getOffsetOf() {\n var loc = this.getLocationOf.apply(this, arguments);\n return loc ? loc.getOffset() : null;\n },\n getTimeOf: function getTimeOf() {\n return Curve.getTimeOf(this.getValues(), Point.read(arguments));\n },\n getParameterOf: '#getTimeOf',\n getNearestLocation: function getNearestLocation() {\n var point = Point.read(arguments),\n values = this.getValues(),\n t = Curve.getNearestTime(values, point),\n pt = Curve.getPoint(values, t);\n return new CurveLocation(this, t, pt, null, point.getDistance(pt));\n },\n getNearestPoint: function getNearestPoint() {\n var loc = this.getNearestLocation.apply(this, arguments);\n return loc ? loc.getPoint() : loc;\n }\n }, new function () {\n var methods = ['getPoint', 'getTangent', 'getNormal', 'getWeightedTangent', 'getWeightedNormal', 'getCurvature'];\n return Base.each(methods, function (name) {\n this[name + 'At'] = function (location, _isTime) {\n var values = this.getValues();\n return Curve[name](values, _isTime ? location : Curve.getTimeAt(values, location));\n };\n\n this[name + 'AtTime'] = function (time) {\n return Curve[name](this.getValues(), time);\n };\n }, {\n statics: {\n _evaluateMethods: methods\n }\n });\n }(), new function () {\n function getLengthIntegrand(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ax = 9 * (x1 - x2) + 3 * (x3 - x0),\n bx = 6 * (x0 + x2) - 12 * x1,\n cx = 3 * (x1 - x0),\n ay = 9 * (y1 - y2) + 3 * (y3 - y0),\n by = 6 * (y0 + y2) - 12 * y1,\n cy = 3 * (y1 - y0);\n return function (t) {\n var dx = (ax * t + bx) * t + cx,\n dy = (ay * t + by) * t + cy;\n return Math.sqrt(dx * dx + dy * dy);\n };\n }\n\n function getIterations(a, b) {\n return Math.max(2, Math.min(16, Math.ceil(Math.abs(b - a) * 32)));\n }\n\n function evaluate(v, t, type, normalized) {\n if (t == null || t < 0 || t > 1) return null;\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n isZero = Numerical.isZero;\n\n if (isZero(x1 - x0) && isZero(y1 - y0)) {\n x1 = x0;\n y1 = y0;\n }\n\n if (isZero(x2 - x3) && isZero(y2 - y3)) {\n x2 = x3;\n y2 = y3;\n }\n\n var cx = 3 * (x1 - x0),\n bx = 3 * (x2 - x1) - cx,\n ax = x3 - x0 - cx - bx,\n cy = 3 * (y1 - y0),\n by = 3 * (y2 - y1) - cy,\n ay = y3 - y0 - cy - by,\n x,\n y;\n\n if (type === 0) {\n x = t === 0 ? x0 : t === 1 ? x3 : ((ax * t + bx) * t + cx) * t + x0;\n y = t === 0 ? y0 : t === 1 ? y3 : ((ay * t + by) * t + cy) * t + y0;\n } else {\n var tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (t < tMin) {\n x = cx;\n y = cy;\n } else if (t > tMax) {\n x = 3 * (x3 - x2);\n y = 3 * (y3 - y2);\n } else {\n x = (3 * ax * t + 2 * bx) * t + cx;\n y = (3 * ay * t + 2 * by) * t + cy;\n }\n\n if (normalized) {\n if (x === 0 && y === 0 && (t < tMin || t > tMax)) {\n x = x2 - x1;\n y = y2 - y1;\n }\n\n var len = Math.sqrt(x * x + y * y);\n\n if (len) {\n x /= len;\n y /= len;\n }\n }\n\n if (type === 3) {\n var x2 = 6 * ax * t + 2 * bx,\n y2 = 6 * ay * t + 2 * by,\n d = Math.pow(x * x + y * y, 3 / 2);\n x = d !== 0 ? (x * y2 - y * x2) / d : 0;\n y = 0;\n }\n }\n\n return type === 2 ? new Point(y, -x) : new Point(x, y);\n }\n\n return {\n statics: {\n classify: function classify(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n a1 = x0 * (y3 - y2) + y0 * (x2 - x3) + x3 * y2 - y3 * x2,\n a2 = x1 * (y0 - y3) + y1 * (x3 - x0) + x0 * y3 - y0 * x3,\n a3 = x2 * (y1 - y0) + y2 * (x0 - x1) + x1 * y0 - y1 * x0,\n d3 = 3 * a3,\n d2 = d3 - a2,\n d1 = d2 - a2 + a1,\n l = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3),\n s = l !== 0 ? 1 / l : 0,\n isZero = Numerical.isZero,\n serpentine = 'serpentine';\n d1 *= s;\n d2 *= s;\n d3 *= s;\n\n function type(type, t1, t2) {\n var hasRoots = t1 !== undefined,\n t1Ok = hasRoots && t1 > 0 && t1 < 1,\n t2Ok = hasRoots && t2 > 0 && t2 < 1;\n\n if (hasRoots && (!(t1Ok || t2Ok) || type === 'loop' && !(t1Ok && t2Ok))) {\n type = 'arch';\n t1Ok = t2Ok = false;\n }\n\n return {\n type: type,\n roots: t1Ok || t2Ok ? t1Ok && t2Ok ? t1 < t2 ? [t1, t2] : [t2, t1] : [t1Ok ? t1 : t2] : null\n };\n }\n\n if (isZero(d1)) {\n return isZero(d2) ? type(isZero(d3) ? 'line' : 'quadratic') : type(serpentine, d3 / (3 * d2));\n }\n\n var d = 3 * d2 * d2 - 4 * d1 * d3;\n\n if (isZero(d)) {\n return type('cusp', d2 / (2 * d1));\n }\n\n var f1 = d > 0 ? Math.sqrt(d / 3) : Math.sqrt(-d),\n f2 = 2 * d1;\n return type(d > 0 ? serpentine : 'loop', (d2 + f1) / f2, (d2 - f1) / f2);\n },\n getLength: function getLength(v, a, b, ds) {\n if (a === undefined) a = 0;\n if (b === undefined) b = 1;\n\n if (Curve.isStraight(v)) {\n var c = v;\n\n if (b < 1) {\n c = Curve.subdivide(c, b)[0];\n a /= b;\n }\n\n if (a > 0) {\n c = Curve.subdivide(c, a)[1];\n }\n\n var dx = c[6] - c[0],\n dy = c[7] - c[1];\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n return Numerical.integrate(ds || getLengthIntegrand(v), a, b, getIterations(a, b));\n },\n getTimeAt: function getTimeAt(v, offset, start) {\n if (start === undefined) start = offset < 0 ? 1 : 0;\n if (offset === 0) return start;\n var abs = Math.abs,\n epsilon = 1e-12,\n forward = offset > 0,\n a = forward ? start : 0,\n b = forward ? 1 : start,\n ds = getLengthIntegrand(v),\n rangeLength = Curve.getLength(v, a, b, ds),\n diff = abs(offset) - rangeLength;\n\n if (abs(diff) < epsilon) {\n return forward ? b : a;\n } else if (diff > epsilon) {\n return null;\n }\n\n var guess = offset / rangeLength,\n length = 0;\n\n function f(t) {\n length += Numerical.integrate(ds, start, t, getIterations(start, t));\n start = t;\n return length - offset;\n }\n\n return Numerical.findRoot(f, ds, start + guess, a, b, 32, 1e-12);\n },\n getPoint: function getPoint(v, t) {\n return evaluate(v, t, 0, false);\n },\n getTangent: function getTangent(v, t) {\n return evaluate(v, t, 1, true);\n },\n getWeightedTangent: function getWeightedTangent(v, t) {\n return evaluate(v, t, 1, false);\n },\n getNormal: function getNormal(v, t) {\n return evaluate(v, t, 2, true);\n },\n getWeightedNormal: function getWeightedNormal(v, t) {\n return evaluate(v, t, 2, false);\n },\n getCurvature: function getCurvature(v, t) {\n return evaluate(v, t, 3, false).x;\n },\n getPeaks: function getPeaks(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ax = -x0 + 3 * x1 - 3 * x2 + x3,\n bx = 3 * x0 - 6 * x1 + 3 * x2,\n cx = -3 * x0 + 3 * x1,\n ay = -y0 + 3 * y1 - 3 * y2 + y3,\n by = 3 * y0 - 6 * y1 + 3 * y2,\n cy = -3 * y0 + 3 * y1,\n tMin = 1e-8,\n tMax = 1 - tMin,\n roots = [];\n Numerical.solveCubic(9 * (ax * ax + ay * ay), 9 * (ax * bx + by * ay), 2 * (bx * bx + by * by) + 3 * (cx * ax + cy * ay), cx * bx + by * cy, roots, tMin, tMax);\n return roots.sort();\n }\n }\n };\n }(), new function () {\n function addLocation(locations, include, c1, t1, c2, t2, overlap) {\n var excludeStart = !overlap && c1.getPrevious() === c2,\n excludeEnd = !overlap && c1 !== c2 && c1.getNext() === c2,\n tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (t1 !== null && t1 >= (excludeStart ? tMin : 0) && t1 <= (excludeEnd ? tMax : 1)) {\n if (t2 !== null && t2 >= (excludeEnd ? tMin : 0) && t2 <= (excludeStart ? tMax : 1)) {\n var loc1 = new CurveLocation(c1, t1, null, overlap),\n loc2 = new CurveLocation(c2, t2, null, overlap);\n loc1._intersection = loc2;\n loc2._intersection = loc1;\n\n if (!include || include(loc1)) {\n CurveLocation.insert(locations, loc1, true);\n }\n }\n }\n }\n\n function addCurveIntersections(v1, v2, c1, c2, locations, include, flip, recursion, calls, tMin, tMax, uMin, uMax) {\n if (++calls >= 4096 || ++recursion >= 40) return calls;\n var fatLineEpsilon = 1e-9,\n q0x = v2[0],\n q0y = v2[1],\n q3x = v2[6],\n q3y = v2[7],\n getSignedDistance = Line.getSignedDistance,\n d1 = getSignedDistance(q0x, q0y, q3x, q3y, v2[2], v2[3]),\n d2 = getSignedDistance(q0x, q0y, q3x, q3y, v2[4], v2[5]),\n factor = d1 * d2 > 0 ? 3 / 4 : 4 / 9,\n dMin = factor * Math.min(0, d1, d2),\n dMax = factor * Math.max(0, d1, d2),\n dp0 = getSignedDistance(q0x, q0y, q3x, q3y, v1[0], v1[1]),\n dp1 = getSignedDistance(q0x, q0y, q3x, q3y, v1[2], v1[3]),\n dp2 = getSignedDistance(q0x, q0y, q3x, q3y, v1[4], v1[5]),\n dp3 = getSignedDistance(q0x, q0y, q3x, q3y, v1[6], v1[7]),\n hull = getConvexHull(dp0, dp1, dp2, dp3),\n top = hull[0],\n bottom = hull[1],\n tMinClip,\n tMaxClip;\n if (d1 === 0 && d2 === 0 && dp0 === 0 && dp1 === 0 && dp2 === 0 && dp3 === 0 || (tMinClip = clipConvexHull(top, bottom, dMin, dMax)) == null || (tMaxClip = clipConvexHull(top.reverse(), bottom.reverse(), dMin, dMax)) == null) return calls;\n var tMinNew = tMin + (tMax - tMin) * tMinClip,\n tMaxNew = tMin + (tMax - tMin) * tMaxClip;\n\n if (Math.max(uMax - uMin, tMaxNew - tMinNew) < fatLineEpsilon) {\n var t = (tMinNew + tMaxNew) / 2,\n u = (uMin + uMax) / 2;\n addLocation(locations, include, flip ? c2 : c1, flip ? u : t, flip ? c1 : c2, flip ? t : u);\n } else {\n v1 = Curve.getPart(v1, tMinClip, tMaxClip);\n var uDiff = uMax - uMin;\n\n if (tMaxClip - tMinClip > 0.8) {\n if (tMaxNew - tMinNew > uDiff) {\n var parts = Curve.subdivide(v1, 0.5),\n t = (tMinNew + tMaxNew) / 2;\n calls = addCurveIntersections(v2, parts[0], c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, tMinNew, t);\n calls = addCurveIntersections(v2, parts[1], c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, t, tMaxNew);\n } else {\n var parts = Curve.subdivide(v2, 0.5),\n u = (uMin + uMax) / 2;\n calls = addCurveIntersections(parts[0], v1, c2, c1, locations, include, !flip, recursion, calls, uMin, u, tMinNew, tMaxNew);\n calls = addCurveIntersections(parts[1], v1, c2, c1, locations, include, !flip, recursion, calls, u, uMax, tMinNew, tMaxNew);\n }\n } else {\n if (uDiff === 0 || uDiff >= fatLineEpsilon) {\n calls = addCurveIntersections(v2, v1, c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, tMinNew, tMaxNew);\n } else {\n calls = addCurveIntersections(v1, v2, c1, c2, locations, include, flip, recursion, calls, tMinNew, tMaxNew, uMin, uMax);\n }\n }\n }\n\n return calls;\n }\n\n function getConvexHull(dq0, dq1, dq2, dq3) {\n var p0 = [0, dq0],\n p1 = [1 / 3, dq1],\n p2 = [2 / 3, dq2],\n p3 = [1, dq3],\n dist1 = dq1 - (2 * dq0 + dq3) / 3,\n dist2 = dq2 - (dq0 + 2 * dq3) / 3,\n hull;\n\n if (dist1 * dist2 < 0) {\n hull = [[p0, p1, p3], [p0, p2, p3]];\n } else {\n var distRatio = dist1 / dist2;\n hull = [distRatio >= 2 ? [p0, p1, p3] : distRatio <= 0.5 ? [p0, p2, p3] : [p0, p1, p2, p3], [p0, p3]];\n }\n\n return (dist1 || dist2) < 0 ? hull.reverse() : hull;\n }\n\n function clipConvexHull(hullTop, hullBottom, dMin, dMax) {\n if (hullTop[0][1] < dMin) {\n return clipConvexHullPart(hullTop, true, dMin);\n } else if (hullBottom[0][1] > dMax) {\n return clipConvexHullPart(hullBottom, false, dMax);\n } else {\n return hullTop[0][0];\n }\n }\n\n function clipConvexHullPart(part, top, threshold) {\n var px = part[0][0],\n py = part[0][1];\n\n for (var i = 1, l = part.length; i < l; i++) {\n var qx = part[i][0],\n qy = part[i][1];\n\n if (top ? qy >= threshold : qy <= threshold) {\n return qy === threshold ? qx : px + (threshold - py) * (qx - px) / (qy - py);\n }\n\n px = qx;\n py = qy;\n }\n\n return null;\n }\n\n function getCurveLineIntersections(v, px, py, vx, vy) {\n var isZero = Numerical.isZero;\n\n if (isZero(vx) && isZero(vy)) {\n var t = Curve.getTimeOf(v, new Point(px, py));\n return t === null ? [] : [t];\n }\n\n var angle = Math.atan2(-vy, vx),\n sin = Math.sin(angle),\n cos = Math.cos(angle),\n rv = [],\n roots = [];\n\n for (var i = 0; i < 8; i += 2) {\n var x = v[i] - px,\n y = v[i + 1] - py;\n rv.push(x * cos - y * sin, x * sin + y * cos);\n }\n\n Curve.solveCubic(rv, 1, 0, roots, 0, 1);\n return roots;\n }\n\n function addCurveLineIntersections(v1, v2, c1, c2, locations, include, flip) {\n var x1 = v2[0],\n y1 = v2[1],\n x2 = v2[6],\n y2 = v2[7],\n roots = getCurveLineIntersections(v1, x1, y1, x2 - x1, y2 - y1);\n\n for (var i = 0, l = roots.length; i < l; i++) {\n var t1 = roots[i],\n p1 = Curve.getPoint(v1, t1),\n t2 = Curve.getTimeOf(v2, p1);\n\n if (t2 !== null) {\n addLocation(locations, include, flip ? c2 : c1, flip ? t2 : t1, flip ? c1 : c2, flip ? t1 : t2);\n }\n }\n }\n\n function addLineIntersection(v1, v2, c1, c2, locations, include) {\n var pt = Line.intersect(v1[0], v1[1], v1[6], v1[7], v2[0], v2[1], v2[6], v2[7]);\n\n if (pt) {\n addLocation(locations, include, c1, Curve.getTimeOf(v1, pt), c2, Curve.getTimeOf(v2, pt));\n }\n }\n\n function getCurveIntersections(v1, v2, c1, c2, locations, include) {\n var epsilon = 1e-12,\n min = Math.min,\n max = Math.max;\n\n if (max(v1[0], v1[2], v1[4], v1[6]) + epsilon > min(v2[0], v2[2], v2[4], v2[6]) && min(v1[0], v1[2], v1[4], v1[6]) - epsilon < max(v2[0], v2[2], v2[4], v2[6]) && max(v1[1], v1[3], v1[5], v1[7]) + epsilon > min(v2[1], v2[3], v2[5], v2[7]) && min(v1[1], v1[3], v1[5], v1[7]) - epsilon < max(v2[1], v2[3], v2[5], v2[7])) {\n var overlaps = getOverlaps(v1, v2);\n\n if (overlaps) {\n for (var i = 0; i < 2; i++) {\n var overlap = overlaps[i];\n addLocation(locations, include, c1, overlap[0], c2, overlap[1], true);\n }\n } else {\n var straight1 = Curve.isStraight(v1),\n straight2 = Curve.isStraight(v2),\n straight = straight1 && straight2,\n flip = straight1 && !straight2,\n before = locations.length;\n (straight ? addLineIntersection : straight1 || straight2 ? addCurveLineIntersections : addCurveIntersections)(flip ? v2 : v1, flip ? v1 : v2, flip ? c2 : c1, flip ? c1 : c2, locations, include, flip, 0, 0, 0, 1, 0, 1);\n\n if (!straight || locations.length === before) {\n for (var i = 0; i < 4; i++) {\n var t1 = i >> 1,\n t2 = i & 1,\n i1 = t1 * 6,\n i2 = t2 * 6,\n p1 = new Point(v1[i1], v1[i1 + 1]),\n p2 = new Point(v2[i2], v2[i2 + 1]);\n\n if (p1.isClose(p2, epsilon)) {\n addLocation(locations, include, c1, t1, c2, t2);\n }\n }\n }\n }\n }\n\n return locations;\n }\n\n function getSelfIntersection(v1, c1, locations, include) {\n var info = Curve.classify(v1);\n\n if (info.type === 'loop') {\n var roots = info.roots;\n addLocation(locations, include, c1, roots[0], c1, roots[1]);\n }\n\n return locations;\n }\n\n function getIntersections(curves1, curves2, include, matrix1, matrix2, _returnFirst) {\n var epsilon = 1e-7,\n self = !curves2;\n if (self) curves2 = curves1;\n var length1 = curves1.length,\n length2 = curves2.length,\n values1 = new Array(length1),\n values2 = self ? values1 : new Array(length2),\n locations = [];\n\n for (var i = 0; i < length1; i++) {\n values1[i] = curves1[i].getValues(matrix1);\n }\n\n if (!self) {\n for (var i = 0; i < length2; i++) {\n values2[i] = curves2[i].getValues(matrix2);\n }\n }\n\n var boundsCollisions = CollisionDetection.findCurveBoundsCollisions(values1, values2, epsilon);\n\n for (var index1 = 0; index1 < length1; index1++) {\n var curve1 = curves1[index1],\n v1 = values1[index1];\n\n if (self) {\n getSelfIntersection(v1, curve1, locations, include);\n }\n\n var collisions1 = boundsCollisions[index1];\n\n if (collisions1) {\n for (var j = 0; j < collisions1.length; j++) {\n if (_returnFirst && locations.length) return locations;\n var index2 = collisions1[j];\n\n if (!self || index2 > index1) {\n var curve2 = curves2[index2],\n v2 = values2[index2];\n getCurveIntersections(v1, v2, curve1, curve2, locations, include);\n }\n }\n }\n }\n\n return locations;\n }\n\n function getOverlaps(v1, v2) {\n function getSquaredLineLength(v) {\n var x = v[6] - v[0],\n y = v[7] - v[1];\n return x * x + y * y;\n }\n\n var abs = Math.abs,\n getDistance = Line.getDistance,\n timeEpsilon = 1e-8,\n geomEpsilon = 1e-7,\n straight1 = Curve.isStraight(v1),\n straight2 = Curve.isStraight(v2),\n straightBoth = straight1 && straight2,\n flip = getSquaredLineLength(v1) < getSquaredLineLength(v2),\n l1 = flip ? v2 : v1,\n l2 = flip ? v1 : v2,\n px = l1[0],\n py = l1[1],\n vx = l1[6] - px,\n vy = l1[7] - py;\n\n if (getDistance(px, py, vx, vy, l2[0], l2[1], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[6], l2[7], true) < geomEpsilon) {\n if (!straightBoth && getDistance(px, py, vx, vy, l1[2], l1[3], true) < geomEpsilon && getDistance(px, py, vx, vy, l1[4], l1[5], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[2], l2[3], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[4], l2[5], true) < geomEpsilon) {\n straight1 = straight2 = straightBoth = true;\n }\n } else if (straightBoth) {\n return null;\n }\n\n if (straight1 ^ straight2) {\n return null;\n }\n\n var v = [v1, v2],\n pairs = [];\n\n for (var i = 0; i < 4 && pairs.length < 2; i++) {\n var i1 = i & 1,\n i2 = i1 ^ 1,\n t1 = i >> 1,\n t2 = Curve.getTimeOf(v[i1], new Point(v[i2][t1 ? 6 : 0], v[i2][t1 ? 7 : 1]));\n\n if (t2 != null) {\n var pair = i1 ? [t1, t2] : [t2, t1];\n\n if (!pairs.length || abs(pair[0] - pairs[0][0]) > timeEpsilon && abs(pair[1] - pairs[0][1]) > timeEpsilon) {\n pairs.push(pair);\n }\n }\n\n if (i > 2 && !pairs.length) break;\n }\n\n if (pairs.length !== 2) {\n pairs = null;\n } else if (!straightBoth) {\n var o1 = Curve.getPart(v1, pairs[0][0], pairs[1][0]),\n o2 = Curve.getPart(v2, pairs[0][1], pairs[1][1]);\n if (abs(o2[2] - o1[2]) > geomEpsilon || abs(o2[3] - o1[3]) > geomEpsilon || abs(o2[4] - o1[4]) > geomEpsilon || abs(o2[5] - o1[5]) > geomEpsilon) pairs = null;\n }\n\n return pairs;\n }\n\n function getTimesWithTangent(v, tangent) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n normalized = tangent.normalize(),\n tx = normalized.x,\n ty = normalized.y,\n ax = 3 * x3 - 9 * x2 + 9 * x1 - 3 * x0,\n ay = 3 * y3 - 9 * y2 + 9 * y1 - 3 * y0,\n bx = 6 * x2 - 12 * x1 + 6 * x0,\n by = 6 * y2 - 12 * y1 + 6 * y0,\n cx = 3 * x1 - 3 * x0,\n cy = 3 * y1 - 3 * y0,\n den = 2 * ax * ty - 2 * ay * tx,\n times = [];\n\n if (Math.abs(den) < Numerical.CURVETIME_EPSILON) {\n var num = ax * cy - ay * cx,\n den = ax * by - ay * bx;\n\n if (den != 0) {\n var t = -num / den;\n if (t >= 0 && t <= 1) times.push(t);\n }\n } else {\n var delta = (bx * bx - 4 * ax * cx) * ty * ty + (-2 * bx * by + 4 * ay * cx + 4 * ax * cy) * tx * ty + (by * by - 4 * ay * cy) * tx * tx,\n k = bx * ty - by * tx;\n\n if (delta >= 0 && den != 0) {\n var d = Math.sqrt(delta),\n t0 = -(k + d) / den,\n t1 = (-k + d) / den;\n if (t0 >= 0 && t0 <= 1) times.push(t0);\n if (t1 >= 0 && t1 <= 1) times.push(t1);\n }\n }\n\n return times;\n }\n\n return {\n getIntersections: function getIntersections(curve) {\n var v1 = this.getValues(),\n v2 = curve && curve !== this && curve.getValues();\n return v2 ? getCurveIntersections(v1, v2, this, curve, []) : getSelfIntersection(v1, this, []);\n },\n statics: {\n getOverlaps: getOverlaps,\n getIntersections: getIntersections,\n getCurveLineIntersections: getCurveLineIntersections,\n getTimesWithTangent: getTimesWithTangent\n }\n };\n }());\n var CurveLocation = Base.extend({\n _class: 'CurveLocation',\n initialize: function CurveLocation(curve, time, point, _overlap, _distance) {\n if (time >= 0.99999999) {\n var next = curve.getNext();\n\n if (next) {\n time = 0;\n curve = next;\n }\n }\n\n this._setCurve(curve);\n\n this._time = time;\n this._point = point || curve.getPointAtTime(time);\n this._overlap = _overlap;\n this._distance = _distance;\n this._intersection = this._next = this._previous = null;\n },\n _setPath: function _setPath(path) {\n this._path = path;\n this._version = path ? path._version : 0;\n },\n _setCurve: function _setCurve(curve) {\n this._setPath(curve._path);\n\n this._curve = curve;\n this._segment = null;\n this._segment1 = curve._segment1;\n this._segment2 = curve._segment2;\n },\n _setSegment: function _setSegment(segment) {\n var curve = segment.getCurve();\n\n if (curve) {\n this._setCurve(curve);\n } else {\n this._setPath(segment._path);\n\n this._segment1 = segment;\n this._segment2 = null;\n }\n\n this._segment = segment;\n this._time = segment === this._segment1 ? 0 : 1;\n this._point = segment._point.clone();\n },\n getSegment: function getSegment() {\n var segment = this._segment;\n\n if (!segment) {\n var curve = this.getCurve(),\n time = this.getTime();\n\n if (time === 0) {\n segment = curve._segment1;\n } else if (time === 1) {\n segment = curve._segment2;\n } else if (time != null) {\n segment = curve.getPartLength(0, time) < curve.getPartLength(time, 1) ? curve._segment1 : curve._segment2;\n }\n\n this._segment = segment;\n }\n\n return segment;\n },\n getCurve: function getCurve() {\n var path = this._path,\n that = this;\n\n if (path && path._version !== this._version) {\n this._time = this._offset = this._curveOffset = this._curve = null;\n }\n\n function trySegment(segment) {\n var curve = segment && segment.getCurve();\n\n if (curve && (that._time = curve.getTimeOf(that._point)) != null) {\n that._setCurve(curve);\n\n return curve;\n }\n }\n\n return this._curve || trySegment(this._segment) || trySegment(this._segment1) || trySegment(this._segment2.getPrevious());\n },\n getPath: function getPath() {\n var curve = this.getCurve();\n return curve && curve._path;\n },\n getIndex: function getIndex() {\n var curve = this.getCurve();\n return curve && curve.getIndex();\n },\n getTime: function getTime() {\n var curve = this.getCurve(),\n time = this._time;\n return curve && time == null ? this._time = curve.getTimeOf(this._point) : time;\n },\n getParameter: '#getTime',\n getPoint: function getPoint() {\n return this._point;\n },\n getOffset: function getOffset() {\n var offset = this._offset;\n\n if (offset == null) {\n offset = 0;\n var path = this.getPath(),\n index = this.getIndex();\n\n if (path && index != null) {\n var curves = path.getCurves();\n\n for (var i = 0; i < index; i++) {\n offset += curves[i].getLength();\n }\n }\n\n this._offset = offset += this.getCurveOffset();\n }\n\n return offset;\n },\n getCurveOffset: function getCurveOffset() {\n var offset = this._curveOffset;\n\n if (offset == null) {\n var curve = this.getCurve(),\n time = this.getTime();\n this._curveOffset = offset = time != null && curve && curve.getPartLength(0, time);\n }\n\n return offset;\n },\n getIntersection: function getIntersection() {\n return this._intersection;\n },\n getDistance: function getDistance() {\n return this._distance;\n },\n divide: function divide() {\n var curve = this.getCurve(),\n res = curve && curve.divideAtTime(this.getTime());\n\n if (res) {\n this._setSegment(res._segment1);\n }\n\n return res;\n },\n split: function split() {\n var curve = this.getCurve(),\n path = curve._path,\n res = curve && curve.splitAtTime(this.getTime());\n\n if (res) {\n this._setSegment(path.getLastSegment());\n }\n\n return res;\n },\n equals: function equals(loc, _ignoreOther) {\n var res = this === loc;\n\n if (!res && loc instanceof CurveLocation) {\n var c1 = this.getCurve(),\n c2 = loc.getCurve(),\n p1 = c1._path,\n p2 = c2._path;\n\n if (p1 === p2) {\n var abs = Math.abs,\n epsilon = 1e-7,\n diff = abs(this.getOffset() - loc.getOffset()),\n i1 = !_ignoreOther && this._intersection,\n i2 = !_ignoreOther && loc._intersection;\n res = (diff < epsilon || p1 && abs(p1.getLength() - diff) < epsilon) && (!i1 && !i2 || i1 && i2 && i1.equals(i2, true));\n }\n }\n\n return res;\n },\n toString: function toString() {\n var parts = [],\n point = this.getPoint(),\n f = Formatter.instance;\n if (point) parts.push('point: ' + point);\n var index = this.getIndex();\n if (index != null) parts.push('index: ' + index);\n var time = this.getTime();\n if (time != null) parts.push('time: ' + f.number(time));\n if (this._distance != null) parts.push('distance: ' + f.number(this._distance));\n return '{ ' + parts.join(', ') + ' }';\n },\n isTouching: function isTouching() {\n var inter = this._intersection;\n\n if (inter && this.getTangent().isCollinear(inter.getTangent())) {\n var curve1 = this.getCurve(),\n curve2 = inter.getCurve();\n return !(curve1.isStraight() && curve2.isStraight() && curve1.getLine().intersect(curve2.getLine()));\n }\n\n return false;\n },\n isCrossing: function isCrossing() {\n var inter = this._intersection;\n if (!inter) return false;\n var t1 = this.getTime(),\n t2 = inter.getTime(),\n tMin = 1e-8,\n tMax = 1 - tMin,\n t1Inside = t1 >= tMin && t1 <= tMax,\n t2Inside = t2 >= tMin && t2 <= tMax;\n if (t1Inside && t2Inside) return !this.isTouching();\n var c2 = this.getCurve(),\n c1 = c2 && t1 < tMin ? c2.getPrevious() : c2,\n c4 = inter.getCurve(),\n c3 = c4 && t2 < tMin ? c4.getPrevious() : c4;\n if (t1 > tMax) c2 = c2.getNext();\n if (t2 > tMax) c4 = c4.getNext();\n if (!c1 || !c2 || !c3 || !c4) return false;\n var offsets = [];\n\n function addOffsets(curve, end) {\n var v = curve.getValues(),\n roots = Curve.classify(v).roots || Curve.getPeaks(v),\n count = roots.length,\n offset = Curve.getLength(v, end && count ? roots[count - 1] : 0, !end && count ? roots[0] : 1);\n offsets.push(count ? offset : offset / 32);\n }\n\n function isInRange(angle, min, max) {\n return min < max ? angle > min && angle < max : angle > min || angle < max;\n }\n\n if (!t1Inside) {\n addOffsets(c1, true);\n addOffsets(c2, false);\n }\n\n if (!t2Inside) {\n addOffsets(c3, true);\n addOffsets(c4, false);\n }\n\n var pt = this.getPoint(),\n offset = Math.min.apply(Math, offsets),\n v2 = t1Inside ? c2.getTangentAtTime(t1) : c2.getPointAt(offset).subtract(pt),\n v1 = t1Inside ? v2.negate() : c1.getPointAt(-offset).subtract(pt),\n v4 = t2Inside ? c4.getTangentAtTime(t2) : c4.getPointAt(offset).subtract(pt),\n v3 = t2Inside ? v4.negate() : c3.getPointAt(-offset).subtract(pt),\n a1 = v1.getAngle(),\n a2 = v2.getAngle(),\n a3 = v3.getAngle(),\n a4 = v4.getAngle();\n return !!(t1Inside ? isInRange(a1, a3, a4) ^ isInRange(a2, a3, a4) && isInRange(a1, a4, a3) ^ isInRange(a2, a4, a3) : isInRange(a3, a1, a2) ^ isInRange(a4, a1, a2) && isInRange(a3, a2, a1) ^ isInRange(a4, a2, a1));\n },\n hasOverlap: function hasOverlap() {\n return !!this._overlap;\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n var get = name + 'At';\n\n this[name] = function () {\n var curve = this.getCurve(),\n time = this.getTime();\n return time != null && curve && curve[get](time, true);\n };\n }, {\n preserve: true\n }), new function () {\n function insert(locations, loc, merge) {\n var length = locations.length,\n l = 0,\n r = length - 1;\n\n function search(index, dir) {\n for (var i = index + dir; i >= -1 && i <= length; i += dir) {\n var loc2 = locations[(i % length + length) % length];\n if (!loc.getPoint().isClose(loc2.getPoint(), 1e-7)) break;\n if (loc.equals(loc2)) return loc2;\n }\n\n return null;\n }\n\n while (l <= r) {\n var m = l + r >>> 1,\n loc2 = locations[m],\n found;\n\n if (merge && (found = loc.equals(loc2) ? loc2 : search(m, -1) || search(m, 1))) {\n if (loc._overlap) {\n found._overlap = found._intersection._overlap = true;\n }\n\n return found;\n }\n\n var path1 = loc.getPath(),\n path2 = loc2.getPath(),\n diff = path1 !== path2 ? path1._id - path2._id : loc.getIndex() + loc.getTime() - (loc2.getIndex() + loc2.getTime());\n\n if (diff < 0) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n locations.splice(l, 0, loc);\n return loc;\n }\n\n return {\n statics: {\n insert: insert,\n expand: function expand(locations) {\n var expanded = locations.slice();\n\n for (var i = locations.length - 1; i >= 0; i--) {\n insert(expanded, locations[i]._intersection, false);\n }\n\n return expanded;\n }\n }\n };\n }());\n var PathItem = Item.extend({\n _class: 'PathItem',\n _selectBounds: false,\n _canScaleStroke: true,\n beans: true,\n initialize: function PathItem() {},\n statics: {\n create: function create(arg) {\n var data, segments, compound;\n\n if (Base.isPlainObject(arg)) {\n segments = arg.segments;\n data = arg.pathData;\n } else if (Array.isArray(arg)) {\n segments = arg;\n } else if (typeof arg === 'string') {\n data = arg;\n }\n\n if (segments) {\n var first = segments[0];\n compound = first && Array.isArray(first[0]);\n } else if (data) {\n compound = (data.match(/m/gi) || []).length > 1 || /z\\s*\\S+/i.test(data);\n }\n\n var ctor = compound ? CompoundPath : Path;\n return new ctor(arg);\n }\n },\n _asPathItem: function _asPathItem() {\n return this;\n },\n isClockwise: function isClockwise() {\n return this.getArea() >= 0;\n },\n setClockwise: function setClockwise(clockwise) {\n if (this.isClockwise() != (clockwise = !!clockwise)) this.reverse();\n },\n setPathData: function setPathData(data) {\n var parts = data && data.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig),\n coords,\n relative = false,\n previous,\n control,\n current = new Point(),\n start = new Point();\n\n function getCoord(index, coord) {\n var val = +coords[index];\n if (relative) val += current[coord];\n return val;\n }\n\n function getPoint(index) {\n return new Point(getCoord(index, 'x'), getCoord(index + 1, 'y'));\n }\n\n this.clear();\n\n for (var i = 0, l = parts && parts.length; i < l; i++) {\n var part = parts[i],\n command = part[0],\n lower = command.toLowerCase();\n coords = part.match(/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g);\n var length = coords && coords.length;\n relative = command === lower;\n if (previous === 'z' && !/[mz]/.test(lower)) this.moveTo(current);\n\n switch (lower) {\n case 'm':\n case 'l':\n var move = lower === 'm';\n\n for (var j = 0; j < length; j += 2) {\n this[move ? 'moveTo' : 'lineTo'](current = getPoint(j));\n\n if (move) {\n start = current;\n move = false;\n }\n }\n\n control = current;\n break;\n\n case 'h':\n case 'v':\n var coord = lower === 'h' ? 'x' : 'y';\n current = current.clone();\n\n for (var j = 0; j < length; j++) {\n current[coord] = getCoord(j, coord);\n this.lineTo(current);\n }\n\n control = current;\n break;\n\n case 'c':\n for (var j = 0; j < length; j += 6) {\n this.cubicCurveTo(getPoint(j), control = getPoint(j + 2), current = getPoint(j + 4));\n }\n\n break;\n\n case 's':\n for (var j = 0; j < length; j += 4) {\n this.cubicCurveTo(/[cs]/.test(previous) ? current.multiply(2).subtract(control) : current, control = getPoint(j), current = getPoint(j + 2));\n previous = lower;\n }\n\n break;\n\n case 'q':\n for (var j = 0; j < length; j += 4) {\n this.quadraticCurveTo(control = getPoint(j), current = getPoint(j + 2));\n }\n\n break;\n\n case 't':\n for (var j = 0; j < length; j += 2) {\n this.quadraticCurveTo(control = /[qt]/.test(previous) ? current.multiply(2).subtract(control) : current, current = getPoint(j));\n previous = lower;\n }\n\n break;\n\n case 'a':\n for (var j = 0; j < length; j += 7) {\n this.arcTo(current = getPoint(j + 5), new Size(+coords[j], +coords[j + 1]), +coords[j + 2], +coords[j + 4], +coords[j + 3]);\n }\n\n break;\n\n case 'z':\n this.closePath(1e-12);\n current = start;\n break;\n }\n\n previous = lower;\n }\n },\n _canComposite: function _canComposite() {\n return !(this.hasFill() && this.hasStroke());\n },\n _contains: function _contains(point) {\n var winding = point.isInside(this.getBounds({\n internal: true,\n handle: true\n })) ? this._getWinding(point) : {};\n return winding.onPath || !!(this.getFillRule() === 'evenodd' ? winding.windingL & 1 || winding.windingR & 1 : winding.winding);\n },\n getIntersections: function getIntersections(path, include, _matrix, _returnFirst) {\n var self = this === path || !path,\n matrix1 = this._matrix._orNullIfIdentity(),\n matrix2 = self ? matrix1 : (_matrix || path._matrix)._orNullIfIdentity();\n\n return self || this.getBounds(matrix1).intersects(path.getBounds(matrix2), 1e-12) ? Curve.getIntersections(this.getCurves(), !self && path.getCurves(), include, matrix1, matrix2, _returnFirst) : [];\n },\n getCrossings: function getCrossings(path) {\n return this.getIntersections(path, function (inter) {\n return inter.isCrossing();\n });\n },\n getNearestLocation: function getNearestLocation() {\n var point = Point.read(arguments),\n curves = this.getCurves(),\n minDist = Infinity,\n minLoc = null;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var loc = curves[i].getNearestLocation(point);\n\n if (loc._distance < minDist) {\n minDist = loc._distance;\n minLoc = loc;\n }\n }\n\n return minLoc;\n },\n getNearestPoint: function getNearestPoint() {\n var loc = this.getNearestLocation.apply(this, arguments);\n return loc ? loc.getPoint() : loc;\n },\n interpolate: function interpolate(from, to, factor) {\n var isPath = !this._children,\n name = isPath ? '_segments' : '_children',\n itemsFrom = from[name],\n itemsTo = to[name],\n items = this[name];\n\n if (!itemsFrom || !itemsTo || itemsFrom.length !== itemsTo.length) {\n throw new Error('Invalid operands in interpolate() call: ' + from + ', ' + to);\n }\n\n var current = items.length,\n length = itemsTo.length;\n\n if (current < length) {\n var ctor = isPath ? Segment : Path;\n\n for (var i = current; i < length; i++) {\n this.add(new ctor());\n }\n } else if (current > length) {\n this[isPath ? 'removeSegments' : 'removeChildren'](length, current);\n }\n\n for (var i = 0; i < length; i++) {\n items[i].interpolate(itemsFrom[i], itemsTo[i], factor);\n }\n\n if (isPath) {\n this.setClosed(from._closed);\n\n this._changed(9);\n }\n },\n compare: function compare(path) {\n var ok = false;\n\n if (path) {\n var paths1 = this._children || [this],\n paths2 = path._children ? path._children.slice() : [path],\n length1 = paths1.length,\n length2 = paths2.length,\n matched = [],\n count = 0;\n ok = true;\n var boundsOverlaps = CollisionDetection.findItemBoundsCollisions(paths1, paths2, Numerical.GEOMETRIC_EPSILON);\n\n for (var i1 = length1 - 1; i1 >= 0 && ok; i1--) {\n var path1 = paths1[i1];\n ok = false;\n var pathBoundsOverlaps = boundsOverlaps[i1];\n\n if (pathBoundsOverlaps) {\n for (var i2 = pathBoundsOverlaps.length - 1; i2 >= 0 && !ok; i2--) {\n if (path1.compare(paths2[pathBoundsOverlaps[i2]])) {\n if (!matched[pathBoundsOverlaps[i2]]) {\n matched[pathBoundsOverlaps[i2]] = true;\n count++;\n }\n\n ok = true;\n }\n }\n }\n }\n\n ok = ok && count === length2;\n }\n\n return ok;\n }\n });\n var Path = PathItem.extend({\n _class: 'Path',\n _serializeFields: {\n segments: [],\n closed: false\n },\n initialize: function Path(arg) {\n this._closed = false;\n this._segments = [];\n this._version = 0;\n var args = arguments,\n segments = Array.isArray(arg) ? typeof arg[0] === 'object' ? arg : args : arg && arg.size === undefined && (arg.x !== undefined || arg.point !== undefined) ? args : null;\n\n if (segments && segments.length > 0) {\n this.setSegments(segments);\n } else {\n this._curves = undefined;\n this._segmentSelection = 0;\n\n if (!segments && typeof arg === 'string') {\n this.setPathData(arg);\n arg = null;\n }\n }\n\n this._initialize(!segments && arg);\n },\n _equals: function _equals(item) {\n return this._closed === item._closed && Base.equals(this._segments, item._segments);\n },\n copyContent: function copyContent(source) {\n this.setSegments(source._segments);\n this._closed = source._closed;\n },\n _changed: function _changed(flags) {\n _changed.base.call(this, flags);\n\n if (flags & 8) {\n this._length = this._area = undefined;\n\n if (flags & 32) {\n this._version++;\n } else if (this._curves) {\n for (var i = 0, l = this._curves.length; i < l; i++) {\n this._curves[i]._changed();\n }\n }\n } else if (flags & 64) {\n this._bounds = undefined;\n }\n },\n getStyle: function getStyle() {\n var parent = this._parent;\n return (parent instanceof CompoundPath ? parent : this)._style;\n },\n getSegments: function getSegments() {\n return this._segments;\n },\n setSegments: function setSegments(segments) {\n var fullySelected = this.isFullySelected(),\n length = segments && segments.length;\n this._segments.length = 0;\n this._segmentSelection = 0;\n this._curves = undefined;\n\n if (length) {\n var last = segments[length - 1];\n\n if (typeof last === 'boolean') {\n this.setClosed(last);\n length--;\n }\n\n this._add(Segment.readList(segments, 0, {}, length));\n }\n\n if (fullySelected) this.setFullySelected(true);\n },\n getFirstSegment: function getFirstSegment() {\n return this._segments[0];\n },\n getLastSegment: function getLastSegment() {\n return this._segments[this._segments.length - 1];\n },\n getCurves: function getCurves() {\n var curves = this._curves,\n segments = this._segments;\n\n if (!curves) {\n var length = this._countCurves();\n\n curves = this._curves = new Array(length);\n\n for (var i = 0; i < length; i++) {\n curves[i] = new Curve(this, segments[i], segments[i + 1] || segments[0]);\n }\n }\n\n return curves;\n },\n getFirstCurve: function getFirstCurve() {\n return this.getCurves()[0];\n },\n getLastCurve: function getLastCurve() {\n var curves = this.getCurves();\n return curves[curves.length - 1];\n },\n isClosed: function isClosed() {\n return this._closed;\n },\n setClosed: function setClosed(closed) {\n if (this._closed != (closed = !!closed)) {\n this._closed = closed;\n\n if (this._curves) {\n var length = this._curves.length = this._countCurves();\n\n if (closed) this._curves[length - 1] = new Curve(this, this._segments[length - 1], this._segments[0]);\n }\n\n this._changed(41);\n }\n }\n }, {\n beans: true,\n getPathData: function getPathData(_matrix, _precision) {\n var segments = this._segments,\n length = segments.length,\n f = new Formatter(_precision),\n coords = new Array(6),\n first = true,\n curX,\n curY,\n prevX,\n prevY,\n inX,\n inY,\n outX,\n outY,\n parts = [];\n\n function addSegment(segment, skipLine) {\n segment._transformCoordinates(_matrix, coords);\n\n curX = coords[0];\n curY = coords[1];\n\n if (first) {\n parts.push('M' + f.pair(curX, curY));\n first = false;\n } else {\n inX = coords[2];\n inY = coords[3];\n\n if (inX === curX && inY === curY && outX === prevX && outY === prevY) {\n if (!skipLine) {\n var dx = curX - prevX,\n dy = curY - prevY;\n parts.push(dx === 0 ? 'v' + f.number(dy) : dy === 0 ? 'h' + f.number(dx) : 'l' + f.pair(dx, dy));\n }\n } else {\n parts.push('c' + f.pair(outX - prevX, outY - prevY) + ' ' + f.pair(inX - prevX, inY - prevY) + ' ' + f.pair(curX - prevX, curY - prevY));\n }\n }\n\n prevX = curX;\n prevY = curY;\n outX = coords[4];\n outY = coords[5];\n }\n\n if (!length) return '';\n\n for (var i = 0; i < length; i++) {\n addSegment(segments[i]);\n }\n\n if (this._closed && length > 0) {\n addSegment(segments[0], true);\n parts.push('z');\n }\n\n return parts.join('');\n },\n isEmpty: function isEmpty() {\n return !this._segments.length;\n },\n _transformContent: function _transformContent(matrix) {\n var segments = this._segments,\n coords = new Array(6);\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i]._transformCoordinates(matrix, coords, true);\n }\n\n return true;\n },\n _add: function _add(segs, index) {\n var segments = this._segments,\n curves = this._curves,\n amount = segs.length,\n append = index == null,\n index = append ? segments.length : index;\n\n for (var i = 0; i < amount; i++) {\n var segment = segs[i];\n if (segment._path) segment = segs[i] = segment.clone();\n segment._path = this;\n segment._index = index + i;\n if (segment._selection) this._updateSelection(segment, 0, segment._selection);\n }\n\n if (append) {\n Base.push(segments, segs);\n } else {\n segments.splice.apply(segments, [index, 0].concat(segs));\n\n for (var i = index + amount, l = segments.length; i < l; i++) {\n segments[i]._index = i;\n }\n }\n\n if (curves) {\n var total = this._countCurves(),\n start = index > 0 && index + amount - 1 === total ? index - 1 : index,\n insert = start,\n end = Math.min(start + amount, total);\n\n if (segs._curves) {\n curves.splice.apply(curves, [start, 0].concat(segs._curves));\n insert += segs._curves.length;\n }\n\n for (var i = insert; i < end; i++) {\n curves.splice(i, 0, new Curve(this, null, null));\n }\n\n this._adjustCurves(start, end);\n }\n\n this._changed(41);\n\n return segs;\n },\n _adjustCurves: function _adjustCurves(start, end) {\n var segments = this._segments,\n curves = this._curves,\n curve;\n\n for (var i = start; i < end; i++) {\n curve = curves[i];\n curve._path = this;\n curve._segment1 = segments[i];\n curve._segment2 = segments[i + 1] || segments[0];\n\n curve._changed();\n }\n\n if (curve = curves[this._closed && !start ? segments.length - 1 : start - 1]) {\n curve._segment2 = segments[start] || segments[0];\n\n curve._changed();\n }\n\n if (curve = curves[end]) {\n curve._segment1 = segments[end];\n\n curve._changed();\n }\n },\n _countCurves: function _countCurves() {\n var length = this._segments.length;\n return !this._closed && length > 0 ? length - 1 : length;\n },\n add: function add(segment1) {\n var args = arguments;\n return args.length > 1 && typeof segment1 !== 'number' ? this._add(Segment.readList(args)) : this._add([Segment.read(args)])[0];\n },\n insert: function insert(index, segment1) {\n var args = arguments;\n return args.length > 2 && typeof segment1 !== 'number' ? this._add(Segment.readList(args, 1), index) : this._add([Segment.read(args, 1)], index)[0];\n },\n addSegment: function addSegment() {\n return this._add([Segment.read(arguments)])[0];\n },\n insertSegment: function insertSegment(index) {\n return this._add([Segment.read(arguments, 1)], index)[0];\n },\n addSegments: function addSegments(segments) {\n return this._add(Segment.readList(segments));\n },\n insertSegments: function insertSegments(index, segments) {\n return this._add(Segment.readList(segments), index);\n },\n removeSegment: function removeSegment(index) {\n return this.removeSegments(index, index + 1)[0] || null;\n },\n removeSegments: function removeSegments(start, end, _includeCurves) {\n start = start || 0;\n end = Base.pick(end, this._segments.length);\n var segments = this._segments,\n curves = this._curves,\n count = segments.length,\n removed = segments.splice(start, end - start),\n amount = removed.length;\n if (!amount) return removed;\n\n for (var i = 0; i < amount; i++) {\n var segment = removed[i];\n if (segment._selection) this._updateSelection(segment, segment._selection, 0);\n segment._index = segment._path = null;\n }\n\n for (var i = start, l = segments.length; i < l; i++) {\n segments[i]._index = i;\n }\n\n if (curves) {\n var index = start > 0 && end === count + (this._closed ? 1 : 0) ? start - 1 : start,\n curves = curves.splice(index, amount);\n\n for (var i = curves.length - 1; i >= 0; i--) {\n curves[i]._path = null;\n }\n\n if (_includeCurves) removed._curves = curves.slice(1);\n\n this._adjustCurves(index, index);\n }\n\n this._changed(41);\n\n return removed;\n },\n clear: '#removeSegments',\n hasHandles: function hasHandles() {\n var segments = this._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n if (segments[i].hasHandles()) return true;\n }\n\n return false;\n },\n clearHandles: function clearHandles() {\n var segments = this._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i].clearHandles();\n }\n },\n getLength: function getLength() {\n if (this._length == null) {\n var curves = this.getCurves(),\n length = 0;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n length += curves[i].getLength();\n }\n\n this._length = length;\n }\n\n return this._length;\n },\n getArea: function getArea() {\n var area = this._area;\n\n if (area == null) {\n var segments = this._segments,\n closed = this._closed;\n area = 0;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var last = i + 1 === l;\n area += Curve.getArea(Curve.getValues(segments[i], segments[last ? 0 : i + 1], null, last && !closed));\n }\n\n this._area = area;\n }\n\n return area;\n },\n isFullySelected: function isFullySelected() {\n var length = this._segments.length;\n return this.isSelected() && length > 0 && this._segmentSelection === length * 7;\n },\n setFullySelected: function setFullySelected(selected) {\n if (selected) this._selectSegments(true);\n this.setSelected(selected);\n },\n setSelection: function setSelection(selection) {\n if (!(selection & 1)) this._selectSegments(false);\n setSelection.base.call(this, selection);\n },\n _selectSegments: function _selectSegments(selected) {\n var segments = this._segments,\n length = segments.length,\n selection = selected ? 7 : 0;\n this._segmentSelection = selection * length;\n\n for (var i = 0; i < length; i++) {\n segments[i]._selection = selection;\n }\n },\n _updateSelection: function _updateSelection(segment, oldSelection, newSelection) {\n segment._selection = newSelection;\n var selection = this._segmentSelection += newSelection - oldSelection;\n if (selection > 0) this.setSelected(true);\n },\n divideAt: function divideAt(location) {\n var loc = this.getLocationAt(location),\n curve;\n return loc && (curve = loc.getCurve().divideAt(loc.getCurveOffset())) ? curve._segment1 : null;\n },\n splitAt: function splitAt(location) {\n var loc = this.getLocationAt(location),\n index = loc && loc.index,\n time = loc && loc.time,\n tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (time > tMax) {\n index++;\n time = 0;\n }\n\n var curves = this.getCurves();\n\n if (index >= 0 && index < curves.length) {\n if (time >= tMin) {\n curves[index++].divideAtTime(time);\n }\n\n var segs = this.removeSegments(index, this._segments.length, true),\n path;\n\n if (this._closed) {\n this.setClosed(false);\n path = this;\n } else {\n path = new Path(Item.NO_INSERT);\n path.insertAbove(this);\n path.copyAttributes(this);\n }\n\n path._add(segs, 0);\n\n this.addSegment(segs[0]);\n return path;\n }\n\n return null;\n },\n split: function split(index, time) {\n var curve,\n location = time === undefined ? index : (curve = this.getCurves()[index]) && curve.getLocationAtTime(time);\n return location != null ? this.splitAt(location) : null;\n },\n join: function join(path, tolerance) {\n var epsilon = tolerance || 0;\n\n if (path && path !== this) {\n var segments = path._segments,\n last1 = this.getLastSegment(),\n last2 = path.getLastSegment();\n if (!last2) return this;\n if (last1 && last1._point.isClose(last2._point, epsilon)) path.reverse();\n var first2 = path.getFirstSegment();\n\n if (last1 && last1._point.isClose(first2._point, epsilon)) {\n last1.setHandleOut(first2._handleOut);\n\n this._add(segments.slice(1));\n } else {\n var first1 = this.getFirstSegment();\n if (first1 && first1._point.isClose(first2._point, epsilon)) path.reverse();\n last2 = path.getLastSegment();\n\n if (first1 && first1._point.isClose(last2._point, epsilon)) {\n first1.setHandleIn(last2._handleIn);\n\n this._add(segments.slice(0, segments.length - 1), 0);\n } else {\n this._add(segments.slice());\n }\n }\n\n if (path._closed) this._add([segments[0]]);\n path.remove();\n }\n\n var first = this.getFirstSegment(),\n last = this.getLastSegment();\n\n if (first !== last && first._point.isClose(last._point, epsilon)) {\n first.setHandleIn(last._handleIn);\n last.remove();\n this.setClosed(true);\n }\n\n return this;\n },\n reduce: function reduce(options) {\n var curves = this.getCurves(),\n simplify = options && options.simplify,\n tolerance = simplify ? 1e-7 : 0;\n\n for (var i = curves.length - 1; i >= 0; i--) {\n var curve = curves[i];\n if (!curve.hasHandles() && (!curve.hasLength(tolerance) || simplify && curve.isCollinear(curve.getNext()))) curve.remove();\n }\n\n return this;\n },\n reverse: function reverse() {\n this._segments.reverse();\n\n for (var i = 0, l = this._segments.length; i < l; i++) {\n var segment = this._segments[i];\n var handleIn = segment._handleIn;\n segment._handleIn = segment._handleOut;\n segment._handleOut = handleIn;\n segment._index = i;\n }\n\n this._curves = null;\n\n this._changed(9);\n },\n flatten: function flatten(flatness) {\n var flattener = new PathFlattener(this, flatness || 0.25, 256, true),\n parts = flattener.parts,\n length = parts.length,\n segments = [];\n\n for (var i = 0; i < length; i++) {\n segments.push(new Segment(parts[i].curve.slice(0, 2)));\n }\n\n if (!this._closed && length > 0) {\n segments.push(new Segment(parts[length - 1].curve.slice(6)));\n }\n\n this.setSegments(segments);\n },\n simplify: function simplify(tolerance) {\n var segments = new PathFitter(this).fit(tolerance || 2.5);\n if (segments) this.setSegments(segments);\n return !!segments;\n },\n smooth: function smooth(options) {\n var that = this,\n opts = options || {},\n type = opts.type || 'asymmetric',\n segments = this._segments,\n length = segments.length,\n closed = this._closed;\n\n function getIndex(value, _default) {\n var index = value && value.index;\n\n if (index != null) {\n var path = value.path;\n if (path && path !== that) throw new Error(value._class + ' ' + index + ' of ' + path + ' is not part of ' + that);\n if (_default && value instanceof Curve) index++;\n } else {\n index = typeof value === 'number' ? value : _default;\n }\n\n return Math.min(index < 0 && closed ? index % length : index < 0 ? index + length : index, length - 1);\n }\n\n var loop = closed && opts.from === undefined && opts.to === undefined,\n from = getIndex(opts.from, 0),\n to = getIndex(opts.to, length - 1);\n\n if (from > to) {\n if (closed) {\n from -= length;\n } else {\n var tmp = from;\n from = to;\n to = tmp;\n }\n }\n\n if (/^(?:asymmetric|continuous)$/.test(type)) {\n var asymmetric = type === 'asymmetric',\n min = Math.min,\n amount = to - from + 1,\n n = amount - 1,\n padding = loop ? min(amount, 4) : 1,\n paddingLeft = padding,\n paddingRight = padding,\n knots = [];\n\n if (!closed) {\n paddingLeft = min(1, from);\n paddingRight = min(1, length - to - 1);\n }\n\n n += paddingLeft + paddingRight;\n if (n <= 1) return;\n\n for (var i = 0, j = from - paddingLeft; i <= n; i++, j++) {\n knots[i] = segments[(j < 0 ? j + length : j) % length]._point;\n }\n\n var x = knots[0]._x + 2 * knots[1]._x,\n y = knots[0]._y + 2 * knots[1]._y,\n f = 2,\n n_1 = n - 1,\n rx = [x],\n ry = [y],\n rf = [f],\n px = [],\n py = [];\n\n for (var i = 1; i < n; i++) {\n var internal = i < n_1,\n a = internal ? 1 : asymmetric ? 1 : 2,\n b = internal ? 4 : asymmetric ? 2 : 7,\n u = internal ? 4 : asymmetric ? 3 : 8,\n v = internal ? 2 : asymmetric ? 0 : 1,\n m = a / f;\n f = rf[i] = b - m;\n x = rx[i] = u * knots[i]._x + v * knots[i + 1]._x - m * x;\n y = ry[i] = u * knots[i]._y + v * knots[i + 1]._y - m * y;\n }\n\n px[n_1] = rx[n_1] / rf[n_1];\n py[n_1] = ry[n_1] / rf[n_1];\n\n for (var i = n - 2; i >= 0; i--) {\n px[i] = (rx[i] - px[i + 1]) / rf[i];\n py[i] = (ry[i] - py[i + 1]) / rf[i];\n }\n\n px[n] = (3 * knots[n]._x - px[n_1]) / 2;\n py[n] = (3 * knots[n]._y - py[n_1]) / 2;\n\n for (var i = paddingLeft, max = n - paddingRight, j = from; i <= max; i++, j++) {\n var segment = segments[j < 0 ? j + length : j],\n pt = segment._point,\n hx = px[i] - pt._x,\n hy = py[i] - pt._y;\n if (loop || i < max) segment.setHandleOut(hx, hy);\n if (loop || i > paddingLeft) segment.setHandleIn(-hx, -hy);\n }\n } else {\n for (var i = from; i <= to; i++) {\n segments[i < 0 ? i + length : i].smooth(opts, !loop && i === from, !loop && i === to);\n }\n }\n },\n toShape: function toShape(insert) {\n if (!this._closed) return null;\n var segments = this._segments,\n type,\n size,\n radius,\n topCenter;\n\n function isCollinear(i, j) {\n var seg1 = segments[i],\n seg2 = seg1.getNext(),\n seg3 = segments[j],\n seg4 = seg3.getNext();\n return seg1._handleOut.isZero() && seg2._handleIn.isZero() && seg3._handleOut.isZero() && seg4._handleIn.isZero() && seg2._point.subtract(seg1._point).isCollinear(seg4._point.subtract(seg3._point));\n }\n\n function isOrthogonal(i) {\n var seg2 = segments[i],\n seg1 = seg2.getPrevious(),\n seg3 = seg2.getNext();\n return seg1._handleOut.isZero() && seg2._handleIn.isZero() && seg2._handleOut.isZero() && seg3._handleIn.isZero() && seg2._point.subtract(seg1._point).isOrthogonal(seg3._point.subtract(seg2._point));\n }\n\n function isArc(i) {\n var seg1 = segments[i],\n seg2 = seg1.getNext(),\n handle1 = seg1._handleOut,\n handle2 = seg2._handleIn,\n kappa = 0.5522847498307936;\n\n if (handle1.isOrthogonal(handle2)) {\n var pt1 = seg1._point,\n pt2 = seg2._point,\n corner = new Line(pt1, handle1, true).intersect(new Line(pt2, handle2, true), true);\n return corner && Numerical.isZero(handle1.getLength() / corner.subtract(pt1).getLength() - kappa) && Numerical.isZero(handle2.getLength() / corner.subtract(pt2).getLength() - kappa);\n }\n\n return false;\n }\n\n function getDistance(i, j) {\n return segments[i]._point.getDistance(segments[j]._point);\n }\n\n if (!this.hasHandles() && segments.length === 4 && isCollinear(0, 2) && isCollinear(1, 3) && isOrthogonal(1)) {\n type = Shape.Rectangle;\n size = new Size(getDistance(0, 3), getDistance(0, 1));\n topCenter = segments[1]._point.add(segments[2]._point).divide(2);\n } else if (segments.length === 8 && isArc(0) && isArc(2) && isArc(4) && isArc(6) && isCollinear(1, 5) && isCollinear(3, 7)) {\n type = Shape.Rectangle;\n size = new Size(getDistance(1, 6), getDistance(0, 3));\n radius = size.subtract(new Size(getDistance(0, 7), getDistance(1, 2))).divide(2);\n topCenter = segments[3]._point.add(segments[4]._point).divide(2);\n } else if (segments.length === 4 && isArc(0) && isArc(1) && isArc(2) && isArc(3)) {\n if (Numerical.isZero(getDistance(0, 2) - getDistance(1, 3))) {\n type = Shape.Circle;\n radius = getDistance(0, 2) / 2;\n } else {\n type = Shape.Ellipse;\n radius = new Size(getDistance(2, 0) / 2, getDistance(3, 1) / 2);\n }\n\n topCenter = segments[1]._point;\n }\n\n if (type) {\n var center = this.getPosition(true),\n shape = new type({\n center: center,\n size: size,\n radius: radius,\n insert: false\n });\n shape.copyAttributes(this, true);\n\n shape._matrix.prepend(this._matrix);\n\n shape.rotate(topCenter.subtract(center).getAngle() + 90);\n if (insert === undefined || insert) shape.insertAbove(this);\n return shape;\n }\n\n return null;\n },\n toPath: '#clone',\n compare: function compare(path) {\n if (!path || path instanceof CompoundPath) return compare.base.call(this, path);\n var curves1 = this.getCurves(),\n curves2 = path.getCurves(),\n length1 = curves1.length,\n length2 = curves2.length;\n\n if (!length1 || !length2) {\n return length1 == length2;\n }\n\n var v1 = curves1[0].getValues(),\n values2 = [],\n pos1 = 0,\n pos2,\n end1 = 0,\n end2;\n\n for (var i = 0; i < length2; i++) {\n var v2 = curves2[i].getValues();\n values2.push(v2);\n var overlaps = Curve.getOverlaps(v1, v2);\n\n if (overlaps) {\n pos2 = !i && overlaps[0][0] > 0 ? length2 - 1 : i;\n end2 = overlaps[0][1];\n break;\n }\n }\n\n var abs = Math.abs,\n epsilon = 1e-8,\n v2 = values2[pos2],\n start2;\n\n while (v1 && v2) {\n var overlaps = Curve.getOverlaps(v1, v2);\n\n if (overlaps) {\n var t1 = overlaps[0][0];\n\n if (abs(t1 - end1) < epsilon) {\n end1 = overlaps[1][0];\n\n if (end1 === 1) {\n v1 = ++pos1 < length1 ? curves1[pos1].getValues() : null;\n end1 = 0;\n }\n\n var t2 = overlaps[0][1];\n\n if (abs(t2 - end2) < epsilon) {\n if (!start2) start2 = [pos2, t2];\n end2 = overlaps[1][1];\n\n if (end2 === 1) {\n if (++pos2 >= length2) pos2 = 0;\n v2 = values2[pos2] || curves2[pos2].getValues();\n end2 = 0;\n }\n\n if (!v1) {\n return start2[0] === pos2 && start2[1] === end2;\n }\n\n continue;\n }\n }\n }\n\n break;\n }\n\n return false;\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix, strokeMatrix) {\n var that = this,\n style = this.getStyle(),\n segments = this._segments,\n numSegments = segments.length,\n closed = this._closed,\n tolerancePadding = options._tolerancePadding,\n strokePadding = tolerancePadding,\n join,\n cap,\n miterLimit,\n area,\n loc,\n res,\n hitStroke = options.stroke && style.hasStroke(),\n hitFill = options.fill && style.hasFill(),\n hitCurves = options.curves,\n strokeRadius = hitStroke ? style.getStrokeWidth() / 2 : hitFill && options.tolerance > 0 || hitCurves ? 0 : null;\n\n if (strokeRadius !== null) {\n if (strokeRadius > 0) {\n join = style.getStrokeJoin();\n cap = style.getStrokeCap();\n miterLimit = style.getMiterLimit();\n strokePadding = strokePadding.add(Path._getStrokePadding(strokeRadius, strokeMatrix));\n } else {\n join = cap = 'round';\n }\n }\n\n function isCloseEnough(pt, padding) {\n return point.subtract(pt).divide(padding).length <= 1;\n }\n\n function checkSegmentPoint(seg, pt, name) {\n if (!options.selected || pt.isSelected()) {\n var anchor = seg._point;\n if (pt !== anchor) pt = pt.add(anchor);\n\n if (isCloseEnough(pt, strokePadding)) {\n return new HitResult(name, that, {\n segment: seg,\n point: pt\n });\n }\n }\n }\n\n function checkSegmentPoints(seg, ends) {\n return (ends || options.segments) && checkSegmentPoint(seg, seg._point, 'segment') || !ends && options.handles && (checkSegmentPoint(seg, seg._handleIn, 'handle-in') || checkSegmentPoint(seg, seg._handleOut, 'handle-out'));\n }\n\n function addToArea(point) {\n area.add(point);\n }\n\n function checkSegmentStroke(segment) {\n var isJoin = closed || segment._index > 0 && segment._index < numSegments - 1;\n\n if ((isJoin ? join : cap) === 'round') {\n return isCloseEnough(segment._point, strokePadding);\n } else {\n area = new Path({\n internal: true,\n closed: true\n });\n\n if (isJoin) {\n if (!segment.isSmooth()) {\n Path._addBevelJoin(segment, join, strokeRadius, miterLimit, null, strokeMatrix, addToArea, true);\n }\n } else if (cap === 'square') {\n Path._addSquareCap(segment, cap, strokeRadius, null, strokeMatrix, addToArea, true);\n }\n\n if (!area.isEmpty()) {\n var loc;\n return area.contains(point) || (loc = area.getNearestLocation(point)) && isCloseEnough(loc.getPoint(), tolerancePadding);\n }\n }\n }\n\n if (options.ends && !options.segments && !closed) {\n if (res = checkSegmentPoints(segments[0], true) || checkSegmentPoints(segments[numSegments - 1], true)) return res;\n } else if (options.segments || options.handles) {\n for (var i = 0; i < numSegments; i++) {\n if (res = checkSegmentPoints(segments[i])) return res;\n }\n }\n\n if (strokeRadius !== null) {\n loc = this.getNearestLocation(point);\n\n if (loc) {\n var time = loc.getTime();\n\n if (time === 0 || time === 1 && numSegments > 1) {\n if (!checkSegmentStroke(loc.getSegment())) loc = null;\n } else if (!isCloseEnough(loc.getPoint(), strokePadding)) {\n loc = null;\n }\n }\n\n if (!loc && join === 'miter' && numSegments > 1) {\n for (var i = 0; i < numSegments; i++) {\n var segment = segments[i];\n\n if (point.getDistance(segment._point) <= miterLimit * strokeRadius && checkSegmentStroke(segment)) {\n loc = segment.getLocation();\n break;\n }\n }\n }\n }\n\n return !loc && hitFill && this._contains(point) || loc && !hitStroke && !hitCurves ? new HitResult('fill', this) : loc ? new HitResult(hitStroke ? 'stroke' : 'curve', this, {\n location: loc,\n point: loc.getPoint()\n }) : null;\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n this[name + 'At'] = function (offset) {\n var loc = this.getLocationAt(offset);\n return loc && loc[name]();\n };\n }, {\n beans: false,\n getLocationOf: function getLocationOf() {\n var point = Point.read(arguments),\n curves = this.getCurves();\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var loc = curves[i].getLocationOf(point);\n if (loc) return loc;\n }\n\n return null;\n },\n getOffsetOf: function getOffsetOf() {\n var loc = this.getLocationOf.apply(this, arguments);\n return loc ? loc.getOffset() : null;\n },\n getLocationAt: function getLocationAt(offset) {\n if (typeof offset === 'number') {\n var curves = this.getCurves(),\n length = 0;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var start = length,\n curve = curves[i];\n length += curve.getLength();\n\n if (length > offset) {\n return curve.getLocationAt(offset - start);\n }\n }\n\n if (curves.length > 0 && offset <= this.getLength()) {\n return new CurveLocation(curves[curves.length - 1], 1);\n }\n } else if (offset && offset.getPath && offset.getPath() === this) {\n return offset;\n }\n\n return null;\n },\n getOffsetsWithTangent: function getOffsetsWithTangent() {\n var tangent = Point.read(arguments);\n\n if (tangent.isZero()) {\n return [];\n }\n\n var offsets = [];\n var curveStart = 0;\n var curves = this.getCurves();\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var curve = curves[i];\n var curveTimes = curve.getTimesWithTangent(tangent);\n\n for (var j = 0, m = curveTimes.length; j < m; j++) {\n var offset = curveStart + curve.getOffsetAtTime(curveTimes[j]);\n\n if (offsets.indexOf(offset) < 0) {\n offsets.push(offset);\n }\n }\n\n curveStart += curve.length;\n }\n\n return offsets;\n }\n }), new function () {\n function drawHandles(ctx, segments, matrix, size) {\n if (size <= 0) return;\n var half = size / 2,\n miniSize = size - 2,\n miniHalf = half - 1,\n coords = new Array(6),\n pX,\n pY;\n\n function drawHandle(index) {\n var hX = coords[index],\n hY = coords[index + 1];\n\n if (pX != hX || pY != hY) {\n ctx.beginPath();\n ctx.moveTo(pX, pY);\n ctx.lineTo(hX, hY);\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(hX, hY, half, 0, Math.PI * 2, true);\n ctx.fill();\n }\n }\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i],\n selection = segment._selection;\n\n segment._transformCoordinates(matrix, coords);\n\n pX = coords[0];\n pY = coords[1];\n if (selection & 2) drawHandle(2);\n if (selection & 4) drawHandle(4);\n ctx.fillRect(pX - half, pY - half, size, size);\n\n if (miniSize > 0 && !(selection & 1)) {\n var fillStyle = ctx.fillStyle;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(pX - miniHalf, pY - miniHalf, miniSize, miniSize);\n ctx.fillStyle = fillStyle;\n }\n }\n }\n\n function drawSegments(ctx, path, matrix) {\n var segments = path._segments,\n length = segments.length,\n coords = new Array(6),\n first = true,\n curX,\n curY,\n prevX,\n prevY,\n inX,\n inY,\n outX,\n outY;\n\n function drawSegment(segment) {\n if (matrix) {\n segment._transformCoordinates(matrix, coords);\n\n curX = coords[0];\n curY = coords[1];\n } else {\n var point = segment._point;\n curX = point._x;\n curY = point._y;\n }\n\n if (first) {\n ctx.moveTo(curX, curY);\n first = false;\n } else {\n if (matrix) {\n inX = coords[2];\n inY = coords[3];\n } else {\n var handle = segment._handleIn;\n inX = curX + handle._x;\n inY = curY + handle._y;\n }\n\n if (inX === curX && inY === curY && outX === prevX && outY === prevY) {\n ctx.lineTo(curX, curY);\n } else {\n ctx.bezierCurveTo(outX, outY, inX, inY, curX, curY);\n }\n }\n\n prevX = curX;\n prevY = curY;\n\n if (matrix) {\n outX = coords[4];\n outY = coords[5];\n } else {\n var handle = segment._handleOut;\n outX = prevX + handle._x;\n outY = prevY + handle._y;\n }\n }\n\n for (var i = 0; i < length; i++) {\n drawSegment(segments[i]);\n }\n\n if (path._closed && length > 0) drawSegment(segments[0]);\n }\n\n return {\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var dontStart = param.dontStart,\n dontPaint = param.dontFinish || param.clip,\n style = this.getStyle(),\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n dashArray = style.getDashArray(),\n dashLength = !paper.support.nativeDash && hasStroke && dashArray && dashArray.length;\n if (!dontStart) ctx.beginPath();\n\n if (hasFill || hasStroke && !dashLength || dontPaint) {\n drawSegments(ctx, this, strokeMatrix);\n if (this._closed) ctx.closePath();\n }\n\n function getOffset(i) {\n return dashArray[(i % dashLength + dashLength) % dashLength];\n }\n\n if (!dontPaint && (hasFill || hasStroke)) {\n this._setStyles(ctx, param, viewMatrix);\n\n if (hasFill) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) {\n if (dashLength) {\n if (!dontStart) ctx.beginPath();\n var flattener = new PathFlattener(this, 0.25, 32, false, strokeMatrix),\n length = flattener.length,\n from = -style.getDashOffset(),\n to,\n i = 0;\n\n while (from > 0) {\n from -= getOffset(i--) + getOffset(i--);\n }\n\n while (from < length) {\n to = from + getOffset(i++);\n if (from > 0 || to > 0) flattener.drawPart(ctx, Math.max(from, 0), Math.max(to, 0));\n from = to + getOffset(i++);\n }\n }\n\n ctx.stroke();\n }\n }\n },\n _drawSelected: function _drawSelected(ctx, matrix) {\n ctx.beginPath();\n drawSegments(ctx, this, matrix);\n ctx.stroke();\n drawHandles(ctx, this._segments, matrix, paper.settings.handleSize);\n }\n };\n }(), new function () {\n function getCurrentSegment(that) {\n var segments = that._segments;\n if (!segments.length) throw new Error('Use a moveTo() command first');\n return segments[segments.length - 1];\n }\n\n return {\n moveTo: function moveTo() {\n var segments = this._segments;\n if (segments.length === 1) this.removeSegment(0);\n if (!segments.length) this._add([new Segment(Point.read(arguments))]);\n },\n moveBy: function moveBy() {\n throw new Error('moveBy() is unsupported on Path items.');\n },\n lineTo: function lineTo() {\n this._add([new Segment(Point.read(arguments))]);\n },\n cubicCurveTo: function cubicCurveTo() {\n var args = arguments,\n handle1 = Point.read(args),\n handle2 = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this);\n current.setHandleOut(handle1.subtract(current._point));\n\n this._add([new Segment(to, handle2.subtract(to))]);\n },\n quadraticCurveTo: function quadraticCurveTo() {\n var args = arguments,\n handle = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.cubicCurveTo(handle.add(current.subtract(handle).multiply(1 / 3)), handle.add(to.subtract(handle).multiply(1 / 3)), to);\n },\n curveTo: function curveTo() {\n var args = arguments,\n through = Point.read(args),\n to = Point.read(args),\n t = Base.pick(Base.read(args), 0.5),\n t1 = 1 - t,\n current = getCurrentSegment(this)._point,\n handle = through.subtract(current.multiply(t1 * t1)).subtract(to.multiply(t * t)).divide(2 * t * t1);\n\n if (handle.isNaN()) throw new Error('Cannot put a curve through points with parameter = ' + t);\n this.quadraticCurveTo(handle, to);\n },\n arcTo: function arcTo() {\n var args = arguments,\n abs = Math.abs,\n sqrt = Math.sqrt,\n current = getCurrentSegment(this),\n from = current._point,\n to = Point.read(args),\n through,\n peek = Base.peek(args),\n clockwise = Base.pick(peek, true),\n center,\n extent,\n vector,\n matrix;\n\n if (typeof clockwise === 'boolean') {\n var middle = from.add(to).divide(2),\n through = middle.add(middle.subtract(from).rotate(clockwise ? -90 : 90));\n } else if (Base.remain(args) <= 2) {\n through = to;\n to = Point.read(args);\n } else if (!from.equals(to)) {\n var radius = Size.read(args),\n isZero = Numerical.isZero;\n if (isZero(radius.width) || isZero(radius.height)) return this.lineTo(to);\n var rotation = Base.read(args),\n clockwise = !!Base.read(args),\n large = !!Base.read(args),\n middle = from.add(to).divide(2),\n pt = from.subtract(middle).rotate(-rotation),\n x = pt.x,\n y = pt.y,\n rx = abs(radius.width),\n ry = abs(radius.height),\n rxSq = rx * rx,\n rySq = ry * ry,\n xSq = x * x,\n ySq = y * y;\n var factor = sqrt(xSq / rxSq + ySq / rySq);\n\n if (factor > 1) {\n rx *= factor;\n ry *= factor;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n factor = (rxSq * rySq - rxSq * ySq - rySq * xSq) / (rxSq * ySq + rySq * xSq);\n if (abs(factor) < 1e-12) factor = 0;\n if (factor < 0) throw new Error('Cannot create an arc with the given arguments');\n center = new Point(rx * y / ry, -ry * x / rx).multiply((large === clockwise ? -1 : 1) * sqrt(factor)).rotate(rotation).add(middle);\n matrix = new Matrix().translate(center).rotate(rotation).scale(rx, ry);\n vector = matrix._inverseTransform(from);\n extent = vector.getDirectedAngle(matrix._inverseTransform(to));\n if (!clockwise && extent > 0) extent -= 360;else if (clockwise && extent < 0) extent += 360;\n }\n\n if (through) {\n var l1 = new Line(from.add(through).divide(2), through.subtract(from).rotate(90), true),\n l2 = new Line(through.add(to).divide(2), to.subtract(through).rotate(90), true),\n line = new Line(from, to),\n throughSide = line.getSide(through);\n center = l1.intersect(l2, true);\n\n if (!center) {\n if (!throughSide) return this.lineTo(to);\n throw new Error('Cannot create an arc with the given arguments');\n }\n\n vector = from.subtract(center);\n extent = vector.getDirectedAngle(to.subtract(center));\n var centerSide = line.getSide(center, true);\n\n if (centerSide === 0) {\n extent = throughSide * abs(extent);\n } else if (throughSide === centerSide) {\n extent += extent < 0 ? 360 : -360;\n }\n }\n\n if (extent) {\n var epsilon = 1e-7,\n ext = abs(extent),\n count = ext >= 360 ? 4 : Math.ceil((ext - epsilon) / 90),\n inc = extent / count,\n half = inc * Math.PI / 360,\n z = 4 / 3 * Math.sin(half) / (1 + Math.cos(half)),\n segments = [];\n\n for (var i = 0; i <= count; i++) {\n var pt = to,\n out = null;\n\n if (i < count) {\n out = vector.rotate(90).multiply(z);\n\n if (matrix) {\n pt = matrix._transformPoint(vector);\n out = matrix._transformPoint(vector.add(out)).subtract(pt);\n } else {\n pt = center.add(vector);\n }\n }\n\n if (!i) {\n current.setHandleOut(out);\n } else {\n var _in = vector.rotate(-90).multiply(z);\n\n if (matrix) {\n _in = matrix._transformPoint(vector.add(_in)).subtract(pt);\n }\n\n segments.push(new Segment(pt, _in, out));\n }\n\n vector = vector.rotate(inc);\n }\n\n this._add(segments);\n }\n },\n lineBy: function lineBy() {\n var to = Point.read(arguments),\n current = getCurrentSegment(this)._point;\n\n this.lineTo(current.add(to));\n },\n curveBy: function curveBy() {\n var args = arguments,\n through = Point.read(args),\n to = Point.read(args),\n parameter = Base.read(args),\n current = getCurrentSegment(this)._point;\n\n this.curveTo(current.add(through), current.add(to), parameter);\n },\n cubicCurveBy: function cubicCurveBy() {\n var args = arguments,\n handle1 = Point.read(args),\n handle2 = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.cubicCurveTo(current.add(handle1), current.add(handle2), current.add(to));\n },\n quadraticCurveBy: function quadraticCurveBy() {\n var args = arguments,\n handle = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.quadraticCurveTo(current.add(handle), current.add(to));\n },\n arcBy: function arcBy() {\n var args = arguments,\n current = getCurrentSegment(this)._point,\n point = current.add(Point.read(args)),\n clockwise = Base.pick(Base.peek(args), true);\n\n if (typeof clockwise === 'boolean') {\n this.arcTo(point, clockwise);\n } else {\n this.arcTo(point, current.add(Point.read(args)));\n }\n },\n closePath: function closePath(tolerance) {\n this.setClosed(true);\n this.join(this, tolerance);\n }\n };\n }(), {\n _getBounds: function _getBounds(matrix, options) {\n var method = options.handle ? 'getHandleBounds' : options.stroke ? 'getStrokeBounds' : 'getBounds';\n return Path[method](this._segments, this._closed, this, matrix, options);\n },\n statics: {\n getBounds: function getBounds(segments, closed, path, matrix, options, strokePadding) {\n var first = segments[0];\n if (!first) return new _Rectangle();\n\n var coords = new Array(6),\n prevCoords = first._transformCoordinates(matrix, new Array(6)),\n min = prevCoords.slice(0, 2),\n max = min.slice(),\n roots = new Array(2);\n\n function processSegment(segment) {\n segment._transformCoordinates(matrix, coords);\n\n for (var i = 0; i < 2; i++) {\n Curve._addBounds(prevCoords[i], prevCoords[i + 4], coords[i + 2], coords[i], i, strokePadding ? strokePadding[i] : 0, min, max, roots);\n }\n\n var tmp = prevCoords;\n prevCoords = coords;\n coords = tmp;\n }\n\n for (var i = 1, l = segments.length; i < l; i++) {\n processSegment(segments[i]);\n }\n\n if (closed) processSegment(first);\n return new _Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n },\n getStrokeBounds: function getStrokeBounds(segments, closed, path, matrix, options) {\n var style = path.getStyle(),\n stroke = style.hasStroke(),\n strokeWidth = style.getStrokeWidth(),\n strokeMatrix = stroke && path._getStrokeMatrix(matrix, options),\n strokePadding = stroke && Path._getStrokePadding(strokeWidth, strokeMatrix),\n bounds = Path.getBounds(segments, closed, path, matrix, options, strokePadding);\n\n if (!stroke) return bounds;\n var strokeRadius = strokeWidth / 2,\n join = style.getStrokeJoin(),\n cap = style.getStrokeCap(),\n miterLimit = style.getMiterLimit(),\n joinBounds = new _Rectangle(new Size(strokePadding));\n\n function addPoint(point) {\n bounds = bounds.include(point);\n }\n\n function addRound(segment) {\n bounds = bounds.unite(joinBounds.setCenter(segment._point.transform(matrix)));\n }\n\n function addJoin(segment, join) {\n if (join === 'round' || segment.isSmooth()) {\n addRound(segment);\n } else {\n Path._addBevelJoin(segment, join, strokeRadius, miterLimit, matrix, strokeMatrix, addPoint);\n }\n }\n\n function addCap(segment, cap) {\n if (cap === 'round') {\n addRound(segment);\n } else {\n Path._addSquareCap(segment, cap, strokeRadius, matrix, strokeMatrix, addPoint);\n }\n }\n\n var length = segments.length - (closed ? 0 : 1);\n\n if (length > 0) {\n for (var i = 1; i < length; i++) {\n addJoin(segments[i], join);\n }\n\n if (closed) {\n addJoin(segments[0], join);\n } else {\n addCap(segments[0], cap);\n addCap(segments[segments.length - 1], cap);\n }\n }\n\n return bounds;\n },\n _getStrokePadding: function _getStrokePadding(radius, matrix) {\n if (!matrix) return [radius, radius];\n var hor = new Point(radius, 0).transform(matrix),\n ver = new Point(0, radius).transform(matrix),\n phi = hor.getAngleInRadians(),\n a = hor.getLength(),\n b = ver.getLength();\n var sin = Math.sin(phi),\n cos = Math.cos(phi),\n tan = Math.tan(phi),\n tx = Math.atan2(b * tan, a),\n ty = Math.atan2(b, tan * a);\n return [Math.abs(a * Math.cos(tx) * cos + b * Math.sin(tx) * sin), Math.abs(b * Math.sin(ty) * cos + a * Math.cos(ty) * sin)];\n },\n _addBevelJoin: function _addBevelJoin(segment, join, radius, miterLimit, matrix, strokeMatrix, addPoint, isArea) {\n var curve2 = segment.getCurve(),\n curve1 = curve2.getPrevious(),\n point = curve2.getPoint1().transform(matrix),\n normal1 = curve1.getNormalAtTime(1).multiply(radius).transform(strokeMatrix),\n normal2 = curve2.getNormalAtTime(0).multiply(radius).transform(strokeMatrix),\n angle = normal1.getDirectedAngle(normal2);\n\n if (angle < 0 || angle >= 180) {\n normal1 = normal1.negate();\n normal2 = normal2.negate();\n }\n\n if (isArea) addPoint(point);\n addPoint(point.add(normal1));\n\n if (join === 'miter') {\n var corner = new Line(point.add(normal1), new Point(-normal1.y, normal1.x), true).intersect(new Line(point.add(normal2), new Point(-normal2.y, normal2.x), true), true);\n\n if (corner && point.getDistance(corner) <= miterLimit * radius) {\n addPoint(corner);\n }\n }\n\n addPoint(point.add(normal2));\n },\n _addSquareCap: function _addSquareCap(segment, cap, radius, matrix, strokeMatrix, addPoint, isArea) {\n var point = segment._point.transform(matrix),\n loc = segment.getLocation(),\n normal = loc.getNormal().multiply(loc.getTime() === 0 ? radius : -radius).transform(strokeMatrix);\n\n if (cap === 'square') {\n if (isArea) {\n addPoint(point.subtract(normal));\n addPoint(point.add(normal));\n }\n\n point = point.add(normal.rotate(-90));\n }\n\n addPoint(point.add(normal));\n addPoint(point.subtract(normal));\n },\n getHandleBounds: function getHandleBounds(segments, closed, path, matrix, options) {\n var style = path.getStyle(),\n stroke = options.stroke && style.hasStroke(),\n strokePadding,\n joinPadding;\n\n if (stroke) {\n var strokeMatrix = path._getStrokeMatrix(matrix, options),\n strokeRadius = style.getStrokeWidth() / 2,\n joinRadius = strokeRadius;\n\n if (style.getStrokeJoin() === 'miter') joinRadius = strokeRadius * style.getMiterLimit();\n if (style.getStrokeCap() === 'square') joinRadius = Math.max(joinRadius, strokeRadius * Math.SQRT2);\n strokePadding = Path._getStrokePadding(strokeRadius, strokeMatrix);\n joinPadding = Path._getStrokePadding(joinRadius, strokeMatrix);\n }\n\n var coords = new Array(6),\n x1 = Infinity,\n x2 = -x1,\n y1 = x1,\n y2 = x2;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i];\n\n segment._transformCoordinates(matrix, coords);\n\n for (var j = 0; j < 6; j += 2) {\n var padding = !j ? joinPadding : strokePadding,\n paddingX = padding ? padding[0] : 0,\n paddingY = padding ? padding[1] : 0,\n x = coords[j],\n y = coords[j + 1],\n xn = x - paddingX,\n xx = x + paddingX,\n yn = y - paddingY,\n yx = y + paddingY;\n if (xn < x1) x1 = xn;\n if (xx > x2) x2 = xx;\n if (yn < y1) y1 = yn;\n if (yx > y2) y2 = yx;\n }\n }\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n }\n }\n });\n Path.inject({\n statics: new function () {\n var kappa = 0.5522847498307936,\n ellipseSegments = [new Segment([-1, 0], [0, kappa], [0, -kappa]), new Segment([0, -1], [-kappa, 0], [kappa, 0]), new Segment([1, 0], [0, -kappa], [0, kappa]), new Segment([0, 1], [kappa, 0], [-kappa, 0])];\n\n function createPath(segments, closed, args) {\n var props = Base.getNamed(args),\n path = new Path(props && props.insert == false && Item.NO_INSERT);\n\n path._add(segments);\n\n path._closed = closed;\n return path.set(props, {\n insert: true\n });\n }\n\n function createEllipse(center, radius, args) {\n var segments = new Array(4);\n\n for (var i = 0; i < 4; i++) {\n var segment = ellipseSegments[i];\n segments[i] = new Segment(segment._point.multiply(radius).add(center), segment._handleIn.multiply(radius), segment._handleOut.multiply(radius));\n }\n\n return createPath(segments, true, args);\n }\n\n return {\n Line: function Line() {\n var args = arguments;\n return createPath([new Segment(Point.readNamed(args, 'from')), new Segment(Point.readNamed(args, 'to'))], false, args);\n },\n Circle: function Circle() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n radius = Base.readNamed(args, 'radius');\n return createEllipse(center, new Size(radius), args);\n },\n Rectangle: function Rectangle() {\n var args = arguments,\n rect = _Rectangle.readNamed(args, 'rectangle'),\n radius = Size.readNamed(args, 'radius', 0, {\n readNull: true\n }),\n bl = rect.getBottomLeft(true),\n tl = rect.getTopLeft(true),\n tr = rect.getTopRight(true),\n br = rect.getBottomRight(true),\n segments;\n\n if (!radius || radius.isZero()) {\n segments = [new Segment(bl), new Segment(tl), new Segment(tr), new Segment(br)];\n } else {\n radius = Size.min(radius, rect.getSize(true).divide(2));\n var rx = radius.width,\n ry = radius.height,\n hx = rx * kappa,\n hy = ry * kappa;\n segments = [new Segment(bl.add(rx, 0), null, [-hx, 0]), new Segment(bl.subtract(0, ry), [0, hy]), new Segment(tl.add(0, ry), null, [0, -hy]), new Segment(tl.add(rx, 0), [-hx, 0], null), new Segment(tr.subtract(rx, 0), null, [hx, 0]), new Segment(tr.add(0, ry), [0, -hy], null), new Segment(br.subtract(0, ry), null, [0, hy]), new Segment(br.subtract(rx, 0), [hx, 0])];\n }\n\n return createPath(segments, true, args);\n },\n RoundRectangle: '#Rectangle',\n Ellipse: function Ellipse() {\n var args = arguments,\n ellipse = Shape._readEllipse(args);\n\n return createEllipse(ellipse.center, ellipse.radius, args);\n },\n Oval: '#Ellipse',\n Arc: function Arc() {\n var args = arguments,\n from = Point.readNamed(args, 'from'),\n through = Point.readNamed(args, 'through'),\n to = Point.readNamed(args, 'to'),\n props = Base.getNamed(args),\n path = new Path(props && props.insert == false && Item.NO_INSERT);\n path.moveTo(from);\n path.arcTo(through, to);\n return path.set(props);\n },\n RegularPolygon: function RegularPolygon() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n sides = Base.readNamed(args, 'sides'),\n radius = Base.readNamed(args, 'radius'),\n step = 360 / sides,\n three = sides % 3 === 0,\n vector = new Point(0, three ? -radius : radius),\n offset = three ? -1 : 0.5,\n segments = new Array(sides);\n\n for (var i = 0; i < sides; i++) {\n segments[i] = new Segment(center.add(vector.rotate((i + offset) * step)));\n }\n\n return createPath(segments, true, args);\n },\n Star: function Star() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n points = Base.readNamed(args, 'points') * 2,\n radius1 = Base.readNamed(args, 'radius1'),\n radius2 = Base.readNamed(args, 'radius2'),\n step = 360 / points,\n vector = new Point(0, -1),\n segments = new Array(points);\n\n for (var i = 0; i < points; i++) {\n segments[i] = new Segment(center.add(vector.rotate(step * i).multiply(i % 2 ? radius2 : radius1)));\n }\n\n return createPath(segments, true, args);\n }\n };\n }()\n });\n var CompoundPath = PathItem.extend({\n _class: 'CompoundPath',\n _serializeFields: {\n children: []\n },\n beans: true,\n initialize: function CompoundPath(arg) {\n this._children = [];\n this._namedChildren = {};\n\n if (!this._initialize(arg)) {\n if (typeof arg === 'string') {\n this.setPathData(arg);\n } else {\n this.addChildren(Array.isArray(arg) ? arg : arguments);\n }\n }\n },\n insertChildren: function insertChildren(index, items) {\n var list = items,\n first = list[0];\n if (first && typeof first[0] === 'number') list = [list];\n\n for (var i = items.length - 1; i >= 0; i--) {\n var item = list[i];\n if (list === items && !(item instanceof Path)) list = Base.slice(list);\n\n if (Array.isArray(item)) {\n list[i] = new Path({\n segments: item,\n insert: false\n });\n } else if (item instanceof CompoundPath) {\n list.splice.apply(list, [i, 1].concat(item.removeChildren()));\n item.remove();\n }\n }\n\n return insertChildren.base.call(this, index, list);\n },\n reduce: function reduce(options) {\n var children = this._children;\n\n for (var i = children.length - 1; i >= 0; i--) {\n var path = children[i].reduce(options);\n if (path.isEmpty()) path.remove();\n }\n\n if (!children.length) {\n var path = new Path(Item.NO_INSERT);\n path.copyAttributes(this);\n path.insertAbove(this);\n this.remove();\n return path;\n }\n\n return reduce.base.call(this);\n },\n isClosed: function isClosed() {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (!children[i]._closed) return false;\n }\n\n return true;\n },\n setClosed: function setClosed(closed) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setClosed(closed);\n }\n },\n getFirstSegment: function getFirstSegment() {\n var first = this.getFirstChild();\n return first && first.getFirstSegment();\n },\n getLastSegment: function getLastSegment() {\n var last = this.getLastChild();\n return last && last.getLastSegment();\n },\n getCurves: function getCurves() {\n var children = this._children,\n curves = [];\n\n for (var i = 0, l = children.length; i < l; i++) {\n Base.push(curves, children[i].getCurves());\n }\n\n return curves;\n },\n getFirstCurve: function getFirstCurve() {\n var first = this.getFirstChild();\n return first && first.getFirstCurve();\n },\n getLastCurve: function getLastCurve() {\n var last = this.getLastChild();\n return last && last.getLastCurve();\n },\n getArea: function getArea() {\n var children = this._children,\n area = 0;\n\n for (var i = 0, l = children.length; i < l; i++) {\n area += children[i].getArea();\n }\n\n return area;\n },\n getLength: function getLength() {\n var children = this._children,\n length = 0;\n\n for (var i = 0, l = children.length; i < l; i++) {\n length += children[i].getLength();\n }\n\n return length;\n },\n getPathData: function getPathData(_matrix, _precision) {\n var children = this._children,\n paths = [];\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i],\n mx = child._matrix;\n paths.push(child.getPathData(_matrix && !mx.isIdentity() ? _matrix.appended(mx) : _matrix, _precision));\n }\n\n return paths.join('');\n },\n _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n return _hitTestChildren.base.call(this, point, options.class === Path || options.type === 'path' ? options : Base.set({}, options, {\n fill: false\n }), viewMatrix);\n },\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var children = this._children;\n if (!children.length) return;\n param = param.extend({\n dontStart: true,\n dontFinish: true\n });\n ctx.beginPath();\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].draw(ctx, param, strokeMatrix);\n }\n\n if (!param.clip) {\n this._setStyles(ctx, param, viewMatrix);\n\n var style = this._style;\n\n if (style.hasFill()) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (style.hasStroke()) ctx.stroke();\n }\n },\n _drawSelected: function _drawSelected(ctx, matrix, selectionItems) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i],\n mx = child._matrix;\n\n if (!selectionItems[child._id]) {\n child._drawSelected(ctx, mx.isIdentity() ? matrix : matrix.appended(mx));\n }\n }\n }\n }, new function () {\n function getCurrentPath(that, check) {\n var children = that._children;\n if (check && !children.length) throw new Error('Use a moveTo() command first');\n return children[children.length - 1];\n }\n\n return Base.each(['lineTo', 'cubicCurveTo', 'quadraticCurveTo', 'curveTo', 'arcTo', 'lineBy', 'cubicCurveBy', 'quadraticCurveBy', 'curveBy', 'arcBy'], function (key) {\n this[key] = function () {\n var path = getCurrentPath(this, true);\n path[key].apply(path, arguments);\n };\n }, {\n moveTo: function moveTo() {\n var current = getCurrentPath(this),\n path = current && current.isEmpty() ? current : new Path(Item.NO_INSERT);\n if (path !== current) this.addChild(path);\n path.moveTo.apply(path, arguments);\n },\n moveBy: function moveBy() {\n var current = getCurrentPath(this, true),\n last = current && current.getLastSegment(),\n point = Point.read(arguments);\n this.moveTo(last ? point.add(last._point) : point);\n },\n closePath: function closePath(tolerance) {\n getCurrentPath(this, true).closePath(tolerance);\n }\n });\n }(), Base.each(['reverse', 'flatten', 'simplify', 'smooth'], function (key) {\n this[key] = function (param) {\n var children = this._children,\n res;\n\n for (var i = 0, l = children.length; i < l; i++) {\n res = children[i][key](param) || res;\n }\n\n return res;\n };\n }, {}));\n PathItem.inject(new function () {\n var min = Math.min,\n max = Math.max,\n abs = Math.abs,\n operators = {\n unite: {\n '1': true,\n '2': true\n },\n intersect: {\n '2': true\n },\n subtract: {\n '1': true\n },\n exclude: {\n '1': true,\n '-1': true\n }\n };\n\n function getPaths(path) {\n return path._children || [path];\n }\n\n function preparePath(path, resolve) {\n var res = path.clone(false).reduce({\n simplify: true\n }).transform(null, true, true);\n\n if (resolve) {\n var paths = getPaths(res);\n\n for (var i = 0, l = paths.length; i < l; i++) {\n var path = paths[i];\n\n if (!path._closed && !path.isEmpty()) {\n path.closePath(1e-12);\n path.getFirstSegment().setHandleIn(0, 0);\n path.getLastSegment().setHandleOut(0, 0);\n }\n }\n\n res = res.resolveCrossings().reorient(res.getFillRule() === 'nonzero', true);\n }\n\n return res;\n }\n\n function createResult(paths, simplify, path1, path2, options) {\n var result = new CompoundPath(Item.NO_INSERT);\n result.addChildren(paths, true);\n result = result.reduce({\n simplify: simplify\n });\n\n if (!(options && options.insert == false)) {\n result.insertAbove(path2 && path1.isSibling(path2) && path1.getIndex() < path2.getIndex() ? path2 : path1);\n }\n\n result.copyAttributes(path1, true);\n return result;\n }\n\n function filterIntersection(inter) {\n return inter.hasOverlap() || inter.isCrossing();\n }\n\n function traceBoolean(path1, path2, operation, options) {\n if (options && (options.trace == false || options.stroke) && /^(subtract|intersect)$/.test(operation)) return splitBoolean(path1, path2, operation);\n\n var _path1 = preparePath(path1, true),\n _path2 = path2 && path1 !== path2 && preparePath(path2, true),\n operator = operators[operation];\n\n operator[operation] = true;\n if (_path2 && (operator.subtract || operator.exclude) ^ (_path2.isClockwise() ^ _path1.isClockwise())) _path2.reverse();\n\n var crossings = divideLocations(CurveLocation.expand(_path1.getIntersections(_path2, filterIntersection))),\n paths1 = getPaths(_path1),\n paths2 = _path2 && getPaths(_path2),\n segments = [],\n curves = [],\n paths;\n\n function collectPaths(paths) {\n for (var i = 0, l = paths.length; i < l; i++) {\n var path = paths[i];\n Base.push(segments, path._segments);\n Base.push(curves, path.getCurves());\n path._overlapsOnly = true;\n }\n }\n\n function getCurves(indices) {\n var list = [];\n\n for (var i = 0, l = indices && indices.length; i < l; i++) {\n list.push(curves[indices[i]]);\n }\n\n return list;\n }\n\n if (crossings.length) {\n collectPaths(paths1);\n if (paths2) collectPaths(paths2);\n var curvesValues = new Array(curves.length);\n\n for (var i = 0, l = curves.length; i < l; i++) {\n curvesValues[i] = curves[i].getValues();\n }\n\n var curveCollisions = CollisionDetection.findCurveBoundsCollisions(curvesValues, curvesValues, 0, true);\n var curveCollisionsMap = {};\n\n for (var i = 0; i < curves.length; i++) {\n var curve = curves[i],\n id = curve._path._id,\n map = curveCollisionsMap[id] = curveCollisionsMap[id] || {};\n map[curve.getIndex()] = {\n hor: getCurves(curveCollisions[i].hor),\n ver: getCurves(curveCollisions[i].ver)\n };\n }\n\n for (var i = 0, l = crossings.length; i < l; i++) {\n propagateWinding(crossings[i]._segment, _path1, _path2, curveCollisionsMap, operator);\n }\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i],\n inter = segment._intersection;\n\n if (!segment._winding) {\n propagateWinding(segment, _path1, _path2, curveCollisionsMap, operator);\n }\n\n if (!(inter && inter._overlap)) segment._path._overlapsOnly = false;\n }\n\n paths = tracePaths(segments, operator);\n } else {\n paths = reorientPaths(paths2 ? paths1.concat(paths2) : paths1.slice(), function (w) {\n return !!operator[w];\n });\n }\n\n return createResult(paths, true, path1, path2, options);\n }\n\n function splitBoolean(path1, path2, operation) {\n var _path1 = preparePath(path1),\n _path2 = preparePath(path2),\n crossings = _path1.getIntersections(_path2, filterIntersection),\n subtract = operation === 'subtract',\n divide = operation === 'divide',\n added = {},\n paths = [];\n\n function addPath(path) {\n if (!added[path._id] && (divide || _path2.contains(path.getPointAt(path.getLength() / 2)) ^ subtract)) {\n paths.unshift(path);\n return added[path._id] = true;\n }\n }\n\n for (var i = crossings.length - 1; i >= 0; i--) {\n var path = crossings[i].split();\n\n if (path) {\n if (addPath(path)) path.getFirstSegment().setHandleIn(0, 0);\n\n _path1.getLastSegment().setHandleOut(0, 0);\n }\n }\n\n addPath(_path1);\n return createResult(paths, false, path1, path2);\n }\n\n function linkIntersections(from, to) {\n var prev = from;\n\n while (prev) {\n if (prev === to) return;\n prev = prev._previous;\n }\n\n while (from._next && from._next !== to) {\n from = from._next;\n }\n\n if (!from._next) {\n while (to._previous) {\n to = to._previous;\n }\n\n from._next = to;\n to._previous = from;\n }\n }\n\n function clearCurveHandles(curves) {\n for (var i = curves.length - 1; i >= 0; i--) {\n curves[i].clearHandles();\n }\n }\n\n function reorientPaths(paths, isInside, clockwise) {\n var length = paths && paths.length;\n\n if (length) {\n var lookup = Base.each(paths, function (path, i) {\n this[path._id] = {\n container: null,\n winding: path.isClockwise() ? 1 : -1,\n index: i\n };\n }, {}),\n sorted = paths.slice().sort(function (a, b) {\n return abs(b.getArea()) - abs(a.getArea());\n }),\n first = sorted[0];\n var collisions = CollisionDetection.findItemBoundsCollisions(sorted, null, Numerical.GEOMETRIC_EPSILON);\n if (clockwise == null) clockwise = first.isClockwise();\n\n for (var i = 0; i < length; i++) {\n var path1 = sorted[i],\n entry1 = lookup[path1._id],\n containerWinding = 0,\n indices = collisions[i];\n\n if (indices) {\n var point = null;\n\n for (var j = indices.length - 1; j >= 0; j--) {\n if (indices[j] < i) {\n point = point || path1.getInteriorPoint();\n var path2 = sorted[indices[j]];\n\n if (path2.contains(point)) {\n var entry2 = lookup[path2._id];\n containerWinding = entry2.winding;\n entry1.winding += containerWinding;\n entry1.container = entry2.exclude ? entry2.container : path2;\n break;\n }\n }\n }\n }\n\n if (isInside(entry1.winding) === isInside(containerWinding)) {\n entry1.exclude = true;\n paths[entry1.index] = null;\n } else {\n var container = entry1.container;\n path1.setClockwise(container ? !container.isClockwise() : clockwise);\n }\n }\n }\n\n return paths;\n }\n\n function divideLocations(locations, include, clearLater) {\n var results = include && [],\n tMin = 1e-8,\n tMax = 1 - tMin,\n clearHandles = false,\n clearCurves = clearLater || [],\n clearLookup = clearLater && {},\n renormalizeLocs,\n prevCurve,\n prevTime;\n\n function getId(curve) {\n return curve._path._id + '.' + curve._segment1._index;\n }\n\n for (var i = (clearLater && clearLater.length) - 1; i >= 0; i--) {\n var curve = clearLater[i];\n if (curve._path) clearLookup[getId(curve)] = true;\n }\n\n for (var i = locations.length - 1; i >= 0; i--) {\n var loc = locations[i],\n time = loc._time,\n origTime = time,\n exclude = include && !include(loc),\n curve = loc._curve,\n segment;\n\n if (curve) {\n if (curve !== prevCurve) {\n clearHandles = !curve.hasHandles() || clearLookup && clearLookup[getId(curve)];\n renormalizeLocs = [];\n prevTime = null;\n prevCurve = curve;\n } else if (prevTime >= tMin) {\n time /= prevTime;\n }\n }\n\n if (exclude) {\n if (renormalizeLocs) renormalizeLocs.push(loc);\n continue;\n } else if (include) {\n results.unshift(loc);\n }\n\n prevTime = origTime;\n\n if (time < tMin) {\n segment = curve._segment1;\n } else if (time > tMax) {\n segment = curve._segment2;\n } else {\n var newCurve = curve.divideAtTime(time, true);\n if (clearHandles) clearCurves.push(curve, newCurve);\n segment = newCurve._segment1;\n\n for (var j = renormalizeLocs.length - 1; j >= 0; j--) {\n var l = renormalizeLocs[j];\n l._time = (l._time - time) / (1 - time);\n }\n }\n\n loc._setSegment(segment);\n\n var inter = segment._intersection,\n dest = loc._intersection;\n\n if (inter) {\n linkIntersections(inter, dest);\n var other = inter;\n\n while (other) {\n linkIntersections(other._intersection, inter);\n other = other._next;\n }\n } else {\n segment._intersection = dest;\n }\n }\n\n if (!clearLater) clearCurveHandles(clearCurves);\n return results || locations;\n }\n\n function getWinding(point, curves, dir, closed, dontFlip) {\n var curvesList = Array.isArray(curves) ? curves : curves[dir ? 'hor' : 'ver'];\n var ia = dir ? 1 : 0,\n io = ia ^ 1,\n pv = [point.x, point.y],\n pa = pv[ia],\n po = pv[io],\n windingEpsilon = 1e-9,\n qualityEpsilon = 1e-6,\n paL = pa - windingEpsilon,\n paR = pa + windingEpsilon,\n windingL = 0,\n windingR = 0,\n pathWindingL = 0,\n pathWindingR = 0,\n onPath = false,\n onAnyPath = false,\n quality = 1,\n roots = [],\n vPrev,\n vClose;\n\n function addWinding(v) {\n var o0 = v[io + 0],\n o3 = v[io + 6];\n\n if (po < min(o0, o3) || po > max(o0, o3)) {\n return;\n }\n\n var a0 = v[ia + 0],\n a1 = v[ia + 2],\n a2 = v[ia + 4],\n a3 = v[ia + 6];\n\n if (o0 === o3) {\n if (a0 < paR && a3 > paL || a3 < paR && a0 > paL) {\n onPath = true;\n }\n\n return;\n }\n\n var t = po === o0 ? 0 : po === o3 ? 1 : paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3) ? 1 : Curve.solveCubic(v, io, po, roots, 0, 1) > 0 ? roots[0] : 1,\n a = t === 0 ? a0 : t === 1 ? a3 : Curve.getPoint(v, t)[dir ? 'y' : 'x'],\n winding = o0 > o3 ? 1 : -1,\n windingPrev = vPrev[io] > vPrev[io + 6] ? 1 : -1,\n a3Prev = vPrev[ia + 6];\n\n if (po !== o0) {\n if (a < paL) {\n pathWindingL += winding;\n } else if (a > paR) {\n pathWindingR += winding;\n } else {\n onPath = true;\n }\n\n if (a > pa - qualityEpsilon && a < pa + qualityEpsilon) quality /= 2;\n } else {\n if (winding !== windingPrev) {\n if (a0 < paL) {\n pathWindingL += winding;\n } else if (a0 > paR) {\n pathWindingR += winding;\n }\n } else if (a0 != a3Prev) {\n if (a3Prev < paR && a > paR) {\n pathWindingR += winding;\n onPath = true;\n } else if (a3Prev > paL && a < paL) {\n pathWindingL += winding;\n onPath = true;\n }\n }\n\n quality /= 4;\n }\n\n vPrev = v;\n return !dontFlip && a > paL && a < paR && Curve.getTangent(v, t)[dir ? 'x' : 'y'] === 0 && getWinding(point, curves, !dir, closed, true);\n }\n\n function handleCurve(v) {\n var o0 = v[io + 0],\n o1 = v[io + 2],\n o2 = v[io + 4],\n o3 = v[io + 6];\n\n if (po <= max(o0, o1, o2, o3) && po >= min(o0, o1, o2, o3)) {\n var a0 = v[ia + 0],\n a1 = v[ia + 2],\n a2 = v[ia + 4],\n a3 = v[ia + 6],\n monoCurves = paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3) ? [v] : Curve.getMonoCurves(v, dir),\n res;\n\n for (var i = 0, l = monoCurves.length; i < l; i++) {\n if (res = addWinding(monoCurves[i])) return res;\n }\n }\n }\n\n for (var i = 0, l = curvesList.length; i < l; i++) {\n var curve = curvesList[i],\n path = curve._path,\n v = curve.getValues(),\n res;\n\n if (!i || curvesList[i - 1]._path !== path) {\n vPrev = null;\n\n if (!path._closed) {\n vClose = Curve.getValues(path.getLastCurve().getSegment2(), curve.getSegment1(), null, !closed);\n\n if (vClose[io] !== vClose[io + 6]) {\n vPrev = vClose;\n }\n }\n\n if (!vPrev) {\n vPrev = v;\n var prev = path.getLastCurve();\n\n while (prev && prev !== curve) {\n var v2 = prev.getValues();\n\n if (v2[io] !== v2[io + 6]) {\n vPrev = v2;\n break;\n }\n\n prev = prev.getPrevious();\n }\n }\n }\n\n if (res = handleCurve(v)) return res;\n\n if (i + 1 === l || curvesList[i + 1]._path !== path) {\n if (vClose && (res = handleCurve(vClose))) return res;\n\n if (onPath && !pathWindingL && !pathWindingR) {\n pathWindingL = pathWindingR = path.isClockwise(closed) ^ dir ? 1 : -1;\n }\n\n windingL += pathWindingL;\n windingR += pathWindingR;\n pathWindingL = pathWindingR = 0;\n\n if (onPath) {\n onAnyPath = true;\n onPath = false;\n }\n\n vClose = null;\n }\n }\n\n windingL = abs(windingL);\n windingR = abs(windingR);\n return {\n winding: max(windingL, windingR),\n windingL: windingL,\n windingR: windingR,\n quality: quality,\n onPath: onAnyPath\n };\n }\n\n function propagateWinding(segment, path1, path2, curveCollisionsMap, operator) {\n var chain = [],\n start = segment,\n totalLength = 0,\n winding;\n\n do {\n var curve = segment.getCurve();\n\n if (curve) {\n var length = curve.getLength();\n chain.push({\n segment: segment,\n curve: curve,\n length: length\n });\n totalLength += length;\n }\n\n segment = segment.getNext();\n } while (segment && !segment._intersection && segment !== start);\n\n var offsets = [0.5, 0.25, 0.75],\n winding = {\n winding: 0,\n quality: -1\n },\n tMin = 1e-3,\n tMax = 1 - tMin;\n\n for (var i = 0; i < offsets.length && winding.quality < 0.5; i++) {\n var length = totalLength * offsets[i];\n\n for (var j = 0, l = chain.length; j < l; j++) {\n var entry = chain[j],\n curveLength = entry.length;\n\n if (length <= curveLength) {\n var curve = entry.curve,\n path = curve._path,\n parent = path._parent,\n operand = parent instanceof CompoundPath ? parent : path,\n t = Numerical.clamp(curve.getTimeAt(length), tMin, tMax),\n pt = curve.getPointAtTime(t),\n dir = abs(curve.getTangentAtTime(t).y) < Math.SQRT1_2;\n var wind = null;\n\n if (operator.subtract && path2) {\n var otherPath = operand === path1 ? path2 : path1,\n pathWinding = otherPath._getWinding(pt, dir, true);\n\n if (operand === path1 && pathWinding.winding || operand === path2 && !pathWinding.winding) {\n if (pathWinding.quality < 1) {\n continue;\n } else {\n wind = {\n winding: 0,\n quality: 1\n };\n }\n }\n }\n\n wind = wind || getWinding(pt, curveCollisionsMap[path._id][curve.getIndex()], dir, true);\n if (wind.quality > winding.quality) winding = wind;\n break;\n }\n\n length -= curveLength;\n }\n }\n\n for (var j = chain.length - 1; j >= 0; j--) {\n chain[j].segment._winding = winding;\n }\n }\n\n function tracePaths(segments, operator) {\n var paths = [],\n starts;\n\n function isValid(seg) {\n var winding;\n return !!(seg && !seg._visited && (!operator || operator[(winding = seg._winding || {}).winding] && !(operator.unite && winding.winding === 2 && winding.windingL && winding.windingR)));\n }\n\n function isStart(seg) {\n if (seg) {\n for (var i = 0, l = starts.length; i < l; i++) {\n if (seg === starts[i]) return true;\n }\n }\n\n return false;\n }\n\n function visitPath(path) {\n var segments = path._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i]._visited = true;\n }\n }\n\n function getCrossingSegments(segment, collectStarts) {\n var inter = segment._intersection,\n start = inter,\n crossings = [];\n if (collectStarts) starts = [segment];\n\n function collect(inter, end) {\n while (inter && inter !== end) {\n var other = inter._segment,\n path = other && other._path;\n\n if (path) {\n var next = other.getNext() || path.getFirstSegment(),\n nextInter = next._intersection;\n\n if (other !== segment && (isStart(other) || isStart(next) || next && isValid(other) && (isValid(next) || nextInter && isValid(nextInter._segment)))) {\n crossings.push(other);\n }\n\n if (collectStarts) starts.push(other);\n }\n\n inter = inter._next;\n }\n }\n\n if (inter) {\n collect(inter);\n\n while (inter && inter._previous) {\n inter = inter._previous;\n }\n\n collect(inter, start);\n }\n\n return crossings;\n }\n\n segments.sort(function (seg1, seg2) {\n var inter1 = seg1._intersection,\n inter2 = seg2._intersection,\n over1 = !!(inter1 && inter1._overlap),\n over2 = !!(inter2 && inter2._overlap),\n path1 = seg1._path,\n path2 = seg2._path;\n return over1 ^ over2 ? over1 ? 1 : -1 : !inter1 ^ !inter2 ? inter1 ? 1 : -1 : path1 !== path2 ? path1._id - path2._id : seg1._index - seg2._index;\n });\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var seg = segments[i],\n valid = isValid(seg),\n path = null,\n finished = false,\n closed = true,\n branches = [],\n branch,\n visited,\n handleIn;\n\n if (valid && seg._path._overlapsOnly) {\n var path1 = seg._path,\n path2 = seg._intersection._segment._path;\n\n if (path1.compare(path2)) {\n if (path1.getArea()) paths.push(path1.clone(false));\n visitPath(path1);\n visitPath(path2);\n valid = false;\n }\n }\n\n while (valid) {\n var first = !path,\n crossings = getCrossingSegments(seg, first),\n other = crossings.shift(),\n finished = !first && (isStart(seg) || isStart(other)),\n cross = !finished && other;\n\n if (first) {\n path = new Path(Item.NO_INSERT);\n branch = null;\n }\n\n if (finished) {\n if (seg.isFirst() || seg.isLast()) closed = seg._path._closed;\n seg._visited = true;\n break;\n }\n\n if (cross && branch) {\n branches.push(branch);\n branch = null;\n }\n\n if (!branch) {\n if (cross) crossings.push(seg);\n branch = {\n start: path._segments.length,\n crossings: crossings,\n visited: visited = [],\n handleIn: handleIn\n };\n }\n\n if (cross) seg = other;\n\n if (!isValid(seg)) {\n path.removeSegments(branch.start);\n\n for (var j = 0, k = visited.length; j < k; j++) {\n visited[j]._visited = false;\n }\n\n visited.length = 0;\n\n do {\n seg = branch && branch.crossings.shift();\n\n if (!seg || !seg._path) {\n seg = null;\n branch = branches.pop();\n\n if (branch) {\n visited = branch.visited;\n handleIn = branch.handleIn;\n }\n }\n } while (branch && !isValid(seg));\n\n if (!seg) break;\n }\n\n var next = seg.getNext();\n path.add(new Segment(seg._point, handleIn, next && seg._handleOut));\n seg._visited = true;\n visited.push(seg);\n seg = next || seg._path.getFirstSegment();\n handleIn = next && next._handleIn;\n }\n\n if (finished) {\n if (closed) {\n path.getFirstSegment().setHandleIn(handleIn);\n path.setClosed(closed);\n }\n\n if (path.getArea() !== 0) {\n paths.push(path);\n }\n }\n }\n\n return paths;\n }\n\n return {\n _getWinding: function _getWinding(point, dir, closed) {\n return getWinding(point, this.getCurves(), dir, closed);\n },\n unite: function unite(path, options) {\n return traceBoolean(this, path, 'unite', options);\n },\n intersect: function intersect(path, options) {\n return traceBoolean(this, path, 'intersect', options);\n },\n subtract: function subtract(path, options) {\n return traceBoolean(this, path, 'subtract', options);\n },\n exclude: function exclude(path, options) {\n return traceBoolean(this, path, 'exclude', options);\n },\n divide: function divide(path, options) {\n return options && (options.trace == false || options.stroke) ? splitBoolean(this, path, 'divide') : createResult([this.subtract(path, options), this.intersect(path, options)], true, this, path, options);\n },\n resolveCrossings: function resolveCrossings() {\n var children = this._children,\n paths = children || [this];\n\n function hasOverlap(seg, path) {\n var inter = seg && seg._intersection;\n return inter && inter._overlap && inter._path === path;\n }\n\n var hasOverlaps = false,\n hasCrossings = false,\n intersections = this.getIntersections(null, function (inter) {\n return inter.hasOverlap() && (hasOverlaps = true) || inter.isCrossing() && (hasCrossings = true);\n }),\n clearCurves = hasOverlaps && hasCrossings && [];\n intersections = CurveLocation.expand(intersections);\n\n if (hasOverlaps) {\n var overlaps = divideLocations(intersections, function (inter) {\n return inter.hasOverlap();\n }, clearCurves);\n\n for (var i = overlaps.length - 1; i >= 0; i--) {\n var overlap = overlaps[i],\n path = overlap._path,\n seg = overlap._segment,\n prev = seg.getPrevious(),\n next = seg.getNext();\n\n if (hasOverlap(prev, path) && hasOverlap(next, path)) {\n seg.remove();\n\n prev._handleOut._set(0, 0);\n\n next._handleIn._set(0, 0);\n\n if (prev !== seg && !prev.getCurve().hasLength()) {\n next._handleIn.set(prev._handleIn);\n\n prev.remove();\n }\n }\n }\n }\n\n if (hasCrossings) {\n divideLocations(intersections, hasOverlaps && function (inter) {\n var curve1 = inter.getCurve(),\n seg1 = inter.getSegment(),\n other = inter._intersection,\n curve2 = other._curve,\n seg2 = other._segment;\n if (curve1 && curve2 && curve1._path && curve2._path) return true;\n if (seg1) seg1._intersection = null;\n if (seg2) seg2._intersection = null;\n }, clearCurves);\n if (clearCurves) clearCurveHandles(clearCurves);\n paths = tracePaths(Base.each(paths, function (path) {\n Base.push(this, path._segments);\n }, []));\n }\n\n var length = paths.length,\n item;\n\n if (length > 1 && children) {\n if (paths !== children) this.setChildren(paths);\n item = this;\n } else if (length === 1 && !children) {\n if (paths[0] !== this) this.setSegments(paths[0].removeSegments());\n item = this;\n }\n\n if (!item) {\n item = new CompoundPath(Item.NO_INSERT);\n item.addChildren(paths);\n item = item.reduce();\n item.copyAttributes(this);\n this.replaceWith(item);\n }\n\n return item;\n },\n reorient: function reorient(nonZero, clockwise) {\n var children = this._children;\n\n if (children && children.length) {\n this.setChildren(reorientPaths(this.removeChildren(), function (w) {\n return !!(nonZero ? w : w & 1);\n }, clockwise));\n } else if (clockwise !== undefined) {\n this.setClockwise(clockwise);\n }\n\n return this;\n },\n getInteriorPoint: function getInteriorPoint() {\n var bounds = this.getBounds(),\n point = bounds.getCenter(true);\n\n if (!this.contains(point)) {\n var curves = this.getCurves(),\n y = point.y,\n intercepts = [],\n roots = [];\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var v = curves[i].getValues(),\n o0 = v[1],\n o1 = v[3],\n o2 = v[5],\n o3 = v[7];\n\n if (y >= min(o0, o1, o2, o3) && y <= max(o0, o1, o2, o3)) {\n var monoCurves = Curve.getMonoCurves(v);\n\n for (var j = 0, m = monoCurves.length; j < m; j++) {\n var mv = monoCurves[j],\n mo0 = mv[1],\n mo3 = mv[7];\n\n if (mo0 !== mo3 && (y >= mo0 && y <= mo3 || y >= mo3 && y <= mo0)) {\n var x = y === mo0 ? mv[0] : y === mo3 ? mv[6] : Curve.solveCubic(mv, 1, y, roots, 0, 1) === 1 ? Curve.getPoint(mv, roots[0]).x : (mv[0] + mv[6]) / 2;\n intercepts.push(x);\n }\n }\n }\n }\n\n if (intercepts.length > 1) {\n intercepts.sort(function (a, b) {\n return a - b;\n });\n point.x = (intercepts[0] + intercepts[1]) / 2;\n }\n }\n\n return point;\n }\n };\n }());\n var PathFlattener = Base.extend({\n _class: 'PathFlattener',\n initialize: function initialize(path, flatness, maxRecursion, ignoreStraight, matrix) {\n var curves = [],\n parts = [],\n length = 0,\n minSpan = 1 / (maxRecursion || 32),\n segments = path._segments,\n segment1 = segments[0],\n segment2;\n\n function addCurve(segment1, segment2) {\n var curve = Curve.getValues(segment1, segment2, matrix);\n curves.push(curve);\n computeParts(curve, segment1._index, 0, 1);\n }\n\n function computeParts(curve, index, t1, t2) {\n if (t2 - t1 > minSpan && !(ignoreStraight && Curve.isStraight(curve)) && !Curve.isFlatEnough(curve, flatness || 0.25)) {\n var halves = Curve.subdivide(curve, 0.5),\n tMid = (t1 + t2) / 2;\n computeParts(halves[0], index, t1, tMid);\n computeParts(halves[1], index, tMid, t2);\n } else {\n var dx = curve[6] - curve[0],\n dy = curve[7] - curve[1],\n dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist > 0) {\n length += dist;\n parts.push({\n offset: length,\n curve: curve,\n index: index,\n time: t2\n });\n }\n }\n }\n\n for (var i = 1, l = segments.length; i < l; i++) {\n segment2 = segments[i];\n addCurve(segment1, segment2);\n segment1 = segment2;\n }\n\n if (path._closed) addCurve(segment2 || segment1, segments[0]);\n this.curves = curves;\n this.parts = parts;\n this.length = length;\n this.index = 0;\n },\n _get: function _get(offset) {\n var parts = this.parts,\n length = parts.length,\n start,\n i,\n j = this.index;\n\n for (;;) {\n i = j;\n if (!j || parts[--j].offset < offset) break;\n }\n\n for (; i < length; i++) {\n var part = parts[i];\n\n if (part.offset >= offset) {\n this.index = i;\n var prev = parts[i - 1],\n prevTime = prev && prev.index === part.index ? prev.time : 0,\n prevOffset = prev ? prev.offset : 0;\n return {\n index: part.index,\n time: prevTime + (part.time - prevTime) * (offset - prevOffset) / (part.offset - prevOffset)\n };\n }\n }\n\n return {\n index: parts[length - 1].index,\n time: 1\n };\n },\n drawPart: function drawPart(ctx, from, to) {\n var start = this._get(from),\n end = this._get(to);\n\n for (var i = start.index, l = end.index; i <= l; i++) {\n var curve = Curve.getPart(this.curves[i], i === start.index ? start.time : 0, i === end.index ? end.time : 1);\n if (i === start.index) ctx.moveTo(curve[0], curve[1]);\n ctx.bezierCurveTo.apply(ctx, curve.slice(2));\n }\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n this[name + 'At'] = function (offset) {\n var param = this._get(offset);\n\n return Curve[name](this.curves[param.index], param.time);\n };\n }, {}));\n var PathFitter = Base.extend({\n initialize: function initialize(path) {\n var points = this.points = [],\n segments = path._segments,\n closed = path._closed;\n\n for (var i = 0, prev, l = segments.length; i < l; i++) {\n var point = segments[i].point;\n\n if (!prev || !prev.equals(point)) {\n points.push(prev = point.clone());\n }\n }\n\n if (closed) {\n points.unshift(points[points.length - 1]);\n points.push(points[1]);\n }\n\n this.closed = closed;\n },\n fit: function fit(error) {\n var points = this.points,\n length = points.length,\n segments = null;\n\n if (length > 0) {\n segments = [new Segment(points[0])];\n\n if (length > 1) {\n this.fitCubic(segments, error, 0, length - 1, points[1].subtract(points[0]), points[length - 2].subtract(points[length - 1]));\n\n if (this.closed) {\n segments.shift();\n segments.pop();\n }\n }\n }\n\n return segments;\n },\n fitCubic: function fitCubic(segments, error, first, last, tan1, tan2) {\n var points = this.points;\n\n if (last - first === 1) {\n var pt1 = points[first],\n pt2 = points[last],\n dist = pt1.getDistance(pt2) / 3;\n this.addCurve(segments, [pt1, pt1.add(tan1.normalize(dist)), pt2.add(tan2.normalize(dist)), pt2]);\n return;\n }\n\n var uPrime = this.chordLengthParameterize(first, last),\n maxError = Math.max(error, error * error),\n split,\n parametersInOrder = true;\n\n for (var i = 0; i <= 4; i++) {\n var curve = this.generateBezier(first, last, uPrime, tan1, tan2);\n var max = this.findMaxError(first, last, curve, uPrime);\n\n if (max.error < error && parametersInOrder) {\n this.addCurve(segments, curve);\n return;\n }\n\n split = max.index;\n if (max.error >= maxError) break;\n parametersInOrder = this.reparameterize(first, last, uPrime, curve);\n maxError = max.error;\n }\n\n var tanCenter = points[split - 1].subtract(points[split + 1]);\n this.fitCubic(segments, error, first, split, tan1, tanCenter);\n this.fitCubic(segments, error, split, last, tanCenter.negate(), tan2);\n },\n addCurve: function addCurve(segments, curve) {\n var prev = segments[segments.length - 1];\n prev.setHandleOut(curve[1].subtract(curve[0]));\n segments.push(new Segment(curve[3], curve[2].subtract(curve[3])));\n },\n generateBezier: function generateBezier(first, last, uPrime, tan1, tan2) {\n var epsilon = 1e-12,\n abs = Math.abs,\n points = this.points,\n pt1 = points[first],\n pt2 = points[last],\n C = [[0, 0], [0, 0]],\n X = [0, 0];\n\n for (var i = 0, l = last - first + 1; i < l; i++) {\n var u = uPrime[i],\n t = 1 - u,\n b = 3 * u * t,\n b0 = t * t * t,\n b1 = b * t,\n b2 = b * u,\n b3 = u * u * u,\n a1 = tan1.normalize(b1),\n a2 = tan2.normalize(b2),\n tmp = points[first + i].subtract(pt1.multiply(b0 + b1)).subtract(pt2.multiply(b2 + b3));\n C[0][0] += a1.dot(a1);\n C[0][1] += a1.dot(a2);\n C[1][0] = C[0][1];\n C[1][1] += a2.dot(a2);\n X[0] += a1.dot(tmp);\n X[1] += a2.dot(tmp);\n }\n\n var detC0C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1],\n alpha1,\n alpha2;\n\n if (abs(detC0C1) > epsilon) {\n var detC0X = C[0][0] * X[1] - C[1][0] * X[0],\n detXC1 = X[0] * C[1][1] - X[1] * C[0][1];\n alpha1 = detXC1 / detC0C1;\n alpha2 = detC0X / detC0C1;\n } else {\n var c0 = C[0][0] + C[0][1],\n c1 = C[1][0] + C[1][1];\n alpha1 = alpha2 = abs(c0) > epsilon ? X[0] / c0 : abs(c1) > epsilon ? X[1] / c1 : 0;\n }\n\n var segLength = pt2.getDistance(pt1),\n eps = epsilon * segLength,\n handle1,\n handle2;\n\n if (alpha1 < eps || alpha2 < eps) {\n alpha1 = alpha2 = segLength / 3;\n } else {\n var line = pt2.subtract(pt1);\n handle1 = tan1.normalize(alpha1);\n handle2 = tan2.normalize(alpha2);\n\n if (handle1.dot(line) - handle2.dot(line) > segLength * segLength) {\n alpha1 = alpha2 = segLength / 3;\n handle1 = handle2 = null;\n }\n }\n\n return [pt1, pt1.add(handle1 || tan1.normalize(alpha1)), pt2.add(handle2 || tan2.normalize(alpha2)), pt2];\n },\n reparameterize: function reparameterize(first, last, u, curve) {\n for (var i = first; i <= last; i++) {\n u[i - first] = this.findRoot(curve, this.points[i], u[i - first]);\n }\n\n for (var i = 1, l = u.length; i < l; i++) {\n if (u[i] <= u[i - 1]) return false;\n }\n\n return true;\n },\n findRoot: function findRoot(curve, point, u) {\n var curve1 = [],\n curve2 = [];\n\n for (var i = 0; i <= 2; i++) {\n curve1[i] = curve[i + 1].subtract(curve[i]).multiply(3);\n }\n\n for (var i = 0; i <= 1; i++) {\n curve2[i] = curve1[i + 1].subtract(curve1[i]).multiply(2);\n }\n\n var pt = this.evaluate(3, curve, u),\n pt1 = this.evaluate(2, curve1, u),\n pt2 = this.evaluate(1, curve2, u),\n diff = pt.subtract(point),\n df = pt1.dot(pt1) + diff.dot(pt2);\n return Numerical.isMachineZero(df) ? u : u - diff.dot(pt1) / df;\n },\n evaluate: function evaluate(degree, curve, t) {\n var tmp = curve.slice();\n\n for (var i = 1; i <= degree; i++) {\n for (var j = 0; j <= degree - i; j++) {\n tmp[j] = tmp[j].multiply(1 - t).add(tmp[j + 1].multiply(t));\n }\n }\n\n return tmp[0];\n },\n chordLengthParameterize: function chordLengthParameterize(first, last) {\n var u = [0];\n\n for (var i = first + 1; i <= last; i++) {\n u[i - first] = u[i - first - 1] + this.points[i].getDistance(this.points[i - 1]);\n }\n\n for (var i = 1, m = last - first; i <= m; i++) {\n u[i] /= u[m];\n }\n\n return u;\n },\n findMaxError: function findMaxError(first, last, curve, u) {\n var index = Math.floor((last - first + 1) / 2),\n maxDist = 0;\n\n for (var i = first + 1; i < last; i++) {\n var P = this.evaluate(3, curve, u[i - first]);\n var v = P.subtract(this.points[i]);\n var dist = v.x * v.x + v.y * v.y;\n\n if (dist >= maxDist) {\n maxDist = dist;\n index = i;\n }\n }\n\n return {\n error: maxDist,\n index: index\n };\n }\n });\n var TextItem = Item.extend({\n _class: 'TextItem',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _serializeFields: {\n content: null\n },\n _boundsOptions: {\n stroke: false,\n handle: false\n },\n initialize: function TextItem(arg) {\n this._content = '';\n this._lines = [];\n var hasProps = arg && Base.isPlainObject(arg) && arg.x === undefined && arg.y === undefined;\n\n this._initialize(hasProps && arg, !hasProps && Point.read(arguments));\n },\n _equals: function _equals(item) {\n return this._content === item._content;\n },\n copyContent: function copyContent(source) {\n this.setContent(source._content);\n },\n getContent: function getContent() {\n return this._content;\n },\n setContent: function setContent(content) {\n this._content = '' + content;\n this._lines = this._content.split(/\\r\\n|\\n|\\r/mg);\n\n this._changed(521);\n },\n isEmpty: function isEmpty() {\n return !this._content;\n },\n getCharacterStyle: '#getStyle',\n setCharacterStyle: '#setStyle',\n getParagraphStyle: '#getStyle',\n setParagraphStyle: '#setStyle'\n });\n var PointText = TextItem.extend({\n _class: 'PointText',\n initialize: function PointText() {\n TextItem.apply(this, arguments);\n },\n getPoint: function getPoint() {\n var point = this._matrix.getTranslation();\n\n return new LinkedPoint(point.x, point.y, this, 'setPoint');\n },\n setPoint: function setPoint() {\n var point = Point.read(arguments);\n this.translate(point.subtract(this._matrix.getTranslation()));\n },\n _draw: function _draw(ctx, param, viewMatrix) {\n if (!this._content) return;\n\n this._setStyles(ctx, param, viewMatrix);\n\n var lines = this._lines,\n style = this._style,\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n leading = style.getLeading(),\n shadowColor = ctx.shadowColor;\n ctx.font = style.getFontStyle();\n ctx.textAlign = style.getJustification();\n\n for (var i = 0, l = lines.length; i < l; i++) {\n ctx.shadowColor = shadowColor;\n var line = lines[i];\n\n if (hasFill) {\n ctx.fillText(line, 0, 0);\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) ctx.strokeText(line, 0, 0);\n ctx.translate(0, leading);\n }\n },\n _getBounds: function _getBounds(matrix, options) {\n var style = this._style,\n lines = this._lines,\n numLines = lines.length,\n justification = style.getJustification(),\n leading = style.getLeading(),\n width = this.getView().getTextWidth(style.getFontStyle(), lines),\n x = 0;\n if (justification !== 'left') x -= width / (justification === 'center' ? 2 : 1);\n var rect = new _Rectangle(x, numLines ? -0.75 * leading : 0, width, numLines * leading);\n return matrix ? matrix._transformBounds(rect, rect) : rect;\n }\n });\n var Color = Base.extend(new function () {\n var types = {\n gray: ['gray'],\n rgb: ['red', 'green', 'blue'],\n hsb: ['hue', 'saturation', 'brightness'],\n hsl: ['hue', 'saturation', 'lightness'],\n gradient: ['gradient', 'origin', 'destination', 'highlight']\n };\n var componentParsers = {},\n namedColors = {\n transparent: [0, 0, 0, 0]\n },\n colorCtx;\n\n function fromCSS(string) {\n var match = string.match(/^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})?$/i) || string.match(/^#([\\da-f])([\\da-f])([\\da-f])([\\da-f])?$/i),\n type = 'rgb',\n components;\n\n if (match) {\n var amount = match[4] ? 4 : 3;\n components = new Array(amount);\n\n for (var i = 0; i < amount; i++) {\n var value = match[i + 1];\n components[i] = parseInt(value.length == 1 ? value + value : value, 16) / 255;\n }\n } else if (match = string.match(/^(rgb|hsl)a?\\((.*)\\)$/)) {\n type = match[1];\n components = match[2].trim().split(/[,\\s]+/g);\n var isHSL = type === 'hsl';\n\n for (var i = 0, l = Math.min(components.length, 4); i < l; i++) {\n var component = components[i];\n var value = parseFloat(component);\n\n if (isHSL) {\n if (i === 0) {\n var unit = component.match(/([a-z]*)$/)[1];\n value *= {\n turn: 360,\n rad: 180 / Math.PI,\n grad: 0.9\n }[unit] || 1;\n } else if (i < 3) {\n value /= 100;\n }\n } else if (i < 3) {\n value /= /%$/.test(component) ? 100 : 255;\n }\n\n components[i] = value;\n }\n } else {\n var color = namedColors[string];\n\n if (!color) {\n if (window) {\n if (!colorCtx) {\n colorCtx = CanvasProvider.getContext(1, 1);\n colorCtx.globalCompositeOperation = 'copy';\n }\n\n colorCtx.fillStyle = 'rgba(0,0,0,0)';\n colorCtx.fillStyle = string;\n colorCtx.fillRect(0, 0, 1, 1);\n var data = colorCtx.getImageData(0, 0, 1, 1).data;\n color = namedColors[string] = [data[0] / 255, data[1] / 255, data[2] / 255];\n } else {\n color = [0, 0, 0];\n }\n }\n\n components = color.slice();\n }\n\n return [type, components];\n }\n\n var hsbIndices = [[0, 3, 1], [2, 0, 1], [1, 0, 3], [1, 2, 0], [3, 1, 0], [0, 1, 2]];\n var converters = {\n 'rgb-hsb': function rgbHsb(r, g, b) {\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b),\n delta = max - min,\n h = delta === 0 ? 0 : (max == r ? (g - b) / delta + (g < b ? 6 : 0) : max == g ? (b - r) / delta + 2 : (r - g) / delta + 4) * 60;\n return [h, max === 0 ? 0 : delta / max, max];\n },\n 'hsb-rgb': function hsbRgb(h, s, b) {\n h = (h / 60 % 6 + 6) % 6;\n var i = Math.floor(h),\n f = h - i,\n i = hsbIndices[i],\n v = [b, b * (1 - s), b * (1 - s * f), b * (1 - s * (1 - f))];\n return [v[i[0]], v[i[1]], v[i[2]]];\n },\n 'rgb-hsl': function rgbHsl(r, g, b) {\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b),\n delta = max - min,\n achromatic = delta === 0,\n h = achromatic ? 0 : (max == r ? (g - b) / delta + (g < b ? 6 : 0) : max == g ? (b - r) / delta + 2 : (r - g) / delta + 4) * 60,\n l = (max + min) / 2,\n s = achromatic ? 0 : l < 0.5 ? delta / (max + min) : delta / (2 - max - min);\n return [h, s, l];\n },\n 'hsl-rgb': function hslRgb(h, s, l) {\n h = (h / 360 % 1 + 1) % 1;\n if (s === 0) return [l, l, l];\n var t3s = [h + 1 / 3, h, h - 1 / 3],\n t2 = l < 0.5 ? l * (1 + s) : l + s - l * s,\n t1 = 2 * l - t2,\n c = [];\n\n for (var i = 0; i < 3; i++) {\n var t3 = t3s[i];\n if (t3 < 0) t3 += 1;\n if (t3 > 1) t3 -= 1;\n c[i] = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 : 2 * t3 < 1 ? t2 : 3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 : t1;\n }\n\n return c;\n },\n 'rgb-gray': function rgbGray(r, g, b) {\n return [r * 0.2989 + g * 0.587 + b * 0.114];\n },\n 'gray-rgb': function grayRgb(g) {\n return [g, g, g];\n },\n 'gray-hsb': function grayHsb(g) {\n return [0, 0, g];\n },\n 'gray-hsl': function grayHsl(g) {\n return [0, 0, g];\n },\n 'gradient-rgb': function gradientRgb() {\n return [];\n },\n 'rgb-gradient': function rgbGradient() {\n return [];\n }\n };\n return Base.each(types, function (properties, type) {\n componentParsers[type] = [];\n Base.each(properties, function (name, index) {\n var part = Base.capitalize(name),\n hasOverlap = /^(hue|saturation)$/.test(name),\n parser = componentParsers[type][index] = type === 'gradient' ? name === 'gradient' ? function (value) {\n var current = this._components[0];\n value = Gradient.read(Array.isArray(value) ? value : arguments, 0, {\n readNull: true\n });\n\n if (current !== value) {\n if (current) current._removeOwner(this);\n if (value) value._addOwner(this);\n }\n\n return value;\n } : function () {\n return Point.read(arguments, 0, {\n readNull: name === 'highlight',\n clone: true\n });\n } : function (value) {\n return value == null || isNaN(value) ? 0 : +value;\n };\n\n this['get' + part] = function () {\n return this._type === type || hasOverlap && /^hs[bl]$/.test(this._type) ? this._components[index] : this._convert(type)[index];\n };\n\n this['set' + part] = function (value) {\n if (this._type !== type && !(hasOverlap && /^hs[bl]$/.test(this._type))) {\n this._components = this._convert(type);\n this._properties = types[type];\n this._type = type;\n }\n\n this._components[index] = parser.call(this, value);\n\n this._changed();\n };\n }, this);\n }, {\n _class: 'Color',\n _readIndex: true,\n initialize: function Color(arg) {\n var args = arguments,\n reading = this.__read,\n read = 0,\n type,\n components,\n alpha,\n values;\n\n if (Array.isArray(arg)) {\n args = arg;\n arg = args[0];\n }\n\n var argType = arg != null && typeof arg;\n\n if (argType === 'string' && arg in types) {\n type = arg;\n arg = args[1];\n\n if (Array.isArray(arg)) {\n components = arg;\n alpha = args[2];\n } else {\n if (reading) read = 1;\n args = Base.slice(args, 1);\n argType = typeof arg;\n }\n }\n\n if (!components) {\n values = argType === 'number' ? args : argType === 'object' && arg.length != null ? arg : null;\n\n if (values) {\n if (!type) type = values.length >= 3 ? 'rgb' : 'gray';\n var length = types[type].length;\n alpha = values[length];\n\n if (reading) {\n read += values === arguments ? length + (alpha != null ? 1 : 0) : 1;\n }\n\n if (values.length > length) values = Base.slice(values, 0, length);\n } else if (argType === 'string') {\n var converted = fromCSS(arg);\n type = converted[0];\n components = converted[1];\n\n if (components.length === 4) {\n alpha = components[3];\n components.length--;\n }\n } else if (argType === 'object') {\n if (arg.constructor === Color) {\n type = arg._type;\n components = arg._components.slice();\n alpha = arg._alpha;\n\n if (type === 'gradient') {\n for (var i = 1, l = components.length; i < l; i++) {\n var point = components[i];\n if (point) components[i] = point.clone();\n }\n }\n } else if (arg.constructor === Gradient) {\n type = 'gradient';\n values = args;\n } else {\n type = 'hue' in arg ? 'lightness' in arg ? 'hsl' : 'hsb' : 'gradient' in arg || 'stops' in arg || 'radial' in arg ? 'gradient' : 'gray' in arg ? 'gray' : 'rgb';\n var properties = types[type],\n parsers = componentParsers[type];\n this._components = components = [];\n\n for (var i = 0, l = properties.length; i < l; i++) {\n var value = arg[properties[i]];\n\n if (value == null && !i && type === 'gradient' && 'stops' in arg) {\n value = {\n stops: arg.stops,\n radial: arg.radial\n };\n }\n\n value = parsers[i].call(this, value);\n if (value != null) components[i] = value;\n }\n\n alpha = arg.alpha;\n }\n }\n\n if (reading && type) read = 1;\n }\n\n this._type = type || 'rgb';\n\n if (!components) {\n this._components = components = [];\n var parsers = componentParsers[this._type];\n\n for (var i = 0, l = parsers.length; i < l; i++) {\n var value = parsers[i].call(this, values && values[i]);\n if (value != null) components[i] = value;\n }\n }\n\n this._components = components;\n this._properties = types[this._type];\n this._alpha = alpha;\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _serialize: function _serialize(options, dictionary) {\n var components = this.getComponents();\n return Base.serialize(/^(gray|rgb)$/.test(this._type) ? components : [this._type].concat(components), options, true, dictionary);\n },\n _changed: function _changed() {\n this._canvasStyle = null;\n\n if (this._owner) {\n if (this._setter) {\n this._owner[this._setter](this);\n } else {\n this._owner._changed(129);\n }\n }\n },\n _convert: function _convert(type) {\n var converter;\n return this._type === type ? this._components.slice() : (converter = converters[this._type + '-' + type]) ? converter.apply(this, this._components) : converters['rgb-' + type].apply(this, converters[this._type + '-rgb'].apply(this, this._components));\n },\n convert: function convert(type) {\n return new Color(type, this._convert(type), this._alpha);\n },\n getType: function getType() {\n return this._type;\n },\n setType: function setType(type) {\n this._components = this._convert(type);\n this._properties = types[type];\n this._type = type;\n },\n getComponents: function getComponents() {\n var components = this._components.slice();\n\n if (this._alpha != null) components.push(this._alpha);\n return components;\n },\n getAlpha: function getAlpha() {\n return this._alpha != null ? this._alpha : 1;\n },\n setAlpha: function setAlpha(alpha) {\n this._alpha = alpha == null ? null : Math.min(Math.max(alpha, 0), 1);\n\n this._changed();\n },\n hasAlpha: function hasAlpha() {\n return this._alpha != null;\n },\n equals: function equals(color) {\n var col = Base.isPlainValue(color, true) ? Color.read(arguments) : color;\n return col === this || col && this._class === col._class && this._type === col._type && this.getAlpha() === col.getAlpha() && Base.equals(this._components, col._components) || false;\n },\n toString: function toString() {\n var properties = this._properties,\n parts = [],\n isGradient = this._type === 'gradient',\n f = Formatter.instance;\n\n for (var i = 0, l = properties.length; i < l; i++) {\n var value = this._components[i];\n if (value != null) parts.push(properties[i] + ': ' + (isGradient ? value : f.number(value)));\n }\n\n if (this._alpha != null) parts.push('alpha: ' + f.number(this._alpha));\n return '{ ' + parts.join(', ') + ' }';\n },\n toCSS: function toCSS(hex) {\n var components = this._convert('rgb'),\n alpha = hex || this._alpha == null ? 1 : this._alpha;\n\n function convert(val) {\n return Math.round((val < 0 ? 0 : val > 1 ? 1 : val) * 255);\n }\n\n components = [convert(components[0]), convert(components[1]), convert(components[2])];\n if (alpha < 1) components.push(alpha < 0 ? 0 : alpha);\n return hex ? '#' + ((1 << 24) + (components[0] << 16) + (components[1] << 8) + components[2]).toString(16).slice(1) : (components.length == 4 ? 'rgba(' : 'rgb(') + components.join(',') + ')';\n },\n toCanvasStyle: function toCanvasStyle(ctx, matrix) {\n if (this._canvasStyle) return this._canvasStyle;\n if (this._type !== 'gradient') return this._canvasStyle = this.toCSS();\n var components = this._components,\n gradient = components[0],\n stops = gradient._stops,\n origin = components[1],\n destination = components[2],\n highlight = components[3],\n inverse = matrix && matrix.inverted(),\n canvasGradient;\n\n if (inverse) {\n origin = inverse._transformPoint(origin);\n destination = inverse._transformPoint(destination);\n if (highlight) highlight = inverse._transformPoint(highlight);\n }\n\n if (gradient._radial) {\n var radius = destination.getDistance(origin);\n\n if (highlight) {\n var vector = highlight.subtract(origin);\n if (vector.getLength() > radius) highlight = origin.add(vector.normalize(radius - 0.1));\n }\n\n var start = highlight || origin;\n canvasGradient = ctx.createRadialGradient(start.x, start.y, 0, origin.x, origin.y, radius);\n } else {\n canvasGradient = ctx.createLinearGradient(origin.x, origin.y, destination.x, destination.y);\n }\n\n for (var i = 0, l = stops.length; i < l; i++) {\n var stop = stops[i],\n offset = stop._offset;\n canvasGradient.addColorStop(offset == null ? i / (l - 1) : offset, stop._color.toCanvasStyle());\n }\n\n return this._canvasStyle = canvasGradient;\n },\n transform: function transform(matrix) {\n if (this._type === 'gradient') {\n var components = this._components;\n\n for (var i = 1, l = components.length; i < l; i++) {\n var point = components[i];\n\n matrix._transformPoint(point, point, true);\n }\n\n this._changed();\n }\n },\n statics: {\n _types: types,\n random: function random() {\n var random = Math.random;\n return new Color(random(), random(), random());\n },\n _setOwner: function _setOwner(color, owner, setter) {\n if (color) {\n if (color._owner && owner && color._owner !== owner) {\n color = color.clone();\n }\n\n if (!color._owner ^ !owner) {\n color._owner = owner || null;\n color._setter = setter || null;\n }\n }\n\n return color;\n }\n }\n });\n }(), new function () {\n var operators = {\n add: function add(a, b) {\n return a + b;\n },\n subtract: function subtract(a, b) {\n return a - b;\n },\n multiply: function multiply(a, b) {\n return a * b;\n },\n divide: function divide(a, b) {\n return a / b;\n }\n };\n return Base.each(operators, function (operator, name) {\n this[name] = function (color) {\n color = Color.read(arguments);\n\n var type = this._type,\n components1 = this._components,\n components2 = color._convert(type);\n\n for (var i = 0, l = components1.length; i < l; i++) {\n components2[i] = operator(components1[i], components2[i]);\n }\n\n return new Color(type, components2, this._alpha != null ? operator(this._alpha, color.getAlpha()) : null);\n };\n }, {});\n }());\n var Gradient = Base.extend({\n _class: 'Gradient',\n initialize: function Gradient(stops, radial) {\n this._id = UID.get();\n\n if (stops && Base.isPlainObject(stops)) {\n this.set(stops);\n stops = radial = null;\n }\n\n if (this._stops == null) {\n this.setStops(stops || ['white', 'black']);\n }\n\n if (this._radial == null) {\n this.setRadial(typeof radial === 'string' && radial === 'radial' || radial || false);\n }\n },\n _serialize: function _serialize(options, dictionary) {\n return dictionary.add(this, function () {\n return Base.serialize([this._stops, this._radial], options, true, dictionary);\n });\n },\n _changed: function _changed() {\n for (var i = 0, l = this._owners && this._owners.length; i < l; i++) {\n this._owners[i]._changed();\n }\n },\n _addOwner: function _addOwner(color) {\n if (!this._owners) this._owners = [];\n\n this._owners.push(color);\n },\n _removeOwner: function _removeOwner(color) {\n var index = this._owners ? this._owners.indexOf(color) : -1;\n\n if (index != -1) {\n this._owners.splice(index, 1);\n\n if (!this._owners.length) this._owners = undefined;\n }\n },\n clone: function clone() {\n var stops = [];\n\n for (var i = 0, l = this._stops.length; i < l; i++) {\n stops[i] = this._stops[i].clone();\n }\n\n return new Gradient(stops, this._radial);\n },\n getStops: function getStops() {\n return this._stops;\n },\n setStops: function setStops(stops) {\n if (stops.length < 2) {\n throw new Error('Gradient stop list needs to contain at least two stops.');\n }\n\n var _stops = this._stops;\n\n if (_stops) {\n for (var i = 0, l = _stops.length; i < l; i++) {\n _stops[i]._owner = undefined;\n }\n }\n\n _stops = this._stops = GradientStop.readList(stops, 0, {\n clone: true\n });\n\n for (var i = 0, l = _stops.length; i < l; i++) {\n _stops[i]._owner = this;\n }\n\n this._changed();\n },\n getRadial: function getRadial() {\n return this._radial;\n },\n setRadial: function setRadial(radial) {\n this._radial = radial;\n\n this._changed();\n },\n equals: function equals(gradient) {\n if (gradient === this) return true;\n\n if (gradient && this._class === gradient._class) {\n var stops1 = this._stops,\n stops2 = gradient._stops,\n length = stops1.length;\n\n if (length === stops2.length) {\n for (var i = 0; i < length; i++) {\n if (!stops1[i].equals(stops2[i])) return false;\n }\n\n return true;\n }\n }\n\n return false;\n }\n });\n var GradientStop = Base.extend({\n _class: 'GradientStop',\n initialize: function GradientStop(arg0, arg1) {\n var color = arg0,\n offset = arg1;\n\n if (typeof arg0 === 'object' && arg1 === undefined) {\n if (Array.isArray(arg0) && typeof arg0[0] !== 'number') {\n color = arg0[0];\n offset = arg0[1];\n } else if ('color' in arg0 || 'offset' in arg0 || 'rampPoint' in arg0) {\n color = arg0.color;\n offset = arg0.offset || arg0.rampPoint || 0;\n }\n }\n\n this.setColor(color);\n this.setOffset(offset);\n },\n clone: function clone() {\n return new GradientStop(this._color.clone(), this._offset);\n },\n _serialize: function _serialize(options, dictionary) {\n var color = this._color,\n offset = this._offset;\n return Base.serialize(offset == null ? [color] : [color, offset], options, true, dictionary);\n },\n _changed: function _changed() {\n if (this._owner) this._owner._changed(129);\n },\n getOffset: function getOffset() {\n return this._offset;\n },\n setOffset: function setOffset(offset) {\n this._offset = offset;\n\n this._changed();\n },\n getRampPoint: '#getOffset',\n setRampPoint: '#setOffset',\n getColor: function getColor() {\n return this._color;\n },\n setColor: function setColor() {\n Color._setOwner(this._color, null);\n\n this._color = Color._setOwner(Color.read(arguments, 0), this, 'setColor');\n\n this._changed();\n },\n equals: function equals(stop) {\n return stop === this || stop && this._class === stop._class && this._color.equals(stop._color) && this._offset == stop._offset || false;\n }\n });\n var Style = Base.extend(new function () {\n var itemDefaults = {\n fillColor: null,\n fillRule: 'nonzero',\n strokeColor: null,\n strokeWidth: 1,\n strokeCap: 'butt',\n strokeJoin: 'miter',\n strokeScaling: true,\n miterLimit: 10,\n dashOffset: 0,\n dashArray: [],\n shadowColor: null,\n shadowBlur: 0,\n shadowOffset: new Point(),\n selectedColor: null\n },\n groupDefaults = Base.set({}, itemDefaults, {\n fontFamily: 'sans-serif',\n fontWeight: 'normal',\n fontSize: 12,\n leading: null,\n justification: 'left'\n }),\n textDefaults = Base.set({}, groupDefaults, {\n fillColor: new Color()\n }),\n flags = {\n strokeWidth: 193,\n strokeCap: 193,\n strokeJoin: 193,\n strokeScaling: 201,\n miterLimit: 193,\n fontFamily: 9,\n fontWeight: 9,\n fontSize: 9,\n font: 9,\n leading: 9,\n justification: 9\n },\n item = {\n beans: true\n },\n fields = {\n _class: 'Style',\n beans: true,\n initialize: function Style(style, _owner, _project) {\n this._values = {};\n this._owner = _owner;\n this._project = _owner && _owner._project || _project || paper.project;\n this._defaults = !_owner || _owner instanceof Group ? groupDefaults : _owner instanceof TextItem ? textDefaults : itemDefaults;\n if (style) this.set(style);\n }\n };\n Base.each(groupDefaults, function (value, key) {\n var isColor = /Color$/.test(key),\n isPoint = key === 'shadowOffset',\n part = Base.capitalize(key),\n flag = flags[key],\n set = 'set' + part,\n get = 'get' + part;\n\n fields[set] = function (value) {\n var owner = this._owner,\n children = owner && owner._children,\n applyToChildren = children && children.length > 0 && !(owner instanceof CompoundPath);\n\n if (applyToChildren) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i]._style[set](value);\n }\n }\n\n if ((key === 'selectedColor' || !applyToChildren) && key in this._defaults) {\n var old = this._values[key];\n\n if (old !== value) {\n if (isColor) {\n if (old) {\n Color._setOwner(old, null);\n\n old._canvasStyle = null;\n }\n\n if (value && value.constructor === Color) {\n value = Color._setOwner(value, owner, applyToChildren && set);\n }\n }\n\n this._values[key] = value;\n if (owner) owner._changed(flag || 129);\n }\n }\n };\n\n fields[get] = function (_dontMerge) {\n var owner = this._owner,\n children = owner && owner._children,\n applyToChildren = children && children.length > 0 && !(owner instanceof CompoundPath),\n value;\n\n if (applyToChildren && !_dontMerge) {\n for (var i = 0, l = children.length; i < l; i++) {\n var childValue = children[i]._style[get]();\n\n if (!i) {\n value = childValue;\n } else if (!Base.equals(value, childValue)) {\n return undefined;\n }\n }\n } else if (key in this._defaults) {\n var value = this._values[key];\n\n if (value === undefined) {\n value = this._defaults[key];\n\n if (value && value.clone) {\n value = value.clone();\n }\n } else {\n var ctor = isColor ? Color : isPoint ? Point : null;\n\n if (ctor && !(value && value.constructor === ctor)) {\n this._values[key] = value = ctor.read([value], 0, {\n readNull: true,\n clone: true\n });\n }\n }\n }\n\n if (value && isColor) {\n value = Color._setOwner(value, owner, applyToChildren && set);\n }\n\n return value;\n };\n\n item[get] = function (_dontMerge) {\n return this._style[get](_dontMerge);\n };\n\n item[set] = function (value) {\n this._style[set](value);\n };\n });\n Base.each({\n Font: 'FontFamily',\n WindingRule: 'FillRule'\n }, function (value, key) {\n var get = 'get' + key,\n set = 'set' + key;\n fields[get] = item[get] = '#get' + value;\n fields[set] = item[set] = '#set' + value;\n });\n Item.inject(item);\n return fields;\n }(), {\n set: function set(style) {\n var isStyle = style instanceof Style,\n values = isStyle ? style._values : style;\n\n if (values) {\n for (var key in values) {\n if (key in this._defaults) {\n var value = values[key];\n this[key] = value && isStyle && value.clone ? value.clone() : value;\n }\n }\n }\n },\n equals: function equals(style) {\n function compare(style1, style2, secondary) {\n var values1 = style1._values,\n values2 = style2._values,\n defaults2 = style2._defaults;\n\n for (var key in values1) {\n var value1 = values1[key],\n value2 = values2[key];\n if (!(secondary && key in values2) && !Base.equals(value1, value2 === undefined ? defaults2[key] : value2)) return false;\n }\n\n return true;\n }\n\n return style === this || style && this._class === style._class && compare(this, style) && compare(style, this, true) || false;\n },\n _dispose: function _dispose() {\n var color;\n color = this.getFillColor();\n if (color) color._canvasStyle = null;\n color = this.getStrokeColor();\n if (color) color._canvasStyle = null;\n color = this.getShadowColor();\n if (color) color._canvasStyle = null;\n },\n hasFill: function hasFill() {\n var color = this.getFillColor();\n return !!color && color.alpha > 0;\n },\n hasStroke: function hasStroke() {\n var color = this.getStrokeColor();\n return !!color && color.alpha > 0 && this.getStrokeWidth() > 0;\n },\n hasShadow: function hasShadow() {\n var color = this.getShadowColor();\n return !!color && color.alpha > 0 && (this.getShadowBlur() > 0 || !this.getShadowOffset().isZero());\n },\n getView: function getView() {\n return this._project._view;\n },\n getFontStyle: function getFontStyle() {\n var fontSize = this.getFontSize();\n return this.getFontWeight() + ' ' + fontSize + (/[a-z]/i.test(fontSize + '') ? ' ' : 'px ') + this.getFontFamily();\n },\n getFont: '#getFontFamily',\n setFont: '#setFontFamily',\n getLeading: function getLeading() {\n var leading = getLeading.base.call(this),\n fontSize = this.getFontSize();\n if (/pt|em|%|px/.test(fontSize)) fontSize = this.getView().getPixelSize(fontSize);\n return leading != null ? leading : fontSize * 1.2;\n }\n });\n var DomElement = new function () {\n function handlePrefix(el, name, set, value) {\n var prefixes = ['', 'webkit', 'moz', 'Moz', 'ms', 'o'],\n suffix = name[0].toUpperCase() + name.substring(1);\n\n for (var i = 0; i < 6; i++) {\n var prefix = prefixes[i],\n key = prefix ? prefix + suffix : name;\n\n if (key in el) {\n if (set) {\n el[key] = value;\n } else {\n return el[key];\n }\n\n break;\n }\n }\n }\n\n return {\n getStyles: function getStyles(el) {\n var doc = el && el.nodeType !== 9 ? el.ownerDocument : el,\n view = doc && doc.defaultView;\n return view && view.getComputedStyle(el, '');\n },\n getBounds: function getBounds(el, viewport) {\n var doc = el.ownerDocument,\n body = doc.body,\n html = doc.documentElement,\n rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (e) {\n rect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n };\n }\n\n var x = rect.left - (html.clientLeft || body.clientLeft || 0),\n y = rect.top - (html.clientTop || body.clientTop || 0);\n\n if (!viewport) {\n var view = doc.defaultView;\n x += view.pageXOffset || html.scrollLeft || body.scrollLeft;\n y += view.pageYOffset || html.scrollTop || body.scrollTop;\n }\n\n return new _Rectangle(x, y, rect.width, rect.height);\n },\n getViewportBounds: function getViewportBounds(el) {\n var doc = el.ownerDocument,\n view = doc.defaultView,\n html = doc.documentElement;\n return new _Rectangle(0, 0, view.innerWidth || html.clientWidth, view.innerHeight || html.clientHeight);\n },\n getOffset: function getOffset(el, viewport) {\n return DomElement.getBounds(el, viewport).getPoint();\n },\n getSize: function getSize(el) {\n return DomElement.getBounds(el, true).getSize();\n },\n isInvisible: function isInvisible(el) {\n return DomElement.getSize(el).equals(new Size(0, 0));\n },\n isInView: function isInView(el) {\n return !DomElement.isInvisible(el) && DomElement.getViewportBounds(el).intersects(DomElement.getBounds(el, true));\n },\n isInserted: function isInserted(el) {\n return document.body.contains(el);\n },\n getPrefixed: function getPrefixed(el, name) {\n return el && handlePrefix(el, name);\n },\n setPrefixed: function setPrefixed(el, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n handlePrefix(el, key, true, name[key]);\n }\n } else {\n handlePrefix(el, name, true, value);\n }\n }\n };\n }();\n var DomEvent = {\n add: function add(el, events) {\n if (el) {\n for (var type in events) {\n var func = events[type],\n parts = type.split(/[\\s,]+/g);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var name = parts[i];\n var options = el === document && (name === 'touchstart' || name === 'touchmove') ? {\n passive: false\n } : false;\n el.addEventListener(name, func, options);\n }\n }\n }\n },\n remove: function remove(el, events) {\n if (el) {\n for (var type in events) {\n var func = events[type],\n parts = type.split(/[\\s,]+/g);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n el.removeEventListener(parts[i], func, false);\n }\n }\n }\n },\n getPoint: function getPoint(event) {\n var pos = event.targetTouches ? event.targetTouches.length ? event.targetTouches[0] : event.changedTouches[0] : event;\n return new Point(pos.pageX || pos.clientX + document.documentElement.scrollLeft, pos.pageY || pos.clientY + document.documentElement.scrollTop);\n },\n getTarget: function getTarget(event) {\n return event.target || event.srcElement;\n },\n getRelatedTarget: function getRelatedTarget(event) {\n return event.relatedTarget || event.toElement;\n },\n getOffset: function getOffset(event, target) {\n return DomEvent.getPoint(event).subtract(DomElement.getOffset(target || DomEvent.getTarget(event)));\n }\n };\n DomEvent.requestAnimationFrame = new function () {\n var nativeRequest = DomElement.getPrefixed(window, 'requestAnimationFrame'),\n requested = false,\n callbacks = [],\n timer;\n\n function handleCallbacks() {\n var functions = callbacks;\n callbacks = [];\n\n for (var i = 0, l = functions.length; i < l; i++) {\n functions[i]();\n }\n\n requested = nativeRequest && callbacks.length;\n if (requested) nativeRequest(handleCallbacks);\n }\n\n return function (callback) {\n callbacks.push(callback);\n\n if (nativeRequest) {\n if (!requested) {\n nativeRequest(handleCallbacks);\n requested = true;\n }\n } else if (!timer) {\n timer = setInterval(handleCallbacks, 1000 / 60);\n }\n };\n }();\n var View = Base.extend(Emitter, {\n _class: 'View',\n initialize: function View(project, element) {\n function getSize(name) {\n return element[name] || parseInt(element.getAttribute(name), 10);\n }\n\n function getCanvasSize() {\n var size = DomElement.getSize(element);\n return size.isNaN() || size.isZero() ? new Size(getSize('width'), getSize('height')) : size;\n }\n\n var size;\n\n if (window && element) {\n this._id = element.getAttribute('id');\n if (this._id == null) element.setAttribute('id', this._id = 'paper-view-' + View._id++);\n DomEvent.add(element, this._viewEvents);\n var none = 'none';\n DomElement.setPrefixed(element.style, {\n userDrag: none,\n userSelect: none,\n touchCallout: none,\n contentZooming: none,\n tapHighlightColor: 'rgba(0,0,0,0)'\n });\n\n if (PaperScope.hasAttribute(element, 'resize')) {\n var that = this;\n DomEvent.add(window, this._windowEvents = {\n resize: function resize() {\n that.setViewSize(getCanvasSize());\n }\n });\n }\n\n size = getCanvasSize();\n\n if (PaperScope.hasAttribute(element, 'stats') && typeof Stats !== 'undefined') {\n this._stats = new Stats();\n var stats = this._stats.domElement,\n style = stats.style,\n offset = DomElement.getOffset(element);\n style.position = 'absolute';\n style.left = offset.x + 'px';\n style.top = offset.y + 'px';\n document.body.appendChild(stats);\n }\n } else {\n size = new Size(element);\n element = null;\n }\n\n this._project = project;\n this._scope = project._scope;\n this._element = element;\n if (!this._pixelRatio) this._pixelRatio = window && window.devicePixelRatio || 1;\n\n this._setElementSize(size.width, size.height);\n\n this._viewSize = size;\n\n View._views.push(this);\n\n View._viewsById[this._id] = this;\n (this._matrix = new Matrix())._owner = this;\n if (!View._focused) View._focused = this;\n this._frameItems = {};\n this._frameItemCount = 0;\n this._itemEvents = {\n native: {},\n virtual: {}\n };\n this._autoUpdate = !paper.agent.node;\n this._needsUpdate = false;\n },\n remove: function remove() {\n if (!this._project) return false;\n if (View._focused === this) View._focused = null;\n\n View._views.splice(View._views.indexOf(this), 1);\n\n delete View._viewsById[this._id];\n var project = this._project;\n if (project._view === this) project._view = null;\n DomEvent.remove(this._element, this._viewEvents);\n DomEvent.remove(window, this._windowEvents);\n this._element = this._project = null;\n this.off('frame');\n this._animate = false;\n this._frameItems = {};\n return true;\n },\n _events: Base.each(Item._itemHandlers.concat(['onResize', 'onKeyDown', 'onKeyUp']), function (name) {\n this[name] = {};\n }, {\n onFrame: {\n install: function install() {\n this.play();\n },\n uninstall: function uninstall() {\n this.pause();\n }\n }\n }),\n _animate: false,\n _time: 0,\n _count: 0,\n getAutoUpdate: function getAutoUpdate() {\n return this._autoUpdate;\n },\n setAutoUpdate: function setAutoUpdate(autoUpdate) {\n this._autoUpdate = autoUpdate;\n if (autoUpdate) this.requestUpdate();\n },\n update: function update() {},\n draw: function draw() {\n this.update();\n },\n requestUpdate: function requestUpdate() {\n if (!this._requested) {\n var that = this;\n DomEvent.requestAnimationFrame(function () {\n that._requested = false;\n\n if (that._animate) {\n that.requestUpdate();\n var element = that._element;\n\n if ((!DomElement.getPrefixed(document, 'hidden') || PaperScope.getAttribute(element, 'keepalive') === 'true') && DomElement.isInView(element)) {\n that._handleFrame();\n }\n }\n\n if (that._autoUpdate) that.update();\n });\n this._requested = true;\n }\n },\n play: function play() {\n this._animate = true;\n this.requestUpdate();\n },\n pause: function pause() {\n this._animate = false;\n },\n _handleFrame: function _handleFrame() {\n paper = this._scope;\n var now = Date.now() / 1000,\n delta = this._last ? now - this._last : 0;\n this._last = now;\n this.emit('frame', new Base({\n delta: delta,\n time: this._time += delta,\n count: this._count++\n }));\n if (this._stats) this._stats.update();\n },\n _animateItem: function _animateItem(item, animate) {\n var items = this._frameItems;\n\n if (animate) {\n items[item._id] = {\n item: item,\n time: 0,\n count: 0\n };\n if (++this._frameItemCount === 1) this.on('frame', this._handleFrameItems);\n } else {\n delete items[item._id];\n\n if (--this._frameItemCount === 0) {\n this.off('frame', this._handleFrameItems);\n }\n }\n },\n _handleFrameItems: function _handleFrameItems(event) {\n for (var i in this._frameItems) {\n var entry = this._frameItems[i];\n entry.item.emit('frame', new Base(event, {\n time: entry.time += event.delta,\n count: entry.count++\n }));\n }\n },\n _changed: function _changed() {\n this._project._changed(4097);\n\n this._bounds = this._decomposed = undefined;\n },\n getElement: function getElement() {\n return this._element;\n },\n getPixelRatio: function getPixelRatio() {\n return this._pixelRatio;\n },\n getResolution: function getResolution() {\n return this._pixelRatio * 72;\n },\n getViewSize: function getViewSize() {\n var size = this._viewSize;\n return new LinkedSize(size.width, size.height, this, 'setViewSize');\n },\n setViewSize: function setViewSize() {\n var size = Size.read(arguments),\n delta = size.subtract(this._viewSize);\n if (delta.isZero()) return;\n\n this._setElementSize(size.width, size.height);\n\n this._viewSize.set(size);\n\n this._changed();\n\n this.emit('resize', {\n size: size,\n delta: delta\n });\n\n if (this._autoUpdate) {\n this.update();\n }\n },\n _setElementSize: function _setElementSize(width, height) {\n var element = this._element;\n\n if (element) {\n if (element.width !== width) element.width = width;\n if (element.height !== height) element.height = height;\n }\n },\n getBounds: function getBounds() {\n if (!this._bounds) this._bounds = this._matrix.inverted()._transformBounds(new _Rectangle(new Point(), this._viewSize));\n return this._bounds;\n },\n getSize: function getSize() {\n return this.getBounds().getSize();\n },\n isVisible: function isVisible() {\n return DomElement.isInView(this._element);\n },\n isInserted: function isInserted() {\n return DomElement.isInserted(this._element);\n },\n getPixelSize: function getPixelSize(size) {\n var element = this._element,\n pixels;\n\n if (element) {\n var parent = element.parentNode,\n temp = document.createElement('div');\n temp.style.fontSize = size;\n parent.appendChild(temp);\n pixels = parseFloat(DomElement.getStyles(temp).fontSize);\n parent.removeChild(temp);\n } else {\n pixels = parseFloat(pixels);\n }\n\n return pixels;\n },\n getTextWidth: function getTextWidth(font, lines) {\n return 0;\n }\n }, Base.each(['rotate', 'scale', 'shear', 'skew'], function (key) {\n var rotate = key === 'rotate';\n\n this[key] = function () {\n var args = arguments,\n value = (rotate ? Base : Point).read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n return this.transform(new Matrix()[key](value, center || this.getCenter(true)));\n };\n }, {\n _decompose: function _decompose() {\n return this._decomposed || (this._decomposed = this._matrix.decompose());\n },\n translate: function translate() {\n var mx = new Matrix();\n return this.transform(mx.translate.apply(mx, arguments));\n },\n getCenter: function getCenter() {\n return this.getBounds().getCenter();\n },\n setCenter: function setCenter() {\n var center = Point.read(arguments);\n this.translate(this.getCenter().subtract(center));\n },\n getZoom: function getZoom() {\n var scaling = this._decompose().scaling;\n\n return (scaling.x + scaling.y) / 2;\n },\n setZoom: function setZoom(zoom) {\n this.transform(new Matrix().scale(zoom / this.getZoom(), this.getCenter()));\n },\n getRotation: function getRotation() {\n return this._decompose().rotation;\n },\n setRotation: function setRotation(rotation) {\n var current = this.getRotation();\n\n if (current != null && rotation != null) {\n this.rotate(rotation - current);\n }\n },\n getScaling: function getScaling() {\n var scaling = this._decompose().scaling;\n\n return new LinkedPoint(scaling.x, scaling.y, this, 'setScaling');\n },\n setScaling: function setScaling() {\n var current = this.getScaling(),\n scaling = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n\n if (current && scaling) {\n this.scale(scaling.x / current.x, scaling.y / current.y);\n }\n },\n getMatrix: function getMatrix() {\n return this._matrix;\n },\n setMatrix: function setMatrix() {\n var matrix = this._matrix;\n matrix.set.apply(matrix, arguments);\n },\n transform: function transform(matrix) {\n this._matrix.append(matrix);\n },\n scrollBy: function scrollBy() {\n this.translate(Point.read(arguments).negate());\n }\n }), {\n projectToView: function projectToView() {\n return this._matrix._transformPoint(Point.read(arguments));\n },\n viewToProject: function viewToProject() {\n return this._matrix._inverseTransform(Point.read(arguments));\n },\n getEventPoint: function getEventPoint(event) {\n return this.viewToProject(DomEvent.getOffset(event, this._element));\n }\n }, {\n statics: {\n _views: [],\n _viewsById: {},\n _id: 0,\n create: function create(project, element) {\n if (document && typeof element === 'string') element = document.getElementById(element);\n var ctor = window ? CanvasView : View;\n return new ctor(project, element);\n }\n }\n }, new function () {\n if (!window) return;\n var prevFocus,\n tempFocus,\n dragging = false,\n mouseDown = false;\n\n function getView(event) {\n var target = DomEvent.getTarget(event);\n return target.getAttribute && View._viewsById[target.getAttribute('id')];\n }\n\n function updateFocus() {\n var view = View._focused;\n\n if (!view || !view.isVisible()) {\n for (var i = 0, l = View._views.length; i < l; i++) {\n if ((view = View._views[i]).isVisible()) {\n View._focused = tempFocus = view;\n break;\n }\n }\n }\n }\n\n function handleMouseMove(view, event, point) {\n view._handleMouseEvent('mousemove', event, point);\n }\n\n var navigator = window.navigator,\n mousedown,\n mousemove,\n mouseup;\n\n if (navigator.pointerEnabled || navigator.msPointerEnabled) {\n mousedown = 'pointerdown MSPointerDown';\n mousemove = 'pointermove MSPointerMove';\n mouseup = 'pointerup pointercancel MSPointerUp MSPointerCancel';\n } else {\n mousedown = 'touchstart';\n mousemove = 'touchmove';\n mouseup = 'touchend touchcancel';\n\n if (!('ontouchstart' in window && navigator.userAgent.match(/mobile|tablet|ip(ad|hone|od)|android|silk/i))) {\n mousedown += ' mousedown';\n mousemove += ' mousemove';\n mouseup += ' mouseup';\n }\n }\n\n var viewEvents = {},\n docEvents = {\n mouseout: function mouseout(event) {\n var view = View._focused,\n target = DomEvent.getRelatedTarget(event);\n\n if (view && (!target || target.nodeName === 'HTML')) {\n var offset = DomEvent.getOffset(event, view._element),\n x = offset.x,\n abs = Math.abs,\n ax = abs(x),\n max = 1 << 25,\n diff = ax - max;\n offset.x = abs(diff) < ax ? diff * (x < 0 ? -1 : 1) : x;\n handleMouseMove(view, event, view.viewToProject(offset));\n }\n },\n scroll: updateFocus\n };\n\n viewEvents[mousedown] = function (event) {\n var view = View._focused = getView(event);\n\n if (!dragging) {\n dragging = true;\n\n view._handleMouseEvent('mousedown', event);\n }\n };\n\n docEvents[mousemove] = function (event) {\n var view = View._focused;\n\n if (!mouseDown) {\n var target = getView(event);\n\n if (target) {\n if (view !== target) {\n if (view) handleMouseMove(view, event);\n if (!prevFocus) prevFocus = view;\n view = View._focused = tempFocus = target;\n }\n } else if (tempFocus && tempFocus === view) {\n if (prevFocus && !prevFocus.isInserted()) prevFocus = null;\n view = View._focused = prevFocus;\n prevFocus = null;\n updateFocus();\n }\n }\n\n if (view) handleMouseMove(view, event);\n };\n\n docEvents[mousedown] = function () {\n mouseDown = true;\n };\n\n docEvents[mouseup] = function (event) {\n var view = View._focused;\n if (view && dragging) view._handleMouseEvent('mouseup', event);\n mouseDown = dragging = false;\n };\n\n DomEvent.add(document, docEvents);\n DomEvent.add(window, {\n load: updateFocus\n });\n var called = false,\n prevented = false,\n fallbacks = {\n doubleclick: 'click',\n mousedrag: 'mousemove'\n },\n wasInView = false,\n overView,\n downPoint,\n lastPoint,\n downItem,\n overItem,\n dragItem,\n clickItem,\n clickTime,\n dblClick;\n\n function emitMouseEvent(obj, target, type, event, point, prevPoint, stopItem) {\n var stopped = false,\n mouseEvent;\n\n function emit(obj, type) {\n if (obj.responds(type)) {\n if (!mouseEvent) {\n mouseEvent = new MouseEvent(type, event, point, target || obj, prevPoint ? point.subtract(prevPoint) : null);\n }\n\n if (obj.emit(type, mouseEvent)) {\n called = true;\n if (mouseEvent.prevented) prevented = true;\n if (mouseEvent.stopped) return stopped = true;\n }\n } else {\n var fallback = fallbacks[type];\n if (fallback) return emit(obj, fallback);\n }\n }\n\n while (obj && obj !== stopItem) {\n if (emit(obj, type)) break;\n obj = obj._parent;\n }\n\n return stopped;\n }\n\n function emitMouseEvents(view, hitItem, type, event, point, prevPoint) {\n view._project.removeOn(type);\n\n prevented = called = false;\n return dragItem && emitMouseEvent(dragItem, null, type, event, point, prevPoint) || hitItem && hitItem !== dragItem && !hitItem.isDescendant(dragItem) && emitMouseEvent(hitItem, null, type === 'mousedrag' ? 'mousemove' : type, event, point, prevPoint, dragItem) || emitMouseEvent(view, dragItem || hitItem || view, type, event, point, prevPoint);\n }\n\n var itemEventsMap = {\n mousedown: {\n mousedown: 1,\n mousedrag: 1,\n click: 1,\n doubleclick: 1\n },\n mouseup: {\n mouseup: 1,\n mousedrag: 1,\n click: 1,\n doubleclick: 1\n },\n mousemove: {\n mousedrag: 1,\n mousemove: 1,\n mouseenter: 1,\n mouseleave: 1\n }\n };\n return {\n _viewEvents: viewEvents,\n _handleMouseEvent: function _handleMouseEvent(type, event, point) {\n var itemEvents = this._itemEvents,\n hitItems = itemEvents.native[type],\n nativeMove = type === 'mousemove',\n tool = this._scope.tool,\n view = this;\n\n function responds(type) {\n return itemEvents.virtual[type] || view.responds(type) || tool && tool.responds(type);\n }\n\n if (nativeMove && dragging && responds('mousedrag')) type = 'mousedrag';\n if (!point) point = this.getEventPoint(event);\n\n var inView = this.getBounds().contains(point),\n hit = hitItems && inView && view._project.hitTest(point, {\n tolerance: 0,\n fill: true,\n stroke: true\n }),\n hitItem = hit && hit.item || null,\n handle = false,\n mouse = {};\n\n mouse[type.substr(5)] = true;\n\n if (hitItems && hitItem !== overItem) {\n if (overItem) {\n emitMouseEvent(overItem, null, 'mouseleave', event, point);\n }\n\n if (hitItem) {\n emitMouseEvent(hitItem, null, 'mouseenter', event, point);\n }\n\n overItem = hitItem;\n }\n\n if (wasInView ^ inView) {\n emitMouseEvent(this, null, inView ? 'mouseenter' : 'mouseleave', event, point);\n overView = inView ? this : null;\n handle = true;\n }\n\n if ((inView || mouse.drag) && !point.equals(lastPoint)) {\n emitMouseEvents(this, hitItem, nativeMove ? type : 'mousemove', event, point, lastPoint);\n handle = true;\n }\n\n wasInView = inView;\n\n if (mouse.down && inView || mouse.up && downPoint) {\n emitMouseEvents(this, hitItem, type, event, point, downPoint);\n\n if (mouse.down) {\n dblClick = hitItem === clickItem && Date.now() - clickTime < 300;\n downItem = clickItem = hitItem;\n\n if (!prevented && hitItem) {\n var item = hitItem;\n\n while (item && !item.responds('mousedrag')) {\n item = item._parent;\n }\n\n if (item) dragItem = hitItem;\n }\n\n downPoint = point;\n } else if (mouse.up) {\n if (!prevented && hitItem === downItem) {\n clickTime = Date.now();\n emitMouseEvents(this, hitItem, dblClick ? 'doubleclick' : 'click', event, point, downPoint);\n dblClick = false;\n }\n\n downItem = dragItem = null;\n }\n\n wasInView = false;\n handle = true;\n }\n\n lastPoint = point;\n\n if (handle && tool) {\n called = tool._handleMouseEvent(type, event, point, mouse) || called;\n }\n\n if (event.cancelable !== false && (called && !mouse.move || mouse.down && responds('mouseup'))) {\n event.preventDefault();\n }\n },\n _handleKeyEvent: function _handleKeyEvent(type, event, key, character) {\n var scope = this._scope,\n tool = scope.tool,\n keyEvent;\n\n function emit(obj) {\n if (obj.responds(type)) {\n paper = scope;\n obj.emit(type, keyEvent = keyEvent || new KeyEvent(type, event, key, character));\n }\n }\n\n if (this.isVisible()) {\n emit(this);\n if (tool && tool.responds(type)) emit(tool);\n }\n },\n _countItemEvent: function _countItemEvent(type, sign) {\n var itemEvents = this._itemEvents,\n native = itemEvents.native,\n virtual = itemEvents.virtual;\n\n for (var key in itemEventsMap) {\n native[key] = (native[key] || 0) + (itemEventsMap[key][type] || 0) * sign;\n }\n\n virtual[type] = (virtual[type] || 0) + sign;\n },\n statics: {\n updateFocus: updateFocus,\n _resetState: function _resetState() {\n dragging = mouseDown = called = wasInView = false;\n prevFocus = tempFocus = overView = downPoint = lastPoint = downItem = overItem = dragItem = clickItem = clickTime = dblClick = null;\n }\n }\n };\n }());\n var CanvasView = View.extend({\n _class: 'CanvasView',\n initialize: function CanvasView(project, canvas) {\n if (!(canvas instanceof window.HTMLCanvasElement)) {\n var size = Size.read(arguments, 1);\n if (size.isZero()) throw new Error('Cannot create CanvasView with the provided argument: ' + Base.slice(arguments, 1));\n canvas = CanvasProvider.getCanvas(size);\n }\n\n var ctx = this._context = canvas.getContext('2d');\n ctx.save();\n this._pixelRatio = 1;\n\n if (!/^off|false$/.test(PaperScope.getAttribute(canvas, 'hidpi'))) {\n var deviceRatio = window.devicePixelRatio || 1,\n backingStoreRatio = DomElement.getPrefixed(ctx, 'backingStorePixelRatio') || 1;\n this._pixelRatio = deviceRatio / backingStoreRatio;\n }\n\n View.call(this, project, canvas);\n this._needsUpdate = true;\n },\n remove: function remove() {\n this._context.restore();\n\n return remove.base.call(this);\n },\n _setElementSize: function _setElementSize(width, height) {\n var pixelRatio = this._pixelRatio;\n\n _setElementSize.base.call(this, width * pixelRatio, height * pixelRatio);\n\n if (pixelRatio !== 1) {\n var element = this._element,\n ctx = this._context;\n\n if (!PaperScope.hasAttribute(element, 'resize')) {\n var style = element.style;\n style.width = width + 'px';\n style.height = height + 'px';\n }\n\n ctx.restore();\n ctx.save();\n ctx.scale(pixelRatio, pixelRatio);\n }\n },\n getContext: function getContext() {\n return this._context;\n },\n getPixelSize: function getPixelSize(size) {\n var agent = paper.agent,\n pixels;\n\n if (agent && agent.firefox) {\n pixels = getPixelSize.base.call(this, size);\n } else {\n var ctx = this._context,\n prevFont = ctx.font;\n ctx.font = size + ' serif';\n pixels = parseFloat(ctx.font);\n ctx.font = prevFont;\n }\n\n return pixels;\n },\n getTextWidth: function getTextWidth(font, lines) {\n var ctx = this._context,\n prevFont = ctx.font,\n width = 0;\n ctx.font = font;\n\n for (var i = 0, l = lines.length; i < l; i++) {\n width = Math.max(width, ctx.measureText(lines[i]).width);\n }\n\n ctx.font = prevFont;\n return width;\n },\n update: function update() {\n if (!this._needsUpdate) return false;\n var project = this._project,\n ctx = this._context,\n size = this._viewSize;\n ctx.clearRect(0, 0, size.width + 1, size.height + 1);\n if (project) project.draw(ctx, this._matrix, this._pixelRatio);\n this._needsUpdate = false;\n return true;\n }\n });\n var Event = Base.extend({\n _class: 'Event',\n initialize: function Event(event) {\n this.event = event;\n this.type = event && event.type;\n },\n prevented: false,\n stopped: false,\n preventDefault: function preventDefault() {\n this.prevented = true;\n this.event.preventDefault();\n },\n stopPropagation: function stopPropagation() {\n this.stopped = true;\n this.event.stopPropagation();\n },\n stop: function stop() {\n this.stopPropagation();\n this.preventDefault();\n },\n getTimeStamp: function getTimeStamp() {\n return this.event.timeStamp;\n },\n getModifiers: function getModifiers() {\n return Key.modifiers;\n }\n });\n var KeyEvent = Event.extend({\n _class: 'KeyEvent',\n initialize: function KeyEvent(type, event, key, character) {\n this.type = type;\n this.event = event;\n this.key = key;\n this.character = character;\n },\n toString: function toString() {\n return \"{ type: '\" + this.type + \"', key: '\" + this.key + \"', character: '\" + this.character + \"', modifiers: \" + this.getModifiers() + \" }\";\n }\n });\n var Key = new function () {\n var keyLookup = {\n '\\t': 'tab',\n ' ': 'space',\n '\\b': 'backspace',\n '\\x7f': 'delete',\n 'Spacebar': 'space',\n 'Del': 'delete',\n 'Win': 'meta',\n 'Esc': 'escape'\n },\n charLookup = {\n 'tab': '\\t',\n 'space': ' ',\n 'enter': '\\r'\n },\n keyMap = {},\n charMap = {},\n metaFixMap,\n downKey,\n modifiers = new Base({\n shift: false,\n control: false,\n alt: false,\n meta: false,\n capsLock: false,\n space: false\n }).inject({\n option: {\n get: function get() {\n return this.alt;\n }\n },\n command: {\n get: function get() {\n var agent = paper && paper.agent;\n return agent && agent.mac ? this.meta : this.control;\n }\n }\n });\n\n function getKey(event) {\n var key = event.key || event.keyIdentifier;\n key = /^U\\+/.test(key) ? String.fromCharCode(parseInt(key.substr(2), 16)) : /^Arrow[A-Z]/.test(key) ? key.substr(5) : key === 'Unidentified' || key === undefined ? String.fromCharCode(event.keyCode) : key;\n return keyLookup[key] || (key.length > 1 ? Base.hyphenate(key) : key.toLowerCase());\n }\n\n function handleKey(down, key, character, event) {\n var type = down ? 'keydown' : 'keyup',\n view = View._focused,\n name;\n keyMap[key] = down;\n\n if (down) {\n charMap[key] = character;\n } else {\n delete charMap[key];\n }\n\n if (key.length > 1 && (name = Base.camelize(key)) in modifiers) {\n modifiers[name] = down;\n var agent = paper && paper.agent;\n\n if (name === 'meta' && agent && agent.mac) {\n if (down) {\n metaFixMap = {};\n } else {\n for (var k in metaFixMap) {\n if (k in charMap) handleKey(false, k, metaFixMap[k], event);\n }\n\n metaFixMap = null;\n }\n }\n } else if (down && metaFixMap) {\n metaFixMap[key] = character;\n }\n\n if (view) {\n view._handleKeyEvent(down ? 'keydown' : 'keyup', event, key, character);\n }\n }\n\n DomEvent.add(document, {\n keydown: function keydown(event) {\n var key = getKey(event),\n agent = paper && paper.agent;\n\n if (key.length > 1 || agent && agent.chrome && (event.altKey || agent.mac && event.metaKey || !agent.mac && event.ctrlKey)) {\n handleKey(true, key, charLookup[key] || (key.length > 1 ? '' : key), event);\n } else {\n downKey = key;\n }\n },\n keypress: function keypress(event) {\n if (downKey) {\n var key = getKey(event),\n code = event.charCode,\n character = code >= 32 ? String.fromCharCode(code) : key.length > 1 ? '' : key;\n\n if (key !== downKey) {\n key = character.toLowerCase();\n }\n\n handleKey(true, key, character, event);\n downKey = null;\n }\n },\n keyup: function keyup(event) {\n var key = getKey(event);\n if (key in charMap) handleKey(false, key, charMap[key], event);\n }\n });\n DomEvent.add(window, {\n blur: function blur(event) {\n for (var key in charMap) {\n handleKey(false, key, charMap[key], event);\n }\n }\n });\n return {\n modifiers: modifiers,\n isDown: function isDown(key) {\n return !!keyMap[key];\n }\n };\n }();\n var MouseEvent = Event.extend({\n _class: 'MouseEvent',\n initialize: function MouseEvent(type, event, point, target, delta) {\n this.type = type;\n this.event = event;\n this.point = point;\n this.target = target;\n this.delta = delta;\n },\n toString: function toString() {\n return \"{ type: '\" + this.type + \"', point: \" + this.point + ', target: ' + this.target + (this.delta ? ', delta: ' + this.delta : '') + ', modifiers: ' + this.getModifiers() + ' }';\n }\n });\n var ToolEvent = Event.extend({\n _class: 'ToolEvent',\n _item: null,\n initialize: function ToolEvent(tool, type, event) {\n this.tool = tool;\n this.type = type;\n this.event = event;\n },\n _choosePoint: function _choosePoint(point, toolPoint) {\n return point ? point : toolPoint ? toolPoint.clone() : null;\n },\n getPoint: function getPoint() {\n return this._choosePoint(this._point, this.tool._point);\n },\n setPoint: function setPoint(point) {\n this._point = point;\n },\n getLastPoint: function getLastPoint() {\n return this._choosePoint(this._lastPoint, this.tool._lastPoint);\n },\n setLastPoint: function setLastPoint(lastPoint) {\n this._lastPoint = lastPoint;\n },\n getDownPoint: function getDownPoint() {\n return this._choosePoint(this._downPoint, this.tool._downPoint);\n },\n setDownPoint: function setDownPoint(downPoint) {\n this._downPoint = downPoint;\n },\n getMiddlePoint: function getMiddlePoint() {\n if (!this._middlePoint && this.tool._lastPoint) {\n return this.tool._point.add(this.tool._lastPoint).divide(2);\n }\n\n return this._middlePoint;\n },\n setMiddlePoint: function setMiddlePoint(middlePoint) {\n this._middlePoint = middlePoint;\n },\n getDelta: function getDelta() {\n return !this._delta && this.tool._lastPoint ? this.tool._point.subtract(this.tool._lastPoint) : this._delta;\n },\n setDelta: function setDelta(delta) {\n this._delta = delta;\n },\n getCount: function getCount() {\n return this.tool[/^mouse(down|up)$/.test(this.type) ? '_downCount' : '_moveCount'];\n },\n setCount: function setCount(count) {\n this.tool[/^mouse(down|up)$/.test(this.type) ? 'downCount' : 'count'] = count;\n },\n getItem: function getItem() {\n if (!this._item) {\n var result = this.tool._scope.project.hitTest(this.getPoint());\n\n if (result) {\n var item = result.item,\n parent = item._parent;\n\n while (/^(Group|CompoundPath)$/.test(parent._class)) {\n item = parent;\n parent = parent._parent;\n }\n\n this._item = item;\n }\n }\n\n return this._item;\n },\n setItem: function setItem(item) {\n this._item = item;\n },\n toString: function toString() {\n return '{ type: ' + this.type + ', point: ' + this.getPoint() + ', count: ' + this.getCount() + ', modifiers: ' + this.getModifiers() + ' }';\n }\n });\n var Tool = PaperScopeItem.extend({\n _class: 'Tool',\n _list: 'tools',\n _reference: 'tool',\n _events: ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onMouseMove', 'onActivate', 'onDeactivate', 'onEditOptions', 'onKeyDown', 'onKeyUp'],\n initialize: function Tool(props) {\n PaperScopeItem.call(this);\n this._moveCount = -1;\n this._downCount = -1;\n this.set(props);\n },\n getMinDistance: function getMinDistance() {\n return this._minDistance;\n },\n setMinDistance: function setMinDistance(minDistance) {\n this._minDistance = minDistance;\n\n if (minDistance != null && this._maxDistance != null && minDistance > this._maxDistance) {\n this._maxDistance = minDistance;\n }\n },\n getMaxDistance: function getMaxDistance() {\n return this._maxDistance;\n },\n setMaxDistance: function setMaxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n\n if (this._minDistance != null && maxDistance != null && maxDistance < this._minDistance) {\n this._minDistance = maxDistance;\n }\n },\n getFixedDistance: function getFixedDistance() {\n return this._minDistance == this._maxDistance ? this._minDistance : null;\n },\n setFixedDistance: function setFixedDistance(distance) {\n this._minDistance = this._maxDistance = distance;\n },\n _handleMouseEvent: function _handleMouseEvent(type, event, point, mouse) {\n paper = this._scope;\n if (mouse.drag && !this.responds(type)) type = 'mousemove';\n var move = mouse.move || mouse.drag,\n responds = this.responds(type),\n minDistance = this.minDistance,\n maxDistance = this.maxDistance,\n called = false,\n tool = this;\n\n function update(minDistance, maxDistance) {\n var pt = point,\n toolPoint = move ? tool._point : tool._downPoint || pt;\n\n if (move) {\n if (tool._moveCount >= 0 && pt.equals(toolPoint)) {\n return false;\n }\n\n if (toolPoint && (minDistance != null || maxDistance != null)) {\n var vector = pt.subtract(toolPoint),\n distance = vector.getLength();\n if (distance < (minDistance || 0)) return false;\n\n if (maxDistance) {\n pt = toolPoint.add(vector.normalize(Math.min(distance, maxDistance)));\n }\n }\n\n tool._moveCount++;\n }\n\n tool._point = pt;\n tool._lastPoint = toolPoint || pt;\n\n if (mouse.down) {\n tool._moveCount = -1;\n tool._downPoint = pt;\n tool._downCount++;\n }\n\n return true;\n }\n\n function emit() {\n if (responds) {\n called = tool.emit(type, new ToolEvent(tool, type, event)) || called;\n }\n }\n\n if (mouse.down) {\n update();\n emit();\n } else if (mouse.up) {\n update(null, maxDistance);\n emit();\n } else if (responds) {\n while (update(minDistance, maxDistance)) {\n emit();\n }\n }\n\n return called;\n }\n });\n var Tween = Base.extend(Emitter, {\n _class: 'Tween',\n statics: {\n easings: new Base({\n linear: function linear(t) {\n return t;\n },\n easeInQuad: function easeInQuad(t) {\n return t * t;\n },\n easeOutQuad: function easeOutQuad(t) {\n return t * (2 - t);\n },\n easeInOutQuad: function easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + 2 * (2 - t) * t;\n },\n easeInCubic: function easeInCubic(t) {\n return t * t * t;\n },\n easeOutCubic: function easeOutCubic(t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function easeInOutCubic(t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function easeInQuart(t) {\n return t * t * t * t;\n },\n easeOutQuart: function easeOutQuart(t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function easeInOutQuart(t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function easeInQuint(t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function easeOutQuint(t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function easeInOutQuint(t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n }\n })\n },\n initialize: function Tween(object, from, to, duration, easing, start) {\n this.object = object;\n var type = typeof easing;\n var isFunction = type === 'function';\n this.type = isFunction ? type : type === 'string' ? easing : 'linear';\n this.easing = isFunction ? easing : Tween.easings[this.type];\n this.duration = duration;\n this.running = false;\n this._then = null;\n this._startTime = null;\n var state = from || to;\n this._keys = state ? Object.keys(state) : [];\n this._parsedKeys = this._parseKeys(this._keys);\n this._from = state && this._getState(from);\n this._to = state && this._getState(to);\n\n if (start !== false) {\n this.start();\n }\n },\n then: function then(_then) {\n this._then = _then;\n return this;\n },\n start: function start() {\n this._startTime = null;\n this.running = true;\n return this;\n },\n stop: function stop() {\n this.running = false;\n return this;\n },\n update: function update(progress) {\n if (this.running) {\n if (progress >= 1) {\n progress = 1;\n this.running = false;\n }\n\n var factor = this.easing(progress),\n keys = this._keys,\n getValue = function getValue(value) {\n return typeof value === 'function' ? value(factor, progress) : value;\n };\n\n for (var i = 0, l = keys && keys.length; i < l; i++) {\n var key = keys[i],\n from = getValue(this._from[key]),\n to = getValue(this._to[key]),\n value = from && to && from.__add && to.__add ? to.__subtract(from).__multiply(factor).__add(from) : (to - from) * factor + from;\n\n this._setProperty(this._parsedKeys[key], value);\n }\n\n if (this.responds('update')) {\n this.emit('update', new Base({\n progress: progress,\n factor: factor\n }));\n }\n\n if (!this.running && this._then) {\n this._then(this.object);\n }\n }\n\n return this;\n },\n _events: {\n onUpdate: {}\n },\n _handleFrame: function _handleFrame(time) {\n var startTime = this._startTime,\n progress = startTime ? (time - startTime) / this.duration : 0;\n\n if (!startTime) {\n this._startTime = time;\n }\n\n this.update(progress);\n },\n _getState: function _getState(state) {\n var keys = this._keys,\n result = {};\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i],\n path = this._parsedKeys[key],\n current = this._getProperty(path),\n value;\n\n if (state) {\n var resolved = this._resolveValue(current, state[key]);\n\n this._setProperty(path, resolved);\n\n value = this._getProperty(path);\n value = value && value.clone ? value.clone() : value;\n\n this._setProperty(path, current);\n } else {\n value = current && current.clone ? current.clone() : current;\n }\n\n result[key] = value;\n }\n\n return result;\n },\n _resolveValue: function _resolveValue(current, value) {\n if (value) {\n if (Array.isArray(value) && value.length === 2) {\n var operator = value[0];\n return operator && operator.match && operator.match(/^[+\\-\\*\\/]=/) ? this._calculate(current, operator[0], value[1]) : value;\n } else if (typeof value === 'string') {\n var match = value.match(/^[+\\-*/]=(.*)/);\n\n if (match) {\n var parsed = JSON.parse(match[1].replace(/(['\"])?([a-zA-Z0-9_]+)(['\"])?:/g, '\"$2\": '));\n return this._calculate(current, value[0], parsed);\n }\n }\n }\n\n return value;\n },\n _calculate: function _calculate(left, operator, right) {\n return paper.PaperScript.calculateBinary(left, operator, right);\n },\n _parseKeys: function _parseKeys(keys) {\n var parsed = {};\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i],\n path = key.replace(/\\.([^.]*)/g, '/$1').replace(/\\[['\"]?([^'\"\\]]*)['\"]?\\]/g, '/$1');\n parsed[key] = path.split('/');\n }\n\n return parsed;\n },\n _getProperty: function _getProperty(path, offset) {\n var obj = this.object;\n\n for (var i = 0, l = path.length - (offset || 0); i < l && obj; i++) {\n obj = obj[path[i]];\n }\n\n return obj;\n },\n _setProperty: function _setProperty(path, value) {\n var dest = this._getProperty(path, 1);\n\n if (dest) {\n dest[path[path.length - 1]] = value;\n }\n }\n });\n var Http = {\n request: function request(options) {\n var xhr = new self.XMLHttpRequest();\n xhr.open((options.method || 'get').toUpperCase(), options.url, Base.pick(options.async, true));\n if (options.mimeType) xhr.overrideMimeType(options.mimeType);\n\n xhr.onload = function () {\n var status = xhr.status;\n\n if (status === 0 || status === 200) {\n if (options.onLoad) {\n options.onLoad.call(xhr, xhr.responseText);\n }\n } else {\n xhr.onerror();\n }\n };\n\n xhr.onerror = function () {\n var status = xhr.status,\n message = 'Could not load \"' + options.url + '\" (Status: ' + status + ')';\n\n if (options.onError) {\n options.onError(message, status);\n } else {\n throw new Error(message);\n }\n };\n\n return xhr.send(null);\n }\n };\n var CanvasProvider = Base.exports.CanvasProvider = {\n canvases: [],\n getCanvas: function getCanvas(width, height) {\n if (!window) return null;\n var canvas,\n clear = true;\n\n if (typeof width === 'object') {\n height = width.height;\n width = width.width;\n }\n\n if (this.canvases.length) {\n canvas = this.canvases.pop();\n } else {\n canvas = document.createElement('canvas');\n clear = false;\n }\n\n var ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Canvas ' + canvas + ' is unable to provide a 2D context.');\n }\n\n if (canvas.width === width && canvas.height === height) {\n if (clear) ctx.clearRect(0, 0, width + 1, height + 1);\n } else {\n canvas.width = width;\n canvas.height = height;\n }\n\n ctx.save();\n return canvas;\n },\n getContext: function getContext(width, height) {\n var canvas = this.getCanvas(width, height);\n return canvas ? canvas.getContext('2d') : null;\n },\n release: function release(obj) {\n var canvas = obj && obj.canvas ? obj.canvas : obj;\n\n if (canvas && canvas.getContext) {\n canvas.getContext('2d').restore();\n this.canvases.push(canvas);\n }\n }\n };\n var BlendMode = new function () {\n var min = Math.min,\n max = Math.max,\n abs = Math.abs,\n sr,\n sg,\n sb,\n sa,\n br,\n bg,\n bb,\n ba,\n dr,\n dg,\n db;\n\n function getLum(r, g, b) {\n return 0.2989 * r + 0.587 * g + 0.114 * b;\n }\n\n function setLum(r, g, b, l) {\n var d = l - getLum(r, g, b);\n dr = r + d;\n dg = g + d;\n db = b + d;\n var l = getLum(dr, dg, db),\n mn = min(dr, dg, db),\n mx = max(dr, dg, db);\n\n if (mn < 0) {\n var lmn = l - mn;\n dr = l + (dr - l) * l / lmn;\n dg = l + (dg - l) * l / lmn;\n db = l + (db - l) * l / lmn;\n }\n\n if (mx > 255) {\n var ln = 255 - l,\n mxl = mx - l;\n dr = l + (dr - l) * ln / mxl;\n dg = l + (dg - l) * ln / mxl;\n db = l + (db - l) * ln / mxl;\n }\n }\n\n function getSat(r, g, b) {\n return max(r, g, b) - min(r, g, b);\n }\n\n function setSat(r, g, b, s) {\n var col = [r, g, b],\n mx = max(r, g, b),\n mn = min(r, g, b),\n md;\n mn = mn === r ? 0 : mn === g ? 1 : 2;\n mx = mx === r ? 0 : mx === g ? 1 : 2;\n md = min(mn, mx) === 0 ? max(mn, mx) === 1 ? 2 : 1 : 0;\n\n if (col[mx] > col[mn]) {\n col[md] = (col[md] - col[mn]) * s / (col[mx] - col[mn]);\n col[mx] = s;\n } else {\n col[md] = col[mx] = 0;\n }\n\n col[mn] = 0;\n dr = col[0];\n dg = col[1];\n db = col[2];\n }\n\n var modes = {\n multiply: function multiply() {\n dr = br * sr / 255;\n dg = bg * sg / 255;\n db = bb * sb / 255;\n },\n screen: function screen() {\n dr = br + sr - br * sr / 255;\n dg = bg + sg - bg * sg / 255;\n db = bb + sb - bb * sb / 255;\n },\n overlay: function overlay() {\n dr = br < 128 ? 2 * br * sr / 255 : 255 - 2 * (255 - br) * (255 - sr) / 255;\n dg = bg < 128 ? 2 * bg * sg / 255 : 255 - 2 * (255 - bg) * (255 - sg) / 255;\n db = bb < 128 ? 2 * bb * sb / 255 : 255 - 2 * (255 - bb) * (255 - sb) / 255;\n },\n 'soft-light': function softLight() {\n var t = sr * br / 255;\n dr = t + br * (255 - (255 - br) * (255 - sr) / 255 - t) / 255;\n t = sg * bg / 255;\n dg = t + bg * (255 - (255 - bg) * (255 - sg) / 255 - t) / 255;\n t = sb * bb / 255;\n db = t + bb * (255 - (255 - bb) * (255 - sb) / 255 - t) / 255;\n },\n 'hard-light': function hardLight() {\n dr = sr < 128 ? 2 * sr * br / 255 : 255 - 2 * (255 - sr) * (255 - br) / 255;\n dg = sg < 128 ? 2 * sg * bg / 255 : 255 - 2 * (255 - sg) * (255 - bg) / 255;\n db = sb < 128 ? 2 * sb * bb / 255 : 255 - 2 * (255 - sb) * (255 - bb) / 255;\n },\n 'color-dodge': function colorDodge() {\n dr = br === 0 ? 0 : sr === 255 ? 255 : min(255, 255 * br / (255 - sr));\n dg = bg === 0 ? 0 : sg === 255 ? 255 : min(255, 255 * bg / (255 - sg));\n db = bb === 0 ? 0 : sb === 255 ? 255 : min(255, 255 * bb / (255 - sb));\n },\n 'color-burn': function colorBurn() {\n dr = br === 255 ? 255 : sr === 0 ? 0 : max(0, 255 - (255 - br) * 255 / sr);\n dg = bg === 255 ? 255 : sg === 0 ? 0 : max(0, 255 - (255 - bg) * 255 / sg);\n db = bb === 255 ? 255 : sb === 0 ? 0 : max(0, 255 - (255 - bb) * 255 / sb);\n },\n darken: function darken() {\n dr = br < sr ? br : sr;\n dg = bg < sg ? bg : sg;\n db = bb < sb ? bb : sb;\n },\n lighten: function lighten() {\n dr = br > sr ? br : sr;\n dg = bg > sg ? bg : sg;\n db = bb > sb ? bb : sb;\n },\n difference: function difference() {\n dr = br - sr;\n if (dr < 0) dr = -dr;\n dg = bg - sg;\n if (dg < 0) dg = -dg;\n db = bb - sb;\n if (db < 0) db = -db;\n },\n exclusion: function exclusion() {\n dr = br + sr * (255 - br - br) / 255;\n dg = bg + sg * (255 - bg - bg) / 255;\n db = bb + sb * (255 - bb - bb) / 255;\n },\n hue: function hue() {\n setSat(sr, sg, sb, getSat(br, bg, bb));\n setLum(dr, dg, db, getLum(br, bg, bb));\n },\n saturation: function saturation() {\n setSat(br, bg, bb, getSat(sr, sg, sb));\n setLum(dr, dg, db, getLum(br, bg, bb));\n },\n luminosity: function luminosity() {\n setLum(br, bg, bb, getLum(sr, sg, sb));\n },\n color: function color() {\n setLum(sr, sg, sb, getLum(br, bg, bb));\n },\n add: function add() {\n dr = min(br + sr, 255);\n dg = min(bg + sg, 255);\n db = min(bb + sb, 255);\n },\n subtract: function subtract() {\n dr = max(br - sr, 0);\n dg = max(bg - sg, 0);\n db = max(bb - sb, 0);\n },\n average: function average() {\n dr = (br + sr) / 2;\n dg = (bg + sg) / 2;\n db = (bb + sb) / 2;\n },\n negation: function negation() {\n dr = 255 - abs(255 - sr - br);\n dg = 255 - abs(255 - sg - bg);\n db = 255 - abs(255 - sb - bb);\n }\n };\n var nativeModes = this.nativeModes = Base.each(['source-over', 'source-in', 'source-out', 'source-atop', 'destination-over', 'destination-in', 'destination-out', 'destination-atop', 'lighter', 'darker', 'copy', 'xor'], function (mode) {\n this[mode] = true;\n }, {});\n var ctx = CanvasProvider.getContext(1, 1);\n\n if (ctx) {\n Base.each(modes, function (func, mode) {\n var darken = mode === 'darken',\n ok = false;\n ctx.save();\n\n try {\n ctx.fillStyle = darken ? '#300' : '#a00';\n ctx.fillRect(0, 0, 1, 1);\n ctx.globalCompositeOperation = mode;\n\n if (ctx.globalCompositeOperation === mode) {\n ctx.fillStyle = darken ? '#a00' : '#300';\n ctx.fillRect(0, 0, 1, 1);\n ok = ctx.getImageData(0, 0, 1, 1).data[0] !== darken ? 170 : 51;\n }\n } catch (e) {}\n\n ctx.restore();\n nativeModes[mode] = ok;\n });\n CanvasProvider.release(ctx);\n }\n\n this.process = function (mode, srcContext, dstContext, alpha, offset) {\n var srcCanvas = srcContext.canvas,\n normal = mode === 'normal';\n\n if (normal || nativeModes[mode]) {\n dstContext.save();\n dstContext.setTransform(1, 0, 0, 1, 0, 0);\n dstContext.globalAlpha = alpha;\n if (!normal) dstContext.globalCompositeOperation = mode;\n dstContext.drawImage(srcCanvas, offset.x, offset.y);\n dstContext.restore();\n } else {\n var process = modes[mode];\n if (!process) return;\n var dstData = dstContext.getImageData(offset.x, offset.y, srcCanvas.width, srcCanvas.height),\n dst = dstData.data,\n src = srcContext.getImageData(0, 0, srcCanvas.width, srcCanvas.height).data;\n\n for (var i = 0, l = dst.length; i < l; i += 4) {\n sr = src[i];\n br = dst[i];\n sg = src[i + 1];\n bg = dst[i + 1];\n sb = src[i + 2];\n bb = dst[i + 2];\n sa = src[i + 3];\n ba = dst[i + 3];\n process();\n var a1 = sa * alpha / 255,\n a2 = 1 - a1;\n dst[i] = a1 * dr + a2 * br;\n dst[i + 1] = a1 * dg + a2 * bg;\n dst[i + 2] = a1 * db + a2 * bb;\n dst[i + 3] = sa * alpha + a2 * ba;\n }\n\n dstContext.putImageData(dstData, offset.x, offset.y);\n }\n };\n }();\n var SvgElement = new function () {\n var svg = 'http://www.w3.org/2000/svg',\n xmlns = 'http://www.w3.org/2000/xmlns',\n xlink = 'http://www.w3.org/1999/xlink',\n attributeNamespace = {\n href: xlink,\n xlink: xmlns,\n xmlns: xmlns + '/',\n 'xmlns:xlink': xmlns + '/'\n };\n\n function create(tag, attributes, formatter) {\n return set(document.createElementNS(svg, tag), attributes, formatter);\n }\n\n function get(node, name) {\n var namespace = attributeNamespace[name],\n value = namespace ? node.getAttributeNS(namespace, name) : node.getAttribute(name);\n return value === 'null' ? null : value;\n }\n\n function set(node, attributes, formatter) {\n for (var name in attributes) {\n var value = attributes[name],\n namespace = attributeNamespace[name];\n if (typeof value === 'number' && formatter) value = formatter.number(value);\n\n if (namespace) {\n node.setAttributeNS(namespace, name, value);\n } else {\n node.setAttribute(name, value);\n }\n }\n\n return node;\n }\n\n return {\n svg: svg,\n xmlns: xmlns,\n xlink: xlink,\n create: create,\n get: get,\n set: set\n };\n }();\n var SvgStyles = Base.each({\n fillColor: ['fill', 'color'],\n fillRule: ['fill-rule', 'string'],\n strokeColor: ['stroke', 'color'],\n strokeWidth: ['stroke-width', 'number'],\n strokeCap: ['stroke-linecap', 'string'],\n strokeJoin: ['stroke-linejoin', 'string'],\n strokeScaling: ['vector-effect', 'lookup', {\n true: 'none',\n false: 'non-scaling-stroke'\n }, function (item, value) {\n return !value && (item instanceof PathItem || item instanceof Shape || item instanceof TextItem);\n }],\n miterLimit: ['stroke-miterlimit', 'number'],\n dashArray: ['stroke-dasharray', 'array'],\n dashOffset: ['stroke-dashoffset', 'number'],\n fontFamily: ['font-family', 'string'],\n fontWeight: ['font-weight', 'string'],\n fontSize: ['font-size', 'number'],\n justification: ['text-anchor', 'lookup', {\n left: 'start',\n center: 'middle',\n right: 'end'\n }],\n opacity: ['opacity', 'number'],\n blendMode: ['mix-blend-mode', 'style']\n }, function (entry, key) {\n var part = Base.capitalize(key),\n lookup = entry[2];\n this[key] = {\n type: entry[1],\n property: key,\n attribute: entry[0],\n toSVG: lookup,\n fromSVG: lookup && Base.each(lookup, function (value, name) {\n this[value] = name;\n }, {}),\n exportFilter: entry[3],\n get: 'get' + part,\n set: 'set' + part\n };\n }, {});\n new function () {\n var formatter;\n\n function getTransform(matrix, coordinates, center) {\n var attrs = new Base(),\n trans = matrix.getTranslation();\n\n if (coordinates) {\n var point;\n\n if (matrix.isInvertible()) {\n matrix = matrix._shiftless();\n point = matrix._inverseTransform(trans);\n trans = null;\n } else {\n point = new Point();\n }\n\n attrs[center ? 'cx' : 'x'] = point.x;\n attrs[center ? 'cy' : 'y'] = point.y;\n }\n\n if (!matrix.isIdentity()) {\n var decomposed = matrix.decompose();\n\n if (decomposed) {\n var parts = [],\n angle = decomposed.rotation,\n scale = decomposed.scaling,\n skew = decomposed.skewing;\n if (trans && !trans.isZero()) parts.push('translate(' + formatter.point(trans) + ')');\n if (angle) parts.push('rotate(' + formatter.number(angle) + ')');\n if (!Numerical.isZero(scale.x - 1) || !Numerical.isZero(scale.y - 1)) parts.push('scale(' + formatter.point(scale) + ')');\n if (skew.x) parts.push('skewX(' + formatter.number(skew.x) + ')');\n if (skew.y) parts.push('skewY(' + formatter.number(skew.y) + ')');\n attrs.transform = parts.join(' ');\n } else {\n attrs.transform = 'matrix(' + matrix.getValues().join(',') + ')';\n }\n }\n\n return attrs;\n }\n\n function exportGroup(item, options) {\n var attrs = getTransform(item._matrix),\n children = item._children;\n var node = SvgElement.create('g', attrs, formatter);\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n\n var childNode = _exportSVG(child, options);\n\n if (childNode) {\n if (child.isClipMask()) {\n var clip = SvgElement.create('clipPath');\n clip.appendChild(childNode);\n setDefinition(child, clip, 'clip');\n SvgElement.set(node, {\n 'clip-path': 'url(#' + clip.id + ')'\n });\n } else {\n node.appendChild(childNode);\n }\n }\n }\n\n return node;\n }\n\n function exportRaster(item, options) {\n var attrs = getTransform(item._matrix, true),\n size = item.getSize(),\n image = item.getImage();\n attrs.x -= size.width / 2;\n attrs.y -= size.height / 2;\n attrs.width = size.width;\n attrs.height = size.height;\n attrs.href = options.embedImages == false && image && image.src || item.toDataURL();\n return SvgElement.create('image', attrs, formatter);\n }\n\n function exportPath(item, options) {\n var matchShapes = options.matchShapes;\n\n if (matchShapes) {\n var shape = item.toShape(false);\n if (shape) return exportShape(shape, options);\n }\n\n var segments = item._segments,\n length = segments.length,\n type,\n attrs = getTransform(item._matrix);\n\n if (matchShapes && length >= 2 && !item.hasHandles()) {\n if (length > 2) {\n type = item._closed ? 'polygon' : 'polyline';\n var parts = [];\n\n for (var i = 0; i < length; i++) {\n parts.push(formatter.point(segments[i]._point));\n }\n\n attrs.points = parts.join(' ');\n } else {\n type = 'line';\n var start = segments[0]._point,\n end = segments[1]._point;\n attrs.set({\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y\n });\n }\n } else {\n type = 'path';\n attrs.d = item.getPathData(null, options.precision);\n }\n\n return SvgElement.create(type, attrs, formatter);\n }\n\n function exportShape(item) {\n var type = item._type,\n radius = item._radius,\n attrs = getTransform(item._matrix, true, type !== 'rectangle');\n\n if (type === 'rectangle') {\n type = 'rect';\n var size = item._size,\n width = size.width,\n height = size.height;\n attrs.x -= width / 2;\n attrs.y -= height / 2;\n attrs.width = width;\n attrs.height = height;\n if (radius.isZero()) radius = null;\n }\n\n if (radius) {\n if (type === 'circle') {\n attrs.r = radius;\n } else {\n attrs.rx = radius.width;\n attrs.ry = radius.height;\n }\n }\n\n return SvgElement.create(type, attrs, formatter);\n }\n\n function exportCompoundPath(item, options) {\n var attrs = getTransform(item._matrix);\n var data = item.getPathData(null, options.precision);\n if (data) attrs.d = data;\n return SvgElement.create('path', attrs, formatter);\n }\n\n function exportSymbolItem(item, options) {\n var attrs = getTransform(item._matrix, true),\n definition = item._definition,\n node = getDefinition(definition, 'symbol'),\n definitionItem = definition._item,\n bounds = definitionItem.getStrokeBounds();\n\n if (!node) {\n node = SvgElement.create('symbol', {\n viewBox: formatter.rectangle(bounds)\n });\n node.appendChild(_exportSVG(definitionItem, options));\n setDefinition(definition, node, 'symbol');\n }\n\n attrs.href = '#' + node.id;\n attrs.x += bounds.x;\n attrs.y += bounds.y;\n attrs.width = bounds.width;\n attrs.height = bounds.height;\n attrs.overflow = 'visible';\n return SvgElement.create('use', attrs, formatter);\n }\n\n function exportGradient(color) {\n var gradientNode = getDefinition(color, 'color');\n\n if (!gradientNode) {\n var gradient = color.getGradient(),\n radial = gradient._radial,\n origin = color.getOrigin(),\n destination = color.getDestination(),\n attrs;\n\n if (radial) {\n attrs = {\n cx: origin.x,\n cy: origin.y,\n r: origin.getDistance(destination)\n };\n var highlight = color.getHighlight();\n\n if (highlight) {\n attrs.fx = highlight.x;\n attrs.fy = highlight.y;\n }\n } else {\n attrs = {\n x1: origin.x,\n y1: origin.y,\n x2: destination.x,\n y2: destination.y\n };\n }\n\n attrs.gradientUnits = 'userSpaceOnUse';\n gradientNode = SvgElement.create((radial ? 'radial' : 'linear') + 'Gradient', attrs, formatter);\n var stops = gradient._stops;\n\n for (var i = 0, l = stops.length; i < l; i++) {\n var stop = stops[i],\n stopColor = stop._color,\n alpha = stopColor.getAlpha(),\n offset = stop._offset;\n attrs = {\n offset: offset == null ? i / (l - 1) : offset\n };\n if (stopColor) attrs['stop-color'] = stopColor.toCSS(true);\n if (alpha < 1) attrs['stop-opacity'] = alpha;\n gradientNode.appendChild(SvgElement.create('stop', attrs, formatter));\n }\n\n setDefinition(color, gradientNode, 'color');\n }\n\n return 'url(#' + gradientNode.id + ')';\n }\n\n function exportText(item) {\n var node = SvgElement.create('text', getTransform(item._matrix, true), formatter);\n node.textContent = item._content;\n return node;\n }\n\n var exporters = {\n Group: exportGroup,\n Layer: exportGroup,\n Raster: exportRaster,\n Path: exportPath,\n Shape: exportShape,\n CompoundPath: exportCompoundPath,\n SymbolItem: exportSymbolItem,\n PointText: exportText\n };\n\n function applyStyle(item, node, isRoot) {\n var attrs = {},\n parent = !isRoot && item.getParent(),\n style = [];\n if (item._name != null) attrs.id = item._name;\n Base.each(SvgStyles, function (entry) {\n var get = entry.get,\n type = entry.type,\n value = item[get]();\n\n if (entry.exportFilter ? entry.exportFilter(item, value) : !parent || !Base.equals(parent[get](), value)) {\n if (type === 'color' && value != null) {\n var alpha = value.getAlpha();\n if (alpha < 1) attrs[entry.attribute + '-opacity'] = alpha;\n }\n\n if (type === 'style') {\n style.push(entry.attribute + ': ' + value);\n } else {\n attrs[entry.attribute] = value == null ? 'none' : type === 'color' ? value.gradient ? exportGradient(value, item) : value.toCSS(true) : type === 'array' ? value.join(',') : type === 'lookup' ? entry.toSVG[value] : value;\n }\n }\n });\n if (style.length) attrs.style = style.join(';');\n if (attrs.opacity === 1) delete attrs.opacity;\n if (!item._visible) attrs.visibility = 'hidden';\n return SvgElement.set(node, attrs, formatter);\n }\n\n var definitions;\n\n function getDefinition(item, type) {\n if (!definitions) definitions = {\n ids: {},\n svgs: {}\n };\n return item && definitions.svgs[type + '-' + (item._id || item.__id || (item.__id = UID.get('svg')))];\n }\n\n function setDefinition(item, node, type) {\n if (!definitions) getDefinition();\n var typeId = definitions.ids[type] = (definitions.ids[type] || 0) + 1;\n node.id = type + '-' + typeId;\n definitions.svgs[type + '-' + (item._id || item.__id)] = node;\n }\n\n function exportDefinitions(node, options) {\n var svg = node,\n defs = null;\n\n if (definitions) {\n svg = node.nodeName.toLowerCase() === 'svg' && node;\n\n for (var i in definitions.svgs) {\n if (!defs) {\n if (!svg) {\n svg = SvgElement.create('svg');\n svg.appendChild(node);\n }\n\n defs = svg.insertBefore(SvgElement.create('defs'), svg.firstChild);\n }\n\n defs.appendChild(definitions.svgs[i]);\n }\n\n definitions = null;\n }\n\n return options.asString ? new self.XMLSerializer().serializeToString(svg) : svg;\n }\n\n function _exportSVG(item, options, isRoot) {\n var exporter = exporters[item._class],\n node = exporter && exporter(item, options);\n\n if (node) {\n var onExport = options.onExport;\n if (onExport) node = onExport(item, node, options) || node;\n var data = JSON.stringify(item._data);\n if (data && data !== '{}' && data !== 'null') node.setAttribute('data-paper-data', data);\n }\n\n return node && applyStyle(item, node, isRoot);\n }\n\n function setOptions(options) {\n if (!options) options = {};\n formatter = new Formatter(options.precision);\n return options;\n }\n\n Item.inject({\n exportSVG: function exportSVG(options) {\n options = setOptions(options);\n return exportDefinitions(_exportSVG(this, options, true), options);\n }\n });\n Project.inject({\n exportSVG: function exportSVG(options) {\n options = setOptions(options);\n var children = this._children,\n view = this.getView(),\n bounds = Base.pick(options.bounds, 'view'),\n mx = options.matrix || bounds === 'view' && view._matrix,\n matrix = mx && Matrix.read([mx]),\n rect = bounds === 'view' ? new _Rectangle([0, 0], view.getViewSize()) : bounds === 'content' ? Item._getBounds(children, matrix, {\n stroke: true\n }).rect : _Rectangle.read([bounds], 0, {\n readNull: true\n }),\n attrs = {\n version: '1.1',\n xmlns: SvgElement.svg,\n 'xmlns:xlink': SvgElement.xlink\n };\n\n if (rect) {\n attrs.width = rect.width;\n attrs.height = rect.height;\n if (rect.x || rect.x === 0 || rect.y || rect.y === 0) attrs.viewBox = formatter.rectangle(rect);\n }\n\n var node = SvgElement.create('svg', attrs, formatter),\n parent = node;\n\n if (matrix && !matrix.isIdentity()) {\n parent = node.appendChild(SvgElement.create('g', getTransform(matrix), formatter));\n }\n\n for (var i = 0, l = children.length; i < l; i++) {\n parent.appendChild(_exportSVG(children[i], options, true));\n }\n\n return exportDefinitions(node, options);\n }\n });\n }();\n new function () {\n var definitions = {},\n rootSize;\n\n function getValue(node, name, isString, allowNull, allowPercent, defaultValue) {\n var value = SvgElement.get(node, name) || defaultValue,\n res = value == null ? allowNull ? null : isString ? '' : 0 : isString ? value : parseFloat(value);\n return /%\\s*$/.test(value) ? res / 100 * (allowPercent ? 1 : rootSize[/x|^width/.test(name) ? 'width' : 'height']) : res;\n }\n\n function getPoint(node, x, y, allowNull, allowPercent, defaultX, defaultY) {\n x = getValue(node, x || 'x', false, allowNull, allowPercent, defaultX);\n y = getValue(node, y || 'y', false, allowNull, allowPercent, defaultY);\n return allowNull && (x == null || y == null) ? null : new Point(x, y);\n }\n\n function getSize(node, w, h, allowNull, allowPercent) {\n w = getValue(node, w || 'width', false, allowNull, allowPercent);\n h = getValue(node, h || 'height', false, allowNull, allowPercent);\n return allowNull && (w == null || h == null) ? null : new Size(w, h);\n }\n\n function convertValue(value, type, lookup) {\n return value === 'none' ? null : type === 'number' ? parseFloat(value) : type === 'array' ? value ? value.split(/[\\s,]+/g).map(parseFloat) : [] : type === 'color' ? getDefinition(value) || value : type === 'lookup' ? lookup[value] : value;\n }\n\n function importGroup(node, type, options, isRoot) {\n var nodes = node.childNodes,\n isClip = type === 'clippath',\n isDefs = type === 'defs',\n item = new Group(),\n project = item._project,\n currentStyle = project._currentStyle,\n children = [];\n\n if (!isClip && !isDefs) {\n item = applyAttributes(item, node, isRoot);\n project._currentStyle = item._style.clone();\n }\n\n if (isRoot) {\n var defs = node.querySelectorAll('defs');\n\n for (var i = 0, l = defs.length; i < l; i++) {\n importNode(defs[i], options, false);\n }\n }\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var childNode = nodes[i],\n child;\n if (childNode.nodeType === 1 && !/^defs$/i.test(childNode.nodeName) && (child = importNode(childNode, options, false)) && !(child instanceof SymbolDefinition)) children.push(child);\n }\n\n item.addChildren(children);\n if (isClip) item = applyAttributes(item.reduce(), node, isRoot);\n project._currentStyle = currentStyle;\n\n if (isClip || isDefs) {\n item.remove();\n item = null;\n }\n\n return item;\n }\n\n function importPoly(node, type) {\n var coords = node.getAttribute('points').match(/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g),\n points = [];\n\n for (var i = 0, l = coords.length; i < l; i += 2) {\n points.push(new Point(parseFloat(coords[i]), parseFloat(coords[i + 1])));\n }\n\n var path = new Path(points);\n if (type === 'polygon') path.closePath();\n return path;\n }\n\n function importPath(node) {\n return PathItem.create(node.getAttribute('d'));\n }\n\n function importGradient(node, type) {\n var id = (getValue(node, 'href', true) || '').substring(1),\n radial = type === 'radialgradient',\n gradient;\n\n if (id) {\n gradient = definitions[id].getGradient();\n\n if (gradient._radial ^ radial) {\n gradient = gradient.clone();\n gradient._radial = radial;\n }\n } else {\n var nodes = node.childNodes,\n stops = [];\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var child = nodes[i];\n if (child.nodeType === 1) stops.push(applyAttributes(new GradientStop(), child));\n }\n\n gradient = new Gradient(stops, radial);\n }\n\n var origin,\n destination,\n highlight,\n scaleToBounds = getValue(node, 'gradientUnits', true) !== 'userSpaceOnUse';\n\n if (radial) {\n origin = getPoint(node, 'cx', 'cy', false, scaleToBounds, '50%', '50%');\n destination = origin.add(getValue(node, 'r', false, false, scaleToBounds, '50%'), 0);\n highlight = getPoint(node, 'fx', 'fy', true, scaleToBounds);\n } else {\n origin = getPoint(node, 'x1', 'y1', false, scaleToBounds, '0%', '0%');\n destination = getPoint(node, 'x2', 'y2', false, scaleToBounds, '100%', '0%');\n }\n\n var color = applyAttributes(new Color(gradient, origin, destination, highlight), node);\n color._scaleToBounds = scaleToBounds;\n return null;\n }\n\n var importers = {\n '#document': function document(node, type, options, isRoot) {\n var nodes = node.childNodes;\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var child = nodes[i];\n if (child.nodeType === 1) return importNode(child, options, isRoot);\n }\n },\n g: importGroup,\n svg: importGroup,\n clippath: importGroup,\n polygon: importPoly,\n polyline: importPoly,\n path: importPath,\n lineargradient: importGradient,\n radialgradient: importGradient,\n image: function image(node) {\n var raster = new Raster(getValue(node, 'href', true));\n raster.on('load', function () {\n var size = getSize(node);\n this.setSize(size);\n var center = getPoint(node).add(size.divide(2));\n\n this._matrix.append(new Matrix().translate(center));\n });\n return raster;\n },\n symbol: function symbol(node, type, options, isRoot) {\n return new SymbolDefinition(importGroup(node, type, options, isRoot), true);\n },\n defs: importGroup,\n use: function use(node) {\n var id = (getValue(node, 'href', true) || '').substring(1),\n definition = definitions[id],\n point = getPoint(node);\n return definition ? definition instanceof SymbolDefinition ? definition.place(point) : definition.clone().translate(point) : null;\n },\n circle: function circle(node) {\n return new Shape.Circle(getPoint(node, 'cx', 'cy'), getValue(node, 'r'));\n },\n ellipse: function ellipse(node) {\n return new Shape.Ellipse({\n center: getPoint(node, 'cx', 'cy'),\n radius: getSize(node, 'rx', 'ry')\n });\n },\n rect: function rect(node) {\n return new Shape.Rectangle(new _Rectangle(getPoint(node), getSize(node)), getSize(node, 'rx', 'ry'));\n },\n line: function line(node) {\n return new Path.Line(getPoint(node, 'x1', 'y1'), getPoint(node, 'x2', 'y2'));\n },\n text: function text(node) {\n var text = new PointText(getPoint(node).add(getPoint(node, 'dx', 'dy')));\n text.setContent(node.textContent.trim() || '');\n return text;\n },\n switch: importGroup\n };\n\n function applyTransform(item, value, name, node) {\n if (item.transform) {\n var transforms = (node.getAttribute(name) || '').split(/\\)\\s*/g),\n matrix = new Matrix();\n\n for (var i = 0, l = transforms.length; i < l; i++) {\n var transform = transforms[i];\n if (!transform) break;\n var parts = transform.split(/\\(\\s*/),\n command = parts[0],\n v = parts[1].split(/[\\s,]+/g);\n\n for (var j = 0, m = v.length; j < m; j++) {\n v[j] = parseFloat(v[j]);\n }\n\n switch (command) {\n case 'matrix':\n matrix.append(new Matrix(v[0], v[1], v[2], v[3], v[4], v[5]));\n break;\n\n case 'rotate':\n matrix.rotate(v[0], v[1] || 0, v[2] || 0);\n break;\n\n case 'translate':\n matrix.translate(v[0], v[1] || 0);\n break;\n\n case 'scale':\n matrix.scale(v);\n break;\n\n case 'skewX':\n matrix.skew(v[0], 0);\n break;\n\n case 'skewY':\n matrix.skew(0, v[0]);\n break;\n }\n }\n\n item.transform(matrix);\n }\n }\n\n function applyOpacity(item, value, name) {\n var key = name === 'fill-opacity' ? 'getFillColor' : 'getStrokeColor',\n color = item[key] && item[key]();\n if (color) color.setAlpha(parseFloat(value));\n }\n\n var attributes = Base.set(Base.each(SvgStyles, function (entry) {\n this[entry.attribute] = function (item, value) {\n if (item[entry.set]) {\n item[entry.set](convertValue(value, entry.type, entry.fromSVG));\n\n if (entry.type === 'color') {\n var color = item[entry.get]();\n\n if (color) {\n if (color._scaleToBounds) {\n var bounds = item.getBounds();\n color.transform(new Matrix().translate(bounds.getPoint()).scale(bounds.getSize()));\n }\n }\n }\n }\n };\n }, {}), {\n id: function id(item, value) {\n definitions[value] = item;\n if (item.setName) item.setName(value);\n },\n 'clip-path': function clipPath(item, value) {\n var clip = getDefinition(value);\n\n if (clip) {\n clip = clip.clone();\n clip.setClipMask(true);\n\n if (item instanceof Group) {\n item.insertChild(0, clip);\n } else {\n return new Group(clip, item);\n }\n }\n },\n gradientTransform: applyTransform,\n transform: applyTransform,\n 'fill-opacity': applyOpacity,\n 'stroke-opacity': applyOpacity,\n visibility: function visibility(item, value) {\n if (item.setVisible) item.setVisible(value === 'visible');\n },\n display: function display(item, value) {\n if (item.setVisible) item.setVisible(value !== null);\n },\n 'stop-color': function stopColor(item, value) {\n if (item.setColor) item.setColor(value);\n },\n 'stop-opacity': function stopOpacity(item, value) {\n if (item._color) item._color.setAlpha(parseFloat(value));\n },\n offset: function offset(item, value) {\n if (item.setOffset) {\n var percent = value.match(/(.*)%$/);\n item.setOffset(percent ? percent[1] / 100 : parseFloat(value));\n }\n },\n viewBox: function viewBox(item, value, name, node, styles) {\n var rect = new _Rectangle(convertValue(value, 'array')),\n size = getSize(node, null, null, true),\n group,\n matrix;\n\n if (item instanceof Group) {\n var scale = size ? size.divide(rect.getSize()) : 1,\n matrix = new Matrix().scale(scale).translate(rect.getPoint().negate());\n group = item;\n } else if (item instanceof SymbolDefinition) {\n if (size) rect.setSize(size);\n group = item._item;\n }\n\n if (group) {\n if (getAttribute(node, 'overflow', styles) !== 'visible') {\n var clip = new Shape.Rectangle(rect);\n clip.setClipMask(true);\n group.addChild(clip);\n }\n\n if (matrix) group.transform(matrix);\n }\n }\n });\n\n function getAttribute(node, name, styles) {\n var attr = node.attributes[name],\n value = attr && attr.value;\n\n if (!value && node.style) {\n var style = Base.camelize(name);\n value = node.style[style];\n if (!value && styles.node[style] !== styles.parent[style]) value = styles.node[style];\n }\n\n return !value ? undefined : value === 'none' ? null : value;\n }\n\n function applyAttributes(item, node, isRoot) {\n var parent = node.parentNode,\n styles = {\n node: DomElement.getStyles(node) || {},\n parent: !isRoot && !/^defs$/i.test(parent.tagName) && DomElement.getStyles(parent) || {}\n };\n Base.each(attributes, function (apply, name) {\n var value = getAttribute(node, name, styles);\n item = value !== undefined && apply(item, value, name, node, styles) || item;\n });\n return item;\n }\n\n function getDefinition(value) {\n var match = value && value.match(/\\((?:[\"'#]*)([^\"')]+)/),\n name = match && match[1],\n res = name && definitions[window ? name.replace(window.location.href.split('#')[0] + '#', '') : name];\n\n if (res && res._scaleToBounds) {\n res = res.clone();\n res._scaleToBounds = true;\n }\n\n return res;\n }\n\n function importNode(node, options, isRoot) {\n var type = node.nodeName.toLowerCase(),\n isElement = type !== '#document',\n body = document.body,\n container,\n parent,\n next;\n\n if (isRoot && isElement) {\n rootSize = paper.getView().getSize();\n rootSize = getSize(node, null, null, true) || rootSize;\n container = SvgElement.create('svg', {\n style: 'stroke-width: 1px; stroke-miterlimit: 10'\n });\n parent = node.parentNode;\n next = node.nextSibling;\n container.appendChild(node);\n body.appendChild(container);\n }\n\n var settings = paper.settings,\n applyMatrix = settings.applyMatrix,\n insertItems = settings.insertItems;\n settings.applyMatrix = false;\n settings.insertItems = false;\n var importer = importers[type],\n item = importer && importer(node, type, options, isRoot) || null;\n settings.insertItems = insertItems;\n settings.applyMatrix = applyMatrix;\n\n if (item) {\n if (isElement && !(item instanceof Group)) item = applyAttributes(item, node, isRoot);\n var onImport = options.onImport,\n data = isElement && node.getAttribute('data-paper-data');\n if (onImport) item = onImport(node, item, options) || item;\n\n if (options.expandShapes && item instanceof Shape) {\n item.remove();\n item = item.toPath();\n }\n\n if (data) item._data = JSON.parse(data);\n }\n\n if (container) {\n body.removeChild(container);\n\n if (parent) {\n if (next) {\n parent.insertBefore(node, next);\n } else {\n parent.appendChild(node);\n }\n }\n }\n\n if (isRoot) {\n definitions = {};\n if (item && Base.pick(options.applyMatrix, applyMatrix)) item.matrix.apply(true, true);\n }\n\n return item;\n }\n\n function _importSVG(source, options, owner) {\n if (!source) return null;\n options = typeof options === 'function' ? {\n onLoad: options\n } : options || {};\n var scope = paper,\n item = null;\n\n function onLoad(svg) {\n try {\n var node = typeof svg === 'object' ? svg : new self.DOMParser().parseFromString(svg.trim(), 'image/svg+xml');\n\n if (!node.nodeName) {\n node = null;\n throw new Error('Unsupported SVG source: ' + source);\n }\n\n paper = scope;\n item = importNode(node, options, true);\n\n if (!options || options.insert !== false) {\n owner._insertItem(undefined, item);\n }\n\n var onLoad = options.onLoad;\n if (onLoad) onLoad(item, svg);\n } catch (e) {\n onError(e);\n }\n }\n\n function onError(message, status) {\n var onError = options.onError;\n\n if (onError) {\n onError(message, status);\n } else {\n throw new Error(message);\n }\n }\n\n if (typeof source === 'string' && !/^[\\s\\S]*