| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458 | (function (global, factory) {    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :    typeof define === 'function' && define.amd ? define(['exports'], factory) :    (global = global || self, factory(global.zrender = {}));}(this, (function (exports) { 'use strict';    var Browser = (function () {        function Browser() {            this.firefox = false;            this.ie = false;            this.edge = false;            this.newEdge = false;            this.weChat = false;        }        return Browser;    }());    var Env = (function () {        function Env() {            this.browser = new Browser();            this.node = false;            this.wxa = false;            this.worker = false;            this.svgSupported = false;            this.touchEventsSupported = false;            this.pointerEventsSupported = false;            this.domSupported = false;            this.transformSupported = false;            this.transform3dSupported = false;            this.hasGlobalWindow = typeof window !== 'undefined';        }        return Env;    }());    var env = new Env();    if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {        env.wxa = true;        env.touchEventsSupported = true;    }    else if (typeof document === 'undefined' && typeof self !== 'undefined') {        env.worker = true;    }    else if (typeof navigator === 'undefined'        || navigator.userAgent.indexOf('Node.js') === 0) {        env.node = true;        env.svgSupported = true;    }    else {        detect(navigator.userAgent, env);    }    function detect(ua, env) {        var browser = env.browser;        var firefox = ua.match(/Firefox\/([\d.]+)/);        var ie = ua.match(/MSIE\s([\d.]+)/)            || ua.match(/Trident\/.+?rv:(([\d.]+))/);        var edge = ua.match(/Edge?\/([\d.]+)/);        var weChat = (/micromessenger/i).test(ua);        if (firefox) {            browser.firefox = true;            browser.version = firefox[1];        }        if (ie) {            browser.ie = true;            browser.version = ie[1];        }        if (edge) {            browser.edge = true;            browser.version = edge[1];            browser.newEdge = +edge[1].split('.')[0] > 18;        }        if (weChat) {            browser.weChat = true;        }        env.svgSupported = typeof SVGRect !== 'undefined';        env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge;        env.pointerEventsSupported = 'onpointerdown' in window            && (browser.edge || (browser.ie && +browser.version >= 11));        env.domSupported = typeof document !== 'undefined';        var style = document.documentElement.style;        env.transform3dSupported = ((browser.ie && 'transition' in style)            || browser.edge            || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix()))            || 'MozPerspective' in style)            && !('OTransition' in style);        env.transformSupported = env.transform3dSupported            || (browser.ie && +browser.version >= 9);    }    var DEFAULT_FONT_SIZE = 12;    var DEFAULT_FONT_FAMILY = 'sans-serif';    var DEFAULT_FONT = DEFAULT_FONT_SIZE + "px " + DEFAULT_FONT_FAMILY;    var OFFSET = 20;    var SCALE = 100;    var defaultWidthMapStr = "007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N";    function getTextWidthMap(mapStr) {        var map = {};        if (typeof JSON === 'undefined') {            return map;        }        for (var i = 0; i < mapStr.length; i++) {            var char = String.fromCharCode(i + 32);            var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE;            map[char] = size;        }        return map;    }    var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr);    var platformApi = {        createCanvas: function () {            return typeof document !== 'undefined'                && document.createElement('canvas');        },        measureText: (function () {            var _ctx;            var _cachedFont;            return function (text, font) {                if (!_ctx) {                    var canvas = platformApi.createCanvas();                    _ctx = canvas && canvas.getContext('2d');                }                if (_ctx) {                    if (_cachedFont !== font) {                        _cachedFont = _ctx.font = font || DEFAULT_FONT;                    }                    return _ctx.measureText(text);                }                else {                    text = text || '';                    font = font || DEFAULT_FONT;                    var res = /(\d+)px/.exec(font);                    var fontSize = res && +res[1] || DEFAULT_FONT_SIZE;                    var width = 0;                    if (font.indexOf('mono') >= 0) {                        width = fontSize * text.length;                    }                    else {                        for (var i = 0; i < text.length; i++) {                            var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]];                            width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize);                        }                    }                    return { width: width };                }            };        })(),        loadImage: function (src, onload, onerror) {            var image = new Image();            image.onload = onload;            image.onerror = onerror;            image.src = src;            return image;        }    };    function setPlatformAPI(newPlatformApis) {        for (var key in platformApi) {            if (newPlatformApis[key]) {                platformApi[key] = newPlatformApis[key];            }        }    }    var BUILTIN_OBJECT = reduce([        'Function',        'RegExp',        'Date',        'Error',        'CanvasGradient',        'CanvasPattern',        'Image',        'Canvas'    ], function (obj, val) {        obj['[object ' + val + ']'] = true;        return obj;    }, {});    var TYPED_ARRAY = reduce([        'Int8',        'Uint8',        'Uint8Clamped',        'Int16',        'Uint16',        'Int32',        'Uint32',        'Float32',        'Float64'    ], function (obj, val) {        obj['[object ' + val + 'Array]'] = true;        return obj;    }, {});    var objToString = Object.prototype.toString;    var arrayProto = Array.prototype;    var nativeForEach = arrayProto.forEach;    var nativeFilter = arrayProto.filter;    var nativeSlice = arrayProto.slice;    var nativeMap = arrayProto.map;    var ctorFunction = function () { }.constructor;    var protoFunction = ctorFunction ? ctorFunction.prototype : null;    var protoKey = '__proto__';    var idStart = 0x0907;    function guid() {        return idStart++;    }    function logError() {        var args = [];        for (var _i = 0; _i < arguments.length; _i++) {            args[_i] = arguments[_i];        }        if (typeof console !== 'undefined') {            console.error.apply(console, args);        }    }    function clone(source) {        if (source == null || typeof source !== 'object') {            return source;        }        var result = source;        var typeStr = objToString.call(source);        if (typeStr === '[object Array]') {            if (!isPrimitive(source)) {                result = [];                for (var i = 0, len = source.length; i < len; i++) {                    result[i] = clone(source[i]);                }            }        }        else if (TYPED_ARRAY[typeStr]) {            if (!isPrimitive(source)) {                var Ctor = source.constructor;                if (Ctor.from) {                    result = Ctor.from(source);                }                else {                    result = new Ctor(source.length);                    for (var i = 0, len = source.length; i < len; i++) {                        result[i] = source[i];                    }                }            }        }        else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {            result = {};            for (var key in source) {                if (source.hasOwnProperty(key) && key !== protoKey) {                    result[key] = clone(source[key]);                }            }        }        return result;    }    function merge(target, source, overwrite) {        if (!isObject(source) || !isObject(target)) {            return overwrite ? clone(source) : target;        }        for (var key in source) {            if (source.hasOwnProperty(key) && key !== protoKey) {                var targetProp = target[key];                var sourceProp = source[key];                if (isObject(sourceProp)                    && isObject(targetProp)                    && !isArray(sourceProp)                    && !isArray(targetProp)                    && !isDom(sourceProp)                    && !isDom(targetProp)                    && !isBuiltInObject(sourceProp)                    && !isBuiltInObject(targetProp)                    && !isPrimitive(sourceProp)                    && !isPrimitive(targetProp)) {                    merge(targetProp, sourceProp, overwrite);                }                else if (overwrite || !(key in target)) {                    target[key] = clone(source[key]);                }            }        }        return target;    }    function mergeAll(targetAndSources, overwrite) {        var result = targetAndSources[0];        for (var i = 1, len = targetAndSources.length; i < len; i++) {            result = merge(result, targetAndSources[i], overwrite);        }        return result;    }    function extend(target, source) {        if (Object.assign) {            Object.assign(target, source);        }        else {            for (var key in source) {                if (source.hasOwnProperty(key) && key !== protoKey) {                    target[key] = source[key];                }            }        }        return target;    }    function defaults(target, source, overlay) {        var keysArr = keys(source);        for (var i = 0; i < keysArr.length; i++) {            var key = keysArr[i];            if ((overlay ? source[key] != null : target[key] == null)) {                target[key] = source[key];            }        }        return target;    }    var createCanvas = platformApi.createCanvas;    function indexOf(array, value) {        if (array) {            if (array.indexOf) {                return array.indexOf(value);            }            for (var i = 0, len = array.length; i < len; i++) {                if (array[i] === value) {                    return i;                }            }        }        return -1;    }    function inherits(clazz, baseClazz) {        var clazzPrototype = clazz.prototype;        function F() { }        F.prototype = baseClazz.prototype;        clazz.prototype = new F();        for (var prop in clazzPrototype) {            if (clazzPrototype.hasOwnProperty(prop)) {                clazz.prototype[prop] = clazzPrototype[prop];            }        }        clazz.prototype.constructor = clazz;        clazz.superClass = baseClazz;    }    function mixin(target, source, override) {        target = 'prototype' in target ? target.prototype : target;        source = 'prototype' in source ? source.prototype : source;        if (Object.getOwnPropertyNames) {            var keyList = Object.getOwnPropertyNames(source);            for (var i = 0; i < keyList.length; i++) {                var key = keyList[i];                if (key !== 'constructor') {                    if ((override ? source[key] != null : target[key] == null)) {                        target[key] = source[key];                    }                }            }        }        else {            defaults(target, source, override);        }    }    function isArrayLike(data) {        if (!data) {            return false;        }        if (typeof data === 'string') {            return false;        }        return typeof data.length === 'number';    }    function each(arr, cb, context) {        if (!(arr && cb)) {            return;        }        if (arr.forEach && arr.forEach === nativeForEach) {            arr.forEach(cb, context);        }        else if (arr.length === +arr.length) {            for (var i = 0, len = arr.length; i < len; i++) {                cb.call(context, arr[i], i, arr);            }        }        else {            for (var key in arr) {                if (arr.hasOwnProperty(key)) {                    cb.call(context, arr[key], key, arr);                }            }        }    }    function map(arr, cb, context) {        if (!arr) {            return [];        }        if (!cb) {            return slice(arr);        }        if (arr.map && arr.map === nativeMap) {            return arr.map(cb, context);        }        else {            var result = [];            for (var i = 0, len = arr.length; i < len; i++) {                result.push(cb.call(context, arr[i], i, arr));            }            return result;        }    }    function reduce(arr, cb, memo, context) {        if (!(arr && cb)) {            return;        }        for (var i = 0, len = arr.length; i < len; i++) {            memo = cb.call(context, memo, arr[i], i, arr);        }        return memo;    }    function filter(arr, cb, context) {        if (!arr) {            return [];        }        if (!cb) {            return slice(arr);        }        if (arr.filter && arr.filter === nativeFilter) {            return arr.filter(cb, context);        }        else {            var result = [];            for (var i = 0, len = arr.length; i < len; i++) {                if (cb.call(context, arr[i], i, arr)) {                    result.push(arr[i]);                }            }            return result;        }    }    function find(arr, cb, context) {        if (!(arr && cb)) {            return;        }        for (var i = 0, len = arr.length; i < len; i++) {            if (cb.call(context, arr[i], i, arr)) {                return arr[i];            }        }    }    function keys(obj) {        if (!obj) {            return [];        }        if (Object.keys) {            return Object.keys(obj);        }        var keyList = [];        for (var key in obj) {            if (obj.hasOwnProperty(key)) {                keyList.push(key);            }        }        return keyList;    }    function bindPolyfill(func, context) {        var args = [];        for (var _i = 2; _i < arguments.length; _i++) {            args[_i - 2] = arguments[_i];        }        return function () {            return func.apply(context, args.concat(nativeSlice.call(arguments)));        };    }    var bind = (protoFunction && isFunction(protoFunction.bind))        ? protoFunction.call.bind(protoFunction.bind)        : bindPolyfill;    function curry(func) {        var args = [];        for (var _i = 1; _i < arguments.length; _i++) {            args[_i - 1] = arguments[_i];        }        return function () {            return func.apply(this, args.concat(nativeSlice.call(arguments)));        };    }    function isArray(value) {        if (Array.isArray) {            return Array.isArray(value);        }        return objToString.call(value) === '[object Array]';    }    function isFunction(value) {        return typeof value === 'function';    }    function isString(value) {        return typeof value === 'string';    }    function isStringSafe(value) {        return objToString.call(value) === '[object String]';    }    function isNumber(value) {        return typeof value === 'number';    }    function isObject(value) {        var type = typeof value;        return type === 'function' || (!!value && type === 'object');    }    function isBuiltInObject(value) {        return !!BUILTIN_OBJECT[objToString.call(value)];    }    function isTypedArray(value) {        return !!TYPED_ARRAY[objToString.call(value)];    }    function isDom(value) {        return typeof value === 'object'            && typeof value.nodeType === 'number'            && typeof value.ownerDocument === 'object';    }    function isGradientObject(value) {        return value.colorStops != null;    }    function isImagePatternObject(value) {        return value.image != null;    }    function isRegExp(value) {        return objToString.call(value) === '[object RegExp]';    }    function eqNaN(value) {        return value !== value;    }    function retrieve() {        var args = [];        for (var _i = 0; _i < arguments.length; _i++) {            args[_i] = arguments[_i];        }        for (var i = 0, len = args.length; i < len; i++) {            if (args[i] != null) {                return args[i];            }        }    }    function retrieve2(value0, value1) {        return value0 != null            ? value0            : value1;    }    function retrieve3(value0, value1, value2) {        return value0 != null            ? value0            : value1 != null                ? value1                : value2;    }    function slice(arr) {        var args = [];        for (var _i = 1; _i < arguments.length; _i++) {            args[_i - 1] = arguments[_i];        }        return nativeSlice.apply(arr, args);    }    function normalizeCssArray(val) {        if (typeof (val) === 'number') {            return [val, val, val, val];        }        var len = val.length;        if (len === 2) {            return [val[0], val[1], val[0], val[1]];        }        else if (len === 3) {            return [val[0], val[1], val[2], val[1]];        }        return val;    }    function assert(condition, message) {        if (!condition) {            throw new Error(message);        }    }    function trim(str) {        if (str == null) {            return null;        }        else if (typeof str.trim === 'function') {            return str.trim();        }        else {            return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');        }    }    var primitiveKey = '__ec_primitive__';    function setAsPrimitive(obj) {        obj[primitiveKey] = true;    }    function isPrimitive(obj) {        return obj[primitiveKey];    }    var MapPolyfill = (function () {        function MapPolyfill() {            this.data = {};        }        MapPolyfill.prototype["delete"] = function (key) {            var existed = this.has(key);            if (existed) {                delete this.data[key];            }            return existed;        };        MapPolyfill.prototype.has = function (key) {            return this.data.hasOwnProperty(key);        };        MapPolyfill.prototype.get = function (key) {            return this.data[key];        };        MapPolyfill.prototype.set = function (key, value) {            this.data[key] = value;            return this;        };        MapPolyfill.prototype.keys = function () {            return keys(this.data);        };        MapPolyfill.prototype.forEach = function (callback) {            var data = this.data;            for (var key in data) {                if (data.hasOwnProperty(key)) {                    callback(data[key], key);                }            }        };        return MapPolyfill;    }());    var isNativeMapSupported = typeof Map === 'function';    function maybeNativeMap() {        return (isNativeMapSupported ? new Map() : new MapPolyfill());    }    var HashMap = (function () {        function HashMap(obj) {            var isArr = isArray(obj);            this.data = maybeNativeMap();            var thisMap = this;            (obj instanceof HashMap)                ? obj.each(visit)                : (obj && each(obj, visit));            function visit(value, key) {                isArr ? thisMap.set(value, key) : thisMap.set(key, value);            }        }        HashMap.prototype.hasKey = function (key) {            return this.data.has(key);        };        HashMap.prototype.get = function (key) {            return this.data.get(key);        };        HashMap.prototype.set = function (key, value) {            this.data.set(key, value);            return value;        };        HashMap.prototype.each = function (cb, context) {            this.data.forEach(function (value, key) {                cb.call(context, value, key);            });        };        HashMap.prototype.keys = function () {            var keys = this.data.keys();            return isNativeMapSupported                ? Array.from(keys)                : keys;        };        HashMap.prototype.removeKey = function (key) {            this.data["delete"](key);        };        return HashMap;    }());    function createHashMap(obj) {        return new HashMap(obj);    }    function concatArray(a, b) {        var newArray = new a.constructor(a.length + b.length);        for (var i = 0; i < a.length; i++) {            newArray[i] = a[i];        }        var offset = a.length;        for (var i = 0; i < b.length; i++) {            newArray[i + offset] = b[i];        }        return newArray;    }    function createObject(proto, properties) {        var obj;        if (Object.create) {            obj = Object.create(proto);        }        else {            var StyleCtor = function () { };            StyleCtor.prototype = proto;            obj = new StyleCtor();        }        if (properties) {            extend(obj, properties);        }        return obj;    }    function disableUserSelect(dom) {        var domStyle = dom.style;        domStyle.webkitUserSelect = 'none';        domStyle.userSelect = 'none';        domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)';        domStyle['-webkit-touch-callout'] = 'none';    }    function hasOwn(own, prop) {        return own.hasOwnProperty(prop);    }    function noop() { }    var RADIAN_TO_DEGREE = 180 / Math.PI;    var util = /*#__PURE__*/Object.freeze({        __proto__: null,        guid: guid,        logError: logError,        clone: clone,        merge: merge,        mergeAll: mergeAll,        extend: extend,        defaults: defaults,        createCanvas: createCanvas,        indexOf: indexOf,        inherits: inherits,        mixin: mixin,        isArrayLike: isArrayLike,        each: each,        map: map,        reduce: reduce,        filter: filter,        find: find,        keys: keys,        bind: bind,        curry: curry,        isArray: isArray,        isFunction: isFunction,        isString: isString,        isStringSafe: isStringSafe,        isNumber: isNumber,        isObject: isObject,        isBuiltInObject: isBuiltInObject,        isTypedArray: isTypedArray,        isDom: isDom,        isGradientObject: isGradientObject,        isImagePatternObject: isImagePatternObject,        isRegExp: isRegExp,        eqNaN: eqNaN,        retrieve: retrieve,        retrieve2: retrieve2,        retrieve3: retrieve3,        slice: slice,        normalizeCssArray: normalizeCssArray,        assert: assert,        trim: trim,        setAsPrimitive: setAsPrimitive,        isPrimitive: isPrimitive,        HashMap: HashMap,        createHashMap: createHashMap,        concatArray: concatArray,        createObject: createObject,        disableUserSelect: disableUserSelect,        hasOwn: hasOwn,        noop: noop,        RADIAN_TO_DEGREE: RADIAN_TO_DEGREE    });    /*! *****************************************************************************    Copyright (c) Microsoft Corporation. All rights reserved.    Licensed 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    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,    MERCHANTABLITY OR NON-INFRINGEMENT.    See the Apache Version 2.0 License for specific language governing permissions    and limitations under the License.    ***************************************************************************** */    /* global Reflect, Promise */    var extendStatics = function(d, b) {        extendStatics = Object.setPrototypeOf ||            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };        return extendStatics(d, b);    };    function __extends(d, b) {        extendStatics(d, b);        function __() { this.constructor = d; }        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());    }    function create(x, y) {        if (x == null) {            x = 0;        }        if (y == null) {            y = 0;        }        return [x, y];    }    function copy(out, v) {        out[0] = v[0];        out[1] = v[1];        return out;    }    function clone$1(v) {        return [v[0], v[1]];    }    function set(out, a, b) {        out[0] = a;        out[1] = b;        return out;    }    function add(out, v1, v2) {        out[0] = v1[0] + v2[0];        out[1] = v1[1] + v2[1];        return out;    }    function scaleAndAdd(out, v1, v2, a) {        out[0] = v1[0] + v2[0] * a;        out[1] = v1[1] + v2[1] * a;        return out;    }    function sub(out, v1, v2) {        out[0] = v1[0] - v2[0];        out[1] = v1[1] - v2[1];        return out;    }    function len(v) {        return Math.sqrt(lenSquare(v));    }    var length = len;    function lenSquare(v) {        return v[0] * v[0] + v[1] * v[1];    }    var lengthSquare = lenSquare;    function mul(out, v1, v2) {        out[0] = v1[0] * v2[0];        out[1] = v1[1] * v2[1];        return out;    }    function div(out, v1, v2) {        out[0] = v1[0] / v2[0];        out[1] = v1[1] / v2[1];        return out;    }    function dot(v1, v2) {        return v1[0] * v2[0] + v1[1] * v2[1];    }    function scale(out, v, s) {        out[0] = v[0] * s;        out[1] = v[1] * s;        return out;    }    function normalize(out, v) {        var d = len(v);        if (d === 0) {            out[0] = 0;            out[1] = 0;        }        else {            out[0] = v[0] / d;            out[1] = v[1] / d;        }        return out;    }    function distance(v1, v2) {        return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0])            + (v1[1] - v2[1]) * (v1[1] - v2[1]));    }    var dist = distance;    function distanceSquare(v1, v2) {        return (v1[0] - v2[0]) * (v1[0] - v2[0])            + (v1[1] - v2[1]) * (v1[1] - v2[1]);    }    var distSquare = distanceSquare;    function negate(out, v) {        out[0] = -v[0];        out[1] = -v[1];        return out;    }    function lerp(out, v1, v2, t) {        out[0] = v1[0] + t * (v2[0] - v1[0]);        out[1] = v1[1] + t * (v2[1] - v1[1]);        return out;    }    function applyTransform(out, v, m) {        var x = v[0];        var y = v[1];        out[0] = m[0] * x + m[2] * y + m[4];        out[1] = m[1] * x + m[3] * y + m[5];        return out;    }    function min(out, v1, v2) {        out[0] = Math.min(v1[0], v2[0]);        out[1] = Math.min(v1[1], v2[1]);        return out;    }    function max(out, v1, v2) {        out[0] = Math.max(v1[0], v2[0]);        out[1] = Math.max(v1[1], v2[1]);        return out;    }    var vector = /*#__PURE__*/Object.freeze({        __proto__: null,        create: create,        copy: copy,        clone: clone$1,        set: set,        add: add,        scaleAndAdd: scaleAndAdd,        sub: sub,        len: len,        length: length,        lenSquare: lenSquare,        lengthSquare: lengthSquare,        mul: mul,        div: div,        dot: dot,        scale: scale,        normalize: normalize,        distance: distance,        dist: dist,        distanceSquare: distanceSquare,        distSquare: distSquare,        negate: negate,        lerp: lerp,        applyTransform: applyTransform,        min: min,        max: max    });    var Param = (function () {        function Param(target, e) {            this.target = target;            this.topTarget = e && e.topTarget;        }        return Param;    }());    var Draggable = (function () {        function Draggable(handler) {            this.handler = handler;            handler.on('mousedown', this._dragStart, this);            handler.on('mousemove', this._drag, this);            handler.on('mouseup', this._dragEnd, this);        }        Draggable.prototype._dragStart = function (e) {            var draggingTarget = e.target;            while (draggingTarget && !draggingTarget.draggable) {                draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget;            }            if (draggingTarget) {                this._draggingTarget = draggingTarget;                draggingTarget.dragging = true;                this._x = e.offsetX;                this._y = e.offsetY;                this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event);            }        };        Draggable.prototype._drag = function (e) {            var draggingTarget = this._draggingTarget;            if (draggingTarget) {                var x = e.offsetX;                var y = e.offsetY;                var dx = x - this._x;                var dy = y - this._y;                this._x = x;                this._y = y;                draggingTarget.drift(dx, dy, e);                this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event);                var dropTarget = this.handler.findHover(x, y, draggingTarget).target;                var lastDropTarget = this._dropTarget;                this._dropTarget = dropTarget;                if (draggingTarget !== dropTarget) {                    if (lastDropTarget && dropTarget !== lastDropTarget) {                        this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event);                    }                    if (dropTarget && dropTarget !== lastDropTarget) {                        this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event);                    }                }            }        };        Draggable.prototype._dragEnd = function (e) {            var draggingTarget = this._draggingTarget;            if (draggingTarget) {                draggingTarget.dragging = false;            }            this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event);            if (this._dropTarget) {                this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event);            }            this._draggingTarget = null;            this._dropTarget = null;        };        return Draggable;    }());    var Eventful = (function () {        function Eventful(eventProcessors) {            if (eventProcessors) {                this._$eventProcessor = eventProcessors;            }        }        Eventful.prototype.on = function (event, query, handler, context) {            if (!this._$handlers) {                this._$handlers = {};            }            var _h = this._$handlers;            if (typeof query === 'function') {                context = handler;                handler = query;                query = null;            }            if (!handler || !event) {                return this;            }            var eventProcessor = this._$eventProcessor;            if (query != null && eventProcessor && eventProcessor.normalizeQuery) {                query = eventProcessor.normalizeQuery(query);            }            if (!_h[event]) {                _h[event] = [];            }            for (var i = 0; i < _h[event].length; i++) {                if (_h[event][i].h === handler) {                    return this;                }            }            var wrap = {                h: handler,                query: query,                ctx: (context || this),                callAtLast: handler.zrEventfulCallAtLast            };            var lastIndex = _h[event].length - 1;            var lastWrap = _h[event][lastIndex];            (lastWrap && lastWrap.callAtLast)                ? _h[event].splice(lastIndex, 0, wrap)                : _h[event].push(wrap);            return this;        };        Eventful.prototype.isSilent = function (eventName) {            var _h = this._$handlers;            return !_h || !_h[eventName] || !_h[eventName].length;        };        Eventful.prototype.off = function (eventType, handler) {            var _h = this._$handlers;            if (!_h) {                return this;            }            if (!eventType) {                this._$handlers = {};                return this;            }            if (handler) {                if (_h[eventType]) {                    var newList = [];                    for (var i = 0, l = _h[eventType].length; i < l; i++) {                        if (_h[eventType][i].h !== handler) {                            newList.push(_h[eventType][i]);                        }                    }                    _h[eventType] = newList;                }                if (_h[eventType] && _h[eventType].length === 0) {                    delete _h[eventType];                }            }            else {                delete _h[eventType];            }            return this;        };        Eventful.prototype.trigger = function (eventType) {            var args = [];            for (var _i = 1; _i < arguments.length; _i++) {                args[_i - 1] = arguments[_i];            }            if (!this._$handlers) {                return this;            }            var _h = this._$handlers[eventType];            var eventProcessor = this._$eventProcessor;            if (_h) {                var argLen = args.length;                var len = _h.length;                for (var i = 0; i < len; i++) {                    var hItem = _h[i];                    if (eventProcessor                        && eventProcessor.filter                        && hItem.query != null                        && !eventProcessor.filter(eventType, hItem.query)) {                        continue;                    }                    switch (argLen) {                        case 0:                            hItem.h.call(hItem.ctx);                            break;                        case 1:                            hItem.h.call(hItem.ctx, args[0]);                            break;                        case 2:                            hItem.h.call(hItem.ctx, args[0], args[1]);                            break;                        default:                            hItem.h.apply(hItem.ctx, args);                            break;                    }                }            }            eventProcessor && eventProcessor.afterTrigger                && eventProcessor.afterTrigger(eventType);            return this;        };        Eventful.prototype.triggerWithContext = function (type) {            var args = [];            for (var _i = 1; _i < arguments.length; _i++) {                args[_i - 1] = arguments[_i];            }            if (!this._$handlers) {                return this;            }            var _h = this._$handlers[type];            var eventProcessor = this._$eventProcessor;            if (_h) {                var argLen = args.length;                var ctx = args[argLen - 1];                var len = _h.length;                for (var i = 0; i < len; i++) {                    var hItem = _h[i];                    if (eventProcessor                        && eventProcessor.filter                        && hItem.query != null                        && !eventProcessor.filter(type, hItem.query)) {                        continue;                    }                    switch (argLen) {                        case 0:                            hItem.h.call(ctx);                            break;                        case 1:                            hItem.h.call(ctx, args[0]);                            break;                        case 2:                            hItem.h.call(ctx, args[0], args[1]);                            break;                        default:                            hItem.h.apply(ctx, args.slice(1, argLen - 1));                            break;                    }                }            }            eventProcessor && eventProcessor.afterTrigger                && eventProcessor.afterTrigger(type);            return this;        };        return Eventful;    }());    var LN2 = Math.log(2);    function determinant(rows, rank, rowStart, rowMask, colMask, detCache) {        var cacheKey = rowMask + '-' + colMask;        var fullRank = rows.length;        if (detCache.hasOwnProperty(cacheKey)) {            return detCache[cacheKey];        }        if (rank === 1) {            var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2);            return rows[rowStart][colStart];        }        var subRowMask = rowMask | (1 << rowStart);        var subRowStart = rowStart + 1;        while (rowMask & (1 << subRowStart)) {            subRowStart++;        }        var sum = 0;        for (var j = 0, colLocalIdx = 0; j < fullRank; j++) {            var colTag = 1 << j;            if (!(colTag & colMask)) {                sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j]                    * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);                colLocalIdx++;            }        }        detCache[cacheKey] = sum;        return sum;    }    function buildTransformer(src, dest) {        var mA = [            [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]],            [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]],            [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]],            [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]],            [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]],            [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]],            [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]],            [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]]        ];        var detCache = {};        var det = determinant(mA, 8, 0, 0, 0, detCache);        if (det === 0) {            return;        }        var vh = [];        for (var i = 0; i < 8; i++) {            for (var j = 0; j < 8; j++) {                vh[j] == null && (vh[j] = 0);                vh[j] += ((i + j) % 2 ? -1 : 1)                    * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache)                    / det * dest[i];            }        }        return function (out, srcPointX, srcPointY) {            var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1;            out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk;            out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk;        };    }    var EVENT_SAVED_PROP = '___zrEVENTSAVED';    function transformCoordWithViewport(out, el, inX, inY, inverse) {        if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {            var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});            var markers = prepareCoordMarkers(el, saved);            var transformer = preparePointerTransformer(markers, saved, inverse);            if (transformer) {                transformer(out, inX, inY);                return true;            }        }        return false;    }    function prepareCoordMarkers(el, saved) {        var markers = saved.markers;        if (markers) {            return markers;        }        markers = saved.markers = [];        var propLR = ['left', 'right'];        var propTB = ['top', 'bottom'];        for (var i = 0; i < 4; i++) {            var marker = document.createElement('div');            var stl = marker.style;            var idxLR = i % 2;            var idxTB = (i >> 1) % 2;            stl.cssText = [                'position: absolute',                'visibility: hidden',                'padding: 0',                'margin: 0',                'border-width: 0',                'user-select: none',                'width:0',                'height:0',                propLR[idxLR] + ':0',                propTB[idxTB] + ':0',                propLR[1 - idxLR] + ':auto',                propTB[1 - idxTB] + ':auto',                ''            ].join('!important;');            el.appendChild(marker);            markers.push(marker);        }        return markers;    }    function preparePointerTransformer(markers, saved, inverse) {        var transformerName = inverse ? 'invTrans' : 'trans';        var transformer = saved[transformerName];        var oldSrcCoords = saved.srcCoords;        var srcCoords = [];        var destCoords = [];        var oldCoordTheSame = true;        for (var i = 0; i < 4; i++) {            var rect = markers[i].getBoundingClientRect();            var ii = 2 * i;            var x = rect.left;            var y = rect.top;            srcCoords.push(x, y);            oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];            destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);        }        return (oldCoordTheSame && transformer)            ? transformer            : (saved.srcCoords = srcCoords,                saved[transformerName] = inverse                    ? buildTransformer(destCoords, srcCoords)                    : buildTransformer(srcCoords, destCoords));    }    function isCanvasEl(el) {        return el.nodeName.toUpperCase() === 'CANVAS';    }    var replaceReg = /([&<>"'])/g;    var replaceMap = {        '&': '&',        '<': '<',        '>': '>',        '"': '"',        '\'': '''    };    function encodeHTML(source) {        return source == null            ? ''            : (source + '').replace(replaceReg, function (str, c) {                return replaceMap[c];            });    }    var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;    var _calcOut = [];    var firefoxNotSupportOffsetXY = env.browser.firefox        && +env.browser.version.split('.')[0] < 39;    function clientToLocal(el, e, out, calculate) {        out = out || {};        if (calculate) {            calculateZrXY(el, e, out);        }        else if (firefoxNotSupportOffsetXY            && e.layerX != null            && e.layerX !== e.offsetX) {            out.zrX = e.layerX;            out.zrY = e.layerY;        }        else if (e.offsetX != null) {            out.zrX = e.offsetX;            out.zrY = e.offsetY;        }        else {            calculateZrXY(el, e, out);        }        return out;    }    function calculateZrXY(el, e, out) {        if (env.domSupported && el.getBoundingClientRect) {            var ex = e.clientX;            var ey = e.clientY;            if (isCanvasEl(el)) {                var box = el.getBoundingClientRect();                out.zrX = ex - box.left;                out.zrY = ey - box.top;                return;            }            else {                if (transformCoordWithViewport(_calcOut, el, ex, ey)) {                    out.zrX = _calcOut[0];                    out.zrY = _calcOut[1];                    return;                }            }        }        out.zrX = out.zrY = 0;    }    function getNativeEvent(e) {        return e            || window.event;    }    function normalizeEvent(el, e, calculate) {        e = getNativeEvent(e);        if (e.zrX != null) {            return e;        }        var eventType = e.type;        var isTouch = eventType && eventType.indexOf('touch') >= 0;        if (!isTouch) {            clientToLocal(el, e, e, calculate);            var wheelDelta = getWheelDeltaMayPolyfill(e);            e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3;        }        else {            var touch = eventType !== 'touchend'                ? e.targetTouches[0]                : e.changedTouches[0];            touch && clientToLocal(el, touch, e, calculate);        }        var button = e.button;        if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {            e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));        }        return e;    }    function getWheelDeltaMayPolyfill(e) {        var rawWheelDelta = e.wheelDelta;        if (rawWheelDelta) {            return rawWheelDelta;        }        var deltaX = e.deltaX;        var deltaY = e.deltaY;        if (deltaX == null || deltaY == null) {            return rawWheelDelta;        }        var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX);        var sign = deltaY > 0 ? -1            : deltaY < 0 ? 1                : deltaX > 0 ? -1                    : 1;        return 3 * delta * sign;    }    function addEventListener(el, name, handler, opt) {        el.addEventListener(name, handler, opt);    }    function removeEventListener(el, name, handler, opt) {        el.removeEventListener(name, handler, opt);    }    var stop = function (e) {        e.preventDefault();        e.stopPropagation();        e.cancelBubble = true;    };    var GestureMgr = (function () {        function GestureMgr() {            this._track = [];        }        GestureMgr.prototype.recognize = function (event, target, root) {            this._doTrack(event, target, root);            return this._recognize(event);        };        GestureMgr.prototype.clear = function () {            this._track.length = 0;            return this;        };        GestureMgr.prototype._doTrack = function (event, target, root) {            var touches = event.touches;            if (!touches) {                return;            }            var trackItem = {                points: [],                touches: [],                target: target,                event: event            };            for (var i = 0, len = touches.length; i < len; i++) {                var touch = touches[i];                var pos = clientToLocal(root, touch, {});                trackItem.points.push([pos.zrX, pos.zrY]);                trackItem.touches.push(touch);            }            this._track.push(trackItem);        };        GestureMgr.prototype._recognize = function (event) {            for (var eventName in recognizers) {                if (recognizers.hasOwnProperty(eventName)) {                    var gestureInfo = recognizers[eventName](this._track, event);                    if (gestureInfo) {                        return gestureInfo;                    }                }            }        };        return GestureMgr;    }());    function dist$1(pointPair) {        var dx = pointPair[1][0] - pointPair[0][0];        var dy = pointPair[1][1] - pointPair[0][1];        return Math.sqrt(dx * dx + dy * dy);    }    function center(pointPair) {        return [            (pointPair[0][0] + pointPair[1][0]) / 2,            (pointPair[0][1] + pointPair[1][1]) / 2        ];    }    var recognizers = {        pinch: function (tracks, event) {            var trackLen = tracks.length;            if (!trackLen) {                return;            }            var pinchEnd = (tracks[trackLen - 1] || {}).points;            var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd;            if (pinchPre                && pinchPre.length > 1                && pinchEnd                && pinchEnd.length > 1) {                var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre);                !isFinite(pinchScale) && (pinchScale = 1);                event.pinchScale = pinchScale;                var pinchCenter = center(pinchEnd);                event.pinchX = pinchCenter[0];                event.pinchY = pinchCenter[1];                return {                    type: 'pinch',                    target: tracks[0].target,                    event: event                };            }        }    };    function create$1() {        return [1, 0, 0, 1, 0, 0];    }    function identity(out) {        out[0] = 1;        out[1] = 0;        out[2] = 0;        out[3] = 1;        out[4] = 0;        out[5] = 0;        return out;    }    function copy$1(out, m) {        out[0] = m[0];        out[1] = m[1];        out[2] = m[2];        out[3] = m[3];        out[4] = m[4];        out[5] = m[5];        return out;    }    function mul$1(out, m1, m2) {        var out0 = m1[0] * m2[0] + m1[2] * m2[1];        var out1 = m1[1] * m2[0] + m1[3] * m2[1];        var out2 = m1[0] * m2[2] + m1[2] * m2[3];        var out3 = m1[1] * m2[2] + m1[3] * m2[3];        var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];        var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];        out[0] = out0;        out[1] = out1;        out[2] = out2;        out[3] = out3;        out[4] = out4;        out[5] = out5;        return out;    }    function translate(out, a, v) {        out[0] = a[0];        out[1] = a[1];        out[2] = a[2];        out[3] = a[3];        out[4] = a[4] + v[0];        out[5] = a[5] + v[1];        return out;    }    function rotate(out, a, rad, pivot) {        if (pivot === void 0) { pivot = [0, 0]; }        var aa = a[0];        var ac = a[2];        var atx = a[4];        var ab = a[1];        var ad = a[3];        var aty = a[5];        var st = Math.sin(rad);        var ct = Math.cos(rad);        out[0] = aa * ct + ab * st;        out[1] = -aa * st + ab * ct;        out[2] = ac * ct + ad * st;        out[3] = -ac * st + ct * ad;        out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0];        out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1];        return out;    }    function scale$1(out, a, v) {        var vx = v[0];        var vy = v[1];        out[0] = a[0] * vx;        out[1] = a[1] * vy;        out[2] = a[2] * vx;        out[3] = a[3] * vy;        out[4] = a[4] * vx;        out[5] = a[5] * vy;        return out;    }    function invert(out, a) {        var aa = a[0];        var ac = a[2];        var atx = a[4];        var ab = a[1];        var ad = a[3];        var aty = a[5];        var det = aa * ad - ab * ac;        if (!det) {            return null;        }        det = 1.0 / det;        out[0] = ad * det;        out[1] = -ab * det;        out[2] = -ac * det;        out[3] = aa * det;        out[4] = (ac * aty - ad * atx) * det;        out[5] = (ab * atx - aa * aty) * det;        return out;    }    function clone$2(a) {        var b = create$1();        copy$1(b, a);        return b;    }    var matrix = /*#__PURE__*/Object.freeze({        __proto__: null,        create: create$1,        identity: identity,        copy: copy$1,        mul: mul$1,        translate: translate,        rotate: rotate,        scale: scale$1,        invert: invert,        clone: clone$2    });    var Point = (function () {        function Point(x, y) {            this.x = x || 0;            this.y = y || 0;        }        Point.prototype.copy = function (other) {            this.x = other.x;            this.y = other.y;            return this;        };        Point.prototype.clone = function () {            return new Point(this.x, this.y);        };        Point.prototype.set = function (x, y) {            this.x = x;            this.y = y;            return this;        };        Point.prototype.equal = function (other) {            return other.x === this.x && other.y === this.y;        };        Point.prototype.add = function (other) {            this.x += other.x;            this.y += other.y;            return this;        };        Point.prototype.scale = function (scalar) {            this.x *= scalar;            this.y *= scalar;        };        Point.prototype.scaleAndAdd = function (other, scalar) {            this.x += other.x * scalar;            this.y += other.y * scalar;        };        Point.prototype.sub = function (other) {            this.x -= other.x;            this.y -= other.y;            return this;        };        Point.prototype.dot = function (other) {            return this.x * other.x + this.y * other.y;        };        Point.prototype.len = function () {            return Math.sqrt(this.x * this.x + this.y * this.y);        };        Point.prototype.lenSquare = function () {            return this.x * this.x + this.y * this.y;        };        Point.prototype.normalize = function () {            var len = this.len();            this.x /= len;            this.y /= len;            return this;        };        Point.prototype.distance = function (other) {            var dx = this.x - other.x;            var dy = this.y - other.y;            return Math.sqrt(dx * dx + dy * dy);        };        Point.prototype.distanceSquare = function (other) {            var dx = this.x - other.x;            var dy = this.y - other.y;            return dx * dx + dy * dy;        };        Point.prototype.negate = function () {            this.x = -this.x;            this.y = -this.y;            return this;        };        Point.prototype.transform = function (m) {            if (!m) {                return;            }            var x = this.x;            var y = this.y;            this.x = m[0] * x + m[2] * y + m[4];            this.y = m[1] * x + m[3] * y + m[5];            return this;        };        Point.prototype.toArray = function (out) {            out[0] = this.x;            out[1] = this.y;            return out;        };        Point.prototype.fromArray = function (input) {            this.x = input[0];            this.y = input[1];        };        Point.set = function (p, x, y) {            p.x = x;            p.y = y;        };        Point.copy = function (p, p2) {            p.x = p2.x;            p.y = p2.y;        };        Point.len = function (p) {            return Math.sqrt(p.x * p.x + p.y * p.y);        };        Point.lenSquare = function (p) {            return p.x * p.x + p.y * p.y;        };        Point.dot = function (p0, p1) {            return p0.x * p1.x + p0.y * p1.y;        };        Point.add = function (out, p0, p1) {            out.x = p0.x + p1.x;            out.y = p0.y + p1.y;        };        Point.sub = function (out, p0, p1) {            out.x = p0.x - p1.x;            out.y = p0.y - p1.y;        };        Point.scale = function (out, p0, scalar) {            out.x = p0.x * scalar;            out.y = p0.y * scalar;        };        Point.scaleAndAdd = function (out, p0, p1, scalar) {            out.x = p0.x + p1.x * scalar;            out.y = p0.y + p1.y * scalar;        };        Point.lerp = function (out, p0, p1, t) {            var onet = 1 - t;            out.x = onet * p0.x + t * p1.x;            out.y = onet * p0.y + t * p1.y;        };        return Point;    }());    var mathMin = Math.min;    var mathMax = Math.max;    var lt = new Point();    var rb = new Point();    var lb = new Point();    var rt = new Point();    var minTv = new Point();    var maxTv = new Point();    var BoundingRect = (function () {        function BoundingRect(x, y, width, height) {            if (width < 0) {                x = x + width;                width = -width;            }            if (height < 0) {                y = y + height;                height = -height;            }            this.x = x;            this.y = y;            this.width = width;            this.height = height;        }        BoundingRect.prototype.union = function (other) {            var x = mathMin(other.x, this.x);            var y = mathMin(other.y, this.y);            if (isFinite(this.x) && isFinite(this.width)) {                this.width = mathMax(other.x + other.width, this.x + this.width) - x;            }            else {                this.width = other.width;            }            if (isFinite(this.y) && isFinite(this.height)) {                this.height = mathMax(other.y + other.height, this.y + this.height) - y;            }            else {                this.height = other.height;            }            this.x = x;            this.y = y;        };        BoundingRect.prototype.applyTransform = function (m) {            BoundingRect.applyTransform(this, this, m);        };        BoundingRect.prototype.calculateTransform = function (b) {            var a = this;            var sx = b.width / a.width;            var sy = b.height / a.height;            var m = create$1();            translate(m, m, [-a.x, -a.y]);            scale$1(m, m, [sx, sy]);            translate(m, m, [b.x, b.y]);            return m;        };        BoundingRect.prototype.intersect = function (b, mtv) {            if (!b) {                return false;            }            if (!(b instanceof BoundingRect)) {                b = BoundingRect.create(b);            }            var a = this;            var ax0 = a.x;            var ax1 = a.x + a.width;            var ay0 = a.y;            var ay1 = a.y + a.height;            var bx0 = b.x;            var bx1 = b.x + b.width;            var by0 = b.y;            var by1 = b.y + b.height;            var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);            if (mtv) {                var dMin = Infinity;                var dMax = 0;                var d0 = Math.abs(ax1 - bx0);                var d1 = Math.abs(bx1 - ax0);                var d2 = Math.abs(ay1 - by0);                var d3 = Math.abs(by1 - ay0);                var dx = Math.min(d0, d1);                var dy = Math.min(d2, d3);                if (ax1 < bx0 || bx1 < ax0) {                    if (dx > dMax) {                        dMax = dx;                        if (d0 < d1) {                            Point.set(maxTv, -d0, 0);                        }                        else {                            Point.set(maxTv, d1, 0);                        }                    }                }                else {                    if (dx < dMin) {                        dMin = dx;                        if (d0 < d1) {                            Point.set(minTv, d0, 0);                        }                        else {                            Point.set(minTv, -d1, 0);                        }                    }                }                if (ay1 < by0 || by1 < ay0) {                    if (dy > dMax) {                        dMax = dy;                        if (d2 < d3) {                            Point.set(maxTv, 0, -d2);                        }                        else {                            Point.set(maxTv, 0, d3);                        }                    }                }                else {                    if (dx < dMin) {                        dMin = dx;                        if (d2 < d3) {                            Point.set(minTv, 0, d2);                        }                        else {                            Point.set(minTv, 0, -d3);                        }                    }                }            }            if (mtv) {                Point.copy(mtv, overlap ? minTv : maxTv);            }            return overlap;        };        BoundingRect.prototype.contain = function (x, y) {            var rect = this;            return x >= rect.x                && x <= (rect.x + rect.width)                && y >= rect.y                && y <= (rect.y + rect.height);        };        BoundingRect.prototype.clone = function () {            return new BoundingRect(this.x, this.y, this.width, this.height);        };        BoundingRect.prototype.copy = function (other) {            BoundingRect.copy(this, other);        };        BoundingRect.prototype.plain = function () {            return {                x: this.x,                y: this.y,                width: this.width,                height: this.height            };        };        BoundingRect.prototype.isFinite = function () {            return isFinite(this.x)                && isFinite(this.y)                && isFinite(this.width)                && isFinite(this.height);        };        BoundingRect.prototype.isZero = function () {            return this.width === 0 || this.height === 0;        };        BoundingRect.create = function (rect) {            return new BoundingRect(rect.x, rect.y, rect.width, rect.height);        };        BoundingRect.copy = function (target, source) {            target.x = source.x;            target.y = source.y;            target.width = source.width;            target.height = source.height;        };        BoundingRect.applyTransform = function (target, source, m) {            if (!m) {                if (target !== source) {                    BoundingRect.copy(target, source);                }                return;            }            if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) {                var sx = m[0];                var sy = m[3];                var tx = m[4];                var ty = m[5];                target.x = source.x * sx + tx;                target.y = source.y * sy + ty;                target.width = source.width * sx;                target.height = source.height * sy;                if (target.width < 0) {                    target.x += target.width;                    target.width = -target.width;                }                if (target.height < 0) {                    target.y += target.height;                    target.height = -target.height;                }                return;            }            lt.x = lb.x = source.x;            lt.y = rt.y = source.y;            rb.x = rt.x = source.x + source.width;            rb.y = lb.y = source.y + source.height;            lt.transform(m);            rt.transform(m);            rb.transform(m);            lb.transform(m);            target.x = mathMin(lt.x, rb.x, lb.x, rt.x);            target.y = mathMin(lt.y, rb.y, lb.y, rt.y);            var maxX = mathMax(lt.x, rb.x, lb.x, rt.x);            var maxY = mathMax(lt.y, rb.y, lb.y, rt.y);            target.width = maxX - target.x;            target.height = maxY - target.y;        };        return BoundingRect;    }());    var SILENT = 'silent';    function makeEventPacket(eveType, targetInfo, event) {        return {            type: eveType,            event: event,            target: targetInfo.target,            topTarget: targetInfo.topTarget,            cancelBubble: false,            offsetX: event.zrX,            offsetY: event.zrY,            gestureEvent: event.gestureEvent,            pinchX: event.pinchX,            pinchY: event.pinchY,            pinchScale: event.pinchScale,            wheelDelta: event.zrDelta,            zrByTouch: event.zrByTouch,            which: event.which,            stop: stopEvent        };    }    function stopEvent() {        stop(this.event);    }    var EmptyProxy = (function (_super) {        __extends(EmptyProxy, _super);        function EmptyProxy() {            var _this = _super !== null && _super.apply(this, arguments) || this;            _this.handler = null;            return _this;        }        EmptyProxy.prototype.dispose = function () { };        EmptyProxy.prototype.setCursor = function () { };        return EmptyProxy;    }(Eventful));    var HoveredResult = (function () {        function HoveredResult(x, y) {            this.x = x;            this.y = y;        }        return HoveredResult;    }());    var handlerNames = [        'click', 'dblclick', 'mousewheel', 'mouseout',        'mouseup', 'mousedown', 'mousemove', 'contextmenu'    ];    var tmpRect = new BoundingRect(0, 0, 0, 0);    var Handler = (function (_super) {        __extends(Handler, _super);        function Handler(storage, painter, proxy, painterRoot, pointerSize) {            var _this = _super.call(this) || this;            _this._hovered = new HoveredResult(0, 0);            _this.storage = storage;            _this.painter = painter;            _this.painterRoot = painterRoot;            _this._pointerSize = pointerSize;            proxy = proxy || new EmptyProxy();            _this.proxy = null;            _this.setHandlerProxy(proxy);            _this._draggingMgr = new Draggable(_this);            return _this;        }        Handler.prototype.setHandlerProxy = function (proxy) {            if (this.proxy) {                this.proxy.dispose();            }            if (proxy) {                each(handlerNames, function (name) {                    proxy.on && proxy.on(name, this[name], this);                }, this);                proxy.handler = this;            }            this.proxy = proxy;        };        Handler.prototype.mousemove = function (event) {            var x = event.zrX;            var y = event.zrY;            var isOutside = isOutsideBoundary(this, x, y);            var lastHovered = this._hovered;            var lastHoveredTarget = lastHovered.target;            if (lastHoveredTarget && !lastHoveredTarget.__zr) {                lastHovered = this.findHover(lastHovered.x, lastHovered.y);                lastHoveredTarget = lastHovered.target;            }            var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y);            var hoveredTarget = hovered.target;            var proxy = this.proxy;            proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default');            if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {                this.dispatchToElement(lastHovered, 'mouseout', event);            }            this.dispatchToElement(hovered, 'mousemove', event);            if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {                this.dispatchToElement(hovered, 'mouseover', event);            }        };        Handler.prototype.mouseout = function (event) {            var eventControl = event.zrEventControl;            if (eventControl !== 'only_globalout') {                this.dispatchToElement(this._hovered, 'mouseout', event);            }            if (eventControl !== 'no_globalout') {                this.trigger('globalout', { type: 'globalout', event: event });            }        };        Handler.prototype.resize = function () {            this._hovered = new HoveredResult(0, 0);        };        Handler.prototype.dispatch = function (eventName, eventArgs) {            var handler = this[eventName];            handler && handler.call(this, eventArgs);        };        Handler.prototype.dispose = function () {            this.proxy.dispose();            this.storage = null;            this.proxy = null;            this.painter = null;        };        Handler.prototype.setCursorStyle = function (cursorStyle) {            var proxy = this.proxy;            proxy.setCursor && proxy.setCursor(cursorStyle);        };        Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) {            targetInfo = targetInfo || {};            var el = targetInfo.target;            if (el && el.silent) {                return;            }            var eventKey = ('on' + eventName);            var eventPacket = makeEventPacket(eventName, targetInfo, event);            while (el) {                el[eventKey]                    && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket));                el.trigger(eventName, eventPacket);                el = el.__hostTarget ? el.__hostTarget : el.parent;                if (eventPacket.cancelBubble) {                    break;                }            }            if (!eventPacket.cancelBubble) {                this.trigger(eventName, eventPacket);                if (this.painter && this.painter.eachOtherLayer) {                    this.painter.eachOtherLayer(function (layer) {                        if (typeof (layer[eventKey]) === 'function') {                            layer[eventKey].call(layer, eventPacket);                        }                        if (layer.trigger) {                            layer.trigger(eventName, eventPacket);                        }                    });                }            }        };        Handler.prototype.findHover = function (x, y, exclude) {            var list = this.storage.getDisplayList();            var out = new HoveredResult(x, y);            setHoverTarget(list, out, x, y, exclude);            if (this._pointerSize && !out.target) {                var candidates = [];                var pointerSize = this._pointerSize;                var targetSizeHalf = pointerSize / 2;                var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize);                for (var i = list.length - 1; i >= 0; i--) {                    var el = list[i];                    if (el !== exclude                        && !el.ignore                        && !el.ignoreCoarsePointer                        && (!el.parent || !el.parent.ignoreCoarsePointer)) {                        tmpRect.copy(el.getBoundingRect());                        if (el.transform) {                            tmpRect.applyTransform(el.transform);                        }                        if (tmpRect.intersect(pointerRect)) {                            candidates.push(el);                        }                    }                }                if (candidates.length) {                    var rStep = 4;                    var thetaStep = Math.PI / 12;                    var PI2 = Math.PI * 2;                    for (var r = 0; r < targetSizeHalf; r += rStep) {                        for (var theta = 0; theta < PI2; theta += thetaStep) {                            var x1 = x + r * Math.cos(theta);                            var y1 = y + r * Math.sin(theta);                            setHoverTarget(candidates, out, x1, y1, exclude);                            if (out.target) {                                return out;                            }                        }                    }                }            }            return out;        };        Handler.prototype.processGesture = function (event, stage) {            if (!this._gestureMgr) {                this._gestureMgr = new GestureMgr();            }            var gestureMgr = this._gestureMgr;            stage === 'start' && gestureMgr.clear();            var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom);            stage === 'end' && gestureMgr.clear();            if (gestureInfo) {                var type = gestureInfo.type;                event.gestureEvent = type;                var res = new HoveredResult();                res.target = gestureInfo.target;                this.dispatchToElement(res, type, gestureInfo.event);            }        };        return Handler;    }(Eventful));    each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {        Handler.prototype[name] = function (event) {            var x = event.zrX;            var y = event.zrY;            var isOutside = isOutsideBoundary(this, x, y);            var hovered;            var hoveredTarget;            if (name !== 'mouseup' || !isOutside) {                hovered = this.findHover(x, y);                hoveredTarget = hovered.target;            }            if (name === 'mousedown') {                this._downEl = hoveredTarget;                this._downPoint = [event.zrX, event.zrY];                this._upEl = hoveredTarget;            }            else if (name === 'mouseup') {                this._upEl = hoveredTarget;            }            else if (name === 'click') {                if (this._downEl !== this._upEl                    || !this._downPoint                    || dist(this._downPoint, [event.zrX, event.zrY]) > 4) {                    return;                }                this._downPoint = null;            }            this.dispatchToElement(hovered, name, event);        };    });    function isHover(displayable, x, y) {        if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {            var el = displayable;            var isSilent = void 0;            var ignoreClip = false;            while (el) {                if (el.ignoreClip) {                    ignoreClip = true;                }                if (!ignoreClip) {                    var clipPath = el.getClipPath();                    if (clipPath && !clipPath.contain(x, y)) {                        return false;                    }                }                if (el.silent) {                    isSilent = true;                }                var hostEl = el.__hostTarget;                el = hostEl ? hostEl : el.parent;            }            return isSilent ? SILENT : true;        }        return false;    }    function setHoverTarget(list, out, x, y, exclude) {        for (var i = list.length - 1; i >= 0; i--) {            var el = list[i];            var hoverCheckResult = void 0;            if (el !== exclude                && !el.ignore                && (hoverCheckResult = isHover(el, x, y))) {                !out.topTarget && (out.topTarget = el);                if (hoverCheckResult !== SILENT) {                    out.target = el;                    break;                }            }        }    }    function isOutsideBoundary(handlerInstance, x, y) {        var painter = handlerInstance.painter;        return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight();    }    var DEFAULT_MIN_MERGE = 32;    var DEFAULT_MIN_GALLOPING = 7;    function minRunLength(n) {        var r = 0;        while (n >= DEFAULT_MIN_MERGE) {            r |= n & 1;            n >>= 1;        }        return n + r;    }    function makeAscendingRun(array, lo, hi, compare) {        var runHi = lo + 1;        if (runHi === hi) {            return 1;        }        if (compare(array[runHi++], array[lo]) < 0) {            while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {                runHi++;            }            reverseRun(array, lo, runHi);        }        else {            while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {                runHi++;            }        }        return runHi - lo;    }    function reverseRun(array, lo, hi) {        hi--;        while (lo < hi) {            var t = array[lo];            array[lo++] = array[hi];            array[hi--] = t;        }    }    function binaryInsertionSort(array, lo, hi, start, compare) {        if (start === lo) {            start++;        }        for (; start < hi; start++) {            var pivot = array[start];            var left = lo;            var right = start;            var mid;            while (left < right) {                mid = left + right >>> 1;                if (compare(pivot, array[mid]) < 0) {                    right = mid;                }                else {                    left = mid + 1;                }            }            var n = start - left;            switch (n) {                case 3:                    array[left + 3] = array[left + 2];                case 2:                    array[left + 2] = array[left + 1];                case 1:                    array[left + 1] = array[left];                    break;                default:                    while (n > 0) {                        array[left + n] = array[left + n - 1];                        n--;                    }            }            array[left] = pivot;        }    }    function gallopLeft(value, array, start, length, hint, compare) {        var lastOffset = 0;        var maxOffset = 0;        var offset = 1;        if (compare(value, array[start + hint]) > 0) {            maxOffset = length - hint;            while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {                lastOffset = offset;                offset = (offset << 1) + 1;                if (offset <= 0) {                    offset = maxOffset;                }            }            if (offset > maxOffset) {                offset = maxOffset;            }            lastOffset += hint;            offset += hint;        }        else {            maxOffset = hint + 1;            while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {                lastOffset = offset;                offset = (offset << 1) + 1;                if (offset <= 0) {                    offset = maxOffset;                }            }            if (offset > maxOffset) {                offset = maxOffset;            }            var tmp = lastOffset;            lastOffset = hint - offset;            offset = hint - tmp;        }        lastOffset++;        while (lastOffset < offset) {            var m = lastOffset + (offset - lastOffset >>> 1);            if (compare(value, array[start + m]) > 0) {                lastOffset = m + 1;            }            else {                offset = m;            }        }        return offset;    }    function gallopRight(value, array, start, length, hint, compare) {        var lastOffset = 0;        var maxOffset = 0;        var offset = 1;        if (compare(value, array[start + hint]) < 0) {            maxOffset = hint + 1;            while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {                lastOffset = offset;                offset = (offset << 1) + 1;                if (offset <= 0) {                    offset = maxOffset;                }            }            if (offset > maxOffset) {                offset = maxOffset;            }            var tmp = lastOffset;            lastOffset = hint - offset;            offset = hint - tmp;        }        else {            maxOffset = length - hint;            while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {                lastOffset = offset;                offset = (offset << 1) + 1;                if (offset <= 0) {                    offset = maxOffset;                }            }            if (offset > maxOffset) {                offset = maxOffset;            }            lastOffset += hint;            offset += hint;        }        lastOffset++;        while (lastOffset < offset) {            var m = lastOffset + (offset - lastOffset >>> 1);            if (compare(value, array[start + m]) < 0) {                offset = m;            }            else {                lastOffset = m + 1;            }        }        return offset;    }    function TimSort(array, compare) {        var minGallop = DEFAULT_MIN_GALLOPING;        var runStart;        var runLength;        var stackSize = 0;        var tmp = [];        runStart = [];        runLength = [];        function pushRun(_runStart, _runLength) {            runStart[stackSize] = _runStart;            runLength[stackSize] = _runLength;            stackSize += 1;        }        function mergeRuns() {            while (stackSize > 1) {                var n = stackSize - 2;                if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1])                    || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) {                    if (runLength[n - 1] < runLength[n + 1]) {                        n--;                    }                }                else if (runLength[n] > runLength[n + 1]) {                    break;                }                mergeAt(n);            }        }        function forceMergeRuns() {            while (stackSize > 1) {                var n = stackSize - 2;                if (n > 0 && runLength[n - 1] < runLength[n + 1]) {                    n--;                }                mergeAt(n);            }        }        function mergeAt(i) {            var start1 = runStart[i];            var length1 = runLength[i];            var start2 = runStart[i + 1];            var length2 = runLength[i + 1];            runLength[i] = length1 + length2;            if (i === stackSize - 3) {                runStart[i + 1] = runStart[i + 2];                runLength[i + 1] = runLength[i + 2];            }            stackSize--;            var k = gallopRight(array[start2], array, start1, length1, 0, compare);            start1 += k;            length1 -= k;            if (length1 === 0) {                return;            }            length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);            if (length2 === 0) {                return;            }            if (length1 <= length2) {                mergeLow(start1, length1, start2, length2);            }            else {                mergeHigh(start1, length1, start2, length2);            }        }        function mergeLow(start1, length1, start2, length2) {            var i = 0;            for (i = 0; i < length1; i++) {                tmp[i] = array[start1 + i];            }            var cursor1 = 0;            var cursor2 = start2;            var dest = start1;            array[dest++] = array[cursor2++];            if (--length2 === 0) {                for (i = 0; i < length1; i++) {                    array[dest + i] = tmp[cursor1 + i];                }                return;            }            if (length1 === 1) {                for (i = 0; i < length2; i++) {                    array[dest + i] = array[cursor2 + i];                }                array[dest + length2] = tmp[cursor1];                return;            }            var _minGallop = minGallop;            var count1;            var count2;            var exit;            while (1) {                count1 = 0;                count2 = 0;                exit = false;                do {                    if (compare(array[cursor2], tmp[cursor1]) < 0) {                        array[dest++] = array[cursor2++];                        count2++;                        count1 = 0;                        if (--length2 === 0) {                            exit = true;                            break;                        }                    }                    else {                        array[dest++] = tmp[cursor1++];                        count1++;                        count2 = 0;                        if (--length1 === 1) {                            exit = true;                            break;                        }                    }                } while ((count1 | count2) < _minGallop);                if (exit) {                    break;                }                do {                    count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);                    if (count1 !== 0) {                        for (i = 0; i < count1; i++) {                            array[dest + i] = tmp[cursor1 + i];                        }                        dest += count1;                        cursor1 += count1;                        length1 -= count1;                        if (length1 <= 1) {                            exit = true;                            break;                        }                    }                    array[dest++] = array[cursor2++];                    if (--length2 === 0) {                        exit = true;                        break;                    }                    count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);                    if (count2 !== 0) {                        for (i = 0; i < count2; i++) {                            array[dest + i] = array[cursor2 + i];                        }                        dest += count2;                        cursor2 += count2;                        length2 -= count2;                        if (length2 === 0) {                            exit = true;                            break;                        }                    }                    array[dest++] = tmp[cursor1++];                    if (--length1 === 1) {                        exit = true;                        break;                    }                    _minGallop--;                } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);                if (exit) {                    break;                }                if (_minGallop < 0) {                    _minGallop = 0;                }                _minGallop += 2;            }            minGallop = _minGallop;            minGallop < 1 && (minGallop = 1);            if (length1 === 1) {                for (i = 0; i < length2; i++) {                    array[dest + i] = array[cursor2 + i];                }                array[dest + length2] = tmp[cursor1];            }            else if (length1 === 0) {                throw new Error();            }            else {                for (i = 0; i < length1; i++) {                    array[dest + i] = tmp[cursor1 + i];                }            }        }        function mergeHigh(start1, length1, start2, length2) {            var i = 0;            for (i = 0; i < length2; i++) {                tmp[i] = array[start2 + i];            }            var cursor1 = start1 + length1 - 1;            var cursor2 = length2 - 1;            var dest = start2 + length2 - 1;            var customCursor = 0;            var customDest = 0;            array[dest--] = array[cursor1--];            if (--length1 === 0) {                customCursor = dest - (length2 - 1);                for (i = 0; i < length2; i++) {                    array[customCursor + i] = tmp[i];                }                return;            }            if (length2 === 1) {                dest -= length1;                cursor1 -= length1;                customDest = dest + 1;                customCursor = cursor1 + 1;                for (i = length1 - 1; i >= 0; i--) {                    array[customDest + i] = array[customCursor + i];                }                array[dest] = tmp[cursor2];                return;            }            var _minGallop = minGallop;            while (true) {                var count1 = 0;                var count2 = 0;                var exit = false;                do {                    if (compare(tmp[cursor2], array[cursor1]) < 0) {                        array[dest--] = array[cursor1--];                        count1++;                        count2 = 0;                        if (--length1 === 0) {                            exit = true;                            break;                        }                    }                    else {                        array[dest--] = tmp[cursor2--];                        count2++;                        count1 = 0;                        if (--length2 === 1) {                            exit = true;                            break;                        }                    }                } while ((count1 | count2) < _minGallop);                if (exit) {                    break;                }                do {                    count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);                    if (count1 !== 0) {                        dest -= count1;                        cursor1 -= count1;                        length1 -= count1;                        customDest = dest + 1;                        customCursor = cursor1 + 1;                        for (i = count1 - 1; i >= 0; i--) {                            array[customDest + i] = array[customCursor + i];                        }                        if (length1 === 0) {                            exit = true;                            break;                        }                    }                    array[dest--] = tmp[cursor2--];                    if (--length2 === 1) {                        exit = true;                        break;                    }                    count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);                    if (count2 !== 0) {                        dest -= count2;                        cursor2 -= count2;                        length2 -= count2;                        customDest = dest + 1;                        customCursor = cursor2 + 1;                        for (i = 0; i < count2; i++) {                            array[customDest + i] = tmp[customCursor + i];                        }                        if (length2 <= 1) {                            exit = true;                            break;                        }                    }                    array[dest--] = array[cursor1--];                    if (--length1 === 0) {                        exit = true;                        break;                    }                    _minGallop--;                } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);                if (exit) {                    break;                }                if (_minGallop < 0) {                    _minGallop = 0;                }                _minGallop += 2;            }            minGallop = _minGallop;            if (minGallop < 1) {                minGallop = 1;            }            if (length2 === 1) {                dest -= length1;                cursor1 -= length1;                customDest = dest + 1;                customCursor = cursor1 + 1;                for (i = length1 - 1; i >= 0; i--) {                    array[customDest + i] = array[customCursor + i];                }                array[dest] = tmp[cursor2];            }            else if (length2 === 0) {                throw new Error();            }            else {                customCursor = dest - (length2 - 1);                for (i = 0; i < length2; i++) {                    array[customCursor + i] = tmp[i];                }            }        }        return {            mergeRuns: mergeRuns,            forceMergeRuns: forceMergeRuns,            pushRun: pushRun        };    }    function sort(array, compare, lo, hi) {        if (!lo) {            lo = 0;        }        if (!hi) {            hi = array.length;        }        var remaining = hi - lo;        if (remaining < 2) {            return;        }        var runLength = 0;        if (remaining < DEFAULT_MIN_MERGE) {            runLength = makeAscendingRun(array, lo, hi, compare);            binaryInsertionSort(array, lo, hi, lo + runLength, compare);            return;        }        var ts = TimSort(array, compare);        var minRun = minRunLength(remaining);        do {            runLength = makeAscendingRun(array, lo, hi, compare);            if (runLength < minRun) {                var force = remaining;                if (force > minRun) {                    force = minRun;                }                binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);                runLength = force;            }            ts.pushRun(lo, runLength);            ts.mergeRuns();            remaining -= runLength;            lo += runLength;        } while (remaining !== 0);        ts.forceMergeRuns();    }    var REDRAW_BIT = 1;    var STYLE_CHANGED_BIT = 2;    var SHAPE_CHANGED_BIT = 4;    var invalidZErrorLogged = false;    function logInvalidZError() {        if (invalidZErrorLogged) {            return;        }        invalidZErrorLogged = true;        console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors');    }    function shapeCompareFunc(a, b) {        if (a.zlevel === b.zlevel) {            if (a.z === b.z) {                return a.z2 - b.z2;            }            return a.z - b.z;        }        return a.zlevel - b.zlevel;    }    var Storage = (function () {        function Storage() {            this._roots = [];            this._displayList = [];            this._displayListLen = 0;            this.displayableSortFunc = shapeCompareFunc;        }        Storage.prototype.traverse = function (cb, context) {            for (var i = 0; i < this._roots.length; i++) {                this._roots[i].traverse(cb, context);            }        };        Storage.prototype.getDisplayList = function (update, includeIgnore) {            includeIgnore = includeIgnore || false;            var displayList = this._displayList;            if (update || !displayList.length) {                this.updateDisplayList(includeIgnore);            }            return displayList;        };        Storage.prototype.updateDisplayList = function (includeIgnore) {            this._displayListLen = 0;            var roots = this._roots;            var displayList = this._displayList;            for (var i = 0, len = roots.length; i < len; i++) {                this._updateAndAddDisplayable(roots[i], null, includeIgnore);            }            displayList.length = this._displayListLen;            sort(displayList, shapeCompareFunc);        };        Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) {            if (el.ignore && !includeIgnore) {                return;            }            el.beforeUpdate();            el.update();            el.afterUpdate();            var userSetClipPath = el.getClipPath();            if (el.ignoreClip) {                clipPaths = null;            }            else if (userSetClipPath) {                if (clipPaths) {                    clipPaths = clipPaths.slice();                }                else {                    clipPaths = [];                }                var currentClipPath = userSetClipPath;                var parentClipPath = el;                while (currentClipPath) {                    currentClipPath.parent = parentClipPath;                    currentClipPath.updateTransform();                    clipPaths.push(currentClipPath);                    parentClipPath = currentClipPath;                    currentClipPath = currentClipPath.getClipPath();                }            }            if (el.childrenRef) {                var children = el.childrenRef();                for (var i = 0; i < children.length; i++) {                    var child = children[i];                    if (el.__dirty) {                        child.__dirty |= REDRAW_BIT;                    }                    this._updateAndAddDisplayable(child, clipPaths, includeIgnore);                }                el.__dirty = 0;            }            else {                var disp = el;                if (clipPaths && clipPaths.length) {                    disp.__clipPaths = clipPaths;                }                else if (disp.__clipPaths && disp.__clipPaths.length > 0) {                    disp.__clipPaths = [];                }                if (isNaN(disp.z)) {                    logInvalidZError();                    disp.z = 0;                }                if (isNaN(disp.z2)) {                    logInvalidZError();                    disp.z2 = 0;                }                if (isNaN(disp.zlevel)) {                    logInvalidZError();                    disp.zlevel = 0;                }                this._displayList[this._displayListLen++] = disp;            }            var decalEl = el.getDecalElement && el.getDecalElement();            if (decalEl) {                this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore);            }            var textGuide = el.getTextGuideLine();            if (textGuide) {                this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore);            }            var textEl = el.getTextContent();            if (textEl) {                this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore);            }        };        Storage.prototype.addRoot = function (el) {            if (el.__zr && el.__zr.storage === this) {                return;            }            this._roots.push(el);        };        Storage.prototype.delRoot = function (el) {            if (el instanceof Array) {                for (var i = 0, l = el.length; i < l; i++) {                    this.delRoot(el[i]);                }                return;            }            var idx = indexOf(this._roots, el);            if (idx >= 0) {                this._roots.splice(idx, 1);            }        };        Storage.prototype.delAllRoots = function () {            this._roots = [];            this._displayList = [];            this._displayListLen = 0;            return;        };        Storage.prototype.getRoots = function () {            return this._roots;        };        Storage.prototype.dispose = function () {            this._displayList = null;            this._roots = null;        };        return Storage;    }());    var requestAnimationFrame;    requestAnimationFrame = (env.hasGlobalWindow        && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window))            || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window))            || window.mozRequestAnimationFrame            || window.webkitRequestAnimationFrame)) || function (func) {        return setTimeout(func, 16);    };    var requestAnimationFrame$1 = requestAnimationFrame;    var easingFuncs = {        linear: function (k) {            return k;        },        quadraticIn: function (k) {            return k * k;        },        quadraticOut: function (k) {            return k * (2 - k);        },        quadraticInOut: function (k) {            if ((k *= 2) < 1) {                return 0.5 * k * k;            }            return -0.5 * (--k * (k - 2) - 1);        },        cubicIn: function (k) {            return k * k * k;        },        cubicOut: function (k) {            return --k * k * k + 1;        },        cubicInOut: function (k) {            if ((k *= 2) < 1) {                return 0.5 * k * k * k;            }            return 0.5 * ((k -= 2) * k * k + 2);        },        quarticIn: function (k) {            return k * k * k * k;        },        quarticOut: function (k) {            return 1 - (--k * k * k * k);        },        quarticInOut: function (k) {            if ((k *= 2) < 1) {                return 0.5 * k * k * k * k;            }            return -0.5 * ((k -= 2) * k * k * k - 2);        },        quinticIn: function (k) {            return k * k * k * k * k;        },        quinticOut: function (k) {            return --k * k * k * k * k + 1;        },        quinticInOut: function (k) {            if ((k *= 2) < 1) {                return 0.5 * k * k * k * k * k;            }            return 0.5 * ((k -= 2) * k * k * k * k + 2);        },        sinusoidalIn: function (k) {            return 1 - Math.cos(k * Math.PI / 2);        },        sinusoidalOut: function (k) {            return Math.sin(k * Math.PI / 2);        },        sinusoidalInOut: function (k) {            return 0.5 * (1 - Math.cos(Math.PI * k));        },        exponentialIn: function (k) {            return k === 0 ? 0 : Math.pow(1024, k - 1);        },        exponentialOut: function (k) {            return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);        },        exponentialInOut: function (k) {            if (k === 0) {                return 0;            }            if (k === 1) {                return 1;            }            if ((k *= 2) < 1) {                return 0.5 * Math.pow(1024, k - 1);            }            return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);        },        circularIn: function (k) {            return 1 - Math.sqrt(1 - k * k);        },        circularOut: function (k) {            return Math.sqrt(1 - (--k * k));        },        circularInOut: function (k) {            if ((k *= 2) < 1) {                return -0.5 * (Math.sqrt(1 - k * k) - 1);            }            return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);        },        elasticIn: function (k) {            var s;            var a = 0.1;            var p = 0.4;            if (k === 0) {                return 0;            }            if (k === 1) {                return 1;            }            if (!a || a < 1) {                a = 1;                s = p / 4;            }            else {                s = p * Math.asin(1 / a) / (2 * Math.PI);            }            return -(a * Math.pow(2, 10 * (k -= 1))                * Math.sin((k - s) * (2 * Math.PI) / p));        },        elasticOut: function (k) {            var s;            var a = 0.1;            var p = 0.4;            if (k === 0) {                return 0;            }            if (k === 1) {                return 1;            }            if (!a || a < 1) {                a = 1;                s = p / 4;            }            else {                s = p * Math.asin(1 / a) / (2 * Math.PI);            }            return (a * Math.pow(2, -10 * k)                * Math.sin((k - s) * (2 * Math.PI) / p) + 1);        },        elasticInOut: function (k) {            var s;            var a = 0.1;            var p = 0.4;            if (k === 0) {                return 0;            }            if (k === 1) {                return 1;            }            if (!a || a < 1) {                a = 1;                s = p / 4;            }            else {                s = p * Math.asin(1 / a) / (2 * Math.PI);            }            if ((k *= 2) < 1) {                return -0.5 * (a * Math.pow(2, 10 * (k -= 1))                    * Math.sin((k - s) * (2 * Math.PI) / p));            }            return a * Math.pow(2, -10 * (k -= 1))                * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;        },        backIn: function (k) {            var s = 1.70158;            return k * k * ((s + 1) * k - s);        },        backOut: function (k) {            var s = 1.70158;            return --k * k * ((s + 1) * k + s) + 1;        },        backInOut: function (k) {            var s = 1.70158 * 1.525;            if ((k *= 2) < 1) {                return 0.5 * (k * k * ((s + 1) * k - s));            }            return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);        },        bounceIn: function (k) {            return 1 - easingFuncs.bounceOut(1 - k);        },        bounceOut: function (k) {            if (k < (1 / 2.75)) {                return 7.5625 * k * k;            }            else if (k < (2 / 2.75)) {                return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75;            }            else if (k < (2.5 / 2.75)) {                return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375;            }            else {                return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375;            }        },        bounceInOut: function (k) {            if (k < 0.5) {                return easingFuncs.bounceIn(k * 2) * 0.5;            }            return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5;        }    };    var mathPow = Math.pow;    var mathSqrt = Math.sqrt;    var EPSILON = 1e-8;    var EPSILON_NUMERIC = 1e-4;    var THREE_SQRT = mathSqrt(3);    var ONE_THIRD = 1 / 3;    var _v0 = create();    var _v1 = create();    var _v2 = create();    function isAroundZero(val) {        return val > -EPSILON && val < EPSILON;    }    function isNotAroundZero(val) {        return val > EPSILON || val < -EPSILON;    }    function cubicAt(p0, p1, p2, p3, t) {        var onet = 1 - t;        return onet * onet * (onet * p0 + 3 * t * p1)            + t * t * (t * p3 + 3 * onet * p2);    }    function cubicDerivativeAt(p0, p1, p2, p3, t) {        var onet = 1 - t;        return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet            + (p3 - p2) * t * t);    }    function cubicRootAt(p0, p1, p2, p3, val, roots) {        var a = p3 + 3 * (p1 - p2) - p0;        var b = 3 * (p2 - p1 * 2 + p0);        var c = 3 * (p1 - p0);        var d = p0 - val;        var A = b * b - 3 * a * c;        var B = b * c - 9 * a * d;        var C = c * c - 3 * b * d;        var n = 0;        if (isAroundZero(A) && isAroundZero(B)) {            if (isAroundZero(b)) {                roots[0] = 0;            }            else {                var t1 = -c / b;                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }            }        }        else {            var disc = B * B - 4 * A * C;            if (isAroundZero(disc)) {                var K = B / A;                var t1 = -b / a + K;                var t2 = -K / 2;                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }                if (t2 >= 0 && t2 <= 1) {                    roots[n++] = t2;                }            }            else if (disc > 0) {                var discSqrt = mathSqrt(disc);                var Y1 = A * b + 1.5 * a * (-B + discSqrt);                var Y2 = A * b + 1.5 * a * (-B - discSqrt);                if (Y1 < 0) {                    Y1 = -mathPow(-Y1, ONE_THIRD);                }                else {                    Y1 = mathPow(Y1, ONE_THIRD);                }                if (Y2 < 0) {                    Y2 = -mathPow(-Y2, ONE_THIRD);                }                else {                    Y2 = mathPow(Y2, ONE_THIRD);                }                var t1 = (-b - (Y1 + Y2)) / (3 * a);                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }            }            else {                var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A));                var theta = Math.acos(T) / 3;                var ASqrt = mathSqrt(A);                var tmp = Math.cos(theta);                var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);                var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);                var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }                if (t2 >= 0 && t2 <= 1) {                    roots[n++] = t2;                }                if (t3 >= 0 && t3 <= 1) {                    roots[n++] = t3;                }            }        }        return n;    }    function cubicExtrema(p0, p1, p2, p3, extrema) {        var b = 6 * p2 - 12 * p1 + 6 * p0;        var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;        var c = 3 * p1 - 3 * p0;        var n = 0;        if (isAroundZero(a)) {            if (isNotAroundZero(b)) {                var t1 = -c / b;                if (t1 >= 0 && t1 <= 1) {                    extrema[n++] = t1;                }            }        }        else {            var disc = b * b - 4 * a * c;            if (isAroundZero(disc)) {                extrema[0] = -b / (2 * a);            }            else if (disc > 0) {                var discSqrt = mathSqrt(disc);                var t1 = (-b + discSqrt) / (2 * a);                var t2 = (-b - discSqrt) / (2 * a);                if (t1 >= 0 && t1 <= 1) {                    extrema[n++] = t1;                }                if (t2 >= 0 && t2 <= 1) {                    extrema[n++] = t2;                }            }        }        return n;    }    function cubicSubdivide(p0, p1, p2, p3, t, out) {        var p01 = (p1 - p0) * t + p0;        var p12 = (p2 - p1) * t + p1;        var p23 = (p3 - p2) * t + p2;        var p012 = (p12 - p01) * t + p01;        var p123 = (p23 - p12) * t + p12;        var p0123 = (p123 - p012) * t + p012;        out[0] = p0;        out[1] = p01;        out[2] = p012;        out[3] = p0123;        out[4] = p0123;        out[5] = p123;        out[6] = p23;        out[7] = p3;    }    function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {        var t;        var interval = 0.005;        var d = Infinity;        var prev;        var next;        var d1;        var d2;        _v0[0] = x;        _v0[1] = y;        for (var _t = 0; _t < 1; _t += 0.05) {            _v1[0] = cubicAt(x0, x1, x2, x3, _t);            _v1[1] = cubicAt(y0, y1, y2, y3, _t);            d1 = distSquare(_v0, _v1);            if (d1 < d) {                t = _t;                d = d1;            }        }        d = Infinity;        for (var i = 0; i < 32; i++) {            if (interval < EPSILON_NUMERIC) {                break;            }            prev = t - interval;            next = t + interval;            _v1[0] = cubicAt(x0, x1, x2, x3, prev);            _v1[1] = cubicAt(y0, y1, y2, y3, prev);            d1 = distSquare(_v1, _v0);            if (prev >= 0 && d1 < d) {                t = prev;                d = d1;            }            else {                _v2[0] = cubicAt(x0, x1, x2, x3, next);                _v2[1] = cubicAt(y0, y1, y2, y3, next);                d2 = distSquare(_v2, _v0);                if (next <= 1 && d2 < d) {                    t = next;                    d = d2;                }                else {                    interval *= 0.5;                }            }        }        if (out) {            out[0] = cubicAt(x0, x1, x2, x3, t);            out[1] = cubicAt(y0, y1, y2, y3, t);        }        return mathSqrt(d);    }    function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) {        var px = x0;        var py = y0;        var d = 0;        var step = 1 / iteration;        for (var i = 1; i <= iteration; i++) {            var t = i * step;            var x = cubicAt(x0, x1, x2, x3, t);            var y = cubicAt(y0, y1, y2, y3, t);            var dx = x - px;            var dy = y - py;            d += Math.sqrt(dx * dx + dy * dy);            px = x;            py = y;        }        return d;    }    function quadraticAt(p0, p1, p2, t) {        var onet = 1 - t;        return onet * (onet * p0 + 2 * t * p1) + t * t * p2;    }    function quadraticDerivativeAt(p0, p1, p2, t) {        return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));    }    function quadraticRootAt(p0, p1, p2, val, roots) {        var a = p0 - 2 * p1 + p2;        var b = 2 * (p1 - p0);        var c = p0 - val;        var n = 0;        if (isAroundZero(a)) {            if (isNotAroundZero(b)) {                var t1 = -c / b;                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }            }        }        else {            var disc = b * b - 4 * a * c;            if (isAroundZero(disc)) {                var t1 = -b / (2 * a);                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }            }            else if (disc > 0) {                var discSqrt = mathSqrt(disc);                var t1 = (-b + discSqrt) / (2 * a);                var t2 = (-b - discSqrt) / (2 * a);                if (t1 >= 0 && t1 <= 1) {                    roots[n++] = t1;                }                if (t2 >= 0 && t2 <= 1) {                    roots[n++] = t2;                }            }        }        return n;    }    function quadraticExtremum(p0, p1, p2) {        var divider = p0 + p2 - 2 * p1;        if (divider === 0) {            return 0.5;        }        else {            return (p0 - p1) / divider;        }    }    function quadraticSubdivide(p0, p1, p2, t, out) {        var p01 = (p1 - p0) * t + p0;        var p12 = (p2 - p1) * t + p1;        var p012 = (p12 - p01) * t + p01;        out[0] = p0;        out[1] = p01;        out[2] = p012;        out[3] = p012;        out[4] = p12;        out[5] = p2;    }    function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {        var t;        var interval = 0.005;        var d = Infinity;        _v0[0] = x;        _v0[1] = y;        for (var _t = 0; _t < 1; _t += 0.05) {            _v1[0] = quadraticAt(x0, x1, x2, _t);            _v1[1] = quadraticAt(y0, y1, y2, _t);            var d1 = distSquare(_v0, _v1);            if (d1 < d) {                t = _t;                d = d1;            }        }        d = Infinity;        for (var i = 0; i < 32; i++) {            if (interval < EPSILON_NUMERIC) {                break;            }            var prev = t - interval;            var next = t + interval;            _v1[0] = quadraticAt(x0, x1, x2, prev);            _v1[1] = quadraticAt(y0, y1, y2, prev);            var d1 = distSquare(_v1, _v0);            if (prev >= 0 && d1 < d) {                t = prev;                d = d1;            }            else {                _v2[0] = quadraticAt(x0, x1, x2, next);                _v2[1] = quadraticAt(y0, y1, y2, next);                var d2 = distSquare(_v2, _v0);                if (next <= 1 && d2 < d) {                    t = next;                    d = d2;                }                else {                    interval *= 0.5;                }            }        }        if (out) {            out[0] = quadraticAt(x0, x1, x2, t);            out[1] = quadraticAt(y0, y1, y2, t);        }        return mathSqrt(d);    }    function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) {        var px = x0;        var py = y0;        var d = 0;        var step = 1 / iteration;        for (var i = 1; i <= iteration; i++) {            var t = i * step;            var x = quadraticAt(x0, x1, x2, t);            var y = quadraticAt(y0, y1, y2, t);            var dx = x - px;            var dy = y - py;            d += Math.sqrt(dx * dx + dy * dy);            px = x;            py = y;        }        return d;    }    var regexp = /cubic-bezier\(([0-9,\.e ]+)\)/;    function createCubicEasingFunc(cubicEasingStr) {        var cubic = cubicEasingStr && regexp.exec(cubicEasingStr);        if (cubic) {            var points = cubic[1].split(',');            var a_1 = +trim(points[0]);            var b_1 = +trim(points[1]);            var c_1 = +trim(points[2]);            var d_1 = +trim(points[3]);            if (isNaN(a_1 + b_1 + c_1 + d_1)) {                return;            }            var roots_1 = [];            return function (p) {                return p <= 0                    ? 0 : p >= 1                    ? 1                    : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]);            };        }    }    var Clip = (function () {        function Clip(opts) {            this._inited = false;            this._startTime = 0;            this._pausedTime = 0;            this._paused = false;            this._life = opts.life || 1000;            this._delay = opts.delay || 0;            this.loop = opts.loop || false;            this.onframe = opts.onframe || noop;            this.ondestroy = opts.ondestroy || noop;            this.onrestart = opts.onrestart || noop;            opts.easing && this.setEasing(opts.easing);        }        Clip.prototype.step = function (globalTime, deltaTime) {            if (!this._inited) {                this._startTime = globalTime + this._delay;                this._inited = true;            }            if (this._paused) {                this._pausedTime += deltaTime;                return;            }            var life = this._life;            var elapsedTime = globalTime - this._startTime - this._pausedTime;            var percent = elapsedTime / life;            if (percent < 0) {                percent = 0;            }            percent = Math.min(percent, 1);            var easingFunc = this.easingFunc;            var schedule = easingFunc ? easingFunc(percent) : percent;            this.onframe(schedule);            if (percent === 1) {                if (this.loop) {                    var remainder = elapsedTime % life;                    this._startTime = globalTime - remainder;                    this._pausedTime = 0;                    this.onrestart();                }                else {                    return true;                }            }            return false;        };        Clip.prototype.pause = function () {            this._paused = true;        };        Clip.prototype.resume = function () {            this._paused = false;        };        Clip.prototype.setEasing = function (easing) {            this.easing = easing;            this.easingFunc = isFunction(easing)                ? easing                : easingFuncs[easing] || createCubicEasingFunc(easing);        };        return Clip;    }());    var Entry = (function () {        function Entry(val) {            this.value = val;        }        return Entry;    }());    var LinkedList = (function () {        function LinkedList() {            this._len = 0;        }        LinkedList.prototype.insert = function (val) {            var entry = new Entry(val);            this.insertEntry(entry);            return entry;        };        LinkedList.prototype.insertEntry = function (entry) {            if (!this.head) {                this.head = this.tail = entry;            }            else {                this.tail.next = entry;                entry.prev = this.tail;                entry.next = null;                this.tail = entry;            }            this._len++;        };        LinkedList.prototype.remove = function (entry) {            var prev = entry.prev;            var next = entry.next;            if (prev) {                prev.next = next;            }            else {                this.head = next;            }            if (next) {                next.prev = prev;            }            else {                this.tail = prev;            }            entry.next = entry.prev = null;            this._len--;        };        LinkedList.prototype.len = function () {            return this._len;        };        LinkedList.prototype.clear = function () {            this.head = this.tail = null;            this._len = 0;        };        return LinkedList;    }());    var LRU = (function () {        function LRU(maxSize) {            this._list = new LinkedList();            this._maxSize = 10;            this._map = {};            this._maxSize = maxSize;        }        LRU.prototype.put = function (key, value) {            var list = this._list;            var map = this._map;            var removed = null;            if (map[key] == null) {                var len = list.len();                var entry = this._lastRemovedEntry;                if (len >= this._maxSize && len > 0) {                    var leastUsedEntry = list.head;                    list.remove(leastUsedEntry);                    delete map[leastUsedEntry.key];                    removed = leastUsedEntry.value;                    this._lastRemovedEntry = leastUsedEntry;                }                if (entry) {                    entry.value = value;                }                else {                    entry = new Entry(value);                }                entry.key = key;                list.insertEntry(entry);                map[key] = entry;            }            return removed;        };        LRU.prototype.get = function (key) {            var entry = this._map[key];            var list = this._list;            if (entry != null) {                if (entry !== list.tail) {                    list.remove(entry);                    list.insertEntry(entry);                }                return entry.value;            }        };        LRU.prototype.clear = function () {            this._list.clear();            this._map = {};        };        LRU.prototype.len = function () {            return this._list.len();        };        return LRU;    }());    var kCSSColorTable = {        '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 clampCssByte(i) {        i = Math.round(i);        return i < 0 ? 0 : i > 255 ? 255 : i;    }    function clampCssAngle(i) {        i = Math.round(i);        return i < 0 ? 0 : i > 360 ? 360 : i;    }    function clampCssFloat(f) {        return f < 0 ? 0 : f > 1 ? 1 : f;    }    function parseCssInt(val) {        var str = val;        if (str.length && str.charAt(str.length - 1) === '%') {            return clampCssByte(parseFloat(str) / 100 * 255);        }        return clampCssByte(parseInt(str, 10));    }    function parseCssFloat(val) {        var str = val;        if (str.length && str.charAt(str.length - 1) === '%') {            return clampCssFloat(parseFloat(str) / 100);        }        return clampCssFloat(parseFloat(str));    }    function cssHueToRgb(m1, m2, h) {        if (h < 0) {            h += 1;        }        else if (h > 1) {            h -= 1;        }        if (h * 6 < 1) {            return m1 + (m2 - m1) * h * 6;        }        if (h * 2 < 1) {            return m2;        }        if (h * 3 < 2) {            return m1 + (m2 - m1) * (2 / 3 - h) * 6;        }        return m1;    }    function lerpNumber(a, b, p) {        return a + (b - a) * p;    }    function setRgba(out, r, g, b, a) {        out[0] = r;        out[1] = g;        out[2] = b;        out[3] = a;        return out;    }    function copyRgba(out, a) {        out[0] = a[0];        out[1] = a[1];        out[2] = a[2];        out[3] = a[3];        return out;    }    var colorCache = new LRU(20);    var lastRemovedArr = null;    function putToCache(colorStr, rgbaArr) {        if (lastRemovedArr) {            copyRgba(lastRemovedArr, rgbaArr);        }        lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice()));    }    function parse(colorStr, rgbaArr) {        if (!colorStr) {            return;        }        rgbaArr = rgbaArr || [];        var cached = colorCache.get(colorStr);        if (cached) {            return copyRgba(rgbaArr, cached);        }        colorStr = colorStr + '';        var str = colorStr.replace(/ /g, '').toLowerCase();        if (str in kCSSColorTable) {            copyRgba(rgbaArr, kCSSColorTable[str]);            putToCache(colorStr, rgbaArr);            return rgbaArr;        }        var strLen = str.length;        if (str.charAt(0) === '#') {            if (strLen === 4 || strLen === 5) {                var iv = parseInt(str.slice(1, 4), 16);                if (!(iv >= 0 && iv <= 0xfff)) {                    setRgba(rgbaArr, 0, 0, 0, 1);                    return;                }                setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1);                putToCache(colorStr, rgbaArr);                return rgbaArr;            }            else if (strLen === 7 || strLen === 9) {                var iv = parseInt(str.slice(1, 7), 16);                if (!(iv >= 0 && iv <= 0xffffff)) {                    setRgba(rgbaArr, 0, 0, 0, 1);                    return;                }                setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1);                putToCache(colorStr, rgbaArr);                return rgbaArr;            }            return;        }        var op = str.indexOf('(');        var ep = str.indexOf(')');        if (op !== -1 && ep + 1 === strLen) {            var fname = str.substr(0, op);            var params = str.substr(op + 1, ep - (op + 1)).split(',');            var alpha = 1;            switch (fname) {                case 'rgba':                    if (params.length !== 4) {                        return params.length === 3                            ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1)                            : setRgba(rgbaArr, 0, 0, 0, 1);                    }                    alpha = parseCssFloat(params.pop());                case 'rgb':                    if (params.length >= 3) {                        setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), params.length === 3 ? alpha : parseCssFloat(params[3]));                        putToCache(colorStr, rgbaArr);                        return rgbaArr;                    }                    else {                        setRgba(rgbaArr, 0, 0, 0, 1);                        return;                    }                case 'hsla':                    if (params.length !== 4) {                        setRgba(rgbaArr, 0, 0, 0, 1);                        return;                    }                    params[3] = parseCssFloat(params[3]);                    hsla2rgba(params, rgbaArr);                    putToCache(colorStr, rgbaArr);                    return rgbaArr;                case 'hsl':                    if (params.length !== 3) {                        setRgba(rgbaArr, 0, 0, 0, 1);                        return;                    }                    hsla2rgba(params, rgbaArr);                    putToCache(colorStr, rgbaArr);                    return rgbaArr;                default:                    return;            }        }        setRgba(rgbaArr, 0, 0, 0, 1);        return;    }    function hsla2rgba(hsla, rgba) {        var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360;        var s = parseCssFloat(hsla[1]);        var l = parseCssFloat(hsla[2]);        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;        var m1 = l * 2 - m2;        rgba = rgba || [];        setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1);        if (hsla.length === 4) {            rgba[3] = hsla[3];        }        return rgba;    }    function rgba2hsla(rgba) {        if (!rgba) {            return;        }        var R = rgba[0] / 255;        var G = rgba[1] / 255;        var B = rgba[2] / 255;        var vMin = Math.min(R, G, B);        var vMax = Math.max(R, G, B);        var delta = vMax - vMin;        var L = (vMax + vMin) / 2;        var H;        var S;        if (delta === 0) {            H = 0;            S = 0;        }        else {            if (L < 0.5) {                S = delta / (vMax + vMin);            }            else {                S = delta / (2 - vMax - vMin);            }            var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta;            var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta;            var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta;            if (R === vMax) {                H = deltaB - deltaG;            }            else if (G === vMax) {                H = (1 / 3) + deltaR - deltaB;            }            else if (B === vMax) {                H = (2 / 3) + deltaG - deltaR;            }            if (H < 0) {                H += 1;            }            if (H > 1) {                H -= 1;            }        }        var hsla = [H * 360, S, L];        if (rgba[3] != null) {            hsla.push(rgba[3]);        }        return hsla;    }    function lift(color, level) {        var colorArr = parse(color);        if (colorArr) {            for (var i = 0; i < 3; i++) {                if (level < 0) {                    colorArr[i] = colorArr[i] * (1 - level) | 0;                }                else {                    colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0;                }                if (colorArr[i] > 255) {                    colorArr[i] = 255;                }                else if (colorArr[i] < 0) {                    colorArr[i] = 0;                }            }            return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');        }    }    function toHex(color) {        var colorArr = parse(color);        if (colorArr) {            return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1);        }    }    function fastLerp(normalizedValue, colors, out) {        if (!(colors && colors.length)            || !(normalizedValue >= 0 && normalizedValue <= 1)) {            return;        }        out = out || [];        var value = normalizedValue * (colors.length - 1);        var leftIndex = Math.floor(value);        var rightIndex = Math.ceil(value);        var leftColor = colors[leftIndex];        var rightColor = colors[rightIndex];        var dv = value - leftIndex;        out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv));        out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv));        out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv));        out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv));        return out;    }    var fastMapToColor = fastLerp;    function lerp$1(normalizedValue, colors, fullOutput) {        if (!(colors && colors.length)            || !(normalizedValue >= 0 && normalizedValue <= 1)) {            return;        }        var value = normalizedValue * (colors.length - 1);        var leftIndex = Math.floor(value);        var rightIndex = Math.ceil(value);        var leftColor = parse(colors[leftIndex]);        var rightColor = parse(colors[rightIndex]);        var dv = value - leftIndex;        var color = stringify([            clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)),            clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)),            clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)),            clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv))        ], 'rgba');        return fullOutput            ? {                color: color,                leftIndex: leftIndex,                rightIndex: rightIndex,                value: value            }            : color;    }    var mapToColor = lerp$1;    function modifyHSL(color, h, s, l) {        var colorArr = parse(color);        if (color) {            colorArr = rgba2hsla(colorArr);            h != null && (colorArr[0] = clampCssAngle(h));            s != null && (colorArr[1] = parseCssFloat(s));            l != null && (colorArr[2] = parseCssFloat(l));            return stringify(hsla2rgba(colorArr), 'rgba');        }    }    function modifyAlpha(color, alpha) {        var colorArr = parse(color);        if (colorArr && alpha != null) {            colorArr[3] = clampCssFloat(alpha);            return stringify(colorArr, 'rgba');        }    }    function stringify(arrColor, type) {        if (!arrColor || !arrColor.length) {            return;        }        var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2];        if (type === 'rgba' || type === 'hsva' || type === 'hsla') {            colorStr += ',' + arrColor[3];        }        return type + '(' + colorStr + ')';    }    function lum(color, backgroundLum) {        var arr = parse(color);        return arr            ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255                + (1 - arr[3]) * backgroundLum            : 0;    }    function random() {        return stringify([            Math.round(Math.random() * 255),            Math.round(Math.random() * 255),            Math.round(Math.random() * 255)        ], 'rgb');    }    var liftedColorCache = new LRU(100);    function liftColor(color) {        if (isString(color)) {            var liftedColor = liftedColorCache.get(color);            if (!liftedColor) {                liftedColor = lift(color, -0.1);                liftedColorCache.put(color, liftedColor);            }            return liftedColor;        }        else if (isGradientObject(color)) {            var ret = extend({}, color);            ret.colorStops = map(color.colorStops, function (stop) { return ({                offset: stop.offset,                color: lift(stop.color, -0.1)            }); });            return ret;        }        return color;    }    var color = /*#__PURE__*/Object.freeze({        __proto__: null,        parse: parse,        lift: lift,        toHex: toHex,        fastLerp: fastLerp,        fastMapToColor: fastMapToColor,        lerp: lerp$1,        mapToColor: mapToColor,        modifyHSL: modifyHSL,        modifyAlpha: modifyAlpha,        stringify: stringify,        lum: lum,        random: random,        liftColor: liftColor    });    var mathRound = Math.round;    function normalizeColor(color) {        var opacity;        if (!color || color === 'transparent') {            color = 'none';        }        else if (typeof color === 'string' && color.indexOf('rgba') > -1) {            var arr = parse(color);            if (arr) {                color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')';                opacity = arr[3];            }        }        return {            color: color,            opacity: opacity == null ? 1 : opacity        };    }    var EPSILON$1 = 1e-4;    function isAroundZero$1(transform) {        return transform < EPSILON$1 && transform > -EPSILON$1;    }    function round3(transform) {        return mathRound(transform * 1e3) / 1e3;    }    function round4(transform) {        return mathRound(transform * 1e4) / 1e4;    }    function getMatrixStr(m) {        return 'matrix('            + round3(m[0]) + ','            + round3(m[1]) + ','            + round3(m[2]) + ','            + round3(m[3]) + ','            + round4(m[4]) + ','            + round4(m[5])            + ')';    }    var TEXT_ALIGN_TO_ANCHOR = {        left: 'start',        right: 'end',        center: 'middle',        middle: 'middle'    };    function adjustTextY(y, lineHeight, textBaseline) {        if (textBaseline === 'top') {            y += lineHeight / 2;        }        else if (textBaseline === 'bottom') {            y -= lineHeight / 2;        }        return y;    }    function hasShadow(style) {        return style            && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY);    }    function getShadowKey(displayable) {        var style = displayable.style;        var globalScale = displayable.getGlobalScale();        return [            style.shadowColor,            (style.shadowBlur || 0).toFixed(2),            (style.shadowOffsetX || 0).toFixed(2),            (style.shadowOffsetY || 0).toFixed(2),            globalScale[0],            globalScale[1]        ].join(',');    }    function isImagePattern(val) {        return val && (!!val.image);    }    function isSVGPattern(val) {        return val && (!!val.svgElement);    }    function isPattern(val) {        return isImagePattern(val) || isSVGPattern(val);    }    function isLinearGradient(val) {        return val.type === 'linear';    }    function isRadialGradient(val) {        return val.type === 'radial';    }    function isGradient(val) {        return val && (val.type === 'linear'            || val.type === 'radial');    }    function getIdURL(id) {        return "url(#" + id + ")";    }    function getPathPrecision(el) {        var scale = el.getGlobalScale();        var size = Math.max(scale[0], scale[1]);        return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1);    }    function getSRTTransformString(transform) {        var x = transform.x || 0;        var y = transform.y || 0;        var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE;        var scaleX = retrieve2(transform.scaleX, 1);        var scaleY = retrieve2(transform.scaleY, 1);        var skewX = transform.skewX || 0;        var skewY = transform.skewY || 0;        var res = [];        if (x || y) {            res.push("translate(" + x + "px," + y + "px)");        }        if (rotation) {            res.push("rotate(" + rotation + ")");        }        if (scaleX !== 1 || scaleY !== 1) {            res.push("scale(" + scaleX + "," + scaleY + ")");        }        if (skewX || skewY) {            res.push("skew(" + mathRound(skewX * RADIAN_TO_DEGREE) + "deg, " + mathRound(skewY * RADIAN_TO_DEGREE) + "deg)");        }        return res.join(' ');    }    var encodeBase64 = (function () {        if (env.hasGlobalWindow && isFunction(window.btoa)) {            return function (str) {                return window.btoa(unescape(encodeURIComponent(str)));            };        }        if (typeof Buffer !== 'undefined') {            return function (str) {                return Buffer.from(str).toString('base64');            };        }        return function (str) {            {                logError('Base64 isn\'t natively supported in the current environment.');            }            return null;        };    })();    var arraySlice = Array.prototype.slice;    function interpolateNumber(p0, p1, percent) {        return (p1 - p0) * percent + p0;    }    function interpolate1DArray(out, p0, p1, percent) {        var len = p0.length;        for (var i = 0; i < len; i++) {            out[i] = interpolateNumber(p0[i], p1[i], percent);        }        return out;    }    function interpolate2DArray(out, p0, p1, percent) {        var len = p0.length;        var len2 = len && p0[0].length;        for (var i = 0; i < len; i++) {            if (!out[i]) {                out[i] = [];            }            for (var j = 0; j < len2; j++) {                out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);            }        }        return out;    }    function add1DArray(out, p0, p1, sign) {        var len = p0.length;        for (var i = 0; i < len; i++) {            out[i] = p0[i] + p1[i] * sign;        }        return out;    }    function add2DArray(out, p0, p1, sign) {        var len = p0.length;        var len2 = len && p0[0].length;        for (var i = 0; i < len; i++) {            if (!out[i]) {                out[i] = [];            }            for (var j = 0; j < len2; j++) {                out[i][j] = p0[i][j] + p1[i][j] * sign;            }        }        return out;    }    function fillColorStops(val0, val1) {        var len0 = val0.length;        var len1 = val1.length;        var shorterArr = len0 > len1 ? val1 : val0;        var shorterLen = Math.min(len0, len1);        var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 };        for (var i = shorterLen; i < Math.max(len0, len1); i++) {            shorterArr.push({                offset: last.offset,                color: last.color.slice()            });        }    }    function fillArray(val0, val1, arrDim) {        var arr0 = val0;        var arr1 = val1;        if (!arr0.push || !arr1.push) {            return;        }        var arr0Len = arr0.length;        var arr1Len = arr1.length;        if (arr0Len !== arr1Len) {            var isPreviousLarger = arr0Len > arr1Len;            if (isPreviousLarger) {                arr0.length = arr1Len;            }            else {                for (var i = arr0Len; i < arr1Len; i++) {                    arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]));                }            }        }        var len2 = arr0[0] && arr0[0].length;        for (var i = 0; i < arr0.length; i++) {            if (arrDim === 1) {                if (isNaN(arr0[i])) {                    arr0[i] = arr1[i];                }            }            else {                for (var j = 0; j < len2; j++) {                    if (isNaN(arr0[i][j])) {                        arr0[i][j] = arr1[i][j];                    }                }            }        }    }    function cloneValue(value) {        if (isArrayLike(value)) {            var len = value.length;            if (isArrayLike(value[0])) {                var ret = [];                for (var i = 0; i < len; i++) {                    ret.push(arraySlice.call(value[i]));                }                return ret;            }            return arraySlice.call(value);        }        return value;    }    function rgba2String(rgba) {        rgba[0] = Math.floor(rgba[0]) || 0;        rgba[1] = Math.floor(rgba[1]) || 0;        rgba[2] = Math.floor(rgba[2]) || 0;        rgba[3] = rgba[3] == null ? 1 : rgba[3];        return 'rgba(' + rgba.join(',') + ')';    }    function guessArrayDim(value) {        return isArrayLike(value && value[0]) ? 2 : 1;    }    var VALUE_TYPE_NUMBER = 0;    var VALUE_TYPE_1D_ARRAY = 1;    var VALUE_TYPE_2D_ARRAY = 2;    var VALUE_TYPE_COLOR = 3;    var VALUE_TYPE_LINEAR_GRADIENT = 4;    var VALUE_TYPE_RADIAL_GRADIENT = 5;    var VALUE_TYPE_UNKOWN = 6;    function isGradientValueType(valType) {        return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT;    }    function isArrayValueType(valType) {        return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY;    }    var tmpRgba = [0, 0, 0, 0];    var Track = (function () {        function Track(propName) {            this.keyframes = [];            this.discrete = false;            this._invalid = false;            this._needsSort = false;            this._lastFr = 0;            this._lastFrP = 0;            this.propName = propName;        }        Track.prototype.isFinished = function () {            return this._finished;        };        Track.prototype.setFinished = function () {            this._finished = true;            if (this._additiveTrack) {                this._additiveTrack.setFinished();            }        };        Track.prototype.needsAnimate = function () {            return this.keyframes.length >= 1;        };        Track.prototype.getAdditiveTrack = function () {            return this._additiveTrack;        };        Track.prototype.addKeyframe = function (time, rawValue, easing) {            this._needsSort = true;            var keyframes = this.keyframes;            var len = keyframes.length;            var discrete = false;            var valType = VALUE_TYPE_UNKOWN;            var value = rawValue;            if (isArrayLike(rawValue)) {                var arrayDim = guessArrayDim(rawValue);                valType = arrayDim;                if (arrayDim === 1 && !isNumber(rawValue[0])                    || arrayDim === 2 && !isNumber(rawValue[0][0])) {                    discrete = true;                }            }            else {                if (isNumber(rawValue) && !eqNaN(rawValue)) {                    valType = VALUE_TYPE_NUMBER;                }                else if (isString(rawValue)) {                    if (!isNaN(+rawValue)) {                        valType = VALUE_TYPE_NUMBER;                    }                    else {                        var colorArray = parse(rawValue);                        if (colorArray) {                            value = colorArray;                            valType = VALUE_TYPE_COLOR;                        }                    }                }                else if (isGradientObject(rawValue)) {                    var parsedGradient = extend({}, value);                    parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({                        offset: colorStop.offset,                        color: parse(colorStop.color)                    }); });                    if (isLinearGradient(rawValue)) {                        valType = VALUE_TYPE_LINEAR_GRADIENT;                    }                    else if (isRadialGradient(rawValue)) {                        valType = VALUE_TYPE_RADIAL_GRADIENT;                    }                    value = parsedGradient;                }            }            if (len === 0) {                this.valType = valType;            }            else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) {                discrete = true;            }            this.discrete = this.discrete || discrete;            var kf = {                time: time,                value: value,                rawValue: rawValue,                percent: 0            };            if (easing) {                kf.easing = easing;                kf.easingFunc = isFunction(easing)                    ? easing                    : easingFuncs[easing] || createCubicEasingFunc(easing);            }            keyframes.push(kf);            return kf;        };        Track.prototype.prepare = function (maxTime, additiveTrack) {            var kfs = this.keyframes;            if (this._needsSort) {                kfs.sort(function (a, b) {                    return a.time - b.time;                });            }            var valType = this.valType;            var kfsLen = kfs.length;            var lastKf = kfs[kfsLen - 1];            var isDiscrete = this.discrete;            var isArr = isArrayValueType(valType);            var isGradient = isGradientValueType(valType);            for (var i = 0; i < kfsLen; i++) {                var kf = kfs[i];                var value = kf.value;                var lastValue = lastKf.value;                kf.percent = kf.time / maxTime;                if (!isDiscrete) {                    if (isArr && i !== kfsLen - 1) {                        fillArray(value, lastValue, valType);                    }                    else if (isGradient) {                        fillColorStops(value.colorStops, lastValue.colorStops);                    }                }            }            if (!isDiscrete                && valType !== VALUE_TYPE_RADIAL_GRADIENT                && additiveTrack                && this.needsAnimate()                && additiveTrack.needsAnimate()                && valType === additiveTrack.valType                && !additiveTrack._finished) {                this._additiveTrack = additiveTrack;                var startValue = kfs[0].value;                for (var i = 0; i < kfsLen; i++) {                    if (valType === VALUE_TYPE_NUMBER) {                        kfs[i].additiveValue = kfs[i].value - startValue;                    }                    else if (valType === VALUE_TYPE_COLOR) {                        kfs[i].additiveValue =                            add1DArray([], kfs[i].value, startValue, -1);                    }                    else if (isArrayValueType(valType)) {                        kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY                            ? add1DArray([], kfs[i].value, startValue, -1)                            : add2DArray([], kfs[i].value, startValue, -1);                    }                }            }        };        Track.prototype.step = function (target, percent) {            if (this._finished) {                return;            }            if (this._additiveTrack && this._additiveTrack._finished) {                this._additiveTrack = null;            }            var isAdditive = this._additiveTrack != null;            var valueKey = isAdditive ? 'additiveValue' : 'value';            var valType = this.valType;            var keyframes = this.keyframes;            var kfsNum = keyframes.length;            var propName = this.propName;            var isValueColor = valType === VALUE_TYPE_COLOR;            var frameIdx;            var lastFrame = this._lastFr;            var mathMin = Math.min;            var frame;            var nextFrame;            if (kfsNum === 1) {                frame = nextFrame = keyframes[0];            }            else {                if (percent < 0) {                    frameIdx = 0;                }                else if (percent < this._lastFrP) {                    var start = mathMin(lastFrame + 1, kfsNum - 1);                    for (frameIdx = start; frameIdx >= 0; frameIdx--) {                        if (keyframes[frameIdx].percent <= percent) {                            break;                        }                    }                    frameIdx = mathMin(frameIdx, kfsNum - 2);                }                else {                    for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) {                        if (keyframes[frameIdx].percent > percent) {                            break;                        }                    }                    frameIdx = mathMin(frameIdx - 1, kfsNum - 2);                }                nextFrame = keyframes[frameIdx + 1];                frame = keyframes[frameIdx];            }            if (!(frame && nextFrame)) {                return;            }            this._lastFr = frameIdx;            this._lastFrP = percent;            var interval = (nextFrame.percent - frame.percent);            var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1);            if (nextFrame.easingFunc) {                w = nextFrame.easingFunc(w);            }            var targetArr = isAdditive ? this._additiveValue                : (isValueColor ? tmpRgba : target[propName]);            if ((isArrayValueType(valType) || isValueColor) && !targetArr) {                targetArr = this._additiveValue = [];            }            if (this.discrete) {                target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue;            }            else if (isArrayValueType(valType)) {                valType === VALUE_TYPE_1D_ARRAY                    ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w)                    : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);            }            else if (isGradientValueType(valType)) {                var val = frame[valueKey];                var nextVal_1 = nextFrame[valueKey];                var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT;                target[propName] = {                    type: isLinearGradient_1 ? 'linear' : 'radial',                    x: interpolateNumber(val.x, nextVal_1.x, w),                    y: interpolateNumber(val.y, nextVal_1.y, w),                    colorStops: map(val.colorStops, function (colorStop, idx) {                        var nextColorStop = nextVal_1.colorStops[idx];                        return {                            offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w),                            color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w))                        };                    }),                    global: nextVal_1.global                };                if (isLinearGradient_1) {                    target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w);                    target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w);                }                else {                    target[propName].r = interpolateNumber(val.r, nextVal_1.r, w);                }            }            else if (isValueColor) {                interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);                if (!isAdditive) {                    target[propName] = rgba2String(targetArr);                }            }            else {                var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w);                if (isAdditive) {                    this._additiveValue = value;                }                else {                    target[propName] = value;                }            }            if (isAdditive) {                this._addToTarget(target);            }        };        Track.prototype._addToTarget = function (target) {            var valType = this.valType;            var propName = this.propName;            var additiveValue = this._additiveValue;            if (valType === VALUE_TYPE_NUMBER) {                target[propName] = target[propName] + additiveValue;            }            else if (valType === VALUE_TYPE_COLOR) {                parse(target[propName], tmpRgba);                add1DArray(tmpRgba, tmpRgba, additiveValue, 1);                target[propName] = rgba2String(tmpRgba);            }            else if (valType === VALUE_TYPE_1D_ARRAY) {                add1DArray(target[propName], target[propName], additiveValue, 1);            }            else if (valType === VALUE_TYPE_2D_ARRAY) {                add2DArray(target[propName], target[propName], additiveValue, 1);            }        };        return Track;    }());    var Animator = (function () {        function Animator(target, loop, allowDiscreteAnimation, additiveTo) {            this._tracks = {};            this._trackKeys = [];            this._maxTime = 0;            this._started = 0;            this._clip = null;            this._target = target;            this._loop = loop;            if (loop && additiveTo) {                logError('Can\' use additive animation on looped animation.');                return;            }            this._additiveAnimators = additiveTo;            this._allowDiscrete = allowDiscreteAnimation;        }        Animator.prototype.getMaxTime = function () {            return this._maxTime;        };        Animator.prototype.getDelay = function () {            return this._delay;        };        Animator.prototype.getLoop = function () {            return this._loop;        };        Animator.prototype.getTarget = function () {            return this._target;        };        Animator.prototype.changeTarget = function (target) {            this._target = target;        };        Animator.prototype.when = function (time, props, easing) {            return this.whenWithKeys(time, props, keys(props), easing);        };        Animator.prototype.whenWithKeys = function (time, props, propNames, easing) {            var tracks = this._tracks;            for (var i = 0; i < propNames.length; i++) {                var propName = propNames[i];                var track = tracks[propName];                if (!track) {                    track = tracks[propName] = new Track(propName);                    var initialValue = void 0;                    var additiveTrack = this._getAdditiveTrack(propName);                    if (additiveTrack) {                        var addtiveTrackKfs = additiveTrack.keyframes;                        var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1];                        initialValue = lastFinalKf && lastFinalKf.value;                        if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) {                            initialValue = rgba2String(initialValue);                        }                    }                    else {                        initialValue = this._target[propName];                    }                    if (initialValue == null) {                        continue;                    }                    if (time > 0) {                        track.addKeyframe(0, cloneValue(initialValue), easing);                    }                    this._trackKeys.push(propName);                }                track.addKeyframe(time, cloneValue(props[propName]), easing);            }            this._maxTime = Math.max(this._maxTime, time);            return this;        };        Animator.prototype.pause = function () {            this._clip.pause();            this._paused = true;        };        Animator.prototype.resume = function () {            this._clip.resume();            this._paused = false;        };        Animator.prototype.isPaused = function () {            return !!this._paused;        };        Animator.prototype.duration = function (duration) {            this._maxTime = duration;            this._force = true;            return this;        };        Animator.prototype._doneCallback = function () {            this._setTracksFinished();            this._clip = null;            var doneList = this._doneCbs;            if (doneList) {                var len = doneList.length;                for (var i = 0; i < len; i++) {                    doneList[i].call(this);                }            }        };        Animator.prototype._abortedCallback = function () {            this._setTracksFinished();            var animation = this.animation;            var abortedList = this._abortedCbs;            if (animation) {                animation.removeClip(this._clip);            }            this._clip = null;            if (abortedList) {                for (var i = 0; i < abortedList.length; i++) {                    abortedList[i].call(this);                }            }        };        Animator.prototype._setTracksFinished = function () {            var tracks = this._tracks;            var tracksKeys = this._trackKeys;            for (var i = 0; i < tracksKeys.length; i++) {                tracks[tracksKeys[i]].setFinished();            }        };        Animator.prototype._getAdditiveTrack = function (trackName) {            var additiveTrack;            var additiveAnimators = this._additiveAnimators;            if (additiveAnimators) {                for (var i = 0; i < additiveAnimators.length; i++) {                    var track = additiveAnimators[i].getTrack(trackName);                    if (track) {                        additiveTrack = track;                    }                }            }            return additiveTrack;        };        Animator.prototype.start = function (easing) {            if (this._started > 0) {                return;            }            this._started = 1;            var self = this;            var tracks = [];            var maxTime = this._maxTime || 0;            for (var i = 0; i < this._trackKeys.length; i++) {                var propName = this._trackKeys[i];                var track = this._tracks[propName];                var additiveTrack = this._getAdditiveTrack(propName);                var kfs = track.keyframes;                var kfsNum = kfs.length;                track.prepare(maxTime, additiveTrack);                if (track.needsAnimate()) {                    if (!this._allowDiscrete && track.discrete) {                        var lastKf = kfs[kfsNum - 1];                        if (lastKf) {                            self._target[track.propName] = lastKf.rawValue;                        }                        track.setFinished();                    }                    else {                        tracks.push(track);                    }                }            }            if (tracks.length || this._force) {                var clip = new Clip({                    life: maxTime,                    loop: this._loop,                    delay: this._delay || 0,                    onframe: function (percent) {                        self._started = 2;                        var additiveAnimators = self._additiveAnimators;                        if (additiveAnimators) {                            var stillHasAdditiveAnimator = false;                            for (var i = 0; i < additiveAnimators.length; i++) {                                if (additiveAnimators[i]._clip) {                                    stillHasAdditiveAnimator = true;                                    break;                                }                            }                            if (!stillHasAdditiveAnimator) {                                self._additiveAnimators = null;                            }                        }                        for (var i = 0; i < tracks.length; i++) {                            tracks[i].step(self._target, percent);                        }                        var onframeList = self._onframeCbs;                        if (onframeList) {                            for (var i = 0; i < onframeList.length; i++) {                                onframeList[i](self._target, percent);                            }                        }                    },                    ondestroy: function () {                        self._doneCallback();                    }                });                this._clip = clip;                if (this.animation) {                    this.animation.addClip(clip);                }                if (easing) {                    clip.setEasing(easing);                }            }            else {                this._doneCallback();            }            return this;        };        Animator.prototype.stop = function (forwardToLast) {            if (!this._clip) {                return;            }            var clip = this._clip;            if (forwardToLast) {                clip.onframe(1);            }            this._abortedCallback();        };        Animator.prototype.delay = function (time) {            this._delay = time;            return this;        };        Animator.prototype.during = function (cb) {            if (cb) {                if (!this._onframeCbs) {                    this._onframeCbs = [];                }                this._onframeCbs.push(cb);            }            return this;        };        Animator.prototype.done = function (cb) {            if (cb) {                if (!this._doneCbs) {                    this._doneCbs = [];                }                this._doneCbs.push(cb);            }            return this;        };        Animator.prototype.aborted = function (cb) {            if (cb) {                if (!this._abortedCbs) {                    this._abortedCbs = [];                }                this._abortedCbs.push(cb);            }            return this;        };        Animator.prototype.getClip = function () {            return this._clip;        };        Animator.prototype.getTrack = function (propName) {            return this._tracks[propName];        };        Animator.prototype.getTracks = function () {            var _this = this;            return map(this._trackKeys, function (key) { return _this._tracks[key]; });        };        Animator.prototype.stopTracks = function (propNames, forwardToLast) {            if (!propNames.length || !this._clip) {                return true;            }            var tracks = this._tracks;            var tracksKeys = this._trackKeys;            for (var i = 0; i < propNames.length; i++) {                var track = tracks[propNames[i]];                if (track && !track.isFinished()) {                    if (forwardToLast) {                        track.step(this._target, 1);                    }                    else if (this._started === 1) {                        track.step(this._target, 0);                    }                    track.setFinished();                }            }            var allAborted = true;            for (var i = 0; i < tracksKeys.length; i++) {                if (!tracks[tracksKeys[i]].isFinished()) {                    allAborted = false;                    break;                }            }            if (allAborted) {                this._abortedCallback();            }            return allAborted;        };        Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) {            if (!target) {                return;            }            trackKeys = trackKeys || this._trackKeys;            for (var i = 0; i < trackKeys.length; i++) {                var propName = trackKeys[i];                var track = this._tracks[propName];                if (!track || track.isFinished()) {                    continue;                }                var kfs = track.keyframes;                var kf = kfs[firstOrLast ? 0 : kfs.length - 1];                if (kf) {                    target[propName] = cloneValue(kf.rawValue);                }            }        };        Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) {            trackKeys = trackKeys || keys(finalProps);            for (var i = 0; i < trackKeys.length; i++) {                var propName = trackKeys[i];                var track = this._tracks[propName];                if (!track) {                    continue;                }                var kfs = track.keyframes;                if (kfs.length > 1) {                    var lastKf = kfs.pop();                    track.addKeyframe(lastKf.time, finalProps[propName]);                    track.prepare(this._maxTime, track.getAdditiveTrack());                }            }        };        return Animator;    }());    function getTime() {        return new Date().getTime();    }    var Animation = (function (_super) {        __extends(Animation, _super);        function Animation(opts) {            var _this = _super.call(this) || this;            _this._running = false;            _this._time = 0;            _this._pausedTime = 0;            _this._pauseStart = 0;            _this._paused = false;            opts = opts || {};            _this.stage = opts.stage || {};            return _this;        }        Animation.prototype.addClip = function (clip) {            if (clip.animation) {                this.removeClip(clip);            }            if (!this._head) {                this._head = this._tail = clip;            }            else {                this._tail.next = clip;                clip.prev = this._tail;                clip.next = null;                this._tail = clip;            }            clip.animation = this;        };        Animation.prototype.addAnimator = function (animator) {            animator.animation = this;            var clip = animator.getClip();            if (clip) {                this.addClip(clip);            }        };        Animation.prototype.removeClip = function (clip) {            if (!clip.animation) {                return;            }            var prev = clip.prev;            var next = clip.next;            if (prev) {                prev.next = next;            }            else {                this._head = next;            }            if (next) {                next.prev = prev;            }            else {                this._tail = prev;            }            clip.next = clip.prev = clip.animation = null;        };        Animation.prototype.removeAnimator = function (animator) {            var clip = animator.getClip();            if (clip) {                this.removeClip(clip);            }            animator.animation = null;        };        Animation.prototype.update = function (notTriggerFrameAndStageUpdate) {            var time = getTime() - this._pausedTime;            var delta = time - this._time;            var clip = this._head;            while (clip) {                var nextClip = clip.next;                var finished = clip.step(time, delta);                if (finished) {                    clip.ondestroy();                    this.removeClip(clip);                    clip = nextClip;                }                else {                    clip = nextClip;                }            }            this._time = time;            if (!notTriggerFrameAndStageUpdate) {                this.trigger('frame', delta);                this.stage.update && this.stage.update();            }        };        Animation.prototype._startLoop = function () {            var self = this;            this._running = true;            function step() {                if (self._running) {                    requestAnimationFrame$1(step);                    !self._paused && self.update();                }            }            requestAnimationFrame$1(step);        };        Animation.prototype.start = function () {            if (this._running) {                return;            }            this._time = getTime();            this._pausedTime = 0;            this._startLoop();        };        Animation.prototype.stop = function () {            this._running = false;        };        Animation.prototype.pause = function () {            if (!this._paused) {                this._pauseStart = getTime();                this._paused = true;            }        };        Animation.prototype.resume = function () {            if (this._paused) {                this._pausedTime += getTime() - this._pauseStart;                this._paused = false;            }        };        Animation.prototype.clear = function () {            var clip = this._head;            while (clip) {                var nextClip = clip.next;                clip.prev = clip.next = clip.animation = null;                clip = nextClip;            }            this._head = this._tail = null;        };        Animation.prototype.isFinished = function () {            return this._head == null;        };        Animation.prototype.animate = function (target, options) {            options = options || {};            this.start();            var animator = new Animator(target, options.loop);            this.addAnimator(animator);            return animator;        };        return Animation;    }(Eventful));    var TOUCH_CLICK_DELAY = 300;    var globalEventSupported = env.domSupported;    var localNativeListenerNames = (function () {        var mouseHandlerNames = [            'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout',            'mouseup', 'mousedown', 'mousemove', 'contextmenu'        ];        var touchHandlerNames = [            'touchstart', 'touchend', 'touchmove'        ];        var pointerEventNameMap = {            pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1        };        var pointerHandlerNames = map(mouseHandlerNames, function (name) {            var nm = name.replace('mouse', 'pointer');            return pointerEventNameMap.hasOwnProperty(nm) ? nm : name;        });        return {            mouse: mouseHandlerNames,            touch: touchHandlerNames,            pointer: pointerHandlerNames        };    })();    var globalNativeListenerNames = {        mouse: ['mousemove', 'mouseup'],        pointer: ['pointermove', 'pointerup']    };    var wheelEventSupported = false;    function isPointerFromTouch(event) {        var pointerType = event.pointerType;        return pointerType === 'pen' || pointerType === 'touch';    }    function setTouchTimer(scope) {        scope.touching = true;        if (scope.touchTimer != null) {            clearTimeout(scope.touchTimer);            scope.touchTimer = null;        }        scope.touchTimer = setTimeout(function () {            scope.touching = false;            scope.touchTimer = null;        }, 700);    }    function markTouch(event) {        event && (event.zrByTouch = true);    }    function normalizeGlobalEvent(instance, event) {        return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true);    }    function isLocalEl(instance, el) {        var elTmp = el;        var isLocal = false;        while (elTmp && elTmp.nodeType !== 9            && !(isLocal = elTmp.domBelongToZr                || (elTmp !== el && elTmp === instance.painterRoot))) {            elTmp = elTmp.parentNode;        }        return isLocal;    }    var FakeGlobalEvent = (function () {        function FakeGlobalEvent(instance, event) {            this.stopPropagation = noop;            this.stopImmediatePropagation = noop;            this.preventDefault = noop;            this.type = event.type;            this.target = this.currentTarget = instance.dom;            this.pointerType = event.pointerType;            this.clientX = event.clientX;            this.clientY = event.clientY;        }        return FakeGlobalEvent;    }());    var localDOMHandlers = {        mousedown: function (event) {            event = normalizeEvent(this.dom, event);            this.__mayPointerCapture = [event.zrX, event.zrY];            this.trigger('mousedown', event);        },        mousemove: function (event) {            event = normalizeEvent(this.dom, event);            var downPoint = this.__mayPointerCapture;            if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) {                this.__togglePointerCapture(true);            }            this.trigger('mousemove', event);        },        mouseup: function (event) {            event = normalizeEvent(this.dom, event);            this.__togglePointerCapture(false);            this.trigger('mouseup', event);        },        mouseout: function (event) {            event = normalizeEvent(this.dom, event);            var element = event.toElement || event.relatedTarget;            if (!isLocalEl(this, element)) {                if (this.__pointerCapturing) {                    event.zrEventControl = 'no_globalout';                }                this.trigger('mouseout', event);            }        },        wheel: function (event) {            wheelEventSupported = true;            event = normalizeEvent(this.dom, event);            this.trigger('mousewheel', event);        },        mousewheel: function (event) {            if (wheelEventSupported) {                return;            }            event = normalizeEvent(this.dom, event);            this.trigger('mousewheel', event);        },        touchstart: function (event) {            event = normalizeEvent(this.dom, event);            markTouch(event);            this.__lastTouchMoment = new Date();            this.handler.processGesture(event, 'start');            localDOMHandlers.mousemove.call(this, event);            localDOMHandlers.mousedown.call(this, event);        },        touchmove: function (event) {            event = normalizeEvent(this.dom, event);            markTouch(event);            this.handler.processGesture(event, 'change');            localDOMHandlers.mousemove.call(this, event);        },        touchend: function (event) {            event = normalizeEvent(this.dom, event);            markTouch(event);            this.handler.processGesture(event, 'end');            localDOMHandlers.mouseup.call(this, event);            if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) {                localDOMHandlers.click.call(this, event);            }        },        pointerdown: function (event) {            localDOMHandlers.mousedown.call(this, event);        },        pointermove: function (event) {            if (!isPointerFromTouch(event)) {                localDOMHandlers.mousemove.call(this, event);            }        },        pointerup: function (event) {            localDOMHandlers.mouseup.call(this, event);        },        pointerout: function (event) {            if (!isPointerFromTouch(event)) {                localDOMHandlers.mouseout.call(this, event);            }        }    };    each(['click', 'dblclick', 'contextmenu'], function (name) {        localDOMHandlers[name] = function (event) {            event = normalizeEvent(this.dom, event);            this.trigger(name, event);        };    });    var globalDOMHandlers = {        pointermove: function (event) {            if (!isPointerFromTouch(event)) {                globalDOMHandlers.mousemove.call(this, event);            }        },        pointerup: function (event) {            globalDOMHandlers.mouseup.call(this, event);        },        mousemove: function (event) {            this.trigger('mousemove', event);        },        mouseup: function (event) {            var pointerCaptureReleasing = this.__pointerCapturing;            this.__togglePointerCapture(false);            this.trigger('mouseup', event);            if (pointerCaptureReleasing) {                event.zrEventControl = 'only_globalout';                this.trigger('mouseout', event);            }        }    };    function mountLocalDOMEventListeners(instance, scope) {        var domHandlers = scope.domHandlers;        if (env.pointerEventsSupported) {            each(localNativeListenerNames.pointer, function (nativeEventName) {                mountSingleDOMEventListener(scope, nativeEventName, function (event) {                    domHandlers[nativeEventName].call(instance, event);                });            });        }        else {            if (env.touchEventsSupported) {                each(localNativeListenerNames.touch, function (nativeEventName) {                    mountSingleDOMEventListener(scope, nativeEventName, function (event) {                        domHandlers[nativeEventName].call(instance, event);                        setTouchTimer(scope);                    });                });            }            each(localNativeListenerNames.mouse, function (nativeEventName) {                mountSingleDOMEventListener(scope, nativeEventName, function (event) {                    event = getNativeEvent(event);                    if (!scope.touching) {                        domHandlers[nativeEventName].call(instance, event);                    }                });            });        }    }    function mountGlobalDOMEventListeners(instance, scope) {        if (env.pointerEventsSupported) {            each(globalNativeListenerNames.pointer, mount);        }        else if (!env.touchEventsSupported) {            each(globalNativeListenerNames.mouse, mount);        }        function mount(nativeEventName) {            function nativeEventListener(event) {                event = getNativeEvent(event);                if (!isLocalEl(instance, event.target)) {                    event = normalizeGlobalEvent(instance, event);                    scope.domHandlers[nativeEventName].call(instance, event);                }            }            mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true });        }    }    function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) {        scope.mounted[nativeEventName] = listener;        scope.listenerOpts[nativeEventName] = opt;        addEventListener(scope.domTarget, nativeEventName, listener, opt);    }    function unmountDOMEventListeners(scope) {        var mounted = scope.mounted;        for (var nativeEventName in mounted) {            if (mounted.hasOwnProperty(nativeEventName)) {                removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]);            }        }        scope.mounted = {};    }    var DOMHandlerScope = (function () {        function DOMHandlerScope(domTarget, domHandlers) {            this.mounted = {};            this.listenerOpts = {};            this.touching = false;            this.domTarget = domTarget;            this.domHandlers = domHandlers;        }        return DOMHandlerScope;    }());    var HandlerDomProxy = (function (_super) {        __extends(HandlerDomProxy, _super);        function HandlerDomProxy(dom, painterRoot) {            var _this = _super.call(this) || this;            _this.__pointerCapturing = false;            _this.dom = dom;            _this.painterRoot = painterRoot;            _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers);            if (globalEventSupported) {                _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers);            }            mountLocalDOMEventListeners(_this, _this._localHandlerScope);            return _this;        }        HandlerDomProxy.prototype.dispose = function () {            unmountDOMEventListeners(this._localHandlerScope);            if (globalEventSupported) {                unmountDOMEventListeners(this._globalHandlerScope);            }        };        HandlerDomProxy.prototype.setCursor = function (cursorStyle) {            this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');        };        HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) {            this.__mayPointerCapture = null;            if (globalEventSupported                && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) {                this.__pointerCapturing = isPointerCapturing;                var globalHandlerScope = this._globalHandlerScope;                isPointerCapturing                    ? mountGlobalDOMEventListeners(this, globalHandlerScope)                    : unmountDOMEventListeners(globalHandlerScope);            }        };        return HandlerDomProxy;    }(Eventful));    var dpr = 1;    if (env.hasGlobalWindow) {        dpr = Math.max(window.devicePixelRatio            || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI)            || 1, 1);    }    var devicePixelRatio = dpr;    var DARK_MODE_THRESHOLD = 0.4;    var DARK_LABEL_COLOR = '#333';    var LIGHT_LABEL_COLOR = '#ccc';    var LIGHTER_LABEL_COLOR = '#eee';    var mIdentity = identity;    var EPSILON$2 = 5e-5;    function isNotAroundZero$1(val) {        return val > EPSILON$2 || val < -EPSILON$2;    }    var scaleTmp = [];    var tmpTransform = [];    var originTransform = create$1();    var abs = Math.abs;    var Transformable = (function () {        function Transformable() {        }        Transformable.prototype.getLocalTransform = function (m) {            return Transformable.getLocalTransform(this, m);        };        Transformable.prototype.setPosition = function (arr) {            this.x = arr[0];            this.y = arr[1];        };        Transformable.prototype.setScale = function (arr) {            this.scaleX = arr[0];            this.scaleY = arr[1];        };        Transformable.prototype.setSkew = function (arr) {            this.skewX = arr[0];            this.skewY = arr[1];        };        Transformable.prototype.setOrigin = function (arr) {            this.originX = arr[0];            this.originY = arr[1];        };        Transformable.prototype.needLocalTransform = function () {            return isNotAroundZero$1(this.rotation)                || isNotAroundZero$1(this.x)                || isNotAroundZero$1(this.y)                || isNotAroundZero$1(this.scaleX - 1)                || isNotAroundZero$1(this.scaleY - 1)                || isNotAroundZero$1(this.skewX)                || isNotAroundZero$1(this.skewY);        };        Transformable.prototype.updateTransform = function () {            var parentTransform = this.parent && this.parent.transform;            var needLocalTransform = this.needLocalTransform();            var m = this.transform;            if (!(needLocalTransform || parentTransform)) {                if (m) {                    mIdentity(m);                    this.invTransform = null;                }                return;            }            m = m || create$1();            if (needLocalTransform) {                this.getLocalTransform(m);            }            else {                mIdentity(m);            }            if (parentTransform) {                if (needLocalTransform) {                    mul$1(m, parentTransform, m);                }                else {                    copy$1(m, parentTransform);                }            }            this.transform = m;            this._resolveGlobalScaleRatio(m);        };        Transformable.prototype._resolveGlobalScaleRatio = function (m) {            var globalScaleRatio = this.globalScaleRatio;            if (globalScaleRatio != null && globalScaleRatio !== 1) {                this.getGlobalScale(scaleTmp);                var relX = scaleTmp[0] < 0 ? -1 : 1;                var relY = scaleTmp[1] < 0 ? -1 : 1;                var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0;                var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0;                m[0] *= sx;                m[1] *= sx;                m[2] *= sy;                m[3] *= sy;            }            this.invTransform = this.invTransform || create$1();            invert(this.invTransform, m);        };        Transformable.prototype.getComputedTransform = function () {            var transformNode = this;            var ancestors = [];            while (transformNode) {                ancestors.push(transformNode);                transformNode = transformNode.parent;            }            while (transformNode = ancestors.pop()) {                transformNode.updateTransform();            }            return this.transform;        };        Transformable.prototype.setLocalTransform = function (m) {            if (!m) {                return;            }            var sx = m[0] * m[0] + m[1] * m[1];            var sy = m[2] * m[2] + m[3] * m[3];            var rotation = Math.atan2(m[1], m[0]);            var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]);            sy = Math.sqrt(sy) * Math.cos(shearX);            sx = Math.sqrt(sx);            this.skewX = shearX;            this.skewY = 0;            this.rotation = -rotation;            this.x = +m[4];            this.y = +m[5];            this.scaleX = sx;            this.scaleY = sy;            this.originX = 0;            this.originY = 0;        };        Transformable.prototype.decomposeTransform = function () {            if (!this.transform) {                return;            }            var parent = this.parent;            var m = this.transform;            if (parent && parent.transform) {                parent.invTransform = parent.invTransform || create$1();                mul$1(tmpTransform, parent.invTransform, m);                m = tmpTransform;            }            var ox = this.originX;            var oy = this.originY;            if (ox || oy) {                originTransform[4] = ox;                originTransform[5] = oy;                mul$1(tmpTransform, m, originTransform);                tmpTransform[4] -= ox;                tmpTransform[5] -= oy;                m = tmpTransform;            }            this.setLocalTransform(m);        };        Transformable.prototype.getGlobalScale = function (out) {            var m = this.transform;            out = out || [];            if (!m) {                out[0] = 1;                out[1] = 1;                return out;            }            out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]);            out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]);            if (m[0] < 0) {                out[0] = -out[0];            }            if (m[3] < 0) {                out[1] = -out[1];            }            return out;        };        Transformable.prototype.transformCoordToLocal = function (x, y) {            var v2 = [x, y];            var invTransform = this.invTransform;            if (invTransform) {                applyTransform(v2, v2, invTransform);            }            return v2;        };        Transformable.prototype.transformCoordToGlobal = function (x, y) {            var v2 = [x, y];            var transform = this.transform;            if (transform) {                applyTransform(v2, v2, transform);            }            return v2;        };        Transformable.prototype.getLineScale = function () {            var m = this.transform;            return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10                ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))                : 1;        };        Transformable.prototype.copyTransform = function (source) {            copyTransform(this, source);        };        Transformable.getLocalTransform = function (target, m) {            m = m || [];            var ox = target.originX || 0;            var oy = target.originY || 0;            var sx = target.scaleX;            var sy = target.scaleY;            var ax = target.anchorX;            var ay = target.anchorY;            var rotation = target.rotation || 0;            var x = target.x;            var y = target.y;            var skewX = target.skewX ? Math.tan(target.skewX) : 0;            var skewY = target.skewY ? Math.tan(-target.skewY) : 0;            if (ox || oy || ax || ay) {                var dx = ox + ax;                var dy = oy + ay;                m[4] = -dx * sx - skewX * dy * sy;                m[5] = -dy * sy - skewY * dx * sx;            }            else {                m[4] = m[5] = 0;            }            m[0] = sx;            m[3] = sy;            m[1] = skewY * sx;            m[2] = skewX * sy;            rotation && rotate(m, m, rotation);            m[4] += ox + x;            m[5] += oy + y;            return m;        };        Transformable.initDefaultProps = (function () {            var proto = Transformable.prototype;            proto.scaleX =                proto.scaleY =                    proto.globalScaleRatio = 1;            proto.x =                proto.y =                    proto.originX =                        proto.originY =                            proto.skewX =                                proto.skewY =                                    proto.rotation =                                        proto.anchorX =                                            proto.anchorY = 0;        })();        return Transformable;    }());    var TRANSFORMABLE_PROPS = [        'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY'    ];    function copyTransform(target, source) {        for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {            var propName = TRANSFORMABLE_PROPS[i];            target[propName] = source[propName];        }    }    var textWidthCache = {};    function getWidth(text, font) {        font = font || DEFAULT_FONT;        var cacheOfFont = textWidthCache[font];        if (!cacheOfFont) {            cacheOfFont = textWidthCache[font] = new LRU(500);        }        var width = cacheOfFont.get(text);        if (width == null) {            width = platformApi.measureText(text, font).width;            cacheOfFont.put(text, width);        }        return width;    }    function innerGetBoundingRect(text, font, textAlign, textBaseline) {        var width = getWidth(text, font);        var height = getLineHeight(font);        var x = adjustTextX(0, width, textAlign);        var y = adjustTextY$1(0, height, textBaseline);        var rect = new BoundingRect(x, y, width, height);        return rect;    }    function getBoundingRect(text, font, textAlign, textBaseline) {        var textLines = ((text || '') + '').split('\n');        var len = textLines.length;        if (len === 1) {            return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline);        }        else {            var uniondRect = new BoundingRect(0, 0, 0, 0);            for (var i = 0; i < textLines.length; i++) {                var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline);                i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect);            }            return uniondRect;        }    }    function adjustTextX(x, width, textAlign) {        if (textAlign === 'right') {            x -= width;        }        else if (textAlign === 'center') {            x -= width / 2;        }        return x;    }    function adjustTextY$1(y, height, verticalAlign) {        if (verticalAlign === 'middle') {            y -= height / 2;        }        else if (verticalAlign === 'bottom') {            y -= height;        }        return y;    }    function getLineHeight(font) {        return getWidth('国', font);    }    function parsePercent(value, maxValue) {        if (typeof value === 'string') {            if (value.lastIndexOf('%') >= 0) {                return parseFloat(value) / 100 * maxValue;            }            return parseFloat(value);        }        return value;    }    function calculateTextPosition(out, opts, rect) {        var textPosition = opts.position || 'inside';        var distance = opts.distance != null ? opts.distance : 5;        var height = rect.height;        var width = rect.width;        var halfHeight = height / 2;        var x = rect.x;        var y = rect.y;        var textAlign = 'left';        var textVerticalAlign = 'top';        if (textPosition instanceof Array) {            x += parsePercent(textPosition[0], rect.width);            y += parsePercent(textPosition[1], rect.height);            textAlign = null;            textVerticalAlign = null;        }        else {            switch (textPosition) {                case 'left':                    x -= distance;                    y += halfHeight;                    textAlign = 'right';                    textVerticalAlign = 'middle';                    break;                case 'right':                    x += distance + width;                    y += halfHeight;                    textVerticalAlign = 'middle';                    break;                case 'top':                    x += width / 2;                    y -= distance;                    textAlign = 'center';                    textVerticalAlign = 'bottom';                    break;                case 'bottom':                    x += width / 2;                    y += height + distance;                    textAlign = 'center';                    break;                case 'inside':                    x += width / 2;                    y += halfHeight;                    textAlign = 'center';                    textVerticalAlign = 'middle';                    break;                case 'insideLeft':                    x += distance;                    y += halfHeight;                    textVerticalAlign = 'middle';                    break;                case 'insideRight':                    x += width - distance;                    y += halfHeight;                    textAlign = 'right';                    textVerticalAlign = 'middle';                    break;                case 'insideTop':                    x += width / 2;                    y += distance;                    textAlign = 'center';                    break;                case 'insideBottom':                    x += width / 2;                    y += height - distance;                    textAlign = 'center';                    textVerticalAlign = 'bottom';                    break;                case 'insideTopLeft':                    x += distance;                    y += distance;                    break;                case 'insideTopRight':                    x += width - distance;                    y += distance;                    textAlign = 'right';                    break;                case 'insideBottomLeft':                    x += distance;                    y += height - distance;                    textVerticalAlign = 'bottom';                    break;                case 'insideBottomRight':                    x += width - distance;                    y += height - distance;                    textAlign = 'right';                    textVerticalAlign = 'bottom';                    break;            }        }        out = out || {};        out.x = x;        out.y = y;        out.align = textAlign;        out.verticalAlign = textVerticalAlign;        return out;    }    var PRESERVED_NORMAL_STATE = '__zr_normal__';    var PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']);    var DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) {        obj[key] = true;        return obj;    }, { ignore: false });    var tmpTextPosCalcRes = {};    var tmpBoundingRect = new BoundingRect(0, 0, 0, 0);    var Element = (function () {        function Element(props) {            this.id = guid();            this.animators = [];            this.currentStates = [];            this.states = {};            this._init(props);        }        Element.prototype._init = function (props) {            this.attr(props);        };        Element.prototype.drift = function (dx, dy, e) {            switch (this.draggable) {                case 'horizontal':                    dy = 0;                    break;                case 'vertical':                    dx = 0;                    break;            }            var m = this.transform;            if (!m) {                m = this.transform = [1, 0, 0, 1, 0, 0];            }            m[4] += dx;            m[5] += dy;            this.decomposeTransform();            this.markRedraw();        };        Element.prototype.beforeUpdate = function () { };        Element.prototype.afterUpdate = function () { };        Element.prototype.update = function () {            this.updateTransform();            if (this.__dirty) {                this.updateInnerText();            }        };        Element.prototype.updateInnerText = function (forceUpdate) {            var textEl = this._textContent;            if (textEl && (!textEl.ignore || forceUpdate)) {                if (!this.textConfig) {                    this.textConfig = {};                }                var textConfig = this.textConfig;                var isLocal = textConfig.local;                var innerTransformable = textEl.innerTransformable;                var textAlign = void 0;                var textVerticalAlign = void 0;                var textStyleChanged = false;                innerTransformable.parent = isLocal ? this : null;                var innerOrigin = false;                innerTransformable.copyTransform(textEl);                if (textConfig.position != null) {                    var layoutRect = tmpBoundingRect;                    if (textConfig.layoutRect) {                        layoutRect.copy(textConfig.layoutRect);                    }                    else {                        layoutRect.copy(this.getBoundingRect());                    }                    if (!isLocal) {                        layoutRect.applyTransform(this.transform);                    }                    if (this.calculateTextPosition) {                        this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);                    }                    else {                        calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);                    }                    innerTransformable.x = tmpTextPosCalcRes.x;                    innerTransformable.y = tmpTextPosCalcRes.y;                    textAlign = tmpTextPosCalcRes.align;                    textVerticalAlign = tmpTextPosCalcRes.verticalAlign;                    var textOrigin = textConfig.origin;                    if (textOrigin && textConfig.rotation != null) {                        var relOriginX = void 0;                        var relOriginY = void 0;                        if (textOrigin === 'center') {                            relOriginX = layoutRect.width * 0.5;                            relOriginY = layoutRect.height * 0.5;                        }                        else {                            relOriginX = parsePercent(textOrigin[0], layoutRect.width);                            relOriginY = parsePercent(textOrigin[1], layoutRect.height);                        }                        innerOrigin = true;                        innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x);                        innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y);                    }                }                if (textConfig.rotation != null) {                    innerTransformable.rotation = textConfig.rotation;                }                var textOffset = textConfig.offset;                if (textOffset) {                    innerTransformable.x += textOffset[0];                    innerTransformable.y += textOffset[1];                    if (!innerOrigin) {                        innerTransformable.originX = -textOffset[0];                        innerTransformable.originY = -textOffset[1];                    }                }                var isInside = textConfig.inside == null                    ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0)                    : textConfig.inside;                var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {});                var textFill = void 0;                var textStroke = void 0;                var autoStroke = void 0;                if (isInside && this.canBeInsideText()) {                    textFill = textConfig.insideFill;                    textStroke = textConfig.insideStroke;                    if (textFill == null || textFill === 'auto') {                        textFill = this.getInsideTextFill();                    }                    if (textStroke == null || textStroke === 'auto') {                        textStroke = this.getInsideTextStroke(textFill);                        autoStroke = true;                    }                }                else {                    textFill = textConfig.outsideFill;                    textStroke = textConfig.outsideStroke;                    if (textFill == null || textFill === 'auto') {                        textFill = this.getOutsideFill();                    }                    if (textStroke == null || textStroke === 'auto') {                        textStroke = this.getOutsideStroke(textFill);                        autoStroke = true;                    }                }                textFill = textFill || '#000';                if (textFill !== innerTextDefaultStyle.fill                    || textStroke !== innerTextDefaultStyle.stroke                    || autoStroke !== innerTextDefaultStyle.autoStroke                    || textAlign !== innerTextDefaultStyle.align                    || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) {                    textStyleChanged = true;                    innerTextDefaultStyle.fill = textFill;                    innerTextDefaultStyle.stroke = textStroke;                    innerTextDefaultStyle.autoStroke = autoStroke;                    innerTextDefaultStyle.align = textAlign;                    innerTextDefaultStyle.verticalAlign = textVerticalAlign;                    textEl.setDefaultTextStyle(innerTextDefaultStyle);                }                textEl.__dirty |= REDRAW_BIT;                if (textStyleChanged) {                    textEl.dirtyStyle(true);                }            }        };        Element.prototype.canBeInsideText = function () {            return true;        };        Element.prototype.getInsideTextFill = function () {            return '#fff';        };        Element.prototype.getInsideTextStroke = function (textFill) {            return '#000';        };        Element.prototype.getOutsideFill = function () {            return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR;        };        Element.prototype.getOutsideStroke = function (textFill) {            var backgroundColor = this.__zr && this.__zr.getBackgroundColor();            var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor);            if (!colorArr) {                colorArr = [255, 255, 255, 1];            }            var alpha = colorArr[3];            var isDark = this.__zr.isDarkMode();            for (var i = 0; i < 3; i++) {                colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha);            }            colorArr[3] = 1;            return stringify(colorArr, 'rgba');        };        Element.prototype.traverse = function (cb, context) { };        Element.prototype.attrKV = function (key, value) {            if (key === 'textConfig') {                this.setTextConfig(value);            }            else if (key === 'textContent') {                this.setTextContent(value);            }            else if (key === 'clipPath') {                this.setClipPath(value);            }            else if (key === 'extra') {                this.extra = this.extra || {};                extend(this.extra, value);            }            else {                this[key] = value;            }        };        Element.prototype.hide = function () {            this.ignore = true;            this.markRedraw();        };        Element.prototype.show = function () {            this.ignore = false;            this.markRedraw();        };        Element.prototype.attr = function (keyOrObj, value) {            if (typeof keyOrObj === 'string') {                this.attrKV(keyOrObj, value);            }            else if (isObject(keyOrObj)) {                var obj = keyOrObj;                var keysArr = keys(obj);                for (var i = 0; i < keysArr.length; i++) {                    var key = keysArr[i];                    this.attrKV(key, keyOrObj[key]);                }            }            this.markRedraw();            return this;        };        Element.prototype.saveCurrentToNormalState = function (toState) {            this._innerSaveToNormal(toState);            var normalState = this._normalState;            for (var i = 0; i < this.animators.length; i++) {                var animator = this.animators[i];                var fromStateTransition = animator.__fromStateTransition;                if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) {                    continue;                }                var targetName = animator.targetName;                var target = targetName                    ? normalState[targetName] : normalState;                animator.saveTo(target);            }        };        Element.prototype._innerSaveToNormal = function (toState) {            var normalState = this._normalState;            if (!normalState) {                normalState = this._normalState = {};            }            if (toState.textConfig && !normalState.textConfig) {                normalState.textConfig = this.textConfig;            }            this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS);        };        Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) {            for (var i = 0; i < primaryKeys.length; i++) {                var key = primaryKeys[i];                if (toState[key] != null && !(key in normalState)) {                    normalState[key] = this[key];                }            }        };        Element.prototype.hasState = function () {            return this.currentStates.length > 0;        };        Element.prototype.getState = function (name) {            return this.states[name];        };        Element.prototype.ensureState = function (name) {            var states = this.states;            if (!states[name]) {                states[name] = {};            }            return states[name];        };        Element.prototype.clearStates = function (noAnimation) {            this.useState(PRESERVED_NORMAL_STATE, false, noAnimation);        };        Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) {            var toNormalState = stateName === PRESERVED_NORMAL_STATE;            var hasStates = this.hasState();            if (!hasStates && toNormalState) {                return;            }            var currentStates = this.currentStates;            var animationCfg = this.stateTransition;            if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) {                return;            }            var state;            if (this.stateProxy && !toNormalState) {                state = this.stateProxy(stateName);            }            if (!state) {                state = (this.states && this.states[stateName]);            }            if (!state && !toNormalState) {                logError("State " + stateName + " not exists.");                return;            }            if (!toNormalState) {                this.saveCurrentToNormalState(state);            }            var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer);            if (useHoverLayer) {                this._toggleHoverLayerFlag(true);            }            this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);            var textContent = this._textContent;            var textGuide = this._textGuide;            if (textContent) {                textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);            }            if (textGuide) {                textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);            }            if (toNormalState) {                this.currentStates = [];                this._normalState = {};            }            else {                if (!keepCurrentStates) {                    this.currentStates = [stateName];                }                else {                    this.currentStates.push(stateName);                }            }            this._updateAnimationTargets();            this.markRedraw();            if (!useHoverLayer && this.__inHover) {                this._toggleHoverLayerFlag(false);                this.__dirty &= ~REDRAW_BIT;            }            return state;        };        Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) {            if (!states.length) {                this.clearStates();            }            else {                var stateObjects = [];                var currentStates = this.currentStates;                var len = states.length;                var notChange = len === currentStates.length;                if (notChange) {                    for (var i = 0; i < len; i++) {                        if (states[i] !== currentStates[i]) {                            notChange = false;                            break;                        }                    }                }                if (notChange) {                    return;                }                for (var i = 0; i < len; i++) {                    var stateName = states[i];                    var stateObj = void 0;                    if (this.stateProxy) {                        stateObj = this.stateProxy(stateName, states);                    }                    if (!stateObj) {                        stateObj = this.states[stateName];                    }                    if (stateObj) {                        stateObjects.push(stateObj);                    }                }                var lastStateObj = stateObjects[len - 1];                var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer);                if (useHoverLayer) {                    this._toggleHoverLayerFlag(true);                }                var mergedState = this._mergeStates(stateObjects);                var animationCfg = this.stateTransition;                this.saveCurrentToNormalState(mergedState);                this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);                var textContent = this._textContent;                var textGuide = this._textGuide;                if (textContent) {                    textContent.useStates(states, noAnimation, useHoverLayer);                }                if (textGuide) {                    textGuide.useStates(states, noAnimation, useHoverLayer);                }                this._updateAnimationTargets();                this.currentStates = states.slice();                this.markRedraw();                if (!useHoverLayer && this.__inHover) {                    this._toggleHoverLayerFlag(false);                    this.__dirty &= ~REDRAW_BIT;                }            }        };        Element.prototype.isSilent = function () {            var isSilent = this.silent;            var ancestor = this.parent;            while (!isSilent && ancestor) {                if (ancestor.silent) {                    isSilent = true;                    break;                }                ancestor = ancestor.parent;            }            return isSilent;        };        Element.prototype._updateAnimationTargets = function () {            for (var i = 0; i < this.animators.length; i++) {                var animator = this.animators[i];                if (animator.targetName) {                    animator.changeTarget(this[animator.targetName]);                }            }        };        Element.prototype.removeState = function (state) {            var idx = indexOf(this.currentStates, state);            if (idx >= 0) {                var currentStates = this.currentStates.slice();                currentStates.splice(idx, 1);                this.useStates(currentStates);            }        };        Element.prototype.replaceState = function (oldState, newState, forceAdd) {            var currentStates = this.currentStates.slice();            var idx = indexOf(currentStates, oldState);            var newStateExists = indexOf(currentStates, newState) >= 0;            if (idx >= 0) {                if (!newStateExists) {                    currentStates[idx] = newState;                }                else {                    currentStates.splice(idx, 1);                }            }            else if (forceAdd && !newStateExists) {                currentStates.push(newState);            }            this.useStates(currentStates);        };        Element.prototype.toggleState = function (state, enable) {            if (enable) {                this.useState(state, true);            }            else {                this.removeState(state);            }        };        Element.prototype._mergeStates = function (states) {            var mergedState = {};            var mergedTextConfig;            for (var i = 0; i < states.length; i++) {                var state = states[i];                extend(mergedState, state);                if (state.textConfig) {                    mergedTextConfig = mergedTextConfig || {};                    extend(mergedTextConfig, state.textConfig);                }            }            if (mergedTextConfig) {                mergedState.textConfig = mergedTextConfig;            }            return mergedState;        };        Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {            var needsRestoreToNormal = !(state && keepCurrentStates);            if (state && state.textConfig) {                this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig);                extend(this.textConfig, state.textConfig);            }            else if (needsRestoreToNormal) {                if (normalState.textConfig) {                    this.textConfig = normalState.textConfig;                }            }            var transitionTarget = {};            var hasTransition = false;            for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) {                var key = PRIMARY_STATES_KEYS[i];                var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key];                if (state && state[key] != null) {                    if (propNeedsTransition) {                        hasTransition = true;                        transitionTarget[key] = state[key];                    }                    else {                        this[key] = state[key];                    }                }                else if (needsRestoreToNormal) {                    if (normalState[key] != null) {                        if (propNeedsTransition) {                            hasTransition = true;                            transitionTarget[key] = normalState[key];                        }                        else {                            this[key] = normalState[key];                        }                    }                }            }            if (!transition) {                for (var i = 0; i < this.animators.length; i++) {                    var animator = this.animators[i];                    var targetName = animator.targetName;                    if (!animator.getLoop()) {                        animator.__changeFinalValue(targetName                            ? (state || normalState)[targetName]                            : (state || normalState));                    }                }            }            if (hasTransition) {                this._transitionState(stateName, transitionTarget, animationCfg);            }        };        Element.prototype._attachComponent = function (componentEl) {            if (componentEl.__zr && !componentEl.__hostTarget) {                {                    throw new Error('Text element has been added to zrender.');                }            }            if (componentEl === this) {                {                    throw new Error('Recursive component attachment.');                }            }            var zr = this.__zr;            if (zr) {                componentEl.addSelfToZr(zr);            }            componentEl.__zr = zr;            componentEl.__hostTarget = this;        };        Element.prototype._detachComponent = function (componentEl) {            if (componentEl.__zr) {                componentEl.removeSelfFromZr(componentEl.__zr);            }            componentEl.__zr = null;            componentEl.__hostTarget = null;        };        Element.prototype.getClipPath = function () {            return this._clipPath;        };        Element.prototype.setClipPath = function (clipPath) {            if (this._clipPath && this._clipPath !== clipPath) {                this.removeClipPath();            }            this._attachComponent(clipPath);            this._clipPath = clipPath;            this.markRedraw();        };        Element.prototype.removeClipPath = function () {            var clipPath = this._clipPath;            if (clipPath) {                this._detachComponent(clipPath);                this._clipPath = null;                this.markRedraw();            }        };        Element.prototype.getTextContent = function () {            return this._textContent;        };        Element.prototype.setTextContent = function (textEl) {            var previousTextContent = this._textContent;            if (previousTextContent === textEl) {                return;            }            if (previousTextContent && previousTextContent !== textEl) {                this.removeTextContent();            }            {                if (textEl.__zr && !textEl.__hostTarget) {                    throw new Error('Text element has been added to zrender.');                }            }            textEl.innerTransformable = new Transformable();            this._attachComponent(textEl);            this._textContent = textEl;            this.markRedraw();        };        Element.prototype.setTextConfig = function (cfg) {            if (!this.textConfig) {                this.textConfig = {};            }            extend(this.textConfig, cfg);            this.markRedraw();        };        Element.prototype.removeTextConfig = function () {            this.textConfig = null;            this.markRedraw();        };        Element.prototype.removeTextContent = function () {            var textEl = this._textContent;            if (textEl) {                textEl.innerTransformable = null;                this._detachComponent(textEl);                this._textContent = null;                this._innerTextDefaultStyle = null;                this.markRedraw();            }        };        Element.prototype.getTextGuideLine = function () {            return this._textGuide;        };        Element.prototype.setTextGuideLine = function (guideLine) {            if (this._textGuide && this._textGuide !== guideLine) {                this.removeTextGuideLine();            }            this._attachComponent(guideLine);            this._textGuide = guideLine;            this.markRedraw();        };        Element.prototype.removeTextGuideLine = function () {            var textGuide = this._textGuide;            if (textGuide) {                this._detachComponent(textGuide);                this._textGuide = null;                this.markRedraw();            }        };        Element.prototype.markRedraw = function () {            this.__dirty |= REDRAW_BIT;            var zr = this.__zr;            if (zr) {                if (this.__inHover) {                    zr.refreshHover();                }                else {                    zr.refresh();                }            }            if (this.__hostTarget) {                this.__hostTarget.markRedraw();            }        };        Element.prototype.dirty = function () {            this.markRedraw();        };        Element.prototype._toggleHoverLayerFlag = function (inHover) {            this.__inHover = inHover;            var textContent = this._textContent;            var textGuide = this._textGuide;            if (textContent) {                textContent.__inHover = inHover;            }            if (textGuide) {                textGuide.__inHover = inHover;            }        };        Element.prototype.addSelfToZr = function (zr) {            if (this.__zr === zr) {                return;            }            this.__zr = zr;            var animators = this.animators;            if (animators) {                for (var i = 0; i < animators.length; i++) {                    zr.animation.addAnimator(animators[i]);                }            }            if (this._clipPath) {                this._clipPath.addSelfToZr(zr);            }            if (this._textContent) {                this._textContent.addSelfToZr(zr);            }            if (this._textGuide) {                this._textGuide.addSelfToZr(zr);            }        };        Element.prototype.removeSelfFromZr = function (zr) {            if (!this.__zr) {                return;            }            this.__zr = null;            var animators = this.animators;            if (animators) {                for (var i = 0; i < animators.length; i++) {                    zr.animation.removeAnimator(animators[i]);                }            }            if (this._clipPath) {                this._clipPath.removeSelfFromZr(zr);            }            if (this._textContent) {                this._textContent.removeSelfFromZr(zr);            }            if (this._textGuide) {                this._textGuide.removeSelfFromZr(zr);            }        };        Element.prototype.animate = function (key, loop, allowDiscreteAnimation) {            var target = key ? this[key] : this;            {                if (!target) {                    logError('Property "'                        + key                        + '" is not existed in element '                        + this.id);                    return;                }            }            var animator = new Animator(target, loop, allowDiscreteAnimation);            key && (animator.targetName = key);            this.addAnimator(animator, key);            return animator;        };        Element.prototype.addAnimator = function (animator, key) {            var zr = this.__zr;            var el = this;            animator.during(function () {                el.updateDuringAnimation(key);            }).done(function () {                var animators = el.animators;                var idx = indexOf(animators, animator);                if (idx >= 0) {                    animators.splice(idx, 1);                }            });            this.animators.push(animator);            if (zr) {                zr.animation.addAnimator(animator);            }            zr && zr.wakeUp();        };        Element.prototype.updateDuringAnimation = function (key) {            this.markRedraw();        };        Element.prototype.stopAnimation = function (scope, forwardToLast) {            var animators = this.animators;            var len = animators.length;            var leftAnimators = [];            for (var i = 0; i < len; i++) {                var animator = animators[i];                if (!scope || scope === animator.scope) {                    animator.stop(forwardToLast);                }                else {                    leftAnimators.push(animator);                }            }            this.animators = leftAnimators;            return this;        };        Element.prototype.animateTo = function (target, cfg, animationProps) {            animateTo(this, target, cfg, animationProps);        };        Element.prototype.animateFrom = function (target, cfg, animationProps) {            animateTo(this, target, cfg, animationProps, true);        };        Element.prototype._transitionState = function (stateName, target, cfg, animationProps) {            var animators = animateTo(this, target, cfg, animationProps);            for (var i = 0; i < animators.length; i++) {                animators[i].__fromStateTransition = stateName;            }        };        Element.prototype.getBoundingRect = function () {            return null;        };        Element.prototype.getPaintRect = function () {            return null;        };        Element.initDefaultProps = (function () {            var elProto = Element.prototype;            elProto.type = 'element';            elProto.name = '';            elProto.ignore =                elProto.silent =                    elProto.isGroup =                        elProto.draggable =                            elProto.dragging =                                elProto.ignoreClip =                                    elProto.__inHover = false;            elProto.__dirty = REDRAW_BIT;            var logs = {};            function logDeprecatedError(key, xKey, yKey) {                if (!logs[key + xKey + yKey]) {                    console.warn("DEPRECATED: '" + key + "' has been deprecated. use '" + xKey + "', '" + yKey + "' instead");                    logs[key + xKey + yKey] = true;                }            }            function createLegacyProperty(key, privateKey, xKey, yKey) {                Object.defineProperty(elProto, key, {                    get: function () {                        {                            logDeprecatedError(key, xKey, yKey);                        }                        if (!this[privateKey]) {                            var pos = this[privateKey] = [];                            enhanceArray(this, pos);                        }                        return this[privateKey];                    },                    set: function (pos) {                        {                            logDeprecatedError(key, xKey, yKey);                        }                        this[xKey] = pos[0];                        this[yKey] = pos[1];                        this[privateKey] = pos;                        enhanceArray(this, pos);                    }                });                function enhanceArray(self, pos) {                    Object.defineProperty(pos, 0, {                        get: function () {                            return self[xKey];                        },                        set: function (val) {                            self[xKey] = val;                        }                    });                    Object.defineProperty(pos, 1, {                        get: function () {                            return self[yKey];                        },                        set: function (val) {                            self[yKey] = val;                        }                    });                }            }            if (Object.defineProperty) {                createLegacyProperty('position', '_legacyPos', 'x', 'y');                createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY');                createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY');            }        })();        return Element;    }());    mixin(Element, Eventful);    mixin(Element, Transformable);    function animateTo(animatable, target, cfg, animationProps, reverse) {        cfg = cfg || {};        var animators = [];        animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse);        var finishCount = animators.length;        var doneHappened = false;        var cfgDone = cfg.done;        var cfgAborted = cfg.aborted;        var doneCb = function () {            doneHappened = true;            finishCount--;            if (finishCount <= 0) {                doneHappened                    ? (cfgDone && cfgDone())                    : (cfgAborted && cfgAborted());            }        };        var abortedCb = function () {            finishCount--;            if (finishCount <= 0) {                doneHappened                    ? (cfgDone && cfgDone())                    : (cfgAborted && cfgAborted());            }        };        if (!finishCount) {            cfgDone && cfgDone();        }        if (animators.length > 0 && cfg.during) {            animators[0].during(function (target, percent) {                cfg.during(percent);            });        }        for (var i = 0; i < animators.length; i++) {            var animator = animators[i];            if (doneCb) {                animator.done(doneCb);            }            if (abortedCb) {                animator.aborted(abortedCb);            }            if (cfg.force) {                animator.duration(cfg.duration);            }            animator.start(cfg.easing);        }        return animators;    }    function copyArrShallow(source, target, len) {        for (var i = 0; i < len; i++) {            source[i] = target[i];        }    }    function is2DArray(value) {        return isArrayLike(value[0]);    }    function copyValue(target, source, key) {        if (isArrayLike(source[key])) {            if (!isArrayLike(target[key])) {                target[key] = [];            }            if (isTypedArray(source[key])) {                var len = source[key].length;                if (target[key].length !== len) {                    target[key] = new (source[key].constructor)(len);                    copyArrShallow(target[key], source[key], len);                }            }            else {                var sourceArr = source[key];                var targetArr = target[key];                var len0 = sourceArr.length;                if (is2DArray(sourceArr)) {                    var len1 = sourceArr[0].length;                    for (var i = 0; i < len0; i++) {                        if (!targetArr[i]) {                            targetArr[i] = Array.prototype.slice.call(sourceArr[i]);                        }                        else {                            copyArrShallow(targetArr[i], sourceArr[i], len1);                        }                    }                }                else {                    copyArrShallow(targetArr, sourceArr, len0);                }                targetArr.length = sourceArr.length;            }        }        else {            target[key] = source[key];        }    }    function isValueSame(val1, val2) {        return val1 === val2            || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2);    }    function is1DArraySame(arr0, arr1) {        var len = arr0.length;        if (len !== arr1.length) {            return false;        }        for (var i = 0; i < len; i++) {            if (arr0[i] !== arr1[i]) {                return false;            }        }        return true;    }    function animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) {        var targetKeys = keys(target);        var duration = cfg.duration;        var delay = cfg.delay;        var additive = cfg.additive;        var setToFinal = cfg.setToFinal;        var animateAll = !isObject(animationProps);        var existsAnimators = animatable.animators;        var animationKeys = [];        for (var k = 0; k < targetKeys.length; k++) {            var innerKey = targetKeys[k];            var targetVal = target[innerKey];            if (targetVal != null && animateObj[innerKey] != null                && (animateAll || animationProps[innerKey])) {                if (isObject(targetVal)                    && !isArrayLike(targetVal)                    && !isGradientObject(targetVal)) {                    if (topKey) {                        if (!reverse) {                            animateObj[innerKey] = targetVal;                            animatable.updateDuringAnimation(topKey);                        }                        continue;                    }                    animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse);                }                else {                    animationKeys.push(innerKey);                }            }            else if (!reverse) {                animateObj[innerKey] = targetVal;                animatable.updateDuringAnimation(topKey);                animationKeys.push(innerKey);            }        }        var keyLen = animationKeys.length;        if (!additive && keyLen) {            for (var i = 0; i < existsAnimators.length; i++) {                var animator = existsAnimators[i];                if (animator.targetName === topKey) {                    var allAborted = animator.stopTracks(animationKeys);                    if (allAborted) {                        var idx = indexOf(existsAnimators, animator);                        existsAnimators.splice(idx, 1);                    }                }            }        }        if (!cfg.force) {            animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); });            keyLen = animationKeys.length;        }        if (keyLen > 0            || (cfg.force && !animators.length)) {            var revertedSource = void 0;            var reversedTarget = void 0;            var sourceClone = void 0;            if (reverse) {                reversedTarget = {};                if (setToFinal) {                    revertedSource = {};                }                for (var i = 0; i < keyLen; i++) {                    var innerKey = animationKeys[i];                    reversedTarget[innerKey] = animateObj[innerKey];                    if (setToFinal) {                        revertedSource[innerKey] = target[innerKey];                    }                    else {                        animateObj[innerKey] = target[innerKey];                    }                }            }            else if (setToFinal) {                sourceClone = {};                for (var i = 0; i < keyLen; i++) {                    var innerKey = animationKeys[i];                    sourceClone[innerKey] = cloneValue(animateObj[innerKey]);                    copyValue(animateObj, target, innerKey);                }            }            var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null);            animator.targetName = topKey;            if (cfg.scope) {                animator.scope = cfg.scope;            }            if (setToFinal && revertedSource) {                animator.whenWithKeys(0, revertedSource, animationKeys);            }            if (sourceClone) {                animator.whenWithKeys(0, sourceClone, animationKeys);            }            animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0);            animatable.addAnimator(animator, topKey);            animators.push(animator);        }    }    var Group = (function (_super) {        __extends(Group, _super);        function Group(opts) {            var _this = _super.call(this) || this;            _this.isGroup = true;            _this._children = [];            _this.attr(opts);            return _this;        }        Group.prototype.childrenRef = function () {            return this._children;        };        Group.prototype.children = function () {            return this._children.slice();        };        Group.prototype.childAt = function (idx) {            return this._children[idx];        };        Group.prototype.childOfName = function (name) {            var children = this._children;            for (var i = 0; i < children.length; i++) {                if (children[i].name === name) {                    return children[i];                }            }        };        Group.prototype.childCount = function () {            return this._children.length;        };        Group.prototype.add = function (child) {            if (child) {                if (child !== this && child.parent !== this) {                    this._children.push(child);                    this._doAdd(child);                }                {                    if (child.__hostTarget) {                        throw 'This elemenet has been used as an attachment';                    }                }            }            return this;        };        Group.prototype.addBefore = function (child, nextSibling) {            if (child && child !== this && child.parent !== this                && nextSibling && nextSibling.parent === this) {                var children = this._children;                var idx = children.indexOf(nextSibling);                if (idx >= 0) {                    children.splice(idx, 0, child);                    this._doAdd(child);                }            }            return this;        };        Group.prototype.replace = function (oldChild, newChild) {            var idx = indexOf(this._children, oldChild);            if (idx >= 0) {                this.replaceAt(newChild, idx);            }            return this;        };        Group.prototype.replaceAt = function (child, index) {            var children = this._children;            var old = children[index];            if (child && child !== this && child.parent !== this && child !== old) {                children[index] = child;                old.parent = null;                var zr = this.__zr;                if (zr) {                    old.removeSelfFromZr(zr);                }                this._doAdd(child);            }            return this;        };        Group.prototype._doAdd = function (child) {            if (child.parent) {                child.parent.remove(child);            }            child.parent = this;            var zr = this.__zr;            if (zr && zr !== child.__zr) {                child.addSelfToZr(zr);            }            zr && zr.refresh();        };        Group.prototype.remove = function (child) {            var zr = this.__zr;            var children = this._children;            var idx = indexOf(children, child);            if (idx < 0) {                return this;            }            children.splice(idx, 1);            child.parent = null;            if (zr) {                child.removeSelfFromZr(zr);            }            zr && zr.refresh();            return this;        };        Group.prototype.removeAll = function () {            var children = this._children;            var zr = this.__zr;            for (var i = 0; i < children.length; i++) {                var child = children[i];                if (zr) {                    child.removeSelfFromZr(zr);                }                child.parent = null;            }            children.length = 0;            return this;        };        Group.prototype.eachChild = function (cb, context) {            var children = this._children;            for (var i = 0; i < children.length; i++) {                var child = children[i];                cb.call(context, child, i);            }            return this;        };        Group.prototype.traverse = function (cb, context) {            for (var i = 0; i < this._children.length; i++) {                var child = this._children[i];                var stopped = cb.call(context, child);                if (child.isGroup && !stopped) {                    child.traverse(cb, context);                }            }            return this;        };        Group.prototype.addSelfToZr = function (zr) {            _super.prototype.addSelfToZr.call(this, zr);            for (var i = 0; i < this._children.length; i++) {                var child = this._children[i];                child.addSelfToZr(zr);            }        };        Group.prototype.removeSelfFromZr = function (zr) {            _super.prototype.removeSelfFromZr.call(this, zr);            for (var i = 0; i < this._children.length; i++) {                var child = this._children[i];                child.removeSelfFromZr(zr);            }        };        Group.prototype.getBoundingRect = function (includeChildren) {            var tmpRect = new BoundingRect(0, 0, 0, 0);            var children = includeChildren || this._children;            var tmpMat = [];            var rect = null;            for (var i = 0; i < children.length; i++) {                var child = children[i];                if (child.ignore || child.invisible) {                    continue;                }                var childRect = child.getBoundingRect();                var transform = child.getLocalTransform(tmpMat);                if (transform) {                    BoundingRect.applyTransform(tmpRect, childRect, transform);                    rect = rect || tmpRect.clone();                    rect.union(tmpRect);                }                else {                    rect = rect || childRect.clone();                    rect.union(childRect);                }            }            return rect || tmpRect;        };        return Group;    }(Element));    Group.prototype.type = 'group';    /*!    * ZRender, a high performance 2d drawing library.    *    * Copyright (c) 2013, Baidu Inc.    * All rights reserved.    *    * LICENSE    * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt    */    var painterCtors = {};    var instances = {};    function delInstance(id) {        delete instances[id];    }    function isDarkMode(backgroundColor) {        if (!backgroundColor) {            return false;        }        if (typeof backgroundColor === 'string') {            return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD;        }        else if (backgroundColor.colorStops) {            var colorStops = backgroundColor.colorStops;            var totalLum = 0;            var len = colorStops.length;            for (var i = 0; i < len; i++) {                totalLum += lum(colorStops[i].color, 1);            }            totalLum /= len;            return totalLum < DARK_MODE_THRESHOLD;        }        return false;    }    var ZRender = (function () {        function ZRender(id, dom, opts) {            var _this = this;            this._sleepAfterStill = 10;            this._stillFrameAccum = 0;            this._needsRefresh = true;            this._needsRefreshHover = true;            this._darkMode = false;            opts = opts || {};            this.dom = dom;            this.id = id;            var storage = new Storage();            var rendererType = opts.renderer || 'canvas';            if (!painterCtors[rendererType]) {                rendererType = keys(painterCtors)[0];            }            {                if (!painterCtors[rendererType]) {                    throw new Error("Renderer '" + rendererType + "' is not imported. Please import it first.");                }            }            opts.useDirtyRect = opts.useDirtyRect == null                ? false                : opts.useDirtyRect;            var painter = new painterCtors[rendererType](dom, storage, opts, id);            var ssrMode = opts.ssr || painter.ssrOnly;            this.storage = storage;            this.painter = painter;            var handlerProxy = (!env.node && !env.worker && !ssrMode)                ? new HandlerDomProxy(painter.getViewportRoot(), painter.root)                : null;            var useCoarsePointer = opts.useCoarsePointer;            var usePointerSize = (useCoarsePointer == null || useCoarsePointer === 'auto')                ? env.touchEventsSupported                : !!useCoarsePointer;            var defaultPointerSize = 44;            var pointerSize;            if (usePointerSize) {                pointerSize = retrieve2(opts.pointerSize, defaultPointerSize);            }            this.handler = new Handler(storage, painter, handlerProxy, painter.root, pointerSize);            this.animation = new Animation({                stage: {                    update: ssrMode ? null : function () { return _this._flush(true); }                }            });            if (!ssrMode) {                this.animation.start();            }        }        ZRender.prototype.add = function (el) {            if (this._disposed || !el) {                return;            }            this.storage.addRoot(el);            el.addSelfToZr(this);            this.refresh();        };        ZRender.prototype.remove = function (el) {            if (this._disposed || !el) {                return;            }            this.storage.delRoot(el);            el.removeSelfFromZr(this);            this.refresh();        };        ZRender.prototype.configLayer = function (zLevel, config) {            if (this._disposed) {                return;            }            if (this.painter.configLayer) {                this.painter.configLayer(zLevel, config);            }            this.refresh();        };        ZRender.prototype.setBackgroundColor = function (backgroundColor) {            if (this._disposed) {                return;            }            if (this.painter.setBackgroundColor) {                this.painter.setBackgroundColor(backgroundColor);            }            this.refresh();            this._backgroundColor = backgroundColor;            this._darkMode = isDarkMode(backgroundColor);        };        ZRender.prototype.getBackgroundColor = function () {            return this._backgroundColor;        };        ZRender.prototype.setDarkMode = function (darkMode) {            this._darkMode = darkMode;        };        ZRender.prototype.isDarkMode = function () {            return this._darkMode;        };        ZRender.prototype.refreshImmediately = function (fromInside) {            if (this._disposed) {                return;            }            if (!fromInside) {                this.animation.update(true);            }            this._needsRefresh = false;            this.painter.refresh();            this._needsRefresh = false;        };        ZRender.prototype.refresh = function () {            if (this._disposed) {                return;            }            this._needsRefresh = true;            this.animation.start();        };        ZRender.prototype.flush = function () {            if (this._disposed) {                return;            }            this._flush(false);        };        ZRender.prototype._flush = function (fromInside) {            var triggerRendered;            var start = getTime();            if (this._needsRefresh) {                triggerRendered = true;                this.refreshImmediately(fromInside);            }            if (this._needsRefreshHover) {                triggerRendered = true;                this.refreshHoverImmediately();            }            var end = getTime();            if (triggerRendered) {                this._stillFrameAccum = 0;                this.trigger('rendered', {                    elapsedTime: end - start                });            }            else if (this._sleepAfterStill > 0) {                this._stillFrameAccum++;                if (this._stillFrameAccum > this._sleepAfterStill) {                    this.animation.stop();                }            }        };        ZRender.prototype.setSleepAfterStill = function (stillFramesCount) {            this._sleepAfterStill = stillFramesCount;        };        ZRender.prototype.wakeUp = function () {            if (this._disposed) {                return;            }            this.animation.start();            this._stillFrameAccum = 0;        };        ZRender.prototype.refreshHover = function () {            this._needsRefreshHover = true;        };        ZRender.prototype.refreshHoverImmediately = function () {            if (this._disposed) {                return;            }            this._needsRefreshHover = false;            if (this.painter.refreshHover && this.painter.getType() === 'canvas') {                this.painter.refreshHover();            }        };        ZRender.prototype.resize = function (opts) {            if (this._disposed) {                return;            }            opts = opts || {};            this.painter.resize(opts.width, opts.height);            this.handler.resize();        };        ZRender.prototype.clearAnimation = function () {            if (this._disposed) {                return;            }            this.animation.clear();        };        ZRender.prototype.getWidth = function () {            if (this._disposed) {                return;            }            return this.painter.getWidth();        };        ZRender.prototype.getHeight = function () {            if (this._disposed) {                return;            }            return this.painter.getHeight();        };        ZRender.prototype.setCursorStyle = function (cursorStyle) {            if (this._disposed) {                return;            }            this.handler.setCursorStyle(cursorStyle);        };        ZRender.prototype.findHover = function (x, y) {            if (this._disposed) {                return;            }            return this.handler.findHover(x, y);        };        ZRender.prototype.on = function (eventName, eventHandler, context) {            if (!this._disposed) {                this.handler.on(eventName, eventHandler, context);            }            return this;        };        ZRender.prototype.off = function (eventName, eventHandler) {            if (this._disposed) {                return;            }            this.handler.off(eventName, eventHandler);        };        ZRender.prototype.trigger = function (eventName, event) {            if (this._disposed) {                return;            }            this.handler.trigger(eventName, event);        };        ZRender.prototype.clear = function () {            if (this._disposed) {                return;            }            var roots = this.storage.getRoots();            for (var i = 0; i < roots.length; i++) {                if (roots[i] instanceof Group) {                    roots[i].removeSelfFromZr(this);                }            }            this.storage.delAllRoots();            this.painter.clear();        };        ZRender.prototype.dispose = function () {            if (this._disposed) {                return;            }            this.animation.stop();            this.clear();            this.storage.dispose();            this.painter.dispose();            this.handler.dispose();            this.animation =                this.storage =                    this.painter =                        this.handler = null;            this._disposed = true;            delInstance(this.id);        };        return ZRender;    }());    function init(dom, opts) {        var zr = new ZRender(guid(), dom, opts);        instances[zr.id] = zr;        return zr;    }    function dispose(zr) {        zr.dispose();    }    function disposeAll() {        for (var key in instances) {            if (instances.hasOwnProperty(key)) {                instances[key].dispose();            }        }        instances = {};    }    function getInstance(id) {        return instances[id];    }    function registerPainter(name, Ctor) {        painterCtors[name] = Ctor;    }    var ssrDataGetter;    function getElementSSRData(el) {        if (typeof ssrDataGetter === 'function') {            return ssrDataGetter(el);        }    }    function registerSSRDataGetter(getter) {        ssrDataGetter = getter;    }    var version = '5.5.0';    var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10));    var DEFAULT_COMMON_STYLE = {        shadowBlur: 0,        shadowOffsetX: 0,        shadowOffsetY: 0,        shadowColor: '#000',        opacity: 1,        blend: 'source-over'    };    var DEFAULT_COMMON_ANIMATION_PROPS = {        style: {            shadowBlur: true,            shadowOffsetX: true,            shadowOffsetY: true,            shadowColor: true,            opacity: true        }    };    DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true;    var PRIMARY_STATES_KEYS$1 = ['z', 'z2', 'invisible'];    var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible'];    var Displayable = (function (_super) {        __extends(Displayable, _super);        function Displayable(props) {            return _super.call(this, props) || this;        }        Displayable.prototype._init = function (props) {            var keysArr = keys(props);            for (var i = 0; i < keysArr.length; i++) {                var key = keysArr[i];                if (key === 'style') {                    this.useStyle(props[key]);                }                else {                    _super.prototype.attrKV.call(this, key, props[key]);                }            }            if (!this.style) {                this.useStyle({});            }        };        Displayable.prototype.beforeBrush = function () { };        Displayable.prototype.afterBrush = function () { };        Displayable.prototype.innerBeforeBrush = function () { };        Displayable.prototype.innerAfterBrush = function () { };        Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) {            var m = this.transform;            if (this.ignore                || this.invisible                || this.style.opacity === 0                || (this.culling                    && isDisplayableCulled(this, viewWidth, viewHeight))                || (m && !m[0] && !m[3])) {                return false;            }            if (considerClipPath && this.__clipPaths) {                for (var i = 0; i < this.__clipPaths.length; ++i) {                    if (this.__clipPaths[i].isZeroArea()) {                        return false;                    }                }            }            if (considerAncestors && this.parent) {                var parent_1 = this.parent;                while (parent_1) {                    if (parent_1.ignore) {                        return false;                    }                    parent_1 = parent_1.parent;                }            }            return true;        };        Displayable.prototype.contain = function (x, y) {            return this.rectContain(x, y);        };        Displayable.prototype.traverse = function (cb, context) {            cb.call(context, this);        };        Displayable.prototype.rectContain = function (x, y) {            var coord = this.transformCoordToLocal(x, y);            var rect = this.getBoundingRect();            return rect.contain(coord[0], coord[1]);        };        Displayable.prototype.getPaintRect = function () {            var rect = this._paintRect;            if (!this._paintRect || this.__dirty) {                var transform = this.transform;                var elRect = this.getBoundingRect();                var style = this.style;                var shadowSize = style.shadowBlur || 0;                var shadowOffsetX = style.shadowOffsetX || 0;                var shadowOffsetY = style.shadowOffsetY || 0;                rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0));                if (transform) {                    BoundingRect.applyTransform(rect, elRect, transform);                }                else {                    rect.copy(elRect);                }                if (shadowSize || shadowOffsetX || shadowOffsetY) {                    rect.width += shadowSize * 2 + Math.abs(shadowOffsetX);                    rect.height += shadowSize * 2 + Math.abs(shadowOffsetY);                    rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize);                    rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize);                }                var tolerance = this.dirtyRectTolerance;                if (!rect.isZero()) {                    rect.x = Math.floor(rect.x - tolerance);                    rect.y = Math.floor(rect.y - tolerance);                    rect.width = Math.ceil(rect.width + 1 + tolerance * 2);                    rect.height = Math.ceil(rect.height + 1 + tolerance * 2);                }            }            return rect;        };        Displayable.prototype.setPrevPaintRect = function (paintRect) {            if (paintRect) {                this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0);                this._prevPaintRect.copy(paintRect);            }            else {                this._prevPaintRect = null;            }        };        Displayable.prototype.getPrevPaintRect = function () {            return this._prevPaintRect;        };        Displayable.prototype.animateStyle = function (loop) {            return this.animate('style', loop);        };        Displayable.prototype.updateDuringAnimation = function (targetKey) {            if (targetKey === 'style') {                this.dirtyStyle();            }            else {                this.markRedraw();            }        };        Displayable.prototype.attrKV = function (key, value) {            if (key !== 'style') {                _super.prototype.attrKV.call(this, key, value);            }            else {                if (!this.style) {                    this.useStyle(value);                }                else {                    this.setStyle(value);                }            }        };        Displayable.prototype.setStyle = function (keyOrObj, value) {            if (typeof keyOrObj === 'string') {                this.style[keyOrObj] = value;            }            else {                extend(this.style, keyOrObj);            }            this.dirtyStyle();            return this;        };        Displayable.prototype.dirtyStyle = function (notRedraw) {            if (!notRedraw) {                this.markRedraw();            }            this.__dirty |= STYLE_CHANGED_BIT;            if (this._rect) {                this._rect = null;            }        };        Displayable.prototype.dirty = function () {            this.dirtyStyle();        };        Displayable.prototype.styleChanged = function () {            return !!(this.__dirty & STYLE_CHANGED_BIT);        };        Displayable.prototype.styleUpdated = function () {            this.__dirty &= ~STYLE_CHANGED_BIT;        };        Displayable.prototype.createStyle = function (obj) {            return createObject(DEFAULT_COMMON_STYLE, obj);        };        Displayable.prototype.useStyle = function (obj) {            if (!obj[STYLE_MAGIC_KEY]) {                obj = this.createStyle(obj);            }            if (this.__inHover) {                this.__hoverStyle = obj;            }            else {                this.style = obj;            }            this.dirtyStyle();        };        Displayable.prototype.isStyleObject = function (obj) {            return obj[STYLE_MAGIC_KEY];        };        Displayable.prototype._innerSaveToNormal = function (toState) {            _super.prototype._innerSaveToNormal.call(this, toState);            var normalState = this._normalState;            if (toState.style && !normalState.style) {                normalState.style = this._mergeStyle(this.createStyle(), this.style);            }            this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS$1);        };        Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {            _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);            var needsRestoreToNormal = !(state && keepCurrentStates);            var targetStyle;            if (state && state.style) {                if (transition) {                    if (keepCurrentStates) {                        targetStyle = state.style;                    }                    else {                        targetStyle = this._mergeStyle(this.createStyle(), normalState.style);                        this._mergeStyle(targetStyle, state.style);                    }                }                else {                    targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style);                    this._mergeStyle(targetStyle, state.style);                }            }            else if (needsRestoreToNormal) {                targetStyle = normalState.style;            }            if (targetStyle) {                if (transition) {                    var sourceStyle = this.style;                    this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle);                    if (needsRestoreToNormal) {                        var changedKeys = keys(sourceStyle);                        for (var i = 0; i < changedKeys.length; i++) {                            var key = changedKeys[i];                            if (key in targetStyle) {                                targetStyle[key] = targetStyle[key];                                this.style[key] = sourceStyle[key];                            }                        }                    }                    var targetKeys = keys(targetStyle);                    for (var i = 0; i < targetKeys.length; i++) {                        var key = targetKeys[i];                        this.style[key] = this.style[key];                    }                    this._transitionState(stateName, {                        style: targetStyle                    }, animationCfg, this.getAnimationStyleProps());                }                else {                    this.useStyle(targetStyle);                }            }            var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS$1;            for (var i = 0; i < statesKeys.length; i++) {                var key = statesKeys[i];                if (state && state[key] != null) {                    this[key] = state[key];                }                else if (needsRestoreToNormal) {                    if (normalState[key] != null) {                        this[key] = normalState[key];                    }                }            }        };        Displayable.prototype._mergeStates = function (states) {            var mergedState = _super.prototype._mergeStates.call(this, states);            var mergedStyle;            for (var i = 0; i < states.length; i++) {                var state = states[i];                if (state.style) {                    mergedStyle = mergedStyle || {};                    this._mergeStyle(mergedStyle, state.style);                }            }            if (mergedStyle) {                mergedState.style = mergedStyle;            }            return mergedState;        };        Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) {            extend(targetStyle, sourceStyle);            return targetStyle;        };        Displayable.prototype.getAnimationStyleProps = function () {            return DEFAULT_COMMON_ANIMATION_PROPS;        };        Displayable.initDefaultProps = (function () {            var dispProto = Displayable.prototype;            dispProto.type = 'displayable';            dispProto.invisible = false;            dispProto.z = 0;            dispProto.z2 = 0;            dispProto.zlevel = 0;            dispProto.culling = false;            dispProto.cursor = 'pointer';            dispProto.rectHover = false;            dispProto.incremental = false;            dispProto._rect = null;            dispProto.dirtyRectTolerance = 0;            dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT;        })();        return Displayable;    }(Element));    var tmpRect$1 = new BoundingRect(0, 0, 0, 0);    var viewRect = new BoundingRect(0, 0, 0, 0);    function isDisplayableCulled(el, width, height) {        tmpRect$1.copy(el.getBoundingRect());        if (el.transform) {            tmpRect$1.applyTransform(el.transform);        }        viewRect.width = width;        viewRect.height = height;        return !tmpRect$1.intersect(viewRect);    }    var mathMin$1 = Math.min;    var mathMax$1 = Math.max;    var mathSin = Math.sin;    var mathCos = Math.cos;    var PI2 = Math.PI * 2;    var start = create();    var end = create();    var extremity = create();    function fromPoints(points, min, max) {        if (points.length === 0) {            return;        }        var p = points[0];        var left = p[0];        var right = p[0];        var top = p[1];        var bottom = p[1];        for (var i = 1; i < points.length; i++) {            p = points[i];            left = mathMin$1(left, p[0]);            right = mathMax$1(right, p[0]);            top = mathMin$1(top, p[1]);            bottom = mathMax$1(bottom, p[1]);        }        min[0] = left;        min[1] = top;        max[0] = right;        max[1] = bottom;    }    function fromLine(x0, y0, x1, y1, min, max) {        min[0] = mathMin$1(x0, x1);        min[1] = mathMin$1(y0, y1);        max[0] = mathMax$1(x0, x1);        max[1] = mathMax$1(y0, y1);    }    var xDim = [];    var yDim = [];    function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) {        var cubicExtrema$1 = cubicExtrema;        var cubicAt$1 = cubicAt;        var n = cubicExtrema$1(x0, x1, x2, x3, xDim);        min[0] = Infinity;        min[1] = Infinity;        max[0] = -Infinity;        max[1] = -Infinity;        for (var i = 0; i < n; i++) {            var x = cubicAt$1(x0, x1, x2, x3, xDim[i]);            min[0] = mathMin$1(x, min[0]);            max[0] = mathMax$1(x, max[0]);        }        n = cubicExtrema$1(y0, y1, y2, y3, yDim);        for (var i = 0; i < n; i++) {            var y = cubicAt$1(y0, y1, y2, y3, yDim[i]);            min[1] = mathMin$1(y, min[1]);            max[1] = mathMax$1(y, max[1]);        }        min[0] = mathMin$1(x0, min[0]);        max[0] = mathMax$1(x0, max[0]);        min[0] = mathMin$1(x3, min[0]);        max[0] = mathMax$1(x3, max[0]);        min[1] = mathMin$1(y0, min[1]);        max[1] = mathMax$1(y0, max[1]);        min[1] = mathMin$1(y3, min[1]);        max[1] = mathMax$1(y3, max[1]);    }    function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {        var quadraticExtremum$1 = quadraticExtremum;        var quadraticAt$1 = quadraticAt;        var tx = mathMax$1(mathMin$1(quadraticExtremum$1(x0, x1, x2), 1), 0);        var ty = mathMax$1(mathMin$1(quadraticExtremum$1(y0, y1, y2), 1), 0);        var x = quadraticAt$1(x0, x1, x2, tx);        var y = quadraticAt$1(y0, y1, y2, ty);        min[0] = mathMin$1(x0, x2, x);        min[1] = mathMin$1(y0, y2, y);        max[0] = mathMax$1(x0, x2, x);        max[1] = mathMax$1(y0, y2, y);    }    function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$1, max$1) {        var vec2Min = min;        var vec2Max = max;        var diff = Math.abs(startAngle - endAngle);        if (diff % PI2 < 1e-4 && diff > 1e-4) {            min$1[0] = x - rx;            min$1[1] = y - ry;            max$1[0] = x + rx;            max$1[1] = y + ry;            return;        }        start[0] = mathCos(startAngle) * rx + x;        start[1] = mathSin(startAngle) * ry + y;        end[0] = mathCos(endAngle) * rx + x;        end[1] = mathSin(endAngle) * ry + y;        vec2Min(min$1, start, end);        vec2Max(max$1, start, end);        startAngle = startAngle % (PI2);        if (startAngle < 0) {            startAngle = startAngle + PI2;        }        endAngle = endAngle % (PI2);        if (endAngle < 0) {            endAngle = endAngle + PI2;        }        if (startAngle > endAngle && !anticlockwise) {            endAngle += PI2;        }        else if (startAngle < endAngle && anticlockwise) {            startAngle += PI2;        }        if (anticlockwise) {            var tmp = endAngle;            endAngle = startAngle;            startAngle = tmp;        }        for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {            if (angle > startAngle) {                extremity[0] = mathCos(angle) * rx + x;                extremity[1] = mathSin(angle) * ry + y;                vec2Min(min$1, extremity, min$1);                vec2Max(max$1, extremity, max$1);            }        }    }    var CMD = {        M: 1,        L: 2,        C: 3,        Q: 4,        A: 5,        Z: 6,        R: 7    };    var tmpOutX = [];    var tmpOutY = [];    var min$1 = [];    var max$1 = [];    var min2 = [];    var max2 = [];    var mathMin$2 = Math.min;    var mathMax$2 = Math.max;    var mathCos$1 = Math.cos;    var mathSin$1 = Math.sin;    var mathAbs = Math.abs;    var PI = Math.PI;    var PI2$1 = PI * 2;    var hasTypedArray = typeof Float32Array !== 'undefined';    var tmpAngles = [];    function modPI2(radian) {        var n = Math.round(radian / PI * 1e8) / 1e8;        return (n % 2) * PI;    }    function normalizeArcAngles(angles, anticlockwise) {        var newStartAngle = modPI2(angles[0]);        if (newStartAngle < 0) {            newStartAngle += PI2$1;        }        var delta = newStartAngle - angles[0];        var newEndAngle = angles[1];        newEndAngle += delta;        if (!anticlockwise && newEndAngle - newStartAngle >= PI2$1) {            newEndAngle = newStartAngle + PI2$1;        }        else if (anticlockwise && newStartAngle - newEndAngle >= PI2$1) {            newEndAngle = newStartAngle - PI2$1;        }        else if (!anticlockwise && newStartAngle > newEndAngle) {            newEndAngle = newStartAngle + (PI2$1 - modPI2(newStartAngle - newEndAngle));        }        else if (anticlockwise && newStartAngle < newEndAngle) {            newEndAngle = newStartAngle - (PI2$1 - modPI2(newEndAngle - newStartAngle));        }        angles[0] = newStartAngle;        angles[1] = newEndAngle;    }    var PathProxy = (function () {        function PathProxy(notSaveData) {            this.dpr = 1;            this._xi = 0;            this._yi = 0;            this._x0 = 0;            this._y0 = 0;            this._len = 0;            if (notSaveData) {                this._saveData = false;            }            if (this._saveData) {                this.data = [];            }        }        PathProxy.prototype.increaseVersion = function () {            this._version++;        };        PathProxy.prototype.getVersion = function () {            return this._version;        };        PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) {            segmentIgnoreThreshold = segmentIgnoreThreshold || 0;            if (segmentIgnoreThreshold > 0) {                this._ux = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sx) || 0;                this._uy = mathAbs(segmentIgnoreThreshold / devicePixelRatio / sy) || 0;            }        };        PathProxy.prototype.setDPR = function (dpr) {            this.dpr = dpr;        };        PathProxy.prototype.setContext = function (ctx) {            this._ctx = ctx;        };        PathProxy.prototype.getContext = function () {            return this._ctx;        };        PathProxy.prototype.beginPath = function () {            this._ctx && this._ctx.beginPath();            this.reset();            return this;        };        PathProxy.prototype.reset = function () {            if (this._saveData) {                this._len = 0;            }            if (this._pathSegLen) {                this._pathSegLen = null;                this._pathLen = 0;            }            this._version++;        };        PathProxy.prototype.moveTo = function (x, y) {            this._drawPendingPt();            this.addData(CMD.M, x, y);            this._ctx && this._ctx.moveTo(x, y);            this._x0 = x;            this._y0 = y;            this._xi = x;            this._yi = y;            return this;        };        PathProxy.prototype.lineTo = function (x, y) {            var dx = mathAbs(x - this._xi);            var dy = mathAbs(y - this._yi);            var exceedUnit = dx > this._ux || dy > this._uy;            this.addData(CMD.L, x, y);            if (this._ctx && exceedUnit) {                this._ctx.lineTo(x, y);            }            if (exceedUnit) {                this._xi = x;                this._yi = y;                this._pendingPtDist = 0;            }            else {                var d2 = dx * dx + dy * dy;                if (d2 > this._pendingPtDist) {                    this._pendingPtX = x;                    this._pendingPtY = y;                    this._pendingPtDist = d2;                }            }            return this;        };        PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) {            this._drawPendingPt();            this.addData(CMD.C, x1, y1, x2, y2, x3, y3);            if (this._ctx) {                this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);            }            this._xi = x3;            this._yi = y3;            return this;        };        PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) {            this._drawPendingPt();            this.addData(CMD.Q, x1, y1, x2, y2);            if (this._ctx) {                this._ctx.quadraticCurveTo(x1, y1, x2, y2);            }            this._xi = x2;            this._yi = y2;            return this;        };        PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {            this._drawPendingPt();            tmpAngles[0] = startAngle;            tmpAngles[1] = endAngle;            normalizeArcAngles(tmpAngles, anticlockwise);            startAngle = tmpAngles[0];            endAngle = tmpAngles[1];            var delta = endAngle - startAngle;            this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1);            this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);            this._xi = mathCos$1(endAngle) * r + cx;            this._yi = mathSin$1(endAngle) * r + cy;            return this;        };        PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) {            this._drawPendingPt();            if (this._ctx) {                this._ctx.arcTo(x1, y1, x2, y2, radius);            }            return this;        };        PathProxy.prototype.rect = function (x, y, w, h) {            this._drawPendingPt();            this._ctx && this._ctx.rect(x, y, w, h);            this.addData(CMD.R, x, y, w, h);            return this;        };        PathProxy.prototype.closePath = function () {            this._drawPendingPt();            this.addData(CMD.Z);            var ctx = this._ctx;            var x0 = this._x0;            var y0 = this._y0;            if (ctx) {                ctx.closePath();            }            this._xi = x0;            this._yi = y0;            return this;        };        PathProxy.prototype.fill = function (ctx) {            ctx && ctx.fill();            this.toStatic();        };        PathProxy.prototype.stroke = function (ctx) {            ctx && ctx.stroke();            this.toStatic();        };        PathProxy.prototype.len = function () {            return this._len;        };        PathProxy.prototype.setData = function (data) {            var len = data.length;            if (!(this.data && this.data.length === len) && hasTypedArray) {                this.data = new Float32Array(len);            }            for (var i = 0; i < len; i++) {                this.data[i] = data[i];            }            this._len = len;        };        PathProxy.prototype.appendPath = function (path) {            if (!(path instanceof Array)) {                path = [path];            }            var len = path.length;            var appendSize = 0;            var offset = this._len;            for (var i = 0; i < len; i++) {                appendSize += path[i].len();            }            if (hasTypedArray && (this.data instanceof Float32Array)) {                this.data = new Float32Array(offset + appendSize);            }            for (var i = 0; i < len; i++) {                var appendPathData = path[i].data;                for (var k = 0; k < appendPathData.length; k++) {                    this.data[offset++] = appendPathData[k];                }            }            this._len = offset;        };        PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) {            if (!this._saveData) {                return;            }            var data = this.data;            if (this._len + arguments.length > data.length) {                this._expandData();                data = this.data;            }            for (var i = 0; i < arguments.length; i++) {                data[this._len++] = arguments[i];            }        };        PathProxy.prototype._drawPendingPt = function () {            if (this._pendingPtDist > 0) {                this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY);                this._pendingPtDist = 0;            }        };        PathProxy.prototype._expandData = function () {            if (!(this.data instanceof Array)) {                var newData = [];                for (var i = 0; i < this._len; i++) {                    newData[i] = this.data[i];                }                this.data = newData;            }        };        PathProxy.prototype.toStatic = function () {            if (!this._saveData) {                return;            }            this._drawPendingPt();            var data = this.data;            if (data instanceof Array) {                data.length = this._len;                if (hasTypedArray && this._len > 11) {                    this.data = new Float32Array(data);                }            }        };        PathProxy.prototype.getBoundingRect = function () {            min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE;            max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE;            var data = this.data;            var xi = 0;            var yi = 0;            var x0 = 0;            var y0 = 0;            var i;            for (i = 0; i < this._len;) {                var cmd = data[i++];                var isFirst = i === 1;                if (isFirst) {                    xi = data[i];                    yi = data[i + 1];                    x0 = xi;                    y0 = yi;                }                switch (cmd) {                    case CMD.M:                        xi = x0 = data[i++];                        yi = y0 = data[i++];                        min2[0] = x0;                        min2[1] = y0;                        max2[0] = x0;                        max2[1] = y0;                        break;                    case CMD.L:                        fromLine(xi, yi, data[i], data[i + 1], min2, max2);                        xi = data[i++];                        yi = data[i++];                        break;                    case CMD.C:                        fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);                        xi = data[i++];                        yi = data[i++];                        break;                    case CMD.Q:                        fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);                        xi = data[i++];                        yi = data[i++];                        break;                    case CMD.A:                        var cx = data[i++];                        var cy = data[i++];                        var rx = data[i++];                        var ry = data[i++];                        var startAngle = data[i++];                        var endAngle = data[i++] + startAngle;                        i += 1;                        var anticlockwise = !data[i++];                        if (isFirst) {                            x0 = mathCos$1(startAngle) * rx + cx;                            y0 = mathSin$1(startAngle) * ry + cy;                        }                        fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);                        xi = mathCos$1(endAngle) * rx + cx;                        yi = mathSin$1(endAngle) * ry + cy;                        break;                    case CMD.R:                        x0 = xi = data[i++];                        y0 = yi = data[i++];                        var width = data[i++];                        var height = data[i++];                        fromLine(x0, y0, x0 + width, y0 + height, min2, max2);                        break;                    case CMD.Z:                        xi = x0;                        yi = y0;                        break;                }                min(min$1, min$1, min2);                max(max$1, max$1, max2);            }            if (i === 0) {                min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0;            }            return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]);        };        PathProxy.prototype._calculateLength = function () {            var data = this.data;            var len = this._len;            var ux = this._ux;            var uy = this._uy;            var xi = 0;            var yi = 0;            var x0 = 0;            var y0 = 0;            if (!this._pathSegLen) {                this._pathSegLen = [];            }            var pathSegLen = this._pathSegLen;            var pathTotalLen = 0;            var segCount = 0;            for (var i = 0; i < len;) {                var cmd = data[i++];                var isFirst = i === 1;                if (isFirst) {                    xi = data[i];                    yi = data[i + 1];                    x0 = xi;                    y0 = yi;                }                var l = -1;                switch (cmd) {                    case CMD.M:                        xi = x0 = data[i++];                        yi = y0 = data[i++];                        break;                    case CMD.L: {                        var x2 = data[i++];                        var y2 = data[i++];                        var dx = x2 - xi;                        var dy = y2 - yi;                        if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) {                            l = Math.sqrt(dx * dx + dy * dy);                            xi = x2;                            yi = y2;                        }                        break;                    }                    case CMD.C: {                        var x1 = data[i++];                        var y1 = data[i++];                        var x2 = data[i++];                        var y2 = data[i++];                        var x3 = data[i++];                        var y3 = data[i++];                        l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10);                        xi = x3;                        yi = y3;                        break;                    }                    case CMD.Q: {                        var x1 = data[i++];                        var y1 = data[i++];                        var x2 = data[i++];                        var y2 = data[i++];                        l = quadraticLength(xi, yi, x1, y1, x2, y2, 10);                        xi = x2;                        yi = y2;                        break;                    }                    case CMD.A:                        var cx = data[i++];                        var cy = data[i++];                        var rx = data[i++];                        var ry = data[i++];                        var startAngle = data[i++];                        var delta = data[i++];                        var endAngle = delta + startAngle;                        i += 1;                        if (isFirst) {                            x0 = mathCos$1(startAngle) * rx + cx;                            y0 = mathSin$1(startAngle) * ry + cy;                        }                        l = mathMax$2(rx, ry) * mathMin$2(PI2$1, Math.abs(delta));                        xi = mathCos$1(endAngle) * rx + cx;                        yi = mathSin$1(endAngle) * ry + cy;                        break;                    case CMD.R: {                        x0 = xi = data[i++];                        y0 = yi = data[i++];                        var width = data[i++];                        var height = data[i++];                        l = width * 2 + height * 2;                        break;                    }                    case CMD.Z: {                        var dx = x0 - xi;                        var dy = y0 - yi;                        l = Math.sqrt(dx * dx + dy * dy);                        xi = x0;                        yi = y0;                        break;                    }                }                if (l >= 0) {                    pathSegLen[segCount++] = l;                    pathTotalLen += l;                }            }            this._pathLen = pathTotalLen;            return pathTotalLen;        };        PathProxy.prototype.rebuildPath = function (ctx, percent) {            var d = this.data;            var ux = this._ux;            var uy = this._uy;            var len = this._len;            var x0;            var y0;            var xi;            var yi;            var x;            var y;            var drawPart = percent < 1;            var pathSegLen;            var pathTotalLen;            var accumLength = 0;            var segCount = 0;            var displayedLength;            var pendingPtDist = 0;            var pendingPtX;            var pendingPtY;            if (drawPart) {                if (!this._pathSegLen) {                    this._calculateLength();                }                pathSegLen = this._pathSegLen;                pathTotalLen = this._pathLen;                displayedLength = percent * pathTotalLen;                if (!displayedLength) {                    return;                }            }            lo: for (var i = 0; i < len;) {                var cmd = d[i++];                var isFirst = i === 1;                if (isFirst) {                    xi = d[i];                    yi = d[i + 1];                    x0 = xi;                    y0 = yi;                }                if (cmd !== CMD.L && pendingPtDist > 0) {                    ctx.lineTo(pendingPtX, pendingPtY);                    pendingPtDist = 0;                }                switch (cmd) {                    case CMD.M:                        x0 = xi = d[i++];                        y0 = yi = d[i++];                        ctx.moveTo(xi, yi);                        break;                    case CMD.L: {                        x = d[i++];                        y = d[i++];                        var dx = mathAbs(x - xi);                        var dy = mathAbs(y - yi);                        if (dx > ux || dy > uy) {                            if (drawPart) {                                var l = pathSegLen[segCount++];                                if (accumLength + l > displayedLength) {                                    var t = (displayedLength - accumLength) / l;                                    ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t);                                    break lo;                                }                                accumLength += l;                            }                            ctx.lineTo(x, y);                            xi = x;                            yi = y;                            pendingPtDist = 0;                        }                        else {                            var d2 = dx * dx + dy * dy;                            if (d2 > pendingPtDist) {                                pendingPtX = x;                                pendingPtY = y;                                pendingPtDist = d2;                            }                        }                        break;                    }                    case CMD.C: {                        var x1 = d[i++];                        var y1 = d[i++];                        var x2 = d[i++];                        var y2 = d[i++];                        var x3 = d[i++];                        var y3 = d[i++];                        if (drawPart) {                            var l = pathSegLen[segCount++];                            if (accumLength + l > displayedLength) {                                var t = (displayedLength - accumLength) / l;                                cubicSubdivide(xi, x1, x2, x3, t, tmpOutX);                                cubicSubdivide(yi, y1, y2, y3, t, tmpOutY);                                ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]);                                break lo;                            }                            accumLength += l;                        }                        ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);                        xi = x3;                        yi = y3;                        break;                    }                    case CMD.Q: {                        var x1 = d[i++];                        var y1 = d[i++];                        var x2 = d[i++];                        var y2 = d[i++];                        if (drawPart) {                            var l = pathSegLen[segCount++];                            if (accumLength + l > displayedLength) {                                var t = (displayedLength - accumLength) / l;                                quadraticSubdivide(xi, x1, x2, t, tmpOutX);                                quadraticSubdivide(yi, y1, y2, t, tmpOutY);                                ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]);                                break lo;                            }                            accumLength += l;                        }                        ctx.quadraticCurveTo(x1, y1, x2, y2);                        xi = x2;                        yi = y2;                        break;                    }                    case CMD.A:                        var cx = d[i++];                        var cy = d[i++];                        var rx = d[i++];                        var ry = d[i++];                        var startAngle = d[i++];                        var delta = d[i++];                        var psi = d[i++];                        var anticlockwise = !d[i++];                        var r = (rx > ry) ? rx : ry;                        var isEllipse = mathAbs(rx - ry) > 1e-3;                        var endAngle = startAngle + delta;                        var breakBuild = false;                        if (drawPart) {                            var l = pathSegLen[segCount++];                            if (accumLength + l > displayedLength) {                                endAngle = startAngle + delta * (displayedLength - accumLength) / l;                                breakBuild = true;                            }                            accumLength += l;                        }                        if (isEllipse && ctx.ellipse) {                            ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise);                        }                        else {                            ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);                        }                        if (breakBuild) {                            break lo;                        }                        if (isFirst) {                            x0 = mathCos$1(startAngle) * rx + cx;                            y0 = mathSin$1(startAngle) * ry + cy;                        }                        xi = mathCos$1(endAngle) * rx + cx;                        yi = mathSin$1(endAngle) * ry + cy;                        break;                    case CMD.R:                        x0 = xi = d[i];                        y0 = yi = d[i + 1];                        x = d[i++];                        y = d[i++];                        var width = d[i++];                        var height = d[i++];                        if (drawPart) {                            var l = pathSegLen[segCount++];                            if (accumLength + l > displayedLength) {                                var d_1 = displayedLength - accumLength;                                ctx.moveTo(x, y);                                ctx.lineTo(x + mathMin$2(d_1, width), y);                                d_1 -= width;                                if (d_1 > 0) {                                    ctx.lineTo(x + width, y + mathMin$2(d_1, height));                                }                                d_1 -= height;                                if (d_1 > 0) {                                    ctx.lineTo(x + mathMax$2(width - d_1, 0), y + height);                                }                                d_1 -= width;                                if (d_1 > 0) {                                    ctx.lineTo(x, y + mathMax$2(height - d_1, 0));                                }                                break lo;                            }                            accumLength += l;                        }                        ctx.rect(x, y, width, height);                        break;                    case CMD.Z:                        if (drawPart) {                            var l = pathSegLen[segCount++];                            if (accumLength + l > displayedLength) {                                var t = (displayedLength - accumLength) / l;                                ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t);                                break lo;                            }                            accumLength += l;                        }                        ctx.closePath();                        xi = x0;                        yi = y0;                }            }        };        PathProxy.prototype.clone = function () {            var newProxy = new PathProxy();            var data = this.data;            newProxy.data = data.slice ? data.slice()                : Array.prototype.slice.call(data);            newProxy._len = this._len;            return newProxy;        };        PathProxy.CMD = CMD;        PathProxy.initDefaultProps = (function () {            var proto = PathProxy.prototype;            proto._saveData = true;            proto._ux = 0;            proto._uy = 0;            proto._pendingPtDist = 0;            proto._version = 0;        })();        return PathProxy;    }());    function containStroke(x0, y0, x1, y1, lineWidth, x, y) {        if (lineWidth === 0) {            return false;        }        var _l = lineWidth;        var _a = 0;        var _b = x0;        if ((y > y0 + _l && y > y1 + _l)            || (y < y0 - _l && y < y1 - _l)            || (x > x0 + _l && x > x1 + _l)            || (x < x0 - _l && x < x1 - _l)) {            return false;        }        if (x0 !== x1) {            _a = (y0 - y1) / (x0 - x1);            _b = (x0 * y1 - x1 * y0) / (x0 - x1);        }        else {            return Math.abs(x - x0) <= _l / 2;        }        var tmp = _a * x - y + _b;        var _s = tmp * tmp / (_a * _a + 1);        return _s <= _l / 2 * _l / 2;    }    function containStroke$1(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) {        if (lineWidth === 0) {            return false;        }        var _l = lineWidth;        if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l)            || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l)            || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l)            || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) {            return false;        }        var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null);        return d <= _l / 2;    }    function containStroke$2(x0, y0, x1, y1, x2, y2, lineWidth, x, y) {        if (lineWidth === 0) {            return false;        }        var _l = lineWidth;        if ((y > y0 + _l && y > y1 + _l && y > y2 + _l)            || (y < y0 - _l && y < y1 - _l && y < y2 - _l)            || (x > x0 + _l && x > x1 + _l && x > x2 + _l)            || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) {            return false;        }        var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null);        return d <= _l / 2;    }    var PI2$2 = Math.PI * 2;    function normalizeRadian(angle) {        angle %= PI2$2;        if (angle < 0) {            angle += PI2$2;        }        return angle;    }    var PI2$3 = Math.PI * 2;    function containStroke$3(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) {        if (lineWidth === 0) {            return false;        }        var _l = lineWidth;        x -= cx;        y -= cy;        var d = Math.sqrt(x * x + y * y);        if ((d - _l > r) || (d + _l < r)) {            return false;        }        if (Math.abs(startAngle - endAngle) % PI2$3 < 1e-4) {            return true;        }        if (anticlockwise) {            var tmp = startAngle;            startAngle = normalizeRadian(endAngle);            endAngle = normalizeRadian(tmp);        }        else {            startAngle = normalizeRadian(startAngle);            endAngle = normalizeRadian(endAngle);        }        if (startAngle > endAngle) {            endAngle += PI2$3;        }        var angle = Math.atan2(y, x);        if (angle < 0) {            angle += PI2$3;        }        return (angle >= startAngle && angle <= endAngle)            || (angle + PI2$3 >= startAngle && angle + PI2$3 <= endAngle);    }    function windingLine(x0, y0, x1, y1, x, y) {        if ((y > y0 && y > y1) || (y < y0 && y < y1)) {            return 0;        }        if (y1 === y0) {            return 0;        }        var t = (y - y0) / (y1 - y0);        var dir = y1 < y0 ? 1 : -1;        if (t === 1 || t === 0) {            dir = y1 < y0 ? 0.5 : -0.5;        }        var x_ = t * (x1 - x0) + x0;        return x_ === x ? Infinity : x_ > x ? dir : 0;    }    var CMD$1 = PathProxy.CMD;    var PI2$4 = Math.PI * 2;    var EPSILON$3 = 1e-4;    function isAroundEqual(a, b) {        return Math.abs(a - b) < EPSILON$3;    }    var roots = [-1, -1, -1];    var extrema = [-1, -1];    function swapExtrema() {        var tmp = extrema[0];        extrema[0] = extrema[1];        extrema[1] = tmp;    }    function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {        if ((y > y0 && y > y1 && y > y2 && y > y3)            || (y < y0 && y < y1 && y < y2 && y < y3)) {            return 0;        }        var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots);        if (nRoots === 0) {            return 0;        }        else {            var w = 0;            var nExtrema = -1;            var y0_ = void 0;            var y1_ = void 0;            for (var i = 0; i < nRoots; i++) {                var t = roots[i];                var unit = (t === 0 || t === 1) ? 0.5 : 1;                var x_ = cubicAt(x0, x1, x2, x3, t);                if (x_ < x) {                    continue;                }                if (nExtrema < 0) {                    nExtrema = cubicExtrema(y0, y1, y2, y3, extrema);                    if (extrema[1] < extrema[0] && nExtrema > 1) {                        swapExtrema();                    }                    y0_ = cubicAt(y0, y1, y2, y3, extrema[0]);                    if (nExtrema > 1) {                        y1_ = cubicAt(y0, y1, y2, y3, extrema[1]);                    }                }                if (nExtrema === 2) {                    if (t < extrema[0]) {                        w += y0_ < y0 ? unit : -unit;                    }                    else if (t < extrema[1]) {                        w += y1_ < y0_ ? unit : -unit;                    }                    else {                        w += y3 < y1_ ? unit : -unit;                    }                }                else {                    if (t < extrema[0]) {                        w += y0_ < y0 ? unit : -unit;                    }                    else {                        w += y3 < y0_ ? unit : -unit;                    }                }            }            return w;        }    }    function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {        if ((y > y0 && y > y1 && y > y2)            || (y < y0 && y < y1 && y < y2)) {            return 0;        }        var nRoots = quadraticRootAt(y0, y1, y2, y, roots);        if (nRoots === 0) {            return 0;        }        else {            var t = quadraticExtremum(y0, y1, y2);            if (t >= 0 && t <= 1) {                var w = 0;                var y_ = quadraticAt(y0, y1, y2, t);                for (var i = 0; i < nRoots; i++) {                    var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1;                    var x_ = quadraticAt(x0, x1, x2, roots[i]);                    if (x_ < x) {                        continue;                    }                    if (roots[i] < t) {                        w += y_ < y0 ? unit : -unit;                    }                    else {                        w += y2 < y_ ? unit : -unit;                    }                }                return w;            }            else {                var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1;                var x_ = quadraticAt(x0, x1, x2, roots[0]);                if (x_ < x) {                    return 0;                }                return y2 < y0 ? unit : -unit;            }        }    }    function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) {        y -= cy;        if (y > r || y < -r) {            return 0;        }        var tmp = Math.sqrt(r * r - y * y);        roots[0] = -tmp;        roots[1] = tmp;        var dTheta = Math.abs(startAngle - endAngle);        if (dTheta < 1e-4) {            return 0;        }        if (dTheta >= PI2$4 - 1e-4) {            startAngle = 0;            endAngle = PI2$4;            var dir = anticlockwise ? 1 : -1;            if (x >= roots[0] + cx && x <= roots[1] + cx) {                return dir;            }            else {                return 0;            }        }        if (startAngle > endAngle) {            var tmp_1 = startAngle;            startAngle = endAngle;            endAngle = tmp_1;        }        if (startAngle < 0) {            startAngle += PI2$4;            endAngle += PI2$4;        }        var w = 0;        for (var i = 0; i < 2; i++) {            var x_ = roots[i];            if (x_ + cx > x) {                var angle = Math.atan2(y, x_);                var dir = anticlockwise ? 1 : -1;                if (angle < 0) {                    angle = PI2$4 + angle;                }                if ((angle >= startAngle && angle <= endAngle)                    || (angle + PI2$4 >= startAngle && angle + PI2$4 <= endAngle)) {                    if (angle > Math.PI / 2 && angle < Math.PI * 1.5) {                        dir = -dir;                    }                    w += dir;                }            }        }        return w;    }    function containPath(path, lineWidth, isStroke, x, y) {        var data = path.data;        var len = path.len();        var w = 0;        var xi = 0;        var yi = 0;        var x0 = 0;        var y0 = 0;        var x1;        var y1;        for (var i = 0; i < len;) {            var cmd = data[i++];            var isFirst = i === 1;            if (cmd === CMD$1.M && i > 1) {                if (!isStroke) {                    w += windingLine(xi, yi, x0, y0, x, y);                }            }            if (isFirst) {                xi = data[i];                yi = data[i + 1];                x0 = xi;                y0 = yi;            }            switch (cmd) {                case CMD$1.M:                    x0 = data[i++];                    y0 = data[i++];                    xi = x0;                    yi = y0;                    break;                case CMD$1.L:                    if (isStroke) {                        if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) {                            return true;                        }                    }                    else {                        w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0;                    }                    xi = data[i++];                    yi = data[i++];                    break;                case CMD$1.C:                    if (isStroke) {                        if (containStroke$1(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {                            return true;                        }                    }                    else {                        w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0;                    }                    xi = data[i++];                    yi = data[i++];                    break;                case CMD$1.Q:                    if (isStroke) {                        if (containStroke$2(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {                            return true;                        }                    }                    else {                        w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0;                    }                    xi = data[i++];                    yi = data[i++];                    break;                case CMD$1.A:                    var cx = data[i++];                    var cy = data[i++];                    var rx = data[i++];                    var ry = data[i++];                    var theta = data[i++];                    var dTheta = data[i++];                    i += 1;                    var anticlockwise = !!(1 - data[i++]);                    x1 = Math.cos(theta) * rx + cx;                    y1 = Math.sin(theta) * ry + cy;                    if (!isFirst) {                        w += windingLine(xi, yi, x1, y1, x, y);                    }                    else {                        x0 = x1;                        y0 = y1;                    }                    var _x = (x - cx) * ry / rx + cx;                    if (isStroke) {                        if (containStroke$3(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) {                            return true;                        }                    }                    else {                        w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y);                    }                    xi = Math.cos(theta + dTheta) * rx + cx;                    yi = Math.sin(theta + dTheta) * ry + cy;                    break;                case CMD$1.R:                    x0 = xi = data[i++];                    y0 = yi = data[i++];                    var width = data[i++];                    var height = data[i++];                    x1 = x0 + width;                    y1 = y0 + height;                    if (isStroke) {                        if (containStroke(x0, y0, x1, y0, lineWidth, x, y)                            || containStroke(x1, y0, x1, y1, lineWidth, x, y)                            || containStroke(x1, y1, x0, y1, lineWidth, x, y)                            || containStroke(x0, y1, x0, y0, lineWidth, x, y)) {                            return true;                        }                    }                    else {                        w += windingLine(x1, y0, x1, y1, x, y);                        w += windingLine(x0, y1, x0, y0, x, y);                    }                    break;                case CMD$1.Z:                    if (isStroke) {                        if (containStroke(xi, yi, x0, y0, lineWidth, x, y)) {                            return true;                        }                    }                    else {                        w += windingLine(xi, yi, x0, y0, x, y);                    }                    xi = x0;                    yi = y0;                    break;            }        }        if (!isStroke && !isAroundEqual(yi, y0)) {            w += windingLine(xi, yi, x0, y0, x, y) || 0;        }        return w !== 0;    }    function contain(pathProxy, x, y) {        return containPath(pathProxy, 0, false, x, y);    }    function containStroke$4(pathProxy, lineWidth, x, y) {        return containPath(pathProxy, lineWidth, true, x, y);    }    var DEFAULT_PATH_STYLE = defaults({        fill: '#000',        stroke: null,        strokePercent: 1,        fillOpacity: 1,        strokeOpacity: 1,        lineDashOffset: 0,        lineWidth: 1,        lineCap: 'butt',        miterLimit: 10,        strokeNoScale: false,        strokeFirst: false    }, DEFAULT_COMMON_STYLE);    var DEFAULT_PATH_ANIMATION_PROPS = {        style: defaults({            fill: true,            stroke: true,            strokePercent: true,            fillOpacity: true,            strokeOpacity: true,            lineDashOffset: true,            lineWidth: true,            miterLimit: true        }, DEFAULT_COMMON_ANIMATION_PROPS.style)    };    var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible',        'culling', 'z', 'z2', 'zlevel', 'parent'    ]);    var Path = (function (_super) {        __extends(Path, _super);        function Path(opts) {            return _super.call(this, opts) || this;        }        Path.prototype.update = function () {            var _this = this;            _super.prototype.update.call(this);            var style = this.style;            if (style.decal) {                var decalEl = this._decalEl = this._decalEl || new Path();                if (decalEl.buildPath === Path.prototype.buildPath) {                    decalEl.buildPath = function (ctx) {                        _this.buildPath(ctx, _this.shape);                    };                }                decalEl.silent = true;                var decalElStyle = decalEl.style;                for (var key in style) {                    if (decalElStyle[key] !== style[key]) {                        decalElStyle[key] = style[key];                    }                }                decalElStyle.fill = style.fill ? style.decal : null;                decalElStyle.decal = null;                decalElStyle.shadowColor = null;                style.strokeFirst && (decalElStyle.stroke = null);                for (var i = 0; i < pathCopyParams.length; ++i) {                    decalEl[pathCopyParams[i]] = this[pathCopyParams[i]];                }                decalEl.__dirty |= REDRAW_BIT;            }            else if (this._decalEl) {                this._decalEl = null;            }        };        Path.prototype.getDecalElement = function () {            return this._decalEl;        };        Path.prototype._init = function (props) {            var keysArr = keys(props);            this.shape = this.getDefaultShape();            var defaultStyle = this.getDefaultStyle();            if (defaultStyle) {                this.useStyle(defaultStyle);            }            for (var i = 0; i < keysArr.length; i++) {                var key = keysArr[i];                var value = props[key];                if (key === 'style') {                    if (!this.style) {                        this.useStyle(value);                    }                    else {                        extend(this.style, value);                    }                }                else if (key === 'shape') {                    extend(this.shape, value);                }                else {                    _super.prototype.attrKV.call(this, key, value);                }            }            if (!this.style) {                this.useStyle({});            }        };        Path.prototype.getDefaultStyle = function () {            return null;        };        Path.prototype.getDefaultShape = function () {            return {};        };        Path.prototype.canBeInsideText = function () {            return this.hasFill();        };        Path.prototype.getInsideTextFill = function () {            var pathFill = this.style.fill;            if (pathFill !== 'none') {                if (isString(pathFill)) {                    var fillLum = lum(pathFill, 0);                    if (fillLum > 0.5) {                        return DARK_LABEL_COLOR;                    }                    else if (fillLum > 0.2) {                        return LIGHTER_LABEL_COLOR;                    }                    return LIGHT_LABEL_COLOR;                }                else if (pathFill) {                    return LIGHT_LABEL_COLOR;                }            }            return DARK_LABEL_COLOR;        };        Path.prototype.getInsideTextStroke = function (textFill) {            var pathFill = this.style.fill;            if (isString(pathFill)) {                var zr = this.__zr;                var isDarkMode = !!(zr && zr.isDarkMode());                var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD;                if (isDarkMode === isDarkLabel) {                    return pathFill;                }            }        };        Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { };        Path.prototype.pathUpdated = function () {            this.__dirty &= ~SHAPE_CHANGED_BIT;        };        Path.prototype.getUpdatedPathProxy = function (inBatch) {            !this.path && this.createPathProxy();            this.path.beginPath();            this.buildPath(this.path, this.shape, inBatch);            return this.path;        };        Path.prototype.createPathProxy = function () {            this.path = new PathProxy(false);        };        Path.prototype.hasStroke = function () {            var style = this.style;            var stroke = style.stroke;            return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));        };        Path.prototype.hasFill = function () {            var style = this.style;            var fill = style.fill;            return fill != null && fill !== 'none';        };        Path.prototype.getBoundingRect = function () {            var rect = this._rect;            var style = this.style;            var needsUpdateRect = !rect;            if (needsUpdateRect) {                var firstInvoke = false;                if (!this.path) {                    firstInvoke = true;                    this.createPathProxy();                }                var path = this.path;                if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) {                    path.beginPath();                    this.buildPath(path, this.shape, false);                    this.pathUpdated();                }                rect = path.getBoundingRect();            }            this._rect = rect;            if (this.hasStroke() && this.path && this.path.len() > 0) {                var rectStroke = this._rectStroke || (this._rectStroke = rect.clone());                if (this.__dirty || needsUpdateRect) {                    rectStroke.copy(rect);                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;                    var w = style.lineWidth;                    if (!this.hasFill()) {                        var strokeContainThreshold = this.strokeContainThreshold;                        w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold);                    }                    if (lineScale > 1e-10) {                        rectStroke.width += w / lineScale;                        rectStroke.height += w / lineScale;                        rectStroke.x -= w / lineScale / 2;                        rectStroke.y -= w / lineScale / 2;                    }                }                return rectStroke;            }            return rect;        };        Path.prototype.contain = function (x, y) {            var localPos = this.transformCoordToLocal(x, y);            var rect = this.getBoundingRect();            var style = this.style;            x = localPos[0];            y = localPos[1];            if (rect.contain(x, y)) {                var pathProxy = this.path;                if (this.hasStroke()) {                    var lineWidth = style.lineWidth;                    var lineScale = style.strokeNoScale ? this.getLineScale() : 1;                    if (lineScale > 1e-10) {                        if (!this.hasFill()) {                            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);                        }                        if (containStroke$4(pathProxy, lineWidth / lineScale, x, y)) {                            return true;                        }                    }                }                if (this.hasFill()) {                    return contain(pathProxy, x, y);                }            }            return false;        };        Path.prototype.dirtyShape = function () {            this.__dirty |= SHAPE_CHANGED_BIT;            if (this._rect) {                this._rect = null;            }            if (this._decalEl) {                this._decalEl.dirtyShape();            }            this.markRedraw();        };        Path.prototype.dirty = function () {            this.dirtyStyle();            this.dirtyShape();        };        Path.prototype.animateShape = function (loop) {            return this.animate('shape', loop);        };        Path.prototype.updateDuringAnimation = function (targetKey) {            if (targetKey === 'style') {                this.dirtyStyle();            }            else if (targetKey === 'shape') {                this.dirtyShape();            }            else {                this.markRedraw();            }        };        Path.prototype.attrKV = function (key, value) {            if (key === 'shape') {                this.setShape(value);            }            else {                _super.prototype.attrKV.call(this, key, value);            }        };        Path.prototype.setShape = function (keyOrObj, value) {            var shape = this.shape;            if (!shape) {                shape = this.shape = {};            }            if (typeof keyOrObj === 'string') {                shape[keyOrObj] = value;            }            else {                extend(shape, keyOrObj);            }            this.dirtyShape();            return this;        };        Path.prototype.shapeChanged = function () {            return !!(this.__dirty & SHAPE_CHANGED_BIT);        };        Path.prototype.createStyle = function (obj) {            return createObject(DEFAULT_PATH_STYLE, obj);        };        Path.prototype._innerSaveToNormal = function (toState) {            _super.prototype._innerSaveToNormal.call(this, toState);            var normalState = this._normalState;            if (toState.shape && !normalState.shape) {                normalState.shape = extend({}, this.shape);            }        };        Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {            _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);            var needsRestoreToNormal = !(state && keepCurrentStates);            var targetShape;            if (state && state.shape) {                if (transition) {                    if (keepCurrentStates) {                        targetShape = state.shape;                    }                    else {                        targetShape = extend({}, normalState.shape);                        extend(targetShape, state.shape);                    }                }                else {                    targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape);                    extend(targetShape, state.shape);                }            }            else if (needsRestoreToNormal) {                targetShape = normalState.shape;            }            if (targetShape) {                if (transition) {                    this.shape = extend({}, this.shape);                    var targetShapePrimaryProps = {};                    var shapeKeys = keys(targetShape);                    for (var i = 0; i < shapeKeys.length; i++) {                        var key = shapeKeys[i];                        if (typeof targetShape[key] === 'object') {                            this.shape[key] = targetShape[key];                        }                        else {                            targetShapePrimaryProps[key] = targetShape[key];                        }                    }                    this._transitionState(stateName, {                        shape: targetShapePrimaryProps                    }, animationCfg);                }                else {                    this.shape = targetShape;                    this.dirtyShape();                }            }        };        Path.prototype._mergeStates = function (states) {            var mergedState = _super.prototype._mergeStates.call(this, states);            var mergedShape;            for (var i = 0; i < states.length; i++) {                var state = states[i];                if (state.shape) {                    mergedShape = mergedShape || {};                    this._mergeStyle(mergedShape, state.shape);                }            }            if (mergedShape) {                mergedState.shape = mergedShape;            }            return mergedState;        };        Path.prototype.getAnimationStyleProps = function () {            return DEFAULT_PATH_ANIMATION_PROPS;        };        Path.prototype.isZeroArea = function () {            return false;        };        Path.extend = function (defaultProps) {            var Sub = (function (_super) {                __extends(Sub, _super);                function Sub(opts) {                    var _this = _super.call(this, opts) || this;                    defaultProps.init && defaultProps.init.call(_this, opts);                    return _this;                }                Sub.prototype.getDefaultStyle = function () {                    return clone(defaultProps.style);                };                Sub.prototype.getDefaultShape = function () {                    return clone(defaultProps.shape);                };                return Sub;            }(Path));            for (var key in defaultProps) {                if (typeof defaultProps[key] === 'function') {                    Sub.prototype[key] = defaultProps[key];                }            }            return Sub;        };        Path.initDefaultProps = (function () {            var pathProto = Path.prototype;            pathProto.type = 'path';            pathProto.strokeContainThreshold = 5;            pathProto.segmentIgnoreThreshold = 0;            pathProto.subPixelOptimize = false;            pathProto.autoBatch = false;            pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT;        })();        return Path;    }(Displayable));    var CMD$2 = PathProxy.CMD;    var points = [[], [], []];    var mathSqrt$1 = Math.sqrt;    var mathAtan2 = Math.atan2;    function transformPath(path, m) {        if (!m) {            return;        }        var data = path.data;        var len = path.len();        var cmd;        var nPoint;        var i;        var j;        var k;        var p;        var M = CMD$2.M;        var C = CMD$2.C;        var L = CMD$2.L;        var R = CMD$2.R;        var A = CMD$2.A;        var Q = CMD$2.Q;        for (i = 0, j = 0; i < len;) {            cmd = data[i++];            j = i;            nPoint = 0;            switch (cmd) {                case M:                    nPoint = 1;                    break;                case L:                    nPoint = 1;                    break;                case C:                    nPoint = 3;                    break;                case Q:                    nPoint = 2;                    break;                case A:                    var x = m[4];                    var y = m[5];                    var sx = mathSqrt$1(m[0] * m[0] + m[1] * m[1]);                    var sy = mathSqrt$1(m[2] * m[2] + m[3] * m[3]);                    var angle = mathAtan2(-m[1] / sy, m[0] / sx);                    data[i] *= sx;                    data[i++] += x;                    data[i] *= sy;                    data[i++] += y;                    data[i++] *= sx;                    data[i++] *= sy;                    data[i++] += angle;                    data[i++] += angle;                    i += 2;                    j = i;                    break;                case R:                    p[0] = data[i++];                    p[1] = data[i++];                    applyTransform(p, p, m);                    data[j++] = p[0];                    data[j++] = p[1];                    p[0] += data[i++];                    p[1] += data[i++];                    applyTransform(p, p, m);                    data[j++] = p[0];                    data[j++] = p[1];            }            for (k = 0; k < nPoint; k++) {                var p_1 = points[k];                p_1[0] = data[i++];                p_1[1] = data[i++];                applyTransform(p_1, p_1, m);                data[j++] = p_1[0];                data[j++] = p_1[1];            }        }        path.increaseVersion();    }    var mathSqrt$2 = Math.sqrt;    var mathSin$2 = Math.sin;    var mathCos$2 = Math.cos;    var PI$1 = Math.PI;    function vMag(v) {        return Math.sqrt(v[0] * v[0] + v[1] * v[1]);    }    function vRatio(u, v) {        return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));    }    function vAngle(u, v) {        return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)            * Math.acos(vRatio(u, v));    }    function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {        var psi = psiDeg * (PI$1 / 180.0);        var xp = mathCos$2(psi) * (x1 - x2) / 2.0            + mathSin$2(psi) * (y1 - y2) / 2.0;        var yp = -1 * mathSin$2(psi) * (x1 - x2) / 2.0            + mathCos$2(psi) * (y1 - y2) / 2.0;        var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);        if (lambda > 1) {            rx *= mathSqrt$2(lambda);            ry *= mathSqrt$2(lambda);        }        var f = (fa === fs ? -1 : 1)            * mathSqrt$2((((rx * rx) * (ry * ry))                - ((rx * rx) * (yp * yp))                - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)                + (ry * ry) * (xp * xp))) || 0;        var cxp = f * rx * yp / ry;        var cyp = f * -ry * xp / rx;        var cx = (x1 + x2) / 2.0            + mathCos$2(psi) * cxp            - mathSin$2(psi) * cyp;        var cy = (y1 + y2) / 2.0            + mathSin$2(psi) * cxp            + mathCos$2(psi) * cyp;        var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);        var u = [(xp - cxp) / rx, (yp - cyp) / ry];        var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];        var dTheta = vAngle(u, v);        if (vRatio(u, v) <= -1) {            dTheta = PI$1;        }        if (vRatio(u, v) >= 1) {            dTheta = 0;        }        if (dTheta < 0) {            var n = Math.round(dTheta / PI$1 * 1e6) / 1e6;            dTheta = PI$1 * 2 + (n % 2) * PI$1;        }        path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);    }    var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig;    var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;    function createPathProxyFromString(data) {        var path = new PathProxy();        if (!data) {            return path;        }        var cpx = 0;        var cpy = 0;        var subpathX = cpx;        var subpathY = cpy;        var prevCmd;        var CMD = PathProxy.CMD;        var cmdList = data.match(commandReg);        if (!cmdList) {            return path;        }        for (var l = 0; l < cmdList.length; l++) {            var cmdText = cmdList[l];            var cmdStr = cmdText.charAt(0);            var cmd = void 0;            var p = cmdText.match(numberReg) || [];            var pLen = p.length;            for (var i = 0; i < pLen; i++) {                p[i] = parseFloat(p[i]);            }            var off = 0;            while (off < pLen) {                var ctlPtx = void 0;                var ctlPty = void 0;                var rx = void 0;                var ry = void 0;                var psi = void 0;                var fa = void 0;                var fs = void 0;                var x1 = cpx;                var y1 = cpy;                var len = void 0;                var pathData = void 0;                switch (cmdStr) {                    case 'l':                        cpx += p[off++];                        cpy += p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'L':                        cpx = p[off++];                        cpy = p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'm':                        cpx += p[off++];                        cpy += p[off++];                        cmd = CMD.M;                        path.addData(cmd, cpx, cpy);                        subpathX = cpx;                        subpathY = cpy;                        cmdStr = 'l';                        break;                    case 'M':                        cpx = p[off++];                        cpy = p[off++];                        cmd = CMD.M;                        path.addData(cmd, cpx, cpy);                        subpathX = cpx;                        subpathY = cpy;                        cmdStr = 'L';                        break;                    case 'h':                        cpx += p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'H':                        cpx = p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'v':                        cpy += p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'V':                        cpy = p[off++];                        cmd = CMD.L;                        path.addData(cmd, cpx, cpy);                        break;                    case 'C':                        cmd = CMD.C;                        path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]);                        cpx = p[off - 2];                        cpy = p[off - 1];                        break;                    case 'c':                        cmd = CMD.C;                        path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy);                        cpx += p[off - 2];                        cpy += p[off - 1];                        break;                    case 'S':                        ctlPtx = cpx;                        ctlPty = cpy;                        len = path.len();                        pathData = path.data;                        if (prevCmd === CMD.C) {                            ctlPtx += cpx - pathData[len - 4];                            ctlPty += cpy - pathData[len - 3];                        }                        cmd = CMD.C;                        x1 = p[off++];                        y1 = p[off++];                        cpx = p[off++];                        cpy = p[off++];                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);                        break;                    case 's':                        ctlPtx = cpx;                        ctlPty = cpy;                        len = path.len();                        pathData = path.data;                        if (prevCmd === CMD.C) {                            ctlPtx += cpx - pathData[len - 4];                            ctlPty += cpy - pathData[len - 3];                        }                        cmd = CMD.C;                        x1 = cpx + p[off++];                        y1 = cpy + p[off++];                        cpx += p[off++];                        cpy += p[off++];                        path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);                        break;                    case 'Q':                        x1 = p[off++];                        y1 = p[off++];                        cpx = p[off++];                        cpy = p[off++];                        cmd = CMD.Q;                        path.addData(cmd, x1, y1, cpx, cpy);                        break;                    case 'q':                        x1 = p[off++] + cpx;                        y1 = p[off++] + cpy;                        cpx += p[off++];                        cpy += p[off++];                        cmd = CMD.Q;                        path.addData(cmd, x1, y1, cpx, cpy);                        break;                    case 'T':                        ctlPtx = cpx;                        ctlPty = cpy;                        len = path.len();                        pathData = path.data;                        if (prevCmd === CMD.Q) {                            ctlPtx += cpx - pathData[len - 4];                            ctlPty += cpy - pathData[len - 3];                        }                        cpx = p[off++];                        cpy = p[off++];                        cmd = CMD.Q;                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);                        break;                    case 't':                        ctlPtx = cpx;                        ctlPty = cpy;                        len = path.len();                        pathData = path.data;                        if (prevCmd === CMD.Q) {                            ctlPtx += cpx - pathData[len - 4];                            ctlPty += cpy - pathData[len - 3];                        }                        cpx += p[off++];                        cpy += p[off++];                        cmd = CMD.Q;                        path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);                        break;                    case 'A':                        rx = p[off++];                        ry = p[off++];                        psi = p[off++];                        fa = p[off++];                        fs = p[off++];                        x1 = cpx, y1 = cpy;                        cpx = p[off++];                        cpy = p[off++];                        cmd = CMD.A;                        processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);                        break;                    case 'a':                        rx = p[off++];                        ry = p[off++];                        psi = p[off++];                        fa = p[off++];                        fs = p[off++];                        x1 = cpx, y1 = cpy;                        cpx += p[off++];                        cpy += p[off++];                        cmd = CMD.A;                        processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);                        break;                }            }            if (cmdStr === 'z' || cmdStr === 'Z') {                cmd = CMD.Z;                path.addData(cmd);                cpx = subpathX;                cpy = subpathY;            }            prevCmd = cmd;        }        path.toStatic();        return path;    }    var SVGPath = (function (_super) {        __extends(SVGPath, _super);        function SVGPath() {            return _super !== null && _super.apply(this, arguments) || this;        }        SVGPath.prototype.applyTransform = function (m) { };        return SVGPath;    }(Path));    function isPathProxy(path) {        return path.setData != null;    }    function createPathOptions(str, opts) {        var pathProxy = createPathProxyFromString(str);        var innerOpts = extend({}, opts);        innerOpts.buildPath = function (path) {            if (isPathProxy(path)) {                path.setData(pathProxy.data);                var ctx = path.getContext();                if (ctx) {                    path.rebuildPath(ctx, 1);                }            }            else {                var ctx = path;                pathProxy.rebuildPath(ctx, 1);            }        };        innerOpts.applyTransform = function (m) {            transformPath(pathProxy, m);            this.dirtyShape();        };        return innerOpts;    }    function createFromString(str, opts) {        return new SVGPath(createPathOptions(str, opts));    }    function extendFromString(str, defaultOpts) {        var innerOpts = createPathOptions(str, defaultOpts);        var Sub = (function (_super) {            __extends(Sub, _super);            function Sub(opts) {                var _this = _super.call(this, opts) || this;                _this.applyTransform = innerOpts.applyTransform;                _this.buildPath = innerOpts.buildPath;                return _this;            }            return Sub;        }(SVGPath));        return Sub;    }    function mergePath(pathEls, opts) {        var pathList = [];        var len = pathEls.length;        for (var i = 0; i < len; i++) {            var pathEl = pathEls[i];            pathList.push(pathEl.getUpdatedPathProxy(true));        }        var pathBundle = new Path(opts);        pathBundle.createPathProxy();        pathBundle.buildPath = function (path) {            if (isPathProxy(path)) {                path.appendPath(pathList);                var ctx = path.getContext();                if (ctx) {                    path.rebuildPath(ctx, 1);                }            }        };        return pathBundle;    }    function clonePath(sourcePath, opts) {        opts = opts || {};        var path = new Path();        if (sourcePath.shape) {            path.setShape(sourcePath.shape);        }        path.setStyle(sourcePath.style);        if (opts.bakeTransform) {            transformPath(path.path, sourcePath.getComputedTransform());        }        else {            if (opts.toLocal) {                path.setLocalTransform(sourcePath.getComputedTransform());            }            else {                path.copyTransform(sourcePath);            }        }        path.buildPath = sourcePath.buildPath;        path.applyTransform = path.applyTransform;        path.z = sourcePath.z;        path.z2 = sourcePath.z2;        path.zlevel = sourcePath.zlevel;        return path;    }    var path = /*#__PURE__*/Object.freeze({        __proto__: null,        createFromString: createFromString,        extendFromString: extendFromString,        mergePath: mergePath,        clonePath: clonePath    });    var DEFAULT_IMAGE_STYLE = defaults({        x: 0,        y: 0    }, DEFAULT_COMMON_STYLE);    var DEFAULT_IMAGE_ANIMATION_PROPS = {        style: defaults({            x: true,            y: true,            width: true,            height: true,            sx: true,            sy: true,            sWidth: true,            sHeight: true        }, DEFAULT_COMMON_ANIMATION_PROPS.style)    };    function isImageLike(source) {        return !!(source            && typeof source !== 'string'            && source.width && source.height);    }    var ZRImage = (function (_super) {        __extends(ZRImage, _super);        function ZRImage() {            return _super !== null && _super.apply(this, arguments) || this;        }        ZRImage.prototype.createStyle = function (obj) {            return createObject(DEFAULT_IMAGE_STYLE, obj);        };        ZRImage.prototype._getSize = function (dim) {            var style = this.style;            var size = style[dim];            if (size != null) {                return size;            }            var imageSource = isImageLike(style.image)                ? style.image : this.__image;            if (!imageSource) {                return 0;            }            var otherDim = dim === 'width' ? 'height' : 'width';            var otherDimSize = style[otherDim];            if (otherDimSize == null) {                return imageSource[dim];            }            else {                return imageSource[dim] / imageSource[otherDim] * otherDimSize;            }        };        ZRImage.prototype.getWidth = function () {            return this._getSize('width');        };        ZRImage.prototype.getHeight = function () {            return this._getSize('height');        };        ZRImage.prototype.getAnimationStyleProps = function () {            return DEFAULT_IMAGE_ANIMATION_PROPS;        };        ZRImage.prototype.getBoundingRect = function () {            var style = this.style;            if (!this._rect) {                this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight());            }            return this._rect;        };        return ZRImage;    }(Displayable));    ZRImage.prototype.type = 'image';    var CircleShape = (function () {        function CircleShape() {            this.cx = 0;            this.cy = 0;            this.r = 0;        }        return CircleShape;    }());    var Circle = (function (_super) {        __extends(Circle, _super);        function Circle(opts) {            return _super.call(this, opts) || this;        }        Circle.prototype.getDefaultShape = function () {            return new CircleShape();        };        Circle.prototype.buildPath = function (ctx, shape) {            ctx.moveTo(shape.cx + shape.r, shape.cy);            ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2);        };        return Circle;    }(Path));    Circle.prototype.type = 'circle';    function buildPath(ctx, shape) {        var x = shape.x;        var y = shape.y;        var width = shape.width;        var height = shape.height;        var r = shape.r;        var r1;        var r2;        var r3;        var r4;        if (width < 0) {            x = x + width;            width = -width;        }        if (height < 0) {            y = y + height;            height = -height;        }        if (typeof r === 'number') {            r1 = r2 = r3 = r4 = r;        }        else if (r instanceof Array) {            if (r.length === 1) {                r1 = r2 = r3 = r4 = r[0];            }            else if (r.length === 2) {                r1 = r3 = r[0];                r2 = r4 = r[1];            }            else if (r.length === 3) {                r1 = r[0];                r2 = r4 = r[1];                r3 = r[2];            }            else {                r1 = r[0];                r2 = r[1];                r3 = r[2];                r4 = r[3];            }        }        else {            r1 = r2 = r3 = r4 = 0;        }        var total;        if (r1 + r2 > width) {            total = r1 + r2;            r1 *= width / total;            r2 *= width / total;        }        if (r3 + r4 > width) {            total = r3 + r4;            r3 *= width / total;            r4 *= width / total;        }        if (r2 + r3 > height) {            total = r2 + r3;            r2 *= height / total;            r3 *= height / total;        }        if (r1 + r4 > height) {            total = r1 + r4;            r1 *= height / total;            r4 *= height / total;        }        ctx.moveTo(x + r1, y);        ctx.lineTo(x + width - r2, y);        r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0);        ctx.lineTo(x + width, y + height - r3);        r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2);        ctx.lineTo(x + r4, y + height);        r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI);        ctx.lineTo(x, y + r1);        r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5);    }    var round = Math.round;    function subPixelOptimizeLine(outputShape, inputShape, style) {        if (!inputShape) {            return;        }        var x1 = inputShape.x1;        var x2 = inputShape.x2;        var y1 = inputShape.y1;        var y2 = inputShape.y2;        outputShape.x1 = x1;        outputShape.x2 = x2;        outputShape.y1 = y1;        outputShape.y2 = y2;        var lineWidth = style && style.lineWidth;        if (!lineWidth) {            return outputShape;        }        if (round(x1 * 2) === round(x2 * 2)) {            outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true);        }        if (round(y1 * 2) === round(y2 * 2)) {            outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true);        }        return outputShape;    }    function subPixelOptimizeRect(outputShape, inputShape, style) {        if (!inputShape) {            return;        }        var originX = inputShape.x;        var originY = inputShape.y;        var originWidth = inputShape.width;        var originHeight = inputShape.height;        outputShape.x = originX;        outputShape.y = originY;        outputShape.width = originWidth;        outputShape.height = originHeight;        var lineWidth = style && style.lineWidth;        if (!lineWidth) {            return outputShape;        }        outputShape.x = subPixelOptimize(originX, lineWidth, true);        outputShape.y = subPixelOptimize(originY, lineWidth, true);        outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1);        outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1);        return outputShape;    }    function subPixelOptimize(position, lineWidth, positiveOrNegative) {        if (!lineWidth) {            return position;        }        var doubledPosition = round(position * 2);        return (doubledPosition + round(lineWidth)) % 2 === 0            ? doubledPosition / 2            : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;    }    var RectShape = (function () {        function RectShape() {            this.x = 0;            this.y = 0;            this.width = 0;            this.height = 0;        }        return RectShape;    }());    var subPixelOptimizeOutputShape = {};    var Rect = (function (_super) {        __extends(Rect, _super);        function Rect(opts) {            return _super.call(this, opts) || this;        }        Rect.prototype.getDefaultShape = function () {            return new RectShape();        };        Rect.prototype.buildPath = function (ctx, shape) {            var x;            var y;            var width;            var height;            if (this.subPixelOptimize) {                var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style);                x = optimizedShape.x;                y = optimizedShape.y;                width = optimizedShape.width;                height = optimizedShape.height;                optimizedShape.r = shape.r;                shape = optimizedShape;            }            else {                x = shape.x;                y = shape.y;                width = shape.width;                height = shape.height;            }            if (!shape.r) {                ctx.rect(x, y, width, height);            }            else {                buildPath(ctx, shape);            }        };        Rect.prototype.isZeroArea = function () {            return !this.shape.width || !this.shape.height;        };        return Rect;    }(Path));    Rect.prototype.type = 'rect';    var EllipseShape = (function () {        function EllipseShape() {            this.cx = 0;            this.cy = 0;            this.rx = 0;            this.ry = 0;        }        return EllipseShape;    }());    var Ellipse = (function (_super) {        __extends(Ellipse, _super);        function Ellipse(opts) {            return _super.call(this, opts) || this;        }        Ellipse.prototype.getDefaultShape = function () {            return new EllipseShape();        };        Ellipse.prototype.buildPath = function (ctx, shape) {            var k = 0.5522848;            var x = shape.cx;            var y = shape.cy;            var a = shape.rx;            var b = shape.ry;            var ox = a * k;            var oy = b * k;            ctx.moveTo(x - a, y);            ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);            ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);            ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);            ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);            ctx.closePath();        };        return Ellipse;    }(Path));    Ellipse.prototype.type = 'ellipse';    var subPixelOptimizeOutputShape$1 = {};    var LineShape = (function () {        function LineShape() {            this.x1 = 0;            this.y1 = 0;            this.x2 = 0;            this.y2 = 0;            this.percent = 1;        }        return LineShape;    }());    var Line = (function (_super) {        __extends(Line, _super);        function Line(opts) {            return _super.call(this, opts) || this;        }        Line.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        Line.prototype.getDefaultShape = function () {            return new LineShape();        };        Line.prototype.buildPath = function (ctx, shape) {            var x1;            var y1;            var x2;            var y2;            if (this.subPixelOptimize) {                var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape$1, shape, this.style);                x1 = optimizedShape.x1;                y1 = optimizedShape.y1;                x2 = optimizedShape.x2;                y2 = optimizedShape.y2;            }            else {                x1 = shape.x1;                y1 = shape.y1;                x2 = shape.x2;                y2 = shape.y2;            }            var percent = shape.percent;            if (percent === 0) {                return;            }            ctx.moveTo(x1, y1);            if (percent < 1) {                x2 = x1 * (1 - percent) + x2 * percent;                y2 = y1 * (1 - percent) + y2 * percent;            }            ctx.lineTo(x2, y2);        };        Line.prototype.pointAt = function (p) {            var shape = this.shape;            return [                shape.x1 * (1 - p) + shape.x2 * p,                shape.y1 * (1 - p) + shape.y2 * p            ];        };        return Line;    }(Path));    Line.prototype.type = 'line';    function smoothBezier(points, smooth, isLoop, constraint) {        var cps = [];        var v = [];        var v1 = [];        var v2 = [];        var prevPoint;        var nextPoint;        var min$1;        var max$1;        if (constraint) {            min$1 = [Infinity, Infinity];            max$1 = [-Infinity, -Infinity];            for (var i = 0, len = points.length; i < len; i++) {                min(min$1, min$1, points[i]);                max(max$1, max$1, points[i]);            }            min(min$1, min$1, constraint[0]);            max(max$1, max$1, constraint[1]);        }        for (var i = 0, len = points.length; i < len; i++) {            var point = points[i];            if (isLoop) {                prevPoint = points[i ? i - 1 : len - 1];                nextPoint = points[(i + 1) % len];            }            else {                if (i === 0 || i === len - 1) {                    cps.push(clone$1(points[i]));                    continue;                }                else {                    prevPoint = points[i - 1];                    nextPoint = points[i + 1];                }            }            sub(v, nextPoint, prevPoint);            scale(v, v, smooth);            var d0 = distance(point, prevPoint);            var d1 = distance(point, nextPoint);            var sum = d0 + d1;            if (sum !== 0) {                d0 /= sum;                d1 /= sum;            }            scale(v1, v, -d0);            scale(v2, v, d1);            var cp0 = add([], point, v1);            var cp1 = add([], point, v2);            if (constraint) {                max(cp0, cp0, min$1);                min(cp0, cp0, max$1);                max(cp1, cp1, min$1);                min(cp1, cp1, max$1);            }            cps.push(cp0);            cps.push(cp1);        }        if (isLoop) {            cps.push(cps.shift());        }        return cps;    }    function buildPath$1(ctx, shape, closePath) {        var smooth = shape.smooth;        var points = shape.points;        if (points && points.length >= 2) {            if (smooth) {                var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint);                ctx.moveTo(points[0][0], points[0][1]);                var len = points.length;                for (var i = 0; i < (closePath ? len : len - 1); i++) {                    var cp1 = controlPoints[i * 2];                    var cp2 = controlPoints[i * 2 + 1];                    var p = points[(i + 1) % len];                    ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]);                }            }            else {                ctx.moveTo(points[0][0], points[0][1]);                for (var i = 1, l = points.length; i < l; i++) {                    ctx.lineTo(points[i][0], points[i][1]);                }            }            closePath && ctx.closePath();        }    }    var PolygonShape = (function () {        function PolygonShape() {            this.points = null;            this.smooth = 0;            this.smoothConstraint = null;        }        return PolygonShape;    }());    var Polygon = (function (_super) {        __extends(Polygon, _super);        function Polygon(opts) {            return _super.call(this, opts) || this;        }        Polygon.prototype.getDefaultShape = function () {            return new PolygonShape();        };        Polygon.prototype.buildPath = function (ctx, shape) {            buildPath$1(ctx, shape, true);        };        return Polygon;    }(Path));    Polygon.prototype.type = 'polygon';    var PolylineShape = (function () {        function PolylineShape() {            this.points = null;            this.percent = 1;            this.smooth = 0;            this.smoothConstraint = null;        }        return PolylineShape;    }());    var Polyline = (function (_super) {        __extends(Polyline, _super);        function Polyline(opts) {            return _super.call(this, opts) || this;        }        Polyline.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        Polyline.prototype.getDefaultShape = function () {            return new PolylineShape();        };        Polyline.prototype.buildPath = function (ctx, shape) {            buildPath$1(ctx, shape, false);        };        return Polyline;    }(Path));    Polyline.prototype.type = 'polyline';    var Gradient = (function () {        function Gradient(colorStops) {            this.colorStops = colorStops || [];        }        Gradient.prototype.addColorStop = function (offset, color) {            this.colorStops.push({                offset: offset,                color: color            });        };        return Gradient;    }());    var LinearGradient = (function (_super) {        __extends(LinearGradient, _super);        function LinearGradient(x, y, x2, y2, colorStops, globalCoord) {            var _this = _super.call(this, colorStops) || this;            _this.x = x == null ? 0 : x;            _this.y = y == null ? 0 : y;            _this.x2 = x2 == null ? 1 : x2;            _this.y2 = y2 == null ? 0 : y2;            _this.type = 'linear';            _this.global = globalCoord || false;            return _this;        }        return LinearGradient;    }(Gradient));    var RadialGradient = (function (_super) {        __extends(RadialGradient, _super);        function RadialGradient(x, y, r, colorStops, globalCoord) {            var _this = _super.call(this, colorStops) || this;            _this.x = x == null ? 0.5 : x;            _this.y = y == null ? 0.5 : y;            _this.r = r == null ? 0.5 : r;            _this.type = 'radial';            _this.global = globalCoord || false;            return _this;        }        return RadialGradient;    }(Gradient));    var DEFAULT_TSPAN_STYLE = defaults({        strokeFirst: true,        font: DEFAULT_FONT,        x: 0,        y: 0,        textAlign: 'left',        textBaseline: 'top',        miterLimit: 2    }, DEFAULT_PATH_STYLE);    var TSpan = (function (_super) {        __extends(TSpan, _super);        function TSpan() {            return _super !== null && _super.apply(this, arguments) || this;        }        TSpan.prototype.hasStroke = function () {            var style = this.style;            var stroke = style.stroke;            return stroke != null && stroke !== 'none' && style.lineWidth > 0;        };        TSpan.prototype.hasFill = function () {            var style = this.style;            var fill = style.fill;            return fill != null && fill !== 'none';        };        TSpan.prototype.createStyle = function (obj) {            return createObject(DEFAULT_TSPAN_STYLE, obj);        };        TSpan.prototype.setBoundingRect = function (rect) {            this._rect = rect;        };        TSpan.prototype.getBoundingRect = function () {            var style = this.style;            if (!this._rect) {                var text = style.text;                text != null ? (text += '') : (text = '');                var rect = getBoundingRect(text, style.font, style.textAlign, style.textBaseline);                rect.x += style.x || 0;                rect.y += style.y || 0;                if (this.hasStroke()) {                    var w = style.lineWidth;                    rect.x -= w / 2;                    rect.y -= w / 2;                    rect.width += w;                    rect.height += w;                }                this._rect = rect;            }            return this._rect;        };        TSpan.initDefaultProps = (function () {            var tspanProto = TSpan.prototype;            tspanProto.dirtyRectTolerance = 10;        })();        return TSpan;    }(Displayable));    TSpan.prototype.type = 'tspan';    function parseXML(svg) {        if (isString(svg)) {            var parser = new DOMParser();            svg = parser.parseFromString(svg, 'text/xml');        }        var svgNode = svg;        if (svgNode.nodeType === 9) {            svgNode = svgNode.firstChild;        }        while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) {            svgNode = svgNode.nextSibling;        }        return svgNode;    }    var nodeParsers;    var INHERITABLE_STYLE_ATTRIBUTES_MAP = {        '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-anchor': 'textAlign',        'visibility': 'visibility',        'display': 'display'    };    var INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP);    var SELF_STYLE_ATTRIBUTES_MAP = {        'alignment-baseline': 'textBaseline',        'stop-color': 'stopColor'    };    var SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP);    var SVGParser = (function () {        function SVGParser() {            this._defs = {};            this._root = null;        }        SVGParser.prototype.parse = function (xml, opt) {            opt = opt || {};            var svg = parseXML(xml);            {                if (!svg) {                    throw new Error('Illegal svg');                }            }            this._defsUsePending = [];            var root = new Group();            this._root = root;            var named = [];            var viewBox = svg.getAttribute('viewBox') || '';            var width = parseFloat((svg.getAttribute('width') || opt.width));            var height = parseFloat((svg.getAttribute('height') || opt.height));            isNaN(width) && (width = null);            isNaN(height) && (height = null);            parseAttributes(svg, root, null, true, false);            var child = svg.firstChild;            while (child) {                this._parseNode(child, root, named, null, false, false);                child = child.nextSibling;            }            applyDefs(this._defs, this._defsUsePending);            this._defsUsePending = [];            var viewBoxRect;            var viewBoxTransform;            if (viewBox) {                var viewBoxArr = splitNumberSequence(viewBox);                if (viewBoxArr.length >= 4) {                    viewBoxRect = {                        x: parseFloat((viewBoxArr[0] || 0)),                        y: parseFloat((viewBoxArr[1] || 0)),                        width: parseFloat(viewBoxArr[2]),                        height: parseFloat(viewBoxArr[3])                    };                }            }            if (viewBoxRect && width != null && height != null) {                viewBoxTransform = makeViewBoxTransform(viewBoxRect, { x: 0, y: 0, width: width, height: height });                if (!opt.ignoreViewBox) {                    var elRoot = root;                    root = new Group();                    root.add(elRoot);                    elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale;                    elRoot.x = viewBoxTransform.x;                    elRoot.y = viewBoxTransform.y;                }            }            if (!opt.ignoreRootClip && width != null && height != null) {                root.setClipPath(new Rect({                    shape: { x: 0, y: 0, width: width, height: height }                }));            }            return {                root: root,                width: width,                height: height,                viewBoxRect: viewBoxRect,                viewBoxTransform: viewBoxTransform,                named: named            };        };        SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) {            var nodeName = xmlNode.nodeName.toLowerCase();            var el;            var namedFromForSub = namedFrom;            if (nodeName === 'defs') {                isInDefs = true;            }            if (nodeName === 'text') {                isInText = true;            }            if (nodeName === 'defs' || nodeName === 'switch') {                el = parentGroup;            }            else {                if (!isInDefs) {                    var parser_1 = nodeParsers[nodeName];                    if (parser_1 && hasOwn(nodeParsers, nodeName)) {                        el = parser_1.call(this, xmlNode, parentGroup);                        var nameAttr = xmlNode.getAttribute('name');                        if (nameAttr) {                            var newNamed = {                                name: nameAttr,                                namedFrom: null,                                svgNodeTagLower: nodeName,                                el: el                            };                            named.push(newNamed);                            if (nodeName === 'g') {                                namedFromForSub = newNamed;                            }                        }                        else if (namedFrom) {                            named.push({                                name: namedFrom.name,                                namedFrom: namedFrom,                                svgNodeTagLower: nodeName,                                el: el                            });                        }                        parentGroup.add(el);                    }                }                var parser = paintServerParsers[nodeName];                if (parser && hasOwn(paintServerParsers, nodeName)) {                    var def = parser.call(this, xmlNode);                    var id = xmlNode.getAttribute('id');                    if (id) {                        this._defs[id] = def;                    }                }            }            if (el && el.isGroup) {                var child = xmlNode.firstChild;                while (child) {                    if (child.nodeType === 1) {                        this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText);                    }                    else if (child.nodeType === 3 && isInText) {                        this._parseText(child, el);                    }                    child = child.nextSibling;                }            }        };        SVGParser.prototype._parseText = function (xmlNode, parentGroup) {            var text = new TSpan({                style: {                    text: xmlNode.textContent                },                silent: true,                x: this._textX || 0,                y: this._textY || 0            });            inheritStyle(parentGroup, text);            parseAttributes(xmlNode, text, this._defsUsePending, false, false);            applyTextAlignment(text, parentGroup);            var textStyle = text.style;            var fontSize = textStyle.fontSize;            if (fontSize && fontSize < 9) {                textStyle.fontSize = 9;                text.scaleX *= fontSize / 9;                text.scaleY *= fontSize / 9;            }            var font = (textStyle.fontSize || textStyle.fontFamily) && [                textStyle.fontStyle,                textStyle.fontWeight,                (textStyle.fontSize || 12) + 'px',                textStyle.fontFamily || 'sans-serif'            ].join(' ');            textStyle.font = font;            var rect = text.getBoundingRect();            this._textX += rect.width;            parentGroup.add(text);            return text;        };        SVGParser.internalField = (function () {            nodeParsers = {                'g': function (xmlNode, parentGroup) {                    var g = new Group();                    inheritStyle(parentGroup, g);                    parseAttributes(xmlNode, g, this._defsUsePending, false, false);                    return g;                },                'rect': function (xmlNode, parentGroup) {                    var rect = new Rect();                    inheritStyle(parentGroup, rect);                    parseAttributes(xmlNode, rect, this._defsUsePending, false, false);                    rect.setShape({                        x: parseFloat(xmlNode.getAttribute('x') || '0'),                        y: parseFloat(xmlNode.getAttribute('y') || '0'),                        width: parseFloat(xmlNode.getAttribute('width') || '0'),                        height: parseFloat(xmlNode.getAttribute('height') || '0')                    });                    rect.silent = true;                    return rect;                },                'circle': function (xmlNode, parentGroup) {                    var circle = new Circle();                    inheritStyle(parentGroup, circle);                    parseAttributes(xmlNode, circle, this._defsUsePending, false, false);                    circle.setShape({                        cx: parseFloat(xmlNode.getAttribute('cx') || '0'),                        cy: parseFloat(xmlNode.getAttribute('cy') || '0'),                        r: parseFloat(xmlNode.getAttribute('r') || '0')                    });                    circle.silent = true;                    return circle;                },                'line': function (xmlNode, parentGroup) {                    var line = new Line();                    inheritStyle(parentGroup, line);                    parseAttributes(xmlNode, line, this._defsUsePending, false, false);                    line.setShape({                        x1: parseFloat(xmlNode.getAttribute('x1') || '0'),                        y1: parseFloat(xmlNode.getAttribute('y1') || '0'),                        x2: parseFloat(xmlNode.getAttribute('x2') || '0'),                        y2: parseFloat(xmlNode.getAttribute('y2') || '0')                    });                    line.silent = true;                    return line;                },                'ellipse': function (xmlNode, parentGroup) {                    var ellipse = new Ellipse();                    inheritStyle(parentGroup, ellipse);                    parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false);                    ellipse.setShape({                        cx: parseFloat(xmlNode.getAttribute('cx') || '0'),                        cy: parseFloat(xmlNode.getAttribute('cy') || '0'),                        rx: parseFloat(xmlNode.getAttribute('rx') || '0'),                        ry: parseFloat(xmlNode.getAttribute('ry') || '0')                    });                    ellipse.silent = true;                    return ellipse;                },                'polygon': function (xmlNode, parentGroup) {                    var pointsStr = xmlNode.getAttribute('points');                    var pointsArr;                    if (pointsStr) {                        pointsArr = parsePoints(pointsStr);                    }                    var polygon = new Polygon({                        shape: {                            points: pointsArr || []                        },                        silent: true                    });                    inheritStyle(parentGroup, polygon);                    parseAttributes(xmlNode, polygon, this._defsUsePending, false, false);                    return polygon;                },                'polyline': function (xmlNode, parentGroup) {                    var pointsStr = xmlNode.getAttribute('points');                    var pointsArr;                    if (pointsStr) {                        pointsArr = parsePoints(pointsStr);                    }                    var polyline = new Polyline({                        shape: {                            points: pointsArr || []                        },                        silent: true                    });                    inheritStyle(parentGroup, polyline);                    parseAttributes(xmlNode, polyline, this._defsUsePending, false, false);                    return polyline;                },                'image': function (xmlNode, parentGroup) {                    var img = new ZRImage();                    inheritStyle(parentGroup, img);                    parseAttributes(xmlNode, img, this._defsUsePending, false, false);                    img.setStyle({                        image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'),                        x: +xmlNode.getAttribute('x'),                        y: +xmlNode.getAttribute('y'),                        width: +xmlNode.getAttribute('width'),                        height: +xmlNode.getAttribute('height')                    });                    img.silent = true;                    return img;                },                'text': function (xmlNode, parentGroup) {                    var x = xmlNode.getAttribute('x') || '0';                    var y = xmlNode.getAttribute('y') || '0';                    var dx = xmlNode.getAttribute('dx') || '0';                    var dy = xmlNode.getAttribute('dy') || '0';                    this._textX = parseFloat(x) + parseFloat(dx);                    this._textY = parseFloat(y) + parseFloat(dy);                    var g = new Group();                    inheritStyle(parentGroup, g);                    parseAttributes(xmlNode, g, this._defsUsePending, false, true);                    return g;                },                'tspan': function (xmlNode, parentGroup) {                    var x = xmlNode.getAttribute('x');                    var y = xmlNode.getAttribute('y');                    if (x != null) {                        this._textX = parseFloat(x);                    }                    if (y != null) {                        this._textY = parseFloat(y);                    }                    var dx = xmlNode.getAttribute('dx') || '0';                    var dy = xmlNode.getAttribute('dy') || '0';                    var g = new Group();                    inheritStyle(parentGroup, g);                    parseAttributes(xmlNode, g, this._defsUsePending, false, true);                    this._textX += parseFloat(dx);                    this._textY += parseFloat(dy);                    return g;                },                'path': function (xmlNode, parentGroup) {                    var d = xmlNode.getAttribute('d') || '';                    var path = createFromString(d);                    inheritStyle(parentGroup, path);                    parseAttributes(xmlNode, path, this._defsUsePending, false, false);                    path.silent = true;                    return path;                }            };        })();        return SVGParser;    }());    var paintServerParsers = {        'lineargradient': function (xmlNode) {            var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10);            var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10);            var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10);            var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10);            var gradient = new LinearGradient(x1, y1, x2, y2);            parsePaintServerUnit(xmlNode, gradient);            parseGradientColorStops(xmlNode, gradient);            return gradient;        },        'radialgradient': function (xmlNode) {            var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10);            var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10);            var r = parseInt(xmlNode.getAttribute('r') || '0', 10);            var gradient = new RadialGradient(cx, cy, r);            parsePaintServerUnit(xmlNode, gradient);            parseGradientColorStops(xmlNode, gradient);            return gradient;        }    };    function parsePaintServerUnit(xmlNode, gradient) {        var gradientUnits = xmlNode.getAttribute('gradientUnits');        if (gradientUnits === 'userSpaceOnUse') {            gradient.global = true;        }    }    function parseGradientColorStops(xmlNode, gradient) {        var stop = xmlNode.firstChild;        while (stop) {            if (stop.nodeType === 1                && stop.nodeName.toLocaleLowerCase() === 'stop') {                var offsetStr = stop.getAttribute('offset');                var offset = void 0;                if (offsetStr && offsetStr.indexOf('%') > 0) {                    offset = parseInt(offsetStr, 10) / 100;                }                else if (offsetStr) {                    offset = parseFloat(offsetStr);                }                else {                    offset = 0;                }                var styleVals = {};                parseInlineStyle(stop, styleVals, styleVals);                var stopColor = styleVals.stopColor                    || stop.getAttribute('stop-color')                    || '#000000';                gradient.colorStops.push({                    offset: offset,                    color: stopColor                });            }            stop = stop.nextSibling;        }    }    function inheritStyle(parent, child) {        if (parent && parent.__inheritedStyle) {            if (!child.__inheritedStyle) {                child.__inheritedStyle = {};            }            defaults(child.__inheritedStyle, parent.__inheritedStyle);        }    }    function parsePoints(pointsString) {        var list = splitNumberSequence(pointsString);        var points = [];        for (var i = 0; i < list.length; i += 2) {            var x = parseFloat(list[i]);            var y = parseFloat(list[i + 1]);            points.push([x, y]);        }        return points;    }    function parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) {        var disp = el;        var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {};        var selfStyle = {};        if (xmlNode.nodeType === 1) {            parseTransformAttribute(xmlNode, el);            parseInlineStyle(xmlNode, inheritedStyle, selfStyle);            if (!onlyInlineStyle) {                parseAttributeStyle(xmlNode, inheritedStyle, selfStyle);            }        }        disp.style = disp.style || {};        if (inheritedStyle.fill != null) {            disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending);        }        if (inheritedStyle.stroke != null) {            disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending);        }        each([            'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize'        ], function (propName) {            if (inheritedStyle[propName] != null) {                disp.style[propName] = parseFloat(inheritedStyle[propName]);            }        });        each([            'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign'        ], function (propName) {            if (inheritedStyle[propName] != null) {                disp.style[propName] = inheritedStyle[propName];            }        });        if (isTextGroup) {            disp.__selfStyle = selfStyle;        }        if (inheritedStyle.lineDash) {            disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) {                return parseFloat(str);            });        }        if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') {            disp.invisible = true;        }        if (inheritedStyle.display === 'none') {            disp.ignore = true;        }    }    function applyTextAlignment(text, parentGroup) {        var parentSelfStyle = parentGroup.__selfStyle;        if (parentSelfStyle) {            var textBaseline = parentSelfStyle.textBaseline;            var zrTextBaseline = textBaseline;            if (!textBaseline || textBaseline === 'auto') {                zrTextBaseline = 'alphabetic';            }            else if (textBaseline === 'baseline') {                zrTextBaseline = 'alphabetic';            }            else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') {                zrTextBaseline = 'top';            }            else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') {                zrTextBaseline = 'bottom';            }            else if (textBaseline === 'central' || textBaseline === 'mathematical') {                zrTextBaseline = 'middle';            }            text.style.textBaseline = zrTextBaseline;        }        var parentInheritedStyle = parentGroup.__inheritedStyle;        if (parentInheritedStyle) {            var textAlign = parentInheritedStyle.textAlign;            var zrTextAlign = textAlign;            if (textAlign) {                if (textAlign === 'middle') {                    zrTextAlign = 'center';                }                text.style.textAlign = zrTextAlign;            }        }    }    var urlRegex = /^url\(\s*#(.*?)\)/;    function getFillStrokeStyle(el, method, str, defsUsePending) {        var urlMatch = str && str.match(urlRegex);        if (urlMatch) {            var url = trim(urlMatch[1]);            defsUsePending.push([el, method, url]);            return;        }        if (str === 'none') {            str = null;        }        return str;    }    function applyDefs(defs, defsUsePending) {        for (var i = 0; i < defsUsePending.length; i++) {            var item = defsUsePending[i];            item[0].style[item[1]] = defs[item[2]];        }    }    var numberReg$1 = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;    function splitNumberSequence(rawStr) {        return rawStr.match(numberReg$1) || [];    }    var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g;    var DEGREE_TO_ANGLE = Math.PI / 180;    function parseTransformAttribute(xmlNode, node) {        var transform = xmlNode.getAttribute('transform');        if (transform) {            transform = transform.replace(/,/g, ' ');            var transformOps_1 = [];            var mt = null;            transform.replace(transformRegex, function (str, type, value) {                transformOps_1.push(type, value);                return '';            });            for (var i = transformOps_1.length - 1; i > 0; i -= 2) {                var value = transformOps_1[i];                var type = transformOps_1[i - 1];                var valueArr = splitNumberSequence(value);                mt = mt || create$1();                switch (type) {                    case 'translate':                        translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]);                        break;                    case 'scale':                        scale$1(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]);                        break;                    case 'rotate':                        rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE, [                            parseFloat(valueArr[1] || '0'),                            parseFloat(valueArr[2] || '0')                        ]);                        break;                    case 'skewX':                        var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);                        mul$1(mt, [1, 0, sx, 1, 0, 0], mt);                        break;                    case 'skewY':                        var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);                        mul$1(mt, [1, sy, 0, 1, 0, 0], mt);                        break;                    case 'matrix':                        mt[0] = parseFloat(valueArr[0]);                        mt[1] = parseFloat(valueArr[1]);                        mt[2] = parseFloat(valueArr[2]);                        mt[3] = parseFloat(valueArr[3]);                        mt[4] = parseFloat(valueArr[4]);                        mt[5] = parseFloat(valueArr[5]);                        break;                }            }            node.setLocalTransform(mt);        }    }    var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g;    function parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) {        var style = xmlNode.getAttribute('style');        if (!style) {            return;        }        styleRegex.lastIndex = 0;        var styleRegResult;        while ((styleRegResult = styleRegex.exec(style)) != null) {            var svgStlAttr = styleRegResult[1];            var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr)                ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr]                : null;            if (zrInheritableStlAttr) {                inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2];            }            var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr)                ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr]                : null;            if (zrSelfStlAttr) {                selfStyleResult[zrSelfStlAttr] = styleRegResult[2];            }        }    }    function parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) {        for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {            var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i];            var attrValue = xmlNode.getAttribute(svgAttrName);            if (attrValue != null) {                inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;            }        }        for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {            var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i];            var attrValue = xmlNode.getAttribute(svgAttrName);            if (attrValue != null) {                selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;            }        }    }    function makeViewBoxTransform(viewBoxRect, boundingRect) {        var scaleX = boundingRect.width / viewBoxRect.width;        var scaleY = boundingRect.height / viewBoxRect.height;        var scale = Math.min(scaleX, scaleY);        return {            scale: scale,            x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2),            y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2)        };    }    function parseSVG(xml, opt) {        var parser = new SVGParser();        return parser.parse(xml, opt);    }    var PI$2 = Math.PI;    var PI2$5 = PI$2 * 2;    var mathSin$3 = Math.sin;    var mathCos$3 = Math.cos;    var mathACos = Math.acos;    var mathATan2 = Math.atan2;    var mathAbs$1 = Math.abs;    var mathSqrt$3 = Math.sqrt;    var mathMax$3 = Math.max;    var mathMin$3 = Math.min;    var e = 1e-4;    function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {        var dx10 = x1 - x0;        var dy10 = y1 - y0;        var dx32 = x3 - x2;        var dy32 = y3 - y2;        var t = dy32 * dx10 - dx32 * dy10;        if (t * t < e) {            return;        }        t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t;        return [x0 + t * dx10, y0 + t * dy10];    }    function computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) {        var x01 = x0 - x1;        var y01 = y0 - y1;        var lo = (clockwise ? cr : -cr) / mathSqrt$3(x01 * x01 + y01 * y01);        var ox = lo * y01;        var oy = -lo * x01;        var x11 = x0 + ox;        var y11 = y0 + oy;        var x10 = x1 + ox;        var y10 = y1 + oy;        var x00 = (x11 + x10) / 2;        var y00 = (y11 + y10) / 2;        var dx = x10 - x11;        var dy = y10 - y11;        var d2 = dx * dx + dy * dy;        var r = radius - cr;        var s = x11 * y10 - x10 * y11;        var d = (dy < 0 ? -1 : 1) * mathSqrt$3(mathMax$3(0, r * r * d2 - s * s));        var cx0 = (s * dy - dx * d) / d2;        var cy0 = (-s * dx - dy * d) / d2;        var cx1 = (s * dy + dx * d) / d2;        var cy1 = (-s * dx + dy * d) / d2;        var dx0 = cx0 - x00;        var dy0 = cy0 - y00;        var dx1 = cx1 - x00;        var dy1 = cy1 - y00;        if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) {            cx0 = cx1;            cy0 = cy1;        }        return {            cx: cx0,            cy: cy0,            x0: -ox,            y0: -oy,            x1: cx0 * (radius / r - 1),            y1: cy0 * (radius / r - 1)        };    }    function normalizeCornerRadius(cr) {        var arr;        if (isArray(cr)) {            var len = cr.length;            if (!len) {                return cr;            }            if (len === 1) {                arr = [cr[0], cr[0], 0, 0];            }            else if (len === 2) {                arr = [cr[0], cr[0], cr[1], cr[1]];            }            else if (len === 3) {                arr = cr.concat(cr[2]);            }            else {                arr = cr;            }        }        else {            arr = [cr, cr, cr, cr];        }        return arr;    }    function buildPath$2(ctx, shape) {        var _a;        var radius = mathMax$3(shape.r, 0);        var innerRadius = mathMax$3(shape.r0 || 0, 0);        var hasRadius = radius > 0;        var hasInnerRadius = innerRadius > 0;        if (!hasRadius && !hasInnerRadius) {            return;        }        if (!hasRadius) {            radius = innerRadius;            innerRadius = 0;        }        if (innerRadius > radius) {            var tmp = radius;            radius = innerRadius;            innerRadius = tmp;        }        var startAngle = shape.startAngle, endAngle = shape.endAngle;        if (isNaN(startAngle) || isNaN(endAngle)) {            return;        }        var cx = shape.cx, cy = shape.cy;        var clockwise = !!shape.clockwise;        var arc = mathAbs$1(endAngle - startAngle);        var mod = arc > PI2$5 && arc % PI2$5;        mod > e && (arc = mod);        if (!(radius > e)) {            ctx.moveTo(cx, cy);        }        else if (arc > PI2$5 - e) {            ctx.moveTo(cx + radius * mathCos$3(startAngle), cy + radius * mathSin$3(startAngle));            ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);            if (innerRadius > e) {                ctx.moveTo(cx + innerRadius * mathCos$3(endAngle), cy + innerRadius * mathSin$3(endAngle));                ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);            }        }        else {            var icrStart = void 0;            var icrEnd = void 0;            var ocrStart = void 0;            var ocrEnd = void 0;            var ocrs = void 0;            var ocre = void 0;            var icrs = void 0;            var icre = void 0;            var ocrMax = void 0;            var icrMax = void 0;            var limitedOcrMax = void 0;            var limitedIcrMax = void 0;            var xre = void 0;            var yre = void 0;            var xirs = void 0;            var yirs = void 0;            var xrs = radius * mathCos$3(startAngle);            var yrs = radius * mathSin$3(startAngle);            var xire = innerRadius * mathCos$3(endAngle);            var yire = innerRadius * mathSin$3(endAngle);            var hasArc = arc > e;            if (hasArc) {                var cornerRadius = shape.cornerRadius;                if (cornerRadius) {                    _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3];                }                var halfRd = mathAbs$1(radius - innerRadius) / 2;                ocrs = mathMin$3(halfRd, ocrStart);                ocre = mathMin$3(halfRd, ocrEnd);                icrs = mathMin$3(halfRd, icrStart);                icre = mathMin$3(halfRd, icrEnd);                limitedOcrMax = ocrMax = mathMax$3(ocrs, ocre);                limitedIcrMax = icrMax = mathMax$3(icrs, icre);                if (ocrMax > e || icrMax > e) {                    xre = radius * mathCos$3(endAngle);                    yre = radius * mathSin$3(endAngle);                    xirs = innerRadius * mathCos$3(startAngle);                    yirs = innerRadius * mathSin$3(startAngle);                    if (arc < PI$2) {                        var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire);                        if (it_1) {                            var x0 = xrs - it_1[0];                            var y0 = yrs - it_1[1];                            var x1 = xre - it_1[0];                            var y1 = yre - it_1[1];                            var a = 1 / mathSin$3(mathACos((x0 * x1 + y0 * y1) / (mathSqrt$3(x0 * x0 + y0 * y0) * mathSqrt$3(x1 * x1 + y1 * y1))) / 2);                            var b = mathSqrt$3(it_1[0] * it_1[0] + it_1[1] * it_1[1]);                            limitedOcrMax = mathMin$3(ocrMax, (radius - b) / (a + 1));                            limitedIcrMax = mathMin$3(icrMax, (innerRadius - b) / (a - 1));                        }                    }                }            }            if (!hasArc) {                ctx.moveTo(cx + xrs, cy + yrs);            }            else if (limitedOcrMax > e) {                var crStart = mathMin$3(ocrStart, limitedOcrMax);                var crEnd = mathMin$3(ocrEnd, limitedOcrMax);                var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise);                var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise);                ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);                if (limitedOcrMax < ocrMax && crStart === crEnd) {                    ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);                }                else {                    crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);                    ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise);                    crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);                }            }            else {                ctx.moveTo(cx + xrs, cy + yrs);                ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);            }            if (!(innerRadius > e) || !hasArc) {                ctx.lineTo(cx + xire, cy + yire);            }            else if (limitedIcrMax > e) {                var crStart = mathMin$3(icrStart, limitedIcrMax);                var crEnd = mathMin$3(icrEnd, limitedIcrMax);                var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise);                var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise);                ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);                if (limitedIcrMax < icrMax && crStart === crEnd) {                    ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);                }                else {                    crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);                    ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise);                    crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);                }            }            else {                ctx.lineTo(cx + xire, cy + yire);                ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);            }        }        ctx.closePath();    }    var SectorShape = (function () {        function SectorShape() {            this.cx = 0;            this.cy = 0;            this.r0 = 0;            this.r = 0;            this.startAngle = 0;            this.endAngle = Math.PI * 2;            this.clockwise = true;            this.cornerRadius = 0;        }        return SectorShape;    }());    var Sector = (function (_super) {        __extends(Sector, _super);        function Sector(opts) {            return _super.call(this, opts) || this;        }        Sector.prototype.getDefaultShape = function () {            return new SectorShape();        };        Sector.prototype.buildPath = function (ctx, shape) {            buildPath$2(ctx, shape);        };        Sector.prototype.isZeroArea = function () {            return this.shape.startAngle === this.shape.endAngle                || this.shape.r === this.shape.r0;        };        return Sector;    }(Path));    Sector.prototype.type = 'sector';    var CMD$3 = PathProxy.CMD;    function aroundEqual(a, b) {        return Math.abs(a - b) < 1e-5;    }    function pathToBezierCurves(path) {        var data = path.data;        var len = path.len();        var bezierArrayGroups = [];        var currentSubpath;        var xi = 0;        var yi = 0;        var x0 = 0;        var y0 = 0;        function createNewSubpath(x, y) {            if (currentSubpath && currentSubpath.length > 2) {                bezierArrayGroups.push(currentSubpath);            }            currentSubpath = [x, y];        }        function addLine(x0, y0, x1, y1) {            if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) {                currentSubpath.push(x0, y0, x1, y1, x1, y1);            }        }        function addArc(startAngle, endAngle, cx, cy, rx, ry) {            var delta = Math.abs(endAngle - startAngle);            var len = Math.tan(delta / 4) * 4 / 3;            var dir = endAngle < startAngle ? -1 : 1;            var c1 = Math.cos(startAngle);            var s1 = Math.sin(startAngle);            var c2 = Math.cos(endAngle);            var s2 = Math.sin(endAngle);            var x1 = c1 * rx + cx;            var y1 = s1 * ry + cy;            var x4 = c2 * rx + cx;            var y4 = s2 * ry + cy;            var hx = rx * len * dir;            var hy = ry * len * dir;            currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4);        }        var x1;        var y1;        var x2;        var y2;        for (var i = 0; i < len;) {            var cmd = data[i++];            var isFirst = i === 1;            if (isFirst) {                xi = data[i];                yi = data[i + 1];                x0 = xi;                y0 = yi;                if (cmd === CMD$3.L || cmd === CMD$3.C || cmd === CMD$3.Q) {                    currentSubpath = [x0, y0];                }            }            switch (cmd) {                case CMD$3.M:                    xi = x0 = data[i++];                    yi = y0 = data[i++];                    createNewSubpath(x0, y0);                    break;                case CMD$3.L:                    x1 = data[i++];                    y1 = data[i++];                    addLine(xi, yi, x1, y1);                    xi = x1;                    yi = y1;                    break;                case CMD$3.C:                    currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]);                    break;                case CMD$3.Q:                    x1 = data[i++];                    y1 = data[i++];                    x2 = data[i++];                    y2 = data[i++];                    currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2);                    xi = x2;                    yi = y2;                    break;                case CMD$3.A:                    var cx = data[i++];                    var cy = data[i++];                    var rx = data[i++];                    var ry = data[i++];                    var startAngle = data[i++];                    var endAngle = data[i++] + startAngle;                    i += 1;                    var anticlockwise = !data[i++];                    x1 = Math.cos(startAngle) * rx + cx;                    y1 = Math.sin(startAngle) * ry + cy;                    if (isFirst) {                        x0 = x1;                        y0 = y1;                        createNewSubpath(x0, y0);                    }                    else {                        addLine(xi, yi, x1, y1);                    }                    xi = Math.cos(endAngle) * rx + cx;                    yi = Math.sin(endAngle) * ry + cy;                    var step = (anticlockwise ? -1 : 1) * Math.PI / 2;                    for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) {                        var nextAngle = anticlockwise ? Math.max(angle + step, endAngle)                            : Math.min(angle + step, endAngle);                        addArc(angle, nextAngle, cx, cy, rx, ry);                    }                    break;                case CMD$3.R:                    x0 = xi = data[i++];                    y0 = yi = data[i++];                    x1 = x0 + data[i++];                    y1 = y0 + data[i++];                    createNewSubpath(x1, y0);                    addLine(x1, y0, x1, y1);                    addLine(x1, y1, x0, y1);                    addLine(x0, y1, x0, y0);                    addLine(x0, y0, x1, y0);                    break;                case CMD$3.Z:                    currentSubpath && addLine(xi, yi, x0, y0);                    xi = x0;                    yi = y0;                    break;            }        }        if (currentSubpath && currentSubpath.length > 2) {            bezierArrayGroups.push(currentSubpath);        }        return bezierArrayGroups;    }    function adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) {        if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) {            out.push(x3, y3);            return;        }        var PIXEL_DISTANCE = 2 / scale;        var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE;        var dx = x3 - x0;        var dy = y3 - y0;        var d = Math.sqrt(dx * dx + dy * dy);        dx /= d;        dy /= d;        var dx1 = x1 - x0;        var dy1 = y1 - y0;        var dx2 = x2 - x3;        var dy2 = y2 - y3;        var cp1LenSqr = dx1 * dx1 + dy1 * dy1;        var cp2LenSqr = dx2 * dx2 + dy2 * dy2;        if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) {            out.push(x3, y3);            return;        }        var projLen1 = dx * dx1 + dy * dy1;        var projLen2 = -dx * dx2 - dy * dy2;        var d1Sqr = cp1LenSqr - projLen1 * projLen1;        var d2Sqr = cp2LenSqr - projLen2 * projLen2;        if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0            && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) {            out.push(x3, y3);            return;        }        var tmpSegX = [];        var tmpSegY = [];        cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX);        cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY);        adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale);        adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale);    }    function pathToPolygons(path, scale) {        var bezierArrayGroups = pathToBezierCurves(path);        var polygons = [];        scale = scale || 1;        for (var i = 0; i < bezierArrayGroups.length; i++) {            var beziers = bezierArrayGroups[i];            var polygon = [];            var x0 = beziers[0];            var y0 = beziers[1];            polygon.push(x0, y0);            for (var k = 2; k < beziers.length;) {                var x1 = beziers[k++];                var y1 = beziers[k++];                var x2 = beziers[k++];                var y2 = beziers[k++];                var x3 = beziers[k++];                var y3 = beziers[k++];                adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale);                x0 = x3;                y0 = y3;            }            polygons.push(polygon);        }        return polygons;    }    function getDividingGrids(dimSize, rowDim, count) {        var rowSize = dimSize[rowDim];        var columnSize = dimSize[1 - rowDim];        var ratio = Math.abs(rowSize / columnSize);        var rowCount = Math.ceil(Math.sqrt(ratio * count));        var columnCount = Math.floor(count / rowCount);        if (columnCount === 0) {            columnCount = 1;            rowCount = count;        }        var grids = [];        for (var i = 0; i < rowCount; i++) {            grids.push(columnCount);        }        var currentCount = rowCount * columnCount;        var remained = count - currentCount;        if (remained > 0) {            for (var i = 0; i < remained; i++) {                grids[i % rowCount] += 1;            }        }        return grids;    }    function divideSector(sectorShape, count, outShapes) {        var r0 = sectorShape.r0;        var r = sectorShape.r;        var startAngle = sectorShape.startAngle;        var endAngle = sectorShape.endAngle;        var angle = Math.abs(endAngle - startAngle);        var arcLen = angle * r;        var deltaR = r - r0;        var isAngleRow = arcLen > Math.abs(deltaR);        var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count);        var rowSize = (isAngleRow ? angle : deltaR) / grids.length;        for (var row = 0; row < grids.length; row++) {            var columnSize = (isAngleRow ? deltaR : angle) / grids[row];            for (var column = 0; column < grids[row]; column++) {                var newShape = {};                if (isAngleRow) {                    newShape.startAngle = startAngle + rowSize * row;                    newShape.endAngle = startAngle + rowSize * (row + 1);                    newShape.r0 = r0 + columnSize * column;                    newShape.r = r0 + columnSize * (column + 1);                }                else {                    newShape.startAngle = startAngle + columnSize * column;                    newShape.endAngle = startAngle + columnSize * (column + 1);                    newShape.r0 = r0 + rowSize * row;                    newShape.r = r0 + rowSize * (row + 1);                }                newShape.clockwise = sectorShape.clockwise;                newShape.cx = sectorShape.cx;                newShape.cy = sectorShape.cy;                outShapes.push(newShape);            }        }    }    function divideRect(rectShape, count, outShapes) {        var width = rectShape.width;        var height = rectShape.height;        var isHorizontalRow = width > height;        var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count);        var rowSizeDim = isHorizontalRow ? 'width' : 'height';        var columnSizeDim = isHorizontalRow ? 'height' : 'width';        var rowDim = isHorizontalRow ? 'x' : 'y';        var columnDim = isHorizontalRow ? 'y' : 'x';        var rowSize = rectShape[rowSizeDim] / grids.length;        for (var row = 0; row < grids.length; row++) {            var columnSize = rectShape[columnSizeDim] / grids[row];            for (var column = 0; column < grids[row]; column++) {                var newShape = {};                newShape[rowDim] = row * rowSize;                newShape[columnDim] = column * columnSize;                newShape[rowSizeDim] = rowSize;                newShape[columnSizeDim] = columnSize;                newShape.x += rectShape.x;                newShape.y += rectShape.y;                outShapes.push(newShape);            }        }    }    function crossProduct2d(x1, y1, x2, y2) {        return x1 * y2 - x2 * y1;    }    function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {        var mx = a2x - a1x;        var my = a2y - a1y;        var nx = b2x - b1x;        var ny = b2y - b1y;        var nmCrossProduct = crossProduct2d(nx, ny, mx, my);        if (Math.abs(nmCrossProduct) < 1e-6) {            return null;        }        var b1a1x = a1x - b1x;        var b1a1y = a1y - b1y;        var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct;        if (p < 0 || p > 1) {            return null;        }        return new Point(p * mx + a1x, p * my + a1y);    }    function projPtOnLine(pt, lineA, lineB) {        var dir = new Point();        Point.sub(dir, lineB, lineA);        dir.normalize();        var dir2 = new Point();        Point.sub(dir2, pt, lineA);        var len = dir2.dot(dir);        return len;    }    function addToPoly(poly, pt) {        var last = poly[poly.length - 1];        if (last && last[0] === pt[0] && last[1] === pt[1]) {            return;        }        poly.push(pt);    }    function splitPolygonByLine(points, lineA, lineB) {        var len = points.length;        var intersections = [];        for (var i = 0; i < len; i++) {            var p0 = points[i];            var p1 = points[(i + 1) % len];            var intersectionPt = lineLineIntersect(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y);            if (intersectionPt) {                intersections.push({                    projPt: projPtOnLine(intersectionPt, lineA, lineB),                    pt: intersectionPt,                    idx: i                });            }        }        if (intersections.length < 2) {            return [{ points: points }, { points: points }];        }        intersections.sort(function (a, b) {            return a.projPt - b.projPt;        });        var splitPt0 = intersections[0];        var splitPt1 = intersections[intersections.length - 1];        if (splitPt1.idx < splitPt0.idx) {            var tmp = splitPt0;            splitPt0 = splitPt1;            splitPt1 = tmp;        }        var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y];        var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y];        var newPolyA = [splitPt0Arr];        var newPolyB = [splitPt1Arr];        for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) {            addToPoly(newPolyA, points[i].slice());        }        addToPoly(newPolyA, splitPt1Arr);        addToPoly(newPolyA, splitPt0Arr);        for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) {            addToPoly(newPolyB, points[i % len].slice());        }        addToPoly(newPolyB, splitPt0Arr);        addToPoly(newPolyB, splitPt1Arr);        return [{                points: newPolyA            }, {                points: newPolyB            }];    }    function binaryDividePolygon(polygonShape) {        var points = polygonShape.points;        var min = [];        var max = [];        fromPoints(points, min, max);        var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);        var width = boundingRect.width;        var height = boundingRect.height;        var x = boundingRect.x;        var y = boundingRect.y;        var pt0 = new Point();        var pt1 = new Point();        if (width > height) {            pt0.x = pt1.x = x + width / 2;            pt0.y = y;            pt1.y = y + height;        }        else {            pt0.y = pt1.y = y + height / 2;            pt0.x = x;            pt1.x = x + width;        }        return splitPolygonByLine(points, pt0, pt1);    }    function binaryDivideRecursive(divider, shape, count, out) {        if (count === 1) {            out.push(shape);        }        else {            var mid = Math.floor(count / 2);            var sub = divider(shape);            binaryDivideRecursive(divider, sub[0], mid, out);            binaryDivideRecursive(divider, sub[1], count - mid, out);        }        return out;    }    function clone$3(path, count) {        var paths = [];        for (var i = 0; i < count; i++) {            paths.push(clonePath(path));        }        return paths;    }    function copyPathProps(source, target) {        target.setStyle(source.style);        target.z = source.z;        target.z2 = source.z2;        target.zlevel = source.zlevel;    }    function polygonConvert(points) {        var out = [];        for (var i = 0; i < points.length;) {            out.push([points[i++], points[i++]]);        }        return out;    }    function split(path, count) {        var outShapes = [];        var shape = path.shape;        var OutShapeCtor;        switch (path.type) {            case 'rect':                divideRect(shape, count, outShapes);                OutShapeCtor = Rect;                break;            case 'sector':                divideSector(shape, count, outShapes);                OutShapeCtor = Sector;                break;            case 'circle':                divideSector({                    r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2,                    cx: shape.cx, cy: shape.cy                }, count, outShapes);                OutShapeCtor = Sector;                break;            default:                var m = path.getComputedTransform();                var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1;                var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { return polygonConvert(poly); });                var polygonCount = polygons.length;                if (polygonCount === 0) {                    binaryDivideRecursive(binaryDividePolygon, {                        points: polygons[0]                    }, count, outShapes);                }                else if (polygonCount === count) {                    for (var i = 0; i < polygonCount; i++) {                        outShapes.push({                            points: polygons[i]                        });                    }                }                else {                    var totalArea_1 = 0;                    var items = map(polygons, function (poly) {                        var min = [];                        var max = [];                        fromPoints(poly, min, max);                        var area = (max[1] - min[1]) * (max[0] - min[0]);                        totalArea_1 += area;                        return { poly: poly, area: area };                    });                    items.sort(function (a, b) { return b.area - a.area; });                    var left = count;                    for (var i = 0; i < polygonCount; i++) {                        var item = items[i];                        if (left <= 0) {                            break;                        }                        var selfCount = i === polygonCount - 1                            ? left                            : Math.ceil(item.area / totalArea_1 * count);                        if (selfCount < 0) {                            continue;                        }                        binaryDivideRecursive(binaryDividePolygon, {                            points: item.poly                        }, selfCount, outShapes);                        left -= selfCount;                    }                }                OutShapeCtor = Polygon;                break;        }        if (!OutShapeCtor) {            return clone$3(path, count);        }        var out = [];        for (var i = 0; i < outShapes.length; i++) {            var subPath = new OutShapeCtor();            subPath.setShape(outShapes[i]);            copyPathProps(path, subPath);            out.push(subPath);        }        return out;    }    function alignSubpath(subpath1, subpath2) {        var len1 = subpath1.length;        var len2 = subpath2.length;        if (len1 === len2) {            return [subpath1, subpath2];        }        var tmpSegX = [];        var tmpSegY = [];        var shorterPath = len1 < len2 ? subpath1 : subpath2;        var shorterLen = Math.min(len1, len2);        var diff = Math.abs(len2 - len1) / 6;        var shorterBezierCount = (shorterLen - 2) / 6;        var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1;        var newSubpath = [shorterPath[0], shorterPath[1]];        var remained = diff;        for (var i = 2; i < shorterLen;) {            var x0 = shorterPath[i - 2];            var y0 = shorterPath[i - 1];            var x1 = shorterPath[i++];            var y1 = shorterPath[i++];            var x2 = shorterPath[i++];            var y2 = shorterPath[i++];            var x3 = shorterPath[i++];            var y3 = shorterPath[i++];            if (remained <= 0) {                newSubpath.push(x1, y1, x2, y2, x3, y3);                continue;            }            var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1;            for (var k = 1; k <= actualSubDivCount; k++) {                var p = k / actualSubDivCount;                cubicSubdivide(x0, x1, x2, x3, p, tmpSegX);                cubicSubdivide(y0, y1, y2, y3, p, tmpSegY);                x0 = tmpSegX[3];                y0 = tmpSegY[3];                newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0);                x1 = tmpSegX[5];                y1 = tmpSegY[5];                x2 = tmpSegX[6];                y2 = tmpSegY[6];            }            remained -= actualSubDivCount - 1;        }        return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath];    }    function createSubpath(lastSubpathSubpath, otherSubpath) {        var len = lastSubpathSubpath.length;        var lastX = lastSubpathSubpath[len - 2];        var lastY = lastSubpathSubpath[len - 1];        var newSubpath = [];        for (var i = 0; i < otherSubpath.length;) {            newSubpath[i++] = lastX;            newSubpath[i++] = lastY;        }        return newSubpath;    }    function alignBezierCurves(array1, array2) {        var _a;        var lastSubpath1;        var lastSubpath2;        var newArray1 = [];        var newArray2 = [];        for (var i = 0; i < Math.max(array1.length, array2.length); i++) {            var subpath1 = array1[i];            var subpath2 = array2[i];            var newSubpath1 = void 0;            var newSubpath2 = void 0;            if (!subpath1) {                newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2);                newSubpath2 = subpath2;            }            else if (!subpath2) {                newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1);                newSubpath1 = subpath1;            }            else {                _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1];                lastSubpath1 = newSubpath1;                lastSubpath2 = newSubpath2;            }            newArray1.push(newSubpath1);            newArray2.push(newSubpath2);        }        return [newArray1, newArray2];    }    function centroid(array) {        var signedArea = 0;        var cx = 0;        var cy = 0;        var len = array.length;        for (var i = 0, j = len - 2; i < len; j = i, i += 2) {            var x0 = array[j];            var y0 = array[j + 1];            var x1 = array[i];            var y1 = array[i + 1];            var a = x0 * y1 - x1 * y0;            signedArea += a;            cx += (x0 + x1) * a;            cy += (y0 + y1) * a;        }        if (signedArea === 0) {            return [array[0] || 0, array[1] || 0];        }        return [cx / signedArea / 3, cy / signedArea / 3, signedArea];    }    function findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) {        var bezierCount = (fromSubBeziers.length - 2) / 6;        var bestScore = Infinity;        var bestOffset = 0;        var len = fromSubBeziers.length;        var len2 = len - 2;        for (var offset = 0; offset < bezierCount; offset++) {            var cursorOffset = offset * 6;            var score = 0;            for (var k = 0; k < len; k += 2) {                var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2);                var x0 = fromSubBeziers[idx] - fromCp[0];                var y0 = fromSubBeziers[idx + 1] - fromCp[1];                var x1 = toSubBeziers[k] - toCp[0];                var y1 = toSubBeziers[k + 1] - toCp[1];                var dx = x1 - x0;                var dy = y1 - y0;                score += dx * dx + dy * dy;            }            if (score < bestScore) {                bestScore = score;                bestOffset = offset;            }        }        return bestOffset;    }    function reverse(array) {        var newArr = [];        var len = array.length;        for (var i = 0; i < len; i += 2) {            newArr[i] = array[len - i - 2];            newArr[i + 1] = array[len - i - 1];        }        return newArr;    }    function findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) {        var result = [];        var fromNeedsReverse;        for (var i = 0; i < fromArr.length; i++) {            var fromSubpathBezier = fromArr[i];            var toSubpathBezier = toArr[i];            var fromCp = centroid(fromSubpathBezier);            var toCp = centroid(toSubpathBezier);            if (fromNeedsReverse == null) {                fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0;            }            var newFromSubpathBezier = [];            var newToSubpathBezier = [];            var bestAngle = 0;            var bestScore = Infinity;            var tmpArr = [];            var len = fromSubpathBezier.length;            if (fromNeedsReverse) {                fromSubpathBezier = reverse(fromSubpathBezier);            }            var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6;            var len2 = len - 2;            for (var k = 0; k < len2; k += 2) {                var idx = (offset + k) % len2 + 2;                newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0];                newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1];            }            newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0];            newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1];            if (searchAngleIteration > 0) {                var step = searchAngleRange / searchAngleIteration;                for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) {                    var sa = Math.sin(angle);                    var ca = Math.cos(angle);                    var score = 0;                    for (var k = 0; k < fromSubpathBezier.length; k += 2) {                        var x0 = newFromSubpathBezier[k];                        var y0 = newFromSubpathBezier[k + 1];                        var x1 = toSubpathBezier[k] - toCp[0];                        var y1 = toSubpathBezier[k + 1] - toCp[1];                        var newX1 = x1 * ca - y1 * sa;                        var newY1 = x1 * sa + y1 * ca;                        tmpArr[k] = newX1;                        tmpArr[k + 1] = newY1;                        var dx = newX1 - x0;                        var dy = newY1 - y0;                        score += dx * dx + dy * dy;                    }                    if (score < bestScore) {                        bestScore = score;                        bestAngle = angle;                        for (var m = 0; m < tmpArr.length; m++) {                            newToSubpathBezier[m] = tmpArr[m];                        }                    }                }            }            else {                for (var i_1 = 0; i_1 < len; i_1 += 2) {                    newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0];                    newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1];                }            }            result.push({                from: newFromSubpathBezier,                to: newToSubpathBezier,                fromCp: fromCp,                toCp: toCp,                rotation: -bestAngle            });        }        return result;    }    function isCombineMorphing(path) {        return path.__isCombineMorphing;    }    function isMorphing(el) {        return el.__morphT >= 0;    }    var SAVED_METHOD_PREFIX = '__mOriginal_';    function saveAndModifyMethod(obj, methodName, modifiers) {        var savedMethodName = SAVED_METHOD_PREFIX + methodName;        var originalMethod = obj[savedMethodName] || obj[methodName];        if (!obj[savedMethodName]) {            obj[savedMethodName] = obj[methodName];        }        var replace = modifiers.replace;        var after = modifiers.after;        var before = modifiers.before;        obj[methodName] = function () {            var args = arguments;            var res;            before && before.apply(this, args);            if (replace) {                res = replace.apply(this, args);            }            else {                res = originalMethod.apply(this, args);            }            after && after.apply(this, args);            return res;        };    }    function restoreMethod(obj, methodName) {        var savedMethodName = SAVED_METHOD_PREFIX + methodName;        if (obj[savedMethodName]) {            obj[methodName] = obj[savedMethodName];            obj[savedMethodName] = null;        }    }    function applyTransformOnBeziers(bezierCurves, mm) {        for (var i = 0; i < bezierCurves.length; i++) {            var subBeziers = bezierCurves[i];            for (var k = 0; k < subBeziers.length;) {                var x = subBeziers[k];                var y = subBeziers[k + 1];                subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4];                subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5];            }        }    }    function prepareMorphPath(fromPath, toPath) {        var fromPathProxy = fromPath.getUpdatedPathProxy();        var toPathProxy = toPath.getUpdatedPathProxy();        var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1];        var fromPathTransform = fromPath.getComputedTransform();        var toPathTransform = toPath.getComputedTransform();        function updateIdentityTransform() {            this.transform = null;        }        fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform);        toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform);        saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform });        toPath.transform = null;        var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI);        var tmpArr = [];        saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) {                var t = toPath.__morphT;                var onet = 1 - t;                var newCp = [];                for (var i = 0; i < morphingData.length; i++) {                    var item = morphingData[i];                    var from = item.from;                    var to = item.to;                    var angle = item.rotation * t;                    var fromCp = item.fromCp;                    var toCp = item.toCp;                    var sa = Math.sin(angle);                    var ca = Math.cos(angle);                    lerp(newCp, fromCp, toCp, t);                    for (var m = 0; m < from.length; m += 2) {                        var x0_1 = from[m];                        var y0_1 = from[m + 1];                        var x1 = to[m];                        var y1 = to[m + 1];                        var x = x0_1 * onet + x1 * t;                        var y = y0_1 * onet + y1 * t;                        tmpArr[m] = (x * ca - y * sa) + newCp[0];                        tmpArr[m + 1] = (x * sa + y * ca) + newCp[1];                    }                    var x0 = tmpArr[0];                    var y0 = tmpArr[1];                    path.moveTo(x0, y0);                    for (var m = 2; m < from.length;) {                        var x1 = tmpArr[m++];                        var y1 = tmpArr[m++];                        var x2 = tmpArr[m++];                        var y2 = tmpArr[m++];                        var x3 = tmpArr[m++];                        var y3 = tmpArr[m++];                        if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) {                            path.lineTo(x3, y3);                        }                        else {                            path.bezierCurveTo(x1, y1, x2, y2, x3, y3);                        }                        x0 = x3;                        y0 = y3;                    }                }            } });    }    function morphPath(fromPath, toPath, animationOpts) {        if (!fromPath || !toPath) {            return toPath;        }        var oldDone = animationOpts.done;        var oldDuring = animationOpts.during;        prepareMorphPath(fromPath, toPath);        toPath.__morphT = 0;        function restoreToPath() {            restoreMethod(toPath, 'buildPath');            restoreMethod(toPath, 'updateTransform');            toPath.__morphT = -1;            toPath.createPathProxy();            toPath.dirtyShape();        }        toPath.animateTo({            __morphT: 1        }, defaults({            during: function (p) {                toPath.dirtyShape();                oldDuring && oldDuring(p);            },            done: function () {                restoreToPath();                oldDone && oldDone();            }        }, animationOpts));        return toPath;    }    function hilbert(x, y, minX, minY, maxX, maxY) {        var bits = 16;        x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX));        y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY));        var d = 0;        var tmp;        for (var s = (1 << bits) / 2; s > 0; s /= 2) {            var rx = 0;            var ry = 0;            if ((x & s) > 0) {                rx = 1;            }            if ((y & s) > 0) {                ry = 1;            }            d += s * s * ((3 * rx) ^ ry);            if (ry === 0) {                if (rx === 1) {                    x = s - 1 - x;                    y = s - 1 - y;                }                tmp = x;                x = y;                y = tmp;            }        }        return d;    }    function sortPaths(pathList) {        var xMin = Infinity;        var yMin = Infinity;        var xMax = -Infinity;        var yMax = -Infinity;        var cps = map(pathList, function (path) {            var rect = path.getBoundingRect();            var m = path.getComputedTransform();            var x = rect.x + rect.width / 2 + (m ? m[4] : 0);            var y = rect.y + rect.height / 2 + (m ? m[5] : 0);            xMin = Math.min(x, xMin);            yMin = Math.min(y, yMin);            xMax = Math.max(x, xMax);            yMax = Math.max(y, yMax);            return [x, y];        });        var items = map(cps, function (cp, idx) {            return {                cp: cp,                z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax),                path: pathList[idx]            };        });        return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; });    }    function defaultDividePath(param) {        return split(param.path, param.count);    }    function createEmptyReturn() {        return {            fromIndividuals: [],            toIndividuals: [],            count: 0        };    }    function combineMorph(fromList, toPath, animationOpts) {        var fromPathList = [];        function addFromPath(fromList) {            for (var i = 0; i < fromList.length; i++) {                var from = fromList[i];                if (isCombineMorphing(from)) {                    addFromPath(from.childrenRef());                }                else if (from instanceof Path) {                    fromPathList.push(from);                }            }        }        addFromPath(fromList);        var separateCount = fromPathList.length;        if (!separateCount) {            return createEmptyReturn();        }        var dividePath = animationOpts.dividePath || defaultDividePath;        var toSubPathList = dividePath({            path: toPath, count: separateCount        });        if (toSubPathList.length !== separateCount) {            console.error('Invalid morphing: unmatched splitted path');            return createEmptyReturn();        }        fromPathList = sortPaths(fromPathList);        toSubPathList = sortPaths(toSubPathList);        var oldDone = animationOpts.done;        var oldDuring = animationOpts.during;        var individualDelay = animationOpts.individualDelay;        var identityTransform = new Transformable();        for (var i = 0; i < separateCount; i++) {            var from = fromPathList[i];            var to = toSubPathList[i];            to.parent = toPath;            to.copyTransform(identityTransform);            if (!individualDelay) {                prepareMorphPath(from, to);            }        }        toPath.__isCombineMorphing = true;        toPath.childrenRef = function () {            return toSubPathList;        };        function addToSubPathListToZr(zr) {            for (var i = 0; i < toSubPathList.length; i++) {                toSubPathList[i].addSelfToZr(zr);            }        }        saveAndModifyMethod(toPath, 'addSelfToZr', {            after: function (zr) {                addToSubPathListToZr(zr);            }        });        saveAndModifyMethod(toPath, 'removeSelfFromZr', {            after: function (zr) {                for (var i = 0; i < toSubPathList.length; i++) {                    toSubPathList[i].removeSelfFromZr(zr);                }            }        });        function restoreToPath() {            toPath.__isCombineMorphing = false;            toPath.__morphT = -1;            toPath.childrenRef = null;            restoreMethod(toPath, 'addSelfToZr');            restoreMethod(toPath, 'removeSelfFromZr');        }        var toLen = toSubPathList.length;        if (individualDelay) {            var animating_1 = toLen;            var eachDone = function () {                animating_1--;                if (animating_1 === 0) {                    restoreToPath();                    oldDone && oldDone();                }            };            for (var i = 0; i < toLen; i++) {                var indivdualAnimationOpts = individualDelay ? defaults({                    delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]),                    done: eachDone                }, animationOpts) : animationOpts;                morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts);            }        }        else {            toPath.__morphT = 0;            toPath.animateTo({                __morphT: 1            }, defaults({                during: function (p) {                    for (var i = 0; i < toLen; i++) {                        var child = toSubPathList[i];                        child.__morphT = toPath.__morphT;                        child.dirtyShape();                    }                    oldDuring && oldDuring(p);                },                done: function () {                    restoreToPath();                    for (var i = 0; i < fromList.length; i++) {                        restoreMethod(fromList[i], 'updateTransform');                    }                    oldDone && oldDone();                }            }, animationOpts));        }        if (toPath.__zr) {            addToSubPathListToZr(toPath.__zr);        }        return {            fromIndividuals: fromPathList,            toIndividuals: toSubPathList,            count: toLen        };    }    function separateMorph(fromPath, toPathList, animationOpts) {        var toLen = toPathList.length;        var fromPathList = [];        var dividePath = animationOpts.dividePath || defaultDividePath;        function addFromPath(fromList) {            for (var i = 0; i < fromList.length; i++) {                var from = fromList[i];                if (isCombineMorphing(from)) {                    addFromPath(from.childrenRef());                }                else if (from instanceof Path) {                    fromPathList.push(from);                }            }        }        if (isCombineMorphing(fromPath)) {            addFromPath(fromPath.childrenRef());            var fromLen = fromPathList.length;            if (fromLen < toLen) {                var k = 0;                for (var i = fromLen; i < toLen; i++) {                    fromPathList.push(clonePath(fromPathList[k++ % fromLen]));                }            }            fromPathList.length = toLen;        }        else {            fromPathList = dividePath({ path: fromPath, count: toLen });            var fromPathTransform = fromPath.getComputedTransform();            for (var i = 0; i < fromPathList.length; i++) {                fromPathList[i].setLocalTransform(fromPathTransform);            }            if (fromPathList.length !== toLen) {                console.error('Invalid morphing: unmatched splitted path');                return createEmptyReturn();            }        }        fromPathList = sortPaths(fromPathList);        toPathList = sortPaths(toPathList);        var individualDelay = animationOpts.individualDelay;        for (var i = 0; i < toLen; i++) {            var indivdualAnimationOpts = individualDelay ? defaults({                delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i])            }, animationOpts) : animationOpts;            morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts);        }        return {            fromIndividuals: fromPathList,            toIndividuals: toPathList,            count: toPathList.length        };    }    var morphPath$1 = /*#__PURE__*/Object.freeze({        __proto__: null,        alignBezierCurves: alignBezierCurves,        centroid: centroid,        isCombineMorphing: isCombineMorphing,        isMorphing: isMorphing,        morphPath: morphPath,        combineMorph: combineMorph,        separateMorph: separateMorph,        defaultDividePath: split    });    var CompoundPath = (function (_super) {        __extends(CompoundPath, _super);        function CompoundPath() {            var _this = _super !== null && _super.apply(this, arguments) || this;            _this.type = 'compound';            return _this;        }        CompoundPath.prototype._updatePathDirty = function () {            var paths = this.shape.paths;            var dirtyPath = this.shapeChanged();            for (var i = 0; i < paths.length; i++) {                dirtyPath = dirtyPath || paths[i].shapeChanged();            }            if (dirtyPath) {                this.dirtyShape();            }        };        CompoundPath.prototype.beforeBrush = function () {            this._updatePathDirty();            var paths = this.shape.paths || [];            var scale = this.getGlobalScale();            for (var i = 0; i < paths.length; i++) {                if (!paths[i].path) {                    paths[i].createPathProxy();                }                paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold);            }        };        CompoundPath.prototype.buildPath = function (ctx, shape) {            var paths = shape.paths || [];            for (var i = 0; i < paths.length; i++) {                paths[i].buildPath(ctx, paths[i].shape, true);            }        };        CompoundPath.prototype.afterBrush = function () {            var paths = this.shape.paths || [];            for (var i = 0; i < paths.length; i++) {                paths[i].pathUpdated();            }        };        CompoundPath.prototype.getBoundingRect = function () {            this._updatePathDirty.call(this);            return Path.prototype.getBoundingRect.call(this);        };        return CompoundPath;    }(Path));    var m = [];    var IncrementalDisplayable = (function (_super) {        __extends(IncrementalDisplayable, _super);        function IncrementalDisplayable() {            var _this = _super !== null && _super.apply(this, arguments) || this;            _this.notClear = true;            _this.incremental = true;            _this._displayables = [];            _this._temporaryDisplayables = [];            _this._cursor = 0;            return _this;        }        IncrementalDisplayable.prototype.traverse = function (cb, context) {            cb.call(context, this);        };        IncrementalDisplayable.prototype.useStyle = function () {            this.style = {};        };        IncrementalDisplayable.prototype.getCursor = function () {            return this._cursor;        };        IncrementalDisplayable.prototype.innerAfterBrush = function () {            this._cursor = this._displayables.length;        };        IncrementalDisplayable.prototype.clearDisplaybles = function () {            this._displayables = [];            this._temporaryDisplayables = [];            this._cursor = 0;            this.markRedraw();            this.notClear = false;        };        IncrementalDisplayable.prototype.clearTemporalDisplayables = function () {            this._temporaryDisplayables = [];        };        IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) {            if (notPersistent) {                this._temporaryDisplayables.push(displayable);            }            else {                this._displayables.push(displayable);            }            this.markRedraw();        };        IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) {            notPersistent = notPersistent || false;            for (var i = 0; i < displayables.length; i++) {                this.addDisplayable(displayables[i], notPersistent);            }        };        IncrementalDisplayable.prototype.getDisplayables = function () {            return this._displayables;        };        IncrementalDisplayable.prototype.getTemporalDisplayables = function () {            return this._temporaryDisplayables;        };        IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) {            for (var i = this._cursor; i < this._displayables.length; i++) {                cb && cb(this._displayables[i]);            }            for (var i = 0; i < this._temporaryDisplayables.length; i++) {                cb && cb(this._temporaryDisplayables[i]);            }        };        IncrementalDisplayable.prototype.update = function () {            this.updateTransform();            for (var i = this._cursor; i < this._displayables.length; i++) {                var displayable = this._displayables[i];                displayable.parent = this;                displayable.update();                displayable.parent = null;            }            for (var i = 0; i < this._temporaryDisplayables.length; i++) {                var displayable = this._temporaryDisplayables[i];                displayable.parent = this;                displayable.update();                displayable.parent = null;            }        };        IncrementalDisplayable.prototype.getBoundingRect = function () {            if (!this._rect) {                var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity);                for (var i = 0; i < this._displayables.length; i++) {                    var displayable = this._displayables[i];                    var childRect = displayable.getBoundingRect().clone();                    if (displayable.needLocalTransform()) {                        childRect.applyTransform(displayable.getLocalTransform(m));                    }                    rect.union(childRect);                }                this._rect = rect;            }            return this._rect;        };        IncrementalDisplayable.prototype.contain = function (x, y) {            var localPos = this.transformCoordToLocal(x, y);            var rect = this.getBoundingRect();            if (rect.contain(localPos[0], localPos[1])) {                for (var i = 0; i < this._displayables.length; i++) {                    var displayable = this._displayables[i];                    if (displayable.contain(x, y)) {                        return true;                    }                }            }            return false;        };        return IncrementalDisplayable;    }(Displayable));    var globalImageCache = new LRU(50);    function findExistImage(newImageOrSrc) {        if (typeof newImageOrSrc === 'string') {            var cachedImgObj = globalImageCache.get(newImageOrSrc);            return cachedImgObj && cachedImgObj.image;        }        else {            return newImageOrSrc;        }    }    function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) {        if (!newImageOrSrc) {            return image;        }        else if (typeof newImageOrSrc === 'string') {            if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) {                return image;            }            var cachedImgObj = globalImageCache.get(newImageOrSrc);            var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload };            if (cachedImgObj) {                image = cachedImgObj.image;                !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);            }            else {                image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad);                image.__zrImageSrc = newImageOrSrc;                globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {                    image: image,                    pending: [pendingWrap]                });            }            return image;        }        else {            return newImageOrSrc;        }    }    function imageOnLoad() {        var cachedImgObj = this.__cachedImgObj;        this.onload = this.onerror = this.__cachedImgObj = null;        for (var i = 0; i < cachedImgObj.pending.length; i++) {            var pendingWrap = cachedImgObj.pending[i];            var cb = pendingWrap.cb;            cb && cb(this, pendingWrap.cbPayload);            pendingWrap.hostEl.dirty();        }        cachedImgObj.pending.length = 0;    }    function isImageReady(image) {        return image && image.width && image.height;    }    var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;    function truncateText(text, containerWidth, font, ellipsis, options) {        if (!containerWidth) {            return '';        }        var textLines = (text + '').split('\n');        options = prepareTruncateOptions(containerWidth, font, ellipsis, options);        for (var i = 0, len = textLines.length; i < len; i++) {            textLines[i] = truncateSingleLine(textLines[i], options);        }        return textLines.join('\n');    }    function prepareTruncateOptions(containerWidth, font, ellipsis, options) {        options = options || {};        var preparedOpts = extend({}, options);        preparedOpts.font = font;        ellipsis = retrieve2(ellipsis, '...');        preparedOpts.maxIterations = retrieve2(options.maxIterations, 2);        var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0);        preparedOpts.cnCharWidth = getWidth('国', font);        var ascCharWidth = preparedOpts.ascCharWidth = getWidth('a', font);        preparedOpts.placeholder = retrieve2(options.placeholder, '');        var contentWidth = containerWidth = Math.max(0, containerWidth - 1);        for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {            contentWidth -= ascCharWidth;        }        var ellipsisWidth = getWidth(ellipsis, font);        if (ellipsisWidth > contentWidth) {            ellipsis = '';            ellipsisWidth = 0;        }        contentWidth = containerWidth - ellipsisWidth;        preparedOpts.ellipsis = ellipsis;        preparedOpts.ellipsisWidth = ellipsisWidth;        preparedOpts.contentWidth = contentWidth;        preparedOpts.containerWidth = containerWidth;        return preparedOpts;    }    function truncateSingleLine(textLine, options) {        var containerWidth = options.containerWidth;        var font = options.font;        var contentWidth = options.contentWidth;        if (!containerWidth) {            return '';        }        var lineWidth = getWidth(textLine, font);        if (lineWidth <= containerWidth) {            return textLine;        }        for (var j = 0;; j++) {            if (lineWidth <= contentWidth || j >= options.maxIterations) {                textLine += options.ellipsis;                break;            }            var subLength = j === 0                ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth)                : lineWidth > 0                    ? Math.floor(textLine.length * contentWidth / lineWidth)                    : 0;            textLine = textLine.substr(0, subLength);            lineWidth = getWidth(textLine, font);        }        if (textLine === '') {            textLine = options.placeholder;        }        return textLine;    }    function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {        var width = 0;        var i = 0;        for (var len = text.length; i < len && width < contentWidth; i++) {            var charCode = text.charCodeAt(i);            width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth;        }        return i;    }    function parsePlainText(text, style) {        text != null && (text += '');        var overflow = style.overflow;        var padding = style.padding;        var font = style.font;        var truncate = overflow === 'truncate';        var calculatedLineHeight = getLineHeight(font);        var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight);        var bgColorDrawn = !!(style.backgroundColor);        var truncateLineOverflow = style.lineOverflow === 'truncate';        var width = style.width;        var lines;        if (width != null && (overflow === 'break' || overflow === 'breakAll')) {            lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : [];        }        else {            lines = text ? text.split('\n') : [];        }        var contentHeight = lines.length * lineHeight;        var height = retrieve2(style.height, contentHeight);        if (contentHeight > height && truncateLineOverflow) {            var lineCount = Math.floor(height / lineHeight);            lines = lines.slice(0, lineCount);        }        if (text && truncate && width != null) {            var options = prepareTruncateOptions(width, font, style.ellipsis, {                minChar: style.truncateMinChar,                placeholder: style.placeholder            });            for (var i = 0; i < lines.length; i++) {                lines[i] = truncateSingleLine(lines[i], options);            }        }        var outerHeight = height;        var contentWidth = 0;        for (var i = 0; i < lines.length; i++) {            contentWidth = Math.max(getWidth(lines[i], font), contentWidth);        }        if (width == null) {            width = contentWidth;        }        var outerWidth = contentWidth;        if (padding) {            outerHeight += padding[0] + padding[2];            outerWidth += padding[1] + padding[3];            width += padding[1] + padding[3];        }        if (bgColorDrawn) {            outerWidth = width;        }        return {            lines: lines,            height: height,            outerWidth: outerWidth,            outerHeight: outerHeight,            lineHeight: lineHeight,            calculatedLineHeight: calculatedLineHeight,            contentWidth: contentWidth,            contentHeight: contentHeight,            width: width        };    }    var RichTextToken = (function () {        function RichTextToken() {        }        return RichTextToken;    }());    var RichTextLine = (function () {        function RichTextLine(tokens) {            this.tokens = [];            if (tokens) {                this.tokens = tokens;            }        }        return RichTextLine;    }());    var RichTextContentBlock = (function () {        function RichTextContentBlock() {            this.width = 0;            this.height = 0;            this.contentWidth = 0;            this.contentHeight = 0;            this.outerWidth = 0;            this.outerHeight = 0;            this.lines = [];        }        return RichTextContentBlock;    }());    function parseRichText(text, style) {        var contentBlock = new RichTextContentBlock();        text != null && (text += '');        if (!text) {            return contentBlock;        }        var topWidth = style.width;        var topHeight = style.height;        var overflow = style.overflow;        var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null            ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' }            : null;        var lastIndex = STYLE_REG.lastIndex = 0;        var result;        while ((result = STYLE_REG.exec(text)) != null) {            var matchedIndex = result.index;            if (matchedIndex > lastIndex) {                pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo);            }            pushTokens(contentBlock, result[2], style, wrapInfo, result[1]);            lastIndex = STYLE_REG.lastIndex;        }        if (lastIndex < text.length) {            pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo);        }        var pendingList = [];        var calculatedHeight = 0;        var calculatedWidth = 0;        var stlPadding = style.padding;        var truncate = overflow === 'truncate';        var truncateLine = style.lineOverflow === 'truncate';        function finishLine(line, lineWidth, lineHeight) {            line.width = lineWidth;            line.lineHeight = lineHeight;            calculatedHeight += lineHeight;            calculatedWidth = Math.max(calculatedWidth, lineWidth);        }        outer: for (var i = 0; i < contentBlock.lines.length; i++) {            var line = contentBlock.lines[i];            var lineHeight = 0;            var lineWidth = 0;            for (var j = 0; j < line.tokens.length; j++) {                var token = line.tokens[j];                var tokenStyle = token.styleName && style.rich[token.styleName] || {};                var textPadding = token.textPadding = tokenStyle.padding;                var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0;                var font = token.font = tokenStyle.font || style.font;                token.contentHeight = getLineHeight(font);                var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight);                token.innerHeight = tokenHeight;                textPadding && (tokenHeight += textPadding[0] + textPadding[2]);                token.height = tokenHeight;                token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight);                token.align = tokenStyle && tokenStyle.align || style.align;                token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle';                if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) {                    if (j > 0) {                        line.tokens = line.tokens.slice(0, j);                        finishLine(line, lineWidth, lineHeight);                        contentBlock.lines = contentBlock.lines.slice(0, i + 1);                    }                    else {                        contentBlock.lines = contentBlock.lines.slice(0, i);                    }                    break outer;                }                var styleTokenWidth = tokenStyle.width;                var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto';                if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') {                    token.percentWidth = styleTokenWidth;                    pendingList.push(token);                    token.contentWidth = getWidth(token.text, font);                }                else {                    if (tokenWidthNotSpecified) {                        var textBackgroundColor = tokenStyle.backgroundColor;                        var bgImg = textBackgroundColor && textBackgroundColor.image;                        if (bgImg) {                            bgImg = findExistImage(bgImg);                            if (isImageReady(bgImg)) {                                token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height);                            }                        }                    }                    var remainTruncWidth = truncate && topWidth != null                        ? topWidth - lineWidth : null;                    if (remainTruncWidth != null && remainTruncWidth < token.width) {                        if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) {                            token.text = '';                            token.width = token.contentWidth = 0;                        }                        else {                            token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar });                            token.width = token.contentWidth = getWidth(token.text, font);                        }                    }                    else {                        token.contentWidth = getWidth(token.text, font);                    }                }                token.width += paddingH;                lineWidth += token.width;                tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));            }            finishLine(line, lineWidth, lineHeight);        }        contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth);        contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight);        contentBlock.contentHeight = calculatedHeight;        contentBlock.contentWidth = calculatedWidth;        if (stlPadding) {            contentBlock.outerWidth += stlPadding[1] + stlPadding[3];            contentBlock.outerHeight += stlPadding[0] + stlPadding[2];        }        for (var i = 0; i < pendingList.length; i++) {            var token = pendingList[i];            var percentWidth = token.percentWidth;            token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width;        }        return contentBlock;    }    function pushTokens(block, str, style, wrapInfo, styleName) {        var isEmptyStr = str === '';        var tokenStyle = styleName && style.rich[styleName] || {};        var lines = block.lines;        var font = tokenStyle.font || style.font;        var newLine = false;        var strLines;        var linesWidths;        if (wrapInfo) {            var tokenPadding = tokenStyle.padding;            var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0;            if (tokenStyle.width != null && tokenStyle.width !== 'auto') {                var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH;                if (lines.length > 0) {                    if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) {                        strLines = str.split('\n');                        newLine = true;                    }                }                wrapInfo.accumWidth = outerWidth_1;            }            else {                var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth);                wrapInfo.accumWidth = res.accumWidth + tokenPaddingH;                linesWidths = res.linesWidths;                strLines = res.lines;            }        }        else {            strLines = str.split('\n');        }        for (var i = 0; i < strLines.length; i++) {            var text = strLines[i];            var token = new RichTextToken();            token.styleName = styleName;            token.text = text;            token.isLineHolder = !text && !isEmptyStr;            if (typeof tokenStyle.width === 'number') {                token.width = tokenStyle.width;            }            else {                token.width = linesWidths                    ? linesWidths[i]                    : getWidth(text, font);            }            if (!i && !newLine) {                var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens;                var tokensLen = tokens.length;                (tokensLen === 1 && tokens[0].isLineHolder)                    ? (tokens[0] = token)                    : ((text || !tokensLen || isEmptyStr) && tokens.push(token));            }            else {                lines.push(new RichTextLine([token]));            }        }    }    function isAlphabeticLetter(ch) {        var code = ch.charCodeAt(0);        return code >= 0x20 && code <= 0x24F            || code >= 0x370 && code <= 0x10FF            || code >= 0x1200 && code <= 0x13FF            || code >= 0x1E00 && code <= 0x206F;    }    var breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) {        obj[ch] = true;        return obj;    }, {});    function isWordBreakChar(ch) {        if (isAlphabeticLetter(ch)) {            if (breakCharMap[ch]) {                return true;            }            return false;        }        return true;    }    function wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) {        var lines = [];        var linesWidths = [];        var line = '';        var currentWord = '';        var currentWordWidth = 0;        var accumWidth = 0;        for (var i = 0; i < text.length; i++) {            var ch = text.charAt(i);            if (ch === '\n') {                if (currentWord) {                    line += currentWord;                    accumWidth += currentWordWidth;                }                lines.push(line);                linesWidths.push(accumWidth);                line = '';                currentWord = '';                currentWordWidth = 0;                accumWidth = 0;                continue;            }            var chWidth = getWidth(ch, font);            var inWord = isBreakAll ? false : !isWordBreakChar(ch);            if (!lines.length                ? lastAccumWidth + accumWidth + chWidth > lineWidth                : accumWidth + chWidth > lineWidth) {                if (!accumWidth) {                    if (inWord) {                        lines.push(currentWord);                        linesWidths.push(currentWordWidth);                        currentWord = ch;                        currentWordWidth = chWidth;                    }                    else {                        lines.push(ch);                        linesWidths.push(chWidth);                    }                }                else if (line || currentWord) {                    if (inWord) {                        if (!line) {                            line = currentWord;                            currentWord = '';                            currentWordWidth = 0;                            accumWidth = currentWordWidth;                        }                        lines.push(line);                        linesWidths.push(accumWidth - currentWordWidth);                        currentWord += ch;                        currentWordWidth += chWidth;                        line = '';                        accumWidth = currentWordWidth;                    }                    else {                        if (currentWord) {                            line += currentWord;                            currentWord = '';                            currentWordWidth = 0;                        }                        lines.push(line);                        linesWidths.push(accumWidth);                        line = ch;                        accumWidth = chWidth;                    }                }                continue;            }            accumWidth += chWidth;            if (inWord) {                currentWord += ch;                currentWordWidth += chWidth;            }            else {                if (currentWord) {                    line += currentWord;                    currentWord = '';                    currentWordWidth = 0;                }                line += ch;            }        }        if (!lines.length && !line) {            line = text;            currentWord = '';            currentWordWidth = 0;        }        if (currentWord) {            line += currentWord;        }        if (line) {            lines.push(line);            linesWidths.push(accumWidth);        }        if (lines.length === 1) {            accumWidth += lastAccumWidth;        }        return {            accumWidth: accumWidth,            lines: lines,            linesWidths: linesWidths        };    }    var DEFAULT_RICH_TEXT_COLOR = {        fill: '#000'    };    var DEFAULT_STROKE_LINE_WIDTH = 2;    var DEFAULT_TEXT_ANIMATION_PROPS = {        style: defaults({            fill: true,            stroke: true,            fillOpacity: true,            strokeOpacity: true,            lineWidth: true,            fontSize: true,            lineHeight: true,            width: true,            height: true,            textShadowColor: true,            textShadowBlur: true,            textShadowOffsetX: true,            textShadowOffsetY: true,            backgroundColor: true,            padding: true,            borderColor: true,            borderWidth: true,            borderRadius: true        }, DEFAULT_COMMON_ANIMATION_PROPS.style)    };    var ZRText = (function (_super) {        __extends(ZRText, _super);        function ZRText(opts) {            var _this = _super.call(this) || this;            _this.type = 'text';            _this._children = [];            _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR;            _this.attr(opts);            return _this;        }        ZRText.prototype.childrenRef = function () {            return this._children;        };        ZRText.prototype.update = function () {            _super.prototype.update.call(this);            if (this.styleChanged()) {                this._updateSubTexts();            }            for (var i = 0; i < this._children.length; i++) {                var child = this._children[i];                child.zlevel = this.zlevel;                child.z = this.z;                child.z2 = this.z2;                child.culling = this.culling;                child.cursor = this.cursor;                child.invisible = this.invisible;            }        };        ZRText.prototype.updateTransform = function () {            var innerTransformable = this.innerTransformable;            if (innerTransformable) {                innerTransformable.updateTransform();                if (innerTransformable.transform) {                    this.transform = innerTransformable.transform;                }            }            else {                _super.prototype.updateTransform.call(this);            }        };        ZRText.prototype.getLocalTransform = function (m) {            var innerTransformable = this.innerTransformable;            return innerTransformable                ? innerTransformable.getLocalTransform(m)                : _super.prototype.getLocalTransform.call(this, m);        };        ZRText.prototype.getComputedTransform = function () {            if (this.__hostTarget) {                this.__hostTarget.getComputedTransform();                this.__hostTarget.updateInnerText(true);            }            return _super.prototype.getComputedTransform.call(this);        };        ZRText.prototype._updateSubTexts = function () {            this._childCursor = 0;            normalizeTextStyle(this.style);            this.style.rich                ? this._updateRichTexts()                : this._updatePlainTexts();            this._children.length = this._childCursor;            this.styleUpdated();        };        ZRText.prototype.addSelfToZr = function (zr) {            _super.prototype.addSelfToZr.call(this, zr);            for (var i = 0; i < this._children.length; i++) {                this._children[i].__zr = zr;            }        };        ZRText.prototype.removeSelfFromZr = function (zr) {            _super.prototype.removeSelfFromZr.call(this, zr);            for (var i = 0; i < this._children.length; i++) {                this._children[i].__zr = null;            }        };        ZRText.prototype.getBoundingRect = function () {            if (this.styleChanged()) {                this._updateSubTexts();            }            if (!this._rect) {                var tmpRect = new BoundingRect(0, 0, 0, 0);                var children = this._children;                var tmpMat = [];                var rect = null;                for (var i = 0; i < children.length; i++) {                    var child = children[i];                    var childRect = child.getBoundingRect();                    var transform = child.getLocalTransform(tmpMat);                    if (transform) {                        tmpRect.copy(childRect);                        tmpRect.applyTransform(transform);                        rect = rect || tmpRect.clone();                        rect.union(tmpRect);                    }                    else {                        rect = rect || childRect.clone();                        rect.union(childRect);                    }                }                this._rect = rect || tmpRect;            }            return this._rect;        };        ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) {            this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR;        };        ZRText.prototype.setTextContent = function (textContent) {            {                throw new Error('Can\'t attach text on another text');            }        };        ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) {            if (!sourceStyle) {                return targetStyle;            }            var sourceRich = sourceStyle.rich;            var targetRich = targetStyle.rich || (sourceRich && {});            extend(targetStyle, sourceStyle);            if (sourceRich && targetRich) {                this._mergeRich(targetRich, sourceRich);                targetStyle.rich = targetRich;            }            else if (targetRich) {                targetStyle.rich = targetRich;            }            return targetStyle;        };        ZRText.prototype._mergeRich = function (targetRich, sourceRich) {            var richNames = keys(sourceRich);            for (var i = 0; i < richNames.length; i++) {                var richName = richNames[i];                targetRich[richName] = targetRich[richName] || {};                extend(targetRich[richName], sourceRich[richName]);            }        };        ZRText.prototype.getAnimationStyleProps = function () {            return DEFAULT_TEXT_ANIMATION_PROPS;        };        ZRText.prototype._getOrCreateChild = function (Ctor) {            var child = this._children[this._childCursor];            if (!child || !(child instanceof Ctor)) {                child = new Ctor();            }            this._children[this._childCursor++] = child;            child.__zr = this.__zr;            child.parent = this;            return child;        };        ZRText.prototype._updatePlainTexts = function () {            var style = this.style;            var textFont = style.font || DEFAULT_FONT;            var textPadding = style.padding;            var text = getStyleText(style);            var contentBlock = parsePlainText(text, style);            var needDrawBg = needDrawBackground(style);            var bgColorDrawn = !!(style.backgroundColor);            var outerHeight = contentBlock.outerHeight;            var outerWidth = contentBlock.outerWidth;            var contentWidth = contentBlock.contentWidth;            var textLines = contentBlock.lines;            var lineHeight = contentBlock.lineHeight;            var defaultStyle = this._defaultStyle;            var baseX = style.x || 0;            var baseY = style.y || 0;            var textAlign = style.align || defaultStyle.align || 'left';            var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top';            var textX = baseX;            var textY = adjustTextY$1(baseY, contentBlock.contentHeight, verticalAlign);            if (needDrawBg || textPadding) {                var boxX = adjustTextX(baseX, outerWidth, textAlign);                var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign);                needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);            }            textY += lineHeight / 2;            if (textPadding) {                textX = getTextXForPadding(baseX, textAlign, textPadding);                if (verticalAlign === 'top') {                    textY += textPadding[0];                }                else if (verticalAlign === 'bottom') {                    textY -= textPadding[2];                }            }            var defaultLineWidth = 0;            var useDefaultFill = false;            var textFill = getFill('fill' in style                ? style.fill                : (useDefaultFill = true, defaultStyle.fill));            var textStroke = getStroke('stroke' in style                ? style.stroke                : (!bgColorDrawn                    && (!defaultStyle.autoStroke || useDefaultFill))                    ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke)                    : null);            var hasShadow = style.textShadowBlur > 0;            var fixedBoundingRect = style.width != null                && (style.overflow === 'truncate' || style.overflow === 'break' || style.overflow === 'breakAll');            var calculatedLineHeight = contentBlock.calculatedLineHeight;            for (var i = 0; i < textLines.length; i++) {                var el = this._getOrCreateChild(TSpan);                var subElStyle = el.createStyle();                el.useStyle(subElStyle);                subElStyle.text = textLines[i];                subElStyle.x = textX;                subElStyle.y = textY;                if (textAlign) {                    subElStyle.textAlign = textAlign;                }                subElStyle.textBaseline = 'middle';                subElStyle.opacity = style.opacity;                subElStyle.strokeFirst = true;                if (hasShadow) {                    subElStyle.shadowBlur = style.textShadowBlur || 0;                    subElStyle.shadowColor = style.textShadowColor || 'transparent';                    subElStyle.shadowOffsetX = style.textShadowOffsetX || 0;                    subElStyle.shadowOffsetY = style.textShadowOffsetY || 0;                }                subElStyle.stroke = textStroke;                subElStyle.fill = textFill;                if (textStroke) {                    subElStyle.lineWidth = style.lineWidth || defaultLineWidth;                    subElStyle.lineDash = style.lineDash;                    subElStyle.lineDashOffset = style.lineDashOffset || 0;                }                subElStyle.font = textFont;                setSeparateFont(subElStyle, style);                textY += lineHeight;                if (fixedBoundingRect) {                    el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, style.width, subElStyle.textAlign), adjustTextY$1(subElStyle.y, calculatedLineHeight, subElStyle.textBaseline), contentWidth, calculatedLineHeight));                }            }        };        ZRText.prototype._updateRichTexts = function () {            var style = this.style;            var text = getStyleText(style);            var contentBlock = parseRichText(text, style);            var contentWidth = contentBlock.width;            var outerWidth = contentBlock.outerWidth;            var outerHeight = contentBlock.outerHeight;            var textPadding = style.padding;            var baseX = style.x || 0;            var baseY = style.y || 0;            var defaultStyle = this._defaultStyle;            var textAlign = style.align || defaultStyle.align;            var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign;            var boxX = adjustTextX(baseX, outerWidth, textAlign);            var boxY = adjustTextY$1(baseY, outerHeight, verticalAlign);            var xLeft = boxX;            var lineTop = boxY;            if (textPadding) {                xLeft += textPadding[3];                lineTop += textPadding[0];            }            var xRight = xLeft + contentWidth;            if (needDrawBackground(style)) {                this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);            }            var bgColorDrawn = !!(style.backgroundColor);            for (var i = 0; i < contentBlock.lines.length; i++) {                var line = contentBlock.lines[i];                var tokens = line.tokens;                var tokenCount = tokens.length;                var lineHeight = line.lineHeight;                var remainedWidth = line.width;                var leftIndex = 0;                var lineXLeft = xLeft;                var lineXRight = xRight;                var rightIndex = tokenCount - 1;                var token = void 0;                while (leftIndex < tokenCount                    && (token = tokens[leftIndex], !token.align || token.align === 'left')) {                    this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn);                    remainedWidth -= token.width;                    lineXLeft += token.width;                    leftIndex++;                }                while (rightIndex >= 0                    && (token = tokens[rightIndex], token.align === 'right')) {                    this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn);                    remainedWidth -= token.width;                    lineXRight -= token.width;                    rightIndex--;                }                lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2;                while (leftIndex <= rightIndex) {                    token = tokens[leftIndex];                    this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn);                    lineXLeft += token.width;                    leftIndex++;                }                lineTop += lineHeight;            }        };        ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) {            var tokenStyle = style.rich[token.styleName] || {};            tokenStyle.text = token.text;            var verticalAlign = token.verticalAlign;            var y = lineTop + lineHeight / 2;            if (verticalAlign === 'top') {                y = lineTop + token.height / 2;            }            else if (verticalAlign === 'bottom') {                y = lineTop + lineHeight - token.height / 2;            }            var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle);            needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right'                ? x - token.width                : textAlign === 'center'                    ? x - token.width / 2                    : x, y - token.height / 2, token.width, token.height);            var bgColorDrawn = !!tokenStyle.backgroundColor;            var textPadding = token.textPadding;            if (textPadding) {                x = getTextXForPadding(x, textAlign, textPadding);                y -= token.height / 2 - textPadding[0] - token.innerHeight / 2;            }            var el = this._getOrCreateChild(TSpan);            var subElStyle = el.createStyle();            el.useStyle(subElStyle);            var defaultStyle = this._defaultStyle;            var useDefaultFill = false;            var defaultLineWidth = 0;            var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill                : 'fill' in style ? style.fill                    : (useDefaultFill = true, defaultStyle.fill));            var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke                : 'stroke' in style ? style.stroke                    : (!bgColorDrawn                        && !parentBgColorDrawn                        && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, defaultStyle.stroke)                        : null);            var hasShadow = tokenStyle.textShadowBlur > 0                || style.textShadowBlur > 0;            subElStyle.text = token.text;            subElStyle.x = x;            subElStyle.y = y;            if (hasShadow) {                subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0;                subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent';                subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0;                subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0;            }            subElStyle.textAlign = textAlign;            subElStyle.textBaseline = 'middle';            subElStyle.font = token.font || DEFAULT_FONT;            subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1);            setSeparateFont(subElStyle, tokenStyle);            if (textStroke) {                subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth);                subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash);                subElStyle.lineDashOffset = style.lineDashOffset || 0;                subElStyle.stroke = textStroke;            }            if (textFill) {                subElStyle.fill = textFill;            }            var textWidth = token.contentWidth;            var textHeight = token.contentHeight;            el.setBoundingRect(new BoundingRect(adjustTextX(subElStyle.x, textWidth, subElStyle.textAlign), adjustTextY$1(subElStyle.y, textHeight, subElStyle.textBaseline), textWidth, textHeight));        };        ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) {            var textBackgroundColor = style.backgroundColor;            var textBorderWidth = style.borderWidth;            var textBorderColor = style.borderColor;            var isImageBg = textBackgroundColor && textBackgroundColor.image;            var isPlainOrGradientBg = textBackgroundColor && !isImageBg;            var textBorderRadius = style.borderRadius;            var self = this;            var rectEl;            var imgEl;            if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) {                rectEl = this._getOrCreateChild(Rect);                rectEl.useStyle(rectEl.createStyle());                rectEl.style.fill = null;                var rectShape = rectEl.shape;                rectShape.x = x;                rectShape.y = y;                rectShape.width = width;                rectShape.height = height;                rectShape.r = textBorderRadius;                rectEl.dirtyShape();            }            if (isPlainOrGradientBg) {                var rectStyle = rectEl.style;                rectStyle.fill = textBackgroundColor || null;                rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1);            }            else if (isImageBg) {                imgEl = this._getOrCreateChild(ZRImage);                imgEl.onload = function () {                    self.dirtyStyle();                };                var imgStyle = imgEl.style;                imgStyle.image = textBackgroundColor.image;                imgStyle.x = x;                imgStyle.y = y;                imgStyle.width = width;                imgStyle.height = height;            }            if (textBorderWidth && textBorderColor) {                var rectStyle = rectEl.style;                rectStyle.lineWidth = textBorderWidth;                rectStyle.stroke = textBorderColor;                rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1);                rectStyle.lineDash = style.borderDash;                rectStyle.lineDashOffset = style.borderDashOffset || 0;                rectEl.strokeContainThreshold = 0;                if (rectEl.hasFill() && rectEl.hasStroke()) {                    rectStyle.strokeFirst = true;                    rectStyle.lineWidth *= 2;                }            }            var commonStyle = (rectEl || imgEl).style;            commonStyle.shadowBlur = style.shadowBlur || 0;            commonStyle.shadowColor = style.shadowColor || 'transparent';            commonStyle.shadowOffsetX = style.shadowOffsetX || 0;            commonStyle.shadowOffsetY = style.shadowOffsetY || 0;            commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1);        };        ZRText.makeFont = function (style) {            var font = '';            if (hasSeparateFont(style)) {                font = [                    style.fontStyle,                    style.fontWeight,                    parseFontSize(style.fontSize),                    style.fontFamily || 'sans-serif'                ].join(' ');            }            return font && trim(font) || style.textFont || style.font;        };        return ZRText;    }(Displayable));    var VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 };    var VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 };    var FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];    function parseFontSize(fontSize) {        if (typeof fontSize === 'string'            && (fontSize.indexOf('px') !== -1                || fontSize.indexOf('rem') !== -1                || fontSize.indexOf('em') !== -1)) {            return fontSize;        }        else if (!isNaN(+fontSize)) {            return fontSize + 'px';        }        else {            return DEFAULT_FONT_SIZE + 'px';        }    }    function setSeparateFont(targetStyle, sourceStyle) {        for (var i = 0; i < FONT_PARTS.length; i++) {            var fontProp = FONT_PARTS[i];            var val = sourceStyle[fontProp];            if (val != null) {                targetStyle[fontProp] = val;            }        }    }    function hasSeparateFont(style) {        return style.fontSize != null || style.fontFamily || style.fontWeight;    }    function normalizeTextStyle(style) {        normalizeStyle(style);        each(style.rich, normalizeStyle);        return style;    }    function normalizeStyle(style) {        if (style) {            style.font = ZRText.makeFont(style);            var textAlign = style.align;            textAlign === 'middle' && (textAlign = 'center');            style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left';            var verticalAlign = style.verticalAlign;            verticalAlign === 'center' && (verticalAlign = 'middle');            style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top';            var textPadding = style.padding;            if (textPadding) {                style.padding = normalizeCssArray(style.padding);            }        }    }    function getStroke(stroke, lineWidth) {        return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none')            ? null            : (stroke.image || stroke.colorStops)                ? '#000'                : stroke;    }    function getFill(fill) {        return (fill == null || fill === 'none')            ? null            : (fill.image || fill.colorStops)                ? '#000'                : fill;    }    function getTextXForPadding(x, textAlign, textPadding) {        return textAlign === 'right'            ? (x - textPadding[1])            : textAlign === 'center'                ? (x + textPadding[3] / 2 - textPadding[1] / 2)                : (x + textPadding[3]);    }    function getStyleText(style) {        var text = style.text;        text != null && (text += '');        return text;    }    function needDrawBackground(style) {        return !!(style.backgroundColor            || style.lineHeight            || (style.borderWidth && style.borderColor));    }    var ArcShape = (function () {        function ArcShape() {            this.cx = 0;            this.cy = 0;            this.r = 0;            this.startAngle = 0;            this.endAngle = Math.PI * 2;            this.clockwise = true;        }        return ArcShape;    }());    var Arc = (function (_super) {        __extends(Arc, _super);        function Arc(opts) {            return _super.call(this, opts) || this;        }        Arc.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        Arc.prototype.getDefaultShape = function () {            return new ArcShape();        };        Arc.prototype.buildPath = function (ctx, shape) {            var x = shape.cx;            var y = shape.cy;            var r = Math.max(shape.r, 0);            var startAngle = shape.startAngle;            var endAngle = shape.endAngle;            var clockwise = shape.clockwise;            var unitX = Math.cos(startAngle);            var unitY = Math.sin(startAngle);            ctx.moveTo(unitX * r + x, unitY * r + y);            ctx.arc(x, y, r, startAngle, endAngle, !clockwise);        };        return Arc;    }(Path));    Arc.prototype.type = 'arc';    var out = [];    var BezierCurveShape = (function () {        function BezierCurveShape() {            this.x1 = 0;            this.y1 = 0;            this.x2 = 0;            this.y2 = 0;            this.cpx1 = 0;            this.cpy1 = 0;            this.percent = 1;        }        return BezierCurveShape;    }());    function someVectorAt(shape, t, isTangent) {        var cpx2 = shape.cpx2;        var cpy2 = shape.cpy2;        if (cpx2 != null || cpy2 != null) {            return [                (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t),                (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)            ];        }        else {            return [                (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t),                (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)            ];        }    }    var BezierCurve = (function (_super) {        __extends(BezierCurve, _super);        function BezierCurve(opts) {            return _super.call(this, opts) || this;        }        BezierCurve.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        BezierCurve.prototype.getDefaultShape = function () {            return new BezierCurveShape();        };        BezierCurve.prototype.buildPath = function (ctx, shape) {            var x1 = shape.x1;            var y1 = shape.y1;            var x2 = shape.x2;            var y2 = shape.y2;            var cpx1 = shape.cpx1;            var cpy1 = shape.cpy1;            var cpx2 = shape.cpx2;            var cpy2 = shape.cpy2;            var percent = shape.percent;            if (percent === 0) {                return;            }            ctx.moveTo(x1, y1);            if (cpx2 == null || cpy2 == null) {                if (percent < 1) {                    quadraticSubdivide(x1, cpx1, x2, percent, out);                    cpx1 = out[1];                    x2 = out[2];                    quadraticSubdivide(y1, cpy1, y2, percent, out);                    cpy1 = out[1];                    y2 = out[2];                }                ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);            }            else {                if (percent < 1) {                    cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);                    cpx1 = out[1];                    cpx2 = out[2];                    x2 = out[3];                    cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);                    cpy1 = out[1];                    cpy2 = out[2];                    y2 = out[3];                }                ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);            }        };        BezierCurve.prototype.pointAt = function (t) {            return someVectorAt(this.shape, t, false);        };        BezierCurve.prototype.tangentAt = function (t) {            var p = someVectorAt(this.shape, t, true);            return normalize(p, p);        };        return BezierCurve;    }(Path));    BezierCurve.prototype.type = 'bezier-curve';    var DropletShape = (function () {        function DropletShape() {            this.cx = 0;            this.cy = 0;            this.width = 0;            this.height = 0;        }        return DropletShape;    }());    var Droplet = (function (_super) {        __extends(Droplet, _super);        function Droplet(opts) {            return _super.call(this, opts) || this;        }        Droplet.prototype.getDefaultShape = function () {            return new DropletShape();        };        Droplet.prototype.buildPath = function (ctx, shape) {            var x = shape.cx;            var y = shape.cy;            var a = shape.width;            var b = shape.height;            ctx.moveTo(x, y + a);            ctx.bezierCurveTo(x + a, y + a, x + a * 3 / 2, y - a / 3, x, y - b);            ctx.bezierCurveTo(x - a * 3 / 2, y - a / 3, x - a, y + a, x, y + a);            ctx.closePath();        };        return Droplet;    }(Path));    Droplet.prototype.type = 'droplet';    var HeartShape = (function () {        function HeartShape() {            this.cx = 0;            this.cy = 0;            this.width = 0;            this.height = 0;        }        return HeartShape;    }());    var Heart = (function (_super) {        __extends(Heart, _super);        function Heart(opts) {            return _super.call(this, opts) || this;        }        Heart.prototype.getDefaultShape = function () {            return new HeartShape();        };        Heart.prototype.buildPath = function (ctx, shape) {            var x = shape.cx;            var y = shape.cy;            var a = shape.width;            var b = shape.height;            ctx.moveTo(x, y);            ctx.bezierCurveTo(x + a / 2, y - b * 2 / 3, x + a * 2, y + b / 3, x, y + b);            ctx.bezierCurveTo(x - a * 2, y + b / 3, x - a / 2, y - b * 2 / 3, x, y);        };        return Heart;    }(Path));    Heart.prototype.type = 'heart';    var PI$3 = Math.PI;    var sin = Math.sin;    var cos = Math.cos;    var IsogonShape = (function () {        function IsogonShape() {            this.x = 0;            this.y = 0;            this.r = 0;            this.n = 0;        }        return IsogonShape;    }());    var Isogon = (function (_super) {        __extends(Isogon, _super);        function Isogon(opts) {            return _super.call(this, opts) || this;        }        Isogon.prototype.getDefaultShape = function () {            return new IsogonShape();        };        Isogon.prototype.buildPath = function (ctx, shape) {            var n = shape.n;            if (!n || n < 2) {                return;            }            var x = shape.x;            var y = shape.y;            var r = shape.r;            var dStep = 2 * PI$3 / n;            var deg = -PI$3 / 2;            ctx.moveTo(x + r * cos(deg), y + r * sin(deg));            for (var i = 0, end = n - 1; i < end; i++) {                deg += dStep;                ctx.lineTo(x + r * cos(deg), y + r * sin(deg));            }            ctx.closePath();            return;        };        return Isogon;    }(Path));    Isogon.prototype.type = 'isogon';    var RingShape = (function () {        function RingShape() {            this.cx = 0;            this.cy = 0;            this.r = 0;            this.r0 = 0;        }        return RingShape;    }());    var Ring = (function (_super) {        __extends(Ring, _super);        function Ring(opts) {            return _super.call(this, opts) || this;        }        Ring.prototype.getDefaultShape = function () {            return new RingShape();        };        Ring.prototype.buildPath = function (ctx, shape) {            var x = shape.cx;            var y = shape.cy;            var PI2 = Math.PI * 2;            ctx.moveTo(x + shape.r, y);            ctx.arc(x, y, shape.r, 0, PI2, false);            ctx.moveTo(x + shape.r0, y);            ctx.arc(x, y, shape.r0, 0, PI2, true);        };        return Ring;    }(Path));    Ring.prototype.type = 'ring';    var sin$1 = Math.sin;    var cos$1 = Math.cos;    var radian = Math.PI / 180;    var RoseShape = (function () {        function RoseShape() {            this.cx = 0;            this.cy = 0;            this.r = [];            this.k = 0;            this.n = 1;        }        return RoseShape;    }());    var Rose = (function (_super) {        __extends(Rose, _super);        function Rose(opts) {            return _super.call(this, opts) || this;        }        Rose.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        Rose.prototype.getDefaultShape = function () {            return new RoseShape();        };        Rose.prototype.buildPath = function (ctx, shape) {            var R = shape.r;            var k = shape.k;            var n = shape.n;            var x0 = shape.cx;            var y0 = shape.cy;            var x;            var y;            var r;            ctx.moveTo(x0, y0);            for (var i = 0, len = R.length; i < len; i++) {                r = R[i];                for (var j = 0; j <= 360 * n; j++) {                    x = r                        * sin$1(k / n * j % 360 * radian)                        * cos$1(j * radian)                        + x0;                    y = r                        * sin$1(k / n * j % 360 * radian)                        * sin$1(j * radian)                        + y0;                    ctx.lineTo(x, y);                }            }        };        return Rose;    }(Path));    Rose.prototype.type = 'rose';    var PI$4 = Math.PI;    var cos$2 = Math.cos;    var sin$2 = Math.sin;    var StarShape = (function () {        function StarShape() {            this.cx = 0;            this.cy = 0;            this.n = 3;            this.r = 0;        }        return StarShape;    }());    var Star = (function (_super) {        __extends(Star, _super);        function Star(opts) {            return _super.call(this, opts) || this;        }        Star.prototype.getDefaultShape = function () {            return new StarShape();        };        Star.prototype.buildPath = function (ctx, shape) {            var n = shape.n;            if (!n || n < 2) {                return;            }            var x = shape.cx;            var y = shape.cy;            var r = shape.r;            var r0 = shape.r0;            if (r0 == null) {                r0 = n > 4                    ? r * cos$2(2 * PI$4 / n) / cos$2(PI$4 / n)                    : r / 3;            }            var dStep = PI$4 / n;            var deg = -PI$4 / 2;            var xStart = x + r * cos$2(deg);            var yStart = y + r * sin$2(deg);            deg += dStep;            ctx.moveTo(xStart, yStart);            for (var i = 0, end = n * 2 - 1, ri = void 0; i < end; i++) {                ri = i % 2 === 0 ? r0 : r;                ctx.lineTo(x + ri * cos$2(deg), y + ri * sin$2(deg));                deg += dStep;            }            ctx.closePath();        };        return Star;    }(Path));    Star.prototype.type = 'star';    var cos$3 = Math.cos;    var sin$3 = Math.sin;    var TrochoidShape = (function () {        function TrochoidShape() {            this.cx = 0;            this.cy = 0;            this.r = 0;            this.r0 = 0;            this.d = 0;            this.location = 'out';        }        return TrochoidShape;    }());    var Trochoid = (function (_super) {        __extends(Trochoid, _super);        function Trochoid(opts) {            return _super.call(this, opts) || this;        }        Trochoid.prototype.getDefaultStyle = function () {            return {                stroke: '#000',                fill: null            };        };        Trochoid.prototype.getDefaultShape = function () {            return new TrochoidShape();        };        Trochoid.prototype.buildPath = function (ctx, shape) {            var R = shape.r;            var r = shape.r0;            var d = shape.d;            var offsetX = shape.cx;            var offsetY = shape.cy;            var delta = shape.location === 'out' ? 1 : -1;            var x1;            var y1;            var x2;            var y2;            if (shape.location && R <= r) {                return;            }            var num = 0;            var i = 1;            var theta;            x1 = (R + delta * r) * cos$3(0)                - delta * d * cos$3(0) + offsetX;            y1 = (R + delta * r) * sin$3(0)                - d * sin$3(0) + offsetY;            ctx.moveTo(x1, y1);            do {                num++;            } while ((r * num) % (R + delta * r) !== 0);            do {                theta = Math.PI / 180 * i;                x2 = (R + delta * r) * cos$3(theta)                    - delta * d * cos$3((R / r + delta) * theta)                    + offsetX;                y2 = (R + delta * r) * sin$3(theta)                    - d * sin$3((R / r + delta) * theta)                    + offsetY;                ctx.lineTo(x2, y2);                i++;            } while (i <= (r * num) / (R + delta * r) * 360);        };        return Trochoid;    }(Path));    Trochoid.prototype.type = 'trochoid';    var Pattern = (function () {        function Pattern(image, repeat) {            this.image = image;            this.repeat = repeat;            this.x = 0;            this.y = 0;            this.rotation = 0;            this.scaleX = 1;            this.scaleY = 1;        }        return Pattern;    }());    var extent = [0, 0];    var extent2 = [0, 0];    var minTv$1 = new Point();    var maxTv$1 = new Point();    var OrientedBoundingRect = (function () {        function OrientedBoundingRect(rect, transform) {            this._corners = [];            this._axes = [];            this._origin = [0, 0];            for (var i = 0; i < 4; i++) {                this._corners[i] = new Point();            }            for (var i = 0; i < 2; i++) {                this._axes[i] = new Point();            }            if (rect) {                this.fromBoundingRect(rect, transform);            }        }        OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) {            var corners = this._corners;            var axes = this._axes;            var x = rect.x;            var y = rect.y;            var x2 = x + rect.width;            var y2 = y + rect.height;            corners[0].set(x, y);            corners[1].set(x2, y);            corners[2].set(x2, y2);            corners[3].set(x, y2);            if (transform) {                for (var i = 0; i < 4; i++) {                    corners[i].transform(transform);                }            }            Point.sub(axes[0], corners[1], corners[0]);            Point.sub(axes[1], corners[3], corners[0]);            axes[0].normalize();            axes[1].normalize();            for (var i = 0; i < 2; i++) {                this._origin[i] = axes[i].dot(corners[0]);            }        };        OrientedBoundingRect.prototype.intersect = function (other, mtv) {            var overlapped = true;            var noMtv = !mtv;            minTv$1.set(Infinity, Infinity);            maxTv$1.set(0, 0);            if (!this._intersectCheckOneSide(this, other, minTv$1, maxTv$1, noMtv, 1)) {                overlapped = false;                if (noMtv) {                    return overlapped;                }            }            if (!this._intersectCheckOneSide(other, this, minTv$1, maxTv$1, noMtv, -1)) {                overlapped = false;                if (noMtv) {                    return overlapped;                }            }            if (!noMtv) {                Point.copy(mtv, overlapped ? minTv$1 : maxTv$1);            }            return overlapped;        };        OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) {            var overlapped = true;            for (var i = 0; i < 2; i++) {                var axis = this._axes[i];                this._getProjMinMaxOnAxis(i, self._corners, extent);                this._getProjMinMaxOnAxis(i, other._corners, extent2);                if (extent[1] < extent2[0] || extent[0] > extent2[1]) {                    overlapped = false;                    if (noMtv) {                        return overlapped;                    }                    var dist0 = Math.abs(extent2[0] - extent[1]);                    var dist1 = Math.abs(extent[0] - extent2[1]);                    if (Math.min(dist0, dist1) > maxTv.len()) {                        if (dist0 < dist1) {                            Point.scale(maxTv, axis, -dist0 * inverse);                        }                        else {                            Point.scale(maxTv, axis, dist1 * inverse);                        }                    }                }                else if (minTv) {                    var dist0 = Math.abs(extent2[0] - extent[1]);                    var dist1 = Math.abs(extent[0] - extent2[1]);                    if (Math.min(dist0, dist1) < minTv.len()) {                        if (dist0 < dist1) {                            Point.scale(minTv, axis, dist0 * inverse);                        }                        else {                            Point.scale(minTv, axis, -dist1 * inverse);                        }                    }                }            }            return overlapped;        };        OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) {            var axis = this._axes[dim];            var origin = this._origin;            var proj = corners[0].dot(axis) + origin[dim];            var min = proj;            var max = proj;            for (var i = 1; i < corners.length; i++) {                var proj_1 = corners[i].dot(axis) + origin[dim];                min = Math.min(proj_1, min);                max = Math.max(proj_1, max);            }            out[0] = min;            out[1] = max;        };        return OrientedBoundingRect;    }());    var DebugRect = (function () {        function DebugRect(style) {            var dom = this.dom = document.createElement('div');            dom.className = 'ec-debug-dirty-rect';            style = extend({}, style);            extend(style, {                backgroundColor: 'rgba(0, 0, 255, 0.2)',                border: '1px solid #00f'            });            dom.style.cssText = "\nposition: absolute;\nopacity: 0;\ntransition: opacity 0.5s linear;\npointer-events: none;\n";            for (var key in style) {                if (style.hasOwnProperty(key)) {                    dom.style[key] = style[key];                }            }        }        DebugRect.prototype.update = function (rect) {            var domStyle = this.dom.style;            domStyle.width = rect.width + 'px';            domStyle.height = rect.height + 'px';            domStyle.left = rect.x + 'px';            domStyle.top = rect.y + 'px';        };        DebugRect.prototype.hide = function () {            this.dom.style.opacity = '0';        };        DebugRect.prototype.show = function (autoHideDelay) {            var _this = this;            clearTimeout(this._hideTimeout);            this.dom.style.opacity = '1';            this._hideTimeout = setTimeout(function () {                _this.hide();            }, autoHideDelay || 1000);        };        return DebugRect;    }());    function showDebugDirtyRect(zr, opts) {        opts = opts || {};        var painter = zr.painter;        if (!painter.getLayers) {            throw new Error('Debug dirty rect can only been used on canvas renderer.');        }        if (painter.isSingleCanvas()) {            throw new Error('Debug dirty rect can only been used on zrender inited with container.');        }        var debugViewRoot = document.createElement('div');        debugViewRoot.style.cssText = "\nposition:absolute;\nleft:0;\ntop:0;\nright:0;\nbottom:0;\npointer-events:none;\n";        debugViewRoot.className = 'ec-debug-dirty-rect-container';        var debugRects = [];        var dom = zr.dom;        dom.appendChild(debugViewRoot);        var computedStyle = getComputedStyle(dom);        if (computedStyle.position === 'static') {            dom.style.position = 'relative';        }        zr.on('rendered', function () {            if (painter.getLayers) {                var idx_1 = 0;                painter.eachBuiltinLayer(function (layer) {                    if (!layer.debugGetPaintRects) {                        return;                    }                    var paintRects = layer.debugGetPaintRects();                    for (var i = 0; i < paintRects.length; i++) {                        if (!paintRects[i].width || !paintRects[i].height) {                            continue;                        }                        if (!debugRects[idx_1]) {                            debugRects[idx_1] = new DebugRect(opts.style);                            debugViewRoot.appendChild(debugRects[idx_1].dom);                        }                        debugRects[idx_1].show(opts.autoHideDelay);                        debugRects[idx_1].update(paintRects[i]);                        idx_1++;                    }                });                for (var i = idx_1; i < debugRects.length; i++) {                    debugRects[i].hide();                }            }        });    }    function isSafeNum(num) {        return isFinite(num);    }    function createLinearGradient(ctx, obj, rect) {        var x = obj.x == null ? 0 : obj.x;        var x2 = obj.x2 == null ? 1 : obj.x2;        var y = obj.y == null ? 0 : obj.y;        var y2 = obj.y2 == null ? 0 : obj.y2;        if (!obj.global) {            x = x * rect.width + rect.x;            x2 = x2 * rect.width + rect.x;            y = y * rect.height + rect.y;            y2 = y2 * rect.height + rect.y;        }        x = isSafeNum(x) ? x : 0;        x2 = isSafeNum(x2) ? x2 : 1;        y = isSafeNum(y) ? y : 0;        y2 = isSafeNum(y2) ? y2 : 0;        var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);        return canvasGradient;    }    function createRadialGradient(ctx, obj, rect) {        var width = rect.width;        var height = rect.height;        var min = Math.min(width, height);        var x = obj.x == null ? 0.5 : obj.x;        var y = obj.y == null ? 0.5 : obj.y;        var r = obj.r == null ? 0.5 : obj.r;        if (!obj.global) {            x = x * width + rect.x;            y = y * height + rect.y;            r = r * min;        }        x = isSafeNum(x) ? x : 0.5;        y = isSafeNum(y) ? y : 0.5;        r = r >= 0 && isSafeNum(r) ? r : 0.5;        var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);        return canvasGradient;    }    function getCanvasGradient(ctx, obj, rect) {        var canvasGradient = obj.type === 'radial'            ? createRadialGradient(ctx, obj, rect)            : createLinearGradient(ctx, obj, rect);        var colorStops = obj.colorStops;        for (var i = 0; i < colorStops.length; i++) {            canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color);        }        return canvasGradient;    }    function isClipPathChanged(clipPaths, prevClipPaths) {        if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) {            return false;        }        if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) {            return true;        }        for (var i = 0; i < clipPaths.length; i++) {            if (clipPaths[i] !== prevClipPaths[i]) {                return true;            }        }        return false;    }    function parseInt10(val) {        return parseInt(val, 10);    }    function getSize(root, whIdx, opts) {        var wh = ['width', 'height'][whIdx];        var cwh = ['clientWidth', 'clientHeight'][whIdx];        var plt = ['paddingLeft', 'paddingTop'][whIdx];        var prb = ['paddingRight', 'paddingBottom'][whIdx];        if (opts[wh] != null && opts[wh] !== 'auto') {            return parseFloat(opts[wh]);        }        var stl = document.defaultView.getComputedStyle(root);        return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh]))            - (parseInt10(stl[plt]) || 0)            - (parseInt10(stl[prb]) || 0)) | 0;    }    function normalizeLineDash(lineType, lineWidth) {        if (!lineType || lineType === 'solid' || !(lineWidth > 0)) {            return null;        }        return lineType === 'dashed'            ? [4 * lineWidth, 2 * lineWidth]            : lineType === 'dotted'                ? [lineWidth]                : isNumber(lineType)                    ? [lineType] : isArray(lineType) ? lineType : null;    }    function getLineDash(el) {        var style = el.style;        var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth);        var lineDashOffset = style.lineDashOffset;        if (lineDash) {            var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1;            if (lineScale_1 && lineScale_1 !== 1) {                lineDash = map(lineDash, function (rawVal) {                    return rawVal / lineScale_1;                });                lineDashOffset /= lineScale_1;            }        }        return [lineDash, lineDashOffset];    }    var pathProxyForDraw = new PathProxy(true);    function styleHasStroke(style) {        var stroke = style.stroke;        return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));    }    function isValidStrokeFillStyle(strokeOrFill) {        return typeof strokeOrFill === 'string' && strokeOrFill !== 'none';    }    function styleHasFill(style) {        var fill = style.fill;        return fill != null && fill !== 'none';    }    function doFillPath(ctx, style) {        if (style.fillOpacity != null && style.fillOpacity !== 1) {            var originalGlobalAlpha = ctx.globalAlpha;            ctx.globalAlpha = style.fillOpacity * style.opacity;            ctx.fill();            ctx.globalAlpha = originalGlobalAlpha;        }        else {            ctx.fill();        }    }    function doStrokePath(ctx, style) {        if (style.strokeOpacity != null && style.strokeOpacity !== 1) {            var originalGlobalAlpha = ctx.globalAlpha;            ctx.globalAlpha = style.strokeOpacity * style.opacity;            ctx.stroke();            ctx.globalAlpha = originalGlobalAlpha;        }        else {            ctx.stroke();        }    }    function createCanvasPattern(ctx, pattern, el) {        var image = createOrUpdateImage(pattern.image, pattern.__image, el);        if (isImageReady(image)) {            var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat');            if (typeof DOMMatrix === 'function'                && canvasPattern                && canvasPattern.setTransform) {                var matrix = new DOMMatrix();                matrix.translateSelf((pattern.x || 0), (pattern.y || 0));                matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE);                matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1));                canvasPattern.setTransform(matrix);            }            return canvasPattern;        }    }    function brushPath(ctx, el, style, inBatch) {        var _a;        var hasStroke = styleHasStroke(style);        var hasFill = styleHasFill(style);        var strokePercent = style.strokePercent;        var strokePart = strokePercent < 1;        var firstDraw = !el.path;        if ((!el.silent || strokePart) && firstDraw) {            el.createPathProxy();        }        var path = el.path || pathProxyForDraw;        var dirtyFlag = el.__dirty;        if (!inBatch) {            var fill = style.fill;            var stroke = style.stroke;            var hasFillGradient = hasFill && !!fill.colorStops;            var hasStrokeGradient = hasStroke && !!stroke.colorStops;            var hasFillPattern = hasFill && !!fill.image;            var hasStrokePattern = hasStroke && !!stroke.image;            var fillGradient = void 0;            var strokeGradient = void 0;            var fillPattern = void 0;            var strokePattern = void 0;            var rect = void 0;            if (hasFillGradient || hasStrokeGradient) {                rect = el.getBoundingRect();            }            if (hasFillGradient) {                fillGradient = dirtyFlag                    ? getCanvasGradient(ctx, fill, rect)                    : el.__canvasFillGradient;                el.__canvasFillGradient = fillGradient;            }            if (hasStrokeGradient) {                strokeGradient = dirtyFlag                    ? getCanvasGradient(ctx, stroke, rect)                    : el.__canvasStrokeGradient;                el.__canvasStrokeGradient = strokeGradient;            }            if (hasFillPattern) {                fillPattern = (dirtyFlag || !el.__canvasFillPattern)                    ? createCanvasPattern(ctx, fill, el)                    : el.__canvasFillPattern;                el.__canvasFillPattern = fillPattern;            }            if (hasStrokePattern) {                strokePattern = (dirtyFlag || !el.__canvasStrokePattern)                    ? createCanvasPattern(ctx, stroke, el)                    : el.__canvasStrokePattern;                el.__canvasStrokePattern = fillPattern;            }            if (hasFillGradient) {                ctx.fillStyle = fillGradient;            }            else if (hasFillPattern) {                if (fillPattern) {                    ctx.fillStyle = fillPattern;                }                else {                    hasFill = false;                }            }            if (hasStrokeGradient) {                ctx.strokeStyle = strokeGradient;            }            else if (hasStrokePattern) {                if (strokePattern) {                    ctx.strokeStyle = strokePattern;                }                else {                    hasStroke = false;                }            }        }        var scale = el.getGlobalScale();        path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold);        var lineDash;        var lineDashOffset;        if (ctx.setLineDash && style.lineDash) {            _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];        }        var needsRebuild = true;        if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) {            path.setDPR(ctx.dpr);            if (strokePart) {                path.setContext(null);            }            else {                path.setContext(ctx);                needsRebuild = false;            }            path.reset();            el.buildPath(path, el.shape, inBatch);            path.toStatic();            el.pathUpdated();        }        if (needsRebuild) {            path.rebuildPath(ctx, strokePart ? strokePercent : 1);        }        if (lineDash) {            ctx.setLineDash(lineDash);            ctx.lineDashOffset = lineDashOffset;        }        if (!inBatch) {            if (style.strokeFirst) {                if (hasStroke) {                    doStrokePath(ctx, style);                }                if (hasFill) {                    doFillPath(ctx, style);                }            }            else {                if (hasFill) {                    doFillPath(ctx, style);                }                if (hasStroke) {                    doStrokePath(ctx, style);                }            }        }        if (lineDash) {            ctx.setLineDash([]);        }    }    function brushImage(ctx, el, style) {        var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload);        if (!image || !isImageReady(image)) {            return;        }        var x = style.x || 0;        var y = style.y || 0;        var width = el.getWidth();        var height = el.getHeight();        var aspect = image.width / image.height;        if (width == null && height != null) {            width = height * aspect;        }        else if (height == null && width != null) {            height = width / aspect;        }        else if (width == null && height == null) {            width = image.width;            height = image.height;        }        if (style.sWidth && style.sHeight) {            var sx = style.sx || 0;            var sy = style.sy || 0;            ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height);        }        else if (style.sx && style.sy) {            var sx = style.sx;            var sy = style.sy;            var sWidth = width - sx;            var sHeight = height - sy;            ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height);        }        else {            ctx.drawImage(image, x, y, width, height);        }    }    function brushText(ctx, el, style) {        var _a;        var text = style.text;        text != null && (text += '');        if (text) {            ctx.font = style.font || DEFAULT_FONT;            ctx.textAlign = style.textAlign;            ctx.textBaseline = style.textBaseline;            var lineDash = void 0;            var lineDashOffset = void 0;            if (ctx.setLineDash && style.lineDash) {                _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];            }            if (lineDash) {                ctx.setLineDash(lineDash);                ctx.lineDashOffset = lineDashOffset;            }            if (style.strokeFirst) {                if (styleHasStroke(style)) {                    ctx.strokeText(text, style.x, style.y);                }                if (styleHasFill(style)) {                    ctx.fillText(text, style.x, style.y);                }            }            else {                if (styleHasFill(style)) {                    ctx.fillText(text, style.x, style.y);                }                if (styleHasStroke(style)) {                    ctx.strokeText(text, style.x, style.y);                }            }            if (lineDash) {                ctx.setLineDash([]);            }        }    }    var SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];    var STROKE_PROPS = [        ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]    ];    function bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) {        var styleChanged = false;        if (!forceSetAll) {            prevStyle = prevStyle || {};            if (style === prevStyle) {                return false;            }        }        if (forceSetAll || style.opacity !== prevStyle.opacity) {            flushPathDrawn(ctx, scope);            styleChanged = true;            var opacity = Math.max(Math.min(style.opacity, 1), 0);            ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity;        }        if (forceSetAll || style.blend !== prevStyle.blend) {            if (!styleChanged) {                flushPathDrawn(ctx, scope);                styleChanged = true;            }            ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend;        }        for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) {            var propName = SHADOW_NUMBER_PROPS[i];            if (forceSetAll || style[propName] !== prevStyle[propName]) {                if (!styleChanged) {                    flushPathDrawn(ctx, scope);                    styleChanged = true;                }                ctx[propName] = ctx.dpr * (style[propName] || 0);            }        }        if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) {            if (!styleChanged) {                flushPathDrawn(ctx, scope);                styleChanged = true;            }            ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor;        }        return styleChanged;    }    function bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) {        var style = getStyle(el, scope.inHover);        var prevStyle = forceSetAll            ? null            : (prevEl && getStyle(prevEl, scope.inHover) || {});        if (style === prevStyle) {            return false;        }        var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope);        if (forceSetAll || style.fill !== prevStyle.fill) {            if (!styleChanged) {                flushPathDrawn(ctx, scope);                styleChanged = true;            }            isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill);        }        if (forceSetAll || style.stroke !== prevStyle.stroke) {            if (!styleChanged) {                flushPathDrawn(ctx, scope);                styleChanged = true;            }            isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke);        }        if (forceSetAll || style.opacity !== prevStyle.opacity) {            if (!styleChanged) {                flushPathDrawn(ctx, scope);                styleChanged = true;            }            ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;        }        if (el.hasStroke()) {            var lineWidth = style.lineWidth;            var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1);            if (ctx.lineWidth !== newLineWidth) {                if (!styleChanged) {                    flushPathDrawn(ctx, scope);                    styleChanged = true;                }                ctx.lineWidth = newLineWidth;            }        }        for (var i = 0; i < STROKE_PROPS.length; i++) {            var prop = STROKE_PROPS[i];            var propName = prop[0];            if (forceSetAll || style[propName] !== prevStyle[propName]) {                if (!styleChanged) {                    flushPathDrawn(ctx, scope);                    styleChanged = true;                }                ctx[propName] = style[propName] || prop[1];            }        }        return styleChanged;    }    function bindImageStyle(ctx, el, prevEl, forceSetAll, scope) {        return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope);    }    function setContextTransform(ctx, el) {        var m = el.transform;        var dpr = ctx.dpr || 1;        if (m) {            ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);        }        else {            ctx.setTransform(dpr, 0, 0, dpr, 0, 0);        }    }    function updateClipStatus(clipPaths, ctx, scope) {        var allClipped = false;        for (var i = 0; i < clipPaths.length; i++) {            var clipPath = clipPaths[i];            allClipped = allClipped || clipPath.isZeroArea();            setContextTransform(ctx, clipPath);            ctx.beginPath();            clipPath.buildPath(ctx, clipPath.shape);            ctx.clip();        }        scope.allClipped = allClipped;    }    function isTransformChanged(m0, m1) {        if (m0 && m1) {            return m0[0] !== m1[0]                || m0[1] !== m1[1]                || m0[2] !== m1[2]                || m0[3] !== m1[3]                || m0[4] !== m1[4]                || m0[5] !== m1[5];        }        else if (!m0 && !m1) {            return false;        }        return true;    }    var DRAW_TYPE_PATH = 1;    var DRAW_TYPE_IMAGE = 2;    var DRAW_TYPE_TEXT = 3;    var DRAW_TYPE_INCREMENTAL = 4;    function canPathBatch(style) {        var hasFill = styleHasFill(style);        var hasStroke = styleHasStroke(style);        return !(style.lineDash            || !(+hasFill ^ +hasStroke)            || (hasFill && typeof style.fill !== 'string')            || (hasStroke && typeof style.stroke !== 'string')            || style.strokePercent < 1            || style.strokeOpacity < 1            || style.fillOpacity < 1);    }    function flushPathDrawn(ctx, scope) {        scope.batchFill && ctx.fill();        scope.batchStroke && ctx.stroke();        scope.batchFill = '';        scope.batchStroke = '';    }    function getStyle(el, inHover) {        return inHover ? (el.__hoverStyle || el.style) : el.style;    }    function brushSingle(ctx, el) {        brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true);    }    function brush(ctx, el, scope, isLast) {        var m = el.transform;        if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) {            el.__dirty &= ~REDRAW_BIT;            el.__isRendered = false;            return;        }        var clipPaths = el.__clipPaths;        var prevElClipPaths = scope.prevElClipPaths;        var forceSetTransform = false;        var forceSetStyle = false;        if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) {            if (prevElClipPaths && prevElClipPaths.length) {                flushPathDrawn(ctx, scope);                ctx.restore();                forceSetStyle = forceSetTransform = true;                scope.prevElClipPaths = null;                scope.allClipped = false;                scope.prevEl = null;            }            if (clipPaths && clipPaths.length) {                flushPathDrawn(ctx, scope);                ctx.save();                updateClipStatus(clipPaths, ctx, scope);                forceSetTransform = true;            }            scope.prevElClipPaths = clipPaths;        }        if (scope.allClipped) {            el.__isRendered = false;            return;        }        el.beforeBrush && el.beforeBrush();        el.innerBeforeBrush();        var prevEl = scope.prevEl;        if (!prevEl) {            forceSetStyle = forceSetTransform = true;        }        var canBatchPath = el instanceof Path            && el.autoBatch            && canPathBatch(el.style);        if (forceSetTransform || isTransformChanged(m, prevEl.transform)) {            flushPathDrawn(ctx, scope);            setContextTransform(ctx, el);        }        else if (!canBatchPath) {            flushPathDrawn(ctx, scope);        }        var style = getStyle(el, scope.inHover);        if (el instanceof Path) {            if (scope.lastDrawType !== DRAW_TYPE_PATH) {                forceSetStyle = true;                scope.lastDrawType = DRAW_TYPE_PATH;            }            bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);            if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) {                ctx.beginPath();            }            brushPath(ctx, el, style, canBatchPath);            if (canBatchPath) {                scope.batchFill = style.fill || '';                scope.batchStroke = style.stroke || '';            }        }        else {            if (el instanceof TSpan) {                if (scope.lastDrawType !== DRAW_TYPE_TEXT) {                    forceSetStyle = true;                    scope.lastDrawType = DRAW_TYPE_TEXT;                }                bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);                brushText(ctx, el, style);            }            else if (el instanceof ZRImage) {                if (scope.lastDrawType !== DRAW_TYPE_IMAGE) {                    forceSetStyle = true;                    scope.lastDrawType = DRAW_TYPE_IMAGE;                }                bindImageStyle(ctx, el, prevEl, forceSetStyle, scope);                brushImage(ctx, el, style);            }            else if (el.getTemporalDisplayables) {                if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) {                    forceSetStyle = true;                    scope.lastDrawType = DRAW_TYPE_INCREMENTAL;                }                brushIncremental(ctx, el, scope);            }        }        if (canBatchPath && isLast) {            flushPathDrawn(ctx, scope);        }        el.innerAfterBrush();        el.afterBrush && el.afterBrush();        scope.prevEl = el;        el.__dirty = 0;        el.__isRendered = true;    }    function brushIncremental(ctx, el, scope) {        var displayables = el.getDisplayables();        var temporalDisplayables = el.getTemporalDisplayables();        ctx.save();        var innerScope = {            prevElClipPaths: null,            prevEl: null,            allClipped: false,            viewWidth: scope.viewWidth,            viewHeight: scope.viewHeight,            inHover: scope.inHover        };        var i;        var len;        for (i = el.getCursor(), len = displayables.length; i < len; i++) {            var displayable = displayables[i];            displayable.beforeBrush && displayable.beforeBrush();            displayable.innerBeforeBrush();            brush(ctx, displayable, innerScope, i === len - 1);            displayable.innerAfterBrush();            displayable.afterBrush && displayable.afterBrush();            innerScope.prevEl = displayable;        }        for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) {            var displayable = temporalDisplayables[i_1];            displayable.beforeBrush && displayable.beforeBrush();            displayable.innerBeforeBrush();            brush(ctx, displayable, innerScope, i_1 === len_1 - 1);            displayable.innerAfterBrush();            displayable.afterBrush && displayable.afterBrush();            innerScope.prevEl = displayable;        }        el.clearTemporalDisplayables();        el.notClear = true;        ctx.restore();    }    function createDom(id, painter, dpr) {        var newDom = platformApi.createCanvas();        var width = painter.getWidth();        var height = painter.getHeight();        var newDomStyle = newDom.style;        if (newDomStyle) {            newDomStyle.position = 'absolute';            newDomStyle.left = '0';            newDomStyle.top = '0';            newDomStyle.width = width + 'px';            newDomStyle.height = height + 'px';            newDom.setAttribute('data-zr-dom-id', id);        }        newDom.width = width * dpr;        newDom.height = height * dpr;        return newDom;    }    var Layer = (function (_super) {        __extends(Layer, _super);        function Layer(id, painter, dpr) {            var _this = _super.call(this) || this;            _this.motionBlur = false;            _this.lastFrameAlpha = 0.7;            _this.dpr = 1;            _this.virtual = false;            _this.config = {};            _this.incremental = false;            _this.zlevel = 0;            _this.maxRepaintRectCount = 5;            _this.__dirty = true;            _this.__firstTimePaint = true;            _this.__used = false;            _this.__drawIndex = 0;            _this.__startIndex = 0;            _this.__endIndex = 0;            _this.__prevStartIndex = null;            _this.__prevEndIndex = null;            var dom;            dpr = dpr || devicePixelRatio;            if (typeof id === 'string') {                dom = createDom(id, painter, dpr);            }            else if (isObject(id)) {                dom = id;                id = dom.id;            }            _this.id = id;            _this.dom = dom;            var domStyle = dom.style;            if (domStyle) {                disableUserSelect(dom);                dom.onselectstart = function () { return false; };                domStyle.padding = '0';                domStyle.margin = '0';                domStyle.borderWidth = '0';            }            _this.painter = painter;            _this.dpr = dpr;            return _this;        }        Layer.prototype.getElementCount = function () {            return this.__endIndex - this.__startIndex;        };        Layer.prototype.afterBrush = function () {            this.__prevStartIndex = this.__startIndex;            this.__prevEndIndex = this.__endIndex;        };        Layer.prototype.initContext = function () {            this.ctx = this.dom.getContext('2d');            this.ctx.dpr = this.dpr;        };        Layer.prototype.setUnpainted = function () {            this.__firstTimePaint = true;        };        Layer.prototype.createBackBuffer = function () {            var dpr = this.dpr;            this.domBack = createDom('back-' + this.id, this.painter, dpr);            this.ctxBack = this.domBack.getContext('2d');            if (dpr !== 1) {                this.ctxBack.scale(dpr, dpr);            }        };        Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) {            if (this.__firstTimePaint) {                this.__firstTimePaint = false;                return null;            }            var mergedRepaintRects = [];            var maxRepaintRectCount = this.maxRepaintRectCount;            var full = false;            var pendingRect = new BoundingRect(0, 0, 0, 0);            function addRectToMergePool(rect) {                if (!rect.isFinite() || rect.isZero()) {                    return;                }                if (mergedRepaintRects.length === 0) {                    var boundingRect = new BoundingRect(0, 0, 0, 0);                    boundingRect.copy(rect);                    mergedRepaintRects.push(boundingRect);                }                else {                    var isMerged = false;                    var minDeltaArea = Infinity;                    var bestRectToMergeIdx = 0;                    for (var i = 0; i < mergedRepaintRects.length; ++i) {                        var mergedRect = mergedRepaintRects[i];                        if (mergedRect.intersect(rect)) {                            var pendingRect_1 = new BoundingRect(0, 0, 0, 0);                            pendingRect_1.copy(mergedRect);                            pendingRect_1.union(rect);                            mergedRepaintRects[i] = pendingRect_1;                            isMerged = true;                            break;                        }                        else if (full) {                            pendingRect.copy(rect);                            pendingRect.union(mergedRect);                            var aArea = rect.width * rect.height;                            var bArea = mergedRect.width * mergedRect.height;                            var pendingArea = pendingRect.width * pendingRect.height;                            var deltaArea = pendingArea - aArea - bArea;                            if (deltaArea < minDeltaArea) {                                minDeltaArea = deltaArea;                                bestRectToMergeIdx = i;                            }                        }                    }                    if (full) {                        mergedRepaintRects[bestRectToMergeIdx].union(rect);                        isMerged = true;                    }                    if (!isMerged) {                        var boundingRect = new BoundingRect(0, 0, 0, 0);                        boundingRect.copy(rect);                        mergedRepaintRects.push(boundingRect);                    }                    if (!full) {                        full = mergedRepaintRects.length >= maxRepaintRectCount;                    }                }            }            for (var i = this.__startIndex; i < this.__endIndex; ++i) {                var el = displayList[i];                if (el) {                    var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true);                    var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint)                        ? el.getPrevPaintRect()                        : null;                    if (prevRect) {                        addRectToMergePool(prevRect);                    }                    var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered)                        ? el.getPaintRect()                        : null;                    if (curRect) {                        addRectToMergePool(curRect);                    }                }            }            for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) {                var el = prevList[i];                var shouldPaint = el && el.shouldBePainted(viewWidth, viewHeight, true, true);                if (el && (!shouldPaint || !el.__zr) && el.__isRendered) {                    var prevRect = el.getPrevPaintRect();                    if (prevRect) {                        addRectToMergePool(prevRect);                    }                }            }            var hasIntersections;            do {                hasIntersections = false;                for (var i = 0; i < mergedRepaintRects.length;) {                    if (mergedRepaintRects[i].isZero()) {                        mergedRepaintRects.splice(i, 1);                        continue;                    }                    for (var j = i + 1; j < mergedRepaintRects.length;) {                        if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) {                            hasIntersections = true;                            mergedRepaintRects[i].union(mergedRepaintRects[j]);                            mergedRepaintRects.splice(j, 1);                        }                        else {                            j++;                        }                    }                    i++;                }            } while (hasIntersections);            this._paintRects = mergedRepaintRects;            return mergedRepaintRects;        };        Layer.prototype.debugGetPaintRects = function () {            return (this._paintRects || []).slice();        };        Layer.prototype.resize = function (width, height) {            var dpr = this.dpr;            var dom = this.dom;            var domStyle = dom.style;            var domBack = this.domBack;            if (domStyle) {                domStyle.width = width + 'px';                domStyle.height = height + 'px';            }            dom.width = width * dpr;            dom.height = height * dpr;            if (domBack) {                domBack.width = width * dpr;                domBack.height = height * dpr;                if (dpr !== 1) {                    this.ctxBack.scale(dpr, dpr);                }            }        };        Layer.prototype.clear = function (clearAll, clearColor, repaintRects) {            var dom = this.dom;            var ctx = this.ctx;            var width = dom.width;            var height = dom.height;            clearColor = clearColor || this.clearColor;            var haveMotionBLur = this.motionBlur && !clearAll;            var lastFrameAlpha = this.lastFrameAlpha;            var dpr = this.dpr;            var self = this;            if (haveMotionBLur) {                if (!this.domBack) {                    this.createBackBuffer();                }                this.ctxBack.globalCompositeOperation = 'copy';                this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr);            }            var domBack = this.domBack;            function doClear(x, y, width, height) {                ctx.clearRect(x, y, width, height);                if (clearColor && clearColor !== 'transparent') {                    var clearColorGradientOrPattern = void 0;                    if (isGradientObject(clearColor)) {                        var shouldCache = clearColor.global || (clearColor.__width === width                            && clearColor.__height === height);                        clearColorGradientOrPattern = shouldCache                            && clearColor.__canvasGradient                            || getCanvasGradient(ctx, clearColor, {                                x: 0,                                y: 0,                                width: width,                                height: height                            });                        clearColor.__canvasGradient = clearColorGradientOrPattern;                        clearColor.__width = width;                        clearColor.__height = height;                    }                    else if (isImagePatternObject(clearColor)) {                        clearColor.scaleX = clearColor.scaleX || dpr;                        clearColor.scaleY = clearColor.scaleY || dpr;                        clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, {                            dirty: function () {                                self.setUnpainted();                                self.painter.refresh();                            }                        });                    }                    ctx.save();                    ctx.fillStyle = clearColorGradientOrPattern || clearColor;                    ctx.fillRect(x, y, width, height);                    ctx.restore();                }                if (haveMotionBLur) {                    ctx.save();                    ctx.globalAlpha = lastFrameAlpha;                    ctx.drawImage(domBack, x, y, width, height);                    ctx.restore();                }            }            if (!repaintRects || haveMotionBLur) {                doClear(0, 0, width, height);            }            else if (repaintRects.length) {                each(repaintRects, function (rect) {                    doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);                });            }        };        return Layer;    }(Eventful));    var HOVER_LAYER_ZLEVEL = 1e5;    var CANVAS_ZLEVEL = 314159;    var EL_AFTER_INCREMENTAL_INC = 0.01;    var INCREMENTAL_INC = 0.001;    function isLayerValid(layer) {        if (!layer) {            return false;        }        if (layer.__builtin__) {            return true;        }        if (typeof (layer.resize) !== 'function'            || typeof (layer.refresh) !== 'function') {            return false;        }        return true;    }    function createRoot(width, height) {        var domRoot = document.createElement('div');        domRoot.style.cssText = [            'position:relative',            'width:' + width + 'px',            'height:' + height + 'px',            'padding:0',            'margin:0',            'border-width:0'        ].join(';') + ';';        return domRoot;    }    var CanvasPainter = (function () {        function CanvasPainter(root, storage, opts, id) {            this.type = 'canvas';            this._zlevelList = [];            this._prevDisplayList = [];            this._layers = {};            this._layerConfig = {};            this._needsManuallyCompositing = false;            this.type = 'canvas';            var singleCanvas = !root.nodeName                || root.nodeName.toUpperCase() === 'CANVAS';            this._opts = opts = extend({}, opts || {});            this.dpr = opts.devicePixelRatio || devicePixelRatio;            this._singleCanvas = singleCanvas;            this.root = root;            var rootStyle = root.style;            if (rootStyle) {                disableUserSelect(root);                root.innerHTML = '';            }            this.storage = storage;            var zlevelList = this._zlevelList;            this._prevDisplayList = [];            var layers = this._layers;            if (!singleCanvas) {                this._width = getSize(root, 0, opts);                this._height = getSize(root, 1, opts);                var domRoot = this._domRoot = createRoot(this._width, this._height);                root.appendChild(domRoot);            }            else {                var rootCanvas = root;                var width = rootCanvas.width;                var height = rootCanvas.height;                if (opts.width != null) {                    width = opts.width;                }                if (opts.height != null) {                    height = opts.height;                }                this.dpr = opts.devicePixelRatio || 1;                rootCanvas.width = width * this.dpr;                rootCanvas.height = height * this.dpr;                this._width = width;                this._height = height;                var mainLayer = new Layer(rootCanvas, this, this.dpr);                mainLayer.__builtin__ = true;                mainLayer.initContext();                layers[CANVAS_ZLEVEL] = mainLayer;                mainLayer.zlevel = CANVAS_ZLEVEL;                zlevelList.push(CANVAS_ZLEVEL);                this._domRoot = root;            }        }        CanvasPainter.prototype.getType = function () {            return 'canvas';        };        CanvasPainter.prototype.isSingleCanvas = function () {            return this._singleCanvas;        };        CanvasPainter.prototype.getViewportRoot = function () {            return this._domRoot;        };        CanvasPainter.prototype.getViewportRootOffset = function () {            var viewportRoot = this.getViewportRoot();            if (viewportRoot) {                return {                    offsetLeft: viewportRoot.offsetLeft || 0,                    offsetTop: viewportRoot.offsetTop || 0                };            }        };        CanvasPainter.prototype.refresh = function (paintAll) {            var list = this.storage.getDisplayList(true);            var prevList = this._prevDisplayList;            var zlevelList = this._zlevelList;            this._redrawId = Math.random();            this._paintList(list, prevList, paintAll, this._redrawId);            for (var i = 0; i < zlevelList.length; i++) {                var z = zlevelList[i];                var layer = this._layers[z];                if (!layer.__builtin__ && layer.refresh) {                    var clearColor = i === 0 ? this._backgroundColor : null;                    layer.refresh(clearColor);                }            }            if (this._opts.useDirtyRect) {                this._prevDisplayList = list.slice();            }            return this;        };        CanvasPainter.prototype.refreshHover = function () {            this._paintHoverList(this.storage.getDisplayList(false));        };        CanvasPainter.prototype._paintHoverList = function (list) {            var len = list.length;            var hoverLayer = this._hoverlayer;            hoverLayer && hoverLayer.clear();            if (!len) {                return;            }            var scope = {                inHover: true,                viewWidth: this._width,                viewHeight: this._height            };            var ctx;            for (var i = 0; i < len; i++) {                var el = list[i];                if (el.__inHover) {                    if (!hoverLayer) {                        hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL);                    }                    if (!ctx) {                        ctx = hoverLayer.ctx;                        ctx.save();                    }                    brush(ctx, el, scope, i === len - 1);                }            }            if (ctx) {                ctx.restore();            }        };        CanvasPainter.prototype.getHoverLayer = function () {            return this.getLayer(HOVER_LAYER_ZLEVEL);        };        CanvasPainter.prototype.paintOne = function (ctx, el) {            brushSingle(ctx, el);        };        CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) {            if (this._redrawId !== redrawId) {                return;            }            paintAll = paintAll || false;            this._updateLayerStatus(list);            var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover;            if (this._needsManuallyCompositing) {                this._compositeManually();            }            if (needsRefreshHover) {                this._paintHoverList(list);            }            if (!finished) {                var self_1 = this;                requestAnimationFrame$1(function () {                    self_1._paintList(list, prevList, paintAll, redrawId);                });            }            else {                this.eachLayer(function (layer) {                    layer.afterBrush && layer.afterBrush();                });            }        };        CanvasPainter.prototype._compositeManually = function () {            var ctx = this.getLayer(CANVAS_ZLEVEL).ctx;            var width = this._domRoot.width;            var height = this._domRoot.height;            ctx.clearRect(0, 0, width, height);            this.eachBuiltinLayer(function (layer) {                if (layer.virtual) {                    ctx.drawImage(layer.dom, 0, 0, width, height);                }            });        };        CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) {            var _this = this;            var layerList = [];            var useDirtyRect = this._opts.useDirtyRect;            for (var zi = 0; zi < this._zlevelList.length; zi++) {                var zlevel = this._zlevelList[zi];                var layer = this._layers[zlevel];                if (layer.__builtin__                    && layer !== this._hoverlayer                    && (layer.__dirty || paintAll)) {                    layerList.push(layer);                }            }            var finished = true;            var needsRefreshHover = false;            var _loop_1 = function (k) {                var layer = layerList[k];                var ctx = layer.ctx;                var repaintRects = useDirtyRect                    && layer.createRepaintRects(list, prevList, this_1._width, this_1._height);                var start = paintAll ? layer.__startIndex : layer.__drawIndex;                var useTimer = !paintAll && layer.incremental && Date.now;                var startTime = useTimer && Date.now();                var clearColor = layer.zlevel === this_1._zlevelList[0]                    ? this_1._backgroundColor : null;                if (layer.__startIndex === layer.__endIndex) {                    layer.clear(false, clearColor, repaintRects);                }                else if (start === layer.__startIndex) {                    var firstEl = list[start];                    if (!firstEl.incremental || !firstEl.notClear || paintAll) {                        layer.clear(false, clearColor, repaintRects);                    }                }                if (start === -1) {                    console.error('For some unknown reason. drawIndex is -1');                    start = layer.__startIndex;                }                var i;                var repaint = function (repaintRect) {                    var scope = {                        inHover: false,                        allClipped: false,                        prevEl: null,                        viewWidth: _this._width,                        viewHeight: _this._height                    };                    for (i = start; i < layer.__endIndex; i++) {                        var el = list[i];                        if (el.__inHover) {                            needsRefreshHover = true;                        }                        _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1);                        if (useTimer) {                            var dTime = Date.now() - startTime;                            if (dTime > 15) {                                break;                            }                        }                    }                    if (scope.prevElClipPaths) {                        ctx.restore();                    }                };                if (repaintRects) {                    if (repaintRects.length === 0) {                        i = layer.__endIndex;                    }                    else {                        var dpr = this_1.dpr;                        for (var r = 0; r < repaintRects.length; ++r) {                            var rect = repaintRects[r];                            ctx.save();                            ctx.beginPath();                            ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);                            ctx.clip();                            repaint(rect);                            ctx.restore();                        }                    }                }                else {                    ctx.save();                    repaint();                    ctx.restore();                }                layer.__drawIndex = i;                if (layer.__drawIndex < layer.__endIndex) {                    finished = false;                }            };            var this_1 = this;            for (var k = 0; k < layerList.length; k++) {                _loop_1(k);            }            if (env.wxa) {                each(this._layers, function (layer) {                    if (layer && layer.ctx && layer.ctx.draw) {                        layer.ctx.draw();                    }                });            }            return {                finished: finished,                needsRefreshHover: needsRefreshHover            };        };        CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) {            var ctx = currentLayer.ctx;            if (useDirtyRect) {                var paintRect = el.getPaintRect();                if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) {                    brush(ctx, el, scope, isLast);                    el.setPrevPaintRect(paintRect);                }            }            else {                brush(ctx, el, scope, isLast);            }        };        CanvasPainter.prototype.getLayer = function (zlevel, virtual) {            if (this._singleCanvas && !this._needsManuallyCompositing) {                zlevel = CANVAS_ZLEVEL;            }            var layer = this._layers[zlevel];            if (!layer) {                layer = new Layer('zr_' + zlevel, this, this.dpr);                layer.zlevel = zlevel;                layer.__builtin__ = true;                if (this._layerConfig[zlevel]) {                    merge(layer, this._layerConfig[zlevel], true);                }                else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) {                    merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true);                }                if (virtual) {                    layer.virtual = virtual;                }                this.insertLayer(zlevel, layer);                layer.initContext();            }            return layer;        };        CanvasPainter.prototype.insertLayer = function (zlevel, layer) {            var layersMap = this._layers;            var zlevelList = this._zlevelList;            var len = zlevelList.length;            var domRoot = this._domRoot;            var prevLayer = null;            var i = -1;            if (layersMap[zlevel]) {                {                    logError('ZLevel ' + zlevel + ' has been used already');                }                return;            }            if (!isLayerValid(layer)) {                {                    logError('Layer of zlevel ' + zlevel + ' is not valid');                }                return;            }            if (len > 0 && zlevel > zlevelList[0]) {                for (i = 0; i < len - 1; i++) {                    if (zlevelList[i] < zlevel                        && zlevelList[i + 1] > zlevel) {                        break;                    }                }                prevLayer = layersMap[zlevelList[i]];            }            zlevelList.splice(i + 1, 0, zlevel);            layersMap[zlevel] = layer;            if (!layer.virtual) {                if (prevLayer) {                    var prevDom = prevLayer.dom;                    if (prevDom.nextSibling) {                        domRoot.insertBefore(layer.dom, prevDom.nextSibling);                    }                    else {                        domRoot.appendChild(layer.dom);                    }                }                else {                    if (domRoot.firstChild) {                        domRoot.insertBefore(layer.dom, domRoot.firstChild);                    }                    else {                        domRoot.appendChild(layer.dom);                    }                }            }            layer.painter || (layer.painter = this);        };        CanvasPainter.prototype.eachLayer = function (cb, context) {            var zlevelList = this._zlevelList;            for (var i = 0; i < zlevelList.length; i++) {                var z = zlevelList[i];                cb.call(context, this._layers[z], z);            }        };        CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) {            var zlevelList = this._zlevelList;            for (var i = 0; i < zlevelList.length; i++) {                var z = zlevelList[i];                var layer = this._layers[z];                if (layer.__builtin__) {                    cb.call(context, layer, z);                }            }        };        CanvasPainter.prototype.eachOtherLayer = function (cb, context) {            var zlevelList = this._zlevelList;            for (var i = 0; i < zlevelList.length; i++) {                var z = zlevelList[i];                var layer = this._layers[z];                if (!layer.__builtin__) {                    cb.call(context, layer, z);                }            }        };        CanvasPainter.prototype.getLayers = function () {            return this._layers;        };        CanvasPainter.prototype._updateLayerStatus = function (list) {            this.eachBuiltinLayer(function (layer, z) {                layer.__dirty = layer.__used = false;            });            function updatePrevLayer(idx) {                if (prevLayer) {                    if (prevLayer.__endIndex !== idx) {                        prevLayer.__dirty = true;                    }                    prevLayer.__endIndex = idx;                }            }            if (this._singleCanvas) {                for (var i_1 = 1; i_1 < list.length; i_1++) {                    var el = list[i_1];                    if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) {                        this._needsManuallyCompositing = true;                        break;                    }                }            }            var prevLayer = null;            var incrementalLayerCount = 0;            var prevZlevel;            var i;            for (i = 0; i < list.length; i++) {                var el = list[i];                var zlevel = el.zlevel;                var layer = void 0;                if (prevZlevel !== zlevel) {                    prevZlevel = zlevel;                    incrementalLayerCount = 0;                }                if (el.incremental) {                    layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing);                    layer.incremental = true;                    incrementalLayerCount = 1;                }                else {                    layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing);                }                if (!layer.__builtin__) {                    logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id);                }                if (layer !== prevLayer) {                    layer.__used = true;                    if (layer.__startIndex !== i) {                        layer.__dirty = true;                    }                    layer.__startIndex = i;                    if (!layer.incremental) {                        layer.__drawIndex = i;                    }                    else {                        layer.__drawIndex = -1;                    }                    updatePrevLayer(i);                    prevLayer = layer;                }                if ((el.__dirty & REDRAW_BIT) && !el.__inHover) {                    layer.__dirty = true;                    if (layer.incremental && layer.__drawIndex < 0) {                        layer.__drawIndex = i;                    }                }            }            updatePrevLayer(i);            this.eachBuiltinLayer(function (layer, z) {                if (!layer.__used && layer.getElementCount() > 0) {                    layer.__dirty = true;                    layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0;                }                if (layer.__dirty && layer.__drawIndex < 0) {                    layer.__drawIndex = layer.__startIndex;                }            });        };        CanvasPainter.prototype.clear = function () {            this.eachBuiltinLayer(this._clearLayer);            return this;        };        CanvasPainter.prototype._clearLayer = function (layer) {            layer.clear();        };        CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) {            this._backgroundColor = backgroundColor;            each(this._layers, function (layer) {                layer.setUnpainted();            });        };        CanvasPainter.prototype.configLayer = function (zlevel, config) {            if (config) {                var layerConfig = this._layerConfig;                if (!layerConfig[zlevel]) {                    layerConfig[zlevel] = config;                }                else {                    merge(layerConfig[zlevel], config, true);                }                for (var i = 0; i < this._zlevelList.length; i++) {                    var _zlevel = this._zlevelList[i];                    if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) {                        var layer = this._layers[_zlevel];                        merge(layer, layerConfig[zlevel], true);                    }                }            }        };        CanvasPainter.prototype.delLayer = function (zlevel) {            var layers = this._layers;            var zlevelList = this._zlevelList;            var layer = layers[zlevel];            if (!layer) {                return;            }            layer.dom.parentNode.removeChild(layer.dom);            delete layers[zlevel];            zlevelList.splice(indexOf(zlevelList, zlevel), 1);        };        CanvasPainter.prototype.resize = function (width, height) {            if (!this._domRoot.style) {                if (width == null || height == null) {                    return;                }                this._width = width;                this._height = height;                this.getLayer(CANVAS_ZLEVEL).resize(width, height);            }            else {                var domRoot = this._domRoot;                domRoot.style.display = 'none';                var opts = this._opts;                var root = this.root;                width != null && (opts.width = width);                height != null && (opts.height = height);                width = getSize(root, 0, opts);                height = getSize(root, 1, opts);                domRoot.style.display = '';                if (this._width !== width || height !== this._height) {                    domRoot.style.width = width + 'px';                    domRoot.style.height = height + 'px';                    for (var id in this._layers) {                        if (this._layers.hasOwnProperty(id)) {                            this._layers[id].resize(width, height);                        }                    }                    this.refresh(true);                }                this._width = width;                this._height = height;            }            return this;        };        CanvasPainter.prototype.clearLayer = function (zlevel) {            var layer = this._layers[zlevel];            if (layer) {                layer.clear();            }        };        CanvasPainter.prototype.dispose = function () {            this.root.innerHTML = '';            this.root =                this.storage =                    this._domRoot =                        this._layers = null;        };        CanvasPainter.prototype.getRenderedCanvas = function (opts) {            opts = opts || {};            if (this._singleCanvas && !this._compositeManually) {                return this._layers[CANVAS_ZLEVEL].dom;            }            var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr);            imageLayer.initContext();            imageLayer.clear(false, opts.backgroundColor || this._backgroundColor);            var ctx = imageLayer.ctx;            if (opts.pixelRatio <= this.dpr) {                this.refresh();                var width_1 = imageLayer.dom.width;                var height_1 = imageLayer.dom.height;                this.eachLayer(function (layer) {                    if (layer.__builtin__) {                        ctx.drawImage(layer.dom, 0, 0, width_1, height_1);                    }                    else if (layer.renderToCanvas) {                        ctx.save();                        layer.renderToCanvas(ctx);                        ctx.restore();                    }                });            }            else {                var scope = {                    inHover: false,                    viewWidth: this._width,                    viewHeight: this._height                };                var displayList = this.storage.getDisplayList(true);                for (var i = 0, len = displayList.length; i < len; i++) {                    var el = displayList[i];                    brush(ctx, el, scope, i === len - 1);                }            }            return imageLayer.dom;        };        CanvasPainter.prototype.getWidth = function () {            return this._width;        };        CanvasPainter.prototype.getHeight = function () {            return this._height;        };        return CanvasPainter;    }());    var mathSin$4 = Math.sin;    var mathCos$4 = Math.cos;    var PI$5 = Math.PI;    var PI2$6 = Math.PI * 2;    var degree = 180 / PI$5;    var SVGPathRebuilder = (function () {        function SVGPathRebuilder() {        }        SVGPathRebuilder.prototype.reset = function (precision) {            this._start = true;            this._d = [];            this._str = '';            this._p = Math.pow(10, precision || 4);        };        SVGPathRebuilder.prototype.moveTo = function (x, y) {            this._add('M', x, y);        };        SVGPathRebuilder.prototype.lineTo = function (x, y) {            this._add('L', x, y);        };        SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) {            this._add('C', x, y, x2, y2, x3, y3);        };        SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) {            this._add('Q', x, y, x2, y2);        };        SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {            this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise);        };        SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) {            var dTheta = endAngle - startAngle;            var clockwise = !anticlockwise;            var dThetaPositive = Math.abs(dTheta);            var isCircle = isAroundZero$1(dThetaPositive - PI2$6)                || (clockwise ? dTheta >= PI2$6 : -dTheta >= PI2$6);            var unifiedTheta = dTheta > 0 ? dTheta % PI2$6 : (dTheta % PI2$6 + PI2$6);            var large = false;            if (isCircle) {                large = true;            }            else if (isAroundZero$1(dThetaPositive)) {                large = false;            }            else {                large = (unifiedTheta >= PI$5) === !!clockwise;            }            var x0 = cx + rx * mathCos$4(startAngle);            var y0 = cy + ry * mathSin$4(startAngle);            if (this._start) {                this._add('M', x0, y0);            }            var xRot = Math.round(psi * degree);            if (isCircle) {                var p = 1 / this._p;                var dTheta_1 = (clockwise ? 1 : -1) * (PI2$6 - p);                this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos$4(startAngle + dTheta_1), cy + ry * mathSin$4(startAngle + dTheta_1));                if (p > 1e-2) {                    this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0);                }            }            else {                var x = cx + rx * mathCos$4(endAngle);                var y = cy + ry * mathSin$4(endAngle);                this._add('A', rx, ry, xRot, +large, +clockwise, x, y);            }        };        SVGPathRebuilder.prototype.rect = function (x, y, w, h) {            this._add('M', x, y);            this._add('l', w, 0);            this._add('l', 0, h);            this._add('l', -w, 0);            this._add('Z');        };        SVGPathRebuilder.prototype.closePath = function () {            if (this._d.length > 0) {                this._add('Z');            }        };        SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) {            var vals = [];            var p = this._p;            for (var i = 1; i < arguments.length; i++) {                var val = arguments[i];                if (isNaN(val)) {                    this._invalid = true;                    return;                }                vals.push(Math.round(val * p) / p);            }            this._d.push(cmd + vals.join(' '));            this._start = cmd === 'Z';        };        SVGPathRebuilder.prototype.generateStr = function () {            this._str = this._invalid ? '' : this._d.join('');            this._d = [];        };        SVGPathRebuilder.prototype.getStr = function () {            return this._str;        };        return SVGPathRebuilder;    }());    var NONE = 'none';    var mathRound$1 = Math.round;    function pathHasFill(style) {        var fill = style.fill;        return fill != null && fill !== NONE;    }    function pathHasStroke(style) {        var stroke = style.stroke;        return stroke != null && stroke !== NONE;    }    var strokeProps = ['lineCap', 'miterLimit', 'lineJoin'];    var svgStrokeProps = map(strokeProps, function (prop) { return "stroke-" + prop.toLowerCase(); });    function mapStyleToAttrs(updateAttr, style, el, forceUpdate) {        var opacity = style.opacity == null ? 1 : style.opacity;        if (el instanceof ZRImage) {            updateAttr('opacity', opacity);            return;        }        if (pathHasFill(style)) {            var fill = normalizeColor(style.fill);            updateAttr('fill', fill.color);            var fillOpacity = style.fillOpacity != null                ? style.fillOpacity * fill.opacity * opacity                : fill.opacity * opacity;            if (forceUpdate || fillOpacity < 1) {                updateAttr('fill-opacity', fillOpacity);            }        }        else {            updateAttr('fill', NONE);        }        if (pathHasStroke(style)) {            var stroke = normalizeColor(style.stroke);            updateAttr('stroke', stroke.color);            var strokeScale = style.strokeNoScale                ? el.getLineScale()                : 1;            var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0);            var strokeOpacity = style.strokeOpacity != null                ? style.strokeOpacity * stroke.opacity * opacity                : stroke.opacity * opacity;            var strokeFirst = style.strokeFirst;            if (forceUpdate || strokeWidth !== 1) {                updateAttr('stroke-width', strokeWidth);            }            if (forceUpdate || strokeFirst) {                updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill');            }            if (forceUpdate || strokeOpacity < 1) {                updateAttr('stroke-opacity', strokeOpacity);            }            if (style.lineDash) {                var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];                if (lineDash) {                    lineDashOffset = mathRound$1(lineDashOffset || 0);                    updateAttr('stroke-dasharray', lineDash.join(','));                    if (lineDashOffset || forceUpdate) {                        updateAttr('stroke-dashoffset', lineDashOffset);                    }                }            }            else if (forceUpdate) {                updateAttr('stroke-dasharray', NONE);            }            for (var i = 0; i < strokeProps.length; i++) {                var propName = strokeProps[i];                if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) {                    var val = style[propName] || DEFAULT_PATH_STYLE[propName];                    val && updateAttr(svgStrokeProps[i], val);                }            }        }        else if (forceUpdate) {            updateAttr('stroke', NONE);        }    }    var SVGNS = 'http://www.w3.org/2000/svg';    var XLINKNS = 'http://www.w3.org/1999/xlink';    var XMLNS = 'http://www.w3.org/2000/xmlns/';    var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace';    var META_DATA_PREFIX = 'ecmeta_';    function createElement(name) {        return document.createElementNS(SVGNS, name);    }    function createVNode(tag, key, attrs, children, text) {        return {            tag: tag,            attrs: attrs || {},            children: children,            text: text,            key: key        };    }    function createElementOpen(name, attrs) {        var attrsStr = [];        if (attrs) {            for (var key in attrs) {                var val = attrs[key];                var part = key;                if (val === false) {                    continue;                }                else if (val !== true && val != null) {                    part += "=\"" + val + "\"";                }                attrsStr.push(part);            }        }        return "<" + name + " " + attrsStr.join(' ') + ">";    }    function createElementClose(name) {        return "</" + name + ">";    }    function vNodeToString(el, opts) {        opts = opts || {};        var S = opts.newline ? '\n' : '';        function convertElToString(el) {            var children = el.children, tag = el.tag, attrs = el.attrs, text = el.text;            return createElementOpen(tag, attrs)                + (tag !== 'style' ? encodeHTML(text) : text || '')                + (children ? "" + S + map(children, function (child) { return convertElToString(child); }).join(S) + S : '')                + createElementClose(tag);        }        return convertElToString(el);    }    function getCssString(selectorNodes, animationNodes, opts) {        opts = opts || {};        var S = opts.newline ? '\n' : '';        var bracketBegin = " {" + S;        var bracketEnd = S + "}";        var selectors = map(keys(selectorNodes), function (className) {            return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) {                return attrName + ":" + selectorNodes[className][attrName] + ";";            }).join(S) + bracketEnd;        }).join(S);        var animations = map(keys(animationNodes), function (animationName) {            return "@keyframes " + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) {                return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) {                    var val = animationNodes[animationName][percent][attrName];                    if (attrName === 'd') {                        val = "path(\"" + val + "\")";                    }                    return attrName + ":" + val + ";";                }).join(S) + bracketEnd;            }).join(S) + bracketEnd;        }).join(S);        if (!selectors && !animations) {            return '';        }        return ['<![CDATA[', selectors, animations, ']]>'].join(S);    }    function createBrushScope(zrId) {        return {            zrId: zrId,            shadowCache: {},            patternCache: {},            gradientCache: {},            clipPathCache: {},            defs: {},            cssNodes: {},            cssAnims: {},            cssStyleCache: {},            cssAnimIdx: 0,            shadowIdx: 0,            gradientIdx: 0,            patternIdx: 0,            clipPathIdx: 0        };    }    function createSVGVNode(width, height, children, useViewBox) {        return createVNode('svg', 'root', {            'width': width,            'height': height,            'xmlns': SVGNS,            'xmlns:xlink': XLINKNS,            'version': '1.1',            'baseProfile': 'full',            'viewBox': useViewBox ? "0 0 " + width + " " + height : false        }, children);    }    var cssClassIdx = 0;    function getClassId() {        return cssClassIdx++;    }    var EASING_MAP = {        cubicIn: '0.32,0,0.67,0',        cubicOut: '0.33,1,0.68,1',        cubicInOut: '0.65,0,0.35,1',        quadraticIn: '0.11,0,0.5,0',        quadraticOut: '0.5,1,0.89,1',        quadraticInOut: '0.45,0,0.55,1',        quarticIn: '0.5,0,0.75,0',        quarticOut: '0.25,1,0.5,1',        quarticInOut: '0.76,0,0.24,1',        quinticIn: '0.64,0,0.78,0',        quinticOut: '0.22,1,0.36,1',        quinticInOut: '0.83,0,0.17,1',        sinusoidalIn: '0.12,0,0.39,0',        sinusoidalOut: '0.61,1,0.88,1',        sinusoidalInOut: '0.37,0,0.63,1',        exponentialIn: '0.7,0,0.84,0',        exponentialOut: '0.16,1,0.3,1',        exponentialInOut: '0.87,0,0.13,1',        circularIn: '0.55,0,1,0.45',        circularOut: '0,0.55,0.45,1',        circularInOut: '0.85,0,0.15,1'    };    var transformOriginKey = 'transform-origin';    function buildPathString(el, kfShape, path) {        var shape = extend({}, el.shape);        extend(shape, kfShape);        el.buildPath(path, shape);        var svgPathBuilder = new SVGPathRebuilder();        svgPathBuilder.reset(getPathPrecision(el));        path.rebuildPath(svgPathBuilder, 1);        svgPathBuilder.generateStr();        return svgPathBuilder.getStr();    }    function setTransformOrigin(target, transform) {        var originX = transform.originX, originY = transform.originY;        if (originX || originY) {            target[transformOriginKey] = originX + "px " + originY + "px";        }    }    var ANIMATE_STYLE_MAP = {        fill: 'fill',        opacity: 'opacity',        lineWidth: 'stroke-width',        lineDashOffset: 'stroke-dashoffset'    };    function addAnimation(cssAnim, scope) {        var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++;        scope.cssAnims[animationName] = cssAnim;        return animationName;    }    function createCompoundPathCSSAnimation(el, attrs, scope) {        var paths = el.shape.paths;        var composedAnim = {};        var cssAnimationCfg;        var cssAnimationName;        each(paths, function (path) {            var subScope = createBrushScope(scope.zrId);            subScope.animation = true;            createCSSAnimation(path, {}, subScope, true);            var cssAnims = subScope.cssAnims;            var cssNodes = subScope.cssNodes;            var animNames = keys(cssAnims);            var len = animNames.length;            if (!len) {                return;            }            cssAnimationName = animNames[len - 1];            var lastAnim = cssAnims[cssAnimationName];            for (var percent in lastAnim) {                var kf = lastAnim[percent];                composedAnim[percent] = composedAnim[percent] || { d: '' };                composedAnim[percent].d += kf.d || '';            }            for (var className in cssNodes) {                var val = cssNodes[className].animation;                if (val.indexOf(cssAnimationName) >= 0) {                    cssAnimationCfg = val;                }            }        });        if (!cssAnimationCfg) {            return;        }        attrs.d = false;        var animationName = addAnimation(composedAnim, scope);        return cssAnimationCfg.replace(cssAnimationName, animationName);    }    function getEasingFunc(easing) {        return isString(easing)            ? EASING_MAP[easing]                ? "cubic-bezier(" + EASING_MAP[easing] + ")"                : createCubicEasingFunc(easing) ? easing : ''            : '';    }    function createCSSAnimation(el, attrs, scope, onlyShape) {        var animators = el.animators;        var len = animators.length;        var cssAnimations = [];        if (el instanceof CompoundPath) {            var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope);            if (animationCfg) {                cssAnimations.push(animationCfg);            }            else if (!len) {                return;            }        }        else if (!len) {            return;        }        var groupAnimators = {};        for (var i = 0; i < len; i++) {            var animator = animators[i];            var cfgArr = [animator.getMaxTime() / 1000 + 's'];            var easing = getEasingFunc(animator.getClip().easing);            var delay = animator.getDelay();            if (easing) {                cfgArr.push(easing);            }            else {                cfgArr.push('linear');            }            if (delay) {                cfgArr.push(delay / 1000 + 's');            }            if (animator.getLoop()) {                cfgArr.push('infinite');            }            var cfg = cfgArr.join(' ');            groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []];            groupAnimators[cfg][1].push(animator);        }        function createSingleCSSAnimation(groupAnimator) {            var animators = groupAnimator[1];            var len = animators.length;            var transformKfs = {};            var shapeKfs = {};            var finalKfs = {};            var animationTimingFunctionAttrName = 'animation-timing-function';            function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) {                var tracks = animator.getTracks();                var maxTime = animator.getMaxTime();                for (var k = 0; k < tracks.length; k++) {                    var track = tracks[k];                    if (track.needsAnimate()) {                        var kfs = track.keyframes;                        var attrName = track.propName;                        toCssAttrName && (attrName = toCssAttrName(attrName));                        if (attrName) {                            for (var i = 0; i < kfs.length; i++) {                                var kf = kfs[i];                                var percent = Math.round(kf.time / maxTime * 100) + '%';                                var kfEasing = getEasingFunc(kf.easing);                                var rawValue = kf.rawValue;                                if (isString(rawValue) || isNumber(rawValue)) {                                    cssKfs[percent] = cssKfs[percent] || {};                                    cssKfs[percent][attrName] = kf.rawValue;                                    if (kfEasing) {                                        cssKfs[percent][animationTimingFunctionAttrName] = kfEasing;                                    }                                }                            }                        }                    }                }            }            for (var i = 0; i < len; i++) {                var animator = animators[i];                var targetProp = animator.targetName;                if (!targetProp) {                    !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs);                }                else if (targetProp === 'shape') {                    saveAnimatorTrackToCssKfs(animator, shapeKfs);                }            }            for (var percent in transformKfs) {                var transform = {};                copyTransform(transform, el);                extend(transform, transformKfs[percent]);                var str = getSRTTransformString(transform);                var timingFunction = transformKfs[percent][animationTimingFunctionAttrName];                finalKfs[percent] = str ? {                    transform: str                } : {};                setTransformOrigin(finalKfs[percent], transform);                if (timingFunction) {                    finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;                }            }            var path;            var canAnimateShape = true;            for (var percent in shapeKfs) {                finalKfs[percent] = finalKfs[percent] || {};                var isFirst = !path;                var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName];                if (isFirst) {                    path = new PathProxy();                }                var len_1 = path.len();                path.reset();                finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path);                var newLen = path.len();                if (!isFirst && len_1 !== newLen) {                    canAnimateShape = false;                    break;                }                if (timingFunction) {                    finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;                }            }            if (!canAnimateShape) {                for (var percent in finalKfs) {                    delete finalKfs[percent].d;                }            }            if (!onlyShape) {                for (var i = 0; i < len; i++) {                    var animator = animators[i];                    var targetProp = animator.targetName;                    if (targetProp === 'style') {                        saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { return ANIMATE_STYLE_MAP[propName]; });                    }                }            }            var percents = keys(finalKfs);            var allTransformOriginSame = true;            var transformOrigin;            for (var i = 1; i < percents.length; i++) {                var p0 = percents[i - 1];                var p1 = percents[i];                if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) {                    allTransformOriginSame = false;                    break;                }                transformOrigin = finalKfs[p0][transformOriginKey];            }            if (allTransformOriginSame && transformOrigin) {                for (var percent in finalKfs) {                    if (finalKfs[percent][transformOriginKey]) {                        delete finalKfs[percent][transformOriginKey];                    }                }                attrs[transformOriginKey] = transformOrigin;            }            if (filter(percents, function (percent) { return keys(finalKfs[percent]).length > 0; }).length) {                var animationName = addAnimation(finalKfs, scope);                return animationName + " " + groupAnimator[0] + " both";            }        }        for (var key in groupAnimators) {            var animationCfg = createSingleCSSAnimation(groupAnimators[key]);            if (animationCfg) {                cssAnimations.push(animationCfg);            }        }        if (cssAnimations.length) {            var className = scope.zrId + '-cls-' + getClassId();            scope.cssNodes['.' + className] = {                animation: cssAnimations.join(',')            };            attrs["class"] = className;        }    }    function createCSSEmphasis(el, attrs, scope) {        if (!el.ignore) {            if (el.isSilent()) {                var style = {                    'pointer-events': 'none'                };                setClassAttribute(style, attrs, scope, true);            }            else {                var emphasisStyle = el.states.emphasis && el.states.emphasis.style                    ? el.states.emphasis.style                    : {};                var fill = emphasisStyle.fill;                if (!fill) {                    var normalFill = el.style && el.style.fill;                    var selectFill = el.states.select                        && el.states.select.style                        && el.states.select.style.fill;                    var fromFill = el.currentStates.indexOf('select') >= 0                        ? (selectFill || normalFill)                        : normalFill;                    if (fromFill) {                        fill = liftColor(fromFill);                    }                }                var lineWidth = emphasisStyle.lineWidth;                if (lineWidth) {                    var scaleX = (!emphasisStyle.strokeNoScale && el.transform)                        ? el.transform[0]                        : 1;                    lineWidth = lineWidth / scaleX;                }                var style = {                    cursor: 'pointer',                };                if (fill) {                    style.fill = fill;                }                if (emphasisStyle.stroke) {                    style.stroke = emphasisStyle.stroke;                }                if (lineWidth) {                    style['stroke-width'] = lineWidth;                }                setClassAttribute(style, attrs, scope, true);            }        }    }    function setClassAttribute(style, attrs, scope, withHover) {        var styleKey = JSON.stringify(style);        var className = scope.cssStyleCache[styleKey];        if (!className) {            className = scope.zrId + '-cls-' + getClassId();            scope.cssStyleCache[styleKey] = className;            scope.cssNodes['.' + className + (withHover ? ':hover' : '')] = style;        }        attrs["class"] = attrs["class"] ? (attrs["class"] + ' ' + className) : className;    }    var round$1 = Math.round;    function isImageLike$1(val) {        return val && isString(val.src);    }    function isCanvasLike(val) {        return val && isFunction(val.toDataURL);    }    function setStyleAttrs(attrs, style, el, scope) {        mapStyleToAttrs(function (key, val) {            var isFillStroke = key === 'fill' || key === 'stroke';            if (isFillStroke && isGradient(val)) {                setGradient(style, attrs, key, scope);            }            else if (isFillStroke && isPattern(val)) {                setPattern(el, attrs, key, scope);            }            else if (isFillStroke && val === 'none') {                attrs[key] = 'transparent';            }            else {                attrs[key] = val;            }        }, style, el, false);        setShadow(el, attrs, scope);    }    function setMetaData(attrs, el) {        var metaData = getElementSSRData(el);        if (metaData) {            metaData.each(function (val, key) {                val != null && (attrs[(META_DATA_PREFIX + key).toLowerCase()] = val + '');            });            if (el.isSilent()) {                attrs[META_DATA_PREFIX + 'silent'] = 'true';            }        }    }    function noRotateScale(m) {        return isAroundZero$1(m[0] - 1)            && isAroundZero$1(m[1])            && isAroundZero$1(m[2])            && isAroundZero$1(m[3] - 1);    }    function noTranslate(m) {        return isAroundZero$1(m[4]) && isAroundZero$1(m[5]);    }    function setTransform(attrs, m, compress) {        if (m && !(noTranslate(m) && noRotateScale(m))) {            var mul = compress ? 10 : 1e4;            attrs.transform = noRotateScale(m)                ? "translate(" + round$1(m[4] * mul) / mul + " " + round$1(m[5] * mul) / mul + ")" : getMatrixStr(m);        }    }    function convertPolyShape(shape, attrs, mul) {        var points = shape.points;        var strArr = [];        for (var i = 0; i < points.length; i++) {            strArr.push(round$1(points[i][0] * mul) / mul);            strArr.push(round$1(points[i][1] * mul) / mul);        }        attrs.points = strArr.join(' ');    }    function validatePolyShape(shape) {        return !shape.smooth;    }    function createAttrsConvert(desc) {        var normalizedDesc = map(desc, function (item) {            return (typeof item === 'string' ? [item, item] : item);        });        return function (shape, attrs, mul) {            for (var i = 0; i < normalizedDesc.length; i++) {                var item = normalizedDesc[i];                var val = shape[item[0]];                if (val != null) {                    attrs[item[1]] = round$1(val * mul) / mul;                }            }        };    }    var builtinShapesDef = {        circle: [createAttrsConvert(['cx', 'cy', 'r'])],        polyline: [convertPolyShape, validatePolyShape],        polygon: [convertPolyShape, validatePolyShape]    };    function hasShapeAnimation(el) {        var animators = el.animators;        for (var i = 0; i < animators.length; i++) {            if (animators[i].targetName === 'shape') {                return true;            }        }        return false;    }    function brushSVGPath(el, scope) {        var style = el.style;        var shape = el.shape;        var builtinShpDef = builtinShapesDef[el.type];        var attrs = {};        var needsAnimate = scope.animation;        var svgElType = 'path';        var strokePercent = el.style.strokePercent;        var precision = (scope.compress && getPathPrecision(el)) || 4;        if (builtinShpDef            && !scope.willUpdate            && !(builtinShpDef[1] && !builtinShpDef[1](shape))            && !(needsAnimate && hasShapeAnimation(el))            && !(strokePercent < 1)) {            svgElType = el.type;            var mul = Math.pow(10, precision);            builtinShpDef[0](shape, attrs, mul);        }        else {            var needBuildPath = !el.path || el.shapeChanged();            if (!el.path) {                el.createPathProxy();            }            var path = el.path;            if (needBuildPath) {                path.beginPath();                el.buildPath(path, el.shape);                el.pathUpdated();            }            var pathVersion = path.getVersion();            var elExt = el;            var svgPathBuilder = elExt.__svgPathBuilder;            if (elExt.__svgPathVersion !== pathVersion                || !svgPathBuilder                || strokePercent !== elExt.__svgPathStrokePercent) {                if (!svgPathBuilder) {                    svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder();                }                svgPathBuilder.reset(precision);                path.rebuildPath(svgPathBuilder, strokePercent);                svgPathBuilder.generateStr();                elExt.__svgPathVersion = pathVersion;                elExt.__svgPathStrokePercent = strokePercent;            }            attrs.d = svgPathBuilder.getStr();        }        setTransform(attrs, el.transform);        setStyleAttrs(attrs, style, el, scope);        setMetaData(attrs, el);        scope.animation && createCSSAnimation(el, attrs, scope);        scope.emphasis && createCSSEmphasis(el, attrs, scope);        return createVNode(svgElType, el.id + '', attrs);    }    function brushSVGImage(el, scope) {        var style = el.style;        var image = style.image;        if (image && !isString(image)) {            if (isImageLike$1(image)) {                image = image.src;            }            else if (isCanvasLike(image)) {                image = image.toDataURL();            }        }        if (!image) {            return;        }        var x = style.x || 0;        var y = style.y || 0;        var dw = style.width;        var dh = style.height;        var attrs = {            href: image,            width: dw,            height: dh        };        if (x) {            attrs.x = x;        }        if (y) {            attrs.y = y;        }        setTransform(attrs, el.transform);        setStyleAttrs(attrs, style, el, scope);        setMetaData(attrs, el);        scope.animation && createCSSAnimation(el, attrs, scope);        return createVNode('image', el.id + '', attrs);    }    function brushSVGTSpan(el, scope) {        var style = el.style;        var text = style.text;        text != null && (text += '');        if (!text || isNaN(style.x) || isNaN(style.y)) {            return;        }        var font = style.font || DEFAULT_FONT;        var x = style.x || 0;        var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline);        var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign]            || style.textAlign;        var attrs = {            'dominant-baseline': 'central',            'text-anchor': textAlign        };        if (hasSeparateFont(style)) {            var separatedFontStr = '';            var fontStyle = style.fontStyle;            var fontSize = parseFontSize(style.fontSize);            if (!parseFloat(fontSize)) {                return;            }            var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY;            var fontWeight = style.fontWeight;            separatedFontStr += "font-size:" + fontSize + ";font-family:" + fontFamily + ";";            if (fontStyle && fontStyle !== 'normal') {                separatedFontStr += "font-style:" + fontStyle + ";";            }            if (fontWeight && fontWeight !== 'normal') {                separatedFontStr += "font-weight:" + fontWeight + ";";            }            attrs.style = separatedFontStr;        }        else {            attrs.style = "font: " + font;        }        if (text.match(/\s/)) {            attrs['xml:space'] = 'preserve';        }        if (x) {            attrs.x = x;        }        if (y) {            attrs.y = y;        }        setTransform(attrs, el.transform);        setStyleAttrs(attrs, style, el, scope);        setMetaData(attrs, el);        scope.animation && createCSSAnimation(el, attrs, scope);        return createVNode('text', el.id + '', attrs, undefined, text);    }    function brush$1(el, scope) {        if (el instanceof Path) {            return brushSVGPath(el, scope);        }        else if (el instanceof ZRImage) {            return brushSVGImage(el, scope);        }        else if (el instanceof TSpan) {            return brushSVGTSpan(el, scope);        }    }    function setShadow(el, attrs, scope) {        var style = el.style;        if (hasShadow(style)) {            var shadowKey = getShadowKey(el);            var shadowCache = scope.shadowCache;            var shadowId = shadowCache[shadowKey];            if (!shadowId) {                var globalScale = el.getGlobalScale();                var scaleX = globalScale[0];                var scaleY = globalScale[1];                if (!scaleX || !scaleY) {                    return;                }                var offsetX = style.shadowOffsetX || 0;                var offsetY = style.shadowOffsetY || 0;                var blur_1 = style.shadowBlur;                var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color;                var stdDx = blur_1 / 2 / scaleX;                var stdDy = blur_1 / 2 / scaleY;                var stdDeviation = stdDx + ' ' + stdDy;                shadowId = scope.zrId + '-s' + scope.shadowIdx++;                scope.defs[shadowId] = createVNode('filter', shadowId, {                    'id': shadowId,                    'x': '-100%',                    'y': '-100%',                    'width': '300%',                    'height': '300%'                }, [                    createVNode('feDropShadow', '', {                        'dx': offsetX / scaleX,                        'dy': offsetY / scaleY,                        'stdDeviation': stdDeviation,                        'flood-color': color,                        'flood-opacity': opacity                    })                ]);                shadowCache[shadowKey] = shadowId;            }            attrs.filter = getIdURL(shadowId);        }    }    function setGradient(style, attrs, target, scope) {        var val = style[target];        var gradientTag;        var gradientAttrs = {            'gradientUnits': val.global                ? 'userSpaceOnUse'                : 'objectBoundingBox'        };        if (isLinearGradient(val)) {            gradientTag = 'linearGradient';            gradientAttrs.x1 = val.x;            gradientAttrs.y1 = val.y;            gradientAttrs.x2 = val.x2;            gradientAttrs.y2 = val.y2;        }        else if (isRadialGradient(val)) {            gradientTag = 'radialGradient';            gradientAttrs.cx = retrieve2(val.x, 0.5);            gradientAttrs.cy = retrieve2(val.y, 0.5);            gradientAttrs.r = retrieve2(val.r, 0.5);        }        else {            {                logError('Illegal gradient type.');            }            return;        }        var colors = val.colorStops;        var colorStops = [];        for (var i = 0, len = colors.length; i < len; ++i) {            var offset = round4(colors[i].offset) * 100 + '%';            var stopColor = colors[i].color;            var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity;            var stopsAttrs = {                'offset': offset            };            stopsAttrs['stop-color'] = color;            if (opacity < 1) {                stopsAttrs['stop-opacity'] = opacity;            }            colorStops.push(createVNode('stop', i + '', stopsAttrs));        }        var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops);        var gradientKey = vNodeToString(gradientVNode);        var gradientCache = scope.gradientCache;        var gradientId = gradientCache[gradientKey];        if (!gradientId) {            gradientId = scope.zrId + '-g' + scope.gradientIdx++;            gradientCache[gradientKey] = gradientId;            gradientAttrs.id = gradientId;            scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops);        }        attrs[target] = getIdURL(gradientId);    }    function setPattern(el, attrs, target, scope) {        var val = el.style[target];        var boundingRect = el.getBoundingRect();        var patternAttrs = {};        var repeat = val.repeat;        var noRepeat = repeat === 'no-repeat';        var repeatX = repeat === 'repeat-x';        var repeatY = repeat === 'repeat-y';        var child;        if (isImagePattern(val)) {            var imageWidth_1 = val.imageWidth;            var imageHeight_1 = val.imageHeight;            var imageSrc = void 0;            var patternImage = val.image;            if (isString(patternImage)) {                imageSrc = patternImage;            }            else if (isImageLike$1(patternImage)) {                imageSrc = patternImage.src;            }            else if (isCanvasLike(patternImage)) {                imageSrc = patternImage.toDataURL();            }            if (typeof Image === 'undefined') {                var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.';                assert(imageWidth_1, errMsg);                assert(imageHeight_1, errMsg);            }            else if (imageWidth_1 == null || imageHeight_1 == null) {                var setSizeToVNode_1 = function (vNode, img) {                    if (vNode) {                        var svgEl = vNode.elm;                        var width = imageWidth_1 || img.width;                        var height = imageHeight_1 || img.height;                        if (vNode.tag === 'pattern') {                            if (repeatX) {                                height = 1;                                width /= boundingRect.width;                            }                            else if (repeatY) {                                width = 1;                                height /= boundingRect.height;                            }                        }                        vNode.attrs.width = width;                        vNode.attrs.height = height;                        if (svgEl) {                            svgEl.setAttribute('width', width);                            svgEl.setAttribute('height', height);                        }                    }                };                var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) {                    noRepeat || setSizeToVNode_1(patternVNode, img);                    setSizeToVNode_1(child, img);                });                if (createdImage && createdImage.width && createdImage.height) {                    imageWidth_1 = imageWidth_1 || createdImage.width;                    imageHeight_1 = imageHeight_1 || createdImage.height;                }            }            child = createVNode('image', 'img', {                href: imageSrc,                width: imageWidth_1,                height: imageHeight_1            });            patternAttrs.width = imageWidth_1;            patternAttrs.height = imageHeight_1;        }        else if (val.svgElement) {            child = clone(val.svgElement);            patternAttrs.width = val.svgWidth;            patternAttrs.height = val.svgHeight;        }        if (!child) {            return;        }        var patternWidth;        var patternHeight;        if (noRepeat) {            patternWidth = patternHeight = 1;        }        else if (repeatX) {            patternHeight = 1;            patternWidth = patternAttrs.width / boundingRect.width;        }        else if (repeatY) {            patternWidth = 1;            patternHeight = patternAttrs.height / boundingRect.height;        }        else {            patternAttrs.patternUnits = 'userSpaceOnUse';        }        if (patternWidth != null && !isNaN(patternWidth)) {            patternAttrs.width = patternWidth;        }        if (patternHeight != null && !isNaN(patternHeight)) {            patternAttrs.height = patternHeight;        }        var patternTransform = getSRTTransformString(val);        patternTransform && (patternAttrs.patternTransform = patternTransform);        var patternVNode = createVNode('pattern', '', patternAttrs, [child]);        var patternKey = vNodeToString(patternVNode);        var patternCache = scope.patternCache;        var patternId = patternCache[patternKey];        if (!patternId) {            patternId = scope.zrId + '-p' + scope.patternIdx++;            patternCache[patternKey] = patternId;            patternAttrs.id = patternId;            patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]);        }        attrs[target] = getIdURL(patternId);    }    function setClipPath(clipPath, attrs, scope) {        var clipPathCache = scope.clipPathCache, defs = scope.defs;        var clipPathId = clipPathCache[clipPath.id];        if (!clipPathId) {            clipPathId = scope.zrId + '-c' + scope.clipPathIdx++;            var clipPathAttrs = {                id: clipPathId            };            clipPathCache[clipPath.id] = clipPathId;            defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]);        }        attrs['clip-path'] = getIdURL(clipPathId);    }    function createTextNode(text) {        return document.createTextNode(text);    }    function insertBefore(parentNode, newNode, referenceNode) {        parentNode.insertBefore(newNode, referenceNode);    }    function removeChild(node, child) {        node.removeChild(child);    }    function appendChild(node, child) {        node.appendChild(child);    }    function parentNode(node) {        return node.parentNode;    }    function nextSibling(node) {        return node.nextSibling;    }    function setTextContent(node, text) {        node.textContent = text;    }    var colonChar = 58;    var xChar = 120;    var emptyNode = createVNode('', '');    function isUndef(s) {        return s === undefined;    }    function isDef(s) {        return s !== undefined;    }    function createKeyToOldIdx(children, beginIdx, endIdx) {        var map = {};        for (var i = beginIdx; i <= endIdx; ++i) {            var key = children[i].key;            if (key !== undefined) {                {                    if (map[key] != null) {                        console.error("Duplicate key " + key);                    }                }                map[key] = i;            }        }        return map;    }    function sameVnode(vnode1, vnode2) {        var isSameKey = vnode1.key === vnode2.key;        var isSameTag = vnode1.tag === vnode2.tag;        return isSameTag && isSameKey;    }    function createElm(vnode) {        var i;        var children = vnode.children;        var tag = vnode.tag;        if (isDef(tag)) {            var elm = (vnode.elm = createElement(tag));            updateAttrs(emptyNode, vnode);            if (isArray(children)) {                for (i = 0; i < children.length; ++i) {                    var ch = children[i];                    if (ch != null) {                        appendChild(elm, createElm(ch));                    }                }            }            else if (isDef(vnode.text) && !isObject(vnode.text)) {                appendChild(elm, createTextNode(vnode.text));            }        }        else {            vnode.elm = createTextNode(vnode.text);        }        return vnode.elm;    }    function addVnodes(parentElm, before, vnodes, startIdx, endIdx) {        for (; startIdx <= endIdx; ++startIdx) {            var ch = vnodes[startIdx];            if (ch != null) {                insertBefore(parentElm, createElm(ch), before);            }        }    }    function removeVnodes(parentElm, vnodes, startIdx, endIdx) {        for (; startIdx <= endIdx; ++startIdx) {            var ch = vnodes[startIdx];            if (ch != null) {                if (isDef(ch.tag)) {                    var parent_1 = parentNode(ch.elm);                    removeChild(parent_1, ch.elm);                }                else {                    removeChild(parentElm, ch.elm);                }            }        }    }    function updateAttrs(oldVnode, vnode) {        var key;        var elm = vnode.elm;        var oldAttrs = oldVnode && oldVnode.attrs || {};        var attrs = vnode.attrs || {};        if (oldAttrs === attrs) {            return;        }        for (key in attrs) {            var cur = attrs[key];            var old = oldAttrs[key];            if (old !== cur) {                if (cur === true) {                    elm.setAttribute(key, '');                }                else if (cur === false) {                    elm.removeAttribute(key);                }                else {                    if (key === 'style') {                        elm.style.cssText = cur;                    }                    else if (key.charCodeAt(0) !== xChar) {                        elm.setAttribute(key, cur);                    }                    else if (key === 'xmlns:xlink' || key === 'xmlns') {                        elm.setAttributeNS(XMLNS, key, cur);                    }                    else if (key.charCodeAt(3) === colonChar) {                        elm.setAttributeNS(XML_NAMESPACE, key, cur);                    }                    else if (key.charCodeAt(5) === colonChar) {                        elm.setAttributeNS(XLINKNS, key, cur);                    }                    else {                        elm.setAttribute(key, cur);                    }                }            }        }        for (key in oldAttrs) {            if (!(key in attrs)) {                elm.removeAttribute(key);            }        }    }    function updateChildren(parentElm, oldCh, newCh) {        var oldStartIdx = 0;        var newStartIdx = 0;        var oldEndIdx = oldCh.length - 1;        var oldStartVnode = oldCh[0];        var oldEndVnode = oldCh[oldEndIdx];        var newEndIdx = newCh.length - 1;        var newStartVnode = newCh[0];        var newEndVnode = newCh[newEndIdx];        var oldKeyToIdx;        var idxInOld;        var elmToMove;        var before;        while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {            if (oldStartVnode == null) {                oldStartVnode = oldCh[++oldStartIdx];            }            else if (oldEndVnode == null) {                oldEndVnode = oldCh[--oldEndIdx];            }            else if (newStartVnode == null) {                newStartVnode = newCh[++newStartIdx];            }            else if (newEndVnode == null) {                newEndVnode = newCh[--newEndIdx];            }            else if (sameVnode(oldStartVnode, newStartVnode)) {                patchVnode(oldStartVnode, newStartVnode);                oldStartVnode = oldCh[++oldStartIdx];                newStartVnode = newCh[++newStartIdx];            }            else if (sameVnode(oldEndVnode, newEndVnode)) {                patchVnode(oldEndVnode, newEndVnode);                oldEndVnode = oldCh[--oldEndIdx];                newEndVnode = newCh[--newEndIdx];            }            else if (sameVnode(oldStartVnode, newEndVnode)) {                patchVnode(oldStartVnode, newEndVnode);                insertBefore(parentElm, oldStartVnode.elm, nextSibling(oldEndVnode.elm));                oldStartVnode = oldCh[++oldStartIdx];                newEndVnode = newCh[--newEndIdx];            }            else if (sameVnode(oldEndVnode, newStartVnode)) {                patchVnode(oldEndVnode, newStartVnode);                insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);                oldEndVnode = oldCh[--oldEndIdx];                newStartVnode = newCh[++newStartIdx];            }            else {                if (isUndef(oldKeyToIdx)) {                    oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);                }                idxInOld = oldKeyToIdx[newStartVnode.key];                if (isUndef(idxInOld)) {                    insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);                }                else {                    elmToMove = oldCh[idxInOld];                    if (elmToMove.tag !== newStartVnode.tag) {                        insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);                    }                    else {                        patchVnode(elmToMove, newStartVnode);                        oldCh[idxInOld] = undefined;                        insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);                    }                }                newStartVnode = newCh[++newStartIdx];            }        }        if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {            if (oldStartIdx > oldEndIdx) {                before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;                addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx);            }            else {                removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);            }        }    }    function patchVnode(oldVnode, vnode) {        var elm = (vnode.elm = oldVnode.elm);        var oldCh = oldVnode.children;        var ch = vnode.children;        if (oldVnode === vnode) {            return;        }        updateAttrs(oldVnode, vnode);        if (isUndef(vnode.text)) {            if (isDef(oldCh) && isDef(ch)) {                if (oldCh !== ch) {                    updateChildren(elm, oldCh, ch);                }            }            else if (isDef(ch)) {                if (isDef(oldVnode.text)) {                    setTextContent(elm, '');                }                addVnodes(elm, null, ch, 0, ch.length - 1);            }            else if (isDef(oldCh)) {                removeVnodes(elm, oldCh, 0, oldCh.length - 1);            }            else if (isDef(oldVnode.text)) {                setTextContent(elm, '');            }        }        else if (oldVnode.text !== vnode.text) {            if (isDef(oldCh)) {                removeVnodes(elm, oldCh, 0, oldCh.length - 1);            }            setTextContent(elm, vnode.text);        }    }    function patch(oldVnode, vnode) {        if (sameVnode(oldVnode, vnode)) {            patchVnode(oldVnode, vnode);        }        else {            var elm = oldVnode.elm;            var parent_2 = parentNode(elm);            createElm(vnode);            if (parent_2 !== null) {                insertBefore(parent_2, vnode.elm, nextSibling(elm));                removeVnodes(parent_2, [oldVnode], 0, 0);            }        }        return vnode;    }    var svgId = 0;    var SVGPainter = (function () {        function SVGPainter(root, storage, opts) {            this.type = 'svg';            this.refreshHover = createMethodNotSupport('refreshHover');            this.configLayer = createMethodNotSupport('configLayer');            this.storage = storage;            this._opts = opts = extend({}, opts);            this.root = root;            this._id = 'zr' + svgId++;            this._oldVNode = createSVGVNode(opts.width, opts.height);            if (root && !opts.ssr) {                var viewport = this._viewport = document.createElement('div');                viewport.style.cssText = 'position:relative;overflow:hidden';                var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg');                updateAttrs(null, this._oldVNode);                viewport.appendChild(svgDom);                root.appendChild(viewport);            }            this.resize(opts.width, opts.height);        }        SVGPainter.prototype.getType = function () {            return this.type;        };        SVGPainter.prototype.getViewportRoot = function () {            return this._viewport;        };        SVGPainter.prototype.getViewportRootOffset = function () {            var viewportRoot = this.getViewportRoot();            if (viewportRoot) {                return {                    offsetLeft: viewportRoot.offsetLeft || 0,                    offsetTop: viewportRoot.offsetTop || 0                };            }        };        SVGPainter.prototype.getSvgDom = function () {            return this._svgDom;        };        SVGPainter.prototype.refresh = function () {            if (this.root) {                var vnode = this.renderToVNode({                    willUpdate: true                });                vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none';                patch(this._oldVNode, vnode);                this._oldVNode = vnode;            }        };        SVGPainter.prototype.renderOneToVNode = function (el) {            return brush$1(el, createBrushScope(this._id));        };        SVGPainter.prototype.renderToVNode = function (opts) {            opts = opts || {};            var list = this.storage.getDisplayList(true);            var width = this._width;            var height = this._height;            var scope = createBrushScope(this._id);            scope.animation = opts.animation;            scope.willUpdate = opts.willUpdate;            scope.compress = opts.compress;            scope.emphasis = opts.emphasis;            var children = [];            var bgVNode = this._bgVNode = createBackgroundVNode(width, height, this._backgroundColor, scope);            bgVNode && children.push(bgVNode);            var mainVNode = !opts.compress                ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null;            this._paintList(list, scope, mainVNode ? mainVNode.children : children);            mainVNode && children.push(mainVNode);            var defs = map(keys(scope.defs), function (id) { return scope.defs[id]; });            if (defs.length) {                children.push(createVNode('defs', 'defs', {}, defs));            }            if (opts.animation) {                var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, { newline: true });                if (animationCssStr) {                    var styleNode = createVNode('style', 'stl', {}, [], animationCssStr);                    children.push(styleNode);                }            }            return createSVGVNode(width, height, children, opts.useViewBox);        };        SVGPainter.prototype.renderToString = function (opts) {            opts = opts || {};            return vNodeToString(this.renderToVNode({                animation: retrieve2(opts.cssAnimation, true),                emphasis: retrieve2(opts.cssEmphasis, true),                willUpdate: false,                compress: true,                useViewBox: retrieve2(opts.useViewBox, true)            }), { newline: true });        };        SVGPainter.prototype.setBackgroundColor = function (backgroundColor) {            this._backgroundColor = backgroundColor;        };        SVGPainter.prototype.getSvgRoot = function () {            return this._mainVNode && this._mainVNode.elm;        };        SVGPainter.prototype._paintList = function (list, scope, out) {            var listLen = list.length;            var clipPathsGroupsStack = [];            var clipPathsGroupsStackDepth = 0;            var currentClipPathGroup;            var prevClipPaths;            var clipGroupNodeIdx = 0;            for (var i = 0; i < listLen; i++) {                var displayable = list[i];                if (!displayable.invisible) {                    var clipPaths = displayable.__clipPaths;                    var len = clipPaths && clipPaths.length || 0;                    var prevLen = prevClipPaths && prevClipPaths.length || 0;                    var lca = void 0;                    for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) {                        if (clipPaths && prevClipPaths                            && clipPaths[lca] === prevClipPaths[lca]) {                            break;                        }                    }                    for (var i_1 = prevLen - 1; i_1 > lca; i_1--) {                        clipPathsGroupsStackDepth--;                        currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1];                    }                    for (var i_2 = lca + 1; i_2 < len; i_2++) {                        var groupAttrs = {};                        setClipPath(clipPaths[i_2], groupAttrs, scope);                        var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []);                        (currentClipPathGroup ? currentClipPathGroup.children : out).push(g);                        clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g;                        currentClipPathGroup = g;                    }                    prevClipPaths = clipPaths;                    var ret = brush$1(displayable, scope);                    if (ret) {                        (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret);                    }                }            }        };        SVGPainter.prototype.resize = function (width, height) {            var opts = this._opts;            var root = this.root;            var viewport = this._viewport;            width != null && (opts.width = width);            height != null && (opts.height = height);            if (root && viewport) {                viewport.style.display = 'none';                width = getSize(root, 0, opts);                height = getSize(root, 1, opts);                viewport.style.display = '';            }            if (this._width !== width || this._height !== height) {                this._width = width;                this._height = height;                if (viewport) {                    var viewportStyle = viewport.style;                    viewportStyle.width = width + 'px';                    viewportStyle.height = height + 'px';                }                if (!isPattern(this._backgroundColor)) {                    var svgDom = this._svgDom;                    if (svgDom) {                        svgDom.setAttribute('width', width);                        svgDom.setAttribute('height', height);                    }                    var bgEl = this._bgVNode && this._bgVNode.elm;                    if (bgEl) {                        bgEl.setAttribute('width', width);                        bgEl.setAttribute('height', height);                    }                }                else {                    this.refresh();                }            }        };        SVGPainter.prototype.getWidth = function () {            return this._width;        };        SVGPainter.prototype.getHeight = function () {            return this._height;        };        SVGPainter.prototype.dispose = function () {            if (this.root) {                this.root.innerHTML = '';            }            this._svgDom =                this._viewport =                    this.storage =                        this._oldVNode =                            this._bgVNode =                                this._mainVNode = null;        };        SVGPainter.prototype.clear = function () {            if (this._svgDom) {                this._svgDom.innerHTML = null;            }            this._oldVNode = null;        };        SVGPainter.prototype.toDataURL = function (base64) {            var str = this.renderToString();            var prefix = 'data:image/svg+xml;';            if (base64) {                str = encodeBase64(str);                return str && prefix + 'base64,' + str;            }            return prefix + 'charset=UTF-8,' + encodeURIComponent(str);        };        return SVGPainter;    }());    function createMethodNotSupport(method) {        return function () {            {                logError('In SVG mode painter not support method "' + method + '"');            }        };    }    function createBackgroundVNode(width, height, backgroundColor, scope) {        var bgVNode;        if (backgroundColor && backgroundColor !== 'none') {            bgVNode = createVNode('rect', 'bg', {                width: width,                height: height,                x: '0',                y: '0'            });            if (isGradient(backgroundColor)) {                setGradient({ fill: backgroundColor }, bgVNode.attrs, 'fill', scope);            }            else if (isPattern(backgroundColor)) {                setPattern({                    style: {                        fill: backgroundColor                    },                    dirty: noop,                    getBoundingRect: function () { return ({ width: width, height: height }); }                }, bgVNode.attrs, 'fill', scope);            }            else {                var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity;                bgVNode.attrs.fill = color;                opacity < 1 && (bgVNode.attrs['fill-opacity'] = opacity);            }        }        return bgVNode;    }    registerPainter('canvas', CanvasPainter);    registerPainter('svg', SVGPainter);    exports.Arc = Arc;    exports.ArcShape = ArcShape;    exports.BezierCurve = BezierCurve;    exports.BezierCurveShape = BezierCurveShape;    exports.BoundingRect = BoundingRect;    exports.Circle = Circle;    exports.CircleShape = CircleShape;    exports.CompoundPath = CompoundPath;    exports.Displayable = Displayable;    exports.Droplet = Droplet;    exports.DropletShape = DropletShape;    exports.Element = Element;    exports.Ellipse = Ellipse;    exports.EllipseShape = EllipseShape;    exports.Group = Group;    exports.Heart = Heart;    exports.HeartShape = HeartShape;    exports.Image = ZRImage;    exports.IncrementalDisplayable = IncrementalDisplayable;    exports.Isogon = Isogon;    exports.IsogonShape = IsogonShape;    exports.Line = Line;    exports.LineShape = LineShape;    exports.LinearGradient = LinearGradient;    exports.OrientedBoundingRect = OrientedBoundingRect;    exports.Path = Path;    exports.Pattern = Pattern;    exports.Point = Point;    exports.Polygon = Polygon;    exports.PolygonShape = PolygonShape;    exports.Polyline = Polyline;    exports.PolylineShape = PolylineShape;    exports.RadialGradient = RadialGradient;    exports.Rect = Rect;    exports.RectShape = RectShape;    exports.Ring = Ring;    exports.RingShape = RingShape;    exports.Rose = Rose;    exports.RoseShape = RoseShape;    exports.Sector = Sector;    exports.SectorShape = SectorShape;    exports.Star = Star;    exports.StarShape = StarShape;    exports.TSpan = TSpan;    exports.Text = ZRText;    exports.Trochoid = Trochoid;    exports.TrochoidShape = TrochoidShape;    exports.color = color;    exports.dispose = dispose;    exports.disposeAll = disposeAll;    exports.getElementSSRData = getElementSSRData;    exports.getInstance = getInstance;    exports.init = init;    exports.matrix = matrix;    exports.morph = morphPath$1;    exports.parseSVG = parseSVG;    exports.path = path;    exports.registerPainter = registerPainter;    exports.registerSSRDataGetter = registerSSRDataGetter;    exports.setPlatformAPI = setPlatformAPI;    exports.showDebugDirtyRect = showDebugDirtyRect;    exports.util = util;    exports.vector = vector;    exports.version = version;    Object.defineProperty(exports, '__esModule', { value: true });})));//# sourceMappingURL=zrender.js.map
 |