
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/


!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";var e=2311,n=function(){return e++},m="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},n=t.match(/Firefox\/([\d.]+)/),i=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),r=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);n&&(e.firefox=!0,e.version=n[1]);i&&(e.ie=!0,e.version=i[1]);r&&(e.edge=!0,e.version=r[1]);a&&(e.weChat=!0);return{browser:e,os:{},node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!e.ie&&!e.edge,pointerEventsSupported:"onpointerdown"in window&&(e.edge||e.ie&&11<=e.version),domSupported:"undefined"!=typeof document}}(navigator.userAgent);var s={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},l={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},h=Object.prototype.toString,i=Array.prototype,o=i.forEach,u=i.filter,r=i.slice,c=i.map,d=i.reduce,a={};function b(t){if(null==t||"object"!=typeof t)return t;var e=t,n=h.call(t);if("[object Array]"===n){if(!Y(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=b(t[i])}}else if(l[n]){if(!Y(t)){var a=t.constructor;if(t.constructor.from)e=a.from(t);else{e=new a(t.length);for(i=0,r=t.length;i<r;i++)e[i]=b(t[i])}}}else if(!s[n]&&!Y(t)&&!B(t))for(var o in e={},t)t.hasOwnProperty(o)&&(e[o]=b(t[o]));return e}function f(t,e,n){if(!O(e)||!O(t))return n?b(e):t;for(var i in e)if(e.hasOwnProperty(i)){var r=t[i],a=e[i];!O(a)||!O(r)||C(a)||C(r)||B(a)||B(r)||E(a)||E(r)||Y(a)||Y(r)?!n&&i in t||(t[i]=b(e[i])):f(r,a,n)}return t}function S(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function D(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function p(){return a.createCanvas()}var g;function v(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function y(t,e){var n=t.prototype;function i(){}for(var r in i.prototype=e.prototype,t.prototype=new i,n)n.hasOwnProperty(r)&&(t.prototype[r]=n[r]);(t.prototype.constructor=t).superClass=e}function _(t,e,n){D(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,n)}function P(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function k(t,e,n){if(t&&e)if(t.forEach&&t.forEach===o)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function A(t,e,n){if(t&&e){if(t.map&&t.map===c)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}}function M(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===d)return t.reduce(e,n,i);for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function x(t,e,n){if(t&&e){if(t.filter&&t.filter===u)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function w(t,e){var n=r.call(arguments,2);return function(){return t.apply(e,n.concat(r.call(arguments)))}}function I(t){var e=r.call(arguments,1);return function(){return t.apply(this,e.concat(r.call(arguments)))}}function C(t){return"[object Array]"===h.call(t)}function T(t){return"function"==typeof t}function L(t){return"[object String]"===h.call(t)}function O(t){var e=typeof t;return"function"==e||!!t&&"object"==e}function E(t){return!!s[h.call(t)]}function N(t){return!!l[h.call(t)]}function B(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function z(t){return t!=t}function R(){for(var t=0,e=arguments.length;t<e;t++)if(null!=arguments[t])return arguments[t]}function F(t,e){return null!=t?t:e}function V(t,e,n){return null!=t?t:null!=e?e:n}function W(){return Function.call.apply(r,arguments)}function H(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function G(t,e){if(!t)throw new Error(e)}function X(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}a.createCanvas=function(){return document.createElement("canvas")};var U="__ec_primitive__";function q(t){t[U]=!0}function Y(t){return t[U]}function j(t){var n=C(t);this.data={};var i=this;function e(t,e){n?i.set(t,e):i.set(e,t)}t instanceof j?t.each(e):t&&k(t,e)}function Z(t){return new j(t)}function $(){}j.prototype={constructor:j,get:function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},set:function(t,e){return this.data[t]=e},each:function(t,e){for(var n in void 0!==e&&(t=w(t,e)),this.data)this.data.hasOwnProperty(n)&&t(this.data[n],n)},removeKey:function(t){delete this.data[t]}};var K="undefined"==typeof Float32Array?Array:Float32Array;function Q(t,e){var n=new K(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n}function J(t){var e=new K(2);return e[0]=t[0],e[1]=t[1],e}function tt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function et(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function nt(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function it(t,e){var n=function(t){return Math.sqrt(function(t){return t[0]*t[0]+t[1]*t[1]}(t))}(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function rt(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var at=rt;var ot=function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])};function st(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function lt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function ht(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}function ut(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function ct(t,e){return{target:t,topTarget:e&&e.topTarget}}ut.prototype={constructor:ut,_dragStart:function(t){var e=t.target;e&&e.draggable&&((this._draggingTarget=e).dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(ct(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,a=i-this._y;this._x=n,this._y=i,e.drift(r,a,t),this.dispatchToElement(ct(e,t),"drag",t.event);var o=this.findHover(n,i,e).target,s=this._dropTarget;e!==(this._dropTarget=o)&&(s&&o!==s&&this.dispatchToElement(ct(s,t),"dragleave",t.event),o&&o!==s&&this.dispatchToElement(ct(o,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(ct(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(ct(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var dt=Array.prototype.slice,ft=function(t){this._$handlers={},this._$eventProcessor=t};function pt(t,e,n,i,r,a){var o=t._$handlers;if("function"==typeof n&&(r=i,i=n,n=null),!i||!e)return t;n=function(t,e){var n=t._$eventProcessor;return null!=e&&n&&n.normalizeQuery&&(e=n.normalizeQuery(e)),e}(t,n),o[e]||(o[e]=[]);for(var s=0;s<o[e].length;s++)if(o[e][s].h===i)return t;var l={h:i,one:a,query:n,ctx:r||t,callAtLast:i.zrEventfulCallAtLast},h=o[e].length-1,u=o[e][h];return u&&u.callAtLast?o[e].splice(h,0,l):o[e].push(l),t}ft.prototype={constructor:ft,one:function(t,e,n,i){return pt(this,t,e,n,i,!0)},on:function(t,e,n,i){return pt(this,t,e,n,i,!1)},isSilent:function(t){var e=this._$handlers;return!e[t]||!e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;3<r&&(i=dt.call(i,1));for(var a=e.length,o=0;o<a;){var s=e[o];if(n&&n.filter&&null!=s.query&&!n.filter(t,s.query))o++;else{switch(r){case 1:s.h.call(s.ctx);break;case 2:s.h.call(s.ctx,i[1]);break;case 3:s.h.call(s.ctx,i[1],i[2]);break;default:s.h.apply(s.ctx,i)}s.one?(e.splice(o,1),a--):o++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this},triggerWithContext:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;4<r&&(i=dt.call(i,1,i.length-1));for(var a=i[i.length-1],o=e.length,s=0;s<o;){var l=e[s];if(n&&n.filter&&null!=l.query&&!n.filter(t,l.query))s++;else{switch(r){case 1:l.h.call(a);break;case 2:l.h.call(a,i[1]);break;case 3:l.h.call(a,i[1],i[2]);break;default:l.h.apply(a,i)}l.one?(e.splice(s,1),o--):s++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this}};var gt=Math.log(2);function vt(t,e,n,i,r,a){var o=i+"-"+r,s=t.length;if(a.hasOwnProperty(o))return a[o];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/gt);return t[n][l]}for(var h=i|1<<n,u=n+1;i&1<<u;)u++;for(var c=0,d=0,f=0;d<s;d++){var p=1<<d;p&r||(c+=(f%2?-1:1)*t[n][d]*vt(t,e-1,u,h,r|p,a),f++)}return a[o]=c}var mt="undefined"!=typeof window&&!!window.addEventListener,yt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,_t="___zrEVENTSAVED",xt=[];function wt(t,e,n,i){return n=n||{},i||!m.canvasSupported?bt(t,e,n):m.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):bt(t,e,n),n}function bt(t,e,n){if(t.getBoundingClientRect&&m.domSupported){var i=e.clientX,r=e.clientY;if("CANVAS"===t.nodeName.toUpperCase()){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=r-a.top)}var o=t[_t]||(t[_t]={}),s=function(t,e){for(var n=e.transformer,i=e.srcCoords,r=!0,a=[],o=[],s=0;s<4;s++){var l=t[s].getBoundingClientRect(),h=2*s,u=l.left,c=l.top;a.push(u,c),r&=i&&u===i[h]&&c===i[1+h],o.push(t[s].offsetLeft,t[s].offsetTop)}return r?n:(e.srcCoords=a,e.transformer=function(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=vt(n,8,0,0,0,i);if(0!==r){for(var a=[],o=0;o<8;o++)for(var s=0;s<8;s++)null==a[s]&&(a[s]=0),a[s]+=((o+s)%2?-1:1)*vt(n,7,0===o?1:0,1<<o,1<<s,i)/r*e[o];return function(t,e,n){var i=e*a[6]+n*a[7]+1;t[0]=(e*a[0]+n*a[1]+a[2])/i,t[1]=(e*a[3]+n*a[4]+a[5])/i}}}(a,o))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],a=0;a<4;a++){var o=document.createElement("div"),s=o.style,l=a%2,h=(a>>1)%2;s.cssText=["position:absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","width:0","height:0",i[l]+":0",r[h]+":0",i[1-l]+":auto",r[1-h]+":auto",""].join("!important;"),t.appendChild(o),n.push(o)}return n}(t,o),o);if(s)return s(xt,i,r),n.zrX=xt[0],void(n.zrY=xt[1])}n.zrX=n.zrY=0}function St(t,e,n){if(null!=(e=e||window.event).zrX)return e;var i=e.type;if(i&&0<=i.indexOf("touch")){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&wt(t,r,e,n)}else wt(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&yt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Mt(){this._track=[]}var It=mt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Tt(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}Mt.prototype={constructor:Mt,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,o=i.length;a<o;a++){var s=i[a],l=wt(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},_recognize:function(t){for(var e in Ct)if(Ct.hasOwnProperty(e)){var n=Ct[e](this._track,t);if(n)return n}}};var Ct={pinch:function(t,e){var n=t.length;if(n){var i=(t[n-1]||{}).points,r=(t[n-2]||{}).points||i;if(r&&1<r.length&&i&&1<i.length){var a=Tt(i)/Tt(r);isFinite(a)||(a=1),e.pinchScale=a;var o=function(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}(i);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},Dt="silent";function kt(t){It(this.event)}function At(){}At.prototype.dispose=function(){};function Lt(t,e,n,i){ft.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new At,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,this._gestureMgr,ut.call(this),this.setHandlerProxy(n)}var Pt=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"];function Ot(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||Dt}return!1}Lt.prototype={constructor:Lt,setHandlerProxy:function(e){this.proxy&&this.proxy.dispose(),e&&(k(Pt,function(t){e.on&&e.on(t,this[t],this)},this),e.handler=this),this.proxy=e},mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=i.target;r&&!r.__zr&&(r=(i=this.findHover(i.x,i.y)).target);var a=this._hovered=this.findHover(e,n),o=a.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),r&&o!==r&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(a,"mousemove",t),o&&o!==r&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);for(var e,n=t.toElement||t.relatedTarget;(n=n&&n.parentNode)&&9!==n.nodeType&&!(e=n===this.painterRoot););e||this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,a=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:kt}}(e,t,n);i&&(i[r]&&(a.cancelBubble=i[r].call(i,a)),i.trigger(e,a),i=i.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={x:t,y:e},a=i.length-1;0<=a;a--){var o;if(i[a]!==n&&!i[a].ignore&&(o=Ot(i[a],t,e))&&(r.topTarget||(r.topTarget=i[a]),o!==Dt)){r.target=i[a];break}}return r},processGesture:function(t,e){this._gestureMgr||(this._gestureMgr=new Mt);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r,this.dispatchToElement({target:i.target},r,i.event)}}},k(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(i){Lt.prototype[i]=function(t){var e=this.findHover(t.zrX,t.zrY),n=e.target;if("mousedown"===i)this._downEl=n,this._downPoint=[t.zrX,t.zrY],this._upEl=n;else if("mouseup"===i)this._upEl=n;else if("click"===i){if(this._downEl!==this._upEl||!this._downPoint||4<at(this._downPoint,[t.zrX,t.zrY]))return;this._downPoint=null}this.dispatchToElement(e,i,t)}}),_(Lt,ft),_(Lt,ut);var Et="undefined"==typeof Float32Array?Array:Float32Array;function Nt(){var t=new Et(6);return Bt(t),t}function Bt(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function zt(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function Rt(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function Ft(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*h,t[1]=-i*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function Vt(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Wt(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}var Ht=Bt;function Gt(t){return 5e-5<t||t<-5e-5}var Xt=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},Ut=Xt.prototype;Ut.transform=null,Ut.needLocalTransform=function(){return Gt(this.rotation)||Gt(this.position[0])||Gt(this.position[1])||Gt(this.scale[0]-1)||Gt(this.scale[1]-1)};var qt=[];Ut.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;if(n||e){i=i||Nt(),n?this.getLocalTransform(i):Ht(i),e&&(n?zt(i,t.transform,i):function(t,e){t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5]}(i,t.transform)),this.transform=i;var r=this.globalScaleRatio;if(null!=r&&1!==r){this.getGlobalScale(qt);var a=qt[0]<0?-1:1,o=qt[1]<0?-1:1,s=((qt[0]-a)*r+a)/qt[0]||0,l=((qt[1]-o)*r+o)/qt[1]||0;i[0]*=s,i[1]*=s,i[2]*=l,i[3]*=l}this.invTransform=this.invTransform||Nt(),Wt(this.invTransform,i)}else i&&Ht(i)},Ut.getLocalTransform=function(t){return Xt.getLocalTransform(this,t)},Ut.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},Ut.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var Yt=[],jt=Nt();Ut.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=this.position,r=this.scale;Gt(e-1)&&(e=Math.sqrt(e)),Gt(n-1)&&(n=Math.sqrt(n)),t[0]<0&&(e=-e),t[3]<0&&(n=-n),i[0]=t[4],i[1]=t[5],r[0]=e,r[1]=n,this.rotation=Math.atan2(-t[1]/n,t[0]/e)}},Ut.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(zt(Yt,t.invTransform,e),e=Yt);var n=this.origin;n&&(n[0]||n[1])&&(jt[4]=n[0],jt[5]=n[1],zt(Yt,e,jt),Yt[4]-=n[0],Yt[5]-=n[1],e=Yt),this.setLocalTransform(e)}},Ut.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1])):(t[0]=1,t[1]=1),t},Ut.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&st(n,n,i),n},Ut.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&st(n,n,i),n},Xt.getLocalTransform=function(t,e){Ht(e=e||[]);var n=t.origin,i=t.scale||[1,1],r=t.rotation||0,a=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),Vt(e,e,i),r&&Ft(e,e,r),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=a[0],e[5]+=a[1],e};var Zt={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(e=!n||n<1?(n=1,.1):.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){return t*t*(2.70158*t-1.70158)},backOut:function(t){return--t*t*(2.70158*t+1.70158)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((1+e)*t-e)*.5:.5*((t-=2)*t*((1+e)*t+e)+2)},bounceIn:function(t){return 1-Zt.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Zt.bounceIn(2*t):.5*Zt.bounceOut(2*t-1)+.5}};function $t(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}$t.prototype={constructor:$t,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,r="string"==typeof i?Zt[i]:i,a="function"==typeof r?r(n):n;return this.fire("frame",a),1===n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};function Kt(){this.head=null,this.tail=null,this._len=0}var Qt=Kt.prototype;Qt.insert=function(t){var e=new te(t);return this.insertEntry(e),e},Qt.insertEntry=function(t){this.head?((this.tail.next=t).prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},Qt.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},Qt.len=function(){return this._len},Qt.clear=function(){this.head=this.tail=null,this._len=0};function Jt(t){this._list=new Kt,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null}var te=function(t){this.value=t,this.next,this.prev},ee=Jt.prototype;ee.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var a=n.len(),o=this._lastRemovedEntry;if(a>=this._maxSize&&0<a){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}o?o.value=e:o=new te(e),o.key=t,n.insertEntry(o),i[t]=o}return r},ee.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},ee.clear=function(){this._list.clear(),this._map={}};var ne={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function ie(t){return(t=Math.round(t))<0?0:255<t?255:t}function re(t){return t<0?0:1<t?1:t}function ae(t){return t.length&&"%"===t.charAt(t.length-1)?ie(parseFloat(t)/100*255):ie(parseInt(t,10))}function oe(t){return t.length&&"%"===t.charAt(t.length-1)?re(parseFloat(t)/100):re(parseFloat(t))}function se(t,e,n){return n<0?n+=1:1<n&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function le(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function he(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var ue=new Jt(20),ce=null;function de(t,e){ce&&he(ce,e),ce=ue.put(t,ce||e.slice())}function fe(t,e){if(t){e=e||[];var n=ue.get(t);if(n)return he(e,n);var i,r=(t+="").replace(/ /g,"").toLowerCase();if(r in ne)return he(e,ne[r]),de(t,e),e;if("#"===r.charAt(0))return 4===r.length?0<=(i=parseInt(r.substr(1),16))&&i<=4095?(le(e,(3840&i)>>4|(3840&i)>>8,240&i|(240&i)>>4,15&i|(15&i)<<4,1),de(t,e),e):void le(e,0,0,0,1):7===r.length?0<=(i=parseInt(r.substr(1),16))&&i<=16777215?(le(e,(16711680&i)>>16,(65280&i)>>8,255&i,1),de(t,e),e):void le(e,0,0,0,1):void 0;var a=r.indexOf("("),o=r.indexOf(")");if(-1!==a&&o+1===r.length){var s=r.substr(0,a),l=r.substr(a+1,o-(a+1)).split(","),h=1;switch(s){case"rgba":if(4!==l.length)return void le(e,0,0,0,1);h=oe(l.pop());case"rgb":return 3!==l.length?void le(e,0,0,0,1):(le(e,ae(l[0]),ae(l[1]),ae(l[2]),h),de(t,e),e);case"hsla":return 4!==l.length?void le(e,0,0,0,1):(l[3]=oe(l[3]),pe(l,e),de(t,e),e);case"hsl":return 3!==l.length?void le(e,0,0,0,1):(pe(l,e),de(t,e),e);default:return}}le(e,0,0,0,1)}}function pe(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=oe(t[1]),r=oe(t[2]),a=r<=.5?r*(i+1):r+i-r*i,o=2*r-a;return le(e=e||[],ie(255*se(o,a,n+1/3)),ie(255*se(o,a,n)),ie(255*se(o,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function ge(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}var ve=Array.prototype.slice;function me(t,e){return t[e]}function ye(t,e,n){t[e]=n}function _e(t,e,n){return(e-t)*n+t}function xe(t,e,n){return.5<n?e:t}function we(t,e,n,i,r){var a=t.length;if(1===r)for(var o=0;o<a;o++)i[o]=_e(t[o],e[o],n);else{var s=a&&t[0].length;for(o=0;o<a;o++)for(var l=0;l<s;l++)i[o][l]=_e(t[o][l],e[o][l],n)}}function be(t,e,n){var i=t.length,r=e.length;if(i!==r)if(r<i)t.length=r;else for(var a=i;a<r;a++)t.push(1===n?e[a]:ve.call(e[a]));var o=t[0]&&t[0].length;for(a=0;a<t.length;a++)if(1===n)isNaN(t[a])&&(t[a]=e[a]);else for(var s=0;s<o;s++)isNaN(t[a][s])&&(t[a][s]=e[a][s])}function Se(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;r<i;r++)if(t[r]!==e[r])return!1}else{var a=t[0].length;for(r=0;r<i;r++)for(var o=0;o<a;o++)if(t[r][o]!==e[r][o])return!1}return!0}function Me(t,e,n,i,r,a,o,s,l){var h=t.length;if(1===l)for(var u=0;u<h;u++)s[u]=Ie(t[u],e[u],n[u],i[u],r,a,o);else{var c=t[0].length;for(u=0;u<h;u++)for(var d=0;d<c;d++)s[u][d]=Ie(t[u][d],e[u][d],n[u][d],i[u][d],r,a,o)}}function Ie(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Te(t){if(P(t)){var e=t.length;if(P(t[0])){for(var n=[],i=0;i<e;i++)n.push(ve.call(t[i]));return n}return ve.call(t)}return t}function Ce(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function De(t,e,n,i,a,r){var o=t._getter,s=t._setter,l="spline"===e,h=i.length;if(h){var u,c=P(i[0].value),d=!1,f=!1,p=c?function(t){var e=t[t.length-1].value;return P(e&&e[0])?2:1}(i):0;i.sort(function(t,e){return t.time-e.time}),u=i[h-1].time;for(var g=[],v=[],m=i[0].value,y=!0,_=0;_<h;_++){g.push(i[_].time/u);var x=i[_].value;if(c&&Se(x,m,p)||!c&&x===m||(y=!1),"string"==typeof(m=x)){var w=fe(x);w?(x=w,d=!0):f=!0}v.push(x)}if(r||!y){var b=v[h-1];for(_=0;_<h-1;_++)c?be(v[_],b,p):!isNaN(v[_])||isNaN(b)||f||d||(v[_]=b);c&&be(o(t._target,a),b,p);var S,M,I,T,C,D=0,k=0;if(d)var A=[0,0,0,0];var L=new $t({target:t._target,life:u,loop:t._loop,delay:t._delay,onframe:function(t,e){var n;if(e<0)n=0;else if(e<k){for(n=Math.min(D+1,h-1);0<=n&&!(g[n]<=e);n--);n=Math.min(n,h-2)}else{for(n=D;n<h&&!(g[n]>e);n++);n=Math.min(n-1,h-2)}k=e;var i=g[(D=n)+1]-g[n];if(0!=i)if(S=(e-g[n])/i,l)if(I=v[n],M=v[0===n?n:n-1],T=v[h-2<n?h-1:n+1],C=v[h-3<n?h-1:n+2],c)Me(M,I,T,C,S,S*S,S*S*S,o(t,a),p);else{if(d)r=Me(M,I,T,C,S,S*S,S*S*S,A,1),r=Ce(A);else{if(f)return xe(I,T,S);r=Ie(M,I,T,C,S,S*S,S*S*S)}s(t,a,r)}else if(c)we(v[n],v[n+1],S,o(t,a),p);else{var r;if(d)we(v[n],v[n+1],S,A,1),r=Ce(A);else{if(f)return xe(v[n],v[n+1],S);r=_e(v[n],v[n+1],S)}s(t,a,r)}},ondestroy:n});return e&&"spline"!==e&&(L.easing=e),L}}}function ke(t,e,n,i){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||me,this._setter=i||ye,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]}ke.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:Te(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t,e){function n(){--a||r._doneCallback()}var i,r=this,a=0;for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var s=De(this,t,n,this._tracks[o],o,e);s&&(this._clipList.push(s),a++,this.animation&&this.animation.addClip(s),i=s)}if(i){var l=i.onframe;i.onframe=function(t,e){l(t,e);for(var n=0;n<r._onframeList.length;n++)r._onframeList[n](t,e)}}return a||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}};var Ae=1;"undefined"!=typeof window&&(Ae=Math.max(window.devicePixelRatio||1,1));var Le=Ae,Pe=function(){};function Oe(){this.animators=[]}var Ee=Pe;function Ne(t,e,n,i,r,a,o,s){L(i)?(a=r,r=i,i=0):T(r)?(a=r,r="linear",i=0):T(i)?(a=i,i=0):n=T(n)?(a=n,500):n||500,t.stopAnimation(),function t(e,n,i,r,a,o,s){var l={};var h=0;for(var u in r)r.hasOwnProperty(u)&&(null!=i[u]?O(r[u])&&!P(r[u])?t(e,n?n+"."+u:u,i[u],r[u],a,o,s):(s?(l[u]=i[u],Be(e,n,u,r[u])):l[u]=r[u],h++):null==r[u]||s||Be(e,n,u,r[u]));0<h&&e.animate(n,!1).when(null==a?500:a,l).delay(o||0)}(t,"",t,e,n,i,s);var l=t.animators.slice(),h=l.length;function u(){--h||a&&a()}h||a&&a();for(var c=0;c<l.length;c++)l[c].done(u).start(r,o)}function Be(t,e,n,i){if(e){var r={};r[e]={},r[e][n]=i,t.attr(r)}else t.attr(n,i)}Oe.prototype={constructor:Oe,animate:function(t,e){var n,i=!1,r=this,a=this.__zr;if(t){var o=t.split("."),s=r;i="shape"===o[0];for(var l=0,h=o.length;l<h;l++)s=s&&s[o[l]];s&&(n=s)}else n=r;if(n){var u=r.animators,c=new ke(n,e);return c.during(function(t){r.dirty(i)}).done(function(){u.splice(v(u,c),1)}),u.push(c),a&&a.animation.addAnimator(c),c}Ee('Property "'+t+'" is not existed in element '+r.id)},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r,a){Ne(this,t,e,n,i,r,a)},animateFrom:function(t,e,n,i,r,a){Ne(this,t,e,n,i,r,a,!0)}};var ze=function(t){Xt.call(this,t),ft.call(this,t),Oe.call(this,t),this.id=t.id||n()};ze.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;(n=n||(this.transform=[1,0,0,1,0,0]))[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];(n=n||(this[t]=[]))[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(O(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),(this.clipPath=t).__zr=e,(t.__clipTarget=this).dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},_(ze,Oe),_(ze,Xt),_(ze,ft);var Re,Fe,Ve,We,He=st,Ge=Math.min,Xe=Math.max;function Ue(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}Ue.prototype={constructor:Ue,union:function(t){var e=Ge(t.x,this.x),n=Ge(t.y,this.y);this.width=Xe(t.x+t.width,this.x+this.width)-e,this.height=Xe(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:(Re=[],Fe=[],Ve=[],We=[],function(t){if(t){Re[0]=Ve[0]=this.x,Re[1]=We[1]=this.y,Fe[0]=We[0]=this.x+this.width,Fe[1]=Ve[1]=this.y+this.height,He(Re,Re,t),He(Fe,Fe,t),He(Ve,Ve,t),He(We,We,t),this.x=Ge(Re[0],Fe[0],Ve[0],We[0]),this.y=Ge(Re[1],Fe[1],Ve[1],We[1]);var e=Xe(Re[0],Fe[0],Ve[0],We[0]),n=Xe(Re[1],Fe[1],Ve[1],We[1]);this.width=e-this.x,this.height=n-this.y}}),calculateTransform:function(t){var e=t.width/this.width,n=t.height/this.height,i=Nt();return Rt(i,i,[-this.x,-this.y]),Vt(i,i,[e,n]),Rt(i,i,[t.x,t.y]),i},intersect:function(t){if(!t)return!1;t instanceof Ue||(t=Ue.create(t));var e=this,n=e.x,i=e.x+e.width,r=e.y,a=e.y+e.height,o=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(i<o||s<n||a<l||h<r)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new Ue(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Ue.create=function(t){return new Ue(t.x,t.y,t.width,t.height)};var qe=function(t){for(var e in t=t||{},ze.call(this,t),t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};qe.prototype={constructor:qe,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);0<=i&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t);var e=(t.parent=this).__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof qe&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,i=this._children,r=v(i,t);return r<0||(i.splice(r,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof qe&&t.delChildrenFromStorage(n)),e&&e.refresh()),this},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof qe&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof qe&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof qe&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new Ue(0,0,0,0),i=t||this._children,r=[],a=0;a<i.length;a++){var o=i[a];if(!o.ignore&&!o.invisible){var s=o.getBoundingRect(),l=o.getLocalTransform(r);l?(n.copy(s),n.applyTransform(l),(e=e||n.clone()).union(n)):(e=e||s.clone()).union(s)}}return e||n}},y(qe,ze);var Ye=32,je=7;function Ze(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&0<=i(t[r],t[r-1]);)r++;return r-e}function $e(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)r(o,t[a=s+l>>>1])<0?l=a:s=1+a;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0<h;)t[s+h]=t[s+h-1],h--}t[s]=o}}function Ke(t,e,n,i,r,a){var o=0,s=0,l=1;if(0<a(t,e[n+r])){for(s=i-r;l<s&&0<a(t,e[n+r+l]);)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s);var h=o;o=r-l,l=r-h}for(o++;o<l;){var u=o+(l-o>>>1);0<a(t,e[n+u])?o=u+1:l=u}return l}function Qe(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=i-r;l<s&&0<=a(t,e[n+r+l]);)(l=1+((o=l)<<1))<=0&&(l=s);s<l&&(l=s),o+=r,l+=r}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function Je(p,g){var o,s,v=je,l=0,m=[];function e(t){var e=o[t],n=s[t],i=o[t+1],r=s[t+1];s[t]=n+r,t===l-3&&(o[t+1]=o[t+2],s[t+1]=s[t+2]),l--;var a=Qe(p[i],p,e,n,0,g);e+=a,0!==(n-=a)&&0!==(r=Ke(p[e+n-1],p,i,r,r-1,g))&&(n<=r?function(t,e,n,i){var r=0;for(r=0;r<e;r++)m[r]=p[t+r];var a=0,o=n,s=t;if(p[s++]=p[o++],0==--i){for(r=0;r<e;r++)p[s+r]=m[a+r];return}if(1===e){for(r=0;r<i;r++)p[s+r]=p[o+r];return p[s+i]=m[a]}var l,h,u,c=v;for(;;){h=l=0,u=!1;do{if(g(p[o],m[a])<0){if(p[s++]=p[o++],h++,(l=0)==--i){u=!0;break}}else if(p[s++]=m[a++],l++,h=0,1==--e){u=!0;break}}while((l|h)<c);if(u)break;do{if(0!==(l=Qe(p[o],m,a,e,0,g))){for(r=0;r<l;r++)p[s+r]=m[a+r];if(s+=l,a+=l,(e-=l)<=1){u=!0;break}}if(p[s++]=p[o++],0==--i){u=!0;break}if(0!==(h=Ke(m[a],p,o,i,0,g))){for(r=0;r<h;r++)p[s+r]=p[o+r];if(s+=h,o+=h,0===(i-=h)){u=!0;break}}if(p[s++]=m[a++],1==--e){u=!0;break}c--}while(je<=l||je<=h);if(u)break;c<0&&(c=0),c+=2}if((v=c)<1&&(v=1),1===e){for(r=0;r<i;r++)p[s+r]=p[o+r];p[s+i]=m[a]}else{if(0===e)throw new Error;for(r=0;r<e;r++)p[s+r]=m[a+r]}}(e,n,i,r):function(t,e,n,i){var r=0;for(r=0;r<i;r++)m[r]=p[n+r];var a=t+e-1,o=i-1,s=n+i-1,l=0,h=0;if(p[s--]=p[a--],0==--e){for(l=s-(i-1),r=0;r<i;r++)p[l+r]=m[r];return}if(1===i){for(h=(s-=e)+1,l=(a-=e)+1,r=e-1;0<=r;r--)p[h+r]=p[l+r];return p[s]=m[o]}var u=v;for(;;){var c=0,d=0,f=!1;do{if(g(m[o],p[a])<0){if(p[s--]=p[a--],c++,(d=0)==--e){f=!0;break}}else if(p[s--]=m[o--],d++,c=0,1==--i){f=!0;break}}while((c|d)<u);if(f)break;do{if(0!==(c=e-Qe(m[o],p,t,e,e-1,g))){for(e-=c,h=(s-=c)+1,l=(a-=c)+1,r=c-1;0<=r;r--)p[h+r]=p[l+r];if(0===e){f=!0;break}}if(p[s--]=m[o--],1==--i){f=!0;break}if(0!==(d=i-Ke(p[a],m,0,i,i-1,g))){for(i-=d,h=(s-=d)+1,l=(o-=d)+1,r=0;r<d;r++)p[h+r]=m[l+r];if(i<=1){f=!0;break}}if(p[s--]=p[a--],0==--e){f=!0;break}u--}while(je<=c||je<=d);if(f)break;u<0&&(u=0),u+=2}(v=u)<1&&(v=1);if(1===i){for(h=(s-=e)+1,l=(a-=e)+1,r=e-1;0<=r;r--)p[h+r]=p[l+r];p[s]=m[o]}else{if(0===i)throw new Error;for(l=s-(i-1),r=0;r<i;r++)p[l+r]=m[r]}}(e,n,i,r))}o=[],s=[],this.mergeRuns=function(){for(;1<l;){var t=l-2;if(1<=t&&s[t-1]<=s[t]+s[t+1]||2<=t&&s[t-2]<=s[t]+s[t-1])s[t-1]<s[t+1]&&t--;else if(s[t]>s[t+1])break;e(t)}},this.forceMergeRuns=function(){for(;1<l;){var t=l-2;0<t&&s[t-1]<s[t+1]&&t--,e(t)}},this.pushRun=function(t,e){o[l]=t,s[l]=e,l+=1}}function tn(t,e,n,i){n=n||0;var r=(i=i||t.length)-n;if(!(r<2)){var a=0;if(r<Ye)$e(t,n,i,n+(a=Ze(t,n,i,e)),e);else{var o=new Je(t,e),s=function(t){for(var e=0;Ye<=t;)e|=1&t,t>>=1;return t+e}(r);do{if((a=Ze(t,n,i,e))<s){var l=r;s<l&&(l=s),$e(t,n,n+l,n+a,e),a=l}o.pushRun(n,a),o.mergeRuns(),r-=a,n+=a}while(0!==r);o.forceMergeRuns()}}}function en(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function nn(){this._roots=[],this._displayList=[],this._displayListLen=0}nn.prototype={constructor:nn,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,m.canvasSupported&&tn(n,en)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),r=(a=r).clipPath}if(t.isGroup){for(var o=t._children,s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof qe&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var n=this._roots[e];n instanceof qe&&n.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array){e=0;for(var i=t.length;e<i;e++)this.delRoot(t[e])}else{var r=v(this._roots,t);0<=r&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof qe&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:en};var rn={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},an=function(t,e,n){return rn.hasOwnProperty(e)?n*t.dpr:n},on={NONE:0,STYLE_BIND:1,PLAIN_TEXT:2},sn=9,ln=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],hn=function(t){this.extendFrom(t,!1)};function un(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y),i=isNaN(i)?0:i,r=isNaN(r)?1:r,a=isNaN(a)?0:a,o=isNaN(o)?0:o,t.createLinearGradient(i,a,r,o)}function cn(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(o=o*i+n.x,s=s*r+n.y,l*=a),t.createRadialGradient(o,s,0,o,s,l)}hn.prototype={constructor:hn,fill:"#000",stroke:null,opacity:1,fillOpacity:null,strokeOpacity:null,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,n){var i=this,r=n&&n.style,a=!r||t.__attrCachedBy!==on.STYLE_BIND;t.__attrCachedBy=on.STYLE_BIND;for(var o=0;o<ln.length;o++){var s=ln[o],l=s[0];!a&&i[l]===r[l]||(t[l]=an(t,l,i[l]||s[1]))}if(!a&&i.fill===r.fill||(t.fillStyle=i.fill),!a&&i.stroke===r.stroke||(t.strokeStyle=i.stroke),!a&&i.opacity===r.opacity||(t.globalAlpha=null==i.opacity?1:i.opacity),!a&&i.blend===r.blend||(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var h=i.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&0<this.lineWidth},extendFrom:function(t,e){if(t)for(var n in t)!t.hasOwnProperty(n)||!0!==e&&(!1===e?this.hasOwnProperty(n):null==t[n])||(this[n]=t[n])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,n){for(var i=("radial"===e.type?cn:un)(t,e,n),r=e.colorStops,a=0;a<r.length;a++)i.addColorStop(r[a].offset,r[a].color);return i}};for(var dn=hn.prototype,fn=0;fn<ln.length;fn++){var pn=ln[fn];pn[0]in dn||(dn[pn[0]]=pn[1])}hn.getGradient=dn.getGradient;function gn(t,e){this.image=t,this.repeat=e,this.type="pattern"}function vn(){return!1}function mn(t,e,n){var i=p(),r=e.getWidth(),a=e.getHeight(),o=i.style;return o&&(o.position="absolute",o.left=0,o.top=0,o.width=r+"px",o.height=a+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=a*n,i}function yn(t,e,n){var i;n=n||Le,"string"==typeof t?i=mn(t,e,n):O(t)&&(t=(i=t).id),this.id=t;var r=(this.dom=i).style;r&&(i.onselectstart=vn,r["-webkit-user-select"]="none",r["user-select"]="none",r["-webkit-touch-callout"]="none",r["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",r.padding=0,r.margin=0,r["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n}yn.prototype={constructor:yn,__dirty:!0,__used:!(gn.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")}),__drawIndex:0,__startIndex:0,__endIndex:0,incremental:!1,getElementCount:function(){return this.__endIndex-this.__startIndex},initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=mn("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!==n&&this.ctxBack.scale(n,n))},clear:function(t,e){var n,i=this.dom,r=this.ctx,a=i.width,o=i.height,s=(e=e||this.clearColor,this.motionBlur&&!t),l=this.lastFrameAlpha,h=this.dpr;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(i,0,0,a/h,o/h)),r.clearRect(0,0,a,o),e&&"transparent"!==e&&(e.colorStops?(n=e.__canvasGradient||hn.getGradient(r,e,{x:0,y:0,width:a,height:o}),e.__canvasGradient=n):e.image&&(n=gn.prototype.getCanvasPattern.call(e,r)),r.save(),r.fillStyle=n||e,r.fillRect(0,0,a,o),r.restore());if(s){var u=this.domBack;r.save(),r.globalAlpha=l,r.drawImage(u,0,0,a,o),r.restore()}}};var _n="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},xn=new Jt(50);function wn(t){if("string"!=typeof t)return t;var e=xn.get(t);return e&&e.image}function bn(t,e,n,i,r){if(t){if("string"!=typeof t)return t;if(e&&e.__zrImageSrc===t||!n)return e;var a=xn.get(t),o={hostEl:n,cb:i,cbPayload:r};return a?Mn(e=a.image)||a.pending.push(o):((e=new Image).onload=e.onerror=Sn,xn.put(t,e.__cachedImgObj={image:e,pending:[o]}),e.src=e.__zrImageSrc=t),e}return e}function Sn(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function Mn(t){return t&&t.width&&t.height}var In={},Tn=0,Cn=5e3,Dn=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,kn="12px sans-serif",An={};function Ln(t,e){var n=t+":"+(e=e||kn);if(In[n])return In[n];for(var i,r,a=(t+"").split("\n"),o=0,s=0,l=a.length;s<l;s++)o=Math.max((i=a[s],r=e,An.measureText(i,r)).width,o);return Cn<Tn&&(Tn=0,In={}),Tn++,In[n]=o}function Pn(t,e,n,i,r,a,o,s){return o?function(t,e,n,i,r,a,o,s){var l=Hn(t,{rich:o,truncate:s,font:e,textAlign:n,textPadding:r,textLineHeight:a}),h=l.outerWidth,u=l.outerHeight,c=On(0,h,n),d=En(0,u,i);return new Ue(c,d,h,u)}(t,e,n,i,r,a,o,s):function(t,e,n,i,r,a,o){var s=Wn(t,e,r,a,o),l=Ln(t,e);r&&(l+=r[1]+r[3]);var h=s.outerHeight,u=On(0,l,n),c=En(0,h,i),d=new Ue(u,c,l,h);return d.lineHeight=s.lineHeight,d}(t,e,n,i,r,a,s)}function On(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function En(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function Nn(t,e,n){var i=e.textPosition,r=e.textDistance,a=n.x,o=n.y,s=n.height,l=n.width,h=s/2,u="left",c="top";switch(i){case"left":a-=r,o+=h,u="right",c="middle";break;case"right":a+=r+l,o+=h,c="middle";break;case"top":a+=l/2,o-=r,u="center",c="bottom";break;case"bottom":a+=l/2,o+=s+r,u="center";break;case"inside":a+=l/2,o+=h,u="center",c="middle";break;case"insideLeft":a+=r,o+=h,c="middle";break;case"insideRight":a+=l-r,o+=h,u="right",c="middle";break;case"insideTop":a+=l/2,o+=r,u="center";break;case"insideBottom":a+=l/2,o+=s-r,u="center",c="bottom";break;case"insideTopLeft":a+=r,o+=r;break;case"insideTopRight":a+=l-r,o+=r,u="right";break;case"insideBottomLeft":a+=r,o+=s-r,c="bottom";break;case"insideBottomRight":a+=l-r,o+=s-r,u="right",c="bottom"}return(t=t||{}).x=a,t.y=o,t.textAlign=u,t.textVerticalAlign=c,t}function Bn(t,e,n,i,r){if(!e)return"";var a=(t+"").split("\n");r=zn(e,n,i,r);for(var o=0,s=a.length;o<s;o++)a[o]=Rn(a[o],r);return a.join("\n")}function zn(t,e,n,i){(i=S({},i)).font=e;n=F(n,"...");i.maxIterations=F(i.maxIterations,2);var r=i.minChar=F(i.minChar,0);i.cnCharWidth=Ln("国",e);var a=i.ascCharWidth=Ln("a",e);i.placeholder=F(i.placeholder,"");for(var o=t=Math.max(0,t-1),s=0;s<r&&a<=o;s++)o-=a;var l=Ln(n,e);return o<l&&(n="",l=0),o=t-l,i.ellipsis=n,i.ellipsisWidth=l,i.contentWidth=o,i.containerWidth=t,i}function Rn(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var a=Ln(t,i);if(a<=n)return t;for(var o=0;;o++){if(a<=r||o>=e.maxIterations){t+=e.ellipsis;break}var s=0===o?Fn(t,r,e.ascCharWidth,e.cnCharWidth):0<a?Math.floor(t.length*r/a):0;a=Ln(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function Fn(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}function Vn(t){return Ln("国",t)}function Wn(t,e,n,i,r){null!=t&&(t+="");var a=F(i,Vn(e)),o=t?t.split("\n"):[],s=o.length*a,l=s;if(n&&(l+=n[0]+n[2]),t&&r){var h=r.outerHeight,u=r.outerWidth;if(null!=h&&h<l)t="",o=[];else if(null!=u)for(var c=zn(u-(n?n[1]+n[3]:0),e,r.ellipsis,{minChar:r.minChar,placeholder:r.placeholder}),d=0,f=o.length;d<f;d++)o[d]=Rn(o[d],c)}return{lines:o,height:s,outerHeight:l,lineHeight:a}}function Hn(t,e){var n={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return n;for(var i,r=Dn.lastIndex=0;null!=(i=Dn.exec(t));){var a=i.index;r<a&&Gn(n,t.substring(r,a)),Gn(n,i[2],i[1]),r=Dn.lastIndex}r<t.length&&Gn(n,t.substring(r,t.length));var o=n.lines,s=0,l=0,h=[],u=e.textPadding,c=e.truncate,d=c&&c.outerWidth,f=c&&c.outerHeight;u&&(null!=d&&(d-=u[1]+u[3]),null!=f&&(f-=u[0]+u[2]));for(var p=0;p<o.length;p++){for(var g=o[p],v=0,m=0,y=0;y<g.tokens.length;y++){var _=(k=g.tokens[y]).styleName&&e.rich[k.styleName]||{},x=k.textPadding=_.textPadding,w=k.font=_.font||e.font,b=k.textHeight=F(_.textHeight,Vn(w));if(x&&(b+=x[0]+x[2]),k.height=b,k.lineHeight=V(_.textLineHeight,e.textLineHeight,b),k.textAlign=_&&_.textAlign||e.textAlign,k.textVerticalAlign=_&&_.textVerticalAlign||"middle",null!=f&&s+k.lineHeight>f)return{lines:[],width:0,height:0};k.textWidth=Ln(k.text,w);var S=_.textWidth,M=null==S||"auto"===S;if("string"==typeof S&&"%"===S.charAt(S.length-1))k.percentWidth=S,h.push(k),S=0;else{if(M){S=k.textWidth;var I=_.textBackgroundColor,T=I&&I.image;T&&Mn(T=wn(T))&&(S=Math.max(S,T.width*b/T.height))}var C=x?x[1]+x[3]:0;S+=C;var D=null!=d?d-m:null;null!=D&&D<S&&(!M||D<C?(k.text="",k.textWidth=S=0):(k.text=Bn(k.text,D-C,w,c.ellipsis,{minChar:c.minChar}),k.textWidth=Ln(k.text,w),S=k.textWidth+C))}m+=k.width=S,_&&(v=Math.max(v,k.lineHeight))}g.width=m,s+=g.lineHeight=v,l=Math.max(l,m)}n.outerWidth=n.width=F(e.textWidth,l),n.outerHeight=n.height=F(e.textHeight,s),u&&(n.outerWidth+=u[1]+u[3],n.outerHeight+=u[0]+u[2]);for(p=0;p<h.length;p++){var k,A=(k=h[p]).percentWidth;k.width=parseInt(A,10)/100*l}return n}function Gn(t,e,n){for(var i=""===e,r=e.split("\n"),a=t.lines,o=0;o<r.length;o++){var s=r[o],l={styleName:n,text:s,isLineHolder:!s&&!i};if(o)a.push({tokens:[l]});else{var h=(a[a.length-1]||(a[0]={tokens:[]})).tokens,u=h.length;1===u&&h[0].isLineHolder?h[0]=l:!s&&u&&!i||h.push(l)}}}function Xn(t,e){var n,i,r,a,o,s=e.x,l=e.y,h=e.width,u=e.height,c=e.r;h<0&&(s+=h,h=-h),u<0&&(l+=u,u=-u),"number"==typeof c?n=i=r=a=c:c instanceof Array?1===c.length?n=i=r=a=c[0]:2===c.length?(n=r=c[0],i=a=c[1]):3===c.length?(n=c[0],i=a=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],a=c[3]):n=i=r=a=0,h<n+i&&(n*=h/(o=n+i),i*=h/o),h<r+a&&(r*=h/(o=r+a),a*=h/o),u<i+r&&(i*=u/(o=i+r),r*=u/o),u<n+a&&(n*=u/(o=n+a),a*=u/o),t.moveTo(s+n,l),t.lineTo(s+h-i,l),0!==i&&t.arc(s+h-i,l+i,i,-Math.PI/2,0),t.lineTo(s+h,l+u-r),0!==r&&t.arc(s+h-r,l+u-r,r,0,Math.PI/2),t.lineTo(s+a,l+u),0!==a&&t.arc(s+a,l+u-a,a,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}An.measureText=function(t,e){var n=g=g||p().getContext("2d");return n.font=e||kn,n.measureText(t)};var Un=kn,qn={left:1,right:1,center:1},Yn={top:1,bottom:1,middle:1},jn=[["textShadowBlur","shadowBlur",0],["textShadowOffsetX","shadowOffsetX",0],["textShadowOffsetY","shadowOffsetY",0],["textShadowColor","shadowColor","transparent"]],Zn={},$n={};function Kn(t){return Qn(t),k(t.rich,Qn),t}function Qn(t){if(t){t.font=function(t){var e=(t.fontSize||t.fontFamily)&&[t.fontStyle,t.fontWeight,(t.fontSize||12)+"px",t.fontFamily||"sans-serif"].join(" ");return e&&X(e)||t.textFont||t.font}(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||qn[e]?e:"left";var n=t.textVerticalAlign||t.textBaseline;"center"===n&&(n="middle"),t.textVerticalAlign=null==n||Yn[n]?n:"top",t.textPadding&&(t.textPadding=H(t.textPadding))}}function Jn(t,e,n,i,r,a){i.rich?function(t,e,n,i,r,a){a!==sn&&(e.__attrCachedBy=on.NONE);var o=t.__textCotentBlock;o&&!t.__dirtyText||(o=t.__textCotentBlock=Hn(n,i));!function(t,e,n,i,r){var a=n.width,o=n.outerWidth,s=n.outerHeight,l=i.textPadding,h=ai($n,t,i,r),u=h.baseX,c=h.baseY,d=h.textAlign,f=h.textVerticalAlign;ti(e,i,r,u,c);var p=On(u,o,d),g=En(c,s,f),v=p,m=g;l&&(v+=l[3],m+=l[0]);var y=v+a;ni(i)&&ii(t,e,i,p,g,o,s);for(var _=0;_<n.lines.length;_++){for(var x,w=n.lines[_],b=w.tokens,S=b.length,M=w.lineHeight,I=w.width,T=0,C=v,D=y,k=S-1;T<S&&(!(x=b[T]).textAlign||"left"===x.textAlign);)ei(t,e,x,i,M,m,C,"left"),I-=x.width,C+=x.width,T++;for(;0<=k&&"right"===(x=b[k]).textAlign;)ei(t,e,x,i,M,m,D,"right"),I-=x.width,D-=x.width,k--;for(C+=(a-(C-v)-(y-D)-I)/2;T<=k;)x=b[T],ei(t,e,x,i,M,m,C+x.width/2,"center"),C+=x.width,T++;m+=M}}(t,e,o,i,r)}(t,e,n,i,r,a):function(t,e,n,i,r,a){var o,s=ni(i),l=!1,h=e.__attrCachedBy===on.PLAIN_TEXT;a!==sn?(a&&(o=a.style,l=!s&&h&&o),e.__attrCachedBy=s?on.NONE:on.PLAIN_TEXT):h&&(e.__attrCachedBy=on.NONE);var u=i.font||Un;l&&u===(o.font||Un)||(e.font=u);var c=t.__computedFont;t.__styleFont!==u&&(t.__styleFont=u,c=t.__computedFont=e.font);var d=i.textPadding,f=i.textLineHeight,p=t.__textCotentBlock;p&&!t.__dirtyText||(p=t.__textCotentBlock=Wn(n,c,d,f,i.truncate));var g=p.outerHeight,v=p.lines,m=p.lineHeight,y=ai($n,t,i,r),_=y.baseX,x=y.baseY,w=y.textAlign||"left",b=y.textVerticalAlign;ti(e,i,r,_,x);var S=En(x,g,b),M=_,I=S;if(s||d){var T=Ln(n,c);d&&(T+=d[1]+d[3]);var C=On(_,T,w);s&&ii(t,e,i,C,S,T,g),d&&(M=ui(_,w,d),I+=d[0])}e.textAlign=w,e.textBaseline="middle",e.globalAlpha=i.opacity||1;for(var D=0;D<jn.length;D++){var k=jn[D],A=k[0],L=k[1],P=i[A];l&&P===o[A]||(e[L]=an(e,L,P||k[2]))}I+=m/2;var O=i.textStrokeWidth,E=l?o.textStrokeWidth:null,N=!l||O!==E,B=!l||N||i.textStroke!==o.textStroke,z=si(i.textStroke,O),R=li(i.textFill);z&&(N&&(e.lineWidth=O),B&&(e.strokeStyle=z));R&&(l&&i.textFill===o.textFill||(e.fillStyle=R));if(1===v.length)z&&e.strokeText(v[0],M,I),R&&e.fillText(v[0],M,I);else for(D=0;D<v.length;D++)z&&e.strokeText(v[D],M,I),R&&e.fillText(v[D],M,I),I+=m}(t,e,n,i,r,a)}function ti(t,e,n,i,r){if(n&&e.textRotation){var a=e.textOrigin;"center"===a?(i=n.width/2+n.x,r=n.height/2+n.y):a&&(i=a[0]+n.x,r=a[1]+n.y),t.translate(i,r),t.rotate(-e.textRotation),t.translate(-i,-r)}}function ei(t,e,n,i,r,a,o,s){var l=i.rich[n.styleName]||{};l.text=n.text;var h=n.textVerticalAlign,u=a+r/2;"top"===h?u=a+n.height/2:"bottom"===h&&(u=a+r-n.height/2),!n.isLineHolder&&ni(l)&&ii(t,e,l,"right"===s?o-n.width:"center"===s?o-n.width/2:o,u-n.height/2,n.width,n.height);var c=n.textPadding;c&&(o=ui(o,s,c),u-=n.height/2-c[2]-n.textHeight/2),oi(e,"shadowBlur",V(l.textShadowBlur,i.textShadowBlur,0)),oi(e,"shadowColor",l.textShadowColor||i.textShadowColor||"transparent"),oi(e,"shadowOffsetX",V(l.textShadowOffsetX,i.textShadowOffsetX,0)),oi(e,"shadowOffsetY",V(l.textShadowOffsetY,i.textShadowOffsetY,0)),oi(e,"textAlign",s),oi(e,"textBaseline","middle"),oi(e,"font",n.font||Un);var d=si(l.textStroke||i.textStroke,p),f=li(l.textFill||i.textFill),p=F(l.textStrokeWidth,i.textStrokeWidth);d&&(oi(e,"lineWidth",p),oi(e,"strokeStyle",d),e.strokeText(n.text,o,u)),f&&(oi(e,"fillStyle",f),e.fillText(n.text,o,u))}function ni(t){return!!(t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor)}function ii(t,e,n,i,r,a,o){var s=n.textBackgroundColor,l=n.textBorderWidth,h=n.textBorderColor,u=L(s);if(oi(e,"shadowBlur",n.textBoxShadowBlur||0),oi(e,"shadowColor",n.textBoxShadowColor||"transparent"),oi(e,"shadowOffsetX",n.textBoxShadowOffsetX||0),oi(e,"shadowOffsetY",n.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=n.textBorderRadius;c?Xn(e,{x:i,y:r,width:a,height:o,r:c}):e.rect(i,r,a,o),e.closePath()}if(u)if(oi(e,"fillStyle",s),null!=n.fillOpacity){var d=e.globalAlpha;e.globalAlpha=n.fillOpacity*n.opacity,e.fill(),e.globalAlpha=d}else e.fill();else if(O(s)){var f=s.image;(f=bn(f,null,t,ri,s))&&Mn(f)&&e.drawImage(f,i,r,a,o)}if(l&&h)if(oi(e,"lineWidth",l),oi(e,"strokeStyle",h),null!=n.strokeOpacity){d=e.globalAlpha;e.globalAlpha=n.strokeOpacity*n.opacity,e.stroke(),e.globalAlpha=d}else e.stroke()}function ri(t,e){e.image=t}function ai(t,e,n,i){var r=n.x||0,a=n.y||0,o=n.textAlign,s=n.textVerticalAlign;if(i){var l=n.textPosition;if(l instanceof Array)r=i.x+hi(l[0],i.width),a=i.y+hi(l[1],i.height);else{var h=e&&e.calculateTextPosition?e.calculateTextPosition(Zn,n,i):Nn(Zn,n,i);r=h.x,a=h.y,o=o||h.textAlign,s=s||h.textVerticalAlign}var u=n.textOffset;u&&(r+=u[0],a+=u[1])}return(t=t||{}).baseX=r,t.baseY=a,t.textAlign=o,t.textVerticalAlign=s,t}function oi(t,e,n){return t[e]=an(t,e,n),t[e]}function si(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function li(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function hi(t,e){return"string"==typeof t?0<=t.lastIndexOf("%")?parseFloat(t)/100*e:parseFloat(t):t}function ui(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function ci(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function di(){}var fi=new Ue;function pi(t){for(var e in t=t||{},ze.call(this,t),t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new hn(t.style,this),this._rect=null,this.__clipPaths=null}function gi(t){pi.call(this,t)}pi.prototype={constructor:pi,type:"displayable",__dirty:!0,invisible:!(di.prototype={constructor:di,drawRectText:function(t,e){var n=this.style;e=n.textRect||e,this.__dirty&&Kn(n);var i=n.text;if(null!=i&&(i+=""),ci(i,n)){t.save();var r=this.transform;n.transformText?this.setTransform(t):r&&(fi.copy(e),fi.applyTransform(r),e=fi),Jn(this,t,i,n,e,sn),t.restore()}}}),z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:!1,incremental:!1,globalScaleRatio:1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},dirty:function(){this.__dirty=this.__dirtyText=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?ze.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new hn(t,this),this.dirty(!1),this},calculateTextPosition:null},y(pi,ze),_(pi,di),gi.prototype={constructor:gi,type:"image",brush:function(t,e){var n=this.style,i=n.image;n.bind(t,this,e);var r=this._image=bn(i,this._image,this,this.onload);if(r&&Mn(r)){var a=n.x||0,o=n.y||0,s=n.width,l=n.height,h=r.width/r.height;if(null==s&&null!=l?s=l*h:null==l&&null!=s?l=s/h:null==s&&null==l&&(s=r.width,l=r.height),this.setTransform(t),n.sWidth&&n.sHeight){var u=n.sx||0,c=n.sy||0;t.drawImage(r,u,c,n.sWidth,n.sHeight,a,o,s,l)}else if(n.sx&&n.sy){var d=s-(u=n.sx),f=l-(c=n.sy);t.drawImage(r,u,c,d,f,a,o,s,l)}else t.drawImage(r,a,o,s,l);null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new Ue(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},y(gi,pi);var vi=314159;function mi(t){return parseInt(t,10)}var yi=new Ue(0,0,0,0),_i=new Ue(0,0,0,0);function xi(t,e,n){this.type="canvas";var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=S({},n||{}),this.dpr=n.devicePixelRatio||Le,this._singleCanvas=i;var r=(this.root=t).style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],o=this._layers={};if(this._layerConfig={},this._needsManuallyCompositing=!1,i){var s=t.width,l=t.height;null!=n.width&&(s=n.width),null!=n.height&&(l=n.height),this.dpr=n.devicePixelRatio||1,t.width=s*this.dpr,t.height=l*this.dpr,this._width=s,this._height=l;var h=new yn(t,this,this.dpr);h.__builtin__=!0,h.initContext(),(o[vi]=h).zlevel=vi,a.push(vi),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var u=this._domRoot=function(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}(this._width,this._height);t.appendChild(u)}this._hoverlayer=null,this._hoverElements=[]}xi.prototype={constructor:xi,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,t,this._redrawId);for(var i=0;i<n.length;i++){var r=n[i],a=this._layers[r];if(!a.__builtin__&&a.refresh){var o=0===i?this._backgroundColor:null;a.refresh(o)}}return this.refreshHover(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape,z:t.z,z2:t.z2,silent:t.silent});return(n.__from=t).__hoverMir=n,e&&n.setStyle(e),this._hoverElements.push(n),n}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=v(n,e);0<=i&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){tn(t,this.storage.displayableSortFunc);var i={};(n=n||(this._hoverlayer=this.getLayer(1e5))).ctx.save();for(var r=0;r<e;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,n,!0,i))):(t.splice(r,1),o.__hoverMir=null,e--)}n.ctx.restore()}},getHoverLayer:function(){return this.getLayer(1e5)},_paintList:function(t,e,n){if(this._redrawId===n){e=e||!1,this._updateLayerStatus(t);var i=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!i){var r=this;_n(function(){r._paintList(t,e,n)})}}},_compositeManually:function(){var e=this.getLayer(vi).ctx,n=this._domRoot.width,i=this._domRoot.height;e.clearRect(0,0,n,i),this.eachBuiltinLayer(function(t){t.virtual&&e.drawImage(t.dom,0,0,n,i)})},_doPaintList:function(t,e){for(var n=[],i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];(s=this._layers[r]).__builtin__&&s!==this._hoverlayer&&(s.__dirty||e)&&n.push(s)}for(var a=!0,o=0;o<n.length;o++){var s,l=(s=n[o]).ctx,h={};l.save();var u=e?s.__startIndex:s.__drawIndex,c=!e&&s.incremental&&Date.now,d=c&&Date.now(),f=s.zlevel===this._zlevelList[0]?this._backgroundColor:null;if(s.__startIndex===s.__endIndex)s.clear(!1,f);else if(u===s.__startIndex){var p=t[u];p.incremental&&p.notClear&&!e||s.clear(!1,f)}-1===u&&(console.error("For some unknown reason. drawIndex is -1"),u=s.__startIndex);for(var g=u;g<s.__endIndex;g++){var v=t[g];if(this._doPaintEl(v,s,e,h),v.__dirty=v.__dirtyText=!1,c)if(15<Date.now()-d)break}s.__drawIndex=g,s.__drawIndex<s.__endIndex&&(a=!1),h.prevElClipPaths&&l.restore(),l.restore()}return m.wxa&&k(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),a},_doPaintEl:function(t,e,n,i){var r=e.ctx,a=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!function(t,e,n){return yi.copy(t.getBoundingRect()),t.transform&&yi.applyTransform(t.transform),_i.width=e,_i.height=n,!yi.intersect(_i)}(t,this._width,this._height))){var o=t.__clipPaths,s=i.prevElClipPaths;s&&!function(t,e){if(t===e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0;return!1}(o,s)||(s&&(r.restore(),i.prevElClipPaths=null,i.prevEl=null),o&&(r.save(),function(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}(o,r),i.prevElClipPaths=o)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),(i.prevEl=t).afterBrush&&t.afterBrush(r)}},getLayer:function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=vi);var n=this._layers[t];return n||((n=new yn("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]&&f(n,this._layerConfig[t],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,a=null,o=-1,s=this._domRoot;if(n[t])Ee("ZLevel "+t+" has been used already");else if(function(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}(e)){if(0<r&&t>i[0]){for(o=0;o<r-1&&!(i[o]<t&&i[o+1]>t);o++);a=n[i[o]]}if(i.splice(o+1,0,t),!(n[t]=e).virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Ee("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){function e(t){i&&(i.__endIndex!==t&&(i.__dirty=!0),i.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(var n=1;n<t.length;n++){if((a=t[n]).zlevel!==t[n-1].zlevel||a.incremental){this._needsManuallyCompositing=!0;break}}var i=null,r=0;for(n=0;n<t.length;n++){var a,o,s=(a=t[n]).zlevel;a.incremental?((o=this.getLayer(s+.001,this._needsManuallyCompositing)).incremental=!0,r=1):o=this.getLayer(s+(0<r?.01:0),this._needsManuallyCompositing),o.__builtin__||Ee("ZLevel "+s+" has been used by unkown layer "+o.id),o!==i&&(o.__used=!0,o.__startIndex!==n&&(o.__dirty=!0),o.__startIndex=n,o.incremental?o.__drawIndex=-1:o.__drawIndex=n,e(n),i=o),a.__dirty&&(o.__dirty=!0,o.incremental&&o.__drawIndex<0&&(o.__drawIndex=n))}e(n),this.eachBuiltinLayer(function(t,e){!t.__used&&0<t.getElementCount()&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},setBackgroundColor:function(t){this._backgroundColor=t},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?f(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];if(r===t||r===t+.01)f(this._layers[r],n[t],!0)}}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(v(n,t),1))},resize:function(e,n){if(this._domRoot.style){var t=this._domRoot;t.style.display="none";var i=this._opts;if(null!=e&&(i.width=e),null!=n&&(i.height=n),e=this._getSize(0),n=this._getSize(1),t.style.display="",this._width!==e||n!==this._height){for(var r in t.style.width=e+"px",t.style.height=n+"px",this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(e,n);k(this._progressiveLayers,function(t){t.resize(e,n)}),this.refresh(!0)}this._width=e,this._height=n}else{if(null==e||null==n)return;this._width=e,this._height=n,this.getLayer(vi).resize(e,n)}return this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[vi].dom;var e=new yn("image",this,t.pixelRatio||this.dpr);if(e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor),t.pixelRatio<=this.dpr){this.refresh();var n=e.dom.width,i=e.dom.height,r=e.ctx;this.eachLayer(function(t){t.__builtin__?r.drawImage(t.dom,0,0,n,i):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var a={},o=this.storage.getDisplayList(!0),s=0;s<o.length;s++){var l=o[s];this._doPaintEl(l,e,!0,a)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var o=this.root,s=document.defaultView.getComputedStyle(o);return(o[i]||mi(s[n])||mi(o.style[n]))-(mi(s[r])||0)-(mi(s[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),a=t.style,o=a.shadowBlur*e,s=a.shadowOffsetX*e,l=a.shadowOffsetY*e,h=a.hasStroke()?a.lineWidth:0,u=Math.max(h/2,o-s),c=Math.max(h/2,s+o),d=Math.max(h/2,o-l),f=Math.max(h/2,l+o),p=r.width+u+c,g=r.height+d+f;n.width=p*e,n.height=g*e,i.scale(e,e),i.clearRect(0,0,p,g),i.dpr=e;var v={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[u-r.x,d-r.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(i);var m=new gi({style:{x:0,y:0,image:n}});return null!=v.position&&(m.position=t.position=v.position),null!=v.rotation&&(m.rotation=t.rotation=v.rotation),null!=v.scale&&(m.scale=t.scale=v.scale),m}};function wi(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,ft.call(this)}wi.prototype={constructor:wi,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=v(this._clips,t);0<=e&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],a=[],o=0;o<i;o++){var s=n[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(o=0;o<i;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(o=0;o<i;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){var e=this;this._running=!0,_n(function t(){e._running&&(_n(t),e._paused||e._update())})},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},isFinished:function(){return!this._clips.length},animate:function(t,e){var n=new ke(t,(e=e||{}).loop,e.getter,e.setter);return this.addAnimator(n),n}},_(wi,ft);var bi=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Si=["touchstart","touchend","touchmove"],Mi={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},Ii=A(bi,function(t){var e=t.replace("mouse","pointer");return Mi[e]?e:t});function Ti(t){return"mousewheel"===t&&m.browser.firefox?"DOMMouseScroll":t}function Ci(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}var Di={mousemove:function(t){t=St(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=St(this.dom,t)).toElement||t.relatedTarget;if(e!==this.dom)for(;e&&9!==e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=St(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,this.handler.processGesture(this,t,"start"),Di.mousemove.call(this,t),Di.mousedown.call(this,t),Ci(this)},touchmove:function(t){(t=St(this.dom,t)).zrByTouch=!0,this.handler.processGesture(this,t,"change"),Di.mousemove.call(this,t),Ci(this)},touchend:function(t){(t=St(this.dom,t)).zrByTouch=!0,this.handler.processGesture(this,t,"end"),Di.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&Di.click.call(this,t),Ci(this)},pointerdown:function(t){Di.mousedown.call(this,t)},pointermove:function(t){ki(t)||Di.mousemove.call(this,t)},pointerup:function(t){Di.mouseup.call(this,t)},pointerout:function(t){ki(t)||Di.mouseout.call(this,t)}};function ki(t){var e=t.pointerType;return"pen"===e||"touch"===e}function Ai(n){function t(t,e){k(t,function(t){!function(t,e,n){mt?t.addEventListener(e,n):t.attachEvent("on"+e,n)}(n,Ti(t),e._handlers[t])},e)}ft.call(this),this.dom=n,this._touching=!1,this._touchTimer,this._handlers={},function(e){k(Si,function(t){e._handlers[t]=w(Di[t],e)}),k(Ii,function(t){e._handlers[t]=w(Di[t],e)}),k(bi,function(t){e._handlers[t]=function(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}(Di[t],e)})}(this),m.pointerEventsSupported?t(Ii,this):(m.touchEventsSupported&&t(Si,this),t(bi,this))}k(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(e){Di[e]=function(t){t=St(this.dom,t),this.trigger(e,t)}});var Li=Ai.prototype;Li.dispose=function(){for(var t,e,n,i=bi.concat(Si),r=0;r<i.length;r++){var a=i[r];t=this.dom,e=Ti(a),n=this._handlers[a],mt?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}},Li.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},_(Ai,ft);var Pi=!m.canvasSupported,Oi={canvas:xi};function Ei(t,e){return new Ni(n(),t,e)}var Ni=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new nn,a=n.renderer;if(Pi){if(!Oi.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");a="vml"}else a&&Oi[a]||(a="canvas");var o=new Oi[a](e,r,n,t);this.storage=r,this.painter=o;var s=m.node||m.worker?null:new Ai(o.getViewportRoot());this.handler=new Lt(r,o,s,o.root),this.animation=new wi({stage:{update:w(this.flush,this)}}),this.animation.start(),this._needsRefresh;var l=r.delFromStorage,h=r.addToStorage;r.delFromStorage=function(t){l.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){h.call(r,t),t.addSelfToZr(i)}};Ni.prototype={constructor:Ni,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this._needsRefresh=!0},setBackgroundColor:function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=this._needsRefreshHover=!1,this.painter.refresh(),this._needsRefresh=this._needsRefreshHover=!1},refresh:function(){this._needsRefresh=!0},flush:function(){var t;this._needsRefresh&&(t=!0,this.refreshImmediately()),this._needsRefreshHover&&(t=!0,this.refreshHoverImmediately()),t&&this.trigger("rendered")},addHover:function(t,e){if(this.painter.addHover){var n=this.painter.addHover(t,e);return this.refreshHover(),n}},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null}};var Bi=k,zi=O,Ri=C,Fi="series\0";function Vi(t){return t instanceof Array?t:null==t?[]:[t]}function Wi(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var a=n[i];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}var Hi=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function Gi(t){return!zi(t)||Ri(t)||t instanceof Date?t:t.value}function Xi(t,r){r=(r||[]).slice();var a=A(t||[],function(t,e){return{exist:t}});return Bi(r,function(t,e){if(zi(t)){for(var n=0;n<a.length;n++)if(!a[n].option&&null!=t.id&&a[n].exist.id===t.id+"")return a[n].option=t,void(r[e]=null);for(n=0;n<a.length;n++){var i=a[n].exist;if(!(a[n].option||null!=i.id&&null!=t.id||null==t.name||qi(t)||qi(i)||i.name!==t.name+""))return a[n].option=t,void(r[e]=null)}}}),Bi(r,function(t,e){if(zi(t)){for(var n=0;n<a.length;n++){var i=a[n].exist;if(!a[n].option&&!qi(i)&&null==t.id){a[n].option=t;break}}n>=a.length&&a.push({option:t})}}),a}function Ui(t){var e=t.name;return!(!e||!e.indexOf(Fi))}function qi(t){return zi(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Yi(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?C(t.dataIndex)?A(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?C(t.name)?A(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function ji(){var e="__\0ec_inner_"+Zi+++"_"+Math.random().toFixed(5);return function(t){return t[e]||(t[e]={})}}var Zi=0;function $i(s,l,h){if(L(l)){var t={};t[l+"Index"]=0,l=t}var e=h&&h.defaultMainType;!e||Ki(l,e+"Index")||Ki(l,e+"Id")||Ki(l,e+"Name")||(l[e+"Index"]=0);var u={};return Bi(l,function(t,e){t=l[e];if("dataIndex"!==e&&"dataIndexInside"!==e){var n=e.match(/^(\w+)(Index|Id|Name)$/)||[],i=n[1],r=(n[2]||"").toLowerCase();if(!(!i||!r||null==t||"index"===r&&"none"===t||h&&h.includeMainTypes&&v(h.includeMainTypes,i)<0)){var a={mainType:i};"index"===r&&"all"===t||(a[r]=t);var o=s.queryComponents(a);u[i+"Models"]=o,u[i+"Model"]=o[0]}}else u[e]=t}),u}function Ki(t,e){return t&&t.hasOwnProperty(e)}function Qi(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}var Ji=".",tr="___EC__COMPONENT__CONTAINER___";function er(t){var e={main:"",sub:""};return t&&(t=t.split(Ji),e.main=t[0]||"",e.sub=t[1]||""),e}function nr(t){(t.$constructor=t).extend=function(t){function e(){t.$constructor?t.$constructor.apply(this,arguments):n.apply(this,arguments)}var n=this;return S(e.prototype,t),e.extend=this.extend,e.superCall=ar,e.superApply=or,y(e,this),e.superClass=n,e}}var ir=0;function rr(t){var e=["__\0is_clz",ir++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function ar(t,e){var n=W(arguments,2);return this.superClass.prototype[e].apply(t,n)}function or(t,e,n){return this.superClass.prototype[e].apply(t,n)}function sr(n,t){t=t||{};var r={};if(n.registerClass=function(t,e){if(e)if(function(t){G(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}(e),(e=er(e)).sub){if(e.sub!==tr){(function(t){var e=r[t.main];e&&e[tr]||((e=r[t.main]={})[tr]=!0);return e})(e)[e.sub]=t}}else r[e.main]=t;return t},n.getClass=function(t,e,n){var i=r[t];if(i&&i[tr]&&(i=e?i[e]:null),n&&!i)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return i},n.getClassesByMainType=function(t){t=er(t);var n=[],e=r[t.main];return e&&e[tr]?k(e,function(t,e){e!==tr&&n.push(t)}):n.push(e),n},n.hasClass=function(t){return t=er(t),!!r[t.main]},n.getAllClassMainTypes=function(){var n=[];return k(r,function(t,e){n.push(e)}),n},n.hasSubTypes=function(t){t=er(t);var e=r[t.main];return e&&e[tr]},n.parseClassType=er,t.registerWhenExtend){var i=n.extend;i&&(n.extend=function(t){var e=i.call(this,t);return n.registerClass(e,t.type)})}return n}function lr(s){for(var t=0;t<s.length;t++)s[t][1]||(s[t][1]=s[t][0]);return function(t,e,n){for(var i={},r=0;r<s.length;r++){var a=s[r][1];if(!(e&&0<=v(e,a)||n&&v(n,a)<0)){var o=t.getShallow(a);null!=o&&(i[s[r][0]]=o)}}return i}}var hr=lr([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),ur={getLineStyle:function(t){var e=hr(this,t);return e.lineDash=this.getLineDash(e.lineWidth),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"!==e&&null!=e&&("dashed"===e?[i,i]:[n,n])}},cr=lr([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),dr={getAreaStyle:function(t,e){return cr(this,t,e)}},fr=Math.pow,pr=Math.sqrt,gr=1e-8,vr=1e-4,mr=pr(3),yr=1/3,_r=Q(),xr=Q(),wr=Q();function br(t){return-gr<t&&t<gr}function Sr(t){return gr<t||t<-gr}function Mr(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function Ir(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function Tr(t,e,n,i,r){var a=6*n-12*e+6*t,o=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(br(o)){if(Sr(a))0<=(u=-s/a)&&u<=1&&(r[l++]=u)}else{var h=a*a-4*o*s;if(br(h))r[0]=-a/(2*o);else if(0<h){var u,c=pr(h),d=(-a-c)/(2*o);0<=(u=(-a+c)/(2*o))&&u<=1&&(r[l++]=u),0<=d&&d<=1&&(r[l++]=d)}}return l}function Cr(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=i}function Dr(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function kr(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function Ar(t,e,n){var i=t+n-2*e;return 0==i?.5:(t-e)/i}function Lr(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}var Pr=Math.min,Or=Math.max,Er=Math.sin,Nr=Math.cos,Br=2*Math.PI,zr=Q(),Rr=Q(),Fr=Q();function Vr(t,e,n,i,r,a){r[0]=Pr(t,n),r[1]=Pr(e,i),a[0]=Or(t,n),a[1]=Or(e,i)}var Wr=[],Hr=[];function Gr(t,e,n,i,r,a,o,s,l,h){var u,c=Tr,d=Mr,f=c(t,n,r,o,Wr);for(l[0]=1/0,l[1]=1/0,h[0]=-1/0,h[1]=-1/0,u=0;u<f;u++){var p=d(t,n,r,o,Wr[u]);l[0]=Pr(p,l[0]),h[0]=Or(p,h[0])}for(f=c(e,i,a,s,Hr),u=0;u<f;u++){var g=d(e,i,a,s,Hr[u]);l[1]=Pr(g,l[1]),h[1]=Or(g,h[1])}l[0]=Pr(t,l[0]),h[0]=Or(t,h[0]),l[0]=Pr(o,l[0]),h[0]=Or(o,h[0]),l[1]=Pr(e,l[1]),h[1]=Or(e,h[1]),l[1]=Pr(s,l[1]),h[1]=Or(s,h[1])}function Xr(t,e,n,i,r,a,o,s,l){var h=lt,u=ht,c=Math.abs(r-a);if(c%Br<1e-4&&1e-4<c)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(zr[0]=Nr(r)*n+t,zr[1]=Er(r)*i+e,Rr[0]=Nr(a)*n+t,Rr[1]=Er(a)*i+e,h(s,zr,Rr),u(l,zr,Rr),(r%=Br)<0&&(r+=Br),(a%=Br)<0&&(a+=Br),a<r&&!o?a+=Br:r<a&&o&&(r+=Br),o){var d=a;a=r,r=d}for(var f=0;f<a;f+=Math.PI/2)r<f&&(Fr[0]=Nr(f)*n+t,Fr[1]=Er(f)*i+e,h(s,Fr,s),u(l,Fr,l))}var Ur={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},qr=[],Yr=[],jr=[],Zr=[],$r=Math.min,Kr=Math.max,Qr=Math.cos,Jr=Math.sin,ta=Math.sqrt,ea=Math.abs,na="undefined"!=typeof Float32Array,ia=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};function ra(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0;if(e+s<o&&i+s<o||o<e-s&&o<i-s||t+s<a&&n+s<a||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;var h=(l=(e-i)/(t-n))*a-o+(t*i-n*e)/(t-n);return h*h/(l*l+1)<=s/2*s/2}function aa(t,e,n,i,r,a,o,s,l,h,u){if(0===l)return!1;var c=l;return!(e+c<u&&i+c<u&&a+c<u&&s+c<u||u<e-c&&u<i-c&&u<a-c&&u<s-c||t+c<h&&n+c<h&&r+c<h&&o+c<h||h<t-c&&h<n-c&&h<r-c&&h<o-c)&&function(t,e,n,i,r,a,o,s,l,h,u){var c,d,f,p,g,v=.005,m=1/0;_r[0]=l,_r[1]=h;for(var y=0;y<1;y+=.05)xr[0]=Mr(t,n,r,o,y),xr[1]=Mr(e,i,a,s,y),(p=ot(_r,xr))<m&&(c=y,m=p);m=1/0;for(var _=0;_<32&&!(v<vr);_++)d=c-v,f=c+v,xr[0]=Mr(t,n,r,o,d),xr[1]=Mr(e,i,a,s,d),p=ot(xr,_r),0<=d&&p<m?(c=d,m=p):(wr[0]=Mr(t,n,r,o,f),wr[1]=Mr(e,i,a,s,f),g=ot(wr,_r),f<=1&&g<m?(c=f,m=g):v*=.5);return u&&(u[0]=Mr(t,n,r,o,c),u[1]=Mr(e,i,a,s,c)),pr(m)}(t,e,n,i,r,a,o,s,h,u,null)<=c/2}function oa(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;return!(e+h<l&&i+h<l&&a+h<l||l<e-h&&l<i-h&&l<a-h||t+h<s&&n+h<s&&r+h<s||s<t-h&&s<n-h&&s<r-h)&&function(t,e,n,i,r,a,o,s,l){var h,u=.005,c=1/0;_r[0]=o,_r[1]=s;for(var d=0;d<1;d+=.05){xr[0]=Dr(t,n,r,d),xr[1]=Dr(e,i,a,d),(v=ot(_r,xr))<c&&(h=d,c=v)}c=1/0;for(var f=0;f<32&&!(u<vr);f++){var p=h-u,g=h+u;xr[0]=Dr(t,n,r,p),xr[1]=Dr(e,i,a,p);var v=ot(xr,_r);if(0<=p&&v<c)h=p,c=v;else{wr[0]=Dr(t,n,r,g),wr[1]=Dr(e,i,a,g);var m=ot(wr,_r);g<=1&&m<c?(h=g,c=m):u*=.5}}return l&&(l[0]=Dr(t,n,r,h),l[1]=Dr(e,i,a,h)),pr(c)}(t,e,n,i,r,a,s,l,null)<=h/2}ia.prototype={constructor:ia,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e,n){n=n||0,this._ux=ea(n/Le/t)||0,this._uy=ea(n/Le/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return(this._ctx=t)&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(Ur.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=ea(t-this._xi)>this._ux||ea(e-this._yi)>this._uy||this._len<5;return this.addData(Ur.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(Ur.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(Ur.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(Ur.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=Qr(r)*n+t,this._yi=Jr(r)*n+e,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(Ur.R,t,e,n,i),this},closePath:function(){this.addData(Ur.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length===e||!na||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();na&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,d=ta(u*u+c*c),f=l,p=h,g=o.length;for(a<0&&(a=r+a),f-=(a%=r)*(u/=d),p-=a*(c/=d);0<u&&f<=t||u<0&&t<=f||0===u&&(0<c&&p<=e||c<0&&e<=p);)f+=u*(n=o[i=this._dashIdx]),p+=c*n,this._dashIdx=(i+1)%g,0<u&&f<l||u<0&&l<f||0<c&&p<h||c<0&&h<p||s[i%2?"moveTo":"lineTo"](0<=u?$r(f,t):Kr(f,t),0<=c?$r(p,e):Kr(p,e));u=f-t,c=p-e,this._dashOffset=-ta(u*u+c*c)},_dashedBezierTo:function(t,e,n,i,r,a){var o,s,l,h,u,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,v=this._yi,m=Mr,y=0,_=this._dashIdx,x=f.length,w=0;for(d<0&&(d=c+d),d%=c,o=0;o<1;o+=.1)s=m(g,t,n,r,o+.1)-m(g,t,n,r,o),l=m(v,e,i,a,o+.1)-m(v,e,i,a,o),y+=ta(s*s+l*l);for(;_<x&&!(d<(w+=f[_]));_++);for(o=(w-d)/y;o<=1;)h=m(g,t,n,r,o),u=m(v,e,i,a,o),_%2?p.moveTo(h,u):p.lineTo(h,u),o+=f[_]/y,_=(_+1)%x;_%2!=0&&p.lineTo(r,a),s=r-h,l=a-u,this._dashOffset=-ta(s*s+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,na&&(this.data=new Float32Array(t)))},getBoundingRect:function(){qr[0]=qr[1]=jr[0]=jr[1]=Number.MAX_VALUE,Yr[0]=Yr[1]=Zr[0]=Zr[1]=-Number.MAX_VALUE;for(var t,e,n,i,r,a,o,s,l,h,u,c,d,f,p=this.data,g=0,v=0,m=0,y=0,_=0;_<p.length;){var x=p[_++];switch(1===_&&(m=g=p[_],y=v=p[_+1]),x){case Ur.M:g=m=p[_++],v=y=p[_++],jr[0]=m,jr[1]=y,Zr[0]=m,Zr[1]=y;break;case Ur.L:Vr(g,v,p[_],p[_+1],jr,Zr),g=p[_++],v=p[_++];break;case Ur.C:Gr(g,v,p[_++],p[_++],p[_++],p[_++],p[_],p[_+1],jr,Zr),g=p[_++],v=p[_++];break;case Ur.Q:t=g,e=v,n=p[_++],i=p[_++],r=p[_],a=p[_+1],o=jr,s=Zr,h=l=void 0,h=Dr,u=Or(Pr((l=Ar)(t,n,r),1),0),c=Or(Pr(l(e,i,a),1),0),d=h(t,n,r,u),f=h(e,i,a,c),o[0]=Pr(t,r,d),o[1]=Pr(e,a,f),s[0]=Or(t,r,d),s[1]=Or(e,a,f),g=p[_++],v=p[_++];break;case Ur.A:var w=p[_++],b=p[_++],S=p[_++],M=p[_++],I=p[_++],T=p[_++]+I;_+=1;var C=1-p[_++];1===_&&(m=Qr(I)*S+w,y=Jr(I)*M+b),Xr(w,b,S,M,I,T,C,jr,Zr),g=Qr(T)*S+w,v=Jr(T)*M+b;break;case Ur.R:Vr(m=g=p[_++],y=v=p[_++],m+p[_++],y+p[_++],jr,Zr);break;case Ur.Z:g=m,v=y}lt(qr,qr,jr),ht(Yr,Yr,Zr)}return 0===_&&(qr[0]=qr[1]=Yr[0]=Yr[1]=0),new Ue(qr[0],qr[1],Yr[0]-qr[0],Yr[1]-qr[1])},rebuildPath:function(t){for(var e,n,i,r,a,o,s=this.data,l=this._ux,h=this._uy,u=this._len,c=0;c<u;){var d=s[c++];switch(1===c&&(e=i=s[c],n=r=s[c+1]),d){case Ur.M:e=i=s[c++],n=r=s[c++],t.moveTo(i,r);break;case Ur.L:a=s[c++],o=s[c++],(ea(a-i)>l||ea(o-r)>h||c===u-1)&&(t.lineTo(a,o),i=a,r=o);break;case Ur.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case Ur.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case Ur.A:var f=s[c++],p=s[c++],g=s[c++],v=s[c++],m=s[c++],y=s[c++],_=s[c++],x=s[c++],w=v<g?g:v,b=v<g?1:g/v,S=v<g?v/g:1,M=m+y;.001<Math.abs(g-v)?(t.translate(f,p),t.rotate(_),t.scale(b,S),t.arc(0,0,w,m,M,1-x),t.scale(1/b,1/S),t.rotate(-_),t.translate(-f,-p)):t.arc(f,p,w,m,M,1-x),1===c&&(e=Qr(m)*g+f,n=Jr(m)*v+p),i=Qr(M)*g+f,r=Jr(M)*v+p;break;case Ur.R:e=i=s[c],n=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case Ur.Z:t.closePath(),i=e,r=n}}}},ia.CMD=Ur;var sa=2*Math.PI;function la(t){return(t%=sa)<0&&(t+=sa),t}var ha=2*Math.PI;function ua(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;s-=t,l-=e;var u=Math.sqrt(s*s+l*l);if(n<u-h||u+h<n)return!1;if(Math.abs(i-r)%ha<1e-4)return!0;if(a){var c=i;i=la(r),r=la(c)}else i=la(i),r=la(r);r<i&&(r+=ha);var d=Math.atan2(l,s);return d<0&&(d+=ha),i<=d&&d<=r||i<=d+ha&&d+ha<=r}function ca(t,e,n,i,r,a){if(e<a&&i<a||a<e&&a<i)return 0;if(i===e)return 0;var o=i<e?1:-1,s=(a-e)/(i-e);1!=s&&0!=s||(o=i<e?.5:-.5);var l=s*(n-t)+t;return l===r?1/0:r<l?o:0}var da=ia.CMD,fa=2*Math.PI,pa=1e-4;var ga=[-1,-1,-1],va=[-1,-1];function ma(t,e,n,i,r,a,o,s,l,h){if(e<h&&i<h&&a<h&&s<h||h<e&&h<i&&h<a&&h<s)return 0;var u,c=function(t,e,n,i,r,a){var o=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),h=t-r,u=s*s-3*o*l,c=s*l-9*o*h,d=l*l-3*s*h,f=0;if(br(u)&&br(c)){if(br(s))a[0]=0;else 0<=(M=-l/s)&&M<=1&&(a[f++]=M)}else{var p=c*c-4*u*d;if(br(p)){var g=c/u,v=-g/2;0<=(M=-s/o+g)&&M<=1&&(a[f++]=M),0<=v&&v<=1&&(a[f++]=v)}else if(0<p){var m=pr(p),y=u*s+1.5*o*(-c+m),_=u*s+1.5*o*(-c-m);0<=(M=(-s-((y=y<0?-fr(-y,yr):fr(y,yr))+(_=_<0?-fr(-_,yr):fr(_,yr))))/(3*o))&&M<=1&&(a[f++]=M)}else{var x=(2*u*s-3*o*c)/(2*pr(u*u*u)),w=Math.acos(x)/3,b=pr(u),S=Math.cos(w),M=(-s-2*b*S)/(3*o),I=(v=(-s+b*(S+mr*Math.sin(w)))/(3*o),(-s+b*(S-mr*Math.sin(w)))/(3*o));0<=M&&M<=1&&(a[f++]=M),0<=v&&v<=1&&(a[f++]=v),0<=I&&I<=1&&(a[f++]=I)}}return f}(e,i,a,s,h,ga);if(0===c)return 0;for(var d,f,p=0,g=-1,v=0;v<c;v++){var m=ga[v],y=0===m||1===m?.5:1;Mr(t,n,r,o,m)<l||(g<0&&(g=Tr(e,i,a,s,va),va[1]<va[0]&&1<g&&(void 0,u=va[0],va[0]=va[1],va[1]=u),d=Mr(e,i,a,s,va[0]),1<g&&(f=Mr(e,i,a,s,va[1]))),2===g?m<va[0]?p+=d<e?y:-y:m<va[1]?p+=f<d?y:-y:p+=s<f?y:-y:m<va[0]?p+=d<e?y:-y:p+=s<d?y:-y)}return p}function ya(t,e,n,i,r,a,o,s){if(e<s&&i<s&&a<s||s<e&&s<i&&s<a)return 0;var l=function(t,e,n,i,r){var a=t-2*e+n,o=2*(e-t),s=t-i,l=0;if(br(a)){if(Sr(o))0<=(u=-s/o)&&u<=1&&(r[l++]=u)}else{var h=o*o-4*a*s;if(br(h))0<=(u=-o/(2*a))&&u<=1&&(r[l++]=u);else if(0<h){var u,c=pr(h),d=(-o-c)/(2*a);0<=(u=(-o+c)/(2*a))&&u<=1&&(r[l++]=u),0<=d&&d<=1&&(r[l++]=d)}}return l}(e,i,a,s,ga);if(0===l)return 0;var h=Ar(e,i,a);if(0<=h&&h<=1){for(var u=0,c=Dr(e,i,a,h),d=0;d<l;d++){var f=0===ga[d]||1===ga[d]?.5:1;Dr(t,n,r,ga[d])<o||(ga[d]<h?u+=c<e?f:-f:u+=a<c?f:-f)}return u}f=0===ga[0]||1===ga[0]?.5:1;return Dr(t,n,r,ga[0])<o?0:a<e?f:-f}function _a(t,e,n,i,r,a,o,s){if(n<(s-=e)||s<-n)return 0;var l=Math.sqrt(n*n-s*s);ga[0]=-l,ga[1]=l;var h=Math.abs(i-r);if(h<1e-4)return 0;if(h%fa<1e-4){r=fa;var u=a?1:-1;return o>=ga[i=0]+t&&o<=ga[1]+t?u:0}if(a){l=i;i=la(r),r=la(l)}else i=la(i),r=la(r);r<i&&(r+=fa);for(var c=0,d=0;d<2;d++){var f=ga[d];if(o<f+t){var p=Math.atan2(s,f);u=a?1:-1;p<0&&(p=fa+p),(i<=p&&p<=r||i<=p+fa&&p+fa<=r)&&(p>Math.PI/2&&p<1.5*Math.PI&&(u=-u),c+=u)}}return c}function xa(t,e,n,i,r){for(var a=0,o=0,s=0,l=0,h=0,u=0;u<t.length;){var c=t[u++];switch(c===da.M&&1<u&&(n||(a+=ca(o,s,l,h,i,r))),1===u&&(l=o=t[u],h=s=t[u+1]),c){case da.M:o=l=t[u++],s=h=t[u++];break;case da.L:if(n){if(ra(o,s,t[u],t[u+1],e,i,r))return!0}else a+=ca(o,s,t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.C:if(n){if(aa(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=ma(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.Q:if(n){if(oa(o,s,t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=ya(o,s,t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case da.A:var d=t[u++],f=t[u++],p=t[u++],g=t[u++],v=t[u++],m=t[u++];u+=1;var y=1-t[u++],_=Math.cos(v)*p+d,x=Math.sin(v)*g+f;1<u?a+=ca(o,s,_,x,i,r):(l=_,h=x);var w=(i-d)*g/p+d;if(n){if(ua(d,f,g,v,v+m,y,e,w,r))return!0}else a+=_a(d,f,g,v,v+m,y,w,r);o=Math.cos(v+m)*p+d,s=Math.sin(v+m)*g+f;break;case da.R:l=o=t[u++],h=s=t[u++];_=l+t[u++],x=h+t[u++];if(n){if(ra(l,h,_,h,e,i,r)||ra(_,h,_,x,e,i,r)||ra(_,x,l,x,e,i,r)||ra(l,x,l,h,e,i,r))return!0}else a+=ca(_,h,_,x,i,r),a+=ca(l,x,l,h,i,r);break;case da.Z:if(n){if(ra(o,s,l,h,e,i,r))return!0}else a+=ca(o,s,l,h,i,r);o=l,s=h}}return n||function(t,e){return Math.abs(t-e)<pa}(s,h)||(a+=ca(o,s,l,h,i,r)||0),0!==a}var wa=gn.prototype.getCanvasPattern,ba=Math.abs,Sa=new ia(!0);function Ma(t){pi.call(this,t),this.path=null}Ma.prototype={constructor:Ma,type:"path",__dirtyPath:!0,strokeContainThreshold:5,segmentIgnoreThreshold:0,subPixelOptimize:!1,brush:function(t,e){var n,i=this.style,r=this.path||Sa,a=i.hasStroke(),o=i.hasFill(),s=i.fill,l=i.stroke,h=o&&!!s.colorStops,u=a&&!!l.colorStops,c=o&&!!s.image,d=a&&!!l.image;i.bind(t,this,e),this.setTransform(t),this.__dirty&&(h&&(n=n||this.getBoundingRect(),this._fillGradient=i.getGradient(t,s,n)),u&&(n=n||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,l,n)));h?t.fillStyle=this._fillGradient:c&&(t.fillStyle=wa.call(s,t)),u?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=wa.call(l,t));var f=i.lineDash,p=i.lineDashOffset,g=!!t.setLineDash,v=this.getGlobalScale();if(r.setScale(v[0],v[1],this.segmentIgnoreThreshold),this.__dirtyPath||f&&!g&&a?(r.beginPath(t),f&&!g&&(r.setLineDash(f),r.setLineDashOffset(p)),this.buildPath(r,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o)if(null!=i.fillOpacity){var m=t.globalAlpha;t.globalAlpha=i.fillOpacity*i.opacity,r.fill(t),t.globalAlpha=m}else r.fill(t);if(f&&g&&(t.setLineDash(f),t.lineDashOffset=p),a)if(null!=i.strokeOpacity){m=t.globalAlpha;t.globalAlpha=i.strokeOpacity*i.opacity,r.stroke(t),t.globalAlpha=m}else r.stroke(t);f&&g&&t.setLineDash([]),null!=i.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new ia},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i=i||(this.path=new ia),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var a=e.lineWidth,o=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),1e-10<o&&(r.width+=a/o,r.height+=a/o,r.x-=a/o/2,r.y-=a/o/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(1e-10<s&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),function(t,e,n,i){return xa(t,e,!0,n,i)}(a,o/s,t,e)))return!0}if(r.hasFill())return function(t,e,n){return xa(t,0,!1,e,n)}(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=this.__dirtyText=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):pi.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(O(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&1e-10<ba(t[0]-1)&&1e-10<ba(t[3]-1)?Math.sqrt(ba(t[0]*t[3]-t[2]*t[1])):1}},Ma.extend=function(r){function t(t){Ma.call(this,t),r.style&&this.style.extendFrom(r.style,!1);var e=r.shape;if(e){this.shape=this.shape||{};var n=this.shape;for(var i in e)!n.hasOwnProperty(i)&&e.hasOwnProperty(i)&&(n[i]=e[i])}r.init&&r.init.call(this,t)}for(var e in y(t,Ma),r)"style"!==e&&"shape"!==e&&(t.prototype[e]=r[e]);return t},y(Ma,pi);function Ia(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}var Ta=ia.CMD,Ca=[[],[],[]],Da=Math.sqrt,ka=Math.atan2,Aa=function(t,e){var n,i,r,a,o,s=t.data,l=Ta.M,h=Ta.C,u=Ta.L,c=Ta.R,d=Ta.A,f=Ta.Q;for(a=r=0;r<s.length;){switch(n=s[r++],a=r,i=0,n){case l:case u:i=1;break;case h:i=3;break;case f:i=2;break;case d:var p=e[4],g=e[5],v=Da(e[0]*e[0]+e[1]*e[1]),m=Da(e[2]*e[2]+e[3]*e[3]),y=ka(-e[1]/m,e[0]/v);s[r]*=v,s[r++]+=p,s[r]*=m,s[r++]+=g,s[r++]*=v,s[r++]*=m,s[r++]+=y,s[r++]+=y,a=r+=2;break;case c:_[0]=s[r++],_[1]=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1],_[0]+=s[r++],_[1]+=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1]}for(o=0;o<i;o++){var _;(_=Ca[o])[0]=s[r++],_[1]=s[r++],st(_,_,e),s[a++]=_[0],s[a++]=_[1]}}},La=Math.sqrt,Pa=Math.sin,Oa=Math.cos,Ea=Math.PI,Na=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(Ia(t)*Ia(e))},Ba=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Na(t,e))};function za(t,e,n,i,r,a,o,s,l,h,u){var c=l*(Ea/180),d=Oa(c)*(t-n)/2+Pa(c)*(e-i)/2,f=-1*Pa(c)*(t-n)/2+Oa(c)*(e-i)/2,p=d*d/(o*o)+f*f/(s*s);1<p&&(o*=La(p),s*=La(p));var g=(r===a?-1:1)*La((o*o*(s*s)-o*o*(f*f)-s*s*(d*d))/(o*o*(f*f)+s*s*(d*d)))||0,v=g*o*f/s,m=g*-s*d/o,y=(t+n)/2+Oa(c)*v-Pa(c)*m,_=(e+i)/2+Pa(c)*v+Oa(c)*m,x=Ba([1,0],[(d-v)/o,(f-m)/s]),w=[(d-v)/o,(f-m)/s],b=[(-1*d-v)/o,(-1*f-m)/s],S=Ba(w,b);Na(w,b)<=-1&&(S=Ea),1<=Na(w,b)&&(S=0),0===a&&0<S&&(S-=2*Ea),1===a&&S<0&&(S+=2*Ea),u.addData(h,y,_,o,s,x,S,c,a)}var Ra=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,Fa=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;function Va(t,e){var n=function(t){if(!t)return new ia;for(var e,n=0,i=0,r=n,a=i,o=new ia,s=ia.CMD,l=t.match(Ra),h=0;h<l.length;h++){for(var u,c=l[h],d=c.charAt(0),f=c.match(Fa)||[],p=f.length,g=0;g<p;g++)f[g]=parseFloat(f[g]);for(var v=0;v<p;){var m,y,_,x,w,b,S,M=n,I=i;switch(d){case"l":n+=f[v++],i+=f[v++],u=s.L,o.addData(u,n,i);break;case"L":n=f[v++],i=f[v++],u=s.L,o.addData(u,n,i);break;case"m":n+=f[v++],i+=f[v++],u=s.M,o.addData(u,n,i),r=n,a=i,d="l";break;case"M":n=f[v++],i=f[v++],u=s.M,o.addData(u,n,i),r=n,a=i,d="L";break;case"h":n+=f[v++],u=s.L,o.addData(u,n,i);break;case"H":n=f[v++],u=s.L,o.addData(u,n,i);break;case"v":i+=f[v++],u=s.L,o.addData(u,n,i);break;case"V":i=f[v++],u=s.L,o.addData(u,n,i);break;case"C":u=s.C,o.addData(u,f[v++],f[v++],f[v++],f[v++],f[v++],f[v++]),n=f[v-2],i=f[v-1];break;case"c":u=s.C,o.addData(u,f[v++]+n,f[v++]+i,f[v++]+n,f[v++]+i,f[v++]+n,f[v++]+i),n+=f[v-2],i+=f[v-1];break;case"S":m=n,y=i;var T=o.len(),C=o.data;e===s.C&&(m+=n-C[T-4],y+=i-C[T-3]),u=s.C,M=f[v++],I=f[v++],n=f[v++],i=f[v++],o.addData(u,m,y,M,I,n,i);break;case"s":m=n,y=i;T=o.len(),C=o.data;e===s.C&&(m+=n-C[T-4],y+=i-C[T-3]),u=s.C,M=n+f[v++],I=i+f[v++],n+=f[v++],i+=f[v++],o.addData(u,m,y,M,I,n,i);break;case"Q":M=f[v++],I=f[v++],n=f[v++],i=f[v++],u=s.Q,o.addData(u,M,I,n,i);break;case"q":M=f[v++]+n,I=f[v++]+i,n+=f[v++],i+=f[v++],u=s.Q,o.addData(u,M,I,n,i);break;case"T":m=n,y=i;T=o.len(),C=o.data;e===s.Q&&(m+=n-C[T-4],y+=i-C[T-3]),n=f[v++],i=f[v++],u=s.Q,o.addData(u,m,y,n,i);break;case"t":m=n,y=i;T=o.len(),C=o.data;e===s.Q&&(m+=n-C[T-4],y+=i-C[T-3]),n+=f[v++],i+=f[v++],u=s.Q,o.addData(u,m,y,n,i);break;case"A":_=f[v++],x=f[v++],w=f[v++],b=f[v++],S=f[v++],za(M=n,I=i,n=f[v++],i=f[v++],b,S,_,x,w,u=s.A,o);break;case"a":_=f[v++],x=f[v++],w=f[v++],b=f[v++],S=f[v++],za(M=n,I=i,n+=f[v++],i+=f[v++],b,S,_,x,w,u=s.A,o)}}"z"!==d&&"Z"!==d||(u=s.Z,o.addData(u),n=r,i=a),e=u}return o.toStatic(),o}(t);return(e=e||{}).buildPath=function(t){if(t.setData){t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e)}else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){Aa(n,t),this.dirty(!0)},e}function Wa(t,e){return new Ma(Va(t,e))}function Ha(t){pi.call(this,t)}Ha.prototype={constructor:Ha,type:"text",brush:function(t,e){var n=this.style;this.__dirty&&Kn(n),n.fill=n.stroke=n.shadowBlur=n.shadowColor=n.shadowOffsetX=n.shadowOffsetY=null;var i=n.text;null!=i&&(i+=""),ci(i,n)?(this.setTransform(t),Jn(this,t,i,n,null,e),this.restoreTransform(t)):t.__attrCachedBy=on.NONE},getBoundingRect:function(){var t=this.style;if(this.__dirty&&Kn(t),!this._rect){var e=t.text;null!=e?e+="":e="";var n=Pn(t.text+"",t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.textLineHeight,t.rich);if(n.x+=t.x||0,n.y+=t.y||0,si(t.textStroke,t.textStrokeWidth)){var i=t.textStrokeWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},y(Ha,pi);function Ga(l){return m.browser.ie&&11<=m.browser.version?function(){var t,e=this.__clipPaths,n=this.style;if(e)for(var i=0;i<e.length;i++){var r=e[i],a=r&&r.shape,o=r&&r.type;if(a&&("sector"===o&&a.startAngle===a.endAngle||"rect"===o&&(!a.width||!a.height))){for(var s=0;s<Ua.length;s++)Ua[s][2]=n[Ua[s][0]],n[Ua[s][0]]=Ua[s][1];t=!0;break}}if(l.apply(this,arguments),t)for(s=0;s<Ua.length;s++)n[Ua[s][0]]=Ua[s][2]}:l}var Xa=Ma.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}}),Ua=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]],qa=Ma.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(o),u=Math.sin(o);t.moveTo(h*r+n,u*r+i),t.lineTo(h*a+n,u*a+i),t.arc(n,i,a,o,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,l),t.closePath()}}),Ya=Ma.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}});function ja(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Za(t,e,n){var i=e.points,r=e.smooth;if(i&&2<=i.length){if(r&&"spline"!==r){var a=function(t,e,n,i){var r,a,o,s,l=[],h=[],u=[],c=[];if(i){o=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;d<f;d++)lt(o,o,t[d]),ht(s,s,t[d]);lt(o,o,i[0]),ht(s,s,i[1])}for(d=0,f=t.length;d<f;d++){var p=t[d];if(n)r=t[d?d-1:f-1],a=t[(d+1)%f];else{if(0===d||d===f-1){l.push(J(t[d]));continue}r=t[d-1],a=t[d+1]}et(h,a,r),nt(h,h,e);var g=rt(p,r),v=rt(p,a),m=g+v;0!==m&&(g/=m,v/=m),nt(u,h,-g),nt(c,h,v);var y=tt([],p,u),_=tt([],p,c);i&&(ht(y,y,o),lt(y,y,s),ht(_,_,o),lt(_,_,s)),l.push(y),l.push(_)}return n&&l.push(l.shift()),l}(i,r,n,e.smoothConstraint);t.moveTo(i[0][0],i[0][1]);for(var o=i.length,s=0;s<(n?o:o-1);s++){var l=a[2*s],h=a[2*s+1],u=i[(s+1)%o];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===r&&(i=function(t,e){for(var n=t.length,i=[],r=0,a=1;a<n;a++)r+=rt(t[a-1],t[a]);var o=r/2;o=o<n?n:o;for(a=0;a<o;a++){var s,l,h,u=a/(o-1)*(e?n:n-1),c=Math.floor(u),d=u-c,f=t[c%n];h=e?(s=t[(c-1+n)%n],l=t[(c+1)%n],t[(c+2)%n]):(s=t[0===c?c:c-1],l=t[n-2<c?n-1:c+1],t[n-3<c?n-1:c+2]);var p=d*d,g=d*p;i.push([ja(s[0],f[0],l[0],h[0],d,p,g),ja(s[1],f[1],l[1],h[1],d,p,g)])}return i}(i,n)),t.moveTo(i[0][0],i[0][1]);s=1;for(var c=i.length;s<c;s++)t.lineTo(i[s][0],i[s][1])}n&&t.closePath()}}var $a=Ma.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){Za(t,e,!0)}}),Ka=Ma.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){Za(t,e,!1)}}),Qa=Math.round;function Ja(t,e,n){var i=n&&n.lineWidth;if(e&&i){var r=e.x1,a=e.x2,o=e.y1,s=e.y2;Qa(2*r)===Qa(2*a)?t.x1=t.x2=eo(r,i,!0):(t.x1=r,t.x2=a),Qa(2*o)===Qa(2*s)?t.y1=t.y2=eo(o,i,!0):(t.y1=o,t.y2=s)}}function to(t,e,n){var i=n&&n.lineWidth;if(e&&i){var r=e.x,a=e.y,o=e.width,s=e.height;t.x=eo(r,i,!0),t.y=eo(a,i,!0),t.width=Math.max(eo(r+o,i,!1)-t.x,0===o?0:1),t.height=Math.max(eo(a+s,i,!1)-t.y,0===s?0:1)}}function eo(t,e,n){var i=Qa(2*t);return(i+Qa(e))%2==0?i/2:(i+(n?1:-1))/2}var no={},io=Ma.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n,i,r,a;this.subPixelOptimize?(to(no,e,this.style),n=no.x,i=no.y,r=no.width,a=no.height,no.r=e.r,e=no):(n=e.x,i=e.y,r=e.width,a=e.height),e.r?Xn(t,e):t.rect(n,i,r,a),t.closePath()}}),ro={},ao=Ma.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n,i,r,a;a=this.subPixelOptimize?(Ja(ro,e,this.style),n=ro.x1,i=ro.y1,r=ro.x2,ro.y2):(n=e.x1,i=e.y1,r=e.x2,e.y2);var o=e.percent;0!==o&&(t.moveTo(n,i),o<1&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),oo=[];function so(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?Ir:Mr)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?Ir:Mr)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?kr:Dr)(t.x1,t.cpx1,t.x2,e),(n?kr:Dr)(t.y1,t.cpy1,t.y2,e)]}function lo(t){this.colorStops=t||[]}var ho=Ma.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.cpx1,s=e.cpy1,l=e.cpx2,h=e.cpy2,u=e.percent;0!==u&&(t.moveTo(n,i),null==l||null==h?(u<1&&(Lr(n,o,r,u,oo),o=oo[1],r=oo[2],Lr(i,s,a,u,oo),s=oo[1],a=oo[2]),t.quadraticCurveTo(o,s,r,a)):(u<1&&(Cr(n,o,l,r,u,oo),o=oo[1],l=oo[2],r=oo[3],Cr(i,s,h,a,u,oo),s=oo[1],h=oo[2],a=oo[3]),t.bezierCurveTo(o,s,l,h,r,a)))},pointAt:function(t){return so(this.shape,t,!1)},tangentAt:function(t){var e=so(this.shape,t,!0);return it(e,e)}}),uo=Ma.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+n,h*r+i),t.arc(n,i,r,a,o,!s)}}),co=Ma.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),Ma.prototype.getBoundingRect.call(this)}});lo.prototype={constructor:lo,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}};function fo(t,e,n,i,r,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=a||!1,lo.call(this,r)}fo.prototype={constructor:fo},y(fo,lo);function po(t,e,n,i,r){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=r||!1,lo.call(this,i)}function go(t){pi.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}po.prototype={constructor:po},y(po,lo),go.prototype.incremental=!0,go.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.dirty(),this.notClear=!1},go.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.dirty()},go.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},go.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},go.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(t=0;t<this._temporaryDisplayables.length;t++){var e;(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},go.prototype.brush=function(t,e){for(var n=this._cursor;n<this._displayables.length;n++){(i=this._displayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,n===this._cursor?null:this._displayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._cursor=n;for(n=0;n<this._temporaryDisplayables.length;n++){var i;(i=this._temporaryDisplayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,0===n?null:this._temporaryDisplayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._temporaryDisplayables=[],this.notClear=!0};var vo=[];go.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new Ue(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(vo)),t.union(i)}this._rect=t}return this._rect},go.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},y(go,pi);var mo=Math.max,yo=Math.min,_o={},xo=1,wo="emphasis",bo="normal",So=1,Mo={},Io={};function To(t){return Ma.extend(t)}function Co(t,e){Io[t]=e}function Do(t,e,n,i){var r=Wa(t,e);return n&&("center"===i&&(n=Ao(n,r.getBoundingRect())),Po(r,n)),r}function ko(t,n,i){var r=new gi({style:{image:t,x:n.x,y:n.y,width:n.width,height:n.height},onload:function(t){if("center"===i){var e={width:t.width,height:t.height};r.setStyle(Ao(n,e))}}});return r}function Ao(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}function Lo(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var o=new Ma(e);return o.createPathProxy(),o.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},o}function Po(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}var Oo=eo;function Eo(t){return null!=t&&"none"!==t}var No=Z(),Bo=0;function zo(t){if("string"!=typeof t)return t;var e=No.get(t);return e||(e=function(t,e){var n=fe(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,255<n[i]?n[i]=255:t[i]<0&&(n[i]=0);return ge(n,4===n.length?"rgba":"rgb")}}(t,-.1),Bo<1e4&&(No.set(t,e),Bo++)),e}function Ro(t){var e=t.__hoverStl;if(e&&!t.__highlighted){var n=t.__zr,i=t.useHoverLayer&&n&&"canvas"===n.painter.type;if(t.__highlighted=i?"layer":"plain",!(t.isGroup||!n&&t.useHoverLayer)){var r=t,a=t.style;i&&(a=(r=n.addHover(t)).style),rs(a),i||function(t){if(t.__hoverStlDirty){t.__hoverStlDirty=!1;var e=t.__hoverStl;if(e){var n=t.__cachedNormalStl={};t.__cachedNormalZ2=t.z2;var i=t.style;for(var r in e)null!=e[r]&&(n[r]=i[r]);n.fill=i.fill,n.stroke=i.stroke}else t.__cachedNormalStl=t.__cachedNormalZ2=null}}(r),a.extendFrom(e),Fo(a,e,"fill"),Fo(a,e,"stroke"),is(a),i||(t.dirty(!1),t.z2+=xo)}}}function Fo(t,e,n){!Eo(e[n])&&Eo(t[n])&&(t[n]=zo(t[n]))}function Vo(t){var e=t.__highlighted;if(e&&(t.__highlighted=!1,!t.isGroup))if("layer"===e)t.__zr&&t.__zr.removeHover(t);else{var n=t.style,i=t.__cachedNormalStl;i&&(rs(n),t.setStyle(i),is(n));var r=t.__cachedNormalZ2;null!=r&&t.z2-r===xo&&(t.z2=r)}}function Wo(t,e,n){var i,r=bo,a=bo;t.__highlighted&&(r=wo,i=!0),e(t,n),t.__highlighted&&(a=wo,i=!0),t.isGroup&&t.traverse(function(t){t.isGroup||e(t,n)}),i&&t.__highDownOnUpdate&&t.__highDownOnUpdate(r,a)}function Ho(t,e){e=t.__hoverStl=!1!==e&&(t.hoverStyle||e||{}),t.__hoverStlDirty=!0,t.__highlighted&&(t.__cachedNormalStl=null,Vo(t),Ro(t))}function Go(t){Yo(this,t)||this.__highByOuter||Wo(this,Ro)}function Xo(t){Yo(this,t)||this.__highByOuter||Wo(this,Vo)}function Uo(t){this.__highByOuter|=1<<(t||0),Wo(this,Ro)}function qo(t){(this.__highByOuter&=~(1<<(t||0)))||Wo(this,Vo)}function Yo(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function jo(t,e){Zo(t,!0),Wo(t,Ho,e)}function Zo(t,e){var n=!1===e;if(t.__highDownSilentOnTouch=t.highDownSilentOnTouch,t.__highDownOnUpdate=t.highDownOnUpdate,!n||t.__highDownDispatcher){var i=n?"off":"on";t[i]("mouseover",Go)[i]("mouseout",Xo),t[i]("emphasis",Uo)[i]("normal",qo),t.__highByOuter=t.__highByOuter||0,t.__highDownDispatcher=!n}}function $o(t){return!(!t||!t.__highDownDispatcher)}function Ko(t){var e=Mo[t];return null==e&&So<=32&&(e=Mo[t]=So++),e}function Qo(t,e,n,i,r,a,o){var s,l=(r=r||_o).labelFetcher,h=r.labelDataIndex,u=r.labelDimIndex,c=n.getShallow("show"),d=i.getShallow("show");(c||d)&&(l&&(s=l.getFormattedLabel(h,"normal",null,u)),null==s&&(s=T(r.defaultText)?r.defaultText(h,r):r.defaultText));var f=c?s:null,p=d?F(l?l.getFormattedLabel(h,"emphasis",null,u):null,s):null;null==f&&null==p||(Jo(t,n,a,r),Jo(e,i,o,r,!0)),t.text=f,e.text=p}function Jo(t,e,n,i,r){return ts(t,e,i,r),n&&S(t,n),t}function ts(t,e,n,i){if((n=n||_o).isRectText){var r;n.getTextPosition?r=n.getTextPosition(e,i):"outside"===(r=e.getShallow("position")||(i?null:"inside"))&&(r="top"),t.textPosition=r,t.textOffset=e.getShallow("offset");var a=e.getShallow("rotate");null!=a&&(a*=Math.PI/180),t.textRotation=a,t.textDistance=F(e.getShallow("distance"),i?null:5)}var o,s=e.ecModel,l=s&&s.option.textStyle,h=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||_o).rich;if(n)for(var i in e=e||{},n)n.hasOwnProperty(i)&&(e[i]=1);t=t.parentModel}return e}(e);if(h)for(var u in o={},h)if(h.hasOwnProperty(u)){var c=e.getModel(["rich",u]);es(o[u]={},c,l,n,i)}return t.rich=o,es(t,e,l,n,i,!0),n.forceRich&&!n.textStyle&&(n.textStyle={}),t}function es(t,e,n,i,r,a){n=!r&&n||_o,t.textFill=ns(e.getShallow("color"),i)||n.color,t.textStroke=ns(e.getShallow("textBorderColor"),i)||n.textBorderColor,t.textStrokeWidth=F(e.getShallow("textBorderWidth"),n.textBorderWidth),r||(a&&(t.insideRollbackOpt=i,is(t)),null==t.textFill&&(t.textFill=i.autoColor)),t.fontStyle=e.getShallow("fontStyle")||n.fontStyle,t.fontWeight=e.getShallow("fontWeight")||n.fontWeight,t.fontSize=e.getShallow("fontSize")||n.fontSize,t.fontFamily=e.getShallow("fontFamily")||n.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),a&&i.disableBox||(t.textBackgroundColor=ns(e.getShallow("backgroundColor"),i),t.textPadding=e.getShallow("padding"),t.textBorderColor=ns(e.getShallow("borderColor"),i),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||n.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||n.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||n.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||n.textShadowOffsetY}function ns(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function is(t){var e,n=t.textPosition,i=t.insideRollbackOpt;if(i&&null==t.textFill){var r=i.autoColor,a=i.isRectText,o=i.useInsideStyle,s=!1!==o&&(!0===o||a&&n&&"string"==typeof n&&0<=n.indexOf("inside")),l=!s&&null!=r;(s||l)&&(e={textFill:t.textFill,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth}),s&&(t.textFill="#fff",null==t.textStroke&&(t.textStroke=r,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),l&&(t.textFill=r)}t.insideRollback=e}function rs(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth,t.insideRollback=null)}function as(t,e){var n=e||e.getModel("textStyle");return X([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}function os(t,e,n,i,r,a){if("function"==typeof r&&(a=r,r=null),i&&i.isAnimationEnabled()){var o=t?"Update":"",s=i.getShallow("animationDuration"+o),l=i.getShallow("animationEasing"+o),h=i.getShallow("animationDelay"+o);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof s&&(s=s(r)),0<s?e.animateTo(n,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(n),a&&a())}else e.stopAnimation(),e.attr(n),a&&a()}function ss(t,e,n,i,r){os(!0,t,e,n,i,r)}function ls(t,e,n,i,r){os(!1,t,e,n,i,r)}function hs(t,e,n){return e&&!P(e)&&(e=Xt.getLocalTransform(e)),n&&(e=Wt([],e)),st([],t,e)}function us(t,e,i,n){if(t&&e){var r,a=(r={},t.traverse(function(t){!t.isGroup&&t.anid&&(r[t.anid]=t)}),r);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=o(t);t.attr(o(e)),ss(t,n,i,t.dataIndex)}}})}function o(t){var e={position:J(t.position),rotation:t.rotation};return t.shape&&(e.shape=S({},t.shape)),e}}function cs(t,e,n,i,r,a,o,s){var l=n-t,h=i-e,u=o-r,c=s-a,d=ds(u,c,l,h);if(function(t){return t<=1e-6&&-1e-6<=t}(d))return!1;var f=t-r,p=e-a,g=ds(f,p,l,h)/d;if(g<0||1<g)return!1;var v=ds(f,p,u,c)/d;return!(v<0||1<v)}function ds(t,e,n,i){return t*i-n*e}Co("circle",Xa),Co("sector",qa),Co("ring",Ya),Co("polygon",$a),Co("polyline",Ka),Co("rect",io),Co("line",ao),Co("bezierCurve",ho),Co("arc",uo);var fs=(Object.freeze||Object)({Z2_EMPHASIS_LIFT:xo,CACHED_LABEL_STYLE_PROPERTIES:{color:"textFill",textBorderColor:"textStroke",textBorderWidth:"textStrokeWidth"},extendShape:To,extendPath:function(t,e){return function(t,e){return Ma.extend(Va(t,e))}(t,e)},registerShape:Co,getShapeClass:function(t){if(Io.hasOwnProperty(t))return Io[t]},makePath:Do,makeImage:ko,mergePath:Lo,resizePath:Po,subPixelOptimizeLine:function(t){return Ja(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return to(t.shape,t.shape,t.style),t},subPixelOptimize:Oo,setElementHoverStyle:Ho,setHoverStyle:jo,setAsHighDownDispatcher:Zo,isHighDownDispatcher:$o,getHighlightDigit:Ko,setLabelStyle:Qo,modifyLabelStyle:function(t,e,n){var i=t.style;e&&(rs(i),t.setStyle(e),is(i)),i=t.__hoverStl,n&&i&&(rs(i),S(i,n),is(i))},setTextStyle:Jo,setText:function(t,e,n){var i,r={isRectText:!0};!1===n?i=!0:r.autoColor=n,ts(t,e,r,i)},getFont:as,updateProps:ss,initProps:ls,getTransform:function(t,e){for(var n=Bt([]);t&&t!==e;)zt(n,t.getLocalTransform(),n),t=t.parent;return n},applyTransform:hs,transformDirection:function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=hs(a,e,n),Math.abs(a[0])>Math.abs(a[1])?0<a[0]?"right":"left":0<a[1]?"bottom":"top"},groupTransition:us,clipPointsByRect:function(t,i){return A(t,function(t){var e=t[0];e=mo(e,i.x),e=yo(e,i.x+i.width);var n=t[1];return n=mo(n,i.y),[e,n=yo(n,i.y+i.height)]})},clipRectByRect:function(t,e){var n=mo(t.x,e.x),i=yo(t.x+t.width,e.x+e.width),r=mo(t.y,e.y),a=yo(t.y+t.height,e.y+e.height);if(n<=i&&r<=a)return{x:n,y:r,width:i-n,height:a-r}},createIcon:function(t,e,n){var i=(e=S({rectHover:!0},e)).style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(i.image=t.slice(8),D(i,n),new gi(e)):Do(t.replace("path://",""),e,n,"center")},linePolygonIntersect:function(t,e,n,i,r){for(var a=0,o=r[r.length-1];a<r.length;a++){var s=r[a];if(cs(t,e,n,i,s[0],s[1],o[0],o[1]))return!0;o=s}},lineLineIntersect:cs,Group:qe,Image:gi,Text:Ha,Circle:Xa,Sector:qa,Ring:Ya,Polygon:$a,Polyline:Ka,Rect:io,Line:ao,BezierCurve:ho,Arc:uo,IncrementalDisplayable:go,CompoundPath:co,LinearGradient:fo,RadialGradient:po,BoundingRect:Ue}),ps=["textStyle","color"],gs={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(ps):null)},getFont:function(){return as({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return Pn(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("lineHeight"),this.getShallow("rich"),this.getShallow("truncateText"))}},vs=lr([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),ms={getItemStyle:function(t,e){var n=vs(this,t,e),i=this.getBorderLineDash();return i&&(n.lineDash=i),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},ys=_,_s=ji();function xs(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function ws(t,e,n){for(var i=0;i<e.length&&(!e[i]||null!=(t=t&&"object"==typeof t?t[e[i]]:null));i++);return null==t&&n&&(t=n.get(e)),t}function bs(t,e){var n=_s(t).getParent;return n?n.call(t,e):t.parentModel}xs.prototype={constructor:xs,init:null,mergeOption:function(t){f(this.option,t,!0)},get:function(t,e){return null==t?this.option:ws(this.option,this.parsePath(t),!e&&bs(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&bs(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n;return new xs(null==t?this.option:ws(this.option,t=this.parsePath(t)),e=e||(n=bs(this,t))&&n.getModel(t),this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new this.constructor(b(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){_s(this).getParent=t},isAnimationEnabled:function(){if(!m.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},nr(xs),rr(xs),ys(xs,ur),ys(xs,dr),ys(xs,gs),ys(xs,ms);var Ss=0;function Ms(t){return[t||"",Ss++,Math.random().toFixed(5)].join("_")}var Is=1e-4;function Ts(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0==r)return 0==a?n[0]:(n[0]+n[1])/2;if(i)if(0<r){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]}function Cs(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?function(t){return t.replace(/^\s+|\s+$/g,"")}(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function Ds(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function ks(t){var e=t.toString(),n=e.indexOf("e");if(0<n){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function As(t){var e=2*Math.PI;return(t%e+e)%e}function Ls(t){return-Is<t&&t<Is}var Ps=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function Os(t){if(t instanceof Date)return t;if("string"!=typeof t)return null==t?new Date(NaN):new Date(Math.round(t));var e=Ps.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}function Es(t){return Math.floor(Math.log(t)/Math.LN10)}function Ns(t,e){var n=Es(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,-20<=n?+t.toFixed(n<0?-n:0):t}function Bs(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(1<t.length?"."+t[1]:"")}var zs=H,Rs=/([&<>"'])/g,Fs={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function Vs(t){return null==t?"":(t+"").replace(Rs,function(t,e){return Fs[e]})}function Ws(t,e){return"{"+t+(null==e?"":e)+"}"}var Hs=["a","b","c","d","e","f","g"];function Gs(t,e){var n=(t=L(t)?{color:t,extraCssText:e}:t||{}).color,i=t.type,r=(e=t.extraCssText,t.renderMode||"html"),a=t.markerId||"X";return n?"html"===r?"subItem"===i?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Vs(n)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:'+Vs(n)+";"+(e||"")+'"></span>':{renderMode:r,content:"{marker"+a+"|}  ",style:{color:n}}:""}function Xs(t,e){return"0000".substr(0,e-(t+="").length)+t}function Us(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Os(e),r=n?"UTC":"",a=i["get"+r+"FullYear"](),o=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),h=i["get"+r+"Minutes"](),u=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",Xs(o,2)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",Xs(s,2)).replace("d",s).replace("hh",Xs(l,2)).replace("h",l).replace("mm",Xs(h,2)).replace("m",h).replace("ss",Xs(u,2)).replace("s",u).replace("SSS",Xs(c,3))}var qs=Bn,Ys=k,js=["left","right","top","bottom","width","height"],Zs=[["width","left","right"],["height","top","bottom"]];function $s(u,c,d,f,p){var g=0,v=0;null==f&&(f=1/0),null==p&&(p=1/0);var m=0;c.eachChild(function(t,e){var n,i,r=t.position,a=t.getBoundingRect(),o=c.childAt(e+1),s=o&&o.getBoundingRect();if("horizontal"===u){var l=a.width+(s?-s.x+a.x:0);m=f<(n=g+l)||t.newline?(g=0,n=l,v+=m+d,a.height):Math.max(m,a.height)}else{var h=a.height+(s?-s.y+a.y:0);m=p<(i=v+h)||t.newline?(g+=m+d,v=0,i=h,a.width):Math.max(m,a.width)}t.newline||(r[0]=g,r[1]=v,"horizontal"===u?g=n+d:v=i+d)})}I($s,"vertical"),I($s,"horizontal");function Ks(l,h,t){O(t)||(t={});var u=t.ignoreSize;C(u)||(u=[u,u]);var e=i(Zs[0],0),n=i(Zs[1],1);function i(t,e){var n={},i=0,r={},a=0;if(Ys(t,function(t){r[t]=l[t]}),Ys(t,function(t){c(h,t)&&(n[t]=r[t]=h[t]),d(n,t)&&i++,d(r,t)&&a++}),u[e])return d(h,t[1])?r[t[2]]=null:d(h,t[2])&&(r[t[1]]=null),r;if(2!==a&&i){if(2<=i)return n;for(var o=0;o<t.length;o++){var s=t[o];if(!c(n,s)&&c(l,s)){n[s]=l[s];break}}return n}return r}function c(t,e){return t.hasOwnProperty(e)}function d(t,e){return null!=t[e]&&"auto"!==t[e]}function r(t,e,n){Ys(t,function(t){e[t]=n[t]})}r(Zs[0],l,e),r(Zs[1],l,n)}function Qs(t){return function(e,n){return n&&e&&Ys(js,function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e}({},t)}var Js,tl,el,nl=ji(),il=xs.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){xs.call(this,t,e,n,i),this.uid=Ms("ec_cpt_model")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?Qs(t):{};f(t,e.getTheme().get(this.mainType)),f(t,this.getDefaultOption()),n&&Ks(t,i,n)},mergeOption:function(t,e){f(this.option,t,!0);var n=this.layoutMode;n&&Ks(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=nl(this);if(!t.defaultOption){for(var e=[],n=this.constructor;n;){var i=n.prototype.defaultOption;i&&e.push(i),n=n.superClass}for(var r={},a=e.length-1;0<=a;a--)r=f(r,e[a],!0);t.defaultOption=r}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});function rl(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}sr(il,{registerWhenExtend:!0}),tl={},(Js=il).registerSubTypeDefaulter=function(t,e){t=er(t),tl[t.main]=e},Js.determineSubType=function(t,e){var n=e.type;if(!n){var i=er(t).main;Js.hasSubTypes(t)&&tl[i]&&(n=tl[i](e))}return n},el=function(t){var e=[];k(il.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=A(e,function(t){return er(t).main}),"dataset"!==t&&v(e,"dataset")<=0&&e.unshift("dataset");return e},il.topologicalTravel=function(t,e,n,i){if(t.length){var r=function(e){var r={},a=[];return k(e,function(n){var i=rl(r,n),t=function(t,e){var n=[];return k(t,function(t){0<=v(e,t)&&n.push(t)}),n}(i.originalDeps=el(n),e);i.entryCount=t.length,0===i.entryCount&&a.push(n),k(t,function(t){v(i.predecessor,t)<0&&i.predecessor.push(t);var e=rl(r,t);v(e.successor,t)<0&&e.successor.push(n)})}),{graph:r,noEntryList:a}}(e),a=r.graph,o=r.noEntryList,s={};for(k(t,function(t){s[t]=!0});o.length;){var l=o.pop(),h=a[l],u=!!s[l];u&&(n.call(i,l,h.originalDeps.slice()),delete s[l]),k(h.successor,u?d:c)}k(s,function(){throw new Error("Circle dependency may exists")})}function c(t){a[t].entryCount--,0===a[t].entryCount&&o.push(t)}function d(t){s[t]=!0,c(t)}},_(il,{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}});var al="";"undefined"!=typeof navigator&&(al=navigator.platform||"");var ol={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:al.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},sl=ji();var ll={clearColorPalette:function(){sl(this).colorIdx=0,sl(this).colorNameMap={}},getColorFromPalette:function(t,e,n){var i=sl(e=e||this),r=i.colorIdx||0,a=i.colorNameMap=i.colorNameMap||{};if(a.hasOwnProperty(t))return a[t];var o=Vi(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=n&&s?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(s,n):o;if((l=l||o)&&l.length){var h=l[r];return t&&(a[t]=h),i.colorIdx=(r+1)%l.length,h}}};function hl(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:Z(),categoryAxisMap:Z()},i=ul[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}var ul={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",a),cl(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),cl(a)&&(i.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),cl(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",a),n.set("angle",o),cl(a)&&(i.set("radius",a),e.firstCategoryDimIndex=0),cl(o)&&(i.set("angle",o),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,r,a,o){var s=t.ecModel,e=s.getComponent("parallel",t.get("parallelIndex")),l=r.coordSysDims=e.dimensions.slice();k(e.parallelAxisIndex,function(t,e){var n=s.getComponent("parallelAxis",t),i=l[e];a.set(i,n),cl(n)&&null==r.firstCategoryDimIndex&&(o.set(i,n),r.firstCategoryDimIndex=e)})}};function cl(t){return"category"===t.get("type")}var dl="original",fl="arrayRows",pl="objectRows",gl="keyedColumns",vl="unknown",ml="typedArray",yl="column",_l="row";function xl(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===gl?{}:[]),this.sourceFormat=t.sourceFormat||vl,this.seriesLayoutBy=t.seriesLayoutBy||yl,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&Z(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}xl.seriesDataToSource=function(t){return new xl({data:t,sourceFormat:N(t)?ml:dl,fromDataset:!1})},rr(xl);var wl=ji();function bl(t){var e=t.option,n=e.data,i=N(n)?ml:dl,r=!1,a=e.seriesLayoutBy,o=e.sourceHeader,s=e.dimensions,l=function(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}(t);if(l){var h=l.option;n=h.source,i=wl(l).sourceFormat,r=!0,a=a||h.seriesLayoutBy,null==o&&(o=h.sourceHeader),s=s||h.dimensions}var u=function(t,e,n,i,r){if(!t)return{dimensionsDefine:Sl(r)};var a,o,s,l;if(e===fl)"auto"===i||null==i?Ml(function(t){null!=t&&"-"!==t&&(L(t)?null==o&&(o=1):o=0)},n,t,10):o=i?1:0,r||1!==o||(r=[],Ml(function(t,e){r[e]=null!=t?t:""},n,t)),a=r?r.length:n===_l?t.length:t[0]?t[0].length:null;else if(e===pl)r||(r=function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return k(e,function(t,e){i.push(e)}),i}}(t),s=!0);else if(e===gl)r||(r=[],s=!0,k(t,function(t,e){r.push(e)}));else if(e===dl){var h=Gi(t[0]);a=C(h)&&h.length||1}s&&k(r,function(t,e){"name"===(O(t)?t.name:t)&&(l=e)});return{startIndex:o,dimensionsDefine:Sl(r),dimensionsDetectCount:a,potentialNameDimIndex:l}}(n,i,a,o,s),c=e.encode;!c&&l&&(c=function(t,e,n,i,r,a){var o=hl(t),s={},l=[],h=[],u=t.subType,c=Z(["pie","map","funnel"]),d=Z(["line","bar","pictorialBar","scatter","effectScatter","candlestick","boxplot"]);if(o&&null!=d.get(u)){var f=t.ecModel,p=wl(f).datasetMap,g=e.uid+"_"+r,v=p.get(g)||p.set(g,{categoryWayDim:1,valueWayDim:0});k(o.coordSysDims,function(t){if(null==o.firstCategoryDimIndex){var e=v.valueWayDim++;s[t]=e,h.push(e)}else if(o.categoryAxisMap.get(t))s[t]=0,l.push(0);else{e=v.categoryWayDim++;s[t]=e,h.push(e)}})}else if(null!=c.get(u)){for(var m,y=0;y<5&&null==m;y++)Il(n,i,r,a.dimensionsDefine,a.startIndex,y)||(m=y);if(null!=m){s.value=m;var _=a.potentialNameDimIndex||Math.max(m-1,0);h.push(_),l.push(_)}}return l.length&&(s.itemName=l),h.length&&(s.seriesName=h),s}(t,l,n,i,a,u)),wl(t).source=new xl({data:n,fromDataset:r,seriesLayoutBy:a,sourceFormat:i,dimensionsDefine:u.dimensionsDefine,startIndex:u.startIndex,dimensionsDetectCount:u.dimensionsDetectCount,encodeDefine:c})}function Sl(t){if(t){var i=Z();return A(t,function(t,e){if(null==(t=S({},O(t)?t:{name:t})).name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var n=i.get(t.name);return n?t.name+="-"+n.count++:i.set(t.name,{count:1}),t})}}function Ml(t,e,n,i){if(null==i&&(i=1/0),e===_l)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else{var a=n[0]||[];for(r=0;r<a.length&&r<i;r++)t(a[r],r)}}function Il(t,e,n,i,r,a){var o,s;if(N(t))return!1;if(i&&(s=O(s=i[a])?s.name:s),e===fl)if(n===_l){for(var l=t[a],h=0;h<(l||[]).length&&h<5;h++)if(null!=(o=f(l[r+h])))return o}else for(h=0;h<t.length&&h<5;h++){var u=t[r+h];if(u&&null!=(o=f(u[a])))return o}else if(e===pl){if(!s)return;for(h=0;h<t.length&&h<5;h++){if((c=t[h])&&null!=(o=f(c[s])))return o}}else if(e===gl){if(!s)return;if(!(l=t[s])||N(l))return!1;for(h=0;h<l.length&&h<5;h++)if(null!=(o=f(l[h])))return o}else if(e===dl)for(h=0;h<t.length&&h<5;h++){var c,d=Gi(c=t[h]);if(!C(d))return!1;if(null!=(o=f(d[a])))return o}function f(t){return(null==t||!isFinite(t)||""===t)&&(!(!L(t)||"-"===t)||void 0)}return!1}var Tl="\0_ec_inner",Cl=xs.extend({init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new xs(n),this._optionManager=i},setOption:function(t,e){G(!(Tl in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):function(t){t=t,this.option={},this.option[Tl]=1,this._componentsMap=Z({series:[]}),this._seriesIndices,this._seriesIndicesMap,function(n,t){var i=n.color&&!n.colorLayer;k(t,function(t,e){"colorLayer"===e&&i||il.hasClass(e)||("object"==typeof t?n[e]=n[e]?f(n[e],t,!1):b(t):null==n[e]&&(n[e]=t))})}(t,this._theme.option),f(t,ol,!1),this.mergeOption(t)}.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var a=n.getMediaOption(this,this._api);a.length&&k(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(i){var l=this.option,h=this._componentsMap,n=[];!function(t){wl(t).datasetMap=Z()}(this),k(i,function(t,e){null!=t&&(il.hasClass(e)?e&&n.push(e):l[e]=null==l[e]?b(t):f(l[e],t,!0))}),il.topologicalTravel(n,il.getAllClassMainTypes(),function(o,t){var e=Vi(i[o]),n=Xi(h.get(o),e);(function(t){var o=Z();Bi(t,function(t,e){var n=t.exist;n&&o.set(n.id,t)}),Bi(t,function(t,e){var n=t.option;G(!n||null==n.id||!o.get(n.id)||o.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&o.set(n.id,t),t.keyInfo||(t.keyInfo={})}),Bi(t,function(t,e){var n=t.exist,i=t.option,r=t.keyInfo;if(zi(i)){if(r.name=null!=i.name?i.name+"":n?n.name:Fi+e,n)r.id=n.id;else if(null!=i.id)r.id=i.id+"";else for(var a=0;r.id="\0"+r.name+"\0"+a++,o.get(r.id););o.set(r.id,t)}})})(n),k(n,function(t,e){var n=t.option;O(n)&&(t.keyInfo.mainType=o,t.keyInfo.subType=function(t,e,n){return e.type?e.type:n?n.subType:il.determineSubType(t,e)}(o,n,t.exist))});var s=function(e,t){C(t)||(t=t?[t]:[]);var n={};return k(t,function(t){n[t]=(e.get(t)||[]).slice()}),n}(h,t);l[o]=[],h.set(o,[]),k(n,function(t,e){var n=t.exist,i=t.option;if(G(O(i)||n,"Empty component definition"),i){var r=il.getClass(o,t.keyInfo.subType,!0);if(n&&n instanceof r)n.name=t.keyInfo.name,n.mergeOption(i,this),n.optionUpdated(i,!1);else{var a=S({dependentModels:s,componentIndex:e},t.keyInfo);S(n=new r(i,this,this,a),a),n.init(i,this,this,a),n.optionUpdated(null,!0)}}else n.mergeOption({},this),n.optionUpdated({},!1);h.get(o)[e]=n,l[o][e]=n.option},this),"series"===o&&Dl(this,h.get("series"))},this),this._seriesIndicesMap=Z(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var i=b(this.option);return k(i,function(t,e){if(il.hasClass(e)){for(var n=(t=Vi(t)).length-1;0<=n;n--)qi(t[n])&&t.splice(n,1);i[e]=t}}),delete i[Tl],i},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,a=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];if(null!=i)C(i)||(i=[i]),n=x(A(i,function(t){return o[t]}),function(t){return!!t});else if(null!=r){var s=C(r);n=x(o,function(t){return s&&0<=v(r,t.id)||!s&&t.id===r})}else if(null!=a){var l=C(a);n=x(o,function(t){return l&&0<=v(a,t.name)||!l&&t.name===a})}else n=o.slice();return kl(n,t)},findComponents:function(t){var e,n,i,r,a,o=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=o)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),h=l?this.queryComponents(l):this._componentsMap.get(s);return a=kl(h,t),t.filter?x(a,t.filter):a},eachComponent:function(t,i,r){var e=this._componentsMap;if("function"==typeof t)r=i,i=t,e.each(function(t,n){k(t,function(t,e){i.call(r,n,t,e)})});else if(L(t))k(e.get(t),i,r);else if(O(t)){k(this.findComponents(t),i,r)}},getSeriesByName:function(e){return x(this._componentsMap.get("series"),function(t){return t.name===e})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(e){return x(this._componentsMap.get("series"),function(t){return t.subType===e})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(n,i){k(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];n.call(i,e,t)},this)},eachRawSeries:function(t,e){k(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(n,i,r){k(this._seriesIndices,function(t){var e=this._componentsMap.get("series")[t];e.subType===n&&i.call(r,e,t)},this)},eachRawSeriesByType:function(t,e,n){return k(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){var n=x(this._componentsMap.get("series"),t,e);Dl(this,n)},restoreData:function(n){var i=this._componentsMap;Dl(this,i.get("series"));var r=[];i.each(function(t,e){r.push(e)}),il.topologicalTravel(r,il.getAllClassMainTypes(),function(e,t){k(i.get(e),function(t){"series"===e&&function(t,e){if(e){var n=e.seiresIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}(t,n)||t.restoreData()})})}});function Dl(t,e){t._seriesIndicesMap=Z(t._seriesIndices=A(e,function(t){return t.componentIndex})||[])}function kl(t,e){return e.hasOwnProperty("subType")?x(t,function(t){return t.subType===e.subType}):t}_(Cl,ll);var Al=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"];function Ll(e){k(Al,function(t){this[t]=w(e[t],e)},this)}var Pl={};function Ol(){this._coordinateSystems=[]}Ol.prototype={constructor:Ol,create:function(i,r){var a=[];k(Pl,function(t,e){var n=t.create(i,r);a=a.concat(n||[])}),this._coordinateSystems=a},update:function(e,n){k(this._coordinateSystems,function(t){t.update&&t.update(e,n)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Ol.register=function(t,e){Pl[t]=e},Ol.get=function(t){return Pl[t]};var El=k,Nl=b,Bl=A,zl=f,Rl=/^(min|max)?(.+)$/;function Fl(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Vl(t,e,n){var a={width:e,height:n,aspectratio:e/n},o=!0;return k(t,function(t,e){var n=e.match(Rl);if(n&&n[1]&&n[2]){var i=n[1],r=n[2].toLowerCase();!function(t,e,n){return"min"===n?e<=t:"max"===n?t<=e:t===e}(a[r],t,i)&&(o=!1)}}),o}Fl.prototype={constructor:Fl,setOption:function(t,e){t&&k(Vi(t.series),function(t){t&&t.data&&N(t.data)&&q(t.data)}),t=Nl(t);var n=this._optionBackup,i=function(t,n,i){var e,r,a=[],o=[],s=t.timeline;t.baseOption&&(r=t.baseOption);(s||t.options)&&(r=r||{},a=(t.options||[]).slice());if(t.media){r=r||{};var l=t.media;El(l,function(t){t&&t.option&&(t.query?o.push(t):e=e||t)})}r=r||t;r.timeline||(r.timeline=s);return El([r].concat(a).concat(A(o,function(t){return t.option})),function(e){El(n,function(t){t(e,i)})}),{baseOption:r,timelineOptions:a,mediaDefault:e,mediaList:o}}.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(function(r,t){El(t=t||{},function(t,e){if(null!=t){var n=r[e];if(il.hasClass(e)){t=Vi(t);var i=Xi(n=Vi(n),t);r[e]=Bl(i,function(t){return t.option&&t.exist?zl(t.exist,t.option,!0):t.exist||t.option})}else r[e]=zl(n,t,!0)}})}(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=Bl(e.timelineOptions,Nl),this._mediaList=Bl(e.mediaList,Nl),this._mediaDefault=Nl(e.mediaDefault),this._currentMediaIndices=[],Nl(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=Nl(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,a=[],o=[];if(!i.length&&!r)return o;for(var s=0,l=i.length;s<l;s++)Vl(i[s].query,e,n)&&a.push(s);return!a.length&&r&&(a=[-1]),a.length&&!function(t,e){return t.join(",")===e.join(",")}(a,this._currentMediaIndices)&&(o=Bl(a,function(t){return Nl(-1===t?r.option:i[t].option)})),this._currentMediaIndices=a,o}};var Wl=k,Hl=O,Gl=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function Xl(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=Gl.length;n<i;n++){var r=Gl[n],a=e.normal,o=e.emphasis;a&&a[r]&&(t[r]=t[r]||{},t[r].normal?f(t[r].normal,a[r]):t[r].normal=a[r],a[r]=null),o&&o[r]&&(t[r]=t[r]||{},t[r].emphasis?f(t[r].emphasis,o[r]):t[r].emphasis=o[r],o[r]=null)}}function Ul(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,D(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r)}}function ql(t){Ul(t,"itemStyle"),Ul(t,"lineStyle"),Ul(t,"areaStyle"),Ul(t,"label"),Ul(t,"labelLine"),Ul(t,"upperLabel"),Ul(t,"edgeLabel")}function Yl(t,e){var n=Hl(t)&&t[e],i=Hl(n)&&n.textStyle;if(i)for(var r=0,a=Hi.length;r<a;r++){e=Hi[r];i.hasOwnProperty(e)&&(n[e]=i[e])}}function jl(t){t&&(ql(t),Yl(t,"label"),t.emphasis&&Yl(t.emphasis,"label"))}function Zl(t){return C(t)?t:t?[t]:[]}function $l(t){return(C(t)?t[0]:t)||{}}function Kl(e,t){Wl(Zl(e.series),function(t){Hl(t)&&function(t){if(Hl(t)){Xl(t),ql(t),Yl(t,"label"),Yl(t,"upperLabel"),Yl(t,"edgeLabel"),t.emphasis&&(Yl(t.emphasis,"label"),Yl(t.emphasis,"upperLabel"),Yl(t.emphasis,"edgeLabel")),(n=t.markPoint)&&(Xl(n),jl(n)),(i=t.markLine)&&(Xl(i),jl(i));var e=t.markArea;e&&jl(e);var n,i,r=t.data;if("graph"===t.type){r=r||t.nodes;var a=t.links||t.edges;if(a&&!N(a))for(var o=0;o<a.length;o++)jl(a[o]);k(t.categories,function(t){ql(t)})}if(r&&!N(r))for(o=0;o<r.length;o++)jl(r[o]);if((n=t.markPoint)&&n.data){var s=n.data;for(o=0;o<s.length;o++)jl(s[o])}if((i=t.markLine)&&i.data){var l=i.data;for(o=0;o<l.length;o++)C(l[o])?(jl(l[o][0]),jl(l[o][1])):jl(l[o])}"gauge"===t.type?(Yl(t,"axisLabel"),Yl(t,"title"),Yl(t,"detail")):"treemap"===t.type?(Ul(t.breadcrumb,"itemStyle"),k(t.levels,function(t){ql(t)})):"tree"===t.type&&ql(t.leaves)}}(t)});var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];t&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),Wl(n,function(t){Wl(Zl(e[t]),function(t){t&&(Yl(t,"axisLabel"),Yl(t.axisPointer,"label"))})}),Wl(Zl(e.parallel),function(t){var e=t&&t.parallelAxisDefault;Yl(e,"axisLabel"),Yl(e&&e.axisPointer,"label")}),Wl(Zl(e.calendar),function(t){Ul(t,"itemStyle"),Yl(t,"dayLabel"),Yl(t,"monthLabel"),Yl(t,"yearLabel")}),Wl(Zl(e.radar),function(t){Yl(t,"name")}),Wl(Zl(e.geo),function(t){Hl(t)&&(jl(t),Wl(Zl(t.regions),function(t){jl(t)}))}),Wl(Zl(e.timeline),function(t){jl(t),Ul(t,"label"),Ul(t,"itemStyle"),Ul(t,"controlStyle",!0);var e=t.data;C(e)&&k(e,function(t){O(t)&&(Ul(t,"label"),Ul(t,"itemStyle"))})}),Wl(Zl(e.toolbox),function(t){Ul(t,"iconStyle"),Wl(t.feature,function(t){Ul(t,"iconStyle")})}),Yl($l(e.axisPointer),"label"),Yl($l(e.tooltip).axisPointer,"label")}function Ql(e){k(Jl,function(t){t[0]in e&&!(t[1]in e)&&(e[t[1]]=e[t[0]])})}var Jl=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],th=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],eh=function(n,t){Kl(n,t),n.series=Vi(n.series),k(n.series,function(t){if(O(t)){var e=t.type;if("line"===e)null!=t.clipOverflow&&(t.clip=t.clipOverflow);else if("pie"===e||"gauge"===e)null!=t.clockWise&&(t.clockwise=t.clockWise);else if("gauge"===e){var n=function(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&null!=(n=n&&n[e[i]]);i++);return n}(t,"pointer.color");null!=n&&function(t,e,n,i){e=e.split(",");for(var r,a=t,o=0;o<e.length-1;o++)null==a[r=e[o]]&&(a[r]={}),a=a[r];!i&&null!=a[e[o]]||(a[e[o]]=n)}(t,"itemStyle.color",n)}Ql(t)}}),n.dataRange&&(n.visualMap=n.dataRange),k(th,function(t){var e=n[t];e&&(C(e)||(e=[e]),k(e,function(t){Ql(t)}))})};function nh(v){k(v,function(u,c){var d=[],f=[NaN,NaN],t=[u.stackResultDimension,u.stackedOverDimension],p=u.data,g=u.isStackedByIndex,e=p.map(t,function(t,e,n){var i,r,a=p.get(u.stackedDimension,n);if(isNaN(a))return f;g?r=p.getRawIndex(n):i=p.get(u.stackedByDimension,n);for(var o=NaN,s=c-1;0<=s;s--){var l=v[s];if(g||(r=l.data.rawIndexOf(l.stackedByDimension,i)),0<=r){var h=l.data.getByRawIndex(l.stackResultDimension,r);if(0<=a&&0<h||a<=0&&h<0){a+=h,o=h;break}}}return d[0]=a,d[1]=o,d});p.hostModel.setData(e),u.data=e})}function ih(t,e){xl.isInstance(t)||(t=xl.seriesDataToSource(t)),this._source=t;var n=this._data=t.data,i=t.sourceFormat;i===ml&&(this._offset=0,this._dimSize=e,this._data=n),S(this,ah[i===fl?i+"_"+t.seriesLayoutBy:i])}var rh=ih.prototype;rh.pure=!1;var ah={arrayRows_column:{pure:rh.persistent=!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:lh},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],n=this._data,i=0;i<n.length;i++){var r=n[i];e.push(r?r[t]:null)}return e},appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},objectRows:{pure:!0,count:oh,getItem:sh,appendData:lh},keyedColumns:{pure:!0,count:function(){var t=this._source.dimensionsDefine[0].name,e=this._data[t];return e?e.length:0},getItem:function(t){for(var e=[],n=this._source.dimensionsDefine,i=0;i<n.length;i++){var r=this._data[n[i].name];e.push(r?r[t]:null)}return e},appendData:function(t){var r=this._data;k(t,function(t,e){for(var n=r[e]||(r[e]=[]),i=0;i<(t||[]).length;i++)n.push(t[i])})}},original:{count:oh,getItem:sh,appendData:lh},typedArray:{persistent:!(rh.getSource=function(){return this._source}),pure:!0,count:function(){return this._data?this._data.length/this._dimSize:0},getItem:function(t,e){t-=this._offset,e=e||[];for(var n=this._dimSize*t,i=0;i<this._dimSize;i++)e[i]=this._data[n+i];return e},appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}}};function oh(){return this._data.length}function sh(t){return this._data[t]}function lh(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}var hh={arrayRows:uh,objectRows:function(t,e,n,i){return null!=n?t[i]:t},keyedColumns:uh,original:function(t,e,n,i){var r=Gi(t);return null!=n&&r instanceof Array?r[n]:r},typedArray:uh};function uh(t,e,n,i){return null!=n?t[n]:t}var ch={arrayRows:dh,objectRows:function(t,e,n,i){return fh(t[e],this._dimensionInfos[e])},keyedColumns:dh,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return!this._rawData.pure&&function(t){return zi(t)&&!(t instanceof Array)}(t)&&(this.hasItemOption=!0),fh(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}};function dh(t,e,n,i){return fh(t[i],this._dimensionInfos[e])}function fh(t,e){var n=e&&e.type;if("ordinal"!==n)return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+Os(t)),null==t||""===t?NaN:+t;var i=e&&e.ordinalMeta;return i?i.parseAndCollect(t):t}function ph(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,a,o=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(n);return s&&(r=s.name,a=s.index),hh[o](i,e,a,r)}}}function gh(t,e,n){if(t){var i=t.getProvider().getSource().sourceFormat;if(i===dl||i===pl){var r=t.getRawDataItem(e);return i!==dl||O(r)||(r=null),r?r[n]:void 0}}}var vh=/\{@(.+?)\}/g,mh={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),a=n.getName(t),o=n.getRawDataItem(t),s=n.getItemVisual(t,"color"),l=n.getItemVisual(t,"borderColor"),h=this.ecModel.getComponent("tooltip"),u=function(t){return"auto"===t?m.domSupported?"html":"richText":t||"html"}(h&&h.get("renderMode")),c=this.mainType,d="series"===c,f=n.userOutput;return{componentType:c,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:d?this.subType:null,seriesIndex:this.seriesIndex,seriesId:d?this.id:null,seriesName:d?this.name:null,name:a,dataIndex:r,data:o,dataType:e,value:i,color:s,borderColor:l,dimensionNames:f?f.dimensionNames:null,encode:f?f.encode:null,marker:Gs({color:s,renderMode:u}),$vars:["seriesName","name","value"]}},getFormattedLabel:function(i,t,e,n,r){t=t||"normal";var a=this.getData(e),o=a.getItemModel(i),s=this.getDataParams(i,e);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=o.get("normal"===t?[r||"label","formatter"]:[t,r||"label","formatter"]);return"function"==typeof l?(s.status=t,s.dimensionIndex=n,l(s)):"string"==typeof l?function(t,e,n){C(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],a=0;a<r.length;a++){var o=Hs[a];t=t.replace(Ws(o),Ws(o,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var h=e[s][r[l]];t=t.replace(Ws(Hs[l],s),n?Vs(h):h)}return t}(l,s).replace(vh,function(t,e){var n=e.length;return"["===e.charAt(0)&&"]"===e.charAt(n-1)&&(e=+e.slice(1,n-1)),ph(a,i,e)}):void 0},getRawValue:function(t,e){return ph(this.getData(e),t)},formatTooltip:function(){}};function yh(t){return new _h(t)}function _h(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0,this.context}var xh=_h.prototype;xh.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var a,o=u(this._modBy),s=this._modDataCount||0,l=u(t&&t.modBy),h=t&&t.modDataCount||0;function u(t){return 1<=t||(t=1),t}o===l&&s===h||(e="reset"),!this._dirty&&"reset"!==e||(this._dirty=!1,a=function(t,e){var n,i;t._dueIndex=t._outputDueEnd=t._dueEnd=0,t._settedOutputEnd=null,!e&&t._reset&&((n=t._reset(t.context))&&n.progress&&(i=n.forceFirstProgress,n=n.progress),C(n)&&!n.length&&(n=null));t._progress=n,t._modBy=t._modDataCount=null;var r=t._downstream;return r&&r.dirty(),i}(this,i)),this._modBy=l,this._modDataCount=h;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var d=this._dueIndex,f=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(a||d<f)){var p=this._progress;if(C(p))for(var g=0;g<p.length;g++)Ah(this,p[g],d,f,l,h);else Ah(this,p,d,f,l,h)}this._dueIndex=f;var v=null!=this._settedOutputEnd?this._settedOutputEnd:f;this._outputDueEnd=v}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()};var wh,bh,Sh,Mh,Ih,Th,Ch=Th={reset:function(t,e,n,i){bh=t,wh=e,Sh=n,Mh=i,Ih=Math.ceil(Mh/Sh),Th.next=1<Sh&&0<Mh?kh:Dh}};function Dh(){return bh<wh?bh++:null}function kh(){var t=bh%Ih*Sh+Math.ceil(bh/Ih),e=wh<=bh?null:t<Mh?t:bh;return bh++,e}function Ah(t,e,n,i,r,a){Ch.reset(n,i,r,a),t._callingProgress=e,t._callingProgress({start:n,end:i,count:i-n,next:Ch.next},t.context)}xh.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},xh.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},xh.pipe=function(t){this._downstream===t&&!this._dirty||((this._downstream=t)._upstream=this,t.dirty())},xh.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},xh.getUpstream=function(){return this._upstream},xh.getDownstream=function(){return this._downstream},xh.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t};var Lh=ji(),Ph=il.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.color",visualBorderColorAccessPath:"itemStyle.borderColor",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.dataTask=yh({count:Eh,reset:Nh}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),bl(this);var r=this.getInitialData(t,n);zh(r,this),this.dataTask.context.data=r,Lh(this).dataBeforeProcessed=r,Oh(this)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?Qs(t):{},r=this.subType;il.hasClass(r)&&(r+="Series"),f(t,e.getTheme().get(this.subType)),f(t,this.getDefaultOption()),Wi(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Ks(t,i,n)},mergeOption:function(t,e){t=f(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&Ks(this.option,t,n),bl(this);var i=this.getInitialData(t,e);zh(i,this),this.dataTask.dirty(),this.dataTask.context.data=i,Lh(this).dataBeforeProcessed=i,Oh(this)},fillDataTextStyle:function(t){if(t&&!N(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&Wi(t[n],"label",e)},getInitialData:function(){},appendData:function(t){this.getRawData().appendData(t.data)},getData:function(t){var e=Fh(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return Lh(this).data},setData:function(t){var e=Fh(this);if(e){var n=e.context;n.data!==t&&e.modifyOutputEnd&&e.setOutputEnd(t.count()),n.outputData=t,e!==this.dataTask&&(n.data=t)}Lh(this).data=t},getSource:function(){return function(t){return wl(t).source}(this)},getRawData:function(){return Lh(this).dataBeforeProcessed},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(r,u,t,c){var d=this,e="html"===(c=c||"html")?"<br/>":"\n",f="richText"===c,p={},g=0;function n(t){return{renderMode:c,content:Vs(Bs(t)),style:p}}var v=this.getData(),a=v.mapDimension("defaultedTooltip",!0),i=a.length,o=this.getRawValue(r),s=C(o),m=v.getItemVisual(r,"color");O(m)&&m.colorStops&&(m=(m.colorStops[0]||{}).color),m=m||"transparent";var l=(1<i||s&&!i?function(t){var l=M(t,function(t,e,n){var i=v.getDimensionInfo(n);return t|(i&&!1!==i.tooltip&&null!=i.displayName)},0),h=[];function e(t,e){var n=v.getDimensionInfo(e);if(n&&!1!==n.otherDims.tooltip){var i=n.type,r="sub"+d.seriesIndex+"at"+g,a=Gs({color:m,type:"subItem",renderMode:c,markerId:r}),o="string"==typeof a?a:a.content,s=(l?o+Vs(n.displayName||"-")+": ":"")+Vs("ordinal"===i?t+"":"time"===i?u?"":Us("yyyy/MM/dd hh:mm:ss",t):Bs(t));s&&h.push(s),f&&(p[r]=m,++g)}}a.length?k(a,function(t){e(ph(v,r,t),t)}):k(t,e);var n=l?f?"\n":"<br/>":"",i=n+h.join(n||", ");return{renderMode:c,content:i,style:p}}(o):n(i?ph(v,r,a[0]):s?o[0]:o)).content,h=d.seriesIndex+"at"+g,y=Gs({color:m,type:"item",renderMode:c,markerId:h});p[h]=m,++g;var _=v.getName(r),x=this.name;Ui(this)||(x=""),x=x?Vs(x)+(u?": ":e):"";var w="string"==typeof y?y:y.content;return{html:u?w+x+l:x+w+(_?Vs(_)+": "+l:l),markers:p}},isAnimationEnabled:function(){if(m.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=ll.getColorFromPalette.call(this,t,e,n);return r=r||i.getColorFromPalette(t,e,n)},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});function Oh(t){var e=t.name;Ui(t)||(t.name=function(t){var n=t.getRawData(),e=n.mapDimension("seriesName",!0),i=[];return k(e,function(t){var e=n.getDimensionInfo(t);e.displayName&&i.push(e.displayName)}),i.join(" ")}(t)||e)}function Eh(t){return t.model.getRawData().count()}function Nh(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Bh}function Bh(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function zh(e,n){k(e.CHANGABLE_METHODS,function(t){e.wrapMethod(t,I(Rh,n))})}function Rh(t){var e=Fh(t);e&&e.setOutputEnd(this.count())}function Fh(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}_(Ph,mh),_(Ph,ll);var Vh=function(){this.group=new qe,this.uid=Ms("viewComponent")};Vh.prototype={constructor:Vh,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){},filterForExposedEvent:null};var Wh=Vh.prototype;Wh.updateView=Wh.updateLayout=Wh.updateVisual=function(t,e,n,i){},nr(Vh),sr(Vh,{registerWhenExtend:!0});function Hh(){var s=ji();return function(t){var e=s(t),n=t.pipelineContext,i=e.large,r=e.progressiveRender,a=e.large=n.large,o=e.progressiveRender=n.progressiveRender;return!!(i^a||r^o)&&"reset"}}var Gh=ji(),Xh=Hh();function Uh(){this.group=new qe,this.uid=Ms("viewChart"),this.renderTask=yh({plan:Zh,reset:$h}),this.renderTask.context={view:this}}var qh=Uh.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){jh(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){jh(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};function Yh(t,e,n){if(t&&(t.trigger(e,n),t.isGroup&&!$o(t)))for(var i=0,r=t.childCount();i<r;i++)Yh(t.childAt(i),e,n)}function jh(e,t,n){var i=Yi(e,t),r=t&&null!=t.highlightKey?Ko(t.highlightKey):null;null!=i?k(Vi(i),function(t){Yh(e.getItemGraphicEl(t),n,r)}):e.eachItemGraphicEl(function(t){Yh(t,n,r)})}function Zh(t){return Xh(t.model)}function $h(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,a=e.pipelineContext.progressiveRender,o=t.view,s=r&&Gh(r).updateMethod,l=a?"incrementalPrepareRender":s&&o[s]?s:"render";return"render"!==l&&o[l](e,n,i,r),Kh[l]}qh.updateView=qh.updateLayout=qh.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},nr(Uh),sr(Uh,{registerWhenExtend:!0}),Uh.markUpdateMethod=function(t,e){Gh(t).updateMethod=e};var Kh={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}};function Qh(t,n,i){var r,a,o,s,l,h=0,u=0,c=null;function d(){u=(new Date).getTime(),c=null,t.apply(o,s||[])}n=n||0;function e(){r=(new Date).getTime(),o=this,s=arguments;var t=l||n,e=l||i;l=null,a=r-(e?h:u)-t,clearTimeout(c),e?c=setTimeout(d,t):0<=a?d():c=setTimeout(d,-a),h=r}return e.clear=function(){c&&(clearTimeout(c),c=null)},e.debounceNextCall=function(t){l=t},e}var Jh={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){var n=e.getData(),a=(e.visualColorAccessPath||"itemStyle.color").split("."),i=e.get(a)||e.getColorFromPalette(e.name,null,t.getSeriesCount());n.setVisual("color",i);var o=(e.visualBorderColorAccessPath||"itemStyle.borderColor").split("."),r=e.get(o);if(n.setVisual("borderColor",r),!t.isSeriesFiltered(e)){"function"!=typeof i||i instanceof lo||n.each(function(t){n.setItemVisual(t,"color",i(e.getDataParams(t)))});return{dataEach:n.hasItemOption?function(t,e){var n=t.getItemModel(e),i=n.get(a,!0),r=n.get(o,!0);null!=i&&t.setItemVisual(e,"color",i),null!=r&&t.setItemVisual(e,"borderColor",r)}:null}}}},tu={legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:",",end:"."}}}},eu=function(t,e){var a=e.getModel("aria");if(a.get("show"))if(a.get("description"))t.setAttribute("aria-label",a.get("description"));else{var u=0;e.eachSeries(function(t,e){++u},this);var n,c=a.get("data.maxCount")||10,i=a.get("series.maxCount")||10,d=Math.min(u,i);if(!(u<1)){var r=function(){var t=e.getModel("title").option;t&&t.length&&(t=t[0]);return t&&t.text}();n=r?p(g("general.withTitle"),{title:r}):g("general.withoutTitle");var f=[];n+=p(g(1<u?"series.multiple.prefix":"series.single.prefix"),{seriesCount:u}),e.eachSeries(function(t,e){if(e<d){var n,i=t.get("name"),r="series."+(1<u?"multiple":"single")+".";n=p(n=g(i?r+"withName":r+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:function(t){return tu.series.typeNames[t]||"自定义图"}(t.subType)});var a=t.getData();(window.data=a).count()>c?n+=p(g("data.partialData"),{displayCnt:c}):n+=g("data.allData");for(var o=[],s=0;s<a.count();s++)if(s<c){var l=a.getName(s),h=ph(a,s);o.push(p(g(l?"data.withName":"data.withoutName"),{name:l,value:h}))}n+=o.join(g("data.separator.middle"))+g("data.separator.end"),f.push(n)}}),n+=f.join(g("series.multiple.separator.middle"))+g("series.multiple.separator.end"),t.setAttribute("aria-label",n)}}function p(t,e){if("string"!=typeof t)return t;var n=t;return k(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}function g(t){var e=a.get(t);if(null!=e)return e;for(var n=t.split("."),i=tu.aria,r=0;r<n.length;++r)i=i[n[r]];return i}},nu=Math.PI;function iu(t,e,n,i){this.ecInstance=t,this.api=e,this.unfinished;n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice();this._allHandlers=n.concat(i),this._stageTaskMap=Z()}var ru=iu.prototype;function au(l,t,h,u,c){var d;function f(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}c=c||{},k(t,function(i,t){if(!c.visualType||c.visualType===i.visualType){var e=l._stageTaskMap.get(i.uid),n=e.seriesTaskMap,r=e.overallTask;if(r){var a,o=r.agentStubMap;o.each(function(t){f(c,t)&&(t.dirty(),a=!0)}),a&&r.dirty(),ou(r,u);var s=l.getPerformArgs(r,c.block);o.each(function(t){t.perform(s)}),d|=r.perform(s)}else n&&n.each(function(t,e){f(c,t)&&t.dirty();var n=l.getPerformArgs(t,c.block);n.skip=!i.performRawSeries&&h.isSeriesFiltered(t.context.model),ou(t,u),d|=t.perform(n)})}}),l.unfinished|=d}ru.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each(function(t){var e=t.overallTask;e&&e.dirty()})},ru.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,a=i&&i.modDataCount;return{step:r,modBy:null!=a?Math.ceil(a/r):null,modDataCount:a}}},ru.getPipeline=function(t){return this._pipelineMap.get(t)},ru.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,a=t.get("large")&&i>=t.get("largeThreshold"),o="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:o,large:a}},ru.restorePipelines=function(t){var i=this,r=i._pipelineMap=Z();t.eachSeries(function(t){var e=t.getProgressive(),n=t.uid;r.set(n,{id:n,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),vu(i,t,t.dataTask)})},ru.prepareStageTasks=function(){var n=this._stageTaskMap,i=this.ecInstance.getModel(),r=this.api;k(this._allHandlers,function(t){var e=n.get(t.uid)||n.set(t.uid,[]);t.reset&&function(i,r,t,a,o){var s=t.seriesTaskMap||(t.seriesTaskMap=Z()),e=r.seriesType,n=r.getTargetSeries;r.createOnAllSeries?a.eachRawSeries(l):e?a.eachRawSeriesByType(e,l):n&&n(a,o).each(l);function l(t){var e=t.uid,n=s.get(e)||s.set(e,yh({plan:cu,reset:du,count:gu}));n.context={model:t,ecModel:a,api:o,useClearVisual:r.isVisual&&!r.isLayout,plan:r.plan,reset:r.reset,scheduler:i},vu(i,t,n)}var h=i._pipelineMap;s.each(function(t,e){h.get(e)||(t.dispose(),s.removeKey(e))})}(this,t,e,i,r),t.overallReset&&function(i,t,e,n,r){var a=e.overallTask=e.overallTask||yh({reset:su});a.context={ecModel:n,api:r,overallReset:t.overallReset,scheduler:i};var o=a.agentStubMap=a.agentStubMap||Z(),s=t.seriesType,l=t.getTargetSeries,h=!0,u=t.modifyOutputEnd;s?n.eachRawSeriesByType(s,c):l?l(n,r).each(c):(h=!1,k(n.getSeries(),c));function c(t){var e=t.uid,n=o.get(e);n||(n=o.set(e,yh({reset:lu,onDirty:uu})),a.dirty()),n.context={model:t,overallProgress:h,modifyOutputEnd:u},n.agent=a,n.__block=h,vu(i,t,n)}var d=i._pipelineMap;o.each(function(t,e){d.get(e)||(t.dispose(),a.dirty(),o.removeKey(e))})}(this,t,e,i,r)},this)},ru.prepareView=function(t,e,n,i){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=n,a.api=i,r.__block=!t.incrementalPrepareRender,vu(this,e,r)},ru.performDataProcessorTasks=function(t,e){au(this,this._dataProcessorHandlers,t,e,{block:!0})},ru.performVisualTasks=function(t,e,n){au(this,this._visualHandlers,t,e,n)},ru.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},ru.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var ou=ru.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};function su(t){t.overallReset(t.ecModel,t.api,t.payload)}function lu(t,e){return t.overallProgress&&hu}function hu(){this.agent.dirty(),this.getDownstream().dirty()}function uu(){this.agent&&this.agent.dirty()}function cu(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function du(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Vi(t.reset(t.model,t.ecModel,t.api,t.payload));return 1<e.length?A(e,function(t,e){return pu(e)}):fu}var fu=pu(0);function pu(a){return function(t,e){var n=e.data,i=e.resetDefines[a];if(i&&i.dataEach)for(var r=t.start;r<t.end;r++)i.dataEach(n,r);else i&&i.progress&&i.progress(t,n)}}function gu(t){return t.data.count()}function vu(t,e,n){var i=e.uid,r=t._pipelineMap.get(i);r.head||(r.head=n),r.tail&&r.tail.pipe(n),(r.tail=n).__idxInPipeline=r.count++,n.__pipeline=r}iu.wrapStageHandler=function(t,e){return T(t)&&(t={overallReset:t,seriesType:function(t){mu=null;try{t(yu,_u)}catch(t){}return mu}(t)}),t.uid=Ms("stageHandler"),e&&(t.visualType=e),t};var mu,yu={},_u={};function xu(t,e){for(var n in e.prototype)t[n]=$}xu(yu,Cl),xu(_u,Ll),yu.eachSeriesByType=yu.eachRawSeriesByType=function(t){mu=t},yu.eachComponent=function(t){"series"===t.mainType&&t.subType&&(mu=t.subType)};function wu(){return{axisLine:{lineStyle:{color:Mu}},axisTick:{lineStyle:{color:Mu}},axisLabel:{textStyle:{color:Mu}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:Mu}}}}var bu=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],Su={color:bu,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],bu]},Mu="#eee",Iu=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],Tu={color:Iu,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:Mu},crossStyle:{color:Mu}}},legend:{textStyle:{color:Mu}},textStyle:{color:Mu},title:{textStyle:{color:Mu}},toolbox:{iconStyle:{normal:{borderColor:Mu}}},dataZoom:{textStyle:{color:Mu}},visualMap:{textStyle:{color:Mu}},timeline:{lineStyle:{color:Mu},itemStyle:{normal:{color:Iu[1]}},label:{normal:{textStyle:{color:Mu}}},controlStyle:{normal:{color:Mu,borderColor:Mu}}},timeAxis:wu(),logAxis:wu(),valueAxis:wu(),categoryAxis:wu(),line:{symbol:"circle"},graph:{color:Iu},gauge:{title:{textStyle:{color:Mu}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};Tu.categoryAxis.splitLine.show=!1,il.extend({type:"dataset",defaultOption:{seriesLayoutBy:yl,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){!function(t){var e=t.option.source,n=vl;if(N(e))n=ml;else if(C(e)){0===e.length&&(n=fl);for(var i=0,r=e.length;i<r;i++){var a=e[i];if(null!=a){if(C(a)){n=fl;break}if(O(a)){n=pl;break}}}}else if(O(e)){for(var o in e)if(e.hasOwnProperty(o)&&P(e[o])){n=gl;break}}else if(null!=e)throw new Error("Invalid data");wl(t).sourceFormat=n}(this)}}),Vh.extend({type:"dataset"});var Cu=Ma.extend({type:"ellipse",shape:{cx:0,cy:0,rx:0,ry:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.rx,a=e.ry,o=.5522848*r,s=.5522848*a;t.moveTo(n-r,i),t.bezierCurveTo(n-r,i-s,n-o,i-a,n,i-a),t.bezierCurveTo(n+o,i-a,n+r,i-s,n+r,i),t.bezierCurveTo(n+r,i+s,n+o,i+a,n,i+a),t.bezierCurveTo(n-o,i+a,n-r,i+s,n-r,i),t.closePath()}}),Du=/[\s,]+/;function ku(t){L(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));for(9===t.nodeType&&(t=t.firstChild);"svg"!==t.nodeName.toLowerCase()||1!==t.nodeType;)t=t.nextSibling;return t}var Au={g:function(t,e){var n=new qe;return Pu(e,n),Nu(t,n,this._defs),n},rect:function(t,e){var n=new io;return Pu(e,n),Nu(t,n,this._defs),n.setShape({x:parseFloat(t.getAttribute("x")||0),y:parseFloat(t.getAttribute("y")||0),width:parseFloat(t.getAttribute("width")||0),height:parseFloat(t.getAttribute("height")||0)}),n},circle:function(t,e){var n=new Xa;return Pu(e,n),Nu(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),r:parseFloat(t.getAttribute("r")||0)}),n},line:function(t,e){var n=new ao;return Pu(e,n),Nu(t,n,this._defs),n.setShape({x1:parseFloat(t.getAttribute("x1")||0),y1:parseFloat(t.getAttribute("y1")||0),x2:parseFloat(t.getAttribute("x2")||0),y2:parseFloat(t.getAttribute("y2")||0)}),n},ellipse:function(t,e){var n=new Cu;return Pu(e,n),Nu(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),rx:parseFloat(t.getAttribute("rx")||0),ry:parseFloat(t.getAttribute("ry")||0)}),n},polygon:function(t,e){var n=t.getAttribute("points");n=n&&Ou(n);var i=new $a({shape:{points:n||[]}});return Pu(e,i),Nu(t,i,this._defs),i},polyline:function(t,e){var n=new Ma;Pu(e,n),Nu(t,n,this._defs);var i=t.getAttribute("points");return i=i&&Ou(i),new Ka({shape:{points:i||[]}})},image:function(t,e){var n=new gi;return Pu(e,n),Nu(t,n,this._defs),n.setStyle({image:t.getAttribute("xlink:href"),x:t.getAttribute("x"),y:t.getAttribute("y"),width:t.getAttribute("width"),height:t.getAttribute("height")}),n},text:function(t,e){var n=t.getAttribute("x")||0,i=t.getAttribute("y")||0,r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0;this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(a);var o=new qe;return Pu(e,o),Nu(t,o,this._defs),o},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||0,a=t.getAttribute("dy")||0,o=new qe;return Pu(e,o),Nu(t,o,this._defs),this._textX+=r,this._textY+=a,o},path:function(t,e){var n=Wa(t.getAttribute("d")||"");return Pu(e,n),Nu(t,n,this._defs),n}},Lu={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||0,10),n=parseInt(t.getAttribute("y1")||0,10),i=parseInt(t.getAttribute("x2")||10,10),r=parseInt(t.getAttribute("y2")||0,10),a=new fo(e,n,i,r);return function(t,e){var n=t.firstChild;for(;n;){if(1===n.nodeType){var i=n.getAttribute("offset");i=0<i.indexOf("%")?parseInt(i,10)/100:i?parseFloat(i):0;var r=n.getAttribute("stop-color")||"#000000";e.addColorStop(i,r)}n=n.nextSibling}}(t,a),a},radialgradient:function(t){}};function Pu(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),D(e.__inheritedStyle,t.__inheritedStyle))}function Ou(t){for(var e=X(t).split(Du),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),a=parseFloat(e[i+1]);n.push([r,a])}return n}var Eu={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-align":"textAlign","alignment-baseline":"textBaseline"};function Nu(t,e,n,i){var r=e.__inheritedStyle||{},a="text"===e.type;if(1===t.nodeType&&(function(t,e){var n=t.getAttribute("transform");if(n){n=n.replace(/,/g," ");var i=null,r=[];n.replace(Ru,function(t,e,n){r.push(e,n)});for(var a=r.length-1;0<a;a-=2){var o=r[a],s=r[a-1];switch(i=i||Nt(),s){case"translate":o=X(o).split(Du),Rt(i,i,[parseFloat(o[0]),parseFloat(o[1]||0)]);break;case"scale":o=X(o).split(Du),Vt(i,i,[parseFloat(o[0]),parseFloat(o[1]||o[0])]);break;case"rotate":o=X(o).split(Du),Ft(i,i,parseFloat(o[0]));break;case"skew":o=X(o).split(Du),console.warn("Skew transform is not supported yet");break;case"matrix":o=X(o).split(Du);i[0]=parseFloat(o[0]),i[1]=parseFloat(o[1]),i[2]=parseFloat(o[2]),i[3]=parseFloat(o[3]),i[4]=parseFloat(o[4]),i[5]=parseFloat(o[5])}}e.setLocalTransform(i)}}(t,e),S(r,function(t){var e=t.getAttribute("style"),n={};if(!e)return n;var i,r={};Fu.lastIndex=0;for(;null!=(i=Fu.exec(e));)r[i[1]]=i[2];for(var a in Eu)Eu.hasOwnProperty(a)&&null!=r[a]&&(n[Eu[a]]=r[a]);return n}(t)),!i))for(var o in Eu)if(Eu.hasOwnProperty(o)){var s=t.getAttribute(o);null!=s&&(r[Eu[o]]=s)}var l=a?"textFill":"fill",h=a?"textStroke":"stroke";e.style=e.style||new hn;var u=e.style;null!=r.fill&&u.set(l,zu(r.fill,n)),null!=r.stroke&&u.set(h,zu(r.stroke,n)),k(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],function(t){var e="lineWidth"===t&&a?"textStrokeWidth":t;null!=r[t]&&u.set(e,parseFloat(r[t]))}),r.textBaseline&&"auto"!==r.textBaseline||(r.textBaseline="alphabetic"),"alphabetic"===r.textBaseline&&(r.textBaseline="bottom"),"start"===r.textAlign&&(r.textAlign="left"),"end"===r.textAlign&&(r.textAlign="right"),k(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign","textBaseline"],function(t){null!=r[t]&&u.set(t,r[t])}),r.lineDash&&(e.style.lineDash=X(r.lineDash).split(Du)),u[h]&&"none"!==u[h]&&(e[h]=!0),e.__inheritedStyle=r}var Bu=/url\(\s*#(.*?)\)/;function zu(t,e){var n=e&&t&&t.match(Bu);return n?e[X(n[1])]:t}var Ru=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g;var Fu=/([^\s:;]+)\s*:\s*([^:;]+)/g;var Vu=Z(),Wu=function(t,e,n){var i;return k(i=C(e)?e:e.svg?[{type:"svg",source:e.svg,specialAreas:e.specialAreas}]:(e.geoJson&&!e.features&&(n=e.specialAreas,e=e.geoJson),[{type:"geoJSON",source:e,specialAreas:n}]),function(t){var e=t.type;"geoJson"===e&&(e=t.type="geoJSON"),(0,Gu[e])(t)}),Vu.set(t,i)},Hu=function(t){return Vu.get(t)},Gu={geoJSON:function(t){var e=t.source;t.geoJSON=L(e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")():e},svg:function(t){t.svgXML=ku(t.source)}},Xu=G,Uu=k,qu=T,Yu=O,ju=il.parseClassType,Zu={PROCESSOR:{FILTER:1e3,SERIES_FILTER:800,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:2e3,CHART:3e3,POST_CHART_LAYOUT:3500,COMPONENT:4e3,BRUSH:5e3}},$u="__flagInMainProcess",Ku="__optionUpdated",Qu=/^[a-zA-Z0-9_]+$/;function Ju(i,r){return function(t,e,n){!r&&this._disposed||(t=t&&t.toLowerCase(),ft.prototype[i].call(this,t,e,n))}}function tc(){ft.call(this)}function ec(t,e,n){n=n||{},"string"==typeof e&&(e=Ic[e]),this.id,this.group,this._dom=t;var i=this._zr=Ei(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=Qh(w(i.flush,i),17),(e=b(e))&&eh(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Ol;var r=this._api=function(n){var t=n._coordSysMgr;return S(new Ll(n),{getCoordinateSystems:w(t.getCoordinateSystems,t),getComponentByElement:function(t){for(;t;){var e=t.__ecComponentInfo;if(null!=e)return n._model.getComponent(e.mainType,e.index);t=t.parent}}})}(this);function a(t,e){return t.__prio-e.__prio}tn(Mc,a),tn(wc,a),this._scheduler=new iu(this,r,wc,Mc),ft.call(this,this._ecEventProcessor=new yc),this._messageCenter=new tc,this._initEvents(),this.resize=w(this.resize,this),this._pendingActions=[],i.animation.on("frame",this._onframe,this),function(t,e){t.on("rendered",function(){e.trigger("rendered"),!t.animation.isFinished()||e[Ku]||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")})}(i,this),q(this)}tc.prototype.on=Ju("on",!0),tc.prototype.off=Ju("off",!0),tc.prototype.one=Ju("one",!0),_(tc,ft);var nc=ec.prototype;function ic(t,e,n){if(!this._disposed){var i,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=$i(r,e);for(var o=0;o<a.length;o++){var s=a[o];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}}nc._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[Ku]){var e=this[Ku].silent;this[$u]=!0,ac(this),rc.update.call(this),this[$u]=!1,this[Ku]=!1,hc.call(this,e),uc.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var a=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),sc(this,i),t.performVisualTasks(i),pc(this,this._model,r,"remain"),n-=+new Date-a}while(0<n&&t.unfinished);t.unfinished||this._zr.flush()}}},nc.getDom=function(){return this._dom},nc.getZr=function(){return this._zr},nc.setOption=function(t,e,n){if(!this._disposed){var i;if(Yu(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[$u]=!0,!this._model||e){var r=new Fl(this._api),a=this._theme,o=this._model=new Cl;o.scheduler=this._scheduler,o.init(null,null,a,r)}this._model.setOption(t,bc),n?(this[Ku]={silent:i},this[$u]=!1):(ac(this),rc.update.call(this),this._zr.flush(),this[Ku]=!1,this[$u]=!1,hc.call(this,i),uc.call(this,i))}},nc.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},nc.getModel=function(){return this._model},nc.getOption=function(){return this._model&&this._model.getOption()},nc.getWidth=function(){return this._zr.getWidth()},nc.getHeight=function(){return this._zr.getHeight()},nc.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},nc.getRenderedCanvas=function(t){if(m.canvasSupported)return(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor"),this._zr.painter.getRenderedCanvas(t)},nc.getSvgDataUrl=function(){if(m.svgSupported){var t=this._zr;return k(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToDataUrl()}},nc.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;Uu(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var a="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return Uu(i,function(t){t.group.ignore=!1}),a}},nc.getConnectedDataURL=function(r){if(!this._disposed&&m.canvasSupported){var a=this.group,o=Math.min,s=Math.max;if(Dc[a]){var l=1/0,h=1/0,u=-1/0,c=-1/0,d=[],n=r&&r.pixelRatio||1;k(Cc,function(t,e){if(t.group===a){var n=t.getRenderedCanvas(b(r)),i=t.getDom().getBoundingClientRect();l=o(i.left,l),h=o(i.top,h),u=s(i.right,u),c=s(i.bottom,c),d.push({dom:n,left:i.left,top:i.top})}});var t=(u*=n)-(l*=n),e=(c*=n)-(h*=n),i=p();i.width=t,i.height=e;var f=Ei(i);return r.connectedBackgroundColor&&f.add(new io({shape:{x:0,y:0,width:t,height:e},style:{fill:r.connectedBackgroundColor}})),Uu(d,function(t){var e=new gi({style:{x:t.left*n-l,y:t.top*n-h,image:t.dom}});f.add(e)}),f.refreshImmediately(),i.toDataURL("image/"+(r&&r.type||"png"))}return this.getDataURL(r)}},nc.convertToPixel=I(ic,"convertToPixel"),nc.convertFromPixel=I(ic,"convertFromPixel"),nc.containPixel=function(t,r){var a;if(!this._disposed)return k(t=$i(this._model,t),function(t,i){0<=i.indexOf("Models")&&k(t,function(t){var e=t.coordinateSystem;if(e&&e.containPoint)a|=!!e.containPoint(r);else if("seriesModels"===i){var n=this._chartsMap[t.__viewId];n&&n.containPoint&&(a|=n.containPoint(r,t))}},this)},this),!!a},nc.getVisual=function(t,e){var n=(t=$i(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),i=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?n.indexOfRawIndex(t.dataIndex):null;return null!=i?n.getItemVisual(i,e):n.getVisual(e)},nc.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},nc.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var rc={prepareAndUpdate:function(t){ac(this),rc.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,a=this._scheduler;if(e){a.restoreData(e,t),a.performSeriesTasks(e),r.create(e,n),a.performDataProcessorTasks(e,t),sc(this,e),r.update(e,n),dc(e),a.performVisualTasks(e,t),fc(this,e,n,t);var o=e.get("backgroundColor")||"transparent";if(m.canvasSupported)i.setBackgroundColor(o);else{var s=fe(o);o=ge(s,"rgb"),0===s[3]&&(o="transparent")}gc(e,n)}},updateTransform:function(r){var a=this._model,o=this,s=this._api;if(a){var l=[];a.eachComponent(function(t,e){var n=o.getViewOfComponentModel(e);if(n&&n.__alive)if(n.updateTransform){var i=n.updateTransform(e,a,s,r);i&&i.update&&l.push(n)}else l.push(n)});var i=Z();a.eachSeries(function(t){var e=o._chartsMap[t.__viewId];if(e.updateTransform){var n=e.updateTransform(t,a,s,r);n&&n.update&&i.set(t.uid,1)}else i.set(t.uid,1)}),dc(a),this._scheduler.performVisualTasks(a,r,{setDirty:!0,dirtyMap:i}),pc(o,a,s,r,i),gc(a,this._api)}},updateView:function(t){var e=this._model;e&&(Uh.markUpdateMethod(t,"updateView"),dc(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),fc(this,this._model,this._api,t),gc(e,this._api))},updateVisual:function(t){rc.update.call(this,t)},updateLayout:function(t){rc.update.call(this,t)}};function ac(t){var e=t._model,n=t._scheduler;n.restorePipelines(e),n.prepareStageTasks(),cc(t,"component",e,n),cc(t,"chart",e,n),n.plan()}function oc(e,n,i,r,t){var a=e._model;if(r){var o={};o[r+"Id"]=i[r+"Id"],o[r+"Index"]=i[r+"Index"],o[r+"Name"]=i[r+"Name"];var s={mainType:r,query:o};t&&(s.subType=t);var l=i.excludeSeriesId;null!=l&&(l=Z(Vi(l))),a&&a.eachComponent(s,function(t){l&&null!=l.get(t.id)||h(e["series"===r?"_chartsMap":"_componentsMap"][t.__viewId])},e)}else Uu(e._componentsViews.concat(e._chartsViews),h);function h(t){t&&t.__alive&&t[n]&&t[n](t.__model,a,e._api,i)}}function sc(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries(function(t){i.updateStreamModes(t,n[t.__viewId])})}function lc(e,t){var n=e.type,i=e.escapeConnect,r=_c[n],a=r.actionInfo,o=(a.update||"update").split(":"),s=o.pop();o=null!=o[0]&&ju(o[0]),this[$u]=!0;var l=[e],h=!1;e.batch&&(h=!0,l=A(e.batch,function(t){return(t=D(S({},t),e)).batch=null,t}));var u,c=[],d="highlight"===n||"downplay"===n;Uu(l,function(t){(u=(u=r.action(t,this._model,this._api))||S({},t)).type=a.event||u.type,c.push(u),d?oc(this,s,t,"series"):o&&oc(this,s,t,o.main,o.sub)},this),"none"===s||d||o||(this[Ku]?(ac(this),rc.update.call(this,e),this[Ku]=!1):rc[s].call(this,e)),u=h?{type:a.event||n,escapeConnect:i,batch:c}:c[0],this[$u]=!1,t||this._messageCenter.trigger(u.type,u)}function hc(t){for(var e=this._pendingActions;e.length;){var n=e.shift();lc.call(this,n,t)}}function uc(t){t||this.trigger("updated")}function cc(t,e,r,a){for(var o="component"===e,s=o?t._componentsViews:t._chartsViews,l=o?t._componentsMap:t._chartsMap,h=t._zr,u=t._api,n=0;n<s.length;n++)s[n].__alive=!1;function i(t){var e="_ec_"+t.id+"_"+t.type,n=l[e];if(!n){var i=ju(t.type);(n=new(o?Vh.getClass(i.main,i.sub):Uh.getClass(i.sub))).init(r,u),l[e]=n,s.push(n),h.add(n.group)}t.__viewId=n.__id=e,n.__alive=!0,n.__model=t,n.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},o||a.prepareView(n,t,r,u)}o?r.eachComponent(function(t,e){"series"!==t&&i(e)}):r.eachSeries(i);for(n=0;n<s.length;){var c=s[n];c.__alive?n++:(o||c.renderTask.dispose(),h.remove(c.group),c.dispose(r,u),s.splice(n,1),delete l[c.__id],c.__id=c.group.__ecComponentInfo=null)}}function dc(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})}function fc(t,e,n,i){!function(t,n,i,r,e){Uu(e||t._componentsViews,function(t){var e=t.__model;t.render(e,n,i,r),mc(e,t)})}(t,e,n,i),Uu(t._chartsViews,function(t){t.__alive=!1}),pc(t,e,n,i),Uu(t._chartsViews,function(t){t.__alive||t.remove(e,n)})}function pc(i,t,e,r,a){var o,s=i._scheduler;t.eachSeries(function(t){var e=i._chartsMap[t.__viewId];e.__alive=!0;var n=e.renderTask;s.updatePayload(n,r),a&&a.get(t.uid)&&n.dirty(),o|=n.perform(s.getPerformArgs(n)),e.group.silent=!!t.get("silent"),mc(t,e),function(t,e){var n=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==n&&t.setStyle("blend",n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",n)})})}(t,e)}),s.unfinished|=o,function(n,t){var e=n._zr.storage,i=0;e.traverse(function(t){i++}),i>t.get("hoverLayerThreshold")&&!m.node&&t.eachSeries(function(t){if(!t.preventUsingHoverLayer){var e=n._chartsMap[t.__viewId];e.__alive&&e.group.traverse(function(t){t.useHoverLayer=!0})}})}(i,t),eu(i._zr.dom,t)}function gc(e,n){Uu(Sc,function(t){t(e,n)})}nc.resize=function(t){if(!this._disposed){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this[$u]=!0,n&&ac(this),rc.update.call(this),this[$u]=!1,hc.call(this,i),uc.call(this,i)}}},nc.showLoading=function(t,e){if(!this._disposed&&(Yu(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Tc[t])){var n=Tc[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},nc.hideLoading=function(){this._disposed||(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},nc.makeActionFromEvent=function(t){var e=S({},t);return e.type=xc[t.type],e},nc.dispatchAction=function(t,e){this._disposed||(Yu(e)||(e={silent:!!e}),_c[t.type]&&this._model&&(this[$u]?this._pendingActions.push(t):(lc.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&m.browser.weChat&&this._throttledZrFlush(),hc.call(this,e.silent),uc.call(this,e.silent))))},nc.appendData=function(t){if(!this._disposed){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0}},nc.on=Ju("on",!1),nc.off=Ju("off",!1),nc.one=Ju("one",!1);var vc=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function mc(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function yc(){this.eventInfo}nc._initEvents=function(){Uu(vc,function(h){function t(t){var e,n=this.getModel(),i=t.target;if("globalout"===h)e={};else if(i&&null!=i.dataIndex){var r=i.dataModel||n.getSeriesByIndex(i.seriesIndex);e=r&&r.getDataParams(i.dataIndex,i.dataType,i)||{}}else i&&i.eventData&&(e=S({},i.eventData));if(e){var a=e.componentType,o=e.componentIndex;"markLine"!==a&&"markPoint"!==a&&"markArea"!==a||(a="series",o=e.seriesIndex);var s=a&&null!=o&&n.getComponent(a,o),l=s&&this["series"===s.mainType?"_chartsMap":"_componentsMap"][s.__viewId];e.event=t,e.type=h,this._ecEventProcessor.eventInfo={targetEl:i,packedEvent:e,model:s,view:l},this.trigger(h,e)}}t.zrEventfulCallAtLast=!0,this._zr.on(h,t,this)},this),Uu(xc,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},nc.isDisposed=function(){return this._disposed},nc.clear=function(){this._disposed||this.setOption({series:[]},!0)},nc.dispose=function(){if(!this._disposed){this._disposed=!0,Qi(this.getDom(),Lc,"");var e=this._api,n=this._model;Uu(this._componentsViews,function(t){t.dispose(n,e)}),Uu(this._chartsViews,function(t){t.dispose(n,e)}),this._zr.dispose(),delete Cc[this.id]}},_(ec,ft),yc.prototype={constructor:yc,normalizeQuery:function(t){var s={},l={},h={};if(L(t)){var e=ju(t);s.mainType=e.main||null,s.subType=e.sub||null}else{var u=["Index","Name","Id"],c={name:1,dataIndex:1,dataType:1};k(t,function(t,e){for(var n=!1,i=0;i<u.length;i++){var r=u[i],a=e.lastIndexOf(r);if(0<a&&a===e.length-r.length){var o=e.slice(0,a);"data"!==o&&(s.mainType=o,s[r.toLowerCase()]=t,n=!0)}}c.hasOwnProperty(e)&&(l[e]=t,n=!0),n||(h[e]=t)})}return{cptQuery:s,dataQuery:l,otherQuery:h}},filter:function(t,e,n){var i=this.eventInfo;if(!i)return!0;var r=i.targetEl,a=i.packedEvent,o=i.model,s=i.view;if(!o||!s)return!0;var l=e.cptQuery,h=e.dataQuery;return u(l,o,"mainType")&&u(l,o,"subType")&&u(l,o,"index","componentIndex")&&u(l,o,"name")&&u(l,o,"id")&&u(h,a,"name")&&u(h,a,"dataIndex")&&u(h,a,"dataType")&&(!s.filterForExposedEvent||s.filterForExposedEvent(t,e.otherQuery,r,a));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},afterTrigger:function(){this.eventInfo=null}};var _c={},xc={},wc=[],bc=[],Sc=[],Mc=[],Ic={},Tc={},Cc={},Dc={},kc=new Date-0,Ac=new Date-0,Lc="_echarts_instance_";function Pc(t){Dc[t]=!1}var Oc=Pc;function Ec(t){return Cc[function(t,e){return t.getAttribute?t.getAttribute(e):t[e]}(t,Lc)]}function Nc(t,e){Ic[t]=e}function Bc(t){bc.push(t)}function zc(t,e){Wc(wc,t,e,1e3)}function Rc(t,e,n){"function"==typeof e&&(n=e,e="");var i=Yu(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Xu(Qu.test(i)&&Qu.test(e)),_c[i]||(_c[i]={action:n,actionInfo:t}),xc[e]=i}function Fc(t,e){Wc(Mc,t,e,1e3,"layout")}function Vc(t,e){Wc(Mc,t,e,3e3,"visual")}function Wc(t,e,n,i,r){(qu(e)||Yu(e))&&(n=e,e=i);var a=iu.wrapStageHandler(n,r);return a.__prio=e,a.__raw=n,t.push(a),a}function Hc(t,e){Tc[t]=e}function Gc(t){return Vh.extend(t)}function Xc(t){return Ph.extend(t)}function Uc(t){return Uh.extend(t)}Vc(2e3,Jh),Bc(eh),zc(900,function(t){var a=Z();t.eachSeries(function(t){var e=t.get("stack");if(e){var n=a.get(e)||a.set(e,[]),i=t.getData(),r={stackResultDimension:i.getCalculationInfo("stackResultDimension"),stackedOverDimension:i.getCalculationInfo("stackedOverDimension"),stackedDimension:i.getCalculationInfo("stackedDimension"),stackedByDimension:i.getCalculationInfo("stackedByDimension"),isStackedByIndex:i.getCalculationInfo("isStackedByIndex"),data:i,seriesModel:t};if(!r.stackedDimension||!r.isStackedByIndex&&!r.stackedByDimension)return;n.length&&i.setCalculationInfo("stackedOnSeries",n[n.length-1].seriesModel),n.push(r)}}),a.each(nh)}),Hc("default",function(i,t){D(t=t||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var r=new io({style:{fill:t.maskColor},zlevel:t.zlevel,z:1e4}),a=new uo({shape:{startAngle:-nu/2,endAngle:-nu/2+.1,r:10},style:{stroke:t.color,lineCap:"round",lineWidth:5},zlevel:t.zlevel,z:10001}),o=new io({style:{fill:"none",text:t.text,textPosition:"right",textDistance:10,textFill:t.textColor},zlevel:t.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*nu/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*nu/2}).delay(300).start("circularInOut");var e=new qe;return e.add(a),e.add(o),e.add(r),e.resize=function(){var t=i.getWidth()/2,e=i.getHeight()/2;a.setShape({cx:t,cy:e});var n=a.shape.r;o.setShape({x:t-n,y:e-n,width:2*n,height:2*n}),r.setShape({x:0,y:0,width:i.getWidth(),height:i.getHeight()})},e.resize(),e}),Rc({type:"highlight",event:"highlight",update:"highlight"},$),Rc({type:"downplay",event:"downplay",update:"downplay"},$),Nc("light",Su),Nc("dark",Tu);function qc(t){return t}function Yc(t,e,n,i,r){this._old=t,this._new=e,this._oldKeyGetter=n||qc,this._newKeyGetter=i||qc,this.context=r}function jc(t,e,n,i,r){for(var a=0;a<t.length;a++){var o="_ec_"+r[i](t[a],a),s=e[o];null==s?(n.push(o),e[o]=a):(s.length||(e[o]=s=[s]),s.push(a))}}Yc.prototype={constructor:Yc,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,n={},i=[],r=[];for(jc(t,{},i,"_oldKeyGetter",this),jc(e,n,r,"_newKeyGetter",this),a=0;a<t.length;a++){if(null!=(s=n[o=i[a]]))(h=s.length)?(1===h&&(n[o]=null),s=s.unshift()):n[o]=null,this._update&&this._update(s,a);else this._remove&&this._remove(a)}for(var a=0;a<r.length;a++){var o=r[a];if(n.hasOwnProperty(o)){var s;if(null==(s=n[o]))continue;if(s.length)for(var l=0,h=s.length;l<h;l++)this._add&&this._add(s[l]);else this._add&&this._add(s)}}}};var Zc=Z(["tooltip","label","itemName","itemId","seriesName"]);function $c(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}var Kc=O,Qc="undefined",Jc={float:typeof Float64Array==Qc?Array:Float64Array,int:typeof Int32Array==Qc?Array:Int32Array,ordinal:Array,number:Array,time:Array},td=typeof Uint32Array==Qc?Array:Uint32Array,ed=typeof Int32Array==Qc?Array:Int32Array,nd=typeof Uint16Array==Qc?Array:Uint16Array;function id(t){return 65535<t._rawCount?td:nd}var rd=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],ad=["_extent","_approximateExtent","_rawExtent"];function od(e,n){k(rd.concat(n.__wrappedMethods||[]),function(t){n.hasOwnProperty(t)&&(e[t]=n[t])}),e.__wrappedMethods=n.__wrappedMethods,k(ad,function(t){e[t]=b(n[t])}),e._calculationInfo=S(n._calculationInfo)}function sd(t,e){t=t||["x","y"];for(var n={},i=[],r={},a=0;a<t.length;a++){var o=t[a];L(o)&&(o={name:o});var s=o.name;o.type=o.type||"float",o.coordDim||(o.coordDim=s,o.coordDimIndex=0),o.otherDims=o.otherDims||{},i.push(s),(n[s]=o).index=a,o.createInvertedIndices&&(r[s]=[])}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this._indices=null,this._count=0,this._rawCount=0,this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this._visual={},this._layout={},this._itemVisuals=[],this.hasItemVisual={},this._itemLayouts=[],this._graphicEls=[],this._chunkSize=1e5,this._chunkCount=0,this._rawData,this._rawExtent={},this._extent={},this._approximateExtent={},this._dimensionsSummary=function(i){var t={},a=t.encode={},o=Z(),s=[],l=[],h=t.userOutput={dimensionNames:i.dimensions.slice(),encode:{}};k(i.dimensions,function(t){var r=i.getDimensionInfo(t),e=r.coordDim;if(e){var n=r.coordDimIndex;$c(a,e)[n]=t,r.isExtraCoord||(o.set(e,1),function(t){return!("ordinal"===t||"time"===t)}(r.type)&&(s[0]=t),$c(h.encode,e)[n]=r.index),r.defaultTooltip&&l.push(t)}Zc.each(function(t,e){var n=$c(a,e),i=r.otherDims[e];null!=i&&!1!==i&&(n[i]=r.name)})});var r=[],u={};o.each(function(t,e){var n=a[e];u[e]=n[0],r=r.concat(n)}),t.dataDimsOnCoord=r,t.encodeFirstDimNotExtra=u;var e=a.label;e&&e.length&&(s=e.slice());var n=a.tooltip;return n&&n.length?l=n.slice():l.length||(l=s.slice()),a.defaultedLabel=s,a.defaultedTooltip=l,t}(this),this._invertedIndicesMap=r,this._calculationInfo={},this.userOutput=this._dimensionsSummary.userOutput}var ld=sd.prototype;function hd(t,e,n,i,r){var a=Jc[e.type],o=i-1,s=e.name,l=t[s][o];if(l&&l.length<n){for(var h=new a(Math.min(r-o*n,n)),u=0;u<l.length;u++)h[u]=l[u];t[s][o]=h}for(var c=i*n;c<r;c+=n)t[s].push(new a(Math.min(r-c,n)))}function ud(r){var a=r._invertedIndicesMap;k(a,function(t,e){var n=r._dimensionInfos[e].ordinalMeta;if(n){t=a[e]=new ed(n.categories.length);for(var i=0;i<t.length;i++)t[i]=-1;for(i=0;i<r._count;i++)t[r.get(e,i)]=i}})}function cd(t,e,n){var i;if(null!=e){var r=t._chunkSize,a=Math.floor(n/r),o=n%r,s=t.dimensions[e],l=t._storage[s][a];if(l){i=l[o];var h=t._dimensionInfos[s].ordinalMeta;h&&h.categories.length&&(i=h.categories[i])}}return i}function dd(t){return t}function fd(t){return t<this._count&&0<=t?this._indices[t]:-1}function pd(t,e){var n=t._idList[e];return null==n&&(n=cd(t,t._idDimIdx,e)),null==n&&(n="e\0\0"+e),n}function gd(t){return C(t)||(t=[t]),t}function vd(t,e){var n=t.dimensions,i=new sd(A(n,t.getDimensionInfo,t),t.hostModel);od(i,t);for(var r=i._storage={},a=t._storage,o=0;o<n.length;o++){var s=n[o];a[s]&&(0<=v(e,s)?(r[s]=md(a[s]),i._rawExtent[s]=yd(),i._extent[s]=null):r[s]=a[s])}return i}function md(t){for(var e,n,i=new Array(t.length),r=0;r<t.length;r++)i[r]=(e=t[r],n=void 0,(n=e.constructor)===Array?e.slice():new n(e));return i}function yd(){return[1/0,-1/0]}ld.type="list",ld.hasItemOption=!0,ld.getDimension=function(t){return"number"!=typeof t&&(isNaN(t)||this._dimensionInfos.hasOwnProperty(t))||(t=this.dimensions[t]),t},ld.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},ld.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},ld.mapDimension=function(t,e){var n=this._dimensionsSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return!0===e?(i||[]).slice():i&&i[e]},ld.initData=function(t,e,n){(xl.isInstance(t)||P(t))&&(t=new ih(t,this.dimensions.length)),this._rawData=t,this._storage={},this._indices=null,this._nameList=e||[],this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=ch[this._rawData.getSource().sourceFormat],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._dimValueGetterArrayRows=ch.arrayRows,this._rawExtent={},this._initDataFromProvider(0,t.count()),t.pure&&(this.hasItemOption=!1)},ld.getProvider=function(){return this._rawData},ld.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);var i=e.count();e.persistent||(i+=n),this._initDataFromProvider(n,i)},ld.appendValues=function(t,e){for(var n=this._chunkSize,i=this._storage,r=this.dimensions,a=r.length,o=this._rawExtent,s=this.count(),l=s+Math.max(t.length,e?e.length:0),h=this._chunkCount,u=0;u<a;u++){o[m=r[u]]||(o[m]=yd()),i[m]||(i[m]=[]),hd(i,this._dimensionInfos[m],n,h,l),this._chunkCount=i[m].length}for(var c=new Array(a),d=s;d<l;d++){for(var f=d-s,p=Math.floor(d/n),g=d%n,v=0;v<a;v++){var m=r[v],y=this._dimValueGetterArrayRows(t[f]||c,m,f,v);i[m][p][g]=y;var _=o[m];y<_[0]&&(_[0]=y),y>_[1]&&(_[1]=y)}e&&(this._nameList[d]=e[f])}this._rawCount=this._count=l,this._extent={},ud(this)},ld._initDataFromProvider=function(t,e){if(!(e<=t)){for(var n,i=this._chunkSize,r=this._rawData,a=this._storage,o=this.dimensions,s=o.length,l=this._dimensionInfos,h=this._nameList,u=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=0;p<s;p++){c[w=o[p]]||(c[w]=yd());var g=l[w];0===g.otherDims.itemName&&(n=this._nameDimIdx=p),0===g.otherDims.itemId&&(this._idDimIdx=p),a[w]||(a[w]=[]),hd(a,g,i,f,e),this._chunkCount=a[w].length}for(var v=new Array(s),m=t;m<e;m++){v=r.getItem(m,v);for(var y=Math.floor(m/i),_=m%i,x=0;x<s;x++){var w,b=a[w=o[x]][y],S=this._dimValueGetter(v,w,m,x);b[_]=S;var M=c[w];S<M[0]&&(M[0]=S),S>M[1]&&(M[1]=S)}if(!r.pure){var I=h[m];if(v&&null==I)if(null!=v.name)h[m]=I=v.name;else if(null!=n){var T=o[n],C=a[T][y];if(C){I=C[_];var D=l[T].ordinalMeta;D&&D.categories.length&&(I=D.categories[I])}}var k=null==v?null:v.id;null==k&&null!=I&&(d[I]=d[I]||0,0<d[k=I]&&(k+="__ec__"+d[I]),d[I]++),null!=k&&(u[m]=k)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={},ud(this)}},ld.count=function(){return this._count},ld.getIndices=function(){var t=this._indices;if(t){var e=t.constructor,n=this._count;if(e===Array){r=new e(n);for(var i=0;i<n;i++)r[i]=t[i]}else r=new e(t.buffer,0,n)}else{var r=new(e=id(this))(this.count());for(i=0;i<r.length;i++)r[i]=i}return r},ld.get=function(t,e){if(!(0<=e&&e<this._count))return NaN;var n=this._storage;if(!n[t])return NaN;e=this.getRawIndex(e);var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[t][i][r]},ld.getByRawIndex=function(t,e){if(!(0<=e&&e<this._rawCount))return NaN;var n=this._storage[t];if(!n)return NaN;var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[i][r]},ld._getFast=function(t,e){var n=Math.floor(e/this._chunkSize),i=e%this._chunkSize;return this._storage[t][n][i]},ld.getValues=function(t,e){var n=[];C(t)||(e=t,t=this.dimensions);for(var i=0,r=t.length;i<r;i++)n.push(this.get(t[i],e));return n},ld.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this.get(e[n],t)))return!1;return!0},ld.getDataExtent=function(t){t=this.getDimension(t);var e=this._storage[t],n=yd();if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var a=(i=n)[0],o=i[1],s=0;s<r;s++){var l=this._getFast(t,this.getRawIndex(s));l<a&&(a=l),o<l&&(o=l)}return i=[a,o],this._extent[t]=i},ld.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},ld.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},ld.getCalculationInfo=function(t){return this._calculationInfo[t]},ld.setCalculationInfo=function(t,e){Kc(t)?S(this._calculationInfo,t):this._calculationInfo[t]=e},ld.getSum=function(t){var e=0;if(this._storage[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},ld.getMedian=function(t){var n=[];this.each(t,function(t,e){isNaN(t)||n.push(t)});var e=[].concat(n).sort(function(t,e){return t-e}),i=this.count();return 0===i?0:i%2==1?e[(i-1)/2]:(e[i/2]+e[i/2-1])/2},ld.rawIndexOf=function(t,e){var n=(t&&this._invertedIndicesMap[t])[e];return null==n||isNaN(n)?-1:n},ld.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},ld.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||t<0)return-1;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=1+a;else{if(!(e[a]>t))return a;r=a-1}}return-1},ld.indicesOfNearest=function(t,e,n){var i=[];if(!this._storage[t])return i;null==n&&(n=1/0);for(var r=Number.MAX_VALUE,a=-1,o=0,s=this.count();o<s;o++){var l=e-this.get(t,o),h=Math.abs(l);l<=n&&h<=r&&((h<r||0<=l&&a<0)&&(r=h,a=l,i.length=0),i.push(o))}return i},ld.getRawIndex=dd,ld.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},ld.getName=function(t){var e=this.getRawIndex(t);return this._nameList[e]||cd(this,this._nameDimIdx,e)||""},ld.getId=function(t){return pd(this,this.getRawIndex(t))},ld.each=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;for(var r=(t=A(gd(t),this.getDimension,this)).length,a=0;a<this.count();a++)switch(r){case 0:e.call(n,a);break;case 1:e.call(n,this.get(t[0],a),a);break;case 2:e.call(n,this.get(t[0],a),this.get(t[1],a),a);break;default:for(var o=0,s=[];o<r;o++)s[o]=this.get(t[o],a);s[o]=a,e.apply(n,s)}}},ld.filterSelf=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this,t=A(gd(t),this.getDimension,this);for(var r=this.count(),a=new(id(this))(r),o=[],s=t.length,l=0,h=t[0],u=0;u<r;u++){var c,d=this.getRawIndex(u);if(0===s)c=e.call(n,u);else if(1===s){var f=this._getFast(h,d);c=e.call(n,f,u)}else{for(var p=0;p<s;p++)o[p]=this._getFast(h,d);o[p]=u,c=e.apply(n,o)}c&&(a[l++]=d)}return l<r&&(this._indices=a),this._count=l,this._extent={},this.getRawIndex=this._indices?fd:dd,this}},ld.selectRange=function(t){if(this._count){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);var i=e.length;if(i){var r=this.count(),a=new(id(this))(r),o=0,s=e[0],l=t[s][0],h=t[s][1],u=!1;if(!this._indices){var c=0;if(1===i){for(var d=this._storage[e[0]],f=0;f<this._chunkCount;f++)for(var p=d[f],g=Math.min(this._count-f*this._chunkSize,this._chunkSize),v=0;v<g;v++){(l<=(w=p[v])&&w<=h||isNaN(w))&&(a[o++]=c),c++}u=!0}else if(2===i){d=this._storage[s];var m=this._storage[e[1]],y=t[e[1]][0],_=t[e[1]][1];for(f=0;f<this._chunkCount;f++){p=d[f];var x=m[f];for(g=Math.min(this._count-f*this._chunkSize,this._chunkSize),v=0;v<g;v++){var w=p[v],b=x[v];(l<=w&&w<=h||isNaN(w))&&(y<=b&&b<=_||isNaN(b))&&(a[o++]=c),c++}}u=!0}}if(!u)if(1===i)for(v=0;v<r;v++){var S=this.getRawIndex(v);(l<=(w=this._getFast(s,S))&&w<=h||isNaN(w))&&(a[o++]=S)}else for(v=0;v<r;v++){var M=!0;for(S=this.getRawIndex(v),f=0;f<i;f++){var I=e[f];((w=this._getFast(n,S))<t[I][0]||w>t[I][1])&&(M=!1)}M&&(a[o++]=this.getRawIndex(v))}return o<r&&(this._indices=a),this._count=o,this._extent={},this.getRawIndex=this._indices?fd:dd,this}}},ld.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n),r},ld.map=function(t,e,n,i){n=n||i||this;var r=vd(this,t=A(gd(t),this.getDimension,this));r._indices=this._indices,r.getRawIndex=r._indices?fd:dd;for(var a=r._storage,o=[],s=this._chunkSize,l=t.length,h=this.count(),u=[],c=r._rawExtent,d=0;d<h;d++){for(var f=0;f<l;f++)u[f]=this.get(t[f],d);u[l]=d;var p=e&&e.apply(n,u);if(null!=p){"object"!=typeof p&&(o[0]=p,p=o);for(var g=this.getRawIndex(d),v=Math.floor(g/s),m=g%s,y=0;y<p.length;y++){var _=t[y],x=p[y],w=c[_],b=a[_];b&&(b[v][m]=x),x<w[0]&&(w[0]=x),x>w[1]&&(w[1]=x)}}}return r},ld.downSample=function(t,e,n,i){for(var r=vd(this,[t]),a=r._storage,o=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=r._rawExtent[t],d=new(id(this))(h),f=0,p=0;p<h;p+=s){h-p<s&&(s=h-p,o.length=s);for(var g=0;g<s;g++){var v=this.getRawIndex(p+g),m=Math.floor(v/u),y=v%u;o[g]=l[m][y]}var _=n(o),x=this.getRawIndex(Math.min(p+i(o,_)||0,h-1)),w=x%u;(l[Math.floor(x/u)][w]=_)<c[0]&&(c[0]=_),_>c[1]&&(c[1]=_),d[f++]=x}return r._count=f,r._indices=d,r.getRawIndex=fd,r},ld.getItemModel=function(t){var e=this.hostModel;return new xs(this.getRawDataItem(t),e,e&&e.ecModel)},ld.diff=function(e){var n=this;return new Yc(e?e.getIndices():[],this.getIndices(),function(t){return pd(e,t)},function(t){return pd(n,t)})},ld.getVisual=function(t){var e=this._visual;return e&&e[t]},ld.setVisual=function(t,e){if(Kc(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},ld.setLayout=function(t,e){if(Kc(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},ld.getLayout=function(t){return this._layout[t]},ld.getItemLayout=function(t){return this._itemLayouts[t]},ld.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?S(this._itemLayouts[t]||{},e):e},ld.clearItemLayouts=function(){this._itemLayouts.length=0},ld.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},ld.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=i,Kc(e))for(var a in e)e.hasOwnProperty(a)&&(i[a]=e[a],r[a]=!0);else i[e]=n,r[e]=!0},ld.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};function _d(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType}function xd(t,e,n){xl.isInstance(e)||(e=xl.seriesDataToSource(e)),n=n||{},t=(t||[]).slice();for(var i=(n.dimsDef||[]).slice(),l=Z(n.encodeDef),r=Z(),a=Z(),h=[],o=function(t,e,n,i){var r=Math.max(t.dimensionsDetectCount||1,e.length,n.length,i||0);return k(e,function(t){var e=t.dimsDef;e&&(r=Math.max(r,e.length))}),r}(e,t,i,n.dimCount),s=0;s<o;s++){var u=i[s]=S({},O(i[s])?i[s]:{name:i[s]}),c=u.name,d=h[s]={otherDims:{}};null!=c&&null==r.get(c)&&(d.name=d.displayName=c,r.set(c,s)),null!=u.type&&(d.type=u.type),null!=u.displayName&&(d.displayName=u.displayName)}l.each(function(t,n){if(1===(t=Vi(t).slice()).length&&!L(t[0])&&t[0]<0)l.set(n,!1);else{var i=l.set(n,[]);k(t,function(t,e){L(t)&&(t=r.get(t)),null!=t&&t<o&&(i[e]=t,p(h[t],n,e))})}});var f=0;function p(t,e,n){null!=Zc.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,a.set(e,!0))}k(t,function(r,t){var a,o,s;if(L(r))a=r,r={};else{a=r.name;var e=r.ordinalMeta;r.ordinalMeta=null,(r=b(r)).ordinalMeta=e,o=r.dimsDef,s=r.otherDims,r.name=r.coordDim=r.coordDimIndex=r.dimsDef=r.otherDims=null}if(!1!==(n=l.get(a))){var n;if(!(n=Vi(n)).length)for(var i=0;i<(o&&o.length||1);i++){for(;f<h.length&&null!=h[f].coordDim;)f++;f<h.length&&n.push(f++)}k(n,function(t,e){var n=h[t];if(p(D(n,r),a,e),null==n.name&&o){var i=o[e];O(i)||(i={name:i}),n.name=n.displayName=i.name,n.defaultTooltip=i.defaultTooltip}s&&D(n.otherDims,s)})}});var g=n.generateCoord,v=n.generateCoordCount,m=null!=v;v=g?v||1:0;for(var y,_,x=g||"value",w=0;w<o;w++){null==(d=h[w]=h[w]||{}).coordDim&&(d.coordDim=wd(x,a,m),d.coordDimIndex=0,(!g||v<=0)&&(d.isExtraCoord=!0),v--),null==d.name&&(d.name=wd(d.coordDim,r)),null==d.type&&(y=e,_=w,d.name,Il(y.data,y.sourceFormat,y.seriesLayoutBy,y.dimensionsDefine,y.startIndex,_))&&(d.type="ordinal")}return h}function wd(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}ld.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(_d,e)),this._graphicEls[t]=e},ld.getItemGraphicEl=function(t){return this._graphicEls[t]},ld.eachItemGraphicEl=function(n,i){k(this._graphicEls,function(t,e){t&&n&&n.call(i,t,e)})},ld.cloneShallow=function(t){if(!t){var e=A(this.dimensions,this.getDimensionInfo,this);t=new sd(e,this.hostModel)}if(t._storage=this._storage,od(t,this),this._indices){var n=this._indices.constructor;t._indices=new n(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?fd:dd,t},ld.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(W(arguments)))})},ld.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],ld.CHANGABLE_METHODS=["filterSelf","selectRange"];function bd(t,e){return xd((e=e||{}).coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})}function Sd(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function Md(t,e,n){n=n||{},xl.isInstance(t)||(t=xl.seriesDataToSource(t));var i,r=e.get("coordinateSystem"),a=Ol.get(r),o=hl(e);o&&(i=A(o.coordSysDims,function(t){var e={name:t},n=o.axisMap.get(t);if(n){var i=n.get("type");e.type=function(t){return"category"===t?"ordinal":"time"===t?"time":"float"}(i)}return e})),i=i||(a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||["x","y"]);var s,l,h=bd(t,{coordDimensions:i,generateCoord:n.generateCoord});o&&k(h,function(t,e){var n=t.coordDim,i=o.categoryAxisMap.get(n);i&&(null==s&&(s=e),t.ordinalMeta=i.getOrdinalMeta()),null!=t.otherDims.itemName&&(l=!0)}),l||null==s||(h[s].otherDims.itemName=0);var u=function(t,n,e){var i,r,a,o,s=(e=e||{}).byIndex,l=e.stackedCoordDimension,h=!(!t||!t.get("stack"));if(k(n,function(t,e){L(t)&&(n[e]=t={name:t}),h&&!t.isExtraCoord&&(s||i||!t.ordinalMeta||(i=t),r||"ordinal"===t.type||"time"===t.type||l&&l!==t.coordDim||(r=t))}),!r||s||i||(s=!0),r){a="__\0ecstackresult",o="__\0ecstackedover",i&&(i.createInvertedIndices=!0);var u=r.coordDim,c=r.type,d=0;k(n,function(t){t.coordDim===u&&d++}),n.push({name:a,coordDim:u,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0}),d++,n.push({name:o,coordDim:o,coordDimIndex:d,type:c,isExtraCoord:!0,isCalculationCoord:!0})}return{stackedDimension:r&&r.name,stackedByDimension:i&&i.name,isStackedByIndex:s,stackedOverDimension:o,stackResultDimension:a}}(e,h),c=new sd(h,e);c.setCalculationInfo(u);var d=null!=s&&function(t){if(t.sourceFormat===dl){var e=function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[]);return null!=e&&!C(Gi(e))}}(t)?function(t,e,n,i){return i===s?n:this.defaultDimValueGetter(t,e,n,i)}:null;return c.hasItemOption=!1,c.initData(t,null,d),c}Ph.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return Md(this.getSource(),this)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clip:!0,label:{position:"top"},lineStyle:{width:2,type:"solid"},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});var Id=To({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),Td=To({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),Cd=To({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),d=Math.cos(h),f=.6*o,p=.7*o;t.moveTo(n-u,l+s),t.arc(n,l,o,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(n+u-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*f,l+s+d*f,n-u,l+s),t.closePath()}}),Dd=To({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),kd={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Ad={};k({line:ao,rect:io,roundRect:io,square:io,circle:Xa,diamond:Td,pin:Cd,arrow:Dd,triangle:Id},function(t,e){Ad[e]=new t});var Ld=To({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=Nn(t,e,n),r=this.shape;return r&&"pin"===r.symbolType&&"inside"===e.textPosition&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i=e.symbolType;if("none"!==i){var r=Ad[i];r=r||Ad[i="rect"],kd[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n)}}});function Pd(t,e){if("image"!==this.type){var n=this.style,i=this.shape;i&&"line"===i.symbolType?n.stroke=t:this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff"):(n.fill&&(n.fill=t),n.stroke&&(n.stroke=t)),this.dirty(!1)}}function Od(t,e,n,i,r,a,o){var s,l=0===t.indexOf("empty");return l&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(s=0===t.indexOf("image://")?ko(t.slice(8),new Ue(e,n,i,r),o?"center":"cover"):0===t.indexOf("path://")?Do(t.slice(7),{},new Ue(e,n,i,r),o?"center":"cover"):new Ld({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=l,s.setColor=Pd,s.setColor(a),s}function Ed(t,e){var n=t.mapDimension("defaultedLabel",!0),i=n.length;if(1===i)return ph(t,e,n[0]);if(i){for(var r=[],a=0;a<n.length;a++){var o=ph(t,e,n[a]);r.push(o)}return r.join(" ")}}function Nd(t,e,n){qe.call(this),this.updateData(t,e,n)}var Bd=Nd.prototype,zd=Nd.getSymbolSize=function(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]};function Rd(t){return[t[0]/2,t[1]/2]}function Fd(t,e){this.parent.drift(t,e)}Bd._createSymbol=function(t,e,n,i,r){this.removeAll();var a=Od(t,-1,-1,2,2,e.getItemVisual(n,"color"),r);a.attr({z2:100,culling:!0,scale:Rd(i)}),a.drift=Fd,this._symbolType=t,this.add(a)},Bd.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},Bd.getSymbolPath=function(){return this.childAt(0)},Bd.getScale=function(){return this.childAt(0).scale},Bd.highlight=function(){this.childAt(0).trigger("emphasis")},Bd.downplay=function(){this.childAt(0).trigger("normal")},Bd.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},Bd.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},Bd.updateData=function(t,e,n){this.silent=!1;var i=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,a=zd(t,e),o=i!==this._symbolType;if(o){var s=t.getItemVisual(e,"symbolKeepAspect");this._createSymbol(i,t,e,a,s)}else{(l=this.childAt(0)).silent=!1,ss(l,{scale:Rd(a)},r,e)}if(this._updateCommon(t,e,a,n),o){var l=this.childAt(0),h=n&&n.fadeIn,u={scale:l.scale.slice()};h&&(u.style={opacity:l.style.opacity}),l.scale=[0,0],h&&(l.style.opacity=0),ls(l,u,r,e)}this._seriesModel=r};var Vd=["itemStyle"],Wd=["emphasis","itemStyle"],Hd=["label"],Gd=["emphasis","label"];function Xd(t,e){if(!this.incremental&&!this.useHoverLayer)if("emphasis"===e){var n=this.__symbolOriginalScale,i=n[1]/n[0],r={scale:[Math.max(1.1*n[0],n[0]+3),Math.max(1.1*n[1],n[1]+3*i)]};this.animateTo(r,400,"elasticOut")}else"normal"===e&&this.animateTo({scale:this.__symbolOriginalScale},400,"elasticOut")}function Ud(t){this.group=new qe,this._symbolCtor=t||Nd}Bd._updateCommon=function(n,t,e,i){var r=this.childAt(0),a=n.hostModel,o=n.getItemVisual(t,"color");"image"!==r.type&&r.useStyle({strokeNoScale:!0});var s=i&&i.itemStyle,l=i&&i.hoverItemStyle,h=i&&i.symbolRotate,u=i&&i.symbolOffset,c=i&&i.labelModel,d=i&&i.hoverLabelModel,f=i&&i.hoverAnimation,p=i&&i.cursorStyle;if(!i||n.hasItemOption){var g=i&&i.itemModel?i.itemModel:n.getItemModel(t);s=g.getModel(Vd).getItemStyle(["color"]),l=g.getModel(Wd).getItemStyle(),h=g.getShallow("symbolRotate"),u=g.getShallow("symbolOffset"),c=g.getModel(Hd),d=g.getModel(Gd),f=g.getShallow("hoverAnimation"),p=g.getShallow("cursor")}else l=S({},l);var v=r.style;r.attr("rotation",(h||0)*Math.PI/180||0),u&&r.attr("position",[Cs(u[0],e[0]),Cs(u[1],e[1])]),p&&r.attr("cursor",p),r.setColor(o,i&&i.symbolInnerColor),r.setStyle(s);var m=n.getItemVisual(t,"opacity");null!=m&&(v.opacity=m);var y=n.getItemVisual(t,"liftZ"),_=r.__z2Origin;null!=y?null==_&&(r.__z2Origin=r.z2,r.z2+=y):null!=_&&(r.z2=_,r.__z2Origin=null);var x=i&&i.useNameLabel;Qo(v,l,c,d,{labelFetcher:a,labelDataIndex:t,defaultText:function(t,e){return x?n.getName(t):Ed(n,t)},isRectText:!0,autoColor:o}),r.__symbolOriginalScale=Rd(e),r.hoverStyle=l,r.highDownOnUpdate=f&&a.isAnimationEnabled()?Xd:null,jo(r)},Bd.fadeOut=function(t,e){var n=this.childAt(0);this.silent=n.silent=!0,e&&e.keepLabel||(n.style.text=null),ss(n,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,t)},y(Nd,qe);var qd=Ud.prototype;function Yd(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function jd(t){return null==t||O(t)||(t={isIgnore:t}),t||{}}function Zd(t){var e=t.hostModel;return{itemStyle:e.getModel("itemStyle").getItemStyle(["color"]),hoverItemStyle:e.getModel("emphasis.itemStyle").getItemStyle(),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label"),cursorStyle:e.get("cursor")}}function $d(t,e,n){var i,r=t.getBaseAxis(),a=t.getOtherAxis(r),o=function(t,e){var n=0,i=t.scale.getExtent();"start"===e?n=i[0]:"end"===e?n=i[1]:0<i[0]?n=i[0]:i[1]<0&&(n=i[1]);return n}(a,n),s=r.dim,l=a.dim,h=e.mapDimension(l),u=e.mapDimension(s),c="x"===l||"radius"===l?1:0,d=A(t.dimensions,function(t){return e.mapDimension(t)}),f=e.getCalculationInfo("stackResultDimension");return(i|=Sd(e,d[0]))&&(d[0]=f),(i|=Sd(e,d[1]))&&(d[1]=f),{dataDimsForPoint:d,valueStart:o,valueAxisDim:l,baseAxisDim:s,stacked:!!i,valueDim:h,baseDim:u,baseDataOffset:c,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function Kd(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var a=t.baseDataOffset,o=[];return o[a]=n.get(t.baseDim,i),o[1-a]=r,e.dataToPoint(o)}qd.updateData=function(r,a){a=jd(a);var o=this.group,s=r.hostModel,l=this._data,h=this._symbolCtor,u=Zd(r);l||o.removeAll(),r.diff(l).add(function(t){var e=r.getItemLayout(t);if(Yd(r,e,t,a)){var n=new h(r,t,u);n.attr("position",e),r.setItemGraphicEl(t,n),o.add(n)}}).update(function(t,e){var n=l.getItemGraphicEl(e),i=r.getItemLayout(t);Yd(r,i,t,a)?(n?(n.updateData(r,t,u),ss(n,{position:i},s)):(n=new h(r,t)).attr("position",i),o.add(n),r.setItemGraphicEl(t,n)):o.remove(n)}).remove(function(t){var e=l.getItemGraphicEl(t);e&&e.fadeOut(function(){o.remove(e)})}).execute(),this._data=r},qd.isPersistent=function(){return!0},qd.updateLayout=function(){var i=this._data;i&&i.eachItemGraphicEl(function(t,e){var n=i.getItemLayout(e);t.attr("position",n)})},qd.incrementalPrepareUpdate=function(t){this._seriesScope=Zd(t),this._data=null,this.group.removeAll()},qd.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}n=jd(n);for(var r=t.start;r<t.end;r++){var a=e.getItemLayout(r);if(Yd(e,a,r,n)){var o=new this._symbolCtor(e,r,this._seriesScope);o.traverse(i),o.attr("position",a),this.group.add(o),e.setItemGraphicEl(r,o)}}},qd.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll()};var Qd=lt,Jd=ht,tf=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},ef=function(t,e){return t[0]=e[0],t[1]=e[1],t},nf=[],rf=[],af=[];function of(t){return isNaN(t[0])||isNaN(t[1])}function sf(t,e,n,i,r,a,o,s,l,h){return"none"!==h&&h?function(t,e,n,i,r,a,o,s,l,h,u){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(r<=d||d<0)break;if(of(p)){if(u){d+=a;continue}break}if(d===n)t[0<a?"moveTo":"lineTo"](p[0],p[1]);else if(0<l){var g=e[c],v="y"===h?1:0,m=(p[v]-g[v])*l;ef(rf,g),rf[v]=g[v]+m,ef(af,p),af[v]=p[v]-m,t.bezierCurveTo(rf[0],rf[1],af[0],af[1],p[0],p[1])}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}.apply(this,arguments):function(t,e,n,i,r,a,o,s,l,h,u){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(r<=d||d<0)break;if(of(p)){if(u){d+=a;continue}break}if(d===n)t[0<a?"moveTo":"lineTo"](p[0],p[1]),ef(rf,p);else if(0<l){var g=d+a,v=e[g];if(u)for(;v&&of(e[g]);)v=e[g+=a];var m=.5,y=e[c];if(!(v=e[g])||of(v))ef(af,p);else{var _,x;if(of(v)&&!u&&(v=p),et(nf,v,y),"x"===h||"y"===h){var w="x"===h?0:1;_=Math.abs(p[w]-y[w]),x=Math.abs(p[w]-v[w])}else _=at(p,y),x=at(p,v);tf(af,p,nf,-l*(1-(m=x/(x+_))))}Qd(rf,rf,s),Jd(rf,rf,o),Qd(af,af,s),Jd(af,af,o),t.bezierCurveTo(rf[0],rf[1],af[0],af[1],p[0],p[1]),tf(rf,p,nf,l*m)}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}.apply(this,arguments)}function lf(t,e){var n=[1/0,1/0],i=[-1/0,-1/0];if(e)for(var r=0;r<t.length;r++){var a=t[r];a[0]<n[0]&&(n[0]=a[0]),a[1]<n[1]&&(n[1]=a[1]),a[0]>i[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var hf=Ma.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.points,i=0,r=n.length,a=lf(n,e.smoothConstraint);if(e.connectNulls){for(;0<r&&of(n[r-1]);r--);for(;i<r&&of(n[i]);i++);}for(;i<r;)i+=sf(t,n,i,r,r,1,a.min,a.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),uf=Ma.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:Ga(Ma.prototype.brush),buildPath:function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,a=n.length,o=e.smoothMonotone,s=lf(n,e.smoothConstraint),l=lf(i,e.smoothConstraint);if(e.connectNulls){for(;0<a&&of(n[a-1]);a--);for(;r<a&&of(n[r]);r++);}for(;r<a;){var h=sf(t,n,r,a,a,1,s.min,s.max,e.smooth,o,e.connectNulls);sf(t,i,r+h-1,h,a,-1,l.min,l.max,e.stackedOnSmooth,o,e.connectNulls),r+=h+1,t.closePath()}}});function cf(t,e,n){var i=t.getArea(),r=t.getBaseAxis().isHorizontal(),a=i.x,o=i.y,s=i.width,l=i.height,h=n.get("lineStyle.width")||2,u=new io({shape:{x:a-=h/2,y:o-=h/2,width:s+=h,height:l+=h}});return e&&(u.shape[r?"width":"height"]=0,ls(u,{shape:{width:s,height:l}},n)),u}function df(t,e,n){var i=t.getArea(),r=new qa({shape:{cx:Ds(t.cx,1),cy:Ds(t.cy,1),r0:Ds(i.r0,1),r:Ds(i.r,1),startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}});return e&&(r.shape.endAngle=i.startAngle,ls(r,{shape:{endAngle:i.endAngle}},n)),r}function ff(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function pf(t){return"number"==typeof t?t:t?.5:0}function gf(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0;o<t.length-1;o++){var s=t[o+1],l=t[o];a.push(l);var h=[];switch(n){case"end":h[r]=s[r],h[1-r]=l[1-r],a.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],a.push(h),a.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],a.push(h)}}return t[o]&&a.push(t[o]),a}function vf(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var a=n.getAxesByScale("ordinal")[0];if(a&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),a=Math.max(1,Math.round(r/5)),o=0;o<r;o+=a)if(1.5*Nd.getSymbolSize(e,o)[t.isHorizontal()?1:0]>i)return!1;return!0}(a,e))){var o=e.mapDimension(a.dim),s={};return k(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(o,t))}}}}function mf(t,e,n){if("cartesian2d"!==t.type)return df(t,e,n);var i=t.getBaseAxis().isHorizontal(),r=cf(t,e,n);if(!n.get("clip",!0)){var a=r.shape,o=Math.max(a.width,a.height);i?(a.y-=o,a.height+=2*o):(a.x-=o,a.width+=2*o)}return r}Uh.extend({type:"line",init:function(){var t=new qe,e=new Ud;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var i=t.coordinateSystem,r=this.group,a=t.getData(),o=t.getModel("lineStyle"),s=t.getModel("areaStyle"),l=a.mapArray(a.getItemLayout),h="polar"===i.type,u=this._coordSys,c=this._symbolDraw,d=this._polyline,f=this._polygon,p=this._lineGroup,g=t.get("animation"),v=!s.isEmpty(),m=s.get("origin"),y=function(t,e,n){if(!n.valueDim)return[];for(var i=[],r=0,a=e.count();r<a;r++)i.push(Kd(n,t,e,r));return i}(i,a,$d(i,a,m)),_=t.get("showSymbol"),x=_&&!h&&vf(t,a,i),w=this._data;w&&w.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),w.setItemGraphicEl(e,null))}),_||c.remove(),r.add(p);var b,S=!h&&t.get("step");i&&i.getArea&&(null!=(b=i.getArea()).width?(b.x-=.1,b.y-=.1,b.width+=.2,b.height+=.2):b.r0&&(b.r0-=.5,b.r1+=.5)),d&&u.type===i.type&&S===this._step?(v&&!f?f=this._newPolygon(l,y,i,g):f&&!v&&(p.remove(f),f=this._polygon=null),p.setClipPath(mf(i,!1,t)),_&&c.updateData(a,{isIgnore:x,clipShape:b}),a.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),ff(this._stackedOnPoints,y)&&ff(this._points,l)||(g?this._updateAnimation(a,y,i,n,S,m):(S&&(l=gf(l,i,S),y=gf(y,i,S)),d.setShape({points:l}),f&&f.setShape({points:l,stackedOnPoints:y})))):(_&&c.updateData(a,{isIgnore:x,clipShape:b}),S&&(l=gf(l,i,S),y=gf(y,i,S)),d=this._newPolyline(l,i,g),v&&(f=this._newPolygon(l,y,i,g)),p.setClipPath(mf(i,!0,t)));var M=function(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()&&"cartesian2d"===e.type){for(var i,r,a=n.length-1;0<=a;a--){var o=n[a].dimension,s=t.dimensions[o],l=t.getDimensionInfo(s);if("x"===(i=l&&l.coordDim)||"y"===i){r=n[a];break}}if(r){var h=e.getAxis(i),u=A(r.stops,function(t){return{coord:h.toGlobalCoord(h.dataToCoord(t.value)),color:t.color}}),c=u.length,d=r.outerColors.slice();c&&u[0].coord>u[c-1].coord&&(u.reverse(),d.reverse());var f=u[0].coord-10,p=u[c-1].coord+10,g=p-f;if(g<.001)return"transparent";k(u,function(t){t.offset=(t.coord-f)/g}),u.push({offset:c?u[c-1].offset:.5,color:d[1]||"transparent"}),u.unshift({offset:c?u[0].offset:.5,color:d[0]||"transparent"});var v=new fo(0,0,0,0,u,!0);return v[i]=f,v[i+"2"]=p,v}}}(a,i)||a.getVisual("color");d.useStyle(D(o.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var I=t.get("smooth");if(I=pf(t.get("smooth")),d.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),f){var T=a.getCalculationInfo("stackedOnSeries"),C=0;f.useStyle(D(s.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),T&&(C=pf(T.get("smooth"))),f.setShape({smooth:I,stackedOnSmooth:C,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=i,this._stackedOnPoints=y,this._points=l,this._step=S,this._valueOrigin=m},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=Yi(r,i);if(!(a instanceof Array)&&null!=a&&0<=a){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;(o=new Nd(r,a)).position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else Uh.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=Yi(r,i);if(null!=a&&0<=a){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else Uh.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new hf({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new uf({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n},_updateAnimation:function(t,e,n,i,r,a){var o=this._polyline,s=this._polygon,l=t.hostModel,h=function(t,e,n,i,r,a,o,s){for(var l=function(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}(t,e),h=[],u=[],c=[],d=[],f=[],p=[],g=[],v=$d(r,e,o),m=$d(a,t,s),y=0;y<l.length;y++){var _=l[y],x=!0;switch(_.cmd){case"=":var w=t.getItemLayout(_.idx),b=e.getItemLayout(_.idx1);(isNaN(w[0])||isNaN(w[1]))&&(w=b.slice()),h.push(w),u.push(b),c.push(n[_.idx]),d.push(i[_.idx1]),g.push(e.getRawIndex(_.idx1));break;case"+":var S=_.idx;h.push(r.dataToPoint([e.get(v.dataDimsForPoint[0],S),e.get(v.dataDimsForPoint[1],S)])),u.push(e.getItemLayout(S).slice()),c.push(Kd(v,r,e,S)),d.push(i[S]),g.push(e.getRawIndex(S));break;case"-":S=_.idx;var M=t.getRawIndex(S);M!==S?(h.push(t.getItemLayout(S)),u.push(a.dataToPoint([t.get(m.dataDimsForPoint[0],S),t.get(m.dataDimsForPoint[1],S)])),c.push(n[S]),d.push(Kd(m,a,t,S)),g.push(M)):x=!1}x&&(f.push(_),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});var I=[],T=[],C=[],D=[],k=[];for(y=0;y<p.length;y++){S=p[y];I[y]=h[S],T[y]=u[S],C[y]=c[S],D[y]=d[S],k[y]=f[S]}return{current:I,next:T,stackedOnCurrent:C,stackedOnNext:D,status:k}}(this._data,t,this._stackedOnPoints,e,this._coordSys,n,this._valueOrigin,a),u=h.current,c=h.stackedOnCurrent,d=h.next,f=h.stackedOnNext;r&&(u=gf(h.current,n,r),c=gf(h.stackedOnCurrent,n,r),d=gf(h.next,n,r),f=gf(h.stackedOnNext,n,r)),o.shape.__points=h.current,o.shape.points=u,ss(o,{shape:{points:d}},l),s&&(s.setShape({points:u,stackedOnPoints:c}),ss(s,{shape:{points:d,stackedOnPoints:f}},l));for(var p=[],g=h.status,v=0;v<g.length;v++){if("="===g[v].cmd){var m=t.getItemGraphicEl(g[v].idx1);m&&p.push({el:m,ptIdx:v})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){p[t].el.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var n=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,e){t.__temp&&(n.remove(t),i.setItemGraphicEl(e,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});function yf(t,e){return Math.round(t.length/2)}var _f={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}};function xf(t){this._setting=t||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}function wf(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this._map}xf.prototype.parse=function(t){return t},xf.prototype.getSetting=function(t){return this._setting[t]},xf.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},xf.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},xf.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},xf.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},xf.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},xf.prototype.getExtent=function(){return this._extent.slice()},xf.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},xf.prototype.isBlank=function(){return this._isBlank},xf.prototype.setBlank=function(t){this._isBlank=t},xf.prototype.getLabel=null,nr(xf),sr(xf,{registerWhenExtend:!0}),wf.createByAxisModel=function(t){var e=t.option,n=e.data,i=n&&A(n,Mf);return new wf({categories:i,needCollect:!i,deduplication:!1!==e.dedplication})};var bf=wf.prototype;function Sf(t){return t._map||(t._map=Z(t.categories))}function Mf(t){return O(t)&&null!=t.value?t.value:t+""}bf.getOrdinal=function(t){return Sf(this).get(t)},bf.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=Sf(this);return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e};var If=xf.prototype,Tf=xf.extend({type:"ordinal",init:function(t,e){t&&!C(t)||(t=new wf({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),If.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return If.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(If.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:$,niceExtent:$});Tf.create=function(){return new Tf};var Cf=Ds;function Df(t){return ks(t)+2}function kf(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function Af(t,e){isFinite(t[0])||(t[0]=e[0]),isFinite(t[1])||(t[1]=e[1]),kf(t,0,e),kf(t,1,e),t[0]>t[1]&&(t[0]=t[1])}var Lf=Ds,Pf=xf.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),Pf.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Df(t)},getTicks:function(){return function(t,e,n,i){var r=[];if(!t)return r;e[0]<n[0]&&r.push(e[0]);for(var a=n[0];a<=n[1]&&(r.push(a),(a=Cf(a+t,i))!==r[r.length-1]);)if(1e4<r.length)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=ks(t)||0:"auto"===n&&(n=this._intervalPrecision),Bs(t=Lf(t,n,!0))},niceTicks:function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var a=function(t,e,n,i){var r={},a=t[1]-t[0],o=r.interval=Ns(a/e,!0);null!=n&&o<n&&(o=r.interval=n),null!=i&&i<o&&(o=r.interval=i);var s=r.intervalPrecision=Df(o);return Af(r.niceTickExtent=[Cf(Math.ceil(t[0]/o)*o,s),Cf(Math.floor(t[1]/o)*o,s)],t),r}(i,t,e,n);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=Lf(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=Lf(Math.ceil(e[1]/r)*r))}});Pf.create=function(){return new Pf};var Of="__ec_stack_",Ef="undefined"!=typeof Float32Array?Float32Array:Array;function Nf(t){return t.get("stack")||Of+t.seriesIndex}function Bf(t){return t.dim+t.index}function zf(t,e){var n=[];return e.eachSeriesByType(t,function(t){Wf(t)&&!Hf(t)&&n.push(t)}),n}function Rf(t){var h=[];return k(t,function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),i=n.getExtent(),r="category"===n.type?n.getBandWidth():Math.abs(i[1]-i[0])/e.count(),a=Cs(t.get("barWidth"),r),o=Cs(t.get("barMaxWidth"),r),s=t.get("barGap"),l=t.get("barCategoryGap");h.push({bandWidth:r,barWidth:a,barMaxWidth:o,barGap:s,barCategoryGap:l,axisKey:Bf(n),stackId:Nf(t)})}),function(t){var c={};k(t,function(t,e){var n=t.axisKey,i=t.bandWidth,r=c[n]||{bandWidth:i,remainedWidth:i,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},a=r.stacks;c[n]=r;var o=t.stackId;a[o]||r.autoWidthCount++,a[o]=a[o]||{width:0,maxWidth:0};var s=t.barWidth;s&&!a[o].width&&(a[o].width=s,s=Math.min(r.remainedWidth,s),r.remainedWidth-=s);var l=t.barMaxWidth;l&&(a[o].maxWidth=l);var h=t.barGap;null!=h&&(r.gap=h);var u=t.barCategoryGap;null!=u&&(r.categoryGap=u)});var d={};return k(c,function(t,n){d[n]={};var e=t.stacks,i=t.bandWidth,r=Cs(t.categoryGap,i),a=Cs(t.gap,1),o=t.remainedWidth,s=t.autoWidthCount,l=(o-r)/(s+(s-1)*a);l=Math.max(l,0),k(e,function(t,e){var n=t.maxWidth;n&&n<l&&(n=Math.min(n,o),t.width&&(n=Math.min(n,t.width)),o-=n,t.width=n,s--)}),l=(o-r)/(s+(s-1)*a),l=Math.max(l,0);var h,u=0;k(e,function(t,e){t.width||(t.width=l),u+=(h=t).width*(1+a)}),h&&(u-=h.width*a);var c=-u/2;k(e,function(t,e){d[n][e]=d[n][e]||{bandWidth:i,offset:c,width:t.width},c+=t.width*(1+a)})}),d}(h)}function Ff(t,e,n){if(t&&e){var i=t[Bf(e)];return null!=i&&null!=n&&(i=i[Nf(n)]),i}}var Vf={seriesType:"bar",plan:Hh(),reset:function(t){if(Wf(t)&&Hf(t)){var e=t.getData(),u=t.coordinateSystem,c=u.getBaseAxis(),d=u.getOtherAxis(c),f=e.mapDimension(d.dim),p=e.mapDimension(c.dim),g=d.isHorizontal(),v=g?0:1,m=Ff(Rf([t]),c,t).width;return.5<m||(m=.5),{progress:function(t,e){var n,i=t.count,r=new Ef(2*i),a=new Ef(i),o=[],s=[],l=0,h=0;for(;null!=(n=t.next());)s[v]=e.get(f,n),s[1-v]=e.get(p,n),o=u.dataToPoint(s,null,o),r[l++]=o[0],r[l++]=o[1],a[h++]=n;e.setLayout({largePoints:r,largeDataIndices:a,barWidth:m,valueAxisStart:Gf(c,d,!1),valueAxisHorizontal:g})}}}}};function Wf(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function Hf(t){return t.pipelineContext&&t.pipelineContext.large}function Gf(t,e){return e.toGlobalCoord(e.dataToCoord(0))}var Xf=Pf.prototype,Uf=Math.ceil,qf=Math.floor,Yf=36e5,jf=864e5,Zf=Pf.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return Us(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=jf,e[1]+=jf),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-jf}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var i=this._interval;t.fixMin||(e[0]=Ds(qf(e[0]/i)*i)),t.fixMax||(e[1]=Ds(Uf(e[1]/i)*i))},niceTicks:function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0],a=r/t;null!=e&&a<e&&(a=e),null!=n&&n<a&&(a=n);var o=$f.length,s=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=1+r:i=r}return n}($f,a,0,o),l=$f[Math.min(s,o-1)],h=l[1];"year"===l[0]&&(h*=Ns(r/h/t,!0));var u=this.getSetting("useUTC")?0:60*new Date(+i[0]||+i[1]).getTimezoneOffset()*1e3,c=[Math.round(Uf((i[0]-u)/h)*h+u),Math.round(qf((i[1]-u)/h)*h+u)];Af(c,i),this._stepLvl=l,this._interval=h,this._niceExtent=c},parse:function(t){return+Os(t)}});k(["contain","normalize"],function(e){Zf.prototype[e]=function(t){return Xf[e].call(this,this.parse(t))}});var $f=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",Yf],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",6*Yf],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",jf],["MM-dd\nyyyy",2*jf],["MM-dd\nyyyy",3*jf],["MM-dd\nyyyy",4*jf],["MM-dd\nyyyy",5*jf],["MM-dd\nyyyy",6*jf],["week",7*jf],["MM-dd\nyyyy",864e6],["week",14*jf],["week",21*jf],["month",31*jf],["week",42*jf],["month",62*jf],["week",70*jf],["quarter",95*jf],["month",31*jf*4],["month",13392e6],["half-year",16416e6],["month",31*jf*8],["month",26784e6],["year",380*jf]];Zf.create=function(t){return new Zf({useUTC:t.ecModel.get("useUTC")})};var Kf=xf.prototype,Qf=Pf.prototype,Jf=ks,tp=Ds,ep=Math.floor,np=Math.ceil,ip=Math.pow,rp=Math.log,ap=xf.extend({type:"log",base:10,$constructor:function(){xf.apply(this,arguments),this._originalScale=new Pf},getTicks:function(){var n=this._originalScale,i=this._extent,r=n.getExtent();return A(Qf.getTicks.call(this),function(t){var e=Ds(ip(this.base,t));return e=t===i[0]&&n.__fixMin?op(e,r[0]):e,e=t===i[1]&&n.__fixMax?op(e,r[1]):e},this)},getLabel:Qf.getLabel,scale:function(t){return t=Kf.scale.call(this,t),ip(this.base,t)},setExtent:function(t,e){var n=this.base;t=rp(t)/rp(n),e=rp(e)/rp(n),Qf.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=Kf.getExtent.call(this);e[0]=ip(t,e[0]),e[1]=ip(t,e[1]);var n=this._originalScale,i=n.getExtent();return n.__fixMin&&(e[0]=op(e[0],i[0])),n.__fixMax&&(e[1]=op(e[1],i[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=rp(t[0])/rp(e),t[1]=rp(t[1])/rp(e),Kf.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n==1/0||n<=0)){var i=function(t){return Math.pow(10,Es(t))}(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&0<Math.abs(i);)i*=10;var r=[Ds(np(e[0]/i)*i),Ds(ep(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},niceExtent:function(t){Qf.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});function op(t,e){return tp(t,Jf(e))}function sp(t,e){var n,i,r,a=t.type,o=e.getMin(),s=e.getMax(),l=null!=o,h=null!=s,u=t.getExtent();"ordinal"===a?n=e.getCategories().length:(C(i=e.get("boundaryGap"))||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=Cs(i[0],1),i[1]=Cs(i[1],1),r=u[1]-u[0]||Math.abs(u[0])),null==o&&(o="ordinal"===a?n?0:NaN:u[0]-i[0]*r),null==s&&(s="ordinal"===a?n?n-1:NaN:u[1]+i[1]*r),"dataMin"===o?o=u[0]:"function"==typeof o&&(o=o({min:u[0],max:u[1]})),"dataMax"===s?s=u[1]:"function"==typeof s&&(s=s({min:u[0],max:u[1]})),null!=o&&isFinite(o)||(o=NaN),null!=s&&isFinite(s)||(s=NaN),t.setBlank(z(o)||z(s)||"ordinal"===a&&!t.getOrdinalMeta().categories.length),e.getNeedCrossZero()&&(0<o&&0<s&&!l&&(o=0),o<0&&s<0&&!h&&(s=0));var c=e.ecModel;if(c&&"time"===a){var d,f=zf("bar",c);if(k(f,function(t){d|=t.getBaseAxis()===e.axis}),d){var p=Rf(f),g=function(t,e,n,i){var r=n.axis.getExtent(),a=r[1]-r[0],o=Ff(i,n.axis);if(void 0===o)return{min:t,max:e};var s=1/0;k(o,function(t){s=Math.min(t.offset,s)});var l=-1/0;k(o,function(t){l=Math.max(t.offset+t.width,l)}),s=Math.abs(s),l=Math.abs(l);var h=s+l,u=e-t,c=u/(1-(s+l)/a)-u;return{min:t-=s/h*c,max:e+=l/h*c}}(o,s,e,p);o=g.min,s=g.max}}return[o,s]}function lp(t,e){var n=sp(t,e),i=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var o=t.type;t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:a,fixMin:i,fixMax:r,minInterval:"interval"===o||"time"===o?e.get("minInterval"):null,maxInterval:"interval"===o||"time"===o?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function hp(n){var e,i=n.getLabelModel().get("formatter"),r="category"===n.type?n.scale.getExtent()[0]:null;return"string"==typeof i?(e=i,i=function(t){return t=n.scale.getLabel(t),e.replace("{value}",null!=t?t:"")}):"function"==typeof i?function(t,e){return null!=r&&(e=t-r),i(function(t,e){return"category"===t.type?t.scale.getLabel(e):e}(n,t),e)}:function(t){return n.scale.getLabel(t)}}function up(t){var e=t.get("interval");return null==e?"auto":e}function cp(t){return"category"===t.type&&0===up(t.getLabelModel())}function dp(t){return this._axes[t]}k(["contain","normalize"],function(e){ap.prototype[e]=function(t){return t=rp(t)/rp(this.base),Kf[e].call(this,t)}}),ap.create=function(){return new ap};function fp(t){this._axes={},this._dimList=[],this.name=t||""}function pp(t){fp.call(this,t)}fp.prototype={constructor:fp,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return A(this._dimList,dp,this)},getAxesByScale:function(e){return e=e.toLowerCase(),x(this.getAxes(),function(t){return t.scale.type===e})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var a=n[r],o=this._axes[a];i[a]=o[e](t[a])}return i}},pp.prototype={constructor:pp,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoint:function(t,e,n){var i=this.getAxis("x"),r=this.getAxis("y");return(n=n||[])[0]=i.toGlobalCoord(i.dataToCoord(t[0])),n[1]=r.toGlobalCoord(r.dataToCoord(t[1])),n},clampData:function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),a=i.getExtent(),o=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),o),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(a[0],a[1]),s),Math.max(a[0],a[1])),e},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return(e=e||[])[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")},getArea:function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]);return new Ue(n,i,Math.max(t[0],t[1])-n,Math.max(e[0],e[1])-i)}},y(pp,fp);var gp=ji();function vp(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=yp(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(n){var t=n.scale.getTicks(),i=hp(n);return{labels:A(t,function(t,e){return{formattedLabel:i(t,e),rawLabel:n.scale.getLabel(t),tickValue:t}})}}(t)}function mp(t,e){return"category"===t.type?function(t,e){var n,i,r=_p(t,"ticks"),a=up(e),o=xp(r,a);if(o)return o;e.get("show")&&!t.scale.isBlank()||(n=[]);if(T(a))n=Sp(t,a,!0);else if("auto"===a){var s=yp(t,t.getLabelModel());i=s.labelCategoryInterval,n=A(s.labels,function(t){return t.tickValue})}else n=bp(t,i=a,!0);return wp(r,a,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:t.scale.getTicks()}}function yp(t,e){var n,i=_p(t,"labels"),r=up(e),a=xp(i,r);return a||wp(i,r,{labels:T(r)?Sp(t,r):bp(t,n="auto"===r?function(t){var e=gp(t).autoInterval;return null!=e?e:gp(t).autoInterval=t.calculateCategoryInterval()}(t):r),labelCategoryInterval:n})}function _p(t,e){return gp(t)[e]||(gp(t)[e]=[])}function xp(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function wp(t,e,n){return t.push({key:e,value:n}),n}function bp(t,e,n){var i=hp(t),r=t.scale,a=r.getExtent(),o=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),h=a[0],u=r.count();0!==h&&1<l&&2<u/l&&(h=Math.round(Math.ceil(h/l)*l));var c=cp(t),d=o.get("showMinLabel")||c,f=o.get("showMaxLabel")||c;d&&h!==a[0]&&g(a[0]);for(var p=h;p<=a[1];p+=l)g(p);function g(t){s.push(n?t:{formattedLabel:i(t),rawLabel:r.getLabel(t),tickValue:t})}return f&&p-l!==a[1]&&g(a[1]),s}function Sp(t,n,i){var r=t.scale,a=hp(t),o=[];return k(r.getTicks(),function(t){var e=r.getLabel(t);n(t,e)&&o.push(i?t:{formattedLabel:a(t),rawLabel:e,tickValue:t})}),o}function Mp(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1}var Ip=[0,1];function Tp(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}Mp.prototype={constructor:Mp,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return n<=t&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20}(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Tp(n=n.slice(),i.count()),Ts(t,Ip,n,e)},coordToData:function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Tp(n=n.slice(),i.count());var r=Ts(t,n,Ip,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=mp(this,e),i=A(n.ticks,function(t){return{coord:this.dataToCoord(t),tickValue:t}},this),r=e.get("alignWithLabel");return function(t,e,n,i,r){var a=e.length;if(!t.onBand||i||!a)return;var o,s=t.getExtent();if(1===a)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[1].coord-e[0].coord;k(e,function(t){t.coord-=l/2;var e=e||0;0<e%2&&(t.coord-=l/(2*(e+1)))}),o={coord:e[a-1].coord+l},e.push(o)}var h=s[0]>s[1];u(e[0].coord,s[0])&&(r?e[0].coord=s[0]:e.shift());r&&u(s[0],e[0].coord)&&e.unshift({coord:s[0]});u(s[1],o.coord)&&(r?o.coord=s[1]:e.pop());r&&u(o.coord,s[1])&&e.push({coord:s[1]});function u(t,e){return h?e<t:t<e}}(this,i,n.tickCategoryInterval,r,t.clamp),i},getViewLabels:function(){return vp(this).labels},getLabelModel:function(){return this.model.getModel("axisLabel")},getTickModel:function(){return this.model.getModel("axisTick")},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},isHorizontal:null,getRotate:null,calculateCategoryInterval:function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=hp(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,a=r.getExtent(),o=r.count();if(a[1]-a[0]<1)return 0;var s=1;40<o&&(s=Math.max(1,Math.floor(o/40)));for(var l=a[0],h=t.dataToCoord(l+1)-t.dataToCoord(l),u=Math.abs(h*Math.cos(i)),c=Math.abs(h*Math.sin(i)),d=0,f=0;l<=a[1];l+=s){var p,g,v=Pn(n(l),e.font,"center","top");p=1.3*v.width,g=1.3*v.height,d=Math.max(d,p,7),f=Math.max(f,g,7)}var m=d/u,y=f/c;isNaN(m)&&(m=1/0),isNaN(y)&&(y=1/0);var _=Math.max(0,Math.floor(Math.min(m,y))),x=gp(t.model),w=x.lastAutoInterval,b=x.lastTickCount;return null!=w&&null!=b&&Math.abs(w-_)<=1&&Math.abs(b-o)<=1&&_<w?_=w:(x.lastTickCount=o,x.lastAutoInterval=_),_}(this)}};function Cp(t,e,n,i,r){Mp.call(this,t,e,n),this.type=i||"value",this.position=r||"bottom"}Cp.prototype={constructor:Cp,index:0,getAxesOnZeroOf:null,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},y(Cp,Mp);var Dp={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},kp={};kp.categoryAxis=f({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Dp),kp.valueAxis=f({boundaryGap:[0,0],splitNumber:5},Dp),kp.timeAxis=D({scale:!0,min:"dataMin",max:"dataMax"},kp.valueAxis),kp.logAxis=D({scale:!0,logBase:10},kp.valueAxis);function Ap(a,t,o,e){k(Lp,function(r){t.extend({type:a+"Axis."+r,mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?Qs(t):{};f(t,e.getTheme().get(r+"Axis")),f(t,this.getDefaultOption()),t.type=o(a,t),n&&Ks(t,i,n)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=wf.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:function(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=f(n,t[i],e);return n}([{},kp[r+"Axis"],e],!0)})}),il.registerSubTypeDefaulter(a+"Axis",I(o,a))}var Lp=["value","category","time","log"],Pp={getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&"function"!=typeof n&&!z(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&"function"!=typeof n&&!z(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:$,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},Op=il.extend({type:"cartesian2dAxis",axis:null,init:function(){Op.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Op.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Op.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});function Ep(t,e){return e.type||(e.data?"category":"value")}f(Op.prototype,Pp);var Np={offset:0};function Bp(t,e){return t.getCoordSysModel()===e}function zp(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}Ap("x",Op,Ep,Np),Ap("y",Op,Ep,Np),il.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Rp=zp.prototype;function Fp(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,a=t[e],o=n.model,s=o.get("axisLine.onZero"),l=o.get("axisLine.onZeroAxisIndex");if(s){if(null!=l)Vp(a[l])&&(r=a[l]);else for(var h in a)if(a.hasOwnProperty(h)&&Vp(a[h])&&!i[u(a[h])]){r=a[h];break}r&&(i[u(r)]=!0)}function u(t){return t.dim+"_"+t.index}}function Vp(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(0<n&&0<i||n<0&&i<0)}(t)}Rp.type="grid",Rp.axisPointerEnabled=!0,Rp.getRect=function(){return this._rect},Rp.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),k(n.x,function(t){lp(t.scale,t.model)}),k(n.y,function(t){lp(t.scale,t.model)});var i={};k(n.x,function(t){Fp(n,"y",t,i)}),k(n.y,function(t){Fp(n,"x",t,i)}),this.resize(this.model,e)},Rp.resize=function(t,e,n){var r=function(t,e,n){n=zs(n||0);var i=e.width,r=e.height,a=Cs(t.left,i),o=Cs(t.top,r),s=Cs(t.right,i),l=Cs(t.bottom,r),h=Cs(t.width,i),u=Cs(t.height,r),c=n[2]+n[0],d=n[1]+n[3],f=t.aspect;switch(isNaN(h)&&(h=i-s-d-a),isNaN(u)&&(u=r-l-c-o),null!=f&&(isNaN(h)&&isNaN(u)&&(i/r<f?h=.8*i:u=.8*r),isNaN(h)&&(h=f*u),isNaN(u)&&(u=h/f)),isNaN(a)&&(a=i-s-h-d),isNaN(o)&&(o=r-l-u-c),t.left||t.right){case"center":a=i/2-h/2-n[3];break;case"right":a=i-h-d}switch(t.top||t.bottom){case"middle":case"center":o=r/2-u/2-n[0];break;case"bottom":o=r-u-c}a=a||0,o=o||0,isNaN(h)&&(h=i-d-a-(s||0)),isNaN(u)&&(u=r-c-o-(l||0));var p=new Ue(a+n[3],o+n[0],h,u);return p.margin=n,p}(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var i=this._axesList;function a(){k(i,function(t){var e=t.isHorizontal(),n=e?[0,r.width]:[0,r.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?r.x:r.y)})}a(),!n&&t.get("containLabel")&&(k(i,function(t){if(!t.model.get("axisLabel.inside")){var e=function(t){var e=t.model,n=t.scale;if(e.get("axisLabel.show")&&!n.isBlank()){var i,r,a="category"===t.type,o=n.getExtent();r=a?n.count():(i=n.getTicks()).length;var s,l,h,u,c,d,f,p,g,v=t.getLabelModel(),m=hp(t),y=1;40<r&&(y=Math.ceil(r/40));for(var _=0;_<r;_+=y){var x=m(i?i[_]:o[0]+_),w=v.getTextRect(x),b=(l=w,h=v.get("rotate")||0,void 0,u=h*Math.PI/180,c=l.plain(),d=c.width,f=c.height,p=d*Math.cos(u)+f*Math.sin(u),g=d*Math.sin(u)+f*Math.cos(u),new Ue(c.x,c.y,p,g));s?s.union(b):s=b}return s}}(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get("axisLabel.margin");r[n]-=e[n]+i,"top"===t.position?r.y+=e.height+i:"left"===t.position&&(r.x+=e.width+i)}}}),a())},Rp.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},Rp.getAxes=function(){return this._axesList.slice()},Rp.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}O(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},Rp.getCartesians=function(){return this._coordsList.slice()},Rp.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},Rp.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},Rp._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,a=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],o=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)v(l,n=r.coordinateSystem)<0&&(n=null);else if(a&&o)n=this.getCartesian(a.componentIndex,o.componentIndex);else if(a)i=this.getAxis("x",a.componentIndex);else if(o)i=this.getAxis("y",o.componentIndex);else if(s){s.coordinateSystem===this&&(n=this._coordsList[0])}return{cartesian:n,axis:i}},Rp.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},Rp._initCartesian=function(o,t,e){var s={left:!1,right:!1,top:!1,bottom:!1},l={x:{},y:{}},h={x:0,y:0};if(t.eachComponent("xAxis",n("x"),this),t.eachComponent("yAxis",n("y"),this),!h.x||!h.y)return this._axesMap={},void(this._axesList=[]);function n(a){return function(t,e){if(Bp(t,o)){var n=t.get("position");"x"===a?"top"!==n&&"bottom"!==n&&(n=s.bottom?"top":"bottom"):"left"!==n&&"right"!==n&&(n=s.left?"right":"left"),s[n]=!0;var i=new Cp(a,function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new Tf(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new Pf;default:return(xf.getClass(e)||Pf).create(t)}}(t),[0,0],t.get("type"),n),r="category"===i.type;i.onBand=r&&t.get("boundaryGap"),i.inverse=t.get("inverse"),(t.axis=i).model=t,i.grid=this,i.index=e,this._axesList.push(i),l[a][e]=i,h[a]++}}}k((this._axesMap=l).x,function(r,a){k(l.y,function(t,e){var n="x"+a+"y"+e,i=new pp(n);i.grid=this,i.model=o,this._coordsMap[n]=i,this._coordsList.push(i),i.addAxis(r),i.addAxis(t)},this)},this)},Rp._updateScale=function(l,h){function u(e,n){k(e.mapDimension(n.dim,!0),function(t){n.scale.unionExtentFromData(e,function(t,e){return Sd(t,e)?t.getCalculationInfo("stackResultDimension"):e}(e,t))})}k(this._axesList,function(t){t.scale.setExtent(1/0,-1/0)}),l.eachSeries(function(t){if(Gp(t)){var e=Hp(t,l),n=e[0],i=e[1];if(!Bp(n,h)||!Bp(i,h))return;var r=this.getCartesian(n.componentIndex,i.componentIndex),a=t.getData(),o=r.getAxis("x"),s=r.getAxis("y");"list"===a.type&&(u(a,o,t),u(a,s,t))}},this)},Rp.getTooltipAxes=function(i){var r=[],a=[];return k(this.getCartesians(),function(t){var e=null!=i&&"auto"!==i?t.getAxis(i):t.getBaseAxis(),n=t.getOtherAxis(e);v(r,e)<0&&r.push(e),v(a,n)<0&&a.push(n)}),{baseAxes:r,otherAxes:a}};var Wp=["xAxis","yAxis"];function Hp(e){return A(Wp,function(t){return e.getReferringComponents(t)[0]})}function Gp(t){return"cartesian2d"===t.get("coordinateSystem")}zp.create=function(i,r){var a=[];return i.eachComponent("grid",function(t,e){var n=new zp(t,i,r);n.name="grid_"+e,n.resize(t,r,!0),t.coordinateSystem=n,a.push(n)}),i.eachSeries(function(t){if(Gp(t)){var e=Hp(t),n=e[0],i=e[1],r=n.getCoordSysModel().coordinateSystem;t.coordinateSystem=r.getCartesian(n.componentIndex,i.componentIndex)}}),a},zp.dimensions=zp.prototype.dimensions=pp.prototype.dimensions,Ol.register("cartesian2d",zp);function Xp(t,e){this.opt=e,this.axisModel=t,D(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new qe;var n=new qe({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n}var Up=Math.PI;Xp.prototype={constructor:Xp,hasBuilder:function(t){return!!qp[t]},add:function(t){qp[t].call(this)},getGroup:function(){return this.group}};var qp={axisLine:function(){var a=this.opt,t=this.axisModel;if(t.get("axisLine.show")){var e=this.axisModel.axis.getExtent(),n=this._transform,o=[e[0],0],i=[e[1],0];n&&(st(o,o,n),st(i,i,n));var s=S({lineCap:"round"},t.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new ao({anid:"line",subPixelOptimize:!0,shape:{x1:o[0],y1:o[1],x2:i[0],y2:i[1]},style:s,strokeContainThreshold:a.strokeContainThreshold||5,silent:!0,z2:1}));var l=t.get("axisLine.symbol"),r=t.get("axisLine.symbolSize"),h=t.get("axisLine.symbolOffset")||0;if("number"==typeof h&&(h=[h,h]),null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof r&&"number"!=typeof r||(r=[r,r]);var u=r[0],c=r[1];k([{rotate:a.rotation+Math.PI/2,offset:h[0],r:0},{rotate:a.rotation-Math.PI/2,offset:h[1],r:Math.sqrt((o[0]-i[0])*(o[0]-i[0])+(o[1]-i[1])*(o[1]-i[1]))}],function(t,e){if("none"!==l[e]&&null!=l[e]){var n=Od(l[e],-u/2,-c/2,u,c,s.stroke,!0),i=t.r+t.offset,r=[o[0]+i*Math.cos(a.rotation),o[1]-i*Math.sin(a.rotation)];n.attr({rotation:t.rotate,position:r,silent:!0,z2:11}),this.group.add(n)}},this)}}},axisTickLabel:function(){var t=this.axisModel,e=this.opt,n=function(t,e,n){var i=e.axis;if(!e.get("axisTick.show")||i.scale.isBlank())return;for(var r=e.getModel("axisTick"),a=r.getModel("lineStyle"),o=r.get("length"),s=i.getTicksCoords(),l=[],h=[],u=t._transform,c=[],d=0;d<s.length;d++){var f=s[d].coord;l[0]=f,l[1]=0,h[0]=f,h[1]=n.tickDirection*o,u&&(st(l,l,u),st(h,h,u));var p=new ao({anid:"tick_"+s[d].tickValue,subPixelOptimize:!0,shape:{x1:l[0],y1:l[1],x2:h[0],y2:h[1]},style:D(a.getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")}),z2:2,silent:!0});t.group.add(p),c.push(p)}return c}(this,t,e);!function(t,e,n){if(cp(t.axis))return;var i=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");n=n||[];var a=(e=e||[])[0],o=e[1],s=e[e.length-1],l=e[e.length-2],h=n[0],u=n[1],c=n[n.length-1],d=n[n.length-2];!1===i?($p(a),$p(h)):Kp(a,o)&&(i?($p(o),$p(u)):($p(a),$p(h)));!1===r?($p(s),$p(c)):Kp(l,s)&&(r?($p(l),$p(d)):($p(s),$p(c)))}(t,function(h,u,c){var d=u.axis;if(!R(c.axisLabelShow,u.get("axisLabel.show"))||d.scale.isBlank())return;var f=u.getModel("axisLabel"),p=f.get("margin"),t=d.getViewLabels(),e=(R(c.labelRotate,f.get("rotate"))||0)*Up/180,g=jp(c.rotation,e,c.labelDirection),v=u.getCategories&&u.getCategories(!0),m=[],y=Zp(u),_=u.get("triggerEvent");return k(t,function(t,e){var n=t.tickValue,i=t.formattedLabel,r=t.rawLabel,a=f;v&&v[n]&&v[n].textStyle&&(a=new xs(v[n].textStyle,f,u.ecModel));var o=a.getTextColor()||u.get("axisLine.lineStyle.color"),s=[d.dataToCoord(n),c.labelOffset+c.labelDirection*p],l=new Ha({anid:"label_"+n,position:s,rotation:g.rotation,silent:y,z2:10});Jo(l.style,a,{text:i,textAlign:a.getShallow("align",!0)||g.textAlign,textVerticalAlign:a.getShallow("verticalAlign",!0)||a.getShallow("baseline",!0)||g.textVerticalAlign,textFill:"function"==typeof o?o("category"===d.type?r:"value"===d.type?n+"":n,e):o}),_&&(l.eventData=Yp(u),l.eventData.targetType="axisLabel",l.eventData.value=r),h._dumbGroup.add(l),l.updateTransform(),m.push(l),h.group.add(l),l.decomposeTransform()}),m}(this,t,e),n)},axisName:function(){var t=this.opt,e=this.axisModel,n=R(t.axisName,e.get("name"));if(n){var i,r,a=e.get("nameLocation"),o=t.nameDirection,s=e.getModel("nameTextStyle"),l=e.get("nameGap")||0,h=this.axisModel.axis.getExtent(),u=h[0]>h[1]?-1:1,c=["start"===a?h[0]-u*l:"end"===a?h[1]+u*l:(h[0]+h[1])/2,Qp(a)?t.labelOffset+o*l:0],d=e.get("nameRotate");null!=d&&(d=d*Up/180),Qp(a)?i=jp(t.rotation,null!=d?d:t.rotation,o):(i=function(t,e,n,i){var r,a,o=As(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;r=Ls(o-Up/2)?(a=l?"bottom":"top","center"):Ls(o-1.5*Up)?(a=l?"top":"bottom","center"):(a="middle",o<1.5*Up&&Up/2<o?l?"left":"right":l?"right":"left");return{rotation:o,textAlign:r,textVerticalAlign:a}}(t,a,d||0,h),null!=(r=t.axisNameAvailableWidth)&&(r=Math.abs(r/Math.sin(i.rotation)),isFinite(r)||(r=null)));var f=s.getFont(),p=e.get("nameTruncate",!0)||{},g=p.ellipsis,v=R(t.nameTruncateMaxWidth,p.maxWidth,r),m=null!=g&&null!=v?qs(n,v,f,g,{minChar:2,placeholder:p.placeholder}):n,y=e.get("tooltip",!0),_=e.mainType,x={componentType:_,name:n,$vars:["name"]};x[_+"Index"]=e.componentIndex;var w=new Ha({anid:"name",__fullText:n,__truncatedText:m,position:c,rotation:i.rotation,silent:Zp(e),z2:1,tooltip:y&&y.show?S({content:n,formatter:function(){return n},formatterParams:x},y):null});Jo(w.style,s,{text:m,textFont:f,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:s.get("align")||i.textAlign,textVerticalAlign:s.get("verticalAlign")||i.textVerticalAlign}),e.get("triggerEvent")&&(w.eventData=Yp(e),w.eventData.targetType="axisName",w.eventData.name=n),this._dumbGroup.add(w),w.updateTransform(),this.group.add(w),w.decomposeTransform()}}},Yp=Xp.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},jp=Xp.innerTextLayout=function(t,e,n){var i,r=As(e-t);return{rotation:r,textAlign:Ls(r)?(i=0<n?"top":"bottom","center"):Ls(r-Up)?(i=0<n?"bottom":"top","center"):(i="middle",0<r&&r<Up?0<n?"right":"left":0<n?"left":"right"),textVerticalAlign:i}};var Zp=Xp.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)};function $p(t){t&&(t.ignore=!0)}function Kp(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Bt([]);return Ft(r,r,-t.rotation),n.applyTransform(zt([],r,t.getLocalTransform())),i.applyTransform(zt([],r,e.getLocalTransform())),n.intersect(i)}}function Qp(t){return"middle"===t||"center"===t}function Jp(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[function(t){return t.type+"||"+t.id}(t)]}var tg=Gc({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,i){this.axisPointerClass&&function(t){var e=Jp(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=function(t){return!!t.get("handle.show")}(n);null==a&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}(t),tg.superApply(this,"render",arguments),eg(this,t,e,n,i,!0)},updateAxisPointer:function(t,e,n,i,r){eg(this,t,e,n,i,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),tg.superApply(this,"remove",arguments)},dispose:function(t,e){ng(this,e),tg.superApply(this,"dispose",arguments)}});function eg(t,e,n,i,r,a){var o=tg.getAxisPointerClass(t.axisPointerClass);if(o){var s=function(t){var e=Jp(t);return e&&e.axisPointerModel}(e);s?(t._axisPointer||(t._axisPointer=new o)).render(e,s,i,a):ng(t,i)}}function ng(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}var ig=[];tg.registerAxisPointerClass=function(t,e){ig[t]=e},tg.getAxisPointerClass=function(t){return t&&ig[t]};var rg,ag,og,sg=["axisLine","axisTickLabel","axisName"],lg=["splitArea","splitLine"],hg=tg.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(e,t,n,i){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new qe,this.group.add(this._axisGroup),e.get("show")){var a=e.getCoordSysModel(),o=function(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,a={},o=r.getAxesOnZeroOf()[0],s=r.position,l=o?"onZero":s,h=r.dim,u=i.getRect(),c=[u.x,u.x+u.width,u.y,u.y+u.height],d={left:0,right:1,top:0,bottom:1,onZero:2},f=e.get("offset")||0,p="x"===h?[c[2]-f,c[3]+f]:[c[0]-f,c[1]+f];if(o){var g=o.toGlobalCoord(o.dataToCoord(0));p[d.onZero]=Math.max(Math.min(g,p[1]),p[0])}a.position=["y"===h?p[d[l]]:c[0],"x"===h?p[d[l]]:c[3]],a.rotation=Math.PI/2*("x"===h?0:1),a.labelDirection=a.tickDirection=a.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],a.labelOffset=o?p[d[s]]-p[d.onZero]:0,e.get("axisTick.inside")&&(a.tickDirection=-a.tickDirection),R(n.labelInside,e.get("axisLabel.inside"))&&(a.labelDirection=-a.labelDirection);var v=e.get("axisLabel.rotate");return a.labelRotate="top"===l?-v:v,a.z2=1,a}(a,e),s=new Xp(e,o);k(sg,s.add,s),this._axisGroup.add(s.getGroup()),k(lg,function(t){e.get(t+".show")&&this["_"+t](e,a)},this),us(r,this._axisGroup,e),hg.superCall(this,"render",e,t,n,i)}},remove:function(){this._splitAreaColors=null},_splitLine:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitLine"),r=i.getModel("lineStyle"),a=r.get("color");a=C(a)?a:[a];for(var o=e.coordinateSystem.getRect(),s=n.isHorizontal(),l=0,h=n.getTicksCoords({tickModel:i}),u=[],c=[],d=r.getLineStyle(),f=0;f<h.length;f++){var p=n.toGlobalCoord(h[f].coord);s?(u[0]=p,u[1]=o.y,c[0]=p,c[1]=o.y+o.height):(u[0]=o.x,u[1]=p,c[0]=o.x+o.width,c[1]=p);var g=l++%a.length,v=h[f].tickValue;this._axisGroup.add(new ao({anid:null!=v?"line_"+h[f].tickValue:null,subPixelOptimize:!0,shape:{x1:u[0],y1:u[1],x2:c[0],y2:c[1]},style:D({stroke:a[g]},d),silent:!0}))}}},_splitArea:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitArea"),r=i.getModel("areaStyle"),a=r.get("color"),o=e.coordinateSystem.getRect(),s=n.getTicksCoords({tickModel:i,clamp:!0});if(s.length){var l=a.length,h=this._splitAreaColors,u=Z(),c=0;if(h)for(var d=0;d<s.length;d++){var f=h.get(s[d].tickValue);if(null!=f){c=(f+(l-1)*d)%l;break}}var p=n.toGlobalCoord(s[0].coord),g=r.getAreaStyle();a=C(a)?a:[a];for(d=1;d<s.length;d++){var v,m,y,_,x=n.toGlobalCoord(s[d].coord);p=n.isHorizontal()?(v=p,m=o.y,y=x-v,_=o.height,v+y):(v=o.x,m=p,y=o.width,m+(_=x-m));var w=s[d-1].tickValue;null!=w&&u.set(w,c),this._axisGroup.add(new io({anid:null!=w?"area_"+w:null,shape:{x:v,y:m,width:y,height:_},style:D({fill:a[c]},g),silent:!0})),c=(c+1)%l}this._splitAreaColors=u}}}});function ug(t,e){"outside"===t.textPosition&&(t.textPosition=e)}hg.extend({type:"xAxis"}),hg.extend({type:"yAxis"}),Gc({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new io({shape:t.coordinateSystem.getRect(),style:D({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),Bc(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),Vc((ag="circle",og=rg="line",{seriesType:rg,performRawSeries:!0,reset:function(l,t,e){var n=l.getData(),h=l.get("symbol"),u=l.get("symbolSize"),i=l.get("symbolKeepAspect"),c=T(h),d=T(u),f=c||d,r=!c&&h?h:ag,a=d?null:u;if(n.setVisual({legendSymbol:og||r,symbol:r,symbolSize:a,symbolKeepAspect:i}),!t.isSeriesFiltered(l))return{dataEach:n.hasItemOption||f?function(t,e){if(f){var n=l.getRawValue(e),i=l.getDataParams(e);c&&t.setItemVisual(e,"symbol",h(n,i)),d&&t.setItemVisual(e,"symbolSize",u(n,i))}if(t.hasItemOption){var r=t.getItemModel(e),a=r.getShallow("symbol",!0),o=r.getShallow("symbolSize",!0),s=r.getShallow("symbolKeepAspect",!0);null!=a&&t.setItemVisual(e,"symbol",a),null!=o&&t.setItemVisual(e,"symbolSize",o),null!=s&&t.setItemVisual(e,"symbolKeepAspect",s)}}:null}}})),Fc({seriesType:"line",plan:Hh(),reset:function(t){var e=t.getData(),c=t.coordinateSystem,d=t.pipelineContext.large;if(c){var f=A(c.dimensions,function(t){return e.mapDimension(t)}).slice(0,2),p=f.length,n=e.getCalculationInfo("stackResultDimension");return Sd(e,f[0])&&(f[0]=n),Sd(e,f[1])&&(f[1]=n),p&&{progress:function(t,e){for(var n=t.end-t.start,i=d&&new Float32Array(n*p),r=t.start,a=0,o=[],s=[];r<t.end;r++){var l;if(1===p){var h=e.get(f[0],r);l=!isNaN(h)&&c.dataToPoint(h,null,s)}else{h=o[0]=e.get(f[0],r);var u=o[1]=e.get(f[1],r);l=!isNaN(h)&&!isNaN(u)&&c.dataToPoint(o,null,s)}d?(i[a++]=l?l[0]:NaN,i[a++]=l?l[1]:NaN):e.setItemLayout(r,l&&l.slice()||[NaN,NaN])}d&&e.setLayout("symbolPoints",i)}}}}}),zc(Zu.PROCESSOR.STATISTIC,{seriesType:"line",modifyOutputEnd:!0,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&r){var o,s=a.getBaseAxis(),l=a.getOtherAxis(s),h=s.getExtent(),u=h[1]-h[0],c=Math.round(i.count()/u);1<c&&("string"==typeof r?o=_f[r]:"function"==typeof r&&(o=r),o&&t.setData(i.downSample(i.mapDimension(l.dim),1/c,o,yf)))}}}),Ph.extend({type:"series.__base_bar__",getInitialData:function(t,e){return Md(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod",itemStyle:{},emphasis:{}}}).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect",getProgressive:function(){return!!this.get("large")&&this.get("progressive")},getProgressiveThreshold:function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return t<e&&(t=e),t},defaultOption:{clip:!0}});var cg=lr([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),dg=["itemStyle","barBorderWidth"],fg=[0,0];S(xs.prototype,{getBarItemStyle:function(t){var e=cg(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}}),Uc({type:"bar",render:function(t,e,n){this._updateDrawMode(t);var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n)),this.group},incrementalPrepareRender:function(t,e,n){this._clear(),this._updateDrawMode(t)},incrementalRender:function(t,e,n,i){this._incrementalRenderLarge(t,e)},_updateDrawMode:function(t){var e=t.pipelineContext.large;(null==this._isLargeDraw||e^this._isLargeDraw)&&(this._isLargeDraw=e,this._clear())},_renderNormal:function(a,t,e){var o,s=this.group,l=a.getData(),h=this._data,u=a.coordinateSystem,n=u.getBaseAxis();"cartesian2d"===u.type?o=n.isHorizontal():"polar"===u.type&&(o="angle"===n.dim);var c=a.isAnimationEnabled()?a:null,d=a.get("clip",!0),f=function(t,e){var n=t.getArea&&t.getArea();if("cartesian2d"===t.type){var i=t.getBaseAxis();if("category"!==i.type||!i.onBand){var r=e.getLayout("bandWidth");i.isHorizontal()?(n.x-=r,n.width+=2*r):(n.y-=r,n.height+=2*r)}}return n}(u,l);s.removeClipPath(),l.diff(h).add(function(t){if(l.hasValue(t)){var e=l.getItemModel(t),n=xg[u.type](l,t,e);if(d)if(vg[u.type](f,n))return void s.remove(i);var i=mg[u.type](l,t,e,n,o,c);l.setItemGraphicEl(t,i),s.add(i),wg(i,l,t,e,n,a,o,"polar"===u.type)}}).update(function(t,e){var n=h.getItemGraphicEl(e);if(l.hasValue(t)){var i=l.getItemModel(t),r=xg[u.type](l,t,i);if(d)if(vg[u.type](f,r))return void s.remove(n);n?ss(n,{shape:r},c,t):n=mg[u.type](l,t,i,r,o,c,!0),l.setItemGraphicEl(t,n),s.add(n),wg(n,l,t,i,r,a,o,"polar"===u.type)}else s.remove(n)}).remove(function(t){var e=h.getItemGraphicEl(t);"cartesian2d"===u.type?e&&yg(t,c,e):e&&_g(t,c,e)}).execute(),this._data=l},_renderLarge:function(t,e,n){this._clear(),Sg(t,this.group);var i=t.get("clip",!0)?function(t,e,n){return t?"polar"===t.type?df(t,e,n):"cartesian2d"===t.type?cf(t,e,n):null:null}(t.coordinateSystem,!1,t):null;i?this.group.setClipPath(i):this.group.removeClipPath()},_incrementalRenderLarge:function(t,e){Sg(e,this.group,!0)},dispose:$,remove:function(t){this._clear(t)},_clear:function(e){var t=this.group,n=this._data;e&&e.get("animation")&&n&&!this._isLargeDraw?n.eachItemGraphicEl(function(t){"sector"===t.type?_g(t.dataIndex,e,t):yg(t.dataIndex,e,t)}):t.removeAll(),this._data=null}});var pg=Math.max,gg=Math.min,vg={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=pg(e.x,t.x),a=gg(e.x+e.width,t.x+t.width),o=pg(e.y,t.y),s=gg(e.y+e.height,t.y+t.height);e.x=r,e.y=o,e.width=a-r,e.height=s-o;var l=e.width<0||e.height<0;return n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),l},polar:function(t){return!1}},mg={cartesian2d:function(t,e,n,i,r,a,o){var s=new io({shape:S({},i)});if(a){var l=r?"height":"width",h={};s.shape[l]=0,h[l]=i[l],fs[o?"updateProps":"initProps"](s,{shape:h},a,e)}return s},polar:function(t,e,n,i,r,a,o){var s=i.startAngle<i.endAngle,l=new qa({shape:D({clockwise:s},i)});if(a){var h=r?"r":"endAngle",u={};l.shape[h]=r?0:i.startAngle,u[h]=i[h],fs[o?"updateProps":"initProps"](l,{shape:u},a,e)}return l}};function yg(t,e,n){n.style.text=null,ss(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function _g(t,e,n){n.style.text=null,ss(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}var xg={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=function(t,e){var n=t.get(dg)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}(n,i),a=0<i.width?1:-1,o=0<i.height?1:-1;return{x:i.x+a*r/2,y:i.y+o*r/2,width:i.width-a*r,height:i.height-o*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};function wg(t,e,n,i,r,a,o,s){var l=e.getItemVisual(n,"color"),h=e.getItemVisual(n,"opacity"),u=i.getModel("itemStyle"),c=i.getModel("emphasis.itemStyle").getBarItemStyle();s||t.setShape("r",u.get("barBorderRadius")||0),t.useStyle(D({fill:l,opacity:h},u.getBarItemStyle()));var d=i.getShallow("cursor");d&&t.attr("cursor",d);o?r.height:r.width;s||function(t,e,n,i,r,a){Qo(t,e,n.getModel("label"),n.getModel("emphasis.label"),{labelFetcher:r,labelDataIndex:a,defaultText:Ed(r.getData(),a),isRectText:!0,autoColor:i}),ug(t),ug(e)}(t.style,c,i,l,a,n),jo(t,c)}var bg=Ma.extend({type:"largeBar",shape:{points:[]},buildPath:function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__baseDimIdx,a=0;a<n.length;a+=2)i[r]=n[a+r],t.moveTo(i[0],i[1]),t.lineTo(n[a],n[a+1])}});function Sg(t,e,n){var i=t.getData(),r=[],a=i.getLayout("valueAxisHorizontal")?1:0;r[1-a]=i.getLayout("valueAxisStart");var o=new bg({shape:{points:i.getLayout("largePoints")},incremental:!!n,__startPoint:r,__baseDimIdx:a,__largeDataIndices:i.getLayout("largeDataIndices"),__barWidth:i.getLayout("barWidth")});e.add(o),function(t,e,n){var i=n.getVisual("borderColor")||n.getVisual("color"),r=e.getModel("itemStyle").getItemStyle(["color","borderColor"]);t.useStyle(r),t.style.fill=null,t.style.stroke=i,t.style.lineWidth=n.getLayout("barWidth")}(o,t,i),o.seriesIndex=t.seriesIndex,t.get("silent")||(o.on("mousedown",Mg),o.on("mousemove",Mg))}var Mg=Qh(function(t){var e=function(t,e,n){var i=t.__baseDimIdx,r=1-i,a=t.shape.points,o=t.__largeDataIndices,s=Math.abs(t.__barWidth/2),l=t.__startPoint[r];fg[0]=e,fg[1]=n;for(var h=fg[i],u=fg[1-i],c=h-s,d=h+s,f=0,p=a.length/2;f<p;f++){var g=2*f,v=a[g+i],m=a[g+r];if(c<=v&&v<=d&&(l<=m?l<=u&&u<=m:m<=u&&u<=l))return o[f]}return-1}(this,t.offsetX,t.offsetY);this.dataIndex=0<=e?e:null},30,!1);Fc(Zu.VISUAL.LAYOUT,I(function(t,e){var n=zf(t,e),T=Rf(n),C={};k(n,function(t){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=Nf(t),a=T[Bf(i)][r],o=a.offset,s=a.width,l=n.getOtherAxis(i),h=t.get("barMinHeight")||0;C[r]=C[r]||[],e.setLayout({bandWidth:a.bandWidth,offset:o,size:s});for(var u=e.mapDimension(l.dim),c=e.mapDimension(i.dim),d=Sd(e,u),f=l.isHorizontal(),p=Gf(i,l,d),g=0,v=e.count();g<v;g++){var m=e.get(u,g),y=e.get(c,g);if(!isNaN(m)&&!isNaN(y)){var _,x,w,b,S,M=0<=m?"p":"n",I=p;if(d&&(C[r][y]||(C[r][y]={p:p,n:p}),I=C[r][y][M]),f)_=I,x=(S=n.dataToPoint([m,y]))[1]+o,w=S[0]-p,b=s,Math.abs(w)<h&&(w=(w<0?-1:1)*h),d&&(C[r][y][M]+=w);else _=(S=n.dataToPoint([y,m]))[0]+o,x=I,w=s,b=S[1]-p,Math.abs(b)<h&&(b=(b<=0?-1:1)*h),d&&(C[r][y][M]+=b);e.setItemLayout(g,{x:_,y:x,width:w,height:b})}}},this)},"bar")),Fc(Zu.VISUAL.PROGRESSIVE_LAYOUT,Vf),Vc({seriesType:"bar",reset:function(t){t.getData().setVisual("legendSymbol","roundRect")}});var Ig={updateSelectedMap:function(t){this._targetList=C(t)?t.slice():[],this._selectTargetMap=M(t||[],function(t,e){return t.set(e.name,e),t},Z())},select:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);n&&(n.selected=!1)},toggleSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);if(null!=n)return this[n.selected?"unSelect":"select"](t,e),n.selected},isSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return n&&n.selected}},Tg=Xc({type:"series.pie",init:function(t){Tg.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this._createSelectableList()),this._defaultLabelLine(t)},mergeOption:function(t){Tg.superCall(this,"mergeOption",t),this.updateSelectedMap(this._createSelectableList())},getInitialData:function(t,e){return function(t,e,n){e=C(e)&&{coordDimensions:e}||S({},e);var i=t.getSource(),r=bd(i,e),a=new sd(r,t);return a.initData(i,n),a}(this,["value"])},_createSelectableList:function(){for(var t=this.getRawData(),e=t.mapDimension("value"),n=[],i=0,r=t.count();i<r;i++)n.push({name:t.getName(i),value:t.get(e,i),selected:gh(t,i,"selected")});return n},getDataParams:function(t){var e=this.getData(),n=Tg.superCall(this,"getDataParams",t),i=[];return e.each(e.mapDimension("value"),function(t){i.push(t)}),n.percent=function(t,e,n){if(!t[e])return 0;var i=M(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),a=A(t,function(t){return(isNaN(t)?0:t)/i*r*100}),o=100*r,s=A(a,function(t){return Math.floor(t)}),l=M(s,function(t,e){return t+e},0),h=A(a,function(t,e){return t-s[e]});l<o;){for(var u=Number.NEGATIVE_INFINITY,c=null,d=0,f=h.length;d<f;++d)h[d]>u&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/r}(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},_defaultLabelLine:function(t){Wi(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationTypeUpdate:"transition",animationEasing:"cubicOut"}});function Cg(t,e,n,i){var r=e.getData(),a=this.dataIndex,o=r.getName(a),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:o,seriesId:e.id}),r.each(function(t){Dg(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function Dg(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=n?i:0,s=[Math.cos(a)*o,Math.sin(a)*o];r?t.animate().when(200,{position:s}).start("bounceOut"):t.attr("position",s)}function kg(t,e){qe.call(this);var n=new qa({z2:2}),i=new Ka,r=new Ha;this.add(n),this.add(i),this.add(r),this.updateData(t,e,!0)}_(Tg,Ig);var Ag=kg.prototype;Ag.updateData=function(t,e,n){var i=this.childAt(0),r=this.childAt(1),a=this.childAt(2),o=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),h=S({},l);h.label=null;var u=o.getShallow("animationTypeUpdate");n?(i.setShape(h),"scale"===o.getShallow("animationType")?(i.shape.r=l.r0,ls(i,{shape:{r:l.r}},o,e)):(i.shape.endAngle=l.startAngle,ss(i,{shape:{endAngle:l.endAngle}},o,e))):"expansion"===u?i.setShape(h):ss(i,{shape:h},o,e);var c=t.getItemVisual(e,"color");i.useStyle(D({lineJoin:"bevel",fill:c},s.getModel("itemStyle").getItemStyle())),i.hoverStyle=s.getModel("emphasis.itemStyle").getItemStyle();var d=s.getShallow("cursor");d&&i.attr("cursor",d),Dg(this,t.getItemLayout(e),o.isSelected(null,e),o.get("selectedOffset"),o.get("animation"));var f=!n&&"transition"===u;this._updateLabel(t,e,f),this.highDownOnUpdate=s.get("hoverAnimation")&&o.isAnimationEnabled()?function(t,e){"emphasis"===e?(r.ignore=r.hoverIgnore,a.ignore=a.hoverIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r+o.get("hoverOffset")}},300,"elasticOut")):(r.ignore=r.normalIgnore,a.ignore=a.normalIgnore,i.stopAnimation(!0),i.animateTo({shape:{r:l.r}},300,"elasticOut"))}:null,jo(this)},Ag._updateLabel=function(t,e,n){var i=this.childAt(1),r=this.childAt(2),a=t.hostModel,o=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"color");if(!s||isNaN(s.x)||isNaN(s.y))r.ignore=r.normalIgnore=r.hoverIgnore=i.ignore=i.normalIgnore=i.hoverIgnore=!0;else{var h={points:s.linePoints||[[s.x,s.y],[s.x,s.y],[s.x,s.y]]},u={x:s.x,y:s.y};n?(ss(i,{shape:h},a,e),ss(r,{style:u},a,e)):(i.attr({shape:h}),r.attr({style:u})),r.attr({rotation:s.rotation,origin:[s.x,s.y],z2:10});var c=o.getModel("label"),d=o.getModel("emphasis.label"),f=o.getModel("labelLine"),p=o.getModel("emphasis.labelLine");l=t.getItemVisual(e,"color");Qo(r.style,r.hoverStyle={},c,d,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:l,useInsideStyle:!!s.inside},{textAlign:s.textAlign,textVerticalAlign:s.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),r.ignore=r.normalIgnore=!c.get("show"),r.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:l,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(f.getModel("lineStyle").getLineStyle()),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var g=f.get("smooth");g&&!0===g&&(g=.4),i.setShape({smooth:g})}},y(kg,qe);Uh.extend({type:"pie",init:function(){var t=new qe;this._sectorGroup=t},render:function(t,e,n,i){if(!i||i.from!==this.uid){var r=t.getData(),a=this._data,o=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=t.get("animationTypeUpdate"),c=I(Cg,this.uid,t,s,n),d=t.get("selectedMode");if(r.diff(a).add(function(t){var e=new kg(r,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),d&&e.on("click",c),r.setItemGraphicEl(t,e),o.add(e)}).update(function(t,e){var n=a.getItemGraphicEl(e);l||"transition"===u||n.eachChild(function(t){t.stopAnimation(!0)}),n.updateData(r,t),n.off("click"),d&&n.on("click",c),o.add(n),r.setItemGraphicEl(t,n)}).remove(function(t){var e=a.getItemGraphicEl(t);o.remove(e)}).execute(),s&&0<r.count()&&(l?"scale"!==h:"transition"!==u)){for(var f=r.getItemLayout(0),p=1;isNaN(f.startAngle)&&p<r.count();++p)f=r.getItemLayout(p);var g=Math.max(n.getWidth(),n.getHeight())/2,v=w(o.removeClipPath,o);o.setClipPath(this._createClipPath(f.cx,f.cy,g,f.startAngle,f.clockwise,v,t,l))}else o.removeClipPath();this._data=r}},dispose:function(){},_createClipPath:function(t,e,n,i,r,a,o,s){var l=new qa({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return(s?ls:ss)(l,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),l},containPoint:function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,a=Math.sqrt(i*i+r*r);return a<=n.r&&a>=n.r0}}});var Lg=Math.PI/180;function Pg(r,t,e,n,i,a,o){function s(t,e,n){for(var i=t;i<e;i++)if(r[i].y+=n,t<i&&i+1<e&&r[i+1].y>r[i].y+r[i].height)return void l(i,n/2);l(e-1,n/2)}function l(t,e){for(var n=t;0<=n&&(r[n].y-=e,!(0<n&&r[n].y>r[n-1].y+r[n-1].height));n--);}function h(t,e,n,i,r,a){for(var o=e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++){var h=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,d=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-n);e&&o<=d&&(d=o-10),!e&&d<=o&&(d=o+10),t[s].x=n+d*a,o=d}}r.sort(function(t,e){return t.y-e.y});for(var u,c=0,d=r.length,f=[],p=[],g=0;g<d;g++)(u=r[g].y-c)<0&&s(g,d,-u),c=r[g].y+r[g].height;o-c<0&&l(d-1,c-o);for(g=0;g<d;g++)r[g].y>=e?p.push(r[g]):f.push(r[g]);h(f,!1,t,e,n,i),h(p,!0,t,e,n,i)}function Og(t){return"center"===t.position}function Eg(I,T,t,e,n){var C,D,k=I.getData(),A=[],L=!1,P=(I.get("minShowLabelAngle")||0)*Lg;k.each(function(t){var e=k.getItemLayout(t),n=k.getItemModel(t),i=n.getModel("label"),r=i.get("position")||n.get("emphasis.label.position"),a=n.getModel("labelLine"),o=a.get("length"),s=a.get("length2");if(!(e.angle<P)){var l,h,u,c,d=(e.startAngle+e.endAngle)/2,f=Math.cos(d),p=Math.sin(d);C=e.cx,D=e.cy;var g="inside"===r||"inner"===r;if("center"===r)l=e.cx,h=e.cy,c="center";else{var v=(g?(e.r+e.r0)/2*f:e.r*f)+C,m=(g?(e.r+e.r0)/2*p:e.r*p)+D;if(l=v+3*f,h=m+3*p,!g){var y=v+f*(o+T-e.r),_=m+p*(o+T-e.r),x=y+(f<0?-1:1)*s;l=x+(f<0?-5:5),u=[[v,m],[y,_],[x,h=_]]}c=g?"center":0<f?"left":"right"}var w,b=i.getFont(),S=i.get("rotate");w="number"==typeof S?S*(Math.PI/180):S?f<0?-d+Math.PI:-d:0;var M=Pn(I.getFormattedLabel(t,"normal")||k.getName(t),b,c,"top");L=!!w,e.label={x:l,y:h,position:r,height:M.height,len:o,len2:s,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:w,inside:g},g||A.push(e.label)}}),!L&&I.get("avoidLabelOverlap")&&function(t,e,n,i,r,a){for(var o=[],s=[],l=0;l<t.length;l++)Og(t[l])||(t[l].x<e?o.push(t[l]):s.push(t[l]));for(Pg(s,e,n,i,1,0,a),Pg(o,e,n,i,-1,0,a),l=0;l<t.length;l++)if(!Og(t[l])){var h=t[l].linePoints;if(h){var u=h[1][0]-h[2][0];t[l].x<e?h[2][0]=t[l].x+3:h[2][0]=t[l].x-3,h[1][1]=h[2][1]=t[l].y,h[1][0]=h[2][0]+u}}}(A,C,D,T,0,e)}var Ng,Bg,zg=2*Math.PI,Rg=Math.PI/180;Ng="pie",k([{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}],function(a){a.update="updateView",Rc(a,function(t,e){var r={};return e.eachComponent({mainType:"series",subType:Ng,query:t},function(n){n[a.method]&&n[a.method](t.name,t.dataIndex);var i=n.getData();i.each(function(t){var e=i.getName(t);r[e]=n.isSelected(e)||!1})}),{name:t.name,selected:r,seriesId:t.seriesId}})}),Vc((Bg="pie",{getTargetSeries:function(t){var e={},n=Z();return t.eachSeriesByType(Bg,function(t){t.__paletteScope=e,n.set(t.uid,t)}),n},reset:function(s,t){var l=s.getRawData(),h={},u=s.getData();u.each(function(t){var e=u.getRawIndex(t);h[e]=t}),l.each(function(t){var e,n=h[t],i=null!=n&&u.getItemVisual(n,"color",!0),r=null!=n&&u.getItemVisual(n,"borderColor",!0);if(i&&r||(e=l.getItemModel(t)),i)l.setItemVisual(t,"color",i);else{var a=e.get("itemStyle.color")||s.getColorFromPalette(l.getName(t)||t+"",s.__paletteScope,l.count());l.setItemVisual(t,"color",a),null!=n&&u.setItemVisual(n,"color",a)}if(r)l.setItemVisual(t,"borderColor",r);else{var o=e.get("itemStyle.borderColor");l.setItemVisual(t,"borderColor",o),null!=n&&u.setItemVisual(n,"borderColor",o)}})}})),Fc(I(function(t,e,T,n){e.eachSeriesByType(t,function(t){var r=t.getData(),e=r.mapDimension("value"),n=t.get("center"),i=t.get("radius");C(i)||(i=[0,i]),C(n)||(n=[n,n]);var a=T.getWidth(),o=T.getHeight(),s=Math.min(a,o),l=Cs(n[0],a),h=Cs(n[1],o),u=Cs(i[0],s/2),c=Cs(i[1],s/2),d=-t.get("startAngle")*Rg,f=t.get("minAngle")*Rg,p=0;r.each(e,function(t){isNaN(t)||p++});var g=r.getSum(e),v=Math.PI/(g||p)*2,m=t.get("clockwise"),y=t.get("roseType"),_=t.get("stillShowZeroSum"),x=r.getDataExtent(e);x[0]=0;var w=zg,b=0,S=d,M=m?1:-1;if(r.each(e,function(t,e){var n;if(isNaN(t))r.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:m,cx:l,cy:h,r0:u,r:y?NaN:c});else{(n="area"!==y?0===g&&_?v:t*v:zg/p)<f?w-=n=f:b+=t;var i=S+M*n;r.setItemLayout(e,{angle:n,startAngle:S,endAngle:i,clockwise:m,cx:l,cy:h,r0:u,r:y?Ts(t,x,[u,c]):c}),S=i}}),w<zg&&p)if(w<=.001){var I=zg/p;r.each(e,function(t,e){if(!isNaN(t)){var n=r.getItemLayout(e);n.angle=I,n.startAngle=d+M*e*I,n.endAngle=d+M*(e+1)*I}})}else v=w/b,S=d,r.each(e,function(t,e){if(!isNaN(t)){var n=r.getItemLayout(e),i=n.angle===f?f:t*v;n.startAngle=S,n.endAngle=S+M*i,S+=M*i}});Eg(t,c,0,o)})},"pie")),zc({seriesType:"pie",reset:function(t,e){var i=e.findComponents({mainType:"legend"});if(i&&i.length){var r=t.getData();r.filterSelf(function(t){for(var e=r.getName(t),n=0;n<i.length;n++)if(!i[n].isSelected(e))return!1;return!0})}}}),t.version="4.4.0",t.dependencies={zrender:"4.1.1"},t.PRIORITY=Zu,t.init=function(t,e,n){var i=Ec(t);if(i)return i;var r=new ec(t,e,n);return r.id="ec_"+kc++,Cc[r.id]=r,Qi(t,Lc,r.id),function(i){var r="__connectUpdateStatus";function a(t,e){for(var n=0;n<t.length;n++){t[n][r]=e}}Uu(xc,function(t,e){i._messageCenter.on(e,function(t){if(Dc[i.group]&&0!==i[r]){if(t&&t.escapeConnect)return;var e=i.makeActionFromEvent(t),n=[];Uu(Cc,function(t){t!==i&&t.group===i.group&&n.push(t)}),a(n,0),Uu(n,function(t){1!==t[r]&&t.dispatchAction(e)}),a(n,2)}})})}(r),r},t.connect=function(e){if(C(e)){var t=e;e=null,Uu(t,function(t){null!=t.group&&(e=t.group)}),e=e||"g_"+Ac++,Uu(t,function(t){t.group=e})}return Dc[e]=!0,e},t.disConnect=Pc,t.disconnect=Oc,t.dispose=function(t){"string"==typeof t?t=Cc[t]:t instanceof ec||(t=Ec(t)),t instanceof ec&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=Ec,t.getInstanceById=function(t){return Cc[t]},t.registerTheme=Nc,t.registerPreprocessor=Bc,t.registerProcessor=zc,t.registerPostUpdate=function(t){Sc.push(t)},t.registerAction=Rc,t.registerCoordinateSystem=function(t,e){Ol.register(t,e)},t.getCoordinateSystemDimensions=function(t){var e=Ol.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=Fc,t.registerVisual=Vc,t.registerLoading=Hc,t.extendComponentModel=function(t){return il.extend(t)},t.extendComponentView=Gc,t.extendSeriesModel=Xc,t.extendChartView=Uc,t.setCanvasCreator=function(t){!function(t,e){"createCanvas"===t&&(g=null),a[t]=e}("createCanvas",t)},t.registerMap=function(t,e,n){Wu(t,e,n)},t.getMap=function(t){var e=Hu(t);return e&&e[0]&&{geoJson:e[0].geoJSON,specialAreas:e[0].specialAreas}},t.dataTool={}});
