ption:n,tickProps:Pe,value:"".concat(typeof s=="function"?s(q.value,Q):q.value).concat(u||"")}))});return x.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(j,"-ticks")},x.createElement(IG,{ticks:F,axisId:M,axisType:j}),he.length>0&&x.createElement(Hr,{zIndex:jt.label},x.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(j,"-tick-labels"),ref:t},he)),_e.length>0&&x.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(j,"-tick-lines")},_e))}),DG=x.forwardRef((e,t)=>{var{axisLine:r,width:n,height:i,className:a,hide:s,ticks:u,axisType:c,axisId:d}=e,h=SG(e,_G),[p,m]=x.useState(""),[g,b]=x.useState(""),w=x.useRef(null);x.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var k;return gG({ticks:w.current,label:(k=e.labelRef)===null||k===void 0?void 0:k.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var S=x.useCallback(k=>{if(k){var A=k.getElementsByClassName("recharts-cartesian-axis-tick-value");w.current=A;var P=A[0];if(P){var C=window.getComputedStyle(P),N=C.fontSize,j=C.letterSpacing;(N!==p||j!==g)&&(m(N),b(j))}}},[p,g]);return s||n!=null&&n<=0||i!=null&&i<=0?null:x.createElement(Hr,{zIndex:e.zIndex},x.createElement(Or,{className:Fe("recharts-cartesian-axis",a)},x.createElement(AG,{x:e.x,y:e.y,width:n,height:i,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:un(e)}),x.createElement(RG,{ref:S,axisType:c,events:h,fontSize:p,getTicksConfig:e,height:e.height,letterSpacing:g,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:d}),x.createElement(gV,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},x.createElement(OV,{label:e.label,labelRef:e.labelRef}),e.children)))}),tw=x.forwardRef((e,t)=>{var r=or(e,ei);return x.createElement(DG,Fa({},r,{ref:t}))});tw.displayName="CartesianAxis";var MG=["x1","y1","x2","y2","key"],$G=["offset"],LG=["xAxisId","yAxisId"],zG=["xAxisId","yAxisId"];function NE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Yt(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?NE(Object(r),!0).forEach(function(n){UG(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):NE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function UG(e,t,r){return(t=BG(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function BG(e){var t=FG(e,"string");return typeof t=="symbol"?t:t+""}function FG(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ca(){return Ca=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Ca.apply(null,arguments)}function hf(e,t){if(e==null)return{};var r,n,i=WG(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function WG(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var qG=e=>{var{fill:t}=e;if(!t||t==="none")return null;var{fillOpacity:r,x:n,y:i,width:a,height:s,ry:u}=e;return x.createElement("rect",{x:n,y:i,ry:u,width:a,height:s,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function GN(e){var{option:t,lineItemProps:r}=e,n;if(x.isValidElement(t))n=x.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var i,{x1:a,y1:s,x2:u,y2:c,key:d}=r,h=hf(r,MG),p=(i=un(h))!==null&&i!==void 0?i:{},{offset:m}=p,g=hf(p,$G);n=x.createElement("line",Ca({},g,{x1:a,y1:s,x2:u,y2:c,fill:"none",key:d}))}return n}function HG(e){var{x:t,width:r,horizontal:n=!0,horizontalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:a,yAxisId:s}=e,u=hf(e,LG),c=i.map((d,h)=>{var p=Yt(Yt({},u),{},{x1:t,y1:d,x2:t+r,y2:d,key:"line-".concat(h),index:h});return x.createElement(GN,{key:"line-".concat(h),option:n,lineItemProps:p})});return x.createElement("g",{className:"recharts-cartesian-grid-horizontal"},c)}function KG(e){var{y:t,height:r,vertical:n=!0,verticalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:a,yAxisId:s}=e,u=hf(e,zG),c=i.map((d,h)=>{var p=Yt(Yt({},u),{},{x1:d,y1:t,x2:d,y2:t+r,key:"line-".concat(h),index:h});return x.createElement(GN,{option:n,lineItemProps:p,key:"line-".concat(h)})});return x.createElement("g",{className:"recharts-cartesian-grid-vertical"},c)}function VG(e){var{horizontalFill:t,fillOpacity:r,x:n,y:i,width:a,height:s,horizontalPoints:u,horizontal:c=!0}=e;if(!c||!t||!t.length||u==null)return null;var d=u.map(p=>Math.round(p+i-i)).sort((p,m)=>p-m);i!==d[0]&&d.unshift(0);var h=d.map((p,m)=>{var g=d[m+1],b=g==null,w=b?i+s-p:g-p;if(w<=0)return null;var S=m%t.length;return x.createElement("rect",{key:"react-".concat(m),y:p,x:n,height:w,width:a,stroke:"none",fill:t[S],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return x.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},h)}function GG(e){var{vertical:t=!0,verticalFill:r,fillOpacity:n,x:i,y:a,width:s,height:u,verticalPoints:c}=e;if(!t||!r||!r.length)return null;var d=c.map(p=>Math.round(p+i-i)).sort((p,m)=>p-m);i!==d[0]&&d.unshift(0);var h=d.map((p,m)=>{var g=d[m+1],b=g==null,w=b?i+s-p:g-p;if(w<=0)return null;var S=m%r.length;return x.createElement("rect",{key:"react-".concat(m),x:p,y:a,width:w,height:u,stroke:"none",fill:r[S],fillOpacity:n,className:"recharts-cartesian-grid-bg"})});return x.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},h)}var YG=(e,t)=>{var{xAxis:r,width:n,height:i,offset:a}=e;return yC(ew(Yt(Yt(Yt({},ei),r),{},{ticks:wC(r),viewBox:{x:0,y:0,width:n,height:i}})),a.left,a.left+a.width,t)},XG=(e,t)=>{var{yAxis:r,width:n,height:i,offset:a}=e;return yC(ew(Yt(Yt(Yt({},ei),r),{},{ticks:wC(r),viewBox:{x:0,y:0,width:n,height:i}})),a.top,a.top+a.height,t)},JG={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:jt.grid};function rw(e){var t=EC(),r=OC(),n=PC(),i=Yt(Yt({},or(e,JG)),{},{x:ce(e.x)?e.x:n.left,y:ce(e.y)?e.y:n.top,width:ce(e.width)?e.width:n.width,height:ce(e.height)?e.height:n.height}),{xAxisId:a,yAxisId:s,x:u,y:c,width:d,height:h,syncWithTicks:p,horizontalValues:m,verticalValues:g}=i,b=Jt(),w=ve(W=>CP(W,"xAxis",a,b)),S=ve(W=>CP(W,"yAxis",s,b));if(!Rn(d)||!Rn(h)||!ce(u)||!ce(c))return null;var k=i.verticalCoordinatesGenerator||YG,A=i.horizontalCoordinatesGenerator||XG,{horizontalPoints:P,verticalPoints:C}=i;if((!P||!P.length)&&typeof A=="function"){var N=m&&m.length,j=A({yAxis:S?Yt(Yt({},S),{},{ticks:N?m:S.ticks}):void 0,width:t??d,height:r??h,offset:n},N?!0:p);$d(Array.isArray(j),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof j,"]")),Array.isArray(j)&&(P=j)}if((!C||!C.length)&&typeof k=="function"){var M=g&&g.length,F=k({xAxis:w?Yt(Yt({},w),{},{ticks:M?g:w.ticks}):void 0,width:t??d,height:r??h,offset:n},M?!0:p);$d(Array.isArray(F),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof F,"]")),Array.isArray(F)&&(C=F)}return x.createElement(Hr,{zIndex:i.zIndex},x.createElement("g",{className:"recharts-cartesian-grid"},x.createElement(qG,{fill:i.fill,fillOpacity:i.fillOpacity,x:i.x,y:i.y,width:i.width,height:i.height,ry:i.ry}),x.createElement(VG,Ca({},i,{horizontalPoints:P})),x.createElement(GG,Ca({},i,{verticalPoints:C})),x.createElement(HG,Ca({},i,{offset:n,horizontalPoints:P,xAxis:w,yAxis:S})),x.createElement(KG,Ca({},i,{offset:n,verticalPoints:C,xAxis:w,yAxis:S}))))}rw.displayName="CartesianGrid";var QG={},YN=Xt({name:"errorBars",initialState:QG,reducers:{addErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]||(e[r]=[]),e[r].push(n)},replaceErrorBar:(e,t)=>{var{itemId:r,prev:n,next:i}=t.payload;e[r]&&(e[r]=e[r].map(a=>a.dataKey===n.dataKey&&a.direction===n.direction?i:a))},removeErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]&&(e[r]=e[r].filter(i=>i.dataKey!==n.dataKey||i.direction!==n.direction))}}}),{addErrorBar:Wee,replaceErrorBar:qee,removeErrorBar:Hee}=YN.actions,ZG=YN.reducer,eY=["children"];function tY(e,t){if(e==null)return{};var r,n,i=rY(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function rY(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var nY={data:[],xAxisId:"xAxis-0",yAxisId:"yAxis-0",dataPointFormatter:()=>({x:0,y:0,value:0}),errorBarOffset:0},iY=x.createContext(nY);function XN(e){var{children:t}=e,r=tY(e,eY);return x.createElement(iY.Provider,{value:r},t)}function nw(e,t){var r,n,i=ve(d=>hi(d,e)),a=ve(d=>pi(d,t)),s=(r=i==null?void 0:i.allowDataOverflow)!==null&&r!==void 0?r:bt.allowDataOverflow,u=(n=a==null?void 0:a.allowDataOverflow)!==null&&n!==void 0?n:xt.allowDataOverflow,c=s||u;return{needClip:c,needClipX:s,needClipY:u}}function JN(e){var{xAxisId:t,yAxisId:r,clipPathId:n}=e,i=Z0(),{needClipX:a,needClipY:s,needClip:u}=nw(t,r);if(!u||!i)return null;var{x:c,y:d,width:h,height:p}=i;return x.createElement("clipPath",{id:"clipPath-".concat(n)},x.createElement("rect",{x:a?c:c-h/2,y:s?d:d-p/2,width:a?h:h*2,height:s?p:p*2}))}var QN=(e,t,r,n)=>Yi(e,"xAxis",t,n),ZN=(e,t,r,n)=>Gi(e,"xAxis",t,n),eI=(e,t,r,n)=>Yi(e,"yAxis",r,n),tI=(e,t,r,n)=>Gi(e,"yAxis",r,n),aY=L([Le,QN,eI,ZN,tI],(e,t,r,n,i)=>ui(e,"xAxis")?ns(t,n,!1):ns(r,i,!1)),oY=(e,t,r,n,i)=>i;function sY(e){return e.type==="line"}var lY=L([fh,oY],(e,t)=>e.filter(sY).find(r=>r.id===t)),uY=L([Le,QN,eI,ZN,tI,lY,aY,vu],(e,t,r,n,i,a,s,u)=>{var{chartData:c,dataStartIndex:d,dataEndIndex:h}=u;if(!(a==null||t==null||r==null||n==null||i==null||n.length===0||i.length===0||s==null||e!=="horizontal"&&e!=="vertical")){var{dataKey:p,data:m}=a,g;if(m!=null&&m.length>0?g=m:g=c==null?void 0:c.slice(d,h+1),g!=null)return jY({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataKey:p,bandSize:s,displayedData:g})}});function cY(e){var t=ou(e),r=3,n=2;if(t!=null){var{r:i,strokeWidth:a}=t,s=Number(i),u=Number(a);return(Number.isNaN(s)||s<0)&&(s=r),(Number.isNaN(u)||u<0)&&(u=n),{r:s,strokeWidth:u}}return{r,strokeWidth:n}}var dY=["id"],fY=["type","layout","connectNulls","needClip","shape"],hY=["activeDot","animateNewValues","animationBegin","animationDuration","animationEasing","connectNulls","dot","hide","isAnimationActive","label","legendType","xAxisId","yAxisId","id"];function iu(){return iu=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},iu.apply(null,arguments)}function IE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Pn(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?IE(Object(r),!0).forEach(function(n){pY(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):IE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function pY(e,t,r){return(t=vY(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function vY(e){var t=mY(e,"string");return typeof t=="symbol"?t:t+""}function mY(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function iw(e,t){if(e==null)return{};var r,n,i=gY(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function gY(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var yY=e=>{var{dataKey:t,name:r,stroke:n,legendType:i,hide:a}=e;return[{inactive:a,dataKey:t,type:i,color:n,value:Bf(r,t),payload:e}]},wY=x.memo(e=>{var{dataKey:t,data:r,stroke:n,strokeWidth:i,fill:a,name:s,hide:u,unit:c,tooltipType:d,id:h}=e,p={dataDefinedOnItem:r,getPosition:Ka,settings:{stroke:n,strokeWidth:i,fill:a,dataKey:t,nameKey:void 0,name:Bf(s,t),hide:u,type:d,color:n,unit:c,graphicalItemId:h}};return x.createElement($N,{tooltipEntrySettings:p})}),rI=(e,t)=>"".concat(t,"px ").concat(e,"px");function bY(e,t){for(var r=e.length%2!==0?[...e,0]:e,n=[],i=0;i<t;++i)n.push(...r);return n}var xY=(e,t,r)=>{var n=r.reduce((m,g)=>m+g,0);if(!n)return rI(t,e);for(var i=Math.floor(e/n),a=e%n,s=[],u=0,c=0;u<r.length;c+=(d=r[u])!==null&&d!==void 0?d:0,++u){var d,h=r[u];if(h!=null&&c+h>a){s=[...r.slice(0,u),a-c];break}}var p=s.length%2===0?[0,t]:[t];return[...bY(r,i),...s,...p].map(m=>"".concat(m,"px")).join(", ")};function _Y(e){var{clipPathId:t,points:r,props:n}=e,{dot:i,dataKey:a,needClip:s}=n,{id:u}=n,c=iw(n,dY),d=un(c);return x.createElement(S7,{points:r,dot:i,className:"recharts-line-dots",dotClassName:"recharts-line-dot",dataKey:a,baseProps:d,needClip:s,clipPathId:t})}function SY(e){var{showLabels:t,children:r,points:n}=e,i=x.useMemo(()=>n==null?void 0:n.map(a=>{var s,u,c={x:(s=a.x)!==null&&s!==void 0?s:0,y:(u=a.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Pn(Pn({},c),{},{value:a.value,payload:a.payload,viewBox:c,parentViewBox:void 0,fill:void 0})}),[n]);return x.createElement(EN,{value:t?i:void 0},r)}function RE(e){var{clipPathId:t,pathRef:r,points:n,strokeDasharray:i,props:a}=e,{type:s,layout:u,connectNulls:c,needClip:d,shape:h}=a,p=iw(a,fY),m=Pn(Pn({},nr(p)),{},{fill:"none",className:"recharts-line-curve",clipPath:d?"url(#clipPath-".concat(t,")"):void 0,points:n,type:s,layout:u,connectNulls:c,strokeDasharray:i??a.strokeDasharray});return x.createElement(x.Fragment,null,(n==null?void 0:n.length)>1&&x.createElement(IN,iu({shapeType:"curve",option:h},m,{pathRef:r})),x.createElement(_Y,{points:n,clipPathId:t,props:a}))}function kY(e){try{return e&&e.getTotalLength&&e.getTotalLength()||0}catch{return 0}}function PY(e){var{clipPathId:t,props:r,pathRef:n,previousPointsRef:i,longestAnimatedLengthRef:a}=e,{points:s,strokeDasharray:u,isAnimationActive:c,animationBegin:d,animationDuration:h,animationEasing:p,animateNewValues:m,width:g,height:b,onAnimationEnd:w,onAnimationStart:S}=r,k=i.current,A=Jf(s,"recharts-line-"),P=x.useRef(A),[C,N]=x.useState(!1),j=!C,M=x.useCallback(()=>{typeof w=="function"&&w(),N(!1)},[w]),F=x.useCallback(()=>{typeof S=="function"&&S(),N(!0)},[S]),W=kY(n.current),H=x.useRef(0);P.current!==A&&(H.current=a.current,P.current=A);var Y=H.current;return x.createElement(SY,{points:s,showLabels:j},r.children,x.createElement(Xf,{animationId:A,begin:d,duration:h,isActive:c,easing:p,onAnimationEnd:M,onAnimationStart:F,key:A},B=>{var pe=ct(Y,W+Y,B),ie=Math.min(pe,W),me;if(c)if(u){var _e="".concat(u).split(/[,\s]+/gim).map(Q=>parseFloat(Q));me=xY(ie,W,_e)}else me=rI(W,ie);else me=u==null?void 0:String(u);if(B>0&&W>0&&(i.current=s,a.current=Math.max(a.current,ie)),k){var he=k.length/s.length,K=B===1?s:s.map((Q,X)=>{var D=Math.floor(X*he);if(k[D]){var q=k[D];return Pn(Pn({},Q),{},{x:ct(q.x,Q.x,B),y:ct(q.y,Q.y,B)})}return m?Pn(Pn({},Q),{},{x:ct(g*2,Q.x,B),y:ct(b/2,Q.y,B)}):Pn(Pn({},Q),{},{x:Q.x,y:Q.y})});return i.current=K,x.createElement(RE,{props:r,points:K,clipPathId:t,pathRef:n,strokeDasharray:me})}return x.createElement(RE,{props:r,points:s,clipPathId:t,pathRef:n,strokeDasharray:me})}),x.createElement(AN,{label:r.label}))}function EY(e){var{clipPathId:t,props:r}=e,n=x.useRef(null),i=x.useRef(0),a=x.useRef(null);return x.createElement(PY,{props:r,clipPathId:t,previousPointsRef:n,longestAnimatedLengthRef:i,pathRef:a})}var OY=(e,t)=>{var r,n;return{x:(r=e.x)!==null&&r!==void 0?r:void 0,y:(n=e.y)!==null&&n!==void 0?n:void 0,value:e.value,errorVal:ht(e.payload,t)}};class AY extends x.Component{render(){var{hide:t,dot:r,points:n,className:i,xAxisId:a,yAxisId:s,top:u,left:c,width:d,height:h,id:p,needClip:m,zIndex:g}=this.props;if(t)return null;var b=Fe("recharts-line",i),w=p,{r:S,strokeWidth:k}=cY(r),A=NN(r),P=S*2+k,C=m?"url(#clipPath-".concat(A?"":"dots-").concat(w,")"):void 0;return x.createElement(Hr,{zIndex:g},x.createElement(Or,{className:b},m&&x.createElement("defs",null,x.createElement(JN,{clipPathId:w,xAxisId:a,yAxisId:s}),!A&&x.createElement("clipPath",{id:"clipPath-dots-".concat(w)},x.createElement("rect",{x:c-P/2,y:u-P/2,width:d+P,height:h+P}))),x.createElement(XN,{xAxisId:a,yAxisId:s,data:n,dataPointFormatter:OY,errorBarOffset:0},x.createElement(EY,{props:this.props,clipPathId:w}))),x.createElement(W7,{activeDot:this.props.activeDot,points:n,mainColor:this.props.stroke,itemDataKey:this.props.dataKey,clipPath:C}))}}var nI={activeDot:!0,animateNewValues:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!0,fill:"#fff",hide:!1,isAnimationActive:"auto",label:!1,legendType:"line",stroke:"#3182bd",strokeWidth:1,xAxisId:0,yAxisId:0,zIndex:jt.line,type:"linear"};function CY(e){var t=or(e,nI),{activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:a,animationEasing:s,connectNulls:u,dot:c,hide:d,isAnimationActive:h,label:p,legendType:m,xAxisId:g,yAxisId:b,id:w}=t,S=iw(t,hY),{needClip:k}=nw(g,b),A=Z0(),P=Va(),C=Jt(),N=ve(H=>uY(H,g,b,C,w));if(P!=="horizontal"&&P!=="vertical"||N==null||A==null)return null;var{height:j,width:M,x:F,y:W}=A;return x.createElement(AY,iu({},S,{id:w,connectNulls:u,dot:c,activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:a,animationEasing:s,isAnimationActive:h,hide:d,label:p,legendType:m,xAxisId:g,yAxisId:b,points:N,layout:P,height:j,width:M,left:F,top:W,needClip:k}))}function jY(e){var{layout:t,xAxis:r,yAxis:n,xAxisTicks:i,yAxisTicks:a,dataKey:s,bandSize:u,displayedData:c}=e;return c.map((d,h)=>{var p=ht(d,s);if(t==="horizontal"){var m=SS({axis:r,ticks:i,bandSize:u,entry:d,index:h}),g=tt(p)?null:n.scale.map(p);return{x:m,y:g??null,value:p,payload:d}}var b=tt(p)?null:r.scale.map(p),w=SS({axis:n,ticks:a,bandSize:u,entry:d,index:h});return b==null||w==null?null:{x:b,y:w,value:p,payload:d}}).filter(Boolean)}function TY(e){var t=or(e,nI),r=Jt();return x.createElement(zN,{id:t.id,type:"line"},n=>x.createElement(x.Fragment,null,x.createElement(LN,{legendPayload:yY(t)}),x.createElement(wY,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:n}),x.createElement(BN,{type:"line",id:n,data:t.data,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,hide:t.hide,isPanorama:r}),x.createElement(CY,iu({},t,{id:n}))))}var fy=x.memo(TY,hu);fy.displayName="Line";function Ja(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(i=>i.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:FN}function Qa(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(i=>i.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:FN}var NY="Invariant failed";function IY(e,t){throw new Error(NY)}function hy(){return hy=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},hy.apply(null,arguments)}function aw(e){return x.createElement(IN,hy({shapeType:"rectangle",activeClassName:"recharts-active-bar",inActiveClassName:"recharts-inactive-bar"},e))}var RY=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return(n,i)=>{if(ce(t))return t;var a=ce(n)||tt(n);return a?t(n,i):(a||IY(),r)}},DY=(e,t,r)=>r,MY=(e,t)=>t,Pu=L([fh,MY],(e,t)=>e.filter(r=>r.type==="bar").find(r=>r.id===t)),$Y=L([Pu],e=>e==null?void 0:e.maxBarSize),LY=(e,t,r,n)=>n,zY=L([Le,fh,Ja,Qa,DY],(e,t,r,n,i)=>t.filter(a=>e==="horizontal"?a.xAxisId===r:a.yAxisId===n).filter(a=>a.isPanorama===i).filter(a=>a.hide===!1).filter(a=>a.type==="bar")),UY=(e,t,r)=>{var n=Le(e),i=Ja(e,t),a=Qa(e,t);if(!(i==null||a==null))return n==="horizontal"?sy(e,"yAxis",a,r):sy(e,"xAxis",i,r)},BY=(e,t)=>{var r=Le(e),n=Ja(e,t),i=Qa(e,t);if(!(n==null||i==null))return r==="horizontal"?AP(e,"xAxis",n):AP(e,"yAxis",i)},FY=L([zY,kW,BY],q7),WY=(e,t,r)=>{var n,i,a=Pu(e,t);if(a==null)return 0;var s=Ja(e,t),u=Qa(e,t);if(s==null||u==null)return 0;var c=Le(e),d=oj(e),{maxBarSize:h}=a,p=tt(h)?d:h,m,g;return c==="horizontal"?(m=Yi(e,"xAxis",s,r),g=Gi(e,"xAxis",s,r)):(m=Yi(e,"yAxis",u,r),g=Gi(e,"yAxis",u,r)),(n=(i=ns(m,g,!0))!==null&&i!==void 0?i:p)!==null&&n!==void 0?n:0},iI=(e,t,r)=>{var n=Le(e),i=Ja(e,t),a=Qa(e,t);if(!(i==null||a==null)){var s,u;return n==="horizontal"?(s=Yi(e,"xAxis",i,r),u=Gi(e,"xAxis",i,r)):(s=Yi(e,"yAxis",a,r),u=Gi(e,"yAxis",a,r)),ns(s,u)}},qY=L([FY,oj,SW,sj,WY,iI,$Y],Y7),HY=(e,t,r)=>{var n=Ja(e,t);if(n!=null)return Yi(e,"xAxis",n,r)},KY=(e,t,r)=>{var n=Qa(e,t);if(n!=null)return Yi(e,"yAxis",n,r)},VY=(e,t,r)=>{var n=Ja(e,t);if(n!=null)return Gi(e,"xAxis",n,r)},GY=(e,t,r)=>{var n=Qa(e,t);if(n!=null)return Gi(e,"yAxis",n,r)},YY=L([qY,Pu],J7),XY=L([UY,Pu],X7),JY=L([Tt,Vy,HY,KY,VY,GY,YY,Le,vW,iI,XY,Pu,LY],(e,t,r,n,i,a,s,u,c,d,h,p,m)=>{var{chartData:g,dataStartIndex:b,dataEndIndex:w}=c;if(!(p==null||s==null||t==null||u!=="horizontal"&&u!=="vertical"||r==null||n==null||i==null||a==null||d==null)){var{data:S}=p,k;if(S!=null&&S.length>0?k=S:k=g==null?void 0:g.slice(b,w+1),k!=null)return PX({layout:u,barSettings:p,pos:s,parentViewBox:t,bandSize:d,xAxis:r,yAxis:n,xAxisTicks:i,yAxisTicks:a,stackedData:h,displayedData:k,offset:e,cells:m,da