12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620626216262262623626246262562626626276262862629626306263162632626336263462635626366263762638626396264062641626426264362644626456264662647626486264962650626516265262653626546265562656626576265862659626606266162662626636266462665626666266762668626696267062671626726267362674626756267662677626786267962680626816268262683626846268562686626876268862689626906269162692626936269462695626966269762698626996270062701627026270362704627056270662707627086270962710627116271262713627146271562716627176271862719627206272162722627236272462725627266272762728627296273062731627326273362734627356273662737627386273962740627416274262743627446274562746627476274862749627506275162752627536275462755627566275762758627596276062761627626276362764627656276662767627686276962770627716277262773627746277562776627776277862779627806278162782627836278462785627866278762788627896279062791627926279362794627956279662797627986279962800628016280262803628046280562806628076280862809628106281162812628136281462815628166281762818628196282062821628226282362824628256282662827628286282962830628316283262833628346283562836628376283862839628406284162842628436284462845628466284762848628496285062851628526285362854628556285662857628586285962860628616286262863628646286562866628676286862869628706287162872628736287462875628766287762878628796288062881628826288362884628856288662887628886288962890628916289262893628946289562896628976289862899629006290162902629036290462905629066290762908629096291062911629126291362914629156291662917629186291962920629216292262923629246292562926629276292862929629306293162932629336293462935629366293762938629396294062941629426294362944629456294662947629486294962950629516295262953629546295562956629576295862959629606296162962629636296462965629666296762968629696297062971629726297362974629756297662977629786297962980629816298262983629846298562986629876298862989629906299162992629936299462995629966299762998629996300063001630026300363004630056300663007630086300963010630116301263013630146301563016630176301863019630206302163022630236302463025630266302763028630296303063031630326303363034630356303663037630386303963040630416304263043630446304563046630476304863049630506305163052630536305463055630566305763058630596306063061630626306363064630656306663067630686306963070630716307263073630746307563076630776307863079630806308163082630836308463085630866308763088630896309063091630926309363094630956309663097630986309963100631016310263103631046310563106631076310863109631106311163112631136311463115631166311763118631196312063121631226312363124631256312663127631286312963130631316313263133631346313563136631376313863139631406314163142631436314463145631466314763148631496315063151631526315363154631556315663157631586315963160631616316263163631646316563166631676316863169631706317163172631736317463175631766317763178631796318063181631826318363184631856318663187631886318963190631916319263193631946319563196631976319863199632006320163202632036320463205632066320763208632096321063211632126321363214632156321663217632186321963220632216322263223632246322563226632276322863229632306323163232632336323463235632366323763238632396324063241632426324363244632456324663247632486324963250632516325263253632546325563256632576325863259632606326163262632636326463265632666326763268632696327063271632726327363274632756327663277632786327963280632816328263283632846328563286632876328863289632906329163292632936329463295632966329763298632996330063301633026330363304633056330663307633086330963310633116331263313633146331563316633176331863319633206332163322633236332463325633266332763328633296333063331633326333363334633356333663337633386333963340633416334263343633446334563346633476334863349633506335163352633536335463355633566335763358633596336063361633626336363364633656336663367633686336963370633716337263373633746337563376633776337863379633806338163382633836338463385633866338763388633896339063391633926339363394633956339663397633986339963400634016340263403634046340563406634076340863409634106341163412634136341463415634166341763418634196342063421634226342363424634256342663427634286342963430634316343263433634346343563436634376343863439634406344163442634436344463445634466344763448634496345063451634526345363454634556345663457634586345963460634616346263463634646346563466634676346863469634706347163472634736347463475634766347763478634796348063481634826348363484634856348663487634886348963490634916349263493634946349563496634976349863499635006350163502635036350463505635066350763508635096351063511635126351363514635156351663517635186351963520635216352263523635246352563526635276352863529635306353163532635336353463535635366353763538635396354063541635426354363544635456354663547635486354963550635516355263553635546355563556635576355863559635606356163562635636356463565635666356763568635696357063571635726357363574635756357663577635786357963580635816358263583635846358563586635876358863589635906359163592635936359463595635966359763598635996360063601636026360363604636056360663607636086360963610636116361263613636146361563616636176361863619636206362163622636236362463625636266362763628636296363063631636326363363634636356363663637636386363963640636416364263643636446364563646636476364863649636506365163652636536365463655636566365763658636596366063661636626366363664636656366663667636686366963670636716367263673636746367563676636776367863679636806368163682636836368463685636866368763688636896369063691636926369363694636956369663697636986369963700637016370263703637046370563706637076370863709637106371163712637136371463715637166371763718637196372063721637226372363724637256372663727637286372963730637316373263733637346373563736637376373863739637406374163742637436374463745637466374763748637496375063751637526375363754637556375663757637586375963760637616376263763637646376563766637676376863769637706377163772637736377463775637766377763778637796378063781637826378363784637856378663787637886378963790637916379263793637946379563796637976379863799638006380163802638036380463805638066380763808638096381063811638126381363814638156381663817638186381963820638216382263823638246382563826638276382863829638306383163832638336383463835638366383763838638396384063841638426384363844638456384663847638486384963850638516385263853638546385563856638576385863859638606386163862638636386463865638666386763868638696387063871638726387363874638756387663877638786387963880638816388263883638846388563886638876388863889638906389163892638936389463895638966389763898638996390063901639026390363904639056390663907639086390963910639116391263913639146391563916639176391863919639206392163922639236392463925639266392763928639296393063931639326393363934639356393663937639386393963940639416394263943639446394563946639476394863949639506395163952639536395463955639566395763958639596396063961639626396363964639656396663967639686396963970639716397263973639746397563976639776397863979639806398163982639836398463985639866398763988639896399063991639926399363994639956399663997639986399964000640016400264003640046400564006640076400864009640106401164012640136401464015640166401764018640196402064021640226402364024640256402664027640286402964030640316403264033640346403564036640376403864039640406404164042640436404464045640466404764048640496405064051640526405364054640556405664057640586405964060640616406264063640646406564066640676406864069640706407164072640736407464075640766407764078640796408064081640826408364084640856408664087640886408964090640916409264093640946409564096640976409864099641006410164102641036410464105641066410764108641096411064111641126411364114641156411664117641186411964120641216412264123641246412564126641276412864129641306413164132641336413464135641366413764138641396414064141641426414364144641456414664147641486414964150641516415264153641546415564156641576415864159641606416164162641636416464165641666416764168641696417064171641726417364174641756417664177641786417964180641816418264183641846418564186641876418864189641906419164192641936419464195641966419764198641996420064201642026420364204642056420664207642086420964210642116421264213642146421564216642176421864219642206422164222642236422464225642266422764228642296423064231642326423364234642356423664237642386423964240642416424264243642446424564246642476424864249642506425164252642536425464255642566425764258642596426064261642626426364264642656426664267642686426964270642716427264273642746427564276642776427864279642806428164282642836428464285642866428764288642896429064291642926429364294642956429664297642986429964300643016430264303643046430564306643076430864309643106431164312643136431464315643166431764318643196432064321643226432364324643256432664327643286432964330643316433264333643346433564336643376433864339643406434164342643436434464345643466434764348643496435064351643526435364354643556435664357643586435964360643616436264363643646436564366643676436864369643706437164372643736437464375643766437764378643796438064381643826438364384643856438664387643886438964390643916439264393643946439564396643976439864399644006440164402644036440464405644066440764408644096441064411644126441364414644156441664417644186441964420644216442264423644246442564426644276442864429644306443164432644336443464435644366443764438644396444064441644426444364444644456444664447644486444964450644516445264453644546445564456644576445864459644606446164462644636446464465644666446764468644696447064471644726447364474644756447664477644786447964480644816448264483644846448564486644876448864489644906449164492644936449464495644966449764498644996450064501645026450364504645056450664507645086450964510645116451264513645146451564516645176451864519645206452164522645236452464525645266452764528645296453064531645326453364534645356453664537645386453964540645416454264543645446454564546645476454864549645506455164552645536455464555645566455764558645596456064561645626456364564645656456664567645686456964570645716457264573645746457564576645776457864579645806458164582645836458464585645866458764588645896459064591645926459364594645956459664597645986459964600646016460264603646046460564606646076460864609646106461164612646136461464615646166461764618646196462064621646226462364624646256462664627646286462964630646316463264633646346463564636646376463864639646406464164642646436464464645646466464764648646496465064651646526465364654646556465664657646586465964660646616466264663646646466564666646676466864669646706467164672646736467464675646766467764678646796468064681646826468364684646856468664687646886468964690646916469264693646946469564696646976469864699647006470164702647036470464705647066470764708647096471064711647126471364714647156471664717647186471964720647216472264723647246472564726647276472864729647306473164732647336473464735647366473764738647396474064741647426474364744647456474664747647486474964750647516475264753647546475564756647576475864759647606476164762647636476464765647666476764768647696477064771647726477364774647756477664777647786477964780647816478264783647846478564786647876478864789647906479164792647936479464795647966479764798647996480064801648026480364804648056480664807648086480964810648116481264813648146481564816648176481864819648206482164822648236482464825648266482764828648296483064831648326483364834648356483664837648386483964840648416484264843648446484564846648476484864849648506485164852648536485464855648566485764858648596486064861648626486364864648656486664867648686486964870648716487264873648746487564876648776487864879648806488164882648836488464885648866488764888648896489064891648926489364894648956489664897648986489964900649016490264903649046490564906649076490864909649106491164912649136491464915649166491764918649196492064921649226492364924649256492664927649286492964930649316493264933649346493564936649376493864939649406494164942649436494464945649466494764948649496495064951649526495364954649556495664957649586495964960649616496264963649646496564966649676496864969649706497164972649736497464975649766497764978649796498064981649826498364984649856498664987649886498964990649916499264993649946499564996649976499864999650006500165002650036500465005650066500765008650096501065011650126501365014650156501665017650186501965020650216502265023650246502565026650276502865029650306503165032650336503465035650366503765038650396504065041650426504365044650456504665047650486504965050650516505265053650546505565056650576505865059650606506165062650636506465065650666506765068650696507065071650726507365074650756507665077650786507965080650816508265083650846508565086650876508865089650906509165092650936509465095650966509765098650996510065101651026510365104651056510665107651086510965110651116511265113651146511565116651176511865119651206512165122651236512465125651266512765128651296513065131651326513365134651356513665137651386513965140651416514265143651446514565146651476514865149651506515165152651536515465155651566515765158651596516065161651626516365164651656516665167651686516965170651716517265173651746517565176651776517865179651806518165182651836518465185651866518765188651896519065191651926519365194651956519665197651986519965200652016520265203652046520565206652076520865209652106521165212652136521465215652166521765218652196522065221652226522365224652256522665227652286522965230652316523265233652346523565236652376523865239652406524165242652436524465245652466524765248652496525065251652526525365254652556525665257652586525965260652616526265263652646526565266652676526865269652706527165272652736527465275652766527765278652796528065281652826528365284652856528665287652886528965290652916529265293652946529565296652976529865299653006530165302653036530465305653066530765308653096531065311653126531365314653156531665317653186531965320653216532265323653246532565326653276532865329653306533165332653336533465335653366533765338653396534065341653426534365344653456534665347653486534965350653516535265353653546535565356653576535865359653606536165362653636536465365653666536765368653696537065371653726537365374653756537665377653786537965380653816538265383653846538565386653876538865389653906539165392653936539465395653966539765398653996540065401654026540365404654056540665407654086540965410654116541265413654146541565416654176541865419654206542165422654236542465425654266542765428654296543065431654326543365434654356543665437654386543965440654416544265443654446544565446654476544865449654506545165452654536545465455654566545765458654596546065461654626546365464654656546665467654686546965470654716547265473654746547565476654776547865479654806548165482654836548465485654866548765488654896549065491654926549365494654956549665497654986549965500655016550265503655046550565506655076550865509655106551165512655136551465515655166551765518655196552065521655226552365524655256552665527655286552965530655316553265533655346553565536655376553865539655406554165542655436554465545655466554765548655496555065551655526555365554655556555665557655586555965560655616556265563655646556565566655676556865569655706557165572655736557465575655766557765578655796558065581655826558365584655856558665587655886558965590655916559265593655946559565596655976559865599656006560165602656036560465605656066560765608656096561065611656126561365614656156561665617656186561965620656216562265623656246562565626656276562865629656306563165632656336563465635656366563765638656396564065641656426564365644656456564665647656486564965650656516565265653656546565565656656576565865659656606566165662656636566465665656666566765668656696567065671656726567365674656756567665677656786567965680656816568265683656846568565686656876568865689656906569165692656936569465695656966569765698656996570065701657026570365704657056570665707657086570965710657116571265713657146571565716657176571865719657206572165722657236572465725657266572765728657296573065731657326573365734657356573665737657386573965740657416574265743657446574565746657476574865749657506575165752657536575465755657566575765758657596576065761657626576365764657656576665767657686576965770657716577265773657746577565776657776577865779657806578165782657836578465785657866578765788657896579065791657926579365794657956579665797657986579965800658016580265803658046580565806658076580865809658106581165812658136581465815658166581765818658196582065821658226582365824658256582665827658286582965830658316583265833658346583565836658376583865839658406584165842658436584465845658466584765848658496585065851658526585365854658556585665857658586585965860658616586265863658646586565866658676586865869658706587165872658736587465875658766587765878658796588065881658826588365884658856588665887658886588965890658916589265893658946589565896658976589865899659006590165902659036590465905659066590765908659096591065911659126591365914659156591665917659186591965920659216592265923659246592565926659276592865929659306593165932659336593465935659366593765938659396594065941659426594365944659456594665947659486594965950659516595265953659546595565956659576595865959659606596165962659636596465965659666596765968659696597065971659726597365974659756597665977659786597965980659816598265983659846598565986659876598865989659906599165992659936599465995659966599765998659996600066001660026600366004660056600666007660086600966010660116601266013660146601566016660176601866019660206602166022660236602466025660266602766028660296603066031660326603366034660356603666037660386603966040660416604266043660446604566046660476604866049660506605166052660536605466055660566605766058660596606066061660626606366064660656606666067660686606966070660716607266073660746607566076660776607866079660806608166082660836608466085660866608766088660896609066091660926609366094660956609666097660986609966100661016610266103661046610566106661076610866109661106611166112661136611466115661166611766118661196612066121661226612366124661256612666127661286612966130661316613266133661346613566136661376613866139661406614166142661436614466145661466614766148661496615066151661526615366154661556615666157661586615966160661616616266163661646616566166661676616866169661706617166172661736617466175661766617766178661796618066181661826618366184661856618666187661886618966190661916619266193661946619566196661976619866199662006620166202662036620466205662066620766208662096621066211662126621366214662156621666217662186621966220662216622266223662246622566226662276622866229662306623166232662336623466235662366623766238662396624066241662426624366244662456624666247662486624966250662516625266253662546625566256662576625866259662606626166262662636626466265662666626766268662696627066271662726627366274662756627666277662786627966280662816628266283662846628566286662876628866289662906629166292662936629466295662966629766298662996630066301663026630366304663056630666307663086630966310663116631266313663146631566316663176631866319663206632166322663236632466325663266632766328663296633066331663326633366334663356633666337663386633966340663416634266343663446634566346663476634866349663506635166352663536635466355663566635766358663596636066361663626636366364663656636666367663686636966370663716637266373663746637566376663776637866379663806638166382663836638466385663866638766388663896639066391663926639366394663956639666397663986639966400664016640266403664046640566406664076640866409664106641166412664136641466415664166641766418664196642066421664226642366424664256642666427664286642966430664316643266433664346643566436664376643866439664406644166442664436644466445664466644766448664496645066451664526645366454664556645666457664586645966460664616646266463664646646566466664676646866469664706647166472664736647466475664766647766478664796648066481664826648366484664856648666487664886648966490664916649266493664946649566496664976649866499665006650166502665036650466505665066650766508665096651066511665126651366514665156651666517665186651966520665216652266523665246652566526665276652866529665306653166532665336653466535665366653766538665396654066541665426654366544665456654666547665486654966550665516655266553665546655566556665576655866559665606656166562665636656466565665666656766568665696657066571665726657366574665756657666577665786657966580665816658266583665846658566586665876658866589665906659166592665936659466595665966659766598665996660066601666026660366604666056660666607666086660966610666116661266613666146661566616666176661866619666206662166622666236662466625666266662766628666296663066631666326663366634666356663666637666386663966640666416664266643666446664566646666476664866649666506665166652666536665466655666566665766658666596666066661666626666366664666656666666667666686666966670666716667266673666746667566676666776667866679666806668166682666836668466685666866668766688666896669066691666926669366694666956669666697666986669966700667016670266703667046670566706667076670866709667106671166712667136671466715667166671766718667196672066721667226672366724667256672666727667286672966730667316673266733667346673566736667376673866739667406674166742667436674466745667466674766748667496675066751667526675366754667556675666757667586675966760667616676266763667646676566766667676676866769667706677166772667736677466775667766677766778667796678066781667826678366784667856678666787667886678966790667916679266793667946679566796667976679866799668006680166802668036680466805668066680766808668096681066811668126681366814668156681666817668186681966820668216682266823668246682566826668276682866829668306683166832668336683466835668366683766838668396684066841668426684366844668456684666847668486684966850668516685266853668546685566856668576685866859668606686166862668636686466865668666686766868668696687066871668726687366874668756687666877668786687966880668816688266883668846688566886668876688866889668906689166892668936689466895668966689766898668996690066901669026690366904669056690666907669086690966910669116691266913669146691566916669176691866919669206692166922669236692466925669266692766928669296693066931669326693366934669356693666937669386693966940669416694266943669446694566946669476694866949669506695166952669536695466955669566695766958669596696066961669626696366964669656696666967669686696966970669716697266973669746697566976669776697866979669806698166982669836698466985669866698766988669896699066991669926699366994669956699666997669986699967000670016700267003670046700567006670076700867009670106701167012670136701467015670166701767018670196702067021670226702367024670256702667027670286702967030670316703267033670346703567036670376703867039670406704167042670436704467045670466704767048670496705067051670526705367054670556705667057670586705967060670616706267063670646706567066670676706867069670706707167072670736707467075670766707767078670796708067081670826708367084670856708667087670886708967090670916709267093670946709567096670976709867099671006710167102671036710467105671066710767108671096711067111671126711367114671156711667117671186711967120671216712267123671246712567126671276712867129671306713167132671336713467135671366713767138671396714067141671426714367144671456714667147671486714967150671516715267153671546715567156671576715867159671606716167162671636716467165671666716767168671696717067171671726717367174671756717667177671786717967180671816718267183671846718567186671876718867189671906719167192671936719467195671966719767198671996720067201672026720367204672056720667207672086720967210672116721267213672146721567216672176721867219672206722167222672236722467225672266722767228672296723067231672326723367234672356723667237672386723967240672416724267243672446724567246672476724867249672506725167252672536725467255672566725767258672596726067261672626726367264672656726667267672686726967270672716727267273672746727567276672776727867279672806728167282672836728467285672866728767288672896729067291672926729367294672956729667297672986729967300673016730267303673046730567306673076730867309673106731167312673136731467315673166731767318673196732067321673226732367324673256732667327673286732967330673316733267333673346733567336673376733867339673406734167342673436734467345673466734767348673496735067351673526735367354673556735667357673586735967360673616736267363673646736567366673676736867369673706737167372673736737467375673766737767378673796738067381673826738367384673856738667387673886738967390673916739267393673946739567396673976739867399674006740167402674036740467405674066740767408674096741067411674126741367414674156741667417674186741967420674216742267423674246742567426674276742867429674306743167432674336743467435674366743767438674396744067441674426744367444674456744667447674486744967450674516745267453674546745567456674576745867459674606746167462674636746467465674666746767468674696747067471674726747367474674756747667477674786747967480674816748267483674846748567486674876748867489674906749167492674936749467495674966749767498674996750067501675026750367504675056750667507675086750967510675116751267513675146751567516675176751867519675206752167522675236752467525675266752767528675296753067531675326753367534675356753667537675386753967540675416754267543675446754567546675476754867549675506755167552675536755467555675566755767558675596756067561675626756367564675656756667567675686756967570675716757267573675746757567576675776757867579675806758167582675836758467585675866758767588675896759067591675926759367594675956759667597675986759967600676016760267603676046760567606676076760867609676106761167612676136761467615676166761767618676196762067621676226762367624676256762667627676286762967630676316763267633676346763567636676376763867639676406764167642676436764467645676466764767648676496765067651676526765367654676556765667657676586765967660676616766267663676646766567666676676766867669676706767167672676736767467675676766767767678676796768067681676826768367684676856768667687676886768967690676916769267693676946769567696676976769867699677006770167702677036770467705677066770767708677096771067711677126771367714677156771667717677186771967720677216772267723677246772567726677276772867729677306773167732677336773467735677366773767738677396774067741677426774367744677456774667747677486774967750677516775267753677546775567756677576775867759677606776167762677636776467765677666776767768677696777067771677726777367774677756777667777677786777967780677816778267783677846778567786677876778867789677906779167792677936779467795677966779767798677996780067801678026780367804678056780667807678086780967810678116781267813678146781567816678176781867819678206782167822678236782467825678266782767828678296783067831678326783367834678356783667837678386783967840678416784267843678446784567846678476784867849678506785167852678536785467855678566785767858678596786067861678626786367864678656786667867678686786967870678716787267873678746787567876678776787867879678806788167882678836788467885678866788767888678896789067891678926789367894678956789667897678986789967900679016790267903679046790567906679076790867909679106791167912679136791467915679166791767918679196792067921679226792367924679256792667927679286792967930679316793267933679346793567936679376793867939679406794167942679436794467945679466794767948679496795067951679526795367954679556795667957679586795967960679616796267963679646796567966679676796867969679706797167972679736797467975679766797767978679796798067981679826798367984679856798667987679886798967990679916799267993679946799567996679976799867999680006800168002680036800468005680066800768008680096801068011680126801368014680156801668017680186801968020680216802268023680246802568026680276802868029680306803168032680336803468035680366803768038680396804068041680426804368044680456804668047680486804968050680516805268053680546805568056680576805868059680606806168062680636806468065680666806768068680696807068071680726807368074680756807668077680786807968080680816808268083680846808568086680876808868089680906809168092680936809468095680966809768098680996810068101681026810368104681056810668107681086810968110681116811268113681146811568116681176811868119681206812168122681236812468125681266812768128681296813068131681326813368134681356813668137681386813968140681416814268143681446814568146681476814868149681506815168152681536815468155681566815768158681596816068161681626816368164681656816668167681686816968170681716817268173681746817568176681776817868179681806818168182681836818468185681866818768188681896819068191681926819368194681956819668197681986819968200682016820268203682046820568206682076820868209682106821168212682136821468215682166821768218682196822068221682226822368224682256822668227682286822968230682316823268233682346823568236682376823868239682406824168242682436824468245682466824768248682496825068251682526825368254682556825668257682586825968260682616826268263682646826568266682676826868269682706827168272682736827468275682766827768278682796828068281682826828368284682856828668287682886828968290682916829268293682946829568296682976829868299683006830168302683036830468305683066830768308683096831068311683126831368314683156831668317683186831968320683216832268323683246832568326683276832868329683306833168332683336833468335683366833768338683396834068341683426834368344683456834668347683486834968350683516835268353683546835568356683576835868359683606836168362683636836468365683666836768368683696837068371683726837368374683756837668377683786837968380683816838268383683846838568386683876838868389683906839168392683936839468395683966839768398683996840068401684026840368404684056840668407684086840968410684116841268413684146841568416684176841868419684206842168422684236842468425684266842768428684296843068431684326843368434684356843668437684386843968440684416844268443684446844568446684476844868449684506845168452684536845468455684566845768458684596846068461684626846368464684656846668467684686846968470684716847268473684746847568476684776847868479684806848168482684836848468485684866848768488684896849068491684926849368494684956849668497684986849968500685016850268503685046850568506685076850868509685106851168512685136851468515685166851768518685196852068521685226852368524685256852668527685286852968530685316853268533685346853568536685376853868539685406854168542685436854468545685466854768548685496855068551685526855368554685556855668557685586855968560685616856268563685646856568566685676856868569685706857168572685736857468575685766857768578685796858068581685826858368584685856858668587685886858968590685916859268593685946859568596685976859868599686006860168602686036860468605686066860768608686096861068611686126861368614686156861668617686186861968620686216862268623686246862568626686276862868629686306863168632686336863468635686366863768638686396864068641686426864368644686456864668647686486864968650686516865268653686546865568656686576865868659686606866168662686636866468665686666866768668686696867068671686726867368674686756867668677686786867968680686816868268683686846868568686686876868868689686906869168692686936869468695686966869768698686996870068701687026870368704687056870668707687086870968710687116871268713687146871568716687176871868719687206872168722687236872468725687266872768728687296873068731687326873368734687356873668737687386873968740687416874268743687446874568746687476874868749687506875168752687536875468755687566875768758687596876068761687626876368764687656876668767687686876968770687716877268773687746877568776687776877868779687806878168782687836878468785687866878768788687896879068791687926879368794687956879668797687986879968800688016880268803688046880568806688076880868809688106881168812688136881468815688166881768818688196882068821688226882368824688256882668827688286882968830688316883268833688346883568836688376883868839688406884168842688436884468845688466884768848688496885068851688526885368854688556885668857688586885968860688616886268863688646886568866688676886868869688706887168872688736887468875688766887768878688796888068881688826888368884688856888668887688886888968890688916889268893688946889568896688976889868899689006890168902689036890468905689066890768908689096891068911689126891368914689156891668917689186891968920689216892268923689246892568926689276892868929689306893168932689336893468935689366893768938689396894068941689426894368944689456894668947689486894968950689516895268953689546895568956689576895868959689606896168962689636896468965689666896768968689696897068971689726897368974689756897668977689786897968980689816898268983689846898568986689876898868989689906899168992689936899468995689966899768998689996900069001690026900369004690056900669007690086900969010690116901269013690146901569016690176901869019690206902169022690236902469025690266902769028690296903069031690326903369034690356903669037690386903969040690416904269043690446904569046690476904869049690506905169052690536905469055690566905769058690596906069061690626906369064690656906669067690686906969070690716907269073690746907569076690776907869079690806908169082690836908469085690866908769088690896909069091690926909369094690956909669097690986909969100691016910269103691046910569106691076910869109691106911169112691136911469115691166911769118691196912069121691226912369124691256912669127691286912969130691316913269133691346913569136691376913869139691406914169142691436914469145691466914769148691496915069151691526915369154691556915669157691586915969160691616916269163691646916569166691676916869169691706917169172691736917469175691766917769178691796918069181691826918369184691856918669187691886918969190691916919269193691946919569196691976919869199692006920169202692036920469205692066920769208692096921069211692126921369214692156921669217692186921969220692216922269223692246922569226692276922869229692306923169232692336923469235692366923769238692396924069241692426924369244692456924669247692486924969250692516925269253692546925569256692576925869259692606926169262692636926469265692666926769268692696927069271692726927369274692756927669277692786927969280692816928269283692846928569286692876928869289692906929169292692936929469295692966929769298692996930069301693026930369304693056930669307693086930969310693116931269313693146931569316693176931869319693206932169322693236932469325693266932769328693296933069331693326933369334693356933669337693386933969340693416934269343693446934569346693476934869349693506935169352693536935469355693566935769358693596936069361693626936369364693656936669367693686936969370693716937269373693746937569376693776937869379693806938169382693836938469385693866938769388693896939069391693926939369394693956939669397693986939969400694016940269403694046940569406694076940869409694106941169412694136941469415694166941769418694196942069421694226942369424694256942669427694286942969430694316943269433694346943569436694376943869439694406944169442694436944469445694466944769448694496945069451694526945369454694556945669457694586945969460694616946269463694646946569466694676946869469694706947169472694736947469475694766947769478694796948069481694826948369484694856948669487694886948969490694916949269493694946949569496694976949869499695006950169502695036950469505695066950769508695096951069511695126951369514695156951669517695186951969520695216952269523695246952569526695276952869529695306953169532695336953469535695366953769538695396954069541695426954369544695456954669547695486954969550695516955269553695546955569556695576955869559695606956169562695636956469565695666956769568695696957069571695726957369574695756957669577695786957969580695816958269583695846958569586695876958869589695906959169592695936959469595695966959769598695996960069601696026960369604696056960669607696086960969610696116961269613696146961569616696176961869619696206962169622696236962469625696266962769628696296963069631696326963369634696356963669637696386963969640696416964269643696446964569646696476964869649696506965169652696536965469655696566965769658696596966069661696626966369664696656966669667696686966969670696716967269673696746967569676696776967869679696806968169682696836968469685696866968769688696896969069691696926969369694696956969669697696986969969700697016970269703697046970569706697076970869709697106971169712697136971469715697166971769718697196972069721697226972369724697256972669727697286972969730697316973269733697346973569736697376973869739697406974169742697436974469745697466974769748697496975069751697526975369754697556975669757697586975969760697616976269763697646976569766697676976869769697706977169772697736977469775697766977769778697796978069781697826978369784697856978669787697886978969790697916979269793697946979569796697976979869799698006980169802698036980469805698066980769808698096981069811698126981369814698156981669817698186981969820698216982269823698246982569826698276982869829698306983169832698336983469835698366983769838698396984069841698426984369844698456984669847698486984969850698516985269853698546985569856698576985869859698606986169862698636986469865698666986769868698696987069871698726987369874698756987669877698786987969880698816988269883698846988569886698876988869889698906989169892698936989469895698966989769898698996990069901699026990369904699056990669907699086990969910699116991269913699146991569916699176991869919699206992169922699236992469925699266992769928699296993069931699326993369934699356993669937699386993969940699416994269943699446994569946699476994869949699506995169952699536995469955699566995769958699596996069961699626996369964699656996669967699686996969970699716997269973699746997569976699776997869979699806998169982699836998469985699866998769988699896999069991699926999369994699956999669997699986999970000700017000270003700047000570006700077000870009700107001170012700137001470015700167001770018700197002070021700227002370024700257002670027700287002970030700317003270033700347003570036700377003870039700407004170042700437004470045700467004770048700497005070051700527005370054700557005670057700587005970060700617006270063700647006570066700677006870069700707007170072700737007470075700767007770078700797008070081700827008370084700857008670087700887008970090700917009270093700947009570096700977009870099701007010170102701037010470105701067010770108701097011070111701127011370114701157011670117701187011970120701217012270123701247012570126701277012870129701307013170132701337013470135701367013770138701397014070141701427014370144701457014670147701487014970150701517015270153701547015570156701577015870159701607016170162701637016470165701667016770168701697017070171701727017370174701757017670177701787017970180701817018270183701847018570186701877018870189701907019170192701937019470195701967019770198701997020070201702027020370204702057020670207702087020970210702117021270213702147021570216702177021870219702207022170222702237022470225702267022770228702297023070231702327023370234702357023670237702387023970240702417024270243702447024570246702477024870249702507025170252702537025470255702567025770258702597026070261702627026370264702657026670267702687026970270702717027270273702747027570276702777027870279702807028170282702837028470285702867028770288702897029070291702927029370294702957029670297702987029970300703017030270303703047030570306703077030870309703107031170312703137031470315703167031770318703197032070321703227032370324703257032670327703287032970330703317033270333703347033570336703377033870339703407034170342703437034470345703467034770348703497035070351703527035370354703557035670357703587035970360703617036270363703647036570366703677036870369703707037170372703737037470375703767037770378703797038070381703827038370384703857038670387703887038970390703917039270393703947039570396703977039870399704007040170402704037040470405704067040770408704097041070411704127041370414704157041670417704187041970420704217042270423704247042570426704277042870429704307043170432704337043470435704367043770438704397044070441704427044370444704457044670447704487044970450704517045270453704547045570456704577045870459704607046170462704637046470465704667046770468704697047070471704727047370474704757047670477704787047970480704817048270483704847048570486704877048870489704907049170492704937049470495704967049770498704997050070501705027050370504705057050670507705087050970510705117051270513705147051570516705177051870519705207052170522705237052470525705267052770528705297053070531705327053370534705357053670537705387053970540705417054270543705447054570546705477054870549705507055170552705537055470555705567055770558705597056070561705627056370564705657056670567705687056970570705717057270573705747057570576705777057870579705807058170582705837058470585705867058770588705897059070591705927059370594705957059670597705987059970600706017060270603706047060570606706077060870609706107061170612706137061470615706167061770618706197062070621706227062370624706257062670627706287062970630706317063270633706347063570636706377063870639706407064170642706437064470645706467064770648706497065070651706527065370654706557065670657706587065970660706617066270663706647066570666706677066870669706707067170672706737067470675706767067770678706797068070681706827068370684706857068670687706887068970690706917069270693706947069570696706977069870699707007070170702707037070470705707067070770708707097071070711707127071370714707157071670717707187071970720707217072270723707247072570726707277072870729707307073170732707337073470735707367073770738707397074070741707427074370744707457074670747707487074970750707517075270753707547075570756707577075870759707607076170762707637076470765707667076770768707697077070771707727077370774707757077670777707787077970780707817078270783707847078570786707877078870789707907079170792707937079470795707967079770798707997080070801708027080370804708057080670807708087080970810708117081270813708147081570816708177081870819708207082170822708237082470825708267082770828708297083070831708327083370834708357083670837708387083970840708417084270843708447084570846708477084870849708507085170852708537085470855708567085770858708597086070861708627086370864708657086670867708687086970870708717087270873708747087570876708777087870879708807088170882708837088470885708867088770888708897089070891708927089370894708957089670897708987089970900709017090270903709047090570906709077090870909709107091170912709137091470915709167091770918709197092070921709227092370924709257092670927709287092970930709317093270933709347093570936709377093870939709407094170942709437094470945709467094770948709497095070951709527095370954709557095670957709587095970960709617096270963709647096570966709677096870969709707097170972709737097470975709767097770978709797098070981709827098370984709857098670987709887098970990709917099270993709947099570996709977099870999710007100171002710037100471005710067100771008710097101071011710127101371014710157101671017710187101971020710217102271023710247102571026710277102871029710307103171032710337103471035710367103771038710397104071041710427104371044710457104671047710487104971050710517105271053710547105571056710577105871059710607106171062710637106471065710667106771068710697107071071710727107371074710757107671077710787107971080710817108271083710847108571086710877108871089710907109171092710937109471095710967109771098710997110071101711027110371104711057110671107711087110971110711117111271113711147111571116711177111871119711207112171122711237112471125711267112771128711297113071131711327113371134711357113671137711387113971140711417114271143711447114571146711477114871149711507115171152711537115471155711567115771158711597116071161711627116371164711657116671167711687116971170711717117271173711747117571176711777117871179711807118171182711837118471185711867118771188711897119071191711927119371194711957119671197711987119971200712017120271203712047120571206712077120871209712107121171212712137121471215712167121771218712197122071221712227122371224712257122671227712287122971230712317123271233712347123571236712377123871239712407124171242712437124471245712467124771248712497125071251712527125371254712557125671257712587125971260712617126271263712647126571266712677126871269712707127171272712737127471275712767127771278712797128071281712827128371284712857128671287712887128971290712917129271293712947129571296712977129871299713007130171302713037130471305713067130771308713097131071311713127131371314713157131671317713187131971320713217132271323713247132571326713277132871329713307133171332713337133471335713367133771338713397134071341713427134371344713457134671347713487134971350713517135271353713547135571356713577135871359713607136171362713637136471365713667136771368713697137071371713727137371374713757137671377713787137971380713817138271383713847138571386713877138871389713907139171392713937139471395713967139771398713997140071401714027140371404714057140671407714087140971410714117141271413714147141571416714177141871419714207142171422714237142471425714267142771428714297143071431714327143371434714357143671437714387143971440714417144271443714447144571446714477144871449714507145171452714537145471455714567145771458714597146071461714627146371464714657146671467714687146971470714717147271473714747147571476714777147871479714807148171482714837148471485714867148771488714897149071491714927149371494714957149671497714987149971500715017150271503715047150571506715077150871509715107151171512715137151471515715167151771518715197152071521715227152371524715257152671527715287152971530715317153271533715347153571536715377153871539715407154171542715437154471545715467154771548715497155071551715527155371554715557155671557715587155971560715617156271563715647156571566715677156871569715707157171572715737157471575715767157771578715797158071581715827158371584715857158671587715887158971590715917159271593715947159571596715977159871599716007160171602716037160471605716067160771608716097161071611716127161371614716157161671617716187161971620716217162271623716247162571626716277162871629716307163171632716337163471635716367163771638716397164071641716427164371644716457164671647716487164971650716517165271653716547165571656716577165871659716607166171662716637166471665716667166771668716697167071671716727167371674716757167671677716787167971680716817168271683716847168571686716877168871689716907169171692716937169471695716967169771698716997170071701717027170371704717057170671707717087170971710717117171271713717147171571716717177171871719717207172171722717237172471725717267172771728717297173071731717327173371734717357173671737717387173971740717417174271743717447174571746717477174871749717507175171752717537175471755717567175771758717597176071761717627176371764717657176671767717687176971770717717177271773717747177571776717777177871779717807178171782717837178471785717867178771788717897179071791717927179371794717957179671797717987179971800718017180271803718047180571806718077180871809718107181171812718137181471815718167181771818718197182071821718227182371824718257182671827718287182971830718317183271833718347183571836718377183871839718407184171842718437184471845718467184771848718497185071851718527185371854718557185671857718587185971860718617186271863718647186571866718677186871869718707187171872718737187471875718767187771878718797188071881718827188371884718857188671887718887188971890718917189271893718947189571896718977189871899719007190171902719037190471905719067190771908719097191071911719127191371914719157191671917719187191971920719217192271923719247192571926719277192871929719307193171932719337193471935719367193771938719397194071941719427194371944719457194671947719487194971950719517195271953719547195571956719577195871959719607196171962719637196471965719667196771968719697197071971719727197371974719757197671977719787197971980719817198271983719847198571986719877198871989719907199171992719937199471995719967199771998719997200072001720027200372004720057200672007720087200972010720117201272013720147201572016720177201872019720207202172022720237202472025720267202772028720297203072031720327203372034720357203672037720387203972040720417204272043720447204572046720477204872049720507205172052720537205472055720567205772058720597206072061720627206372064720657206672067720687206972070720717207272073720747207572076720777207872079720807208172082720837208472085720867208772088720897209072091720927209372094720957209672097720987209972100721017210272103721047210572106721077210872109721107211172112721137211472115721167211772118721197212072121721227212372124721257212672127721287212972130721317213272133721347213572136721377213872139721407214172142721437214472145721467214772148721497215072151721527215372154721557215672157721587215972160721617216272163721647216572166721677216872169721707217172172721737217472175721767217772178721797218072181721827218372184721857218672187721887218972190721917219272193721947219572196721977219872199722007220172202722037220472205722067220772208722097221072211722127221372214722157221672217722187221972220722217222272223722247222572226722277222872229722307223172232722337223472235722367223772238722397224072241722427224372244722457224672247722487224972250722517225272253722547225572256722577225872259722607226172262722637226472265722667226772268722697227072271722727227372274722757227672277722787227972280722817228272283722847228572286722877228872289722907229172292722937229472295722967229772298722997230072301723027230372304723057230672307723087230972310723117231272313723147231572316723177231872319723207232172322723237232472325723267232772328723297233072331723327233372334723357233672337723387233972340723417234272343723447234572346723477234872349723507235172352723537235472355723567235772358723597236072361723627236372364723657236672367723687236972370723717237272373723747237572376723777237872379723807238172382723837238472385723867238772388723897239072391723927239372394723957239672397723987239972400724017240272403724047240572406724077240872409724107241172412724137241472415724167241772418724197242072421724227242372424724257242672427724287242972430724317243272433724347243572436724377243872439724407244172442724437244472445724467244772448724497245072451724527245372454724557245672457724587245972460724617246272463724647246572466724677246872469724707247172472724737247472475724767247772478724797248072481724827248372484724857248672487724887248972490724917249272493724947249572496724977249872499725007250172502725037250472505725067250772508725097251072511725127251372514725157251672517725187251972520725217252272523725247252572526725277252872529725307253172532725337253472535725367253772538725397254072541725427254372544725457254672547725487254972550725517255272553725547255572556725577255872559725607256172562725637256472565725667256772568725697257072571725727257372574725757257672577725787257972580725817258272583725847258572586725877258872589725907259172592725937259472595725967259772598725997260072601726027260372604726057260672607726087260972610726117261272613726147261572616726177261872619726207262172622726237262472625726267262772628726297263072631726327263372634726357263672637726387263972640726417264272643726447264572646726477264872649726507265172652726537265472655726567265772658726597266072661726627266372664726657266672667726687266972670726717267272673726747267572676726777267872679726807268172682726837268472685726867268772688726897269072691726927269372694726957269672697726987269972700727017270272703727047270572706727077270872709727107271172712727137271472715727167271772718727197272072721727227272372724727257272672727727287272972730727317273272733727347273572736727377273872739727407274172742727437274472745727467274772748727497275072751727527275372754727557275672757727587275972760727617276272763727647276572766727677276872769727707277172772727737277472775727767277772778727797278072781727827278372784727857278672787727887278972790727917279272793727947279572796727977279872799728007280172802728037280472805728067280772808728097281072811728127281372814728157281672817728187281972820728217282272823728247282572826728277282872829728307283172832728337283472835728367283772838728397284072841728427284372844728457284672847728487284972850728517285272853728547285572856728577285872859728607286172862728637286472865728667286772868728697287072871728727287372874728757287672877728787287972880728817288272883728847288572886728877288872889728907289172892728937289472895728967289772898728997290072901729027290372904729057290672907729087290972910729117291272913729147291572916729177291872919729207292172922729237292472925729267292772928729297293072931729327293372934729357293672937729387293972940729417294272943729447294572946729477294872949729507295172952729537295472955729567295772958729597296072961729627296372964729657296672967729687296972970729717297272973729747297572976729777297872979729807298172982729837298472985729867298772988729897299072991729927299372994729957299672997729987299973000730017300273003730047300573006730077300873009730107301173012730137301473015730167301773018730197302073021730227302373024730257302673027730287302973030730317303273033730347303573036730377303873039730407304173042730437304473045730467304773048730497305073051730527305373054730557305673057730587305973060730617306273063730647306573066730677306873069730707307173072730737307473075730767307773078730797308073081730827308373084730857308673087730887308973090730917309273093730947309573096730977309873099731007310173102731037310473105731067310773108731097311073111731127311373114731157311673117731187311973120731217312273123731247312573126731277312873129731307313173132731337313473135731367313773138731397314073141731427314373144731457314673147731487314973150731517315273153731547315573156731577315873159731607316173162731637316473165731667316773168731697317073171731727317373174731757317673177731787317973180731817318273183731847318573186731877318873189731907319173192731937319473195731967319773198731997320073201732027320373204732057320673207732087320973210732117321273213732147321573216732177321873219732207322173222732237322473225732267322773228732297323073231732327323373234732357323673237732387323973240732417324273243732447324573246732477324873249732507325173252732537325473255732567325773258732597326073261732627326373264732657326673267732687326973270732717327273273732747327573276732777327873279732807328173282732837328473285732867328773288732897329073291732927329373294732957329673297732987329973300733017330273303733047330573306733077330873309733107331173312733137331473315733167331773318733197332073321733227332373324733257332673327733287332973330733317333273333733347333573336733377333873339733407334173342733437334473345733467334773348733497335073351733527335373354733557335673357733587335973360733617336273363733647336573366733677336873369733707337173372733737337473375733767337773378733797338073381733827338373384733857338673387733887338973390733917339273393733947339573396733977339873399734007340173402734037340473405734067340773408734097341073411734127341373414734157341673417734187341973420734217342273423734247342573426734277342873429734307343173432734337343473435734367343773438734397344073441734427344373444734457344673447734487344973450734517345273453734547345573456734577345873459734607346173462734637346473465734667346773468734697347073471734727347373474734757347673477734787347973480734817348273483734847348573486734877348873489734907349173492734937349473495734967349773498734997350073501735027350373504735057350673507735087350973510735117351273513735147351573516735177351873519735207352173522735237352473525735267352773528735297353073531735327353373534735357353673537735387353973540735417354273543735447354573546735477354873549735507355173552735537355473555735567355773558735597356073561735627356373564735657356673567735687356973570735717357273573735747357573576735777357873579735807358173582735837358473585735867358773588735897359073591735927359373594735957359673597735987359973600736017360273603736047360573606736077360873609736107361173612736137361473615736167361773618736197362073621736227362373624736257362673627736287362973630736317363273633736347363573636736377363873639736407364173642736437364473645736467364773648736497365073651736527365373654736557365673657736587365973660736617366273663736647366573666736677366873669736707367173672736737367473675736767367773678736797368073681736827368373684736857368673687736887368973690736917369273693736947369573696736977369873699737007370173702737037370473705737067370773708737097371073711737127371373714737157371673717737187371973720737217372273723737247372573726737277372873729737307373173732737337373473735737367373773738737397374073741737427374373744737457374673747737487374973750737517375273753737547375573756737577375873759737607376173762737637376473765737667376773768737697377073771737727377373774737757377673777737787377973780737817378273783737847378573786737877378873789737907379173792737937379473795737967379773798737997380073801738027380373804738057380673807738087380973810738117381273813738147381573816738177381873819738207382173822738237382473825738267382773828738297383073831738327383373834738357383673837738387383973840738417384273843738447384573846738477384873849738507385173852738537385473855738567385773858738597386073861738627386373864738657386673867738687386973870738717387273873738747387573876738777387873879738807388173882738837388473885738867388773888738897389073891738927389373894738957389673897738987389973900739017390273903739047390573906739077390873909739107391173912739137391473915739167391773918739197392073921739227392373924739257392673927739287392973930739317393273933739347393573936739377393873939739407394173942739437394473945739467394773948739497395073951739527395373954739557395673957739587395973960739617396273963739647396573966739677396873969739707397173972739737397473975739767397773978739797398073981739827398373984739857398673987739887398973990739917399273993739947399573996739977399873999740007400174002740037400474005740067400774008740097401074011740127401374014740157401674017740187401974020740217402274023740247402574026740277402874029740307403174032740337403474035740367403774038740397404074041740427404374044740457404674047740487404974050740517405274053740547405574056740577405874059740607406174062740637406474065740667406774068740697407074071740727407374074740757407674077740787407974080740817408274083740847408574086740877408874089740907409174092740937409474095740967409774098740997410074101741027410374104741057410674107741087410974110741117411274113741147411574116741177411874119741207412174122741237412474125741267412774128741297413074131741327413374134741357413674137741387413974140741417414274143741447414574146741477414874149741507415174152741537415474155741567415774158741597416074161741627416374164741657416674167741687416974170741717417274173741747417574176741777417874179741807418174182741837418474185741867418774188741897419074191741927419374194741957419674197741987419974200742017420274203742047420574206742077420874209742107421174212742137421474215742167421774218742197422074221742227422374224742257422674227742287422974230742317423274233742347423574236742377423874239742407424174242742437424474245742467424774248742497425074251742527425374254742557425674257742587425974260742617426274263742647426574266742677426874269742707427174272742737427474275742767427774278742797428074281742827428374284742857428674287742887428974290742917429274293742947429574296742977429874299743007430174302743037430474305743067430774308743097431074311743127431374314743157431674317743187431974320743217432274323743247432574326743277432874329743307433174332743337433474335743367433774338743397434074341743427434374344743457434674347 |
- #!/usr/bin/env php
- <?php
- if (__FILE__ == realpath($GLOBALS['_SERVER']['SCRIPT_NAME'])) {
- $phar = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']);
- $execute = true;
- } else {
- $files = get_included_files();
- $phar = $files[0];
- $execute = false;
- }
- define('__PHPUNIT_PHAR__', str_replace(DIRECTORY_SEPARATOR, '/', $phar));
- define('__PHPUNIT_PHAR_ROOT__', 'phar://phpunit-4.7.0.phar');
- Phar::mapPhar('phpunit-4.7.0.phar');
- require 'phar://phpunit-4.7.0.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.0.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.php';
- require 'phar://phpunit-4.7.0.phar' . '/doctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/doctrine-instantiator/Doctrine/Instantiator/Instantiator.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-file-iterator/Iterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-file-iterator/Facade.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-file-iterator/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Driver.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Driver/HHVM.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Driver/Xdebug.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Exception/UnintentionallyCoveredCode.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Filter.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Clover.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Crap4j.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/HTML.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Dashboard.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/Directory.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/HTML/Renderer/File.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Node.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Node/Directory.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Node/File.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Node/Iterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/PHP.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/Text.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Node.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Directory.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Coverage.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Method.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Report.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/File/Unit.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Project.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Tests.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Report/XML/Totals.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Util.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-code-coverage/CodeCoverage/Util/InvalidArgumentHelper.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-invoker/Invoker.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-invoker/Invoker/TimeoutException.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-timer/Timer.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-token-stream/Token.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-token-stream/Token/Stream.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-token-stream/Token/Stream/CachingFactory.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Context.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Description.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Location.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Serializer.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Type/Collection.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/ITester.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/AbstractTester.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SelfDescribing.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Constraint/DataSetIsEqual.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Constraint/TableIsEqual.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Constraint/TableRowCount.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/IDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/AbstractDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ITable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/AbstractTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ITableMetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/AbstractTableMetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ArrayDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/CompositeDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/CsvDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/DataSetFilter.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/DefaultDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ITableIterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTableIterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/DefaultTableMetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/FlatXmlDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/IPersistable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ISpec.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/IYamlParser.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Abstract.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/FlatXml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Xml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Persistors/Yaml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/QueryDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/QueryTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/ReplacementTableIterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Csv.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/IDatabaseListConsumer.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/DbQuery.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/DbTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/IFactory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/FlatXml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Xml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/Specs/Yaml.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/SymfonyYamlParser.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/TableFilter.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/TableMetaDataFilter.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/XmlDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DataSet/YamlDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/DataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/IDatabaseConnection.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/FilteredDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/IMetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/Dblib.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/Firebird.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/InformationSchema.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/MySQL.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/Oci.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/PgSQL.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/Sqlite.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/MetaData/SqlSrv.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/ResultSetTable.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/Table.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/TableIterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DB/TableMetaData.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/DefaultTester.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/IDatabaseOperation.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Composite.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/RowBased.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Delete.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/DeleteAll.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Insert.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Null.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Replace.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Truncate.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/Operation/Update.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Test.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Assert.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/TestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/Command.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/Context.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/IMediumPrinter.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/IMedium.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/IMode.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/IModeFactory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/InvalidModeException.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/Mediums/Text.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/ModeFactory.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/Modes/ExportDataSet.php';
- require 'phar://phpunit-4.7.0.phar' . '/dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestSuite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/GroupTestSuite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/PhptTestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/PhptTestSuite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/TestDecorator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/RepeatedTest.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Command.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Driver.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Keys.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Response.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestListener.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Active.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/URL.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/Selenium2TestCase/Window.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumBrowserSuite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumCommon/ExitHandler.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumCommon/RemoteCoverage.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumTestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumTestCase/Driver.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-selenium/Extensions/SeleniumTestSuite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Extensions/TicketListener.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/AssertionFailedError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/BaseTestListener.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/CodeCoverageException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/And.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ArrayHasKey.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ArraySubset.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Composite.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Attribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Callback.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ClassHasAttribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ClassHasStaticAttribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Count.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ExceptionCode.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ExceptionMessage.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ExceptionMessageRegExp.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/FileExists.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/GreaterThan.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsAnything.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsEmpty.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsEqual.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsFalse.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsIdentical.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsInstanceOf.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsJson.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsNull.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsTrue.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/IsType.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/JsonMatches.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/LessThan.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Not.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/ObjectHasAttribute.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Or.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/PCREMatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/SameSize.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/StringContains.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/StringEndsWith.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/StringMatches.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/StringStartsWith.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/TraversableContains.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/TraversableContainsOnly.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Constraint/Xor.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Error.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Error/Deprecated.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Error/Notice.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Error/Warning.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/ExceptionWrapper.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/ExpectationFailedException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/IncompleteTest.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/IncompleteTestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/IncompleteTestError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SkippedTest.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/InvalidCoversTargetError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/InvalidCoversTargetException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/BadMethodCallException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Identity.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Stub.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Match.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Builder/Namespace.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Generator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation/Static.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Invocation/Object.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Verifiable.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Invokable.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/InvocationMocker.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastCount.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtMostCount.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/MockBuilder.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/MockObject.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Exception/RuntimeException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/Return.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/OutputError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/RiskyTest.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/RiskyTestError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SkippedTestCase.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SkippedTestError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SkippedTestSuiteError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/SyntheticError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestFailure.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestResult.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/TestSuite/DataProvider.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/UnintentionallyCoveredCodeError.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Framework/Warning.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/BaseTestRunner.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Filter/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Filter/Group.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Filter/Group/Exclude.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Filter/Group/Include.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Filter/Test.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/TestSuiteLoader.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/StandardTestSuiteLoader.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Runner/Version.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/TextUI/Command.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Printer.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/TextUI/ResultPrinter.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/TextUI/TestRunner.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Blacklist.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Configuration.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/ErrorHandler.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Fileloader.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Filesystem.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Filter.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Getopt.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/GlobalState.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/InvalidArgumentHelper.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Log/JSON.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Log/JUnit.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Log/TAP.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/PHP.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/PHP/Default.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/PHP/Windows.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Regex.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/String.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Test.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/TestDox/NamePrettifier.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/TestDox/ResultPrinter.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/TestDox/ResultPrinter/HTML.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/TestDox/ResultPrinter/Text.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/TestSuiteIterator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/Type.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpunit/Util/XML.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Call/Call.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Call/CallCenter.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/Comparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Comparator/ClosureComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Comparator/Factory.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Doubler.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/CachedDoubler.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/DoubleInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassCreator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ClassMirror.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/ArgumentNode.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/LazyDouble.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Doubler/NameGenerator.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prediction/PredictionInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallPrediction.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Promise/PromiseInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Promise/CallbackPromise.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Promise/ReturnPromise.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Promise/ThrowPromise.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophecy/Revealer.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Prophet.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Util/ExportUtil.php';
- require 'phar://phpunit-4.7.0.phar' . '/phpspec-prophecy/Prophecy/Util/StringUtil.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ArrayComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ComparisonFailure.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ObjectComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/DateTimeComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/DOMNodeComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ScalarComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/NumericComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/DoubleComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ExceptionComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/MockObjectComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/ResourceComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/SplObjectStorageComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-comparator/TypeComparator.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/Chunk.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/Diff.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/Differ.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/LCS/LongestCommonSubsequence.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/Line.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-diff/Parser.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-environment/Console.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-environment/Runtime.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-exporter/Exporter.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-global-state/Blacklist.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-global-state/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-global-state/Restorer.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-global-state/RuntimeException.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-global-state/Snapshot.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-recursion-context/Context.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-recursion-context/Exception.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-recursion-context/InvalidArgumentException.php';
- require 'phar://phpunit-4.7.0.phar' . '/sebastian-version/Version.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Dumper.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Escaper.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Exception/ExceptionInterface.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Exception/RuntimeException.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Exception/DumpException.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Exception/ParseException.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Inline.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Parser.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Unescaper.php';
- require 'phar://phpunit-4.7.0.phar' . '/symfony/yaml/Yaml.php';
- require 'phar://phpunit-4.7.0.phar' . '/php-text-template/Template.php';
- if ($execute) {
- if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == '--manifest') {
- print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/manifest.txt');
- exit;
- }
- PHPUnit_TextUI_Command::main();
- }
- __HALT_COMPILER(); ?>
- E³��9���������phpunit-4.7.0.phar����$���sebastian-global-state/Exception.phpþ��"qUþ�� ª„´¶������#���sebastian-global-state/Snapshot.php',��"qU',��5+å ¶���������sebastian-global-state/LICENSE
- ��"qU
- ��êâ¶������#���sebastian-global-state/Restorer.phpž��"qUž��}FÔ¶������$���sebastian-global-state/Blacklist.php#��"qU#��Òf1“¶������+���sebastian-global-state/RuntimeException.php0 ��"qU0 ���Èyv¶���������php-text-template/LICENSE��"qU��²d¸è¶���������php-text-template/Template.phpð��"qUð��í;$¶���������sebastian-diff/LICENSE��"qU��vEvö������/���sebastian-diff/LCS/LongestCommonSubsequence.phpº��"qUº��»Ø›¶������L���sebastian-diff/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.phpô
- ��"qUô
- ��ƒÓg8¶������J���sebastian-diff/LCS/TimeEfficientLongestCommonSubsequenceImplementation.phpá��"qUá��Š½¸r¶���������sebastian-diff/Line.phpé��"qUé��ü¼éζ���������sebastian-diff/Differ.php��"qU��ºŒ<6¶���������sebastian-diff/Parser.phps��"qUs��vÚ^¶���������sebastian-diff/Diff.php��"qU��²ª¶���������sebastian-diff/Chunk.php��"qU��9LKé¶���������php-timer/Timer.php6��"qU6��#X6ñ¶���������php-timer/LICENSE��"qU���ÔN>¶���������sebastian-comparator/LICENSE ��"qU ��”:¶������#���sebastian-comparator/Comparator.php ��"qU ��o:7¶������3���sebastian-comparator/SplObjectStorageComparator.php6��"qU6��íÃÓɶ������'���sebastian-comparator/TypeComparator.php@ ��"qU@ ��ÍFòñ¶������)���sebastian-comparator/ObjectComparator.php.��"qU.��˯?ð¶������+���sebastian-comparator/ResourceComparator.phpŠ��"qUŠ��aõµV¶������(���sebastian-comparator/ArrayComparator.phpv��"qUv�� ÀíÕ¶������+���sebastian-comparator/DateTimeComparator.php™��"qU™��JzM¶������,���sebastian-comparator/ExceptionComparator.php��"qU��ƒîÔ¶������*���sebastian-comparator/DOMNodeComparator.php,��"qU,��ûû�W¶������)���sebastian-comparator/ScalarComparator.phpÏ��"qUÏ��"’18¶������-���sebastian-comparator/MockObjectComparator.phpé��"qUé��ÂÌSö¶������*���sebastian-comparator/NumericComparator.phpF��"qUF��»š`¶������ ���sebastian-comparator/Factory.php‰��"qU‰��@‹Ø¶������)���sebastian-comparator/DoubleComparator.phpÐ��"qUÐ��š¼ž×¶������*���sebastian-comparator/ComparisonFailure.phpÅ��"qUÅ��ƒÓºª¶���������phpspec-prophecy/LICENSE}��"qU}��òÅ6¶������8���phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.phpH��"qUH��‡gZ¶¶������?���phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.phpß��"qUß��i²¶������/���phpspec-prophecy/Prophecy/Prophecy/Revealer.php���"qU���jÉɸ¶������8���phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php,��"qU,��¡W¶������5���phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.phpk��"qUk��k„ʶ������5���phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php(��"qU(��ç�ÔŶ������:���phpspec-prophecy/Prophecy/Comparator/ClosureComparator.phpK��"qUK��)RQã¶������0���phpspec-prophecy/Prophecy/Comparator/Factory.php¡��"qU¡��Aê϶������&���phpspec-prophecy/Prophecy/Argument.php^��"qU^��l”¶������%���phpspec-prophecy/Prophecy/Prophet.php��"qU��çvqŽ¶������1���phpspec-prophecy/Prophecy/Exception/Exception.php+��"qU+��¸µ‘¶������H���phpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php��"qU��†:‚F¶������B���phpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php™��"qU™��Üê$϶������H���phpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.php)��"qU)��Fù¢4¶������J���phpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.phpà��"qUà��õ¡…ý¶������D���phpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.phpª��"qUª��Û‰?¶������?���phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.php©��"qU©��zéFƒ¶������@���phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php—��"qU—��ÃZ^¶������G���phpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.phpÖ��"qUÖ��iÞhó¶������J���phpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php���"qU���ýª¶������E���phpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.phpµ��"qUµ��77/%¶������F���phpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.phpÅ��"qUÅ��h+������K���phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.php,��"qU,����õa¶������F���phpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php���"qU���2T¢Ñ¶������L���phpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.phpJ��"qUJ��~ÐãD¶������C���phpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.phpÚ��"qUÚ��Ál<�¶������E���phpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php»��"qU»��?D<ζ������P���phpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php��"qU��æ ƶ������D���phpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.phpÖ��"qUÖ��£Áó¸¶������@���phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php•��"qU•��¨gì¶������3���phpspec-prophecy/Prophecy/Doubler/CachedDoubler.phpƒ��"qUƒ��̇gè¶������5���phpspec-prophecy/Prophecy/Doubler/DoubleInterface.phpâ��"qUâ��8d�j¶������-���phpspec-prophecy/Prophecy/Doubler/Doubler.php���"qU���8]Õ^¶������B���phpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.phpU
- ��"qUU
- ��J9½y¶������<���phpspec-prophecy/Prophecy/Doubler/Generator/ClassCreator.phpÔ��"qUÔ��ä?Br¶������C���phpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.phpò��"qUò��çûªå¶������;���phpspec-prophecy/Prophecy/Doubler/Generator/ClassMirror.phpŒ��"qUŒ��p%f¶������A���phpspec-prophecy/Prophecy/Doubler/Generator/Node/ArgumentNode.phpš��"qUš��^ž¶������?���phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.phpÛ
- ��"qUÛ
- ��ÿ¸Ó¶������>���phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.phpP
- ��"qUP
- ��M°-Š¶������0���phpspec-prophecy/Prophecy/Doubler/LazyDouble.phpF
��"qUF
��¼ël¦¶������=���phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php½��"qU½��û/@ȶ������E���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.phpô
- ��"qUô
- ��Ân–i¶������?���phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.phpâ��"qUâ��Áyú¶������A���phpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.php ��"qU ��§€jN¶������A���phpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php���"qU���!h^¶������H���phpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php’��"qU’��:0`ò¶������C���phpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.phpÑ��"qUÑ��x“Â^¶������P���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.phpp��"qUp��x¤¿ˆ¶������D���phpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.phpl��"qUl��)Š5:¶������3���phpspec-prophecy/Prophecy/Doubler/NameGenerator.phpŠ��"qUŠ��õÑ7¶������<���phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.php“��"qU“��XŠü¶������:���phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.phpå��"qUå��L9%¶������<���phpspec-prophecy/Prophecy/Prediction/PredictionInterface.phpŸ��"qUŸ��`IE¶������;���phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.php“��"qU“��Vb{ζ������7���phpspec-prophecy/Prophecy/Prediction/CallPrediction.phpQ ��"qUQ ��Iæ“é¶������'���phpspec-prophecy/Prophecy/Call/Call.phpÓ ��"qUÓ ��{:å%¶������-���phpspec-prophecy/Prophecy/Call/CallCenter.phpm��"qUm��š[µ9¶������2���phpspec-prophecy/Prophecy/Promise/ThrowPromise.php9
- ��"qU9
- ��˜½cu¶������;���phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php��"qU��¨ô%A¶������3���phpspec-prophecy/Prophecy/Promise/ReturnPromise.php��"qU��çØ�ä¶������5���phpspec-prophecy/Prophecy/Promise/CallbackPromise.php���"qU���[žÜ¶������6���phpspec-prophecy/Prophecy/Promise/PromiseInterface.phpK��"qUK��¾¬…ë¶������8���phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.php4 ��"qU4 ��A;K2¶������:���phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.php«��"qU«��F�h¶������A���phpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.php’��"qU’��pbø�¶������<���phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.phpø��"qUø�� Nãv¶������;���phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.php���"qU���Ù°Š¼¶������<���phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php”��"qU”��ÞJú:¶������<���phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.phpá��"qUá��‚4®Ì¶������;���phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.phpÚ��"qUÚ��ÖbN/¶������@���phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.phpü��"qUü��‰ÑÊ>¶������<���phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.php¡��"qU¡���…3�¶������=���phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.php9
- ��"qU9
- ��_ÛJg¶������:���phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.php,��"qU,��cRÊ̶������@���phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.phpæ��"qUæ���¯Êý¶������<���phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.php��"qU��ܼr¶������6���phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php¥��"qU¥��®næ\¶������-���phpspec-prophecy/Prophecy/Util/ExportUtil.php„��"qU„��ѪzH¶������-���phpspec-prophecy/Prophecy/Util/StringUtil.phpì ��"qUì ��%ø¶���������sebastian-exporter/LICENSE��"qU��Aªe)¶���������sebastian-exporter/Exporter.php*#��"qU*#��žÓl׶���������php-file-iterator/LICENSE��"qU��¶És‰¶���������php-file-iterator/Iterator.php²��"qU²��¬É¶���������php-file-iterator/Facade.phpô��"qUô��Q–훶���������php-file-iterator/Factory.php¸
- ��"qU¸
- ��dÂŽ¶���������manifest.txt_��"qU_��\½“¶������)���sebastian-recursion-context/Exception.phpˆ��"qUˆ��>å™3¶������#���sebastian-recursion-context/LICENSE��"qU��Éðζ������'���sebastian-recursion-context/Context.php°��"qU°��ø¿Nê¶������8���sebastian-recursion-context/InvalidArgumentException.phpÐ��"qUÐ��ʨú¶������0���phpunit-selenium/Extensions/SeleniumTestCase.phpÀ—��"qUÀ—��Ãv�K¶������1���phpunit-selenium/Extensions/SeleniumTestSuite.php���"qU���®šä¶������7���phpunit-selenium/Extensions/SeleniumTestCase/Driver.phpM°��"qUM°��0âR¶������6���phpunit-selenium/Extensions/Selenium2TestCase/Keys.phpI��"qUI��î†Í¶������H���phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie/Builder.php��"qU��Ó¸q¶������B���phpunit-selenium/Extensions/Selenium2TestCase/Session/Timeouts.php]��"qU]��œ/X¶������A���phpunit-selenium/Extensions/Selenium2TestCase/Session/Storage.php8��"qU8��›‚º¶������@���phpunit-selenium/Extensions/Selenium2TestCase/Session/Cookie.phpý��"qUý��$!¸–¶������;���phpunit-selenium/Extensions/Selenium2TestCase/Exception.phpã ��"qUã ��H"Ç[¶������@���phpunit-selenium/Extensions/Selenium2TestCase/CommandsHolder.phpË��"qUË��Zew¶������D���phpunit-selenium/Extensions/Selenium2TestCase/ScreenshotListener.phpØ��"qUØ��h7Ƕ������9���phpunit-selenium/Extensions/Selenium2TestCase/Command.phpL
��"qUL
��Îcyƶ������>���phpunit-selenium/Extensions/Selenium2TestCase/StateCommand.phpw
- ��"qUw
- �� e3Z¶������9���phpunit-selenium/Extensions/Selenium2TestCase/Element.php ��"qU ��&éø¶������:���phpunit-selenium/Extensions/Selenium2TestCase/Response.php��"qU��TZ¶������E���phpunit-selenium/Extensions/Selenium2TestCase/NoSeleniumException.phpÅ ��"qUÅ ��Ûök¶������H���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Shared.phpH��"qUH��ÚVm’¶������J���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy/Isolated.php’
��"qU’
���ìͶ������F���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Click.php+
- ��"qU+
- ��¡Ä»¶������G���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Equals.php`��"qU`��Én±Õ¶������P���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericAccessor.phpi
- ��"qUi
- ��•Pe¶������L���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/GenericPost.phpW
- ��"qUW
- ��ëLq¶������F���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Value.phpG��"qUG��+Uç¶������J���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Attribute.phpt��"qUt��
ˈ¶������D���phpunit-selenium/Extensions/Selenium2TestCase/ElementCommand/Css.phpi��"qUi��ó¶������A���phpunit-selenium/Extensions/Selenium2TestCase/ElementCriteria.phpN��"qUN���ʶ������8���phpunit-selenium/Extensions/Selenium2TestCase/Window.phpO��"qUO��S§ßô¶������8���phpunit-selenium/Extensions/Selenium2TestCase/Driver.phpÑ��"qUÑ��eÅ5v¶������;���phpunit-selenium/Extensions/Selenium2TestCase/WaitUntil.php”��"qU”��z“¶������D���phpunit-selenium/Extensions/Selenium2TestCase/WebDriverException.phpf
��"qUf
��ÍK1ï¶������E���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Keys.php$��"qU$��wîͶ������F���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Click.php»��"qU»��^ÿaé¶������I���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Location.phpÏ��"qUÏ��ô¡Ë¶������P���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAccessor.phpT
- ��"qUT
- ��X·ì¶������E���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/File.phpè��"qUè��0“ß—¶������L���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AcceptAlert.php1
- ��"qU1
- ��BHǶ������J���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/AlertText.phpC��"qUC��lXim¶������D���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Url.php��"qU��K¸Ž¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Window.phpÜ
- ��"qUÜ
- ��•ˆ’¶������Q���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/GenericAttribute.phpŸ
- ��"qUŸ
- ��›Bí¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/MoveTo.phpÎ��"qUÎ��£-
- ¶������L���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Orientation.phpÞ��"qUÞ��@\WI¶������D���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Log.php��"qU��œð"=¶������G���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Active.php
- ��"qU
- ��×6¸¶������M���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/DismissAlert.php6
- ��"qU6
- ��Ñv’l¶������F���phpunit-selenium/Extensions/Selenium2TestCase/SessionCommand/Frame.php¶��"qU¶��çz"¶������5���phpunit-selenium/Extensions/Selenium2TestCase/URL.php™��"qU™��HFž¶������A���phpunit-selenium/Extensions/Selenium2TestCase/SessionStrategy.php¡��"qU¡��̳ãr¶������<���phpunit-selenium/Extensions/Selenium2TestCase/KeysHolder.php��"qU��Ñ|ÚH¶������B���phpunit-selenium/Extensions/Selenium2TestCase/Element/Accessor.php¯��"qU¯��û\w€¶������@���phpunit-selenium/Extensions/Selenium2TestCase/Element/Select.php��"qU��ëL@"¶������9���phpunit-selenium/Extensions/Selenium2TestCase/Session.php!1��"qU!1��š™¶������6���phpunit-selenium/Extensions/SeleniumCommon/prepend.php?��"qU?��°·³¶������5���phpunit-selenium/Extensions/SeleniumCommon/append.php��"qU��›·ú÷¶������=���phpunit-selenium/Extensions/SeleniumCommon/RemoteCoverage.phpI��"qUI��Ý\´.¶������:���phpunit-selenium/Extensions/SeleniumCommon/ExitHandler.php*��"qU*��¢èÏ϶������?���phpunit-selenium/Extensions/SeleniumCommon/phpunit_coverage.php`��"qU`��½ùOm¶������4���phpunit-selenium/Extensions/SeleniumBrowserSuite.phpò��"qUò��D³¥¶������1���phpunit-selenium/Extensions/Selenium2TestCase.php!E��"qU!E��ï[‘ñ¶������'���php-code-coverage/CodeCoverage/Util.php��"qU��¥§ŠÌ¶������,���php-code-coverage/CodeCoverage/Exception.phpè��"qUè��Î�l@¶������7���php-code-coverage/CodeCoverage/Report/HTML/Renderer.php ��"qU ��«¬¶������A���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Dashboard.php$(��"qU$(��_ð�‰¶������<���php-code-coverage/CodeCoverage/Report/HTML/Renderer/File.php_M��"qU_M��3}Î�¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.distk��"qUk��Üz¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/directory.html.diste��"qUe��Ç�¥ô¶������S���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist1��"qU1��itLì¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.jsoŒ��"qUoŒ��;¦� ¶������I���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.jsUN�"qUUN�;Áë1¶������N���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/respond.min.js��"qU��í{¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.min.jsL
- ��"qUL
- ��F¨¶������M���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js m��"qU m��JësѶ������L���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/nv.d3.min.jsÏ�"qUÏ�mâ¶������M���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.jsÕv�"qUÕv�†e“¶������P���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.distg��"qUg��V³
P¶������R���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.distx��"qUx��*öŒ¶������U���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist5��"qU5��ñZˆ]¶������K���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/file.html.distþ
- ��"qUþ
- ��øýŠD¶������J���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/style.css+��"qU+��Y`üg¶������N���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css>!��"qU>!��_ˆl¶������R���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css9Ê�"qU9Ê�Ü›2ø¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf\±��"qU\±��š<œ¶������e���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2lF��"qUlF��vèÃa¶������d���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff€[��"qU€[��ê{õ¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eotŸN��"qUŸN��XDZœ¶������c���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.svg¨�"qU¨�|îÆɶ������A���php-code-coverage/CodeCoverage/Report/HTML/Renderer/Directory.phpÀ��"qUÀ��Òi‚¶������0���php-code-coverage/CodeCoverage/Report/Crap4j.php…��"qU…��©¹yð¶������3���php-code-coverage/CodeCoverage/Report/XML/Tests.phpÄ��"qUÄ��¯t0¶������2���php-code-coverage/CodeCoverage/Report/XML/File.phpm��"qUm��†Lk¶������2���php-code-coverage/CodeCoverage/Report/XML/Node.php› ��"qU› ��[Ò¥;¶������5���php-code-coverage/CodeCoverage/Report/XML/Project.phpš��"qUš��U‹:ç¶������4���php-code-coverage/CodeCoverage/Report/XML/Totals.php��"qU��ëÑ÷¶������7���php-code-coverage/CodeCoverage/Report/XML/Directory.phpÆ��"qUÆ��ÎOo¾¶������9���php-code-coverage/CodeCoverage/Report/XML/File/Method.php²��"qU²���6Þ¶������9���php-code-coverage/CodeCoverage/Report/XML/File/Report.php€��"qU€��ºL¬à¶������;���php-code-coverage/CodeCoverage/Report/XML/File/Coverage.phpr��"qUr��T(Ë=¶������7���php-code-coverage/CodeCoverage/Report/XML/File/Unit.php��"qU���½ýX¶������.���php-code-coverage/CodeCoverage/Report/Node.php���"qU���‚Ӗ̶������7���php-code-coverage/CodeCoverage/Report/Node/Iterator.php
- ��"qU
- ��ŒªIµ¶������3���php-code-coverage/CodeCoverage/Report/Node/File.phpDI��"qUDI��‰ H¶������8���php-code-coverage/CodeCoverage/Report/Node/Directory.php*��"qU*��Á”R¶������0���php-code-coverage/CodeCoverage/Report/Clover.php)��"qU)��†ÿAŶ������.���php-code-coverage/CodeCoverage/Report/HTML.phpŒ��"qUŒ��¡±Ä¶������1���php-code-coverage/CodeCoverage/Report/Factory.php–��"qU–��ðï(¶������-���php-code-coverage/CodeCoverage/Report/XML.phpu��"qUu��‹f”¶������-���php-code-coverage/CodeCoverage/Report/PHP.phpm��"qUm��Lé^z¶������.���php-code-coverage/CodeCoverage/Report/Text.php¹"��"qU¹"��xüLî¶������G���php-code-coverage/CodeCoverage/Exception/UnintentionallyCoveredCode.php��"qU��¥Kë¶������)���php-code-coverage/CodeCoverage/Driver.php¦��"qU¦��íN1¶������)���php-code-coverage/CodeCoverage/Filter.phpb��"qUb��ä;³Á¶������=���php-code-coverage/CodeCoverage/Util/InvalidArgumentHelper.php„��"qU„��_Þ:
- ¶������.���php-code-coverage/CodeCoverage/Driver/HHVM.phpp��"qUp��þØ<r¶������0���php-code-coverage/CodeCoverage/Driver/Xdebug.phpü
- ��"qUü
- ��œ�Í1¶���������php-code-coverage/LICENSE��"qU��ЉxZ¶������"���php-code-coverage/CodeCoverage.phpg��"qUg��N¨‰¶���������symfony/LICENSE)��"qU)��ë&•¶���������symfony/yaml/Inline.phphM��"qUhM��€</ʶ���������symfony/yaml/Unescaper.phpÐ��"qUÐ��éÒ�m¶���������symfony/yaml/Yaml.php1��"qU1��ð¸
@¶������)���symfony/yaml/Exception/ParseException.php��"qU��Î79‹¶������(���symfony/yaml/Exception/DumpException.phpÒ��"qUÒ��ؙ՚¶������+���symfony/yaml/Exception/RuntimeException.phpð��"qUð��Ï|�-¶������-���symfony/yaml/Exception/ExceptionInterface.phpÆ��"qUÆ��î+l¶���������symfony/yaml/Parser.phpuh��"qUuh��6Q²}¶���������symfony/yaml/Dumper.php� ��"qU� ��l£D¶���������symfony/yaml/Escaper.php��"qU��K‹ã¶���������ca.pemñ��"qUñ��‹byë¶���������doctrine-instantiator/LICENSE$��"qU$��
- Í‚å¶������E���doctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.php~��"qU~��¶ÿÌ:¶������L���doctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.php¥��"qU¥��ó.ðö������R���doctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.phpô��"qUô��hÅ7I¶������R���doctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.phpÎ
- ��"qUÎ
- ��"Ÿè ¶������<���doctrine-instantiator/Doctrine/Instantiator/Instantiator.phpÊ��"qUÊ��X˜¢¶���������php-token-stream/LICENSE��"qU��ƒ-& ¶������0���php-token-stream/Token/Stream/CachingFactory.php?��"qU?��ì'·
¶������!���php-token-stream/Token/Stream.php¼=��"qU¼=��è/⪶���������php-token-stream/Token.phpBX��"qUBX��0 á)¶������(���dbunit/Extensions/Database/Exception.php4��"qU4��ó¾Ù¶������0���dbunit/Extensions/Database/UI/IMediumPrinter.phpØ��"qUØ��…e c¶������)���dbunit/Extensions/Database/UI/Command.php{��"qU{��ÿëTD¶������.���dbunit/Extensions/Database/UI/Mediums/Text.phpÊ
- ��"qUÊ
- ��ºÐ]Ó¶������6���dbunit/Extensions/Database/UI/InvalidModeException.phpõ��"qUõ��~Ë%¶������'���dbunit/Extensions/Database/UI/IMode.phpæ��"qUæ��é=̶������)���dbunit/Extensions/Database/UI/Context.phpC��"qUC��îä]¶������?���dbunit/Extensions/Database/UI/Modes/ExportDataSet/Arguments.php7��"qU7��@?¶������5���dbunit/Extensions/Database/UI/Modes/ExportDataSet.php$��"qU$��×\±À¶������)���dbunit/Extensions/Database/UI/IMedium.php‚��"qU‚��ÐPî÷¶������-���dbunit/Extensions/Database/UI/ModeFactory.phpR��"qUR��£²–û¶������.���dbunit/Extensions/Database/UI/IModeFactory.php��"qU��[E†¶������4���dbunit/Extensions/Database/IDatabaseListConsumer.phpj��"qUj��ƒ�‚¶������2���dbunit/Extensions/Database/Operation/Exception.phpó��"qUó��GLO�¶������0���dbunit/Extensions/Database/Operation/Replace.php���"qU���Ä–?¶������/���dbunit/Extensions/Database/Operation/Insert.php
- ��"qU
- ��{³;¶������/���dbunit/Extensions/Database/Operation/Delete.phpD��"qUD��œ=Œ¶������;���dbunit/Extensions/Database/Operation/IDatabaseOperation.phpü��"qUü��“AÜʶ������-���dbunit/Extensions/Database/Operation/Null.php³��"qU³��L?¶������2���dbunit/Extensions/Database/Operation/DeleteAll.phpË��"qUË��z”¶������/���dbunit/Extensions/Database/Operation/Update.phpÐ ��"qUÐ ��µNÐB¶������1���dbunit/Extensions/Database/Operation/RowBased.phpS��"qUS��hÈ=¶������0���dbunit/Extensions/Database/Operation/Factory.phpá��"qUá��~÷õ¶������2���dbunit/Extensions/Database/Operation/Composite.php¸��"qU¸��€fn¶������1���dbunit/Extensions/Database/Operation/Truncate.phpè
- ��"qUè
- ��{�÷>¶������'���dbunit/Extensions/Database/TestCase.phpw!��"qUw!��´ƒY¶������-���dbunit/Extensions/Database/AbstractTester.phpM��"qUM��/ýÅh¶������1���dbunit/Extensions/Database/DB/MetaData/Sqlite.php]��"qU]�� ÂŒ¶������0���dbunit/Extensions/Database/DB/MetaData/Dblib.phpû��"qUû��Ý_¶������0���dbunit/Extensions/Database/DB/MetaData/MySQL.phpõ ��"qUõ ���’¥†¶������<���dbunit/Extensions/Database/DB/MetaData/InformationSchema.php“��"qU“��ý뛜¶������3���dbunit/Extensions/Database/DB/MetaData/Firebird.php��"qU��ã{ꙶ������.���dbunit/Extensions/Database/DB/MetaData/Oci.php|��"qU|��•ÍhŸ¶������0���dbunit/Extensions/Database/DB/MetaData/PgSQL.phpÞ��"qUÞ��¸Ç¾�¶������1���dbunit/Extensions/Database/DB/MetaData/SqlSrv.php´��"qU´��¼N|¶������'���dbunit/Extensions/Database/DB/Table.phpÒ��"qUÒ��Ú~˜P¶������1���dbunit/Extensions/Database/DB/FilteredDataSet.phpv��"qUv��[å—T¶������5���dbunit/Extensions/Database/DB/IDatabaseConnection.php½��"qU½��G$Ú/¶������/���dbunit/Extensions/Database/DB/TableMetaData.phpI��"qUI��âŠ9�¶������*���dbunit/Extensions/Database/DB/MetaData.phpu��"qUu��«ðƒ»¶������;���dbunit/Extensions/Database/DB/DefaultDatabaseConnection.php2��"qU2��ô†ç¾¶������+���dbunit/Extensions/Database/DB/IMetaData.php_��"qU_��aI
¶������/���dbunit/Extensions/Database/DB/TableIterator.php³��"qU³��åE¢Ï¶������)���dbunit/Extensions/Database/DB/DataSet.php��"qU��Ú«¥.¶������0���dbunit/Extensions/Database/DB/ResultSetTable.php��"qU��‚ƒ%®¶������,���dbunit/Extensions/Database/DefaultTester.phpØ��"qUØ��Õª\¶������6���dbunit/Extensions/Database/Constraint/TableIsEqual.php¬ ��"qU¬ ��ýG¶������8���dbunit/Extensions/Database/Constraint/DataSetIsEqual.phpº ��"qUº ��ž_ˆÑ¶������7���dbunit/Extensions/Database/Constraint/TableRowCount.php½��"qU½��Reƶ������&���dbunit/Extensions/Database/ITester.phpÓ ��"qUÓ ��–%V¶������6���dbunit/Extensions/Database/DataSet/MysqlXmlDataSet.phpV��"qUV��#꥗¶������3���dbunit/Extensions/Database/DataSet/QueryDataSet.php˜
- ��"qU˜
- ��Èß¡¶������2���dbunit/Extensions/Database/DataSet/YamlDataSet.php<��"qU<��®Êƒ¶������6���dbunit/Extensions/Database/DataSet/AbstractDataSet.phpÒ��"qUÒ��Ý„¿¶������,���dbunit/Extensions/Database/DataSet/ISpec.php²��"qU²��<Ñòê¶������2���dbunit/Extensions/Database/DataSet/TableFilter.php��"qU��}œŽ¶������<���dbunit/Extensions/Database/DataSet/AbstractTableMetaData.php��"qU��bà�¶������7���dbunit/Extensions/Database/DataSet/CompositeDataSet.php:��"qU:��¹°&c¶������;���dbunit/Extensions/Database/DataSet/DefaultTableIterator.phpÍ
- ��"qUÍ
- ��ŽÆoP¶������4���dbunit/Extensions/Database/DataSet/DataSetFilter.php?��"qU?��f9¶k¶������2���dbunit/Extensions/Database/DataSet/IYamlParser.php��"qU��f*¹¶������1���dbunit/Extensions/Database/DataSet/XmlDataSet.php²��"qU²��R�ç)¶������5���dbunit/Extensions/Database/DataSet/DefaultDataSet.phpÀ��"qUÀ��É¥|}¶������8���dbunit/Extensions/Database/DataSet/SymfonyYamlParser.php<��"qU<��hpúì¶������/���dbunit/Extensions/Database/DataSet/IDataSet.phpù��"qUù��¼)V@¶������5���dbunit/Extensions/Database/DataSet/ITableMetaData.phpa��"qUa��£+϶������:���dbunit/Extensions/Database/DataSet/Persistors/Abstract.php��"qU��.BEö������5���dbunit/Extensions/Database/DataSet/Persistors/Xml.php?
��"qU?
��}©¥)¶������9���dbunit/Extensions/Database/DataSet/Persistors/FlatXml.php“��"qU“��6gtæ¶������6���dbunit/Extensions/Database/DataSet/Persistors/Yaml.php��"qU��÷臨������:���dbunit/Extensions/Database/DataSet/Persistors/MysqlXml.phpë��"qUë��=¹j¶������9���dbunit/Extensions/Database/DataSet/Persistors/Factory.phpÞ��"qUÞ��Ù°Å�¶������1���dbunit/Extensions/Database/DataSet/CsvDataSet.php��"qU�� b«¶������?���dbunit/Extensions/Database/DataSet/ReplacementTableIterator.php¹��"qU¹��‚ú·1¶������9���dbunit/Extensions/Database/DataSet/ReplacementDataSet.php‰��"qU‰��Á´à`¶������3���dbunit/Extensions/Database/DataSet/ArrayDataSet.phps ��"qUs ��L¹#¶������3���dbunit/Extensions/Database/DataSet/DefaultTable.php¯ ��"qU¯ ��È&íâ¶������5���dbunit/Extensions/Database/DataSet/ITableIterator.php3��"qU3��IÕ)ã¶������5���dbunit/Extensions/Database/DataSet/FlatXmlDataSet.php��"qU��ïëèJ¶������3���dbunit/Extensions/Database/DataSet/IPersistable.php½��"qU½��´)Š¶������9���dbunit/Extensions/Database/DataSet/AbstractXmlDataSet.php�
��"qU�
��>ÞQª¶������:���dbunit/Extensions/Database/DataSet/TableMetaDataFilter.phpS��"qUS��íN4µ¶������7���dbunit/Extensions/Database/DataSet/ReplacementTable.php\��"qU\��—/ ¶������4���dbunit/Extensions/Database/DataSet/Specs/DbQuery.php
- ��"qU
- ��†@é¶������0���dbunit/Extensions/Database/DataSet/Specs/Xml.phpÓ��"qUÓ��þ�ýÙ¶������4���dbunit/Extensions/Database/DataSet/Specs/FlatXml.phpí��"qUí��{Éýt¶������1���dbunit/Extensions/Database/DataSet/Specs/Yaml.phpÙ��"qUÙ��b—"V¶������5���dbunit/Extensions/Database/DataSet/Specs/IFactory.phpz��"qUz��(r¼K¶������0���dbunit/Extensions/Database/DataSet/Specs/Csv.phpŠ��"qUŠ��–ÚSu¶������4���dbunit/Extensions/Database/DataSet/Specs/DbTable.php ��"qU ��/.¹É¶������4���dbunit/Extensions/Database/DataSet/Specs/Factory.phpè��"qUè��w_¸S¶������1���dbunit/Extensions/Database/DataSet/QueryTable.php-��"qU-��dqgƒ¶������4���dbunit/Extensions/Database/DataSet/AbstractTable.php€��"qU€��¾¦=ˆ¶������-���dbunit/Extensions/Database/DataSet/ITable.phpE��"qUE��Ë”À¶������;���dbunit/Extensions/Database/DataSet/DefaultTableMetaData.phpË��"qUË��˜âÒ˶���������php-invoker/Invoker.php&��"qU&��Š-顶������(���php-invoker/Invoker/TimeoutException.phpÕ ��"qUÕ ��•nŠ¶���������phpunit-mock-objects/LICENSE��"qU��C>©¶������5���phpunit-mock-objects/Framework/MockObject/Matcher.php"��"qU"��††Îá¶������8���phpunit-mock-objects/Framework/MockObject/Verifiable.php��"qU��l&¡¶������7���phpunit-mock-objects/Framework/MockObject/Invokable.php ��"qU ��^Ò¶������9���phpunit-mock-objects/Framework/MockObject/MockBuilder.php“��"qU“��Í(ض������A���phpunit-mock-objects/Framework/MockObject/Exception/Exception.phpà��"qUà��K5¶������N���phpunit-mock-objects/Framework/MockObject/Exception/BadMethodCallException.phpû��"qUû��P¿¶������H���phpunit-mock-objects/Framework/MockObject/Exception/RuntimeException.phpï��"qUï��êžõn¶������8���phpunit-mock-objects/Framework/MockObject/Invocation.phpñ��"qUñ��ªk`¶������8���phpunit-mock-objects/Framework/MockObject/MockObject.phpH��"qUH��ñB1ÿ¶������>���phpunit-mock-objects/Framework/MockObject/InvocationMocker.phpŽ��"qUŽ��OO¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/MethodName.php‡��"qU‡��ÊúUÔ¶������H���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastOnce.php4��"qU4���ˆû¶������C���phpunit-mock-objects/Framework/MockObject/Matcher/AnyParameters.phpª��"qUª��v X¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/Parameters.php÷��"qU÷��{ò4%¶������E���phpunit-mock-objects/Framework/MockObject/Matcher/AnyInvokedCount.phpD��"qUD��êO¶������I���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtLeastCount.phph��"qUh��m�k£¶������@���phpunit-mock-objects/Framework/MockObject/Matcher/Invocation.phph ��"qUh ��?¿fj¶������K���phpunit-mock-objects/Framework/MockObject/Matcher/ConsecutiveParameters.php¦��"qU¦��¥\#Ƕ������D���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtIndex.phpƒ
- ��"qUƒ
- ��Gµ0Ô¶������B���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedCount.php
��"qU
��pŸµ¶������H���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedAtMostCount.php]��"qU]��¿„€:¶������E���phpunit-mock-objects/Framework/MockObject/Matcher/InvokedRecorder.phpÎ��"qUÎ��t#vó¶������I���phpunit-mock-objects/Framework/MockObject/Matcher/StatelessInvocation.phpÏ ��"qUÏ ��âdÙ¶������7���phpunit-mock-objects/Framework/MockObject/Generator.phpD”��"qUD”��µ#7Ó¶������H���phpunit-mock-objects/Framework/MockObject/Generator/wsdl_method.tpl.dist<���"qU<���¾Ði‰¶������K���phpunit-mock-objects/Framework/MockObject/Generator/unmocked_clone.tpl.distŸ���"qUŸ���8W}ض������I���phpunit-mock-objects/Framework/MockObject/Generator/mocked_class.tpl.dist��"qU��¨ÑFZ¶������I���phpunit-mock-objects/Framework/MockObject/Generator/mocked_clone.tpl.dist„���"qU„���œaT¶������K���phpunit-mock-objects/Framework/MockObject/Generator/proxied_method.tpl.distÌ��"qUÌ��?a§¶������G���phpunit-mock-objects/Framework/MockObject/Generator/wsdl_class.tpl.dist³���"qU³���w&S¶������H���phpunit-mock-objects/Framework/MockObject/Generator/trait_class.tpl.dist7���"qU7���²[$~¶������J���phpunit-mock-objects/Framework/MockObject/Generator/mocked_method.tpl.dist„��"qU„��ãbVæ¶������P���phpunit-mock-objects/Framework/MockObject/Generator/mocked_class_method.tpl.distí���"qUí���Ú4Þ¶������Q���phpunit-mock-objects/Framework/MockObject/Generator/mocked_static_method.tpl.dist—���"qU—���+F°ƒ¶������;���phpunit-mock-objects/Framework/MockObject/Builder/Match.php»��"qU»��¨$Ķ������>���phpunit-mock-objects/Framework/MockObject/Builder/Identity.phpø��"qUø��ðMI3¶������F���phpunit-mock-objects/Framework/MockObject/Builder/InvocationMocker.phpÚ��"qUÚ��Z€‡1¶������E���phpunit-mock-objects/Framework/MockObject/Builder/ParametersMatch.phpd��"qUd��dä9A¶������?���phpunit-mock-objects/Framework/MockObject/Builder/Namespace.php��"qU��Ú14-¶������E���phpunit-mock-objects/Framework/MockObject/Builder/MethodNameMatch.php���"qU���¤ß¹Ž¶������:���phpunit-mock-objects/Framework/MockObject/Builder/Stub.phpÓ��"qUÓ��¿ã{¶������?���phpunit-mock-objects/Framework/MockObject/Invocation/Object.php��"qU��Qð¶������?���phpunit-mock-objects/Framework/MockObject/Invocation/Static.php˜��"qU˜��zÎé¶������2���phpunit-mock-objects/Framework/MockObject/Stub.phpÀ��"qUÀ��àúŒ¶������<���phpunit-mock-objects/Framework/MockObject/Stub/Exception.php%��"qU%��9¦u3¶������9���phpunit-mock-objects/Framework/MockObject/Stub/Return.phpÃ��"qUÃ��Oä϶������=���phpunit-mock-objects/Framework/MockObject/Stub/ReturnSelf.php_��"qU_��ÌUÐý¶������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnValueMap.phpå��"qUå��^ÂØá¶������C���phpunit-mock-objects/Framework/MockObject/Stub/ConsecutiveCalls.phpâ��"qUâ��¬;Ä׶������D���phpunit-mock-objects/Framework/MockObject/Stub/MatcherCollection.phpž��"qUž��Ô&d¶������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnCallback.phpÿ��"qUÿ��\Š_á¶������A���phpunit-mock-objects/Framework/MockObject/Stub/ReturnArgument.phph��"qUh��ƶŒW¶���������phpunit/Exception.php”��"qU”���ü†¶���������phpunit/Framework/Test.php¯��"qU¯��òiKF¶���������phpunit/Framework/Exception.phpF
- ��"qUF
- ��±Ò¬¶������!���phpunit/Framework/OutputError.php
��"qU
��Ž'þg¶���������phpunit/Framework/Assert.php9‡�"qU9‡�þµ�$¶������+���phpunit/Framework/CodeCoverageException.php—��"qU—��3Í�¶���������phpunit/Framework/TestSuite.php‹v��"qU‹v��h|¢9¶���������phpunit/Framework/RiskyTest.phpÏ��"qUÏ��Ê,yd¶������$���phpunit/Framework/SelfDescribing.php<��"qU<��Äb“ݶ������&���phpunit/Framework/Assert/Functions.phpû��"qUû��Ž]¦
- ¶������$���phpunit/Framework/SyntheticError.phpA��"qUA��@]öæ¶������$���phpunit/Framework/RiskyTestError.php)��"qU)��<˜D»¶������"���phpunit/Framework/TestListener.phps��"qUs��ý@S¶������&���phpunit/Framework/ExceptionWrapper.phpˆ ��"qUˆ ��žø¶¶������!���phpunit/Framework/SkippedTest.php´��"qU´��!÷BŸ¶������2���phpunit/Framework/InvalidCoversTargetException.phpª��"qUª��ú}Äζ���������phpunit/Framework/TestCase.php‰÷��"qU‰÷��O;@¶������0���phpunit/Framework/ExpectationFailedException.php¿��"qU¿��⊙Ÿ¶���������phpunit/Framework/Error.phpJ��"qUJ��ðÛPá¶������ ���phpunit/Framework/Constraint.php…��"qU…��âñc¶������*���phpunit/Framework/AssertionFailedError.php¡��"qU¡��zì&ÿ¶������(���phpunit/Framework/IncompleteTestCase.phpb��"qUb��e{ªÿ¶������,���phpunit/Framework/TestSuite/DataProvider.php¹��"qU¹��
- Š2¶������&���phpunit/Framework/Error/Deprecated.phpr��"qUr��%Ç»¶������"���phpunit/Framework/Error/Notice.php\��"qU\��”ä¶������#���phpunit/Framework/Error/Warning.php_��"qU_�� ‰÷'¶������)���phpunit/Framework/IncompleteTestError.php9��"qU9��˜eõ¶������.���phpunit/Framework/InvalidCoversTargetError.phph��"qUh��6R›ª¶������+���phpunit/Framework/SkippedTestSuiteError.php:��"qU:��“4i®¶������ ���phpunit/Framework/TestResult.phpQo��"qUQo��{„��¶������!���phpunit/Framework/TestFailure.php,��"qU,��ÅD0S¶������$���phpunit/Framework/IncompleteTest.php��"qU��±Êûp¶������%���phpunit/Framework/SkippedTestCase.php��"qU��ŒÂW¶������2���phpunit/Framework/Constraint/ClassHasAttribute.php& ��"qU& ��‡H¾‘¶������4���phpunit/Framework/Constraint/TraversableContains.phpR��"qUR��áDì¶������.���phpunit/Framework/Constraint/ExceptionCode.php’��"qU’��HK}¶������*���phpunit/Framework/Constraint/Exception.php� ��"qU� ��à¼í€¶������)���phpunit/Framework/Constraint/SameSize.phpÏ��"qUÏ��ýonp¶������,���phpunit/Framework/Constraint/JsonMatches.php>��"qU>��tr¶������-���phpunit/Framework/Constraint/IsInstanceOf.php!
- ��"qU!
- ��Y?›¤¶������3���phpunit/Framework/Constraint/ObjectHasAttribute.php��"qU��p½´Ç¶������'���phpunit/Framework/Constraint/IsType.phpX��"qUX��ƒ¢M¤¶������)���phpunit/Framework/Constraint/LessThan.php&��"qU&��> ÀJ¶������,���phpunit/Framework/Constraint/ArraySubset.phpm ��"qUm ��¼çÇ…¶������'���phpunit/Framework/Constraint/IsTrue.phpÙ��"qUÙ��D�¿˜¶������'���phpunit/Framework/Constraint/IsJson.php½��"qU½��â+¹¶������(���phpunit/Framework/Constraint/IsEqual.php”��"qU”�� Kôì¶������$���phpunit/Framework/Constraint/Xor.php¨
��"qU¨
��²½B¶������A���phpunit/Framework/Constraint/JsonMatches/ErrorMessageProvider.phpÈ��"qUÈ��|q"ž¶������.���phpunit/Framework/Constraint/StringMatches.php�
- ��"qU�
- ��c¶������$���phpunit/Framework/Constraint/Not.phpÖ��"qUÖ��ÃO|Ѷ������7���phpunit/Framework/Constraint/ExceptionMessageRegExp.php���"qU���–vøö¶������,���phpunit/Framework/Constraint/GreaterThan.php/��"qU/��“,Ð߶������1���phpunit/Framework/Constraint/ExceptionMessage.phpv��"qUv��zÞ§¶������)���phpunit/Framework/Constraint/Callback.php•��"qU•��
- ø'“¶������,���phpunit/Framework/Constraint/ArrayHasKey.php# ��"qU# ��q{E¶������/���phpunit/Framework/Constraint/StringContains.phpŸ��"qUŸ��žÞ=Ŷ������8���phpunit/Framework/Constraint/TraversableContainsOnly.php„��"qU„��â¼gt¶������(���phpunit/Framework/Constraint/IsEmpty.php‰��"qU‰��O–ñѶ������*���phpunit/Framework/Constraint/PCREMatch.php%��"qU%��1ü휶������'���phpunit/Framework/Constraint/IsNull.phpÙ��"qUÙ��˜ÿ_=¶������*���phpunit/Framework/Constraint/Attribute.phpj��"qUj��A=qĶ������(���phpunit/Framework/Constraint/IsFalse.phpÝ��"qUÝ��Ó¢i‘¶������8���phpunit/Framework/Constraint/ClassHasStaticAttribute.phpå��"qUå��óæ‰B¶������#���phpunit/Framework/Constraint/Or.php5
��"qU5
��ÅΧ¼¶������,���phpunit/Framework/Constraint/IsIdentical.php¥��"qU¥���Ú&¶������+���phpunit/Framework/Constraint/FileExists.php��"qU��€Áf¶������*���phpunit/Framework/Constraint/Composite.php� ��"qU� ��k°Ù¶������1���phpunit/Framework/Constraint/StringStartsWith.php.��"qU.��ÆV—'¶������/���phpunit/Framework/Constraint/StringEndsWith.php?��"qU?��l6¼¶������+���phpunit/Framework/Constraint/IsAnything.phpB��"qUB��áë¼E¶������&���phpunit/Framework/Constraint/Count.phpX��"qUX��'m¯ý¶������$���phpunit/Framework/Constraint/And.phpÿ
��"qUÿ
��ƒ\�)¶������&���phpunit/Framework/BaseTestListener.php“��"qU“��.ØŠ¶������&���phpunit/Framework/SkippedTestError.php/��"qU/��¨§—þ¶������5���phpunit/Framework/UnintentionallyCoveredCodeError.php-��"qU-��ó‹Ù±¶���������phpunit/Framework/Warning.phpå��"qUå��7£þ¶������%���phpunit/Extensions/GroupTestSuite.php«��"qU«��Pz¦¶������$���phpunit/Extensions/PhptTestSuite.phpL��"qUL��XgPp¶������#���phpunit/Extensions/RepeatedTest.phpÞ
- ��"qUÞ
- ��Ò®¸®¶������%���phpunit/Extensions/TicketListener.php—��"qU—��Š“Bó¶������$���phpunit/Extensions/TestDecorator.phph
- ��"qUh
- ��Ϻ‰W¶������#���phpunit/Extensions/PhptTestCase.phpó��"qUó��2ðiª¶���������phpunit/TextUI/Command.php{��"qU{��|÷¶���������phpunit/TextUI/TestRunner.phpNŸ��"qUNŸ��Aø�¶������ ���phpunit/TextUI/ResultPrinter.php<E��"qU<E��,j:Û¶���������phpunit/Util/Test.php<{��"qU<{��´ÂK™¶���������phpunit/Util/Filesystem.phpª��"qUª��£•a¶���������phpunit/Util/Getopt.php'��"qU'��¿ºû�¶���������phpunit/Util/ErrorHandler.php&��"qU&��Û[Ð!¶���������phpunit/Util/String.php˜��"qU˜��µl"߶������&���phpunit/Util/InvalidArgumentHelper.php¯��"qU¯��µ©¶���������phpunit/Util/Printer.php”��"qU”��{…Z¶���������phpunit/Util/Configuration.phpê‰��"qUê‰��`à€¶���������phpunit/Util/GlobalState.phpU��"qUU��}¼RL¶���������phpunit/Util/Log/JSON.phpï��"qUï��f'ª—¶���������phpunit/Util/Log/TAP.php
- ��"qU
- ��ì�„¶���������phpunit/Util/Log/JUnit.phpð5��"qUð5��F¤ÃJ¶���������phpunit/Util/Blacklist.phpÌ
��"qUÌ
��Ê脶������"���phpunit/Util/TestSuiteIterator.phpX ��"qUX ��÷8¤Ä¶���������phpunit/Util/Filter.phpò��"qUò��B¼}ƒ¶������+���phpunit/Util/TestDox/ResultPrinter/HTML.phpé��"qUé��+
=¶������+���phpunit/Util/TestDox/ResultPrinter/Text.php¢��"qU¢��IVz¶������&���phpunit/Util/TestDox/ResultPrinter.php§ ��"qU§ ��úO³¸¶������'���phpunit/Util/TestDox/NamePrettifier.phpw
��"qUw
��¸$™|¶���������phpunit/Util/Regex.phpó��"qUó��=g¾¥¶���������phpunit/Util/Type.php)��"qU)��_ûž¶���������phpunit/Util/PHP/Default.phpè��"qUè��Zµoþ¶������1���phpunit/Util/PHP/Template/TestCaseMethod.tpl.dist6��"qU6��+}ÕV¶���������phpunit/Util/PHP/Windows.php™��"qU™��^¤ñ¶���������phpunit/Util/Fileloader.phpþ��"qUþ��˜NÅ϶���������phpunit/Util/XML.phpñw��"qUñw��»Ê[•¶���������phpunit/Util/PHP.phpá��"qUá��0¸KÚ¶���������phpunit/Runner/Exception.php—��"qU—��Íl £¶���������phpunit/Runner/Filter/Test.php1
��"qU1
��{4:s¶������'���phpunit/Runner/Filter/Group/Exclude.php��"qU��øÎY¾¶������'���phpunit/Runner/Filter/Group/Include.php��"qU��‹p»t¶������!���phpunit/Runner/Filter/Factory.phpõ��"qUõ��©‰¢ß¶���������phpunit/Runner/Filter/Group.php&��"qU&��ÐõÓŠ¶������"���phpunit/Runner/TestSuiteLoader.php ��"qU ��5 b¶������!���phpunit/Runner/BaseTestRunner.php½��"qU½��_DZ{¶������*���phpunit/Runner/StandardTestSuiteLoader.php��"qU���îP¶���������phpunit/Runner/Version.phpÍ��"qUÍ��T"¯¶���������sebastian-environment/LICENSE
- ��"qU
- ��¶îá߶������!���sebastian-environment/Runtime.phpÄ��"qUÄ��¹º¶������!���sebastian-environment/Console.php©��"qU©��qí*¶������)���phpdocumentor-reflection-docblock/LICENSE8��"qU8��á‰Ê¶������G���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock.phpc6��"qUc6��õËq¶������P���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Location.phpq��"qUq��uÁ/¶������T���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php|��"qU|��tøûR¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.phpÿ��"qUÿ��ià?$¶������V���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.phpx
- ��"qUx
- ��ÓËEƶ������W���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.phpO��"qUO��«Î#m¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.phpÙ��"qUÙ��pS�ž¶������Y���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php†��"qU†��K§¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.phpL��"qUL��œ"â¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.phpI��"qUI��9¹{¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php���"qU���äÙn*¶������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.phpE��"qUE��.�„˶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php~��"qU~��å!kͶ������[���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php[��"qU[��Í<=¶������U���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.phpM��"qUM��1ôú¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/VarTag.phpE��"qUE��ƒ•üͶ������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.phpL��"qUL���ªF¶������V���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php™��"qU™��
£
- ï¶������T���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.phpH��"qUH��±ñ¶������\���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php]��"qU]��Rp¶������R���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Serializer.php��"qU��òrж������O���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Context.php5��"qU5��l.%¶������W���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Type/Collection.php���"qU���+=4¶������K���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Tag.phpÛ(��"qUÛ(��ŒE6¶������S���phpdocumentor-reflection-docblock/phpDocumentor/Reflection/DocBlock/Description.php—��"qU—��ñԲض���������sebastian-version/LICENSE��"qU��n¶���������sebastian-version/Version.phpH��"qUH��ÿê'¶������<?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- interface Exception
- {
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use Closure;
- use ReflectionClass;
- /**
- * A snapshot of global state.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Snapshot
- {
- /**
- * @var Blacklist
- */
- private $blacklist;
- /**
- * @var array
- */
- private $globalVariables = array();
- /**
- * @var array
- */
- private $superGlobalArrays = array();
- /**
- * @var array
- */
- private $superGlobalVariables = array();
- /**
- * @var array
- */
- private $staticAttributes = array();
- /**
- * @var array
- */
- private $iniSettings = array();
- /**
- * @var array
- */
- private $includedFiles = array();
- /**
- * @var array
- */
- private $constants = array();
- /**
- * @var array
- */
- private $functions = array();
- /**
- * @var array
- */
- private $interfaces = array();
- /**
- * @var array
- */
- private $classes = array();
- /**
- * @var array
- */
- private $traits = array();
- /**
- * Creates a snapshot of the current global state.
- *
- * @param Blacklist $blacklist
- * @param boolean $includeGlobalVariables
- * @param boolean $includeStaticAttributes
- * @param boolean $includeConstants
- * @param boolean $includeFunctions
- * @param boolean $includeClasses
- * @param boolean $includeInterfaces
- * @param boolean $includeTraits
- * @param boolean $includeIniSettings
- * @param boolean $includeIncludedFiles
- */
- public function __construct(Blacklist $blacklist = null, $includeGlobalVariables = true, $includeStaticAttributes = true, $includeConstants = true, $includeFunctions = true, $includeClasses = true, $includeInterfaces = true, $includeTraits = true, $includeIniSettings = true, $includeIncludedFiles = true)
- {
- if ($blacklist === null) {
- $blacklist = new Blacklist;
- }
- $this->blacklist = $blacklist;
- if ($includeConstants) {
- $this->snapshotConstants();
- }
- if ($includeFunctions) {
- $this->snapshotFunctions();
- }
- if ($includeClasses || $includeStaticAttributes) {
- $this->snapshotClasses();
- }
- if ($includeInterfaces) {
- $this->snapshotInterfaces();
- }
- if ($includeGlobalVariables) {
- $this->setupSuperGlobalArrays();
- $this->snapshotGlobals();
- }
- if ($includeStaticAttributes) {
- $this->snapshotStaticAttributes();
- }
- if ($includeIniSettings) {
- $this->iniSettings = ini_get_all(null, false);
- }
- if ($includeIncludedFiles) {
- $this->includedFiles = get_included_files();
- }
- if (function_exists('get_declared_traits')) {
- $this->traits = get_declared_traits();
- }
- }
- /**
- * @return Blacklist
- */
- public function blacklist()
- {
- return $this->blacklist;
- }
- /**
- * @return array
- */
- public function globalVariables()
- {
- return $this->globalVariables;
- }
- /**
- * @return array
- */
- public function superGlobalVariables()
- {
- return $this->superGlobalVariables;
- }
- /**
- * Returns a list of all super-global variable arrays.
- *
- * @return array
- */
- public function superGlobalArrays()
- {
- return $this->superGlobalArrays;
- }
- /**
- * @return array
- */
- public function staticAttributes()
- {
- return $this->staticAttributes;
- }
- /**
- * @return array
- */
- public function iniSettings()
- {
- return $this->iniSettings;
- }
- /**
- * @return array
- */
- public function includedFiles()
- {
- return $this->includedFiles;
- }
- /**
- * @return array
- */
- public function constants()
- {
- return $this->constants;
- }
- /**
- * @return array
- */
- public function functions()
- {
- return $this->functions;
- }
- /**
- * @return array
- */
- public function interfaces()
- {
- return $this->interfaces;
- }
- /**
- * @return array
- */
- public function classes()
- {
- return $this->classes;
- }
- /**
- * @return array
- */
- public function traits()
- {
- return $this->traits;
- }
- /**
- * Creates a snapshot user-defined constants.
- */
- private function snapshotConstants()
- {
- $constants = get_defined_constants(true);
- if (isset($constants['user'])) {
- $this->constants = $constants['user'];
- }
- }
- /**
- * Creates a snapshot user-defined functions.
- */
- private function snapshotFunctions()
- {
- $functions = get_defined_functions();
- $this->functions = $functions['user'];
- }
- /**
- * Creates a snapshot user-defined classes.
- */
- private function snapshotClasses()
- {
- foreach (array_reverse(get_declared_classes()) as $className) {
- $class = new ReflectionClass($className);
- if (!$class->isUserDefined()) {
- break;
- }
- $this->classes[] = $className;
- }
- $this->classes = array_reverse($this->classes);
- }
- /**
- * Creates a snapshot user-defined interfaces.
- */
- private function snapshotInterfaces()
- {
- foreach (array_reverse(get_declared_interfaces()) as $interfaceName) {
- $class = new ReflectionClass($interfaceName);
- if (!$class->isUserDefined()) {
- break;
- }
- $this->interfaces[] = $interfaceName;
- }
- $this->interfaces = array_reverse($this->interfaces);
- }
- /**
- * Creates a snapshot of all global and super-global variables.
- */
- private function snapshotGlobals()
- {
- $superGlobalArrays = $this->superGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- $this->snapshotSuperGlobalArray($superGlobalArray);
- }
- foreach (array_keys($GLOBALS) as $key) {
- if ($key != 'GLOBALS' &&
- !in_array($key, $superGlobalArrays) &&
- $this->canBeSerialized($GLOBALS[$key]) &&
- !$this->blacklist->isGlobalVariableBlacklisted($key)) {
- $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key]));
- }
- }
- }
- /**
- * Creates a snapshot a super-global variable array.
- *
- * @param $superGlobalArray
- */
- private function snapshotSuperGlobalArray($superGlobalArray)
- {
- $this->superGlobalVariables[$superGlobalArray] = array();
- if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) {
- foreach ($GLOBALS[$superGlobalArray] as $key => $value) {
- $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value));
- }
- }
- }
- /**
- * Creates a snapshot of all static attributes in user-defined classes.
- */
- private function snapshotStaticAttributes()
- {
- foreach ($this->classes as $className) {
- $class = new ReflectionClass($className);
- $snapshot = array();
- foreach ($class->getProperties() as $attribute) {
- if ($attribute->isStatic()) {
- $name = $attribute->getName();
- if ($this->blacklist->isStaticAttributeBlacklisted($className, $name)) {
- continue;
- }
- $attribute->setAccessible(true);
- $value = $attribute->getValue();
- if ($this->canBeSerialized($value)) {
- $snapshot[$name] = unserialize(serialize($value));
- }
- }
- }
- if (!empty($snapshot)) {
- $this->staticAttributes[$className] = $snapshot;
- }
- }
- }
- /**
- * Returns a list of all super-global variable arrays.
- *
- * @return array
- */
- private function setupSuperGlobalArrays()
- {
- $this->superGlobalArrays = array(
- '_ENV',
- '_POST',
- '_GET',
- '_COOKIE',
- '_SERVER',
- '_FILES',
- '_REQUEST'
- );
- if (ini_get('register_long_arrays') == '1') {
- $this->superGlobalArrays = array_merge(
- $this->superGlobalArrays,
- array(
- 'HTTP_ENV_VARS',
- 'HTTP_POST_VARS',
- 'HTTP_GET_VARS',
- 'HTTP_COOKIE_VARS',
- 'HTTP_SERVER_VARS',
- 'HTTP_POST_FILES'
- )
- );
- }
- }
- /**
- * @param mixed $variable
- * @return boolean
- * @todo Implement this properly
- */
- private function canBeSerialized($variable) {
- return !$variable instanceof Closure;
- }
- }
- GlobalState
- Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use ReflectionProperty;
- /**
- * Restorer of snapshots of global state.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Restorer
- {
- /**
- * Deletes function definitions that are not defined in a snapshot.
- *
- * @param Snapshot $snapshot
- * @throws RuntimeException when the uopz_delete() function is not available
- * @see https://github.com/krakjoe/uopz
- */
- public function restoreFunctions(Snapshot $snapshot)
- {
- if (!function_exists('uopz_delete')) {
- throw new RuntimeException('The uopz_delete() function is required for this operation');
- }
- $functions = get_defined_functions();
- foreach (array_diff($functions['user'], $snapshot->functions()) as $function) {
- uopz_delete($function);
- }
- }
- /**
- * Restores all global and super-global variables from a snapshot.
- *
- * @param Snapshot $snapshot
- */
- public function restoreGlobalVariables(Snapshot $snapshot)
- {
- $superGlobalArrays = $snapshot->superGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- $this->restoreSuperGlobalArray($snapshot, $superGlobalArray);
- }
- $globalVariables = $snapshot->globalVariables();
- foreach (array_keys($GLOBALS) as $key) {
- if ($key != 'GLOBALS' &&
- !in_array($key, $superGlobalArrays) &&
- !$snapshot->blacklist()->isGlobalVariableBlacklisted($key)) {
- if (isset($globalVariables[$key])) {
- $GLOBALS[$key] = $globalVariables[$key];
- } else {
- unset($GLOBALS[$key]);
- }
- }
- }
- }
- /**
- * Restores all static attributes in user-defined classes from this snapshot.
- *
- * @param Snapshot $snapshot
- */
- public function restoreStaticAttributes(Snapshot $snapshot)
- {
- foreach ($snapshot->staticAttributes() as $className => $staticAttributes) {
- foreach ($staticAttributes as $name => $value) {
- $reflector = new ReflectionProperty($className, $name);
- $reflector->setAccessible(true);
- $reflector->setValue($value);
- }
- }
- }
- /**
- * Restores a super-global variable array from this snapshot.
- *
- * @param Snapshot $snapshot
- * @param $superGlobalArray
- */
- private function restoreSuperGlobalArray(Snapshot $snapshot, $superGlobalArray)
- {
- $superGlobalVariables = $snapshot->superGlobalVariables();
- if (isset($GLOBALS[$superGlobalArray]) &&
- is_array($GLOBALS[$superGlobalArray]) &&
- isset($superGlobalVariables[$superGlobalArray])) {
- $keys = array_keys(
- array_merge(
- $GLOBALS[$superGlobalArray],
- $superGlobalVariables[$superGlobalArray]
- )
- );
- foreach ($keys as $key) {
- if (isset($superGlobalVariables[$superGlobalArray][$key])) {
- $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key];
- } else {
- unset($GLOBALS[$superGlobalArray][$key]);
- }
- }
- }
- }
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- use ReflectionClass;
- /**
- * A blacklist for global state elements that should not be snapshotted.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class Blacklist
- {
- /**
- * @var array
- */
- private $globalVariables = array();
- /**
- * @var array
- */
- private $classes = array();
- /**
- * @var array
- */
- private $classNamePrefixes = array();
- /**
- * @var array
- */
- private $parentClasses = array();
- /**
- * @var array
- */
- private $interfaces = array();
- /**
- * @var array
- */
- private $staticAttributes = array();
- /**
- * @param string $variableName
- */
- public function addGlobalVariable($variableName)
- {
- $this->globalVariables[$variableName] = true;
- }
- /**
- * @param string $className
- */
- public function addClass($className)
- {
- $this->classes[] = $className;
- }
- /**
- * @param string $className
- */
- public function addSubclassesOf($className)
- {
- $this->parentClasses[] = $className;
- }
- /**
- * @param string $interfaceName
- */
- public function addImplementorsOf($interfaceName)
- {
- $this->interfaces[] = $interfaceName;
- }
- /**
- * @param string $classNamePrefix
- */
- public function addClassNamePrefix($classNamePrefix)
- {
- $this->classNamePrefixes[] = $classNamePrefix;
- }
- /**
- * @param string $className
- * @param string $attributeName
- */
- public function addStaticAttribute($className, $attributeName)
- {
- if (!isset($this->staticAttributes[$className])) {
- $this->staticAttributes[$className] = array();
- }
- $this->staticAttributes[$className][$attributeName] = true;
- }
- /**
- * @param string $variableName
- * @return boolean
- */
- public function isGlobalVariableBlacklisted($variableName)
- {
- return isset($this->globalVariables[$variableName]);
- }
- /**
- * @param string $className
- * @param string $attributeName
- * @return boolean
- */
- public function isStaticAttributeBlacklisted($className, $attributeName)
- {
- if (in_array($className, $this->classes)) {
- return true;
- }
- foreach ($this->classNamePrefixes as $prefix) {
- if (strpos($className, $prefix) === 0) {
- return true;
- }
- }
- $class = new ReflectionClass($className);
- foreach ($this->parentClasses as $type) {
- if ($class->isSubclassOf($type)) {
- return true;
- }
- }
- foreach ($this->interfaces as $type) {
- if ($class->implementsInterface($type)) {
- return true;
- }
- }
- if (isset($this->staticAttributes[$className][$attributeName])) {
- return true;
- }
- return false;
- }
- }
- <?php
- /**
- * GlobalState
- *
- * Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- namespace SebastianBergmann\GlobalState;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2001-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/global-state
- */
- class RuntimeException extends \RuntimeException implements Exception
- {
- }
- Text_Template
- Copyright (c) 2009-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /**
- * Text_Template
- *
- * Copyright (c) 2009-2014, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category Text
- * @package Template
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2009-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-text-template
- * @since File available since Release 1.0.0
- */
- /**
- * A simple template engine.
- *
- * @category Text
- * @package Template
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2009-2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-text-template
- * @since Class available since Release 1.0.0
- */
- class Text_Template
- {
- /**
- * @var string
- */
- protected $template = '';
- /**
- * @var string
- */
- protected $openDelimiter = '{';
- /**
- * @var string
- */
- protected $closeDelimiter = '}';
- /**
- * @var array
- */
- protected $values = array();
- /**
- * Constructor.
- *
- * @param string $file
- * @throws InvalidArgumentException
- */
- public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}')
- {
- $this->setFile($file);
- $this->openDelimiter = $openDelimiter;
- $this->closeDelimiter = $closeDelimiter;
- }
- /**
- * Sets the template file.
- *
- * @param string $file
- * @throws InvalidArgumentException
- */
- public function setFile($file)
- {
- $distFile = $file . '.dist';
- if (file_exists($file)) {
- $this->template = file_get_contents($file);
- }
- else if (file_exists($distFile)) {
- $this->template = file_get_contents($distFile);
- }
- else {
- throw new InvalidArgumentException(
- 'Template file could not be loaded.'
- );
- }
- }
- /**
- * Sets one or more template variables.
- *
- * @param array $values
- * @param boolean $merge
- */
- public function setVar(array $values, $merge = TRUE)
- {
- if (!$merge || empty($this->values)) {
- $this->values = $values;
- } else {
- $this->values = array_merge($this->values, $values);
- }
- }
- /**
- * Renders the template and returns the result.
- *
- * @return string
- */
- public function render()
- {
- $keys = array();
- foreach ($this->values as $key => $value) {
- $keys[] = $this->openDelimiter . $key . $this->closeDelimiter;
- }
- return str_replace($keys, $this->values, $this->template);
- }
- /**
- * Renders the template and writes the result to a file.
- *
- * @param string $target
- */
- public function renderTo($target)
- {
- $fp = @fopen($target, 'wt');
- if ($fp) {
- fwrite($fp, $this->render());
- fclose($fp);
- } else {
- $error = error_get_last();
- throw new RuntimeException(
- sprintf(
- 'Could not write to %s: %s',
- $target,
- substr(
- $error['message'],
- strpos($error['message'], ':') + 2
- )
- )
- );
- }
- }
- }
- Diff
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Interface for implementations of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- interface LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to);
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Memory-efficient implementation of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Denes Lados <lados.denes@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class MemoryEfficientImplementation implements LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to)
- {
- $cFrom = count($from);
- $cTo = count($to);
- if ($cFrom == 0) {
- return array();
- } elseif ($cFrom == 1) {
- if (in_array($from[0], $to)) {
- return array($from[0]);
- } else {
- return array();
- }
- } else {
- $i = intval($cFrom / 2);
- $fromStart = array_slice($from, 0, $i);
- $fromEnd = array_slice($from, $i);
- $llB = $this->length($fromStart, $to);
- $llE = $this->length(array_reverse($fromEnd), array_reverse($to));
- $jMax = 0;
- $max = 0;
- for ($j = 0; $j <= $cTo; $j++) {
- $m = $llB[$j] + $llE[$cTo - $j];
- if ($m >= $max) {
- $max = $m;
- $jMax = $j;
- }
- }
- $toStart = array_slice($to, 0, $jMax);
- $toEnd = array_slice($to, $jMax);
- return array_merge(
- $this->calculate($fromStart, $toStart),
- $this->calculate($fromEnd, $toEnd)
- );
- }
- }
- /**
- * @param array $from
- * @param array $to
- * @return array
- */
- private function length(array $from, array $to)
- {
- $current = array_fill(0, count($to) + 1, 0);
- $cFrom = count($from);
- $cTo = count($to);
- for ($i = 0; $i < $cFrom; $i++) {
- $prev = $current;
- for ($j = 0; $j < $cTo; $j++) {
- if ($from[$i] == $to[$j]) {
- $current[$j + 1] = $prev[$j] + 1;
- } else {
- $current[$j + 1] = max($current[$j], $prev[$j + 1]);
- }
- }
- }
- return $current;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff\LCS;
- /**
- * Time-efficient implementation of longest common subsequence calculation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class TimeEfficientImplementation implements LongestCommonSubsequence
- {
- /**
- * Calculates the longest common subsequence of two arrays.
- *
- * @param array $from
- * @param array $to
- * @return array
- */
- public function calculate(array $from, array $to)
- {
- $common = array();
- $fromLength = count($from);
- $toLength = count($to);
- $width = $fromLength + 1;
- $matrix = new \SplFixedArray($width * ($toLength + 1));
- for ($i = 0; $i <= $fromLength; ++$i) {
- $matrix[$i] = 0;
- }
- for ($j = 0; $j <= $toLength; ++$j) {
- $matrix[$j * $width] = 0;
- }
- for ($i = 1; $i <= $fromLength; ++$i) {
- for ($j = 1; $j <= $toLength; ++$j) {
- $o = ($j * $width) + $i;
- $matrix[$o] = max(
- $matrix[$o - 1],
- $matrix[$o - $width],
- $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0
- );
- }
- }
- $i = $fromLength;
- $j = $toLength;
- while ($i > 0 && $j > 0) {
- if ($from[$i-1] === $to[$j-1]) {
- $common[] = $from[$i-1];
- --$i;
- --$j;
- } else {
- $o = ($j * $width) + $i;
- if ($matrix[$o - $width] > $matrix[$o - 1]) {
- --$j;
- } else {
- --$i;
- }
- }
- }
- return array_reverse($common);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Line
- {
- const ADDED = 1;
- const REMOVED = 2;
- const UNCHANGED = 3;
- /**
- * @var int
- */
- private $type;
- /**
- * @var string
- */
- private $content;
- /**
- * @param int $type
- * @param string $content
- */
- public function __construct($type = self::UNCHANGED, $content = '')
- {
- $this->type = $type;
- $this->content = $content;
- }
- /**
- * @return string
- */
- public function getContent()
- {
- return $this->content;
- }
- /**
- * @return int
- */
- public function getType()
- {
- return $this->type;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- use SebastianBergmann\Diff\LCS\LongestCommonSubsequence;
- use SebastianBergmann\Diff\LCS\TimeEfficientImplementation;
- use SebastianBergmann\Diff\LCS\MemoryEfficientImplementation;
- /**
- * Diff implementation.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Differ
- {
- /**
- * @var string
- */
- private $header;
- /**
- * @param string $header
- */
- public function __construct($header = "--- Original\n+++ New\n")
- {
- $this->header = $header;
- }
- /**
- * Returns the diff between two arrays or strings as string.
- *
- * @param array|string $from
- * @param array|string $to
- * @param LongestCommonSubsequence $lcs
- * @return string
- */
- public function diff($from, $to, LongestCommonSubsequence $lcs = null)
- {
- if (!is_array($from) && !is_string($from)) {
- $from = (string) $from;
- }
- if (!is_array($to) && !is_string($to)) {
- $to = (string) $to;
- }
- $buffer = $this->header;
- $diff = $this->diffToArray($from, $to, $lcs);
- $inOld = false;
- $i = 0;
- $old = array();
- foreach ($diff as $line) {
- if ($line[1] === 0 /* OLD */) {
- if ($inOld === false) {
- $inOld = $i;
- }
- } elseif ($inOld !== false) {
- if (($i - $inOld) > 5) {
- $old[$inOld] = $i - 1;
- }
- $inOld = false;
- }
- ++$i;
- }
- $start = isset($old[0]) ? $old[0] : 0;
- $end = count($diff);
- if ($tmp = array_search($end, $old)) {
- $end = $tmp;
- }
- $newChunk = true;
- for ($i = $start; $i < $end; $i++) {
- if (isset($old[$i])) {
- $buffer .= "\n";
- $newChunk = true;
- $i = $old[$i];
- }
- if ($newChunk) {
- $buffer .= "@@ @@\n";
- $newChunk = false;
- }
- if ($diff[$i][1] === 1 /* ADDED */) {
- $buffer .= '+' . $diff[$i][0] . "\n";
- } elseif ($diff[$i][1] === 2 /* REMOVED */) {
- $buffer .= '-' . $diff[$i][0] . "\n";
- } else {
- $buffer .= ' ' . $diff[$i][0] . "\n";
- }
- }
- return $buffer;
- }
- /**
- * Returns the diff between two arrays or strings as array.
- *
- * Each array element contains two elements:
- * - [0] => string $token
- * - [1] => 2|1|0
- *
- * - 2: REMOVED: $token was removed from $from
- * - 1: ADDED: $token was added to $from
- * - 0: OLD: $token is not changed in $to
- *
- * @param array|string $from
- * @param array|string $to
- * @param LongestCommonSubsequence $lcs
- * @return array
- */
- public function diffToArray($from, $to, LongestCommonSubsequence $lcs = null)
- {
- preg_match_all('(\r\n|\r|\n)', $from, $fromMatches);
- preg_match_all('(\r\n|\r|\n)', $to, $toMatches);
- if (is_string($from)) {
- $from = preg_split('(\r\n|\r|\n)', $from);
- }
- if (is_string($to)) {
- $to = preg_split('(\r\n|\r|\n)', $to);
- }
- $start = array();
- $end = array();
- $fromLength = count($from);
- $toLength = count($to);
- $length = min($fromLength, $toLength);
- for ($i = 0; $i < $length; ++$i) {
- if ($from[$i] === $to[$i]) {
- $start[] = $from[$i];
- unset($from[$i], $to[$i]);
- } else {
- break;
- }
- }
- $length -= $i;
- for ($i = 1; $i < $length; ++$i) {
- if ($from[$fromLength - $i] === $to[$toLength - $i]) {
- array_unshift($end, $from[$fromLength - $i]);
- unset($from[$fromLength - $i], $to[$toLength - $i]);
- } else {
- break;
- }
- }
- if ($lcs === null) {
- $lcs = $this->selectLcsImplementation($from, $to);
- }
- $common = $lcs->calculate(array_values($from), array_values($to));
- $diff = array();
- if (isset($fromMatches[0]) && $toMatches[0] &&
- count($fromMatches[0]) === count($toMatches[0]) &&
- $fromMatches[0] !== $toMatches[0]) {
- $diff[] = array(
- '#Warning: Strings contain different line endings!', 0
- );
- }
- foreach ($start as $token) {
- $diff[] = array($token, 0 /* OLD */);
- }
- reset($from);
- reset($to);
- foreach ($common as $token) {
- while ((($fromToken = reset($from)) !== $token)) {
- $diff[] = array(array_shift($from), 2 /* REMOVED */);
- }
- while ((($toToken = reset($to)) !== $token)) {
- $diff[] = array(array_shift($to), 1 /* ADDED */);
- }
- $diff[] = array($token, 0 /* OLD */);
- array_shift($from);
- array_shift($to);
- }
- while (($token = array_shift($from)) !== null) {
- $diff[] = array($token, 2 /* REMOVED */);
- }
- while (($token = array_shift($to)) !== null) {
- $diff[] = array($token, 1 /* ADDED */);
- }
- foreach ($end as $token) {
- $diff[] = array($token, 0 /* OLD */);
- }
- return $diff;
- }
- /**
- * @param array $from
- * @param array $to
- * @return LongestCommonSubsequence
- */
- private function selectLcsImplementation(array $from, array $to)
- {
- // We do not want to use the time-efficient implementation if its memory
- // footprint will probably exceed this value. Note that the footprint
- // calculation is only an estimation for the matrix and the LCS method
- // will typically allocate a bit more memory than this.
- $memoryLimit = 100 * 1024 * 1024;
- if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) {
- return new MemoryEfficientImplementation;
- }
- return new TimeEfficientImplementation;
- }
- /**
- * Calculates the estimated memory footprint for the DP-based method.
- *
- * @param array $from
- * @param array $to
- * @return integer
- */
- private function calculateEstimatedFootprint(array $from, array $to)
- {
- $itemSize = PHP_INT_SIZE == 4 ? 76 : 144;
- return $itemSize * pow(min(count($from), count($to)), 2);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * Unified diff parser.
- *
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Parser
- {
- /**
- * @param string $string
- * @return Diff[]
- */
- public function parse($string)
- {
- $lines = preg_split('(\r\n|\r|\n)', $string);
- $lineCount = count($lines);
- $diffs = array();
- $diff = null;
- $collected = array();
- for ($i = 0; $i < $lineCount; ++$i) {
- if (preg_match('(^---\\s+(?P<file>\\S+))', $lines[$i], $fromMatch) &&
- preg_match('(^\\+\\+\\+\\s+(?P<file>\\S+))', $lines[$i + 1], $toMatch)) {
- if ($diff !== null) {
- $this->parseFileDiff($diff, $collected);
- $diffs[] = $diff;
- $collected = array();
- }
- $diff = new Diff($fromMatch['file'], $toMatch['file']);
- ++$i;
- } else {
- if (preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) {
- continue;
- }
- $collected[] = $lines[$i];
- }
- }
- if (count($collected) && ($diff !== null)) {
- $this->parseFileDiff($diff, $collected);
- $diffs[] = $diff;
- }
- return $diffs;
- }
- /**
- * @param Diff $diff
- * @param array $lines
- */
- private function parseFileDiff(Diff $diff, array $lines)
- {
- $chunks = array();
- foreach ($lines as $line) {
- if (preg_match('/^@@\s+-(?P<start>\d+)(?:,\s*(?P<startrange>\d+))?\s+\+(?P<end>\d+)(?:,\s*(?P<endrange>\d+))?\s+@@/', $line, $match)) {
- $chunk = new Chunk(
- $match['start'],
- isset($match['startrange']) ? max(1, $match['startrange']) : 1,
- $match['end'],
- isset($match['endrange']) ? max(1, $match['endrange']) : 1
- );
- $chunks[] = $chunk;
- $diffLines = array();
- continue;
- }
- if (preg_match('/^(?P<type>[+ -])?(?P<line>.*)/', $line, $match)) {
- $type = Line::UNCHANGED;
- if ($match['type'] == '+') {
- $type = Line::ADDED;
- } elseif ($match['type'] == '-') {
- $type = Line::REMOVED;
- }
- $diffLines[] = new Line($type, $match['line']);
- if (isset($chunk)) {
- $chunk->setLines($diffLines);
- }
- }
- }
- $diff->setChunks($chunks);
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Diff
- {
- /**
- * @var string
- */
- private $from;
- /**
- * @var string
- */
- private $to;
- /**
- * @var Chunk[]
- */
- private $chunks;
- /**
- * @param string $from
- * @param string $to
- * @param Chunk[] $chunks
- */
- public function __construct($from, $to, array $chunks = array())
- {
- $this->from = $from;
- $this->to = $to;
- $this->chunks = $chunks;
- }
- /**
- * @return string
- */
- public function getFrom()
- {
- return $this->from;
- }
- /**
- * @return string
- */
- public function getTo()
- {
- return $this->to;
- }
- /**
- * @return Chunk[]
- */
- public function getChunks()
- {
- return $this->chunks;
- }
- /**
- * @param Chunk[] $chunks
- */
- public function setChunks(array $chunks)
- {
- $this->chunks = $chunks;
- }
- }
- <?php
- /*
- * This file is part of the Diff package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Diff;
- /**
- * @package Diff
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/diff
- */
- class Chunk
- {
- /**
- * @var int
- */
- private $start;
- /**
- * @var int
- */
- private $startRange;
- /**
- * @var int
- */
- private $end;
- /**
- * @var int
- */
- private $endRange;
- /**
- * @var array
- */
- private $lines;
- /**
- * @param int $start
- * @param int $startRange
- * @param int $end
- * @param int $endRange
- * @param array $lines
- */
- public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = array())
- {
- $this->start = (int) $start;
- $this->startRange = (int) $startRange;
- $this->end = (int) $end;
- $this->endRange = (int) $endRange;
- $this->lines = $lines;
- }
- /**
- * @return int
- */
- public function getStart()
- {
- return $this->start;
- }
- /**
- * @return int
- */
- public function getStartRange()
- {
- return $this->startRange;
- }
- /**
- * @return int
- */
- public function getEnd()
- {
- return $this->end;
- }
- /**
- * @return int
- */
- public function getEndRange()
- {
- return $this->endRange;
- }
- /**
- * @return array
- */
- public function getLines()
- {
- return $this->lines;
- }
- /**
- * @param array $lines
- */
- public function setLines(array $lines)
- {
- $this->lines = $lines;
- }
- }
- <?php
- /**
- * PHP_Timer
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHP
- * @subpackage Timer
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-timer
- * @since File available since Release 1.0.0
- */
- /**
- * Utility class for timing.
- *
- * @package PHP
- * @subpackage Timer
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-timer
- * @since Class available since Release 1.0.0
- */
- class PHP_Timer
- {
- /**
- * @var array
- */
- private static $times = array(
- 'hour' => 3600000,
- 'minute' => 60000,
- 'second' => 1000
- );
- /**
- * @var array
- */
- private static $startTimes = array();
- /**
- * @var float
- */
- public static $requestTime;
- /**
- * Starts the timer.
- */
- public static function start()
- {
- array_push(self::$startTimes, microtime(TRUE));
- }
- /**
- * Stops the timer and returns the elapsed time.
- *
- * @return float
- */
- public static function stop()
- {
- return microtime(TRUE) - array_pop(self::$startTimes);
- }
- /**
- * Formats the elapsed time as a string.
- *
- * @param float $time
- * @return string
- */
- public static function secondsToTimeString($time)
- {
- $ms = round($time * 1000);
- foreach (self::$times as $unit => $value) {
- if ($ms >= $value) {
- $time = floor($ms / $value * 100.0) / 100.0;
- return $time . ' ' . ($time == 1 ? $unit : $unit . 's');
- }
- }
- return $ms . ' ms';
- }
- /**
- * Formats the elapsed time since the start of the request as a string.
- *
- * @return string
- */
- public static function timeSinceStartOfRequest()
- {
- return self::secondsToTimeString(microtime(TRUE) - self::$requestTime);
- }
- /**
- * Returns the resources (time, memory) of the request as a string.
- *
- * @return string
- */
- public static function resourceUsage()
- {
- return sprintf(
- 'Time: %s, Memory: %4.2fMb',
- self::timeSinceStartOfRequest(),
- memory_get_peak_usage(TRUE) / 1048576
- );
- }
- }
- if (isset($_SERVER['REQUEST_TIME_FLOAT'])) {
- PHP_Timer::$requestTime = $_SERVER['REQUEST_TIME_FLOAT'];
- }
- else {
- PHP_Timer::$requestTime = microtime(TRUE);
- }
- PHP_Timer
- Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- Comparator
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Abstract base class for comparators which compare values for equality.
- *
- * @package Comparator
- * @subpackage Framework
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- abstract class Comparator
- {
- /**
- * @var Factory
- */
- protected $factory;
- /**
- * @var Exporter
- */
- protected $exporter;
- public function __construct()
- {
- $this->exporter = new Exporter;
- }
- /**
- * @param Factory $factory
- */
- public function setFactory(Factory $factory)
- {
- $this->factory = $factory;
- }
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- abstract public function accepts($expected, $actual);
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- abstract public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false);
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares \SplObjectStorage instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class SplObjectStorageComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \SplObjectStorage && $actual instanceof \SplObjectStorage;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- foreach ($actual as $object) {
- if (!$expected->contains($object)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- foreach ($expected as $object) {
- if (!$actual->contains($object)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares values for type equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class TypeComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return true;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if (gettype($expected) != gettype($actual)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // we don't need a diff
- '',
- '',
- false,
- sprintf(
- '%s does not match expected type "%s".',
- $this->exporter->shortenedExport($actual),
- gettype($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares objects for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ObjectComparator extends ArrayComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_object($expected) && is_object($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @param array $processed
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
- {
- if (get_class($actual) !== get_class($expected)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- sprintf(
- '%s is not instance of expected class "%s".',
- $this->exporter->export($actual),
- get_class($expected)
- )
- );
- }
- // don't compare twice to allow for cyclic dependencies
- if (in_array(array($actual, $expected), $processed, true) ||
- in_array(array($expected, $actual), $processed, true)) {
- return;
- }
- $processed[] = array($actual, $expected);
- // don't compare objects if they are identical
- // this helps to avoid the error "maximum function nesting level reached"
- // CAUTION: this conditional clause is not tested
- if ($actual !== $expected) {
- try {
- parent::assertEquals(
- $this->toArray($expected),
- $this->toArray($actual),
- $delta,
- $canonicalize,
- $ignoreCase,
- $processed
- );
- } catch (ComparisonFailure $e) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // replace "Array" with "MyClass object"
- substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5),
- substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5),
- false,
- 'Failed asserting that two objects are equal.'
- );
- }
- }
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- return $this->exporter->toArray($object);
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares resources for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ResourceComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_resource($expected) && is_resource($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if ($actual != $expected) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual)
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares arrays for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ArrayComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return is_array($expected) && is_array($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @param array $processed
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
- {
- if ($canonicalize) {
- sort($expected);
- sort($actual);
- }
- $remaining = $actual;
- $expString = $actString = "Array (\n";
- $equal = true;
- foreach ($expected as $key => $value) {
- unset($remaining[$key]);
- if (!array_key_exists($key, $actual)) {
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $equal = false;
- continue;
- }
- try {
- $comparator = $this->factory->getComparatorFor($value, $actual[$key]);
- $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed);
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($actual[$key])
- );
- } catch (ComparisonFailure $e) {
- $expString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $e->getExpectedAsString()
- ? $this->indent($e->getExpectedAsString())
- : $this->exporter->shortenedExport($e->getExpected())
- );
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $e->getActualAsString()
- ? $this->indent($e->getActualAsString())
- : $this->exporter->shortenedExport($e->getActual())
- );
- $equal = false;
- }
- }
- foreach ($remaining as $key => $value) {
- $actString .= sprintf(
- " %s => %s\n",
- $this->exporter->export($key),
- $this->exporter->shortenedExport($value)
- );
- $equal = false;
- }
- $expString .= ')';
- $actString .= ')';
- if (!$equal) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $expString,
- $actString,
- false,
- 'Failed asserting that two arrays are equal.'
- );
- }
- }
- protected function indent($lines)
- {
- return trim(str_replace("\n", "\n ", $lines));
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares DateTime instances for equality.
- *
- * @package Comparator
- * @author Jeff Welch <whatthejeff@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DateTimeComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \DateTime && $actual instanceof \DateTime;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $delta = new \DateInterval(sprintf('PT%sS', abs($delta)));
- $expectedLower = clone $expected;
- $expectedUpper = clone $expected;
- if ($actual < $expectedLower->sub($delta) ||
- $actual > $expectedUpper->add($delta)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->dateTimeToString($expected),
- $this->dateTimeToString($actual),
- false,
- 'Failed asserting that two DateTime objects are equal.'
- );
- }
- }
- /**
- * Returns an ISO 8601 formatted string representation of a datetime or
- * 'Invalid DateTime object' if the provided DateTime was not properly
- * initialized.
- *
- * @param \DateTime $datetime
- * @return string
- */
- protected function dateTimeToString(\DateTime $datetime)
- {
- $string = $datetime->format(\DateTime::ISO8601);
- return $string ? $string : 'Invalid DateTime object';
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares Exception instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ExceptionComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \Exception && $actual instanceof \Exception;
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- $array = parent::toArray($object);
- unset(
- $array['file'],
- $array['line'],
- $array['trace'],
- $array['string'],
- $array['xdebug_message']
- );
- return $array;
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use DOMDocument;
- use DOMNode;
- /**
- * Compares DOMNode instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DOMNodeComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof DOMNode && $actual instanceof DOMNode;
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $expectedAsString = $this->nodeToText($expected, true, $ignoreCase);
- $actualAsString = $this->nodeToText($actual, true, $ignoreCase);
- if ($expectedAsString !== $actualAsString) {
- if ($expected instanceof DOMDocument) {
- $type = 'documents';
- } else {
- $type = 'nodes';
- }
- throw new ComparisonFailure(
- $expected,
- $actual,
- $expectedAsString,
- $actualAsString,
- false,
- sprintf("Failed asserting that two DOM %s are equal.\n", $type)
- );
- }
- }
- /**
- * Returns the normalized, whitespace-cleaned, and indented textual
- * representation of a DOMNode.
- *
- * @param DOMNode $node
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return string
- */
- private function nodeToText(DOMNode $node, $canonicalize, $ignoreCase)
- {
- if ($canonicalize) {
- $document = new DOMDocument;
- $document->loadXML($node->C14N());
- $node = $document;
- }
- if ($node instanceof DOMDocument) {
- $document = $node;
- } else {
- $document = $node->ownerDocument;
- }
- $document->formatOutput = true;
- $document->normalizeDocument();
- if ($node instanceof DOMDocument) {
- $text = $node->saveXML();
- } else {
- $text = $document->saveXML($node);
- }
- if ($ignoreCase) {
- $text = strtolower($text);
- }
- return $text;
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares scalar or NULL values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ScalarComparator extends Comparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- * @since Method available since Release 3.6.0
- */
- public function accepts($expected, $actual)
- {
- return ((is_scalar($expected) xor null === $expected) &&
- (is_scalar($actual) xor null === $actual))
- // allow comparison between strings and objects featuring __toString()
- || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString'))
- || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual));
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- $expectedToCompare = $expected;
- $actualToCompare = $actual;
- // always compare as strings to avoid strange behaviour
- // otherwise 0 == 'Foobar'
- if (is_string($expected) || is_string($actual)) {
- $expectedToCompare = (string)$expectedToCompare;
- $actualToCompare = (string)$actualToCompare;
- if ($ignoreCase) {
- $expectedToCompare = strtolower($expectedToCompare);
- $actualToCompare = strtolower($actualToCompare);
- }
- }
- if ($expectedToCompare != $actualToCompare) {
- if (is_string($expected) && is_string($actual)) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->exporter->export($expected),
- $this->exporter->export($actual),
- false,
- 'Failed asserting that two strings are equal.'
- );
- }
- throw new ComparisonFailure(
- $expected,
- $actual,
- // no diff is required
- '',
- '',
- false,
- sprintf(
- 'Failed asserting that %s matches expected %s.',
- $this->exporter->export($actual),
- $this->exporter->export($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares PHPUnit_Framework_MockObject_MockObject instances for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class MockObjectComparator extends ObjectComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return $expected instanceof \PHPUnit_Framework_MockObject_MockObject && $actual instanceof \PHPUnit_Framework_MockObject_MockObject;
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- * @return array
- */
- protected function toArray($object)
- {
- $array = parent::toArray($object);
- unset($array['__phpunit_invocationMocker']);
- return $array;
- }
- }<?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares numerical values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @author Alexander <iam.asm89@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class NumericComparator extends ScalarComparator
- {
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- // all numerical values, but not if one of them is a double
- // or both of them are strings
- return is_numeric($expected) && is_numeric($actual) &&
- !(is_double($expected) || is_double($actual)) &&
- !(is_string($expected) && is_string($actual));
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if (is_infinite($actual) && is_infinite($expected)) {
- return;
- }
- if ((is_infinite($actual) xor is_infinite($expected)) ||
- (is_nan($actual) or is_nan($expected)) ||
- abs($actual - $expected) > $delta) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- '',
- '',
- false,
- sprintf(
- 'Failed asserting that %s matches expected %s.',
- $this->exporter->export($actual),
- $this->exporter->export($expected)
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Factory for comparators which compare values for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class Factory
- {
- /**
- * @var Comparator[]
- */
- private $comparators = array();
- /**
- * @var Factory
- */
- private static $instance;
- /**
- * Constructs a new factory.
- */
- public function __construct()
- {
- $this->register(new TypeComparator);
- $this->register(new ScalarComparator);
- $this->register(new NumericComparator);
- $this->register(new DoubleComparator);
- $this->register(new ArrayComparator);
- $this->register(new ResourceComparator);
- $this->register(new ObjectComparator);
- $this->register(new ExceptionComparator);
- $this->register(new SplObjectStorageComparator);
- $this->register(new DOMNodeComparator);
- $this->register(new MockObjectComparator);
- $this->register(new DateTimeComparator);
- }
- /**
- * @return Factory
- */
- public static function getInstance()
- {
- if (self::$instance === null) {
- self::$instance = new Factory;
- }
- return self::$instance;
- }
- /**
- * Returns the correct comparator for comparing two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return Comparator
- */
- public function getComparatorFor($expected, $actual)
- {
- foreach ($this->comparators as $comparator) {
- if ($comparator->accepts($expected, $actual)) {
- return $comparator;
- }
- }
- }
- /**
- * Registers a new comparator.
- *
- * This comparator will be returned by getInstance() if its accept() method
- * returns TRUE for the compared values. It has higher priority than the
- * existing comparators, meaning that its accept() method will be tested
- * before those of the other comparators.
- *
- * @param Comparator $comparator The registered comparator
- */
- public function register(Comparator $comparator)
- {
- array_unshift($this->comparators, $comparator);
- $comparator->setFactory($this);
- }
- /**
- * Unregisters a comparator.
- *
- * This comparator will no longer be returned by getInstance().
- *
- * @param Comparator $comparator The unregistered comparator
- */
- public function unregister(Comparator $comparator)
- {
- foreach ($this->comparators as $key => $_comparator) {
- if ($comparator === $_comparator) {
- unset($this->comparators[$key]);
- }
- }
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- /**
- * Compares doubles for equality.
- *
- * @package Comparator
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class DoubleComparator extends NumericComparator
- {
- /**
- * Smallest value available in PHP.
- *
- * @var float
- */
- const EPSILON = 0.0000000001;
- /**
- * Returns whether the comparator can compare two values.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @return boolean
- */
- public function accepts($expected, $actual)
- {
- return (is_double($expected) || is_double($actual)) && is_numeric($expected) && is_numeric($actual);
- }
- /**
- * Asserts that two values are equal.
- *
- * @param mixed $expected The first value to compare
- * @param mixed $actual The second value to compare
- * @param float $delta The allowed numerical distance between two values to
- * consider them equal
- * @param bool $canonicalize If set to TRUE, arrays are sorted before
- * comparison
- * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is
- * ignored when comparing string values
- * @throws ComparisonFailure Thrown when the comparison
- * fails. Contains information about the
- * specific errors that lead to the failure.
- */
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- if ($delta == 0) {
- $delta = self::EPSILON;
- }
- parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase);
- }
- }
- <?php
- /*
- * This file is part of the Comparator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use SebastianBergmann\Diff\Differ;
- /**
- * Thrown when an assertion for string equality failed.
- *
- * @package Comparator
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/comparator
- */
- class ComparisonFailure extends \RuntimeException
- {
- /**
- * Expected value of the retrieval which does not match $actual.
- * @var mixed
- */
- protected $expected;
- /**
- * Actually retrieved value which does not match $expected.
- * @var mixed
- */
- protected $actual;
- /**
- * The string representation of the expected value
- * @var string
- */
- protected $expectedAsString;
- /**
- * The string representation of the actual value
- * @var string
- */
- protected $actualAsString;
- /**
- * @var boolean
- */
- protected $identical;
- /**
- * Optional message which is placed in front of the first line
- * returned by toString().
- * @var string
- */
- protected $message;
- /**
- * Initialises with the expected value and the actual value.
- *
- * @param mixed $expected Expected value retrieved.
- * @param mixed $actual Actual value retrieved.
- * @param string $expectedAsString
- * @param string $actualAsString
- * @param boolean $identical
- * @param string $message A string which is prefixed on all returned lines
- * in the difference output.
- */
- public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = false, $message = '')
- {
- $this->expected = $expected;
- $this->actual = $actual;
- $this->expectedAsString = $expectedAsString;
- $this->actualAsString = $actualAsString;
- $this->message = $message;
- }
- /**
- * @return mixed
- */
- public function getActual()
- {
- return $this->actual;
- }
- /**
- * @return mixed
- */
- public function getExpected()
- {
- return $this->expected;
- }
- /**
- * @return string
- */
- public function getActualAsString()
- {
- return $this->actualAsString;
- }
- /**
- * @return string
- */
- public function getExpectedAsString()
- {
- return $this->expectedAsString;
- }
- /**
- * @return string
- */
- public function getDiff()
- {
- if (!$this->actualAsString && !$this->expectedAsString) {
- return '';
- }
- $differ = new Differ("\n--- Expected\n+++ Actual\n");
- return $differ->diff($this->expectedAsString, $this->actualAsString);
- }
- /**
- * @return string
- */
- public function toString()
- {
- return $this->message . $this->getDiff();
- }
- }
- Copyright (c) 2013 Konstantin Kudryashov <ever.zet@gmail.com>
- Marcello Duarte <marcello.duarte@gmail.com>
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Prophecies revealer interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface RevealerInterface
- {
- /**
- * Unwraps value(s).
- *
- * @param mixed $value
- *
- * @return mixed
- */
- public function reveal($value);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Controllable doubles interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ProphecySubjectInterface
- {
- /**
- * Sets subject prophecy.
- *
- * @param ProphecyInterface $prophecy
- */
- public function setProphecy(ProphecyInterface $prophecy);
- /**
- * Returns subject prophecy.
- *
- * @return ProphecyInterface
- */
- public function getProphecy();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Basic prophecies revealer.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Revealer implements RevealerInterface
- {
- /**
- * Unwraps value(s).
- *
- * @param mixed $value
- *
- * @return mixed
- */
- public function reveal($value)
- {
- if (is_array($value)) {
- return array_map(array($this, __FUNCTION__), $value);
- }
- if (!is_object($value)) {
- return $value;
- }
- if ($value instanceof ProphecyInterface) {
- $value = $value->reveal();
- }
- return $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- /**
- * Core Prophecy interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ProphecyInterface
- {
- /**
- * Reveals prophecy object (double) .
- *
- * @return object
- */
- public function reveal();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Call\Call;
- use Prophecy\Doubler\LazyDouble;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Call\CallCenter;
- use Prophecy\Exception\Prophecy\ObjectProphecyException;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- use Prophecy\Exception\Prediction\AggregateException;
- use Prophecy\Exception\Prediction\PredictionException;
- /**
- * Object prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ObjectProphecy implements ProphecyInterface
- {
- private $lazyDouble;
- private $callCenter;
- private $revealer;
- private $comparatorFactory;
- /**
- * @var MethodProphecy[][]
- */
- private $methodProphecies = array();
- /**
- * Initializes object prophecy.
- *
- * @param LazyDouble $lazyDouble
- * @param CallCenter $callCenter
- * @param RevealerInterface $revealer
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct(
- LazyDouble $lazyDouble,
- CallCenter $callCenter = null,
- RevealerInterface $revealer = null,
- ComparatorFactory $comparatorFactory = null
- ) {
- $this->lazyDouble = $lazyDouble;
- $this->callCenter = $callCenter ?: new CallCenter;
- $this->revealer = $revealer ?: new Revealer;
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Forces double to extend specific class.
- *
- * @param string $class
- *
- * @return $this
- */
- public function willExtend($class)
- {
- $this->lazyDouble->setParentClass($class);
- return $this;
- }
- /**
- * Forces double to implement specific interface.
- *
- * @param string $interface
- *
- * @return $this
- */
- public function willImplement($interface)
- {
- $this->lazyDouble->addInterface($interface);
- return $this;
- }
- /**
- * Sets constructor arguments.
- *
- * @param array $arguments
- *
- * @return $this
- */
- public function willBeConstructedWith(array $arguments = null)
- {
- $this->lazyDouble->setArguments($arguments);
- return $this;
- }
- /**
- * Reveals double.
- *
- * @return object
- *
- * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface
- */
- public function reveal()
- {
- $double = $this->lazyDouble->getInstance();
- if (null === $double || !$double instanceof ProphecySubjectInterface) {
- throw new ObjectProphecyException(
- "Generated double must implement ProphecySubjectInterface, but it does not.\n".
- 'It seems you have wrongly configured doubler without required ClassPatch.',
- $this
- );
- }
- $double->setProphecy($this);
- return $double;
- }
- /**
- * Adds method prophecy to object prophecy.
- *
- * @param MethodProphecy $methodProphecy
- *
- * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't
- * have arguments wildcard
- */
- public function addMethodProphecy(MethodProphecy $methodProphecy)
- {
- $argumentsWildcard = $methodProphecy->getArgumentsWildcard();
- if (null === $argumentsWildcard) {
- throw new MethodProphecyException(sprintf(
- "Can not add prophecy for a method `%s::%s()`\n".
- "as you did not specify arguments wildcard for it.",
- get_class($this->reveal()),
- $methodProphecy->getMethodName()
- ), $methodProphecy);
- }
- $methodName = $methodProphecy->getMethodName();
- if (!isset($this->methodProphecies[$methodName])) {
- $this->methodProphecies[$methodName] = array();
- }
- $this->methodProphecies[$methodName][] = $methodProphecy;
- }
- /**
- * Returns either all or related to single method prophecies.
- *
- * @param null|string $methodName
- *
- * @return MethodProphecy[]
- */
- public function getMethodProphecies($methodName = null)
- {
- if (null === $methodName) {
- return $this->methodProphecies;
- }
- if (!isset($this->methodProphecies[$methodName])) {
- return array();
- }
- return $this->methodProphecies[$methodName];
- }
- /**
- * Makes specific method call.
- *
- * @param string $methodName
- * @param array $arguments
- *
- * @return mixed
- */
- public function makeProphecyMethodCall($methodName, array $arguments)
- {
- $arguments = $this->revealer->reveal($arguments);
- $return = $this->callCenter->makeCall($this, $methodName, $arguments);
- return $this->revealer->reveal($return);
- }
- /**
- * Finds calls by method name & arguments wildcard.
- *
- * @param string $methodName
- * @param ArgumentsWildcard $wildcard
- *
- * @return Call[]
- */
- public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard)
- {
- return $this->callCenter->findCalls($methodName, $wildcard);
- }
- /**
- * Checks that registered method predictions do not fail.
- *
- * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail
- */
- public function checkProphecyMethodsPredictions()
- {
- $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal())));
- $exception->setObjectProphecy($this);
- foreach ($this->methodProphecies as $prophecies) {
- foreach ($prophecies as $prophecy) {
- try {
- $prophecy->checkPrediction();
- } catch (PredictionException $e) {
- $exception->append($e);
- }
- }
- }
- if (count($exception->getExceptions())) {
- throw $exception;
- }
- }
- /**
- * Creates new method prophecy using specified method name and arguments.
- *
- * @param string $methodName
- * @param array $arguments
- *
- * @return MethodProphecy
- */
- public function __call($methodName, array $arguments)
- {
- $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments));
- foreach ($this->getMethodProphecies($methodName) as $prophecy) {
- $argumentsWildcard = $prophecy->getArgumentsWildcard();
- $comparator = $this->comparatorFactory->getComparatorFor(
- $argumentsWildcard, $arguments
- );
- try {
- $comparator->assertEquals($argumentsWildcard, $arguments);
- return $prophecy;
- } catch (ComparisonFailure $failure) {}
- }
- return new MethodProphecy($this, $methodName, $arguments);
- }
- /**
- * Tries to get property value from double.
- *
- * @param string $name
- */
- public function __get($name)
- {
- return $this->reveal()->$name;
- }
- /**
- * Tries to set property value to double.
- *
- * @param string $name
- * @param string $value
- */
- public function __set($name, $value)
- {
- $this->reveal()->$name = $this->revealer->reveal($value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prophecy;
- use Prophecy\Argument;
- use Prophecy\Promise;
- use Prophecy\Prediction;
- use Prophecy\Exception\Doubler\MethodNotFoundException;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- /**
- * Method prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class MethodProphecy
- {
- private $objectProphecy;
- private $methodName;
- private $argumentsWildcard;
- private $promise;
- private $prediction;
- private $checkedPredictions = array();
- private $bound = false;
- /**
- * Initializes method prophecy.
- *
- * @param ObjectProphecy $objectProphecy
- * @param string $methodName
- * @param null|Argument\ArgumentsWildcard|array $arguments
- *
- * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found
- */
- public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null)
- {
- $double = $objectProphecy->reveal();
- if (!method_exists($double, $methodName)) {
- throw new MethodNotFoundException(sprintf(
- 'Method `%s::%s()` is not defined.', get_class($double), $methodName
- ), get_class($double), $methodName, $arguments);
- }
- $this->objectProphecy = $objectProphecy;
- $this->methodName = $methodName;
- $reflectedMethod = new \ReflectionMethod($double, $methodName);
- if ($reflectedMethod->isFinal()) {
- throw new MethodProphecyException(sprintf(
- "Can not add prophecy for a method `%s::%s()`\n".
- "as it is a final method.",
- get_class($double),
- $methodName
- ), $this);
- }
- if (null !== $arguments) {
- $this->withArguments($arguments);
- }
- }
- /**
- * Sets argument wildcard.
- *
- * @param array|Argument\ArgumentsWildcard $arguments
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function withArguments($arguments)
- {
- if (is_array($arguments)) {
- $arguments = new Argument\ArgumentsWildcard($arguments);
- }
- if (!$arguments instanceof Argument\ArgumentsWildcard) {
- throw new InvalidArgumentException(sprintf(
- "Either an array or an instance of ArgumentsWildcard expected as\n".
- 'a `MethodProphecy::withArguments()` argument, but got %s.',
- gettype($arguments)
- ));
- }
- $this->argumentsWildcard = $arguments;
- return $this;
- }
- /**
- * Sets custom promise to the prophecy.
- *
- * @param callable|Promise\PromiseInterface $promise
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function will($promise)
- {
- if (is_callable($promise)) {
- $promise = new Promise\CallbackPromise($promise);
- }
- if (!$promise instanceof Promise\PromiseInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PromiseInterface, but got %s.',
- gettype($promise)
- ));
- }
- $this->bindToObjectProphecy();
- $this->promise = $promise;
- return $this;
- }
- /**
- * Sets return promise to the prophecy.
- *
- * @see Prophecy\Promise\ReturnPromise
- *
- * @return $this
- */
- public function willReturn()
- {
- return $this->will(new Promise\ReturnPromise(func_get_args()));
- }
- /**
- * Sets return argument promise to the prophecy.
- *
- * @param int $index The zero-indexed number of the argument to return
- *
- * @see Prophecy\Promise\ReturnArgumentPromise
- *
- * @return $this
- */
- public function willReturnArgument($index = 0)
- {
- return $this->will(new Promise\ReturnArgumentPromise($index));
- }
- /**
- * Sets throw promise to the prophecy.
- *
- * @see Prophecy\Promise\ThrowPromise
- *
- * @param string|\Exception $exception Exception class or instance
- *
- * @return $this
- */
- public function willThrow($exception)
- {
- return $this->will(new Promise\ThrowPromise($exception));
- }
- /**
- * Sets custom prediction to the prophecy.
- *
- * @param callable|Prediction\PredictionInterface $prediction
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function should($prediction)
- {
- if (is_callable($prediction)) {
- $prediction = new Prediction\CallbackPrediction($prediction);
- }
- if (!$prediction instanceof Prediction\PredictionInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PredictionInterface, but got %s.',
- gettype($prediction)
- ));
- }
- $this->bindToObjectProphecy();
- $this->prediction = $prediction;
- return $this;
- }
- /**
- * Sets call prediction to the prophecy.
- *
- * @see Prophecy\Prediction\CallPrediction
- *
- * @return $this
- */
- public function shouldBeCalled()
- {
- return $this->should(new Prediction\CallPrediction);
- }
- /**
- * Sets no calls prediction to the prophecy.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- *
- * @return $this
- */
- public function shouldNotBeCalled()
- {
- return $this->should(new Prediction\NoCallsPrediction);
- }
- /**
- * Sets call times prediction to the prophecy.
- *
- * @see Prophecy\Prediction\CallTimesPrediction
- *
- * @param $count
- *
- * @return $this
- */
- public function shouldBeCalledTimes($count)
- {
- return $this->should(new Prediction\CallTimesPrediction($count));
- }
- /**
- * Checks provided prediction immediately.
- *
- * @param callable|Prediction\PredictionInterface $prediction
- *
- * @return $this
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function shouldHave($prediction)
- {
- if (is_callable($prediction)) {
- $prediction = new Prediction\CallbackPrediction($prediction);
- }
- if (!$prediction instanceof Prediction\PredictionInterface) {
- throw new InvalidArgumentException(sprintf(
- 'Expected callable or instance of PredictionInterface, but got %s.',
- gettype($prediction)
- ));
- }
- if (null === $this->promise) {
- $this->willReturn();
- }
- $calls = $this->getObjectProphecy()->findProphecyMethodCalls(
- $this->getMethodName(),
- $this->getArgumentsWildcard()
- );
- try {
- $prediction->check($calls, $this->getObjectProphecy(), $this);
- $this->checkedPredictions[] = $prediction;
- } catch (\Exception $e) {
- $this->checkedPredictions[] = $prediction;
- throw $e;
- }
- return $this;
- }
- /**
- * Checks call prediction.
- *
- * @see Prophecy\Prediction\CallPrediction
- *
- * @return $this
- */
- public function shouldHaveBeenCalled()
- {
- return $this->shouldHave(new Prediction\CallPrediction);
- }
- /**
- * Checks no calls prediction.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- *
- * @return $this
- */
- public function shouldNotHaveBeenCalled()
- {
- return $this->shouldHave(new Prediction\NoCallsPrediction);
- }
- /**
- * Checks no calls prediction.
- *
- * @see Prophecy\Prediction\NoCallsPrediction
- * @deprecated
- *
- * @return $this
- */
- public function shouldNotBeenCalled()
- {
- return $this->shouldNotHaveBeenCalled();
- }
- /**
- * Checks call times prediction.
- *
- * @see Prophecy\Prediction\CallTimesPrediction
- *
- * @param int $count
- *
- * @return $this
- */
- public function shouldHaveBeenCalledTimes($count)
- {
- return $this->shouldHave(new Prediction\CallTimesPrediction($count));
- }
- /**
- * Checks currently registered [with should(...)] prediction.
- */
- public function checkPrediction()
- {
- if (null === $this->prediction) {
- return;
- }
- $this->shouldHave($this->prediction);
- }
- /**
- * Returns currently registered promise.
- *
- * @return null|Promise\PromiseInterface
- */
- public function getPromise()
- {
- return $this->promise;
- }
- /**
- * Returns currently registered prediction.
- *
- * @return null|Prediction\PredictionInterface
- */
- public function getPrediction()
- {
- return $this->prediction;
- }
- /**
- * Returns predictions that were checked on this object.
- *
- * @return Prediction\PredictionInterface[]
- */
- public function getCheckedPredictions()
- {
- return $this->checkedPredictions;
- }
- /**
- * Returns object prophecy this method prophecy is tied to.
- *
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- /**
- * Returns method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->methodName;
- }
- /**
- * Returns arguments wildcard.
- *
- * @return Argument\ArgumentsWildcard
- */
- public function getArgumentsWildcard()
- {
- return $this->argumentsWildcard;
- }
- private function bindToObjectProphecy()
- {
- if ($this->bound) {
- return;
- }
- $this->getObjectProphecy()->addMethodProphecy($this);
- $this->bound = true;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Comparator;
- use SebastianBergmann\Comparator\Comparator;
- use SebastianBergmann\Comparator\ComparisonFailure;
- /**
- * Closure comparator.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- final class ClosureComparator extends Comparator
- {
- public function accepts($expected, $actual)
- {
- return is_object($expected) && $expected instanceof \Closure
- && is_object($actual) && $actual instanceof \Closure;
- }
- public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
- {
- throw new ComparisonFailure(
- $expected,
- $actual,
- // we don't need a diff
- '',
- '',
- false,
- 'all closures are born different'
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Comparator;
- use SebastianBergmann\Comparator\Factory as BaseFactory;
- /**
- * Prophecy comparator factory.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- final class Factory extends BaseFactory
- {
- /**
- * @var Factory
- */
- private static $instance;
- public function __construct()
- {
- parent::__construct();
- $this->register(new ClosureComparator());
- }
- /**
- * @return Factory
- */
- public static function getInstance()
- {
- if (self::$instance === null) {
- self::$instance = new Factory;
- }
- return self::$instance;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy;
- use Prophecy\Argument\Token;
- /**
- * Argument tokens shortcuts.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Argument
- {
- /**
- * Checks that argument is exact value or object.
- *
- * @param mixed $value
- *
- * @return Token\ExactValueToken
- */
- public static function exact($value)
- {
- return new Token\ExactValueToken($value);
- }
- /**
- * Checks that argument is of specific type or instance of specific class.
- *
- * @param string $type Type name (`integer`, `string`) or full class name
- *
- * @return Token\TypeToken
- */
- public static function type($type)
- {
- return new Token\TypeToken($type);
- }
- /**
- * Checks that argument object has specific state.
- *
- * @param string $methodName
- * @param mixed $value
- *
- * @return Token\ObjectStateToken
- */
- public static function which($methodName, $value)
- {
- return new Token\ObjectStateToken($methodName, $value);
- }
- /**
- * Checks that argument matches provided callback.
- *
- * @param callable $callback
- *
- * @return Token\CallbackToken
- */
- public static function that($callback)
- {
- return new Token\CallbackToken($callback);
- }
- /**
- * Matches any single value.
- *
- * @return Token\AnyValueToken
- */
- public static function any()
- {
- return new Token\AnyValueToken;
- }
- /**
- * Matches all values to the rest of the signature.
- *
- * @return Token\AnyValuesToken
- */
- public static function cetera()
- {
- return new Token\AnyValuesToken;
- }
- /**
- * Checks that argument matches all tokens
- *
- * @param mixed ... a list of tokens
- *
- * @return Token\LogicalAndToken
- */
- public static function allOf()
- {
- return new Token\LogicalAndToken(func_get_args());
- }
- /**
- * Checks that argument array or countable object has exact number of elements.
- *
- * @param integer $value array elements count
- *
- * @return Token\ArrayCountToken
- */
- public static function size($value)
- {
- return new Token\ArrayCountToken($value);
- }
- /**
- * Checks that argument array contains (key, value) pair
- *
- * @param mixed $key exact value or token
- * @param mixed $value exact value or token
- *
- * @return Token\ArrayEntryToken
- */
- public static function withEntry($key, $value)
- {
- return new Token\ArrayEntryToken($key, $value);
- }
- /**
- * Checks that arguments array entries all match value
- *
- * @param mixed $value
- *
- * @return Token\ArrayEveryEntryToken
- */
- public static function withEveryEntry($value)
- {
- return new Token\ArrayEveryEntryToken($value);
- }
- /**
- * Checks that argument array contains value
- *
- * @param mixed $value
- *
- * @return Token\ArrayEntryToken
- */
- public static function containing($value)
- {
- return new Token\ArrayEntryToken(self::any(), $value);
- }
- /**
- * Checks that argument array has key
- *
- * @param mixed $key exact value or token
- *
- * @return Token\ArrayEntryToken
- */
- public static function withKey($key)
- {
- return new Token\ArrayEntryToken($key, self::any());
- }
- /**
- * Checks that argument does not match the value|token.
- *
- * @param mixed $value either exact value or argument token
- *
- * @return Token\LogicalNotToken
- */
- public static function not($value)
- {
- return new Token\LogicalNotToken($value);
- }
- /**
- * @param string $value
- *
- * @return Token\StringContainsToken
- */
- public static function containingString($value)
- {
- return new Token\StringContainsToken($value);
- }
- /**
- * Checks that argument is identical value.
- *
- * @param mixed $value
- *
- * @return Token\IdenticalValueToken
- */
- public static function is($value)
- {
- return new Token\IdenticalValueToken($value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy;
- use Prophecy\Doubler\Doubler;
- use Prophecy\Doubler\LazyDouble;
- use Prophecy\Doubler\ClassPatch;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\RevealerInterface;
- use Prophecy\Prophecy\Revealer;
- use Prophecy\Call\CallCenter;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\PredictionException;
- use Prophecy\Exception\Prediction\AggregateException;
- /**
- * Prophet creates prophecies.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Prophet
- {
- private $doubler;
- private $revealer;
- private $util;
- /**
- * @var ObjectProphecy[]
- */
- private $prophecies = array();
- /**
- * Initializes Prophet.
- *
- * @param null|Doubler $doubler
- * @param null|RevealerInterface $revealer
- * @param null|StringUtil $util
- */
- public function __construct(Doubler $doubler = null, RevealerInterface $revealer = null,
- StringUtil $util = null)
- {
- if (null === $doubler) {
- $doubler = new Doubler;
- $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch);
- $doubler->registerClassPatch(new ClassPatch\TraversablePatch);
- $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch);
- $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch);
- $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch);
- $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch());
- $doubler->registerClassPatch(new ClassPatch\MagicCallPatch);
- $doubler->registerClassPatch(new ClassPatch\KeywordPatch);
- }
- $this->doubler = $doubler;
- $this->revealer = $revealer ?: new Revealer;
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Creates new object prophecy.
- *
- * @param null|string $classOrInterface Class or interface name
- *
- * @return ObjectProphecy
- */
- public function prophesize($classOrInterface = null)
- {
- $this->prophecies[] = $prophecy = new ObjectProphecy(
- new LazyDouble($this->doubler),
- new CallCenter($this->util),
- $this->revealer
- );
- if ($classOrInterface && class_exists($classOrInterface)) {
- return $prophecy->willExtend($classOrInterface);
- }
- if ($classOrInterface && interface_exists($classOrInterface)) {
- return $prophecy->willImplement($classOrInterface);
- }
- return $prophecy;
- }
- /**
- * Returns all created object prophecies.
- *
- * @return ObjectProphecy[]
- */
- public function getProphecies()
- {
- return $this->prophecies;
- }
- /**
- * Returns Doubler instance assigned to this Prophet.
- *
- * @return Doubler
- */
- public function getDoubler()
- {
- return $this->doubler;
- }
- /**
- * Checks all predictions defined by prophecies of this Prophet.
- *
- * @throws Exception\Prediction\AggregateException If any prediction fails
- */
- public function checkPredictions()
- {
- $exception = new AggregateException("Some predictions failed:\n");
- foreach ($this->prophecies as $prophecy) {
- try {
- $prophecy->checkProphecyMethodsPredictions();
- } catch (PredictionException $e) {
- $exception->append($e);
- }
- }
- if (count($exception->getExceptions())) {
- throw $exception;
- }
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception;
- /**
- * Core Prophecy exception interface.
- * All Prophecy exceptions implement it.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface Exception
- {
- /**
- * @return string
- */
- public function getMessage();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Prophecy\ObjectProphecy;
- class ObjectProphecyException extends \RuntimeException implements ProphecyException
- {
- private $objectProphecy;
- public function __construct($message, ObjectProphecy $objectProphecy)
- {
- parent::__construct($message);
- $this->objectProphecy = $objectProphecy;
- }
- /**
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Exception\Exception;
- interface ProphecyException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prophecy;
- use Prophecy\Prophecy\MethodProphecy;
- class MethodProphecyException extends ObjectProphecyException
- {
- private $methodProphecy;
- public function __construct($message, MethodProphecy $methodProphecy)
- {
- parent::__construct($message, $methodProphecy->getObjectProphecy());
- $this->methodProphecy = $methodProphecy;
- }
- /**
- * @return MethodProphecy
- */
- public function getMethodProphecy()
- {
- return $this->methodProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class InterfaceNotFoundException extends ClassNotFoundException
- {
- public function getInterfaceName()
- {
- return $this->getClassname();
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use ReflectionClass;
- class ClassMirrorException extends \RuntimeException implements DoublerException
- {
- private $class;
- public function __construct($message, ReflectionClass $class)
- {
- parent::__construct($message);
- $this->class = $class;
- }
- public function getReflectedClass()
- {
- return $this->class;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use RuntimeException;
- class DoubleException extends RuntimeException implements DoublerException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use Prophecy\Exception\Exception;
- interface DoublerException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class MethodNotFoundException extends DoubleException
- {
- /**
- * @var string
- */
- private $classname;
- /**
- * @var string
- */
- private $methodName;
- /**
- * @var array
- */
- private $arguments;
- /**
- * @param string $message
- * @param string $classname
- * @param string $methodName
- * @param null|Argument\ArgumentsWildcard|array $arguments
- */
- public function __construct($message, $classname, $methodName, $arguments = null)
- {
- parent::__construct($message);
- $this->classname = $classname;
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- public function getArguments()
- {
- return $this->arguments;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class ReturnByReferenceException extends DoubleException
- {
- private $classname;
- private $methodName;
- /**
- * @param string $message
- * @param string $classname
- * @param string $methodName
- */
- public function __construct($message, $classname, $methodName)
- {
- parent::__construct($message);
- $this->classname = $classname;
- $this->methodName = $methodName;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- class ClassCreatorException extends \RuntimeException implements DoublerException
- {
- private $node;
- public function __construct($message, ClassNode $node)
- {
- parent::__construct($message);
- $this->node = $node;
- }
- public function getClassNode()
- {
- return $this->node;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Doubler;
- class ClassNotFoundException extends DoubleException
- {
- private $classname;
- /**
- * @param string $message
- * @param string $classname
- */
- public function __construct($message, $classname)
- {
- parent::__construct($message);
- $this->classname = $classname;
- }
- public function getClassname()
- {
- return $this->classname;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- class UnexpectedCallsException extends MethodProphecyException implements PredictionException
- {
- private $calls = array();
- public function __construct($message, MethodProphecy $methodProphecy, array $calls)
- {
- parent::__construct($message, $methodProphecy);
- $this->calls = $calls;
- }
- public function getCalls()
- {
- return $this->calls;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Exception\Exception;
- interface PredictionException extends Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use RuntimeException;
- /**
- * Basic failed prediction exception.
- * Use it for custom prediction failures.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class FailedPredictionException extends RuntimeException implements PredictionException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Exception\Prophecy\MethodProphecyException;
- class NoCallsException extends MethodProphecyException implements PredictionException
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\ObjectProphecy;
- class AggregateException extends \RuntimeException implements PredictionException
- {
- private $exceptions = array();
- private $objectProphecy;
- public function append(PredictionException $exception)
- {
- $message = $exception->getMessage();
- $message = ' '.strtr($message, array("\n" => "\n "))."\n";
- $this->message = rtrim($this->message.$message);
- $this->exceptions[] = $exception;
- }
- /**
- * @return PredictionException[]
- */
- public function getExceptions()
- {
- return $this->exceptions;
- }
- public function setObjectProphecy(ObjectProphecy $objectProphecy)
- {
- $this->objectProphecy = $objectProphecy;
- }
- /**
- * @return ObjectProphecy
- */
- public function getObjectProphecy()
- {
- return $this->objectProphecy;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Prediction;
- use Prophecy\Prophecy\MethodProphecy;
- class UnexpectedCallsCountException extends UnexpectedCallsException
- {
- private $expectedCount;
- public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls)
- {
- parent::__construct($message, $methodProphecy, $calls);
- $this->expectedCount = intval($count);
- }
- public function getExpectedCount()
- {
- return $this->expectedCount;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception\Call;
- use Prophecy\Exception\Prophecy\ObjectProphecyException;
- use Prophecy\Prophecy\ObjectProphecy;
- class UnexpectedCallException extends ObjectProphecyException
- {
- private $methodName;
- private $arguments;
- public function __construct($message, ObjectProphecy $objectProphecy,
- $methodName, array $arguments)
- {
- parent::__construct($message, $objectProphecy);
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- }
- public function getMethodName()
- {
- return $this->methodName;
- }
- public function getArguments()
- {
- return $this->arguments;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Exception;
- class InvalidArgumentException extends \InvalidArgumentException implements Exception
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use ReflectionClass;
- /**
- * Cached class doubler.
- * Prevents mirroring/creation of the same structure twice.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CachedDoubler extends Doubler
- {
- private $classes = array();
- /**
- * {@inheritdoc}
- */
- public function registerClassPatch(ClassPatch\ClassPatchInterface $patch)
- {
- $this->classes[] = array();
- parent::registerClassPatch($patch);
- }
- /**
- * {@inheritdoc}
- */
- protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
- {
- $classId = $this->generateClassId($class, $interfaces);
- if (isset($this->classes[$classId])) {
- return $this->classes[$classId];
- }
- return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
- }
- /**
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- private function generateClassId(ReflectionClass $class = null, array $interfaces)
- {
- $parts = array();
- if (null !== $class) {
- $parts[] = $class->getName();
- }
- foreach ($interfaces as $interface) {
- $parts[] = $interface->getName();
- }
- sort($parts);
- return md5(implode('', $parts));
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- /**
- * Core double interface.
- * All doubled classes will implement this one.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface DoubleInterface
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use Doctrine\Instantiator\Instantiator;
- use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
- use Prophecy\Doubler\Generator\ClassMirror;
- use Prophecy\Doubler\Generator\ClassCreator;
- use Prophecy\Exception\InvalidArgumentException;
- use ReflectionClass;
- /**
- * Cached class doubler.
- * Prevents mirroring/creation of the same structure twice.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Doubler
- {
- private $mirror;
- private $creator;
- private $namer;
- /**
- * @var ClassPatchInterface[]
- */
- private $patches = array();
- /**
- * @var \Doctrine\Instantiator\Instantiator
- */
- private $instantiator;
- /**
- * Initializes doubler.
- *
- * @param ClassMirror $mirror
- * @param ClassCreator $creator
- * @param NameGenerator $namer
- */
- public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null,
- NameGenerator $namer = null)
- {
- $this->mirror = $mirror ?: new ClassMirror;
- $this->creator = $creator ?: new ClassCreator;
- $this->namer = $namer ?: new NameGenerator;
- }
- /**
- * Returns list of registered class patches.
- *
- * @return ClassPatchInterface[]
- */
- public function getClassPatches()
- {
- return $this->patches;
- }
- /**
- * Registers new class patch.
- *
- * @param ClassPatchInterface $patch
- */
- public function registerClassPatch(ClassPatchInterface $patch)
- {
- $this->patches[] = $patch;
- @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) {
- return $patch2->getPriority() - $patch1->getPriority();
- });
- }
- /**
- * Creates double from specific class or/and list of interfaces.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces Array of ReflectionClass instances
- * @param array $args Constructor arguments
- *
- * @return DoubleInterface
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function double(ReflectionClass $class = null, array $interfaces, array $args = null)
- {
- foreach ($interfaces as $interface) {
- if (!$interface instanceof ReflectionClass) {
- throw new InvalidArgumentException(sprintf(
- "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
- "a second argument to `Doubler::double(...)`, but got %s.",
- is_object($interface) ? get_class($interface).' class' : gettype($interface)
- ));
- }
- }
- $classname = $this->createDoubleClass($class, $interfaces);
- $reflection = new ReflectionClass($classname);
- if (null !== $args) {
- return $reflection->newInstanceArgs($args);
- }
- if ((null === $constructor = $reflection->getConstructor())
- || ($constructor->isPublic() && !$constructor->isFinal())) {
- return $reflection->newInstance();
- }
- if (!$this->instantiator) {
- $this->instantiator = new Instantiator();
- }
- return $this->instantiator->instantiate($classname);
- }
- /**
- * Creates double class and returns its FQN.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
- {
- $name = $this->namer->name($class, $interfaces);
- $node = $this->mirror->reflect($class, $interfaces);
- foreach ($this->patches as $patch) {
- if ($patch->supports($node)) {
- $patch->apply($node);
- }
- }
- $this->creator->create($name, $node);
- return $name;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- /**
- * Class code creator.
- * Generates PHP code for specific class node tree.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassCodeGenerator
- {
- /**
- * Generates PHP code for class node.
- *
- * @param string $classname
- * @param Node\ClassNode $class
- *
- * @return string
- */
- public function generate($classname, Node\ClassNode $class)
- {
- $parts = explode('\\', $classname);
- $classname = array_pop($parts);
- $namespace = implode('\\', $parts);
- $code = sprintf("class %s extends \%s implements %s {\n",
- $classname, $class->getParentClass(), implode(', ',
- array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces())
- )
- );
- foreach ($class->getProperties() as $name => $visibility) {
- $code .= sprintf("%s \$%s;\n", $visibility, $name);
- }
- $code .= "\n";
- foreach ($class->getMethods() as $method) {
- $code .= $this->generateMethod($method)."\n";
- }
- $code .= "\n}";
- return sprintf("namespace %s {\n%s\n}", $namespace, $code);
- }
- private function generateMethod(Node\MethodNode $method)
- {
- $php = sprintf("%s %s function %s%s(%s) {\n",
- $method->getVisibility(),
- $method->isStatic() ? 'static' : '',
- $method->returnsReference() ? '&':'',
- $method->getName(),
- implode(', ', $this->generateArguments($method->getArguments()))
- );
- $php .= $method->getCode()."\n";
- return $php.'}';
- }
- private function generateArguments(array $arguments)
- {
- return array_map(function (Node\ArgumentNode $argument) {
- $php = '';
- if ($hint = $argument->getTypeHint()) {
- if ('array' === $hint || 'callable' === $hint) {
- $php .= $hint;
- } else {
- $php .= '\\'.$hint;
- }
- }
- $php .= ' '.($argument->isPassedByReference() ? '&' : '').'$'.$argument->getName();
- if ($argument->isOptional()) {
- $php .= ' = '.var_export($argument->getDefault(), true);
- }
- return $php;
- }, $arguments);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- use Prophecy\Exception\Doubler\ClassCreatorException;
- /**
- * Class creator.
- * Creates specific class in current environment.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassCreator
- {
- private $generator;
- /**
- * Initializes creator.
- *
- * @param ClassCodeGenerator $generator
- */
- public function __construct(ClassCodeGenerator $generator = null)
- {
- $this->generator = $generator ?: new ClassCodeGenerator;
- }
- /**
- * Creates class.
- *
- * @param string $classname
- * @param Node\ClassNode $class
- *
- * @return mixed
- *
- * @throws \Prophecy\Exception\Doubler\ClassCreatorException
- */
- public function create($classname, Node\ClassNode $class)
- {
- $code = $this->generator->generate($classname, $class);
- $return = eval($code);
- if (!class_exists($classname, false)) {
- if (count($class->getInterfaces())) {
- throw new ClassCreatorException(sprintf(
- 'Could not double `%s` and implement interfaces: [%s].',
- $class->getParentClass(), implode(', ', $class->getInterfaces())
- ), $class);
- }
- throw new ClassCreatorException(
- sprintf('Could not double `%s`.', $class->getParentClass()),
- $class
- );
- }
- return $return;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- /**
- * Reflection interface.
- * All reflected classes implement this interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ReflectionInterface
- {
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Exception\Doubler\ClassMirrorException;
- use ReflectionClass;
- use ReflectionMethod;
- use ReflectionParameter;
- /**
- * Class mirror.
- * Core doubler class. Mirrors specific class and/or interfaces into class node tree.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassMirror
- {
- private static $reflectableMethods = array(
- '__construct',
- '__destruct',
- '__sleep',
- '__wakeup',
- '__toString',
- '__call',
- );
- /**
- * Reflects provided arguments into class node.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return Node\ClassNode
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function reflect(ReflectionClass $class = null, array $interfaces)
- {
- $node = new Node\ClassNode;
- if (null !== $class) {
- if (true === $class->isInterface()) {
- throw new InvalidArgumentException(sprintf(
- "Could not reflect %s as a class, because it\n".
- "is interface - use the second argument instead.",
- $class->getName()
- ));
- }
- $this->reflectClassToNode($class, $node);
- }
- foreach ($interfaces as $interface) {
- if (!$interface instanceof ReflectionClass) {
- throw new InvalidArgumentException(sprintf(
- "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
- "a second argument to `ClassMirror::reflect(...)`, but got %s.",
- is_object($interface) ? get_class($interface).' class' : gettype($interface)
- ));
- }
- if (false === $interface->isInterface()) {
- throw new InvalidArgumentException(sprintf(
- "Could not reflect %s as an interface, because it\n".
- "is class - use the first argument instead.",
- $interface->getName()
- ));
- }
- $this->reflectInterfaceToNode($interface, $node);
- }
- $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface');
- return $node;
- }
- private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node)
- {
- if (true === $class->isFinal()) {
- throw new ClassMirrorException(sprintf(
- 'Could not reflect class %s as it is marked final.', $class->getName()
- ), $class);
- }
- $node->setParentClass($class->getName());
- foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
- if (false === $method->isProtected()) {
- continue;
- }
- $this->reflectMethodToNode($method, $node);
- }
- foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
- if (0 === strpos($method->getName(), '_')
- && !in_array($method->getName(), self::$reflectableMethods)) {
- continue;
- }
- if (true === $method->isFinal()) {
- continue;
- }
- $this->reflectMethodToNode($method, $node);
- }
- }
- private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node)
- {
- $node->addInterface($interface->getName());
- foreach ($interface->getMethods() as $method) {
- $this->reflectMethodToNode($method, $node);
- }
- }
- private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode)
- {
- $node = new Node\MethodNode($method->getName());
- if (true === $method->isProtected()) {
- $node->setVisibility('protected');
- }
- if (true === $method->isStatic()) {
- $node->setStatic();
- }
- if (true === $method->returnsReference()) {
- $node->setReturnsReference();
- }
- if (is_array($params = $method->getParameters()) && count($params)) {
- foreach ($params as $param) {
- $this->reflectArgumentToNode($param, $node);
- }
- }
- $classNode->addMethod($node);
- }
- private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode)
- {
- $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName();
- $node = new Node\ArgumentNode($name);
- $typeHint = $this->getTypeHint($parameter);
- $node->setTypeHint($typeHint);
- if (true === $parameter->isDefaultValueAvailable()) {
- $node->setDefault($parameter->getDefaultValue());
- } elseif (true === $parameter->isOptional()
- || (true === $parameter->allowsNull() && $typeHint)) {
- $node->setDefault(null);
- }
- if (true === $parameter->isPassedByReference()) {
- $node->setAsPassedByReference();
- }
- $methodNode->addArgument($node);
- }
- private function getTypeHint(ReflectionParameter $parameter)
- {
- if (null !== $className = $this->getParameterClassName($parameter)) {
- return $className;
- }
- if (true === $parameter->isArray()) {
- return 'array';
- }
- if (version_compare(PHP_VERSION, '5.4', '>=') && true === $parameter->isCallable()) {
- return 'callable';
- }
- return null;
- }
- private function getParameterClassName(ReflectionParameter $parameter)
- {
- try {
- return $parameter->getClass() ? $parameter->getClass()->getName() : null;
- } catch (\ReflectionException $e) {
- preg_match('/\[\s\<\w+?>\s([\w,\\\]+)/s', $parameter, $matches);
- return isset($matches[1]) ? $matches[1] : null;
- }
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- /**
- * Argument node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ArgumentNode
- {
- private $name;
- private $typeHint;
- private $default;
- private $optional = false;
- private $byReference = false;
- /**
- * @param string $name
- */
- public function __construct($name)
- {
- $this->name = $name;
- }
- public function getName()
- {
- return $this->name;
- }
- public function getTypeHint()
- {
- return $this->typeHint;
- }
- public function setTypeHint($typeHint = null)
- {
- $this->typeHint = $typeHint;
- }
- public function getDefault()
- {
- return $this->default;
- }
- public function setDefault($default = null)
- {
- $this->optional = true;
- $this->default = $default;
- }
- public function isOptional()
- {
- return $this->optional;
- }
- public function setAsPassedByReference($byReference = true)
- {
- $this->byReference = $byReference;
- }
- public function isPassedByReference()
- {
- return $this->byReference;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Method node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class MethodNode
- {
- private $name;
- private $code;
- private $visibility = 'public';
- private $static = false;
- private $returnsReference = false;
- /**
- * @var ArgumentNode[]
- */
- private $arguments = array();
- /**
- * @param string $name
- * @param string $code
- */
- public function __construct($name, $code = null)
- {
- $this->name = $name;
- $this->code = $code;
- }
- public function getVisibility()
- {
- return $this->visibility;
- }
- /**
- * @param string $visibility
- */
- public function setVisibility($visibility)
- {
- $visibility = strtolower($visibility);
- if (!in_array($visibility, array('public', 'private', 'protected'))) {
- throw new InvalidArgumentException(sprintf(
- '`%s` method visibility is not supported.', $visibility
- ));
- }
- $this->visibility = $visibility;
- }
- public function isStatic()
- {
- return $this->static;
- }
- public function setStatic($static = true)
- {
- $this->static = (bool) $static;
- }
- public function returnsReference()
- {
- return $this->returnsReference;
- }
- public function setReturnsReference()
- {
- $this->returnsReference = true;
- }
- public function getName()
- {
- return $this->name;
- }
- public function addArgument(ArgumentNode $argument)
- {
- $this->arguments[] = $argument;
- }
- /**
- * @return ArgumentNode[]
- */
- public function getArguments()
- {
- return $this->arguments;
- }
- /**
- * @param string $code
- */
- public function setCode($code)
- {
- $this->code = $code;
- }
- public function getCode()
- {
- if ($this->returnsReference)
- {
- return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');";
- }
- return (string) $this->code;
- }
- public function useParentCode()
- {
- $this->code = sprintf(
- 'return parent::%s(%s);', $this->getName(), implode(', ',
- array_map(function (ArgumentNode $arg) { return '$'.$arg->getName(); }, $this->arguments)
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\Generator\Node;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Class node.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ClassNode
- {
- private $parentClass = 'stdClass';
- private $interfaces = array();
- private $properties = array();
- /**
- * @var MethodNode[]
- */
- private $methods = array();
- public function getParentClass()
- {
- return $this->parentClass;
- }
- /**
- * @param string $class
- */
- public function setParentClass($class)
- {
- $this->parentClass = $class ?: 'stdClass';
- }
- /**
- * @return string[]
- */
- public function getInterfaces()
- {
- return $this->interfaces;
- }
- /**
- * @param string $interface
- */
- public function addInterface($interface)
- {
- if ($this->hasInterface($interface)) {
- return;
- }
- array_unshift($this->interfaces, $interface);
- }
- /**
- * @param string $interface
- *
- * @return bool
- */
- public function hasInterface($interface)
- {
- return in_array($interface, $this->interfaces);
- }
- public function getProperties()
- {
- return $this->properties;
- }
- public function addProperty($name, $visibility = 'public')
- {
- $visibility = strtolower($visibility);
- if (!in_array($visibility, array('public', 'private', 'protected'))) {
- throw new InvalidArgumentException(sprintf(
- '`%s` property visibility is not supported.', $visibility
- ));
- }
- $this->properties[$name] = $visibility;
- }
- /**
- * @return MethodNode[]
- */
- public function getMethods()
- {
- return $this->methods;
- }
- public function addMethod(MethodNode $method)
- {
- $this->methods[$method->getName()] = $method;
- }
- public function removeMethod($name)
- {
- unset($this->methods[$name]);
- }
- /**
- * @param string $name
- *
- * @return MethodNode|null
- */
- public function getMethod($name)
- {
- return $this->hasMethod($name) ? $this->methods[$name] : null;
- }
- /**
- * @param string $name
- *
- * @return bool
- */
- public function hasMethod($name)
- {
- return isset($this->methods[$name]);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use Prophecy\Exception\Doubler\DoubleException;
- use Prophecy\Exception\Doubler\ClassNotFoundException;
- use Prophecy\Exception\Doubler\InterfaceNotFoundException;
- use ReflectionClass;
- /**
- * Lazy double.
- * Gives simple interface to describe double before creating it.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class LazyDouble
- {
- private $doubler;
- private $class;
- private $interfaces = array();
- private $arguments = null;
- private $double;
- /**
- * Initializes lazy double.
- *
- * @param Doubler $doubler
- */
- public function __construct(Doubler $doubler)
- {
- $this->doubler = $doubler;
- }
- /**
- * Tells doubler to use specific class as parent one for double.
- *
- * @param string|ReflectionClass $class
- *
- * @throws \Prophecy\Exception\Doubler\ClassNotFoundException
- * @throws \Prophecy\Exception\Doubler\DoubleException
- */
- public function setParentClass($class)
- {
- if (null !== $this->double) {
- throw new DoubleException('Can not extend class with already instantiated double.');
- }
- if (!$class instanceof ReflectionClass) {
- if (!class_exists($class)) {
- throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class);
- }
- $class = new ReflectionClass($class);
- }
- $this->class = $class;
- }
- /**
- * Tells doubler to implement specific interface with double.
- *
- * @param string|ReflectionClass $interface
- *
- * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException
- * @throws \Prophecy\Exception\Doubler\DoubleException
- */
- public function addInterface($interface)
- {
- if (null !== $this->double) {
- throw new DoubleException(
- 'Can not implement interface with already instantiated double.'
- );
- }
- if (!$interface instanceof ReflectionClass) {
- if (!interface_exists($interface)) {
- throw new InterfaceNotFoundException(
- sprintf('Interface %s not found.', $interface),
- $interface
- );
- }
- $interface = new ReflectionClass($interface);
- }
- $this->interfaces[] = $interface;
- }
- /**
- * Sets constructor arguments.
- *
- * @param array $arguments
- */
- public function setArguments(array $arguments = null)
- {
- $this->arguments = $arguments;
- }
- /**
- * Creates double instance or returns already created one.
- *
- * @return DoubleInterface
- */
- public function getInstance()
- {
- if (null === $this->double) {
- if (null !== $this->arguments) {
- return $this->double = $this->doubler->double(
- $this->class, $this->interfaces, $this->arguments
- );
- }
- $this->double = $this->doubler->double($this->class, $this->interfaces);
- }
- return $this->double;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Remove method functionality from the double which will clash with php keywords.
- *
- * @author Milan Magudia <milan@magudia.com>
- */
- class KeywordPatch implements ClassPatchInterface
- {
- /**
- * Support any class
- *
- * @param ClassNode $node
- *
- * @return boolean
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Remove methods that clash with php keywords
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $methodNames = array_keys($node->getMethods());
- $methodsToRemove = array_intersect($methodNames, $this->getKeywords());
- foreach ($methodsToRemove as $methodName) {
- $node->removeMethod($methodName);
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority() {
- return 49;
- }
- /**
- * Returns array of php keywords.
- *
- * @return array
- */
- private function getKeywords() {
- return array(
- '__halt_compiler',
- 'abstract',
- 'and',
- 'array',
- 'as',
- 'break',
- 'callable',
- 'case',
- 'catch',
- 'class',
- 'clone',
- 'const',
- 'continue',
- 'declare',
- 'default',
- 'die',
- 'do',
- 'echo',
- 'else',
- 'elseif',
- 'empty',
- 'enddeclare',
- 'endfor',
- 'endforeach',
- 'endif',
- 'endswitch',
- 'endwhile',
- 'eval',
- 'exit',
- 'extends',
- 'final',
- 'finally',
- 'for',
- 'foreach',
- 'function',
- 'global',
- 'goto',
- 'if',
- 'implements',
- 'include',
- 'include_once',
- 'instanceof',
- 'insteadof',
- 'interface',
- 'isset',
- 'list',
- 'namespace',
- 'new',
- 'or',
- 'print',
- 'private',
- 'protected',
- 'public',
- 'require',
- 'require_once',
- 'return',
- 'static',
- 'switch',
- 'throw',
- 'trait',
- 'try',
- 'unset',
- 'use',
- 'var',
- 'while',
- 'xor',
- 'yield',
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- use Prophecy\Doubler\Generator\Node\ArgumentNode;
- /**
- * Add Prophecy functionality to the double.
- * This is a core class patch for Prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ProphecySubjectPatch implements ClassPatchInterface
- {
- /**
- * Always returns true.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Apply Prophecy functionality to class node.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface');
- $node->addProperty('objectProphecy', 'private');
- foreach ($node->getMethods() as $name => $method) {
- if ('__construct' === strtolower($name)) {
- continue;
- }
- $method->setCode(
- 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
- );
- }
- $prophecySetter = new MethodNode('setProphecy');
- $prophecyArgument = new ArgumentNode('prophecy');
- $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface');
- $prophecySetter->addArgument($prophecyArgument);
- $prophecySetter->setCode('$this->objectProphecy = $prophecy;');
- $prophecyGetter = new MethodNode('getProphecy');
- $prophecyGetter->setCode('return $this->objectProphecy;');
- if ($node->hasMethod('__call')) {
- $__call = $node->getMethod('__call');
- } else {
- $__call = new MethodNode('__call');
- $__call->addArgument(new ArgumentNode('name'));
- $__call->addArgument(new ArgumentNode('arguments'));
- $node->addMethod($__call);
- }
- $__call->setCode(<<<PHP
- throw new \Prophecy\Exception\Doubler\MethodNotFoundException(
- sprintf('Method `%s::%s()` not found.', get_class(\$this), func_get_arg(0)),
- \$this->getProphecy(), func_get_arg(0)
- );
- PHP
- );
- $node->addMethod($prophecySetter);
- $node->addMethod($prophecyGetter);
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 0;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use phpDocumentor\Reflection\DocBlock;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Discover Magical API using "@method" PHPDoc format.
- *
- * @author Thomas Tourlourat <thomas@tourlourat.com>
- */
- class MagicCallPatch implements ClassPatchInterface
- {
- /**
- * Support any class
- *
- * @param ClassNode $node
- *
- * @return boolean
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Discover Magical API
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $parentClass = $node->getParentClass();
- $reflectionClass = new \ReflectionClass($parentClass);
- $phpdoc = new DocBlock($reflectionClass->getDocComment());
- $tagList = $phpdoc->getTagsByName('method');
- foreach($tagList as $tag) {
- $methodName = $tag->getMethodName();
- if (!$reflectionClass->hasMethod($methodName)) {
- $methodNode = new MethodNode($tag->getMethodName());
- $methodNode->setStatic($tag->isStatic());
- $node->addMethod($methodNode);
- }
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return integer Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Traversable interface patch.
- * Forces classes that implement interfaces, that extend Traversable to also implement Iterator.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class TraversablePatch implements ClassPatchInterface
- {
- /**
- * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (in_array('Iterator', $node->getInterfaces())) {
- return false;
- }
- if (in_array('IteratorAggregate', $node->getInterfaces())) {
- return false;
- }
- foreach ($node->getInterfaces() as $interface) {
- if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) {
- continue;
- }
- if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) {
- continue;
- }
- if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) {
- continue;
- }
- return true;
- }
- return false;
- }
- /**
- * Forces class to implement Iterator interface.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- $node->addInterface('Iterator');
- $node->addMethod(new MethodNode('current'));
- $node->addMethod(new MethodNode('key'));
- $node->addMethod(new MethodNode('next'));
- $node->addMethod(new MethodNode('rewind'));
- $node->addMethod(new MethodNode('valid'));
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 100;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * SplFileInfo patch.
- * Makes SplFileInfo and derivative classes usable with Prophecy.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class SplFileInfoPatch implements ClassPatchInterface
- {
- /**
- * Supports everything that extends SplFileInfo.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (null === $node->getParentClass()) {
- return false;
- }
- return 'SplFileInfo' === $node->getParentClass()
- || is_subclass_of($node->getParentClass(), 'SplFileInfo')
- ;
- }
- /**
- * Updated constructor code to call parent one with dummy file argument.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- if ($node->hasMethod('__construct')) {
- $constructor = $node->getMethod('__construct');
- } else {
- $constructor = new MethodNode('__construct');
- $node->addMethod($constructor);
- }
- if ($this->nodeIsDirectoryIterator($node)) {
- $constructor->setCode('return parent::__construct("' . __DIR__ . '");');
- return;
- }
- $constructor->useParentCode();
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- /**
- * @param ClassNode $node
- * @return boolean
- */
- private function nodeIsDirectoryIterator(ClassNode $node)
- {
- $parent = $node->getParentClass();
- return 'DirectoryIterator' === $parent
- || is_subclass_of($parent, 'DirectoryIterator');
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- use Prophecy\Doubler\Generator\Node\MethodNode;
- /**
- * Disable constructor.
- * Makes all constructor arguments optional.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class DisableConstructorPatch implements ClassPatchInterface
- {
- /**
- * Checks if class has `__construct` method.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return true;
- }
- /**
- * Makes all class constructor arguments optional.
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- if (!$node->hasMethod('__construct')) {
- $node->addMethod(new MethodNode('__construct', ''));
- return;
- }
- $constructor = $node->getMethod('__construct');
- foreach ($constructor->getArguments() as $argument) {
- $argument->setDefault(null);
- }
- $constructor->setCode(<<<PHP
- if (0 < func_num_args()) {
- call_user_func_array(array('parent', '__construct'), func_get_args());
- }
- PHP
- );
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority()
- {
- return 100;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Exception patch for HHVM to remove the stubs from special methods
- *
- * @author Christophe Coevoet <stof@notk.org>
- */
- class HhvmExceptionPatch implements ClassPatchInterface
- {
- /**
- * Supports exceptions on HHVM.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- if (!defined('HHVM_VERSION')) {
- return false;
- }
- return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception');
- }
- /**
- * Removes special exception static methods from the doubled methods.
- *
- * @param ClassNode $node
- *
- * @return void
- */
- public function apply(ClassNode $node)
- {
- if ($node->hasMethod('setTraceOptions')) {
- $node->getMethod('setTraceOptions')->useParentCode();
- }
- if ($node->hasMethod('getTraceOptions')) {
- $node->getMethod('getTraceOptions')->useParentCode();
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getPriority()
- {
- return -50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * ReflectionClass::newInstance patch.
- * Makes first argument of newInstance optional, since it works but signature is misleading
- *
- * @author Florian Klein <florian.klein@free.fr>
- */
- class ReflectionClassNewInstancePatch implements ClassPatchInterface
- {
- /**
- * Supports ReflectionClass
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node)
- {
- return 'ReflectionClass' === $node->getParentClass();
- }
- /**
- * Updates newInstance's first argument to make it optional
- *
- * @param ClassNode $node
- */
- public function apply(ClassNode $node)
- {
- foreach ($node->getMethod('newInstance')->getArguments() as $argument) {
- $argument->setDefault(null);
- }
- }
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher = earlier)
- */
- public function getPriority()
- {
- return 50;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler\ClassPatch;
- use Prophecy\Doubler\Generator\Node\ClassNode;
- /**
- * Class patch interface.
- * Class patches extend doubles functionality or help
- * Prophecy to avoid some internal PHP bugs.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface ClassPatchInterface
- {
- /**
- * Checks if patch supports specific class node.
- *
- * @param ClassNode $node
- *
- * @return bool
- */
- public function supports(ClassNode $node);
- /**
- * Applies patch to the specific class node.
- *
- * @param ClassNode $node
- * @return void
- */
- public function apply(ClassNode $node);
- /**
- * Returns patch priority, which determines when patch will be applied.
- *
- * @return int Priority number (higher - earlier)
- */
- public function getPriority();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Doubler;
- use ReflectionClass;
- /**
- * Name generator.
- * Generates classname for double.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class NameGenerator
- {
- private static $counter = 1;
- /**
- * Generates name.
- *
- * @param ReflectionClass $class
- * @param ReflectionClass[] $interfaces
- *
- * @return string
- */
- public function name(ReflectionClass $class = null, array $interfaces)
- {
- $parts = array();
- if (null !== $class) {
- $parts[] = $class->getName();
- } else {
- foreach ($interfaces as $interface) {
- $parts[] = $interface->getShortName();
- }
- }
- if (!count($parts)) {
- $parts[] = 'stdClass';
- }
- return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Argument\Token\AnyValuesToken;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\UnexpectedCallsCountException;
- /**
- * Prediction interface.
- * Predictions are logical test blocks, tied to `should...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallTimesPrediction implements PredictionInterface
- {
- private $times;
- private $util;
- /**
- * Initializes prediction.
- *
- * @param int $times
- * @param StringUtil $util
- */
- public function __construct($times, StringUtil $util = null)
- {
- $this->times = intval($times);
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there was exact amount of calls made.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if ($this->times == count($calls)) {
- return;
- }
- $methodCalls = $object->findProphecyMethodCalls(
- $method->getMethodName(),
- new ArgumentsWildcard(array(new AnyValuesToken))
- );
- if (count($calls)) {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but %d were made:\n%s",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- count($calls),
- $this->util->stringifyCalls($calls)
- );
- } elseif (count($methodCalls)) {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but none were made.\n".
- "Recorded `%s(...)` calls:\n%s",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- $method->getMethodName(),
- $this->util->stringifyCalls($methodCalls)
- );
- } else {
- $message = sprintf(
- "Expected exactly %d calls that match:\n".
- " %s->%s(%s)\n".
- "but none were made.",
- $this->times,
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard()
- );
- }
- throw new UnexpectedCallsCountException($message, $method, $this->times, $calls);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\UnexpectedCallsException;
- /**
- * No calls prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class NoCallsPrediction implements PredictionInterface
- {
- private $util;
- /**
- * Initializes prediction.
- *
- * @param null|StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there were no calls made.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if (!count($calls)) {
- return;
- }
- $verb = count($calls) === 1 ? 'was' : 'were';
- throw new UnexpectedCallsException(sprintf(
- "No calls expected that match:\n".
- " %s->%s(%s)\n".
- "but %d %s made:\n%s",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- count($calls),
- $verb,
- $this->util->stringifyCalls($calls)
- ), $method, $calls);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Prediction interface.
- * Predictions are logical test blocks, tied to `should...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface PredictionInterface
- {
- /**
- * Tests that double fulfilled prediction.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws object
- * @return void
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use Closure;
- /**
- * Callback prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackPrediction implements PredictionInterface
- {
- private $callback;
- /**
- * Initializes callback prediction.
- *
- * @param callable $callback Custom callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackPrediction, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Executes preset callback.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- $callback = $this->callback;
- if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
- $callback = Closure::bind($callback, $object);
- }
- call_user_func($callback, $calls, $object, $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Prediction;
- use Prophecy\Call\Call;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Argument\Token\AnyValuesToken;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Prediction\NoCallsException;
- /**
- * Call prediction.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallPrediction implements PredictionInterface
- {
- private $util;
- /**
- * Initializes prediction.
- *
- * @param StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Tests that there was at least one call.
- *
- * @param Call[] $calls
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws \Prophecy\Exception\Prediction\NoCallsException
- */
- public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
- {
- if (count($calls)) {
- return;
- }
- $methodCalls = $object->findProphecyMethodCalls(
- $method->getMethodName(),
- new ArgumentsWildcard(array(new AnyValuesToken))
- );
- if (count($methodCalls)) {
- throw new NoCallsException(sprintf(
- "No calls have been made that match:\n".
- " %s->%s(%s)\n".
- "but expected at least one.\n".
- "Recorded `%s(...)` calls:\n%s",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard(),
- $method->getMethodName(),
- $this->util->stringifyCalls($methodCalls)
- ), $method);
- }
- throw new NoCallsException(sprintf(
- "No calls have been made that match:\n".
- " %s->%s(%s)\n".
- "but expected at least one.",
- get_class($object->reveal()),
- $method->getMethodName(),
- $method->getArgumentsWildcard()
- ), $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Call;
- use Exception;
- /**
- * Call object.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class Call
- {
- private $methodName;
- private $arguments;
- private $returnValue;
- private $exception;
- private $file;
- private $line;
- /**
- * Initializes call.
- *
- * @param string $methodName
- * @param array $arguments
- * @param mixed $returnValue
- * @param Exception $exception
- * @param null|string $file
- * @param null|int $line
- */
- public function __construct($methodName, array $arguments, $returnValue,
- Exception $exception = null, $file, $line)
- {
- $this->methodName = $methodName;
- $this->arguments = $arguments;
- $this->returnValue = $returnValue;
- $this->exception = $exception;
- if ($file) {
- $this->file = $file;
- $this->line = intval($line);
- }
- }
- /**
- * Returns called method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->methodName;
- }
- /**
- * Returns called method arguments.
- *
- * @return array
- */
- public function getArguments()
- {
- return $this->arguments;
- }
- /**
- * Returns called method return value.
- *
- * @return null|mixed
- */
- public function getReturnValue()
- {
- return $this->returnValue;
- }
- /**
- * Returns exception that call thrown.
- *
- * @return null|Exception
- */
- public function getException()
- {
- return $this->exception;
- }
- /**
- * Returns callee filename.
- *
- * @return string
- */
- public function getFile()
- {
- return $this->file;
- }
- /**
- * Returns callee line number.
- *
- * @return int
- */
- public function getLine()
- {
- return $this->line;
- }
- /**
- * Returns short notation for callee place.
- *
- * @return string
- */
- public function getCallPlace()
- {
- if (null === $this->file) {
- return 'unknown';
- }
- return sprintf('%s:%d', $this->file, $this->line);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Call;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Argument\ArgumentsWildcard;
- use Prophecy\Util\StringUtil;
- use Prophecy\Exception\Call\UnexpectedCallException;
- /**
- * Calls receiver & manager.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallCenter
- {
- private $util;
- /**
- * @var Call[]
- */
- private $recordedCalls = array();
- /**
- * Initializes call center.
- *
- * @param StringUtil $util
- */
- public function __construct(StringUtil $util = null)
- {
- $this->util = $util ?: new StringUtil;
- }
- /**
- * Makes and records specific method call for object prophecy.
- *
- * @param ObjectProphecy $prophecy
- * @param string $methodName
- * @param array $arguments
- *
- * @return mixed Returns null if no promise for prophecy found or promise return value.
- *
- * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found
- */
- public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments)
- {
- $backtrace = debug_backtrace();
- $file = $line = null;
- if (isset($backtrace[2]) && isset($backtrace[2]['file'])) {
- $file = $backtrace[2]['file'];
- $line = $backtrace[2]['line'];
- }
- // If no method prophecies defined, then it's a dummy, so we'll just return null
- if ('__destruct' === $methodName || 0 == count($prophecy->getMethodProphecies())) {
- $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
- return null;
- }
- // There are method prophecies, so it's a fake/stub. Searching prophecy for this call
- $matches = array();
- foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
- if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
- $matches[] = array($score, $methodProphecy);
- }
- }
- // If fake/stub doesn't have method prophecy for this call - throw exception
- if (!count($matches)) {
- throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments);
- }
- // Sort matches by their score value
- @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
- // If Highest rated method prophecy has a promise - execute it or return null instead
- $returnValue = null;
- $exception = null;
- if ($promise = $matches[0][1]->getPromise()) {
- try {
- $returnValue = $promise->execute($arguments, $prophecy, $matches[0][1]);
- } catch (\Exception $e) {
- $exception = $e;
- }
- }
- $this->recordedCalls[] = new Call(
- $methodName, $arguments, $returnValue, $exception, $file, $line
- );
- if (null !== $exception) {
- throw $exception;
- }
- return $returnValue;
- }
- /**
- * Searches for calls by method name & arguments wildcard.
- *
- * @param string $methodName
- * @param ArgumentsWildcard $wildcard
- *
- * @return Call[]
- */
- public function findCalls($methodName, ArgumentsWildcard $wildcard)
- {
- return array_values(
- array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
- return $methodName === $call->getMethodName()
- && 0 < $wildcard->scoreArguments($call->getArguments())
- ;
- })
- );
- }
- private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName,
- array $arguments)
- {
- $classname = get_class($prophecy->reveal());
- $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments));
- $expected = implode("\n", array_map(function (MethodProphecy $methodProphecy) {
- return sprintf(' - %s(%s)',
- $methodProphecy->getMethodName(),
- $methodProphecy->getArgumentsWildcard()
- );
- }, call_user_func_array('array_merge', $prophecy->getMethodProphecies())));
- return new UnexpectedCallException(
- sprintf(
- "Method call:\n".
- " - %s(%s)\n".
- "on %s was not expected, expected calls were:\n%s",
- $methodName, $argstring, $classname, $expected
- ),
- $prophecy, $methodName, $arguments
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Doctrine\Instantiator\Instantiator;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use ReflectionClass;
- /**
- * Throw promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ThrowPromise implements PromiseInterface
- {
- private $exception;
- /**
- * @var \Doctrine\Instantiator\Instantiator
- */
- private $instantiator;
- /**
- * Initializes promise.
- *
- * @param string|\Exception $exception Exception class name or instance
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($exception)
- {
- if (is_string($exception)) {
- if (!class_exists($exception)
- && 'Exception' !== $exception
- && !is_subclass_of($exception, 'Exception')) {
- throw new InvalidArgumentException(sprintf(
- 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
- gettype($exception)
- ));
- }
- } elseif (!$exception instanceof \Exception) {
- throw new InvalidArgumentException(sprintf(
- 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
- gettype($exception)
- ));
- }
- $this->exception = $exception;
- }
- /**
- * Throws predefined exception.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @throws object
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- if (is_string($this->exception)) {
- $classname = $this->exception;
- $reflection = new ReflectionClass($classname);
- $constructor = $reflection->getConstructor();
- if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) {
- throw $reflection->newInstance();
- }
- if (!$this->instantiator) {
- $this->instantiator = new Instantiator();
- }
- throw $this->instantiator->instantiate($classname);
- }
- throw $this->exception;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Exception\InvalidArgumentException;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Return argument promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ReturnArgumentPromise implements PromiseInterface
- {
- /**
- * @var int
- */
- private $index;
- /**
- * Initializes callback promise.
- *
- * @param int $index The zero-indexed number of the argument to return
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($index = 0)
- {
- if (!is_int($index) || $index < 0) {
- throw new InvalidArgumentException(
- 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.',
- $index
- );
- }
- $this->index = $index;
- }
- /**
- * Returns nth argument if has one, null otherwise.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return null|mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- return count($args) > $this->index ? $args[$this->index] : null;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Return promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ReturnPromise implements PromiseInterface
- {
- private $returnValues = array();
- /**
- * Initializes promise.
- *
- * @param array $returnValues Array of values
- */
- public function __construct(array $returnValues)
- {
- $this->returnValues = $returnValues;
- }
- /**
- * Returns saved values one by one until last one, then continuously returns last value.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- $value = array_shift($this->returnValues);
- if (!count($this->returnValues)) {
- $this->returnValues[] = $value;
- }
- return $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- use Prophecy\Exception\InvalidArgumentException;
- use Closure;
- /**
- * Callback promise.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackPromise implements PromiseInterface
- {
- private $callback;
- /**
- * Initializes callback promise.
- *
- * @param callable $callback Custom callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackPromise, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Evaluates promise callback.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
- {
- $callback = $this->callback;
- if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
- $callback = Closure::bind($callback, $object);
- }
- return call_user_func($callback, $args, $object, $method);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Promise;
- use Prophecy\Prophecy\ObjectProphecy;
- use Prophecy\Prophecy\MethodProphecy;
- /**
- * Promise interface.
- * Promises are logical blocks, tied to `will...` keyword.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface PromiseInterface
- {
- /**
- * Evaluates promise.
- *
- * @param array $args
- * @param ObjectProphecy $object
- * @param MethodProphecy $method
- *
- * @return mixed
- */
- public function execute(array $args, ObjectProphecy $object, MethodProphecy $method);
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument;
- /**
- * Arguments wildcarding.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ArgumentsWildcard
- {
- /**
- * @var Token\TokenInterface[]
- */
- private $tokens = array();
- private $string;
- /**
- * Initializes wildcard.
- *
- * @param array $arguments Array of argument tokens or values
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- if (!$argument instanceof Token\TokenInterface) {
- $argument = new Token\ExactValueToken($argument);
- }
- $this->tokens[] = $argument;
- }
- }
- /**
- * Calculates wildcard match score for provided arguments.
- *
- * @param array $arguments
- *
- * @return false|int False OR integer score (higher - better)
- */
- public function scoreArguments(array $arguments)
- {
- if (0 == count($arguments) && 0 == count($this->tokens)) {
- return 1;
- }
- $arguments = array_values($arguments);
- $totalScore = 0;
- foreach ($this->tokens as $i => $token) {
- $argument = isset($arguments[$i]) ? $arguments[$i] : null;
- if (1 >= $score = $token->scoreArgument($argument)) {
- return false;
- }
- $totalScore += $score;
- if (true === $token->isLast()) {
- return $totalScore;
- }
- }
- if (count($arguments) > count($this->tokens)) {
- return false;
- }
- return $totalScore;
- }
- /**
- * Returns string representation for wildcard.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = implode(', ', array_map(function ($token) {
- return (string) $token;
- }, $this->tokens));
- }
- return $this->string;
- }
- /**
- * @return array
- */
- public function getTokens()
- {
- return $this->tokens;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Any single value token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class AnyValueToken implements TokenInterface
- {
- /**
- * Always scores 3 for any argument.
- *
- * @param $argument
- *
- * @return int
- */
- public function scoreArgument($argument)
- {
- return 3;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return '*';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Array every entry token.
- *
- * @author Adrien Brault <adrien.brault@gmail.com>
- */
- class ArrayEveryEntryToken implements TokenInterface
- {
- /**
- * @var TokenInterface
- */
- private $value;
- /**
- * @param mixed $value exact value or token
- */
- public function __construct($value)
- {
- if (!$value instanceof TokenInterface) {
- $value = new ExactValueToken($value);
- }
- $this->value = $value;
- }
- /**
- * {@inheritdoc}
- */
- public function scoreArgument($argument)
- {
- if (!$argument instanceof \Traversable && !is_array($argument)) {
- return false;
- }
- $scores = array();
- foreach ($argument as $key => $argumentEntry) {
- $scores[] = $this->value->scoreArgument($argumentEntry);
- }
- if (empty($scores) || in_array(false, $scores, true)) {
- return false;
- }
- return array_sum($scores) / count($scores);
- }
- /**
- * {@inheritdoc}
- */
- public function isLast()
- {
- return false;
- }
- /**
- * {@inheritdoc}
- */
- public function __toString()
- {
- return sprintf('[%s, ..., %s]', $this->value, $this->value);
- }
- /**
- * @return TokenInterface
- */
- public function getValue()
- {
- return $this->value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Logical AND token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class LogicalAndToken implements TokenInterface
- {
- private $tokens = array();
- /**
- * @param array $arguments exact values or tokens
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- if (!$argument instanceof TokenInterface) {
- $argument = new ExactValueToken($argument);
- }
- $this->tokens[] = $argument;
- }
- }
- /**
- * Scores maximum score from scores returned by tokens for this argument if all of them score.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (0 === count($this->tokens)) {
- return false;
- }
- $maxScore = 0;
- foreach ($this->tokens as $token) {
- $score = $token->scoreArgument($argument);
- if (false === $score) {
- return false;
- }
- $maxScore = max($score, $maxScore);
- }
- return $maxScore;
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('bool(%s)', implode(' AND ', $this->tokens));
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Argument token interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- interface TokenInterface
- {
- /**
- * Calculates token match score for provided argument.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument);
- /**
- * Returns true if this token prevents check of other tokens (is last one).
- *
- * @return bool|int
- */
- public function isLast();
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString();
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Array entry token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class ArrayEntryToken implements TokenInterface
- {
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $key;
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $value;
- /**
- * @param mixed $key exact value or token
- * @param mixed $value exact value or token
- */
- public function __construct($key, $value)
- {
- $this->key = $this->wrapIntoExactValueToken($key);
- $this->value = $this->wrapIntoExactValueToken($value);
- }
- /**
- * Scores half of combined scores from key and value tokens for same entry. Capped at 8.
- * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken.
- *
- * @param array|\ArrayAccess|\Traversable $argument
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if ($argument instanceof \Traversable) {
- $argument = iterator_to_array($argument);
- }
- if ($argument instanceof \ArrayAccess) {
- $argument = $this->convertArrayAccessToEntry($argument);
- }
- if (!is_array($argument) || empty($argument)) {
- return false;
- }
- $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument));
- $valueScores = array_map(array($this->value,'scoreArgument'), $argument);
- $scoreEntry = function ($value, $key) {
- return $value && $key ? min(8, ($key + $value) / 2) : false;
- };
- return max(array_map($scoreEntry, $valueScores, $keyScores));
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('[..., %s => %s, ...]', $this->key, $this->value);
- }
- /**
- * Returns key
- *
- * @return TokenInterface
- */
- public function getKey()
- {
- return $this->key;
- }
- /**
- * Returns value
- *
- * @return TokenInterface
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Wraps non token $value into ExactValueToken
- *
- * @param $value
- * @return TokenInterface
- */
- private function wrapIntoExactValueToken($value)
- {
- return $value instanceof TokenInterface ? $value : new ExactValueToken($value);
- }
- /**
- * Converts instance of \ArrayAccess to key => value array entry
- *
- * @param \ArrayAccess $object
- *
- * @return array|null
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- private function convertArrayAccessToEntry(\ArrayAccess $object)
- {
- if (!$this->key instanceof ExactValueToken) {
- throw new InvalidArgumentException(sprintf(
- 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
- 'But you used `%s`.',
- $this->key
- ));
- }
- $key = $this->key->getValue();
- return $object->offsetExists($key) ? array($key => $object[$key]) : array();
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Array elements count token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class ArrayCountToken implements TokenInterface
- {
- private $count;
- /**
- * @param integer $value
- */
- public function __construct($value)
- {
- $this->count = $value;
- }
- /**
- * Scores 6 when argument has preset number of elements.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false;
- }
- /**
- * Returns false.
- *
- * @return boolean
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('count(%s)', $this->count);
- }
- /**
- * Returns true if object is either array or instance of \Countable
- *
- * @param $argument
- * @return bool
- */
- private function isCountable($argument)
- {
- return (is_array($argument) || $argument instanceof \Countable);
- }
- /**
- * Returns true if $argument has expected number of elements
- *
- * @param array|\Countable $argument
- *
- * @return bool
- */
- private function hasProperCount($argument)
- {
- return $this->count === count($argument);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Any values token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class AnyValuesToken implements TokenInterface
- {
- /**
- * Always scores 2 for any argument.
- *
- * @param $argument
- *
- * @return int
- */
- public function scoreArgument($argument)
- {
- return 2;
- }
- /**
- * Returns true to stop wildcard from processing other tokens.
- *
- * @return bool
- */
- public function isLast()
- {
- return true;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return '* [, ...]';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * String contains token.
- *
- * @author Peter Mitchell <pete@peterjmit.com>
- */
- class StringContainsToken implements TokenInterface
- {
- private $value;
- /**
- * Initializes token.
- *
- * @param string $value
- */
- public function __construct($value)
- {
- $this->value = $value;
- }
- public function scoreArgument($argument)
- {
- return strpos($argument, $this->value) !== false ? 6 : false;
- }
- /**
- * Returns preset value against which token checks arguments.
- *
- * @return mixed
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('contains("%s")', $this->value);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Util\StringUtil;
- /**
- * Exact value token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ExactValueToken implements TokenInterface
- {
- private $value;
- private $string;
- private $util;
- private $comparatorFactory;
- /**
- * Initializes token.
- *
- * @param mixed $value
- * @param StringUtil $util
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null)
- {
- $this->value = $value;
- $this->util = $util ?: new StringUtil();
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Scores 10 if argument matches preset value.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (is_object($argument) && is_object($this->value)) {
- $comparator = $this->comparatorFactory->getComparatorFor(
- $argument, $this->value
- );
- try {
- $comparator->assertEquals($argument, $this->value);
- return 10;
- } catch (ComparisonFailure $failure) {}
- }
- // If either one is an object it should be castable to a string
- if (is_object($argument) xor is_object($this->value)) {
- if (is_object($argument) && !method_exists($argument, '__toString')) {
- return false;
- }
- if (is_object($this->value) && !method_exists($this->value, '__toString')) {
- return false;
- }
- } elseif (is_numeric($argument) && is_numeric($this->value)) {
- // noop
- } elseif (gettype($argument) !== gettype($this->value)) {
- return false;
- }
- return $argument == $this->value ? 10 : false;
- }
- /**
- * Returns preset value against which token checks arguments.
- *
- * @return mixed
- */
- public function getValue()
- {
- return $this->value;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = sprintf('exact(%s)', $this->util->stringify($this->value));
- }
- return $this->string;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use SebastianBergmann\Comparator\ComparisonFailure;
- use Prophecy\Comparator\Factory as ComparatorFactory;
- use Prophecy\Util\StringUtil;
- /**
- * Object state-checker token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ObjectStateToken implements TokenInterface
- {
- private $name;
- private $value;
- private $util;
- private $comparatorFactory;
- /**
- * Initializes token.
- *
- * @param string $methodName
- * @param mixed $value Expected return value
- * @param null|StringUtil $util
- * @param ComparatorFactory $comparatorFactory
- */
- public function __construct(
- $methodName,
- $value,
- StringUtil $util = null,
- ComparatorFactory $comparatorFactory = null
- ) {
- $this->name = $methodName;
- $this->value = $value;
- $this->util = $util ?: new StringUtil;
- $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
- }
- /**
- * Scores 8 if argument is an object, which method returns expected value.
- *
- * @param mixed $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- if (is_object($argument) && method_exists($argument, $this->name)) {
- $actual = call_user_func(array($argument, $this->name));
- $comparator = $this->comparatorFactory->getComparatorFor(
- $actual, $this->value
- );
- try {
- $comparator->assertEquals($actual, $this->value);
- return 8;
- } catch (ComparisonFailure $failure) {
- return false;
- }
- }
- if (is_object($argument) && property_exists($argument, $this->name)) {
- return $argument->{$this->name} === $this->value ? 8 : false;
- }
- return false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('state(%s(), %s)',
- $this->name,
- $this->util->stringify($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Callback-verified token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class CallbackToken implements TokenInterface
- {
- private $callback;
- /**
- * Initializes token.
- *
- * @param callable $callback
- *
- * @throws \Prophecy\Exception\InvalidArgumentException
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw new InvalidArgumentException(sprintf(
- 'Callable expected as an argument to CallbackToken, but got %s.',
- gettype($callback)
- ));
- }
- $this->callback = $callback;
- }
- /**
- * Scores 7 if callback returns true, false otherwise.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return call_user_func($this->callback, $argument) ? 7 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return 'callback()';
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Util\StringUtil;
- /**
- * Identical value token.
- *
- * @author Florian Voutzinos <florian@voutzinos.com>
- */
- class IdenticalValueToken implements TokenInterface
- {
- private $value;
- private $string;
- private $util;
- /**
- * Initializes token.
- *
- * @param mixed $value
- * @param StringUtil $util
- */
- public function __construct($value, StringUtil $util = null)
- {
- $this->value = $value;
- $this->util = $util ?: new StringUtil();
- }
- /**
- * Scores 11 if argument matches preset value.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return $argument === $this->value ? 11 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- if (null === $this->string) {
- $this->string = sprintf('identical(%s)', $this->util->stringify($this->value));
- }
- return $this->string;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- /**
- * Logical NOT token.
- *
- * @author Boris Mikhaylov <kaguxmail@gmail.com>
- */
- class LogicalNotToken implements TokenInterface
- {
- /** @var \Prophecy\Argument\Token\TokenInterface */
- private $token;
- /**
- * @param mixed $value exact value or token
- */
- public function __construct($value)
- {
- $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value);
- }
- /**
- * Scores 4 when preset token does not match the argument.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- return false === $this->token->scoreArgument($argument) ? 4 : false;
- }
- /**
- * Returns true if preset token is last.
- *
- * @return bool|int
- */
- public function isLast()
- {
- return $this->token->isLast();
- }
- /**
- * Returns originating token.
- *
- * @return TokenInterface
- */
- public function getOriginatingToken()
- {
- return $this->token;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('not(%s)', $this->token);
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Argument\Token;
- use Prophecy\Exception\InvalidArgumentException;
- /**
- * Value type token.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class TypeToken implements TokenInterface
- {
- private $type;
- /**
- * @param string $type
- */
- public function __construct($type)
- {
- $checker = "is_{$type}";
- if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) {
- throw new InvalidArgumentException(sprintf(
- 'Type or class name expected as an argument to TypeToken, but got %s.', $type
- ));
- }
- $this->type = $type;
- }
- /**
- * Scores 5 if argument has the same type this token was constructed with.
- *
- * @param $argument
- *
- * @return bool|int
- */
- public function scoreArgument($argument)
- {
- $checker = "is_{$this->type}";
- if (function_exists($checker)) {
- return call_user_func($checker, $argument) ? 5 : false;
- }
- return $argument instanceof $this->type ? 5 : false;
- }
- /**
- * Returns false.
- *
- * @return bool
- */
- public function isLast()
- {
- return false;
- }
- /**
- * Returns string representation for token.
- *
- * @return string
- */
- public function __toString()
- {
- return sprintf('type(%s)', $this->type);
- }
- }
- <?php
- namespace Prophecy\Util;
- use Prophecy\Prophecy\ProphecyInterface;
- use SplObjectStorage;
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exporting utility.
- *
- * This class is derived from the PHPUnit testing framework.
- *
- * @author Sebastiaan Stok <s.stok@rollerscapes.net
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License>
- */
- class ExportUtil
- {
- /**
- * Exports a value into a string.
- *
- * The output of this method is similar to the output of print_r(), but
- * improved in various aspects:
- *
- * - NULL is rendered as "null" (instead of "")
- * - true is rendered as "true" (instead of "1")
- * - FALSE is rendered as "false" (instead of "")
- * - Strings are always quoted with single quotes
- * - Carriage returns and newlines are normalized to \n
- * - Recursion and repeated rendering is treated properly
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- *
- * @return string
- */
- public static function export($value, $indentation = 0)
- {
- return static::recursiveExport($value, $indentation);
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param object $object
- *
- * @return array
- */
- public static function toArray($object)
- {
- $array = array();
- foreach ((array) $object as $key => $value) {
- // properties are transformed to keys in the following way:
- // private $property => "\0Classname\0property"
- // protected $property => "\0*\0property"
- // public $property => "property"
- if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
- $key = $matches[1];
- }
- $array[$key] = $value;
- }
- // Some internal classes like SplObjectStorage don't work with the
- // above (fast) mechanism nor with reflection
- // Format the output similarly to print_r() in this case
- if ($object instanceof SplObjectStorage) {
- foreach ($object as $key => $value) {
- $array[spl_object_hash($value)] = array(
- 'obj' => $value,
- 'inf' => $object->getInfo(),
- );
- }
- }
- return $array;
- }
- /**
- * Recursive implementation of export.
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- * @param array $processedObjects Contains all objects that were already
- * rendered
- *
- * @return string
- */
- protected static function recursiveExport($value, $indentation, &$processedObjects = array())
- {
- if ($value === null) {
- return 'null';
- }
- if ($value === true) {
- return 'true';
- }
- if ($value === false) {
- return 'false';
- }
- if (is_string($value)) {
- // Match for most non printable chars somewhat taking multibyte chars into account
- if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
- return 'Binary String: 0x' . bin2hex($value);
- }
- return "'" . str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . "'";
- }
- $origValue = $value;
- if (is_object($value)) {
- if ($value instanceof ProphecyInterface) {
- return sprintf('%s Object (*Prophecy*)', get_class($value));
- } elseif (in_array($value, $processedObjects, true)) {
- return sprintf('%s Object (*RECURSION*)', get_class($value));
- }
- $processedObjects[] = $value;
- // Convert object to array
- $value = self::toArray($value);
- }
- if (is_array($value)) {
- $whitespace = str_repeat(' ', $indentation);
- // There seems to be no other way to check arrays for recursion
- // http://www.php.net/manual/en/language.types.array.php#73936
- preg_match_all('/\n \[(\w+)\] => Array\s+\*RECURSION\*/', print_r($value, true), $matches);
- $recursiveKeys = array_unique($matches[1]);
- // Convert to valid array keys
- // Numeric integer strings are automatically converted to integers
- // by PHP
- foreach ($recursiveKeys as $key => $recursiveKey) {
- if ((string) (integer) $recursiveKey === $recursiveKey) {
- $recursiveKeys[$key] = (integer) $recursiveKey;
- }
- }
- $content = '';
- foreach ($value as $key => $val) {
- if (in_array($key, $recursiveKeys, true)) {
- $val = 'Array (*RECURSION*)';
- } else {
- $val = self::recursiveExport($val, $indentation + 1, $processedObjects);
- }
- $content .= $whitespace . ' ' . self::export($key) . ' => ' . $val . "\n";
- }
- if (strlen($content) > 0) {
- $content = "\n" . $content . $whitespace;
- }
- return sprintf(
- "%s (%s)",
- is_object($origValue) ? sprintf('%s:%s', get_class($origValue), spl_object_hash($origValue)) . ' Object' : 'Array', $content
- );
- }
- if (is_double($value) && (double)(integer) $value === $value) {
- return $value . '.0';
- }
- return (string) $value;
- }
- }
- <?php
- /*
- * This file is part of the Prophecy.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- * Marcello Duarte <marcello.duarte@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Prophecy\Util;
- use Prophecy\Call\Call;
- /**
- * String utility.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class StringUtil
- {
- /**
- * Stringifies any provided value.
- *
- * @param mixed $value
- * @param boolean $exportObject
- *
- * @return string
- */
- public function stringify($value, $exportObject = true)
- {
- if (is_array($value)) {
- if (range(0, count($value) - 1) === array_keys($value)) {
- return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']';
- }
- $stringify = array($this, __FUNCTION__);
- return '['.implode(', ', array_map(function ($item, $key) use ($stringify) {
- return (is_integer($key) ? $key : '"'.$key.'"').
- ' => '.call_user_func($stringify, $item);
- }, $value, array_keys($value))).']';
- }
- if (is_resource($value)) {
- return get_resource_type($value).':'.$value;
- }
- if (is_object($value)) {
- return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value));
- }
- if (true === $value || false === $value) {
- return $value ? 'true' : 'false';
- }
- if (is_string($value)) {
- $str = sprintf('"%s"', str_replace("\n", '\\n', $value));
- if (50 <= strlen($str)) {
- return substr($str, 0, 50).'"...';
- }
- return $str;
- }
- if (null === $value) {
- return 'null';
- }
- return (string) $value;
- }
- /**
- * Stringifies provided array of calls.
- *
- * @param Call[] $calls Array of Call instances
- *
- * @return string
- */
- public function stringifyCalls(array $calls)
- {
- $self = $this;
- return implode(PHP_EOL, array_map(function (Call $call) use ($self) {
- return sprintf(' - %s(%s) @ %s',
- $call->getMethodName(),
- implode(', ', array_map(array($self, 'stringify'), $call->getArguments())),
- str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace())
- );
- }, $calls));
- }
- }
- Exporter
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Exporter package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Exporter;
- use SebastianBergmann\RecursionContext\Context;
- /**
- * A nifty utility for visualizing PHP variables.
- *
- * <code>
- * <?php
- * use SebastianBergmann\Exporter\Exporter;
- *
- * $exporter = new Exporter;
- * print $exporter->export(new Exception);
- * </code>
- *
- * @package Exporter
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/exporter
- */
- class Exporter
- {
- /**
- * Exports a value as a string
- *
- * The output of this method is similar to the output of print_r(), but
- * improved in various aspects:
- *
- * - NULL is rendered as "null" (instead of "")
- * - TRUE is rendered as "true" (instead of "1")
- * - FALSE is rendered as "false" (instead of "")
- * - Strings are always quoted with single quotes
- * - Carriage returns and newlines are normalized to \n
- * - Recursion and repeated rendering is treated properly
- *
- * @param mixed $value
- * @param integer $indentation The indentation level of the 2nd+ line
- * @return string
- */
- public function export($value, $indentation = 0)
- {
- return $this->recursiveExport($value, $indentation);
- }
- /**
- * @param mixed $data
- * @param Context $context
- * @return string
- */
- public function shortenedRecursiveExport(&$data, Context $context = null)
- {
- $result = array();
- $exporter = new Exporter();
- if (!$context) {
- $context = new Context;
- }
- $context->add($data);
- foreach ($data as $key => $value) {
- if (is_array($value)) {
- if ($context->contains($data[$key]) !== false) {
- $result[] = '*RECURSION*';
- }
- else {
- $result[] = sprintf(
- 'array(%s)',
- $this->shortenedRecursiveExport($data[$key], $context)
- );
- }
- }
- else {
- $result[] = $exporter->shortenedExport($value);
- }
- }
- return join(', ', $result);
- }
- /**
- * Exports a value into a single-line string
- *
- * The output of this method is similar to the output of
- * SebastianBergmann\Exporter\Exporter::export. This method guarantees
- * thought that the result contains now newlines.
- *
- * Newlines are replaced by the visible string '\n'. Contents of arrays
- * and objects (if any) are replaced by '...'.
- *
- * @param mixed $value
- * @return string
- * @see SebastianBergmann\Exporter\Exporter::export
- */
- public function shortenedExport($value)
- {
- if (is_string($value)) {
- $string = $this->export($value);
- if (strlen($string) > 40) {
- $string = substr($string, 0, 30) . '...' . substr($string, -7);
- }
- return str_replace("\n", '\n', $string);
- }
- if (is_object($value)) {
- return sprintf(
- '%s Object (%s)',
- get_class($value),
- count($this->toArray($value)) > 0 ? '...' : ''
- );
- }
- if (is_array($value)) {
- return sprintf(
- 'Array (%s)',
- count($value) > 0 ? '...' : ''
- );
- }
- return $this->export($value);
- }
- /**
- * Converts an object to an array containing all of its private, protected
- * and public properties.
- *
- * @param mixed $value
- * @return array
- */
- public function toArray($value)
- {
- if (!is_object($value)) {
- return (array)$value;
- }
- $array = array();
- foreach ((array)$value as $key => $val) {
- // properties are transformed to keys in the following way:
- // private $property => "\0Classname\0property"
- // protected $property => "\0*\0property"
- // public $property => "property"
- if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
- $key = $matches[1];
- }
- // See https://github.com/php/php-src/commit/5721132
- if ($key === "\0gcdata") {
- continue;
- }
- $array[$key] = $val;
- }
- // Some internal classes like SplObjectStorage don't work with the
- // above (fast) mechanism nor with reflection in Zend.
- // Format the output similarly to print_r() in this case
- if ($value instanceof \SplObjectStorage) {
- // However, the fast method does work in HHVM, and exposes the
- // internal implementation. Hide it again.
- if (property_exists('\SplObjectStorage', '__storage')) {
- unset($array['__storage']);
- } elseif (property_exists('\SplObjectStorage', 'storage')) {
- unset($array['storage']);
- }
- if (property_exists('\SplObjectStorage', '__key')) {
- unset($array['__key']);
- }
- foreach ($value as $key => $val) {
- $array[spl_object_hash($val)] = array(
- 'obj' => $val,
- 'inf' => $value->getInfo(),
- );
- }
- }
- return $array;
- }
- /**
- * Recursive implementation of export
- *
- * @param mixed $value The value to export
- * @param integer $indentation The indentation level of the 2nd+ line
- * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects
- * @return string
- * @see SebastianBergmann\Exporter\Exporter::export
- */
- protected function recursiveExport(&$value, $indentation, $processed = null)
- {
- if ($value === null) {
- return 'null';
- }
- if ($value === true) {
- return 'true';
- }
- if ($value === false) {
- return 'false';
- }
- if (is_float($value) && floatval(intval($value)) === $value) {
- return "$value.0";
- }
- if (is_resource($value)) {
- return sprintf(
- 'resource(%d) of type (%s)',
- $value,
- get_resource_type($value)
- );
- }
- if (is_string($value)) {
- // Match for most non printable chars somewhat taking multibyte chars into account
- if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
- return 'Binary String: 0x' . bin2hex($value);
- }
- return "'" .
- str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) .
- "'";
- }
- $whitespace = str_repeat(' ', 4 * $indentation);
- if (!$processed) {
- $processed = new Context;
- }
- if (is_array($value)) {
- if (($key = $processed->contains($value)) !== false) {
- return 'Array &' . $key;
- }
- $key = $processed->add($value);
- $values = '';
- if (count($value) > 0) {
- foreach ($value as $k => $v) {
- $values .= sprintf(
- '%s %s => %s' . "\n",
- $whitespace,
- $this->recursiveExport($k, $indentation),
- $this->recursiveExport($value[$k], $indentation + 1, $processed)
- );
- }
- $values = "\n" . $values . $whitespace;
- }
- return sprintf('Array &%s (%s)', $key, $values);
- }
- if (is_object($value)) {
- $class = get_class($value);
- if ($hash = $processed->contains($value)) {
- return sprintf('%s Object &%s', $class, $hash);
- }
- $hash = $processed->add($value);
- $values = '';
- $array = $this->toArray($value);
- if (count($array) > 0) {
- foreach ($array as $k => $v) {
- $values .= sprintf(
- '%s %s => %s' . "\n",
- $whitespace,
- $this->recursiveExport($k, $indentation),
- $this->recursiveExport($v, $indentation + 1, $processed)
- );
- }
- $values = "\n" . $values . $whitespace;
- }
- return sprintf('%s Object &%s (%s)', $class, $hash, $values);
- }
- return var_export($value, true);
- }
- }
- File_Iterator
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * FilterIterator implementation that filters files based on prefix(es) and/or
- * suffix(es). Hidden files and files from hidden directories are also filtered.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.0.0
- */
- class File_Iterator extends FilterIterator
- {
- const PREFIX = 0;
- const SUFFIX = 1;
- /**
- * @var array
- */
- protected $suffixes = array();
- /**
- * @var array
- */
- protected $prefixes = array();
- /**
- * @var array
- */
- protected $exclude = array();
- /**
- * @var string
- */
- protected $basepath;
- /**
- * @param Iterator $iterator
- * @param array $suffixes
- * @param array $prefixes
- * @param array $exclude
- * @param string $basepath
- */
- public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL)
- {
- $exclude = array_filter(array_map('realpath', $exclude));
- if ($basepath !== NULL) {
- $basepath = realpath($basepath);
- }
- if ($basepath === FALSE) {
- $basepath = NULL;
- } else {
- foreach ($exclude as &$_exclude) {
- $_exclude = str_replace($basepath, '', $_exclude);
- }
- }
- $this->prefixes = $prefixes;
- $this->suffixes = $suffixes;
- $this->exclude = $exclude;
- $this->basepath = $basepath;
- parent::__construct($iterator);
- }
- /**
- * @return boolean
- */
- public function accept()
- {
- $current = $this->getInnerIterator()->current();
- $filename = $current->getFilename();
- $realpath = $current->getRealPath();
- if ($this->basepath !== NULL) {
- $realpath = str_replace($this->basepath, '', $realpath);
- }
- // Filter files in hidden directories.
- if (preg_match('=/\.[^/]*/=', $realpath)) {
- return FALSE;
- }
- return $this->acceptPath($realpath) &&
- $this->acceptPrefix($filename) &&
- $this->acceptSuffix($filename);
- }
- /**
- * @param string $path
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptPath($path)
- {
- foreach ($this->exclude as $exclude) {
- if (strpos($path, $exclude) === 0) {
- return FALSE;
- }
- }
- return TRUE;
- }
- /**
- * @param string $filename
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptPrefix($filename)
- {
- return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);
- }
- /**
- * @param string $filename
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptSuffix($filename)
- {
- return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);
- }
- /**
- * @param string $filename
- * @param array $subString
- * @param integer $type
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- protected function acceptSubString($filename, array $subStrings, $type)
- {
- if (empty($subStrings)) {
- return TRUE;
- }
- $matched = FALSE;
- foreach ($subStrings as $string) {
- if (($type == self::PREFIX && strpos($filename, $string) === 0) ||
- ($type == self::SUFFIX &&
- substr($filename, -1 * strlen($string)) == $string)) {
- $matched = TRUE;
- break;
- }
- }
- return $matched;
- }
- }
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Façade implementation that uses File_Iterator_Factory to create a
- * File_Iterator that operates on an AppendIterator that contains an
- * RecursiveDirectoryIterator for each given path. The list of unique
- * files is returned as an array.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.3.0
- */
- class File_Iterator_Facade
- {
- /**
- * @param array|string $paths
- * @param array|string $suffixes
- * @param array|string $prefixes
- * @param array $exclude
- * @param boolean $commonPath
- * @return array
- */
- public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = array(), $commonPath = FALSE)
- {
- if (is_string($paths)) {
- $paths = array($paths);
- }
- $factory = new File_Iterator_Factory;
- $iterator = $factory->getFileIterator(
- $paths, $suffixes, $prefixes, $exclude
- );
- $files = array();
- foreach ($iterator as $file) {
- $file = $file->getRealPath();
- if ($file) {
- $files[] = $file;
- }
- }
- foreach ($paths as $path) {
- if (is_file($path)) {
- $files[] = realpath($path);
- }
- }
- $files = array_unique($files);
- sort($files);
- if ($commonPath) {
- return array(
- 'commonPath' => $this->getCommonPath($files),
- 'files' => $files
- );
- } else {
- return $files;
- }
- }
- /**
- * Returns the common path of a set of files.
- *
- * @param array $files
- * @return string
- */
- protected function getCommonPath(array $files)
- {
- $count = count($files);
- if ($count == 0) {
- return '';
- }
- if ($count == 1) {
- return dirname($files[0]) . DIRECTORY_SEPARATOR;
- }
- $_files = array();
- foreach ($files as $file) {
- $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file);
- if (empty($_fileParts[0])) {
- $_fileParts[0] = DIRECTORY_SEPARATOR;
- }
- }
- $common = '';
- $done = FALSE;
- $j = 0;
- $count--;
- while (!$done) {
- for ($i = 0; $i < $count; $i++) {
- if ($_files[$i][$j] != $_files[$i+1][$j]) {
- $done = TRUE;
- break;
- }
- }
- if (!$done) {
- $common .= $_files[0][$j];
- if ($j > 0) {
- $common .= DIRECTORY_SEPARATOR;
- }
- }
- $j++;
- }
- return DIRECTORY_SEPARATOR . $common;
- }
- }
- <?php
- /*
- * This file is part of the File_Iterator package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory Method implementation that creates a File_Iterator that operates on
- * an AppendIterator that contains an RecursiveDirectoryIterator for each given
- * path.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-file-iterator/tree
- * @since Class available since Release 1.1.0
- */
- class File_Iterator_Factory
- {
- /**
- * @param array|string $paths
- * @param array|string $suffixes
- * @param array|string $prefixes
- * @param array $exclude
- * @return AppendIterator
- */
- public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = array())
- {
- if (is_string($paths)) {
- $paths = array($paths);
- }
- $paths = $this->getPathsAfterResolvingWildcards($paths);
- $exclude = $this->getPathsAfterResolvingWildcards($exclude);
- if (is_string($prefixes)) {
- if ($prefixes != '') {
- $prefixes = array($prefixes);
- } else {
- $prefixes = array();
- }
- }
- if (is_string($suffixes)) {
- if ($suffixes != '') {
- $suffixes = array($suffixes);
- } else {
- $suffixes = array();
- }
- }
- $iterator = new AppendIterator;
- foreach ($paths as $path) {
- if (is_dir($path)) {
- $iterator->append(
- new File_Iterator(
- new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS)
- ),
- $suffixes,
- $prefixes,
- $exclude,
- $path
- )
- );
- }
- }
- return $iterator;
- }
- /**
- * @param array $paths
- * @return array
- */
- protected function getPathsAfterResolvingWildcards(array $paths)
- {
- $_paths = array();
- foreach ($paths as $path) {
- if ($locals = glob($path, GLOB_ONLYDIR)) {
- $_paths = array_merge($_paths, $locals);
- } else {
- $_paths[] = $path;
- }
- }
- return $_paths;
- }
- }
- phpunit/phpunit: 4.7.0
- doctrine/instantiator: 1.0.4
- phpdocumentor/reflection-docblock: 2.0.4
- phpspec/prophecy: v1.4.1
- phpunit/dbunit: 1.3.2
- phpunit/php-code-coverage: 2.1.3
- phpunit/php-file-iterator: 1.4.0
- phpunit/php-invoker: 1.1.3
- phpunit/php-text-template: 1.2.0
- phpunit/php-timer: 1.0.5
- phpunit/php-token-stream: 1.4.1
- phpunit/phpunit-mock-objects: 2.3.3
- phpunit/phpunit-selenium: 1.4.2
- sebastian/comparator: 1.1.1
- sebastian/diff: 1.3.0
- sebastian/environment: 1.2.2
- sebastian/exporter: 1.2.0
- sebastian/global-state: 1.0.0
- sebastian/recursion-context: 1.0.0
- sebastian/version: 1.0.5
- symfony/yaml: v2.7.0
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- interface Exception
- {
- }
- Recursion Context
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * A context containing previously processed arrays and objects
- * when recursively processing a value.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- final class Context
- {
- /**
- * @var array[]
- */
- private $arrays;
- /**
- * @var \SplObjectStorage
- */
- private $objects;
- /**
- * Initialises the context
- */
- public function __construct()
- {
- $this->arrays = array();
- $this->objects = new \SplObjectStorage;
- }
- /**
- * Adds a value to the context.
- *
- * @param array|object $value The value to add.
- * @return integer|string The ID of the stored value, either as
- * a string or integer.
- * @throws InvalidArgumentException Thrown if $value is not an array or
- * object
- */
- public function add(&$value)
- {
- if (is_array($value)) {
- return $this->addArray($value);
- }
- else if (is_object($value)) {
- return $this->addObject($value);
- }
- throw new InvalidArgumentException(
- 'Only arrays and objects are supported'
- );
- }
- /**
- * Checks if the given value exists within the context.
- *
- * @param array|object $value The value to check.
- * @return integer|string|false The string or integer ID of the stored
- * value if it has already been seen, or
- * false if the value is not stored.
- * @throws InvalidArgumentException Thrown if $value is not an array or
- * object
- */
- public function contains(&$value)
- {
- if (is_array($value)) {
- return $this->containsArray($value);
- }
- else if (is_object($value)) {
- return $this->containsObject($value);
- }
- throw new InvalidArgumentException(
- 'Only arrays and objects are supported'
- );
- }
- /**
- * @param array $array
- * @return bool|int
- */
- private function addArray(array &$array)
- {
- $key = $this->containsArray($array);
- if ($key !== false) {
- return $key;
- }
- $this->arrays[] = &$array;
- return count($this->arrays) - 1;
- }
- /**
- * @param object $object
- * @return string
- */
- private function addObject($object)
- {
- if (!$this->objects->contains($object)) {
- $this->objects->attach($object);
- }
- return spl_object_hash($object);
- }
- /**
- * @param array $array
- * @return integer|false
- */
- private function containsArray(array &$array)
- {
- $keys = array_keys($this->arrays, $array, true);
- $hash = '_Key_' . hash('sha512', microtime(true));
- foreach ($keys as $key) {
- $this->arrays[$key][$hash] = $hash;
- if (isset($array[$hash]) && $array[$hash] === $hash) {
- unset($this->arrays[$key][$hash]);
- return $key;
- }
- unset($this->arrays[$key][$hash]);
- }
- return false;
- }
- /**
- * @param object $value
- * @return string|false
- */
- private function containsObject($value)
- {
- if ($this->objects->contains($value)) {
- return spl_object_hash($value);
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of the Recursion Context package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\RecursionContext;
- /**
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Adam Harvey <aharvey@php.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link https://github.com/sebastianbergmann/recursion-context
- */
- final class InvalidArgumentException extends \InvalidArgumentException implements Exception
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- /**
- * TestCase class that uses Selenium to provide
- * the functionality required for web testing.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- *
- * @method unknown addLocationStrategy()
- * @method unknown addLocationStrategyAndWait()
- * @method unknown addScript()
- * @method unknown addScriptAndWait()
- * @method unknown addSelection()
- * @method unknown addSelectionAndWait()
- * @method unknown allowNativeXpath()
- * @method unknown allowNativeXpathAndWait()
- * @method unknown altKeyDown()
- * @method unknown altKeyDownAndWait()
- * @method unknown altKeyUp()
- * @method unknown altKeyUpAndWait()
- * @method unknown answerOnNextPrompt()
- * @method unknown assignId()
- * @method unknown assignIdAndWait()
- * @method unknown assertAlert
- * @method unknown assertAlertNotPresent
- * @method unknown assertAlertPresent
- * @method unknown assertAllButtons
- * @method unknown assertAllFields
- * @method unknown assertAllLinks
- * @method unknown assertAllWindowIds
- * @method unknown assertAllWindowNames
- * @method unknown assertAllWindowTitles
- * @method unknown assertAttribute
- * @method unknown assertAttributeFromAllWindows
- * @method unknown assertBodyText
- * @method unknown assertChecked
- * @method unknown assertConfirmation
- * @method unknown assertConfirmationNotPresent
- * @method unknown assertConfirmationPresent
- * @method unknown assertCookie
- * @method unknown assertCookieByName
- * @method unknown assertCookieNotPresent
- * @method unknown assertCookiePresent
- * @method unknown assertCssCount
- * @method unknown assertCursorPosition
- * @method unknown assertEditable
- * @method unknown assertElementHeight
- * @method unknown assertElementIndex
- * @method unknown assertElementNotPresent
- * @method unknown assertElementPositionLeft
- * @method unknown assertElementPositionTop
- * @method unknown assertElementPresent
- * @method unknown assertElementWidth
- * @method unknown assertEval
- * @method unknown assertExpression
- * @method unknown assertHtmlSource
- * @method unknown assertLocation
- * @method unknown assertLogMessages
- * @method unknown assertMouseSpeed
- * @method unknown assertNotAlert
- * @method unknown assertNotAllButtons
- * @method unknown assertNotAllFields
- * @method unknown assertNotAllLinks
- * @method unknown assertNotAllWindowIds
- * @method unknown assertNotAllWindowNames
- * @method unknown assertNotAllWindowTitles
- * @method unknown assertNotAttribute
- * @method unknown assertNotAttributeFromAllWindows
- * @method unknown assertNotBodyText
- * @method unknown assertNotChecked
- * @method unknown assertNotConfirmation
- * @method unknown assertNotCookie
- * @method unknown assertNotCookieByName
- * @method unknown assertNotCssCount
- * @method unknown assertNotCursorPosition
- * @method unknown assertNotEditable
- * @method unknown assertNotElementHeight
- * @method unknown assertNotElementIndex
- * @method unknown assertNotElementPositionLeft
- * @method unknown assertNotElementPositionTop
- * @method unknown assertNotElementWidth
- * @method unknown assertNotEval
- * @method unknown assertNotExpression
- * @method unknown assertNotHtmlSource
- * @method unknown assertNotLocation
- * @method unknown assertNotLogMessages
- * @method unknown assertNotMouseSpeed
- * @method unknown assertNotOrdered
- * @method unknown assertNotPrompt
- * @method unknown assertNotSelectOptions
- * @method unknown assertNotSelectedId
- * @method unknown assertNotSelectedIds
- * @method unknown assertNotSelectedIndex
- * @method unknown assertNotSelectedIndexes
- * @method unknown assertNotSelectedLabel
- * @method unknown assertNotSelectedLabels
- * @method unknown assertNotSelectedValue
- * @method unknown assertNotSelectedValues
- * @method unknown assertNotSomethingSelected
- * @method unknown assertNotSpeed
- * @method unknown assertNotSpeedAndWait
- * @method unknown assertNotTable
- * @method unknown assertNotText
- * @method unknown assertNotTitle
- * @method unknown assertNotValue
- * @method unknown assertNotVisible
- * @method unknown assertNotWhetherThisFrameMatchFrameExpression
- * @method unknown assertNotWhetherThisWindowMatchWindowExpression
- * @method unknown assertNotXpathCount
- * @method unknown assertOrdered
- * @method unknown assertPrompt
- * @method unknown assertPromptNotPresent
- * @method unknown assertPromptPresent
- * @method unknown assertSelectOptions
- * @method unknown assertSelectedId
- * @method unknown assertSelectedIds
- * @method unknown assertSelectedIndex
- * @method unknown assertSelectedIndexes
- * @method unknown assertSelectedLabel
- * @method unknown assertSelectedLabels
- * @method unknown assertSelectedValue
- * @method unknown assertSelectedValues
- * @method unknown assertSomethingSelected
- * @method unknown assertSpeed
- * @method unknown assertSpeedAndWait
- * @method unknown assertTable
- * @method unknown assertText
- * @method unknown assertTextNotPresent
- * @method unknown assertTextPresent
- * @method unknown assertTitle
- * @method unknown assertValue
- * @method unknown assertVisible
- * @method unknown assertWhetherThisFrameMatchFrameExpression
- * @method unknown assertWhetherThisWindowMatchWindowExpression
- * @method unknown assertXpathCount
- * @method unknown attachFile()
- * @method unknown break()
- * @method unknown captureEntirePageScreenshot()
- * @method unknown captureEntirePageScreenshotAndWait()
- * @method unknown captureEntirePageScreenshotToStringAndWait()
- * @method unknown captureScreenshotAndWait()
- * @method unknown captureScreenshotToStringAndWait()
- * @method unknown check()
- * @method unknown checkAndWait()
- * @method unknown chooseCancelOnNextConfirmation()
- * @method unknown chooseCancelOnNextConfirmationAndWait()
- * @method unknown chooseOkOnNextConfirmation()
- * @method unknown chooseOkOnNextConfirmationAndWait()
- * @method unknown click()
- * @method unknown clickAndWait()
- * @method unknown clickAt()
- * @method unknown clickAtAndWait()
- * @method unknown close()
- * @method unknown contextMenu()
- * @method unknown contextMenuAndWait()
- * @method unknown contextMenuAt()
- * @method unknown contextMenuAtAndWait()
- * @method unknown controlKeyDown()
- * @method unknown controlKeyDownAndWait()
- * @method unknown controlKeyUp()
- * @method unknown controlKeyUpAndWait()
- * @method unknown createCookie()
- * @method unknown createCookieAndWait()
- * @method unknown deleteAllVisibleCookies()
- * @method unknown deleteAllVisibleCookiesAndWait()
- * @method unknown deleteCookie()
- * @method unknown deleteCookieAndWait()
- * @method unknown deselectPopUp()
- * @method unknown deselectPopUpAndWait()
- * @method unknown doubleClick()
- * @method unknown doubleClickAndWait()
- * @method unknown doubleClickAt()
- * @method unknown doubleClickAtAndWait()
- * @method unknown dragAndDrop()
- * @method unknown dragAndDropAndWait()
- * @method unknown dragAndDropToObject()
- * @method unknown dragAndDropToObjectAndWait()
- * @method unknown dragDrop()
- * @method unknown dragDropAndWait()
- * @method unknown echo()
- * @method unknown fireEvent()
- * @method unknown fireEventAndWait()
- * @method unknown focus()
- * @method unknown focusAndWait()
- * @method string getAlert()
- * @method array getAllButtons()
- * @method array getAllFields()
- * @method array getAllLinks()
- * @method array getAllWindowIds()
- * @method array getAllWindowNames()
- * @method array getAllWindowTitles()
- * @method string getAttribute()
- * @method array getAttributeFromAllWindows()
- * @method string getBodyText()
- * @method string getConfirmation()
- * @method string getCookie()
- * @method string getCookieByName()
- * @method integer getCursorPosition()
- * @method integer getElementHeight()
- * @method integer getElementIndex()
- * @method integer getElementPositionLeft()
- * @method integer getElementPositionTop()
- * @method integer getElementWidth()
- * @method string getEval()
- * @method string getExpression()
- * @method string getHtmlSource()
- * @method string getLocation()
- * @method string getLogMessages()
- * @method integer getMouseSpeed()
- * @method string getPrompt()
- * @method array getSelectOptions()
- * @method string getSelectedId()
- * @method array getSelectedIds()
- * @method string getSelectedIndex()
- * @method array getSelectedIndexes()
- * @method string getSelectedLabel()
- * @method array getSelectedLabels()
- * @method string getSelectedValue()
- * @method array getSelectedValues()
- * @method unknown getSpeed()
- * @method unknown getSpeedAndWait()
- * @method string getTable()
- * @method string getText()
- * @method string getTitle()
- * @method string getValue()
- * @method boolean getWhetherThisFrameMatchFrameExpression()
- * @method boolean getWhetherThisWindowMatchWindowExpression()
- * @method integer getXpathCount()
- * @method unknown goBack()
- * @method unknown goBackAndWait()
- * @method unknown highlight()
- * @method unknown highlightAndWait()
- * @method unknown ignoreAttributesWithoutValue()
- * @method unknown ignoreAttributesWithoutValueAndWait()
- * @method boolean isAlertPresent()
- * @method boolean isChecked()
- * @method boolean isConfirmationPresent()
- * @method boolean isCookiePresent()
- * @method boolean isEditable()
- * @method boolean isElementPresent()
- * @method boolean isOrdered()
- * @method boolean isPromptPresent()
- * @method boolean isSomethingSelected()
- * @method boolean isTextPresent()
- * @method boolean isVisible()
- * @method unknown keyDown()
- * @method unknown keyDownAndWait()
- * @method unknown keyDownNative()
- * @method unknown keyDownNativeAndWait()
- * @method unknown keyPress()
- * @method unknown keyPressAndWait()
- * @method unknown keyPressNative()
- * @method unknown keyPressNativeAndWait()
- * @method unknown keyUp()
- * @method unknown keyUpAndWait()
- * @method unknown keyUpNative()
- * @method unknown keyUpNativeAndWait()
- * @method unknown metaKeyDown()
- * @method unknown metaKeyDownAndWait()
- * @method unknown metaKeyUp()
- * @method unknown metaKeyUpAndWait()
- * @method unknown mouseDown()
- * @method unknown mouseDownAndWait()
- * @method unknown mouseDownAt()
- * @method unknown mouseDownAtAndWait()
- * @method unknown mouseMove()
- * @method unknown mouseMoveAndWait()
- * @method unknown mouseMoveAt()
- * @method unknown mouseMoveAtAndWait()
- * @method unknown mouseOut()
- * @method unknown mouseOutAndWait()
- * @method unknown mouseOver()
- * @method unknown mouseOverAndWait()
- * @method unknown mouseUp()
- * @method unknown mouseUpAndWait()
- * @method unknown mouseUpAt()
- * @method unknown mouseUpAtAndWait()
- * @method unknown mouseUpRight()
- * @method unknown mouseUpRightAndWait()
- * @method unknown mouseUpRightAt()
- * @method unknown mouseUpRightAtAndWait()
- * @method unknown open()
- * @method unknown openWindow()
- * @method unknown openWindowAndWait()
- * @method unknown pause()
- * @method unknown refresh()
- * @method unknown refreshAndWait()
- * @method unknown removeAllSelections()
- * @method unknown removeAllSelectionsAndWait()
- * @method unknown removeScript()
- * @method unknown removeScriptAndWait()
- * @method unknown removeSelection()
- * @method unknown removeSelectionAndWait()
- * @method unknown retrieveLastRemoteControlLogs()
- * @method unknown rollup()
- * @method unknown rollupAndWait()
- * @method unknown runScript()
- * @method unknown runScriptAndWait()
- * @method unknown select()
- * @method unknown selectAndWait()
- * @method unknown selectFrame()
- * @method unknown selectPopUp()
- * @method unknown selectPopUpAndWait()
- * @method unknown selectWindow()
- * @method unknown setBrowserLogLevel()
- * @method unknown setBrowserLogLevelAndWait()
- * @method unknown setContext()
- * @method unknown setCursorPosition()
- * @method unknown setCursorPositionAndWait()
- * @method unknown setMouseSpeed()
- * @method unknown setMouseSpeedAndWait()
- * @method unknown setSpeed()
- * @method unknown setSpeedAndWait()
- * @method unknown shiftKeyDown()
- * @method unknown shiftKeyDownAndWait()
- * @method unknown shiftKeyUp()
- * @method unknown shiftKeyUpAndWait()
- * @method unknown shutDownSeleniumServer()
- * @method unknown store()
- * @method unknown submit()
- * @method unknown submitAndWait()
- * @method unknown type()
- * @method unknown typeAndWait()
- * @method unknown typeKeys()
- * @method unknown typeKeysAndWait()
- * @method unknown uncheck()
- * @method unknown uncheckAndWait()
- * @method unknown useXpathLibrary()
- * @method unknown useXpathLibraryAndWait()
- * @method unknown waitForAlert
- * @method unknown waitForAlertNotPresent
- * @method unknown waitForAlertPresent
- * @method unknown waitForAllButtons
- * @method unknown waitForAllFields
- * @method unknown waitForAllLinks
- * @method unknown waitForAllWindowIds
- * @method unknown waitForAllWindowNames
- * @method unknown waitForAllWindowTitles
- * @method unknown waitForAttribute
- * @method unknown waitForAttributeFromAllWindows
- * @method unknown waitForBodyText
- * @method unknown waitForChecked
- * @method unknown waitForCondition()
- * @method unknown waitForConfirmation
- * @method unknown waitForConfirmationNotPresent
- * @method unknown waitForConfirmationPresent
- * @method unknown waitForCookie
- * @method unknown waitForCookieByName
- * @method unknown waitForCookieNotPresent
- * @method unknown waitForCookiePresent
- * @method unknown waitForCssCount
- * @method unknown waitForCursorPosition
- * @method unknown waitForEditable
- * @method unknown waitForElementHeight
- * @method unknown waitForElementIndex
- * @method unknown waitForElementNotPresent
- * @method unknown waitForElementPositionLeft
- * @method unknown waitForElementPositionTop
- * @method unknown waitForElementPresent
- * @method unknown waitForElementWidth
- * @method unknown waitForEval
- * @method unknown waitForExpression
- * @method unknown waitForHtmlSource
- * @method unknown waitForLocation
- * @method unknown waitForLogMessages
- * @method unknown waitForMouseSpeed
- * @method unknown waitForNotAlert
- * @method unknown waitForNotAllButtons
- * @method unknown waitForNotAllFields
- * @method unknown waitForNotAllLinks
- * @method unknown waitForNotAllWindowIds
- * @method unknown waitForNotAllWindowNames
- * @method unknown waitForNotAllWindowTitles
- * @method unknown waitForNotAttribute
- * @method unknown waitForNotAttributeFromAllWindows
- * @method unknown waitForNotBodyText
- * @method unknown waitForNotChecked
- * @method unknown waitForNotConfirmation
- * @method unknown waitForNotCookie
- * @method unknown waitForNotCookieByName
- * @method unknown waitForNotCssCount
- * @method unknown waitForNotCursorPosition
- * @method unknown waitForNotEditable
- * @method unknown waitForNotElementHeight
- * @method unknown waitForNotElementIndex
- * @method unknown waitForNotElementPositionLeft
- * @method unknown waitForNotElementPositionTop
- * @method unknown waitForNotElementWidth
- * @method unknown waitForNotEval
- * @method unknown waitForNotExpression
- * @method unknown waitForNotHtmlSource
- * @method unknown waitForNotLocation
- * @method unknown waitForNotLogMessages
- * @method unknown waitForNotMouseSpeed
- * @method unknown waitForNotOrdered
- * @method unknown waitForNotPrompt
- * @method unknown waitForNotSelectOptions
- * @method unknown waitForNotSelectedId
- * @method unknown waitForNotSelectedIds
- * @method unknown waitForNotSelectedIndex
- * @method unknown waitForNotSelectedIndexes
- * @method unknown waitForNotSelectedLabel
- * @method unknown waitForNotSelectedLabels
- * @method unknown waitForNotSelectedValue
- * @method unknown waitForNotSelectedValues
- * @method unknown waitForNotSomethingSelected
- * @method unknown waitForNotSpeed
- * @method unknown waitForNotSpeedAndWait
- * @method unknown waitForNotTable
- * @method unknown waitForNotText
- * @method unknown waitForNotTitle
- * @method unknown waitForNotValue
- * @method unknown waitForNotVisible
- * @method unknown waitForNotWhetherThisFrameMatchFrameExpression
- * @method unknown waitForNotWhetherThisWindowMatchWindowExpression
- * @method unknown waitForNotXpathCount
- * @method unknown waitForOrdered
- * @method unknown waitForPageToLoad()
- * @method unknown waitForPopUp()
- * @method unknown waitForPrompt
- * @method unknown waitForPromptNotPresent
- * @method unknown waitForPromptPresent
- * @method unknown waitForSelectOptions
- * @method unknown waitForSelectedId
- * @method unknown waitForSelectedIds
- * @method unknown waitForSelectedIndex
- * @method unknown waitForSelectedIndexes
- * @method unknown waitForSelectedLabel
- * @method unknown waitForSelectedLabels
- * @method unknown waitForSelectedValue
- * @method unknown waitForSelectedValues
- * @method unknown waitForSomethingSelected
- * @method unknown waitForSpeed
- * @method unknown waitForSpeedAndWait
- * @method unknown waitForTable
- * @method unknown waitForText
- * @method unknown waitForTextNotPresent
- * @method unknown waitForTextPresent
- * @method unknown waitForTitle
- * @method unknown waitForValue
- * @method unknown waitForVisible
- * @method unknown waitForWhetherThisFrameMatchFrameExpression
- * @method unknown waitForWhetherThisWindowMatchWindowExpression
- * @method unknown waitForXpathCount
- * @method unknown windowFocus()
- * @method unknown windowMaximize()
- */
- abstract class PHPUnit_Extensions_SeleniumTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var array
- */
- public static $browsers = array();
- /**
- * @var string
- */
- protected $browserName;
- /**
- * @var boolean
- */
- protected $collectCodeCoverageInformation = FALSE;
- /**
- * @var string
- */
- protected $coverageScriptUrl = '';
- /**
- * @var PHPUnit_Extensions_SeleniumTestCase_Driver[]
- */
- protected $drivers = array();
- /**
- * @var boolean
- */
- protected $inDefaultAssertions = FALSE;
- /**
- * @var string
- */
- protected $testId;
- /**
- * @var array
- * @access protected
- */
- protected $verificationErrors = array();
- /**
- * @var boolean
- */
- protected $captureScreenshotOnFailure = FALSE;
- /**
- * @var string
- */
- protected $screenshotPath = '';
- /**
- * @var string
- */
- protected $screenshotUrl = '';
- /**
- * @var string
- */
- protected $screenshotBgColor = '';
- /**
- * @var integer the number of seconds to wait before declaring
- * the Selenium server not reachable
- */
- protected $serverConnectionTimeOut = 10;
- /**
- * @var boolean
- */
- private $serverRunning;
- /**
- * @var boolean
- */
- private static $shareSession;
- /**
- * The last sessionId used for running a test.
- * @var string
- */
- private static $sessionId;
- /**
- * @param boolean
- */
- public static function shareSession($shareSession)
- {
- self::$shareSession = $shareSession;
- }
- /**
- * @param string $name
- * @param array $data
- * @param string $dataName
- * @param array $browser
- * @throws InvalidArgumentException
- */
- public function __construct($name = NULL, array $data = array(), $dataName = '', array $browser = array())
- {
- parent::__construct($name, $data, $dataName);
- $this->testId = md5(uniqid(rand(), TRUE));
- $this->getDriver($browser);
- }
- public function setupSpecificBrowser(array $browser)
- {
- $this->getDriver($browser);
- }
- /**
- * Stops any shared session still open at the end of the current
- * PHPUnit process.
- */
- public function __destruct()
- {
- $this->stopSession();
- }
- /**
- * @param string $className
- * @return PHPUnit_Framework_TestSuite
- */
- public static function suite($className)
- {
- return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
- }
- /**
- * Runs the test case and collects the results in a TestResult object.
- * If no TestResult object is passed a new one will be created.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws InvalidArgumentException
- */
- public function run(PHPUnit_Framework_TestResult $result = NULL)
- {
- if ($result === NULL) {
- $result = $this->createResult();
- }
- $this->collectCodeCoverageInformation = $result->getCollectCodeCoverageInformation();
- foreach ($this->drivers as $driver) {
- $driver->setCollectCodeCoverageInformation(
- $this->collectCodeCoverageInformation
- );
- }
- parent::run($result);
- if ($this->collectCodeCoverageInformation) {
- $result->getCodeCoverage()->append(
- $this->getCodeCoverage(), $this
- );
- }
- return $result;
- }
- /**
- * @param array $browser
- * @return PHPUnit_Extensions_SeleniumTestCase_Driver
- */
- protected function getDriver(array $browser)
- {
- if (isset($browser['name'])) {
- if (!is_string($browser['name'])) {
- throw new InvalidArgumentException(
- 'Array element "name" is no string.'
- );
- }
- } else {
- $browser['name'] = '';
- }
- if (isset($browser['browser'])) {
- if (!is_string($browser['browser'])) {
- throw new InvalidArgumentException(
- 'Array element "browser" is no string.'
- );
- }
- } else {
- $browser['browser'] = '';
- }
- if (isset($browser['host'])) {
- if (!is_string($browser['host'])) {
- throw new InvalidArgumentException(
- 'Array element "host" is no string.'
- );
- }
- } else {
- $browser['host'] = 'localhost';
- }
- if (isset($browser['port'])) {
- if (!is_int($browser['port'])) {
- throw new InvalidArgumentException(
- 'Array element "port" is no integer.'
- );
- }
- } else {
- $browser['port'] = 4444;
- }
- if (isset($browser['timeout'])) {
- if (!is_int($browser['timeout'])) {
- throw new InvalidArgumentException(
- 'Array element "timeout" is no integer.'
- );
- }
- } else {
- $browser['timeout'] = 30;
- }
- if (isset($browser['httpTimeout'])) {
- if (!is_int($browser['httpTimeout'])) {
- throw new InvalidArgumentException(
- 'Array element "httpTimeout" is no integer.'
- );
- }
- } else {
- $browser['httpTimeout'] = 45;
- }
- $driver = new PHPUnit_Extensions_SeleniumTestCase_Driver;
- $driver->setName($browser['name']);
- $driver->setBrowser($browser['browser']);
- $driver->setHost($browser['host']);
- $driver->setPort($browser['port']);
- $driver->setTimeout($browser['timeout']);
- $driver->setHttpTimeout($browser['httpTimeout']);
- $driver->setTestCase($this);
- $driver->setTestId($this->testId);
- $this->drivers[0] = $driver;
- return $driver;
- }
- public function skipWithNoServerRunning()
- {
- try {
- fsockopen($this->drivers[0]->getHost(), $this->drivers[0]->getPort(), $errno, $errstr, $this->serverConnectionTimeOut);
- $this->serverRunning = TRUE;
- } catch (PHPUnit_Framework_Error_Warning $e) {
- $this->markTestSkipped(
- sprintf(
- 'Could not connect to the Selenium Server on %s:%d.',
- $this->drivers[0]->getHost(),
- $this->drivers[0]->getPort()
- )
- );
- $this->serverRunning = FALSE;
- }
- }
- /**
- * @return string
- */
- protected function prepareTestSession()
- {
- $testCaseClassVars = get_class_vars(get_class($this));
- if ($testCaseClassVars['browsers']) {
- return $this->start();
- }
- if (self::$shareSession && self::$sessionId !== NULL) {
- $this->setSessionId(self::$sessionId);
- $this->selectWindow('null');
- } else {
- self::$sessionId = $this->start();
- }
- return self::$sessionId;
- }
- /**
- * @throws RuntimeException
- */
- protected function runTest()
- {
- $this->skipWithNoServerRunning();
- $this->prepareTestSession();
- if (!is_file($this->getName(FALSE))) {
- $result = parent::runTest();
- } else {
- $this->runSelenese($this->getName(FALSE));
- $result = NULL;
- }
- if (!empty($this->verificationErrors)) {
- $this->fail(implode("\n", $this->verificationErrors));
- }
- if (!self::$shareSession) {
- $this->stopSession();
- }
- return $result;
- }
- private function stopSession()
- {
- try {
- $this->stop();
- } catch (RuntimeException $e) { }
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- $buffer = parent::toString();
- if (!empty($this->browserName)) {
- $buffer .= ' with browser ' . $this->browserName;
- }
- return $buffer;
- }
- /**
- * Runs a test from a Selenese (HTML) specification.
- *
- * @param string $filename
- */
- public function runSelenese($filename)
- {
- $document = PHPUnit_Util_XML::loadFile($filename, TRUE);
- $xpath = new DOMXPath($document);
- $rows = $xpath->query('body/table/tbody/tr');
- foreach ($rows as $row) {
- $action = NULL;
- $arguments = array();
- $columns = $xpath->query('td', $row);
- foreach ($columns as $column) {
- if ($action === NULL) {
- $action = PHPUnit_Util_XML::nodeToText($column);
- } else {
- $arguments[] = PHPUnit_Util_XML::nodeToText($column);
- }
- }
- if (method_exists($this, $action)) {
- call_user_func_array(array($this, $action), $arguments);
- } else {
- $this->__call($action, $arguments);
- }
- }
- }
- /**
- * Delegate method calls to the driver.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- */
- public function __call($command, $arguments)
- {
- $result = call_user_func_array(
- array($this->drivers[0], $command), $arguments
- );
- $this->verificationErrors = array_merge(
- $this->verificationErrors, $this->drivers[0]->getVerificationErrors()
- );
- $this->drivers[0]->clearVerificationErrors();
- return $result;
- }
- /**
- * Asserts that an element's value is equal to a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueEquals($locator, $text, $message = '')
- {
- $this->assertEquals($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value is not equal to a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueNotEquals($locator, $text, $message = '')
- {
- $this->assertNotEquals($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value contains a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueContains($locator, $text, $message = '')
- {
- $this->assertContains($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element's value does not contain a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementValueNotContains($locator, $text, $message = '')
- {
- $this->assertNotContains($text, $this->getValue($locator), $message);
- }
- /**
- * Asserts that an element contains a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementContainsText($locator, $text, $message = '')
- {
- $this->assertContains($text, $this->getText($locator), $message);
- }
- /**
- * Asserts that an element does not contain a given string.
- *
- * @param string $locator
- * @param string $text
- * @param string $message
- */
- public function assertElementNotContainsText($locator, $text, $message = '')
- {
- $this->assertNotContains($text, $this->getText($locator), $message);
- }
- /**
- * Asserts that a select element has a specific option.
- *
- * @param string $selectLocator
- * @param string $option
- * @param string $message
- */
- public function assertSelectHasOption($selectLocator, $option, $message = '')
- {
- $this->assertContains($option, $this->getSelectOptions($selectLocator), $message);
- }
- /**
- * Asserts that a select element does not have a specific option.
- *
- * @param string $selectLocator
- * @param string $option
- * @param string $message
- */
- public function assertSelectNotHasOption($selectLocator, $option, $message = '')
- {
- $this->assertNotContains($option, $this->getSelectOptions($selectLocator), $message);
- }
- /**
- * Asserts that a specific label is selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertSelected($selectLocator, $option, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Label "%s" not selected in "%s".',
- $option,
- $selectLocator
- );
- }
- $this->assertEquals(
- $option,
- $this->getSelectedLabel($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific label is not selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertNotSelected($selectLocator, $option, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Label "%s" selected in "%s".',
- $option,
- $selectLocator
- );
- }
- $this->assertNotEquals(
- $option,
- $this->getSelectedLabel($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific value is selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertIsSelected($selectLocator, $value, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Value "%s" not selected in "%s".',
- $value,
- $selectLocator
- );
- }
- $this->assertEquals(
- $value, $this->getSelectedValue($selectLocator),
- $message
- );
- }
- /**
- * Asserts that a specific value is not selected.
- *
- * @param string $selectLocator
- * @param string $value
- * @param string $message
- */
- public function assertIsNotSelected($selectLocator, $value, $message = '')
- {
- if ($message == '') {
- $message = sprintf(
- 'Value "%s" selected in "%s".',
- $value,
- $selectLocator
- );
- }
- $this->assertNotEquals(
- $value,
- $this->getSelectedValue($selectLocator),
- $message
- );
- }
- /**
- * Template Method that is called after Selenium actions.
- *
- * @param string $action
- */
- protected function defaultAssertions($action)
- {
- }
- /**
- * @return array
- */
- protected function getCodeCoverage()
- {
- $coverage = new PHPUnit_Extensions_SeleniumCommon_RemoteCoverage(
- $this->coverageScriptUrl,
- $this->testId
- );
- return $coverage->get();
- }
- /**
- * @param string $action
- */
- public function runDefaultAssertions($action)
- {
- if (!$this->inDefaultAssertions) {
- $this->inDefaultAssertions = TRUE;
- $this->defaultAssertions($action);
- $this->inDefaultAssertions = FALSE;
- }
- }
- /**
- * This method is called when a test method did not execute successfully.
- *
- * @param Exception $e
- */
- protected function onNotSuccessfulTest(Exception $e)
- {
- if (!$this->serverRunning) {
- throw $e;
- }
- try {
- $this->restoreSessionStateAfterFailedTest();
- $buffer = '';
- if ($this->captureScreenshotOnFailure) {
- $buffer .= 'Current URL: ' . $this->drivers[0]->getLocation() .
- "\n";
- $screenshotInfo = $this->takeScreenshot();
- if ($screenshotInfo != '') {
- $buffer .= $screenshotInfo;
- }
- }
- $this->stopSession();
- } catch (Exception $another) {
- $buffer = "Issues while capturing the screenshot:\n" . $another->getMessage();
- }
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException
- && is_object($e->getComparisonFailure())) {
- $message = $e->getComparisonFailure()->toString();
- } else {
- $message = $e->getMessage();
- }
- $buffer .= "\n" . $message;
- // gain the screenshot path, lose the stack trace
- if ($this->captureScreenshotOnFailure) {
- throw new PHPUnit_Framework_Error($buffer, $e->getCode(), $e->getFile(), $e->getLine(), $e);
- }
- // yes to stack trace and everything
- if ($e instanceof PHPUnit_Framework_IncompleteTestError
- || $e instanceof PHPUnit_Framework_SkippedTestError
- || $e instanceof PHPUnit_Framework_AssertionFailedError) {
- throw $e;
- }
- // yes to stack trace, only for F tests
- // PHPUnit issue 471 prevents getTrace() from being useful
- throw new PHPUnit_Framework_Error($buffer, $e->getCode(), $e->getFile(), $e->getLine(), $e);
- }
- private function restoreSessionStateAfterFailedTest()
- {
- self::$sessionId = NULL;
- }
- /**
- * Returns correct path to screenshot save path.
- *
- * @return string
- */
- protected function getScreenshotPath()
- {
- $path = $this->screenshotPath;
- if (!in_array(substr($path, strlen($path) -1, 1), array("/","\\"))) {
- $path .= DIRECTORY_SEPARATOR;
- }
- return $path;
- }
- /**
- * Take a screenshot and return information about it.
- * Return an empty string if the screenshotPath and screenshotUrl
- * properties are empty.
- * Issue #88.
- *
- * @access protected
- * @return string
- */
- protected function takeScreenshot()
- {
- if (!empty($this->screenshotPath) &&
- !empty($this->screenshotUrl)) {
- $filename = $this->getScreenshotPath() . $this->testId . '.png';
- $kargs = '';
- if ($this->screenshotBgColor!='') {
- $kargs = 'background=' . $this->screenshotBgColor;
- }
- $this->drivers[0]->captureEntirePageScreenshot($filename, $kargs);
- return 'Screenshot: ' . $this->screenshotUrl . '/' .
- $this->testId . ".png\n";
- } else {
- return '';
- }
- }
- /**
- * Pause support for runSelenese() HTML cases
- * @param $milliseconds
- */
- protected function pause($milliseconds)
- {
- sleep(round($milliseconds/1000));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.2
- */
- /**
- * TestSuite class for Selenium 1 tests
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_SeleniumTestSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Overriding the default: Selenium suites are always built from a TestCase class.
- * @var boolean
- */
- protected $testCase = TRUE;
- /**
- * Making the method public.
- */
- public function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- return parent::addTestMethod($class, $method);
- }
- /**
- * @param string $className extending PHPUnit_Extensions_SeleniumTestCase
- * @return PHPUnit_Extensions_SeleniumTestSuite
- */
- public static function fromTestCaseClass($className)
- {
- $suite = new self();
- $suite->setName($className);
- $class = new ReflectionClass($className);
- $classGroups = PHPUnit_Util_Test::getGroups($className);
- $staticProperties = $class->getStaticProperties();
- if (isset($staticProperties['browsers'])) {
- $browsers = $staticProperties['browsers'];
- } else if (is_callable("{$className}::browsers")) {
- $browsers = $className::browsers();
- } else {
- $browsers = null;
- }
- //BC: renamed seleneseDirectory -> selenesePath
- if (!isset($staticProperties['selenesePath']) && isset($staticProperties['seleneseDirectory'])) {
- $staticProperties['selenesePath'] = $staticProperties['seleneseDirectory'];
- }
- // Create tests from Selenese/HTML files.
- if (isset($staticProperties['selenesePath']) &&
- (is_dir($staticProperties['selenesePath']) || is_file($staticProperties['selenesePath']))) {
- if (is_dir($staticProperties['selenesePath'])) {
- $files = array_merge(
- self::getSeleneseFiles($staticProperties['selenesePath'], '.htm'),
- self::getSeleneseFiles($staticProperties['selenesePath'], '.html')
- );
- } else {
- $files[] = realpath($staticProperties['selenesePath']);
- }
- // Create tests from Selenese/HTML files for multiple browsers.
- if ($browsers) {
- foreach ($browsers as $browser) {
- $browserSuite = PHPUnit_Extensions_SeleniumBrowserSuite::fromClassAndBrowser($className, $browser);
- foreach ($files as $file) {
- self::addGeneratedTestTo($browserSuite,
- new $className($file, array(), '', $browser),
- $classGroups
- );
- }
- $suite->addTest($browserSuite);
- }
- }
- else {
- // Create tests from Selenese/HTML files for single browser.
- foreach ($files as $file) {
- self::addGeneratedTestTo($suite,
- new $className($file),
- $classGroups);
- }
- }
- }
- // Create tests from test methods for multiple browsers.
- if ($browsers) {
- foreach ($browsers as $browser) {
- $browserSuite = PHPUnit_Extensions_SeleniumBrowserSuite::fromClassAndBrowser($className, $browser);
- foreach ($class->getMethods() as $method) {
- $browserSuite->addTestMethod($class, $method);
- }
- $browserSuite->setupSpecificBrowser($browser);
- $suite->addTest($browserSuite);
- }
- }
- else {
- // Create tests from test methods for single browser.
- foreach ($class->getMethods() as $method) {
- $suite->addTestMethod($class, $method);
- }
- }
- return $suite;
- }
- private static function addGeneratedTestTo(PHPUnit_Framework_TestSuite $suite, PHPUnit_Framework_TestCase $test, $classGroups)
- {
- list ($methodName, ) = explode(' ', $test->getName());
- $test->setDependencies(
- PHPUnit_Util_Test::getDependencies(get_class($test), $methodName)
- );
- $suite->addTest($test, $classGroups);
- }
- /**
- * @param string $directory
- * @param string $suffix
- * @return array
- */
- private static function getSeleneseFiles($directory, $suffix)
- {
- $facade = new File_Iterator_Facade;
- return $facade->getFilesAsArray($directory, $suffix);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- /**
- * Implementation of the Selenium RC client/server protocol.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_SeleniumTestCase_Driver
- {
- /**
- * @var PHPUnit_Extensions_SeleniumTestCase
- */
- protected $testCase;
- /**
- * @var string
- */
- protected $testId;
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $browser;
- /**
- * @var string
- */
- protected $browserUrl;
- /**
- * @var boolean
- */
- protected $collectCodeCoverageInformation = FALSE;
- /**
- * @var string
- */
- protected $host = 'localhost';
- /**
- * @var integer
- */
- protected $port = 4444;
- /**
- * @var integer
- */
- protected $httpTimeout = 45;
- /**
- * @var integer
- */
- protected $seleniumTimeout = 30;
- /**
- * @var string
- */
- protected $sessionId;
- /**
- * @var integer
- */
- protected $sleep = 0;
- /**
- * @var boolean
- */
- protected $useWaitForPageToLoad = TRUE;
- /**
- * @var boolean
- */
- protected $wait = 5;
- /**
- * @var array
- */
- protected static $autoGeneratedCommands = array();
- /**
- * @var array
- */
- protected $commands = array();
- /**
- * @var array $userCommands A numerical array which holds custom user commands.
- */
- protected $userCommands = array();
- /**
- * @var array
- */
- protected $verificationErrors = array();
- /**
- * @var array
- */
- private $webDriverCapabilities;
- public function __construct()
- {
- if (empty(self::$autoGeneratedCommands)) {
- self::autoGenerateCommands();
- }
- }
- /**
- * Only browserName is supported.
- */
- public function setWebDriverCapabilities(array $capabilities)
- {
- $this->webDriverCapabilities = $capabilities;
- }
- /**
- * @return string
- */
- public function start()
- {
- if ($this->browserUrl == NULL) {
- throw new PHPUnit_Framework_Exception(
- 'setBrowserUrl() needs to be called before start().'
- );
- }
- if ($this->webDriverCapabilities !== NULL) {
- $seleniumServerUrl = PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($this->host, $this->port);
- $driver = new PHPUnit_Extensions_Selenium2TestCase_Driver($seleniumServerUrl);
- $session = $driver->startSession($this->webDriverCapabilities, new PHPUnit_Extensions_Selenium2TestCase_URL($this->browserUrl));
- $webDriverSessionId = $session->id();
- $this->sessionId = $this->getString(
- 'getNewBrowserSession',
- array($this->browser, $this->browserUrl, '',
- "webdriver.remote.sessionid=$webDriverSessionId")
- );
- $this->doCommand('setTimeout', array($this->seleniumTimeout * 1000));
- }
- if (!isset($this->sessionId)) {
- $this->sessionId = $this->getString(
- 'getNewBrowserSession',
- array($this->browser, $this->browserUrl)
- );
- $this->doCommand('setTimeout', array($this->seleniumTimeout * 1000));
- }
- return $this->sessionId;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getSessionId()
- {
- return $this->sessionId;
- }
- /**
- * @param string
- * @since Method available since Release 1.2.0
- */
- public function setSessionId($sessionId)
- {
- $this->sessionId = $sessionId;
- }
- /**
- */
- public function stop()
- {
- if (!isset($this->sessionId)) {
- return;
- }
- $this->doCommand('testComplete');
- $this->sessionId = NULL;
- }
- /**
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setCollectCodeCoverageInformation($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->collectCodeCoverageInformation = $flag;
- }
- /**
- * @param PHPUnit_Extensions_SeleniumTestCase $testCase
- */
- public function setTestCase(PHPUnit_Extensions_SeleniumTestCase $testCase)
- {
- $this->testCase = $testCase;
- }
- /**
- * @param integer $testId
- */
- public function setTestId($testId)
- {
- $this->testId = $testId;
- }
-
- /**
- * @return integer $testId
- */
- public function getTestId()
- {
- return $this->testId;
- }
- /**
- * @param string $name
- * @throws InvalidArgumentException
- */
- public function setName($name)
- {
- if (!is_string($name)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->name = $name;
- }
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * @param string $browser
- * @throws InvalidArgumentException
- */
- public function setBrowser($browser)
- {
- if (!is_string($browser)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->browser = $browser;
- }
- /**
- * @return string
- */
- public function getBrowser()
- {
- return $this->browser;
- }
- /**
- * @param string $browserUrl
- * @throws InvalidArgumentException
- */
- public function setBrowserUrl($browserUrl)
- {
- if (!is_string($browserUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->browserUrl = $browserUrl;
- }
- /**
- * @param string $host
- * @throws InvalidArgumentException
- */
- public function setHost($host)
- {
- if (!is_string($host)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->host = $host;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getHost()
- {
- return $this->host;
- }
- /**
- * @param integer $port
- * @throws InvalidArgumentException
- */
- public function setPort($port)
- {
- if (!is_int($port)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->port = $port;
- }
- /**
- * @return integer
- * @since Method available since Release 1.1.0
- */
- public function getPort()
- {
- return $this->port;
- }
-
- /**
- * @param integer $timeout for Selenium RC in seconds
- * @throws InvalidArgumentException
- */
- public function setTimeout($timeout)
- {
- if (!is_int($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->seleniumTimeout = $timeout;
- }
- /**
- * @param integer $timeout for HTTP connection to Selenium RC in seconds
- * @throws InvalidArgumentException
- */
- public function setHttpTimeout($timeout)
- {
- if (!is_int($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->httpTimeout = $timeout;
- }
- /**
- * @param integer $seconds
- * @throws InvalidArgumentException
- */
- public function setSleep($seconds)
- {
- if (!is_int($seconds)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->sleep = $seconds;
- }
- /**
- * Sets the number of seconds to sleep() after *AndWait commands
- * when setWaitForPageToLoad(FALSE) is used.
- *
- * @param integer $seconds
- * @throws InvalidArgumentException
- */
- public function setWait($seconds)
- {
- if (!is_int($seconds)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->wait = $seconds;
- }
- /**
- * Sets whether waitForPageToLoad (TRUE) or sleep() (FALSE)
- * is used after *AndWait commands.
- *
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setWaitForPageToLoad($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->useWaitForPageToLoad = $flag;
- }
- /**
- * Sets whether captureScreenshotOnFailure (TRUE) or (FALSE)
- * if true, the takeScreenshot() is triggered in onNotSuccessfulTest().
- *
- * @param boolean $flag
- * @throws InvalidArgumentException
- */
- public function setCaptureScreenshotOnFailure($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->captureScreenshotOnFailure = $flag;
- }
-
- /**
- * @param string $screenshotUrl
- * @throws InvalidArgumentException
- */
- public function setScreenshotUrl($screenshotUrl)
- {
- if (!is_string($screenshotUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->screenshotUrl = $screenshotUrl;
- }
- /**
- * @param string $screenshotPath
- * @throws InvalidArgumentException
- */
- public function setScreenshotPath($screenshotPath)
- {
- if (!is_string($screenshotPath)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->screenshotPath = $screenshotPath;
- }
-
- /**
- * Adds allowed user commands into {@link self::$userCommands}. See
- * {@link self::__call()} (switch/case -> default) for usage.
- *
- * @param string $command A command.
- *
- * @return $this
- * @see self::__call()
- */
-
-
- public function addUserCommand($command)
- {
- if (!is_string($command)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->userCommands[] = $command;
- return $this;
- }
- /**
- * This method implements the Selenium RC protocol.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- * @method unknown addLocationStrategy()
- * @method unknown addLocationStrategyAndWait()
- * @method unknown addScript()
- * @method unknown addScriptAndWait()
- * @method unknown addSelection()
- * @method unknown addSelectionAndWait()
- * @method unknown allowNativeXpath()
- * @method unknown allowNativeXpathAndWait()
- * @method unknown altKeyDown()
- * @method unknown altKeyDownAndWait()
- * @method unknown altKeyUp()
- * @method unknown altKeyUpAndWait()
- * @method unknown answerOnNextPrompt()
- * @method unknown assignId()
- * @method unknown assignIdAndWait()
- * @method unknown attachFile()
- * @method unknown break()
- * @method unknown captureEntirePageScreenshot()
- * @method unknown captureEntirePageScreenshotAndWait()
- * @method unknown captureEntirePageScreenshotToStringAndWait()
- * @method unknown captureScreenshotAndWait()
- * @method unknown captureScreenshotToStringAndWait()
- * @method unknown check()
- * @method unknown checkAndWait()
- * @method unknown chooseCancelOnNextConfirmation()
- * @method unknown chooseCancelOnNextConfirmationAndWait()
- * @method unknown chooseOkOnNextConfirmation()
- * @method unknown chooseOkOnNextConfirmationAndWait()
- * @method unknown click()
- * @method unknown clickAndWait()
- * @method unknown clickAt()
- * @method unknown clickAtAndWait()
- * @method unknown close()
- * @method unknown contextMenu()
- * @method unknown contextMenuAndWait()
- * @method unknown contextMenuAt()
- * @method unknown contextMenuAtAndWait()
- * @method unknown controlKeyDown()
- * @method unknown controlKeyDownAndWait()
- * @method unknown controlKeyUp()
- * @method unknown controlKeyUpAndWait()
- * @method unknown createCookie()
- * @method unknown createCookieAndWait()
- * @method unknown deleteAllVisibleCookies()
- * @method unknown deleteAllVisibleCookiesAndWait()
- * @method unknown deleteCookie()
- * @method unknown deleteCookieAndWait()
- * @method unknown deselectPopUp()
- * @method unknown deselectPopUpAndWait()
- * @method unknown doubleClick()
- * @method unknown doubleClickAndWait()
- * @method unknown doubleClickAt()
- * @method unknown doubleClickAtAndWait()
- * @method unknown dragAndDrop()
- * @method unknown dragAndDropAndWait()
- * @method unknown dragAndDropToObject()
- * @method unknown dragAndDropToObjectAndWait()
- * @method unknown dragDrop()
- * @method unknown dragDropAndWait()
- * @method unknown echo()
- * @method unknown fireEvent()
- * @method unknown fireEventAndWait()
- * @method unknown focus()
- * @method unknown focusAndWait()
- * @method string getAlert()
- * @method array getAllButtons()
- * @method array getAllFields()
- * @method array getAllLinks()
- * @method array getAllWindowIds()
- * @method array getAllWindowNames()
- * @method array getAllWindowTitles()
- * @method string getAttribute(string $attributeLocator)
- * @method array getAttributeFromAllWindows(string $attributeName)
- * @method string getBodyText()
- * @method string getConfirmation()
- * @method string getCookie()
- * @method string getCookieByName(string $name)
- * @method integer getCssCount(string $locator)
- * @method integer getCursorPosition(string $locator)
- * @method integer getElementHeight(string $locator)
- * @method integer getElementIndex(string $locator)
- * @method integer getElementPositionLeft(string $locator)
- * @method integer getElementPositionTop(string $locator)
- * @method integer getElementWidth(string $locator)
- * @method string getEval(string $script)
- * @method string getExpression(string $expression)
- * @method string getHtmlSource()
- * @method string getLocation()
- * @method string getLogMessages()
- * @method integer getMouseSpeed()
- * @method string getPrompt()
- * @method array getSelectOptions(string $selectLocator)
- * @method string getSelectedId(string $selectLocator)
- * @method array getSelectedIds(string $selectLocator)
- * @method string getSelectedIndex(string $selectLocator)
- * @method array getSelectedIndexes(string $selectLocator)
- * @method string getSelectedLabel(string $selectLocator)
- * @method array getSelectedLabels(string $selectLocator)
- * @method string getSelectedValue(string $selectLocator)
- * @method array getSelectedValues(string $selectLocator)
- * @method unknown getSpeed()
- * @method unknown getSpeedAndWait()
- * @method string getTable(string $tableCellAddress)
- * @method string getText(string $locator)
- * @method string getTitle()
- * @method string getValue(string $locator)
- * @method boolean getWhetherThisFrameMatchFrameExpression(string $currentFrameString, string $target)
- * @method boolean getWhetherThisWindowMatchWindowExpression(string $currentWindowString, string $target)
- * @method integer getXpathCount(string $xpath)
- * @method unknown goBack()
- * @method unknown goBackAndWait()
- * @method unknown highlight(string $locator)
- * @method unknown highlightAndWait(string $locator)
- * @method unknown ignoreAttributesWithoutValue(string $ignore)
- * @method unknown ignoreAttributesWithoutValueAndWait(string $ignore)
- * @method boolean isAlertPresent()
- * @method boolean isChecked(locator)
- * @method boolean isConfirmationPresent()
- * @method boolean isCookiePresent(string $name)
- * @method boolean isEditable(string $locator)
- * @method boolean isElementPresent(string $locator)
- * @method boolean isOrdered(string $locator1, string $locator2)
- * @method boolean isPromptPresent()
- * @method boolean isSomethingSelected(string $selectLocator)
- * @method boolean isTextPresent(pattern)
- * @method boolean isVisible(locator)
- * @method unknown keyDown()
- * @method unknown keyDownAndWait()
- * @method unknown keyDownNative()
- * @method unknown keyDownNativeAndWait()
- * @method unknown keyPress()
- * @method unknown keyPressAndWait()
- * @method unknown keyPressNative()
- * @method unknown keyPressNativeAndWait()
- * @method unknown keyUp()
- * @method unknown keyUpAndWait()
- * @method unknown keyUpNative()
- * @method unknown keyUpNativeAndWait()
- * @method unknown metaKeyDown()
- * @method unknown metaKeyDownAndWait()
- * @method unknown metaKeyUp()
- * @method unknown metaKeyUpAndWait()
- * @method unknown mouseDown()
- * @method unknown mouseDownAndWait()
- * @method unknown mouseDownAt()
- * @method unknown mouseDownAtAndWait()
- * @method unknown mouseMove()
- * @method unknown mouseMoveAndWait()
- * @method unknown mouseMoveAt()
- * @method unknown mouseMoveAtAndWait()
- * @method unknown mouseOut()
- * @method unknown mouseOutAndWait()
- * @method unknown mouseOver()
- * @method unknown mouseOverAndWait()
- * @method unknown mouseUp()
- * @method unknown mouseUpAndWait()
- * @method unknown mouseUpAt()
- * @method unknown mouseUpAtAndWait()
- * @method unknown mouseUpRight()
- * @method unknown mouseUpRightAndWait()
- * @method unknown mouseUpRightAt()
- * @method unknown mouseUpRightAtAndWait()
- * @method unknown open()
- * @method unknown openWindow()
- * @method unknown openWindowAndWait()
- * @method unknown pause()
- * @method unknown refresh()
- * @method unknown refreshAndWait()
- * @method unknown removeAllSelections()
- * @method unknown removeAllSelectionsAndWait()
- * @method unknown removeScript()
- * @method unknown removeScriptAndWait()
- * @method unknown removeSelection()
- * @method unknown removeSelectionAndWait()
- * @method unknown retrieveLastRemoteControlLogs()
- * @method unknown rollup()
- * @method unknown rollupAndWait()
- * @method unknown runScript()
- * @method unknown runScriptAndWait()
- * @method unknown select()
- * @method unknown selectAndWait()
- * @method unknown selectFrame()
- * @method unknown selectPopUp()
- * @method unknown selectPopUpAndWait()
- * @method unknown selectWindow()
- * @method unknown setBrowserLogLevel()
- * @method unknown setBrowserLogLevelAndWait()
- * @method unknown setContext()
- * @method unknown setCursorPosition()
- * @method unknown setCursorPositionAndWait()
- * @method unknown setMouseSpeed()
- * @method unknown setMouseSpeedAndWait()
- * @method unknown setSpeed()
- * @method unknown setSpeedAndWait()
- * @method unknown shiftKeyDown()
- * @method unknown shiftKeyDownAndWait()
- * @method unknown shiftKeyUp()
- * @method unknown shiftKeyUpAndWait()
- * @method unknown shutDownSeleniumServer()
- * @method unknown store()
- * @method unknown submit()
- * @method unknown submitAndWait()
- * @method unknown type()
- * @method unknown typeAndWait()
- * @method unknown typeKeys()
- * @method unknown typeKeysAndWait()
- * @method unknown uncheck()
- * @method unknown uncheckAndWait()
- * @method unknown useXpathLibrary()
- * @method unknown useXpathLibraryAndWait()
- * @method unknown waitForCondition()
- * @method unknown waitForElementPresent()
- * @method unknown waitForElementNotPresent()
- * @method unknown waitForPageToLoad()
- * @method unknown waitForPopUp()
- * @method unknown windowFocus()
- * @method unknown windowMaximize()
- */
- public function __call($command, $arguments)
- {
- $arguments = $this->preprocessParameters($arguments);
- $wait = FALSE;
- if (substr($command, -7, 7) == 'AndWait') {
- $command = substr($command, 0, -7);
- $wait = TRUE;
- }
- switch ($command) {
- case 'addLocationStrategy':
- case 'addScript':
- case 'addSelection':
- case 'allowNativeXpath':
- case 'altKeyDown':
- case 'altKeyUp':
- case 'answerOnNextPrompt':
- case 'assignId':
- case 'attachFile':
- case 'break':
- case 'captureEntirePageScreenshot':
- case 'captureScreenshot':
- case 'check':
- case 'chooseCancelOnNextConfirmation':
- case 'chooseOkOnNextConfirmation':
- case 'click':
- case 'clickAt':
- case 'close':
- case 'contextMenu':
- case 'contextMenuAt':
- case 'controlKeyDown':
- case 'controlKeyUp':
- case 'createCookie':
- case 'deleteAllVisibleCookies':
- case 'deleteCookie':
- case 'deselectPopUp':
- case 'doubleClick':
- case 'doubleClickAt':
- case 'dragAndDrop':
- case 'dragAndDropToObject':
- case 'dragDrop':
- case 'echo':
- case 'fireEvent':
- case 'focus':
- case 'goBack':
- case 'highlight':
- case 'ignoreAttributesWithoutValue':
- case 'keyDown':
- case 'keyDownNative':
- case 'keyPress':
- case 'keyPressNative':
- case 'keyUp':
- case 'keyUpNative':
- case 'metaKeyDown':
- case 'metaKeyUp':
- case 'mouseDown':
- case 'mouseDownAt':
- case 'mouseMove':
- case 'mouseMoveAt':
- case 'mouseOut':
- case 'mouseOver':
- case 'mouseUp':
- case 'mouseUpAt':
- case 'mouseUpRight':
- case 'mouseUpRightAt':
- case 'open':
- case 'openWindow':
- case 'pause':
- case 'refresh':
- case 'removeAllSelections':
- case 'removeScript':
- case 'removeSelection':
- case 'retrieveLastRemoteControlLogs':
- case 'rollup':
- case 'runScript':
- case 'select':
- case 'selectFrame':
- case 'selectPopUp':
- case 'selectWindow':
- case 'setBrowserLogLevel':
- case 'setContext':
- case 'setCursorPosition':
- case 'setMouseSpeed':
- case 'setSpeed':
- case 'shiftKeyDown':
- case 'shiftKeyUp':
- case 'shutDownSeleniumServer':
- case 'store':
- case 'submit':
- case 'type':
- case 'typeKeys':
- case 'uncheck':
- case 'useXpathLibrary':
- case 'windowFocus':
- case 'windowMaximize':
- case isset(self::$autoGeneratedCommands[$command]): {
- // Pre-Command Actions
- switch ($command) {
- case 'open':
- case 'openWindow': {
- if ($this->collectCodeCoverageInformation) {
- $this->deleteCookie('PHPUNIT_SELENIUM_TEST_ID', 'path=/');
- $this->createCookie(
- 'PHPUNIT_SELENIUM_TEST_ID=' . $this->testId,
- 'path=/'
- );
- }
- }
- break;
- case 'store':
- // store is a synonym of storeExpression
- // and RC only understands storeExpression
- $command = 'storeExpression';
- break;
- }
- if (isset(self::$autoGeneratedCommands[$command]) && self::$autoGeneratedCommands[$command]['functionHelper']) {
- $helperArguments = array($command, $arguments, self::$autoGeneratedCommands[$command]);
- call_user_func_array(array($this, self::$autoGeneratedCommands[$command]['functionHelper']), $helperArguments);
- } else {
- $this->doCommand($command, $arguments);
- }
- // Post-Command Actions
- switch ($command) {
- case 'addLocationStrategy':
- case 'allowNativeXpath':
- case 'assignId':
- case 'captureEntirePageScreenshot':
- case 'captureScreenshot': {
- // intentionally empty
- }
- break;
- default: {
- if ($wait) {
- if ($this->useWaitForPageToLoad) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- } else {
- sleep($this->wait);
- }
- }
- if ($this->sleep > 0) {
- sleep($this->sleep);
- }
- $this->testCase->runDefaultAssertions($command);
- }
- }
- }
- break;
- case 'getWhetherThisFrameMatchFrameExpression':
- case 'getWhetherThisWindowMatchWindowExpression':
- case 'isAlertPresent':
- case 'isChecked':
- case 'isConfirmationPresent':
- case 'isCookiePresent':
- case 'isEditable':
- case 'isElementPresent':
- case 'isOrdered':
- case 'isPromptPresent':
- case 'isSomethingSelected':
- case 'isTextPresent':
- case 'isVisible': {
- return $this->getBoolean($command, $arguments);
- }
- break;
- case 'getCssCount':
- case 'getCursorPosition':
- case 'getElementHeight':
- case 'getElementIndex':
- case 'getElementPositionLeft':
- case 'getElementPositionTop':
- case 'getElementWidth':
- case 'getMouseSpeed':
- case 'getSpeed':
- case 'getXpathCount': {
- $result = $this->getNumber($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'getAlert':
- case 'getAttribute':
- case 'getBodyText':
- case 'getConfirmation':
- case 'getCookie':
- case 'getCookieByName':
- case 'getEval':
- case 'getExpression':
- case 'getHtmlSource':
- case 'getLocation':
- case 'getLogMessages':
- case 'getPrompt':
- case 'getSelectedId':
- case 'getSelectedIndex':
- case 'getSelectedLabel':
- case 'getSelectedValue':
- case 'getTable':
- case 'getText':
- case 'getTitle':
- case 'captureEntirePageScreenshotToString':
- case 'captureScreenshotToString':
- case 'getValue': {
- $result = $this->getString($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'getAllButtons':
- case 'getAllFields':
- case 'getAllLinks':
- case 'getAllWindowIds':
- case 'getAllWindowNames':
- case 'getAllWindowTitles':
- case 'getAttributeFromAllWindows':
- case 'getSelectedIds':
- case 'getSelectedIndexes':
- case 'getSelectedLabels':
- case 'getSelectedValues':
- case 'getSelectOptions': {
- $result = $this->getStringArray($command, $arguments);
- if ($wait) {
- $this->waitForPageToLoad($this->seleniumTimeout * 1000);
- }
- return $result;
- }
- break;
- case 'waitForCondition':
- case 'waitForElementPresent':
- case 'waitForElementNotPresent':
- case 'waitForFrameToLoad':
- case 'waitForPopUp': {
- if (count($arguments) == 1) {
- $arguments[] = $this->seleniumTimeout * 1000;
- }
- $this->doCommand($command, $arguments);
- $this->testCase->runDefaultAssertions($command);
- }
- break;
- case 'waitForPageToLoad': {
- if (empty($arguments)) {
- $arguments[] = $this->seleniumTimeout * 1000;
- }
- $this->doCommand($command, $arguments);
- $this->testCase->runDefaultAssertions($command);
- }
- break;
- default: {
- if (!in_array($command, $this->userCommands)) {
- throw new BadMethodCallException(
- "Method $command not defined."
- );
- }
- $this->doCommand($command, $arguments);
- }
- }
- }
- /**
- * Send a command to the Selenium RC server.
- *
- * @param string $command
- * @param array $arguments
- * @param array $namedArguments
- * @return string
- * @author Seth Casana <totallymeat@gmail.org>
- */
- protected function doCommand($command, array $arguments = array(), array $namedArguments = array())
- {
- $url = sprintf(
- 'http://%s:%s/selenium-server/driver/',
- $this->host,
- $this->port
- );
- $numArguments = count($arguments);
- $postData = sprintf('cmd=%s', urlencode($command));
- for ($i = 0; $i < $numArguments; $i++) {
- $argNum = strval($i + 1);
- if ($arguments[$i] == ' ') {
- $postData .= sprintf('&%s=%s', $argNum, urlencode($arguments[$i]));
- } else {
- $postData .= sprintf('&%s=%s', $argNum, urlencode(trim($arguments[$i])));
- }
- }
- foreach ($namedArguments as $key => $value) {
- $postData .= sprintf('&%s=%s', $key, urlencode($value));
- }
- if (isset($this->sessionId)) {
- $postData .= sprintf('&%s=%s', 'sessionId', $this->sessionId);
- }
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_HEADER, 0);
- curl_setopt($curl, CURLOPT_POST, TRUE);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
- 'Content-Type: application/x-www-form-urlencoded; charset=utf-8'
- ));
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
- $response = curl_exec($curl);
- $info = curl_getinfo($curl);
- if (!$response) {
- throw new RuntimeException("CURL error while accessing the Selenium Server at '$url': " . curl_error($curl));
- }
- curl_close($curl);
- if (!preg_match('/^OK/', $response)) {
- throw new RuntimeException("Invalid response while accessing the Selenium Server at '$url': " . $response);
- }
- if ($info['http_code'] != 200) {
- throw new RuntimeException(
- 'The response from the Selenium RC server is invalid: ' .
- $response
- );
- }
- return $response;
- }
- protected function preprocessParameters($params)
- {
- foreach ($params as $key => $param ) {
- if (is_string($param) && (strlen($param) > 0)) {
- $params[$key] = $this->getString('getExpression', array($param));
- }
- }
- return $params;
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a boolean.
- *
- * @param string $command
- * @param array $arguments
- * @return boolean
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getBoolean($command, array $arguments)
- {
- $result = $this->getString($command, $arguments);
- switch ($result) {
- case 'true': return TRUE;
- case 'false': return FALSE;
- default: {
- throw new PHPUnit_Framework_Exception(
- 'Result is neither "true" nor "false": ' . PHPUnit_Util_Type::export($result)
- );
- }
- }
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a number.
- *
- * @param string $command
- * @param array $arguments
- * @return numeric
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getNumber($command, array $arguments)
- {
- $result = $this->getString($command, $arguments);
- if (!is_numeric($result)) {
- throw new PHPUnit_Framework_Exception(
- 'Result is not numeric: ' . PHPUnit_Util_Type::export($result)
- );
- }
- return $result;
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as a string.
- *
- * @param string $command
- * @param array $arguments
- * @return string
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getString($command, array $arguments)
- {
- try {
- $result = $this->doCommand($command, $arguments);
- }
- catch (RuntimeException $e) {
- throw $e;
- }
- return (strlen($result) > 3) ? substr($result, 3) : '';
- }
- /**
- * Send a command to the Selenium RC server and treat the result
- * as an array of strings.
- *
- * @param string $command
- * @param array $arguments
- * @return array
- * @author Shin Ohno <ganchiku@gmail.com>
- * @author Bjoern Schotte <schotte@mayflower.de>
- */
- protected function getStringArray($command, array $arguments)
- {
- $csv = $this->getString($command, $arguments);
- $token = '';
- $tokens = array();
- $letters = preg_split('//', $csv, -1, PREG_SPLIT_NO_EMPTY);
- $count = count($letters);
- for ($i = 0; $i < $count; $i++) {
- $letter = $letters[$i];
- switch($letter) {
- case '\\': {
- $letter = $letters[++$i];
- $token .= $letter;
- }
- break;
- case ',': {
- $tokens[] = $token;
- $token = '';
- }
- break;
- default: {
- $token .= $letter;
- }
- }
- }
- $tokens[] = $token;
- return $tokens;
- }
- public function getVerificationErrors()
- {
- return $this->verificationErrors;
- }
- public function clearVerificationErrors()
- {
- $this->verificationErrors = array();
- }
- protected function assertCommand($command, $arguments, $info)
- {
- $method = $info['originalMethod'];
- $requiresTarget = $info['requiresTarget'];
- $result = $this->__call($method, $arguments);
- $message = "Failed command: " . $command . "('"
- . (array_key_exists(0, $arguments) ? $arguments[0] . "'" : '')
- . (array_key_exists(1, $arguments) ? ", '" . $arguments[1] . "'" : '')
- . ")";
- if ($info['isBoolean']) {
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertTrue($result, $message);
- } else {
- PHPUnit_Framework_Assert::assertFalse($result, $message);
- }
- } else {
- if ($requiresTarget === TRUE) {
- $expected = $arguments[1];
- } else {
- $expected = $arguments[0];
- }
- if (strpos($expected, 'exact:') === 0) {
- $expected = substr($expected, strlen('exact:'));
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertEquals($expected, $result, $message);
- } else {
- PHPUnit_Framework_Assert::assertNotEquals($expected, $result, $message);
- }
- } else {
- $caseInsensitive = FALSE;
- if (strpos($expected, 'regexp:') === 0) {
- $expected = substr($expected, strlen('regexp:'));
- }
- else if (strpos($expected, 'regexpi:') === 0) {
- $expected = substr($expected, strlen('regexpi:'));
- $caseInsensitive = TRUE;
- }
- else {
- if (strpos($expected, 'glob:') === 0) {
- $expected = substr($expected, strlen('glob:'));
- }
- $expected = '^' . str_replace(
- array('*', '?'), array('.*', '.?'), $expected
- ) . '$';
- }
- $expected = '/' . str_replace('/', '\/', $expected) . '/';
- if ($caseInsensitive) {
- $expected .= 'i';
- }
- if (!isset($info['negative']) || !$info['negative']) {
- PHPUnit_Framework_Assert::assertRegExp(
- $expected, $result, $message
- );
- } else {
- PHPUnit_Framework_Assert::assertNotRegExp(
- $expected, $result, $message
- );
- }
- }
- }
- }
- protected function verifyCommand($command, $arguments, $info)
- {
- try {
- $this->assertCommand($command, $arguments, $info);
- }
- catch (PHPUnit_Framework_AssertionFailedError $e) {
- array_push($this->verificationErrors, $e->toString());
- }
- }
- protected function waitForCommand($command, $arguments, $info)
- {
- $lastExceptionMessage = '';
- for ($second = 0; ; $second++) {
- if ($second > $this->httpTimeout) {
- PHPUnit_Framework_Assert::fail(
- "WaitFor timeout. \n"
- . "Last exception message: \n" . $lastExceptionMessage
- );
- }
- try {
- $this->assertCommand($command, $arguments, $info);
- return;
- }
- catch (Exception $e) {
- $lastExceptionMessage = $e->getMessage();
- }
- sleep(1);
- }
- }
- /**
- * Parses the docblock of PHPUnit_Extensions_SeleniumTestCase_Driver::__call
- * for get*(), is*(), assert*(), verify*(), assertNot*(), verifyNot*(),
- * store*(), waitFor*(), and waitForNot*() methods.
- */
- protected static function autoGenerateCommands()
- {
- $method = new ReflectionMethod(__CLASS__, '__call');
- $docComment = $method->getDocComment();
- if (preg_match_all('(@method\s+(\w+)\s+([\w]+)\((.*)\))', $docComment, $matches)) {
- foreach ($matches[2] as $methodKey => $method) {
- if (preg_match('/^(get|is)([A-Z].+)$/', $method, $methodMatches)) {
- $baseName = $methodMatches[2];
- $isBoolean = $methodMatches[1] == 'is';
- $requiresTarget = (strlen($matches[3][$methodKey]) > 0);
- if (preg_match('/^(.*)Present$/', $baseName, $methodMatches)) {
- $notBaseName = $methodMatches[1] . 'NotPresent';
- } else {
- $notBaseName = 'Not' . $baseName;
- }
- self::$autoGeneratedCommands['store' . $baseName] = array(
- 'functionHelper' => FALSE
- );
- self::$autoGeneratedCommands['assert' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'assertCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['assert' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'assertCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['verify' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'verifyCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['verify' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'verifyCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['waitFor' . $baseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'functionHelper' => 'waitForCommand',
- 'requiresTarget' => $requiresTarget
- );
- self::$autoGeneratedCommands['waitFor' . $notBaseName] = array(
- 'originalMethod' => $method,
- 'isBoolean' => $isBoolean,
- 'negative' => TRUE,
- 'functionHelper' => 'waitForCommand',
- 'requiresTarget' => $requiresTarget
- );
- }
- }
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * Class to hold the special keys Unicode entities
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.0
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/value
- */
- class PHPUnit_Extensions_Selenium2TestCase_Keys
- {
- const NULL = "\xEE\x80\x80";
- const CANCEL = "\xEE\x80\x81";
- const HELP = "\xEE\x80\x82";
- const BACKSPACE = "\xEE\x80\x83";
- const TAB = "\xEE\x80\x84";
- const CLEAR = "\xEE\x80\x85";
- const RETURN_ = "\xEE\x80\x86";
- const ENTER = "\xEE\x80\x87";
- const SHIFT = "\xEE\x80\x88";
- const CONTROL = "\xEE\x80\x89";
- const ALT = "\xEE\x80\x8A";
- const PAUSE = "\xEE\x80\x8B";
- const ESCAPE = "\xEE\x80\x8C";
- const SPACE = "\xEE\x80\x8D";
- const PAGEUP = "\xEE\x80\x8E";
- const PAGEDOWN = "\xEE\x80\x8F";
- const END = "\xEE\x80\x90";
- const HOME = "\xEE\x80\x91";
- const LEFT = "\xEE\x80\x92";
- const UP = "\xEE\x80\x93";
- const RIGHT = "\xEE\x80\x94";
- const DOWN = "\xEE\x80\x95";
- const INSERT = "\xEE\x80\x96";
- const DELETE = "\xEE\x80\x97";
- const SEMICOLON = "\xEE\x80\x98";
- const EQUALS = "\xEE\x80\x99";
- const NUMPAD0 = "\xEE\x80\x9A";
- const NUMPAD1 = "\xEE\x80\x9B";
- const NUMPAD2 = "\xEE\x80\x9C";
- const NUMPAD3 = "\xEE\x80\x9D";
- const NUMPAD4 = "\xEE\x80\x9E";
- const NUMPAD5 = "\xEE\x80\x9F";
- const NUMPAD6 = "\xEE\x80\xA0";
- const NUMPAD7 = "\xEE\x80\xA1";
- const NUMPAD8 = "\xEE\x80\xA2";
- const NUMPAD9 = "\xEE\x80\xA3";
- const MULTIPLY = "\xEE\x80\xA4";
- const ADD = "\xEE\x80\xA5";
- const SEPARATOR = "\xEE\x80\xA6";
- const SUBTRACT = "\xEE\x80\xA7";
- const DECIMAL = "\xEE\x80\xA8";
- const DIVIDE = "\xEE\x80\xA9";
- const F1 = "\xEE\x80\xB1";
- const F2 = "\xEE\x80\xB2";
- const F3 = "\xEE\x80\xB3";
- const F4 = "\xEE\x80\xB4";
- const F5 = "\xEE\x80\xB5";
- const F6 = "\xEE\x80\xB6";
- const F7 = "\xEE\x80\xB7";
- const F8 = "\xEE\x80\xB8";
- const F9 = "\xEE\x80\xB9";
- const F10 = "\xEE\x80\xBA";
- const F11 = "\xEE\x80\xBB";
- const F12 = "\xEE\x80\xBC";
- const COMMAND = "\xEE\x80\xBD";
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Adds a cookie.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- {
- private $name;
- private $value;
- private $path;
- private $domain;
- private $secure = FALSE;
- private $expiry;
- public function __construct($cookieFacade, $name, $value)
- {
- $this->cookieFacade = $cookieFacade;
- $this->name = $name;
- $this->value = $value;
- }
- /**
- * @param string
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function path($path)
- {
- $this->path = $path;
- return $this;
- }
- /**
- * @param string
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function domain($domain)
- {
- $this->domain = $domain;
- return $this;
- }
- /**
- * @param boolean
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function secure($secure)
- {
- $this->secure = $secure;
- return $this;
- }
- /**
- * @param integer
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder
- */
- public function expiry($expiry)
- {
- $this->expiry = $expiry;
- return $this;
- }
- /**
- * @return void
- */
- public function set()
- {
- $cookieData = array(
- 'name' => $this->name,
- 'value' => $this->value,
- 'secure' => $this->secure,
- );
- foreach (array('path', 'domain', 'expiry') as $parameter) {
- if ($this->$parameter !== NULL) {
- $cookieData[$parameter] = $this->$parameter;
- }
- }
- $this->cookieFacade->postCookie($cookieData);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Manages timeouts for the current browser session.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- * @method implicitWait(int $ms) Sets timeout when searching for elements
- * @method asyncScript(int $ms) Sets timeout for asynchronous scripts executed by Session::executeAsync()
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts
- extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- private $maximumTimeout;
- private $lastImplicitWaitValue = 0;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- $maximumTimeout)
- {
- parent::__construct($driver, $url);
- $this->maximumTimeout = $maximumTimeout;
- }
- protected function initCommands()
- {
- $self = $this;
- return array(
- 'implicitWait' => function ($milliseconds, $commandUrl) use ($self) {
- $self->check($milliseconds);
- $self->setLastImplicitWaitValue($milliseconds);
- $jsonParameters = array('ms' => $milliseconds);
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $commandUrl);
- },
- 'asyncScript' => function ($milliseconds, $commandUrl) use ($self) {
- $self->check($milliseconds);
- $jsonParameters = array('ms' => $milliseconds);
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $commandUrl);
- },
- );
- }
- public function setLastImplicitWaitValue($implicitWait)
- {
- $this->lastImplicitWaitValue = $implicitWait;
- }
- public function getLastImplicitWaitValue()
- {
- return $this->lastImplicitWaitValue;
- }
- public function check($timeout)
- {
- if ($timeout > $this->maximumTimeout) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('There is no use in setting this timeout unless you also call $this->setSeleniumServerRequestsTimeout($seconds) in setUp().');
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Manage the local storage HTML 5 database.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Storage
- {
- private $driver;
- private $url;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_Driver $driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- }
- public function __set($name, $value)
- {
- $this->driver->curl('POST', $this->url, array(
- 'key' => $name,
- 'value' => (string)$value
- ));
- }
- public function __get($name)
- {
- return $this->driver->curl(
- 'GET',
- $this->url->descend('key')->descend($name)
- )->getValue();
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Adds and remove cookies.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session_Cookie
- {
- private $driver;
- private $url;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_Driver $driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- }
- /**
- * @param string $name
- * @param string $value
- * @return void
- */
- public function add($name, $value)
- {
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Cookie_Builder($this, $name, $value);
- }
- /**
- * @param string $name
- * @return string
- */
- public function get($name)
- {
- $cookies = $this->driver->curl('GET', $this->url)->getValue();
- foreach ($cookies as $cookie) {
- if ($cookie['name'] == $name) {
- return $cookie['value'];
- }
- }
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is no '$name' cookie available on this page.");
- }
- /**
- * @param string $name
- * @return void
- */
- public function remove($name)
- {
- $url = $this->url->descend($name);
- $this->driver->curl('DELETE', $url);
- }
- /**
- * @return void
- */
- public function clear()
- {
- $this->driver->curl('DELETE', $this->url);
- }
- /**
- * @internal
- * @param array $data
- * @return void
- */
- public function postCookie(array $data)
- {
- $this->driver->curl('POST',
- $this->url,
- array(
- 'cookie' => $data
- ));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Indicates an exception during the execution of Selenium 2 commands.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_Exception extends RuntimeException
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Object representing elements, or everything that may have subcommands.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Driver
- */
- protected $driver;
- /**
- * @var string the API URL for this element,
- */
- protected $url;
- /**
- * @var array instances of
- * PHPUnit_Extensions_Selenium2TestCase_ElementCommand
- */
- protected $commands;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $this->driver = $driver;
- $this->url = $url;
- $this->commands = array();
- foreach ($this->initCommands() as $commandName => $handler) {
- if (is_string($handler)) {
- $this->commands[$commandName] = $this->factoryMethod($handler);
- } else if (is_callable($handler)) {
- $this->commands[$commandName] = $handler;
- } else {
- throw new InvalidArgumentException("Command $commandName is not configured correctly.");
- }
- }
- }
- /**
- * @return array class names, or
- * callables of the form function($parameter, $commandUrl)
- */
- protected abstract function initCommands();
- public function __call($commandName, $arguments)
- {
- $jsonParameters = $this->extractJsonParameters($arguments);
- $response = $this->driver->execute($this->newCommand($commandName, $jsonParameters));
- return $response->getValue();
- }
- protected function postCommand($name, PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $response = $this->driver->curl('POST',
- $this->url->addCommand($name),
- $criteria->getArrayCopy());
- return $response->getValue();
- }
- /**
- * @params string $commandClass a class name, descending from
- PHPUnit_Extensions_Selenium2TestCase_Command
- * @return callable
- */
- private function factoryMethod($commandClass)
- {
- return function($jsonParameters, $url) use ($commandClass) {
- return new $commandClass($jsonParameters, $url);
- };
- }
- private function extractJsonParameters($arguments)
- {
- $this->checkArguments($arguments);
- if (count($arguments) == 0) {
- return NULL;
- }
- return $arguments[0];
- }
- private function checkArguments($arguments)
- {
- if (count($arguments) > 1) {
- throw new Exception('You cannot call a command with multiple method arguments.');
- }
- }
- /**
- * @param string $commandName The called method name
- * defined as a key in initCommands()
- * @param array $jsonParameters
- * @return PHPUnit_Extensions_Selenium2TestCase_Command
- */
- protected function newCommand($commandName, $jsonParameters)
- {
- if (isset($this->commands[$commandName])) {
- $factoryMethod = $this->commands[$commandName];
- $url = $this->url->addCommand($commandName);
- $command = $factoryMethod($jsonParameters, $url);
- return $command;
- }
- throw new BadMethodCallException("The command '$commandName' is not existent or not supported yet.");
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.8
- */
- /**
- * Base class for implementing commands with special semantics.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_ScreenshotListener implements PHPUnit_Framework_TestListener
- {
- private $directory;
- public function __construct($directory)
- {
- $this->directory = $directory;
- }
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->storeAScreenshot($test);
- }
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->storeAScreenshot($test);
- }
- private function storeAScreenshot(PHPUnit_Framework_Test $test)
- {
- if ($test instanceof PHPUnit_Extensions_Selenium2TestCase)
- {
- try {
- $file = $this->directory . '/' . get_class($test) . '__' . $test->getName() . '__' . date('Y-m-d\TH-i-s') . '.png';
- file_put_contents($file, $test->currentScreenshot());
- } catch (Exception $e) {
- $file = $this->directory . '/' . get_class($test) . '__' . $test->getName() . '__' . date('Y-m-d\TH-i-s') . '.txt';
- file_put_contents($file, "Screenshot generation doesn't work." . "\n"
- . $e->getMessage() . "\n"
- . $e->getTraceAsString());
- }
- }
- }
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time) {}
- public function startTest(PHPUnit_Framework_Test $test) {}
- public function endTest(PHPUnit_Framework_Test $test, $time) {}
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {}
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {}
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Base class for implementing commands with special semantics.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_Command
- {
- protected $jsonParameters;
- private $commandName;
- /**
- * @param array $jsonParameters null in case of no parameters
- */
- public function __construct($jsonParameters,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_array($jsonParameters) && $jsonParameters !== NULL) {
- throw new InvalidArgumentException("The JSON parameters must be an array, or a NULL value in case they are not required.");
- }
- $this->jsonParameters = $jsonParameters;
- $this->url = $url;
- }
- public function url()
- {
- return $this->url;
- }
- /**
- * @return string
- */
- abstract public function httpMethod();
- /**
- * @param array $jsonParameters null in case of no parameters
- */
- public function jsonParameters()
- {
- return $this->jsonParameters;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.5
- */
- /**
- * Gets or sets an attribute of an object.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.5
- */
- class PHPUnit_Extensions_Selenium2TestCase_StateCommand
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Object representing a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method string attribute($name) Retrieves an element's attribute
- * @method void clear() Empties the content of a form element.
- * @method void click() Clicks on element
- * @method string css($propertyName) Retrieves the value of a CSS property
- * @method bool displayed() Checks an element's visibility
- * @method bool enabled() Checks a form element's state
- * @method bool equals(PHPUnit_Extensions_Selenium2TestCase_Element $another) Checks if the two elements are the same on the page
- * @method array location() Retrieves the element's position in the page: keys 'x' and 'y' in the returned array
- * @method bool selected() Checks the state of an option or other form element
- * @method array size() Retrieves the dimensions of the element: 'width' and 'height' of the returned array
- * @method void submit() Submits a form; can be called on its children
- * @method string text() Get content of ordinary elements
- */
- class PHPUnit_Extensions_Selenium2TestCase_Element
- extends PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- {
- /**
- * @return \self
- * @throws InvalidArgumentException
- */
- public static function fromResponseValue(
- array $value,
- PHPUnit_Extensions_Selenium2TestCase_URL $parentFolder,
- PHPUnit_Extensions_Selenium2TestCase_Driver $driver)
- {
- if (!isset($value['ELEMENT'])) {
- throw new InvalidArgumentException('Element not found.');
- }
- $url = $parentFolder->descend($value['ELEMENT']);
- return new self($driver, $url);
- }
- /**
- * @return integer
- */
- public function getId()
- {
- return $this->url->lastSegment();
- }
- /**
- * @return array class names
- */
- protected function initCommands()
- {
- return array(
- 'attribute' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Attribute',
- 'clear' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'click' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Click',
- 'css' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Css',
- 'displayed' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'enabled' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'equals' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Equals',
- 'location' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'name' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'selected' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'size' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'submit' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'text' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'value' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Value',
- 'tap' => $this->touchCommandFactoryMethod('touch/click'),
- 'scroll' => $this->touchCommandFactoryMethod('touch/scroll'),
- 'doubletap' => $this->touchCommandFactoryMethod('touch/doubleclick'),
- 'longtap' => $this->touchCommandFactoryMethod('touch/longclick'),
- 'flick' => $this->touchCommandFactoryMethod('touch/flick')
- );
- }
- protected function getSessionUrl()
- {
- return $this->url->ascend()->ascend();
- }
- private function touchCommandFactoryMethod($urlSegment)
- {
- $url = $this->getSessionUrl()->addCommand($urlSegment);
- $self = $this;
- return function ($jsonParameters, $commandUrl) use ($url, $self) {
- if ((is_array($jsonParameters) &&
- !isset($jsonParameters['element'])) ||
- is_null($jsonParameters)) {
- $jsonParameters['element'] = $self->getId();
- }
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $url);
- };
- }
- /**
- * Retrieves the tag name
- * @return string
- */
- public function name()
- {
- return strtolower(parent::name());
- }
- /**
- * Generates an array that is structured as the WebDriver Object of the JSONWireProtocoll
- *
- * @return array
- */
- public function toWebDriverObject()
- {
- return array('ELEMENT' => (string)$this->getId());
- }
- /**
- * Get or set value of form elements. If the element already has a value, the set one will be appended to it.
- * Created **ONLY** for keeping backward compatibility, since in selenium v2.42.0 it was removed
- * The currently recommended solution is to use `$element->attribute('value')`
- * @see https://code.google.com/p/selenium/source/detail?r=953007b48e83f90450f3e41b11ec31e2928f1605
- * @see https://code.google.com/p/selenium/source/browse/java/CHANGELOG
- *
- * @param string $newValue
- * @return null|string
- */
- public function value($newValue = NULL)
- {
- if ($newValue !== NULL) {
- return parent::value($newValue);
- }
- return $this->attribute('value');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Object representing an HTTP response from the Selenium Server.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_Response
- {
- /**
- * @var array decoded response
- */
- private $jsonResponse;
- /**
- * @var array CURL info for the response.
- */
- private $info;
- public function __construct($jsonResponse, $info)
- {
- $this->jsonResponse = $jsonResponse;
- $this->info = $info;
- }
- public function getValue()
- {
- if (isset($this->jsonResponse['value'])) {
- return $this->jsonResponse['value'];
- }
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function getURL()
- {
- $url = $this->info['url'];
- $sessionId = $this->jsonResponse['sessionId'];
- // if url doesn't have sessionId included - append it manually
- // this change was performed in selenium v2.34
- // @see https://code.google.com/p/selenium/issues/detail?id=6089
- // @see https://github.com/sebastianbergmann/phpunit-selenium/issues/265
- if (strpos($url, $sessionId) === FALSE) {
- $url .= '/' . $sessionId;
- }
- return new PHPUnit_Extensions_Selenium2TestCase_URL($url);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.9
- */
- /**
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException
- extends PHPUnit_Extensions_Selenium2TestCase_Exception
- {
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Keeps a Session object shared between test runs to save time.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared
- implements PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- private $original;
- private $session;
- private $mainWindow;
- private $lastTestWasNotSuccessful = FALSE;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_SessionStrategy $originalStrategy)
- {
- $this->original = $originalStrategy;
- }
- public function session(array $parameters)
- {
- if ($this->lastTestWasNotSuccessful) {
- if ($this->session !== NULL) {
- $this->session->stop();
- $this->session = NULL;
- }
- $this->lastTestWasNotSuccessful = FALSE;
- }
- if ($this->session === NULL) {
- $this->session = $this->original->session($parameters);
- $this->mainWindow = $this->session->windowHandle();
- } else {
- $this->session->window($this->mainWindow);
- }
- return $this->session;
- }
- public function notSuccessfulTest()
- {
- $this->lastTestWasNotSuccessful = TRUE;
- }
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL)
- {
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Produces a new Session object shared for each test.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated
- implements PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- public function session(array $parameters)
- {
- $seleniumServerUrl = PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($parameters['host'], $parameters['port']);
- $driver = new PHPUnit_Extensions_Selenium2TestCase_Driver($seleniumServerUrl, $parameters['seleniumServerRequestsTimeout']);
- $capabilities = array_merge($parameters['desiredCapabilities'],
- array(
- 'browserName' => $parameters['browserName']
- ));
- $session = $driver->startSession($capabilities, $parameters['browserUrl']);
- return $session;
- }
- public function notSuccessfulTest()
- {
- }
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL)
- {
- if ($session !== NULL) {
- $session->stop();
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks ok on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Click
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Checks equality (same element on the page) with another DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Equals
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $parameter
- */
- public function __construct($parameter,
- PHPUnit_Extensions_Selenium2TestCase_URL $equalsResourceBaseUrl)
- {
- $this->jsonParameters = array();
- if (!($parameter instanceof PHPUnit_Extensions_Selenium2TestCase_Element)) {
- throw new InvalidArgumentException("Elements can only test equality with other Element instances.");
- }
- $this->url = $equalsResourceBaseUrl->descend($parameter->getId());
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Class for implementing commands that just return a value
- * (obtained with GET).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2012 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Class for implementing commands that just accomplishes an action (via POST).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2012 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Get and set the element's value attribute.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Value
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- throw new BadMethodCallException("JSON Wire Protocol only supports POST to /value now. To get the value of an element GET /attribute/:naem should be used and this object should never be involved.");
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Retrieves an attribute of a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Attribute
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $parameter
- */
- public function __construct($parameter,
- PHPUnit_Extensions_Selenium2TestCase_URL $attributeResourceBaseUrl)
- {
- $this->jsonParameters = array();
- $this->url = $attributeResourceBaseUrl->descend($parameter);
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Retrieves the value of a CSS property.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCommand_Css
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @param array $propertyName
- */
- public function __construct($propertyName,
- PHPUnit_Extensions_Selenium2TestCase_URL $cssResourceBaseUrl)
- {
- $this->jsonParameters = array();
- $this->url = $cssResourceBaseUrl->descend($propertyName);
- }
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Conditions for selecting a DOM element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element
- */
- class PHPUnit_Extensions_Selenium2TestCase_ElementCriteria extends ArrayObject
- {
- public function __construct($strategy)
- {
- $this['using'] = $strategy;
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_ElementCriteria
- */
- public function value($searchTarget)
- {
- $this['value'] = $searchTarget;
- return $this;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.5
- */
- /**
- * Object representing a browser window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.5
- * @method array size(array $size = null) Window size as array('width' => $x, 'height' => $y)
- * @method array position(array $position = null) Window position as array('x' => $x, 'y' => $y)
- * @method array maximize() Maximize window
- */
- class PHPUnit_Extensions_Selenium2TestCase_Window extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @return array class names
- */
- protected function initCommands()
- {
- return array(
- 'size' => 'PHPUnit_Extensions_Selenium2TestCase_StateCommand',
- 'position' => 'PHPUnit_Extensions_Selenium2TestCase_StateCommand',
- 'maximize' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- );
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Driver for creating browser session with Selenium 2 (WebDriver API).
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_Driver
- {
- private $seleniumServerUrl;
- private $seleniumServerRequestsTimeout;
- public function __construct(PHPUnit_Extensions_Selenium2TestCase_URL $seleniumServerUrl, $timeout = 60)
- {
- $this->seleniumServerUrl = $seleniumServerUrl;
- $this->seleniumServerRequestsTimeout = $timeout;
- }
- public function startSession(array $desiredCapabilities, PHPUnit_Extensions_Selenium2TestCase_URL $browserUrl)
- {
- $sessionCreation = $this->seleniumServerUrl->descend("/wd/hub/session");
- $response = $this->curl('POST', $sessionCreation, array(
- 'desiredCapabilities' => $desiredCapabilities
- ));
- $sessionPrefix = $response->getURL();
- $timeouts = new PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts(
- $this,
- $sessionPrefix->descend('timeouts'),
- $this->seleniumServerRequestsTimeout * 1000
- );
- return new PHPUnit_Extensions_Selenium2TestCase_Session(
- $this,
- $sessionPrefix,
- $browserUrl,
- $timeouts
- );
- }
- /**
- * Performs an HTTP request to the Selenium 2 server.
- *
- * @param string $method 'GET'|'POST'|'DELETE'|...
- * @param string $url
- * @param array $params JSON parameters for POST requests
- */
- public function curl($http_method,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- $params = NULL)
- {
- $curl = curl_init($url->getValue());
- curl_setopt($curl, CURLOPT_TIMEOUT, $this->seleniumServerRequestsTimeout);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($curl,
- CURLOPT_HTTPHEADER,
- array(
- 'Content-type: application/json;charset=UTF-8',
- 'Accept: application/json;charset=UTF-8'
- ));
- if ($http_method === 'POST') {
- curl_setopt($curl, CURLOPT_POST, TRUE);
- if ($params && is_array($params)) {
- curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
- } else {
- curl_setopt($curl, CURLOPT_POSTFIELDS, '');
- }
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
- } else if ($http_method == 'DELETE') {
- curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
- }
- $rawResponse = trim(curl_exec($curl));
- if (curl_errno($curl)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException(
- 'Error connection[' . curl_errno($curl) . '] to ' .
- $url->getValue() . ': ' . curl_error($curl)
- );
- }
- $info = curl_getinfo($curl);
- if ($info['http_code'] == 0) {
- throw new PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException();
- }
- if ($info['http_code'] == 404) {
- throw new BadMethodCallException("The command $url is not recognized by the server.");
- }
- curl_close($curl);
- $content = json_decode($rawResponse, TRUE);
- if ($info['http_code'] == 500) {
- $message = '';
- if (isset($content['value']['message'])) {
- $message .= $content['value']['message'];
- } else {
- $message .= "Internal server error while executing $http_method request at $url. Response: " . var_export($content, TRUE);
- }
- if (isset($content['value']['class'])) {
- $message .= PHP_EOL . $content['value']['class'];
- }
- throw new PHPUnit_Extensions_Selenium2TestCase_WebDriverException($message, isset($content['status']) ? $content['status'] : 13);
- }
- return new PHPUnit_Extensions_Selenium2TestCase_Response($content, $info);
- }
- public function execute(PHPUnit_Extensions_Selenium2TestCase_Command $command)
- {
- return $this->curl($command->httpMethod(),
- $command->url(),
- $command->jsonParameters());
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * The WaitUntil implementation, inspired by Java and .NET clients
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.12
- * @see http://selenium.googlecode.com/svn/trunk/dotnet/src/WebDriver.Support/UI/WebDriverWait.cs
- * @see http://selenium.googlecode.com/svn/trunk/java/client/src/org/openqa/selenium/support/ui/FluentWait.java
- */
- class PHPUnit_Extensions_Selenium2TestCase_WaitUntil
- {
- /**
- * PHPUnit Test Case instance
- *
- * @var PHPUnit_Extensions_Selenium2TestCase
- */
- private $_testCase;
- /**
- * Default timeout, ms
- *
- * @var int
- */
- private $_defaultTimeout = 0;
- /**
- * The sleep interval between iterations, ms
- *
- * @var int
- */
- private $_defaultSleepInterval = 500;
- /**
- * @param PHPUnit_Extensions_Selenium2TestCase $testCase
- */
- public function __construct(PHPUnit_Extensions_Selenium2TestCase $testCase)
- {
- $this->_testCase = $testCase;
- }
- /**
- * @param $callback Callback to run until it returns not null or timeout occurs
- * @param null $timeout
- * @return mixed
- * @throws PHPUnit_Extensions_Selenium2TestCase_Exception
- * @throws PHPUnit_Extensions_Selenium2TestCase_WebDriverException
- */
- public function run($callback, $timeout = NULL)
- {
- if (!is_callable($callback)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('The valid callback is expected');
- }
- // if there was an implicit timeout specified - remember it and temporarily turn it off
- $implicitWait = $this->_testCase->timeouts()->getLastImplicitWaitValue();
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait(0);
- }
- if (is_null($timeout)) {
- $timeout = $this->_defaultTimeout;
- }
- $timeout /= 1000;
- $endTime = microtime(TRUE) + $timeout;
- $lastException = NULL;
- while (TRUE) {
- try {
- $result = call_user_func($callback, $this->_testCase);
- if (!is_null($result)) {
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait($implicitWait);
- }
- return $result;
- }
- } catch(Exception $e) {
- $lastException = $e;
- }
- if (microtime(TRUE) > $endTime) {
- if ($implicitWait) {
- $this->_testCase->timeouts()->implicitWait($implicitWait);
- }
- $message = "Timed out after {$timeout} second" . ($timeout != 1 ? 's' : '');
- throw new PHPUnit_Extensions_Selenium2TestCase_WebDriverException($message,
- PHPUnit_Extensions_Selenium2TestCase_WebDriverException::Timeout, $lastException);
- }
- usleep($this->_defaultSleepInterval * 1000);
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Christian Becker <chris@beckr.org>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since
- */
- /**
- * Indicates an exception as a result of a non-sucessful WebDriver response status code.
- *
- * @package PHPUnit_Selenium
- * @author Christian Becker <chris@beckr.org>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since
- */
- class PHPUnit_Extensions_Selenium2TestCase_WebDriverException extends PHPUnit_Extensions_Selenium2TestCase_Exception
- {
- /* @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Response_Status_Codes */
- const Success = 0;
- const NoSuchDriver = 6;
- const NoSuchElement = 7;
- const NoSuchFrame = 8;
- const UnknownCommand = 9;
- const StaleElementReference = 10;
- const ElementNotVisible = 11;
- const InvalidElementState = 12;
- const UnknownError = 13;
- const ElementIsNotSelectable = 15;
- const JavaScriptError = 17;
- const XPathLookupError = 19;
- const Timeout = 21;
- const NoSuchWindow = 23;
- const InvalidCookieDomain = 24;
- const UnableToSetCookie = 25;
- const UnexpectedAlertOpen = 26;
- const NoAlertOpenError = 27;
- const ScriptTimeout = 28;
- const InvalidElementCoordinates = 29;
- const IMENotAvailable = 30;
- const IMEEngineActivationFailed = 31;
- const InvalidSelector = 32;
- const SessionNotCreatedException = 33;
- const MoveTargetOutOfBounds = 34;
- }<?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Christian Soronellas <csoronellas@emagister.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or sets the current URL of the window.
- *
- * @package PHPUnit_Selenium
- * @author Christian Soronellas <csoronellas@emagister.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($jsonParameters,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if ($jsonParameters === NULL) {
- parent::__construct(NULL, $url);
- } else {
- $jsonParameters = $this->keysForText($jsonParameters);
- parent::__construct($jsonParameters, $url);
- }
- }
- /**
- * @return string
- */
- public function httpMethod()
- {
- return 'POST';
- }
- /**
- * Given a string returns an array of the characters that compose the string
- *
- * @param string $text
- * @throws InvalidArgumentException
- * @return array
- */
- public function keysForText($text)
- {
- if (is_scalar($text)) {
- return array('value' => preg_split('//u', (string) $text, -1, PREG_SPLIT_NO_EMPTY));
- }
- if (is_array($text)) {
- return $text;
- }
- throw new InvalidArgumentException('The "text" argument should be a string or an array of special characters!');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.13
- */
- /**
- * Sends session click command for emulating LEFT, MIDDLE or RIGHT mouse buttons
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.13
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Click
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- const LEFT = 0;
- const MIDDLE = 1;
- const RIGHT = 2;
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (is_null($argument)) {
- $jsonParameters = NULL;
- } elseif (!is_scalar($argument) || !in_array($argument, array(
- self::LEFT, self::RIGHT, self::MIDDLE
- ))) {
- throw new BadMethodCallException('Wrong parameter for click(): expecting 0, 1 or 2.');
- } else {
- $jsonParameters = array('button' => $argument);
- }
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Location
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- {
- public function __construct($location, $commandUrl)
- {
- if ($location !== NULL) {
- $jsonParameters = array('location' => $location);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets an attribute from the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.3.2
- */
- /**
- * Sends a file to a RC
- * Returns the FQ path to the transfered file
- *
- * @package PHPUnit_Selenium
- * @author Kevin Ran <heilong24@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_File
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- /**
- * @var
- */
- private static $_zipArchive;
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_file($argument)) {
- throw new BadMethodCallException("No such file: {$argument}");
- }
- $zipfile_path = $this->_zipArchiveFile($argument);
- $contents = file_get_contents($zipfile_path);
- if ($contents === false) {
- throw new Exception("Unable to read generated zip file: {$zipfile_path}");
- }
- $file = base64_encode($contents);
- parent::__construct(array('file' => $file), $url);
- unlink($zipfile_path);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- /**
- * Creates a zip archive with the given file
- *
- * @param string $file_path FQ path to file
- * @return string Generated zip file
- */
- protected function _zipArchiveFile( $file_path )
- {
- // file MUST be readable
- if( !is_readable( $file_path ) ) {
- throw new Exception( "Unable to read {$file_path}" );
- } // if !file_data
- $filename_hash = sha1( time() . $file_path );
- $tmp_dir = $this->_getTmpDir();
- $zip_filename = "{$tmp_dir}{$filename_hash}.zip";
- $zip = $this->_getZipArchiver();
- if ($zip->open($zip_filename, ZIPARCHIVE::CREATE) === FALSE) {
- throw new Exception( "Unable to create zip archive: {$zip_filename}" );
- }
- $zip->addFile($file_path, basename($file_path));
- $zip->close();
- return $zip_filename;
- }
- /**
- * Returns a runtime instance of a ZipArchive
- *
- * @return ZipArchive
- */
- protected function _getZipArchiver()
- {
- // create ZipArchive if necessary
- if (!static::$_zipArchive) {
- static::$_zipArchive = new ZipArchive();
- }
- return static::$_zipArchive;
- }
- /**
- * Calls sys_get_temp_dir and ensures that it has a trailing slash
- * ( behavior varies across systems )
- *
- * @return string
- */
- protected function _getTmpDir()
- {
- return rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks Ok on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AcceptAlert
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Obtains the text of an alert, or types into a prompt.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AlertText
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($argument, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (is_string($argument)) {
- $jsonParameters =array('text' => $argument);
- } else if ($argument == NULL) {
- $jsonParameters = NULL;
- } else {
- throw new BadMethodCallException('Wrong parameters for alertText().');
- }
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or sets the current URL of the window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Url
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($url, $commandUrl, PHPUnit_Extensions_Selenium2TestCase_URL $baseUrl)
- {
- if ($url !== NULL) {
- $absoluteLocation = $baseUrl->jump($url)->getValue();
- $jsonParameters = array('url' => $absoluteLocation);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Changes the focus to a window.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Window
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($name, $commandUrl)
- {
- $jsonParameters = array('name' => $name);
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.8
- */
- /**
- * Moves the mouse pointer.
- *
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.8
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_MoveTo
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($element,
- PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- if (!is_array($element)) {
- $element = array(
- 'element' => $element,
- );
- }
- $validKeys = array(
- 'element' => NULL,
- 'xoffset' => NULL,
- 'yoffset' => NULL,
- );
- $jsonParameters = array_intersect_key($element, $validKeys);
- if (isset($jsonParameters['element'])) {
- if (!($jsonParameters['element'] instanceof PHPUnit_Extensions_Selenium2TestCase_Element)) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception('Only moving over an element is supported. Please pass a PHPUnit_Extensions_Selenium2TestCase_Element instance.');
- }
- $jsonParameters['element'] = $jsonParameters['element']->getId();
- }
- if (isset($jsonParameters['xoffset']) || isset($jsonParameters['yoffset'])) {
- // @see https://github.com/sebastianbergmann/phpunit-selenium/pull/250#issuecomment-21308153
- // @see https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/moveto
- error_log('Even though this method is a part of the WebDriver Wire protocol it might be not supported by your browser yet');
- }
- parent::__construct($jsonParameters, $url);
- }
- /**
- * @return string
- */
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Gets or posts an attribute from/to the session (title, alert text, etc.)
- *
- * @package PHPUnit_Selenium
- * @author Jonathan Lipps <jlipps@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.9
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Orientation
- extends PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute
- {
- public function __construct($orientation, $commandUrl)
- {
- if ($orientation !== NULL) {
- $jsonParameters = array('orientation' => $orientation);
- } else {
- $jsonParameters = NULL;
- }
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- if ($this->jsonParameters) {
- return 'POST';
- }
- return 'GET';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Andrew Krasichkov <krasichkovandrew@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.3.2
- */
- /**
- * Get the log for a given log type. Log buffer is reset after each request.
- *
- * @package PHPUnit_Selenium
- * @author Andrew Krasichkov <krasichkovandrew@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Log
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($type, $commandUrl)
- {
- $jsonParameters = array('type' => $type);
- parent::__construct($jsonParameters, $commandUrl);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }<?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release
- */
- /**
- * Gets the active element from the session
- *
- * @package PHPUnit_Selenium
- * @author Marcel Erz <marcel.erz@gmail.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Active
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($jsonParameters, PHPUnit_Extensions_Selenium2TestCase_URL $url)
- {
- $url = $url->addCommand('element')->addCommand('active');
- parent::__construct($jsonParameters, $url);
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Clicks Cancel on an alert popup.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_DismissAlert
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.4
- */
- /**
- * Changes the focus to a frame.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.4
- */
- class PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Frame
- extends PHPUnit_Extensions_Selenium2TestCase_Command
- {
- public function __construct($id, $commandUrl)
- {
- $jsonParameters = array(
- 'id' => $this->extractId($id)
- );
- parent::__construct($jsonParameters, $commandUrl);
- }
- /**
- * @param $id
- * @return array
- */
- private function extractId($id)
- {
- if ($this->isElement($id)) { //selenium-element
- return $id->toWebDriverObject();
- }
- //html-id or null
- return $id;
- }
- /**
- * @param $id
- * @return bool
- */
- private function isElement($id)
- {
- return $id instanceof PHPUnit_Extensions_Selenium2TestCase_Element;
- }
- public function httpMethod()
- {
- return 'POST';
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * URL Value Object allowing easy concatenation.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- */
- final class PHPUnit_Extensions_Selenium2TestCase_URL
- {
- /**
- * @var string
- */
- private $value;
- /**
- * @param string $value
- */
- public function __construct($value)
- {
- $this->value = $value;
- }
- /**
- * @param string $host
- * @param int port
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public static function fromHostAndPort($host, $port)
- {
- return new self("http://{$host}:{$port}");
- }
- /**
- * @return string
- */
- public function getValue()
- {
- return $this->value;
- }
- public function __toString()
- {
- return $this->getValue();
- }
- /**
- * @param string $addition
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function descend($addition)
- {
- if ($addition == '') {
- // if we're adding nothing, respect the current url's choice of
- // whether or not to include a trailing slash; prevents inadvertent
- // adding of slashes to urls that can't handle it
- $newValue = $this->value;
- } else {
- $newValue = rtrim($this->value, '/')
- . '/'
- . ltrim($addition, '/');
- }
- return new self($newValue);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function ascend()
- {
- $lastSlash = strrpos($this->value, "/");
- $newValue = substr($this->value, 0, $lastSlash);
- return new self($newValue);
- }
- /**
- * @return string
- */
- public function lastSegment()
- {
- $segments = explode('/', $this->value);
- return end($segments);
- }
- /**
- * @param string $command
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function addCommand($command)
- {
- return $this->descend($this->camelCaseToUnderScores($command));
- }
- /**
- * @param string $newUrl
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function jump($newUrl)
- {
- if ($this->isAbsolute($newUrl)) {
- return new self($newUrl);
- } else {
- return $this->descend($newUrl);
- }
- }
- private function camelCaseToUnderScores($string)
- {
- $string = preg_replace('/([A-Z]{1,1})/', ' \1', $string);
- $string = strtolower($string);
- return str_replace(' ', '_', $string);
- }
- private function isAbsolute($urlValue)
- {
- return preg_match('/^(http|https):\/\//', $urlValue) > 0;
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * Specifies how to create Session objects for running tests.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- interface PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- {
- /**
- * @param array $parameters 'host' => Selenium Server machine
- 'port' => Selenium Server port
- 'browser' => a browser name
- * 'browserUrl' => base URL to use during the test
- */
- public function session(array $parameters);
- public function notSuccessfulTest();
- public function endOfTest(PHPUnit_Extensions_Selenium2TestCase_Session $session = NULL);
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.12
- */
- /**
- * Class-mapper, that converts requested special key into correspondent Unicode character
- *
- * @package PHPUnit_Selenium
- * @author Ivan Kurnosov <zerkms@zerkms.com>
- * @copyright 2010-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.12
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/value
- */
- class PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- {
- private $_keys = array(
- 'null' => "\xEE\x80\x80",
- 'cancel' => "\xEE\x80\x81",
- 'help' => "\xEE\x80\x82",
- 'backspace' => "\xEE\x80\x83",
- 'tab' => "\xEE\x80\x84",
- 'clear' => "\xEE\x80\x85",
- 'return' => "\xEE\x80\x86",
- 'enter' => "\xEE\x80\x87",
- 'shift' => "\xEE\x80\x88",
- 'control' => "\xEE\x80\x89",
- 'alt' => "\xEE\x80\x8A",
- 'pause' => "\xEE\x80\x8B",
- 'escape' => "\xEE\x80\x8C",
- 'space' => "\xEE\x80\x8D",
- 'pageup' => "\xEE\x80\x8E",
- 'pagedown' => "\xEE\x80\x8F",
- 'end' => "\xEE\x80\x90",
- 'home' => "\xEE\x80\x91",
- 'left' => "\xEE\x80\x92",
- 'up' => "\xEE\x80\x93",
- 'right' => "\xEE\x80\x94",
- 'down' => "\xEE\x80\x95",
- 'insert' => "\xEE\x80\x96",
- 'delete' => "\xEE\x80\x97",
- 'semicolon' => "\xEE\x80\x98",
- 'equals' => "\xEE\x80\x99",
- 'numpad0' => "\xEE\x80\x9A",
- 'numpad1' => "\xEE\x80\x9B",
- 'numpad2' => "\xEE\x80\x9C",
- 'numpad3' => "\xEE\x80\x9D",
- 'numpad4' => "\xEE\x80\x9E",
- 'numpad5' => "\xEE\x80\x9F",
- 'numpad6' => "\xEE\x80\xA0",
- 'numpad7' => "\xEE\x80\xA1",
- 'numpad8' => "\xEE\x80\xA2",
- 'numpad9' => "\xEE\x80\xA3",
- 'multiply' => "\xEE\x80\xA4",
- 'add' => "\xEE\x80\xA5",
- 'separator' => "\xEE\x80\xA6",
- 'subtract' => "\xEE\x80\xA7",
- 'decimal' => "\xEE\x80\xA8",
- 'divide' => "\xEE\x80\xA9",
- 'f1' => "\xEE\x80\xB1",
- 'f2' => "\xEE\x80\xB2",
- 'f3' => "\xEE\x80\xB3",
- 'f4' => "\xEE\x80\xB4",
- 'f5' => "\xEE\x80\xB5",
- 'f6' => "\xEE\x80\xB6",
- 'f7' => "\xEE\x80\xB7",
- 'f8' => "\xEE\x80\xB8",
- 'f9' => "\xEE\x80\xB9",
- 'f10' => "\xEE\x80\xBA",
- 'f11' => "\xEE\x80\xBB",
- 'f12' => "\xEE\x80\xBC",
- 'command' => "\xEE\x80\xBD",
- );
- public function specialKey($name)
- {
- $normalizedName = strtolower($name);
- if (!isset($this->_keys[$normalizedName])) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is no special key '$name' defined");
- }
- return $this->_keys[$normalizedName];
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- */
- /**
- * Provides access to /element and /elements commands
- *
- * @package PHPUnit_Selenium
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- extends PHPUnit_Extensions_Selenium2TestCase_CommandsHolder
- {
- /**
- * @param string $value e.g. 'container'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byClassName($value)
- {
- return $this->by('class name', $value);
- }
- /**
- * @param string $value e.g. 'div.container'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byCssSelector($value)
- {
- return $this->by('css selector', $value);
- }
- /**
- * @param string $value e.g. 'uniqueId'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byId($value)
- {
- return $this->by('id', $value);
- }
- /**
- * @param string $value e.g. 'Link text'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byLinkText($value)
- {
- return $this->by('link text', $value);
- }
- /**
- * @param string $value e.g. 'Link te'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byPartialLinkText($value)
- {
- return $this->by('partial link text', $value);
- }
- /**
- * @param string $value e.g. 'email_address'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byName($value)
- {
- return $this->by('name', $value);
- }
- /**
- * @param string $value e.g. 'body'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byTag($value)
- {
- return $this->by('tag name', $value);
- }
- /**
- * @param string $value e.g. '/div[@attribute="value"]'
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function byXPath($value)
- {
- return $this->by('xpath', $value);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function element(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $value = $this->postCommand('element', $criteria);
- return PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue(
- $value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- /**
- * @return array instances of PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function elements(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria)
- {
- $values = $this->postCommand('elements', $criteria);
- $elements = array();
- foreach ($values as $value) {
- $elements[] =
- PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue(
- $value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- return $elements;
- }
- /**
- * @param string $strategy
- * @return PHPUnit_Extensions_Selenium2TestCase_ElementCriteria
- */
- public function using($strategy)
- {
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCriteria($strategy);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- protected abstract function getSessionUrl();
- /**
- * @param string $strategy supported by JsonWireProtocol element/ command
- * @param string $value
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- private function by($strategy, $value)
- {
- return $this->element($this->using($strategy)->value($value));
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.2
- */
- /**
- * Object representing a <select> element.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.2
- */
- class PHPUnit_Extensions_Selenium2TestCase_Element_Select
- extends PHPUnit_Extensions_Selenium2TestCase_Element
- {
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element_Select
- */
- public static function fromElement(PHPUnit_Extensions_Selenium2TestCase_Element $element)
- {
- return new self($element->driver, $element->url);
- }
- /**
- * @return string
- */
- public function selectedLabel()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->text();
- }
- /**
- * @return string
- */
- public function selectedValue()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->value();
- }
- /**
- * @return string
- */
- public function selectedId()
- {
- $selectedOption = $this->selectedOption();
- if ($selectedOption === NULL) {
- return '';
- }
- return $selectedOption->attribute('id');
- }
- /**
- * @return array
- */
- public function selectedLabels()
- {
- $labels = array();
- foreach ($this->selectedOptions() as $option) {
- $labels[] = $option->text();
- }
- return $labels;
- }
- /**
- * @return array
- */
- public function selectedValues()
- {
- $values = array();
- foreach ($this->selectedOptions() as $option) {
- $values[] = $option->value();
- }
- return $values;
- }
- /**
- * @return array
- */
- public function selectedIds()
- {
- $id = array();
- foreach ($this->selectedOptions() as $option) {
- $values[] = $option->attribute('id');
- }
- return $id;
- }
- /**
- * @param string $label the text appearing in the option
- * @return void
- */
- public function selectOptionByLabel($label)
- {
- $toSelect = $this->using('xpath')->value(".//option[.='$label']");
- $this->selectOptionByCriteria($toSelect);
- }
- /**
- * @param string $value the value attribute of the option
- * @return void
- */
- public function selectOptionByValue($value)
- {
- $toSelect = $this->using('xpath')->value(".//option[@value='$value']");
- $this->selectOptionByCriteria($toSelect);
- }
- /**
- * @param PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $localCriteria condiotions for selecting an option
- * @return void
- */
- public function selectOptionByCriteria(PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $localCriteria)
- {
- $option = $this->element($localCriteria);
- if (!$option->selected()) {
- $option->click();
- }
- }
- /**
- * @return array
- */
- public function selectOptionValues()
- {
- $options = array();
- foreach ($this->options() as $option) {
- $options[] = $option->value();
- }
- return $options;
- }
- /**
- * @return array
- */
- public function selectOptionLabels()
- {
- $options = array();
- foreach ($this->options() as $option) {
- $options[] = $option->text();
- }
- return $options;
- }
- /***
- * @return array
- */
- private function selectedOptions()
- {
- $options = array();
- foreach ($this->options() as $option) {
- if ($option->selected()) {
- $options[] = $option;
- }
- }
- return $options;
- }
- public function clearSelectedOptions()
- {
- foreach ($this->selectedOptions() as $option) {
- $option->click();
- }
- }
- private function selectedOption()
- {
- foreach ($this->options() as $option) {
- if ($option->selected()) {
- return $option;
- }
- }
- return NULL;
- }
- private function options()
- {
- $onlyTheOptions = $this->using('css selector')->value('option');
- return $this->elements($onlyTheOptions);
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * Browser session for Selenium 2: main point of entry for functionality.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method void acceptAlert() Press OK on an alert, or confirms a dialog
- * @method mixed alertText($value = NULL) Gets the alert dialog text, or sets the text for a prompt dialog
- * @method void back()
- * @method void dismissAlert() Press Cancel on an alert, or does not confirm a dialog
- * @method void doubleclick() Double-clicks at the current mouse coordinates (set by moveto).
- * @method string execute(array $javaScriptCode) Injects arbitrary JavaScript in the page and returns the last. See unit tests for usage
- * @method string executeAsync(array $javaScriptCode) Injects arbitrary JavaScript and wait for the callback (last element of arguments) to be called. See unit tests for usage
- * @method void forward()
- * @method void frame(mixed $element) Changes the focus to a frame in the page (by frameCount of type int, htmlId of type string, htmlName of type string or element of type \PHPUnit_Extensions_Selenium2TestCase_Element)
- * @method void moveto(\PHPUnit_Extensions_Selenium2TestCase_Element $element) Move the mouse by an offset of the specificed element.
- * @method void refresh()
- * @method string source() Returns the HTML source of the page
- * @method string title()
- * @method void|string url($url = NULL)
- * @method void window($name) Changes the focus to another window
- * @method string windowHandle() Retrieves the current window handle
- * @method string windowHandles() Retrieves a list of all available window handles
- * @method string keys() Send a sequence of key strokes to the active element.
- * @method string file($file_path) Upload a local file. Returns the fully qualified path to the transferred file.
- * @method array log(string $type) Get the log for a given log type. Log buffer is reset after each request.
- * @method array logTypes() Get available log types.
- */
- class PHPUnit_Extensions_Selenium2TestCase_Session
- extends PHPUnit_Extensions_Selenium2TestCase_Element_Accessor
- {
- /**
- * @var string the base URL for this session,
- * which all relative URLs will refer to
- */
- private $baseUrl;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts
- */
- private $timeouts;
- /**
- * @var boolean
- */
- private $stopped = FALSE;
- public function __construct($driver,
- PHPUnit_Extensions_Selenium2TestCase_URL $url,
- PHPUnit_Extensions_Selenium2TestCase_URL $baseUrl,
- PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts $timeouts)
- {
- $this->baseUrl = $baseUrl;
- $this->timeouts = $timeouts;
- parent::__construct($driver, $url);
- }
- /**
- * @return string
- */
- public function id()
- {
- return $this->url->lastSegment();
- }
- protected function initCommands()
- {
- $baseUrl = $this->baseUrl;
- return array(
- 'acceptAlert' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AcceptAlert',
- 'alertText' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_AlertText',
- 'back' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'click' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Click',
- 'buttondown' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'buttonup' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'dismissAlert' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_DismissAlert',
- 'doubleclick' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'execute' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'executeAsync' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'forward' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'frame' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Frame',
- 'keys' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Keys',
- 'moveto' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_MoveTo',
- 'refresh' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost',
- 'screenshot' => 'PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericAccessor',
- 'source' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'title' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'log' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Log',
- 'logTypes' => $this->attributeCommandFactoryMethod('log/types'),
- 'url' => function ($jsonParameters, $commandUrl) use ($baseUrl) {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Url($jsonParameters, $commandUrl, $baseUrl);
- },
- 'window' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Window',
- 'windowHandle' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'windowHandles' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAccessor',
- 'touchDown' => $this->touchCommandFactoryMethod('touch/down'),
- 'touchUp' => $this->touchCommandFactoryMethod('touch/up'),
- 'touchMove' => $this->touchCommandFactoryMethod('touch/move'),
- 'touchScroll' => $this->touchCommandFactoryMethod('touch/scroll'),
- 'flick' => $this->touchCommandFactoryMethod('touch/flick'),
- 'location' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Location',
- 'orientation' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Orientation',
- 'file' => 'PHPUnit_Extensions_Selenium2TestCase_SessionCommand_File'
- );
- }
- private function attributeCommandFactoryMethod($urlSegment)
- {
- $url = $this->url->addCommand($urlSegment);
- return function ($jsonParameters, $commandUrl) use ($url) {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_GenericAttribute($jsonParameters, $url);
- };
- }
- private function touchCommandFactoryMethod($urlSegment)
- {
- $url = $this->url->addCommand($urlSegment);
- return function ($jsonParameters, $commandUrl) use ($url) {
- return new PHPUnit_Extensions_Selenium2TestCase_ElementCommand_GenericPost($jsonParameters, $url);
- };
- }
- public function __destruct()
- {
- $this->stop();
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_URL
- */
- public function getSessionUrl()
- {
- return $this->url;
- }
- /**
- * Closed the browser.
- * @return void
- */
- public function stop()
- {
- if ($this->stopped) {
- return;
- }
- try {
- $this->driver->curl('DELETE', $this->url);
- } catch (Exception $e) {
- // sessions which aren't closed because of sharing can time out on the server. In no way trying to close them should make a test fail, as it already finished before arriving here.
- "Closing sessions: " . $e->getMessage() . "\n";
- }
- $this->stopped = TRUE;
- if ($this->stopped) {
- return;
- }
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Element_Select
- */
- public function select(PHPUnit_Extensions_Selenium2TestCase_Element $element)
- {
- $tag = $element->name();
- if ($tag !== 'select') {
- throw new InvalidArgumentException("The element is not a `select` tag but a `$tag`.");
- }
- return PHPUnit_Extensions_Selenium2TestCase_Element_Select::fromElement($element);
- }
- /**
- * @param array WebElement JSON object
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function elementFromResponseValue($value)
- {
- return PHPUnit_Extensions_Selenium2TestCase_Element::fromResponseValue($value, $this->getSessionUrl()->descend('element'), $this->driver);
- }
- /**
- * @param string $id id attribute, e.g. 'container'
- * @return void
- */
- public function clickOnElement($id)
- {
- return $this->element($this->using('id')->value($id))->click();
- }
- public function timeouts()
- {
- return $this->timeouts;
- }
- /**
- * @return string a BLOB of a PNG file
- */
- public function currentScreenshot()
- {
- return base64_decode($this->screenshot());
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Window
- */
- public function currentWindow()
- {
- $url = $this->url->descend('window')->descend(trim($this->windowHandle(), '{}'));
- return new PHPUnit_Extensions_Selenium2TestCase_Window($this->driver, $url);
- }
- public function closeWindow()
- {
- $this->driver->curl('DELETE', $this->url->descend('window'));
- }
- /**
- * Get the element on the page that currently has focus.
- *
- * @return PHPUnit_Extensions_Selenium2TestCase_Element
- */
- public function active()
- {
- $command = new PHPUnit_Extensions_Selenium2TestCase_SessionCommand_Active(null, $this->url);
- $response = $this->driver->execute($command);
- return $this->elementFromResponseValue($response->getValue());
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Cookie
- */
- public function cookie()
- {
- $url = $this->url->descend('cookie');
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Cookie($this->driver, $url);
- }
- /**
- * @return PHPUnit_Extensions_Selenium2TestCase_Session_Storage
- */
- public function localStorage()
- {
- $url = $this->url->addCommand('localStorage');
- return new PHPUnit_Extensions_Selenium2TestCase_Session_Storage($this->driver, $url);
- }
- public function landscape()
- {
- $this->orientation('LANDSCAPE');
- }
- public function portrait()
- {
- $this->orientation('PORTRAIT');
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- // By default the code coverage files are written to the same directory
- // that contains the covered sourcecode files. Use this setting to change
- // the default behaviour and set a specific directory to write the files to.
- // If you change the default setting, please make sure to also configure
- // the same directory in phpunit_coverage.php. Also note that the webserver
- // needs write access to the directory.
- if (!isset($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'])) {
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] = FALSE;
- }
- if ( isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) &&
- !isset($_GET['PHPUNIT_SELENIUM_TEST_ID']) &&
- extension_loaded('xdebug')) {
- $GLOBALS['PHPUNIT_FILTERED_FILES'] = array(__FILE__);
- xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
- }
- include ('ExitHandler.php');
- PHPUnit_Extensions_SeleniumCommon_ExitHandler::init();
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- if ( isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) &&
- !isset($_GET['PHPUNIT_SELENIUM_TEST_ID']) &&
- extension_loaded('xdebug')) {
- $GLOBALS['PHPUNIT_FILTERED_FILES'][] = __FILE__;
- $data = xdebug_get_code_coverage();
- xdebug_stop_code_coverage();
- foreach ($GLOBALS['PHPUNIT_FILTERED_FILES'] as $file) {
- unset($data[$file]);
- }
- if (is_string($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY']) &&
- is_dir($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'])) {
- $file = $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] .
- DIRECTORY_SEPARATOR . md5($_SERVER['SCRIPT_FILENAME']);
- } else {
- $file = $_SERVER['SCRIPT_FILENAME'];
- }
- file_put_contents(
- $name = $file . '.' . md5(uniqid(rand(), TRUE)) . '.' . $_COOKIE['PHPUNIT_SELENIUM_TEST_ID'],
- serialize($data)
- );
- }
- <?php
- class PHPUnit_Extensions_SeleniumCommon_RemoteCoverage
- {
- public function __construct($coverageScriptUrl, $testId)
- {
- $this->coverageScriptUrl = $coverageScriptUrl;
- $this->testId = $testId;
- }
- public function get()
- {
- if (!empty($this->coverageScriptUrl)) {
- $url = sprintf(
- '%s?PHPUNIT_SELENIUM_TEST_ID=%s',
- $this->coverageScriptUrl,
- urlencode($this->testId)
- );
- $buffer = @file_get_contents($url);
- if ($buffer !== FALSE) {
- $coverageData = unserialize($buffer);
- if (is_array($coverageData)) {
- return $this->matchLocalAndRemotePaths($coverageData);
- } else {
- throw new Exception('Empty or invalid code coverage data received from url "' . $url . '"');
- }
- }
- }
- return array();
- }
- /**
- * @param array $coverage
- * @return array
- * @author Mattis Stordalen Flister <mattis@xait.no>
- */
- protected function matchLocalAndRemotePaths(array $coverage)
- {
- $coverageWithLocalPaths = array();
- foreach ($coverage as $originalRemotePath => $data) {
- $remotePath = $originalRemotePath;
- $separator = $this->findDirectorySeparator($remotePath);
- while (!($localpath = stream_resolve_include_path($remotePath)) &&
- strpos($remotePath, $separator) !== FALSE) {
- $remotePath = substr($remotePath, strpos($remotePath, $separator) + 1);
- }
- if ($localpath && md5_file($localpath) == $data['md5']) {
- $coverageWithLocalPaths[$localpath] = $data['coverage'];
- }
- }
- return $coverageWithLocalPaths;
- }
- /**
- * @param string $path
- * @return string
- * @author Mattis Stordalen Flister <mattis@xait.no>
- */
- protected function findDirectorySeparator($path)
- {
- if (strpos($path, '/') !== FALSE) {
- return '/';
- }
- return '\\';
- }
- }
- <?php
- /**
- * If Ececution was stopped by calling exit();
- * php does not append append.php, so no code coverage date is collected
- * We have to add shutdown handler to append this file manualy.
- * @author Arbuzov <info@whitediver.com>
- *
- */
- class PHPUnit_Extensions_SeleniumCommon_ExitHandler
- {
- /**
- * Register handler.
- * If project have own shutdown hanldler user have to add function to handler
- *
- */
- public static function init()
- {
- register_shutdown_function( array( 'PHPUnit_Extensions_SeleniumCommon_ExitHandler', 'handle' ) );
- }
- /**
- * Manual include apendable files
- */
- public static function handle()
- {
- $execFile = ini_get('auto_append_file');
- if ($execFile!=='') {
- include_once ($execFile);
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.0.0
- */
- $directory = realpath(__DIR__);
- while ($directory != '/') {
- $autoloadCandidate = $directory . '/vendor/autoload.php';
- if (file_exists($autoloadCandidate)) {
- require_once $autoloadCandidate;
- break;
- }
- $directory = realpath($directory . '/..');
- }
- // Set this to the directory that contains the code coverage files.
- // It defaults to getcwd(). If you have configured a different directory
- // in prepend.php, you need to configure the same directory here.
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] = getcwd();
- if (isset($_GET['PHPUNIT_SELENIUM_TEST_ID'])) {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray(
- $GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'],
- $_GET['PHPUNIT_SELENIUM_TEST_ID']
- );
- $coverage = array();
- foreach ($files as $file) {
- $data = unserialize(file_get_contents($file));
- unlink($file);
- unset($file);
- $filter = new PHP_CodeCoverage_Filter();
- foreach ($data as $file => $lines) {
- if ($filter->isFile($file)) {
- if (!isset($coverage[$file])) {
- $coverage[$file] = array(
- 'md5' => md5_file($file), 'coverage' => $lines
- );
- } else {
- foreach ($lines as $line => $flag) {
- if (!isset($coverage[$file]['coverage'][$line]) ||
- $flag > $coverage[$file]['coverage'][$line]) {
- $coverage[$file]['coverage'][$line] = $flag;
- }
- }
- }
- }
- }
- }
- print serialize($coverage);
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.6
- */
- /**
- * TestSuite class for a set of tests from a single Testcase Class
- * executed with a particular browser.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.6
- */
- class PHPUnit_Extensions_SeleniumBrowserSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Overriding the default: Selenium suites are always built from a TestCase class.
- * @var boolean
- */
- protected $testCase = TRUE;
- public function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- return parent::addTestMethod($class, $method);
- }
- public static function fromClassAndBrowser($className, array $browser)
- {
- $browserSuite = new self();
- if (isset($browser['browserName'])) {
- $name = $browser['browserName'];
- } else if (isset($browser['name'])) {
- $name = $browser['name'];
- } else {
- $name = $browser['browser'];
- }
- $browserSuite->setName($className . ': ' . $name);
- return $browserSuite;
- }
- public function setupSpecificBrowser(array $browser)
- {
- $this->browserOnAllTests($this, $browser);
- }
- private function browserOnAllTests(PHPUnit_Framework_TestSuite $suite, array $browser)
- {
- foreach ($suite->tests() as $test) {
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- $this->browserOnAllTests($test, $browser);
- } else {
- $test->setupSpecificBrowser($browser);
- }
- }
- }
- }
- <?php
- /**
- * PHPUnit
- *
- * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since File available since Release 1.2.0
- */
- /**
- * TestCase class that uses Selenium 2
- * (WebDriver API and JsonWire protocol) to provide
- * the functionality required for web testing.
- *
- * @package PHPUnit_Selenium
- * @author Giorgio Sironi <info@giorgiosironi.com>
- * @copyright 2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.2.0
- * @method void acceptAlert() Press OK on an alert, or confirms a dialog
- * @method mixed alertText() alertText($value = NULL) Gets the alert dialog text, or sets the text for a prompt dialog
- * @method void back()
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byClassName() byClassName($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byCssSelector() byCssSelector($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byId() byId($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byLinkText() byLinkText($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byName() byName($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byTag() byTag($value)
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element byXPath() byXPath($value)
- * @method void click() click(int $button = 0) Click any mouse button (at the coordinates set by the last moveto command).
- * @method void clickOnElement() clickOnElement($id)
- * @method string currentScreenshot() BLOB of the image file
- * @method void dismissAlert() Press Cancel on an alert, or does not confirm a dialog
- * @method void doubleclick() Double clicks (at the coordinates set by the last moveto command).
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element element() element(\PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria) Retrieves an element
- * @method array elements() elements(\PHPUnit_Extensions_Selenium2TestCase_ElementCriteria $criteria) Retrieves an array of Element instances
- * @method string execute() execute($javaScriptCode) Injects arbitrary JavaScript in the page and returns the last
- * @method string executeAsync() executeAsync($javaScriptCode) Injects arbitrary JavaScript and wait for the callback (last element of arguments) to be called
- * @method void forward()
- * @method void frame() frame(mixed $element) Changes the focus to a frame in the page (by frameCount of type int, htmlId of type string, htmlName of type string or element of type \PHPUnit_Extensions_Selenium2TestCase_Element)
- * @method void moveto() moveto(\PHPUnit_Extensions_Selenium2TestCase_Element $element) Move the mouse by an offset of the specificed element.
- * @method void refresh()
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element_Select select() select($element)
- * @method string source() Returns the HTML source of the page
- * @method \PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts timeouts()
- * @method string title()
- * @method void|string url() url($url = NULL)
- * @method PHPUnit_Extensions_Selenium2TestCase_ElementCriteria using() using($strategy) Factory Method for Criteria objects
- * @method void window() window($name) Changes the focus to another window
- * @method string windowHandle() Retrieves the current window handle
- * @method string windowHandles() Retrieves a list of all available window handles
- * @method string keys() Send a sequence of key strokes to the active element.
- * @method string file($file_path) Upload a local file. Returns the fully qualified path to the transferred file.
- * @method array log(string $type) Get the log for a given log type. Log buffer is reset after each request.
- * @method array logTypes() Get available log types.
- * @method void closeWindow() Close the current window.
- * @method void close() Close the current window and clear session data.
- * @method \PHPUnit_Extensions_Selenium2TestCase_Element active() Get the element on the page that currently has focus.
- */
- abstract class PHPUnit_Extensions_Selenium2TestCase extends PHPUnit_Framework_TestCase
- {
- const VERSION = '1.4.2';
- /**
- * @var string override to provide code coverage data from the server
- */
- protected $coverageScriptUrl;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_Session
- */
- private $session;
- /**
- * @var array
- */
- private $parameters;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected static $sessionStrategy;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected static $browserSessionStrategy;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_SessionStrategy
- */
- protected $localSessionStrategy;
- /**
- * @var array
- */
- private static $lastBrowserParams;
- /**
- * @var string
- */
- private $testId;
- /**
- * @var boolean
- */
- private $collectCodeCoverageInformation;
- /**
- * @var PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- */
- private $keysHolder;
- /**
- * @param boolean
- */
- public static function shareSession($shareSession)
- {
- if (!is_bool($shareSession)) {
- throw new InvalidArgumentException("The shared session support can only be switched on or off.");
- }
- if (!$shareSession) {
- self::$sessionStrategy = self::defaultSessionStrategy();
- } else {
- self::$sessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared(self::defaultSessionStrategy());
- }
- }
- private static function sessionStrategy()
- {
- if (!self::$sessionStrategy) {
- self::$sessionStrategy = self::defaultSessionStrategy();
- }
- return self::$sessionStrategy;
- }
- private static function defaultSessionStrategy()
- {
- return new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated;
- }
- public function __construct($name = NULL, array $data = array(), $dataName = '')
- {
- parent::__construct($name, $data, $dataName);
- $this->parameters = array(
- 'host' => 'localhost',
- 'port' => 4444,
- 'browser' => NULL,
- 'browserName' => NULL,
- 'desiredCapabilities' => array(),
- 'seleniumServerRequestsTimeout' => 60
- );
- $this->keysHolder = new PHPUnit_Extensions_Selenium2TestCase_KeysHolder();
- }
- public function setupSpecificBrowser($params)
- {
- $this->setUpSessionStrategy($params);
- $params = array_merge($this->parameters, $params);
- $this->setHost($params['host']);
- $this->setPort($params['port']);
- $this->setBrowser($params['browserName']);
- $this->parameters['browser'] = $params['browser'];
- $this->setDesiredCapabilities($params['desiredCapabilities']);
- $this->setSeleniumServerRequestsTimeout(
- $params['seleniumServerRequestsTimeout']);
- }
- protected function setUpSessionStrategy($params)
- {
- // This logic enables us to have a session strategy reused for each
- // item in self::$browsers. We don't want them both to share one
- // and we don't want each test for a specific browser to have a
- // new strategy
- if ($params == self::$lastBrowserParams) {
- // do nothing so we use the same session strategy for this
- // browser
- } elseif (isset($params['sessionStrategy'])) {
- $strat = $params['sessionStrategy'];
- if ($strat != "isolated" && $strat != "shared") {
- throw new InvalidArgumentException("Session strategy must be either 'isolated' or 'shared'");
- } elseif ($strat == "isolated") {
- self::$browserSessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated;
- } else {
- self::$browserSessionStrategy = new PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared(self::defaultSessionStrategy());
- }
- } else {
- self::$browserSessionStrategy = self::defaultSessionStrategy();
- }
- self::$lastBrowserParams = $params;
- $this->localSessionStrategy = self::$browserSessionStrategy;
- }
- private function getStrategy()
- {
- if ($this->localSessionStrategy) {
- return $this->localSessionStrategy;
- } else {
- return self::sessionStrategy();
- }
- }
- public function prepareSession()
- {
- try {
- if (!$this->session) {
- $this->session = $this->getStrategy()->session($this->parameters);
- }
- } catch (PHPUnit_Extensions_Selenium2TestCase_NoSeleniumException $e) {
- $this->markTestSkipped("The Selenium Server is not active on host {$this->parameters['host']} at port {$this->parameters['port']}.");
- }
- return $this->session;
- }
- public function run(PHPUnit_Framework_TestResult $result = NULL)
- {
- $this->testId = get_class($this) . '__' . $this->getName();
- if ($result === NULL) {
- $result = $this->createResult();
- }
- $this->collectCodeCoverageInformation = $result->getCollectCodeCoverageInformation();
- parent::run($result);
- if ($this->collectCodeCoverageInformation) {
- $coverage = new PHPUnit_Extensions_SeleniumCommon_RemoteCoverage(
- $this->coverageScriptUrl,
- $this->testId
- );
- $result->getCodeCoverage()->append(
- $coverage->get(), $this
- );
- }
- // do not call this before to give the time to the Listeners to run
- $this->getStrategy()->endOfTest($this->session);
- return $result;
- }
- /**
- * @throws RuntimeException
- */
- protected function runTest()
- {
- $this->prepareSession();
- $thrownException = NULL;
- if ($this->collectCodeCoverageInformation) {
- $this->url($this->coverageScriptUrl); // phpunit_coverage.php won't do anything if the cookie isn't set, which is exactly what we want
- $this->session->cookie()->add('PHPUNIT_SELENIUM_TEST_ID', $this->testId)->set();
- }
- try {
- $this->setUpPage();
- $result = parent::runTest();
- if (!empty($this->verificationErrors)) {
- $this->fail(implode("\n", $this->verificationErrors));
- }
- } catch (Exception $e) {
- $thrownException = $e;
- }
-
- if ($this->collectCodeCoverageInformation) {
- $this->session->cookie()->remove('PHPUNIT_SELENIUM_TEST_ID');
- }
- if (NULL !== $thrownException) {
- throw $thrownException;
- }
- return $result;
- }
- public static function suite($className)
- {
- return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
- }
- public function onNotSuccessfulTest(Exception $e)
- {
- $this->getStrategy()->notSuccessfulTest();
- parent::onNotSuccessfulTest($e);
- }
- /**
- * Delegate method calls to the Session.
- *
- * @param string $command
- * @param array $arguments
- * @return mixed
- */
- public function __call($command, $arguments)
- {
- if ($this->session === NULL) {
- throw new PHPUnit_Extensions_Selenium2TestCase_Exception("There is currently no active session to execute the '$command' command. You're probably trying to set some option in setUp() with an incorrect setter name. You may consider using setUpPage() instead.");
- }
- $result = call_user_func_array(
- array($this->session, $command), $arguments
- );
- return $result;
- }
- /**
- * @param string $host
- * @throws InvalidArgumentException
- */
- public function setHost($host)
- {
- if (!is_string($host)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['host'] = $host;
- }
- public function getHost()
- {
- return $this->parameters['host'];
- }
- /**
- * @param integer $port
- * @throws InvalidArgumentException
- */
- public function setPort($port)
- {
- if (!is_int($port)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->parameters['port'] = $port;
- }
- public function getPort()
- {
- return $this->parameters['port'];
- }
- /**
- * @param string $browser
- * @throws InvalidArgumentException
- */
- public function setBrowser($browserName)
- {
- if (!is_string($browserName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['browserName'] = $browserName;
- }
- public function getBrowser()
- {
- return $this->parameters['browserName'];
- }
- /**
- * @param string $browserUrl
- * @throws InvalidArgumentException
- */
- public function setBrowserUrl($browserUrl)
- {
- if (!is_string($browserUrl)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $this->parameters['browserUrl'] = new PHPUnit_Extensions_Selenium2TestCase_URL($browserUrl);
- }
- public function getBrowserUrl()
- {
- if (isset($this->parameters['browserUrl'])) {
- return $this->parameters['browserUrl'];
- }
- return '';
- }
- /**
- * @see http://code.google.com/p/selenium/wiki/JsonWireProtocol
- */
- public function setDesiredCapabilities(array $capabilities)
- {
- $this->parameters['desiredCapabilities'] = $capabilities;
- }
- public function getDesiredCapabilities()
- {
- return $this->parameters['desiredCapabilities'];
- }
- /**
- * @param int $timeout seconds
- */
- public function setSeleniumServerRequestsTimeout($timeout)
- {
- $this->parameters['seleniumServerRequestsTimeout'] = $timeout;
- }
- public function getSeleniumServerRequestsTimeout()
- {
- return $this->parameters['seleniumServerRequestsTimeout'];
- }
- /**
- * Get test id (generated internally)
- * @return string
- */
- public function getTestId()
- {
- return $this->testId;
- }
- /**
- * Get Selenium2 current session id
- * @return string
- */
- public function getSessionId()
- {
- if ($this->session) {
- return $this->session->id();
- }
- return FALSE;
- }
- /**
- * Wait until callback isn't null or timeout occurs
- *
- * @param $callback
- * @param null $timeout
- * @return mixed
- */
- public function waitUntil($callback, $timeout = NULL)
- {
- $waitUntil = new PHPUnit_Extensions_Selenium2TestCase_WaitUntil($this);
- return $waitUntil->run($callback, $timeout);
- }
- /**
- * Sends a special key
- * Deprecated due to issues with IE webdriver. Use keys() method instead
- * @deprecated
- * @param string $name
- * @throws PHPUnit_Extensions_Selenium2TestCase_Exception
- * @see PHPUnit_Extensions_Selenium2TestCase_KeysHolder
- */
- public function keysSpecial($name)
- {
- $names = explode(',', $name);
- foreach ($names as $key) {
- $this->keys($this->keysHolder->specialKey(trim($key)));
- }
- }
- /**
- * setUp method that is called after the session has been prepared.
- * It is possible to use session-specific commands like url() here.
- */
- public function setUpPage()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Util
- {
- /**
- * @param float $a
- * @param float $b
- * @return float ($a / $b) * 100
- */
- public static function percent($a, $b, $asString = false, $fixedWidth = false)
- {
- if ($asString && $b == 0) {
- return '';
- }
- if ($b > 0) {
- $percent = ($a / $b) * 100;
- } else {
- $percent = 100;
- }
- if ($asString) {
- if ($fixedWidth) {
- return sprintf('%6.2F%%', $percent);
- }
- return sprintf('%01.2F%%', $percent);
- } else {
- return $percent;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception class for PHP_CodeCoverage component.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Exception extends RuntimeException
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Base class for PHP_CodeCoverage_Report_Node renderers.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- abstract class PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @var string
- */
- protected $templatePath;
- /**
- * @var string
- */
- protected $generator;
- /**
- * @var string
- */
- protected $date;
- /**
- * @var integer
- */
- protected $lowUpperBound;
- /**
- * @var integer
- */
- protected $highLowerBound;
- /**
- * @var string
- */
- protected $version;
- /**
- * Constructor.
- *
- * @param string $templatePath
- * @param string $generator
- * @param string $date
- * @param integer $lowUpperBound
- * @param integer $highLowerBound
- */
- public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound)
- {
- $version = new SebastianBergmann\Version('2.1.3', dirname(dirname(dirname(dirname(__DIR__)))));
- $this->templatePath = $templatePath;
- $this->generator = $generator;
- $this->date = $date;
- $this->lowUpperBound = $lowUpperBound;
- $this->highLowerBound = $highLowerBound;
- $this->version = $version->getVersion();
- }
- /**
- * @param Text_Template $template
- * @param array $data
- * @return string
- */
- protected function renderItemTemplate(Text_Template $template, array $data)
- {
- $numSeparator = ' / ';
- $classesBar = ' ';
- $classesLevel = 'None';
- $classesNumber = ' ';
- if (isset($data['numClasses']) && $data['numClasses'] > 0) {
- $classesLevel = $this->getColorLevel($data['testedClassesPercent']);
- $classesNumber = $data['numTestedClasses'] . $numSeparator .
- $data['numClasses'];
- $classesBar = $this->getCoverageBar(
- $data['testedClassesPercent']
- );
- }
- $methodsBar = ' ';
- $methodsLevel = 'None';
- $methodsNumber = ' ';
- if ($data['numMethods'] > 0) {
- $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']);
- $methodsNumber = $data['numTestedMethods'] . $numSeparator .
- $data['numMethods'];
- $methodsBar = $this->getCoverageBar(
- $data['testedMethodsPercent']
- );
- }
- $linesBar = ' ';
- $linesLevel = 'None';
- $linesNumber = ' ';
- if ($data['numExecutableLines'] > 0) {
- $linesLevel = $this->getColorLevel($data['linesExecutedPercent']);
- $linesNumber = $data['numExecutedLines'] . $numSeparator .
- $data['numExecutableLines'];
- $linesBar = $this->getCoverageBar(
- $data['linesExecutedPercent']
- );
- }
- $template->setVar(
- array(
- 'icon' => isset($data['icon']) ? $data['icon'] : '',
- 'crap' => isset($data['crap']) ? $data['crap'] : '',
- 'name' => $data['name'],
- 'lines_bar' => $linesBar,
- 'lines_executed_percent' => $data['linesExecutedPercentAsString'],
- 'lines_level' => $linesLevel,
- 'lines_number' => $linesNumber,
- 'methods_bar' => $methodsBar,
- 'methods_tested_percent' => $data['testedMethodsPercentAsString'],
- 'methods_level' => $methodsLevel,
- 'methods_number' => $methodsNumber,
- 'classes_bar' => $classesBar,
- 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '',
- 'classes_level' => $classesLevel,
- 'classes_number' => $classesNumber
- )
- );
- return $template->render();
- }
- /**
- * @param Text_Template $template
- * @param PHP_CodeCoverage_Report_Node $node
- */
- protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node)
- {
- $runtime = new Runtime;
- $template->setVar(
- array(
- 'id' => $node->getId(),
- 'full_path' => $node->getPath(),
- 'path_to_root' => $this->getPathToRoot($node),
- 'breadcrumbs' => $this->getBreadcrumbs($node),
- 'date' => $this->date,
- 'version' => $this->version,
- 'runtime_name' => $runtime->getName(),
- 'runtime_version' => $runtime->getVersion(),
- 'runtime_link' => $runtime->getVendorUrl(),
- 'generator' => $this->generator,
- 'low_upper_bound' => $this->lowUpperBound,
- 'high_lower_bound' => $this->highLowerBound
- )
- );
- }
- protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node)
- {
- $breadcrumbs = '';
- $path = $node->getPathAsArray();
- $pathToRoot = array();
- $max = count($path);
- if ($node instanceof PHP_CodeCoverage_Report_Node_File) {
- $max--;
- }
- for ($i = 0; $i < $max; $i++) {
- $pathToRoot[] = str_repeat('../', $i);
- }
- foreach ($path as $step) {
- if ($step !== $node) {
- $breadcrumbs .= $this->getInactiveBreadcrumb(
- $step,
- array_pop($pathToRoot)
- );
- } else {
- $breadcrumbs .= $this->getActiveBreadcrumb($step);
- }
- }
- return $breadcrumbs;
- }
- protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node)
- {
- $buffer = sprintf(
- ' <li class="active">%s</li>' . "\n",
- $node->getName()
- );
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $buffer .= ' <li>(<a href="dashboard.html">Dashboard</a>)</li>' . "\n";
- }
- return $buffer;
- }
- protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pathToRoot)
- {
- return sprintf(
- ' <li><a href="%sindex.html">%s</a></li>' . "\n",
- $pathToRoot,
- $node->getName()
- );
- }
- protected function getPathToRoot(PHP_CodeCoverage_Report_Node $node)
- {
- $id = $node->getId();
- $depth = substr_count($id, '/');
- if ($id != 'index' &&
- $node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $depth++;
- }
- return str_repeat('../', $depth);
- }
- protected function getCoverageBar($percent)
- {
- $level = $this->getColorLevel($percent);
- $template = new Text_Template(
- $this->templatePath . 'coverage_bar.html',
- '{{',
- '}}'
- );
- $template->setVar(array('level' => $level, 'percent' => sprintf("%.2F", $percent)));
- return $template->render();
- }
- /**
- * @param integer $percent
- * @return string
- */
- protected function getColorLevel($percent)
- {
- if ($percent <= $this->lowUpperBound) {
- return 'danger';
- } elseif ($percent > $this->lowUpperBound &&
- $percent < $this->highLowerBound) {
- return 'warning';
- } else {
- return 'success';
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
- {
- $classes = $node->getClassesAndTraits();
- $template = new Text_Template(
- $this->templatePath . 'dashboard.html',
- '{{',
- '}}'
- );
- $this->setCommonTemplateVariables($template, $node);
- $baseLink = $node->getId() . '/';
- $complexity = $this->complexity($classes, $baseLink);
- $coverageDistribution = $this->coverageDistribution($classes);
- $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink);
- $projectRisks = $this->projectRisks($classes, $baseLink);
- $template->setVar(
- array(
- 'insufficient_coverage_classes' => $insufficientCoverage['class'],
- 'insufficient_coverage_methods' => $insufficientCoverage['method'],
- 'project_risks_classes' => $projectRisks['class'],
- 'project_risks_methods' => $projectRisks['method'],
- 'complexity_class' => $complexity['class'],
- 'complexity_method' => $complexity['method'],
- 'class_coverage_distribution' => $coverageDistribution['class'],
- 'method_coverage_distribution' => $coverageDistribution['method']
- )
- );
- $template->renderTo($file);
- }
- /**
- * Returns the data for the Class/Method Complexity charts.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function complexity(array $classes, $baseLink)
- {
- $result = array('class' => array(), 'method' => array());
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($className != '*') {
- $methodName = $className . '::' . $methodName;
- }
- $result['method'][] = array(
- $method['coverage'],
- $method['ccn'],
- sprintf(
- '<a href="%s">%s</a>',
- str_replace($baseLink, '', $method['link']),
- $methodName
- )
- );
- }
- $result['class'][] = array(
- $class['coverage'],
- $class['ccn'],
- sprintf(
- '<a href="%s">%s</a>',
- str_replace($baseLink, '', $class['link']),
- $className
- )
- );
- }
- return array(
- 'class' => json_encode($result['class']),
- 'method' => json_encode($result['method'])
- );
- }
- /**
- * Returns the data for the Class / Method Coverage Distribution chart.
- *
- * @param array $classes
- * @return array
- */
- protected function coverageDistribution(array $classes)
- {
- $result = array(
- 'class' => array(
- '0%' => 0,
- '0-10%' => 0,
- '10-20%' => 0,
- '20-30%' => 0,
- '30-40%' => 0,
- '40-50%' => 0,
- '50-60%' => 0,
- '60-70%' => 0,
- '70-80%' => 0,
- '80-90%' => 0,
- '90-100%' => 0,
- '100%' => 0
- ),
- 'method' => array(
- '0%' => 0,
- '0-10%' => 0,
- '10-20%' => 0,
- '20-30%' => 0,
- '30-40%' => 0,
- '40-50%' => 0,
- '50-60%' => 0,
- '60-70%' => 0,
- '70-80%' => 0,
- '80-90%' => 0,
- '90-100%' => 0,
- '100%' => 0
- )
- );
- foreach ($classes as $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] == 0) {
- $result['method']['0%']++;
- } elseif ($method['coverage'] == 100) {
- $result['method']['100%']++;
- } else {
- $key = floor($method['coverage'] / 10) * 10;
- $key = $key . '-' . ($key + 10) . '%';
- $result['method'][$key]++;
- }
- }
- if ($class['coverage'] == 0) {
- $result['class']['0%']++;
- } elseif ($class['coverage'] == 100) {
- $result['class']['100%']++;
- } else {
- $key = floor($class['coverage'] / 10) * 10;
- $key = $key . '-' . ($key + 10) . '%';
- $result['class'][$key]++;
- }
- }
- return array(
- 'class' => json_encode(array_values($result['class'])),
- 'method' => json_encode(array_values($result['method']))
- );
- }
- /**
- * Returns the classes / methods with insufficient coverage.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function insufficientCoverage(array $classes, $baseLink)
- {
- $leastTestedClasses = array();
- $leastTestedMethods = array();
- $result = array('class' => '', 'method' => '');
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] < $this->highLowerBound) {
- if ($className != '*') {
- $key = $className . '::' . $methodName;
- } else {
- $key = $methodName;
- }
- $leastTestedMethods[$key] = $method['coverage'];
- }
- }
- if ($class['coverage'] < $this->highLowerBound) {
- $leastTestedClasses[$className] = $class['coverage'];
- }
- }
- asort($leastTestedClasses);
- asort($leastTestedMethods);
- foreach ($leastTestedClasses as $className => $coverage) {
- $result['class'] .= sprintf(
- ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d%%</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$className]['link']),
- $className,
- $coverage
- );
- }
- foreach ($leastTestedMethods as $methodName => $coverage) {
- list($class, $method) = explode('::', $methodName);
- $result['method'] .= sprintf(
- ' <tr><td><a href="%s"><abbr title="%s">%s</a></a></td><td class="text-right">%d%%</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']),
- $methodName,
- $method,
- $coverage
- );
- }
- return $result;
- }
- /**
- * Returns the project risks according to the CRAP index.
- *
- * @param array $classes
- * @param string $baseLink
- * @return array
- */
- protected function projectRisks(array $classes, $baseLink)
- {
- $classRisks = array();
- $methodRisks = array();
- $result = array('class' => '', 'method' => '');
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['coverage'] < $this->highLowerBound &&
- $method['ccn'] > 1) {
- if ($className != '*') {
- $key = $className . '::' . $methodName;
- } else {
- $key = $methodName;
- }
- $methodRisks[$key] = $method['crap'];
- }
- }
- if ($class['coverage'] < $this->highLowerBound &&
- $class['ccn'] > count($class['methods'])) {
- $classRisks[$className] = $class['crap'];
- }
- }
- arsort($classRisks);
- arsort($methodRisks);
- foreach ($classRisks as $className => $crap) {
- $result['class'] .= sprintf(
- ' <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$className]['link']),
- $className,
- $crap
- );
- }
- foreach ($methodRisks as $methodName => $crap) {
- list($class, $method) = explode('::', $methodName);
- $result['method'] .= sprintf(
- ' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n",
- str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']),
- $methodName,
- $method,
- $crap
- );
- }
- return $result;
- }
- protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node)
- {
- return sprintf(
- ' <li><a href="index.html">%s</a></li>' . "\n" .
- ' <li class="active">(Dashboard)</li>' . "\n",
- $node->getName()
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- // @codeCoverageIgnoreStart
- if (!defined('T_TRAIT')) {
- define('T_TRAIT', 1001);
- }
- if (!defined('T_INSTEADOF')) {
- define('T_INSTEADOF', 1002);
- }
- if (!defined('T_CALLABLE')) {
- define('T_CALLABLE', 1003);
- }
- if (!defined('T_FINALLY')) {
- define('T_FINALLY', 1004);
- }
- if (!defined('T_YIELD')) {
- define('T_YIELD', 1005);
- }
- // @codeCoverageIgnoreEnd
- /**
- * Renders a PHP_CodeCoverage_Report_Node_File node.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @var integer
- */
- private $htmlspecialcharsFlags;
- /**
- * Constructor.
- *
- * @param string $templatePath
- * @param string $generator
- * @param string $date
- * @param integer $lowUpperBound
- * @param integer $highLowerBound
- */
- public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound)
- {
- parent::__construct(
- $templatePath,
- $generator,
- $date,
- $lowUpperBound,
- $highLowerBound
- );
- $this->htmlspecialcharsFlags = ENT_COMPAT;
- if (defined('ENT_SUBSTITUTE')) {
- $this->htmlspecialcharsFlags = $this->htmlspecialcharsFlags | ENT_HTML401 | ENT_SUBSTITUTE;
- }
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_File $node, $file)
- {
- $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}');
- $template->setVar(
- array(
- 'items' => $this->renderItems($node),
- 'lines' => $this->renderSource($node)
- )
- );
- $this->setCommonTemplateVariables($template, $node);
- $template->renderTo($file);
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @return string
- */
- protected function renderItems(PHP_CodeCoverage_Report_Node_File $node)
- {
- $template = new Text_Template($this->templatePath . 'file_item.html', '{{', '}}');
- $methodItemTemplate = new Text_Template(
- $this->templatePath . 'method_item.html',
- '{{',
- '}}'
- );
- $items = $this->renderItemTemplate(
- $template,
- array(
- 'name' => 'Total',
- 'numClasses' => $node->getNumClassesAndTraits(),
- 'numTestedClasses' => $node->getNumTestedClassesAndTraits(),
- 'numMethods' => $node->getNumMethods(),
- 'numTestedMethods' => $node->getNumTestedMethods(),
- 'linesExecutedPercent' => $node->getLineExecutedPercent(false),
- 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(),
- 'numExecutedLines' => $node->getNumExecutedLines(),
- 'numExecutableLines' => $node->getNumExecutableLines(),
- 'testedMethodsPercent' => $node->getTestedMethodsPercent(false),
- 'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(),
- 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false),
- 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(),
- 'crap' => '<abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr>'
- )
- );
- $items .= $this->renderFunctionItems(
- $node->getFunctions(),
- $methodItemTemplate
- );
- $items .= $this->renderTraitOrClassItems(
- $node->getTraits(),
- $template,
- $methodItemTemplate
- );
- $items .= $this->renderTraitOrClassItems(
- $node->getClasses(),
- $template,
- $methodItemTemplate
- );
- return $items;
- }
- /**
- * @param array $items
- * @param Text_Template $template
- * @param Text_Template $methodItemTemplate
- * @return string
- */
- protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate)
- {
- if (empty($items)) {
- return '';
- }
- $buffer = '';
- foreach ($items as $name => $item) {
- $numMethods = count($item['methods']);
- $numTestedMethods = 0;
- foreach ($item['methods'] as $method) {
- if ($method['executedLines'] == $method['executableLines']) {
- $numTestedMethods++;
- }
- }
- $buffer .= $this->renderItemTemplate(
- $template,
- array(
- 'name' => $name,
- 'numClasses' => 1,
- 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0,
- 'numMethods' => $numMethods,
- 'numTestedMethods' => $numTestedMethods,
- 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- false
- ),
- 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- true
- ),
- 'numExecutedLines' => $item['executedLines'],
- 'numExecutableLines' => $item['executableLines'],
- 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods,
- $numMethods,
- false
- ),
- 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods,
- $numMethods,
- true
- ),
- 'testedClassesPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods == $numMethods ? 1 : 0,
- 1,
- false
- ),
- 'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedMethods == $numMethods ? 1 : 0,
- 1,
- true
- ),
- 'crap' => $item['crap']
- )
- );
- foreach ($item['methods'] as $method) {
- $buffer .= $this->renderFunctionOrMethodItem(
- $methodItemTemplate,
- $method,
- ' '
- );
- }
- }
- return $buffer;
- }
- /**
- * @param array $functions
- * @param Text_Template $template
- * @return string
- */
- protected function renderFunctionItems(array $functions, Text_Template $template)
- {
- if (empty($functions)) {
- return '';
- }
- $buffer = '';
- foreach ($functions as $function) {
- $buffer .= $this->renderFunctionOrMethodItem(
- $template,
- $function
- );
- }
- return $buffer;
- }
- /**
- * @param Text_Template $template
- * @return string
- */
- protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '')
- {
- $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0;
- return $this->renderItemTemplate(
- $template,
- array(
- 'name' => sprintf(
- '%s<a href="#%d"><abbr title="%s">%s</abbr></a>',
- $indent,
- $item['startLine'],
- htmlspecialchars($item['signature']),
- isset($item['functionName']) ? $item['functionName'] : $item['methodName']
- ),
- 'numMethods' => 1,
- 'numTestedMethods' => $numTestedItems,
- 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- false
- ),
- 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
- $item['executedLines'],
- $item['executableLines'],
- true
- ),
- 'numExecutedLines' => $item['executedLines'],
- 'numExecutableLines' => $item['executableLines'],
- 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent(
- $numTestedItems,
- 1,
- false
- ),
- 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
- $numTestedItems,
- 1,
- true
- ),
- 'crap' => $item['crap']
- )
- );
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_File $node
- * @return string
- */
- protected function renderSource(PHP_CodeCoverage_Report_Node_File $node)
- {
- $coverageData = $node->getCoverageData();
- $testData = $node->getTestData();
- $codeLines = $this->loadFile($node->getPath());
- $lines = '';
- $i = 1;
- foreach ($codeLines as $line) {
- $trClass = '';
- $popoverContent = '';
- $popoverTitle = '';
- if (array_key_exists($i, $coverageData)) {
- $numTests = count($coverageData[$i]);
- if ($coverageData[$i] === null) {
- $trClass = ' class="warning"';
- } elseif ($numTests == 0) {
- $trClass = ' class="danger"';
- } else {
- $lineCss = 'covered-by-large-tests';
- $popoverContent = '<ul>';
- if ($numTests > 1) {
- $popoverTitle = $numTests . ' tests cover line ' . $i;
- } else {
- $popoverTitle = '1 test covers line ' . $i;
- }
- foreach ($coverageData[$i] as $test) {
- if ($lineCss == 'covered-by-large-tests' && $testData[$test]['size'] == 'medium') {
- $lineCss = 'covered-by-medium-tests';
- } elseif ($testData[$test]['size'] == 'small') {
- $lineCss = 'covered-by-small-tests';
- }
- switch ($testData[$test]['status']) {
- case 0:
- switch ($testData[$test]['size']) {
- case 'small':
- $testCSS = ' class="covered-by-small-tests"';
- break;
- case 'medium':
- $testCSS = ' class="covered-by-medium-tests"';
- break;
- default:
- $testCSS = ' class="covered-by-large-tests"';
- break;
- }
- break;
- case 1:
- case 2:
- $testCSS = ' class="warning"';
- break;
- case 3:
- $testCSS = ' class="danger"';
- break;
- case 4:
- $testCSS = ' class="danger"';
- break;
- default:
- $testCSS = '';
- }
- $popoverContent .= sprintf(
- '<li%s>%s</li>',
- $testCSS,
- htmlspecialchars($test)
- );
- }
- $popoverContent .= '</ul>';
- $trClass = ' class="' . $lineCss . ' popin"';
- }
- }
- if (!empty($popoverTitle)) {
- $popover = sprintf(
- ' data-title="%s" data-content="%s" data-placement="bottom" data-html="true"',
- $popoverTitle,
- htmlspecialchars($popoverContent)
- );
- } else {
- $popover = '';
- }
- $lines .= sprintf(
- ' <tr%s%s><td><div align="right"><a name="%d"></a><a href="#%d">%d</a></div></td><td class="codeLine">%s</td></tr>' . "\n",
- $trClass,
- $popover,
- $i,
- $i,
- $i,
- $line
- );
- $i++;
- }
- return $lines;
- }
- /**
- * @param string $file
- * @return array
- */
- protected function loadFile($file)
- {
- $buffer = file_get_contents($file);
- $tokens = token_get_all($buffer);
- $result = array('');
- $i = 0;
- $stringFlag = false;
- $fileEndsWithNewLine = substr($buffer, -1) == "\n";
- unset($buffer);
- foreach ($tokens as $j => $token) {
- if (is_string($token)) {
- if ($token === '"' && $tokens[$j - 1] !== '\\') {
- $result[$i] .= sprintf(
- '<span class="string">%s</span>',
- htmlspecialchars($token)
- );
- $stringFlag = !$stringFlag;
- } else {
- $result[$i] .= sprintf(
- '<span class="keyword">%s</span>',
- htmlspecialchars($token)
- );
- }
- continue;
- }
- list ($token, $value) = $token;
- $value = str_replace(
- array("\t", ' '),
- array(' ', ' '),
- htmlspecialchars($value, $this->htmlspecialcharsFlags)
- );
- if ($value === "\n") {
- $result[++$i] = '';
- } else {
- $lines = explode("\n", $value);
- foreach ($lines as $jj => $line) {
- $line = trim($line);
- if ($line !== '') {
- if ($stringFlag) {
- $colour = 'string';
- } else {
- switch ($token) {
- case T_INLINE_HTML:
- $colour = 'html';
- break;
- case T_COMMENT:
- case T_DOC_COMMENT:
- $colour = 'comment';
- break;
- case T_ABSTRACT:
- case T_ARRAY:
- case T_AS:
- case T_BREAK:
- case T_CALLABLE:
- case T_CASE:
- case T_CATCH:
- case T_CLASS:
- case T_CLONE:
- case T_CONTINUE:
- case T_DEFAULT:
- case T_ECHO:
- case T_ELSE:
- case T_ELSEIF:
- case T_EMPTY:
- case T_ENDDECLARE:
- case T_ENDFOR:
- case T_ENDFOREACH:
- case T_ENDIF:
- case T_ENDSWITCH:
- case T_ENDWHILE:
- case T_EXIT:
- case T_EXTENDS:
- case T_FINAL:
- case T_FINALLY:
- case T_FOREACH:
- case T_FUNCTION:
- case T_GLOBAL:
- case T_IF:
- case T_IMPLEMENTS:
- case T_INCLUDE:
- case T_INCLUDE_ONCE:
- case T_INSTANCEOF:
- case T_INSTEADOF:
- case T_INTERFACE:
- case T_ISSET:
- case T_LOGICAL_AND:
- case T_LOGICAL_OR:
- case T_LOGICAL_XOR:
- case T_NAMESPACE:
- case T_NEW:
- case T_PRIVATE:
- case T_PROTECTED:
- case T_PUBLIC:
- case T_REQUIRE:
- case T_REQUIRE_ONCE:
- case T_RETURN:
- case T_STATIC:
- case T_THROW:
- case T_TRAIT:
- case T_TRY:
- case T_UNSET:
- case T_USE:
- case T_VAR:
- case T_WHILE:
- case T_YIELD:
- $colour = 'keyword';
- break;
- default:
- $colour = 'default';
- }
- }
- $result[$i] .= sprintf(
- '<span class="%s">%s</span>',
- $colour,
- $line
- );
- }
- if (isset($lines[$jj + 1])) {
- $result[++$i] = '';
- }
- }
- }
- }
- if ($fileEndsWithNewLine) {
- unset($result[count($result)-1]);
- }
- return $result;
- }
- }
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Dashboard for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/nv.d3.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <h2>Classes</h2>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Coverage Distribution</h3>
- <div id="classCoverageDistribution" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Complexity</h3>
- <div id="classComplexity" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Insufficient Coverage</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Class</th>
- <th class="text-right">Coverage</th>
- </tr>
- </thead>
- <tbody>
- {{insufficient_coverage_classes}}
- </tbody>
- </table>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Project Risks</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Class</th>
- <th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
- </tr>
- </thead>
- <tbody>
- {{project_risks_classes}}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <h2>Methods</h2>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Coverage Distribution</h3>
- <div id="methodCoverageDistribution" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Complexity</h3>
- <div id="methodComplexity" style="height: 300px;">
- <svg></svg>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-md-6">
- <h3>Insufficient Coverage</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Method</th>
- <th class="text-right">Coverage</th>
- </tr>
- </thead>
- <tbody>
- {{insufficient_coverage_methods}}
- </tbody>
- </table>
- </div>
- </div>
- <div class="col-md-6">
- <h3>Project Risks</h3>
- <div class="scrollbox">
- <table class="table">
- <thead>
- <tr>
- <th>Method</th>
- <th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
- </tr>
- </thead>
- <tbody>
- {{project_risks_methods}}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <footer>
- <hr/>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/d3.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/nv.d3.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- nv.addGraph(function() {
- var chart = nv.models.multiBarChart();
- chart.tooltips(false)
- .showControls(false)
- .showLegend(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .yAxis.tickFormat(d3.format('d'));
- d3.select('#classCoverageDistribution svg')
- .datum(getCoverageDistributionData({{class_coverage_distribution}}, "Class Coverage"))
- .transition().duration(500).call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- nv.addGraph(function() {
- var chart = nv.models.multiBarChart();
- chart.tooltips(false)
- .showControls(false)
- .showLegend(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .yAxis.tickFormat(d3.format('d'));
- d3.select('#methodCoverageDistribution svg')
- .datum(getCoverageDistributionData({{method_coverage_distribution}}, "Method Coverage"))
- .transition().duration(500).call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- function getCoverageDistributionData(data, label) {
- var labels = [
- '0%',
- '0-10%',
- '10-20%',
- '20-30%',
- '30-40%',
- '40-50%',
- '50-60%',
- '60-70%',
- '70-80%',
- '80-90%',
- '90-100%',
- '100%'
- ];
- var values = [];
- $.each(labels, function(key) {
- values.push({x: labels[key], y: data[key]});
- });
- return [
- {
- key: label,
- values: values,
- color: "#4572A7"
- }
- ];
- }
- nv.addGraph(function() {
- var chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .showLegend(false)
- .forceX([0, 100]);
- chart.scatter.onlyCircles(false);
- chart.tooltipContent(function(key, y, e, graph) {
- return '<p>' + graph.point.class + '</p>';
- });
- chart.xAxis.axisLabel('Code Coverage (in percent)');
- chart.yAxis.axisLabel('Cyclomatic Complexity');
- d3.select('#classComplexity svg')
- .datum(getComplexityData({{complexity_class}}, 'Class Complexity'))
- .transition()
- .duration(500)
- .call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- nv.addGraph(function() {
- var chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .showLegend(false)
- .forceX([0, 100]);
- chart.scatter.onlyCircles(false);
- chart.tooltipContent(function(key, y, e, graph) {
- return '<p>' + graph.point.class + '</p>';
- });
- chart.xAxis.axisLabel('Code Coverage (in percent)');
- chart.yAxis.axisLabel('Method Complexity');
- d3.select('#methodComplexity svg')
- .datum(getComplexityData({{complexity_method}}, 'Method Complexity'))
- .transition()
- .duration(500)
- .call(chart);
- nv.utils.windowResize(chart.update);
- return chart;
- });
- function getComplexityData(data, label) {
- var values = [];
- $.each(data, function(key) {
- var value = Math.round(data[key][0]*100) / 100;
- values.push({
- x: value,
- y: data[key][1],
- class: data[key][2],
- size: 0.05,
- shape: 'diamond'
- });
- });
- return [
- {
- key: label,
- values: values,
- color: "#4572A7"
- }
- ];
- }
- });
- </script>
- </body>
- </html>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Code Coverage for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <table class="table table-bordered">
- <thead>
- <tr>
- <td> </td>
- <td colspan="9"><div align="center"><strong>Code Coverage</strong></div></td>
- </tr>
- <tr>
- <td> </td>
- <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
- <td colspan="3"><div align="center"><strong>Functions and Methods</strong></div></td>
- <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
- </tr>
- </thead>
- <tbody>
- {{items}}
- </tbody>
- </table>
- <footer>
- <hr/>
- <h4>Legend</h4>
- <p>
- <span class="danger"><strong>Low</strong>: 0% to {{low_upper_bound}}%</span>
- <span class="warning"><strong>Medium</strong>: {{low_upper_bound}}% to {{high_lower_bound}}%</span>
- <span class="success"><strong>High</strong>: {{high_lower_bound}}% to 100%</span>
- </p>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- </body>
- </html>
- <div class="progress">
- <div class="progress-bar progress-bar-{{level}}" role="progressbar" aria-valuenow="{{percent}}" aria-valuemin="0" aria-valuemax="100" style="width: {{percent}}%">
- <span class="sr-only">{{percent}}% covered ({{level}})</span>
- </div>
- </div>
- /*!
- * Bootstrap v3.3.4 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
- if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
- var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new l;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){ta.event.preventDefault()}function k(){for(var n,t=ta.event;n=t.sourceEvent;)t=n;return t}function E(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=ta.event;u.target=n,ta.event=u,t[u.type].apply(e,r)}finally{ta.event=i}}},t}function A(n){return ya(n,_a),n}function N(n){return"function"==typeof n?n:function(){return Ma(n,this)}}function C(n){return"function"==typeof n?n:function(){return xa(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=ta.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function q(n){return n.trim().replace(/\s+/g," ")}function L(n){return new RegExp("(?:^|\\s+)"+ta.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=L(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",q(u+" "+n))):e.setAttribute("class",q(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function U(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function j(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=ta.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return ba(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function X(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,ra(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+ta.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=$;a>0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n.toLowerCase()))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Qa=n,e}function Rt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Dt(n,t){var e=Math.pow(10,3*ga(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=sc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=N[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&cc!==jt,o=new(i?jt:cc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Vt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Xt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function $t(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Bt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Wt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.y=Gt(+r[0]),e+r[0].length):-1}function Jt(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Gt(n){return n+(n>68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ce(){}function le(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function se(n,t){n&&dc.hasOwnProperty(n.type)&&dc[n.type](n,t)}function fe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function he(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)fe(n[e],t,1);t.polygonEnd()}function ge(){function n(n,t){n*=Da,t=t*Da/2+qa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])<Ca&&ga(n[1]-t[1])<Ca}function _e(n,t){n*=Da;var e=Math.cos(t*=Da);we(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function we(n,t,e){++xc,_c+=(n-_c)/xc,wc+=(t-wc)/xc,Sc+=(e-Sc)/xc}function Se(){function n(n,u){n*=Da;var i=Math.cos(u*=Da),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);bc+=l,kc+=l*(t+(t=o)),Ec+=l*(e+(e=a)),Ac+=l*(r+(r=c)),we(t,e,r)}var t,e,r;qc.point=function(u,i){u*=Da;var o=Math.cos(i*=Da);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),qc.point=n,we(t,e,r)}}function ke(){qc.point=_e}function Ee(){function n(n,t){n*=Da;var e=Math.cos(t*=Da),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-nt(g)/h,v=Math.atan2(h,g);Nc+=p*l,Cc+=p*s,zc+=p*f,bc+=v,kc+=v*(r+(r=o)),Ec+=v*(u+(u=a)),Ac+=v*(i+(i=c)),we(r,u,i)}var t,e,r,u,i;qc.point=function(o,a){t=o,e=a,qc.point=n,o*=Da;var c=Math.cos(a*=Da);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),we(r,u,i)},qc.lineEnd=function(){n(t,e),qc.lineEnd=ke,qc.point=_e}}function Ae(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Ne(){return!0}function Ce(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(be(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function qe(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Le(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)<Ca?(n.point(e,r=(r+o)/2>0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)<Ca&&(e-=u*Ca),ga(i-a)<Ca&&(i-=a*Ca),r=Ue(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function Ue(n,t,e,r){var u,i,o=Math.sin(n-e);return ga(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]<t[0]?qa:-qa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Fe(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;yc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)<Ca,C=N||Ca>A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)<Ca?k:E):k<=b[1]&&b[1]<=E:A>qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)<Ca?u>0?0:3:ga(r[0]-e)<Ca?u>0?2:1:ga(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c
- },polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)<Ca||ga(r-h)<Ca?(r+h)/2:Math.atan2(_,b),A=n(E,k),N=A[0],C=A[1],z=N-t,q=C-e,L=M*z-y*q;(L*L/x>i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)<Ca?ar:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Sr(n,t){return[n,Math.log(Math.tan(qa/4+t/2))]}function kr(n){var t,e=ur(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=qa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Er(n,t){return[Math.log(Math.tan(qa/4+t/2)),-n]}function Ar(n){return n[0]}function Nr(n){return n[1]}function Cr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)<Ca&&ga(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Pr(c),c=i;a.unshift(c),Xr(c);for(var l=o;l.circle&&ga(e-l.circle.x)<Ca&&ga(r-l.circle.cy)<Ca;)o=l.N,a.push(l),Pr(l),l=o;a.push(l),Xr(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)<Ca&&p-u>Ca?{x:f,y:ga(t-f)<Ca?e:p}:ga(u-p)<Ca&&h-r>Ca?{x:ga(e-p)<Ca?t:h,y:p}:ga(r-h)<Ca&&u-g>Ca?{x:h,y:ga(t-h)<Ca?e:g}:ga(u-g)<Ca&&r-f>Ca?{x:ga(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function Yr(n,t){return t.angle-n.angle}function Zr(){tu(this),this.x=this.y=this.arc=this.site=this.cy=null}function Vr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}tl.insert(y,m),y||(nl=m)}}}}function Xr(n){var t=n.circle;t&&(t.P||(nl=t.N),tl.remove(t),rl.push(t),tu(t),n.circle=null)}function $r(n){for(var t,e=Gc,r=Oe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Br(t,n)||!r(t)||ga(t.a.x-t.b.x)<Ca&&ga(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function Br(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Wr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Jr(n,t,e,r){var u=new Wr(n,t);return Gc.push(u),e&&Kr(u,n,t,e),r&&Kr(u,t,n,r),Kc[n.i].edges.push(new Qr(u,n,t)),Kc[t.i].edges.push(new Qr(u,t,n)),u}function Gr(n,t,e){var r=new Wr(n,null);return r.a=t,r.b=e,Gc.push(r),r}function Kr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Qr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function nu(){this._=null}function tu(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function eu(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ru(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function uu(n){for(;n.L;)n=n.L;return n}function iu(n,t){var e,r,u,i=n.sort(ou).pop();for(Gc=[],Kc=new Array(n.length),Qc=new nu,tl=new nu;;)if(u=nl,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Kc[i.i]=new Or(i),jr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Ur(u.arc)}t&&($r(t),Ir(t));var o={cells:Kc,edges:Gc};return Qc=tl=Gc=Kc=null,o}function ou(n,t){return t.y-n.y||t.x-n.x}function au(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function cu(n){return n.x}function lu(n){return n.y}function su(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function fu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&fu(n,c[0],e,r,o,a),c[1]&&fu(n,c[1],o,r,u,a),c[2]&&fu(n,c[2],e,a,o,i),c[3]&&fu(n,c[3],o,a,u,i)}}function hu(n,t,e,r,u,i,o){var a,c=1/0;return function l(n,s,f,h,g){if(!(s>i||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Pa,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Pa:0}function Uu(n,t){return n[0]*t[0]+n[1]*t[1]}function ju(n){var t=Math.sqrt(Uu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Fu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Hu(n,t){var e,r=[],u=[],i=ta.transform(n),o=ta.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:vu(a[0],c[0])},{i:3,x:vu(a[1],c[1])})):r.push(c[0]||c[1]?"translate("+c+")":""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Ou(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Iu(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Yu(n){for(var t=n.source,e=n.target,r=Vu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Zu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Vu(n,t){if(n===t)return n;for(var e=Zu(n),r=Zu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Xu(n){n.fixed|=2}function $u(n){n.fixed&=-7}function Bu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Wu(n){n.fixed&=-5}function Ju(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Ju(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Gu(n,t){return ta.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=ri,n}function Ku(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function ni(n){return n.children}function ti(n){return n.value}function ei(n,t){return t.value-n.value}function ri(n){return ta.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ui(n){return n.x}function ii(n){return n.y}function oi(n,t,e){n.y0=t,n.y=e}function ai(n){return ta.range(n.length)}function ci(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function li(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?mi(r,u=a):mi(r=c,u),o--):(di(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)_i(u[i],t,e,r)}function wi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Si(n,t){return n.parent==t.parent?1:2}function ki(n){var t=n.children;return t.length?t[0]:n.t}function Ei(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ai(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Ni(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=ta.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ii(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++o<a;)u.has(i=r[o])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,o=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=(c+l)/2,0):(l-c)/(n.length-1+a);return i=r(c+s*a/2,s),o=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,a){arguments.length<2&&(a=0);var c=u[0],l=u[1],s=n.length<2?(c=l=Math.round((c+l)/2),0):(l-c)/(n.length-1+a)|0;return i=r(c+Math.round(s*a/2+(l-c-(n.length-1+a)*s)/2),s),o=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-a+2*c);return i=r(s+h*c,h),l&&i.reverse(),o=h*(1-a),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,a,c){arguments.length<2&&(a=0),arguments.length<3&&(c=a);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-a+2*c));return i=r(s+Math.round((f-s-(n.length-a)*h)/2),h),l&&i.reverse(),o=Math.round(h*(1-a)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Pi(t.a[0])},e.copy=function(){return Qi(n,t)},e.domain(n)}function no(n,t){function i(){var e=0,r=t.length;for(a=[];++e<r;)a[e-1]=ta.quantile(n,e/r);return o}function o(n){return isNaN(n=+n)?void 0:t[ta.bisect(a,n)]}var a;return o.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},o.range=function(n){return arguments.length?(t=n,i()):t},o.quantiles=function(){return a},o.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?a[e-1]:n[0],e<a.length?a[e]:n[n.length-1]]},o.copy=function(){return no(n,t)},i()}function to(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ar,r=Nr,u=Ne,i=go,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=El.get(n)||go).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function go(n){return n.join("L")}function po(n){return go(n)+"Z"}function vo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function yo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Mo(n,t){return n.length<4?go(n):n[1]+_o(n.slice(1,-1),wo(n,t))}function xo(n,t){return n.length<3?go(n):n[0]+_o((n.push(n[0]),n),wo([n[n.length-2]].concat(n,[n[1]]),t))}function bo(n,t){return n.length<3?go(n):n[0]+_o(n,wo(n,t))}function _o(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return go(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function wo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function So(n){if(n.length<3)return go(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",No(Cl,o),",",No(Cl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Co(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ko(n){if(n.length<4)return go(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(No(Cl,i)+","+No(Cl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Co(e,i,o);return e.join("")}function Eo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[No(Cl,o),",",No(Cl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Co(t,o,a);return t.join("")}function Ao(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return So(n)}function No(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Co(n,t,e){n.push("C",No(Al,t),",",No(Al,e),",",No(Nl,t),",",No(Nl,e),",",No(Cl,t),",",No(Cl,e))}function zo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function qo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=zo(u,i);++t<e;)r[t]=(o+(o=zo(u=i,i=n[t+1])))/2;return r[t]=o,r}function Lo(n){for(var t,e,r,u,i=[],o=qo(n),a=-1,c=n.length-1;++a<c;)t=zo(n[a],n[a+1]),ga(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ra,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Do(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=Et(e),b=Et(u),_=e===r?function(){return g}:Et(r),w=u===i?function(){return p}:Et(i);++y<M;)o.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ar,r=Ar,u=0,i=Nr,o=Ne,a=go,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r
- },t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=El.get(n)||go).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Po(n){return n.radius}function Uo(n){return[n.x,n.y]}function jo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Fo(){return 64}function Ho(){return"circle"}function Oo(n){var t=Math.sqrt(n/qa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Io(n){return function(){var t,e;(t=this[n])&&(e=t[t.active])&&(--t.count?delete t[t.active]:delete this[n],t.active+=.5,e.event&&e.event.interrupt.call(this,this.__data__,e.index))}}function Yo(n,t,e){return ya(n,Pl),n.namespace=t,n.id=e,n}function Zo(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,o,a){n[i][u].tween.set(t,r(e.call(n,n.__data__,o,a)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Vo(n){return null==n&&(n=""),function(){this.textContent=n}}function Xo(n){return null==n?"__transition__":"__transition_"+n+"__"}function $o(n,t,e,r,u){var i=n[e]||(n[e]={active:0,count:0}),o=i[r];if(!o){var a=u.time;o=i[r]={tween:new l,time:a,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++i.count,ta.timer(function(u){function c(e){if(i.active>r)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]<Vl[i]/u?i-1:i]:[Bl,Vi(n,e)[2]]}return r.invert=function(t){return Ko(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Ko)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Ko(+e+1),t).length}var i=r.domain(),o=Pi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Fi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.5"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o<i;)u(e=+n[o])&&(r+=e);else for(;++o<i;)u(e=+t.call(n,n[o],o))&&(r+=e);return r},ta.mean=function(n,t){var e,i=0,o=n.length,a=-1,c=o;if(1===arguments.length)for(;++a<o;)u(e=r(n[a]))?i+=e:--c;else for(;++a<o;)u(e=r(t.call(n,n[a],a)))?i+=e:--c;return c?i/c:void 0},ta.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},ta.median=function(n,t){var i,o=[],a=n.length,c=-1;if(1===arguments.length)for(;++c<a;)u(i=r(n[c]))&&o.push(i);else for(;++c<a;)u(i=r(t.call(n,n[c],c)))&&o.push(i);return o.length?ta.quantile(o.sort(e),.5):void 0},ta.variance=function(n,t){var e,i,o=n.length,a=0,c=0,l=-1,s=0;if(1===arguments.length)for(;++l<o;)u(e=r(n[l]))&&(i=e-a,a+=i/++s,c+=i*(e-a));else for(;++l<o;)u(e=r(t.call(n,n[l],l)))&&(i=e-a,a+=i/++s,c+=i*(e-a));return s>1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},ta.transpose=function(n){return ta.zip.apply(ta,n)},ta.keys=function(n){var t=[];for(var e in n)t.push(e);return t},ta.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},ta.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},ta.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)<t;)u.push(r/i);return u},ta.map=function(n,t){var e=new l;if(n instanceof l)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var o in n)e.set(o,n[o]);return e};var pa="__proto__",va="\x00";c(l,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),ta.nest=function(){function n(t,o,a){if(a>=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g<p;)(h=d.get(c=v(s=o[g])))?h.push(s):d.set(c,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,a))}):(s={},f=function(e,r){s[e]=n(t,r,a)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var da=["webkit","ms","moz","Moz","o","O"];ta.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return A(i)},_a.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=ra(n.call(e,e.__data__,a,u))),t.parentNode=e);return A(r)};var wa={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};ta.ns={prefix:wa,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!L(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},_a.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++r<o;)m.has(d=t.call(u=n[r],u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d;for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<o;)m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++i<o;)(u=r[i])&&(n[i]=u.__data__);return n}var a=Z([]),c=A([]),s=A([]);if("function"==typeof n)for(;++i<o;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<o;)e(r=this[i],n);return c.enter=function(){return a},c.exit=function(){return s},c},_a.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},_a.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},_a.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},_a.call=function(n){var t=ra(arguments);return n.apply(t[0]=this,t),this},_a.empty=function(){return!this.node()},_a.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return A(o)},Sa.insert=function(n,t){return arguments.length<2&&(t=V(this)),_a.insert.call(this,n,t)},ta.select=function(t){var e;return"string"==typeof t?(e=[Ma(t,ua)],e.parentNode=ua.documentElement):(e=[t],e.parentNode=n(t)),A([e])},ta.selectAll=function(n){var t;return"string"==typeof n?(t=ra(xa(n,ua)),t.parentNode=ua.documentElement):(t=n,t.parentNode=null),A([t])},_a.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||n({type:"zoomend"}),d=null}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(v=e(d=m||ta.mouse(this)),Dl.call(this),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t
- },reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)se(e[r].geometry,t)}},dc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){fe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)fe(e[r],t,0)},Polygon:function(n,t){he(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)he(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)se(e[r],t)}};ta.geo.area=function(n){return mc=0,ta.geo.stream(n,Mc),mc};var mc,yc=new ce,Mc={sphere:function(){mc+=4*qa},point:b,lineStart:b,lineEnd:b,polygonStart:function(){yc.reset(),Mc.lineStart=ge},polygonEnd:function(){var n=2*yc;mc+=0>n?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Mc.polygonStart()},polygonEnd:function(){Mc.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>yc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Ar,r=Nr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},ta.geom.polygon=function(n){return ya(n,Jc),n};var Jc=ta.geom.polygon.prototype=[];Jc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Jc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Jc.clip=function(n){for(var t,e,r,u,i,o,a=Tr(n),c=-1,l=this.length-Tr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],qr(o,s,u)?(qr(i,s,u)||n.push(Lr(i,o,s,u)),n.push(o)):qr(i,s,u)&&n.push(Lr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Gc,Kc,Qc,nl,tl,el=[],rl=[];Or.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Yr),t.length},Qr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},nu.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=uu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(eu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ru(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ru(this,e),n=e,e=n.U),e.C=!1,r.C=!0,eu(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?uu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,eu(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ru(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,eu(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ru(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,eu(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ru(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},ta.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return iu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&au(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=Et(r=n),t):r},t.y=function(n){return arguments.length?(o=Et(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?ul:n,t):a===ul?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===ul?null:a&&a[1]},t)};var ul=[[-1e6,-1e6],[1e6,1e6]];ta.geom.delaunay=function(n){return ta.geom.voronoi().triangles(n)},ta.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ga(c-e)+ga(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Ar,c=Nr;return(o=arguments.length)?(a=cu,c=lu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},ta.interpolateRgb=gu,ta.interpolateObject=pu,ta.interpolateNumber=vu,ta.interpolateString=du;var il=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ol=new RegExp(il.source,"g");ta.interpolate=mu,ta.interpolators=[function(n,t){var e=typeof t;return("string"===e?Ga.has(t)||/^(#|rgb\(|hsl\()/.test(t)?gu:du:t instanceof ot?gu:Array.isArray(t)?yu:"object"===e&&isNaN(t)?pu:vu)(n,t)}],ta.interpolateArray=yu;var al=function(){return y},cl=ta.map({linear:al,poly:ku,quad:function(){return _u},cubic:function(){return wu},sin:function(){return Eu},exp:function(){return Au},circle:function(){return Nu},elastic:Cu,back:zu,bounce:function(){return qu}}),ll=ta.map({"in":y,out:xu,"in-out":bu,"out-in":function(n){return bu(xu(n))}});ta.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Yu(n[e]));return t}},ta.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=ta.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(ta.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(La-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},ta.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e<b;)a=m[e],a.x+=(y-a.x)*d,a.y+=(x-a.y)*d;if(g)for(Ju(t=ta.geom.quadtree(m),r,o),e=-1;++e<b;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(M=n,a):M},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=M.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=ta.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Gu(e,r)},ta.layout.pie=function(){function n(o){var a,c=o.length,l=o.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/c,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=ta.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Ri,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));
- return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ri(t):Di(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Di(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ri:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Gu(i,a)},ta.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++a<c;){i.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(e=l[s])&&$o(e,s,u,r,o),t.push(e)}return Yo(i,u,r)},_a.interrupt=function(n){return this.each(null==n?Dl:Io(Xo(n)))};var Tl,Rl,Dl=Io(Xo()),Pl=[],Ul=0;Pl.call=_a.call,Pl.empty=_a.empty,Pl.node=_a.node,Pl.size=_a.size,ta.transition=function(n,t){return n&&n.transition?Tl?n.transition(t):n:ta.selection().transition(n)},ta.transition.prototype=Pl,Pl.select=function(n){var t,e,r,u=this.id,i=this.namespace,o=[];n=N(n);for(var a=-1,c=this.length;++a<c;){o.push(t=[]);for(var l=this[a],s=-1,f=l.length;++s<f;)(r=l[s])&&(e=n.call(r,r.__data__,s,a))?("__data__"in r&&(e.__data__=r.__data__),$o(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Yo(o,i,u)},Pl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=this.namespace,c=[];n=C(n);for(var l=-1,s=this.length;++l<s;)for(var f=this[l],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[a][o],e=n.call(r,r.__data__,h,l),c.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&$o(u,p,a,o,i),t.push(u)}return Yo(c,a,o)},Pl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),A&&m(n,l,0)&&(r(k),t=!0),N&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Ui(t),c=i[0],l=i[1],s=q[e],v=e?h:f,d=v[1]-v[0];return C&&(c-=s,l-=d+s),r=(e?p:g)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(c,Math.min(l,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}();/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
- * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
- * */
- !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);/**
- * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
- */
- !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document);/*!
- Holder - client side image placeholders
- Version 2.7.1+6hydf
- © 2015 Ivan Malopinsky - http://imsky.co
- Site: http://holderjs.com
- Issues: https://github.com/imsky/holder/issues
- License: http://opensource.org/licenses/MIT
- */
- !function(a){if(a.document){var b=a.document;b.querySelectorAll||(b.querySelectorAll=function(c){var d,e=b.createElement("style"),f=[];for(b.documentElement.firstChild.appendChild(e),b._qsa=[],e.styleSheet.cssText=c+"{x-qsa:expression(document._qsa && document._qsa.push(this))}",a.scrollBy(0,0),e.parentNode.removeChild(e);b._qsa.length;)d=b._qsa.shift(),d.style.removeAttribute("x-qsa"),f.push(d);return b._qsa=null,f}),b.querySelector||(b.querySelector=function(a){var c=b.querySelectorAll(a);return c.length?c[0]:null}),b.getElementsByClassName||(b.getElementsByClassName=function(a){return a=String(a).replace(/^|\s+/g,"."),b.querySelectorAll(a)}),Object.keys||(Object.keys=function(a){if(a!==Object(a))throw TypeError("Object.keys called on non-object");var b,c=[];for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&c.push(b);return c}),function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a.atob=a.atob||function(a){a=String(a);var c,d=0,e=[],f=0,g=0;if(a=a.replace(/\s/g,""),a.length%4===0&&(a=a.replace(/=+$/,"")),a.length%4===1)throw Error("InvalidCharacterError");if(/[^+/0-9A-Za-z]/.test(a))throw Error("InvalidCharacterError");for(;d<a.length;)c=b.indexOf(a.charAt(d)),f=f<<6|c,g+=6,24===g&&(e.push(String.fromCharCode(f>>16&255)),e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f)),g=0,f=0),d+=1;return 12===g?(f>>=4,e.push(String.fromCharCode(255&f))):18===g&&(f>>=2,e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f))),e.join("")},a.btoa=a.btoa||function(a){a=String(a);var c,d,e,f,g,h,i,j=0,k=[];if(/[^\x00-\xFF]/.test(a))throw Error("InvalidCharacterError");for(;j<a.length;)c=a.charCodeAt(j++),d=a.charCodeAt(j++),e=a.charCodeAt(j++),f=c>>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,j===a.length+2?(h=64,i=64):j===a.length+1&&(i=64),k.push(b.charAt(f),b.charAt(g),b.charAt(h),b.charAt(i));return k.join("")}}(a),Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(a){var b=this.__proto__||this.constructor.prototype;return a in this&&(!(a in b)||b[a]!==this[a])}),function(){if("performance"in a==!1&&(a.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in a.performance==!1){var b=Date.now();performance.timing&&performance.timing.navigationStart&&(b=performance.timing.navigationStart),a.performance.now=function(){return Date.now()-b}}}(),a.requestAnimationFrame||(a.webkitRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return webkitRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=webkitCancelAnimationFrame}(a):a.mozRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return mozRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=mozCancelAnimationFrame}(a):!function(a){a.requestAnimationFrame=function(b){return a.setTimeout(b,1e3/60)},a.cancelAnimationFrame=a.clearTimeout}(a))}}(this),function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Holder=b():a.Holder=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){(function(b){function d(a,b,c,d){var f=e(c.substr(c.lastIndexOf(a.domain)),a);f&&h({mode:null,el:d,flags:f,engineSettings:b})}function e(a,b){var c={theme:B(J.settings.themes.gray,null),stylesheets:b.stylesheets,instanceOptions:b};return a.match(/([\d]+p?)x([\d]+p?)(?:\?|$)/)?f(a,c):g(a,c)}function f(a,b){var c=a.split("?"),d=c[0].split("/");b.holderURL=a;var e=d[1],f=e.match(/([\d]+p?)x([\d]+p?)/);if(!f)return!1;if(b.fluid=-1!==e.indexOf("p"),b.dimensions={width:f[1].replace("p","%"),height:f[2].replace("p","%")},2===c.length){var g=A.parse(c[1]);if(g.bg&&(b.theme.background=(-1===g.bg.indexOf("#")?"#":"")+g.bg),g.fg&&(b.theme.foreground=(-1===g.fg.indexOf("#")?"#":"")+g.fg),g.theme&&b.instanceOptions.themes.hasOwnProperty(g.theme)&&(b.theme=B(b.instanceOptions.themes[g.theme],null)),g.text&&(b.text=g.text),g.textmode&&(b.textmode=g.textmode),g.size&&(b.size=g.size),g.font&&(b.font=g.font),g.align&&(b.align=g.align),b.nowrap=z.truthy(g.nowrap),b.auto=z.truthy(g.auto),z.truthy(g.random)){J.vars.cache.themeKeys=J.vars.cache.themeKeys||Object.keys(b.instanceOptions.themes);var h=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(b.instanceOptions.themes[h],null)}}return b}function g(a,b){var c=!1,d=String.fromCharCode(11),e=a.replace(/([^\\])\//g,"$1"+d).split(d),f=/%[0-9a-f]{2}/gi,g=b.instanceOptions;b.holderURL=[];for(var h=e.length,i=0;h>i;i++){var j=e[i];if(j.match(f))try{j=decodeURIComponent(j)}catch(k){j=e[i]}var l=!1;if(J.flags.dimensions.match(j))c=!0,b.dimensions=J.flags.dimensions.output(j),l=!0;else if(J.flags.fluid.match(j))c=!0,b.dimensions=J.flags.fluid.output(j),b.fluid=!0,l=!0;else if(J.flags.textmode.match(j))b.textmode=J.flags.textmode.output(j),l=!0;else if(J.flags.colors.match(j)){var m=J.flags.colors.output(j);b.theme=B(b.theme,m),l=!0}else if(g.themes[j])g.themes.hasOwnProperty(j)&&(b.theme=B(g.themes[j],null)),l=!0;else if(J.flags.font.match(j))b.font=J.flags.font.output(j),l=!0;else if(J.flags.auto.match(j))b.auto=!0,l=!0;else if(J.flags.text.match(j))b.text=J.flags.text.output(j),l=!0;else if(J.flags.size.match(j))b.size=J.flags.size.output(j),l=!0;else if(J.flags.random.match(j)){null==J.vars.cache.themeKeys&&(J.vars.cache.themeKeys=Object.keys(g.themes));var n=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(g.themes[n],null),l=!0}l&&b.holderURL.push(j)}return b.holderURL.unshift(g.domain),b.holderURL=b.holderURL.join("/"),c?b:!1}function h(a){var b=a.mode,c=a.el,d=a.flags,e=a.engineSettings,f=d.dimensions,g=d.theme,h=f.width+"x"+f.height;if(b=null==b?d.fluid?"fluid":"image":b,null!=d.text&&(g.text=d.text,"object"===c.nodeName.toLowerCase())){for(var j=g.text.split("\\n"),k=0;k<j.length;k++)j[k]=z.encodeHtmlEntity(j[k]);g.text=j.join("\\n")}var n=d.holderURL,o=B(e,null);if(d.font&&(g.font=d.font,!o.noFontFallback&&"img"===c.nodeName.toLowerCase()&&J.setup.supportsCanvas&&"svg"===o.renderer&&(o=B(o,{renderer:"canvas"}))),d.font&&"canvas"==o.renderer&&(o.reRender=!0),"background"==b)null==c.getAttribute("data-background-src")&&r(c,{"data-background-src":n});else{var p={};p[J.vars.dataAttr]=n,r(c,p)}d.theme=g,c.holderData={flags:d,engineSettings:o},("image"==b||"fluid"==b)&&r(c,{alt:g.text?g.text+" ["+h+"]":h});var q={mode:b,el:c,holderSettings:{dimensions:f,theme:g,flags:d},engineSettings:o};"image"==b?("html"!=o.renderer&&d.auto||(c.style.width=f.width+"px",c.style.height=f.height+"px"),"html"==o.renderer?c.style.backgroundColor=g.background:(i(q),"exact"==d.textmode&&(c.holderData.resizeUpdate=!0,J.vars.resizableImages.push(c),l(c)))):"background"==b&&"html"!=o.renderer?i(q):"fluid"==b&&(c.holderData.resizeUpdate=!0,"%"==f.height.slice(-1)?c.style.height=f.height:null!=d.auto&&d.auto||(c.style.height=f.height+"px"),"%"==f.width.slice(-1)?c.style.width=f.width:null!=d.auto&&d.auto||(c.style.width=f.width+"px"),("inline"==c.style.display||""===c.style.display||"none"==c.style.display)&&(c.style.display="block"),m(c),"html"==o.renderer?c.style.backgroundColor=g.background:(J.vars.resizableImages.push(c),l(c)))}function i(a){function c(){var b=null;switch(h.renderer){case"canvas":b=L(k,a);break;case"svg":b=M(k,a);break;default:throw"Holder: invalid renderer: "+h.renderer}return b}var d=null,e=a.mode,f=a.holderSettings,g=a.el,h=a.engineSettings;switch(h.renderer){case"svg":if(!J.setup.supportsSVG)return;break;case"canvas":if(!J.setup.supportsCanvas)return;break;default:return}var i={width:f.dimensions.width,height:f.dimensions.height,theme:f.theme,flags:f.flags},k=j(i);if(d=c(),null==d)throw"Holder: couldn't render placeholder";"background"==e?(g.style.backgroundImage="url("+d+")",g.style.backgroundSize=i.width+"px "+i.height+"px"):("img"===g.nodeName.toLowerCase()?r(g,{src:d}):"object"===g.nodeName.toLowerCase()&&(r(g,{data:d}),r(g,{type:"image/svg+xml"})),h.reRender&&b.setTimeout(function(){var a=c();if(null==a)throw"Holder: couldn't render placeholder";"img"===g.nodeName.toLowerCase()?r(g,{src:a}):"object"===g.nodeName.toLowerCase()&&(r(g,{data:a}),r(g,{type:"image/svg+xml"}))},100)),r(g,{"data-holder-rendered":!0})}function j(a){function b(a,b,c,d){b.width=c,b.height=d,a.width=Math.max(a.width,b.width),a.height+=b.height}var c=J.defaults.size;switch(parseFloat(a.theme.size)?c=a.theme.size:parseFloat(a.flags.size)&&(c=a.flags.size),a.font={family:a.theme.font?a.theme.font:"Arial, Helvetica, Open Sans, sans-serif",size:k(a.width,a.height,c),units:a.theme.units?a.theme.units:J.defaults.units,weight:a.theme.fontweight?a.theme.fontweight:"bold"},a.text=a.theme.text||Math.floor(a.width)+"x"+Math.floor(a.height),a.noWrap=a.theme.nowrap||a.flags.nowrap,a.align=a.theme.align||a.flags.align||"center",a.flags.textmode){case"literal":a.text=a.flags.dimensions.width+"x"+a.flags.dimensions.height;break;case"exact":if(!a.flags.exactDimensions)break;a.text=Math.floor(a.flags.exactDimensions.width)+"x"+Math.floor(a.flags.exactDimensions.height)}var d=new y({width:a.width,height:a.height}),e=d.Shape,f=new e.Rect("holderBg",{fill:a.theme.background});f.resize(a.width,a.height),d.root.add(f);var g=new e.Group("holderTextGroup",{text:a.text,align:a.align,font:a.font,fill:a.theme.foreground});g.moveTo(null,null,1),d.root.add(g);var h=g.textPositionData=K(d);if(!h)throw"Holder: staging fallback not supported yet.";g.properties.leading=h.boundingBox.height;var i=null,j=null,l=a.width*J.setup.lineWrapRatio,m=l;if(h.lineCount>1){var n,o=0,p=0,q=0;j=new e.Group("line"+q),("left"===a.align||"right"===a.align)&&(m=a.width*(1-2*(1-J.setup.lineWrapRatio)));for(var r=0;r<h.words.length;r++){var s=h.words[r];i=new e.Text(s.text);var t="\\n"==s.text;!a.noWrap&&(o+s.width>=m||t===!0)&&(b(g,j,o,g.properties.leading),g.add(j),o=0,p+=g.properties.leading,q+=1,j=new e.Group("line"+q),j.y=p),t!==!0&&(i.moveTo(o,0),o+=h.spaceWidth+s.width,j.add(i))}if(b(g,j,o,g.properties.leading),g.add(j),"left"===a.align)g.moveTo(a.width-l,null,null);else if("right"===a.align){for(n in g.children)j=g.children[n],j.moveTo(a.width-j.width,null,null);g.moveTo(0-(a.width-l),null,null)}else{for(n in g.children)j=g.children[n],j.moveTo((g.width-j.width)/2,null,null);g.moveTo((a.width-g.width)/2,null,null)}g.moveTo(null,(a.height-g.height)/2,null),(a.height-g.height)/2<0&&g.moveTo(null,0,null)}else i=new e.Text(a.text),j=new e.Group("line0"),j.add(i),g.add(j),"left"===a.align?g.moveTo(a.width-l,null,null):"right"===a.align?g.moveTo(0-(a.width-l),null,null):g.moveTo((a.width-h.boundingBox.width)/2,null,null),g.moveTo(null,(a.height-h.boundingBox.height)/2,null);return d}function k(a,b,c){var d=parseInt(a,10),e=parseInt(b,10),f=Math.max(d,e),g=Math.min(d,e),h=.8*Math.min(g,f*J.defaults.scale);return Math.round(Math.max(c,h))}function l(a){var b;b=null==a||null==a.nodeType?J.vars.resizableImages:[a];for(var c=0,d=b.length;d>c;c++){var e=b[c];if(e.holderData){var f=e.holderData.flags,g=D(e);if(g){if(!e.holderData.resizeUpdate)continue;if(f.fluid&&f.auto){var h=e.holderData.fluidConfig;switch(h.mode){case"width":g.height=g.width/h.ratio;break;case"height":g.width=g.height*h.ratio}}var j={mode:"image",holderSettings:{dimensions:g,theme:f.theme,flags:f},el:e,engineSettings:e.holderData.engineSettings};"exact"==f.textmode&&(f.exactDimensions=g,j.holderSettings.dimensions=f.dimensions),i(j)}else p(e)}}}function m(a){if(a.holderData){var b=D(a);if(b){var c=a.holderData.flags,d={fluidHeight:"%"==c.dimensions.height.slice(-1),fluidWidth:"%"==c.dimensions.width.slice(-1),mode:null,initialDimensions:b};d.fluidWidth&&!d.fluidHeight?(d.mode="width",d.ratio=d.initialDimensions.width/parseFloat(c.dimensions.height)):!d.fluidWidth&&d.fluidHeight&&(d.mode="height",d.ratio=parseFloat(c.dimensions.width)/d.initialDimensions.height),a.holderData.fluidConfig=d}else p(a)}}function n(){for(var a,c=[],d=Object.keys(J.vars.invisibleImages),e=0,f=d.length;f>e;e++)a=J.vars.invisibleImages[d[e]],D(a)&&"img"==a.nodeName.toLowerCase()&&(c.push(a),delete J.vars.invisibleImages[d[e]]);c.length&&I.run({images:c}),b.requestAnimationFrame(n)}function o(){J.vars.visibilityCheckStarted||(b.requestAnimationFrame(n),J.vars.visibilityCheckStarted=!0)}function p(a){a.holderData.invisibleId||(J.vars.invisibleId+=1,J.vars.invisibleImages["i"+J.vars.invisibleId]=a,a.holderData.invisibleId=J.vars.invisibleId)}function q(a,b){return null==b?document.createElement(a):document.createElementNS(b,a)}function r(a,b){for(var c in b)a.setAttribute(c,b[c])}function s(a,b,c){var d,e;null==a?(a=q("svg",E),d=q("defs",E),e=q("style",E),r(e,{type:"text/css"}),d.appendChild(e),a.appendChild(d)):e=a.querySelector("style"),a.webkitMatchesSelector&&a.setAttribute("xmlns",E);for(var f=0;f<a.childNodes.length;f++)a.childNodes[f].nodeType===F&&a.removeChild(a.childNodes[f]);for(;e.childNodes.length;)e.removeChild(e.childNodes[0]);return r(a,{width:b,height:c,viewBox:"0 0 "+b+" "+c,preserveAspectRatio:"none"}),a}function t(a,c){if(b.XMLSerializer){var d=new XMLSerializer,e="",f=c.stylesheets;if(c.svgXMLStylesheet){for(var g=u(),h=f.length-1;h>=0;h--){var i=g.createProcessingInstruction("xml-stylesheet",'href="'+f[h]+'" rel="stylesheet"');g.insertBefore(i,g.firstChild)}g.removeChild(g.documentElement),e=d.serializeToString(g)}var j=d.serializeToString(a);return j=j.replace(/\&(\#[0-9]{2,}\;)/g,"&$1"),e+j}}function u(){return b.DOMParser?(new DOMParser).parseFromString("<xml />","application/xml"):void 0}function v(a){J.vars.debounceTimer||a.call(this),J.vars.debounceTimer&&b.clearTimeout(J.vars.debounceTimer),J.vars.debounceTimer=b.setTimeout(function(){J.vars.debounceTimer=null,a.call(this)},J.setup.debounce)}function w(){v(function(){l(null)})}var x=c(1),y=c(2),z=c(3),A=c(4),B=z.extend,C=z.getNodeArray,D=z.dimensionCheck,E="http://www.w3.org/2000/svg",F=8,G="2.7.1",H="\nCreated with Holder.js "+G+".\nLearn more at http://holderjs.com\n(c) 2012-2015 Ivan Malopinsky - http://imsky.co\n",I={version:G,addTheme:function(a,b){return null!=a&&null!=b&&(J.settings.themes[a]=b),delete J.vars.cache.themeKeys,this},addImage:function(a,b){var c=document.querySelectorAll(b);if(c.length)for(var d=0,e=c.length;e>d;d++){var f=q("img"),g={};g[J.vars.dataAttr]=a,r(f,g),c[d].appendChild(f)}return this},setResizeUpdate:function(a,b){a.holderData&&(a.holderData.resizeUpdate=!!b,a.holderData.resizeUpdate&&l(a))},run:function(a){a=a||{};var c={},f=B(J.settings,a);J.vars.preempted=!0,J.vars.dataAttr=f.dataAttr||J.vars.dataAttr,c.renderer=f.renderer?f.renderer:J.setup.renderer,-1===J.setup.renderers.join(",").indexOf(c.renderer)&&(c.renderer=J.setup.supportsSVG?"svg":J.setup.supportsCanvas?"canvas":"html");var g=C(f.images),i=C(f.bgnodes),j=C(f.stylenodes),k=C(f.objects);c.stylesheets=[],c.svgXMLStylesheet=!0,c.noFontFallback=f.noFontFallback?f.noFontFallback:!1;for(var l=0;l<j.length;l++){var m=j[l];if(m.attributes.rel&&m.attributes.href&&"stylesheet"==m.attributes.rel.value){var n=m.attributes.href.value,o=q("a");o.href=n;var p=o.protocol+"//"+o.host+o.pathname+o.search;c.stylesheets.push(p)}}for(l=0;l<i.length;l++)if(b.getComputedStyle){var r=b.getComputedStyle(i[l],null).getPropertyValue("background-image"),s=i[l].getAttribute("data-background-src"),t=null;t=null==s?r:s;var u=null,v="?"+f.domain+"/";if(0===t.indexOf(v))u=t.slice(1);else if(-1!=t.indexOf(v)){var w=t.substr(t.indexOf(v)).slice(1),x=w.match(/([^\"]*)"?\)/);null!=x&&(u=x[1])}if(null!=u){var y=e(u,f);y&&h({mode:"background",el:i[l],flags:y,engineSettings:c})}}for(l=0;l<k.length;l++){var A=k[l],D={};try{D.data=A.getAttribute("data"),D.dataSrc=A.getAttribute(J.vars.dataAttr)}catch(E){}var F=null!=D.data&&0===D.data.indexOf(f.domain),G=null!=D.dataSrc&&0===D.dataSrc.indexOf(f.domain);F?d(f,c,D.data,A):G&&d(f,c,D.dataSrc,A)}for(l=0;l<g.length;l++){var H=g[l],I={};try{I.src=H.getAttribute("src"),I.dataSrc=H.getAttribute(J.vars.dataAttr),I.rendered=H.getAttribute("data-holder-rendered")}catch(E){}var K=null!=I.src,L=null!=I.dataSrc&&0===I.dataSrc.indexOf(f.domain),M=null!=I.rendered&&"true"==I.rendered;K?0===I.src.indexOf(f.domain)?d(f,c,I.src,H):L&&(M?d(f,c,I.dataSrc,H):!function(a,b,c,e,f){z.imageExists(a,function(a){a||d(b,c,e,f)})}(I.src,f,c,I.dataSrc,H)):L&&d(f,c,I.dataSrc,H)}return this}},J={settings:{domain:"holder.js",images:"img",objects:"object",bgnodes:"body .holderjs",stylenodes:"head link.holderjs",stylesheets:[],themes:{gray:{background:"#EEEEEE",foreground:"#AAAAAA"},social:{background:"#3a5a97",foreground:"#FFFFFF"},industrial:{background:"#434A52",foreground:"#C2F200"},sky:{background:"#0D8FDB",foreground:"#FFFFFF"},vine:{background:"#39DBAC",foreground:"#1E292C"},lava:{background:"#F8591A",foreground:"#1C2846"}}},defaults:{size:10,units:"pt",scale:1/16},flags:{dimensions:{regex:/^(\d+)x(\d+)$/,output:function(a){var b=this.regex.exec(a);return{width:+b[1],height:+b[2]}}},fluid:{regex:/^([0-9]+%?)x([0-9]+%?)$/,output:function(a){var b=this.regex.exec(a);return{width:b[1],height:b[2]}}},colors:{regex:/(?:#|\^)([0-9a-f]{3,})\:(?:#|\^)([0-9a-f]{3,})/i,output:function(a){var b=this.regex.exec(a);return{foreground:"#"+b[2],background:"#"+b[1]}}},text:{regex:/text\:(.*)/,output:function(a){return this.regex.exec(a)[1].replace("\\/","/")}},font:{regex:/font\:(.*)/,output:function(a){return this.regex.exec(a)[1]}},auto:{regex:/^auto$/},textmode:{regex:/textmode\:(.*)/,output:function(a){return this.regex.exec(a)[1]}},random:{regex:/^random$/},size:{regex:/size\:(\d+)/,output:function(a){return this.regex.exec(a)[1]}}}},K=function(){var a=null,b=null,c=null;return function(d){var e=d.root;if(J.setup.supportsSVG){var f=!1,g=function(a){return document.createTextNode(a)};(null==a||a.parentNode!==document.body)&&(f=!0),a=s(a,e.properties.width,e.properties.height),a.style.display="block",f&&(b=q("text",E),c=g(null),r(b,{x:0}),b.appendChild(c),a.appendChild(b),document.body.appendChild(a),a.style.visibility="hidden",a.style.position="absolute",a.style.top="-100%",a.style.left="-100%");var h=e.children.holderTextGroup,i=h.properties;r(b,{y:i.font.size,style:z.cssProps({"font-weight":i.font.weight,"font-size":i.font.size+i.font.units,"font-family":i.font.family})}),c.nodeValue=i.text;var j=b.getBBox(),k=Math.ceil(j.width/(e.properties.width*J.setup.lineWrapRatio)),l=i.text.split(" "),m=i.text.match(/\\n/g);k+=null==m?0:m.length,c.nodeValue=i.text.replace(/[ ]+/g,"");var n=b.getComputedTextLength(),o=j.width-n,p=Math.round(o/Math.max(1,l.length-1)),t=[];if(k>1){c.nodeValue="";for(var u=0;u<l.length;u++)if(0!==l[u].length){c.nodeValue=z.decodeHtmlEntity(l[u]);var v=b.getBBox();t.push({text:l[u],width:v.width})}}return a.style.display="none",{spaceWidth:p,lineCount:k,boundingBox:j,words:t}}return!1}}(),L=function(){var a=q("canvas"),b=null;return function(c){null==b&&(b=a.getContext("2d"));var d=c.root;a.width=J.dpr(d.properties.width),a.height=J.dpr(d.properties.height),b.textBaseline="middle",b.fillStyle=d.children.holderBg.properties.fill,b.fillRect(0,0,J.dpr(d.children.holderBg.width),J.dpr(d.children.holderBg.height));{var e=d.children.holderTextGroup;e.properties}b.font=e.properties.font.weight+" "+J.dpr(e.properties.font.size)+e.properties.font.units+" "+e.properties.font.family+", monospace",b.fillStyle=e.properties.fill;for(var f in e.children){var g=e.children[f];for(var h in g.children){var i=g.children[h],j=J.dpr(e.x+g.x+i.x),k=J.dpr(e.y+g.y+i.y+e.properties.leading/2);b.fillText(i.properties.text,j,k)}}return a.toDataURL("image/png")}}(),M=function(){if(b.XMLSerializer){var a=u(),c=s(null,0,0),d=q("rect",E);return c.appendChild(d),function(b,e){var f=b.root;s(c,f.properties.width,f.properties.height);for(var g=c.querySelectorAll("g"),h=0;h<g.length;h++)g[h].parentNode.removeChild(g[h]);var i=e.holderSettings.flags.holderURL,j="holder_"+(Number(new Date)+32768+(0|32768*Math.random())).toString(16),k=q("g",E),l=f.children.holderTextGroup,m=l.properties,n=q("g",E),o=l.textPositionData,p="#"+j+" text { "+z.cssProps({fill:m.fill,"font-weight":m.font.weight,"font-family":m.font.family+", monospace","font-size":m.font.size+m.font.units})+" } ",u=a.createComment("\nSource URL: "+i+H),v=a.createCDATASection(p),w=c.querySelector("style");r(k,{id:j}),c.insertBefore(u,c.firstChild),w.appendChild(v),k.appendChild(d),k.appendChild(n),c.appendChild(k),r(d,{width:f.children.holderBg.width,height:f.children.holderBg.height,fill:f.children.holderBg.properties.fill}),l.y+=.8*o.boundingBox.height;for(var x in l.children){var y=l.children[x];for(var A in y.children){var B=y.children[A],C=l.x+y.x+B.x,D=l.y+y.y+B.y,F=q("text",E),G=document.createTextNode(null);r(F,{x:C,y:D}),G.nodeValue=B.properties.text,F.appendChild(G),n.appendChild(F)}}var I=N(t(c,e.engineSettings),"background"===e.mode);return I}}}(),N=function(){var a="data:image/svg+xml;charset=UTF-8,",b="data:image/svg+xml;charset=UTF-8;base64,";return function(c,d){return d?b+btoa(unescape(encodeURIComponent(c))):a+encodeURIComponent(c)}}();for(var O in J.flags)J.flags.hasOwnProperty(O)&&(J.flags[O].match=function(a){return a.match(this.regex)});J.setup={renderer:"html",debounce:100,ratio:1,supportsCanvas:!1,supportsSVG:!1,lineWrapRatio:.9,renderers:["html","canvas","svg"]},J.dpr=function(a){return a*J.setup.ratio},J.vars={preempted:!1,resizableImages:[],invisibleImages:{},invisibleId:0,visibilityCheckStarted:!1,debounceTimer:null,cache:{},dataAttr:"data-src"},function(){var a=1,c=1,d=q("canvas"),e=null;d.getContext&&-1!=d.toDataURL("image/png").indexOf("data:image/png")&&(J.setup.renderer="canvas",e=d.getContext("2d"),J.setup.supportsCanvas=!0),J.setup.supportsCanvas&&(a=b.devicePixelRatio||1,c=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1),J.setup.ratio=a/c,document.createElementNS&&document.createElementNS(E,"svg").createSVGRect&&(J.setup.renderer="svg",J.setup.supportsSVG=!0)}(),o(),x&&x(function(){J.vars.preempted||I.run(),b.addEventListener?(b.addEventListener("resize",w,!1),b.addEventListener("orientationchange",w,!1)):b.attachEvent("onresize",w),"object"==typeof b.Turbolinks&&b.document.addEventListener("page:change",function(){I.run()})}),a.exports=I}).call(b,function(){return this}())},function(a){function b(a){function b(a){if(!v){if(!g.body)return e(b);for(v=!0;a=w.shift();)e(a)}}function c(a){(t||a.type===i||g[m]===l)&&(d(),b())}function d(){t?(g[s](q,c,j),a[s](i,c,j)):(g[o](r,c),a[o](k,c))}function e(a,b){setTimeout(a,+b>=0?b:1)}function f(a){v?e(a):w.push(a)}null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function y(){document.removeEventListener("DOMContentLoaded",y,!1),document.readyState="complete"},!1),document.readyState="loading");var g=a.document,h=g.documentElement,i="load",j=!1,k="on"+i,l="complete",m="readyState",n="attachEvent",o="detachEvent",p="addEventListener",q="DOMContentLoaded",r="onreadystatechange",s="removeEventListener",t=p in g,u=j,v=j,w=[];if(g[m]===l)e(b);else if(t)g[p](q,c,j),a[p](i,c,j);else{g[n](r,c),a[n](k,c);try{u=null==a.frameElement&&h}catch(x){}u&&u.doScroll&&!function z(){if(!v){try{u.doScroll("left")}catch(a){return e(z,50)}d(),b()}}()}return f.version="1.4.0",f.isReady=function(){return v},f}a.exports="undefined"!=typeof window&&b(window)},function(a,b,c){var d=c(5),e=function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}var c=1,e=d.defclass({constructor:function(a){c++,this.parent=null,this.children={},this.id=c,this.name="n"+c,null!=a&&(this.name=a),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(a,b){null!=a&&(this.width=a),null!=b&&(this.height=b)},moveTo:function(a,b,c){this.x=null!=a?a:this.x,this.y=null!=b?b:this.y,this.z=null!=c?c:this.z},add:function(a){var b=a.name;if(null!=this.children[b])throw"SceneGraph: child with that name already exists: "+b;this.children[b]=a,a.parent=this}}),f=d(e,function(b){this.constructor=function(){b.constructor.call(this,"root"),this.properties=a}}),g=d(e,function(a){function c(c,d){if(a.constructor.call(this,c),this.properties={fill:"#000"},null!=d)b(this.properties,d);else if(null!=c&&"string"!=typeof c)throw"SceneGraph: invalid node name"}this.Group=d.extend(this,{constructor:c,type:"group"}),this.Rect=d.extend(this,{constructor:c,type:"rect"}),this.Text=d.extend(this,{constructor:function(a){c.call(this),this.properties.text=a},type:"text"})}),h=new f;return this.Shape=g,this.root=h,this};a.exports=e},function(a,b){(function(a){b.extend=function(a,b){var c={};for(var d in a)a.hasOwnProperty(d)&&(c[d]=a[d]);if(null!=b)for(var e in b)b.hasOwnProperty(e)&&(c[e]=b[e]);return c},b.cssProps=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]);return b.join(";")},b.encodeHtmlEntity=function(a){for(var b=[],c=0,d=a.length-1;d>=0;d--)c=a.charCodeAt(d),b.unshift(c>128?["&#",c,";"].join(""):a[d]);return b.join("")},b.getNodeArray=function(b){var c=null;return"string"==typeof b?c=document.querySelectorAll(b):a.NodeList&&b instanceof a.NodeList?c=b:a.Node&&b instanceof a.Node?c=[b]:a.HTMLCollection&&b instanceof a.HTMLCollection?c=b:b instanceof Array?c=b:null===b&&(c=[]),c},b.imageExists=function(a,b){var c=new Image;c.onerror=function(){b.call(this,!1)},c.onload=function(){b.call(this,!0)},c.src=a},b.decodeHtmlEntity=function(a){return a.replace(/&#(\d+);/g,function(a,b){return String.fromCharCode(b)})},b.dimensionCheck=function(a){var b={height:a.clientHeight,width:a.clientWidth};return b.height&&b.width?b:!1},b.truthy=function(a){return"string"==typeof a?"true"===a||"yes"===a||"1"===a||"on"===a||"✓"===a:!!a}}).call(b,function(){return this}())},function(a,b,c){var d=encodeURIComponent,e=decodeURIComponent,f=c(6),g=c(7),h=/(\w+)\[(\d+)\]/,i=/\w+\.\w+/;b.parse=function(a){if("string"!=typeof a)return{};if(a=f(a),""===a)return{};"?"===a.charAt(0)&&(a=a.slice(1));for(var b={},c=a.split("&"),d=0;d<c.length;d++){var g,j,k,l=c[d].split("="),m=e(l[0]);if(g=h.exec(m))b[g[1]]=b[g[1]]||[],b[g[1]][g[2]]=e(l[1]);else if(g=i.test(m)){for(g=m.split("."),j=b;g.length;)if(k=g.shift(),k.length){if(j[k]){if(j[k]&&"object"!=typeof j[k])break}else j[k]={};g.length||(j[k]=e(l[1])),j=j[k]}}else b[l[0]]=null==l[1]?"":e(l[1])}return b},b.stringify=function(a){if(!a)return"";var b=[];for(var c in a){var e=a[c];if("array"!=g(e))b.push(d(c)+"="+d(a[c]));else for(var f=0;f<e.length;++f)b.push(d(c+"["+f+"]")+"="+d(e[f]))}return b.join("&")}},function(a){var b=function(){},c=Array.prototype.slice,d=function(a,d){var e=b.prototype="function"==typeof a?a.prototype:a,f=new b,g=d.apply(f,c.call(arguments,2).concat(e));if("object"==typeof g)for(var h in g)f[h]=g[h];if(!f.hasOwnProperty("constructor"))return f;var i=f.constructor;return i.prototype=f,i};d.defclass=function(a){var b=a.constructor;return b.prototype=a,b},d.extend=function(a,b){return d(a,function(a){return this.uber=a,b})},a.exports=d},function(a,b){function c(a){return a.replace(/^\s*|\s*$/g,"")}b=a.exports=c,b.left=function(a){return a.replace(/^\s*/,"")},b.right=function(a){return a.replace(/\s*$/,"")}},function(a){var b=Object.prototype.toString;a.exports=function(a){switch(b.call(a)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}return null===a?"null":void 0===a?"undefined":a!==a?"nan":a&&1===a.nodeType?"element":(a=a.valueOf?a.valueOf():Object.prototype.valueOf.apply(a),typeof a)}}])}),function(a,b){b&&(Holder=a.Holder)}(this,"undefined"!=typeof Meteor&&"undefined"!=typeof Package);
- /* nvd3 version 1.7.1 (https://github.com/novus/nvd3) 2015-02-08 */
- !function(){var a=window.nv||{};window.nv=a,a.dev=!1,a.tooltip=a.tooltip||{},a.utils=a.utils||{},a.models=a.models||{},a.charts={},a.graphs=[],a.logs={},a.dispatch=d3.dispatch("render_start","render_end"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),a.dev&&(a.dispatch.on("render_start",function(){a.logs.startTime=+new Date}),a.dispatch.on("render_end",function(){a.logs.endTime=+new Date,a.logs.totalTime=a.logs.endTime-a.logs.startTime,a.log("total",a.logs.totalTime)})),a.log=function(){if(a.dev&&window.console&&console.log&&console.log.apply)console.log.apply(console,arguments);else if(a.dev&&window.console&&"function"==typeof console.log&&Function.prototype.bind){var b=Function.prototype.bind.call(console.log,console);b.apply(console,arguments)}return arguments[arguments.length-1]},a.deprecated=function(b){a.dev&&console&&console.warn&&console.warn("`"+b+"` has been deprecated.")},a.render=function(b){b=b||1,a.render.active=!0,a.dispatch.render_start(),setTimeout(function(){for(var c,d,e=0;b>e&&(d=a.render.queue[e]);e++)c=d.generate(),typeof d.callback==typeof Function&&d.callback(c),a.graphs.push(c);a.render.queue.splice(0,e),a.render.queue.length?setTimeout(arguments.callee,0):(a.dispatch.render_end(),a.render.active=!1)},0)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&d3.event.relatedTarget.className.match(c.nvPointerEventsClass))return;return h.elementMouseout({mouseX:d,mouseY:e}),void b.renderGuideLine(null)}var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.renderGuideLine=function(b){if(i){var c=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=b?[a.utils.NaNtoZero(b)]:[],String);c.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),c.exit().remove()}})})}var c=a.models.tooltip(),d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=(d3.scale.linear(),d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick")),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;"function"!=typeof c&&(c=function(a){return a.x});var d=d3.bisector(c).left,e=d3.max([0,d(a,b)-1]),f=c(a[e],e);if("undefined"==typeof f&&(f=e),f===b)return e;var g=d3.min([e+1,a.length-1]),h=c(a[g],g);return"undefined"==typeof h&&(h=g),Math.abs(h-b)>=Math.abs(f-b)?e:g},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";window.nv.tooltip={},window.nv.models.tooltip=function(){function b(){if(l){var a=d3.select(l);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"))/b[2];n.left=n.left*c,n.top=n.top*c}}}function c(a){var b;b=d3.select(l?l:"body");var c=b.select(".nvtooltip");return null===c.node()&&(c=b.append("div").attr("class","nvtooltip "+(k?k:"xy-tooltip")).attr("id",p)),c.node().innerHTML=a,c.style("top",0).style("left",0).style("opacity",0),c.selectAll("div, table, td, tr").classed(q,!0),c.classed(q,!0),c.node()}function d(){if(o&&u(f)){b();var e=n.left,k=null!=j?j:n.top,p=c(t(f));if(m=p,l){var q=l.getElementsByTagName("svg")[0],r=(q?q.getBoundingClientRect():l.getBoundingClientRect(),{left:0,top:0});if(q){var s=q.getBoundingClientRect(),v=l.getBoundingClientRect(),w=s.top;if(0>w){var x=l.getBoundingClientRect();w=Math.abs(w)>x.height?0:w}r.top=Math.abs(w-v.top),r.left=Math.abs(s.left-v.left)}e+=l.offsetLeft+r.left-2*l.scrollLeft,k+=l.offsetTop+r.top-2*l.scrollTop}return i&&i>0&&(k=Math.floor(k/i)*i),a.tooltip.calcTooltipPosition([e,k],g,h,p),d}}var e=null,f=null,g="w",h=50,i=25,j=null,k=null,l=null,m=null,n={left:null,top:null},o=!0,p="nvtooltip-"+Math.floor(1e5*Math.random()),q="nv-pointer-events-none",r=function(a){return a},s=function(a){return a},t=function(a){if(null!=e)return e;if(null==a)return"";var b=d3.select(document.createElement("table")),c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(s(a.value));var d=b.selectAll("tbody").data([a]).enter().append("tbody"),f=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});f.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),f.append("td").classed("key",!0).html(function(a){return a.key}),f.append("td").classed("value",!0).html(function(a,b){return r(a.value,b)}),f.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var g=b.node().outerHTML;return void 0!==a.footer&&(g+="<div class='footer'>"+a.footer+"</div>"),g},u=function(a){return a&&a.series&&a.series.length>0?!0:!1};return d.nvPointerEventsClass=q,d.content=function(a){return arguments.length?(e=a,d):e},d.tooltipElem=function(){return m},d.contentGenerator=function(a){return arguments.length?("function"==typeof a&&(t=a),d):t},d.data=function(a){return arguments.length?(f=a,d):f},d.gravity=function(a){return arguments.length?(g=a,d):g},d.distance=function(a){return arguments.length?(h=a,d):h},d.snapDistance=function(a){return arguments.length?(i=a,d):i},d.classes=function(a){return arguments.length?(k=a,d):k},d.chartContainer=function(a){return arguments.length?(l=a,d):l},d.position=function(a){return arguments.length?(n.left="undefined"!=typeof a.left?a.left:n.left,n.top="undefined"!=typeof a.top?a.top:n.top,d):n},d.fixedTop=function(a){return arguments.length?(j=a,d):j},d.enabled=function(a){return arguments.length?(o=a,d):o},d.valueFormatter=function(a){return arguments.length?("function"==typeof a&&(r=a),d):r},d.headerFormatter=function(a){return arguments.length?("function"==typeof a&&(s=a),d):s},d.id=function(){return p},d},a.tooltip.show=function(b,c,d,e,f,g){var h=document.createElement("div");h.className="nvtooltip "+(g?g:"xy-tooltip");var i=f;(!f||f.tagName.match(/g|svg/i))&&(i=document.getElementsByTagName("body")[0]),h.style.left=0,h.style.top=0,h.style.opacity=0,"string"!=typeof c?h.appendChild(c):h.innerHTML=c,i.appendChild(h),f&&(b[0]=b[0]-f.scrollLeft,b[1]=b[1]-f.scrollTop),a.tooltip.calcTooltipPosition(b,d,e,h)},a.tooltip.findFirstNonSVGParent=function(a){for(;null!==a.tagName.match(/^g|svg$/i);)a=a.parentNode;return a},a.tooltip.findTotalOffsetTop=function(a,b){var c=b;do isNaN(a.offsetTop)||(c+=a.offsetTop);while(a=a.offsetParent);return c},a.tooltip.findTotalOffsetLeft=function(a,b){var c=b;do isNaN(a.offsetLeft)||(c+=a.offsetLeft);while(a=a.offsetParent);return c},a.tooltip.calcTooltipPosition=function(b,c,d,e){var f,g,h=parseInt(e.offsetHeight),i=parseInt(e.offsetWidth),j=a.utils.windowSize().width,k=a.utils.windowSize().height,l=window.pageYOffset,m=window.pageXOffset;k=window.innerWidth>=document.body.scrollWidth?k:k-16,j=window.innerHeight>=document.body.scrollHeight?j:j-16,c=c||"s",d=d||20;var n=function(b){return a.tooltip.findTotalOffsetTop(b,g)},o=function(b){return a.tooltip.findTotalOffsetLeft(b,f)};switch(c){case"e":f=b[0]-i-d,g=b[1]-h/2;var p=o(e),q=n(e);m>p&&(f=b[0]+d>m?b[0]+d:m-p+f),l>q&&(g=l-q+g),q+h>l+k&&(g=l+k-q+g-h);break;case"w":f=b[0]+d,g=b[1]-h/2;var p=o(e),q=n(e);p+i>j&&(f=b[0]-i-d),l>q&&(g=l+5),q+h>l+k&&(g=l+k-q+g-h);break;case"n":f=b[0]-i/2-5,g=b[1]+d;var p=o(e),q=n(e);m>p&&(f=m+5),p+i>j&&(f=f-i/2+5),q+h>l+k&&(g=l+k-q+g-h);break;case"s":f=b[0]-i/2,g=b[1]-h-d;var p=o(e),q=n(e);m>p&&(f=m+5),p+i>j&&(f=f-i/2+5),l>q&&(g=l);break;case"none":f=b[0],g=b[1]-d;var p=o(e),q=n(e)}return e.style.left=f+"px",e.style.top=g+"px",e.style.opacity=1,e.style.position="absolute",e},a.tooltip.cleanup=function(){for(var a=document.getElementsByClassName("nvtooltip"),b=[];a.length;)b.push(a[0]),a[0].style.transitionDelay="0 !important",a[0].style.opacity=0,a[0].className="nvtooltip-pending-removal";setTimeout(function(){for(;b.length;){var a=b.pop();a.parentNode.removeChild(a)}},500)}}(),a.utils.windowSize=function(){var a={width:640,height:480};return document.body&&document.body.offsetWidth&&(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight),"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth&&(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight),window.innerWidth&&window.innerHeight&&(a.width=window.innerWidth,a.height=window.innerHeight),a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){return arguments.length?b instanceof Array?function(a,c){return a.color||b[c%b.length]}:b:a.utils.defaultColor()},a.utils.defaultColor=function(){var a=d3.scale.category20().range();return function(b,c){return b.color||a[c%a.length]}},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px","")),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(key in c){var d=b[key]instanceof Array,e="object"==typeof b[key],f="object"==typeof c[key];e&&!d&&f?a.utils.deepExtend(b[key],c[key]):b[key]=c[key]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(b){return a.deprecated("nv.utils.optionsFunc"),b&&d3.map(b).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;e<c.length;e+=1){var f=c[e]&&c[e].values?c[e].values.length:0;d=f>d?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a[b]=a._calls&&a._calls[b]?a._calls[b]:function(c){return arguments.length?(a._options[b]=c,a):a._options[b]}},a.utils.initOptions=function(b){var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.models.axis=function(){"use strict";function b(g){return t.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var q=g.selectAll("g.nv-wrap.nv-axis").data([b]),r=q.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),u=(r.append("g"),q.select("g"));null!==o?c.ticks(o):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),u.watchTransition(t,"axis").call(c),s=s||c.scale();var v=c.tickFormat();null==v&&(v=s.tickFormat());var w=u.selectAll("text.nv-axislabel").data([h||null]);switch(w.exit().remove(),c.orient()){case"top":w.enter().append("text").attr("class","nv-axislabel");var x;if(x=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),w.attr("text-anchor","middle").attr("y",0).attr("x",x/2),i){var y=q.selectAll("g.nv-axisMaxMin").data(d.domain());y.enter().append("g").attr("class","nv-axisMaxMin").append("text"),y.exit().remove(),y.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=v(a);return(""+b).match("NaN")?"":b}),y.watchTransition(t,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"})}break;case"bottom":var z=p+36,A=30,B=u.selectAll("g").select("text");if(k%360){B.each(function(){var a=this.getBoundingClientRect().width;a>A&&(A=a)});var C=Math.abs(Math.sin(k*Math.PI/180)),z=(C?C*A:A)+30;B.attr("transform",function(){return"rotate("+k+" 0,0)"}).style("text-anchor",k%360>0?"start":"end")}w.enter().append("text").attr("class","nv-axislabel");var x;if(x=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),w.attr("text-anchor","middle").attr("y",z).attr("x",x/2),i){var y=q.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]);y.enter().append("g").attr("class","nv-axisMaxMin").append("text"),y.exit().remove(),y.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(n?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",function(){return"rotate("+k+" 0,0)"}).style("text-anchor",k?k%360>0?"start":"end":"middle").text(function(a){var b=v(a);return(""+b).match("NaN")?"":b}),y.watchTransition(t,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(n?d.rangeBand()/2:0))+",0)"})}m&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":if(w.enter().append("text").attr("class","nv-axislabel"),w.style("text-anchor",l?"middle":"begin").attr("transform",l?"rotate(90)":"").attr("y",l?-Math.max(e.right,f)+12:-10).attr("x",l?d.range()[0]/2:c.tickPadding()),i){var y=q.selectAll("g.nv-axisMaxMin").data(d.domain());y.enter().append("g").attr("class","nv-axisMaxMin").append("text").style("opacity",0),y.exit().remove(),y.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=v(a);return(""+b).match("NaN")?"":b}),y.watchTransition(t,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1)}break;case"left":if(w.enter().append("text").attr("class","nv-axislabel"),w.style("text-anchor",l?"middle":"end").attr("transform",l?"rotate(-90)":"").attr("y",l?-Math.max(e.left,f)+25-(p||0):-10).attr("x",l?-d.range()[0]/2:-c.tickPadding()),i){var y=q.selectAll("g.nv-axisMaxMin").data(d.domain());y.enter().append("g").attr("class","nv-axisMaxMin").append("text").style("opacity",0),y.exit().remove(),y.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(s(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=v(a);return(""+b).match("NaN")?"":b}),y.watchTransition(t,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1)}}if(w.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(u.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)<d.range()[1]+10||d(a)>d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&q.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var D=[];q.selectAll("g.nv-axisMaxMin").each(function(a,b){try{D.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){D.push(b?d(a)-4:d(a)+4)}}),u.selectAll("g").each(function(a){(d(a)<D[0]||d(a)>D[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}j&&u.selectAll(".tick").filter(function(){return!parseFloat(Math.round(1e5*this.__data__)/1e6)&&void 0!==this.__data__}).classed("zero",!0),s=d.copy()}),t.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=!0,k=0,l=!0,m=!1,n=!1,o=null,p=0,q=250,r=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var s,t=a.utils.renderWatch(r,q);return b.axis=c,b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return p},set:function(a){p=a}},staggerLabels:{get:function(){return m},set:function(a){m=a}},rotateLabels:{get:function(){return k},set:function(a){k=a}},rotateYLabel:{get:function(){return l},set:function(a){l=a}},highlightZero:{get:function(){return j},set:function(a){j=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return o},set:function(a){o=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return q},set:function(a){q=a,t.reset(q)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),n="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var o=m-c.left-c.right,r=n-c.top-c.bottom,s=d3.select(this);a.utils.initSVG(s);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[o,0]:[0,o]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=s.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),F.append("path").attr("class","nv-markerTriangle"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",r).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",r).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",r).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",p).attr("height",r/3).attr("y",r/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){q.elementMouseover({value:v[0],label:y[0]||"Current",pos:[z(v[0]),r/2]})}).on("mouseout",function(){q.elementMouseout({value:v[0],label:y[0]||"Current"})});var J=r/6;u[0]?G.selectAll("path.nv-markerTriangle").attr("transform",function(){return"translate("+z(u[0])+","+r/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(){q.elementMouseover({value:u[0],label:x[0]||"Previous",pos:[z(u[0]),r/2]})}).on("mouseout",function(){q.elementMouseout({value:u[0],label:x[0]||"Previous"})}):G.selectAll("path.nv-markerTriangle").remove(),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");q.elementMouseover({value:a,label:c,pos:[z(a),r/2]})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");q.elementMouseout({value:a,label:c})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=a.utils.getColor(["#1f77b4"]),q=d3.dispatch("elementMouseover","elementMouseout");return b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(n,r){var s=d3.select(this);a.utils.initSVG(s);var t=(j||parseInt(s.style("width"))||960)-f.left-f.right,u=k-f.top-f.bottom,v=this;if(b.update=function(){b(d)},b.container=this,!n||!g.call(this,n,r)){var w=s.selectAll(".nv-noData").data([o]);return w.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),w.attr("x",f.left+t/2).attr("y",18+f.top+u/2).text(function(a){return a}),b}s.selectAll(".nv-noData").remove();var x=g.call(this,n,r).slice().sort(d3.descending),y=h.call(this,n,r).slice().sort(d3.descending),z=i.call(this,n,r).slice().sort(d3.descending),A=s.selectAll("g.nv-wrap.nv-bulletChart").data([n]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),C=B.append("g"),D=A.select("g");C.append("g").attr("class","nv-bulletWrap"),C.append("g").attr("class","nv-titles"),A.attr("transform","translate("+f.left+","+f.top+")");var E=d3.scale.linear().domain([0,Math.max(x[0],y[0],z[0])]).range(e?[t,0]:[0,t]),F=this.__chart__||d3.scale.linear().domain([0,1/0]).range(E.range());this.__chart__=E;var G=C.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(k-f.top-f.bottom)/2+")");G.append("text").attr("class","nv-title").text(function(a){return a.title}),G.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(t).height(u);var H=D.select(".nv-bulletWrap");d3.transition(H).call(c);var I=l||E.tickFormat(t/100),J=D.selectAll("g.nv-tick").data(E.ticks(t/50),function(a){return this.textContent||I(a)}),K=J.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+F(a)+",0)"}).style("opacity",1e-6);K.append("line").attr("y1",u).attr("y2",7*u/6),K.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*u/6).text(I);var L=d3.transition(J).attr("transform",function(a){return"translate("+E(a)+",0)"}).style("opacity",1);L.select("line").attr("y1",u).attr("y2",7*u/6),L.select("text").attr("y",7*u/6),d3.transition(J.exit()).attr("transform",function(a){return"translate("+E(a)+",0)"}).style("opacity",1e-6).remove(),p.on("tooltipShow",function(a){a.key=n.title,m&&q(a,v.parentNode)})}),d3.timer.flush(),b}var c=a.models.bullet(),d="left",e=!1,f={top:5,right:40,bottom:20,left:120},g=function(a){return a.ranges},h=function(a){return a.markers?a.markers:[0]},i=function(a){return a.measures},j=null,k=55,l=null,m=!0,n=function(a,b,c){return"<h3>"+b+"</h3><p>"+c+"</p>"},o="No Data Available.",p=d3.dispatch("tooltipShow","tooltipHide"),q=function(c,d){var e=c.pos[0]+(d.offsetLeft||0)+f.left,g=c.pos[1]+(d.offsetTop||0)+f.top,h=n(c.key,c.label,c.value,c,b);a.tooltip.show([e,g],h,c.value<0?"e":"w",null,d)};return c.dispatch.on("elementMouseover.tooltip",function(a){p.tooltipShow(a)}),c.dispatch.on("elementMouseout.tooltip",function(a){p.tooltipHide(a)}),p.on("tooltipHide",function(){m&&a.tooltip.cleanup()}),b.bullet=c,b.dispatch=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return g},set:function(a){g=a}},markers:{get:function(){return h},set:function(a){h=a}},measures:{get:function(){return i},set:function(a){i=a}},width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},tickFormat:{get:function(){return l},set:function(a){l=a}},tooltips:{get:function(){return m},set:function(a){m=a}},tooltipContent:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(x){return I.reset(),I.models(f),q&&I.models(g),r&&I.models(h),x.each(function(x){function F(){d3.select(b.container).style("cursor","ew-resize")}function I(){H.x=d3.event.x,H.i=Math.round(G.invert(H.x)),N()}function M(){d3.select(b.container).style("cursor","auto"),z.index=H.i,D.stateChange(z)}function N(){fb.data([H]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var O=d3.select(this);a.utils.initSVG(O),O.classed("nv-chart-"+y,!0);var P=this,Q=(n||parseInt(O.style("width"))||960)-l.left-l.right,R=(o||parseInt(O.style("height"))||400)-l.top-l.bottom;if(b.update=function(){0===E?O.call(b):O.transition().duration(E).call(b)},b.container=this,z.setter(L(x),b.update).getter(K(x)).update(),z.disabled=x.map(function(a){return!!a.disabled}),!A){var S;A={};for(S in z)A[S]=z[S]instanceof Array?z[S].slice(0):z[S]}var T=d3.behavior.drag().on("dragstart",F).on("drag",I).on("dragend",M);if(!(x&&x.length&&x.filter(function(a){return a.values.length}).length)){var U=O.selectAll(".nv-noData").data([B]);return U.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),U.attr("x",l.left+Q/2).attr("y",l.top+R/2).text(function(a){return a}),b}if(O.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var V=x.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),W=[d3.min(V,function(a){return a[0]
- }),d3.max(V,function(a){return a[1]})];f.yDomain(W)}G.domain([0,x[0].values.length-1]).range([0,Q]).clamp(!0);var x=c(H.i,x),X=v?"none":"all",Y=O.selectAll("g.nv-wrap.nv-cumulativeLine").data([x]),Z=Y.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),$=Y.select("g");if(Z.append("g").attr("class","nv-interactive"),Z.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),Z.append("g").attr("class","nv-y nv-axis"),Z.append("g").attr("class","nv-background"),Z.append("g").attr("class","nv-linesWrap").style("pointer-events",X),Z.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),Z.append("g").attr("class","nv-legendWrap"),Z.append("g").attr("class","nv-controlsWrap"),p&&(i.width(Q),$.select(".nv-legendWrap").datum(x).call(i),l.top!=i.height()&&(l.top=i.height(),R=(o||parseInt(O.style("height"))||400)-l.top-l.bottom),$.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),u){var _=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),$.select(".nv-controlsWrap").datum(_).attr("transform","translate(0,"+-l.top+")").call(j)}Y.attr("transform","translate("+l.left+","+l.top+")"),s&&$.select(".nv-y.nv-axis").attr("transform","translate("+Q+",0)");var ab=x.filter(function(a){return a.tempDisabled});Y.select(".tempDisabled").remove(),ab.length&&Y.append("text").attr("class","tempDisabled").attr("x",Q/2).attr("y","-.71em").style("text-anchor","end").text(ab.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(Q).height(R).margin({left:l.left,top:l.top}).svgContainer(O).xScale(d),Y.select(".nv-interactive").call(k)),Z.select(".nv-background").append("rect"),$.select(".nv-background rect").attr("width",Q).attr("height",R),f.y(function(a){return a.display.y}).width(Q).height(R).color(x.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!x[b].disabled&&!x[b].tempDisabled}));var bb=$.select(".nv-linesWrap").datum(x.filter(function(a){return!a.disabled&&!a.tempDisabled}));bb.call(f),x.forEach(function(a,b){a.seriesIndex=b});var cb=x.filter(function(a){return!a.disabled&&!!C(a)}),db=$.select(".nv-avgLinesWrap").selectAll("line").data(cb,function(a){return a.key}),eb=function(a){var b=e(C(a));return 0>b?0:b>R?R:b};db.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",Q).attr("y1",eb).attr("y2",eb),db.style("stroke-opacity",function(a){var b=e(C(a));return 0>b||b>R?0:1}).attr("x1",0).attr("x2",Q).attr("y1",eb).attr("y2",eb),db.exit().remove();var fb=bb.selectAll(".nv-indexLine").data([H]);fb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(T),fb.attr("transform",function(a){return"translate("+G(a.i)+",0)"}).attr("height",R),q&&(g.scale(d).ticks(a.utils.calcTicksX(Q/70,x)).tickSize(-R,0),$.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),$.select(".nv-x.nv-axis").call(g)),r&&(h.scale(e).ticks(a.utils.calcTicksY(R/36,x)).tickSize(-Q,0),$.select(".nv-y.nv-axis").call(h)),$.select(".nv-background rect").on("click",function(){H.x=d3.mouse(this)[0],H.i=Math.round(G.invert(H.x)),z.index=H.i,D.stateChange(z),N()}),f.dispatch.on("elementClick",function(a){H.i=a.pointIndex,H.x=G(H.i),z.index=H.i,D.stateChange(z),N()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,z.rescaleY=w,D.stateChange(z),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)z[c]=a[c];D.stateChange(z),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(x.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:m(g,g.seriesIndex)}))}),j.length>2){var n=b.yScale().invert(c.mouseY),o=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),p=.03*o,q=a.nearestValueIndex(j.map(function(a){return a.value}),n,p);null!==q&&(j[q].highlight=!0)}var r=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+l.left,top:c.mouseY+l.top}).chartContainer(P.parentNode).enabled(t).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:r,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){D.tooltipHide(),f.clearHighlights()}),D.on("tooltipShow",function(a){t&&J(a,P.parentNode)}),D.on("changeState",function(a){"undefined"!=typeof a.disabled&&(x.forEach(function(b,c){b.disabled=a.disabled[c]}),z.disabled=a.disabled),"undefined"!=typeof a.index&&(H.i=a.index,H.x=G(H.i),z.index=a.index,fb.data([H])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),I.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return M||(M=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=M(c,a);return-.95>d&&!F?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(M(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l={top:30,right:30,bottom:50,left:60},m=a.utils.defaultColor(),n=null,o=null,p=!0,q=!0,r=!0,s=!1,t=!0,u=!0,v=!1,w=!0,x=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},y=f.id(),z=a.utils.state(),A=null,B="No Data Available.",C=function(a){return a.average},D=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),E=250,F=!1;z.index=0,z.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),j.updateState(!1);var G=d3.scale.linear(),H={i:0,x:0},I=a.utils.renderWatch(D,E),J=function(c,d){var e=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=g.tickFormat()(f.x()(c.point,c.pointIndex)),k=h.tickFormat()(f.y()(c.point,c.pointIndex)),l=x(c.series.key,j,k,c,b);a.tooltip.show([e,i],l,null,null,d)},K=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:H.i,rescaleY:w}}},L=function(a){return function(b){void 0!==b.index&&(H.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+l.left,a.pos[1]+l.top],D.tooltipShow(a)}),f.dispatch.on("elementMouseout.tooltip",function(a){D.tooltipHide(a)}),D.on("tooltipHide",function(){t&&a.tooltip.cleanup()});var M=null;return b.dispatch=D,b.lines=f,b.legend=i,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return p},set:function(a){p=a}},average:{get:function(){return C},set:function(a){C=a}},tooltips:{get:function(){return t},set:function(a){t=a}},tooltipContent:{get:function(){return x},set:function(a){x=a}},defaultState:{get:function(){return A},set:function(a){A=a}},noData:{get:function(){return B},set:function(a){B=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},noErrorCheck:{get:function(){return F},set:function(a){F=a}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},duration:{get:function(){return E},set:function(a){E=a,f.duration(E),g.duration(E),h.duration(E),I.reset(E)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(l){return x.reset(),l.each(function(b){var l=j-i.left-i.right,w=k-i.top-i.bottom,y=d3.select(this);a.utils.initSVG(y),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=c&&d?[]:b.map(function(a){return a.values.map(function(a,b){return{x:o(a,b),y:p(a,b),y0:a.y0}})});m.domain(c||d3.merge(z).map(function(a){return a.x})).rangeBands(e||[0,l],.1),n.domain(d||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(q))),n.range(s?f||[w-(n.domain()[0]<0?12:0),n.domain()[1]>0?12:0]:f||[w,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var A=y.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+i.left+","+i.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(x,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(x,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", "+n(0)+")"}).on("mouseover",function(a,c){d3.select(this).classed("hover",!0),u.elementMouseover({value:p(a,c),point:a,series:b[a.series],pos:[m(o(a,c))+m.rangeBand()*(a.series+.5)/b.length,n(p(a,c))],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("mouseout",function(a,c){d3.select(this).classed("hover",!1),u.elementMouseout({value:p(a,c),point:a,series:b[a.series],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("click",function(a,c){u.elementClick({value:p(a,c),point:a,series:b[a.series],pos:[m(o(a,c))+m.rangeBand()*(a.series+.5)/b.length,n(p(a,c))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(a,c){u.elementDblClick({value:p(a,c),point:a,series:b[a.series],pos:[m(o(a,c))+m.rangeBand()*(a.series+.5)/b.length,n(p(a,c))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*m.rangeBand()/b.length),s?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return t(p(a,b))}).watchTransition(x,"discreteBar: bars text").attr("x",.9*m.rangeBand()/2).attr("y",function(a,b){return p(a,b)<0?n(p(a,b))-n(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return p(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||r(a,b)}).style("stroke",function(a,b){return a.color||r(a,b)}).select("rect").attr("class",v).watchTransition(x,"discreteBar: bars rect").attr("width",.9*m.rangeBand()/b.length),E.watchTransition(x,"discreteBar: bars").attr("transform",function(a,b){var c=m(o(a,b))+.05*m.rangeBand(),d=p(a,b)<0?n(0):n(0)-n(p(a,b))<1?n(0)-1:n(p(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(n(p(a,b))-n(d&&d[0]||0))||1)}),g=m.copy(),h=n.copy()}),x.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=[0],r=a.utils.defaultColor(),s=!1,t=d3.format(",.2f"),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),v="discreteBar",w=250,x=a.utils.renderWatch(u,w);return b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},forceY:{get:function(){return q},set:function(a){q=a}},showValues:{get:function(){return s},set:function(a){s=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},valueFormat:{get:function(){return t},set:function(a){t=a}},id:{get:function(){return l},set:function(a){l=a}},rectClass:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return r},set:function(b){r=a.utils.getColor(b)}},duration:{get:function(){return w},set:function(a){w=a,x.reset(w)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(k){return v.reset(),v.models(e),l&&v.models(f),m&&v.models(g),k.each(function(k){var q=d3.select(this),v=this;a.utils.initSVG(q);var w=(i||parseInt(q.style("width"))||960)-h.left-h.right,x=(j||parseInt(q.style("height"))||400)-h.top-h.bottom;if(b.update=function(){s.beforeUpdate(),q.transition().duration(t).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.length}).length)){var y=q.selectAll(".nv-noData").data([r]);return y.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),y.attr("x",h.left+w/2).attr("y",h.top+x/2).text(function(a){return a}),b}q.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var z=q.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([k]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),B=A.append("defs"),C=z.select("g");A.append("g").attr("class","nv-x nv-axis"),A.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),A.append("g").attr("class","nv-barsWrap"),C.attr("transform","translate("+h.left+","+h.top+")"),n&&C.select(".nv-y.nv-axis").attr("transform","translate("+w+",0)"),e.width(w).height(x);var D=C.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(D.transition().call(e),B.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),C.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(w/100,k)).tickSize(-x,0),C.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),C.select(".nv-x.nv-axis").call(f);var E=C.select(".nv-x.nv-axis").selectAll("g");o&&E.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(a.utils.calcTicksY(x/36,k)).tickSize(-w,0),C.select(".nv-y.nv-axis").call(g)),C.select(".nv-zeroLine line").attr("x1",0).attr("x2",w).attr("y1",d(0)).attr("y2",d(0)),s.on("tooltipShow",function(a){p&&u(a,v.parentNode)})}),v.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=!0,q=function(a,b,c){return"<h3>"+b+"</h3><p>"+c+"</p>"},r="No Data Available.",s=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),t=250;f.orient("bottom").highlightZero(!1).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f"));var u=function(c,d){var h=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=f.tickFormat()(e.x()(c.point,c.pointIndex)),k=g.tickFormat()(e.y()(c.point,c.pointIndex)),l=q(c.series.key,j,k,c,b);a.tooltip.show([h,i],l,c.value<0?"n":"s",null,d)},v=a.utils.renderWatch(s,t);return e.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+h.left,a.pos[1]+h.top],s.tooltipShow(a)}),e.dispatch.on("elementMouseout.tooltip",function(a){s.tooltipHide(a)}),s.on("tooltipHide",function(){p&&a.tooltip.cleanup()}),b.dispatch=s,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return p},set:function(a){p=a}},tooltipContent:{get:function(){return q},set:function(a){q=a}},noData:{get:function(){return r},set:function(a){r=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t),e.duration(t),f.duration(t),g.duration(t)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.historicalBar=function(){"use strict";function b(w){return w.each(function(b){v.reset();var w=d3.select(this),x=(h||parseInt(w.style("width"))||960)-g.left-g.right,y=(i||parseInt(w.style("height"))||400)-g.top-g.bottom;a.utils.initSVG(w),k.domain(c||d3.extent(b[0].values.map(m).concat(o))),k.range(q?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),l.domain(d||d3.extent(b[0].values.map(n).concat(p))).range(f||[y,0]),k.domain()[0]===k.domain()[1]&&k.domain(k.domain()[0]?[k.domain()[0]-.01*k.domain()[0],k.domain()[1]+.01*k.domain()[1]]:[-1,1]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]+.01*l.domain()[0],l.domain()[1]-.01*l.domain()[1]]:[-1,1]);var z=w.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),w.on("click",function(a,b){t.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",r?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return m(a,b)});E.exit().remove();E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(l(Math.max(0,n(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(l(n(b,c))-l(0)))}).attr("transform",function(a,c){return"translate("+(k(m(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,c){u&&(d3.select(this).classed("hover",!0),t.elementMouseover({point:a,series:b[0],pos:[k(m(a,c)),l(n(a,c))],pointIndex:c,seriesIndex:0,e:d3.event}))}).on("mouseout",function(a,c){u&&(d3.select(this).classed("hover",!1),t.elementMouseout({point:a,series:b[0],pointIndex:c,seriesIndex:0,e:d3.event}))}).on("click",function(a,b){u&&(t.elementClick({value:n(a,b),data:a,index:b,pos:[k(m(a,b)),l(n(a,b))],e:d3.event,id:j}),d3.event.stopPropagation())}).on("dblclick",function(a,b){u&&(t.elementDblClick({value:n(a,b),data:a,index:b,pos:[k(m(a,b)),l(n(a,b))],e:d3.event,id:j}),d3.event.stopPropagation())});E.attr("fill",function(a,b){return s(a,b)}).attr("class",function(a,b,c){return(n(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(v,"bars").attr("transform",function(a,c){return"translate("+(k(m(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(v,"bars").attr("y",function(b,c){var d=n(b,c)<0?l(0):l(0)-l(n(b,c))<1?l(0)-1:l(n(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(l(n(b,c))-l(0)),1))})}),v.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=d3.scale.linear(),l=d3.scale.linear(),m=function(a){return a.x},n=function(a){return a.y},o=[],p=[0],q=!1,r=!0,s=a.utils.defaultColor(),t=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),u=!0,v=a.utils.renderWatch(t,0);return b.highlightPoint=function(a,b){d3.select(".nv-historicalBar-"+j).select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){d3.select(".nv-historicalBar-"+j).select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=t,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return o},set:function(a){o=a}},forceY:{get:function(){return p},set:function(a){p=a}},padData:{get:function(){return q},set:function(a){q=a}},x:{get:function(){return m},set:function(a){m=a}},y:{get:function(){return n},set:function(a){n=a}},xScale:{get:function(){return k},set:function(a){k=a}},yScale:{get:function(){return l},set:function(a){l=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return r},set:function(a){r=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return u},set:function(a){u=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(u){B.reset(),B.models(f),p&&B.models(g),q&&B.models(h);var C=d3.select(this),D=this;a.utils.initSVG(C);var E=(m||parseInt(C.style("width"))||960)-k.left-k.right,F=(n||parseInt(C.style("height"))||400)-k.top-k.bottom;if(c.update=function(){C.transition().duration(z).call(c)},c.container=this,v.disabled=u.map(function(a){return!!a.disabled}),!w){var G;w={};for(G in v)w[G]=v[G]instanceof Array?v[G].slice(0):v[G]}if(!(u&&u.length&&u.filter(function(a){return a.values.length}).length)){var H=C.selectAll(".nv-noData").data([x]);return H.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),H.attr("x",k.left+E/2).attr("y",k.top+F/2).text(function(a){return a}),c}C.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var I=C.selectAll("g.nv-wrap.nv-historicalBarChart").data([u]),J=I.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),K=I.select("g");J.append("g").attr("class","nv-x nv-axis"),J.append("g").attr("class","nv-y nv-axis"),J.append("g").attr("class","nv-barsWrap"),J.append("g").attr("class","nv-legendWrap"),J.append("g").attr("class","nv-interactive"),o&&(i.width(E),K.select(".nv-legendWrap").datum(u).call(i),k.top!=i.height()&&(k.top=i.height(),F=(n||parseInt(C.style("height"))||400)-k.top-k.bottom),I.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),I.attr("transform","translate("+k.left+","+k.top+")"),r&&K.select(".nv-y.nv-axis").attr("transform","translate("+E+",0)"),s&&(j.width(E).height(F).margin({left:k.left,top:k.top}).svgContainer(C).xScale(d),I.select(".nv-interactive").call(j)),f.width(E).height(F).color(u.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!u[b].disabled}));var L=K.select(".nv-barsWrap").datum(u.filter(function(a){return!a.disabled}));L.transition().call(f),p&&(g.scale(d).tickSize(-F,0),K.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),K.select(".nv-x.nv-axis").transition().call(g)),q&&(h.scale(e).ticks(a.utils.calcTicksY(F/36,u)).tickSize(-E,0),K.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,m=[];u.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];"undefined"!=typeof h&&("undefined"==typeof d&&(d=h),"undefined"==typeof i&&(i=c.xScale()(c.x()(h,e))),m.push({key:g.key,value:c.y()(h,e),color:l(g,g.seriesIndex),data:g.values[e]}))});var n=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+k.left,top:b.mouseY+k.top}).chartContainer(D.parentNode).enabled(t).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:n,series:m})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){y.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,u.filter(function(a){return!a.disabled}).length||u.map(function(a){return a.disabled=!1,I.selectAll(".nv-series").classed("disabled",!1),a}),v.disabled=u.map(function(a){return!!a.disabled}),y.stateChange(v),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){u.forEach(function(a){a.disabled=!0}),a.disabled=!1,v.disabled=u.map(function(a){return!!a.disabled}),y.stateChange(v),c.update()}),y.on("tooltipShow",function(a){t&&A(a,D.parentNode)}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(u.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),c.update()})}),B.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k={top:30,right:90,bottom:50,left:90},l=a.utils.defaultColor(),m=null,n=null,o=!1,p=!0,q=!0,r=!1,s=!1,t=!0,u=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},v={},w=null,x="No Data Available.",y=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),z=250;g.orient("bottom").tickPadding(7),h.orient(r?"right":"left");var A=function(b,d){if(d){var e=d3.select(d).select("svg"),i=e.node()?e.attr("viewBox"):null;if(i){i=i.split(" ");var j=parseInt(e.style("width"))/i[2];b.pos[0]=b.pos[0]*j,b.pos[1]=b.pos[1]*j}}var k=b.pos[0]+(d.offsetLeft||0),l=b.pos[1]+(d.offsetTop||0),m=g.tickFormat()(f.x()(b.point,b.pointIndex)),n=h.tickFormat()(f.y()(b.point,b.pointIndex)),o=u(b.series.key,m,n,b,c);a.tooltip.show([k,l],o,null,null,d)},B=a.utils.renderWatch(y,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+k.left,a.pos[1]+k.top],y.tooltipShow(a)}),f.dispatch.on("elementMouseout.tooltip",function(a){y.tooltipHide(a)}),y.on("tooltipHide",function(){t&&a.tooltip.cleanup()}),c.dispatch=y,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return t},set:function(a){t=a}},tooltipContent:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),i.color(l),f.color(l)}},duration:{get:function(){return z},set:function(a){z=a,B.reset(z),h.duration(z),g.duration(z)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open<c.close?"2ca02c":"d62728";return'<h3 style="color: #'+d+'">'+a.value+"</h3><table><tr><td>open:</td><td>"+b.yAxis.tickFormat()(c.open)+"</td></tr><tr><td>close:</td><td>"+b.yAxis.tickFormat()(c.close)+"</td></tr><tr><td>high</td><td>"+b.yAxis.tickFormat()(c.high)+"</td></tr><tr><td>low:</td><td>"+b.yAxis.tickFormat()(c.low)+"</td></tr></table>"}),b},a.models.legend=function(){"use strict";function b(m){return m.each(function(b){var m=d-c.left-c.right,n=d3.select(this);a.utils.initSVG(n);var o=n.selectAll("g.nv-legend").data([b]),p=(o.enter().append("g").attr("class","nvd3 nv-legend").append("g"),o.select("g"));o.attr("transform","translate("+c.left+","+c.top+")");var q=p.selectAll(".nv-series").data(function(a){return a}),r=q.enter().append("g").attr("class","nv-series").on("mouseover",function(a,b){l.legendMouseover(a,b)}).on("mouseout",function(a,b){l.legendMouseout(a,b)}).on("click",function(a,c){l.legendClick(a,c),j&&(k?(b.forEach(function(a){a.disabled=!0
- }),a.disabled=!1):(a.disabled=!a.disabled,b.every(function(a){return a.disabled})&&b.forEach(function(a){a.disabled=!1})),l.stateChange({disabled:b.map(function(a){return!!a.disabled})}))}).on("dblclick",function(a,c){l.legendDblclick(a,c),j&&(b.forEach(function(a){a.disabled=!0}),a.disabled=!1,l.stateChange({disabled:b.map(function(a){return!!a.disabled})}))});if(r.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),r.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8"),q.classed("nv-disabled",function(a){return a.disabled}),q.exit().remove(),q.select("circle").style("fill",function(a,b){return a.color||g(a,b)}).style("stroke",function(a,b){return a.color||g(a,b)}),q.select("text").text(f),h){var s=[];q.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}s.push(b+28)});for(var t=0,u=0,v=[];m>u&&t<s.length;)v[t]=s[t],u+=s[t++];for(0===t&&(t=1);u>m&&t>1;){v=[],t--;for(var w=0;w<s.length;w++)s[w]>(v[w%t]||0)&&(v[w%t]=s[w]);u=v.reduce(function(a,b){return a+b})}for(var x=[],y=0,z=0;t>y;y++)x[y]=z,z+=v[y];q.attr("transform",function(a,b){return"translate("+x[b%t]+","+(5+20*Math.floor(b/t))+")"}),i?p.attr("transform","translate("+(d-c.right-u)+","+c.top+")"):p.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+20*Math.ceil(s.length/t)}else{var A,B=5,C=5,D=0;q.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+28;return A=C,d<c.left+c.right+A+a&&(C=A=5,B+=20),C+=a,C>D&&(D=C),"translate("+A+","+B+")"}),p.attr("transform","translate("+(d-c.right-D)+","+c.top+")"),e=c.top+c.bottom+B+15}}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.defaultColor(),h=!0,i=!0,j=!0,k=!1,l=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange");return b.dispatch=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return j},set:function(a){j=a}},radioButtonMode:{get:function(){return k},set:function(a){k=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(p){return t.reset(),t.models(e),p.each(function(b){var p=g-f.left-f.right,q=h-f.top-f.bottom,u=d3.select(this);a.utils.initSVG(u),c=e.xScale(),d=e.yScale(),r=r||c,s=s||d;var v=u.selectAll("g.nv-wrap.nv-line").data([b]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),x=w.append("defs"),y=w.append("g"),z=v.select("g");y.append("g").attr("class","nv-groups"),y.append("g").attr("class","nv-scatterWrap"),v.attr("transform","translate("+f.left+","+f.top+")"),e.width(p).height(q);var A=v.select(".nv-scatterWrap");A.call(e),x.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),v.select("#nv-edge-clip-"+e.id()+" rect").attr("width",p).attr("height",q>0?q:0),z.attr("clip-path",n?"url(#nv-edge-clip-"+e.id()+")":""),A.attr("clip-path",n?"url(#nv-edge-clip-"+e.id()+")":"");var B=v.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});B.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),B.exit().remove(),B.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return i(a,b)}).style("stroke",function(a,b){return i(a,b)}),B.watchTransition(t,"line: groups").style("stroke-opacity",1).style("fill-opacity",.5);var C=B.selectAll("path.nv-area").data(function(a){return m(a)?[a]:[]});C.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(o).defined(l).x(function(b,c){return a.utils.NaNtoZero(r(j(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(s(k(b,c)))}).y1(function(){return s(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),B.exit().selectAll("path.nv-area").remove(),C.watchTransition(t,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(o).defined(l).x(function(b,d){return a.utils.NaNtoZero(c(j(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(k(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var D=B.selectAll("path.nv-line").data(function(a){return[a.values]});D.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(o).defined(l).x(function(b,c){return a.utils.NaNtoZero(r(j(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(s(k(b,c)))})),D.watchTransition(t,"line: linePaths").attr("d",d3.svg.line().interpolate(o).defined(l).x(function(b,d){return a.utils.NaNtoZero(c(j(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(k(b,c)))})),r=c.copy(),s=d.copy()}),t.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=a.utils.defaultColor(),j=function(a){return a.x},k=function(a){return a.y},l=function(a,b){return!isNaN(k(a,b))&&null!==k(a,b)},m=function(a){return a.area},n=!1,o="linear",p=250,q=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var r,s,t=a.utils.renderWatch(q,p);return b.dispatch=q,b.scatter=e,e.dispatch.on("elementClick",function(){q.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){q.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){q.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return l},set:function(a){l=a}},interpolate:{get:function(){return o},set:function(a){o=a}},clipEdge:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return p},set:function(a){p=a,t.reset(p),e.duration(p)}},isArea:{get:function(){return m},set:function(a){m=d3.functor(a)}},x:{get:function(){return j},set:function(a){j=a,e.x(a)}},y:{get:function(){return k},set:function(a){k=a,e.y(a)}},color:{get:function(){return i},set:function(b){i=a.utils.getColor(b),e.color(i)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(t){return A.reset(),A.models(e),o&&A.models(f),p&&A.models(g),t.each(function(t){var A=d3.select(this),D=this;a.utils.initSVG(A);var E=(l||parseInt(A.style("width"))||960)-j.left-j.right,F=(m||parseInt(A.style("height"))||400)-j.top-j.bottom;if(b.update=function(){0===y?A.call(b):A.transition().duration(y).call(b)},b.container=this,u.setter(C(t),b.update).getter(B(t)).update(),u.disabled=t.map(function(a){return!!a.disabled}),!v){var G;v={};for(G in u)v[G]=u[G]instanceof Array?u[G].slice(0):u[G]}if(!(t&&t.length&&t.filter(function(a){return a.values.length}).length)){var H=A.selectAll(".nv-noData").data([w]);return H.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),H.attr("x",j.left+E/2).attr("y",j.top+F/2).text(function(a){return a}),b}A.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var I=A.selectAll("g.nv-wrap.nv-lineChart").data([t]),J=I.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),K=I.select("g");J.append("rect").style("opacity",0),J.append("g").attr("class","nv-x nv-axis"),J.append("g").attr("class","nv-y nv-axis"),J.append("g").attr("class","nv-linesWrap"),J.append("g").attr("class","nv-legendWrap"),J.append("g").attr("class","nv-interactive"),K.select("rect").attr("width",E).attr("height",F>0?F:0),n&&(h.width(E),K.select(".nv-legendWrap").datum(t).call(h),j.top!=h.height()&&(j.top=h.height(),F=(m||parseInt(A.style("height"))||400)-j.top-j.bottom),I.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")),I.attr("transform","translate("+j.left+","+j.top+")"),q&&K.select(".nv-y.nv-axis").attr("transform","translate("+E+",0)"),r&&(i.width(E).height(F).margin({left:j.left,top:j.top}).svgContainer(A).xScale(c),I.select(".nv-interactive").call(i)),e.width(E).height(F).color(t.map(function(a,b){return a.color||k(a,b)}).filter(function(a,b){return!t[b].disabled}));var L=K.select(".nv-linesWrap").datum(t.filter(function(a){return!a.disabled}));L.call(e),o&&(f.scale(c).ticks(a.utils.calcTicksX(E/100,t)).tickSize(-F,0),K.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),K.select(".nv-x.nv-axis").call(f)),p&&(g.scale(d).ticks(a.utils.calcTicksY(F/36,t)).tickSize(-E,0),K.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,l,m=[];if(t.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x()),e.highlightPoint(g,h,!0);var i=f.values[h];"undefined"!=typeof i&&("undefined"==typeof d&&(d=i),"undefined"==typeof l&&(l=b.xScale()(b.x()(i,h))),m.push({key:f.key,value:b.y()(i,h),color:k(f,f.seriesIndex)}))}),m.length>2){var n=b.yScale().invert(c.mouseY),o=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),p=.03*o,q=a.nearestValueIndex(m.map(function(a){return a.value}),n,p);null!==q&&(m[q].highlight=!0)}var r=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:l+j.left,top:c.mouseY+j.top}).chartContainer(D.parentNode).enabled(s).valueFormatter(function(a){return g.tickFormat()(a)}).data({value:r,series:m})(),i.renderGuideLine(l)}),i.dispatch.on("elementClick",function(c){var d,f=[];t.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){x.tooltipHide(),e.clearHighlights()}),x.on("tooltipShow",function(a){s&&z(a,D.parentNode)}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&t.length===a.disabled.length&&(t.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),b.update()})}),A.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j={top:30,right:20,bottom:50,left:60},k=a.utils.defaultColor(),l=null,m=null,n=!0,o=!0,p=!0,q=!1,r=!1,s=!0,t=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},u=a.utils.state(),v=null,w="No Data Available.",x=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),y=250;f.orient("bottom").tickPadding(7),g.orient(q?"right":"left");var z=function(c,d){var h=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=f.tickFormat()(e.x()(c.point,c.pointIndex)),k=g.tickFormat()(e.y()(c.point,c.pointIndex)),l=t(c.series.key,j,k,c,b);a.tooltip.show([h,i],l,null,null,d)},A=a.utils.renderWatch(x,y),B=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},C=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+j.left,a.pos[1]+j.top],x.tooltipShow(a)}),e.dispatch.on("elementMouseout.tooltip",function(a){x.tooltipHide(a)}),x.on("tooltipHide",function(){s&&a.tooltip.cleanup()}),b.dispatch=x,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.dispatch=x,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return n},set:function(a){n=a}},showXAxis:{get:function(){return o},set:function(a){o=a}},showYAxis:{get:function(){return p},set:function(a){p=a}},tooltips:{get:function(){return s},set:function(a){s=a}},tooltipContent:{get:function(){return t},set:function(a){t=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return y},set:function(a){y=a,A.reset(y),e.duration(y),f.duration(y),g.duration(y)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),h.color(k),e.color(k)}},rightAlignYAxis:{get:function(){return q},set:function(a){q=a,g.orient(q?"right":"left")}},useInteractiveGuideline:{get:function(){return r},set:function(a){r=a,r&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(J){return J.each(function(J){function U(a){var b=+("e"==a),c=b?1:-1,d=_/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function V(){u.empty()||u.extent(H),nb.data([u.empty()?e.domain():H]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function W(){H=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),L.brush({extent:c,brush:u}),V(),l.width(Z).height($).color(J.map(function(a,b){return a.color||B(a,b)}).filter(function(a,b){return!J[b].disabled&&J[b].bar})),j.width(Z).height($).color(J.map(function(a,b){return a.color||B(a,b)}).filter(function(a,b){return!J[b].disabled&&!J[b].bar}));var b=ib.select(".nv-focus .nv-barsWrap").datum(cb.length?cb.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=ib.select(".nv-focus .nv-linesWrap").datum(db[0].disabled?[{values:[]}]:db.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=cb.length?l.xScale():j.xScale(),n.scale(d).ticks(a.utils.calcTicksX(Z/100,J)).tickSize(-$,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),ib.select(".nv-x.nv-axis").transition().duration(M).call(n),b.transition().duration(M).call(l),h.transition().duration(M).call(j),ib.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f).ticks(a.utils.calcTicksY($/36,J)).tickSize(-Z,0),q.scale(g).ticks(a.utils.calcTicksY($/36,J)).tickSize(cb.length?0:-Z,0),ib.select(".nv-focus .nv-y1.nv-axis").style("opacity",cb.length?1:0),ib.select(".nv-focus .nv-y2.nv-axis").style("opacity",db.length&&!db[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),ib.select(".nv-focus .nv-y1.nv-axis").transition().duration(M).call(p),ib.select(".nv-focus .nv-y2.nv-axis").transition().duration(M).call(q)}var X=d3.select(this),Y=this;a.utils.initSVG(X);var Z=(x||parseInt(X.style("width"))||960)-v.left-v.right,$=(y||parseInt(X.style("height"))||400)-v.top-v.bottom-(D?G:0),_=G-w.top-w.bottom;if(b.update=function(){X.transition().duration(M).call(b)},b.container=this,N.setter(T(J),b.update).getter(S(J)).update(),N.disabled=J.map(function(a){return!!a.disabled}),!O){var ab;O={};for(ab in N)O[ab]=N[ab]instanceof Array?N[ab].slice(0):N[ab]}if(!(J&&J.length&&J.filter(function(a){return a.values.length}).length)){var bb=X.selectAll(".nv-noData").data([K]);return bb.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),bb.attr("x",v.left+Z/2).attr("y",v.top+$/2).text(function(a){return a}),b}X.selectAll(".nv-noData").remove();var cb=J.filter(function(a){return!a.disabled&&a.bar}),db=J.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var eb=J.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:z(a,b),y:A(a,b)}})}),fb=J.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:z(a,b),y:A(a,b)}})});d.range([0,Z]),e.domain(d3.extent(d3.merge(eb.concat(fb)),function(a){return a.x})).range([0,Z]);var gb=X.selectAll("g.nv-wrap.nv-linePlusBar").data([J]),hb=gb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),ib=gb.select("g");hb.append("g").attr("class","nv-legendWrap");var jb=hb.append("g").attr("class","nv-focus");jb.append("g").attr("class","nv-x nv-axis"),jb.append("g").attr("class","nv-y1 nv-axis"),jb.append("g").attr("class","nv-y2 nv-axis"),jb.append("g").attr("class","nv-barsWrap"),jb.append("g").attr("class","nv-linesWrap");var kb=hb.append("g").attr("class","nv-context");kb.append("g").attr("class","nv-x nv-axis"),kb.append("g").attr("class","nv-y1 nv-axis"),kb.append("g").attr("class","nv-y2 nv-axis"),kb.append("g").attr("class","nv-barsWrap"),kb.append("g").attr("class","nv-linesWrap"),kb.append("g").attr("class","nv-brushBackground"),kb.append("g").attr("class","nv-x nv-brush"),C&&(t.width(Z/2),ib.select(".nv-legendWrap").datum(J.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?P:Q),a})).call(t),v.top!=t.height()&&(v.top=t.height(),$=(y||parseInt(X.style("height"))||400)-v.top-v.bottom-G),ib.select(".nv-legendWrap").attr("transform","translate("+Z/2+","+-v.top+")")),gb.attr("transform","translate("+v.left+","+v.top+")"),ib.select(".nv-context").style("display",D?"initial":"none"),m.width(Z).height(_).color(J.map(function(a,b){return a.color||B(a,b)}).filter(function(a,b){return!J[b].disabled&&J[b].bar})),k.width(Z).height(_).color(J.map(function(a,b){return a.color||B(a,b)}).filter(function(a,b){return!J[b].disabled&&!J[b].bar}));var lb=ib.select(".nv-context .nv-barsWrap").datum(cb.length?cb:[{values:[]}]),mb=ib.select(".nv-context .nv-linesWrap").datum(db[0].disabled?[{values:[]}]:db);ib.select(".nv-context").attr("transform","translate(0,"+($+v.bottom+w.top)+")"),lb.transition().call(m),mb.transition().call(k),F&&(o.ticks(a.utils.calcTicksX(Z/100,J)).tickSize(-_,0),ib.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),ib.select(".nv-context .nv-x.nv-axis").transition().call(o)),E&&(r.scale(h).ticks(_/36).tickSize(-Z,0),s.scale(i).ticks(_/36).tickSize(cb.length?0:-Z,0),ib.select(".nv-context .nv-y3.nv-axis").style("opacity",cb.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),ib.select(".nv-context .nv-y2.nv-axis").style("opacity",db.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),ib.select(".nv-context .nv-y1.nv-axis").transition().call(r),ib.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",W),H&&u.extent(H);var nb=ib.select(".nv-brushBackground").selectAll("g").data([H||u.extent()]),ob=nb.enter().append("g");ob.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",_),ob.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",_);var pb=ib.select(".nv-x.nv-brush").call(u);pb.selectAll("rect").attr("height",_),pb.selectAll(".resize").append("path").attr("d",U),t.dispatch.on("stateChange",function(a){for(var c in a)N[c]=a[c];L.stateChange(N),b.update()}),L.on("tooltipShow",function(a){I&&R(a,Y.parentNode)}),L.on("changeState",function(a){"undefined"!=typeof a.disabled&&(J.forEach(function(b,c){b.disabled=a.disabled[c]}),N.disabled=a.disabled),b.update()}),W()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v={top:30,right:30,bottom:30,left:60},w={top:0,right:30,bottom:20,left:60},x=null,y=null,z=function(a){return a.x},A=function(a){return a.y},B=a.utils.defaultColor(),C=!0,D=!0,E=!1,F=!0,G=50,H=null,I=!0,J=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},K="No Data Available.",L=d3.dispatch("tooltipShow","tooltipHide","brush","stateChange","changeState"),M=0,N=a.utils.state(),O=null,P=" (left axis)",Q=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right");var R=function(d,e){c&&(d.pointIndex+=Math.ceil(c[0]));var f=d.pos[0]+(e.offsetLeft||0),g=d.pos[1]+(e.offsetTop||0),h=n.tickFormat()(j.x()(d.point,d.pointIndex)),i=(d.series.bar?p:q).tickFormat()(j.y()(d.point,d.pointIndex)),k=J(d.series.key,h,i,d,b);a.tooltip.show([f,g],k,d.value<0?"n":"s",null,e)},S=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},T=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+v.left,a.pos[1]+v.top],L.tooltipShow(a)}),j.dispatch.on("elementMouseout.tooltip",function(a){L.tooltipHide(a)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+v.left,a.pos[1]+v.top],L.tooltipShow(a)}),l.dispatch.on("elementMouseout.tooltip",function(a){L.tooltipHide(a)}),L.on("tooltipHide",function(){I&&a.tooltip.cleanup()}),b.dispatch=L,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return x},set:function(a){x=a}},height:{get:function(){return y},set:function(a){y=a}},showLegend:{get:function(){return C},set:function(a){C=a}},tooltips:{get:function(){return I},set:function(a){I=a}},tooltipContent:{get:function(){return J},set:function(a){J=a}},brushExtent:{get:function(){return H},set:function(a){H=a}},noData:{get:function(){return K},set:function(a){K=a}},focusEnable:{get:function(){return D},set:function(a){D=a}},focusHeight:{get:function(){return G},set:function(a){G=a}},focusShowAxisX:{get:function(){return F},set:function(a){F=a}},focusShowAxisY:{get:function(){return E},set:function(a){E=a}},legendLeftAxisHint:{get:function(){return P},set:function(a){P=a}},legendRightAxisHint:{get:function(){return Q},set:function(a){Q=a}},margin:{get:function(){return v},set:function(a){v.top=void 0!==a.top?a.top:v.top,v.right=void 0!==a.right?a.right:v.right,v.bottom=void 0!==a.bottom?a.bottom:v.bottom,v.left=void 0!==a.left?a.left:v.left}},duration:{get:function(){return M},set:function(a){M=a}},color:{get:function(){return B},set:function(b){B=a.utils.getColor(b),t.color(B)}},x:{get:function(){return z},set:function(a){z=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return A},set:function(a){A=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(x){return x.each(function(x){function G(a){var b=+("e"==a),c=b?1:-1,d=N/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function H(){n.empty()||n.extent(v),W.data([n.empty()?e.domain():v]).each(function(a){var b=e(a[0])-c.range()[0],d=c.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function I(){v=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){z.brush({extent:a,brush:n}),H();var b=S.select(".nv-focus .nv-linesWrap").datum(x.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(A).call(g),S.select(".nv-focus .nv-x.nv-axis").transition().duration(A).call(i),S.select(".nv-focus .nv-y.nv-axis").transition().duration(A).call(j)}}var J=d3.select(this),K=this;a.utils.initSVG(J);var L=(r||parseInt(J.style("width"))||960)-o.left-o.right,M=(s||parseInt(J.style("height"))||400)-o.top-o.bottom-t,N=t-p.top-p.bottom;if(b.update=function(){J.transition().duration(A).call(b)},b.container=this,B.setter(F(x),b.update).getter(E(x)).update(),B.disabled=x.map(function(a){return!!a.disabled}),!C){var O;C={};for(O in B)C[O]=B[O]instanceof Array?B[O].slice(0):B[O]}if(!(x&&x.length&&x.filter(function(a){return a.values.length}).length)){var P=J.selectAll(".nv-noData").data([y]);return P.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),P.attr("x",o.left+L/2).attr("y",o.top+M/2).text(function(a){return a}),b}J.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var Q=J.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([x]),R=Q.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),S=Q.select("g");R.append("g").attr("class","nv-legendWrap");var T=R.append("g").attr("class","nv-focus");T.append("g").attr("class","nv-x nv-axis"),T.append("g").attr("class","nv-y nv-axis"),T.append("g").attr("class","nv-linesWrap");var U=R.append("g").attr("class","nv-context");U.append("g").attr("class","nv-x nv-axis"),U.append("g").attr("class","nv-y nv-axis"),U.append("g").attr("class","nv-linesWrap"),U.append("g").attr("class","nv-brushBackground"),U.append("g").attr("class","nv-x nv-brush"),u&&(m.width(L),S.select(".nv-legendWrap").datum(x).call(m),o.top!=m.height()&&(o.top=m.height(),M=(s||parseInt(J.style("height"))||400)-o.top-o.bottom-t),S.select(".nv-legendWrap").attr("transform","translate(0,"+-o.top+")")),Q.attr("transform","translate("+o.left+","+o.top+")"),g.width(L).height(M).color(x.map(function(a,b){return a.color||q(a,b)}).filter(function(a,b){return!x[b].disabled})),h.defined(g.defined()).width(L).height(N).color(x.map(function(a,b){return a.color||q(a,b)}).filter(function(a,b){return!x[b].disabled})),S.select(".nv-context").attr("transform","translate(0,"+(M+o.bottom+p.top)+")");var V=S.select(".nv-context .nv-linesWrap").datum(x.filter(function(a){return!a.disabled}));d3.transition(V).call(h),i.scale(c).ticks(a.utils.calcTicksX(L/100,x)).tickSize(-M,0),j.scale(d).ticks(a.utils.calcTicksY(M/36,x)).tickSize(-L,0),S.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+M+")"),n.x(e).on("brush",function(){var a=b.duration();b.duration(0),I(),b.duration(a)}),v&&n.extent(v);var W=S.select(".nv-brushBackground").selectAll("g").data([v||n.extent()]),X=W.enter().append("g");X.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",N),X.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",N);var Y=S.select(".nv-x.nv-brush").call(n);Y.selectAll("rect").attr("height",N),Y.selectAll(".resize").append("path").attr("d",G),I(),k.scale(e).ticks(a.utils.calcTicksX(L/100,x)).tickSize(-N,0),S.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(S.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f).ticks(a.utils.calcTicksY(N/36,x)).tickSize(-L,0),d3.transition(S.select(".nv-context .nv-y.nv-axis")).call(l),S.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)B[c]=a[c];z.stateChange(B),b.update()}),z.on("tooltipShow",function(a){w&&D(a,K.parentNode)}),z.on("changeState",function(a){"undefined"!=typeof a.disabled&&x.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o={top:30,right:30,bottom:30,left:60},p={top:0,right:30,bottom:20,left:60},q=a.utils.defaultColor(),r=null,s=null,t=100,u=!0,v=null,w=!0,x=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},y="No Data Available.",z=d3.dispatch("tooltipShow","tooltipHide","brush","stateChange","changeState"),A=250,B=a.utils.state(),C=null;g.clipEdge(!0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left");var D=function(c,d){var e=c.pos[0]+(d.offsetLeft||0),f=c.pos[1]+(d.offsetTop||0),h=i.tickFormat()(g.x()(c.point,c.pointIndex)),k=j.tickFormat()(g.y()(c.point,c.pointIndex)),l=x(c.series.key,h,k,c,b);a.tooltip.show([e,f],l,null,null,d)},E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+o.left,a.pos[1]+o.top],z.tooltipShow(a)}),g.dispatch.on("elementMouseout.tooltip",function(a){z.tooltipHide(a)}),z.on("tooltipHide",function(){w&&a.tooltip.cleanup()}),b.dispatch=z,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return r},set:function(a){r=a}},height:{get:function(){return s},set:function(a){s=a}},focusHeight:{get:function(){return t},set:function(a){t=a}},showLegend:{get:function(){return u},set:function(a){u=a}},brushExtent:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return w},set:function(a){w=a}},tooltipContent:{get:function(){return x},set:function(a){x=a}},defaultState:{get:function(){return C},set:function(a){C=a}},noData:{get:function(){return y},set:function(a){y=a}},margin:{get:function(){return o},set:function(a){o.top=void 0!==a.top?a.top:o.top,o.right=void 0!==a.right?a.right:o.right,o.bottom=void 0!==a.bottom?a.bottom:o.bottom,o.left=void 0!==a.left?a.left:o.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b),m.color(q)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.xTickFormat()},set:function(a){i.xTickFormat(a),k.xTickFormat(a)}},yTickFormat:{get:function(){return j.yTickFormat()},set:function(a){j.yTickFormat(a),l.yTickFormat(a)}},duration:{get:function(){return A},set:function(a){A=a,j.duration(A),i.duration(A)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(D){return B.reset(),D.each(function(b){var D=k-j.left-j.right,E=l-j.top-j.bottom,F=d3.select(this);a.utils.initSVG(F);w&&b.length&&(w=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),t&&(b=d3.layout.stack().offset(u).values(function(a){return a.values}).y(q)(!b.length&&w?w:b)),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})}),t&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e,e-=b.size):(b.y1=b.size+d,d+=b.size)})});var G=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0,y1:a.y1}})});m.domain(d||d3.merge(G).map(function(a){return a.x})).rangeBands(f||[0,D],z),n.domain(e||d3.extent(d3.merge(G).map(function(a){return t?a.y>0?a.y1:a.y1+a.y:a.y
- }).concat(r))).range(g||[E,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var H=F.selectAll("g.nv-wrap.nv-multibar").data([b]),I=H.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),J=I.append("defs"),K=I.append("g"),L=H.select("g");K.append("g").attr("class","nv-groups"),H.attr("transform","translate("+j.left+","+j.top+")"),J.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),H.select("#nv-edge-clip-"+o+" rect").attr("width",D).attr("height",E),L.attr("clip-path",s?"url(#nv-edge-clip-"+o+")":"");var M=H.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});M.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var N=B.transition(M.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,y)).attr("y",function(a){return i(t?a.y0:0)||0}).attr("height",0).remove();N.delay&&N.delay(function(a,b){var c=b*(y/(C+1))-b;return c}),M.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return v(a,b)}).style("stroke",function(a,b){return v(a,b)}),M.style("stroke-opacity",1).style("fill-opacity",.75);var O=M.selectAll("rect.nv-bar").data(function(a){return w&&!b.length?w.values:a.values});O.exit().remove();O.enter().append("rect").attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return t?0:d*m.rangeBand()/b.length}).attr("y",function(a){return i(t?a.y0:0)||0}).attr("height",0).attr("width",m.rangeBand()/(t?1:b.length)).attr("transform",function(a,b){return"translate("+m(p(a,b))+",0)"});O.style("fill",function(a,b,c){return v(a,c,b)}).style("stroke",function(a,b,c){return v(a,c,b)}).on("mouseover",function(a,c){d3.select(this).classed("hover",!0),A.elementMouseover({value:q(a,c),point:a,series:b[a.series],pos:[m(p(a,c))+m.rangeBand()*(t?b.length/2:a.series+.5)/b.length,n(q(a,c)+(t?a.y0:0))],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("mouseout",function(a,c){d3.select(this).classed("hover",!1),A.elementMouseout({value:q(a,c),point:a,series:b[a.series],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("click",function(a,c){A.elementClick({value:q(a,c),point:a,series:b[a.series],pos:[m(p(a,c))+m.rangeBand()*(t?b.length/2:a.series+.5)/b.length,n(q(a,c)+(t?a.y0:0))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(a,c){A.elementDblClick({value:q(a,c),point:a,series:b[a.series],pos:[m(p(a,c))+m.rangeBand()*(t?b.length/2:a.series+.5)/b.length,n(q(a,c)+(t?a.y0:0))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()}),O.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(p(a,b))+",0)"}),x&&(c||(c=b.map(function(){return!0})),O.style("fill",function(a,b,d){return d3.rgb(x(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(x(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var P=O.watchTransition(B,"multibar",Math.min(250,y)).delay(function(a,c){return c*y/b[0].values.length});t?P.attr("y",function(a){return n(t?a.y1:0)}).attr("height",function(a){return Math.max(Math.abs(n(a.y+(t?a.y0:0))-n(t?a.y0:0)),1)}).attr("x",function(a){return t?0:a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/(t?1:b.length)):P.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return q(a,b)<0?n(0):n(0)-n(q(a,b))<1?n(0)-1:n(q(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(q(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(C=b[0].values.length)}),B.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=!0,t=!1,u="zero",v=a.utils.defaultColor(),w=!1,x=null,y=500,z=.1,A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),B=a.utils.renderWatch(A,y),C=0;return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return r},set:function(a){r=a}},stacked:{get:function(){return t},set:function(a){t=a}},stackOffset:{get:function(){return u},set:function(a){u=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return w},set:function(a){w=a}},groupSpacing:{get:function(){return z},set:function(a){z=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return y},set:function(a){y=a,B.reset(y)}},color:{get:function(){return v},set:function(b){v=a.utils.getColor(b)}},barColor:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(x){return E.reset(),E.models(e),q&&E.models(f),r&&E.models(g),x.each(function(x){var E=d3.select(this),J=this;a.utils.initSVG(E);var K=(k||parseInt(E.style("width"))||960)-j.left-j.right,L=(l||parseInt(E.style("height"))||400)-j.top-j.bottom;if(b.update=function(){0===D?E.call(b):E.transition().duration(D).call(b)},b.container=this,y.setter(I(x),b.update).getter(H(x)).update(),y.disabled=x.map(function(a){return!!a.disabled}),!z){var M;z={};for(M in y)z[M]=y[M]instanceof Array?y[M].slice(0):y[M]}if(!(x&&x.length&&x.filter(function(a){return a.values.length}).length)){var N=E.selectAll(".nv-noData").data([A]);return N.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),N.attr("x",j.left+K/2).attr("y",j.top+L/2).text(function(a){return a}),b}E.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var O=E.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([x]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),Q=O.select("g");if(P.append("g").attr("class","nv-x nv-axis"),P.append("g").attr("class","nv-y nv-axis"),P.append("g").attr("class","nv-barsWrap"),P.append("g").attr("class","nv-legendWrap"),P.append("g").attr("class","nv-controlsWrap"),p&&(h.width(K-C()),e.barColor()&&x.forEach(function(a,b){a.color=d3.rgb("#ccc").darker(1.5*b).toString()}),Q.select(".nv-legendWrap").datum(x).call(h),j.top!=h.height()&&(j.top=h.height(),L=(l||parseInt(E.style("height"))||400)-j.top-j.bottom),Q.select(".nv-legendWrap").attr("transform","translate("+C()+","+-j.top+")")),n){var R=[{key:o.grouped||"Grouped",disabled:e.stacked()},{key:o.stacked||"Stacked",disabled:!e.stacked()}];i.width(C()).color(["#444","#444","#444"]),Q.select(".nv-controlsWrap").datum(R).attr("transform","translate(0,"+-j.top+")").call(i)}O.attr("transform","translate("+j.left+","+j.top+")"),s&&Q.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),e.disabled(x.map(function(a){return a.disabled})).width(K).height(L).color(x.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!x[b].disabled}));var S=Q.select(".nv-barsWrap").datum(x.filter(function(a){return!a.disabled}));if(S.call(e),q){f.scale(c).ticks(a.utils.calcTicksX(K/100,x)).tickSize(-L,0),Q.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),Q.select(".nv-x.nv-axis").call(f);var T=Q.select(".nv-x.nv-axis > g").selectAll("g");if(T.selectAll("line, text").style("opacity",1),u){var U=function(a,b){return"translate("+a+","+b+")"},V=5,W=17;T.selectAll("text").attr("transform",function(a,b,c){return U(0,c%2==0?V:W)});var X=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;Q.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return U(0,0===b||X%2!==0?W:V)})}t&&T.filter(function(a,b){return b%Math.ceil(x[0].values.length/(K/100))!==0}).selectAll("text, line").style("opacity",0),v&&T.selectAll(".tick text").attr("transform","rotate("+v+" 0,0)").style("text-anchor",v>0?"start":"end"),Q.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}r&&(g.scale(d).ticks(a.utils.calcTicksY(L/36,x)).tickSize(-K,0),Q.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];B.stateChange(y),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}y.stacked=e.stacked(),B.stateChange(y),b.update()}}),B.on("tooltipShow",function(a){w&&G(a,J.parentNode)}),B.on("changeState",function(a){"undefined"!=typeof a.disabled&&(x.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),y.stacked=a.stacked,F=a.stacked),b.update()})}),E.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j={top:30,right:20,bottom:50,left:60},k=null,l=null,m=a.utils.defaultColor(),n=!0,o={},p=!0,q=!0,r=!0,s=!1,t=!0,u=!1,v=0,w=!0,x=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" on "+b+"</p>"},y=a.utils.state(),z=null,A="No Data Available.",B=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),C=function(){return n?180:0},D=250;y.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).highlightZero(!0).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(s?"right":"left").tickFormat(d3.format(",.1f")),i.updateState(!1);var E=a.utils.renderWatch(B),F=!1,G=function(c,d){var h=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=f.tickFormat()(e.x()(c.point,c.pointIndex)),k=g.tickFormat()(e.y()(c.point,c.pointIndex)),l=x(c.series.key,j,k,c,b);a.tooltip.show([h,i],l,c.value<0?"n":"s",null,d)},H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:F}}},I=function(a){return function(b){void 0!==b.stacked&&(F=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+j.left,a.pos[1]+j.top],B.tooltipShow(a)}),e.dispatch.on("elementMouseout.tooltip",function(a){B.tooltipHide(a)}),B.on("tooltipHide",function(){w&&a.tooltip.cleanup()}),b.dispatch=B,b.multibar=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.state=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showControls:{get:function(){return n},set:function(a){n=a}},controlLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},tooltips:{get:function(){return w},set:function(a){w=a}},tooltipContent:{get:function(){return x},set:function(a){x=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},reduceXTicks:{get:function(){return t},set:function(a){t=a}},rotateLabels:{get:function(){return v},set:function(a){v=a}},staggerLabels:{get:function(){return u},set:function(a){u=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return D},set:function(a){D=a,e.duration(D),f.duration(D),g.duration(D),E.reset(D)}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),h.color(m)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,g.orient(s?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return C.reset(),m.each(function(b){var m=k-j.left-j.right,A=l-j.top-j.bottom,D=d3.select(this);a.utils.initSVG(D),v&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(q)(b)),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})}),v&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var E=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0,y1:a.y1}})});n.domain(d||d3.merge(E).map(function(a){return a.x})).rangeBands(f||[0,A],.1),o.domain(e||d3.extent(d3.merge(E).map(function(a){return v?a.y>0?a.y1+a.y:a.y1:a.y}).concat(s))),o.range(w&&!v?g||[o.domain()[0]<0?y:0,m-(o.domain()[1]>0?y:0)]:g||[0,m]),h=h||n,i=i||d3.scale.linear().domain(o.domain()).range([o(0),o(0)]);{var F=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),H=(G.append("defs"),G.append("g"));F.select("g")}H.append("g").attr("class","nv-groups"),F.attr("transform","translate("+j.left+","+j.top+")");var I=F.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});I.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),I.exit().watchTransition(C,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),I.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return t(a,b)}).style("stroke",function(a,b){return t(a,b)}),I.watchTransition(C,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var J=I.selectAll("g.nv-bar").data(function(a){return a.values});J.exit().remove();var K=J.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(v?a.y0:0)+","+(v?0:d*n.rangeBand()/b.length+n(p(a,c)))+")"});K.append("rect").attr("width",0).attr("height",n.rangeBand()/(v?1:b.length)),J.on("mouseover",function(a,c){d3.select(this).classed("hover",!0),B.elementMouseover({value:q(a,c),point:a,series:b[a.series],pos:[o(q(a,c)+(v?a.y0:0)),n(p(a,c))+n.rangeBand()*(v?b.length/2:a.series+.5)/b.length],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("mouseout",function(a,c){d3.select(this).classed("hover",!1),B.elementMouseout({value:q(a,c),point:a,series:b[a.series],pointIndex:c,seriesIndex:a.series,e:d3.event})}).on("click",function(a,c){B.elementClick({value:q(a,c),point:a,series:b[a.series],pos:[n(p(a,c))+n.rangeBand()*(v?b.length/2:a.series+.5)/b.length,o(q(a,c)+(v?a.y0:0))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()}).on("dblclick",function(a,c){B.elementDblClick({value:q(a,c),point:a,series:b[a.series],pos:[n(p(a,c))+n.rangeBand()*(v?b.length/2:a.series+.5)/b.length,o(q(a,c)+(v?a.y0:0))],pointIndex:c,seriesIndex:a.series,e:d3.event}),d3.event.stopPropagation()}),r(b[0],0)&&(K.append("polyline"),J.select("polyline").attr("fill","none").attr("points",function(a,c){var d=r(a,c),e=.8*n.rangeBand()/(2*(v?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return o(a)-o(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=n.rangeBand()/(2*(v?1:b.length));return"translate("+(q(a,c)<0?0:o(q(a,c))-o(0))+", "+d+")"})),K.append("text"),w&&!v?(J.select("text").attr("text-anchor",function(a,b){return q(a,b)<0?"end":"start"}).attr("y",n.rangeBand()/(2*b.length)).attr("dy",".32em").html(function(a,b){var c=z(q(a,b)),d=r(a,b);return void 0===d?c:d.length?c+"+"+z(Math.abs(d[1]))+"-"+z(Math.abs(d[0])):c+"±"+z(Math.abs(d))}),J.watchTransition(C,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return q(a,b)<0?-4:o(q(a,b))-o(0)+4})):J.selectAll("text").text(""),x&&!v?(K.append("text").classed("nv-bar-label",!0),J.select("text.nv-bar-label").attr("text-anchor",function(a,b){return q(a,b)<0?"start":"end"}).attr("y",n.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return p(a,b)}),J.watchTransition(C,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return q(a,b)<0?o(0)-o(q(a,b))+4:-4})):J.selectAll("text.nv-bar-label").text(""),J.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}),u&&(c||(c=b.map(function(){return!0})),J.style("fill",function(a,b,d){return d3.rgb(u(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(u(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),v?J.watchTransition(C,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+o(a.y1)+","+n(p(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(o(q(a,b)+a.y0)-o(a.y0))}).attr("height",n.rangeBand()):J.watchTransition(C,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+o(q(a,c)<0?q(a,c):0)+","+(a.series*n.rangeBand()/b.length+n(p(a,c)))+")"}).select("rect").attr("height",n.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(0)),1)}),h=n.copy(),i=o.copy()}),C.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.yErr},s=[0],t=a.utils.defaultColor(),u=null,v=!1,w=!1,x=!1,y=60,z=d3.format(",.2f"),A=250,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),C=a.utils.renderWatch(B,A);return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},yErr:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return v},set:function(a){v=a}},showValues:{get:function(){return w},set:function(a){w=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return z},set:function(a){z=a}},valuePadding:{get:function(){return y},set:function(a){y=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return A},set:function(a){A=a,C.reset(A)}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}},barColor:{get:function(){return t},set:function(b){u=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(u){return E.reset(),E.models(e),q&&E.models(f),r&&E.models(g),u.each(function(u){var E=d3.select(this),F=this;a.utils.initSVG(E);var G=(k||parseInt(E.style("width"))||960)-j.left-j.right,H=(l||parseInt(E.style("height"))||400)-j.top-j.bottom;if(b.update=function(){E.transition().duration(A).call(b)},b.container=this,s=e.stacked(),v.setter(D(u),b.update).getter(C(u)).update(),v.disabled=u.map(function(a){return!!a.disabled}),!w){var I;w={};for(I in v)w[I]=v[I]instanceof Array?v[I].slice(0):v[I]}if(!(u&&u.length&&u.filter(function(a){return a.values.length}).length)){var J=E.selectAll(".nv-noData").data([x]);return J.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),J.attr("x",j.left+G/2).attr("y",j.top+H/2).text(function(a){return a}),b}E.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var K=E.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([u]),L=K.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),M=K.select("g");if(L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),L.append("g").attr("class","nv-barsWrap"),L.append("g").attr("class","nv-legendWrap"),L.append("g").attr("class","nv-controlsWrap"),p&&(h.width(G-z()),e.barColor()&&u.forEach(function(a,b){a.color=d3.rgb("#ccc").darker(1.5*b).toString()}),M.select(".nv-legendWrap").datum(u).call(h),j.top!=h.height()&&(j.top=h.height(),H=(l||parseInt(E.style("height"))||400)-j.top-j.bottom),M.select(".nv-legendWrap").attr("transform","translate("+z()+","+-j.top+")")),n){var N=[{key:o.grouped||"Grouped",disabled:e.stacked()},{key:o.stacked||"Stacked",disabled:!e.stacked()}];i.width(z()).color(["#444","#444","#444"]),M.select(".nv-controlsWrap").datum(N).attr("transform","translate(0,"+-j.top+")").call(i)}K.attr("transform","translate("+j.left+","+j.top+")"),e.disabled(u.map(function(a){return a.disabled})).width(G).height(H).color(u.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!u[b].disabled}));var O=M.select(".nv-barsWrap").datum(u.filter(function(a){return!a.disabled}));if(O.transition().call(e),q){f.scale(c).ticks(a.utils.calcTicksY(H/24,u)).tickSize(-G,0),M.select(".nv-x.nv-axis").call(f);var P=M.select(".nv-x.nv-axis").selectAll("g");P.selectAll("line, text")}r&&(g.scale(d).ticks(a.utils.calcTicksX(G/100,u)).tickSize(-H,0),M.select(".nv-y.nv-axis").attr("transform","translate(0,"+H+")"),M.select(".nv-y.nv-axis").call(g)),M.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-H),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(N=N.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}v.stacked=e.stacked(),y.stateChange(v),s=e.stacked(),b.update()}}),y.on("tooltipShow",function(a){t&&B(a,F.parentNode)}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(u.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),v.stacked=a.stacked,s=a.stacked),b.update()})}),E.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j={top:30,right:20,bottom:50,left:60},k=null,l=null,m=a.utils.defaultColor(),n=!0,o={},p=!0,q=!0,r=!0,s=!1,t=!0,u=function(a,b,c){return"<h3>"+a+" - "+b+"</h3><p>"+c+"</p>"},v=a.utils.state(),w=null,x="No Data Available.",y=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),z=function(){return n?180:0},A=250;v.stacked=!1,e.stacked(s),f.orient("left").tickPadding(5).highlightZero(!1).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),i.updateState(!1);var B=function(c,d){var h=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=f.tickFormat()(e.x()(c.point,c.pointIndex)),k=g.tickFormat()(e.y()(c.point,c.pointIndex)),l=u(c.series.key,j,k,c,b);a.tooltip.show([h,i],l,c.value<0?"e":"w",null,d)},C=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:s}}},D=function(a){return function(b){void 0!==b.stacked&&(s=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},E=a.utils.renderWatch(y,A);return e.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+j.left,a.pos[1]+j.top],y.tooltipShow(a)}),e.dispatch.on("elementMouseout.tooltip",function(a){y.tooltipHide(a)}),y.on("tooltipHide",function(){t&&a.tooltip.cleanup()}),b.dispatch=y,b.multibar=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.state=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showControls:{get:function(){return n},set:function(a){n=a}},controlLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},tooltips:{get:function(){return t},set:function(a){t=a}},tooltipContent:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return A},set:function(a){A=a,E.reset(A),e.duration(A),f.duration(A),g.duration(A)}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),h.color(m)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(l){return l.each(function(l){var n=d3.select(this),o=this;a.utils.initSVG(n),b.update=function(){n.transition().call(b)},b.container=this;var E=(h||parseInt(n.style("width"))||960)-f.left-f.right,F=(i||parseInt(n.style("height"))||400)-f.top-f.bottom,G=l.filter(function(a){return"line"==a.type&&1==a.yAxis}),H=l.filter(function(a){return"line"==a.type&&2==a.yAxis}),I=l.filter(function(a){return"bar"==a.type&&1==a.yAxis}),J=l.filter(function(a){return"bar"==a.type&&2==a.yAxis}),K=l.filter(function(a){return"area"==a.type&&1==a.yAxis}),L=l.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length)){var M=n.selectAll(".nv-noData").data([m]);return M.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),M.attr("x",f.left+E/2).attr("y",f.top+F/2).text(function(a){return a}),b}n.selectAll(".nv-noData").remove();var N=l.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),O=l.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});c.domain(d3.extent(d3.merge(N.concat(O)),function(a){return a.x})).range([0,E]);var P=n.selectAll("g.wrap.multiChart").data([l]),Q=P.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");Q.append("g").attr("class","x axis"),Q.append("g").attr("class","y1 axis"),Q.append("g").attr("class","y2 axis"),Q.append("g").attr("class","lines1Wrap"),Q.append("g").attr("class","lines2Wrap"),Q.append("g").attr("class","bars1Wrap"),Q.append("g").attr("class","bars2Wrap"),Q.append("g").attr("class","stack1Wrap"),Q.append("g").attr("class","stack2Wrap"),Q.append("g").attr("class","legendWrap");var R=P.select("g"),S=l.map(function(a,b){return l[b].color||g(a,b)});j&&(B.color(S),B.width(E/2),R.select(".legendWrap").datum(l.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(B),f.top!=B.height()&&(f.top=B.height(),F=(i||parseInt(n.style("height"))||400)-f.top-f.bottom),R.select(".legendWrap").attr("transform","translate("+E/2+","+-f.top+")")),s.width(E).height(F).interpolate(p).color(S.filter(function(a,b){return!l[b].disabled&&1==l[b].yAxis&&"line"==l[b].type})),t.width(E).height(F).interpolate(p).color(S.filter(function(a,b){return!l[b].disabled&&2==l[b].yAxis&&"line"==l[b].type})),u.width(E).height(F).color(S.filter(function(a,b){return!l[b].disabled&&1==l[b].yAxis&&"bar"==l[b].type})),v.width(E).height(F).color(S.filter(function(a,b){return!l[b].disabled&&2==l[b].yAxis&&"bar"==l[b].type})),w.width(E).height(F).color(S.filter(function(a,b){return!l[b].disabled&&1==l[b].yAxis&&"area"==l[b].type})),x.width(E).height(F).color(S.filter(function(a,b){return!l[b].disabled&&2==l[b].yAxis&&"area"==l[b].type})),R.attr("transform","translate("+f.left+","+f.top+")");var T=R.select(".lines1Wrap").datum(G.filter(function(a){return!a.disabled})),U=R.select(".bars1Wrap").datum(I.filter(function(a){return!a.disabled})),V=R.select(".stack1Wrap").datum(K.filter(function(a){return!a.disabled})),W=R.select(".lines2Wrap").datum(H.filter(function(a){return!a.disabled})),X=R.select(".bars2Wrap").datum(J.filter(function(a){return!a.disabled})),Y=R.select(".stack2Wrap").datum(L.filter(function(a){return!a.disabled})),Z=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=L.length?L.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];q.domain(d||d3.extent(d3.merge(N).concat(Z),function(a){return a.y})).range([0,F]),r.domain(e||d3.extent(d3.merge(O).concat($),function(a){return a.y})).range([0,F]),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),t.yDomain(r.domain()),v.yDomain(r.domain()),x.yDomain(r.domain()),K.length&&d3.transition(V).call(w),L.length&&d3.transition(Y).call(x),I.length&&d3.transition(U).call(u),J.length&&d3.transition(X).call(v),G.length&&d3.transition(T).call(s),H.length&&d3.transition(W).call(t),y.ticks(a.utils.calcTicksX(E/100,l)).tickSize(-F,0),R.select(".x.axis").attr("transform","translate(0,"+F+")"),d3.transition(R.select(".x.axis")).call(y),z.ticks(a.utils.calcTicksY(F/36,l)).tickSize(-E,0),d3.transition(R.select(".y1.axis")).call(z),A.ticks(a.utils.calcTicksY(F/36,l)).tickSize(-E,0),d3.transition(R.select(".y2.axis")).call(A),R.select(".y1.axis").classed("nv-disabled",N.length?!1:!0).attr("transform","translate("+c.range()[0]+",0)"),R.select(".y2.axis").classed("nv-disabled",O.length?!1:!0).attr("transform","translate("+c.range()[1]+",0)"),B.dispatch.on("stateChange",function(){b.update()}),C.on("tooltipShow",function(a){k&&D(a,o.parentNode)})}),b}var c,d,e,f={top:30,right:20,bottom:50,left:60},g=a.utils.defaultColor(),h=null,i=null,j=!0,k=!0,l=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" at "+b+"</p>"},m="No Data Available.",n=function(a){return a.x},o=function(a){return a.y},p="monotone",c=d3.scale.linear(),q=d3.scale.linear(),r=d3.scale.linear(),s=a.models.line().yScale(q),t=a.models.line().yScale(r),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.multiBar().stacked(!1).yScale(r),w=a.models.stackedArea().yScale(q),x=a.models.stackedArea().yScale(r),y=a.models.axis().scale(c).orient("bottom").tickPadding(5),z=a.models.axis().scale(q).orient("left"),A=a.models.axis().scale(r).orient("right"),B=a.models.legend().height(30),C=d3.dispatch("tooltipShow","tooltipHide"),D=function(c,d){var e=c.pos[0]+(d.offsetLeft||0),f=c.pos[1]+(d.offsetTop||0),g=y.tickFormat()(s.x()(c.point,c.pointIndex)),h=(2==c.series.yAxis?A:z).tickFormat()(s.y()(c.point,c.pointIndex)),i=l(c.series.key,g,h,c,b);
- a.tooltip.show([e,f],i,void 0,void 0,d.offsetParent)};return s.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),s.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),t.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),t.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),u.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),u.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),v.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),v.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),w.dispatch.on("tooltipShow",function(a){return Math.round(100*w.y()(a.point))?(a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],void C.tooltipShow(a)):(setTimeout(function(){d3.selectAll(".point.hover").classed("hover",!1)},0),!1)}),w.dispatch.on("tooltipHide",function(a){C.tooltipHide(a)}),x.dispatch.on("tooltipShow",function(a){return Math.round(100*x.y()(a.point))?(a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],void C.tooltipShow(a)):(setTimeout(function(){d3.selectAll(".point.hover").classed("hover",!1)},0),!1)}),x.dispatch.on("tooltipHide",function(a){C.tooltipHide(a)}),s.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),s.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),t.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+f.left,a.pos[1]+f.top],C.tooltipShow(a)}),t.dispatch.on("elementMouseout.tooltip",function(a){C.tooltipHide(a)}),C.on("tooltipHide",function(){k&&a.tooltip.cleanup()}),b.dispatch=C,b.lines1=s,b.lines2=t,b.bars1=u,b.bars2=v,b.stack1=w,b.stack2=x,b.xAxis=y,b.yAxis1=z,b.yAxis2=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},showLegend:{get:function(){return j},set:function(a){j=a}},yDomain1:{get:function(){return d},set:function(a){d=a}},yDomain2:{get:function(){return e},set:function(a){e=a}},tooltips:{get:function(){return k},set:function(a){k=a}},tooltipContent:{get:function(){return l},set:function(a){l=a}},noData:{get:function(){return m},set:function(a){m=a}},interpolate:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}},x:{get:function(){return n},set:function(a){n=a,s.x(a),u.x(a)}},y:{get:function(){return o},set:function(a){o=a,s.y(a),u.y(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(x){return x.each(function(b){var x=d3.select(this),z=(h||parseInt(x.style("width"))||960)-g.left-g.right,A=(i||parseInt(x.style("height"))||400)-g.top-g.bottom;a.utils.initSVG(x),k.domain(c||d3.extent(b[0].values.map(m).concat(s))),k.range(u?e||[.5*z/b[0].values.length,z*(b[0].values.length-.5)/b[0].values.length]:e||[0,z]),l.domain(d||[d3.min(b[0].values.map(r).concat(t)),d3.max(b[0].values.map(q).concat(t))]).range(f||[A,0]),k.domain()[0]===k.domain()[1]&&k.domain(k.domain()[0]?[k.domain()[0]-.01*k.domain()[0],k.domain()[1]+.01*k.domain()[1]]:[-1,1]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]+.01*l.domain()[0],l.domain()[1]-.01*l.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+g.left+","+g.top+")"),x.on("click",function(a,b){y.chartClick({data:a,index:b,pos:d3.event,id:j})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),B.select("#nv-chart-clip-path-"+j+" rect").attr("width",z).attr("height",A),F.attr("clip-path",v?"url(#nv-chart-clip-path-"+j+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();G.enter().append("path").attr("class",function(a,b,c){return(o(a,b)>p(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,c){var d=z/b[0].values.length*.9;return"m0,0l0,"+(l(o(a,c))-l(q(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(l(r(a,c))-l(o(a,c)))+"l0,"+(l(p(a,c))-l(r(a,c)))+"l"+d/2+",0l"+-d/2+",0z"}).attr("transform",function(a,b){return"translate("+k(m(a,b))+","+l(q(a,b))+")"}).attr("fill",function(){return w[0]}).attr("stroke",function(){return w[0]}).attr("x",0).attr("y",function(a,b){return l(Math.max(0,n(a,b)))}).attr("height",function(a,b){return Math.abs(l(n(a,b))-l(0))});G.attr("class",function(a,b,c){return(o(a,b)>p(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(G).attr("transform",function(a,b){return"translate("+k(m(a,b))+","+l(q(a,b))+")"}).attr("d",function(a,c){var d=z/b[0].values.length*.9;return"m0,0l0,"+(l(o(a,c))-l(q(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(l(r(a,c))-l(o(a,c)))+"l0,"+(l(p(a,c))-l(r(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=d3.scale.linear(),l=d3.scale.linear(),m=function(a){return a.x},n=function(a){return a.y},o=function(a){return a.open},p=function(a){return a.close},q=function(a){return a.high},r=function(a){return a.low},s=[],t=[],u=!1,v=!0,w=a.utils.defaultColor(),x=!1,y=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout");return b.highlightPoint=function(a,c){b.clearHighlights(),d3.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){d3.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return k},set:function(a){k=a}},yScale:{get:function(){return l},set:function(a){l=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return s},set:function(a){s=a}},forceY:{get:function(){return t},set:function(a){t=a}},padData:{get:function(){return u},set:function(a){u=a}},clipEdge:{get:function(){return v},set:function(a){v=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return x},set:function(a){x=a}},x:{get:function(){return m},set:function(a){m=a}},y:{get:function(){return n},set:function(a){n=a}},open:{get:function(){return o()},set:function(a){o=a}},close:{get:function(){return p()},set:function(a){p=a}},high:{get:function(){return q},set:function(a){q=a}},low:{get:function(){return r},set:function(a){r=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(m){return m.each(function(m){function n(a){return y(h.map(function(b){return[f(b),g[b](a[b])]}))}function o(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});j=[],a.forEach(function(a,c){j[c]={dimension:a,extent:b[c]}}),k=[],x.style("display",function(c){var d=a.every(function(a,d){return b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&k.push(c),d?null:"none"}),l.brush({filters:j,active:k})}var p=d3.select(this),q=(d||parseInt(p.style("width"))||960)-c.left-c.right,r=(e||parseInt(p.style("height"))||400)-c.top-c.bottom;a.utils.initSVG(p),k=m,b.update=function(){},f.rangePoints([0,q],1).domain(h),h.forEach(function(a){return g[a]=d3.scale.linear().domain(d3.extent(m,function(b){return+b[a]})).range([r,0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",o),"name"!=a});var s=p.selectAll("g.nv-wrap.nv-parallelCoordinates").data([m]),t=s.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),u=t.append("g"),v=s.select("g");u.append("g").attr("class","nv-parallelCoordinatesWrap"),s.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=d3.svg.line(),z=d3.svg.axis().orient("left");w=u.append("g").attr("class","background").selectAll("path").data(m).enter().append("path").attr("d",n),x=u.append("g").attr("class","foreground").selectAll("path").data(m).enter().append("path").attr("d",n).attr("stroke",i);var A=v.selectAll(".dimension").data(h).enter().append("g").attr("class","dimension").attr("transform",function(a){return"translate("+f(a)+",0)"});A.append("g").attr("class","axis").each(function(a){d3.select(this).call(z.scale(g[a]))}).append("text").attr("text-anchor","middle").attr("y",-9).text(String),A.append("g").attr("class","brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:10,bottom:10,left:10},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=a.utils.defaultColor(),j=[],k=[],l=d3.dispatch("brush");return b.dispatch=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensions:{get:function(){return h},set:function(a){h=a}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},color:{get:function(){return i},set:function(b){i=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(k){return C.reset(),k.each(function(b){function k(a){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,r||(a.innerRadius=0);var b=d3.interpolate(this._current,a);return this._current=b(0),function(a){return N(b(a))}}var D=e-c.left-c.right,E=f-c.top-c.bottom,F=Math.min(D,E)/2,G=F-F/5,H=d3.select(this);a.utils.initSVG(H);var I=H.selectAll(".nv-wrap.nv-pie").data(b),J=I.enter().append("g").attr("class","nvd3 nv-wrap nv-pie nv-chart-"+i),K=J.append("g"),L=I.select("g"),M=K.append("g").attr("class","nv-pie");K.append("g").attr("class","nv-pieLabels"),I.attr("transform","translate("+c.left+","+c.top+")"),L.select(".nv-pie").attr("transform","translate("+D/2+","+E/2+")"),L.select(".nv-pieLabels").attr("transform","translate("+D/2+","+E/2+")"),H.on("click",function(a,b){B.chartClick({data:a,index:b,pos:d3.event,id:i})});var N=d3.svg.arc().outerRadius(G),O=d3.svg.arc().outerRadius(G+5);w&&(N.startAngle(w),O.startAngle(w)),y&&(N.endAngle(y),O.endAngle(y)),r&&(N.innerRadius(F*A),O.innerRadius(F*A));var P=d3.layout.pie().sort(null).value(function(a){return a.disabled?0:h(a)});if(P.padAngle&&x&&P.padAngle(x),N.cornerRadius&&z&&(N.cornerRadius(z),O.cornerRadius(z)),r&&s){var Q=M.append("g").attr("class","nv-pie");Q.append("text").style("text-anchor","middle").attr("class","nv-pie-title").text(function(){return s}).attr("dy","0.35em").attr("transform",function(){return"translate(0, "+u+")"})}var R=I.select(".nv-pie").selectAll(".nv-slice").data(P),S=I.select(".nv-pieLabels").selectAll(".nv-label").data(P);R.exit().remove(),S.exit().remove();var T=R.enter().append("g");T.attr("class","nv-slice"),T.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),t&&d3.select(this).select("path").transition().duration(70).attr("d",O),B.elementMouseover({label:g(a.data),value:h(a.data),point:a.data,pointIndex:b,pos:[d3.event.pageX,d3.event.pageY],id:i,color:d3.select(this).style("fill")})}),T.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),t&&d3.select(this).select("path").transition().duration(50).attr("d",N),B.elementMouseout({label:g(a.data),value:h(a.data),point:a.data,index:b,id:i})}),R.attr("fill",function(a,b){return j(a,b)}),R.attr("stroke",function(a,b){return j(a,b)});var U=T.append("path").each(function(a){this._current=a});if(U.on("click",function(a,b){B.elementClick({label:g(a.data),value:h(a.data),point:a.data,index:b,pos:d3.event,id:i}),d3.event.stopPropagation()}),U.on("dblclick",function(a,b){B.elementDblClick({label:g(a.data),value:h(a.data),point:a.data,index:b,pos:d3.event,id:i}),d3.event.stopPropagation()}),R.select("path").transition().attr("d",N).attrTween("d",k),m){var V=d3.svg.arc().innerRadius(0);if(n)var V=N;o&&(V=d3.svg.arc().outerRadius(N.outerRadius())),S.enter().append("g").classed("nv-label",!0).each(function(a){var b=d3.select(this);b.attr("transform",function(a){if(v){a.outerRadius=G+10,a.innerRadius=G+15;var b=(a.startAngle+a.endAngle)/2*(180/Math.PI);return(a.startAngle+a.endAngle)/2<Math.PI?b-=90:b+=90,"translate("+V.centroid(a)+") rotate("+b+")"}return a.outerRadius=F+10,a.innerRadius=F+15,"translate("+V.centroid(a)+")"}),b.append("rect").style("stroke","#fff").style("fill","#fff").attr("rx",3).attr("ry",3),b.append("text").style("text-anchor",v?(a.startAngle+a.endAngle)/2<Math.PI?"start":"end":"middle").style("fill","#000")});var W={},X=14,Y=140,Z=function(a){return Math.floor(a[0]/Y)*Y+","+Math.floor(a[1]/X)*X};S.watchTransition(C,"pie labels").attr("transform",function(a){if(v){a.outerRadius=G+10,a.innerRadius=G+15;var b=(a.startAngle+a.endAngle)/2*(180/Math.PI);return(a.startAngle+a.endAngle)/2<Math.PI?b-=90:b+=90,"translate("+V.centroid(a)+") rotate("+b+")"}a.outerRadius=F+10,a.innerRadius=F+15;var c=V.centroid(a);if(a.value){var d=Z(c);W[d]&&(c[1]-=X),W[Z(c)]=!0}return"translate("+c+")"}),S.select(".nv-label text").style("text-anchor",v?(d.startAngle+d.endAngle)/2<Math.PI?"start":"end":"middle").text(function(a){var b=(a.endAngle-a.startAngle)/(2*Math.PI),c={key:g(a.data),value:h(a.data),percent:l(b)};return a.value&&b>q?c[p]:""})}}),C.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},e=500,f=500,g=function(a){return a.x},h=function(a){return a.y},i=Math.floor(1e4*Math.random()),j=a.utils.defaultColor(),k=d3.format(",.2f"),l=d3.format("%"),m=!0,n=!0,o=!1,p="key",q=.02,r=!1,s=!1,t=!0,u=0,v=!1,w=!1,x=!1,y=!1,z=0,A=.5,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),C=a.utils.renderWatch(B);return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return e},set:function(a){e=a}},height:{get:function(){return f},set:function(a){f=a}},showLabels:{get:function(){return m},set:function(a){m=a}},title:{get:function(){return s},set:function(a){s=a}},titleOffset:{get:function(){return u},set:function(a){u=a}},labelThreshold:{get:function(){return q},set:function(a){q=a}},labelFormat:{get:function(){return l},set:function(a){l=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return g},set:function(a){g=a}},id:{get:function(){return i},set:function(a){i=a}},endAngle:{get:function(){return y},set:function(a){y=a}},startAngle:{get:function(){return w},set:function(a){w=a}},padAngle:{get:function(){return x},set:function(a){x=a}},cornerRadius:{get:function(){return z},set:function(a){z=a}},donutRatio:{get:function(){return A},set:function(a){A=a}},pieLabelsOutside:{get:function(){return n},set:function(a){n=a}},donutLabelsOutside:{get:function(){return o},set:function(a){o=a}},labelSunbeamLayout:{get:function(){return v},set:function(a){v=a}},donut:{get:function(){return r},set:function(a){r=a}},growOnHover:{get:function(){return t},set:function(a){t=a}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return h},set:function(a){h=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return p},set:function(a){p=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(i){return r.reset(),r.models(c),i.each(function(i){var j=d3.select(this);a.utils.initSVG(j);var k=(f||parseInt(j.style("width"),10)||960)-e.left-e.right,o=(g||parseInt(j.style("height"),10)||400)-e.top-e.bottom;if(b.update=function(){j.transition().call(b)},b.container=this,l.setter(t(i),b.update).getter(s(i)).update(),l.disabled=i.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!i||!i.length){var r=j.selectAll(".nv-noData").data([n]);return r.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),r.attr("x",e.left+k/2).attr("y",e.top+o/2).text(function(a){return a}),b}j.selectAll(".nv-noData").remove();var u=j.selectAll("g.nv-wrap.nv-pieChart").data([i]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),w=u.select("g");v.append("g").attr("class","nv-pieWrap"),v.append("g").attr("class","nv-legendWrap"),h&&(d.width(k).key(c.x()),u.select(".nv-legendWrap").datum(i).call(d),e.top!=d.height()&&(e.top=d.height(),o=(g||parseInt(j.style("height"))||400)-e.top-e.bottom),u.select(".nv-legendWrap").attr("transform","translate(0,"+-e.top+")")),u.attr("transform","translate("+e.left+","+e.top+")"),c.width(k).height(o);var x=w.select(".nv-pieWrap").datum([i]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){p.tooltipHide(a)}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(i.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),r.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=!0,i=a.utils.defaultColor(),j=!0,k=function(a,b,c){return'<h3 style="background-color: '+c.color+'">'+a+"</h3><p>"+b+"</p>"},l=a.utils.state(),m=null,n="No Data Available.",o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),q=function(d,e){var f=c.x()(d.point),g=d.pos[0]+(e&&e.offsetLeft||0),h=d.pos[1]+(e&&e.offsetTop||0),i=c.valueFormat()(c.y()(d.point)),j=k(f,i,d,b);a.tooltip.show([g,h],j,d.value<0?"n":"s",null,e)},r=a.utils.renderWatch(p),s=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},t=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+e.left,a.pos[1]+e.top],p.tooltipShow(a)}),p.on("tooltipShow",function(a){j&&q(a)}),p.on("tooltipHide",function(){j&&a.tooltip.cleanup()}),b.legend=d,b.dispatch=p,b.pie=c,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},tooltipContent:{get:function(){return k},set:function(a){k=a}},tooltips:{get:function(){return j},set:function(a){j=a}},showLegend:{get:function(){return h},set:function(a){h=a}},defaultState:{get:function(){return m},set:function(a){m=a}},color:{get:function(){return i},set:function(a){i=a,d.color(i),c.color(i)}},duration:{get:function(){return o},set:function(a){o=a,r.reset(o)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(L){return N.reset(),L.each(function(b){function L(){if(!v)return!1;var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=o(a,c),e=p(a,c);return[l(d)+1e-7*Math.random(),m(e)+1e-7*Math.random(),b,c,a]}).filter(function(a,b){return w(a[4],b)})}));if(K===!0){a.length<3&&(a.push([l.range()[0]-20,m.range()[0]-20,null,null]),a.push([l.range()[1]+20,m.range()[1]+20,null,null]),a.push([l.range()[0]-20,m.range()[0]+20,null,null]),a.push([l.range()[1]+20,m.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});S.select(".nv-point-paths").selectAll("path").remove();var e=S.select(".nv-point-paths").selectAll("path").data(d);if(e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"}),A){var f=S.append("svg:g").attr("id","nv-point-clips");f.selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",B)}var j=function(a,c){if(M)return 0;var d=b[a.series];if("undefined"!=typeof d){var e=d.values[a.point];c({point:e,series:d,pos:[l(o(e,a.point))+g.left,m(p(e,a.point))+g.top],seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){j(a,J.elementClick)}).on("dblclick",function(a){j(a,J.elementDblClick)}).on("mouseover",function(a){j(a,J.elementMouseover)}).on("mouseout",function(a){j(a,J.elementMouseout)})}else S.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(M||!b[a.series])return 0;var d=b[a.series],e=d.values[c];J.elementClick({point:e,series:d,pos:[l(o(e,c))+g.left,m(p(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(M||!b[a.series])return 0;var d=b[a.series],e=d.values[c];J.elementMouseover({point:e,series:d,pos:[l(o(e,c))+g.left,m(p(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseout",function(a,c){if(M||!b[a.series])return 0;var d=b[a.series],e=d.values[c];J.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c})});M=!1}var O=d3.select(this),P=(h||parseInt(O.style("width"))||960)-g.left-g.right,Q=(i||parseInt(O.style("height"))||400)-g.top-g.bottom;a.utils.initSVG(O),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var R=C&&D&&G?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:o(a,b),y:p(a,b),size:q(a,b)}})}));l.domain(C||d3.extent(R.map(function(a){return a.x}).concat(s))),l.range(x&&b[0]?E||[(P*y+P)/(2*b[0].values.length),P-P*(1+y)/(2*b[0].values.length)]:E||[0,P]),m.domain(D||d3.extent(R.map(function(a){return a.y}).concat(t))).range(F||[Q,0]),n.domain(G||d3.extent(R.map(function(a){return a.size}).concat(u))).range(H||[16,256]),(l.domain()[0]===l.domain()[1]||m.domain()[0]===m.domain()[1])&&(I=!0),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),isNaN(l.domain()[0])&&l.domain([-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),c=c||l,d=d||m,e=e||n;var S=O.selectAll("g.nv-wrap.nv-scatter").data([b]),T=S.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k+(I?" nv-single-point":"")),U=T.append("defs"),V=T.append("g"),W=S.select("g");V.append("g").attr("class","nv-groups"),V.append("g").attr("class","nv-point-paths"),S.attr("transform","translate("+g.left+","+g.top+")"),U.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),S.select("#nv-edge-clip-"+k+" rect").attr("width",P).attr("height",Q>0?Q:0),W.attr("clip-path",z?"url(#nv-edge-clip-"+k+")":""),M=!0;var X=S.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});X.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),X.exit().remove(),X.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),X.watchTransition(N,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var Y=X.selectAll("path.nv-point").data(function(a){return a.values});Y.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a,b){return"translate("+c(o(a,b))+","+d(p(a,b))+")"}).attr("d",a.utils.symbol().type(r).size(function(a,b){return n(q(a,b))})),Y.exit().remove(),X.exit().selectAll("path.nv-point").watchTransition(N,"scatter exit").attr("transform",function(a,b){return"translate("+l(o(a,b))+","+m(p(a,b))+")"}).remove(),Y.each(function(a,b){d3.select(this).classed("nv-point",!0).classed("nv-point-"+b,!0).classed("hover",!1)}),Y.watchTransition(N,"scatter points").attr("transform",function(a,b){return"translate("+l(o(a,b))+","+m(p(a,b))+")"}).attr("d",a.utils.symbol().type(r).size(function(a,b){return n(q(a,b))})),clearTimeout(f),f=setTimeout(L,300),c=l.copy(),d=m.copy(),e=n.copy()}),N.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=function(a){return a.size||1},r=function(a){return a.shape||"circle"},s=[],t=[],u=[],v=!0,w=function(a){return!a.notActive},x=!1,y=.1,z=!1,A=!0,B=function(){return 25},C=null,D=null,E=null,F=null,G=null,H=null,I=!1,J=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),K=!0,L=250,M=!1,N=a.utils.renderWatch(J,L);return b.dispatch=J,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return d3.selectAll(".nv-chart-"+k+" .nv-point.hover").classed("hover",!1),null},this.highlightPoint=function(a,b,c){d3.select(".nv-chart-"+k+" .nv-series-"+a+" .nv-point-"+b).classed("hover",c)}},J.on("elementMouseover.point",function(a){v&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),J.on("elementMouseout.point",function(a){v&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},pointScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return C},set:function(a){C=a}},yDomain:{get:function(){return D},set:function(a){D=a}},pointDomain:{get:function(){return G},set:function(a){G=a}},xRange:{get:function(){return E},set:function(a){E=a}},yRange:{get:function(){return F},set:function(a){F=a}},pointRange:{get:function(){return H},set:function(a){H=a}},forceX:{get:function(){return s},set:function(a){s=a}},forceY:{get:function(){return t},set:function(a){t=a}},forcePoint:{get:function(){return u},set:function(a){u=a}},interactive:{get:function(){return v},set:function(a){v=a}},pointActive:{get:function(){return w},set:function(a){w=a}},padDataOuter:{get:function(){return y},set:function(a){y=a}},padData:{get:function(){return x},set:function(a){x=a}},clipEdge:{get:function(){return z},set:function(a){z=a}},clipVoronoi:{get:function(){return A},set:function(a){A=a}},clipRadius:{get:function(){return B},set:function(a){B=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return o},set:function(a){o=d3.functor(a)}},y:{get:function(){return p},set:function(a){p=d3.functor(a)}},pointSize:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointShape:{get:function(){return r},set:function(a){r=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return L},set:function(a){L=a,N.reset(L)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return K},set:function(a){K=a,K===!1&&(A=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(v){return F.reset(),F.models(c),r&&F.models(d),s&&F.models(e),o&&F.models(g),p&&F.models(h),v.each(function(v){var w=d3.select(this),x=this;a.utils.initSVG(w);var J=(j||parseInt(w.style("width"))||960)-i.left-i.right,K=(k||parseInt(w.style("height"))||400)-i.top-i.bottom;if(b.update=function(){0===C?w.call(b):w.transition().duration(C).call(b)},b.container=this,y.setter(I(v),b.update).getter(H(v)).update(),y.disabled=v.map(function(a){return!!a.disabled}),!z){var L;z={};for(L in y)z[L]=y[L]instanceof Array?y[L].slice(0):y[L]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length)){var M=w.selectAll(".nv-noData").data([B]);return M.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),M.attr("x",i.left+J/2).attr("y",i.top+K/2).text(function(a){return a}),F.renderEnd("scatter immediate"),b}w.selectAll(".nv-noData").remove(),m=c.xScale(),n=c.yScale();var N=w.selectAll("g.nv-wrap.nv-scatterChart").data([v]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),P=O.append("g"),Q=N.select("g");P.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),P.append("g").attr("class","nv-x nv-axis"),P.append("g").attr("class","nv-y nv-axis"),P.append("g").attr("class","nv-scatterWrap"),P.append("g").attr("class","nv-regressionLinesWrap"),P.append("g").attr("class","nv-distWrap"),P.append("g").attr("class","nv-legendWrap"),N.attr("transform","translate("+i.left+","+i.top+")"),t&&Q.select(".nv-y.nv-axis").attr("transform","translate("+J+",0)"),q&&(f.width(J/2),N.select(".nv-legendWrap").datum(v).call(f),i.top!=f.height()&&(i.top=f.height(),K=(k||parseInt(w.style("height"))||400)-i.top-i.bottom),N.select(".nv-legendWrap").attr("transform","translate("+J/2+","+-i.top+")")),c.width(J).height(K).color(v.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!v[b].disabled})),N.select(".nv-scatterWrap").datum(v.filter(function(a){return!a.disabled})).call(c),N.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var R=N.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});R.enter().append("g").attr("class","nv-regLines");var S=R.selectAll(".nv-regLine").data(function(a){return[a]});S.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),S.filter(function(a){return a.intercept&&a.slope}).watchTransition(F,"scatterPlusLineChart: regline").attr("x1",m.range()[0]).attr("x2",m.range()[1]).attr("y1",function(a){return n(m.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return n(m.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return l(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),r&&(d.scale(m).ticks(d.ticks()?d.ticks():a.utils.calcTicksX(J/100,v)).tickSize(-K,0),Q.select(".nv-x.nv-axis").attr("transform","translate(0,"+n.range()[0]+")").call(d)),s&&(e.scale(n).ticks(e.ticks()?e.ticks():a.utils.calcTicksY(K/36,v)).tickSize(-J,0),Q.select(".nv-y.nv-axis").call(e)),o&&(g.getData(c.x()).scale(m).width(J).color(v.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!v[b].disabled})),P.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),Q.select(".nv-distributionX").attr("transform","translate(0,"+n.range()[0]+")").datum(v.filter(function(a){return!a.disabled})).call(g)),p&&(h.getData(c.y()).scale(n).width(K).color(v.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!v[b].disabled})),P.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),Q.select(".nv-distributionY").attr("transform","translate("+(t?J:-h.size())+",0)").datum(v.filter(function(a){return!a.disabled
- })).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];A.stateChange(y),b.update()}),c.dispatch.on("elementMouseover.tooltip",function(a){d3.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos[1]-K),d3.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos[0]+g.size()),a.pos=[a.pos[0]+i.left,a.pos[1]+i.top],A.tooltipShow(a)}),A.on("tooltipShow",function(a){u&&G(a,x.parentNode)}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),b.update()}),D=m.copy(),E=n.copy()}),F.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i={top:30,right:20,bottom:50,left:75},j=null,k=null,l=a.utils.defaultColor(),m=c.xScale(),n=c.yScale(),o=!1,p=!1,q=!0,r=!0,s=!0,t=!1,u=!0,v=function(a,b){return"<strong>"+b+"</strong>"},w=function(a,b,c){return"<strong>"+c+"</strong>"},x=function(a,b,c,d){return"<h3>"+a+"</h3><p>"+d+"</p>"},y=a.utils.state(),z=null,A=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),B="No Data Available.",C=250;c.xScale(m).yScale(n),d.orient("bottom").tickPadding(10),e.orient(t?"right":"left").tickPadding(10),g.axis("x"),h.axis("y");var D,E,F=a.utils.renderWatch(A,C),G=function(f,g){var h=f.pos[0]+(g.offsetLeft||0),j=f.pos[1]+(g.offsetTop||0),k=f.pos[0]+(g.offsetLeft||0),l=n.range()[0]+i.top+(g.offsetTop||0),o=m.range()[0]+i.left+(g.offsetLeft||0),p=f.pos[1]+(g.offsetTop||0),q=d.tickFormat()(c.x()(f.point,f.pointIndex)),r=e.tickFormat()(c.y()(f.point,f.pointIndex));null!=v&&a.tooltip.show([k,l],v(f.series.key,q,r,f,b),"n",1,g,"x-nvtooltip"),null!=w&&a.tooltip.show([o,p],w(f.series.key,q,r,f,b),"e",1,g,"y-nvtooltip"),null!=x&&a.tooltip.show([h,j],x(f.series.key,q,r,f.point.tooltip,f,b),f.value<0?"n":"s",null,g)},H=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},I=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseout.tooltip",function(a){A.tooltipHide(a),d3.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),d3.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),A.on("tooltipHide",function(){u&&a.tooltip.cleanup()}),b.dispatch=A,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},showDistX:{get:function(){return o},set:function(a){o=a}},showDistY:{get:function(){return p},set:function(a){p=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},tooltips:{get:function(){return u},set:function(a){u=a}},tooltipContent:{get:function(){return x},set:function(a){x=a}},tooltipXContent:{get:function(){return v},set:function(a){v=a}},tooltipYContent:{get:function(){return w},set:function(a){w=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return B},set:function(a){B=a}},duration:{get:function(){return C},set:function(a){C=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,e.orient(a?"right":"left")}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),f.color(l),g.color(l),h.color(l)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(j){return j.each(function(b){var j=h-g.left-g.right,p=i-g.top-g.bottom,q=d3.select(this);a.utils.initSVG(q),k.domain(c||d3.extent(b,m)).range(e||[0,j]),l.domain(d||d3.extent(b,n)).range(f||[p,0]);{var r=q.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||o(a,b)}).attr("d",d3.svg.line().x(function(a,b){return k(m(a,b))}).y(function(a,b){return l(n(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return n(a,b)}),d=b(c.lastIndexOf(l.domain()[1])),e=b(c.indexOf(l.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return k(m(a,a.pointIndex))}).attr("cy",function(a){return l(n(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return m(a,a.pointIndex)==k.domain()[1]?"nv-point nv-currentValue":n(a,a.pointIndex)==l.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=!0,k=d3.scale.linear(),l=d3.scale.linear(),m=function(a){return a.x},n=function(a){return a.y},o=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return k},set:function(a){k=a}},yScale:{get:function(){return l},set:function(a){l=a}},animate:{get:function(){return j},set:function(a){j=a}},x:{get:function(){return m},set:function(a){m=d3.functor(a)}},y:{get:function(){return n},set:function(a){n=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(m){return m.each(function(q){function r(){if(!j){var a=B.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(q[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",v),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),B.select(".nv-hoverValue .nv-xValue").text(k(e.x()(q[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),B.select(".nv-hoverValue .nv-yValue").text(l(e.y()(q[i[0]],i[0]))))}}function s(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;f<a.length;f++)Math.abs(e.x()(a[f],f)-b)<c&&(c=Math.abs(e.x()(a[f],f)-b),d=f);return d}if(!j){var b=d3.mouse(this)[0]-f.left;i=[a(q,Math.round(c.invert(b)))],r()}}var t=d3.select(this);a.utils.initSVG(t);var u=(g||parseInt(t.style("width"))||960)-f.left-f.right,v=(h||parseInt(t.style("height"))||400)-f.top-f.bottom;if(b.update=function(){b(m)},b.container=this,!q||!q.length){var w=t.selectAll(".nv-noData").data([p]);return w.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),w.attr("x",f.left+u/2).attr("y",f.top+v/2).text(function(a){return a}),b}t.selectAll(".nv-noData").remove();var x=e.y()(q[q.length-1],q.length-1);c=e.xScale(),d=e.yScale();var y=t.selectAll("g.nv-wrap.nv-sparklineplus").data([q]),z=y.enter().append("g").attr("class","nvd3 nv-wrap nv-sparklineplus"),A=z.append("g"),B=y.select("g");A.append("g").attr("class","nv-sparklineWrap"),A.append("g").attr("class","nv-valueWrap"),A.append("g").attr("class","nv-hoverArea"),y.attr("transform","translate("+f.left+","+f.top+")");var C=B.select(".nv-sparklineWrap");e.width(u).height(v),C.call(e);var D=B.select(".nv-valueWrap"),E=D.selectAll(".nv-currentValue").data([x]);E.enter().append("text").attr("class","nv-currentValue").attr("dx",o?-8:8).attr("dy",".9em").style("text-anchor",o?"end":"start"),E.attr("x",u+(o?f.right:0)).attr("y",n?function(a){return d(a)}:0).style("fill",e.color()(q[q.length-1],q.length-1)).text(l(x)),A.select(".nv-hoverArea").append("rect").on("mousemove",s).on("click",function(){j=!j}).on("mouseout",function(){i=[],r()}),B.select(".nv-hoverArea rect").attr("transform",function(){return"translate("+-f.left+","+-f.top+")"}).attr("width",u+f.left+f.right).attr("height",v+f.top)}),b}var c,d,e=a.models.sparkline(),f={top:15,right:100,bottom:10,left:50},g=null,h=null,i=[],j=!1,k=d3.format(",r"),l=d3.format(",.2f"),m=!0,n=!0,o=!1,p="No Data Available.";return b.sparkline=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},xTickFormat:{get:function(){return k},set:function(a){k=a}},yTickFormat:{get:function(){return l},set:function(a){l=a}},showValue:{get:function(){return m},set:function(a){m=a}},alignValue:{get:function(){return n},set:function(a){n=a}},rightAlignValue:{get:function(){return o},set:function(a){o=a}},noData:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.stackedArea=function(){"use strict";function b(l){return t.reset(),t.models(q),l.each(function(l){var r=f-e.left-e.right,u=g-e.top-e.bottom,v=d3.select(this);a.utils.initSVG(v),c=q.xScale(),d=q.yScale();var w=l;l.forEach(function(a,b){a.seriesIndex=b,a.values=a.values.map(function(a,c){return a.index=c,a.seriesIndex=b,a})});var x=l.filter(function(a){return!a.disabled});l=d3.layout.stack().order(n).offset(m).values(function(a){return a.values}).x(j).y(k).out(function(a,b,c){var d=0===k(a)?0:c;a.display={y:d,y0:b}})(x);var y=v.selectAll("g.nv-wrap.nv-stackedarea").data([l]),z=y.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedarea"),A=z.append("defs"),B=z.append("g"),C=y.select("g");B.append("g").attr("class","nv-areaWrap"),B.append("g").attr("class","nv-scatterWrap"),y.attr("transform","translate("+e.left+","+e.top+")"),q.width(r).height(u).x(j).y(function(a){return a.display.y+a.display.y0}).forceY([0]).color(l.map(function(a){return a.color||h(a,a.seriesIndex)}));var D=C.select(".nv-scatterWrap").datum(l);D.call(q),A.append("clipPath").attr("id","nv-edge-clip-"+i).append("rect"),y.select("#nv-edge-clip-"+i+" rect").attr("width",r).attr("height",u),C.attr("clip-path",p?"url(#nv-edge-clip-"+i+")":"");var E=d3.svg.area().x(function(a,b){return c(j(a,b))}).y0(function(a){return d(a.display.y0)}).y1(function(a){return d(a.display.y+a.display.y0)}).interpolate(o),F=d3.svg.area().x(function(a,b){return c(j(a,b))}).y0(function(a){return d(a.display.y0)}).y1(function(a){return d(a.display.y0)}),G=C.select(".nv-areaWrap").selectAll("path.nv-area").data(function(a){return a});G.enter().append("path").attr("class",function(a,b){return"nv-area nv-area-"+b}).attr("d",function(a){return F(a.values,a.seriesIndex)}).on("mouseover",function(a){d3.select(this).classed("hover",!0),s.areaMouseover({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}).on("mouseout",function(a){d3.select(this).classed("hover",!1),s.areaMouseout({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}).on("click",function(a){d3.select(this).classed("hover",!1),s.areaClick({point:a,series:a.key,pos:[d3.event.pageX,d3.event.pageY],seriesIndex:a.seriesIndex})}),G.exit().remove(),G.style("fill",function(a){return a.color||h(a,a.seriesIndex)}).style("stroke",function(a){return a.color||h(a,a.seriesIndex)}),G.watchTransition(t,"stackedArea path").attr("d",function(a,b){return E(a.values,b)}),q.dispatch.on("elementMouseover.area",function(a){C.select(".nv-chart-"+i+" .nv-area-"+a.seriesIndex).classed("hover",!0)}),q.dispatch.on("elementMouseout.area",function(a){C.select(".nv-chart-"+i+" .nv-area-"+a.seriesIndex).classed("hover",!1)}),b.d3_stackedOffset_stackPercent=function(a){var b,c,d,e=a.length,f=a[0].length,g=1/e,h=[];for(c=0;f>c;++c){for(b=0,d=0;b<w.length;b++)d+=k(w[b].values[c]);if(d)for(b=0;e>b;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=g}for(c=0;f>c;++c)h[c]=0;return h}}),t.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=function(a){return a.x},k=function(a){return a.y},l="stack",m="zero",n="default",o="linear",p=!1,q=a.models.scatter(),r=250,s=d3.dispatch("tooltipShow","tooltipHide","areaClick","areaMouseover","areaMouseout","renderEnd");q.interactive(!1),q.pointSize(2.2).pointDomain([2.2,2.2]);var t=a.utils.renderWatch(s,r);return q.dispatch.on("elementClick.area",function(a){s.areaClick(a)}),q.dispatch.on("elementMouseover.tooltip",function(a){a.pos=[a.pos[0]+e.left,a.pos[1]+e.top],s.tooltipShow(a)}),q.dispatch.on("elementMouseout.tooltip",function(a){s.tooltipHide(a)}),b.dispatch=s,b.scatter=q,b.interpolate=function(a){return arguments.length?(o=a,b):o},b.duration=function(a){return arguments.length?(r=a,t.reset(r),q.duration(r),b):r},b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},offset:{get:function(){return m},set:function(a){m=a}},order:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return o},set:function(a){o=a}},x:{get:function(){return j},set:function(a){j=d3.functor(a)}},y:{get:function(){return k},set:function(a){k=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return l},set:function(a){switch(l=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return r},set:function(a){r=a,t.reset(r),q.duration(r)}}}),a.utils.inheritOptions(b,q),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(v){return F.reset(),F.models(e),q&&F.models(f),r&&F.models(g),v.each(function(v){var F=d3.select(this),K=this;a.utils.initSVG(F);var L=(l||parseInt(F.style("width"))||960)-k.left-k.right,M=(m||parseInt(F.style("height"))||400)-k.top-k.bottom;if(b.update=function(){F.transition().duration(E).call(b)},b.container=this,x.setter(J(v),b.update).getter(I(v)).update(),x.disabled=v.map(function(a){return!!a.disabled}),!y){var N;y={};for(N in x)y[N]=x[N]instanceof Array?x[N].slice(0):x[N]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length)){var O=F.selectAll(".nv-noData").data([z]);return O.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),O.attr("x",k.left+L/2).attr("y",k.top+M/2).text(function(a){return a}),b}F.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var P=F.selectAll("g.nv-wrap.nv-stackedAreaChart").data([v]),Q=P.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),R=P.select("g");if(Q.append("rect").style("opacity",0),Q.append("g").attr("class","nv-x nv-axis"),Q.append("g").attr("class","nv-y nv-axis"),Q.append("g").attr("class","nv-stackedWrap"),Q.append("g").attr("class","nv-legendWrap"),Q.append("g").attr("class","nv-controlsWrap"),Q.append("g").attr("class","nv-interactive"),R.select("rect").attr("width",L).attr("height",M),p){var S=o?L-B:L;h.width(S),R.select(".nv-legendWrap").datum(v).call(h),k.top!=h.height()&&(k.top=h.height(),M=(m||parseInt(F.style("height"))||400)-k.top-k.bottom),R.select(".nv-legendWrap").attr("transform","translate("+(L-S)+","+-k.top+")")}if(o){var T=[{key:D.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:D.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:D.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:D.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];B=C.length/3*260,T=T.filter(function(a){return-1!==C.indexOf(a.metaKey)}),i.width(B).color(["#444","#444","#444"]),R.select(".nv-controlsWrap").datum(T).call(i),k.top!=Math.max(i.height(),h.height())&&(k.top=Math.max(i.height(),h.height()),M=(m||parseInt(F.style("height"))||400)-k.top-k.bottom),R.select(".nv-controlsWrap").attr("transform","translate(0,"+-k.top+")")}P.attr("transform","translate("+k.left+","+k.top+")"),s&&R.select(".nv-y.nv-axis").attr("transform","translate("+L+",0)"),t&&(j.width(L).height(M).margin({left:k.left,top:k.top}).svgContainer(F).xScale(c),P.select(".nv-interactive").call(j)),e.width(L).height(M);var U=R.select(".nv-stackedWrap").datum(v);U.transition().call(e),q&&(f.scale(c).ticks(a.utils.calcTicksX(L/100,v)).tickSize(-M,0),R.select(".nv-x.nv-axis").attr("transform","translate(0,"+M+")"),R.select(".nv-x.nv-axis").transition().duration(0).call(f)),r&&(g.scale(d).ticks("wiggle"==e.offset()?0:a.utils.calcTicksY(M/36,v)).tickSize(-L,0).setTickFormat("expand"==e.style()||"stack_percent"==e.style()?d3.format("%"):w),R.select(".nv-y.nv-axis").transition().duration(0).call(g)),e.dispatch.on("areaClick.toggle",function(a){v.forEach(1===v.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),x.disabled=v.map(function(a){return!!a.disabled}),A.stateChange(x),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(T=T.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),x.style=e.style(),A.stateChange(x),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,i,l=[];if(v.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x()),e.highlightPoint(g,h,!0);var j=f.values[h];if("undefined"!=typeof j){"undefined"==typeof d&&(d=j),"undefined"==typeof i&&(i=b.xScale()(b.x()(j,h)));var k="expand"==e.style()?j.display.y:b.y()(j,h);l.push({key:f.key,value:k,color:n(f,f.seriesIndex),stackedValue:j.display})}}),l.reverse(),l.length>2){var m=b.yScale().invert(c.mouseY),o=null;l.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(o=b):void 0}),null!=o&&(l[o].highlight=!0)}var p=f.tickFormat()(b.x()(d,h)),q="expand"==e.style()?function(a){return d3.format(".1%")(a)}:function(a){return g.tickFormat()(a)};j.tooltip.position({left:i+k.left,top:c.mouseY+k.top}).chartContainer(K.parentNode).enabled(u).valueFormatter(q).data({value:p,series:l})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){A.tooltipHide(),e.clearHighlights()}),A.on("tooltipShow",function(a){u&&H(a,K.parentNode)}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&v.length===a.disabled.length&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k={top:30,right:25,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p=!0,q=!0,r=!0,s=!1,t=!1,u=!0,v=function(a,b,c){return"<h3>"+a+"</h3><p>"+c+" on "+b+"</p>"},w=d3.format(",.2f"),x=a.utils.state(),y=null,z="No Data Available.",A=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),B=250,C=["Stacked","Stream","Expanded"],D={},E=250;x.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(s?"right":"left"),i.updateState(!1);var F=a.utils.renderWatch(A),G=e.style(),H=function(c,d){var h=c.pos[0]+(d.offsetLeft||0),i=c.pos[1]+(d.offsetTop||0),j=f.tickFormat()(e.x()(c.point,c.pointIndex)),k=g.tickFormat()(e.y()(c.point,c.pointIndex)),l=v(c.series.key,j,k,c,b);a.tooltip.show([h,i],l,c.value<0?"n":"s",null,d)},I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},J=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("tooltipShow",function(a){a.pos=[a.pos[0]+k.left,a.pos[1]+k.top],A.tooltipShow(a)}),e.dispatch.on("tooltipHide",function(a){A.tooltipHide(a)}),A.on("tooltipHide",function(){u&&a.tooltip.cleanup()}),b.dispatch=A,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,g.setTickFormat=g.tickFormat,b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},tooltips:{get:function(){return u},set:function(a){u=a}},tooltipContent:{get:function(){return v},set:function(a){v=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return D},set:function(a){D=a}},yAxisTickFormat:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return E},set:function(a){E=a,F.reset(E),e.duration(E),f.duration(E),g.duration(E)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n),e.color(n)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,g.orient(s?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=!!a,a&&(b.interactive(!1),b.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.version="1.7.1"}();/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
- !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
- return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
- return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
- <tr>
- <td class="{{classes_level}}">{{name}}</td>
- <td class="{{classes_level}} big">{{classes_bar}}</td>
- <td class="{{classes_level}} small"><div align="right">{{classes_tested_percent}}</div></td>
- <td class="{{classes_level}} small"><div align="right">{{classes_number}}</div></td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{methods_level}} small">{{crap}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- </tr>
- <tr>
- <td class="{{methods_level}}" colspan="4">{{name}}</td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{methods_level}} small">{{crap}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- </tr>
- <tr>
- <td class="{{lines_level}}">{{icon}}{{name}}</td>
- <td class="{{lines_level}} big">{{lines_bar}}</td>
- <td class="{{lines_level}} small"><div align="right">{{lines_executed_percent}}</div></td>
- <td class="{{lines_level}} small"><div align="right">{{lines_number}}</div></td>
- <td class="{{methods_level}} big">{{methods_bar}}</td>
- <td class="{{methods_level}} small"><div align="right">{{methods_tested_percent}}</div></td>
- <td class="{{methods_level}} small"><div align="right">{{methods_number}}</div></td>
- <td class="{{classes_level}} big">{{classes_bar}}</td>
- <td class="{{classes_level}} small"><div align="right">{{classes_tested_percent}}</div></td>
- <td class="{{classes_level}} small"><div align="right">{{classes_number}}</div></td>
- </tr>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Code Coverage for {{full_path}}</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="{{path_to_root}}css/bootstrap.min.css" rel="stylesheet">
- <link href="{{path_to_root}}css/style.css" rel="stylesheet">
- <!--[if lt IE 9]>
- <script src="{{path_to_root}}js/html5shiv.min.js"></script>
- <script src="{{path_to_root}}js/respond.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <header>
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- {{breadcrumbs}}
- </ol>
- </div>
- </div>
- </div>
- </header>
- <div class="container">
- <table class="table table-bordered">
- <thead>
- <tr>
- <td> </td>
- <td colspan="10"><div align="center"><strong>Code Coverage</strong></div></td>
- </tr>
- <tr>
- <td> </td>
- <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
- <td colspan="4"><div align="center"><strong>Functions and Methods</strong></div></td>
- <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
- </tr>
- </thead>
- <tbody>
- {{items}}
- </tbody>
- </table>
- <table id="code" class="table table-borderless table-condensed">
- <tbody>
- {{lines}}
- </tbody>
- </table>
- <footer>
- <hr/>
- <h4>Legend</h4>
- <p>
- <span class="success"><strong>Executed</strong></span>
- <span class="danger"><strong>Not Executed</strong></span>
- <span class="warning"><strong>Dead Code</strong></span>
- </p>
- <p>
- <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {{version}}</a> using <a href="{{runtime_link}}" target="_top">{{runtime_name}} {{runtime_version}}</a>{{generator}} at {{date}}.</small>
- </p>
- <a title="Back to the top" id="toplink" href="#"><span class="glyphicon glyphicon-arrow-up"></span></a>
- </footer>
- </div>
- <script src="{{path_to_root}}js/jquery.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/bootstrap.min.js" type="text/javascript"></script>
- <script src="{{path_to_root}}js/holder.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(function() {
- var $window = $(window)
- , $top_link = $('#toplink')
- , $body = $('body, html')
- , offset = $('#code').offset().top;
- $top_link.hide().click(function(event) {
- event.preventDefault();
- $body.animate({scrollTop:0}, 800);
- });
- $window.scroll(function() {
- if($window.scrollTop() > offset) {
- $top_link.fadeIn();
- } else {
- $top_link.fadeOut();
- }
- }).scroll();
- $('.popin').popover({trigger: 'hover'});
- });
- </script>
- </body>
- </html>
- body {
- padding-top: 10px;
- }
- .popover {
- max-width: none;
- }
- .glyphicon {
- margin-right:.25em;
- }
- .table-bordered>thead>tr>td {
- border-bottom-width: 1px;
- }
- .table tbody>tr>td, .table thead>tr>td {
- padding-top: 3px;
- padding-bottom: 3px;
- }
- .table-condensed tbody>tr>td {
- padding-top: 0;
- padding-bottom: 0;
- }
- .table .progress {
- margin-bottom: inherit;
- }
- .table-borderless th, .table-borderless td {
- border: 0 !important;
- }
- .table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success {
- background-color: #dff0d8;
- }
- .table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests {
- background-color: #c3e3b5;
- }
- .table tbody tr.covered-by-small-tests, li.covered-by-small-tests {
- background-color: #99cb84;
- }
- .table tbody tr.danger, .table tbody td.danger, li.danger, span.danger {
- background-color: #f2dede;
- }
- .table tbody td.warning, li.warning, span.warning {
- background-color: #fcf8e3;
- }
- .table tbody td.info {
- background-color: #d9edf7;
- }
- td.big {
- width: 117px;
- }
- td.small {
- }
- td.codeLine {
- font-family: monospace;
- white-space: pre;
- }
- td span.comment {
- color: #888a85;
- }
- td span.default {
- color: #2e3436;
- }
- td span.html {
- color: #888a85;
- }
- td span.keyword {
- color: #2e3436;
- font-weight: bold;
- }
- pre span.string {
- color: #2e3436;
- }
- span.success, span.warning, span.danger {
- margin-right: 2px;
- padding-left: 10px;
- padding-right: 10px;
- text-align: center;
- }
- #classCoverageDistribution, #classComplexity {
- height: 200px;
- width: 475px;
- }
- #toplink {
- position: fixed;
- left: 5px;
- bottom: 5px;
- outline: 0;
- }
- svg text {
- font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif;
- font-size: 11px;
- color: #666;
- fill: #666;
- }
- .scrollbox {
- height:245px;
- overflow-x:hidden;
- overflow-y:scroll;
- }
- svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;width:100%;height:100%}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:1px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{position:absolute;pointer-events:none}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.axis{opacity:1}.axis.nv-disabled{opacity:0}.nvd3 .nv-axis{pointer-events:none}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-bars .negative rect{zfill:brown}.nvd3 .nv-bars rect{zfill:#4682b4;fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups path.nv-line{fill:none;stroke-width:1.5px}.nvd3 .nv-groups path.nv-line.nv-thin-line{stroke-width:1px}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3 .nv-line.hover path{stroke-width:6px}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}.nvd3 .nv-distribution{pointer-events:none}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3.nv-historicalStockChart .nv-axis .nv-axislabel{font-weight:700}.nvd3.nv-historicalStockChart .nv-dragTarget{fill-opacity:0;stroke:none;cursor:move}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .brush .extent{fill-opacity:.3;stroke:#fff;shape-rendering:crispEdges}.nvd3 .axis line,.axis path{fill:none;stroke:#000;shape-rendering:crispEdges}.nvd3 .axis text{text-shadow:0 1px 0 #fff}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc}/*!
- * Bootstrap v3.3.4 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}�����€��pFFTMm*—Ü���ü���GDEFD������ OS/2g¹k‰��8���`cmapÚã���˜��rcvt �(ø�����gaspÿÿ������glyf}]Âo����”¤headM/Ø��œ¼���6hhea
- D��œô���$hmtxÒÇ `�����tlocaoû•Î�� Œ��0maxpj�Ø��¢¼��� name³, ›��¢Ü��¢postº£å5��¦€��
- ÑwebfÃTP��±T����������Ì=¢Ï����Ðv�u����Ðvs—����������������������‹���Ð���ZÐ��¤�2¸��������������������������UKWN�@� ÿÿÀÿ���{�������������� ����������,���
- �������h�����,��
- ��Ü�°���h�@��(� �+� �¥
- / _ ¬ ½"#%ü&&ú' 'àà àà)à9àIàYà`àiàyà‰à—á áá)á9áFáIáYáiáyá‰á•á™ââ âââ!â'â9âIâYâ`øÿÿÿ��� �*� �¥ � / _ ¬ ½"#%ü&&ú' 'àààà à0à@àPà`àbàpà€à�ááá á0á@áHáPá`ápá€á�á—â�â âââ!â#â0â@âPâ`øÿÿÿÿãÿÚÿfÿbàßäßµßißYÞÜýÚÚÙ!ÙÙ
- þø÷ñëå|vpjdc]WQKEDÞÜÖÕÎÍÅ¿¹³��������������������������������������������������������������������������������������������������������������Œ�������5��� ��� ������*���+������ ��� ������¥���¥����� ���
- ����� /�� /����� _�� _����� ¬�� ¬����� ½�� ½�����"��"�����#��#�����%ü��%ü�����&��&�����&ú��&ú�����' ��' �����'��'�����à��à�����à��à ���!��à��à���&��à ��à)���0��à0��à9���:��à@��àI���D��àP��àY���N��à`��à`���X��àb��ài���Y��àp��ày���a��à€��à‰���k��à���à—���u��á��á ���}��á��á���†��á ��á)������á0��á9���š��á@��áF���¤��áH��áI���«��áP��áY�����á`��ái���·��áp��áy���Á��á€��á‰���Ë��á���á•���Õ��á—��á™���Û��â���â���Þ��â ��â ���å��â��â���æ��â��â���í��â!��â!���ï��â#��â'���ð��â0��â9���õ��â@��âI���ÿ��âP��âY�� ��â`��â`����øÿ��øÿ���õ�õ���öª�öª���
- ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(ø���ÿÿ���(��h ���.±�/<²�í2±Ü<²�í2�±�/<²�í2²ü<²�í23!%3#(@þèðð üà(Ð��d�dLL�[��27>32+&/#"&/.=/&6?#"&'&546?>;'.?654676X&
- žjžà
- àžjž
- )"&
- žjžà
- àžjž
- )L
- àžjž
- )"&
- žjžà
- àžjž
- )"&
- žjžà
- ��������LL�#��32!2#!+"&5!"&=463!46ÂÈ^þ¢Èþ¢^Lþ¢Èþ¢^È^�����p��@L�E��32!2+!2++"&=!"&?>;5!"&?>;&'&6;22?69ú
- þ”
- x
- }
- x
- }”þí
- x
- }þí
- x
- vþ”
- ú¤¤L
- þ” d ®® d l
- ¤¤���d�Œ®�;��2#4.#"!!!!32>53#"'.'#7367#73>76èòp<µ#4@9+820{dþÔ–dþÔ 09B49@4#®bk§Îv$BÙdpÚd†>u®½hi-K0!.O2d22dJtB+"0J+«kuž0ªwd/5dW…%����{��L°�>�G��!2+!2++"&=!"&?>;5!"&?>;4632654&#¬^CjB00BjC²
- x
- Š
- •
- þõ
- x
- uþõ
- x
- u¶Ë@--@°$?2O*$$*P2@%d ¯
- ¯ d Û
- ÈþÔBVT@���È�L¼���!2#!"&=46ú üà¼ÈÈ����È��è°�%�A��+32!546;5467.=#"&=!54&'.467>=è2cQQc2üà2cQQc2ÈA7 7A�A7 7A°–d[•##•[––––[•##•[d–Èd<c2<2c<––<c2<2c<d���������������1��ÿò,ÂA���2632#!"&5467&546÷nµ,,.xªªxýOqUBØAwaxyrPEk™×������d°¯�����32!546;'&>76!'ö
- ˆÓûPÔ‡
- $
- op zy¶Ã³#»ý%**%ê·$ ”–üp�������d°L���#�7��!2"'&6&546 6'&4#!"&7622?62~
- ýÌýÌþø
- Œ
- þø\l
- û‚
- l¤¤L
- ýÉ7
- Úþøþø
- &
- þð
- ýÚ
- €þ”
- l¤¤���ÿðÿðºº� �
����2'7' à&™
cÖ_"ý™Öfþþ³nº
™&\Ö`þtýšÖfüjpO�������°°���32!546;!¼úüàúþ°ŠýÚ22&&�����Lœ���%6.676.67646p…'0SFOˆ$WOHBý¨XAOˆ$WOHBù£"üÁ7Q)mr ›ý¢*`)nq&*���� ÿø»§��)���2"'#'".4>"2>4&�ȶƒNN;)þíwŽd¶ƒNNƒr°”VV”°”VV§Nƒ¶d�yþî%:MNƒ¶È¶ƒ[V”°”VV”°”��d�X¯D���>.54>‰0{xuX6Cy„¨>>§…xC8ZvxyµDH-Sv@9y€²UU²€y9@vS-H���ÿÓ�^{”���62!2'%&7%&63—ƒ�¥þª‚þ©þª‚þ¥ aþŸùþoö÷�û�ÿÓ�^{”��"��62!2'%&7%&63#7'7#'—ƒ�¥þª‚þ©þª‚þ¥óðÅJÁÃJÀêN aþŸùþoö÷�ûdŽâ‹ŒåŒÓ������°°�&��2##!"&=467%>="&=46X|°>& f
- û‚
- f &>°°°|ú.hK
- æ
- ]
- ]
- æ
- Kh.ú|°���
����°L���#�'�+�/�3�7�G�K�O�S�W��!2#!"&54635)"3!2654&33535!3535!35!"3!2654&35!3535!35~
- û‚
- Ud£ýÚ
- &
- sdüd düd dáýÚ
- &
- üïd düd dL
- ûæ
- ddd
- þ¢
- ^
- ddÈddddÈddddd
- þ¢
- ^
- dddddÈdddd������LL���/�?��!2#!"&546)2#!"&546!2#!"&546)2#!"&5462�þpm�þpý½�þpm�þpLþp�þp�ý¨þp�þp��� ����LL���/�?�O�_�o�����32+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=462ÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈüõÈÈ¥ÈÈ¥ÈÈLÈÈÈÈÈÈþpÈÈÈÈÈÈþpÈÈÈÈÈÈ�����°L���/�?�O�_��32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ÈÈ¥¼ýDþ…ÈÈ¥¼ýDþ…ÈÈ¥¼ýDLÈÈÈÈþpÈÈÈÈþpÈÈÈÈ�����&�,è ��� 62"'&4?622Ñ;±üñþ€±«Ý;±üð€±«��n�nBB�#�� "' "/&47 &4?62 62ˆ²þõ²þôþô²þõ²;³þôþô²þõ²²þõ��ÿëÅ™��%�I���2"'#".4>"2>4&3232++"&=#"&=46;546™Ä³‚MN,mþÔwŽb´�MM�o³˜XX˜³™XXþ¼–
- K
- K
- –
- K
- K™M‚³b�yþÕl+MM�´Ä³‚MX™³˜XX˜³™#
- K
- –
- K
- K
- –
- K
- ���ÿëÅ™��%�5���2"'#".4>"2>4&!2#!"&=46™Ä³‚MN,mþÔwŽb´�MM�o³˜XX˜³™XXþX^
- þ¢
- ™M‚³b�yþÕl+MM�´Ä³‚MX™³˜XX˜³™‡
- –
- –
- ������™°��-��32+"&5465".5472>54&&dd§Ò[›ÖêÖ›[Ò§g|rÅèÅr|°þp�á¦>þÙ¸uÖ›[[›Öu¸'>¦7ÈxtÅrrÅtxÈ��d��°°���/�?��32+"&54632+"&54632+"&54632+"&=46–
- –
- þÞ–
- –
- þÞ–
- –
- þÞ–
- –
- °
- û‚
- ~
- þp
- ý
- î
- þÔ
- þ>
- Â
- È
- ú
- ú
- ������––�G�O��27'#"/&/&'7'&/&54?6?'6776?6"264X!)&1-†=+P˜˜P08†,2&+!)&1-†<,P
——
P/:…-1&+x²~~²~–˜P09†,1&+"(&1,†=,Q——Q09†-0&* !(&0-†=,P˜þ™~±~~±��d��°���!�%�)�-�1��!2!2!5463!546!5#!"&53333333ô,);
- û´
- ;),,;)ýD);dddddddd;)d
- KK
- d);dddþÔüà);;) dýD¼ýD¼ýD¼ýD¼����Ñ���62++"&5!+"&5#"&l`
- ¯
- ú
- þÔ
- ú
- ¯
- j`ý
- ýÁ
- wþ‰
- ?
- ��d��è°����3!#!"&5463#"&=X;),üàRú°þp);ývLþpú���™™���0���2".4>"2>4&3232+"&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|2
- ¯
- ú
- ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ
- þí
- 2
- ^
- ����ÿœ��°����)#!3333ýæ)ò)ýæ¯Ñ¢Ðþžà�þp°þÔ,þpþÔ,�����d��°°��/��3232"'&6;4632#!"&546;2!546&È¿
þ¹
&
þ¹
¿T2
- ûæ
- 2
- „°þ>þp�Âüà
- þ¢
- ^
- ¯¯
- ���™™���1���2".4>"2>4&3232"'&6;46ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ|–
- ‰
-
ß
&
ß
- ‰™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ
- þíþí
- �����™™���1���2".4>"2>4&%++"&5#"&762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþçß
- ‰
- –
- ‰
-
ß
&™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅþíþí
- ��������°°��9��!2#!"&'&547>!";2;26?>;26'.áî
- ºû´¹—ýÔ
- W
- –
- &
- ú
- &
- –
- W°
- ýtþW
©Œ
- Èþ>
- ˜
- ˜
- Â���™™���'���2".4>"2>4&&546ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrþ‹ýý™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ]¾$¾����™°�(��76#!"&?&#"2>53".4>32³‡
- þ–…m�tÅrrÅèÅr–[›ÖêÖ›[[›ÖuÀ$‡þ–
- …LrÅèÅrrÅtuÖ›[[›ÖêÖ›[������™°��5��76#!"&?&#"#4>323#"'&5463!232>³‡þ—†n�tÅr–[›ÖuÀë–[›ÖuÀœ†h
- …n‚tÅr$‡þ—†KrÅtuÖ›[ý¿uÖ›[v†
- h…LrÅ���
- �d��°°���/�?�O�_�o����Ÿ��!2#!"&546!"3!2654&32+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=46}
- ûæ
- Àü®
- R
- ý2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- ¾2
- 2
- ÒÂ
- þ>
- °
- û‚
- ~
- È
- ü®
- R
- d
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- È
- 2
- 2
- 2
- 2
- ��������L°��#��54&#!"#"3!2654&#!546;2„uSþÔRvd);;)„);;)ý¨È ÈSuvRÈ;)ý¨);;)X);––��d��LL� �7��32#462#".'.#"#"'&5>763276}2
- dÀ!C@1?*'),GUKx;(.9)-EgPL
- ûÍ3
- 0þ[;P$
9¶7WW������°—�!�1�A���2+"&54. +"&54>32+"&546!32+"&546äèÞ£c
- 2
- �äþúä�
- 2
- c£* ` —c£ÞtþÔ
- ,ÑrrÑþÔ
- ,tÞ£ýÀþ4Ìþ4Ì�������ÓGÝ��9��%6'%&+"&546;2762"/"/&4?'&4?62A þþú
- úXx"xx"xx"ww".¬
- ý
- ¬
- ^
- „x"xx"ww"xx"�������ÓrÝ��/��%6'%&+"&546;2%3"/.7654'&6?6A þþú
- úÒ
- `Z HN.¬
- ý
- ¬
- ^
- d �¡š g~„j�������Äbì��1�K��3#"/.7654&'&6?6%6'%&+"&546;2%3"/.7654'&6?6LJD@
- *o;7 *ý‚ þþú
- úÒ
- `Z HNì ³ÙiËT "–²Z¬G !¾¬
- ý
- ¬
- ^
- d �¡š g~„j����
����°°� ����!�%�-�;�?�C�G�K�O��3#!#!#3!##5!!!!#53#533!3533##5#535#5!!#53#53#53!5!ôddþpdô¼ÈÈþÔÈdXû´,�,üàdd¼ddýDÈþÈdôÈdÈddÈ,ýD,ddd„ddþddôþÔ,„dddXþdÈ,,ÈdþÔ,þÔ,ÈdddþþôdþÔddddÈdÈþÔ,ÈdddþÔddd���� ����°°���������#��7#3#3#3#3#3!5!#53#53#53dddÈdd�ÈÈÈdd,ÈÈüàþÔ,ÈddÈdd,ÈÈÈèüèüèüèüèûPdd[[[[[�����
- ¦°�
��� "'463&"26ôªþ0ýV
- C;S;;S;°ýVþ0ªÛ
- Í;;T;;�������
- Ò°�
��!�� "'463!"/ &"26ôªþ0ýV
- ªþ08¨ýDþÓ;S;;S;°ýVþ0ªÛ
- ýVþ08ª¼Í;;T;;�����d��°°�&��!2&54&#!"3!2#!"&54?6,9K@
- ýD@
- ¼
- ü®
- ‹°Kü|@
- ¶
- @
- üJ
- Ï‹����ÈÿÿL°�
- ��!2 46ú þ>þ>°û‚¼þC��������°°��E�U��!"3!26?6'.#"#!"&/.+";26=463!2;2654&!"3!26/.6þDN9
- Â
- >SV–
- N
- ýÚ
- N
- –
- –
- î
- –
- þ±þ
- &
- X
- &°
- þÓl l-
- þp
œ
œ
- ýv
- –
- –
- Š
- ý¨
- ˜
- ˜
- �������d°L��!�)�1��3232#!"&546;>35"264$2"&4ôÈ8]4$–);;)ü);;)– '3]ÈdþϾ‡‡¾‡þïV<<V<L);;;)ý¨);;)X);E5+þÔddF‡¾‡‡¾<V<<V�����5��°¯� �#�� !526/!3!567>?!©�(%
- þ_5,Rþy:" *2þ“8�¬T¢¯ü2*BBW-Þ‘Y".BB%
îýZÉ�����d��ð°�'�2�;��#!5>54.'52%32654.+32654&+ñ50;*7Xml0þ);!×9uc>--þ�‹Ni*S>vØPR}^Ÿ�3:R.CuN7Y3(; G)IsC3[:+ 1aJ);4ü®ePZ����È��o°���!56764.'&'5mSB„ ,Jþº
°95(ü¹1(aaR@ 9����ÿµ��°�%�/��#4.+!52>5#"#!#3'3#72&È2þp"È&2èû›KK}}KK}„ ü®dd R ,Èü১ §��!ÿµ�°�%�/��#4.+!52>5#"#!5!'7!5L2&È2þp"È&2èC§ü১ „ ývdd Š ,û‚}KK}}KK�����°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Xý¨èü üàLû´LddþÔddþÔddþÔdd�����°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=46ú¼ýD³Lû´Ý¼ýD³Lû´LddþÔddþÔddþÔdd�����°L���/�?��5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&ôXý¨þpèüÈ üàþÔLû´¶ddþéddþéddþédd������°L���/�?��!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462Lû´Lû´Lû´Lû´LddþÔddþÔddþÔdd�����°L���/�?�O�_�o���32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ddA üàþéddA üàþéddA üàþéddA üàLddddþÔddddþÔddddþÔdddd��ÿœ��°L���#�*�:�J��!#;2+"&=46!2#!"&=465#535!2#!"&=46!2#!"&=46�dd–ddôþþú§ÈÈÂ,þÔXý¨LddþÔddú}KdK¯ddþÔdd�������L���#�*�:�J��32+"&=46#3!2#!"&=463#'7!2#!"&=46!2#!"&=462ddgddü®ôþ/Èȧ§ûæ,þÔXý¨Lddû´LþÔddÈdK}}¯ddþÔdd�������È°è����!2#!"&546 Kî,,ý,,„þÔ,è,ýv,,Š,ýD,,�����°L�����!2#!"&5467'2"&4,Xû¨J÷*J%ìüÒpNNpNLüôdý¶ƒœ>þàôtNoOOo�����Û�6‘����2.'&54>"264ˆuÆsFE²66 !^Xm)<DsŸ··‚‚·‚‘xÊus�mé?>!fh˜H„uX£yH¸��¸�����™™�����2".4>"ãêÖ›[[›ÖêÖ›[[›KtÅrrÅ™[›ÖêÖ›[[›ÖêÖ›üoVrÅèÅr���u�ß��5��.54>6?6&'.'&76#&*IOWN>%3Vp}?T›|J$?LWPI¼)(!1 ) H�uwsu‡EG€^F&:c—YE‡vsxv�ýþ!K‚:%A'#"
- A)Y¶�������Ël��*�/��7>%!2!"3!26=7#!"&546 7èl
- lý�27»þ�);;)ô);È»£þp¥¹¹8þ–¡7cõs*
- sÈ
»;)þ);;)¶Èþ´¥¹¹¥�¥¹þ×þ–2ªc�����“L��6��!#"3!2657#!"&546&'5&>75>^i¤4Ã);;)ô);ȹ¥þp¥¹¹Sþ¬9dTX
- .9I@F*L’6;)þ);;)™g¥¹¹¥�¥¹þÓþÎ Ë
0!;bA4Ò
- ���������L��5��!2!"3!26=7#!"&546 62"/&4?622^^<C²þ£);;)ô);ȹ¥þp¥¹¹Ê‹eýíøeoL±;)þ);;)EÈÛ¥¹¹¥�¥¹þ3‹eýìøeo����
- �
- ¦¦�;�� 62+3546&=#32"'&6;5#'&47635#"&>
- ªÈ
- þø
- Ȫ
- þüþø
- ¯È
- þø
- ȯ
- –þø
- È
- þüþ÷
- È
- þø
- È
-
- È
- ��È��„L���326'+"&546údÐþ0dLþJÅüÅþJè�������°L�#��3266''+"&5462dÐÐþ0þ0dLþJÅþJÅüÅþJÅþJè������°3���''&4766°þ0þìÐüÅþJà*àþJÅ����È�36���&546ó.üÒ2þþè��È�d„è����32+"&546!32+"&546úÈÈ¥ÈÈèüà üà ���È�dLè���#!"&5463!2Lüà ¶üà �������3���46&5&546ôìþþ0d¶þ *þ ¶þ;è��ÿþ�³O�#��72#"&5&5&5464646ddþ1þ2ÒÒNüµþ: µþ9 è þ>¶ þ=¶��,��èL���32+"&5&54646Rddþ0ÐLü¶þ;èþ;¶���d�È°H���� #!"&762!2#!"&=46®õ ûî õ*ý÷èü9ýäýHdd��ˆÿüuJ��� uþ `ÅýØ(„þŸþŸÆ(&����;ÿü(J��� ' 7(ýÙÆaþŸÆ#ýÙÆaaÆ���™™��3���2".4>#"#";;26=326=4&+54&ãêÖ›[[›ÖêÖ›[[›}d––d––™[›ÖêÖ›[[›ÖêÖ›º–d––d–������™™�����2".4>!"3!26=4&ãêÖ›[[›ÖêÖ›[[›Eþô™[›ÖêÖ›[[›ÖêÖ›þ~dd���™™��3���2".4>"'&"2?2?64/764/ãêÖ›[[›ÖêÖ›[[›å xx � xx � xx � xx �™[›ÖêÖ›[[›ÖêÖ› xx � xx � xx � xx ����™™��$���2".4>'&"2764/&"ãêÖ›[[›ÖêÖ›[[›T‹òw‹™[›ÖêÖ›[[›ÖêÖ›þ1U‹ñw‹������™™��;�K���2".4>";7>32";2>54.#";26=4&ãêÖ›[[›ÖêÖ›[[›?<B2!ƒ
(#"3D<:–
- –
- ™[›ÖêÖ›[[›ÖêÖ›‘/O2*(8\6/H* ýã
- –
- –
- ����™™���>���2".4>#";26=4&#";#"3!26=4&+4&ãêÖ›[[›ÖêÖ›[[›––
- –
- ú
- KK
- ^
- K™[›ÖêÖ›[[›ÖêÖ›V
- –
- –
- þÔ
- 2
- È
- 2
- 2
- �����°°�/�_��3232++"&=.'#"&=46;>7546+"&=32+546;2>7#"&=46;.
–
- g—Â
- —g
- –
- g—Â
- —g¹
- –
- Df¨
- ¨fD
- –
- Df¨
- ¨f°
- —g
- –
- g—Â
- —g
- –
- g—Â
- þͨ
- ¨fD
- –
- Df¨
- ¨fD
- –
- Df���™™���?���2".4>"2>4&"/"/&4?'&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrš@||@||@||@||™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅZ@||@||@||@||�����™™���0���2".4>"2>4&"/&4?62762ãêÖ›[[›ÖêÖ›[[›¿èÅrrÅèÅrrƒjþÀÊjOÅ™[›ÖêÖ›[[›ÖêÖ›;rÅèÅrrÅèÅ}jþ¿ËjOÅ�����™™���!���2".4>"&32>54ãêÖ›[[›ÖêÖ›[[›KtÅrAKiõý¸hstÅr™[›ÖêÖ›[[›ÖêÖ›;rÅtxiKAÐý¸>rÅts������S°ù���6!2#!'&4'
- &ýÚýöF«
- þÝÈþÝ
-
«
&�������S™ù��� &5!"&=463!46
- ýöýÚ&ñþU
&
þU
- #È#
- ����·��]™��� #!+"&5!"&762ª«
- þÝÈþÝ
-
«
&‰ýöýÚ&
- ����·�]°���32!2"'&63!46&È#
-
þU
&
þU
- #°ýÚýö
- &�����·™]��� &5>746
- ýö^°¥�$,[‡Ç~UþU
&
þU
- #$DuMi±�qF
- �����°°��+��!2/"/&4?'&6!"&546762R,^ùjù^þ!þÔ^ùjù^°þÔ^ùjù^ûP,^ùjù^����I�Igg��+��#!"&546762!2/"/&4?'&6öjù^þÔ^ùý,^ùjù^`jù^,^ùýñþÔ^ùjù^������™™���/���2".4>#";2676&#";26=4&ãêÖ›[[›ÖêÖ›[[›³Ð:#6#:1–
- –
- ™[›ÖêÖ›[[›ÖêÖ›ºþÒ.þ
- –
- –
- ��������°°�I�U�a�h�o��276?67632;2+"!#!54&+"&=46;2654?67>;26/.'&;26!"&5)#! Ä&Ä0
- =
- 2
- þpÈþp
- 2
- = �¦
- Û
- 3þ5±3
- çþ‰
- �X
- þ‰°
-
v
v
- !{,
- 2
- ¯,þÔ¯
- 2
- 0€y¢
- •
- ª�
- �
- ür
- wþ‰
- ��������¯¦�+�I��6.'&&&547>7>'.>7>&67>7>7>�-Bla‹bŽD8=3™*U :1'Ra\‡{À%&¢=>8\tYR-!Šq[Fak[)¦²þÝÈ•X1™"@&J<7_…?3J5%#/D &/q!!6ROg58<'([@1%@_U2��]�rÏ�O��.>7'&767>.'&'.'&>77>.'&>�'
- '8GB
- `ŠH
>JS>H7
'+" NA
- 5M[`/Pg!;('2"&"IbYÏC€e\D9$886#1%)*ƒ‘§—J7gG:
8G\au9hªoK$œ]54<<E"5cQ8
.@AU!U™hQ)����ÿÜ�jÔF��?�Q���2".4>&"&5476&2>76&'&6?6&'&'.¤�{nO9:On{�¢�{nO:9On{°ø°FZ
2Z_ƒˆƒ_Z2Zýÿ# %8-#,-"F-I\b\I*I\b\I--I\b\I*I\b\IÜ9>|°°|;7Es1$F^D10E^E$1u$/D0
"%,I���ÿÜ��Ô°��'�;�L��!#7.54>327377>76&'&%7.5476&6?'&'.P”[©vY,9On{�R=A ”&/l‰'Pj˜R.Mv&6ýQFZ
*HLh5)k�|# %8-,-"xatzbI\b\I-yþRµUÖ4Zrnc1ˆ?1FrEs1<QA9
š§n;7p$/D0
V,I���ÿž��«���(��'6#!"&%!546;2!32+"&/&6Z‚8‚%úò%
- Y
- –
- YþChÐ:#6#:d*!ûà GD„K
- KÓßüü����d�°°�(���2'%/&=47&=4674L|Xkþ™dÍÍdþ™k°X>þþ»1)
ùþù]@ €€ @]ù
)1ES>�������L°��'�+�/�3�7�;�?�C�G�K�O�S�W�[�_�c��3232!546;546;2!546#!"&5353353353353353533533533533535335335335335Rd2û´2dôüddddddddddü|dddddddddü|ddddddddd°2––222þpýîÈddddddddddÈddddddddddÈdddddddddd������w—��%�7��&=#!"&=46;3546'#"&=463!&=#'73546oùùŸý¨þÝÑXñý©�zÑ#ùùñµ�zŸ�æ*æ–ý¨dX–þ˜�zdþMæ*æ–µ�z–�������°L���!2#!#"&546dè);;)ý¬þÐd);;L;)ý¨);þÔ,;)X);����d��L°� ��?��32!546!32!546".5!2>&54=–ÈþÔÑÈþÔ(LfœÀœfL(,
'6B6'°úúúúþpþÔ)IjV\>((>\VjI),ú +'%! !%'*ú���ÿÿ�ÔLÂ��� 'LÆþŸþŸÅ'›ÇaþŸÇ'����îMÜ��� 7 MýÚýÙÆaaýÙ'ÇþŸa����ÿQ�d_è��)��!232"/&6;!%+!!"&5#"&?62”ê–æ*æ–þƒþæ–�×ý–æ*èýÙùù‘¸ùþpÈ&ù�����ž°�0��32!2#!!2+"&=!"&=#"&/#"&468^&€d,!ý‡02*þÔ*É6°¢%þ%+È*2222
- Á*��������°L����!53463!2!!°ûPÈ;),);ýD°ûPèdd);;)Èüà�����ÜL����3463!2!!ÈÈÈ;),*:ô,þÔûP, þpX);;)ÈdýD¼�E��k¯���+32"/&6;#"&?62{æ––æ*æ––æ* ùý§ùùYù����D¯k���&=!/&4?6!546¨ùùý¨ùùX`å)å —— å)å •• �������°°� ���!��.#!"!"3!26=4&53353‘¬$ý`$¬-ü);;)è);;þ«ddd�Ü-(ýd;)d);;)d);Èdddd���ÿœ�d°L��#�1���2"&54%##"+"&'=454>;%".=4>7i**dý]&/T7È£ü"Lü®Rü™ÈþìQú
úþÔú)2(����J��f°�,�5��3232#"./.46;7>7'&6327"&)^Sz?vdjŸO9t\U>/v?zS$24517F8°%Mþ¹)(
- ()GM~ û¾1==���œœ���7'''7'7'7'77 àNê´´êNà-››-àNê´´êNà-››²Nà-››-àNê´´êNà-››-àNê´´����d°°�!�-�=��32!2+"&/#"&54?>335!7532+"&546Š2(<H(<î,úF=-7‘`
1d–dˆÖúþ>2ývdd°Q,–}Q,d-þ¨!2$'�$ÄÆ(dÔÕþ‰dw}á¯þÔþô��������°L� �0�<��32#!+"&/&546;632+"&546!#35'!5Xú,î<(þ¸<(21
`‘7-=|ýédd_ˆd–d22ÂúL!þ¨-d,Qv–,Q(ÆÄ$�'$ddþôdþ‰ÕÔ¯á}w����dO��7�G��%6!2+#!"&5467!>;26&#!*.'&?'32+"&546dkn
T.TlnTjƒþª¦:d%ƒËþ8
- ’VýOddiæp
&yL�Nþ(¢
%
- Hþ YS(22·Säþô���ÿœ�d°O��6�F��#!"&'#"&463!'&6?6*#!32!7%32+"&546Ûn
¬þªƒjUmlT.U
nJ’
- þ%Ý‚&jþªPddOæýó
¢(SN�Ly&
p®·d(þY÷ìäþô����a��L��7�G���2#!"&/&?>454&/!7%.!2#!"&=46Þ�NS(¢
ýó%
- æp
&yÆ22·Sì÷Yþ(–ôþnTjƒþª¦kn
T.TÖËþ8
- ’Vþd%ƒýdd�ÿý�è��-�I��!26=4&#!""&5&/&7>3!2766=467%'^ôþN�Ly&
pæ
¢(ý‰ìS·22(SYLddüæjTnlT.T
nk¦þªÏþV’
- þ8˃%d���šš��%���2".4>%&!"3!7%64âìÖ›[[›ÖìÖ›[[›†þíþí
- š[›ÖìÖ›[[›ÖìÖ›þ9ß
- ‰
- –
- ‰
-
ß
&����šš��%���2".4>
6=!26=4&#!54&âìÖ›[[›ÖìÖ›[[›%þí
- þíš[›ÖìÖ›[[›ÖìÖ›èß
&
ß
- ‰
- –
- ‰
- �����šš��%���2".4>&";;265326âìÖ›[[›ÖìÖ›[[›Kß
&
ß
- ‰
- –
- ‰
- š[›ÖìÖ›[[›ÖìÖ›þ@þíþí
- ����šš��%���2".4>#"#"276&+4&âìÖ›[[›ÖìÖ›[[›—–
- ‰
-
ß
&
ß
- ‰š[›ÖìÖ›[[›ÖìÖ›»
- þíþí
- ����˜˜��–�¦���2".4>%&277>7.'.'"'&65.'6.'&767>'&>7>7&72267.'4>&'?6.'.'>72>äèÕ›\\›ÕèÕ›\\›d+:
- =?1 ""/?9
#hu!$
0E.(,3)(
- *!A7,8
!?*
- ˜\›ÕèÕ›\\›ÕèÕ› '"r"v G
- .&*
- r$> #1
-
%
*
- '"
$g2( %
- �������¯…���67'"/&47&6ô¤Žþý‘ûPM<†;ý¬+oX"O…\eŠè~Y‡+"ý¬n+WeÉ����`°¬���#�'�7�;��!2#!"&=46#3!2#!"&=46!!!2#!"&=46!!dè);;)ü);;ÈÈüè);;)ü);;þôüè);;)ü);;þÔ,¬;)d);;)d);ddÈ;)d);;)d);ddÈ;)d);;)d);dd����d��L°����!2#!"&46!–„ü|;Èþ¢„°**ýDþÔÈôô������d°°���%��32!2!5#!463!54635#!"&=ôÈ);,);þÈþ;),;)Èô;)ü);°;)d;)þpdd�);d);dddýDÈ);;)È�������°°��+�A�W��!2"/&546)2/"/&4?'&6#!"&54676276#!"&?'&4?622,^ÇjÇ^5,^ÇjÇ^þ/jÇ^þÔ^ÇË^þÔ^Çj°^ÇjÇ^,þÔ^ÇjÇ^ý&jÇ^,^ÇÎ^þÔ^Çj�������¨¨���#�;�C�K���2".4>"2>4&$2"&4$2#"'"&546?&542"&4$2"&4ÛòÝŸ__ŸÝòÝ ^^ Æà¿oo¿à¿ooþ-- - L- 73H3)z þ‡- - - - ¨_ŸÝòÝ ^^ ÝòÝŸWo¿à¿oo¿à¿ -!!- -!
- ‘$33$ 1~¤ - - - -�ÿØ�Z¹¼�[��%676&'&#"�3276'.#"&47�7>32#"&'&6767632'."Õ[v_"A0?! þˆ-
Y7J3$$
þ«)G"#A.,=
#(wn‹kV8@Fv"0DÿG([kPHNg8Bþ*Ö[eb›2!þ‰5(7>B3$$'þ®)M"#!7)/c#*xn‰fL@9N¾DÿH7!$†W]µBþ$&����d�X¯D��D��>.54>"".#"2>767>54&‰0{xuX6Cy„¨>>§…xC8Zvxy#!?2-*!')-?"CoA23:+1!
"3)@+)?jµDH-Sv@9y€²UU²€y9@vS-H-&65&&56&oM8J41<*.0(@ )*D*2Om��9ÿòw¾��.���2&/7'/&477"/&4?«»B�B8"._÷þ{Ôi�BBi
- �BBþåBºB�BB7._÷…¾B�B^*k"5._øþ{Ôj�BºBþFi �BºBþåBB�B»B77/_ø…�����È��è°������2#!"&54>!�"264ªšd:;)ý¨);<f>XþÿV==V=°.2üG);;)¹3-ªýD¼ý=V==V�����°°��� "/''!'&462†*$þéÔþÌþèË3Ò,#*¡þæ*#þõþÔÒþÍË4Ô$*����'� à�2�@�K��#.'#5&'.'3'.54>75>4.¼&ER<,Ÿ
3'@"<P7(²›d–W(‹WJ.BN0 2Uh:**& h)1"37àN,?iB$.,þÍ
-<d>‹ªMOW(kVMbO/9X6FpH*Mþ6&+ÐþÊ 4C4%����d�f”�J��2#4.#"3#>36327#".'>7>'#53&'.>761T™^™'<;%T)ñÅ-6"b Œ"S5268 jt&'V7 0$ݦ
- -$aP‹N(?",9J0* d2‚>2
- "“"‘
- 7�Gd/9+DAL!X����ÿÿ—°����32"/&6;3+##"&?62�–æ*æ–Èæ–È–æ*,úú„ùü|„ù���ÿÿè°����%��#5##!32"/&6;3353!57#5!èddd,ý¨–æ*æ–È‘dcÈÈþÔÈÈ,¼ddôü|úú„dÈÈýúd–úd�����ÿÿè°���!�%��32"/&6;33!57#5!#5##!35�–æ*æ–ÈXÈÈþÔÈÈ,ddd,Çd,úú„–úd–údûPddôdÈÈ����ÿÿL°������32"/&6;3##53#5#!35�–æ*æ–ÈXddÈddÈ,Çd,úú„þ�dûPd�dÈÈ�����ÿÿL°������32"/&6;3#5#!35##53�–æ*æ–ȼdÈ,ÇdddÈ,úú„þd�dÈÈû´�d�����ÿÿ°°�������32"/&6;3#53!5!!5!!5!�–æ*æ–ÈôÈÈdþÔ,dþp�dþô,úú„ÈÈþÈþÈþÈ��ÿÿ°°�������32"/&6;3!5!!5!!5!#53�–æ*æ–È þôdþp�dþÔ,dÈÈ,úú„ÈÈþÈþÈþÈ�����LL����!2#!"&546!"3!2654&^�¢¼»£þp¥¹¹gþ);;)ô);;L»£þp¥¹¹¥�¥¹È;)þ);;)ô);��������LL���+��!2#!"&546!"3!2654&&546^�¥¹¹¥þp£»¼dþ);;)ô);;þoýýL¹¥þp¥¹¹¥�£»È;)þ);;)ô);‚¾$¾���������LL���+��!2#!"&546!"3!2654&!2"/&6^�£»¹¥þp¥¹¹gþ);;)ô);;þ�¾$¾L¼¢þp¥¹¹¥�£»È;)þ);;)ô);Èýý�������LL���+��!2#!"&546!"3!2654&#!"&?62^�¥¹¹¥þp£»¹gþ);;)ô);;þû¾þp¾$L¹¥þp£»¼¢�¥¹È;)þ);;)ô);Ïýý��������L��5��!2#!"&=463!2654&#!"&=46&=#"&=46;546&�¥¹¹¥þpÂ);;)þ>¿Dþ¼úúL¹¥þp¥¹d;)ô);déþä&þä
- –È–
- ���Ù�מ�#��%2"+'&7>?!"'&76�6763 ˜,þ÷þó P''þÒ
- K
» ž
- þS#þÊþÅ ånnV/Ó�������þL��5��!2#!"3!2#!"&546&=#"&=46;546^�þ>);;)Âþp¥¹¹ñDþ¼úúLd;)þ);d¹¥�¥¹éþä&þä
- –È–
- �����°°��1��!2/"/&47'&6#"3!26=7#!"&5463!î�mþÈ)�8mþïœ);;)ô);È»£þp¥¹¹¥,°þpmþÈ�)8mþÔ;)þ);;)”ÈþÖ¥¹¹¥�¥¹����¢¢���#���2".4>"2>4&2"&4áîÙ�]]�ÙîÙ�]]�ÃæÂqqÂæÂqqþ{ rr r¢]�ÙîÙ�]]�ÙîÙ�GqÂæÂqqÂæÂsr rr ������L°���#��3232"'&6;46!2!54635ÂÈõ
- þ�'
þ…
úþ…èû´gd°þ¢þVª^ü|úúd22�������L¬���#�� ++"&=#"&7>!2!54635Gz
- ô"Èú'ýùèû´gdžþM úú!¯üúúd22�����LK���"�� 62"'&4?62!2!54635Œq‹ýóþÜ‹Ôèû´gdÓq‹ýó#‹ýÒúúd22�����L›� ��#�'��762'&476#"&?'7!2!54635‡Ž*MÔMÒý«ÐšÔþ=èû´gdÿŽMÔL*šÒý©Ð›Ôý:úúd22�������L°���#�'��/'7'&6"/&4?!2!54635^WЛԛÒÃL*ŽMþúèû´gd°ý«ÐšÔšÒýPMŽ*MþXúúd22��ÿì°¯����% ! °þþÆþq¬ý3«gþq§üùæ¹�������dL°����+!#"&546;!3#53L–ýD–úôdÈddèü®�þpèþÔ,ÈÈ�����EÝ°���/��'&"!#"&546;!3#53"/&4?6262LþÕ_ •þÈ–úôdÈdd°jþ\ÊjO)è•þÕ_ “þpèþÔ,ÈÈýÎjþ[ËjO)����
°���>��'.!#"&546;!3#53"/"/&4?'&4?62762Lg†%þöþ·–úôdÈddöFƒƒF)ƒƒ)FƒƒF)ƒƒ)èþóg†þöþpèþÔ,ÈÈýŒF)ƒƒ)FƒƒF)ƒƒ)Fƒƒ�����—°���/��!"!#"&546;!3#533232"/&6;546Lþ¢þ–úôdÈdd–d–æ*æ–èþÔ–þpèþÔ,ÈÈý¨úææú��������—°���/��'&"!#"&546;!3#53++"&=#"&?62L¥*þùþn–úôdÈddëæ–d–æ*èþp¥þ÷þpèþÔ,ÈÈý…åúúå����È°L� ����!2!546#!"&5!52LûP“û´d�L––þÔýÚ&þÔÈÈ����}—����-�1�;��&=!5!546#"&=46;#5376!!/&4#5;2+§øøþp�ý/22Èddþ‚÷�þp÷�ddd33�æ*æ–È–þ…dÈÈýËæ–È–æ*yÈd�����d��°°��Q��%6+"&5.546%2+"&5.54>323<>3234>^%È"%þá
- È"
-
d d 1tû®�5gD‘
þ>?1)þA¿..@Â
þ¢^
þ¢^
��d��°L�3��"!5265!3!52>54&/5!"!4°"2þpKþKþp"2�KôKL8
- üˆ88
%Šþv%
88
- x88
%þvŠ%
8�������LL��� �$�(�4��!2#5'!7!!2#!"&546!55%!5#!!'!73£wiþÙÈþpdwþ%,);;)þÔ);;),¼þp�ü,¼þ‰dþ‰d�Èiè–bbÈdÈ;)þ);;)ô);dÈÈþ÷…£…ÆÈÈføddÈ���ŸŸ�&��767>".'.7¢.‹wfü�w3À£
.1LOefx;JwF2ï¢Â1vŽüevˆ/¢ 5Cc;J™|sU@�������°L�#�A���2/.=& &=>2#!"&=46754>ü¸¦ud?, Ê�þÂ�Ê
1;ftÊpR&mû´m&L!(("
- È""’’""È
'$+ þä
- 2þÑ2ÔÔ2/2
!������°°�
��'��!'3353353!2+!7#"&46!2!546LÈý¨ÈÈÈÈÈÈü®¼‰üJ‰³LûP¼ÈÈôÈÈÈÈüà*dd*þÔ22����d��°L� ����#"!4&#"!4&!46;2¼d);,;gd);,;ýþÔ;)d);L;)üè);þÔ;)ýD¼);üà�);;)����ÿœ��°L����%�)��!2#!"&546!#3!535#!#33ȼ|°°|ýD|°°„þÈÈþÔÈÈ,�dÈÈddL°|þ|°°|ô|°ÈýD¼ÈdþÔdd,dþÔdôdþÔ,���ÿœ��°L����%�)��!2#!"&546!#5##3353#33ȼ|°°|ýD|°°„þdddddd�dÈÈddL°|þ|°°|ô|°ÈýD¼ý¨ÈÈôÈÈdþÔdôdþÔ,�ÿœ��°L����#��!2#!"&546!#3!!#3!!ȼ|°°|ýD|°°„þÈÈþÔ,�ÈÈþÔ,L°|þ|°°|ô|°ÈýD¼ÈþÔdôdþÔdô���ÿœ��°L������!2#!"&546!-
ȼ|°°|ýD|°°„þþÔ,�þÔL°|þ|°°|ô|°ÈýD¼þ––––,���ÿœ��°L���� �)��!2#!"&546!!!#";32654&#ȼ|°°|ýD|°°„dýD¼d‚&96)‚þ‚)69&L°|þ|°°|ô|°ÈýD¼ý¨ôdVAAT,þÔTAAV���ÿœ��°L����%�)��!2#!"&546!#3!535#!##53#53ȼ|°°|ýD|°°„þÈÈþÔÈÈ,�ddÈÈddL°|þ|°°|ô|°ÈýD¼ÈdþÔdd,þ�dþd�ÿœ��°L�����#�'��!2#!"&546!3!3##5335#53ȼ|°°|ýD|°°„ýDÈþÔdXddÈý¨d,ddL°|þ|°°|ô|°ÈýD¼Èþpôþ�dÈÈÈþÔd�ÿœ��°L����"�&��!2#!"&546!#575#5!##53#53ȼ|°°|ýD|°°„þÇdÇÈ,�ddÈÇddL°|þ|°°|ô|°ÈýD¼þpÈ2È–dþ�dþd���� � §§���%���2".4>"2>4&!!!'57!àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqqlþÔ,þÔdd,§^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐÈddÈd����� � §§���'�+���2".4>"2>4&#'##!35àðÛž^^žÛðÛž^^žÅäÂqqÂäÂqql2ddd–d,Èȧ^žÛðÛž^^žÛðÛžLqÂäÂqqÂäÂÐd2d2dd�ddd��ÿòÿ�ÂA� �6��2632+54&#!"#"&5467&54>3232"/&6;46÷nµ,,.xªªx€þÔÞPpVAbªz–
- ‰
-
ß
&
ß
- ‰AwañúúsOEkdªbý³
- þíôô
- ����ÿòÿœÃA��3��2632&"#"&5467&54>++"&5#"&76762ön¶,+.yªxZþ†
%
þƒ OqVAb©æß
- ‰
- –
- ‰
-
ÇAwaxc¤hþ“sOEkd©cý’äþí
- Ì����d��Lm���%5!33 33!#"!54&#¼�þòªþòªþÔþÔªþòªþò�2�dd,,Mþ³þÔþÔd22�����y��7›�/��2#"'2!54635#"&547.546324&546X^“Y{;2 iJ7-þÔ-7Ji/9iJ£›qYƒZ=gJiû22ûiJX5Jit£����'�‰œ��*�B�J�b�{��"&'&7>2"3276767>/&'&"327>7>/&'&&"267"327>76&/&"327>76&/&òoOOoSÙÜÙSoOOoSÙÜÙþ=y±"
$GF`
Pu
"Q9 ùcŒccŒcVQ: Pu
"�GF`
y±"
$òoþÕþÕoSWWSo++oSWW"±y `FG#
‘uP
:Q#úccŒcc:Q#uP
$`FG#
"±y ����d��è°�����"��!#5!!463!#53'353!"&5+¼,´þ¬þ„
- ?,Èd¢ÔÔ¢d´þu
- „
- Ã þ„ÈÈó
- þÔÈüàÔÔÈþ
- ‹ÈÃ
- �����d��è°� ����!��! 463!#5##5#7!"&=)+5¼,þ¢ýÚ
- ?,È>¢d¢Ôªþ�
- |
- › ýø^ýÚG
- þÔÈü|ÈÈÔþd
- 77
- P��������°ô�����#3!#732!!34>3!!Š¢ddþÔ¢ÔýÈ!,ý¨Èd!sððüà,ô Èd,ÔÔ+$dþ¢Â$+þpþpô�������LL��2�9��3232#!"&=46;54652#!"'74633!265#535Šd2þÔ2s);;)ý¨öþº;)X>,>Xý´ÔÈÈL2dd2ú–;)üà);öFD);–>XXýæÔ¢d¢��d��¼L��6�=��3232#!"&=46;54652#3#!"&54633!265#535Âd2þÔ2s);ÈÈ!ý¨);;)X>,>XœÔÈÈL2dd2ú–;)þþÔ$+;) );–>XXýæÔ¢d¢���ÿ¢��Ô����� #!"&762#";2676&35’} ,û, }@DÐ:#6#:àÈû°&77&P'þLþÒ.þdd���� ����LL���/�?�O�_�o�����32+"&=4632+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=46©ú
- ú
- ú
- ú
- šú
- ú
- üêú
- ú
- šú
- ú
- šú
- ú
- üêú
- ú
- šú
- ú
- šú
- ú
- L
- –
- –
- þÔ
- –
- –
- –
- –
- þÔ
- –
- –
- –
- –
- –
- –
- þÔ
- –
- –
- –
- –
- –
- –
- �������°��)�3��3#!2!&/&63!5#5353!2+!7#"&46!2!546¼dd^>1B)(üü()B1>^ddÈþ>¼‰üJŠ
³LûP°ÈdO7„S33S„7OdÈdü|*dd*þÔ22������°���+�5���2#4!!2!'&63!&54!2+!%5#"&46!2!5460P9Â<:H)"¯ýZ²"
- )H¯¼–üJ–³LûP;))�%&!‘‘!&þ•*ÈÈÈÈ*ý¨22�����°����$�.���2"&432!65463!2+!7#"&46!2!546
–jj–j·."+'þ¼'+#þͼ
ŠüJ‰³LûP�j–jj–þë9:LkkL:9þr*dd*þÔ22�����°���,�6��2"&5477'632!65463!2+!7#"&46!2!546X/[3oœo"�o£"."+'þ¼'+#þͼ
ŠüJ‰³LûPk‹6NooN>Q�o£þ
- 9:LkkL:9þr*dd*þÔ22�������°��"�,��!!.54>7!2+!7#"&46!2!546X,þÔ%??Mýî<=Bm�Jþ¢¼
ŠüJ‰³LûP°¡‹9fQ?HS½TT¡vKü~*dd*þÔ22��È��è��)���2!546754!2#3#3#3#!"&546/R;.6þp6.d�6\¬ÈÈÈÈÈuSþpSuu;)N\6226\N)þG6.dddddSuuS�Su���dÿÿLL��/�3��!2#!"&546!2#!"/!"&4?!"&=46!'–„ü|¶
- þåà
%
XýôW
&
àþß
- ªdDdLþôýD
- 2
- à
%
XX
%
à
- 2
- ddd��������°L��#�-�7��!2#4&+"#4&+"#546!2!46+"&=!+"&=È Sud;)ú);d;)ú);duè);ûP;ñdèdLuSÈ);;));;)ÈSuþ;)þÔ,);þ2222����©¬�
���� !&4762 !2!546ઃþýû 'Yþ¬V/þ«¢ ü|�ýUYƒY(þnþª0Uü22��������!°��/��.#!"3!26=326!546;546;33232!½'þp'½q*}¨ý20È/2‡úþ––ýŒ22,þÔ2������°°�
���"��!#!5463!#5!#!"&5463!#5„,
- þ‰þÔ
- w,Èý¨,
- ýv
- w,È ýÁ
- O,T
- þÔÈþýÁ
- ¶
- þÔÈ�ÿœ�dG�F�V��32676'&7>++"&?+"'+"&?&/.=46;67'&6;6#";26=4&äÃKŽjIC
- )V=>8'"d1*Ã)"dT,Ÿ|-oËtEú
- ú
- GAkŠI
- ! "%,=?W7|&êF@�Je5&2WO_e_
- 2
- 2
- �ÿœÿæ~� �$�4�<�R�b��%6%32!2&'&#!"&=46#";2654&'&"2647>?&/&6%?6'.'.�§. ‹ü+jCHf7ý" *:þÔ>XX¹P*† €@--@-þ˜ -?0
!3P/|)‚( )f!%
=„÷&*
xÈ"6Ô2&„CX>È>X¬83DÉ-@--@þÛ‚
- # ³=I+E( /—/}X&+ 5!H �����d��9°�Q�`�o��322#+"&=#+"&=#"&=46;#"&=46;546;23546!2>574.#!2>574.#q–
- Oh ..40:*"6-@#
- –
- d
- –
- ¯
- KK
- ¯
- –
- d×))þùk))°
- m!mJ.M-(2N-;]<*K
- KK
- K
- –
- X
- –
- K
- KK
- þÔÈ
- "þpÈ
- "����°®��)�,��!2#!"&'.546"!7.#ÔVz$�RýÄR‚(z Œ}VG+œ0œ )IU!�îzVþ`3·BBWwvXZÅ3 Vz™&--%óó,(1#þÂ��È��„����32#!"&546+"&=Û–g¬T)þ>)T¬H6–6¬gþ)TT)ôg¬üá66á���È��„����33#!"&546+"&=Û`³–T)þ>)T¬H6–6–³þB)TT)ôg¬üá66á��������� %'5754&>?' %5%ý‚þ†Nd––d/“‚\þ¢þ¢^^ÿþåª<à–Ç”•È–ú
- (Aýb¦¦“¥¥���dô° �����2"&4$2"&4$2"&4¼|XX|Xè|XX|Xè|XX|X X|XX|XX|XX|XX|XX|�������¼L������2"&42"&42"&4è|XX|XX|XX|XX|XX|XLX|XX|þÈX|XX|þÈX|XX|����d�dLL���/��!2#!"&=46!2#!"&=46!2#!"&=46}¶
- üJ
- ¶
- üJ
- ¶
- üJ
- L
- –
- –
- þp
- –
- –
- þp
- –
- –
- �������°°���/�3��!2#!"&546!"3!2654&!2#!"&546!5^ô¢¼»£þ¥¹¹Ëý¨);;)X);;ý±ôþG�°»£þ¥¹¹¥ô¥¹È;)ý¨);;)X);dþÔ,dÈÈ�����d�d°L�;��!2+32+32+32#!"&46;5#"&46;5#"&46;5#"&46–è222222ü222222L*È*È*È**È*È*È*���,�è£��
����*��.62"&%#462"&%#46"&=32ŠW??WW??þù|°|°¼°|°ýÀ|°|°¼°|°°*(£C²²BB²²þÀ°|°||°|°þÔ°|°||°|°þÓ�Ž��ÿµ�È”��B��76+2+"47&"+".543#"&'&676/!'.6éE*
'?)’¸
- T¸Ž0I'*L
- #3¶{¶,#
- nþÙ
6F82 þà*<SC#
- (#(ÁÁ(#��������°°�%�C��#4.+!52>5#"#!#4.+3#525#"#5!°2&È2þp"È&2èýD
- d
È2d
- ô„ ü®dd R ,ý
- þW
22©
- –��������L®�� �0��5"'./#!5"&?!##!"&=463!2èþßEþÔ 1;E%=
!'þì†y±üè,2 "
- ëý# 22+.°¦"A2‡Vþªýãdd�����°°��G�J��!2#!"&546#"3!26=4&#"'&?!#"3!26=4&'"'&'#Lû´FF
þÕ& 7
- ?
- 99þàÅg°û´LRý
22£™22$ìþ������°°���#�'��!5!!2#!"&546)2#!"&546!°ûP°û‚�þpm�þpG,LdÈü|„þp�dþÔ,�����°°���#�'��!2#!"&546!2#!"&546!!5!2�þpm�þpG,ÈûP°°ü|„þþp�dþÔ,ý¨d�������d°è�'�+��!235463!23##!"&=##!"&546!2�d�ddþpdþpŸ,èþ¢––d––þ¢ þÔþÔ,������°°����'��3#3!2#!"&546!!2#!"&546ddd–�þpG,þ¢„ü|°dþp�dþÔ,þþp������d��L°�'�+��32+!2#!"&5463!5#"&546;53!X––Âü|^––dÈ,Lþpdþp�d�dÈþÔ,�������°°����'��!#3!2#!"&546!!2#!"&546°ddýv�þpG,ü®„ü|°dþp�dþÔ,þþp���,�0o€��� #"&54632aþî5þèþ*����A�2„~��� 6'&4Oî**þ{î)ü)î*�����2A~„���!2"'&6dè)þ*þ„*þî*�����2,~o��� #!"&762{î)ü)î*aþ**î�������°(��
- ��5-5!5!¼ýL�þc¨üà å¶þ½ÝÁÁÝûØÈ�������d°°��1��#3!35#5!34>;!5".5323!°ÈÈþÔÈÈ,ûP2&d2�"d&2üà„dd,ddþ ýÚdd & ,������Lè�%�1��#4.+!52>5#"#!#3!35#5! 2&d2þp"d&2 ,ÈÈþÔÈÈ,¼ ýÚdd & ,üàdd,dd���È�frJ���32 +"'&476½
- þ0Ð
-
- þ)×
- Jþ0þ0 ×× ��>�fèJ���32+"&7 &6S
- ×þ)
-
- Ðþ0
- J þ)þ) ÐÐ���f�ÈJr����"'&=46 4 þ)þ) ÐÐw
-
- þ)×
-
- þ0Ð����f>Jè��� ' &=4762j× þ0þ0 ×áþ)
-
- Ðþ0
-
- ×����Ùÿù=°��:��#463267>"&#""'./.>'&6è°|°þVd&O"(P3G*+*3M,
:IG79_7&%*>7F1“
°|°|°ÈÂ5KmCKG\JBktl$#?hI7 À�����È�„°����!2+&5#"&546!5úX–ÿ–«,°þpþ² Š�ddd����È�L°����!2%!#4675úî'=ýDXýDd
d°Q,ü[u¶}ü4ý]dd����MoÃ__<õ�°����Ðvs—����Ðvs—ÿQÿœÜ�������������ÿ…��ÿQþÔÜ����������������£¸�(�������°��°�d°��°��°�pŠ����Š����±��E���Ø���Ø���¢�����H����E��°�d°�{°�È°�Èô��°ÿò°��°��°ÿð°��°�°� °�d°ÿÓ°ÿÓ°��°��°��°��°��°�&°�n°�°�°�°�d°�°�d°�°�d°�°ÿœ°�d°�°�°��°�°�°�°�d°��°�d°��°��°��°��°��°��°��°��°�d°�È°��°��°�5°�d°�È°ÿµ°�!°��°��°��°��°��°ÿœ°��°��°��°�Û°�°�u°��°��°��°�
- °�È°��°��°�È°�È°�È°��°ÿþ°,°�d°�ˆ°;°�°�°�°�°�°�°��°�°�°�°�°��°�·°�·°��°��°�I°�°��°��°�]°ÿÜ°ÿÜ°ÿŸ°�d°��°��°��°�d°ÿÿ°��°ÿQ°�°��°��°E°�°��°ÿœ°�J°�°��°��°��°ÿœ°�a°ÿý°�°�°�°�°�°��Ä��°�d������ÿØ�d�9�È��'�d������������������Ù������������������������������d�d��������dÿœÿœÿœÿœÿœÿœÿœÿœ� � ÿòÿò�d�y�'�d�d�����dÿ¢�������������È�d�������ÿœÿœ�d��È�È���d��d���d,ÿµ���������������d��,A�2�2������È>�f�f�Ù�È�È���*�*�*�*�²�è�èNNNNNNNNNNNNNN¤"~†¬äFnŒÄ2b¢Ü\ºrô bÊb¾ 6 „ ¶ Þ
- (
- L
- ”
- â0ŠÊX
*
^
°h´(¦æT�ª*v¶
- 8|ÀtÐ*Ô<¨Ì6`°þR¦.j–°àþ(h”ÄÚî6h¸ö^´2”âDl”¼æ.vÀbÒ F ¾!2!v!¸"@"–"¸##"#8#z#Â#à$$0$^$–$â%4%`%¼&&~&æ'P'¼'ø(4(p(¬) )Ì*&*J*„+
- +z,,h,º,ì--ˆ-ô.(.f.¢.Ø//F/~/²/ø0>0„0Ò11`1®1è2$2^2š2Þ3"3>3h3¶44`4¨4Ò5,5ž5è6>6|6Ü77N7’7Ô88B8†8È9
- 9J9ˆ9Ì::l:š:Þ; ;Ü<<P<¢<ø=2=ì>:>Œ>Ô?(?n?ª?ú@H@€@ÆAA~BB¨BîCCBCvC CÊDD`D®DöEZE¶FFtF´FöG6GvG¶GöHH2HNHjH†HÌII8I^I„IªJJ.JR����§�������������@�.��������Æ����������� ���j��� ��(�|�� ���¤�� ��L�²�� ��8�þ�� ��x6�� ��6®�� ��ä�� � �ú�� ��$�� ��$4�� ��$X�� �È�|�� �É�0’�� Ù�Âwww.glyphicons.com�C�o�p�y�r�i�g�h�t� �©� �2�0�1�4� �b�y� �J�a�n� �K�o�v�a�r�i�k�.� �A�l�l� �r�i�g�h�t�s� �r�e�s�e�r�v�e�d�.�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s�R�e�g�u�l�a�r�1�.�0�0�9�;�U�K�W�N�;�G�L�Y�P�H�I�C�O�N�S�H�a�l�f�l�i�n�g�s�-�R�e�g�u�l�a�r�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s� �R�e�g�u�l�a�r�V�e�r�s�i�o�n� �1�.�0�0�9�;�P�S� �0�0�1�.�0�0�9�;�h�o�t�c�o�n�v� �1�.�0�.�7�0�;�m�a�k�e�o�t�f�.�l�i�b�2�.�5�.�5�8�3�2�9�G�L�Y�P�H�I�C�O�N�S�H�a�l�f�l�i�n�g�s�-�R�e�g�u�l�a�r�J�a�n� �K�o�v�a�r�i�k�J�a�n� �K�o�v�a�r�i�k�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�w�w�w�.�g�l�y�p�h�i�c�o�n�s�.�c�o�m�W�e�b�f�o�n�t� �1�.�0�W�e�d� �O�c�t� �2�9� �0�6�:�3�6�:�0�7� �2�0�1�4�F�o�n�t� �S�q�u�i�r�r�e�l���������ÿµ�2������������������������
��–
-
�ï !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ�
-
glyph1glyph2uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni20BDuni231Buni25FCuni2601uni26FAuni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200uniE201uniE202uniE203uniE204uniE205uniE206uniE209uniE210uniE211uniE212uniE213uniE214uniE215uniE216uniE218uniE219uniE221uniE223uniE224uniE225uniE226uniE227uniE230uniE231uniE232uniE233uniE234uniE235uniE236uniE237uniE238uniE239uniE240uniE241uniE242uniE243uniE244uniE245uniE246uniE247uniE248uniE249uniE250uniE251uniE252uniE253uniE254uniE255uniE256uniE257uniE258uniE259uniE260uniF8FFu1F511u1F6AA����TPÃ��wOF2�����Fl�����±\��F �M��������������������?FFTM `�Œr
- ‚©$�åe6$†t„0� ‡"•Q?webfeŒ5ì˜�€ó@ Â?þ¾
- Úöˆ ¬töÿŸ” †ŒÁ“ÇØÜ,3+2q
ËF®YOì&>±é±bÒm¤5�ZŽæH$±ªYŠœ½{ìH jd†Õ‰ü²%÷¹Ù§y"§÷ö×+�@¹Œ]½«eŸû{úÒûv� Nc‹)»nù“É?~?è�¤hò�ÿž_ç&iÆÊÈÑ�Á¤‹?º>üå^K ûv´-cÛ�1íô€‰2K áy·õ,'nä«à�(ð3EwiàB‚ &©ÿéÎT´lhØ0MÒØÚÒ†dåYØrñﲬ³ntiÞ]Ýyur•´¼®û™îVXsj¡¢žågMnªÓ™H�W•©ÃÔ r2ô>iT`V7¸ÍR(±¨ÉÏàÿ+ o6ó'cÅÈB°�æë4ç·Öι݇ƒ‹ã¿š®T ]a[Qd<3wq8,Ž…îrTI¡8áŽ0>E¸?ù*E¨ç—¦•#Ïú7'�ìÝý†S ocûÊ·í_‹7&#*Ñ+)½³ Ð+4a°A6¶cŒçy±Ù£†f(bFéæäÿé´$;{ YAÃ1vP-tGøÿŒáÀ±Í"û°•ÛCÂf- W‚÷®šÔ™ÎuKÖ°Kã#íä¬Ö*K†<Ûü (ÑßëÔ÷×ÿZþ`Ù«åµ[—%êYTŠ¬{%¯ÉŠ$ˆ s{oïíœòˆƒÕ»ïvt"pàœ4`Èêß©ŠÏ¤}o`ã³Ýú'neÜ>
- äG5s�zó_Nó
- ’PKÓ¦vmUÞɾ{z½ÜòîóÿŸøøŒ‡"3`l
’–W#Ô�½^@+�,c¹Éko©�AOpnuµ§Ôzó–zJ)õÜÎ¥÷˜Û1Ç}ááÿO=Þ¶€x¾RÆÄ`ÁJ‰`§qƒ¥‚Us/¿+økÒvÇ1xlÝßçjl–Elì\nDŒÈÃƶ¯V†±æÿÐjg›{Zdå‰z7�5ÿß!xmÂ5oÂ[½¿uïû&·¯1Ú‚HBkAâìqrêÎR�Ä
£·°�(\ghôÈ7‰ìÒŠy�=†HµZóUPhéÐ$8RgÓÄ€zÂgÍÉN:‹à�1u¬$Ü…¯¤¡ž>Rý]åú—¦¬"Ÿôf7¼—õK¯^'˜ªë½3“+E/¼Ä^‰YU5]¨NB.ÞÊ‹¥Ò8ßÅ+ÎÍ�8�ù,|‰{M|ŒAŠåua|Ðaˆ’ìŽÕÞË…Õ�%�
- lKG¢Pí,NuæÜÔkþcï8mX@ÚÓdÿ̘?ñüÚó¢çYÓ&Ïþ{êö”ø³ÇÏ?ÛPÜ(®GŠ]¶¿ÏÆä¯äOä�ä·ä×ä—är-¹’\LFÉ9—,&§“yä8r¬û´û3÷ÜŸ¸?p¿ï>ê~Ûýºûsèäÿ‹žÐ¢ÓDǤzó1ú¡?\U5q=ÙtÑzÔ’†&Z�nj¢%émM´"}¼‰ÖtkÞDºwh¢-=ÿm¢½Bíéõ76ñô®ƒ&:Ò»Éqt"Ö1:“¬ëЕ¬©u;ô"K_¡/JdÖc0–l²õ0²Å'^B¶ù8VC¶Õzg°²½¬[ ;Êúdì
- ÙYÖbȃu‡¼©u;œ@ž*}y‰|.©¬'C>\g=ò9àVëÅ�¯·[o†|gð õ^�ž¶>Šüd¼
- 9ÏÇûäîØÅø”
- *E|A¥�ã*M[ã[*mOÜßQéz?PénÝ?R)Y�ÁoT&[ÏU*‹•5ÀSÙMBþì¡¥ð[³
- „ßoYDhÕ{ìÑ,}1<f�&6h¤†'��Ê¥U#V¨Þ¼¡¥EûD"TÁ¥Þ©Ð¢AD9ƒÿeB¹:©Ä%OœÁ ÒÐñ‚‡ØFuŠn 7?%RG4"„¸f©gÇÁFêº� a=‚‘-³ÕQ—á½y+B½,ÄøÐ2ÃËÖ…5¢•‡ð™„Œxn¡Îªf*!¡³æëlâ|GXQø ÞƒUp”ä
- ÅEu Â@ž�¦å-ð€Do.6YZö‚-&a>f?›�«“N�Nœ¢ ]ÔO/^;\ÚÂJÊ
ÏBÇEsJrª� ÄšõÆ'ò…g/ããÑB%Ÿ¡o Cõêºn•7‹Ü:|õyƒKt²&÷$§Øs¯|¹õwPˆùÄ\i]¾$Z@+Ͷ¶Õ€90x]»r¸%¾ÈÕ+öRU¬Em‡+Ü°ª£;w u¬À9/I¼Ô7È7Õ¦¹Qþlu\¦yÐW‹N)ë8‰Ü°vYî*u´m”¡±¿éâ©âºm( fÊE½òÿG8²¢j#I¬½RŽÌùz#q¸ß·ß „)Y ×$‹áЛ†c_%¿m-{!0-`;áå…¬ñhyVõäÁ]Hv! Ïta½\KïÅ¥[Ì1{"çj 6@ì–3T0%¥¿éΘ"ÇÔ™ÆZI†Gä›S“÷�‚.³ÄΣp�ÆÓ¬SÆ1eéûÙ“ÄØ›�ùYÁÿv»8d±\±B¡l¡SûþR)ÒÓ†çù¯–®€{IŠÓ†ôÒ%�”¯>û0ÐŽÚ¦³\ð'”cg½2%4 QŽD¡
- 0Í’3B²"ÉMŽÕŽ&€ÛŠhIÇÂÚ§ÒRg·ME¤¡©¡¶š
I½Î(©ÞÕ5U–D]}ò™bí8$—‡ì8¨>óáX ²h•"lµÎ€âj�.%ˆÛ€HHÇ-Iš¦Ý¸#1’C4õÞYÞ7„íî®íYÝ–¡Vo>PÊ]¡6¿·˜ö™O4ÿ7f
½~�AJdYFÕ€Ê.–ÞoõÃþy) Æ8lƶ22ŽeŠœ¦Ò1H¡[t‰°@!È…2\€@¸5ÄÙ“Ê%Z×îüÛkÞ’aõ�®Ü@ú.`n¨3ÊOFŒ¢R(󅥶÷ÿ½ZkLkF íHWjY
I¤ê5×ç*ñ6ÚÎeµSbk.¤¼5F,ì.•N0ßÔ™’¹€|”†V¦€||~Nô‡( 4·�ìÚ],ìJp|~ùxeÓÉA¨Ô¡¯5ˆˆ/»Ú»S¤ýäô”Ðvò×Üy?›ù²'_v|rê„ËXÜøîHéQÊ°µÄ“B@=ÝX¬ßú¬B9Ë4³˜«ÃT©ØB‰B©c Á«H‘P£Î+‚ò‰�_““ÕYHÙ#¬$ªËÊ` ìFø£ñB;ãµÂ+Û”…BPR°4̼ t:tõ"ZEºJ^!XÂÇ“à¬q4_dTW(5äÜ€§åÿä¸ÚI±”UŇÒAÍzþ@U6ÿn.WGXýÀÁèHìRKÀÛ&'swM±jŠÊŽ˜‹±<Ÿ”±˜3¦)€–�`#F@F Ô¢àþØv�oÍb$xï+²à¼uû&´}‰|ÊX&[Ùª�8F‹-¹E&/>Š/ÑGÅ.aêz^ŠÞ/ƒÔþ})œ²’ó'“x©‘$O=<ÇÂz™¤oä§áA9MØ�&ò~î¡™¹3rµ3gŸœ¦'¿8Ò£\°-¶MDzÈè˜økºÍ5†ù±´A
- ÝÂýªG9©ä|1-Ø! Ç87û[œô¤,mRîu|¦57®
- =Xþ‘¤,˜aJ§Ù›¸^t´N›4ÓØ\fЄ]AzH^7·ªF•èþ•™„&k"LU>}ì>çrBåX(Û‚ªë‚Tš%¿«Jª¿„dhKÄ”ó¶P“²KÁTFaA‡3HH†C[r;a›À¶d·™‡•54È̉—lL„kjG{¡ì8Ÿh~ä�
fR@Ðìü9wàB¨¤àÐ0ëzSõô°âÿ'— a7‚@Ý@N›±ŠÝƹl‘bj3hNî²Xö‹F/Éíe¢s£Ù'úŠDsQ«ñ<þk^Óíò×¼²ýˆZASO¨idºSJãxN4D½³ÀKÓ!´¹Ôù !Ù«v‰¬hA`ÛE–·X�•�¼Ê-
¢P
íÄ:Ÿ‚ÛѤCê:ÂÂWÍzS½sÄdO:¶_¿«ÔË`Š:tÁaηБ¥†²Íسú¢�®
¼IYð4Ç# �ø*ÒÍ+<êq�n°oÔ�¸u
- UÌcww�óx$dµ³ðÆ¿�}Ï�ûÖÁ94Ìýšíü9p¬*T:ú%GQæ…^aŸ‹‡äÝË'¨çeƒôbö¨Šl-ÕÜ*XÝLç%*ź¸.…ÚŠÈ\Š@pR$Tå*KÖͽ¸hp‡ÀˆÈèÁ‚ßã¦múÁ‘â-/“oSÚ3ŽßÂE�àÏÎto¸ž}çжV‡oõeJ`<™$öÙtíؽßü ª]g*ßZ›„µ6q°Àùl’ø~÷E¯«
- †Sú¸/Š’ùi£ÄTÆtÍk‚Ç®à²WÝþÜ=?j¹�G¢ÒÌÔUUAJÆõý›`†ÒbÔË‘—ƒGˆõQÍAÏ«©�ñÖÎÆÚìcƒûê½WËï©èWSmÝÀg³ºÚFËñª‘&©^õúؘԡˆ6;C1:=ÛˆP‰äºÕ`ÊÚœ�VVÿ“ÔE�Æ5"´hO«Xà~«ÞØN3_5Ó�]ºz-þä’CWÓÝtÔ¥�‚Óˆ´ÐËeÜ]°\¶”©¿V¯–‹ÿcÔ#m[ÆkuÞ—_ʱ"©Éös�H³ô<}xï±…m0båxHÓqb‘a3tfçMTÛÑÏ*]I»
- Þ}×(ú¾œ,M”„�–=Š Ý@ŒJAÛÆÐd‰� ¬Ë?§6PV±ö[
dVãvôæ4jžÒß›‘lH\â÷ÔŒÅè{˜ØòMôå½È˜\º��åYþÜ�€�`9MÃ`Db‡<Á;a#zò†‘<Šx"ó,¨d‚gCi¿`‘c’›:ÁÈâI´â>jw·Ì}JÈÉz§�^:V.ý:×þÚ‹{¿Í¼(ȲB÷æËɦ’ÉóxŽ<Db#"S£¡{ô’PùHu½N�/ë{r6;wU¶æÐòsÖPО“<¤çXÀàYâsÔÄ÷ÞMxu°‡\šb�‘Ús¸$Ž˜xŽÊ(¢‰/^|^*0j~mà¬;#·%J„ÞM4�Çp˜QM׬ð::b\C2gf°°]½zÒP8T™ Uª“QbÖètºƒC½TŸ>
- p 8+6g_2–lΡ6§Hò ÚÎ�džH�:÷
d›<æCÍé6³¯Ø¤ê/«¿6ãE:ÂK‹”"Ë`kJ©<›ÏÆ¢ä=ùvž7„¥âN5·µ`°ò›¶Jt‹Ù\j¹6Í…%Ëž7ô*¥'¥•U•Ù4±:âX+
ä\b�ü’E
- äìôÞaf®ŠxŒ“}Á‰1+p™‹B¥Ë0î6òâ”åýž3rõA$Nš~¶ô#³dª}ÇפŸP7h÷H7b£FªžÂ§…‚¬8ð
³P>øBtGNÐŽ¢ðmä‚xô@�j …‘¸|{Às9à»=þwRÙ/«oDJs5z>“;Š'xÝñEÐq^ré^=G?½…9Aê¡æ–ÇAä_—£íK%µDÉ®:uikjkîIeÉ潬GúÕ�#*¡†)µjm‘á|½t£¹}`Jæ©Z؈éÖ÷H=4î�{gß�¢¾)¡qXˆMA,šHøŒ7û1‰ëV"¥Ùo,çY#hýü÷ݨSò_ê;‹Ía_Ô—Z^cn4¢� ‚H¸E«®?‰«°}Ñ
- È�¡»Üî¼Ù¤=}BžWvÞªUeðåhšƒÚ�GŠ“F�…‰‘æ;�@2S¥Øœ€@Ëf þÂËünÍâ2Ð#�Žæ¹ñfÝY:]¿JyåH]•-·˜G׌wgv'¡â|ˆÄ0eñ
- Ã_7ˆðÒ�«n+fßÙ¸âàY<«ç(Í
- ª?öì’©‘yòù¡%wm¬+jƒ&&!è¢c“^¡u'�bü&ñhŸm6¤šÎû¹*2?´AÇI«¶Æ²5FW¾Ø™[âÆœ¨BõUzïIÎE”“!’m:‹ÒûœxhÔe—ÝÇ®n¼z|]%��mÙrÁU¸F�Ú¯�”ù®1Ɖ};!n F¾& gòÚñÿP‰†Ý¯¯;&×ö©œøï$$¸éF«).t›BíQ¨3¦Ž½(žC=ú·Óä¦XÀÎØesÔ;Ýiû«¶ÙŠ@¼Ñ~üNíÉΡEë ÔSR‹¡ˆh�\éè£úÁBeñoº†½œ ´¹ÎbTÑ„nÎ’ju¹¾À g@ä÷'qQ딎nx.u6bVU&Ô›]¹;Ûïª!C_„ž�5Æ*Þz¹Éºûm€RQu‘ªq‚’঱PüÚZ0ƒ¶}mñ¼¡ÌÊõn½¦^nÕOrÉT¦âÁ‘µÎ:ŸUã'×hÀæ§0nZ¡p^Ré|DFª_b\ò@–Öm�‚èDEë8��Æ{oèGM‰á œq¸ÝÏ}ÜîSd ®C,ûiÀÜšEêŠé/°ÞË[d8]Ž×,MCIšÎÐó_u—,]V™�cñ"—ä¤p°g@ì`"y)‹,;B³^ežlÚ¡ª2'€.(�ÍÐĘây>à-|ÎhÜÓÄwšúþê;©jå¥è’íÕ�ÑÒiÔ½±ä¯ê_o|!@ö)ɢݪÄ=ÙÌŒSPz�—éˆ*!z})¼|ƧT}½j‘†E£tC¬Zå¡nŒ�½Ã½œ*ÕžõÉ4ۆ׽[¹©±¾9»Ð®¨Žèˆ‘’Ý“õŒz`Wmeôo‚‹|j8jï5á�9¼öµ@.úšE¿VÌ/ÌZW@|—�f_ç\"${ᜑv¡àòƒóœÀÈ/¸ò¶;a×:Se¦i3TäGË*ëÎýƒ]¸Æ¡/ÌhÀ2C32$¿Óô¿ü1}¿ŒD¤ÍNXÉøþtì?FÏ�í~n,Pj9.î–>×£ü¨Í{
- 9ýÉEN-v|3h†ò‘CÅиE”•‡ XTàâË;P–$Ã=�JÖ-ÝÕgÝ•ýùigz~q—(Aé<:h1±9³3áNì̽õQ‰‹ãÇ}CLØ�WùߧÂ׎Ü~ƒá
Úb™¥"†�‡Í|Ç4u}îð×Ùc™y€à‹È6°¡2ÿ[ ¥ØÖ\d¸,µÒŽÕ³b�kù¤ÌDåä¾%0TÜx®{=;öÔ·‹†(„i‡�ØLS·øß1½˜øý©Ñ3ÿNÏh/¤6?æ'E^ö~ÿÆÔP®{sZì™ZÓK”ÄžB{’DÌtø&‰½Ôz’Ó÷)µUoaù5Q¦3�‘È—ˆr~¿Ž‘¾
- ¦ôÙùF] $º<èútm(š}ûÃÏMB@‡ž[œGxìÎFÓh8�›#}ˆô,£#À˜uýLaz(ÞQh±4%Óxm`Uà•Õ¹.E¨ãv1a’ž4_'/[¨d±{Fx¨IÊ59žŒƒDõ<êì&�8VˆEóFgÉÈÙ芘#õI‘äŸ�2S²Íîÿ_ã©]QqAšnˆÑ_ðQç>bÞ˜4g¡¨±-®0&E#c¦Üi8¿ vR/Õ4ÿržŠëšP7•£KsOWµN3Õ�vE\bq†ûQß5�Z¹Ú½Vy5]�½Ööàh/ i)Åû�¦Ž-/´°ã¡kµN¬ÑŽ¾ÈÄ#eì)"Píñü {ýKSQ�x‰²¸�¦>aã&µí¶Ž<a,릌HEHÏòó‰
]”%,eDž³U~W»lý�Ú›«;c¾á˜“÷`þ�? ¡¾p‘M
²lëê.‚P²W7õ¡Ù£È./ôWœ#;Wõd*–:z;E2†¨Ÿîöãúj¡ø9yÉÜAÇS�S8èuÀŒ¶à¬;fY8»m KѯèìÔ„Ô¶‰Í¡>,„
_èg¥´ñ-mác<×n]Ч-®5‘2c¨¹¡®ñz
¬7d Pœzóåµàòð²V„ö“û¥OPvf¼RþR¤ÓÆà°“9†Z
-ŸÁÞd†÷®šˆ¿C›šñóÇ`,öatÁ=‡k?v¢í4#P
è¤BÌ¡šØ¥¸/[õs.<a0eÆ{�´&Ž¢vþò¡a~eÐó8‹è)fä±Ûny’êfäBPLùuñ³Iy²H=Sø2öÑ”Ò"[ÃÈ(Ù¼O@íz*I¸º@Åö0—äª#˜ãÜà,Ð�ôÅI$Q¡Ïy
côÑžF
ëa�ßžv"²ï|RÇܘ 'WœF x?þ+aNƒMö®�KÎ`ÆDÞ/è·nf:X¸I8:H ±IRm]›Kôº6i ü@UÏH*NíÐoF¬àý;–±©›á‡�"W�q£¾d\“‰‘Ð�*C=#ã2Ï6x”7ì<TÏÕ
- 7yˆÔrU>-bH)ɺzï '}¶×¶Ýîwœ!rÁXÎZŠµ ´.:’Vn×;î-î>Š:á
- 6àrÿ½‡UÁcsÕ4k¬VW¬{’ú‰ð#˜5ß‘0ÁBÝãìÇ`Ü�ÿ0ušÑ".QÊƬ›dB´˜0£”õ˜CžÐrõ]íïà#íºQ9lqœàN^ôÖ³�¯éôh~ NU\´ ¼16š
- ~éè“á”S‘n‡Tòl¢‘\þTHÒ²Ú›-ÙÉ~ªG~)$…oQ7-ë¯Cï°ÌÈì}q%/a™¦³vO°ª|[q4–‚Š’³~Bc-$NÜ7<V…HE€i-™œèRÈF“GNMà{Ð"3•�û49‡[„j< �ḬWÓÊãhÕø˜¿l‘nÛà üÈØQÒ¨Ú‰Gcq¨ï@w¯/e qÿ£ÌægήÈ<ˆ£ÍÆ: êáaé’·¢‘u¯êÍñ”•_P‹`Ýùb{Eëá¦I(ÏÙOWGÝæ«fEyÀÜéABa_žß;O^ŽDQ£â'èµsóåçîÐìó`Dî#Ñši¯:Ñ´Û+ßY{©{Òpå&¶Å\ßRažšÀÁ—gþÏž0ÿÁgúïTùLÎi<'Ÿ7ö¦?ÀÒçX1¹ÀÏCïÖ
- a¥¿éîn0o¹r1Ñ™/U¥‰�õÎo�/?é•â™¯aùÓ_¬pê�HÖ±
Gõì´ ¦Â8ŸÝ£?3F‰0ð˜€Ù`%Ã÷Ï‘ÄÓ<�
- Gš]Ô½œ8blÍ�%-,Â)}%žJ”:¹YÒjÐTÍ;Ыȶ5Å’>ž6½Ÿ�wÒ{œV餃.&£ö(†o¹©*õn<§Øn9¡ÁJ–
- "a‡©Ð”ÍÝ+¡†aÊ/»ýººð;7zDØZη{×t�M Mp—£ iØšk¼NPwˆØ‘ͺðH`T
ö$23–†fÓöÀÐÚ0šzÆÈ;¡¦žç"ð]Œòª‚*ŽY²¤é,äQ¡W�Øàô¸lSéµÆÅOŽrW$5]K¡VÙ»Bâ…Üš…I¸ŠkÚ|ß=²&Á[ÔèêÞÑÞÅ58EÓR¤0Þ‹Gk«sSîñÁnãònnuãúñExK�Ðrô¢¬Œ}‡~mñÙ`ŽG4u{ÐÑñ=]6f¤�÷âר
- BoÖ&<
™Ã±c;2 ®P$Ãǃ{mW_cžõª'B6Њ?$½^z[�C—Y¹Ý™é¥jÐNó~þ¦Û®0¾»›út¢¯ú°Ûâ„6/)-‰1:p$Dꥅȗ
- ®
- ,'³†üyàõ±øÁv˜Ä …nœ‹F³T×Ñ�™['a¦MbÎJ]»%�&î¬lc6&ÂèIpFå�Ä
¨ÜoðŒiƒªÄÉþã5± ø'r¨äËår‘(q¼ïè�ú®ëî¾z6Á°öžîÉ(5óÐáEôàÉ¢ÕŸl\…Lñ�kº7«°1ÅY4^)bٗ¦8ù¼yøÆ�ªäÛ
- NžØ=ƒ›9zT–^[T$‡dkÂœ
QâiK%áˆ6Žµ�üqµéçõÌîfO|àÚàcÐ8$•ji^vrþ.QQR"âYárÄŠãâõ¸
¨Ãkø’¥ÞrŸº¼Kˆ¢µ<QI‰"·@´ïêR9
öÀ/½«\&7Y}m‰gÒŠ7»œz6¸-Mùu=‚Àé,õþN3O\º6ŒÃaDAŽ»Þ®ðLd^rëÉ/.®>û æè
- N·eíÏRiû4¦¾Õ!3Rù¢º�"�4¦ˆÈñúšn™bámÉ-y[X¦¦ÿÏñ."Æô!”øÜQK¯åE\N�ëµ4gÕ ×�ø§¿¦ƒï±aN¦p‚
>k)9ÁÁ0ˆB�ZêÌBs
- ö¥yŠrŽšer«)v¯¢®Dóëtèrv�\ûvù[ü>órµJmœ�–
- aœò«µÌ¼›~uÝêêÕ�º>µrMZœ°˜cíB<øã`)\y×t|Û�ïÿr'<†ô˜à>ù×Öþã[æÃŽ—ïèh7ëúþZÅŒ8caI�!¹
´p⢟ÍÌ®�,¶GÃí»k 5@ÈÙô÷ÿ`ôÉiw
ˆÒnО8pŸv¿ çÉé*��²Â'O
- ÝÔüŠ² ÝA[È.¡¤r�hóT
pR?+;Ëÿó\*H‹sLqÞæëUš¹f–â:ql-ć¤ñ*6!…hç+ˬ�{h·‰ö- jg±kÉMMÉ×P#ã¶ä:¼}‘±¸{/ÝëîVËßŶC]옙ê·&[³W$Ú«^ß#àû¸¶4fWa\
‹Á5ìð躺M[6ž½)T§3—•›~üÚÎÉÔÀ
- ã:. Z”¦¼¨`sÞi(ÍRô©Q…¼²Ì|/ú`ù
- ilÏ^°L# §÷òf¤-ñ×;-C;_ÜÞù*ù{@EMCooÂ_¤œÆÃõ7¾TöãrqzÜFµ%ׯ|™šU<Z¤ÜoÁ[TA=Ž„Ð'DPJ]´;,U9¯µÊQ›±ÓpŠžkñ4~€êáÁâ_�Cª^™qE¢Å®�œb
�SGsÚøßíY…�2N–A®Òuí®%ððSD„‚ ×hj
- ÿy;9$ß´IA¨ÕhäEO�Ì„á²Ë}
- ¨g‰³¬…—/+ ùÕƒ“ï5�JYÊ @äGúø��ü¾‚ê®f2�¢´—Y Äç/¸Âß¼™e„ß·¹±|vÞ/¸"ÞÿÕpå€Ø~刋ñTãô8OKór*ÒžÝ*
†ƒÀ4hià@Q›™3g"Ñj²Ÿ:ô$û•;:”ý¤fàÍü–÷Œ,d½®®zÍÈÈšÙÆԌ꺳°«u%ç Ë£}Oõ&³¾‚i2Uè,@Íkêj%u?Ûã4§NœKmöÞùÐd?5ÉÝ“;Ê0™Yï�Úüe}sZô€‡ª>EÆ«Us^Ýœv{ 뤦fQ<Ä�¡‰VPüïÃÊTfͦî?¥�õmØpÙP*�È&¦÷ÐQ‡G‰ù{cœJïñEPe2)ŽxP½0AÑßÍûMɪZH¶j•"×»"ÙA¬ÐC+zq‰mVzá–žóU%ØCµ�:@1æãðW¹Šî[y)ÎJ@÷o±b%÷j”A>)NÒÇ€Ôiç¼$’AóˆÀìt`>Ì?f0g�ÿH36pè6áÌD|ûM›äáö4N�¡°
- œ’ 4J½JÚƒ¯
- µj¤ž˜Æ‡´ó\
íp 3ÓøŽ£8�À¦ªÑã–Я6p®ùV?:¬$‚sDùÀNúµÆ¹‘2ï’n’,¶„HÝO\‚[¸øÕ¸›öKÙ-)�«W~¹iém™?ÿ®ƒTÐ:°ÌðÞºUÖeYŒÓãŠ-#dJe)¯±ÚÏZªÕ5”?ø$»æ¡\d©W<·¹¹,Ɇ†š;¯Ø·¸Ã5ÍÍòS¸Õ¸¯¼—T«T–ñšÎÌ„f(�PY°v=Q
~DX*¼ßÝ8ø辩s- Â˨®Î€55
X¢R¥l QCÏá¤Îá“øÑÀl|òý5Î{ûÓ¦T\t꼕+éï£e»nÅÛ¸‹’ÂPsÓèlû3™�ùUO©[üÛîÇZ»ÉS3åÀ�îŸ�*èì,˜ª†ß:ÛZþ¾ÆÔL‰›¬†ÕS��ô'̵æã*õòŒ*@¨ø�ı~xgno2±¹áˆâ-
- …Œ ³W³Š«½V�;äpZå9�?~„«$«6Ÿ<”µQr‚bQ8&óse•ÉEb¯ÚQ,·þ^|B²µï碘ïVd¬V-¶(Ü]ã .ïèËŽ8/qhV¡nR®ó®QÈD‰*ùU(*1hç1Ã`Ø�QL{…�Uj`àÒ"šo3�Ü»æ™V¨l…µ: ÑíêÂØÀ
jaFaàžE¶ÌžZˆ‹g1±·zü°Ì2Ö Õ:ÍAuÙZIf6–ƒ2Õtw+Š‰‰f�§D�‹ïÉ誩CL-}g»µZ³0>Ò„óxJ¢ýÿÅ>\î�ÁëQ‰¸AÚ_C¶i‚hßÒbl]
‡6ÞÕÞÜ4*šA˯ɰüqX‰¤7„»YòX.€-¾ŠÚÕ¸•aɇÃVâh¬–iKg•ÔÏqN³RĆN(r'Á]¼à%Ù˜„�…ô�ˆ@3ÔÍ€ÎÂ�j§Z¬÷J†.;üãnmÝú¯ÕÎ,SûûØ0x¯³ÃõøØÍ»£OF33Ò§¶…«<$'Û»¸G—E+´Ú}¥¥Îóúó§…'1ðf3›ÆýÒyÐ5Ý/&¤Zœ\RBô7dmíô]æ¼8§§Â\Íý„3ß‚„Ȫ˜@÷ìo¿ûTé¿3eu^·W@Šªü”–Ž¦e7l–!Bã,Às‚äæ1ÜÍß$šäò¯ÛZ§ã&Ù’ç?¯âdCéá �(YЦSm>‚J"&ptÞ܈ªP㇄BF¬ø´�Ú±àÙø4ŒGá5œ t^Ć$¯Þòj-aã �g^ÁÊ�C¤–…ƒAsÖT=k¡TS,|€ràåš9I·½BϘЬ†ö'ÂìvG�A¶Î@�ÍtÀÌhQÕNj†&€åT=Îxt;2]¯P¡|T- LÞƒ’Éç¿ñe1ãݽWÃZÅš*MrH5?„ñ‚=à�ýÑo°¬"ëÆ9ÑK5Îø=«'kÉ-*•„èA¦E| þ Þ qÒ”‘_?\£7%öŽ|M6°fª+““+’S*}çW�_Ü]3ª¨ú¶fmÜ®ØÒ˳ÒÜm w!–—î÷å.ÛR#‰é¬ª;Æíú¦±q qó71ŠÖä$•ݙկ_ÀóiKà&ìJ©Î¬M®Š¬öÞÇemåVÄ5PÏ0>¾¾ Q�çµ5ª†W•©HIh×åù&ù4Ò�IlÓE7}âsÈéÄm[cȾ좄|�d^ ¢ì÷%Uvé1¦D“²>“.èT¬Ò7*é=tƒZ¸_§ãŸ¾1Ð¥:=0pZûš6Ò‹ŠN„t�(åuíÆ�; ÇBÒ]³‘$€k¡ÚŒ€Â.ó{ªFÄ*/UZ’ÆNüç ¦|oqŠÊK—G;^Ö侞9N§ûeÿíxK‹’¡¨\‡whþøñ~¡òòZpHÔb‘‹Í䉸»ˆÛ[k¶8âÉÍÌk÷â.bX.Q¾Xp¸xYa^µÐ"˜Ñ#럙ãB³wnb¤¿óå�uÓð ém5žF²½~>ÇÐ8€ÁbýúŽäN:Ýp4µ[gv^
- B½ÓFÐUzû)?œ¼60�ÐFÉÉ8˜‚�Â/2 ŒC8¨Œ®>�N8Gî�Í%ló%èÝ5ºFH˜{4„6h§Žï¸4Ž%Æ#
7¸è›ñŽÍúËxóoºÜN tª\•'ßȨ
¨ úæE£�Žæ½0#ƒïj¸NãVïÓ¹dà?WlcW��×ð‹Äí
- ž½Öµµuû-“»}2„2¨¶¥EN�¿}#‡äµµ2H^a3ðõ»¥r»Áqs§¤°ˆ„-�S3&Èïô„f´í‡£ÌëÎfwl.š=Wø8å„,õàÒcHá®jžcTê±W®‘× s�9ò0žî”ZàDÎM“ú¾C2’ZM’�Ýû�djµŒtŸ"8À:gí{.Ʊ°Ð1Fb6ƒ1Ç8"yÔ¦>˜õ¿’WÀ9£ë ÓVšŠŠö¯`×j¿ý®š�¿Tò””‘‘€<I£½MÔ±W'%f&¸\yäZëdkÍ´èùRyÑjw˜æ}ùˆÐ€Ïß[8ÂÔ�†»£ÇbBí ©'d'müoû'<�ø|EÔÊÍ5êõ:³¹Ú‹o¼š©É>²µr,nƒ©iÀÁ
<Tª¸S¹¹Ÿ>¥d³… ÿôéqN§ªÝ.g+ ïSÂë¼
Qúù·�¾ë
�áKaB¾ŒÛà?_í‹ÛQ�E ‡“µr¸†ÿj¤î‚h>ô•E¦�Ó›;�C�×7…‹·^q¯
- Æ`U¯eú#-Ÿ˜·;oJ˜Ä‹ãÒæŽÔ�>)Çý‚;Jgí£Ï×9R;Ogí¢ÅýiI7ú}—â8K¡’œÛ�q¦j�¹ÑeØ“£+Ù—'nñÏ·k3‹Á»üeFÏ�ûžì…0±šò¯ßV#©íÆp¥MAzb^PŽ÷VÏu¤Û~Þ1uº—Ò“•wnÈ ^›.II—¡Š_ÆÌÚvdW®Èö�óÎ[Q,ÍÞè+L¾b‚í¾É¥å„Æćq¼þ
9«V}ï ”Î�VÑw4qUä3&jÛıHYb¼ ü¹ˆ¿tt�Tœõˆ7Ï�ò’«ÙarBwP9?)Ûu•é‹T/Ùa£•ŽA19–±kªM
- \ÓäPÝßs›<ØTaž�Ðã@‚<?Mâ(ê¼.¡,'%?,Ç%�a~eÎëŽÀ�ŽUá–0µÍ/zQÕö(Ѹý“÷¤a™¬ªp:.6«jÂÿdF@\V®4¦É{ÓRiìþˆÍ8é¯Éªnuý®Fï˜M_†§=¦½õZ8á¤HãîŠl‡sy5k%õÌ|(ði9"Ù6äº}Ô‹~WK„ÛŸ‘hY©kŠÊö¤—\àû×l“RmŽ»´&Ò
ºæ¦ñØò0¾ïÁbû]gÊ”µ¾"ÂçÞ€D^ý²æ¾ÞŒ¨jÿ±J*)žš6¨µ‹-YbÙhÖà÷òé
- Zý¯éß=Þ‘¦A,ŽÊ(Ž�K#Ð
–²OfÈJ:î;¾I†¾Ç!6Yi&ûdÙàÖ%m®86#ªö™Q�µÒÔÌW_‘öA›v}?+èGášÊú cc*ÿmûô’g`Ò>…õq±Ø+û£=Ù[5ÄÍ”·¶Ö×?²9£WÀÉ+^ýo¯^Eàã8s�)å�fç—2aôæQŸx¤·i‡é& NE>"^NaäaŸ;fŠÙÌ9]NE& t^°ÀCLz'âe…8ZRñs&6Þ²7_�üãcyJž‘1
Äþ@TZ°?S�D2û
- ‡|ÔPõÔËOÓŒé\dªRïÞðû7zHÕøƒî±9iÈ�‹Q#µ¿¶‚zr³óc.ò4ö†GýR�4ÎÈqx¦ð¾<2~X’hµ÷náãੳ¨Å2ˆauBNCÑ�+›¢k—Xó0Ñ
aj5n>Þ‰¨õ²e3övÞ§Óôé<¥>�°_²Ÿ� ÛuH: �XR�ÿ%~9á!4öüoÑѼ¦è�3…ºâ”8?¶‚ Î1d#ïÔÑü–šA&‹„„{A!i6‹ŒíÜ/Xa�Ÿ£á㇤=W‰;|ïðä)� Ðg¾~£
?*¾æ‚½Ã }¿ãÚ§ˆKtÌ>5|EŽµÐîÑÜÕ.§ýôAûšQñ6üú
²€¾(6
- 6Ñ”Æ7�–Ú÷<9ùù_ð•CÁf1þëÐŽéi8¾®†å»,
V»4$ÀŸutÉøœø£ÆiÁ,.`v6r â£òŽP
¯½gFB�ÉŽÇ
- tòÃçÚ
C3½;˜,¼o“æãœx|
- /KóMp©1S_¾‘X.f÷V�ª†#¼U>È’Èõˆ#Böñ]µ
A�‘IVoÀÌІϵÀ‘¿üGTV1nr+£ÎOXÂS•%‹›Â³¶™f§OZ[Û_ý9œû‘Pß°÷ {Gln‘%ß#ÚÛhÀdw¿H ù=† ¸y©e/íªW¼³´¶>Ò,Óö¬°IP,*MV•ð„~ºK&ãe¢Ä‹»ûMì½£=ò)‹qF¿ S¶ß´"ÉGÑëTšF™�*¹LX,hŠ[—´º“§wŽw´íeñWQEÙxÚëº?áè“{^Ú†EŽxïh»�iý»¢×‚�„J”³ÃÀH�¥|ó^ÙÍ“Š…Ée*^‰Ð¯.ãuÚxE™èëËb#î;›’ôÔ�<]z]\íƒ×�¨wÚN»ho¼chq¸E˜£=ºçâ4Q1¸7ýÝçWü½Ì“lÕ6�᧿HE_Ì£ ùqyÿ‰áYRŽ¤Û«<x=ÔcSßXy!=0û8Ç—óxÖ˜�ôþ?±{}¢ÿÀîßF_„üáÇ ™zø¯‰kt©É±ðˆ7³ÊÚ‚|tû§+a®m¸<xe$‚ée–�ãÉ�ª×<[¹T÷¦ÿ�X[þášžø£Ùö�¿s»VÃÌ‹«Þ§UžÉ*³áŒh—S©K=FeËsw uYéoÍßÙ¯nQ«³=NE:[Ò(t]å
k×|ç@‘Ù¿uZ\9{h�±�v€ÚÜ•Ó†.Ú¡úsaƒ‰$u+Ÿq¹w:#ãæ?åeúT‰3=ЬлÐ!µpìPL`Í:…“ÝÐR;ØgÊ®�Fha�Î�;¯Ì†5Ie +–ÛØõ»�×bt06AW40TÍhJcc<&ÀmJccà
- ¸�ó¡OCn«W?üùNÂiþî¾o](XЄûŸ{÷Lzì˜ôÙ;¿ðØñg¹ï|Ç�ç>ä9~l4sæVyù™`Š×Uß›,ùŸþñ×Å#_Êu´ù+Deêêí™àéMÙü¢~h³qªë²‡’·#YúÊæñzü$;Û5ͯ9$µË z²>ÿ
- ¾*jõOŸ�øŒñÛ$œÐ$O/¯ÀÃxRí½ƒÂtýf-}*žoïɦøÙÌ|3†M;xÞ¨¯U”•µl/.ñ~XÇŽ¯Yá¼4™x3&æë×x®";¤$�KIö’5ÛdÚ½Êáüú‹~w[ÊÔM9OØã%4ÒáQ¨}éS^žìt–�è@ÑËæw[›Y;-Ýöÿ�Àºs;¢b¾ÍwH-*ï––Ãim½¶IÊ-¶1e/•~ø¨TNN®.òp²ßð)H$ûë«Wïß~�Îð�µÉƦí¼O
- ( é9è†,Ù
]gM6rê+„#»%ƒà/süw¯Aœ$õŒqÆ4ËO>
- d9}÷�+ðÑ$Œsôš³ý?0£™a,>�y‹¹Úˆs<ðþ=†,ð‹c_*\âƒDí¼Ü}È2Mí°ÍÌT8/í4ægæ'Ú¦ž�â8'û}"‹Câ*„\9½#Y�>z$ŽæöÔ7c[s“|"$}» ymÌïÕÀ«zQx 5·%å oùå“$j†kÐÎp)ñx½Äû-:º†Ð˜|?�˜oãøf§‡gFrÀžß2ŠS‘ÇZ÷Œq}qˆŠµ …o€,wyÅO¡gÊ�CF1Öl˜çŸ'íL5T3õò3ûÑðyª¦M‰9Ú2"s”˜ò5uD•‹6ÀÔ-Jì‰U†bsºÏ
- «O)ƒÌw¸R
-2æ/5fÜ<ªBQÌ4kŒ˜ê��G¹ )%ß¼ã<dÆàĪĞí¼3È2`ŽaØÃ]©ªS{£K%ô\]¦3&�Šp„“®®Ú¸Úˆ”CÕ¸¢ýœ©ë†¶“,÷À
Úù^éTÐÙÛ7¿h¼5™uûlDÀ£xÚ·¶—ñL'D¶ð„rÃ6úvÕ·fc\þ£ý§µgAê‘Â�³ †²@�?¶½žÂØÁ‘ œ•GFæÁVA·l,¶µÄ:§¾ •i#~NUûæ“DV~7¾�k·K`!ˆP–ìMX³üRÍÆ$#îTiih¨ž®omÕ˜Å<.8UmÇ<’Î3ïÓéESä4Ü«�úŸV9²ò'½™bvÒ{¿¡ø?îVVÞý£3�×;”U'Ö¬‘Àµ1RÙVé{BÇôÆîiŸëº4CRhÜéŠr6~˜Ó–�J”¥PàÍŽÕ÷M‡7GŒÐ�-,NLo¼ô<Ÿ²¶Ñ£zç÷••2H&|$³²’¼<{
¦Úœ“Kä_œæÖÿmmSŒ)>r’Ï›f@=šâBF™‹ïCB�±©‰‰ƒ‡&'‡F}@©&ÓÈÿ„y×ubâÐÁÉÉC?'«êåñçSæ49+—Óä±Cø®³íIîð¤ÙŒ+×ç˜ëf/R«Uê
ÌîC°Fu:C*£}†T:º¶}{ÂÜݽⲷÔuªÎ×ø•¬e[!®–>ú?‹ÄåýÚ¸¸"ÇM
- 8gzƒô0\HkƒÔZ³:Ähå~™@ª+ô#«N�êÖfj¾çyµîå‹ioÀ!„B÷ þñô·“±R'©5>Ú`Úò[!ÂÄTˆ`mCš�I…Ñ�Ã}¸n
- �>Wßô!M}UËavõ¶4�€3)!§kcÈ‚²ómþ?’Ž Ýådïw•ãv«!×”;XÏ¡Û¨}½8ívt•ëÐ"Ó¼#kÂvXŠJ™±[“l�¶[ZÝ™MÀ§ñÃXC3lê–[
ÃTa¼Vj‹¡…ÚÊ»¥åŒÑ¬"Å“Ñòt:‚(žêà¦ÈÁ<¾cZóve—ýQ›ÇîT…Ÿ qHá‘i{ Ò銀Q埓'Á“Ö»“i öPØöï¿èüȯáímKÊAçIŠõ¤��BFƒ
- £=‰‰µâÖTá…½¶à(âœ&TSŸ?/ïØ�A:Ö·¬»ÐžV§(ø÷@wïFa^ã¦]…Œµäo]*Óñ99¬R¿iáñ_Ôò˜À™þÎË2vM“€Ø`P§“ôf¦´{QYÏ«íH#V7vÅ7ÌÒ° q>@àó«~uɘ׆Ax°Ã/ƒ«xÙ°Bþà3£Ä Ùô‰�tƒÊÁy†b0ŒžnG`ÁòEÚDìÙ�äA’Ô:ÆPØwIÓ7ÏìnWÓ÷2ED<hD�&Z˜ˆÃ Î 7Í3á&úÍë)LDË4;Ü7èæÑ´?$îËk@Ù"ö¿"L&~§ùö1ʺf«14ŠÊ±|îÚÙ7Os�Í}úÆL1;éÝ?Â{1$�ƒ¯w)™€1}Ðà0è~7„Ú#E5Šª`Òq&o
ÇowÞÍËÓ_“…é´ŠªÔ8Q1Û�Gó»»óëùÓÉŠùêù08å×h¸äW¿e ˜+º²\êåÔ‰†R‹ÔÊ“ÃU?w®àeÙôïOÙ�ÝSx�AUÖÌž3˜| =WAµÍÝÅR�
- Pñ°tO%Q"1Y×”!so%%^�zÿ_hn,ý{?ÔÜø"L¬5±_D6©îì+êïÊËSbÆ<�à§ÌgfJËô¥0äbì_ç¡ÑxÔ-í£;‰H«âãââW‘:G˜MðiÄEeÌIuª®vJ]~mÈÙßØQHLKkì»ÊhbžA>}.(h•Ü"‚óãU]¢9Iíh_îV¯@‡›GZ0C
- Üpb
ó:ã™L3�¡tN*ªN½2¿Ó!¼3Œ�
Ca³—yn.•ÊÝÉ‹Wâ`̳Ü}±QBÌC�ªÃi Á¡8*Ãï{57‰¹ìO#aT¢ËB½Ÿ‚½Uíoþi§0ç
ó_ËðÑù^
- ChrU}~rÈL 1òzÿ>..ö=%GÁš›GŒ£ëüo ™�‡ŒEéu‘P³Psؘ޸èó8ðüþP¨Ÿu&;æÊ*Œëù|i&¤ÿPbÛÈ›°²˜hÒ;´[—€|y*cƒVšh†Ò¼Ò(ÿ”~Î_A•qU2·½ÿôGIQÇ3`®^Êvþ=î@¬ÜK'¤µÐ‡èËZ#4sJ=º¤:sY©è sÚ¥bÂyj¯ë·S_E܃"Žª‹Š@ž~‚Ÿç¹>86ºñ#Îy±Úäå[ïècòSï„¥ÙŬ–�”òò#SJ”GZû®yvvÝßSùÑ�æ‰�p¸waTšžÏõÅ/,
- 9'Jkv%%.†~oò[ÌóŸ 衧üœÂR±Bj¢ŸSèÈ€*$'øè…�©pçS¥u�à+ç9\¬í_f+åòüù8õu\,¶Ê�ÓtæåðpžÑ�ÐkØ®J0hó(]N„QÈvó³W¬�ÇÌ7ó•8«ƒ6:ÜÖÝ£Ïâ·ñWc“¯Y_i>ú¬ŒÝ"‘ßR¡çõ’â�(Óe]Þ6ø¹ªRA%U—6&´F]”½7@̳k3X
h�?ŒÁKïà®Þ�Q¤2™Bk¾[<o¥-[
�s~Ÿî0¯�]Tœ°Ã2ÁÍä¯hÊñÝJÆqîK¹v§«Ÿ(32Jºþí//W…¼,ã¬ÃÎÛzï�d$2ÑcA´kP”¹— §”Kÿ+€îEc¥ÛÂÜà[Qžùàóôùûiú—EdVÃõxR8šäBÐ5ÚÌÄa=:¢�KQ˜¶�çÓ\ °@ÆV»^;KrÌ —M{ü÷ñÆ{#þóC�w}{^,í§$0Rcÿ\o¾«Q½Ñ¼Á×¥PüÊ$é†YÊvpà®>?.ÿ€Ã.K¡ÈKAbŽÌ6ýÞÄ5¿·kò’eŽ+]²F<HËe"ª;{wN‰yx/Æ×å&f檄/XZ[Ÿ¤7»š¶c%ßÅ€5½d•Y_Ÿy"Ыߞ£2\37×
- –k\Äë�²|FO Š’´68Š¨ñð…‘œœÃïü½„�ÿnKðzR"�ƒý‡ –Ÿ?/7Ð32š:аá>Ž°eöWH©Uò«û0OÝק¾5…´øÿ
¤úîäe3H‡®coÇ>l]0¶2±ˆcý¹‡ÝHÊ9š{Z
{sOõ–!¥A,þ7†?Å·3�wä¿ŽA
- àFjÚÿ¸8¸Bí&8U$G…¡Â�µÙßé$µY5˜‚†FâL…5nÇì²Øò1–”>qóº2££.«6“e—é
- î
ì¼Úõ—œ+˜–@/¬¢ð™µkíb{à÷(�Å7Ði=¥É{lÍ�¬Ý‚âÎ濦ï 8«…1g�(»üè%ÎÓh/ëEf¶M¹Ò�ÝtŸ�5½ŸÌ¼vg½oÚ ê~à©›WKi父U«ßأݖw¬RS‚EìFíßT¬²%ª
`=í‹ø|*=1‚ò*Žù»ý·S§Xö¬€·Ø^êòÓw)l–ÃÖfQ�HãúŒ(YSþô„SËŒK�·æ1ÞØâíW]µf™Ÿ·°7ך³^&ýpô@T'.ìÀ%3�³•„Ã
š�¯´ßÞò»ù5ÏzaTf6Ñë©A5ÜL•óXÌ¡æ·Á|ñL¸-Ÿå–ηêÄT×g{A)ªî®FÑ•."hü“ùj¢ A;.ðâ~Âþ …oÞ%°èýG#Ñ}&]Þ×¾cÜ`C»hH9xnN†·Y Îlð²cÞ¤\+v\EŸ¥«Æ§1¦D9K·Xá)2b.¿ó“NôÚýW¢§ŽÜQש$¥/£”|6tð™Ã32Ô›£´7¡¡¦�–2¸ÑÛиyuü0e×ñ€)’NØuh'dœ¶Ãî„õ�~xY‰É��‘´>ÄÚ#bˆ"k3Ó𼃮Ì: 9¿º¢vˆú$ПCÝ:Ê)H¹Ë> Õ¦šzÇÛ;e“d\jmfŸäOÏa%ò9š‘ˆcK›xÓÐÛ¥Å!k©%H�ÞDn“ü{YÜ"“{n_Ö}
- ß)9ƒ=
_/û‡ZÎ(éù>lú¶÷YžŸÖV÷‹gQ#§ß:QÄ•ÈbwƒÇ÷Õ$¾zw±ðÙ®‹#¿»ãU˜?|ÅðïGÔ΄hÁzü{ùoº$wñ×Ïœ�´º)|Vh‰Ú?»Œ
ZV�7¾%ŸüGûo/£×†‡ôéEÏ"¹KÓ²… ìµl¥p76Î�-z
!Ál€4n>”¼$\á×zV?szûqejìQçëé]m‹›æ^æ=^µ
ä§í¥! ²ºl…ôHB4sLi9}Þ2¢^×ýKÐ5ÅOBú)èíO
çv^~ªêµýïÝ€x¦“rm\KÚ&G^Ð5�CçÐL¼}&Fºò”ÀËâ¨B]K†¡n3††|ÍsGjyðkþO¯µÚbåsܽæaW?R6ð¡·²¾J�ÂÇfhãÚ2 ÄÊlBS§\=¢jÕÕV—Ê*”ôY¦“^¢¢Á™„˺^E)Õè*”\½Ÿ
- ‚rÔr(a¢@ø„6nÔŒ£?¥}ÚdL°©¦�šg¢IvqØNcÐÇa�‘Æ®kŒÍ÷mLŒöcÁA!¤±hd¸£±Vëðµ¹Îòwc=¢¦æ†–áæ–Õs_Ò:ŠÿÒ—•¢sLËí£g>‘œ—1Ü*4-%ð&Ëõ0Ubƒ)Eܬ�†*b¸ÔÖ51—Äï„ç ä+è+;˜Ž<…«†’`!q°fÍÎMù*Æ,[/GK+{×®�,>CâL�Œó�R%%cŒ³ÂÆÃ~‘’'EG�†A‰®GºÂ=‡hÂ䟔Ž°8:IDìN)ÅWÌ»áAF)ucw'qhÍXè²L@a„¾~Œ6ÌPc2Lã"¥A…2bìÈU ™À&Œ€‹ÿ¯9öA#ÓQLO¬:�E€9k§©’‘ÆfÞKF•b93tºL$c‰Ë¬pÿLzÿ ¿5ÔdÚp¢þðùÛ°>$`œ.÷ï«~Xó=¶�¡ã?„ N�Í°/ŠÄ©L®PªÔNo0šÌ«ÍîpºÜ¯Ï ‚b8AR4Ãr¼ J²¢j¿}øŸÐ
Ó²×óƒ0Š“4Ë‹²ª›¶ë‡qš—uÛ�óºŸ÷ûAFP'HŠfXŽDIVTM7LËv\ÏÂ(NÒ,/ʪnÚ®Æi^Öm?Îë~Þï÷‡Ã ’¢–ãQ’UÓ
Ó²×óƒ0Š“4Ë‹²ª›¶ë‡qš—uÛ�óºŸ÷÷ÿ�b$œ«tV&g®Ï–íÁr>¿<Ùyóå?�’“˜�ûfþ{�ç´·�£�‰µ›ž%îµïÇÌ~ßZûþaÅzW¾¿¼÷ÜõÝ2Ÿµsv�ïÀÌò�™ÙeW«�‰µ‘à����@DDDD$""""bffffÖ}�X ÓO„0ÆcDDDDD¬µÖZ›6Wò08BÖçI¥������������ƒ.H¬�W������
- ¢ßˆÇÐ9 �‰u„*¥”R*J^}€Ä:M”´$I’$IÒF‚‹™™™™yÑŸžûÞóÀ_WÍÆý<G<þ��wOFF�����[€�����±\�����������������������FFTM��X������m*—ÜGDEF��t������ D�OS/2��”���E���`g¹k‰cmap��Ü��À��rÚã�cvt ��œ�������(øgasp�� ������ÿÿ�glyf��¨��M��”¤}]Âohead��QÀ���4���6M/Øhhea��Qô������$
- Dhmtx��R��O��tÒÇ `loca��S`��'��0oû•Îmaxp��Uˆ��� ��� j�Øname��U¨��ž��¢³, ›post��WH��-��
- Ѻ£å5webf��[x������ÃTP�������Ì=¢Ï����Ðv�u����Ðvs—xÚc`d``àb `b`d`d’,`�H�J�xÚc`féfœÀÀÊÀÂÌÃt���!
- B3.a0bÚ䥀 ‰êîÇàÀ ðÿ?ó�ÿ@u"Õ@aF$%
- Œ�1–���xÚí”?hSAÇ—¤iSÄÆþ‰�mß½44±Ð,qÊPKƒ qÒÒXE]²(2 ‡.¥Ô©ƒ]´‚ "EœD·
- ¥¹ßi]DÔ¡ZJõù½\µº8ùà“Ïï½wïî›w¿„ˆšˆÈ�V"±F¦pUÔ¯û×â.Χ(ƒg’KÃ4On«;âN¸‹îR{¼g`'!ÛÉP²MùUHEÕ J«¬Ê«‚*ª²ªªYq”9Ícœå<¹ÌUžá9Ô!ÑQÓI�ÖY�×…-Ïó°¢KCõ•è+ Õ¤ÂÊU)•Q9¬4©Jª¢¦Yp˜]Nq†Ç9Ç.q…§yVV
- ën¬×)�Ñ9»’÷Ê[õÎ{“ª¥öºv¿V¬å×›Ö¾¬öFWb++{Ý>·×�¸a|ã€ü*·ägùQ¾•òŠ¼,Kò‚<'ÏÊÓò¤<!�É£rÔYw֜βóÜyæ<q9�{-]öíþ“c�ùð]oœ®¿I‹Ùï!0l6Ì7‚…Í�áØ{j�G,ÔOX¨^´P¼d¡Q»…öÅ{,ÔM4°c¡(QBXè�¼m!ŒK†,Ô·Y¨�Ha¬2Ù}«Ì˜˜�0B«AÔ)Ø�F}΀,êQ8ò¨�Ã�‚'A5î©(£>W@õExÌ¢¾DÄÈÃ&ÃUØd¸#›ËÈÀ&Ã
xõMx˜<·aäa“çŒ,l2<€‘�M†Ç02°Éð6óÎ ^†‘…çP¿$Ò�6{¸‡,´#›ÆžÐ{ MÎwpÌBïá8H¢þ�#³6™7adÖ&'~‰95r
- 3wÁ"Ð[žEt’ØÜW‡:ýÓ:$"ô™>2Íÿcÿò5*ß.ýlŸôÿäN þ/öÿøþhþ‹±Á]GtýéTè�ßß��Ñ�(ø���ÿÿ�xÚŽ |Õµ0>w�Öm#Y¶e[’%YÞ-YR'rö„ÄYÈj¶°D% �,@ØBØKZjHÙÚ¤@b¥¥¤-…RôÊë+¥nûhK›~¯åË룼–¦¥$Öä;çÎhµèëÿýþ^fîܹsï¹çnçœ{ι˴0¹Œkb8Fd:Ÿ%L×”Ã"Ïü1þ¬AøÕ”ÃAæY£Œ>,ÈØ”Ã㎀#œp„ZÈ4õØŸþÄ5�maßd“e²ü ?ÈœyÇ=�¤�øI:C‰Ç “DÜãõ(nI¤�xˆL‘.1¢!„P'™JD‰t‘Hj€@L4’ì…P†ô“h' )ÈbÒ)vHŽX,fù1Ñc\'²âcGÍÖÀ±„u˜�>ëŒñ1Ù~Âtüà?ññ„éø!x¡øÁT_qâ?qB‡ÛÐF‚‘¤#ŒL%½©DÀÑ›"¯ä?YøýŠºÇ¯ÀƒºÈj??8>NÑSkem„²¦AY³µ²Db¡4
ÙJ)¤•;•@¹j“ÅP$
- ˜ï'qh®8`›ë;aŒê�XÍÃ6C�ùFâ*„dËYýcá±Ú"ÔŒ‚ù„Ïù£Ûø'?hÆL¬Vã—ŒÖ,½>c‘eË3eV¹Òh† =Cû‘Àš†éÇ~äõxC½�\((qb@¸4ð‰x†K&h×�Î
¥©4\2ºÇ±6N1|-Ô;Ïëj›ï–É
YuÔ@†ájêî›Ñ«xú¦õ†ži¸äŠ§þmKóëÛÙ�DøEöw¦q3ÿÌ·.»¼cAw@¶4t.Žgãñìükg´Ér°{~ÛÓWl~¬{ÿÖlW2»êöð}Ã27Ð6a2Ì\€6o”z@³$´ñ¡ÞëHÄSÉÞHˆ «g®›Ñí±bõtÏX7ó0KštÔÞc1Á,«Õ7—BòoLëè˜Æ�Ô6Ä·6[,–æÖ%ñiáZ
¿‡,’l>T†pòK³œSGg¬\>
ñ�#»øAö#3Œ«ØEµŽy‚kÂî6v®ìÚçè…Áºç†;u3Ó!ZIÎ8ì˜M�†k?³8¶C˜£Wq{`ìC*‰Ðh>H��Ü1¿_söÙkâŠìh)œ›ž®ojªOO'»
- !~dXñgÏûB(ô…ó†ýÊ0<
kOYxÊe§¬©±Æ§Ä5k¦—=dã²ðÓϧ> íü+ütÆCç-o
- Ǫ†„/äÃõ_koïܶÿ¶¼sñÕ+f°ÿÎOßz±tpÛu7-™}…dõíþ9Å sàˆ©e Œ³\9.H4’!0�¥S\ ʱk2™ï"?ip7œ\2z§ÙÔÔlÞ°Ñt=¹î…Wùç\!ûKyOXimUÂì¾nov›ìÛÇ6²:½èå
2ÆóLZkAýAÍ^âqCæ™Þ” &PæˆïaFÆê¥Iª0Üã>þ&ïù…Q�#F£Qý»Ñlæ>
A³Î‡q*˜O‚áýãÏÿ‹ÑȦ�æ_@27¦ÌlÄ,¨‚�sþø‰Ñè¾fȾ6âp7üÜ©?�úÿMþ›Œ‰±1vˆA˜Ü2‰¦]$j"‚‹;‘vÛlk~va0¿ûgì¥j£úÜzþ›¶ÝRD:ÿg©×濱cë6’ÅÅywú%ôgâ(þƒØ#'´ÎuBµò#ì=ù_@?ƒ>ÆFØýVbŒ0žaá!¬aL4tXv¼¡ü:ÅFööh÷²9‹ïj^µxÞŒü¾¡ézÐÏ}´WnŽ}7}¶×»j“¯ÆΚÎïi½H©�¿º¶ÆÁÞi¥ýÅtêïüKüSŒŸ‰aÍXEôºEºbbBQ1ØÉöf”t‘x†ôFȮܷ-"dqA÷×Æ\ê·~F`³»è6²iä�•+ÀÿÔ¢Û^ȲÂ}שï׆k&»ÝĹ¾»íÈà<-
\èœ;Äâg1>¨w†0Ü0ßvòÉ^x ìÝÝ7lÛ<”šyÝÎ}™ÌS·o›9éÜ-Û®ã¾6kžÐ±lË´¾ën¹ùðŠ‡o¾åº¾i[–uó—§~¬æoà`jàÁ•Š{i×\C4,"iW8’J�oñVò„bp¨ûwˆ²Cýªºß!‹;Ô'7×D.v¹ÔÇÖ�Ô
n‹õoZ-n²ë¤ÕÁ°eùÏP‚òŠio4Š~LYä/zmþw_�ÿò�¾ØìgþϽŸþý§RÞÏ"tÞ Ó&NoN€¥)4ÆÉM³CÛG2«‰\j²Ê8�d-É@>#ÛOt^¶Àì5¼+x͘e.^á]ƒ×¼à²ÎÛG 8›^æ ômŒ÷(ÓÆt1 ÷s™Ìbf³J›°ßÒ —%‘Œ‘ â<‰�¬4ŽÞHâø”ÝÅ@ešê÷8CÈÔòŠ,»5<Â(—åk²c5Y®I¿þ¶ìÍØ—âùAøú]|Åךål6+›Õ=øHVãcb´KÕ‹B´6ßi4•#´‹_Û©|&ó>NvQŠk#®pW•=ä¿uº7”ÛHÉ°R$
ç÷�î
³[5ì‹™™
ÌÍÌg¡ µé%ð1Ïä9}¼°ÐûÉÇþúÏ&@$&¸¨ÿ¹÷Œ¡l¬”ð=Ó1RIñ�ò}9æØ#ÎÏ‚«zû??1z&®ôı_aÚùc|PŒI[íÝ:uÐ; ¯þäÇl¿Ñ->k4ŽýæGõ£ñYÑm|Zô�wà
}û“ÑHnÑR=-B¾ë™õü~åm¼�§‰.Ù�± .ÀÃõ¦Mz^,—»ë0�%£ñ°Ê8®‰Eý«G¬Ä**|ÿsg|oÔò±ŠÀ¹zOýÿ¿Ö¬0s–¾zâÚé.¬�ãWN�¶^± ‹„yHk<J’Ýß{nÇÂE¤Ýh¼
- TG·~æ’ço]¸ðV²á¹‡††zn÷Ð�zdØ,/À)j�l.ùÝw<w ¬¶?5*F qH|ö<f7´[ÿ6Tõ‰dªê“ü„õ©¢×?ìC8êSì'€øN
- #½0”fñ2^~7¥¯:
- œm�ŸíM I�ˆ`Mö:ÓŠH¦ÀÏF²Ø9ñBä§Þ:ïáŸýágŸ÷ÖSk·ozíØk›¶ó#åSæoŸÌ¨oc3¤€„›¿A¢™'Ó¹m×¾¶iÓk×nËÁZ�-ÒyúZP
ËÇ=Uc™'…ŠÊê¯?&È�èK¡—Eu£lÎ;éª÷><�v3t{8-Ù|Ã'
- ø«eêøa~ÖìÅH94²Èx¼¢×AÅ-³@üy
bT4@0ìb#]DŒDÓÑ“½lj€DSio:AgÐàöÄS½ìP z:„;¦¶-á|yH"r
·¤{ÒB{\ˆ´5RLi‡6öAƒáAÖæã–tM¾]èè�ÛßtÓá›øaøRò±KºûàËC¤!Ø1ô´CÞígCÞ샂ð +ù¸³1EG·!ÒÚ€ÝXzû––®î¾éÙ›nz–µvÜ@±x™�ôíô›Ê-#i^ Ïxñ*�$)®ÎÀWü’ã¤=ÖO\fùäó€[WŒ´“öþX~V¬?«ÿîþÐ`Lei¬::v4Öß$?‹=Rþó˜•a#ÿc¤÷]8YåÝFJâ™b&'{%LCìEÀÏ¢‰Í·Cf�]Ç^$Šù/ÍùïÒfߪÞM;ÀÚ;«óÉœ… ¥°Ê�„6ù°CX�ÕV¸¥À§ð#êÆX~FðƒÚ<ç :þvC¿¯cºµyBpLvŠ£¬�Ó1ðÐF”v#ß9†
- /êö8VFë©01Óà_Kôí?Êæx�>£}úÔ#€G7ÔÑ‚\WŒp!.@ü¸îü»±bùwÉ¡+{Üoª�Õ#»Ô�PÃQÒ®nÄ«66
- cZ��çD‰¡¥â’Â(. °Ÿº�uï;n‹M}ÑÁ‹Åý?»œ‚ªžävÊtžÉxíêF»�ì²{É+È–�²ù`¢
- ×=Ÿ×" rPÏ€l˜DîV̶ß�¤¿±™•»?ã�íZ@ë¢Hÿä°…]�º[˜¥3Àö5€Ì%O¨¼ê)Þ\^„�Ñå Z;ú˜>�F÷ºtf›-IºzÓ®€ç�Œyúu�1Üu™o<å:Éoa:uqß�‚Õwòykk â‹œ‹}0?jv²«X+ÀèæÝ}V»›ïäG$sþÚŸº
- ?2ò6ùª¯†ý´YÊI5c‘$óCfýb!¯X¤*|FÏÔÖ^º$Üpº7ïpäí55§ÅÝ߶6[¿mµàjg�¹¨°®¢l>�*öñ KO&
- ±‰8÷Ü�¢:Ç°…o¿êÖkõ¢‡Kåm~™o¾Sä-*4¥E¼}P/ûÚÍ% k:¡e×"å1AéJˆ–èÂâCAXš´¹‹Š8= �LƒÅ¢>°Ü±a¦åÿ—v{ä|K.3ÆÛ×:\B¬xǤüwðºå˜bÉeb€Ï<n/ñN��ç…jN¶j�OTQMâÿòû‘ßÕ§ îå±gð�[
- ×¼1®ÏJò[H*èd÷ÿéØJê(�R¡Y}äþ¹ÈÒ˜¤c¹hC;øay«hŒ�&ŒCq;7/SG—nÉÒõy'^óûÜ9w×”[¶yËÒF`4;ëÆupX_#��6Qy'�xCØêq/öQâ€P&ÑNè§t�ºî4pÞèÁéÔ�qD÷2/عÀÌi=õµÑXû܆D£A�<Ûú½-�®>>Ö1Û¿v‰HÅ?äf¹›58Ôó†þ%Í6›$ɲÜ'p¢L^H¯âXÎbpI’VqnÖæ¿�ÞéAé8¥åK”g'i‚!Uz†áSEšªI×ßûõÞ5Ù÷ýN=ñ»ûhpÍÞVÜ?¡›(ìEÅ ÿàš½¿¾V¥³rûÍ?Þ´éÇ7ž®ýõÞüËV£Ú‹‰É¿âµ.´ãOø¹Ü;°÷•¤ Ñp¤�4ž�NéRZm.–OÔø> Mu¾�L'¬Éj5©ªâÓ`;´Mt‹AQܶM„›ïôyëVí™ë<`‘’
$m)Þyš¤Ú³ÑX„™ÛDaî:ÌáÝ�ªšq»1�JöFq³15¤ä-Þl¸è\ƒ…3‰~X¡æ-2pFÿDðe‰éÖ/ñf!¯è2®½iç:à“=Ãhýà{ü%Ü{t…^€�¶*ÄPˆˆ…ðBͽ]îÎYÓD3ÀØjd
úÓÖÔ*æw|âê¼GLϽ}ùË‘k7¸�ÇÏ=0×ä6„o¢z*ž¶âzo‚ð1~Jçw0ý0SÏÔe“Pw%¤”�#@BJB À
%Ùø+„’ ü'¸½œÀ;¤%!&©§)ðHÈq î7fÉqöH.§Žæ²ìÐÉç�!ØEÚÇŽf³ì‘,ü9Õšƒ$9” æH{~iž€Û ŸZ³ð)O|‚�!"‡üD.K‰ÒQa2Õ
- %©£š2WŒ¥É‚\ëŽ{é*™õB{7â,˜9.ø'ew U^¨ƒW¯�&Þ$»r9¼µçrcGõBôçwl¬¦òÿä’lö<üÑú¾™Ê·îSQÂã‚…ˆ�hì! i¿Ñ¨vãîÎJ
:³Y?üñ#ù•¸_Óm4²ûq[ð‡ýýËûû}×,¼EóõA{VåПºˆ‰œ®ÎP|žDöåg©?9M©ÅÇId?{¤)®ûÊ/ÂðÐ /\[ ˆ«JùÒ�ƒ¹�ë[àœf4G>ËÁÌÁQ€K ó^ Œm×â¹ †¦›O—Çù -7wê]ËÌê„ô<ÝU3jÆ�,ÄÉäˆ:“¿Y“µqÅ~ 0³™/¥m‘¬Åµ@CŠ—CÜF€q<·é’y¤xËhúŒõÄ\ôŠ¦0=—RgYìd‘(õ¼(_ð2’¸ŒØÉÊa³‡_Ä{p·M…T*¡‹0žU”T¶˜Ù!³if$ÔŸÔ(Wâ¤q¥RC:P a3=b²Ñ rK1'-»{ Íö•HèʽHý1Êá'`Ùkϯex¢$’¼.¹hŽ{܆`¤Fé¤z›EÃ0®øc5xfMÑĆä�¾}ç�ß¾Sýï•S¦¬œÂÂKÅ]Nëf'ÛpPιS§`BmmHÒv9Ä4ሄ^ìm �D $¡˜Š�,€'Ü„ „pìWÉîgØdV/L¶;–ª×MZLñõó“êµ¢H>{€,ßë�·ºÂΘ±ªã×÷Ÿì¬·Î˜QSo
ÛlÜûùsÉ¿hýùÿ?A¿ˆ2qªÓÐ`ÀÝ5 ƒ€œZ€�&*ê“X1L5:Ù6¢ë´öÏ‚+ÙÝßêO]ue·j�õƒÅ¨%?ïÛ¼&ÓØÑaW?{ï¢ËË2[þ}ÉÒW?ÎÞJÄbòÒΙ›¥kÏ-\�»Þb7‰sIì¬kf&ΛÜfê¹x~¬¿·nì™O-9÷VÚçÎ
”~cˆW"È—y)b\)„2MrW±Ëfˆ;MíóUë7¥ƒ'[¯ÍÀ�ô¹’-c/ö´.¾Ø¾”›æ¨uÙMèþlŸ&øš.Óõ9ÔÛ) GêÑÚ!Ã!W* ¸60CŠÑ„#”Üq£ÅçŠÔørqŸOÝÈKÁZOÎWqù,Æ8Ì�/Xpã�ðÏíTšÉÈ‘±g<>¤)˜‰[J8£o`
- ;úÔS\ÓSЧ¾Æö“Àá“%š†h~ðÌpÌ|J˾F~Kì=E0Nî¸QƒXßÇ©ÞÇ*çþÑç8;D7öQñÑ1ªµQCÃ%
*E‚yëy}ƒ¡ �UG?>üI`æ>Æê÷'Ê6<ž+ƒí�ÓÄÿ3IVògÕÏ®�yOŽû•ªQ$WBv®ÛH vî…¢è[ýÏ� 2ÿ+ý£�Ê'ÿø6N¸ß†<úÿúžÛÇîÉ•¶¦—
‡2”ÿSñ娚9ÿ³X†1 \•â”£ûýÌdf>ÃBŽ~¶²ÊÕÍ-ˆ”t>¦W�]Ùìp©PrœîZ[±²'žÊåÈ+¤�ÆŒâµl†9]ï8qã‚ì‚C§é!Œ¶'ë@AA¯OuÿШäª
- !?M\…JMÍÍfÇž)«ß•Ë=õÔÉw?A•N>Ï–ƒžË¼}újQ<Ç�pÇ ^Îñò(»€}¿±½½1ï„+¿“2ÇàqF²÷4R¾„´iHÄ�—îITër8ÒÐß^§™Úù!gmóä>¸Îÿ�´Î'á÷ÆÞÚ¸hÑÆEü`sÌŠo¹ãÎÚl¾ñ…Û!õ(9~í¢
‹oÐàþ%#ð)þ~ƃúj$Þ@€Õ”ˆLp½GåOa{é®Íß¿fÎìé”)°zèªØ”Y×<þõ¯ïØñõüýÛ~°ùšÏ^õŸcàÒËš·sóÐÞë潺ã·Þú�²ýÂÝ´N•RUâЛÕRÔT”Y%8ÛÀ¤òKÌs3Ãq¿d]^©QTb' œÄzx¯)îH´“�FÒ©P„mUÎZ¼jQ&œX¹ñÆ�åoŸß<0¸jÉYG¼±ŽÔzê]Š‡þÙ$8cÖÚ&ÖhäyŸÝ¼õšÍwΞ{Ëê9^˜¼æÁsfß¹åšm[våÕÀ‚“ÃÓ£!É(ZíAs�ÈÛ§ÇÎyÁBŠ¼Àü•Œú8RiÔ£Bg6ˆ{ËUm¦’tyW!bšpÇ®d
nÅ/yÌ‚áʼ@vÅÓ/©»�Ô%Çcý¹—öªŸxñEn’:üå4YÃýõ²¼,yZ-ækr¶—úcH&öÇ^È©ÏCº'È®'^T®Ç÷“5ºœîóÐÇê˜r)(Š(IèÒJ™U׌&#€ÝŒ!
+YM.ÿJï«EX^|‚ÂÂÞL–«w@´�Ú¾ìò¡ZsgßYÓæ´ºˆ…ü\ª�ÑîµxêÔŸ ²Á¿xÓ„µyºý—LïõCyo™…’<ñQÊO$)÷W�6¥m%݆®r݆Õdõ”™‡Õ½Õð’�{¡üO‰bþ�pÿ»AE܀ʌÞgÐÎÎý²ˆ¾¤§iòï‰�œ~ºA¤¼¢™òßO"mo*î!ƒÓ[TÀœŠ�òm¬dHÑT1Ó$…
- ÉPÔ�4^ÌûsfcA3·ß,ˆêXAòPŽêbâksî�Yà†‹ šyHˆhýPäÍËâ+b‚W�=}¥Óû;¿¾‚µ¨"Z&x<SySVYíÖ&=ªþ4Ÿ¼&‘è1Jä5u~�è,Ó¿¤zïeù–g^QB\/¡PÊ„%�+p‚re|Pn¥ ¤T’†cZ>?¢çï–eòžV"_[‘çQ©/…5Y�ãá|Š±àqI£ö/\§Ó9ö–Óçããªdi°ÀEBh$ª�åvÒõ ±€…ÓwOL¤ …êÐúfp�a
¦,?HógHùf2¬ˆµRbî…²L
- v >ÞUÀSo™–°^1/,šˆÄ“¢vc«°Yò GmôÀŨ�Ô~¸Am�êzªË?Ç/¦’ÿ4ÔÎ0‰�‡yj̸pák²î�¶2«öH
- «ÆeE€RßbéÅÏ/"M
7ò5u²lÂ[ŸdrC‘&YÍ�Ü&I�
- `!>pû˜;¦õåJ-�b�àÂ--.à´VäMÚÅ4>©¼Fj¿–/î5ÀºÎσ¶¯£²ƒ¢Þt5}Â>Cþ*›<'ß÷˜dµæ?,cÂø¾üïd�Gfëåü¼2Ò�0w�ã6óó˜òL¬h"ÜfõKä¢×òÿζp;ÕÇÕǿ϶PÕd¨cÿ©1¾EO‹šÑi¾%ÿö÷ÉŘ(DCäâïW¬·‰ªõVé2š„I)ˆ�TöiÃM›êµøF�TÛz¡0ëÁªµù›U¯õ Sµþ7V¯ÿ
mBW6;›nYZU¢zSÏTg>(“h……îF"âÞ½Të½·‹¤ñR]çßûLÛ¶™|¦ûLx‡[Õs,'NU|®€¯¹Eà<ñ4)«R–‹Š pß*Š¸vU#¤gÄÃ*ñg˜ò·jÉ™*=�~܃¨ìA‰SÜýÄ“ÎÍîAJ‚Hwä3@Nur®bw™°�ȀʌxÀ}[ƒ`ð7º½’‹ø¤Z§ËÊ›tPlh Õ³¦L.)NU‚}¿¥¡kqÜ'ØÝvÅéõˆFQr×·úŒ{ˤóS]óZëLùÿ(×@ã*úSfÂ^‚–+uöPe_k#Žñ•.É8éÎÉ‚%��Õ ¯,�…ª@•›£TK£¤Ñ…º§Ÿ
- t`‘ß‘ˆXÔAD;¦‚b†¤�|pßAºâ7ð}qÒ¿é2
- @Yû`Ý~¥îÁµ¶ŠˆiÔ¬K½û0jŸ÷ÒYÕ(
žøÛR„úÃÓ~^ˆ¨Ò§8ƒ>…è=ãF"šËœA[å‹ÓDqûvQœCîŠXõ|Zõ‹sO÷…þ<NǦûcêPI|žèÛÖ‰¢ú2Ö�ë Äů�Ð1…úQ|îëŒFH\[
îÏT�k˜Þ½$âÕÔ3’½ñXÓÙ—ÿ5ÿ�Ë®A…ŒqÅ_»írvÁô7óßÈ@ø�vð2Ë€Ïýi%«Êm‘ØŠ²f»—�P¶ú^{þovvyÚfVÔw4eåw³
""Zd¿[ËÏT¤CÊ"Ù›!CÌÆ›ÿåØ#^îÏê
- ÔïZ¹’�fRÌ4¿¯Ãx»�p¢VërSK\·ÙýBÃß]Q„
- ÕóóB~#”V*ØpÈx
¾ˆ^¼(ÜÒëo/`D«ïסÍ.Ðô±õEæŠOWTvõÈ·6íçÝùúM^~EyÖló¬Í/öÑ«çÀÇŠ¹lŽQ˜6M«©ŸŠq”":}H»eaãÞÀ-EYˆ"þz"ôÈ�VKF5€’‘Ê8ª/7
- tÑê�Dè€n#D*'—ÀÂÜ^I×û³˜³øµüZ}pITmdL%÷7½@¥CÞ:Fþ¢By%òž�Æêõå’ãׯKS<K»ReëÅÄ«ÝsoºkøÉ|È�r‡à^Ósºuí›~·ú–Ûïw“N·_µVêPÅ6;‹YÁ\Ì\ÆlÐm¦ñÏëI£ì"�†ˆÃRð
- 2�·Îts¨0÷ã^~’áõµ›î
- ÑÝ;ÄgELc„7¹Áãùž"û�–È÷<^‡âí¶Ù$Þg$²yª¾ˆ©s¨ÙL×´©Éä$Ö �D�> \ä/Íf.ÁÙÕä³F;ÌæÿkáPñ•ìb‡d³z7Ô�eͶ-6‹b²y¶ØÌbÀaWjnh7YôLáFû!½4ƒÀwßâssF�Cºn�h–Ì_0óû…’>á±M½Z²« °ò‡€ïnC휌¬ÄÃ*#5/OöUÑN\(3oÄ@…[7`‹Mg8xÏßg¬e;f\yñ½—|fÖ¤©Þ‘¨Û]ëi5®¨q5q&Ö>¹'ºôâóï¼áå°ÑßÙ353éükÏYê‘œß=WŸ7çâ+΋yxþIÎe<¬¾“ûÂP�Ãh±X aëêv׸‚Ó"ÆùŠcJcú›oHÌO†Cu]³L5‘®«�†ÔÒÅk““¦ðÑ–†ó¦õ„§]xóŠ¸æŠ˜~ÿ#ª;!‘ÞÛ)B58¨/P¬í
õõHšÑF#0‰°B(ôÊpì}ÑFstÒÜM|�¹ÆlçˆÉ)]tϼ&ƒÝ–™¿,ã™—nt,¶h[ÐäY4ݬ$žwQ×’µ,Ëž@‹Ñà�Ækåš`D”ƒg]rÿ£™·|êüY}ÍVq’wRC*ÔŽ9[o»ÿ©ç§×Î�ÜdðX6Žš&Í=ÿâÍ}—íß°À/*Í�\�Ë”)³ƒÉ5gOò˜l�Ó¦¯¬Ø}ÙÙ1:>OýŠYÇ�òs(•p6Ÿ‚[‚�B/tçˆ�*Ì -n:±½
<Цð�øè)Èú¬á+�Þ°~q_}ýäÅëoxt>L®¯ïƒV–
FßÈßG¼@dÎ9×Æ[<ñs/¼í®Û.<7î±ðÖsó§B²Éždï�B'·wX‚üœŽ³Î¿äü³Zéµ£üáW²ÁÕ—Ù>2²½?í2ȳ¯±÷8›ç¬žÕÓ={õìfg�csC³ÜåœÕmãå –ÛÏrâ¾õe ¾#Œ›‰E>ˆòü45µqo:áJ£Öì¼X«°^ioº“P,x‹µfµ:/y ñ¼¯n9§�VóÑ¥S§7=éºòîè’u-í\¸%•KåϦUv¶Î¼,»â³€„íÅêZ=Öv›ûâk¯¿¤NÑ*+_§.ýÚŠŸõÖž»iýšÚƒ=w
@¥æl¢m˜röô>Û�OÇÊo,VÔ²’×ëÉ�z&:'ÿ4ðÎ5¨Ó…!êÕ9èpI 0@I[ÍPU""©sÙîInv‡R>ñA¸Ž˜É9tæ$ç¨3/«š³|k£8y´iî¬�šE
û“ßøÝc8óÂE×!Qè\Û‚}%Aš�f4ì s*®A8�¦‚A³Ø΀Ü>D®�=5uw¶Öõúj³ênG
�z?2”Qª/I=î˜ÛfýHýè÷4Ånºå“]™æ¾€ˆYmðªG"³É2äPEÝH™Íf¹vZnž<š—PiA_Òq/³ŽPÉDÕ¿ð ã¨$$Ž~%NyhrÜOdM\‘-þŒmŸ(ˆä@\³º�#½„ÔêƼ“ÒNïçJŸOÔåã>a+ÿ µuJ¨*(%�¢FP„JÄW””¥Š¦½ø–ßð‘,$)�ç÷)åÿ˜ú³’ÿê}×ÿ˜
- B\–àÏ_»ïúÇþ¾w¥Vé] 0†ÑT¥OCÊQ}è¾ë5±ÐÂâ{Ho*ä™;;õè‘žÉrǨâêõMÔcå5ÜãÑ4S
- : ´ýMŒ‹îæ›7�(kY:멪¸•zÒ`ˆgp
›J†stˉý±v'²¡¦eðÒG^~äÒÁ–içD›»1šš‘Š6ºdA Ø@'N ðŠæ±³Ö<?ÓÒ’9庳b¤ý„É©´EÃ�:�Ýh²{ëáh«â0ž vÛ§˜Q~�{©"šH”ðƒßGQÔkl”<ü:Ê›^g£/ïó¹_i²«´‰ðó¿ÐÅPœ’›�¾®>N.Öô?Îf²Â…Ü1˜ób•ŽzJý¡±D ì¥V
- o@7R@6Š<Àþ%IF©Ø0êmj=
�[Ž}N‰âÒüÛŠ¤57¹ÿpò©yŒÄv4@<mÐá¿Á9TÅòp?�ÚR7ú�ú¥Š0Ò›š´ÚQÏG¸[j„¬ÐÈßÙÍziß÷·b“´ú�~ƒð/)wC?â±ï רa¥-/ŠC®n“™û.Ä•ÛHj63¨€’иŠpø‘“KrhëÏÏÂîX–êIçÆŽjß
- ¿‚oè1ÁÅ9
- ŸfÔ\Ž~Ú:-¦ÔÑ“K �4©±7BYÍö‰Ì†Žy%›DC~e“èmÀÞ@Ñ]Ñúÿ%Àrþ©ÖÙs4T® ™Åâ®ÐóÖG-âUg�õ>ÏíûH‚OpVÖBì�Â]ô{9&ÿ^6¹|Ðm’õå_PLLI7Ç’¦iÊ®õé"'T }Æãï? 4»ó¹›…|‡¦[FÇútu/Ù_y;Z”¼?Û£H†K®0W�z¤èc#¤ÙÙÐ)€Ž~.rÁŠÄ¥+ÊB‰°Š±&J°“ƒG 0ùË[ýÐäÙü‘.Ρìr·ŸO³kŽÝ;VC•‰ oX¨ úÍöKÛ�Sß³ër¶t‚åí²í„:z‚X\±úxm‹ÛJhÿ™x¸ðÐN÷ÇhÛ5¯¥Kè`…;ydp.Ec›4²XžD<-´llµÛip.»^ØâpÕ×:�
Ùu�/î»öü™.«ÅY[ïrl�¯_æ4¸šã½ÉkzÎ$~Dq…]7/T_<è�µˆ¼¥Þã4K§$ðÆ–˜ÿ ™»ð&w“«öä·
†ž©S¡¸7ÿÿµ|K‹^ü�Šø›Žâ¯7íMsMGýáùçÿ°èhÇÃw”…¹Ã㢴0]?²´˜fjaÍ5aŽi�–Цè6C¼2ôno•¤“Õf ì=ñ–)õd^Ëÿûövï qNcãÔŽ´ûþ‹l=uÙáì]?;¡fâù-EÕ~äìöáÏnÏvøÕ}5�¸Ï×%»šë¾÷ýú–ìèOÕ»³dë�¿=„Z%v¹Žè Ó³Ð
n¯K— u ÐÌ“*J¦„ê�#1äh„u1HrìÐ o»ý}ÿ”õõSZâu=¶‹îw§;¦nÏ—UØï‚Äãä•ü` FÝçïȶŸ½En?»¥þûß«k&»¢ÍÙl9 Yõúí�d«†gAâÃ8NSGáê³ÊDŸ09M‘AK{Þ€K3ÝŠ„ª�[_]’%W4zÖÛˆu9é\~åúåën3ÔÉê~ñÉzir–„ñé
Ååô¨“X3kâ`PsÄêøÜÊüâ’nÇåïÚ=mùºÁ]‹ÔƒJËks„ÍóTÓ9d™ÒõeYN`}ž¯/û]U#Æób˜;R̨“ÐÀt,¢ÚlŸh*ö¢×#JB+
- (´¡iGx\}~IÖ³F·Ýv@T÷Ëu†ÛÖ¸êJ¨Ú
- ±÷ÌÿœÃ
- �@-Lœ™¨áwäzÃY§îg—”úÓâw‰`wx-ù¿Øö´(dÙ¢]ƒ×ÉÛFÏ3_÷øX�cY’mQÔƒç�ßWæb¤-©ÐF¡�êKõ5Õd-0bƒâ¨ç�ƒÂ—Ö¨“T+æ‘_ïZ„xÜcËÿÐj*`ûûåˆ}�|xâ~¸LÇF�*ÚS*oêŸMتêAÍó–²ýîTž1pÇ7µ1?‹Rt>éó»¶R'"ú�‹ÀäÆÁEÂyÓ)oƒP�7ž”æ‚Å%«ËÀ$rÃvõ¬
QŸ¿û½eE”ÇãØç”+�½»nùzlÝåVlÝFrktÉÖ'µ¦'?R®„'ZƒCEÕI§Ky» gaÎö0þ‹ü¡^áê} pE;…õKq{ÒáT/ù?ïi"%íÆÞ1ÎÞ’ÿbñ-ÞÔ¾qÆ›Ì˵ƒÛ+ ¢Š8Æ]ÀÊrI¸Üú”Ú£V•{¬dȪ͜¹\è•AÍôÓQÐvOÄSÕõ]0.ÛêúN¨ìX9s¹Õv¡b?OE~ÚFPU}ož[YîKårÀéÖðñA¹ÃÌ“U%‡�§7D€w
ýêöˆqÔbá/í‘hÈ
íáAÙ±‘hPbQØ“JB8ÕIºä?áI%=ÅX‘tÜO¥;¹(P‘hºLìd£Ñ
S •'hÿݱŸ>|þùÿT»‘¬ÜV?Ù,O•Ýç"\�`ª7‰ÕãíÁ.‹2ÐçÝ>Îæ¹Dá²Í
�fÎÖm•g;œ�-íö„ÌCŒ'œ¥Öéu¹,»¡¥Î z—A`-ÇÙ¼¼Á$Öxvc“Ãk2·¦[x–p\cÚbüí“l΀ÝihµsµœÙivðaÛÃêM,gĨlñŠÁMžà–zÓܳ›7JvÞÔÙÀË‘V‡RWÏ‹N³•ÝäoÎ4‰(Ú-„µXB^ÒCl&Vnô±nŸ¿¾Án D4[k6ž³†›ìN�×&µº}f§“3Y¼QwÐ@$“U$(Ǫo¶:-üZG¼…#&‹Å†/…}–?ÄßN}Æ¥¼‚7íA!M´àühöøW>£æï?iX²pÊýùr›¼A–Ù¡àbþöó?uϱ›Î¹³-hñäØíëå6;»êSÿBõ#/‚µé@Ñ¿J Æéþ
- !%Q)”ÀDq:{JI^Þ‘Ë¡õPY7UGçÊ(ÂÀ¼Ÿö¡h³?Hmÿ¬ÈÑŠævREˆíHŽôçÔ=ÜN`P)QœŸ¥Žæ€G9®ÓFM‡ÖSáMG§õ@2¤E‰$Q
- µ$Çs±~ä’TkNµ"×9®Õ†8ûcêF¤ñ^ê"?+GÙ
- ^÷*¦¼gUlFVx�ªÚU™poC¨°ž.XCƵ�Š×µÍ‰×qï‚Kê[¯k[¯ãöK—(l�À;ö
ºÓ¡ínè�%^ñ�RÔj,$)§ ø·Êì1‹‚n.¿�ßG÷:CÐïfŽÓ(ßñ,˜íÐ;š„Ä´©ôR—¿Fëž_~ðÎã^øø;¼ó¥Õ«¿D¾ô;6|/jGGSSG„›G’ӎļD¬ñzbRï¤/X?½ñûŠÃíñUÚÇp14u˜$`¾ß[ßœH47õ7Iò~¥‰~Iÿrêß™sùù#èŸ6ŒÛ+‘h„ºe€Wò6@wK“̸h6, ‡1Cµ"à�‡·æ©Ú=mÎèñ�e°AòÓóŒâ–=¾àôî�@“z—ÜÐÐá² ¦sÒóls³]ô;kklµêÓr¬^"sƒ¡é�’Ü>Õ&Õ„¬-[×ß{ÅJiÒ´9[‚ݵ³È©¹-ç]±dÞ¢µ²cÒµAnµÛ¹ƒägç}ê’‡¼»6hTï–ëüÉ–´?3s�ÚÝ^kúŒLêcYˆ1ëZ²´n[÷¥ƒbÝ´¾E߆ŒçÕ¤Íw¬ºàk3Ôf™•åˆ>†þÿfMäÕD‚è…Õ ¸aåñDðé�~}&ö¬Á@¼£5�ugn¨›OÈ¢<¹'`&bÓ¬¼±-6à÷®;ƒÁX÷"‘d*²a¡wÒüÞY”¦´vÖÔt·L³ð¦Xë¬Ö¸kñU�ß©øü·aîèÔ=HR_Ã@¦£Ä+j“2—öT*‰Â£è%ìÓ/͸oƤ ¿±Óyá‡ê
£—»î›1ƒÔ9/7› þ~Æ7áýŒ´_“ÛùoÃÓêÖ+‚þ$DüÒ¯sÞIH�:çr£ ƒð ¤yiF:Ýå¸ðïäv�÷ËýÀ(Œ¿d®O":¦ omØÿÅìdM”8åÒ;¤žZ9uêÊ©üHCg\›K/*‰ŽýÔ™�g*¾-óIèÑö—±¢ˆ_ÁE¢œ‹RqîR'û[¥fõ?GÕU�½Ao‘vb A$ÿeõ]¹Õ/‡Ô¿ª£o©?|ƒÔ�ÞQâm–4™G¢Œƒ7ñG™83�Ú3+
¼74‡z*)¡$Ý‹JÀØpDµî“Núj5pÐq¾·“e�Df/�ÒÎ>ÎÛü‰è´à”%é–Ãg‡Wµø¸{…Uóë:g,ênŠ¯¸l²¿µU‘\ŸÏt™'Ö¬ñ%ÒüÑE‚«}àòÍ�íu¢úC›èꘒÍܻߺp±}UË+^b'‹�’¯«o(5gã¼VÃBÕIœ¼äOEüm>·ÑÀ½©þ€5yšzgö†}úÁ¥ÜüA”©P-øP/ú€�Þ«�ì„ò Õ6Ì)¡x5/t;1šp“1”L º9õAܳ|÷êÝÑ)ýµáåîX]m��ûókFEéH/ñ4}:¸,oLMªoò®»6]YãMó5¢Ëê0u[›ßyÒ«ˆfVêh¾˜?¸äÞE-A§_iï«�ßÝj²ñ
Ô.
- 6|Þå5’`#ÏÕZ-÷svÁfq˜ÓŸ�›íês·Íš>¢ãÚwêÿ î7C—å{ A“ú…ŠÒÖ]B¾ëÕîz,i÷H'dù„äávÚ?’`E‡•�
- üx,‡öm±¸z‡`ÍF[ïê2aõv‰hp™%(ÔÌ’öü¾Ê‚ÉýÙ5Ô¦;GÚÑŽh”í¥²³¹\Þy";|"«Ù�Ê–©�rx‚zËsèP‰HCT×v¨P$…éõly}‡iyhvMŽCù…r)Ý#Ãx®›¿-Ü.(ót%fu»ôÊ€(Û…eÁ•UU–oâ²
- ¥p´ÔqeÑË¡å•—¥sòy¸iº X–æk¥`É>£X¯@2Pø¯.
¨2ÍŒ>«n„|‘Ê,/4—£Ôþ}Âò ®ð?Aí¸&ÍJŸ†Åær§+�ðÃÉ��ñCV“]{ŽèìZÍ0�- úùA=–ä
- Fø®$ë+”Óöñ%U¸Z�y¢ÂÞ—Ž°Ù²RÕ
·Bƒº)¿÷¥ŠâwT8úÁ(áaÙûRÁΣ*-Àª—ÆÙs€r5v
êÿ!^tZ:/ÇK,'±ÂêF
9€»=ãÚæGˆ<�§¸CíÑu“"$º-¾î²F÷óS2ç(óÉF
- 0Q©Ü+X�š�ðwÈ,»]=b÷h[qžB‹QI’
þ§ú;)"ÁÅŒšÓ9ÜÒ2ãšô6Ãr?çÓ}lŠVÇ=b¸[˜µ£j¯¢4€Az”ó™Œ÷KÚkQ?TÿÂ[%“É$°K¢Qõ-¯Ñl_@l/ &;ÿ˜Éì°¨ËDrª?P_d£E1ý~ýz—â^Iº~b°÷§ÔrÜè¼e¡uŠ¼f¹P•/ÍÕº#ÜEÿ+šS\ìG‡-ØR4¨�« ‘S®óÖS®óVä¿‘;�ÎÈ*`ßG¸é*5'Çäûd™Lº
- ˜¯ÿ~¤ÚÆê à…5¯”FšÒÆhb`
- ½ê�œú³Â4€ý[b$~¿Gç£NÏAX$òÛ÷ß~ô‚}[»‘Wß}åê«_Á‹z×6múÒ&~Oñ%Þæj/árÍ&|_Sˆ�ÆÒyã<ç�-â*LÏ›ø«Û,©·JQ›z»Í¤œð«·£ÙÂÉçÑ|’V|�GVW~öË<mbl»¶©œ�ÇËÆò�B¹&Íö©Ìjš šy¹ì\r=´æñ 'ç®9á¶Häf)šÿ¨¬ÜÇÔ…rÓ w�É!;;vs©ÔB™7Ó€ž¿'òkëå*«úirµ¨ˆ÷Šbþ/¨Kû+Ô”WÄÑR™ìO �ÌÿÅh$!`‹1õ[¥r¾§¦ûŽ(›a\T™R²šòü¸"Pž?]Yã;?ÕÂÑ…ëyKRXâWòOCzó‹£êÔÜ©ÏH�jPnýâ[°¨å¿Š‚;é͇Gó“ËqÎÛZ.ÀA¥ý.*�@/¡)WQHQÕâ«ÙU…L†2^…²$,T=QÞêå�(J~ÉBI¢UP‡J�°ê=êWC@Ûï°‰8&¢~Dõ«ßW¯æäìÓk‰[½š<ÅÕ�}ô.÷"S<#Aë«>Íz ·ýê¨
- àH ¯œ†ó³¨EÉ ¤º²Yîn‘¢çH4ûr7P?99Îæß¡|O-µ·5³Š ²%ã4µ dzêO/4ùL_Pså’TÔ>¿LQ›ÄD(ú˜ÚôùJ8òÿFµÏ+)jCb
- ›MuØ2Xc8$ñt°}œ&<?¸ö9lWÿ¦~½Ò¿Í‘åÛn“å90AÁ=&W=sÇÔ¿À—œ_V‚ýéÓ}¢?køU(�m†øutEÔê*¸
- ÚK%ò
õtñÜÕZñp¶J³Ã ŽB›W�·¾P üA lµž(ZÍL�·zF íýZ²}¤®/‡è¿40”l™V ¬²‹i%L·ÿ^V`‚jpŸPäßËžÝ×5QV—ØVêk¹ÐÅzX8¹ÄÏ^s³�Å£W4U*u´ }ŽLÊã8æFþ ÿ ç~ê3·¿B›"Ió/.·èO
- =7B¹JAÓèô’§�î©¿KÒßQ-¿|—¦’ÕVw|()8¨éC™»¸ŸªÏ%Ê´¥�To×lásù7*ØÂërevðÙ¢üáì’6m«´“Ç– £â�ÖC™T¾ÉpT'Ç‘pL!èjRC4·š¸}aºöSm‰°ú[��%¨4a.ÅÑì²¹},—LŠìõBý¯ð=×:Ý�'©b¹�ë“
dmã¬û}V›š©è‰Y,êtúö;¼ÜÙ9ž¼ÂŠ›ßï� ³:\ôI5ˆ–fDAû©¢™uìIœÉôFºH2 @:2 ß!°Ô�ÌŸjõ-ÐýÉ@ÙµÀGŽûðƒ“ˆ`vKcw¡™I“lar�º%l›¤EsÛ
- ÑêrDe·ƒT¨žibš™¦·@³…„d4�¦›•ÇB’DH†¸Tœ. ]‚ÝK¶*þËÕ·sè\m«Fá:�:£”4v»ÏX
†€<¸;‹Ú»r—£þÕð%—ä²Ä6ðaꇷï½ýû¹Ü¥GÍÂàÏÎØùÇùÇѧ¬ í|°â¥g…уÁ‚�†h§�vìqtJ÷JÇÖKÇîÛêH¸^v‰Ž½œ³gpñ§.ÝÖ?뜸ËB¸ÿÞã0¸^q÷8¶|fìS[¼t—ÔåØCx£Ò”œ¹¦þîí׬˜f¯Ð¹
- é^ùFB‡
- žPi©ÐWFpRßU
- ©:̓ D‹Œ}ãÉÍÙ�v“Éïþ�ÛŸúÊ}4ÀÙzú/½ö—F<„�«P莣\‘ÈU¬'c?ÐÒ4›sJ
ä‚Êçjj>§@€«Qr¼-ÚÜÖ¤þÎU_o6ÇÕËq7õP1êŽË¤+ÎÛ¾rc6ªI
- ë\ ê(*v´2¼�4Uc(Aü Ì£9ú3öŒæ]Çz÷Øü»;0'¡=äÛÑ*,e5Õ6ª»VÔa,ÌqhÌ*ôë²P@wȬ°G²¸/ÓOÖj÷|ÌFImÇ #Pzë;J¨wÊŽ}ž < ‘úŸÀzTŽ�út‡ˆ~£`ÂȱGP%;?®5(Þ(u¨”#”ÇÈvÕŠIÈñí#9,?G�ù¡¬b4K]ýQgÔŸ]ÒE[àphʯ§‡ÛG›¡à+` ÜÄĘp ?Å@á>!Ú}"
- ÍÒ½¸Êr=ÔCÀD5ï 62¾¦ZYêèå��?à׳ÖiðËA�¨‹
- T(øEU•Ju³;"}©ØÕº#–ê‹Lˆc¨äÊéÓ—£VäòéÓWþOû›&ÙCIÔ™úÛÇu8*烞QæçaðQ^*z(¨L|JÓ�‡½^Žf©p1¿ûõ„0À4~œ�Cˆ³Ux¨Î*ršV²*�N9Ï€„׳¯Pðú„Å«sñÜp¶ˆœ_LŒ‰ŠŠòÍá3ÙZ"}ˆ&ÓrôO¿|lõêÇ~©ÝÈk¿C¾/Wj><ËüSÅxÔÀåMêbS“¯–—�úg(]½J(Z#Ÿ†x©\$OC6¿8-àf:{êƒS�ҳ蚨oý4:œÓËÜ)Ž¥ËWb¼"uÅiu·hŽŽ~½dãÊéì%û¯¯ÕB�±ûóAM
- sÍâÙWH.gvÿ%ùç4ý–ãvø+¸œ§ð=¿
- ðÕSêG‡Ï‹jWHWÀæçu>…–[ÿB{[çuûɶsÕ;la›z›iñÕÝWßÔ\z½ÆåCðäƒÛÖ|¥ž\f·«Ÿ×�te¿º&ÿ¹ß•+Býk�«è/t�¿
- ÏCM�„ /@SÃ>Tm
- ±G`vú`?þ�ª£ôþÙGÆ(Ù,zb"Õçðe¶¸üAÞ×AÞiàÿ»´š7ÐÓéQ�Á¨R<Æ"i X ¶:¸IÜ‹(a‡V¾öœúã¦Ëç§;4Réù—ó]}—Ïœì^þá«Ï1ÜvîÔµ�þÚù—7œÔÊ=Ùpù|§[Jοœeíµ{)eÜüÝü#Œƒief0ó™KðJâq²"*öF#¬(©¸GjJF�hŒ¸‡Xè#ш·âµ�£ñÝ�kš¾—5EÔR¤PÍ΋ㆠ^p C©eoÿêíe…€:•ç¯{6ÈÛ¬Íï5ÔÍ�s‘ÅÆ™8‹XÏK6×ðV[�ç=çÙ}V+�ÿhͧ×ÀßJŒ›lÑâŒZZ›5ÈßW‘‰±”;®þTýé†e«V-Û@ÚH†êIðÙë¬ÎD<Í™[Ç)Ö�ÍÀßÏÖl^bÃXeòÙNN±„¬"K]£@Œƒ×bŠ©šË?.æH÷H
- gzXaÆðÐÙ’Aîˆ}MO¦eýXÂüH§N�r ÐóÚŸW¨;ñhtñ»gttOöyu3=–Âü*פîÌåØ¿ C ÂFGsh9JîͽZ°-”k‚’]L-Õ~hÎii¡.ê49ÍQr5¦ñ½I,VÝ“ÿ…^jf”»_}Ô,“í¬Q6?Ì5åÿNVçÁÏÕ
- ÞžË�ªYÙœN›å%ezËÜqƨï>ÁZè
“NtñŠÓ1š �aÕ%þž=è yÏhÞ™««
H¸Á—ËJ�Zöš?ý h½vrœkÊÁ@åmÍY`®^insðêF\”*ö|Lœz!/?·)(“0Éâ
- MS4(šÈ—hðØ{²º™’æñ-î'×hŽæ‰ëoê7ûcCÒžÊ?‹6²âñ’²'|ubˆÕ£@´þ�Ì!³býÙ¡¡ü»Ðf{tzø…1UÒA?=Œ@œáá t%˜ä•‰ÀÌå�iuš“[
NòÈiáD±ˆGÝT@Š:Ïp<ü(õcÓXéÉÆUm�2Úϱ7z›ÚOòíM^öFÏ´YUfwGsüÁ“#‘t:Â/‰ªƒ•¶Îå~±OsÞ]µÇF×ÿÏçÝ‘¯ž(úü(^È‹Á±?Lû�$ÀSʽ…WzT>mì'_§‚údŒ®ÐÔç:¥Ä�5®Lh;¯H7ÜWgzêgÄZÆÆZb3ê{2d5�Jj¦Ä9Þc+ãù‘\vqzç²DbÙÎôb ©Æ¶�g ù"l@צ�pæQB½b�ýÛS Qí>€“+d �p²¾î%}¯L!“�™ƒ‡òçšcdwHo˜¸Ææ×p€x(Tì¾pÄèxî¿ßp#ê�:dvQ
qŸdAðQFdÜL³¦K¤mÒPRËí
¤pU?òlÃëÖ
¯ûzg°-ª‰¶…ÔjPÙî©b·ùG×aRõ¿ú&^qÅàä>uÓ8¤•p&ÃӮф
¤`íMGSŸ®¡®óÙܵao°ñã¡ÜWÜ›Z´aâÌÙŸÝ°·V5ŸÊR¿s2NX ÛqGB ¾O “ÊKÒgéôðÀÀBWþý)Sg\õÙùêžÓ¡läË÷ö]zöÀ<ß²o-_þå-ø±›ÆA£ŸKMqÓ!´Ã¦Sigyñüý¿ÄÛ°]Kû;SêÆT'�ã©ókPqÉæeêÆe›7cZT{~*‡7‹bê\H…?ðjÙµl3•�P
œïоwïT2²ðjŠY;Ö�)ºl
DËueytOTøï�Újö¡üñU¶Hí¨úœXögɬ,õ�W´ÉÏ¢^ŽÚÂu¶¡![]Øv”Fèç”|
- ã®QGá¬h`(¨# ƒR¼'5X©D§ÌQ ÊqMË6gûc'býúu³:'—ôÿ™®H(„?¸yÕµ¥ú¶Ë6£~.òe¨¬[n ¸ªŠÿ*€±U«yZsÃt 9ï‹›¸R!GÙý��·©�ù“MM$ÚxŽz€¬$]êÓ{ÐÃL<ü}ù�ç4ÞÆàJZÕõê~ÒMVŒÕ•hy× >@u�»Êí
šå…î�+³¿Æèôõ]áß2FqO8jü–Ñ¥°WCÿ»Qqíˤërw®‹.Êì�ä„«¾Þ¥\õš_´úü§ãôöyš¶\O¿nÔ)IÍKGR§êHÅ�q”¸ÜIÚÑÅ.
- d+u@Ï´õÓ ê¾k–ÙŤ}9¥êT«v6ö*x¤g¶e7?—™Ã¬Ô}õS§éÕ-ð íAUÛü‚íOMlJ
ÕpÛíժݧüîÕŸYw–Õéhœi6û\fAöZc,·rjFœTå‚ÐMj8kOë«51‹þT»¼ýqW½_ÙnéØ`•7®%³K«èÜéWÜs–d0š‚á:»Ñ`´¶OX•ÞùÒs$ã4¼?:ÿSI1¢�¢W-¾Pr}ê²£Š§9õ.Ôû& Pš™^f
- ³8(ºW¡I¢ÃÛ`¬¢`@5a}ˆzµêiþV ¾p„²PÔ½+:–£d\jÃ"=üa€j£Šðä)W§Ô$qö{ÇÚÖÍœ×p)—Vüõ®|£7hj�¬ŽÍöâ—³õ»¥Éâ$·Lëè˜Ö¡Ê9›\öúŽÚ�n[ ±¤k{lG‹‰Ä.m„m~ÇT—ÀºE‹�Ûù¡Ñb�ȶm¹`
- »—wònyæP&—:P¯LJØí–YŽúéÀŒÕ_îp™NW¨‰ž›zVÛìS׃]7ÖÕEÚd“%i¸ç™¬|ñ¾úèÙÌEÔWMÁ“™7râ
ÀÞHB¨´Ë6þ`UG¹ZˆæÎ�
ø9 N2l2ÝÛÉ…HY˜½(šÅ—ÒÔÙiwœ½Ý“[ýÞ`ªcZ¨–R;Yz=TrÒvH�þ9ëc.¡Ö²êGäŠÒº6»*pÕüÎ…�'»[â‹:ú/˜ÒªXØ¥œ´CYÑ…Mñ˜ÖtÌÐ-'º]£n,{@üðcø˜Ob¸þæþÂIÑN‡.”xÁN�¹F9ëÊë›�NÿKóß[º£ÞXÓr=ÛôéWÎmó�°Ý�°Æ¦ØY+�¾Ê?sýJõ¢Ä×gÌXµuËPý¹¯%È—V^¿Ûéè[ù‹ ··ô„ÔWˆ ¯;éúWæ
³xv±iÈ/‡×XS3±åȼ”2¬¤÷Ô©Z¾<FŽ¯=0Vó[%•R~ËŒÏx—ÓäyÑsÃÕy?§Î˜(O†q_”V-ÎøaQñ*Q1 ‹t$ŒjÔD„pRR~‡zÇ¢ìðp–"ð]Ÿgw�óÕ=¸%GV³§ÔßïŸrtøõ¾�>ÁÛf×2�Ôå/yòÉÏ?ñí»ä8ð®M@ÓQÔÎ*Ë„ÂýÈö¡¡íCäXù�k¢÷²?MzT�y?±àÕZËÃYu׳)ÿãé]Í•ßô1–-ã—þa�ÿ7jô‚~”ÍÄá
- .dãÄá
- »
–Ä'Ó·½¸š§º“VÔøz£tXKþÙ2k̹d?¢§z‚§úz¥´ÙKŒ.º>,¡¸BZ¦¿`q„—'ºk–Hèqy¢û°æ¤5¯¾j>aÇÅÅ\CÙÕ#ÊçH;#pÇø½Ð7lº4¿}”ÖIR¸7Œ„°ÞŠ0§ûœð$âì=«VÁ¿úÑö‘í#ì¸ä_.Ñvª…sð{g><cÆáÃê˹_«£ÅÐO¨ÚÝgxôçñ5&Ç?ÀÝÊÌ ';zº„ÇaÎæaØ:zÓ‘ èQìFꉢ‘®^éÂMFÑ�°³ÿ9Ûç&£A¨•�„·ÕEbŸû†Ù½\±|ã3ÝgE}"+Ê>ƒÁh!îÚA·b¹/p7¼Ðî™=Üz—Á©¾mi”%—ÍŸš3)^Ošj¼<_ãU�¶NY63dsIr£™´8E—jñ¬ßý®Uð´„*Ï
33Ï|v¾ãè;ÔÛOÆéB@ñ�ù,—ü,ŸÑ\cwd}6k.žuØkÌF9þ±'Ìä�2Ð6D]e±‘xÜG¾J³K.×½}†ñS«†$ƒ@t"š;2�É©�ê¹*¤Ž”ŒÛ4§Ü1_ƒäxõ7³ÕQ§bj´Xˆ£§ß9›„§ÚQõ½;®#Ï�{9†Ôe¼I
- š-ìå¥�br B<ÞÖ9òdpzœÜIVªûóÿQ:l„+ëséiÕ#=ÑìT¬ð¬�+R˜Ñ(ªâMÞDC$â
- ¹Êaç̱ êONgÄj1ž9˜¶›ÍÄÜgqXkè„}F«Åèðùd¢¤×ÖÒc¶ŠG“,µæå&—Ó.Øâ˜.^É·wwc�ƒ>ÀE´_]3ûžUˆ±|ãt{JÕfªçª‚u_ù.º\�ÿºþ*êö²W•=ÌÅ}ÔlNçÕ�o+^®ïßVÌ£îé‘ vØP£>~†‚s¢¦T¶jWz~_¶¤o‡gSÐ}-üDñTd‚Ý-TÀAaÈêYfµ²˜Ç3,PATcm²Ú
Õ¼4gã¸}‚½•màE$BŽ„w¢�Ū8Ü>«¬9�–ä‘ì¸JWâ�©°O¥õ/9ÿPªJCÉXA{,™@c,tEJ¯ËTÈj½¾9ì�•8QÊñ•Óõ&¨ äHŸ þPÁl~K%Æžù1€¾Ñ»¹
ü-èeÈDzxN�›»Xuz�’Ý.9½ä}‰MÂc�&œ:¯ê”Z5¿ãÓ™8·ø%ÕµÕ½øm³˜¼ïomõCBö:ÐäÖá‡l´ï˜8™ÎßÄí¤~óËܦ¢E²¿j•T§ßÁí¤YH˜Yá»vønƒV^IN]]ÂŽåCXkg#ÅscÀSûˆB’$‰Ã�=’$�ªkø}cG¹&ö÷/¨ßzç»ß}çä¿çÊƵ_îÑv6<�7¸½ý´IVGG™�úg*lôŸ\RXS²T‹‹®)ÙšEî¤Ê%Y uôóÁ~Q~>X¤¸ˆÏÐ…±Ö`9ÓW‚“k*‡@_ÕŠpM¸]0¦*ƒ�%ãaÀ“3XíŒ�K¹Mü|ô{†£FÔ”»ƒú‘
- ì·¾d7[Õnò¦Õlÿ’ͬÆD‘üÜÌÏ÷@¤Úmõ˜ÈÏñ8‹Ÿ›°e ¯cżô#�gH›ÐÄdd@~.ŠjÌlÃlÉ›�äeRcxîEÌä�(( Íí™K�ž™Ïm¼êïGëX”A7¾×Sõ·µ@[lÚ×.%ÈëæÕ£nMDsˆ]n€_Qî·• Ú5Ài?zûÔGüTèG3²¦T�@e èi´�×,ˆƒ°r¸�
- O2<°Ðè•éÒl+³À°/,Á–%‰¹m²à ¼ÓÛšXØn›|–Eš›¶÷]˜Žˆ¢l�ÙôœžÆÏ[m<’|#¹z×+„5ˆ¢ 7&\5Sô-˜{þüAEß×^Ù¸ì¬t“KäÂËÎßçMñ©^rq]‚îFmÞC%2þ„vJÒð)W-Î}OM"`Õ9l²+ì=…%"«çë£óTò˜'8ÂzH3QÒ�ßûÑ©ùYìP~V¶‘زèNiì¼ÍÜ7ŽÕðÄÛ›¿ ëÎþ?w1ê×�xÚc`d```dòÍ?ÌÏoó•AžeP„áBYñtý?ðÿÖ;¬"@.H�cèxÚc`d``ùß
- &ÿ]a½Ã�A‹Š�_xÚ}S½JAžÕS<‘`ŒÚÙ‹«‹€Úù�Âb)6âˆ�>@DÈÄ"èX\o“ !‡Žßìι{Çé,_¾Ùoçgg“˜gÚ ˜¹#J†VYp>uC4Ó&*Ù<=$Œìð¾g9ÓW@.0Ÿ¢qêò‡ú- õñüêñÛ;Æ:pt"H�Uåeèܾ5äÕçüVg(÷[Aãx9ÏÝ!ÖÞ´÷EMŸ�êß—ï4þN†&Óž×ðwj³tþ™³ÔžeσèLpŒ>†w‘ï†õ>GàÙpfz`Í|´Þâü^ªaÙżø>äŒÇð¶)Ço©o¥²‚MÜg+RŠm¹RqÑí,÷«‹RJ¹à1—ÔÕX‰TªäN7t‹{I–E—\îFÿë8ãU
ºÉÌmbÍù:f—N±&’ýj9ÌY�xÚc``ЂÂM/^0úá�K˜Ø˜”˜ê˜Ú˜Ö0=avcÎcîa>ÂÂÁbĒIJˆåkë.¶"¶/ì
- ìIì§8ä8’8öqšq¶pnã¼Ç¥ÁåÃ5…ë·w÷)ž^-Þ8Þ
||||[ø5ø—ñ?˜ °JPK°Lp›—�…P�Ða)áá"Z"WDmDWˆžc3KÛ öO<H|™“„žD–Ä4‰
$þIjHfHN‘<"yKò�”™T†Ô©oÒqÒ[dŒd¦È<’•‘u‘Í‘�"»Gö™œž\™Üù$ùK
- n
- û�Ëw(9(MSڡ̧¬¤l¡\¥|Hù�
- “Š�JœÊ4•Gª&ª ª{ÔDÔêÔž©¨ïQÿ¡a¢Q ±Fs�æ-5-/m.í*��]:otet;t¿èiè¥é-Ò»¡Ï§ï¦_§¿Iÿ‡��A‹Á%C!ÃÃu†/ŒTŒâŒfÝ3V2¶3Î0Þf"a’`²Âä’©Žé<Ófvf5fwÌ¥ÌýÌ'™_±°p²h³8aÉeéeÙayÆJÆ*Çj–Õ=ëÖwl$llÙü°5²}cge×cwÅ^Ã>Ï~•ý/‡‡cŽLŽuNN+œÞ9K8;9—9/p>å"à’à²Îå›k”ë676··-nßÜÍÜËÜ·¹óó0òðóÈòhó8ã)äiáçÙâ¹Ê‹ÉKÏ+�Ÿsª9�����§�������������@�.����xÚ’½NAÇÿw ‘h‘„Âê
- /‡"‚TÆDñ#J$Š–ròqr|è!'‰Oá3ØØXøFÁÞ§°0þwY� …1Þfg;73;3»�Âx†ñE0C€q=ç®Ëæq£XÇ4î°‹GÅA$ñ©x×ZBñ8Úƒâ DµwÅ!ò‡âIÌéaÅSä¸âùXñ¢úw¯°ôÛ.¿0«?ù¾o–ÝN³âØ�ºgÚ�ÖÑ@\ÂA´`àžsbˆ“
- ük`§¨sÝ¡}›,ì«0©YƒËaDðä®ÈµÈµMyFËMváYd°ÅS÷±‡í2Œå¢Äé0~™>´/ãŠqJŒžG
- iòô<ýÒ#cýŒ´0ë·C~G²�ÿ²ƒ9eeKv«¯Ð²[Ú·{&V(Ó¨1j•1…M‰Zqr�7±,gKÜ¥þXåè›õå0éíò–›ÌÛQY{Ô
- ªý›MžY˜¹Ð¶z=ÉË×a°:[jEÝ¢Ÿ ¬²BZìZÿ=nôüs¸`Í+oÍýÔÌ����xÚmÕU”SgFá샧BÝ]óýÉ9Iê$uw÷-J;m©»»Pwwwwwwww˜lîšµ²Þ•‹³ó]<3)e¥®×¿7—Ré^�üÎèVêVê_@÷Ò$zГ^ô¦ÓЗ~ôg�Ä`†0mé[¦czf`(3233³2³3s2s3ó2ó³�²³‹²‹³e‚D…*95ê4X’¥XšeX–åXž†1œ4i±+²+³
- «²«³k²k³ë²ë³²³ ›²›³[²[³
Û²Û3’QŒfvd;1–qŒgg&°»ÒÉnìÎLdOöboöa_öcà@â`áPãpŽàHŽâhŽáXŽãxNàDNâdNa§r§sgrgsçrçsrs —r—sWrWs
×r×s7r7s·r·swrws÷r÷ó�òó�ò�óOòOóÏòÏó/ò/ó
- ¯ò¯óoòoóïòïóòó ŸòŸó_ò_ó
ßòßó?ò?ó¿ò¿óòóÿf¥Œ,˺eݳYϬWÖ;ë“M“õÍúeý³ÙÀlP68Òs䘉ãGE{R¯Î±£ËåŽò”MåòÔ
7¹·êænáÖܺÛp;Ú›ZíÍ[Ý›�Ƶ?ѵ•Öµykx×~yÑj?\3V+wEš×ô¸¦Ç5=ªéQM�jzTÓ£šå(»vÂN؉ªk/ì…½°ö’½d/ÙKö’½d/ÙKö’½d¯b¯b¯b¯b¯b¯b¯b¯b¯b¯b¯j¯j¯j¯j¯j¯j¯j¯j¯j¯j/·—ÛËíåör{¹½Ü^n/·—Û+ìv
- ;…�ÂNa§°SØ)ìÔìÔ¼«f¯f¯f¯f¯f¯f¯f¯f¯n¯n¯n¯n¯n¯n¯n¯n¯n¯n¯a¯a¯a¯a¯a¯a¯a¯Ñî…îC÷¡ûhÿQNÞÜ-Ü©ÏÕÝö¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôú݇îC÷¡ûÐ}è>tºÝ‡îC÷¡ûÐ}öôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôúý‡þCÿ¡ÿÐè?ôú�©îvíNjÿHMÞp“[q«nî®Ïë?é?é?é?é?é?é?é>é>é=é<é<é<é<é<é:é:é:é:é:é:é:U¦>ï÷ë:é:é:é:é:é:é:é:ù=é;é;é;é;é;é;é;é;é;é;é;é;µ}·êVÏÎhåS¦èèø·ªÙo����TPÃ��ŸN��AM���������������������LP����������������������',������������������(�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s����R�e�g�u�l�a�r���x�V�e�r�s�i�o�n� �1�.�0�0�9�;�P�S� �0�0�1�.�0�0�9�;�h�o�t�c�o�n�v� �1�.�0�.�7�0�;�m�a�k�e�o�t�f�.�l�i�b�2�.�5�.�5�8�3�2�9���8�G�L�Y�P�H�I�C�O�N�S� �H�a�l�f�l�i�n�g�s� �R�e�g�u�l�a�r�����BSGP�����������������©Ü�M�M�FîÍéŒÏÒÙ£(uÊŒ<0DãB/X
ïNïˆ�CCê^ÇrmR2skÉËPJ"5+–gléW*iÕW–/Eî‘œÓ4#¬Ô£U¦~²f‰‘UDÜĹ÷ˆ«±àJ·1á/!þþ/žºÊsª7’“kŠ•”(ºˆ¡hNøé8o�íd$yqŽ¹1³âÖ9ƒ@-‰‚HG’ôµS"øFjôØ 6C3”¤&ž‡ÁøªW51ÁÓÜ×BŸ¯aËêQaR†U/õ¶{*¿‚Ëï�‚=–@dôøh$¡1ÉTÛ—nc+c’ÞA¡§¼ •ZÉ€¤@QÑca‡ÕÞl÷�2>ÊK°Èmó' “ËC‡HMĬfB‰X�,¾YòÂp¨e¢�
- î�¸UøØ*Ò”zÿ
- m‚ËËiO1nEÆ.›„ä
hx!aC
- XTÚV¢Å©Â‹–—éR¥š%¥|Iä Hð�ÅÕPƒ5"Åb’N²µ=âøƒrÙ/_åRŒ›”™_à%Ò„�uzÉéÒ˜Ö5’2Ä¡ÒãPÚ)žÔþžÆÃFƒ7S‹q„FÀ{náia�·¸@DÐsˆ;š}9⬥?ź‘§ÂR{¦Tkí;޵ǜ×U\NžZø›Q-»^Ôs�7òf0˜ÊÆS3AÜ
_n��`W7Pp˜»ôài«í³!ðgØ/à_p»ÁÒZ€-=Ã×¥~WZ#/á4 KF�`´ »ŒzßÒ0Û| D‚ѵ�ì�‚&däI‰´ŽüÃ�Á;·Mì”{'¶om†”m¢I!wi9|H:§Û§À»ç÷Êþ¾{û~ö¹ýqº¸©Oøåôî© ú›,˜ ‚L]&„J0ñ•Ù9/í9&ÌYøè“°{;÷ú'À3`’e�@vH„yDZ$º�„3�ˈDx28ƒW€ Cx5xw‚B`£$C$'ãÊEl…y Õh¿ëÔ€
DJ
- $(p�½îQA”A܉A–@'Ç$
hpÊ0ÎV0 `�ºs¾ªeÒ$É4$"t2=f´˜4„A„{Tk–0|rH¤öÄУï`L&±´sÔh¦]”§A<£¡‹²`R´'£•!ƒ‹�1N¦;£_Št3Û# âòëúØêVãê*veÑF`E O$Ž{)ÙW=p:®ÞÖF`Š¾2ÆÄ2Ú“CëÁŒÒ^×.Êć˜¡ø–øGþ<<?¢éç~zк¢©å¥>û.pçNe2ê‹ïÖ´ºÞ+YìsÛl:ÂÃ˼ïµÜ«u5©¦ÞîÐtÀu•^8¾Ì6èóÈ„TmyðQÉ%þu~ôòš%~1rÒ˜aýwßš^�ù_©Z£�Z�a¢ƒ²0!Ùè�¡·úNö`¥.Ž
uqÀ±çêYB¥\™¨ó…„ÊᨀÔê…[eð‹îîþ:@ êJ'EÛ�,¯3ubj@�p¨ÁÆäð´f¨Éßóîµ·eW9( óºå ´Þ…‰³æ=‹l”G¦à7gj âSƒM6Æ° ô0ƒÿ9ò§–OË‘¨�üí�l§®B¼aªÝ�ò¯ ƒ<¦çžÇBÕ™(VRAp¡fù^°ú¯+g9 qÓݹ�ŠMÆt]»Øª�pëE�•r@]‡@ó©V�ŸkV¥
- uêädé^ÑX �å–—R@?EÕöY2ô¨˜Éï]#àǼš4ÀJÞåKöÁäÖ'ÃÁ¾d²âPC|mãmånä#¾‚$+48u'…�çe&û¿€[n[LáÈù’ž±%{BCDÚL:^! ‹‚ÓbÆ™:&Éÿˆî‚g3“-3Ðøu´èÇæÐð¹ƒb
iLZéÚ‚W‚FSÉäIdÍñ¡6.‘k5Pî„l7ž7üUz’T:NýN¡‘—.ý"€ªåü)‰Å—ì’['ß|U"Aƒ€³—‚I•�Ûv©wÐÛØpë™ít¹dk‚ˆž9Ø›Šå««Í9�n¨D‹mq¹—7I|6›Kbcƒ]¶Mô“©²ÄÎ÷—è¶B�A�€BøȪ�_ôJºTÙüq Ð 6@—§„¸F�—‡ƒžhd`G®�Tëñ·:MÅ7'à…L,éIh—ÆFP »Ê~j�½ŠŒíĬ$¡„ Ä3™hAÝä��’-SŒ^ûÚ†�…Ðä-%qeÏìë~ÀÆQq«§¬ln"i¾ž&�‘æÑQe?FlKï¨"úAsÀ(Ý3Y;"¡LžÚÔe€tå'ÄRz<MW!¬ßSŠ3$rZ:ˆ’b¥-^Ç„/ƒ$Qý·qõJB'WdáGAO³¨Êã`.Í( ßž±o¤3öB0øÌÊÉ‘ø1å Ìp(®Äí(*–oõ^ÉǪk“†J`vñŒâ±[‘‹¡C|9œ=ðÙåé#„œAöÂQ˜‰ã# ¢òÉ7;.]L:î¿Äϸc®ç€ÐdŸÂêi€ˆEsr¯¡�âó6?æ}¯†eÇ@H-š�b»…ÑÆ–C¶1;®”™è.
�v.±É¾$`T‘ùöÂüù JW¼ÄÜÙ%BËZ¯I04ÄÙøÆ^:kU,èöC‰^êWVF©ÿ¥Ú`£F¬b‘¾(ñOÙÊO©È2<Åß@ÔX™u‘��ðg~ÖÉ‘ÎW št‘&1\ô1§LŒ:φ�„"‡!‘P¶Æ¢Ãè3/ØþÔ^¤øÇ°�q�ˆw`IA¼äD
- ˜)°q£CÐfâ€ÑO“× ±é0õ2Y29®3N°‰fãpà„¨‰é\�˜CÐÃÆahö÷&°6åpË`âÚ�z³g‚B
- hRf�ž];]Ì#pw_t(›pqê¿�Ù·,ÏÎíbdk‹R‰ÕBŽËèÚT?Ùì2¡Œ—À2¯cåF„y2˜™%¬ÍÏCÏnÁ9 ÐŒ…0›ñÜ÷9E&#×l’T__ÀSлg¶)eh/Ú·+÷#:FGot÷k5Gbr;CbË´Ü:ÄÊÒ#½¼Éœ &�Õã�QC ñwÿ’…™mxlN‡«qˆª€éPÇ´)�Í�3f-v5K‰¸¨hý·0A×›¢§Ðj»nSp¬ ÿœ^HªÐG·FŠÀfÝ�¾ó‚HŽ "%[Ñ»‰ßÍ @�Ûèp ÉaÁ¦Î±�ì$$�œÍ‚Å*âÂ_Ü\Àï@>Mœª10¨{=æ�÷)ž€³K %�$C
- Âø‘9ŠMðö¼ë¼4c ê€EotjÍÂV§GDŽ)lñ8“¯,˜\wÀ¥à!�%$¿×3tÉ TBz’žÒ´ iUJÒÝ[¢Çxgd„Brï$Å!eqˆ�’"J>࣠)\�~¡‚Š‰3�(^
â R€8#>Öb›äH€âG'7_fÓ«cκtD�oAA߃†(q™B<ý`Ç`VˆüøéΫ”©Ö˜Â*úbÞÏu‹P4v@—+•Ê.�’îQåÔ¥$V‚¡•í@C0
- íR¢ÓÜ�P[‘z:X¦H#eäÁòs >?úEÈWO>@IØ$|s¬žiâ
- ES¥²)0AŒ?£9•ab,¶�@KšñÌ©o&îþüˆ¬Q´%¬ÏžLu+›
- Â+�H|ÌÆ�?´NKÌ4ŒÆ’ÓCnPtè³
'OTòœÒ.j5àÄ´8ÈÜv¶wÖœ�«I¥&•+ß`¼ŠyS��caO[#¡g°§Q§œ€¸Údª[îK½I矗`ôÄŒLPýÓ¸ #°Áœ½ ©)2Ò7aTƒäëi@c\Þ�‘îÂâÈ0nêC»pòß–é�‹4͵Ž�xö*ñËÐR”zÕYâ„b‡ÀúÛT[\úkU™vìHʈÜq’p঄IÂíIëÅ—)‹bB
X”PºN´…štzí 2
Iæ==¤ ¦³ˆý¨Ã;}†bŠœàqþÓjiÞ†§a²#" ¬Ÿ>1¼‚�°1äA›£p1ÖíÝP‚§OÇèO—ux÷Qôù°¹Î
- Fϲ(úhÝ„©O'MDxÊLíK$ȵœhæ&
ù‹¦Ð�1ŒïÄ4››Si ÜãrHJ’P°t�DMË;rMã‚+”ö—
- *–àŸíØ—5u2$ªf3’K ß<ùP²LçrÑc‹I)�˜Öå^ëda>
- %Åàѳb(Ÿú–@,‘2f,~"¦7ÛR;®EÑŽ;¬”HXå(ú¹Ÿ4Š2ZäÝ'�TªÛ¿ö‹�„”½2J+ÿ^!#oŽ„›”Y~4Ø-׃òGW*ð!ßÃA•0&8€fä{`¼½øàWö=’DP8’'ÿ= ÖR¦ g©}ôiP>“Ê#¹Ëå¹4ÃÒEÐBRY®Æ^4eó�ý‚§N8¸�V,[B‹†Ä¨îD#�X†ø]²,Öèâ«LBsNC>
+¢íoÍê^x¨ì§
- ÷•�újCì.4ÀYa‰_{e¦A2=rŽðØ+�‰´Ö9PO»A!!
- ×}´YÊPJe„—çGnš±%xü�1¬/}RgHØšaŽ^3-Š© ‹5
- ¶|‹qS§ÐðaWK{1al`IÀ1Ó™ÆQé¾ëf_yyCZ)ÄL3X±]W6@DM™Tø<.„«uëGÎKŒì8ÙDsôÚбWæ‘r…Ý\ß7Z\ÕËÿòVÓ"I¦¢ŒõS¡§®dµ‰>CŽ¦ÈU�j�ßÉežÉÈÓD ®3MÇtWcP﯆–òÓ‰6#3Qךnቩ…°J\º¡Ã7ž#磱`Ø€Këë¤ ©×lV6&ÓTŽ’ Þ~îÚl.’�¾¡ <˜˜BP
- £*´!zRZÄäeÑ™»¾¾Ù·T±#£CéLH±¬ÈªWÅ)ÚD›†÷“p®YU#ÉÊ51{WJ€Ž¤4^Äf³Ì¼Z°öÌÑy6–Ó‘T2™dÎ4H=êB„Ҋɬ}œ&݃êÂ,aPçv+:2æ~òÁ*0¼°¢ˆd¦É“ÂõÖƒd ‚øáË!"A+‰r��Hn¡ÇàsAäÁÈÚ—U
€ýø¤b H“ÛN6þ$.ÐlÀ};½@£¡âiKà \¬Ò‚:v‰QEÇ�:,|ýªQ Y0|Ç%Ö@í° Ü�äqcçÓÑdqh¯«è«¹vÜCÍGV†°©¸¯-(шm…’1»®âq89KF–Öä
- "2±ò}RrzóŽ,j^¥ÀqË\…Ý–#pƒ»+õ`flš³½�â:k´t–5E„OaIÃJ¬P
@psE™j1ä4;6öô/aHÎ.¼ÏÓ°T�X¤p“L‹¸ÄL8¤½Fç„Üši¨lí1–²YØŠ8É
%�!/Áù{¨ÒÅñ 霋ÙåÆXœ€ºbˆ•½…�NÉÂxp»ºäPWê½ÛíèÄcI9g²*þº¿î�ƒ¹œ%:Ö»LËÞuŠ‚CAOÂŒ™%¬/Å“´(Y¢³^ï? Þã�&I'ˆÈuh[x‹´–Qô$ÇzҵŽø‚ ß³ž�‚(=V×€Ÿê
¾mðÅU)»ílÎ Î’¾Ìiœ•d㦈™¨½~f¦ùjGíµÖR{D€%>®¥�@”…”6‚¥¤1‚œ`Æ!Î ` ņ¶wYó§‰Õà�k/a�0A†«Â¹ŸÔ�´ÊYh²¯—µòˆdìæxš‘k:fšƒÿ漣<ÕØÙWL4�`8IYMBÁSlcäÖßÈà™-»EÒ‚'ÎÚŒÅ:,ÿD¬°�çÑÙøÆ©84Ó)~÷ÿ2·j€Ÿ–Ç i¶·B(Lãµ|"a©š¦¯4,¦b8§”¥Ô“i 94¦åÔŒÒjWщ°©6*�ÐTð£†c4gŠÌ“¢×UMÉb³RÇE�²þª‹ò…C5‘Æ)jäÈ´ ‘1�6pbÃëÛÆŽH÷§ªFxòˆñ¹¿—¯«Ä£�%4âòQÙÄC‰Êˆ§Å $9Ò:ÅM>òEÖÝaÜÆo«�ÌŸ^ÂØ<IwÞ�Ygq�7s[†ð’ð -yÐ1ع5†äaÄãMKš×�æRBÇY€†óFq}¹âç±ô8ïÀ²*ÈNtå�'.Yb„”›¤ÍðZÍûvÅK
- (Ê]&ÉœŠ( Õ™¥ý2¯:0Õ
€äo¤Î�Ñ…PKiBH4Uð¹X,Ž¢�[ˆð$
- 0mX±å»Ø´�‚ ò¥fë5ð0± VR
©8ê%ÙÑñÊÞ§§Dt°ÃUŒ‘s`ô·-BP�ÈzôP”së°Á¦vIë¶8z-¥t1DiB
- ÒÝ"˶ÜÈYTJ ƒÄ.š?Ô0Ç7à€jL¢ÃNžú[2ÿtÈÂĮ̎†�æ�ù#þ6?E×»†”Œ×¡®ˆ:ÉžÎY;ƒç¬A&q…êSØIRÈ)Éss
- 9*xÒß0Bj)mìáH§A¾öhyÐ�hòMm¤&4ÅŠ…4€€‡ÜÚg¸ŸVæ&tYóÚ¦ÏOCS0³Y²ô‚d7Mv�Nïj)wë÷AÉ(¬âo
"Í¢É[¦Ö
- E`›”þŠë7ez¸Ä�†�»Þ-·QÀ]¦6Û+BcaÍ@^IÂ:²Ò»´Þþ¾=ƒ—šˆsSŸäÏncÇùÓ 6
‚ÍçOã¡B„4½ˆŸç L¥¨ÀGpãB‰q/<•zAãÓCÁ¥» €ÔA~¹ÉxÐ06rih£Íh¤IìØ·O‚N,:oÇÁkìçÚöÅ/ó¸{H°,ÛzЂgÚfÈ»z—¯Ó΀5ý�Fõ²TrÀn/ät``l†Á™*H6jT¡tG/xøË@P@(„ÄIèp
Òeº!ùê`wv,:Aì‘œ¹N£ 4}09zÇqC�ìä$r�ìüM`Y†Q”’ øMää•«³÷Ä(|éB!í>¢ÁØ>«O pwj A*@›�ªŸJäC[h&3�üëB QbýÏ©8…:ñ“%f~�v/‹lâSäÐèÒ0ÝèþÐð0a“·¶"<TX§@Ç&°ôà°Jg€
3Ï•ì¤éHFÕÐoï–éI8«¡{þ¸:YTèób(ˆ°Pëjþ<za{¸…wX¥oa•04 ž3ƒÌlÊøGȶN’à0>ŽBæ8(f úuGoÇšÈgyñÅ×t£_Ãy~ÀÍ”Ž
- Ã%ä…°ûm�†L
- èà!I$äX<T+Ê3œdqó
- DöMåÔtÌõ2|fEV([â]‘Ndb�œD3Sp'RŸG¬m—K¢›<œT�äÙ°�}½5iÜ·µÊ¹—àÌp¸ˆ«¿#Ä&jF
ôZµ'”®’2ï%y9¡Q#2ñH]w¬Aˆ}Ævf§âØжè%ú³éòöX¡Óš·ì)”X_ S0åt£(±¤“-Ôî€â°“jHpÔ÷Ó–vœï/—Îô詵 ,9®w<`øE“ˆ
- íìF°agAÐÙ“ Љt©´)lœe
- ›øÌ;é¶ö$9ºŸ×ñ{æCù¨‰�œú()ªÇ?¯ñžÃpƒ¿¼IFã’ø¬‡‹¬¦—žb3”Òñl[):˜drr]Ÿ?†ŸÕ–˜ö?¸ÉBdÀiå¶DÕåÖÅõñ7ýühJ¤Ñ:
- ½ÀU%næ3aƬJ.Ì>t0ƒÏ€~ÀeŒPˆzËÍ]¢Uìg
Ð�=_±?ñºµº.j#+`li‘¡ BŠñâM5›Ò º¿Å‘GÒpŒž7«a
- †Ö’�%Y[UG9æ™òÆÓ@\bDêÐY…’{‰�{¤ðED0®—
- Ö$� Qø+FvCð`ݨì3°ýQ¥ “î±E\àÐuC9ÍáÃ![€$êlïßõšú�êù6ßD¨oÙDgÀGˆ*+�X!¸�%#‚C€q‘?é8ZUB)U@o¢ÏpgÞ©¶ZØq…¡¡É8ŽÊ9øžÇ|ucácAÑœ¶é°•W;©@á" €Ø>P‚Óïåh_™�Ç9}.6€„�V/ÇO:à3´}Ž¡ZS±µœ{:ØÚ~’óþœÅyŠk¦cO6;OÎBá=—bVñ. R¿k‹
- oñ¤ÿ^±GV=áØ }ïoI"+
ô
- ]w‡�×FªÁzÏ·ä®ö`<“Éõ²30�ûh÷ŒÅ3]êRfú—¿859s¼`K…M€¤8ñË
- X»Uqˆ<‰˜¥\˜“ÆZOàssè¿M’·&j&Ï
ÄÖ÷ .§%Ÿ ÒPÊBL~^äßÿùGˆËˆ‘3páD‡¬•:í¸×£Z¿£Á¹¨©<\ñ«Ç i¯¨ÛW̆¨ÈÂ"(”ƒ:áÅâz‹©–X–~ê�Î0PG]8�ª¬ƒŒˆRQMNT�¦qfÝW~!Ý0”R%Õ‘�0ðxvGFy/Fø-›Ïwúu‚/ôî*ë+’Æ \õÂ8@ˆ6¢«Âþ©´‹»c<´àLƒ;c�[šû÷ŠÛÙºnr ŸQS'o£QuòT®{qÒ��_œÍ¿�ƒƒSdª»A*ð:mò8Yuz2ÿPB«
ìHh`l´k’pèÿLLh
- cEb6eÛ��Ò‹ ?!„™>|*=V�ü»Kî@žë“rx‘0ÓG`%ryr[6êŠY3Œ7ŒÅ‡f*—*n•à%9™ÚdfÃè1ó1Þ¢Ú�^'Ìý]‰š–
RÍßèq�ÜÔ.Øê÷�,œö•‰Ó^%„¯lÂÚâ
ã½eØØ#wWÂÑsó56!Ù=âå!q[ö°ÄØÃ�%ÈÔ®]ó‹5^:€½m¨5©)?�Vb|šuÀ7f“ºìw°œæÄð,:çYeæ†R%”
- ò[À›�î
Éo gæF«AzµFP¥›òŸÀÔx›¶î{Ïíöd‚xÃÖwÃ8Ž˜–Ù”{{L> ®‚d¬�2Cä�L‘º¨äLÞ,œLÜè,„ò(àmSìø›ÃØåå$=Ñ|%�Ö�luè& Ä…”83ãÚ
- N¢XåŠxë\VnõÍïžJ[)I›êwŒÄ/Ñé¹»²Ú²| GźÙØY×Áð÷DHµ˜½*›Sýª�îè¤æ’p6®0Óc�J2ã@ÅW´%Ѧcï¼_^Ó$Ñç#*:G§®æ6Ž¡ïn>ÍD;úù¥�~¤`9ëhXB ñUŽ«JB_вˆ˜ùˈî%ªý’´w'¹$³èv|#T<68çªKM¶Ï‘-Ù5U+¾¶¡'íB
- ËĪN…‘øŽbJìÃOv'Èì|‹„+*MŒ¼k(dˆ
}›CÚ˱@ ³Áq°³¹&ùaR%}´
- Ë!ÖVЃ‘s3w2¦ŽÑa²2²ÿŽawHæz¡/��Q0ðF¦ Ù]~;ž¥Ã¤�ËÖ NDùP
- mü˜K3xÞŠke_™£
ñóþS¯!�¡V&=²²ª²ºvç_PÀ�L9؃Y£¡i¿
- §NUÓ_¶¬¯)–ƒ�J6Ý9‘f*ÊðS ± �1�7ÚF|¸BR$É·y,Ʊ.¿ÀÕ&=uqsáó¡ODÅòB›ÈôR„=çÙɳ—eøؽɇàB®¬ä¬ÖH¡®ˆ
- ª2lu'�h7^#ÿS…)£Xi2..P�e¡/@FÕKÉ‘$é](Ø%à|–2ÉðY1pC�±8tÁùIøã11N//+\»“p¥jÔÄïôd€”Îá�WÊmé›ÃI=ß½·ÓY“Zx¡ÔMЉPý8²“1/JG«õÄ^U ,PÈd1O®ó^¬yßpq”l¿�£2hÝÑ$øjvñø‹þªÌõžIšö%‡Š¨§áèÔ]VæÎÖ
- .�'[+WU8Á[Žå†Dê’³è,ß»¾-=[ÀåÙÂO
- wÿƒ ¿Eê)å3±ø¬äó¿J&¥dïقݶR¡¬—S–\.° •5J$I�&ó‘Ýoª·Hȳ~› l‡½Îz>€
- Ux/õHñÐu;š?Gt®{?à³;óT¡ŒªH äLþ|Fú8á†ð²}ˆ¡{ú˜p:ß2tì͆<L¤CA`²¼ÓʘÆâÇë“�§„+' ‰—‰‚¹ªoR0D?AûClIþç¯Z1¬¶›F?j᧴ùõä{^�œEµdGIœµT°º¡&#eJ}ÖÄÉ£_m¦Ü�i’³ÐA3÷K["ošCÙTJEßž4Ëc$ô„jÝ�bYËnathY�„`YG�Èãei‚µ¨ñ(…aº#ps¼W�ò±Âi-1òÇÑb™«,ÊŽTécmªåbhv9jhÜô3«tè4Î@zöK±±æꙆfÑjÄ–Å\$5Pü…!¼hR¶“$Pé
- M“Ñš`’³ÿªÀCôC^%2Ù]uOs•‡LTx“íÝp¦Y€Ü!›UÆœ{°Í'�Ð’á¤ÏyLð +Ž°lÈJé‹8ª�Êß)@öw„$F5t4ÕÛ¾$Ã,£²34aTþ˜&‰†ÕÝ„¨UiõÚ+¿äì-಑-›ç,®ð{!/\ÅÂüÏ‚ŸÂŸ±'&¿S¬Å�™Á0xkÀYÿ‘Å0I¶)«'Ýöíâ~¿Ö ´ê«•jƒõ#±m!–-TQ`•‹‰=¶=œKRÔèÕ,.is¡gI&jf‰-IÍ(ÿª~²Ž³o¨‹,èiž€©å‚Œt&Ú\í�èØ`Íž¹¹éÒ•,äY†çGÜ‘uÁ I(~[Á!2=ÊÍýâø¸“¤hÙåˆ&I™¤ê{8~4œŒ
- ðj(*��aA…TîRþ?bÚ0„I“³Kë¾Pÿ
- ¸¬ž€M‹û^c³œ´Yf3Œâ-®¹J¸óºc±÷rø;þružêGuAÁT1?Q‚‰à8DŠpy‚y†+‘Òcž¦ìŠ@6!Ë[oËÄÔf£×Zp�×âɲè`$ÆQõÈ!†²O‚ á4«Š»|�¬ÇqiùŠL^·Ø_Ç€M+žÆ¾Qb²¹#7ÕƒØìX
5=žÚqQ¿çî¬!¼iëçùm~•‡ù÷Å÷ÔÜ÷‡u…Ý¢êçÓÜ r(48zrŒY;ã*1ÃyNkÖ$9jÖôÊip+ˆq] æ°gèi™f”ÑîùÒ¦f…Ô¥×¾ ¨¤×»‘>a·Ëѧp6ÑÏíÔû·¶øè5Y"LÚD“Œù.Šr¼ØV“ß‘²ßS_
ºÚÊkþÏ]»n&úH�¸z§~¦9‘æ
- ¦p
$§4Ù‚”�'¢{º& ¸«ÿËM\ŸÎ°éч¨®!ìq®i�à ÏÄ(.hš'ËB±T²Ÿ|ž{I„6cLò¡.¹ž£ë¹�iI¾ê«¿\!à;§àg`1âᾕ˜j%C ¹o�3*60÷·EŒ˜ØŽž]tä‰.×-%0
Y‰KÇ_nft] ·*VFCÆtJ’°ÄTÔ+¤\WZ�8áòÄâ×gFвàÙ^
- Þžf�¶ 5šI=¶×ù#6ö.@õ2zÒÃ;Wš`ÿB/Ä™QøŠgí°ühŠjyJ�Ó°€N²AX¤3ªÝ,õ¤›�Kä6è’ë6�Ú²ØM0®T@ Ž…O{¡£˜4kj£|"¬ftÑŸ”Û„Uü‚<-üÞa†®Õæ5b�ú)í^R±°8™„ÎÁž:†§il�¾ÀKaÇ6@µæ”Ã!ÀÍÃ] buvÎ�$ ‡oUÇÂœ�~:.…Lût–èêe—ü Ç€¢JξP
- l$S[z–�~Rq39é’ºô¶9ëQïË/�m"•%ʤ‰¯†¼7Ÿš Ãî5MKLŸé‘§"Iß�G„ èXTÞŽXL¿FðݧV
j‘p^¡/MÃgÁÛ»{¶¹»wô
- ì*øº€ž9ÿð—ÊO¾Êˆ<Ë"aôÁþ÷Aáîïˆq¿»¢†.M—�2@möë‡p¿^Ú'“wß•möÇkxO8ü$[ó«&Áü|Y‚Zyý`2_|%r—“/åJ?¡QùÃṈl‰3ÞÎßK¡E$–wÿvCËh£ûa@÷U€1©Mø¾%0?1*¥–$GÓZÓ{!|ÇÊ¿À$ÃßÛ•Â-òÙªEv;�‹Í“:佋Ÿ`BlÏ˸ 쌧Çɬ›oQÝ0&‹•ûþñ,†F?¡ýÆä„^�s,‡c“™ÁhË•ÿ$ÃEücl0åºw`ýâ�º¹Åˆ©@/€r^l˜8cT·3™�Ük@›ÜúJÂÝ”´uPÐ&ʪNÉódùJjT�K¸ªi ·é*u§»éX–{t“j~½É¡}ùñi\BÈKenâ‹Èµ|NëÖêšu�’ï#Ã]@lõCZ$iPæa½ã¸©t04y20ü
sØÖªâ,AuÆ!QÒØBäÏ–ö–^ìˆ@VsÉ‘€‚\ÞZßaã7©ì¾‰©¸âш³»6-Tïr±ÀäU˜�àu“Œ~ë°1HÂJ¨(<αŽ‚ò½�Ó³bRÔ–¸qiÏé梬J?íeÿG�Á
§*jVħ"áØã†:Y);�-Fådô!ðH£»ÙG~´•u¦x cb�6m•¼ø)&;ñ0‡ÏdU?‡8ÅX~ïŸ1Ñ2�šÛ¼¨t€ˆI�Øxè5ÄÀ{(ëz„ê
- Ü'¿ûÿ[ ŃkŽèZÐ…ØìéÍi,ðÅb™1̇‹¢Íá`º±(ôªm�Há�Nðìüe‰K¤°ßÔ/
- [à´(õö#Qô—GdÊuÎT©½^øm³¢¿%ù†ŒÅ!(˜7Kgé…P=èhøÏ•ákÉ�U+ŒÂÆ.[Òe¯‹Ïм³CÁ�ž�ÿå"GDÿΨ£›<*<ÖÏþéh«)¤` A˜U@O]hýlÅf2”…!HžçÏF#�QBÂé=uȾ9f´h€ó;"R„¥Ú�’KÜ3-‚(G )¼P±áø¡¨ž¦²T],7ÁecÞ
- ë F4hHÓs³73á–Ÿ ¡²âÛ`àºR–¡Tíwfͳ;6Bó>Ř
9&ÈâÛÑÚÜ‚Î?’—÷ø)À\¨Œ€�<&Ŏ™ð5 LÃJu¥@YžÝÝ,�냲ھÛ_wÂ0˜^é17ñððöìpÞ»‡*>D”8㟘ü°_)$UźóÊR´!jOFôÖ>{ˆÐ’‘»t,¯-…bPµ,m`D"/ŸzðAâ
͔إêßQZGÕ&U]�xejxæåLwvõ~²œ=)@ØB¯Ö6Ê?!;53/ps@tƒOZS7©”§Ø™®’nŸØlxèûîÿZ?áƒZù—j
a²–{ýû6—¥ÿL4›Š«1Ÿ2¹´ù¯‹Q‡iÜý&Ö¥lƒˆá½Åì]o= 7Äļ ofüЖürMEV@ƒâHõ¦èòû/èýaD¥Ù¦ëH•ƒ®®lK5)ÂŒZ OE´œ˜„3Á¦IG©'г;îD'¶zl(‘ ÷�EŸÏÑ$�Š.Ùœð-WR'\w+)Âw3æ꺾ù¸ @Û%RÔ)ÿ.ò~Š9;]ô.šg+)Ø%È�ökÕÎÀÒ‰³¨^ÒöN€W·>b1z:s†¨oD
- K�ö²ºÂ2w[|>9â®vWMFâ¯uÞ`¹ëÍax‡chÕ«õU·�`*ʆeû]O V'6ý‡ÀƒxÔd?¼H]_rõA»£+zÀdF›¯H ÄÊ‹<¤…Ç´£ÕÆkUsFzÀºòÏaHÖÇ9-³œ��˜ƒgv‚b‹=ÓëL/žE»)°Ä.˜½x9j%Bã) $—ŒéAËB¢�æì ƒÛŸt b.bÒAE¨žZ�RböH(‘£õJÿyaãˆÒ9Wj0f¤ßF'›°Xàz¾Ãï$DQ6´ëžqƒØ` oÊÐ i=�áÁ{#4¤©FYHù@ØJÐ3
3i~‘tYТÙhkH‡PÏñ×÷ý17ÓàॆYÜD—"Üp—Ħ;'³16€Æf—pu‹ ô¾>þF›oDÅQi¨náÌ’�-Ïç@P#äš«‡ ¦h“j Þ‚ˆÅ€f´¶C– –�ƒ7°”T5HVXÉpíöÉklÄŒ³®]™ÚyXrÆ)?ͺÓBNJšBƒ÷øä½#Ë›9e”�&&»_0•Ó=®špZ�É6§ªh¤Ù)ð
Ì—ƒa bÀŒí=(p)‡âÙåí¬;Š.N•,“ÃWí^*hÔºŠC—îm}E™7�iõà‡6Á‚Ã÷aËIívͲxpƒ*Ac#4‚ÿýûŒ³Ç Nö&ð`)®Ä‰ˆ£H£We›ƒy7jl¡ï°�oÝEh_n3 ‹jp?ª4èp2WÀE'kT_ã
&£°!È–jVl˜HíÓ»_kÉšáÈâöʳùaYùŒ ¡ sÎ@ä[…G"ÊÓbYÕLÛÜ«X¦ªi�
ÕC�˜q8ñ&úz��VaY{èÆ#I@µ§�2˜Žmó!ôdŒ[1 …AàÆ¢šÿnKèðòÕÆe×�²å/>ßdƒm†uX:xÊ·\„âpòN‘ûý©l�+ƒH+cÇtSǶ‚æCÀ±[íà~3ŒÍeÀ}6° �\³,ÎñÉ„˜×|¤Yòݧçø˜§v]¬'û|¿žŸë&í–ìMô2° dõ¬�dsàx-((76”©aX›½m=ÕîÓŠ¿ãQˆ—<$ªª�€üóQ†˜„º\�“
- ÔªqiéH阇¬‹‰i'i¤”$�"£{S*V�wF‹“/°t<ìÊÁáQ`Ê’Z¸š+ðpr)›(¹.jµé¸«Iük5õ <ä´Ê†±Ë®ÉÖ, kO‘‡œDTˆÊJ&^7º£‡ÄªQ�þ¤ËÏvße
- &žZ�Ø’
^4úÆ^s°ñD+`WHµ™®�bì6ÙÄ©˜ ¸®ÈL�˜W{ZZ ¦@°ämqáûv¦É·(DÁ\+Ôlåéû0*¥V¥ß‡°VmÕŠ§æhÆ�æØ/S`|³^\<-™„©Ã6ë¸2©N3�‚"
ToŸóŒlräÅe ‚!õÅH2‹pƒA Ö›¨ ‡ÞÃÏ{›È¼þ/£òŸÑ�çœudU2*2ò"c«Ì"p…${©€y�,饋ö&\àm¾&º`Ð|x ¦p…ˆCªÒw#ÂÉûW�9DIiñÑ–Cˆ�›Ksï–ç‡�S¶“ã3ï,¶‘–þM›’;j¨þBë§4š›P›2ÙÙiµîïf¶®�É¿íÁbA]a¢idíÂðŠ¨†"Äò×i!aQhÔCNO½±žŠï‚õYí
- “xF$Äøg—9ž¥‘Z`W«°…VBâg¸± ìÚ#j\Ë‚—¨€eùGñû[³.à¾]‹ª0º~X{2›D©„?Šø"óŠ3ÄBáj,ÀK~Æ�b#„0¬É’L˜kcÍ(6 ¸
- ±aüE7λ�/ÕŽ¯%� ü±œ·ï àÉÄ¡Rë^JûëÅCÏ�Z+71XÛ´ÐUO,Á„öá}#�-”�eÙ¤ 4ö3Å‚ðítÃ8§™Z7†Îià¬Ê<:iÑ?Ft‹Fk–CW'˜êf0i<âXdj—ùŒ”0ÛW#i‹‹š–eCÏ
- zI7ˆÎB°s·¬˜.Kƒ *ë�ÝV‘°�«dÿ‡ŸD�ljö@ì«ï%
- ©Üˆ�å�
ÎZˆÄsÝï®�sh̸%‡^ß
- ýèøÍ÷@8†ò§¤øÎ? Nº8gÔGøgr¨X°€Sƒ» üä•
Ap‘³º4‡z*ö¹4á�Ýà§,ùÄt4GÙnÔè÷‘¼õdSå>fî”Q–CòÏWUZ{SÙ;N�xå½Ê}°ÇH&º¼*�9׸¯q‹šU1 Êóa `(M-aÈG}Õn¶Ì½è¢Ú0 –¼pÊÔÇmcnñŽ
òð‚ɘÀ_ú\±ül¼ÞÛàþ»}Î È�Þ9÷FávžHþkƒJZüNO å´mZ�áÁQžíÒ¤ aSûëfú�
- )QC+2
- d’˜¡[¯ý» ÌïÁõH"t*Þ
Ác*bÏÆÚ¢÷¯q°¨,µ™óã#S˜Ÿ#¢äu›'Ò¬õ:4©as¥©¾CDM�F§|ɸm©_Ã1L]öáY˜Ê\À§ý*¤XœŠ>tú–¯¸Ìg‹§ØD‰Ÿ£Šøèd@&[°)8ÃÎ;<œ{óÊ8<–È+VG\°H˜®¦^�¯a—‹a�eÝ-4”úsÚJÔA \à�hM[‚\`ð“¼#¿pD5Z97g;²÷BWâmÎä‰qTXX‘%0¹�vºžã†ù&ù·]E¹Û4]ûFŸIJä¤ù–œ„&ÝSŽ_¦îƒ4ÈR‰0 ¯¥Dü+Ëme¹Ô¨Y ƒg÷ÐOøñ+M{”03Ïv�'Í…f…ÁÅt¯á�è :;ôØ±Ê Nô¦nà\Ç”^Ü,)1Þlãá’aBïZZÚ„[•à ¸� ûZSÒÒä¼UYhÜ߆ÏÊw€õ‹šS¸\®/¤*?zQЋÿ`�X4ïg¹ríÛ[§ŠCWæÛGû.§Y„ì0Q|ûRÔƒ‚E�[w¾¦î„yƒ)¸áï‘,шï$ËNK@c/b
- -#Z¯I
¹G$Æ—¯™‹tmçÊH#êð)X£wPZAD|¢S
oýf�ŠõT¤€ÝHÚë)¸ÎäÓçÇ>ªM1 b
7ᰅɆS‹uÐÃq×
- ö·öjK4[sð„‡ •—×xL ›Ö¼Ç¢©ë]5ú!M!A¾dƧN Ë><«:Ç»Z(°8�†ø�)e…„ß
»¥™†/™WØÈÀ|
ý°bªØéˆú<é÷œƒ®T?%à ²:@±äÔ,-àø€ecMPð8u¤m°VÐg�Œ9Héö6®Ëç‹}¾=³5�ƒ�—AbÒÄŽæýÏì°�¬Î™ÀV:’�…_ leɹß
- ÏÊî–•vý`Í0Žä!$`GÁéA"I;$ß^?ú�®Ší‰Ke O¢ Í÷³N(Õ½çö“YyÊ5Bç¡w¸ÐV¹%ˆju;)lFµoaåìË›7�óxéÿ’Ú¸Ø4-‰É%ë� †ð$ÏÖ¹/zskǘ(sh>»ÁDD©ÅƒÉt¥TÄ7örurÀœ¸0ÉÒ¢ `Ü´h5
5�Œ¦Éä¶�“Sá}¸ÑÝÈÿÒ4hrva¼éléc!ZjB]�¹Ž¦©ÎxâD¯¶ÿb–Tx�zYS‚ß6_ö)ƒÊo°Ôp>˜#�@P¢SÓ*ýbÜS\qÆ‹xñYfQ><"ó·²ã¢
Y6‘ÅòIE�r_7ñˆÒ°VÔHÃ!�³ÅIçrŒELçŽ6ž!N»�öq"'’d “aþqMvºÅ‹A‚%íõºº¾ ñv³í½Žn<Eб‰;�Ã,Úw®ß2pO%¬r’‡X“Hö`˜uI#™/šK¹Åò;‰56‡ßLL.œMI8ÔqÁ¤4U‘närÉ¡"s9¦(ûÜ@=¬ò}N¢¤)?S™ú‚….úr½0L3¯m7VÂýK HG°/®yQ¾Ãé2û/Ww«F)±Áãd)s•¬Fë7|óŽÆºvQÌ´ËAÝIz`€\‰†¸¾åÜ–Ðä„›<>ð.;šëA/Ïç°ô2ʲ‰œa8D$ÿGWv…#Ì�û
9®kÅÅ'ü‰ËoØŸœo€@âýÌ (]gkí+}/ (nq‡ºìK(f¢ÍÖÝƟиžpüøÌ2ÔÈ3Y°ãÝéw�²pDþdG´q2$ÌÉ}‘KÓ¯A"öE&N‚tg'NeýsÕó!Юð4qìœo}ì¿�¥Sµµë,oÕjr/sœTþMT—&öÐðQf\12¡h'&ctN¦ú'TÅx7¼�]2û ;GÍ Ê…ë¢ã|Tª++:%/ †è¦ûŠ³ÿ1T‘ÅúÏ“óË€Ÿ<ÔñÌ4ÂÓÔùŠÀÍ”×ÿ“Ë— É,0~áò�!¡W‹O©à'‰ áÍ:sñuÈÆÊÒ¦Ù†ù�(´^ﮎµ¥œÂ)˜ø7èØ�fÁ€Ñml¥òÒ¹î1Å«tÜÒZƒèhÀ
ÊL0§£·–6ÒX"JÒ‚í
- Œˆ4§9ØÑ �Ö©Bé}ƒÞÔ`è`‘¥®ð„Ó’ç #¦JÞïnéäôÑ_‘F H|š¡$OÈKÎú=¡Å“i1÷¡¦7Œ”o-HËq¡ªûp[É«%%:ˆä€Éˆi3Û ú„G C—�LL‰4ŠSÐ:ždBòj|‰ˆpYÓöSþD�P>¶pÓv�Þ²5KLeè{t0®ò‘yÇEND$à*�;z»5šŠN’áBIóÙgnŒ€.NÉ|׶àÑnÐ�”RÈaS¤Z×ÂJcH² mÍÑXøÜÊße�k;_6È,yÊÂb”�0#¦Z„¸A
e|w‚ÔÌG
U½1l¸ËLDØ7ÄV£q’Ýt[xuÝE”QULˆïðPB�lZSh–’.áé1Q0UìÙ±8R„i�úp;¦ñ{óôH#–GON!?ë£èt>©Q |pÊk¤�Ûó¨q!çgT,öÕjÇÐ2ÃÈsÇ�4툊t”jä·nÆ›/IÉO˜E!Ë‹nFõ›4¨†·ˆM&Ô1„’—¾…xÓ$§ew+v™SðË
- bm]e%8²ä�PÌÂ
- !úï³�ŒsÂó_06£ò)Â�Q´2JB†êØý„[t9®–ƒ'”§³Ôœ,§¢Ìô[½f�Æג¶]˜ÂBŠBÃ@š¦îr&B„s|•Qš
°§™×g¨íOCˆž1‡ÜJ Dç<ÌÏâUÿ‡²Î¼Ó(o©!³�h¦�ÜK½Hüê 0q›ˆ’§AÑVˆ¼'p´fÌy"Q
- O…Û2ÇZ»¾ŸqÂà½#d"›@bQ»,®“Âw)îPÍ\b`xŠß�Oþ)Þ¢d¼MC€$[Ho¤�WÞ¦Ñva4{äDZ`52íýº‡³5;‚…X°ÿao�K†;˜6“%ÁR(À‚ŒÓÆÑ…x9Š8À2rãDc÷¥@ÙˆŒæ¾É¤îF×<†d(ÈAN#F�I·ž›zmEþ‰»F=©±…Æšå•S‚€f
- 4Ê8§<'´„íj�êŽô-ª˜Ú'ǘ<ÒTbñ2Ýv€EÀt¸¿q¡Ò3qODd_íÐ{`/œhhê‚öÌ`Â’9_ü1hAY|/ùë«Þ·Uê-Í•ºÐÄAÞ”Õo(ñËê"“$r؆TÌ×PR;§.¸-w>&LJøiC`A£^±—Ó#‰€ÄX8—t—öâH?€dÁ¿aÃÄ–TSTÚa¨HŸ0@ÒîŠðóU)ˆ£æï^e}Jb7%×Ü”%:›ÓÆ¿@�—¯MŽ+ñ»y”sqŽ�ª¡ëLÌÒýø¿áÊYª00Ô÷GüD¡ >Ä©êAWˆ¶ð2�IÛ:ÄÙF žÈÇš3ãŸ2<k½}[{ç¼*™"A�z0…Î:@ÞÀ¢1¨A:�µðçŠíܤhÖXÃî£Cûñ““£9èˆ8ÈËèµÔE„ùòÉÅUÖØeu)[?©mt-5Ër”~J’ݪÓV2li)áÕž<¸Ò³?ò(D†¦î;)’�o (¤˜ÊXI¿I$¦–’ñ$ª)À'i(Àª*’¦_µŸE K´ª*½4C‹kàýÏ÷wkOIð˜FfQ$8γ�;(0+.½9²ÃÂ9uÝ$áÂ0öì�t‘170‰ìfȦ
Ç’ûaOµ=T,èm;°€ôn™‘�¥ø˸ÅýΧ—cí<9ð0ú<êÆð
_½=g ÀQV&ÞÅB±Ü€Á%fÒ3`5ÍF�ݶ–~‰§`6dÉ.ê2`?ÎÀé]„}ìO´0^A¿K´N\Qç(I {ÉÆŒïp[ꜪÒ4Å$6x§P&Õ :²'�7u„ÇêáßÔ æ§´&éõŸRó®®dÀ'Ä
Í´#{*Wøµàâl ·DÆQ§ÕÌŽ.*ZEîÿ
šcƒÝé7µ¼|4€ã€Õ‚or\�*öí
- HX¥³Ø'È#k?WRÀ‡‘mP�xÙ$Ù“]�©¯�
ׄFKÁ ~È4;
[ÒŠh2ÇAÌɉf‰�¨<P
dg¶é’÷)—!b#Z¥?0o´Ôá[¯¯E hXÜ$ö¶…ÓêSþí’ؾeþˆ½NÛì$�ò–æð“Œ=Ÿ8Ш"^ ‡VÙcFDÔïx˜Á§ýÑRX³CõX“ážÎ.:Fƒ¿q,†„æ1)b¡Bº1
ò§²+¡Qž)ò_ÆOyE£�³
- ôŸü‰¾º¹nTp „š}1`î�#
- ×£d-½Ö¥#„Oñáâ„štïÈ:5ЋŸ/<b0°'m�oqI£ßÁBâŒFW‰ü.‘\k¯cø5ߦ-v›T[Í‚àô�°êà± ôü›-4:dÝ—u”†[ 8:P금ª£ªBT˜ûµUÌËçÆQð ,F24‚lÀEO÷?ªDþk£œ{
å±1¸k6)Rä̘GIÉË6§Yp^UÁ!Aâ@é{xg�#^/ ‚×E‰Tz°ÇÄ’Ê»@:FŽ'\�Q6ƒt,æÔpT!iõ
- N!¦dGÁBáÄ^
- ó$@yn�ˆ_uœUüºCÒàíK¨_K62˜ìB|
- ^‡�¢‚T²mr½Ž¡LDgÊ¿Ëf›)!-îúú�ÓoŠ¤�ch»}Éí@oà[ràE] �ë/iÚWJ8ÁOgbêÓ�FÖe‚(/”ÂEÎ çyOñ™LB�œ]IkTÚ‰aÌàbVŽÌÕ
- ÏÎ
- 2¼¹“™Ö�%Íb»ŠÂjúªÔg†Œ'‚Àñ‡2…-6µÿ˜Düí»¢òJZe' ·oBi2üû+]x;S¾Pσ¥{£{Ju¤m²„f^L
- S0Ñ’ÍÄ~oÇÇëæü-ë÷ÐS¸Ecô*€vl��pOmó�@�öv -SãÿD;<UÈC¯Y×à¾îûÖnA)¤pxOý@¥iåLŠ�Â7—E`K\‡J`ô9ÛU$ü pº'°Õ� Ý…ŒÓ3Áv
+�“nœ˜%§lSŠ}܉AÅìNj0*±¦è׳48ØÏÎi%чŠ”Ò8ÑãP5Âc‰Œ#ÅèT$F»?$²—€L~ªIžQN_òMC
- Tn‰LŠ`)e|È�‹!dšäóÚòìÜ‘[ìsû‘D”\Vo�‚gFûœŽG(1¨ ÆÌOJB™É�JÛFR%pá�Ž�3NðP CéSêóÒë@pM”�ÍÝvA�f,- +®HƒFt»,Ÿ¶‡ówfA¨€�©²‹æŽ)yÁóî^Ƹ}ÈNÅ+s8Z‚$j‡NF³ñ×âi#ÚlÈÖâh�–´ÿP!9ge]ði˨öhòïç€öf“v'ôƒláð!êèynÛOÛä]3ã�i†™Ñ�ÀFÍ ›€ÈPkcœ\çˆ
- `çõÞ@Þ92Ä
z¿µXãú;]Û©áiª%[5‹”€àp¬8Q c‹ÈådÛð\ÑLo±ä;jPÚ/Šønýg�¢ó[åÒqBÒQP;ö˜,V“eÙçÐ3ÜPr´'Ø·õ4Yÿ©† 8»÷[%Íö¦c“
- ^ˆ`Õ÷° š‹PjL>Ê íq€÷À”:6S•—ŽÑ]KÎÏ" ¥®g[¦� åÏ‘H“˜âB¬5ÈVEqÛLJŒ•X{C¼ˆ¹§B½ÅÙÒ!¥P«Iá�q9»øLlx–®Êª7Ò>Ö¤–Û]@Õ!@9H”!ªíäÈpÀÉ™Õ$ â?ÞÕ)›«�ÜŽ¨l°/"±”ÀÌ�–¯+“@`}}:\÷•¯Ð 8•zQgS£¿+ò’¤¿Á’C„£}€R:ŸõHþUF\¡Xþ’göÀ/âë€AZ%c1ÕwlET�–wX ZNh¥ …Äyf2DÆ €Ã¸‰&v®L“qî4Æ7•ñ§ûÊzúð\�iJyÀèJ-k¯NÄ3½ ë £-¼s‘ÑJ5‰—)ÙV0™N0ÝdÚ\Ó›d0d-©ãEÚ[mf£\£UmÁx²ÒÒC«R<(`ªÑ•æƒp4^!�hÔQè�`¢ù�!l“ ~Æ™ì:J‡É ñlüW±þ€9˸ÌZXB=ëÈl)`jžªeVJ³àU€³†G!®sØç1Ô?Ƽ3„¨ÃŠ.³}bIaÙê6àÊ•
œt?èÀ€ÞSxZJ'Ãp
- ië,¦.ˆ�ñ¬�ØR2T`5�˜-R
- BxræWHöJP°e#Bb‰|“¯”-±þ�¡�ì‹[²„ ÆäPÂâý…¤¨Eh‹±³Â‹(5Sœ¢•fÕräÃ/]Ë°ÑIÆŠ
ÌÖd”ÞE#ú¢O®Sú3—9Ó»]¸º³€e‚¿Û®Õɹ.9_Œbêe§æ¾MŒ´�9b#e�©(’¦-ˆ 0�§Ò×Ra±àÆ„9ùº–ˆ"þ‰±þýýU,áÂ%ú~¾XèÜ€ö—”ëz€Û½{'6[@„t[W%ýÑ*.d'vR {”ÒðhŠ¦!ÞAed’CªE}»x=E[|ïB$7J¡* B-á�,=k7”[_¶ê-ÐIô–¢«€’‡J5eÖ̶Ĵ{
Èí( ´†;�WMw§`«°€Ë~pÜA °z 8‡îfæ))âŒâÂ(Þü@ ©ÄªÙ……Ù<áî…ä.a%N òìné@bzÇÈÑÀµ¿>À�ëô%…‡€T*?lgb¿döÈ<‚ĵãúÀw9Na¬Å¼8;<^*%�›yÒ:tD¥Ò•Z<@ü‰0ª¨«ä‚q4±äÐíl\
–†1†îÉŸÓ�`/ž$IJ Ò“sN)¼;:A;’)$ו
- °Ww¢y%KrÞIv\b¶V™£\nd{ÀÞôÈ6t»�v�í×/~¢�ü*OÖí
- 7U>£8ûr‚AC<ºjéŠEâ¢-jçØ牷¨üxsî)��ÌD¢›–1¼ÃŒ/ÏÊq“p**̸À$Ù‘�,Ûá
ƒ³BõȼpÄúk MhpˆKê7ÆUè¤Ã]ðøáh&„-ž$ˆéŽ»�¯”“Yê�£;àqËé6w•zÝ÷ÖWûîË„ÖA¦h²ìDœ‘^RöÞÉ"Æs5�fýüîw
ˆ¿ä+çQ&’/9È‚–œ¸wNbÇëéü��ãü°Øz{åØ•ÓþYÅ>
- ]NEÚÁ±c,ßž#BFý:0ÍØ/-EȾÆÂŒÇ׃ëF\êŒôäI§{tìäA»Z‰C™ORÃuk¥iú”ô)…ytkd�N¸&›v§A±™ˆP{ÍÖîôËP'šó’>ÈêàxàƆ`.Üä%,;:Ô¿Ù:Ž©«¿íaFñ§oTQ«}v#ôìš×£‘öÚQkèÆ'ÝsÄÔÓÖØ÷~…µÞÍz5hMÄQÊ’áY>C…èÊ�™�„è¾i·ÌU± ÓNF#J0uŒÎCðäð8k“!
- f«éì§v¹{Eñ/ÏëæIKIEË>ºp·yd†Ìe
- ʾ”=zô†:@7ÖJà÷ijÌ|ÆÆ5g8ÀîxÅ3çO±Œªþ€ÄÜÜ
- þ3€H1‹ó±Ø„F. y´fz´ìWIMñÙƒÆj[�.wæ%„i?Ò†UÂè©f|}@+[8•k7Cx¤˜S�…íEOÞ¯p $ä—üáç¾Qæ»+™Ê:¸<á]�¶¸Kâ3�‹T-y²ÂÍ[NÑÖz´µ„;y³Š¤-HZþªY^¡Ô.¥M�*Ô'h8ÒíA….°Nï2r‰œLBœ7:Or�’©}‘C‰SËšS9äJq#ì£WI}*8ËD!ˆ¸# g#Y�>8`•
- ìÐ’Âñ?a…�2H,^ñãÄ'ƒ�ï?¸ÿ�^¸ˆæ§nƒhãOÆ’¿i<ѪæÝYa2É+™üÌ6a°F±âa<Ì!„Û0¬‰2½]�c:ïe¼K¤¬X˜X˜[UgéO¯u5iÔyPcVÙTºž5RIúŸA6òOÔ¸i
¤ýCŽ\‡ñ…—ãQZ�M„DÄƃÓÚ�ÏB!X–Ä:ôÐã\!Ç^Á…"{¡E Vax$P \$³DBBTÞÓFtèŸ~™Ã{O‡�¼
w�ïøž5a#ø`�«=�g�€Ð�°Yý2>‡±MG¯-Gk�èªÛ1T¾b¦ü…L
- ¹`*Ù€«V¬X
- Þ*¥xªe§֊�Z*c`ªVÁSÕb¥ºÅJUŠ’ªÐ*6 TK@¨zqPÄâ¶ÉÅh“ŠÇg†Ì*ß”U§(ªöQU4‚§9L’
- cMÆ*�ŒT»©R!R,B£È…E°Šˆ ¾*C|TzøôpðôFèô@èô4èô*àôà÷õ±î±í…°–†Ø¬á±Xób°€L€.™�T2�y`�®ÀUpbàåÀë�
- �ª�T�, �%@`äÀè€��# �?@�t€�¤øGLˆëÅž�SÀ)öžÃ¿ z“ÿtϲFy׎� �14�Lh�ŒÐ�ဃ�f�™�°ÈeÀ(.)pK€@\âà—�X¸e@�Tb v•h˜DÀÅ&ù0-I�bD‰ d@�ZD1¤@‘�DàyÀ¸ó€Ñ§�CN|
9Ü4æØÓš#NclÂÀ°;�¸,
�`c‹XâÀ³@�(„�2$0�"@- �˜$è�B@‰�<$�Ð�ÁÀø8p7C�¦€àbè(�@¥
- PA@…�F�¸0�Àõ�t‰üœÞ‹äGéÔOR—‰éIJâIïTñyS�ÍMW52\TÆoRå¥KV•0ÈŽ¬à»‚Œ(
- - $²€’š€”
¤!6¦„¢wˆêH¢©†£ùú�Gù O r~àe~/à]þ·àV~/àP~7 Szï Kú— Fv`;ö¯`9vÑ#
- J¤Ü§BÍN‚,�ä×ÎÅÓ²'°��`��¡'â�‚`\LTþðÙApBs�)r…!Õ
- â(
- Òi‚`<?xml version="1.0" standalone="no"?>
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
- <svg xmlns="http://www.w3.org/2000/svg">
- <metadata></metadata>
- <defs>
- <font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
- <font-face units-per-em="1200" ascent="960" descent="-240" />
- <missing-glyph horiz-adv-x="500" />
- <glyph horiz-adv-x="0" />
- <glyph horiz-adv-x="400" />
- <glyph unicode=" " />
- <glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
- <glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode=" " />
- <glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
- <glyph unicode=" " horiz-adv-x="650" />
- <glyph unicode=" " horiz-adv-x="1300" />
- <glyph unicode=" " horiz-adv-x="650" />
- <glyph unicode=" " horiz-adv-x="1300" />
- <glyph unicode=" " horiz-adv-x="433" />
- <glyph unicode=" " horiz-adv-x="325" />
- <glyph unicode=" " horiz-adv-x="216" />
- <glyph unicode=" " horiz-adv-x="216" />
- <glyph unicode=" " horiz-adv-x="162" />
- <glyph unicode=" " horiz-adv-x="260" />
- <glyph unicode=" " horiz-adv-x="72" />
- <glyph unicode=" " horiz-adv-x="260" />
- <glyph unicode=" " horiz-adv-x="325" />
- <glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
- <glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
- <glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
- <glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
- <glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
- <glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
- <glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
- <glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
- <glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
- <glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
- <glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
- <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
- <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
- <glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
- <glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
- <glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
- <glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
- <glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
- <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
- <glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
- <glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
- <glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
- <glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
- <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
- <glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
- <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
- <glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
- <glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
- <glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
- <glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
- <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
- <glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
- <glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
- <glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
- <glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
- <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
- <glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
- <glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
- <glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
- <glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
- <glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
- <glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
- <glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
- <glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
- <glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
- <glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
- <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
- <glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
- <glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
- <glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
- <glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
- <glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
- <glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
- <glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
- <glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
- <glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
- <glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
- <glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
- <glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
- <glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
- <glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
- <glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
- <glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
- <glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
- <glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
- <glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
- <glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
- <glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
- <glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
- <glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
- <glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
- <glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
- <glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
- <glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
- <glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
- <glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
- <glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
- <glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
- <glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
- <glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
- <glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
- <glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
- <glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
- <glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
- <glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
- <glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
- <glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
- <glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
- <glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
- <glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
- <glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
- <glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
- <glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
- <glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
- <glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
- <glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
- <glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
- <glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
- <glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
- <glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
- <glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
- <glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
- <glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
- <glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
- <glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
- <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
- <glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
- <glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
- <glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
- <glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
- <glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
- <glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
- <glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
- <glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
- <glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
- <glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
- <glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
- <glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
- <glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
- <glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
- <glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
- <glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
- <glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
- <glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
- <glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
- <glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
- <glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
- <glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
- <glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
- <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
- <glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
- <glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
- <glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
- <glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
- <glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
- <glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
- <glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
- <glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
- <glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
- <glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
- <glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
- <glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
- <glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
- <glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
- <glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
- <glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
- <glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
- <glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
- <glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
- <glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
- <glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
- <glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
- <glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
- <glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
- <glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
- <glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
- <glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
- <glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
- <glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
- <glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
- <glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
- <glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
- <glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
- <glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
- <glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
- <glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
- <glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
- <glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
- <glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
- <glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
- <glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
- <glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
- <glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
- <glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
- <glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
- <glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
- <glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
- <glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
- <glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
- <glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
- <glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
- </font>
- </defs></svg> <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Renders a PHP_CodeCoverage_Report_Node_Directory node.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_HTML_Renderer_Directory extends PHP_CodeCoverage_Report_HTML_Renderer
- {
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- * @param string $file
- */
- public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
- {
- $template = new Text_Template($this->templatePath . 'directory.html', '{{', '}}');
- $this->setCommonTemplateVariables($template, $node);
- $items = $this->renderItem($node, true);
- foreach ($node->getDirectories() as $item) {
- $items .= $this->renderItem($item);
- }
- foreach ($node->getFiles() as $item) {
- $items .= $this->renderItem($item);
- }
- $template->setVar(
- array(
- 'id' => $node->getId(),
- 'items' => $items
- )
- );
- $template->renderTo($file);
- }
- /**
- * @param PHP_CodeCoverage_Report_Node $item
- * @param boolean $total
- * @return string
- */
- protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false)
- {
- $data = array(
- 'numClasses' => $item->getNumClassesAndTraits(),
- 'numTestedClasses' => $item->getNumTestedClassesAndTraits(),
- 'numMethods' => $item->getNumMethods(),
- 'numTestedMethods' => $item->getNumTestedMethods(),
- 'linesExecutedPercent' => $item->getLineExecutedPercent(false),
- 'linesExecutedPercentAsString' => $item->getLineExecutedPercent(),
- 'numExecutedLines' => $item->getNumExecutedLines(),
- 'numExecutableLines' => $item->getNumExecutableLines(),
- 'testedMethodsPercent' => $item->getTestedMethodsPercent(false),
- 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(),
- 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false),
- 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent()
- );
- if ($total) {
- $data['name'] = 'Total';
- } else {
- if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $data['name'] = sprintf(
- '<a href="%s/index.html">%s</a>',
- $item->getName(),
- $item->getName()
- );
- $data['icon'] = '<span class="glyphicon glyphicon-folder-open"></span> ';
- } else {
- $data['name'] = sprintf(
- '<a href="%s.html">%s</a>',
- $item->getName(),
- $item->getName()
- );
- $data['icon'] = '<span class="glyphicon glyphicon-file"></span> ';
- }
- }
- return $this->renderItemTemplate(
- new Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'),
- $data
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Zsolt Takács <zsolt@takacs.cc>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_Crap4j
- {
- private $threshold = 30;
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @param string $name
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null, $name = null)
- {
- $document = new DOMDocument('1.0', 'UTF-8');
- $document->formatOutput = true;
- $root = $document->createElement('crap_result');
- $document->appendChild($root);
- $project = $document->createElement('project', is_string($name) ? $name : '');
- $root->appendChild($project);
- $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s', (int) $_SERVER['REQUEST_TIME'])));
- $stats = $document->createElement('stats');
- $methodsNode = $document->createElement('methods');
- $report = $coverage->getReport();
- unset($coverage);
- $fullMethodCount = 0;
- $fullCrapMethodCount = 0;
- $fullCrapLoad = 0;
- $fullCrap = 0;
- foreach ($report as $item) {
- $namespace = 'global';
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $file = $document->createElement('file');
- $file->setAttribute('name', $item->getPath());
- $classes = $item->getClassesAndTraits();
- foreach ($classes as $className => $class) {
- foreach ($class['methods'] as $methodName => $method) {
- $crapLoad = $this->getCrapLoad($method['crap'], $method['ccn'], $method['coverage']);
- $fullCrap += $method['crap'];
- $fullCrapLoad += $crapLoad;
- $fullMethodCount++;
- if ($method['crap'] >= $this->threshold) {
- $fullCrapMethodCount++;
- }
- $methodNode = $document->createElement('method');
- if (!empty($class['package']['namespace'])) {
- $namespace = $class['package']['namespace'];
- }
- $methodNode->appendChild($document->createElement('package', $namespace));
- $methodNode->appendChild($document->createElement('className', $className));
- $methodNode->appendChild($document->createElement('methodName', $methodName));
- $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature'])));
- $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature'])));
- $methodNode->appendChild($document->createElement('crap', $this->roundValue($method['crap'])));
- $methodNode->appendChild($document->createElement('complexity', $method['ccn']));
- $methodNode->appendChild($document->createElement('coverage', $this->roundValue($method['coverage'])));
- $methodNode->appendChild($document->createElement('crapLoad', round($crapLoad)));
- $methodsNode->appendChild($methodNode);
- }
- }
- }
- $stats->appendChild($document->createElement('name', 'Method Crap Stats'));
- $stats->appendChild($document->createElement('methodCount', $fullMethodCount));
- $stats->appendChild($document->createElement('crapMethodCount', $fullCrapMethodCount));
- $stats->appendChild($document->createElement('crapLoad', round($fullCrapLoad)));
- $stats->appendChild($document->createElement('totalCrap', $fullCrap));
- $stats->appendChild($document->createElement('crapMethodPercent', $this->roundValue(100 * $fullCrapMethodCount / $fullMethodCount)));
- $root->appendChild($stats);
- $root->appendChild($methodsNode);
- if ($target !== null) {
- if (!is_dir(dirname($target))) {
- mkdir(dirname($target), 0777, true);
- }
- return $document->save($target);
- } else {
- return $document->saveXML();
- }
- }
- private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent)
- {
- $crapLoad = 0;
- if ($crapValue >= $this->threshold) {
- $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100);
- $crapLoad += $cyclomaticComplexity / $this->threshold;
- }
- return $crapLoad;
- }
- private function roundValue($value)
- {
- return round($value, 2);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Tests
- {
- private $contextNode;
- private $codeMap = array(
- 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED
- 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED
- 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE
- 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE
- 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
- 5 => 'RISKY' // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY
- );
- public function __construct(DOMElement $context)
- {
- $this->contextNode = $context;
- }
- public function addTest($test, $result)
- {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'test'
- )
- );
- $node->setAttribute('name', $test);
- $node->setAttribute('result', (int) $result);
- $node->setAttribute('status', $this->codeMap[(int) $result]);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File
- {
- /**
- * @var DOMDocument
- */
- protected $dom;
- /**
- * @var DOMElement
- */
- protected $contextNode;
- public function __construct(DOMElement $context)
- {
- $this->dom = $context->ownerDocument;
- $this->contextNode = $context;
- }
- public function getTotals()
- {
- $totalsContainer = $this->contextNode->firstChild;
- if (!$totalsContainer) {
- $totalsContainer = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'totals'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer);
- }
- public function getLineCoverage($line)
- {
- $coverage = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'coverage'
- )->item(0);
- if (!$coverage) {
- $coverage = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'coverage'
- )
- );
- }
- $lineNode = $coverage->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'line'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Coverage($lineNode, $line);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Node
- {
- /**
- * @var DOMDocument
- */
- private $dom;
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context)
- {
- $this->setContextNode($context);
- }
- protected function setContextNode(DOMElement $context)
- {
- $this->dom = $context->ownerDocument;
- $this->contextNode = $context;
- }
- public function getDom()
- {
- return $this->dom;
- }
- protected function getContextNode()
- {
- return $this->contextNode;
- }
- public function getTotals()
- {
- $totalsContainer = $this->getContextNode()->firstChild;
- if (!$totalsContainer) {
- $totalsContainer = $this->getContextNode()->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'totals'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer);
- }
- public function addDirectory($name)
- {
- $dirNode = $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'directory'
- );
- $dirNode->setAttribute('name', $name);
- $this->getContextNode()->appendChild($dirNode);
- return new PHP_CodeCoverage_Report_XML_Directory($dirNode);
- }
- public function addFile($name, $href)
- {
- $fileNode = $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'file'
- );
- $fileNode->setAttribute('name', $name);
- $fileNode->setAttribute('href', $href);
- $this->getContextNode()->appendChild($fileNode);
- return new PHP_CodeCoverage_Report_XML_File($fileNode);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Project extends PHP_CodeCoverage_Report_XML_Node
- {
- public function __construct($name)
- {
- $this->init();
- $this->setProjectName($name);
- }
- private function init()
- {
- $dom = new DOMDocument;
- $dom->loadXML('<?xml version="1.0" ?><phpunit xmlns="http://schema.phpunit.de/coverage/1.0"><project/></phpunit>');
- $this->setContextNode(
- $dom->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'project'
- )->item(0)
- );
- }
- private function setProjectName($name)
- {
- $this->getContextNode()->setAttribute('name', $name);
- }
- public function getTests()
- {
- $testsNode = $this->getContextNode()->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'tests'
- )->item(0);
- if (!$testsNode) {
- $testsNode = $this->getContextNode()->appendChild(
- $this->getDom()->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'tests'
- )
- );
- }
- return new PHP_CodeCoverage_Report_XML_Tests($testsNode);
- }
- public function asDom()
- {
- return $this->getDom();
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Totals
- {
- /**
- * @var DOMNode
- */
- private $container;
- /**
- * @var DOMElement
- */
- private $linesNode;
- /**
- * @var DOMElement
- */
- private $methodsNode;
- /**
- * @var DOMElement
- */
- private $functionsNode;
- /**
- * @var DOMElement
- */
- private $classesNode;
- /**
- * @var DOMElement
- */
- private $traitsNode;
- public function __construct(DOMElement $container)
- {
- $this->container = $container;
- $dom = $container->ownerDocument;
- $this->linesNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'lines'
- );
- $this->methodsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'methods'
- );
- $this->functionsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'functions'
- );
- $this->classesNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'classes'
- );
- $this->traitsNode = $dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'traits'
- );
- $container->appendChild($this->linesNode);
- $container->appendChild($this->methodsNode);
- $container->appendChild($this->functionsNode);
- $container->appendChild($this->classesNode);
- $container->appendChild($this->traitsNode);
- }
- public function getContainer()
- {
- return $this->container;
- }
- public function setNumLines($loc, $cloc, $ncloc, $executable, $executed)
- {
- $this->linesNode->setAttribute('total', $loc);
- $this->linesNode->setAttribute('comments', $cloc);
- $this->linesNode->setAttribute('code', $ncloc);
- $this->linesNode->setAttribute('executable', $executable);
- $this->linesNode->setAttribute('executed', $executed);
- $this->linesNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($executed, $executable, true)
- );
- }
- public function setNumClasses($count, $tested)
- {
- $this->classesNode->setAttribute('count', $count);
- $this->classesNode->setAttribute('tested', $tested);
- $this->classesNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumTraits($count, $tested)
- {
- $this->traitsNode->setAttribute('count', $count);
- $this->traitsNode->setAttribute('tested', $tested);
- $this->traitsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumMethods($count, $tested)
- {
- $this->methodsNode->setAttribute('count', $count);
- $this->methodsNode->setAttribute('tested', $tested);
- $this->methodsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- public function setNumFunctions($count, $tested)
- {
- $this->functionsNode->setAttribute('count', $count);
- $this->functionsNode->setAttribute('tested', $tested);
- $this->functionsNode->setAttribute(
- 'percent',
- PHP_CodeCoverage_Util::percent($tested, $count, true)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_Directory extends PHP_CodeCoverage_Report_XML_Node
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Method
- {
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context, $name)
- {
- $this->contextNode = $context;
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function setSignature($signature)
- {
- $this->contextNode->setAttribute('signature', $signature);
- }
- public function setLines($start, $end = null)
- {
- $this->contextNode->setAttribute('start', $start);
- if ($end !== null) {
- $this->contextNode->setAttribute('end', $end);
- }
- }
- public function setTotals($executable, $executed, $coverage)
- {
- $this->contextNode->setAttribute('executable', $executable);
- $this->contextNode->setAttribute('executed', $executed);
- $this->contextNode->setAttribute('coverage', $coverage);
- }
- public function setCrap($crap)
- {
- $this->contextNode->setAttribute('crap', $crap);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Report extends PHP_CodeCoverage_Report_XML_File
- {
- public function __construct($name)
- {
- $this->dom = new DOMDocument;
- $this->dom->loadXML('<?xml version="1.0" ?><phpunit xmlns="http://schema.phpunit.de/coverage/1.0"><file /></phpunit>');
- $this->contextNode = $this->dom->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'file'
- )->item(0);
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function asDom()
- {
- return $this->dom;
- }
- public function getFunctionObject($name)
- {
- $node = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'function'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Method($node, $name);
- }
- public function getClassObject($name)
- {
- return $this->getUnitObject('class', $name);
- }
- public function getTraitObject($name)
- {
- return $this->getUnitObject('trait', $name);
- }
- private function getUnitObject($tagName, $name)
- {
- $node = $this->contextNode->appendChild(
- $this->dom->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- $tagName
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Unit($node, $name);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Coverage
- {
- /**
- * @var XMLWriter
- */
- private $writer;
- /**
- * @var DOMElement
- */
- private $contextNode;
- /**
- * @var bool
- */
- private $finalized = false;
- public function __construct(DOMElement $context, $line)
- {
- $this->contextNode = $context;
- $this->writer = new XMLWriter();
- $this->writer->openMemory();
- $this->writer->startElementNs(null, $context->nodeName, 'http://schema.phpunit.de/coverage/1.0');
- $this->writer->writeAttribute('nr', $line);
- }
- public function addTest($test)
- {
- if ($this->finalized) {
- throw new PHP_CodeCoverage_Exception('Coverage Report already finalized');
- }
- $this->writer->startElement('covered');
- $this->writer->writeAttribute('by', $test);
- $this->writer->endElement();
- }
- public function finalize()
- {
- $this->writer->endElement();
- $fragment = $this->contextNode->ownerDocument->createDocumentFragment();
- $fragment->appendXML($this->writer->outputMemory());
- $this->contextNode->parentNode->replaceChild(
- $fragment,
- $this->contextNode
- );
- $this->finalized = true;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML_File_Unit
- {
- /**
- * @var DOMElement
- */
- private $contextNode;
- public function __construct(DOMElement $context, $name)
- {
- $this->contextNode = $context;
- $this->setName($name);
- }
- private function setName($name)
- {
- $this->contextNode->setAttribute('name', $name);
- }
- public function setLines($start, $executable, $executed)
- {
- $this->contextNode->setAttribute('start', $start);
- $this->contextNode->setAttribute('executable', $executable);
- $this->contextNode->setAttribute('executed', $executed);
- }
- public function setCrap($crap)
- {
- $this->contextNode->setAttribute('crap', $crap);
- }
- public function setPackage($full, $package, $sub, $category)
- {
- $node = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'package'
- )->item(0);
- if (!$node) {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'package'
- )
- );
- }
- $node->setAttribute('full', $full);
- $node->setAttribute('name', $package);
- $node->setAttribute('sub', $sub);
- $node->setAttribute('category', $category);
- }
- public function setNamespace($namespace)
- {
- $node = $this->contextNode->getElementsByTagNameNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'namespace'
- )->item(0);
- if (!$node) {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'namespace'
- )
- );
- }
- $node->setAttribute('name', $namespace);
- }
- public function addMethod($name)
- {
- $node = $this->contextNode->appendChild(
- $this->contextNode->ownerDocument->createElementNS(
- 'http://schema.phpunit.de/coverage/1.0',
- 'method'
- )
- );
- return new PHP_CodeCoverage_Report_XML_File_Method($node, $name);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for nodes in the code coverage information tree.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- abstract class PHP_CodeCoverage_Report_Node implements Countable
- {
- /**
- * @var string
- */
- protected $name;
- /**
- * @var string
- */
- protected $path;
- /**
- * @var array
- */
- protected $pathArray;
- /**
- * @var PHP_CodeCoverage_Report_Node
- */
- protected $parent;
- /**
- * @var string
- */
- protected $id;
- /**
- * Constructor.
- *
- * @param string $name
- * @param PHP_CodeCoverage_Report_Node $parent
- */
- public function __construct($name, PHP_CodeCoverage_Report_Node $parent = null)
- {
- if (substr($name, -1) == '/') {
- $name = substr($name, 0, -1);
- }
- $this->name = $name;
- $this->parent = $parent;
- }
- /**
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * @return string
- */
- public function getId()
- {
- if ($this->id === null) {
- $parent = $this->getParent();
- if ($parent === null) {
- $this->id = 'index';
- } else {
- $parentId = $parent->getId();
- if ($parentId == 'index') {
- $this->id = str_replace(':', '_', $this->name);
- } else {
- $this->id = $parentId . '/' . $this->name;
- }
- }
- }
- return $this->id;
- }
- /**
- * @return string
- */
- public function getPath()
- {
- if ($this->path === null) {
- if ($this->parent === null || $this->parent->getPath() === null || $this->parent->getPath() === false) {
- $this->path = $this->name;
- } else {
- $this->path = $this->parent->getPath() . '/' . $this->name;
- }
- }
- return $this->path;
- }
- /**
- * @return array
- */
- public function getPathAsArray()
- {
- if ($this->pathArray === null) {
- if ($this->parent === null) {
- $this->pathArray = array();
- } else {
- $this->pathArray = $this->parent->getPathAsArray();
- }
- $this->pathArray[] = $this;
- }
- return $this->pathArray;
- }
- /**
- * @return PHP_CodeCoverage_Report_Node
- */
- public function getParent()
- {
- return $this->parent;
- }
- /**
- * Returns the percentage of classes that has been tested.
- *
- * @param boolean $asString
- * @return integer
- */
- public function getTestedClassesPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedClasses(),
- $this->getNumClasses(),
- $asString
- );
- }
- /**
- * Returns the percentage of traits that has been tested.
- *
- * @param boolean $asString
- * @return integer
- */
- public function getTestedTraitsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedTraits(),
- $this->getNumTraits(),
- $asString
- );
- }
- /**
- * Returns the percentage of traits that has been tested.
- *
- * @param boolean $asString
- * @return integer
- * @since Method available since Release 1.2.0
- */
- public function getTestedClassesAndTraitsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedClassesAndTraits(),
- $this->getNumClassesAndTraits(),
- $asString
- );
- }
- /**
- * Returns the percentage of methods that has been tested.
- *
- * @param boolean $asString
- * @return integer
- */
- public function getTestedMethodsPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumTestedMethods(),
- $this->getNumMethods(),
- $asString
- );
- }
- /**
- * Returns the percentage of executed lines.
- *
- * @param boolean $asString
- * @return integer
- */
- public function getLineExecutedPercent($asString = true)
- {
- return PHP_CodeCoverage_Util::percent(
- $this->getNumExecutedLines(),
- $this->getNumExecutableLines(),
- $asString
- );
- }
- /**
- * Returns the number of classes and traits.
- *
- * @return integer
- * @since Method available since Release 1.2.0
- */
- public function getNumClassesAndTraits()
- {
- return $this->getNumClasses() + $this->getNumTraits();
- }
- /**
- * Returns the number of tested classes and traits.
- *
- * @return integer
- * @since Method available since Release 1.2.0
- */
- public function getNumTestedClassesAndTraits()
- {
- return $this->getNumTestedClasses() + $this->getNumTestedTraits();
- }
- /**
- * Returns the classes and traits of this node.
- *
- * @return array
- * @since Method available since Release 1.2.0
- */
- public function getClassesAndTraits()
- {
- return array_merge($this->getClasses(), $this->getTraits());
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- abstract public function getClasses();
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- abstract public function getTraits();
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- abstract public function getFunctions();
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- abstract public function getLinesOfCode();
- /**
- * Returns the number of executable lines.
- *
- * @return integer
- */
- abstract public function getNumExecutableLines();
- /**
- * Returns the number of executed lines.
- *
- * @return integer
- */
- abstract public function getNumExecutedLines();
- /**
- * Returns the number of classes.
- *
- * @return integer
- */
- abstract public function getNumClasses();
- /**
- * Returns the number of tested classes.
- *
- * @return integer
- */
- abstract public function getNumTestedClasses();
- /**
- * Returns the number of traits.
- *
- * @return integer
- */
- abstract public function getNumTraits();
- /**
- * Returns the number of tested traits.
- *
- * @return integer
- */
- abstract public function getNumTestedTraits();
- /**
- * Returns the number of methods.
- *
- * @return integer
- */
- abstract public function getNumMethods();
- /**
- * Returns the number of tested methods.
- *
- * @return integer
- */
- abstract public function getNumTestedMethods();
- /**
- * Returns the number of functions.
- *
- * @return integer
- */
- abstract public function getNumFunctions();
- /**
- * Returns the number of tested functions.
- *
- * @return integer
- */
- abstract public function getNumTestedFunctions();
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Recursive iterator for PHP_CodeCoverage_Report_Node object graphs.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_Iterator implements RecursiveIterator
- {
- /**
- * @var integer
- */
- protected $position;
- /**
- * @var PHP_CodeCoverage_Report_Node[]
- */
- protected $nodes;
- /**
- * Constructor.
- *
- * @param PHP_CodeCoverage_Report_Node_Directory $node
- */
- public function __construct(PHP_CodeCoverage_Report_Node_Directory $node)
- {
- $this->nodes = $node->getChildNodes();
- }
- /**
- * Rewinds the Iterator to the first element.
- *
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * Checks if there is a current element after calls to rewind() or next().
- *
- * @return boolean
- */
- public function valid()
- {
- return $this->position < count($this->nodes);
- }
- /**
- * Returns the key of the current element.
- *
- * @return integer
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * Returns the current element.
- *
- * @return PHPUnit_Framework_Test
- */
- public function current()
- {
- return $this->valid() ? $this->nodes[$this->position] : null;
- }
- /**
- * Moves forward to next element.
- *
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * Returns the sub iterator for the current element.
- *
- * @return PHP_CodeCoverage_Report_Node_Iterator
- */
- public function getChildren()
- {
- return new PHP_CodeCoverage_Report_Node_Iterator(
- $this->nodes[$this->position]
- );
- }
- /**
- * Checks whether the current element has children.
- *
- * @return boolean
- */
- public function hasChildren()
- {
- return $this->nodes[$this->position] instanceof PHP_CodeCoverage_Report_Node_Directory;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a file in the code coverage information tree.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node
- {
- /**
- * @var array
- */
- protected $coverageData;
- /**
- * @var array
- */
- protected $testData;
- /**
- * @var integer
- */
- protected $numExecutableLines = 0;
- /**
- * @var integer
- */
- protected $numExecutedLines = 0;
- /**
- * @var array
- */
- protected $classes = array();
- /**
- * @var array
- */
- protected $traits = array();
- /**
- * @var array
- */
- protected $functions = array();
- /**
- * @var array
- */
- protected $linesOfCode = array();
- /**
- * @var integer
- */
- protected $numTestedTraits = 0;
- /**
- * @var integer
- */
- protected $numTestedClasses = 0;
- /**
- * @var integer
- */
- protected $numMethods = null;
- /**
- * @var integer
- */
- protected $numTestedMethods = null;
- /**
- * @var integer
- */
- protected $numTestedFunctions = null;
- /**
- * @var array
- */
- protected $startLines = array();
- /**
- * @var array
- */
- protected $endLines = array();
- /**
- * @var boolean
- */
- protected $cacheTokens;
- /**
- * Constructor.
- *
- * @param string $name
- * @param PHP_CodeCoverage_Report_Node $parent
- * @param array $coverageData
- * @param array $testData
- * @param boolean $cacheTokens
- * @throws PHP_CodeCoverage_Exception
- */
- public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens)
- {
- if (!is_bool($cacheTokens)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- parent::__construct($name, $parent);
- $this->coverageData = $coverageData;
- $this->testData = $testData;
- $this->cacheTokens = $cacheTokens;
- $this->calculateStatistics();
- }
- /**
- * Returns the number of files in/under this node.
- *
- * @return integer
- */
- public function count()
- {
- return 1;
- }
- /**
- * Returns the code coverage data of this node.
- *
- * @return array
- */
- public function getCoverageData()
- {
- return $this->coverageData;
- }
- /**
- * Returns the test data of this node.
- *
- * @return array
- */
- public function getTestData()
- {
- return $this->testData;
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- public function getClasses()
- {
- return $this->classes;
- }
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- public function getTraits()
- {
- return $this->traits;
- }
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- public function getFunctions()
- {
- return $this->functions;
- }
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- public function getLinesOfCode()
- {
- return $this->linesOfCode;
- }
- /**
- * Returns the number of executable lines.
- *
- * @return integer
- */
- public function getNumExecutableLines()
- {
- return $this->numExecutableLines;
- }
- /**
- * Returns the number of executed lines.
- *
- * @return integer
- */
- public function getNumExecutedLines()
- {
- return $this->numExecutedLines;
- }
- /**
- * Returns the number of classes.
- *
- * @return integer
- */
- public function getNumClasses()
- {
- return count($this->classes);
- }
- /**
- * Returns the number of tested classes.
- *
- * @return integer
- */
- public function getNumTestedClasses()
- {
- return $this->numTestedClasses;
- }
- /**
- * Returns the number of traits.
- *
- * @return integer
- */
- public function getNumTraits()
- {
- return count($this->traits);
- }
- /**
- * Returns the number of tested traits.
- *
- * @return integer
- */
- public function getNumTestedTraits()
- {
- return $this->numTestedTraits;
- }
- /**
- * Returns the number of methods.
- *
- * @return integer
- */
- public function getNumMethods()
- {
- if ($this->numMethods === null) {
- $this->numMethods = 0;
- foreach ($this->classes as $class) {
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] > 0) {
- $this->numMethods++;
- }
- }
- }
- foreach ($this->traits as $trait) {
- foreach ($trait['methods'] as $method) {
- if ($method['executableLines'] > 0) {
- $this->numMethods++;
- }
- }
- }
- }
- return $this->numMethods;
- }
- /**
- * Returns the number of tested methods.
- *
- * @return integer
- */
- public function getNumTestedMethods()
- {
- if ($this->numTestedMethods === null) {
- $this->numTestedMethods = 0;
- foreach ($this->classes as $class) {
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] > 0 &&
- $method['coverage'] == 100) {
- $this->numTestedMethods++;
- }
- }
- }
- foreach ($this->traits as $trait) {
- foreach ($trait['methods'] as $method) {
- if ($method['executableLines'] > 0 &&
- $method['coverage'] == 100) {
- $this->numTestedMethods++;
- }
- }
- }
- }
- return $this->numTestedMethods;
- }
- /**
- * Returns the number of functions.
- *
- * @return integer
- */
- public function getNumFunctions()
- {
- return count($this->functions);
- }
- /**
- * Returns the number of tested functions.
- *
- * @return integer
- */
- public function getNumTestedFunctions()
- {
- if ($this->numTestedFunctions === null) {
- $this->numTestedFunctions = 0;
- foreach ($this->functions as $function) {
- if ($function['executableLines'] > 0 &&
- $function['coverage'] == 100) {
- $this->numTestedFunctions++;
- }
- }
- }
- return $this->numTestedFunctions;
- }
- /**
- * Calculates coverage statistics for the file.
- */
- protected function calculateStatistics()
- {
- if ($this->cacheTokens) {
- $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath());
- } else {
- $tokens = new PHP_Token_Stream($this->getPath());
- }
- $this->processClasses($tokens);
- $this->processTraits($tokens);
- $this->processFunctions($tokens);
- $this->linesOfCode = $tokens->getLinesOfCode();
- unset($tokens);
- for ($lineNumber = 1; $lineNumber <= $this->linesOfCode['loc']; $lineNumber++) {
- if (isset($this->startLines[$lineNumber])) {
- // Start line of a class.
- if (isset($this->startLines[$lineNumber]['className'])) {
- $currentClass = &$this->startLines[$lineNumber];
- } // Start line of a trait.
- elseif (isset($this->startLines[$lineNumber]['traitName'])) {
- $currentTrait = &$this->startLines[$lineNumber];
- } // Start line of a method.
- elseif (isset($this->startLines[$lineNumber]['methodName'])) {
- $currentMethod = &$this->startLines[$lineNumber];
- } // Start line of a function.
- elseif (isset($this->startLines[$lineNumber]['functionName'])) {
- $currentFunction = &$this->startLines[$lineNumber];
- }
- }
- if (isset($this->coverageData[$lineNumber]) &&
- $this->coverageData[$lineNumber] !== null) {
- if (isset($currentClass)) {
- $currentClass['executableLines']++;
- }
- if (isset($currentTrait)) {
- $currentTrait['executableLines']++;
- }
- if (isset($currentMethod)) {
- $currentMethod['executableLines']++;
- }
- if (isset($currentFunction)) {
- $currentFunction['executableLines']++;
- }
- $this->numExecutableLines++;
- if (count($this->coverageData[$lineNumber]) > 0) {
- if (isset($currentClass)) {
- $currentClass['executedLines']++;
- }
- if (isset($currentTrait)) {
- $currentTrait['executedLines']++;
- }
- if (isset($currentMethod)) {
- $currentMethod['executedLines']++;
- }
- if (isset($currentFunction)) {
- $currentFunction['executedLines']++;
- }
- $this->numExecutedLines++;
- }
- }
- if (isset($this->endLines[$lineNumber])) {
- // End line of a class.
- if (isset($this->endLines[$lineNumber]['className'])) {
- unset($currentClass);
- } // End line of a trait.
- elseif (isset($this->endLines[$lineNumber]['traitName'])) {
- unset($currentTrait);
- } // End line of a method.
- elseif (isset($this->endLines[$lineNumber]['methodName'])) {
- unset($currentMethod);
- } // End line of a function.
- elseif (isset($this->endLines[$lineNumber]['functionName'])) {
- unset($currentFunction);
- }
- }
- }
- foreach ($this->traits as &$trait) {
- foreach ($trait['methods'] as &$method) {
- if ($method['executableLines'] > 0) {
- $method['coverage'] = ($method['executedLines'] /
- $method['executableLines']) * 100;
- } else {
- $method['coverage'] = 100;
- }
- $method['crap'] = $this->crap(
- $method['ccn'],
- $method['coverage']
- );
- $trait['ccn'] += $method['ccn'];
- }
- if ($trait['executableLines'] > 0) {
- $trait['coverage'] = ($trait['executedLines'] /
- $trait['executableLines']) * 100;
- } else {
- $trait['coverage'] = 100;
- }
- if ($trait['coverage'] == 100) {
- $this->numTestedClasses++;
- }
- $trait['crap'] = $this->crap(
- $trait['ccn'],
- $trait['coverage']
- );
- }
- foreach ($this->classes as &$class) {
- foreach ($class['methods'] as &$method) {
- if ($method['executableLines'] > 0) {
- $method['coverage'] = ($method['executedLines'] /
- $method['executableLines']) * 100;
- } else {
- $method['coverage'] = 100;
- }
- $method['crap'] = $this->crap(
- $method['ccn'],
- $method['coverage']
- );
- $class['ccn'] += $method['ccn'];
- }
- if ($class['executableLines'] > 0) {
- $class['coverage'] = ($class['executedLines'] /
- $class['executableLines']) * 100;
- } else {
- $class['coverage'] = 100;
- }
- if ($class['coverage'] == 100) {
- $this->numTestedClasses++;
- }
- $class['crap'] = $this->crap(
- $class['ccn'],
- $class['coverage']
- );
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processClasses(PHP_Token_Stream $tokens)
- {
- $classes = $tokens->getClasses();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($classes as $className => $class) {
- $this->classes[$className] = array(
- 'className' => $className,
- 'methods' => array(),
- 'startLine' => $class['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => 0,
- 'coverage' => 0,
- 'crap' => 0,
- 'package' => $class['package'],
- 'link' => $link . $class['startLine']
- );
- $this->startLines[$class['startLine']] = &$this->classes[$className];
- $this->endLines[$class['endLine']] = &$this->classes[$className];
- foreach ($class['methods'] as $methodName => $method) {
- $this->classes[$className]['methods'][$methodName] = array(
- 'methodName' => $methodName,
- 'signature' => $method['signature'],
- 'startLine' => $method['startLine'],
- 'endLine' => $method['endLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $method['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $method['startLine']
- );
- $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName];
- $this->endLines[$method['endLine']] = &$this->classes[$className]['methods'][$methodName];
- }
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processTraits(PHP_Token_Stream $tokens)
- {
- $traits = $tokens->getTraits();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($traits as $traitName => $trait) {
- $this->traits[$traitName] = array(
- 'traitName' => $traitName,
- 'methods' => array(),
- 'startLine' => $trait['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => 0,
- 'coverage' => 0,
- 'crap' => 0,
- 'package' => $trait['package'],
- 'link' => $link . $trait['startLine']
- );
- $this->startLines[$trait['startLine']] = &$this->traits[$traitName];
- $this->endLines[$trait['endLine']] = &$this->traits[$traitName];
- foreach ($trait['methods'] as $methodName => $method) {
- $this->traits[$traitName]['methods'][$methodName] = array(
- 'methodName' => $methodName,
- 'signature' => $method['signature'],
- 'startLine' => $method['startLine'],
- 'endLine' => $method['endLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $method['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $method['startLine']
- );
- $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName];
- $this->endLines[$method['endLine']] = &$this->traits[$traitName]['methods'][$methodName];
- }
- }
- }
- /**
- * @param PHP_Token_Stream $tokens
- */
- protected function processFunctions(PHP_Token_Stream $tokens)
- {
- $functions = $tokens->getFunctions();
- unset($tokens);
- $link = $this->getId() . '.html#';
- foreach ($functions as $functionName => $function) {
- $this->functions[$functionName] = array(
- 'functionName' => $functionName,
- 'signature' => $function['signature'],
- 'startLine' => $function['startLine'],
- 'executableLines' => 0,
- 'executedLines' => 0,
- 'ccn' => $function['ccn'],
- 'coverage' => 0,
- 'crap' => 0,
- 'link' => $link . $function['startLine']
- );
- $this->startLines[$function['startLine']] = &$this->functions[$functionName];
- $this->endLines[$function['endLine']] = &$this->functions[$functionName];
- }
- }
- /**
- * Calculates the Change Risk Anti-Patterns (CRAP) index for a unit of code
- * based on its cyclomatic complexity and percentage of code coverage.
- *
- * @param integer $ccn
- * @param float $coverage
- * @return string
- * @since Method available since Release 1.2.0
- */
- protected function crap($ccn, $coverage)
- {
- if ($coverage == 0) {
- return (string) (pow($ccn, 2) + $ccn);
- }
- if ($coverage >= 95) {
- return (string) $ccn;
- }
- return sprintf(
- '%01.2F',
- pow($ccn, 2) * pow(1 - $coverage/100, 3) + $ccn
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a directory in the code coverage information tree.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Node_Directory extends PHP_CodeCoverage_Report_Node implements IteratorAggregate
- {
- /**
- * @var PHP_CodeCoverage_Report_Node[]
- */
- protected $children = array();
- /**
- * @var PHP_CodeCoverage_Report_Node_Directory[]
- */
- protected $directories = array();
- /**
- * @var PHP_CodeCoverage_Report_Node_File[]
- */
- protected $files = array();
- /**
- * @var array
- */
- protected $classes;
- /**
- * @var array
- */
- protected $traits;
- /**
- * @var array
- */
- protected $functions;
- /**
- * @var array
- */
- protected $linesOfCode = null;
- /**
- * @var integer
- */
- protected $numFiles = -1;
- /**
- * @var integer
- */
- protected $numExecutableLines = -1;
- /**
- * @var integer
- */
- protected $numExecutedLines = -1;
- /**
- * @var integer
- */
- protected $numClasses = -1;
- /**
- * @var integer
- */
- protected $numTestedClasses = -1;
- /**
- * @var integer
- */
- protected $numTraits = -1;
- /**
- * @var integer
- */
- protected $numTestedTraits = -1;
- /**
- * @var integer
- */
- protected $numMethods = -1;
- /**
- * @var integer
- */
- protected $numTestedMethods = -1;
- /**
- * @var integer
- */
- protected $numFunctions = -1;
- /**
- * @var integer
- */
- protected $numTestedFunctions = -1;
- /**
- * Returns the number of files in/under this node.
- *
- * @return integer
- */
- public function count()
- {
- if ($this->numFiles == -1) {
- $this->numFiles = 0;
- foreach ($this->children as $child) {
- $this->numFiles += count($child);
- }
- }
- return $this->numFiles;
- }
- /**
- * Returns an iterator for this node.
- *
- * @return RecursiveIteratorIterator
- */
- public function getIterator()
- {
- return new RecursiveIteratorIterator(
- new PHP_CodeCoverage_Report_Node_Iterator($this),
- RecursiveIteratorIterator::SELF_FIRST
- );
- }
- /**
- * Adds a new directory.
- *
- * @param string $name
- * @return PHP_CodeCoverage_Report_Node_Directory
- */
- public function addDirectory($name)
- {
- $directory = new PHP_CodeCoverage_Report_Node_Directory($name, $this);
- $this->children[] = $directory;
- $this->directories[] = &$this->children[count($this->children) - 1];
- return $directory;
- }
- /**
- * Adds a new file.
- *
- * @param string $name
- * @param array $coverageData
- * @param array $testData
- * @param boolean $cacheTokens
- * @return PHP_CodeCoverage_Report_Node_File
- * @throws PHP_CodeCoverage_Exception
- */
- public function addFile($name, array $coverageData, array $testData, $cacheTokens)
- {
- $file = new PHP_CodeCoverage_Report_Node_File(
- $name,
- $this,
- $coverageData,
- $testData,
- $cacheTokens
- );
- $this->children[] = $file;
- $this->files[] = &$this->children[count($this->children) - 1];
- $this->numExecutableLines = -1;
- $this->numExecutedLines = -1;
- return $file;
- }
- /**
- * Returns the directories in this directory.
- *
- * @return array
- */
- public function getDirectories()
- {
- return $this->directories;
- }
- /**
- * Returns the files in this directory.
- *
- * @return array
- */
- public function getFiles()
- {
- return $this->files;
- }
- /**
- * Returns the child nodes of this node.
- *
- * @return array
- */
- public function getChildNodes()
- {
- return $this->children;
- }
- /**
- * Returns the classes of this node.
- *
- * @return array
- */
- public function getClasses()
- {
- if ($this->classes === null) {
- $this->classes = array();
- foreach ($this->children as $child) {
- $this->classes = array_merge(
- $this->classes,
- $child->getClasses()
- );
- }
- }
- return $this->classes;
- }
- /**
- * Returns the traits of this node.
- *
- * @return array
- */
- public function getTraits()
- {
- if ($this->traits === null) {
- $this->traits = array();
- foreach ($this->children as $child) {
- $this->traits = array_merge(
- $this->traits,
- $child->getTraits()
- );
- }
- }
- return $this->traits;
- }
- /**
- * Returns the functions of this node.
- *
- * @return array
- */
- public function getFunctions()
- {
- if ($this->functions === null) {
- $this->functions = array();
- foreach ($this->children as $child) {
- $this->functions = array_merge(
- $this->functions,
- $child->getFunctions()
- );
- }
- }
- return $this->functions;
- }
- /**
- * Returns the LOC/CLOC/NCLOC of this node.
- *
- * @return array
- */
- public function getLinesOfCode()
- {
- if ($this->linesOfCode === null) {
- $this->linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
- foreach ($this->children as $child) {
- $linesOfCode = $child->getLinesOfCode();
- $this->linesOfCode['loc'] += $linesOfCode['loc'];
- $this->linesOfCode['cloc'] += $linesOfCode['cloc'];
- $this->linesOfCode['ncloc'] += $linesOfCode['ncloc'];
- }
- }
- return $this->linesOfCode;
- }
- /**
- * Returns the number of executable lines.
- *
- * @return integer
- */
- public function getNumExecutableLines()
- {
- if ($this->numExecutableLines == -1) {
- $this->numExecutableLines = 0;
- foreach ($this->children as $child) {
- $this->numExecutableLines += $child->getNumExecutableLines();
- }
- }
- return $this->numExecutableLines;
- }
- /**
- * Returns the number of executed lines.
- *
- * @return integer
- */
- public function getNumExecutedLines()
- {
- if ($this->numExecutedLines == -1) {
- $this->numExecutedLines = 0;
- foreach ($this->children as $child) {
- $this->numExecutedLines += $child->getNumExecutedLines();
- }
- }
- return $this->numExecutedLines;
- }
- /**
- * Returns the number of classes.
- *
- * @return integer
- */
- public function getNumClasses()
- {
- if ($this->numClasses == -1) {
- $this->numClasses = 0;
- foreach ($this->children as $child) {
- $this->numClasses += $child->getNumClasses();
- }
- }
- return $this->numClasses;
- }
- /**
- * Returns the number of tested classes.
- *
- * @return integer
- */
- public function getNumTestedClasses()
- {
- if ($this->numTestedClasses == -1) {
- $this->numTestedClasses = 0;
- foreach ($this->children as $child) {
- $this->numTestedClasses += $child->getNumTestedClasses();
- }
- }
- return $this->numTestedClasses;
- }
- /**
- * Returns the number of traits.
- *
- * @return integer
- */
- public function getNumTraits()
- {
- if ($this->numTraits == -1) {
- $this->numTraits = 0;
- foreach ($this->children as $child) {
- $this->numTraits += $child->getNumTraits();
- }
- }
- return $this->numTraits;
- }
- /**
- * Returns the number of tested traits.
- *
- * @return integer
- */
- public function getNumTestedTraits()
- {
- if ($this->numTestedTraits == -1) {
- $this->numTestedTraits = 0;
- foreach ($this->children as $child) {
- $this->numTestedTraits += $child->getNumTestedTraits();
- }
- }
- return $this->numTestedTraits;
- }
- /**
- * Returns the number of methods.
- *
- * @return integer
- */
- public function getNumMethods()
- {
- if ($this->numMethods == -1) {
- $this->numMethods = 0;
- foreach ($this->children as $child) {
- $this->numMethods += $child->getNumMethods();
- }
- }
- return $this->numMethods;
- }
- /**
- * Returns the number of tested methods.
- *
- * @return integer
- */
- public function getNumTestedMethods()
- {
- if ($this->numTestedMethods == -1) {
- $this->numTestedMethods = 0;
- foreach ($this->children as $child) {
- $this->numTestedMethods += $child->getNumTestedMethods();
- }
- }
- return $this->numTestedMethods;
- }
- /**
- * Returns the number of functions.
- *
- * @return integer
- */
- public function getNumFunctions()
- {
- if ($this->numFunctions == -1) {
- $this->numFunctions = 0;
- foreach ($this->children as $child) {
- $this->numFunctions += $child->getNumFunctions();
- }
- }
- return $this->numFunctions;
- }
- /**
- * Returns the number of tested functions.
- *
- * @return integer
- */
- public function getNumTestedFunctions()
- {
- if ($this->numTestedFunctions == -1) {
- $this->numTestedFunctions = 0;
- foreach ($this->children as $child) {
- $this->numTestedFunctions += $child->getNumTestedFunctions();
- }
- }
- return $this->numTestedFunctions;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates a Clover XML logfile from an PHP_CodeCoverage object.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Report_Clover
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @param string $name
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null, $name = null)
- {
- $xmlDocument = new DOMDocument('1.0', 'UTF-8');
- $xmlDocument->formatOutput = true;
- $xmlCoverage = $xmlDocument->createElement('coverage');
- $xmlCoverage->setAttribute('generated', (int) $_SERVER['REQUEST_TIME']);
- $xmlDocument->appendChild($xmlCoverage);
- $xmlProject = $xmlDocument->createElement('project');
- $xmlProject->setAttribute('timestamp', (int) $_SERVER['REQUEST_TIME']);
- if (is_string($name)) {
- $xmlProject->setAttribute('name', $name);
- }
- $xmlCoverage->appendChild($xmlProject);
- $packages = array();
- $report = $coverage->getReport();
- unset($coverage);
- foreach ($report as $item) {
- $namespace = 'global';
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $xmlFile = $xmlDocument->createElement('file');
- $xmlFile->setAttribute('name', $item->getPath());
- $classes = $item->getClassesAndTraits();
- $coverage = $item->getCoverageData();
- $lines = array();
- foreach ($classes as $className => $class) {
- $classStatements = 0;
- $coveredClassStatements = 0;
- $coveredMethods = 0;
- $classMethods = 0;
- foreach ($class['methods'] as $methodName => $method) {
- if ($method['executableLines'] == 0) {
- continue;
- }
- $classMethods++;
- $classStatements += $method['executableLines'];
- $coveredClassStatements += $method['executedLines'];
- if ($method['coverage'] == 100) {
- $coveredMethods++;
- }
- $methodCount = 0;
- for ($i = $method['startLine'];
- $i <= $method['endLine'];
- $i++) {
- if (isset($coverage[$i]) && ($coverage[$i] !== null)) {
- $methodCount = max($methodCount, count($coverage[$i]));
- }
- }
- $lines[$method['startLine']] = array(
- 'count' => $methodCount,
- 'crap' => $method['crap'],
- 'type' => 'method',
- 'name' => $methodName
- );
- }
- if (!empty($class['package']['namespace'])) {
- $namespace = $class['package']['namespace'];
- }
- $xmlClass = $xmlDocument->createElement('class');
- $xmlClass->setAttribute('name', $className);
- $xmlClass->setAttribute('namespace', $namespace);
- if (!empty($class['package']['fullPackage'])) {
- $xmlClass->setAttribute(
- 'fullPackage',
- $class['package']['fullPackage']
- );
- }
- if (!empty($class['package']['category'])) {
- $xmlClass->setAttribute(
- 'category',
- $class['package']['category']
- );
- }
- if (!empty($class['package']['package'])) {
- $xmlClass->setAttribute(
- 'package',
- $class['package']['package']
- );
- }
- if (!empty($class['package']['subpackage'])) {
- $xmlClass->setAttribute(
- 'subpackage',
- $class['package']['subpackage']
- );
- }
- $xmlFile->appendChild($xmlClass);
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('methods', $classMethods);
- $xmlMetrics->setAttribute('coveredmethods', $coveredMethods);
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute('statements', $classStatements);
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $coveredClassStatements
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $classMethods +
- $classStatements
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $coveredMethods +
- $coveredClassStatements
- /* + coveredconditionals */
- );
- $xmlClass->appendChild($xmlMetrics);
- }
- foreach ($coverage as $line => $data) {
- if ($data === null || isset($lines[$line])) {
- continue;
- }
- $lines[$line] = array(
- 'count' => count($data), 'type' => 'stmt'
- );
- }
- ksort($lines);
- foreach ($lines as $line => $data) {
- $xmlLine = $xmlDocument->createElement('line');
- $xmlLine->setAttribute('num', $line);
- $xmlLine->setAttribute('type', $data['type']);
- if (isset($data['name'])) {
- $xmlLine->setAttribute('name', $data['name']);
- }
- if (isset($data['crap'])) {
- $xmlLine->setAttribute('crap', $data['crap']);
- }
- $xmlLine->setAttribute('count', $data['count']);
- $xmlFile->appendChild($xmlLine);
- }
- $linesOfCode = $item->getLinesOfCode();
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
- $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
- $xmlMetrics->setAttribute('classes', $item->getNumClassesAndTraits());
- $xmlMetrics->setAttribute('methods', $item->getNumMethods());
- $xmlMetrics->setAttribute(
- 'coveredmethods',
- $item->getNumTestedMethods()
- );
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute(
- 'statements',
- $item->getNumExecutableLines()
- );
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $item->getNumExecutedLines()
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $item->getNumMethods() + $item->getNumExecutableLines()
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $item->getNumTestedMethods() + $item->getNumExecutedLines()
- /* + coveredconditionals */
- );
- $xmlFile->appendChild($xmlMetrics);
- if ($namespace == 'global') {
- $xmlProject->appendChild($xmlFile);
- } else {
- if (!isset($packages[$namespace])) {
- $packages[$namespace] = $xmlDocument->createElement(
- 'package'
- );
- $packages[$namespace]->setAttribute('name', $namespace);
- $xmlProject->appendChild($packages[$namespace]);
- }
- $packages[$namespace]->appendChild($xmlFile);
- }
- }
- $linesOfCode = $report->getLinesOfCode();
- $xmlMetrics = $xmlDocument->createElement('metrics');
- $xmlMetrics->setAttribute('files', count($report));
- $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
- $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
- $xmlMetrics->setAttribute(
- 'classes',
- $report->getNumClassesAndTraits()
- );
- $xmlMetrics->setAttribute('methods', $report->getNumMethods());
- $xmlMetrics->setAttribute(
- 'coveredmethods',
- $report->getNumTestedMethods()
- );
- $xmlMetrics->setAttribute('conditionals', 0);
- $xmlMetrics->setAttribute('coveredconditionals', 0);
- $xmlMetrics->setAttribute(
- 'statements',
- $report->getNumExecutableLines()
- );
- $xmlMetrics->setAttribute(
- 'coveredstatements',
- $report->getNumExecutedLines()
- );
- $xmlMetrics->setAttribute(
- 'elements',
- $report->getNumMethods() + $report->getNumExecutableLines()
- /* + conditionals */
- );
- $xmlMetrics->setAttribute(
- 'coveredelements',
- $report->getNumTestedMethods() + $report->getNumExecutedLines()
- /* + coveredconditionals */
- );
- $xmlProject->appendChild($xmlMetrics);
- if ($target !== null) {
- if (!is_dir(dirname($target))) {
- mkdir(dirname($target), 0777, true);
- }
- return $xmlDocument->save($target);
- } else {
- return $xmlDocument->saveXML();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates an HTML report from an PHP_CodeCoverage object.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Report_HTML
- {
- /**
- * @var string
- */
- private $templatePath;
- /**
- * @var string
- */
- private $generator;
- /**
- * @var integer
- */
- private $lowUpperBound;
- /**
- * @var integer
- */
- private $highLowerBound;
- /**
- * Constructor.
- *
- * @param integer $lowUpperBound
- * @param integer $highLowerBound
- * @param string $generator
- */
- public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generator = '')
- {
- $this->generator = $generator;
- $this->highLowerBound = $highLowerBound;
- $this->lowUpperBound = $lowUpperBound;
- $this->templatePath = sprintf(
- '%s%sHTML%sRenderer%sTemplate%s',
- dirname(__FILE__),
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR,
- DIRECTORY_SEPARATOR
- );
- }
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- */
- public function process(PHP_CodeCoverage $coverage, $target)
- {
- $target = $this->getDirectory($target);
- $report = $coverage->getReport();
- unset($coverage);
- if (!isset($_SERVER['REQUEST_TIME'])) {
- $_SERVER['REQUEST_TIME'] = time();
- }
- $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']);
- $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $file = new PHP_CodeCoverage_Report_HTML_Renderer_File(
- $this->templatePath,
- $this->generator,
- $date,
- $this->lowUpperBound,
- $this->highLowerBound
- );
- $directory->render($report, $target . 'index.html');
- $dashboard->render($report, $target . 'dashboard.html');
- foreach ($report as $node) {
- $id = $node->getId();
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- if (!file_exists($target . $id)) {
- mkdir($target . $id, 0777, true);
- }
- $directory->render($node, $target . $id . '/index.html');
- $dashboard->render($node, $target . $id . '/dashboard.html');
- } else {
- $dir = dirname($target . $id);
- if (!file_exists($dir)) {
- mkdir($dir, 0777, true);
- }
- $file->render($node, $target . $id . '.html');
- }
- }
- $this->copyFiles($target);
- }
- /**
- * @param string $target
- */
- private function copyFiles($target)
- {
- $dir = $this->getDirectory($target . 'css');
- copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css');
- copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css');
- copy($this->templatePath . 'css/style.css', $dir . 'style.css');
- $dir = $this->getDirectory($target . 'fonts');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.eot', $dir . 'glyphicons-halflings-regular.eot');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.svg', $dir . 'glyphicons-halflings-regular.svg');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.ttf', $dir . 'glyphicons-halflings-regular.ttf');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff', $dir . 'glyphicons-halflings-regular.woff');
- copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff2', $dir . 'glyphicons-halflings-regular.woff2');
- $dir = $this->getDirectory($target . 'js');
- copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js');
- copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js');
- copy($this->templatePath . 'js/holder.min.js', $dir . 'holder.min.js');
- copy($this->templatePath . 'js/html5shiv.min.js', $dir . 'html5shiv.min.js');
- copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js');
- copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js');
- copy($this->templatePath . 'js/respond.min.js', $dir . 'respond.min.js');
- }
- /**
- * @param string $directory
- * @return string
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 1.2.0
- */
- private function getDirectory($directory)
- {
- if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) {
- $directory .= DIRECTORY_SEPARATOR;
- }
- if (is_dir($directory)) {
- return $directory;
- }
- if (@mkdir($directory, 0777, true)) {
- return $directory;
- }
- throw new PHP_CodeCoverage_Exception(
- sprintf(
- 'Directory "%s" does not exist.',
- $directory
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHP_CodeCoverage_Report_Node_* object graphs.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Factory
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @return PHP_CodeCoverage_Report_Node_Directory
- */
- public function create(PHP_CodeCoverage $coverage)
- {
- $files = $coverage->getData();
- $commonPath = $this->reducePaths($files);
- $root = new PHP_CodeCoverage_Report_Node_Directory(
- $commonPath,
- null
- );
- $this->addItems(
- $root,
- $this->buildDirectoryStructure($files),
- $coverage->getTests(),
- $coverage->getCacheTokens()
- );
- return $root;
- }
- /**
- * @param PHP_CodeCoverage_Report_Node_Directory $root
- * @param array $items
- * @param array $tests
- * @param boolean $cacheTokens
- */
- private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $items, array $tests, $cacheTokens)
- {
- foreach ($items as $key => $value) {
- if (substr($key, -2) == '/f') {
- $key = substr($key, 0, -2);
- if (file_exists($root->getPath() . DIRECTORY_SEPARATOR . $key)) {
- $root->addFile($key, $value, $tests, $cacheTokens);
- }
- } else {
- $child = $root->addDirectory($key);
- $this->addItems($child, $value, $tests, $cacheTokens);
- }
- }
- }
- /**
- * Builds an array representation of the directory structure.
- *
- * For instance,
- *
- * <code>
- * Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * is transformed into
- *
- * <code>
- * Array
- * (
- * [.] => Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * )
- * </code>
- *
- * @param array $files
- * @return array
- */
- private function buildDirectoryStructure($files)
- {
- $result = array();
- foreach ($files as $path => $file) {
- $path = explode('/', $path);
- $pointer = &$result;
- $max = count($path);
- for ($i = 0; $i < $max; $i++) {
- if ($i == ($max - 1)) {
- $type = '/f';
- } else {
- $type = '';
- }
- $pointer = &$pointer[$path[$i] . $type];
- }
- $pointer = $file;
- }
- return $result;
- }
- /**
- * Reduces the paths by cutting the longest common start path.
- *
- * For instance,
- *
- * <code>
- * Array
- * (
- * [/home/sb/Money/Money.php] => Array
- * (
- * ...
- * )
- *
- * [/home/sb/Money/MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * is reduced to
- *
- * <code>
- * Array
- * (
- * [Money.php] => Array
- * (
- * ...
- * )
- *
- * [MoneyBag.php] => Array
- * (
- * ...
- * )
- * )
- * </code>
- *
- * @param array $files
- * @return string
- */
- private function reducePaths(&$files)
- {
- if (empty($files)) {
- return '.';
- }
- $commonPath = '';
- $paths = array_keys($files);
- if (count($files) == 1) {
- $commonPath = dirname($paths[0]) . '/';
- $files[basename($paths[0])] = $files[$paths[0]];
- unset($files[$paths[0]]);
- return $commonPath;
- }
- $max = count($paths);
- for ($i = 0; $i < $max; $i++) {
- // strip phar:// prefixes
- if (strpos($paths[$i], 'phar://') === 0) {
- $paths[$i] = substr($paths[$i], 7);
- $paths[$i] = strtr($paths[$i], '/', DIRECTORY_SEPARATOR);
- }
- $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]);
- if (empty($paths[$i][0])) {
- $paths[$i][0] = DIRECTORY_SEPARATOR;
- }
- }
- $done = false;
- $max = count($paths);
- while (!$done) {
- for ($i = 0; $i < $max - 1; $i++) {
- if (!isset($paths[$i][0]) ||
- !isset($paths[$i+1][0]) ||
- $paths[$i][0] != $paths[$i+1][0]) {
- $done = true;
- break;
- }
- }
- if (!$done) {
- $commonPath .= $paths[0][0];
- if ($paths[0][0] != DIRECTORY_SEPARATOR) {
- $commonPath .= DIRECTORY_SEPARATOR;
- }
- for ($i = 0; $i < $max; $i++) {
- array_shift($paths[$i]);
- }
- }
- }
- $original = array_keys($files);
- $max = count($original);
- for ($i = 0; $i < $max; $i++) {
- $files[join('/', $paths[$i])] = $files[$original[$i]];
- unset($files[$original[$i]]);
- }
- ksort($files);
- return substr($commonPath, 0, -1);
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @category PHP
- * @package CodeCoverage
- * @author Arne Blankerts <arne@blankerts.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Report_XML
- {
- /**
- * @var string
- */
- private $target;
- /**
- * @var PHP_CodeCoverage_Report_XML_Project
- */
- private $project;
- public function process(PHP_CodeCoverage $coverage, $target)
- {
- if (substr($target, -1, 1) != DIRECTORY_SEPARATOR) {
- $target .= DIRECTORY_SEPARATOR;
- }
- $this->target = $target;
- $this->initTargetDirectory($target);
- $report = $coverage->getReport();
- $this->project = new PHP_CodeCoverage_Report_XML_Project(
- $coverage->getReport()->getName()
- );
- $this->processTests($coverage->getTests());
- $this->processDirectory($report, $this->project);
- $index = $this->project->asDom();
- $index->formatOutput = true;
- $index->preserveWhiteSpace = false;
- $index->save($target . '/index.xml');
- }
- private function initTargetDirectory($dir)
- {
- if (file_exists($dir)) {
- if (!is_dir($dir)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' exists but is not a directory."
- );
- }
- if (!is_writable($dir)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' exists but is not writable."
- );
- }
- } elseif (!@mkdir($dir, 0777, true)) {
- throw new PHP_CodeCoverage_Exception(
- "'$dir' could not be created."
- );
- }
- }
- private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context)
- {
- $dirObject = $context->addDirectory($directory->getName());
- $this->setTotals($directory, $dirObject->getTotals());
- foreach ($directory as $node) {
- if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
- $this->processDirectory($node, $dirObject);
- continue;
- }
- if ($node instanceof PHP_CodeCoverage_Report_Node_File) {
- $this->processFile($node, $dirObject);
- continue;
- }
- throw new PHP_CodeCoverage_Exception(
- 'Unknown node type for XML report'
- );
- }
- }
- private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context)
- {
- $fileObject = $context->addFile(
- $file->getName(),
- $file->getId() . '.xml'
- );
- $this->setTotals($file, $fileObject->getTotals());
- $fileReport = new PHP_CodeCoverage_Report_XML_File_Report(
- $file->getName()
- );
- $this->setTotals($file, $fileReport->getTotals());
- foreach ($file->getClassesAndTraits() as $unit) {
- $this->processUnit($unit, $fileReport);
- }
- foreach ($file->getFunctions() as $function) {
- $this->processFunction($function, $fileReport);
- }
- foreach ($file->getCoverageData() as $line => $tests) {
- if (!is_array($tests) || count($tests) == 0) {
- continue;
- }
- $coverage = $fileReport->getLineCoverage($line);
- foreach ($tests as $test) {
- $coverage->addTest($test);
- }
- $coverage->finalize();
- }
- $this->initTargetDirectory(
- $this->target . dirname($file->getId()) . '/'
- );
- $fileDom = $fileReport->asDom();
- $fileDom->formatOutput = true;
- $fileDom->preserveWhiteSpace = false;
- $fileDom->save($this->target . $file->getId() . '.xml');
- }
- private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report)
- {
- if (isset($unit['className'])) {
- $unitObject = $report->getClassObject($unit['className']);
- } else {
- $unitObject = $report->getTraitObject($unit['traitName']);
- }
- $unitObject->setLines(
- $unit['startLine'],
- $unit['executableLines'],
- $unit['executedLines']
- );
- $unitObject->setCrap($unit['crap']);
- $unitObject->setPackage(
- $unit['package']['fullPackage'],
- $unit['package']['package'],
- $unit['package']['subpackage'],
- $unit['package']['category']
- );
- $unitObject->setNamespace($unit['package']['namespace']);
- foreach ($unit['methods'] as $method) {
- $methodObject = $unitObject->addMethod($method['methodName']);
- $methodObject->setSignature($method['signature']);
- $methodObject->setLines($method['startLine'], $method['endLine']);
- $methodObject->setCrap($method['crap']);
- $methodObject->setTotals(
- $method['executableLines'],
- $method['executedLines'],
- $method['coverage']
- );
- }
- }
- private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report)
- {
- $functionObject = $report->getFunctionObject($function['functionName']);
- $functionObject->setSignature($function['signature']);
- $functionObject->setLines($function['startLine']);
- $functionObject->setCrap($function['crap']);
- $functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']);
- }
- private function processTests(array $tests)
- {
- $testsObject = $this->project->getTests();
- foreach ($tests as $test => $result) {
- if ($test == 'UNCOVERED_FILES_FROM_WHITELIST') {
- continue;
- }
- $testsObject->addTest($test, $result);
- }
- }
- private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals)
- {
- $loc = $node->getLinesOfCode();
- $totals->setNumLines(
- $loc['loc'],
- $loc['cloc'],
- $loc['ncloc'],
- $node->getNumExecutableLines(),
- $node->getNumExecutedLines()
- );
- $totals->setNumClasses(
- $node->getNumClasses(),
- $node->getNumTestedClasses()
- );
- $totals->setNumTraits(
- $node->getNumTraits(),
- $node->getNumTestedTraits()
- );
- $totals->setNumMethods(
- $node->getNumMethods(),
- $node->getNumTestedMethods()
- );
- $totals->setNumFunctions(
- $node->getNumFunctions(),
- $node->getNumTestedFunctions()
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Uses var_export() to write a PHP_CodeCoverage object to a file.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author uyga <iamuyga@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_PHP
- {
- /**
- * @param PHP_CodeCoverage $coverage
- * @param string $target
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $target = null)
- {
- $filter = $coverage->filter();
- $output = sprintf(
- '<?php
- $coverage = new PHP_CodeCoverage;
- $coverage->setData(%s);
- $coverage->setTests(%s);
- $filter = $coverage->filter();
- $filter->setBlacklistedFiles(%s);
- $filter->setWhitelistedFiles(%s);
- return $coverage;',
- var_export($coverage->getData(true), 1),
- var_export($coverage->getTests(), 1),
- var_export($filter->getBlacklistedFiles(), 1),
- var_export($filter->getWhitelistedFiles(), 1)
- );
- if ($target !== null) {
- return file_put_contents($target, $output);
- } else {
- return $output;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Generates human readable output from an PHP_CodeCoverage object.
- *
- * The output gets put into a text file our written to the CLI.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.1.0
- */
- class PHP_CodeCoverage_Report_Text
- {
- protected $lowUpperBound;
- protected $highLowerBound;
- protected $showUncoveredFiles;
- protected $showOnlySummary;
- protected $colors = array(
- 'green' => "\x1b[30;42m",
- 'yellow' => "\x1b[30;43m",
- 'red' => "\x1b[37;41m",
- 'header' => "\x1b[1;37;40m",
- 'reset' => "\x1b[0m",
- 'eol' => "\x1b[2K",
- );
- public function __construct($lowUpperBound, $highLowerBound, $showUncoveredFiles, $showOnlySummary)
- {
- $this->lowUpperBound = $lowUpperBound;
- $this->highLowerBound = $highLowerBound;
- $this->showUncoveredFiles = $showUncoveredFiles;
- $this->showOnlySummary = $showOnlySummary;
- }
- /**
- * @param PHP_CodeCoverage $coverage
- * @param bool $showColors
- * @return string
- */
- public function process(PHP_CodeCoverage $coverage, $showColors = false)
- {
- $output = PHP_EOL . PHP_EOL;
- $report = $coverage->getReport();
- unset($coverage);
- $colors = array(
- 'header' => '',
- 'classes' => '',
- 'methods' => '',
- 'lines' => '',
- 'reset' => '',
- 'eol' => ''
- );
- if ($showColors) {
- $colors['classes'] = $this->getCoverageColor(
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits()
- );
- $colors['methods'] = $this->getCoverageColor(
- $report->getNumTestedMethods(),
- $report->getNumMethods()
- );
- $colors['lines'] = $this->getCoverageColor(
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines()
- );
- $colors['reset'] = $this->colors['reset'];
- $colors['header'] = $this->colors['header'];
- $colors['eol'] = $this->colors['eol'];
- }
- $classes = sprintf(
- ' Classes: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits(),
- true
- ),
- $report->getNumTestedClassesAndTraits(),
- $report->getNumClassesAndTraits()
- );
- $methods = sprintf(
- ' Methods: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumTestedMethods(),
- $report->getNumMethods(),
- true
- ),
- $report->getNumTestedMethods(),
- $report->getNumMethods()
- );
- $lines = sprintf(
- ' Lines: %6s (%d/%d)',
- PHP_CodeCoverage_Util::percent(
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines(),
- true
- ),
- $report->getNumExecutedLines(),
- $report->getNumExecutableLines()
- );
- $padding = max(array_map('strlen', array($classes, $methods, $lines)));
- if ($this->showOnlySummary) {
- $title = 'Code Coverage Report Summary:';
- $padding = max($padding, strlen($title));
- $output .= $this->format($colors['header'], $padding, $title);
- } else {
- $date = date(' Y-m-d H:i:s', $_SERVER['REQUEST_TIME']);
- $title = 'Code Coverage Report:';
- $output .= $this->format($colors['header'], $padding, $title);
- $output .= $this->format($colors['header'], $padding, $date);
- $output .= $this->format($colors['header'], $padding, '');
- $output .= $this->format($colors['header'], $padding, ' Summary:');
- }
- $output .= $this->format($colors['classes'], $padding, $classes);
- $output .= $this->format($colors['methods'], $padding, $methods);
- $output .= $this->format($colors['lines'], $padding, $lines);
- if ($this->showOnlySummary) {
- return $output . PHP_EOL;
- }
- $classCoverage = array();
- foreach ($report as $item) {
- if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
- continue;
- }
- $classes = $item->getClassesAndTraits();
- foreach ($classes as $className => $class) {
- $classStatements = 0;
- $coveredClassStatements = 0;
- $coveredMethods = 0;
- $classMethods = 0;
- foreach ($class['methods'] as $method) {
- if ($method['executableLines'] == 0) {
- continue;
- }
- $classMethods++;
- $classStatements += $method['executableLines'];
- $coveredClassStatements += $method['executedLines'];
- if ($method['coverage'] == 100) {
- $coveredMethods++;
- }
- }
- if (!empty($class['package']['namespace'])) {
- $namespace = '\\' . $class['package']['namespace'] . '::';
- } elseif (!empty($class['package']['fullPackage'])) {
- $namespace = '@' . $class['package']['fullPackage'] . '::';
- } else {
- $namespace = '';
- }
- $classCoverage[$namespace . $className] = array(
- 'namespace' => $namespace,
- 'className ' => $className,
- 'methodsCovered' => $coveredMethods,
- 'methodCount' => $classMethods,
- 'statementsCovered' => $coveredClassStatements,
- 'statementCount' => $classStatements,
- );
- }
- }
- ksort($classCoverage);
- $methodColor = '';
- $linesColor = '';
- $resetColor = '';
- foreach ($classCoverage as $fullQualifiedPath => $classInfo) {
- if ($classInfo['statementsCovered'] != 0 ||
- $this->showUncoveredFiles) {
- if ($showColors) {
- $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']);
- $linesColor = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']);
- $resetColor = $colors['reset'];
- }
- $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL
- . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '
- . ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor
- ;
- }
- }
- return $output . PHP_EOL;
- }
- protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElements)
- {
- $coverage = PHP_CodeCoverage_Util::percent(
- $numberOfCoveredElements,
- $totalNumberOfElements
- );
- if ($coverage >= $this->highLowerBound) {
- return $this->colors['green'];
- } elseif ($coverage > $this->lowUpperBound) {
- return $this->colors['yellow'];
- }
- return $this->colors['red'];
- }
- protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $presicion)
- {
- $format = '%' . $presicion . 's';
- return PHP_CodeCoverage_Util::percent(
- $numberOfCoveredElements,
- $totalNumberOfElements,
- true,
- true
- ) .
- ' (' . sprintf($format, $numberOfCoveredElements) . '/' .
- sprintf($format, $totalNumberOfElements) . ')';
- }
- private function format($color, $padding, $string)
- {
- $reset = $color ? $this->colors['reset'] : '';
- return $color . str_pad($string, $padding) . $reset . PHP_EOL;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception that is raised when code is unintentionally covered.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 2.0.0
- */
- class PHP_CodeCoverage_Exception_UnintentionallyCoveredCode extends PHP_CodeCoverage_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for code coverage drivers.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- interface PHP_CodeCoverage_Driver
- {
- /**
- * Start collection of code coverage information.
- */
- public function start();
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop();
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Filter for blacklisting and whitelisting of code coverage information.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage_Filter
- {
- /**
- * Source files that are blacklisted.
- *
- * @var array
- */
- private $blacklistedFiles = array();
- /**
- * Source files that are whitelisted.
- *
- * @var array
- */
- private $whitelistedFiles = array();
- /**
- * Adds a directory to the blacklist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->addFileToBlacklist($file);
- }
- }
- /**
- * Adds a file to the blacklist.
- *
- * @param string $filename
- */
- public function addFileToBlacklist($filename)
- {
- $this->blacklistedFiles[realpath($filename)] = true;
- }
- /**
- * Adds files to the blacklist.
- *
- * @param array $files
- */
- public function addFilesToBlacklist(array $files)
- {
- foreach ($files as $file) {
- $this->addFileToBlacklist($file);
- }
- }
- /**
- * Removes a directory from the blacklist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->removeFileFromBlacklist($file);
- }
- }
- /**
- * Removes a file from the blacklist.
- *
- * @param string $filename
- */
- public function removeFileFromBlacklist($filename)
- {
- $filename = realpath($filename);
- if (isset($this->blacklistedFiles[$filename])) {
- unset($this->blacklistedFiles[$filename]);
- }
- }
- /**
- * Adds a directory to the whitelist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->addFileToWhitelist($file);
- }
- }
- /**
- * Adds a file to the whitelist.
- *
- * @param string $filename
- */
- public function addFileToWhitelist($filename)
- {
- $this->whitelistedFiles[realpath($filename)] = true;
- }
- /**
- * Adds files to the whitelist.
- *
- * @param array $files
- */
- public function addFilesToWhitelist(array $files)
- {
- foreach ($files as $file) {
- $this->addFileToWhitelist($file);
- }
- }
- /**
- * Removes a directory from the whitelist (recursively).
- *
- * @param string $directory
- * @param string $suffix
- * @param string $prefix
- */
- public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '')
- {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, $suffix, $prefix);
- foreach ($files as $file) {
- $this->removeFileFromWhitelist($file);
- }
- }
- /**
- * Removes a file from the whitelist.
- *
- * @param string $filename
- */
- public function removeFileFromWhitelist($filename)
- {
- $filename = realpath($filename);
- if (isset($this->whitelistedFiles[$filename])) {
- unset($this->whitelistedFiles[$filename]);
- }
- }
- /**
- * Checks whether a filename is a real filename.
- *
- * @param string $filename
- */
- public function isFile($filename)
- {
- if ($filename == '-' ||
- strpos($filename, 'vfs://') === 0 ||
- strpos($filename, 'xdebug://debug-eval') !== false ||
- strpos($filename, 'eval()\'d code') !== false ||
- strpos($filename, 'runtime-created function') !== false ||
- strpos($filename, 'runkit created function') !== false ||
- strpos($filename, 'assert code') !== false ||
- strpos($filename, 'regexp code') !== false) {
- return false;
- }
- return file_exists($filename);
- }
- /**
- * Checks whether or not a file is filtered.
- *
- * When the whitelist is empty (default), blacklisting is used.
- * When the whitelist is not empty, whitelisting is used.
- *
- * @param string $filename
- * @return boolean
- * @throws PHP_CodeCoverage_Exception
- */
- public function isFiltered($filename)
- {
- if (!$this->isFile($filename)) {
- return true;
- }
- $filename = realpath($filename);
- if (!empty($this->whitelistedFiles)) {
- return !isset($this->whitelistedFiles[$filename]);
- }
- return isset($this->blacklistedFiles[$filename]);
- }
- /**
- * Returns the list of blacklisted files.
- *
- * @return array
- */
- public function getBlacklist()
- {
- return array_keys($this->blacklistedFiles);
- }
- /**
- * Returns the list of whitelisted files.
- *
- * @return array
- */
- public function getWhitelist()
- {
- return array_keys($this->whitelistedFiles);
- }
- /**
- * Returns whether this filter has a whitelist.
- *
- * @return boolean
- * @since Method available since Release 1.1.0
- */
- public function hasWhitelist()
- {
- return !empty($this->whitelistedFiles);
- }
- /**
- * Returns the blacklisted files.
- *
- * @return array
- * @since Method available since Release 2.0.0
- */
- public function getBlacklistedFiles()
- {
- return $this->blacklistedFiles;
- }
- /**
- * Sets the blacklisted files.
- *
- * @param array $blacklistedFiles
- * @since Method available since Release 2.0.0
- */
- public function setBlacklistedFiles($blacklistedFiles)
- {
- $this->blacklistedFiles = $blacklistedFiles;
- }
- /**
- * Returns the whitelisted files.
- *
- * @return array
- * @since Method available since Release 2.0.0
- */
- public function getWhitelistedFiles()
- {
- return $this->whitelistedFiles;
- }
- /**
- * Sets the whitelisted files.
- *
- * @param array $whitelistedFiles
- * @since Method available since Release 2.0.0
- */
- public function setWhitelistedFiles($whitelistedFiles)
- {
- $this->whitelistedFiles = $whitelistedFiles;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHP_CodeCoverage_Exception objects that are used to describe
- * invalid arguments passed to a function or method.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.2.0
- */
- class PHP_CodeCoverage_Util_InvalidArgumentHelper
- {
- /**
- * @param integer $argument
- * @param string $type
- * @param mixed $value
- */
- public static function factory($argument, $type, $value = null)
- {
- $stack = debug_backtrace(false);
- return new PHP_CodeCoverage_Exception(
- sprintf(
- 'Argument #%d%sof %s::%s() must be a %s',
- $argument,
- $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ',
- $stack[1]['class'],
- $stack[1]['function'],
- $type
- )
- );
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Driver for HHVM's code coverage functionality.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.3.0
- * @codeCoverageIgnore
- */
- class PHP_CodeCoverage_Driver_HHVM implements PHP_CodeCoverage_Driver
- {
- /**
- * Constructor.
- */
- public function __construct()
- {
- if (!defined('HHVM_VERSION')) {
- throw new PHP_CodeCoverage_Exception('This driver requires HHVM');
- }
- }
- /**
- * Start collection of code coverage information.
- */
- public function start()
- {
- fb_enable_code_coverage();
- }
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop()
- {
- $codeCoverage = fb_get_code_coverage(true);
- fb_disable_code_coverage();
- return $codeCoverage;
- }
- }
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Driver for Xdebug's code coverage functionality.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- * @codeCoverageIgnore
- */
- class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver
- {
- /**
- * Constructor.
- */
- public function __construct()
- {
- if (!extension_loaded('xdebug')) {
- throw new PHP_CodeCoverage_Exception('This driver requires Xdebug');
- }
- if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') &&
- !ini_get('xdebug.coverage_enable')) {
- throw new PHP_CodeCoverage_Exception(
- 'xdebug.coverage_enable=On has to be set in php.ini'
- );
- }
- }
- /**
- * Start collection of code coverage information.
- */
- public function start()
- {
- xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
- }
- /**
- * Stop collection of code coverage information.
- *
- * @return array
- */
- public function stop()
- {
- $data = xdebug_get_code_coverage();
- xdebug_stop_code_coverage();
- return $this->cleanup($data);
- }
- /**
- * @param array $data
- * @return array
- * @since Method available since Release 2.0.0
- */
- private function cleanup(array $data)
- {
- foreach (array_keys($data) as $file) {
- if (isset($data[$file][0])) {
- unset($data[$file][0]);
- }
- if ($file != "xdebug://debug-eval" && file_exists($file)) {
- $numLines = $this->getNumberOfLinesInFile($file);
- foreach (array_keys($data[$file]) as $line) {
- if (isset($data[$file][$line]) && $line > $numLines) {
- unset($data[$file][$line]);
- }
- }
- }
- }
- return $data;
- }
- /**
- * @param string $file
- * @return integer
- * @since Method available since Release 2.0.0
- */
- private function getNumberOfLinesInFile($file)
- {
- $buffer = file_get_contents($file);
- $lines = substr_count($buffer, "\n");
- if (substr($buffer, -1) !== "\n") {
- $lines++;
- }
- return $lines;
- }
- }
- PHP_CodeCoverage
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHP_CodeCoverage package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Provides collection functionality for PHP code coverage information.
- *
- * @category PHP
- * @package CodeCoverage
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-code-coverage
- * @since Class available since Release 1.0.0
- */
- class PHP_CodeCoverage
- {
- /**
- * @var PHP_CodeCoverage_Driver
- */
- private $driver;
- /**
- * @var PHP_CodeCoverage_Filter
- */
- private $filter;
- /**
- * @var boolean
- */
- private $cacheTokens = false;
- /**
- * @var boolean
- */
- private $checkForUnintentionallyCoveredCode = false;
- /**
- * @var boolean
- */
- private $forceCoversAnnotation = false;
- /**
- * @var boolean
- */
- private $mapTestClassNameToCoveredClassName = false;
- /**
- * @var boolean
- */
- private $addUncoveredFilesFromWhitelist = true;
- /**
- * @var boolean
- */
- private $processUncoveredFilesFromWhitelist = false;
- /**
- * @var mixed
- */
- private $currentId;
- /**
- * Code coverage data.
- *
- * @var array
- */
- private $data = array();
- /**
- * @var array
- */
- private $ignoredLines = array();
- /**
- * Test data.
- *
- * @var array
- */
- private $tests = array();
- /**
- * Constructor.
- *
- * @param PHP_CodeCoverage_Driver $driver
- * @param PHP_CodeCoverage_Filter $filter
- * @throws PHP_CodeCoverage_Exception
- */
- public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null)
- {
- if ($driver === null) {
- $runtime = new Runtime;
- if ($runtime->isHHVM()) {
- $driver = new PHP_CodeCoverage_Driver_HHVM;
- } elseif ($runtime->hasXdebug()) {
- $driver = new PHP_CodeCoverage_Driver_Xdebug;
- } else {
- throw new PHP_CodeCoverage_Exception('No code coverage driver available');
- }
- }
- if ($filter === null) {
- $filter = new PHP_CodeCoverage_Filter;
- }
- $this->driver = $driver;
- $this->filter = $filter;
- }
- /**
- * Returns the PHP_CodeCoverage_Report_Node_* object graph
- * for this PHP_CodeCoverage object.
- *
- * @return PHP_CodeCoverage_Report_Node_Directory
- * @since Method available since Release 1.1.0
- */
- public function getReport()
- {
- $factory = new PHP_CodeCoverage_Report_Factory;
- return $factory->create($this);
- }
- /**
- * Clears collected code coverage data.
- */
- public function clear()
- {
- $this->currentId = null;
- $this->data = array();
- $this->tests = array();
- }
- /**
- * Returns the PHP_CodeCoverage_Filter used.
- *
- * @return PHP_CodeCoverage_Filter
- */
- public function filter()
- {
- return $this->filter;
- }
- /**
- * Returns the collected code coverage data.
- * Set $raw = true to bypass all filters.
- *
- * @param bool $raw
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getData($raw = false)
- {
- if (!$raw && $this->addUncoveredFilesFromWhitelist) {
- $this->addUncoveredFilesFromWhitelist();
- }
- // We need to apply the blacklist filter a second time
- // when no whitelist is used.
- if (!$raw && !$this->filter->hasWhitelist()) {
- $this->applyListsFilter($this->data);
- }
- return $this->data;
- }
- /**
- * Sets the coverage data.
- *
- * @param array $data
- * @since Method available since Release 2.0.0
- */
- public function setData(array $data)
- {
- $this->data = $data;
- }
- /**
- * Returns the test data.
- *
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getTests()
- {
- return $this->tests;
- }
- /**
- * Sets the test data.
- *
- * @param array $tests
- * @since Method available since Release 2.0.0
- */
- public function setTests(array $tests)
- {
- $this->tests = $tests;
- }
- /**
- * Start collection of code coverage information.
- *
- * @param mixed $id
- * @param boolean $clear
- * @throws PHP_CodeCoverage_Exception
- */
- public function start($id, $clear = false)
- {
- if (!is_bool($clear)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- if ($clear) {
- $this->clear();
- }
- $this->currentId = $id;
- $this->driver->start();
- }
- /**
- * Stop collection of code coverage information.
- *
- * @param boolean $append
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @return array
- * @throws PHP_CodeCoverage_Exception
- */
- public function stop($append = true, $linesToBeCovered = array(), array $linesToBeUsed = array())
- {
- if (!is_bool($append)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or false'
- );
- }
- $data = $this->driver->stop();
- $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed);
- $this->currentId = null;
- return $data;
- }
- /**
- * Appends code coverage data.
- *
- * @param array $data
- * @param mixed $id
- * @param boolean $append
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception
- */
- public function append(array $data, $id = null, $append = true, $linesToBeCovered = array(), array $linesToBeUsed = array())
- {
- if ($id === null) {
- $id = $this->currentId;
- }
- if ($id === null) {
- throw new PHP_CodeCoverage_Exception;
- }
- $this->applyListsFilter($data);
- $this->applyIgnoredLinesFilter($data);
- $this->initializeFilesThatAreSeenTheFirstTime($data);
- if (!$append) {
- return;
- }
- if ($id != 'UNCOVERED_FILES_FROM_WHITELIST') {
- $this->applyCoversAnnotationFilter(
- $data,
- $linesToBeCovered,
- $linesToBeUsed
- );
- }
- if (empty($data)) {
- return;
- }
- $size = 'unknown';
- $status = null;
- if ($id instanceof PHPUnit_Framework_TestCase) {
- $_size = $id->getSize();
- if ($_size == PHPUnit_Util_Test::SMALL) {
- $size = 'small';
- } elseif ($_size == PHPUnit_Util_Test::MEDIUM) {
- $size = 'medium';
- } elseif ($_size == PHPUnit_Util_Test::LARGE) {
- $size = 'large';
- }
- $status = $id->getStatus();
- $id = get_class($id) . '::' . $id->getName();
- } elseif ($id instanceof PHPUnit_Extensions_PhptTestCase) {
- $size = 'large';
- $id = $id->getName();
- }
- $this->tests[$id] = array('size' => $size, 'status' => $status);
- foreach ($data as $file => $lines) {
- if (!$this->filter->isFile($file)) {
- continue;
- }
- foreach ($lines as $k => $v) {
- if ($v == 1) {
- if (empty($this->data[$file][$k]) || !in_array($id, $this->data[$file][$k])) {
- $this->data[$file][$k][] = $id;
- }
- }
- }
- }
- }
- /**
- * Merges the data from another instance of PHP_CodeCoverage.
- *
- * @param PHP_CodeCoverage $that
- */
- public function merge(PHP_CodeCoverage $that)
- {
- foreach ($that->data as $file => $lines) {
- if (!isset($this->data[$file])) {
- if (!$this->filter->isFiltered($file)) {
- $this->data[$file] = $lines;
- }
- continue;
- }
- foreach ($lines as $line => $data) {
- if ($data !== null) {
- if (!isset($this->data[$file][$line])) {
- $this->data[$file][$line] = $data;
- } else {
- $this->data[$file][$line] = array_unique(
- array_merge($this->data[$file][$line], $data)
- );
- }
- }
- }
- }
- $this->tests = array_merge($this->tests, $that->getTests());
- $this->filter->setBlacklistedFiles(
- array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles())
- );
- $this->filter->setWhitelistedFiles(
- array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles())
- );
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 1.1.0
- */
- public function setCacheTokens($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->cacheTokens = $flag;
- }
- /**
- * @since Method available since Release 1.1.0
- */
- public function getCacheTokens()
- {
- return $this->cacheTokens;
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 2.0.0
- */
- public function setCheckForUnintentionallyCoveredCode($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->checkForUnintentionallyCoveredCode = $flag;
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setForceCoversAnnotation($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->forceCoversAnnotation = $flag;
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setMapTestClassNameToCoveredClassName($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->mapTestClassNameToCoveredClassName = $flag;
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setAddUncoveredFilesFromWhitelist($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->addUncoveredFilesFromWhitelist = $flag;
- }
- /**
- * @param boolean $flag
- * @throws PHP_CodeCoverage_Exception
- */
- public function setProcessUncoveredFilesFromWhitelist($flag)
- {
- if (!is_bool($flag)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'boolean'
- );
- }
- $this->processUncoveredFilesFromWhitelist = $flag;
- }
- /**
- * Applies the @covers annotation filtering.
- *
- * @param array $data
- * @param mixed $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
- */
- private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed)
- {
- if ($linesToBeCovered === false ||
- ($this->forceCoversAnnotation && empty($linesToBeCovered))) {
- $data = array();
- return;
- }
- if (empty($linesToBeCovered)) {
- return;
- }
- if ($this->checkForUnintentionallyCoveredCode) {
- $this->performUnintentionallyCoveredCodeCheck(
- $data,
- $linesToBeCovered,
- $linesToBeUsed
- );
- }
- $data = array_intersect_key($data, $linesToBeCovered);
- foreach (array_keys($data) as $filename) {
- $_linesToBeCovered = array_flip($linesToBeCovered[$filename]);
- $data[$filename] = array_intersect_key(
- $data[$filename],
- $_linesToBeCovered
- );
- }
- }
- /**
- * Applies the blacklist/whitelist filtering.
- *
- * @param array $data
- */
- private function applyListsFilter(array &$data)
- {
- foreach (array_keys($data) as $filename) {
- if ($this->filter->isFiltered($filename)) {
- unset($data[$filename]);
- }
- }
- }
- /**
- * Applies the "ignored lines" filtering.
- *
- * @param array $data
- */
- private function applyIgnoredLinesFilter(array &$data)
- {
- foreach (array_keys($data) as $filename) {
- if (!$this->filter->isFile($filename)) {
- continue;
- }
- foreach ($this->getLinesToBeIgnored($filename) as $line) {
- unset($data[$filename][$line]);
- }
- }
- }
- /**
- * @param array $data
- * @since Method available since Release 1.1.0
- */
- private function initializeFilesThatAreSeenTheFirstTime(array $data)
- {
- foreach ($data as $file => $lines) {
- if ($this->filter->isFile($file) && !isset($this->data[$file])) {
- $this->data[$file] = array();
- foreach ($lines as $k => $v) {
- $this->data[$file][$k] = $v == -2 ? null : array();
- }
- }
- }
- }
- /**
- * Processes whitelisted files that are not covered.
- */
- private function addUncoveredFilesFromWhitelist()
- {
- $data = array();
- $uncoveredFiles = array_diff(
- $this->filter->getWhitelist(),
- array_keys($this->data)
- );
- foreach ($uncoveredFiles as $uncoveredFile) {
- if (!file_exists($uncoveredFile)) {
- continue;
- }
- if ($this->processUncoveredFilesFromWhitelist) {
- $this->processUncoveredFileFromWhitelist(
- $uncoveredFile,
- $data,
- $uncoveredFiles
- );
- } else {
- $data[$uncoveredFile] = array();
- $lines = count(file($uncoveredFile));
- for ($i = 1; $i <= $lines; $i++) {
- $data[$uncoveredFile][$i] = -1;
- }
- }
- }
- $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST');
- }
- /**
- * @param string $uncoveredFile
- * @param array $data
- * @param array $uncoveredFiles
- */
- private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, array $uncoveredFiles)
- {
- $this->driver->start();
- include_once $uncoveredFile;
- $coverage = $this->driver->stop();
- foreach ($coverage as $file => $fileCoverage) {
- if (!isset($data[$file]) &&
- in_array($file, $uncoveredFiles)) {
- foreach (array_keys($fileCoverage) as $key) {
- if ($fileCoverage[$key] == 1) {
- $fileCoverage[$key] = -1;
- }
- }
- $data[$file] = $fileCoverage;
- }
- }
- }
- /**
- * Returns the lines of a source file that should be ignored.
- *
- * @param string $filename
- * @return array
- * @throws PHP_CodeCoverage_Exception
- * @since Method available since Release 2.0.0
- */
- private function getLinesToBeIgnored($filename)
- {
- if (!is_string($filename)) {
- throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
- 1,
- 'string'
- );
- }
- if (!isset($this->ignoredLines[$filename])) {
- $this->ignoredLines[$filename] = array();
- $ignore = false;
- $stop = false;
- $lines = file($filename);
- $numLines = count($lines);
- foreach ($lines as $index => $line) {
- if (!trim($line)) {
- $this->ignoredLines[$filename][] = $index + 1;
- }
- }
- if ($this->cacheTokens) {
- $tokens = PHP_Token_Stream_CachingFactory::get($filename);
- } else {
- $tokens = new PHP_Token_Stream($filename);
- }
- $classes = array_merge($tokens->getClasses(), $tokens->getTraits());
- $tokens = $tokens->tokens();
- foreach ($tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_COMMENT':
- case 'PHP_Token_DOC_COMMENT':
- $_token = trim($token);
- $_line = trim($lines[$token->getLine() - 1]);
- if ($_token == '// @codeCoverageIgnore' ||
- $_token == '//@codeCoverageIgnore') {
- $ignore = true;
- $stop = true;
- } elseif ($_token == '// @codeCoverageIgnoreStart' ||
- $_token == '//@codeCoverageIgnoreStart') {
- $ignore = true;
- } elseif ($_token == '// @codeCoverageIgnoreEnd' ||
- $_token == '//@codeCoverageIgnoreEnd') {
- $stop = true;
- }
- if (!$ignore) {
- $start = $token->getLine();
- $end = $start + substr_count($token, "\n");
- // Do not ignore the first line when there is a token
- // before the comment
- if (0 !== strpos($_token, $_line)) {
- $start++;
- }
- for ($i = $start; $i < $end; $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- // A DOC_COMMENT token or a COMMENT token starting with "/*"
- // does not contain the final \n character in its text
- if (isset($lines[$i-1]) && 0 === strpos($_token, '/*') && '*/' === substr(trim($lines[$i-1]), -2)) {
- $this->ignoredLines[$filename][] = $i;
- }
- }
- break;
- case 'PHP_Token_INTERFACE':
- case 'PHP_Token_TRAIT':
- case 'PHP_Token_CLASS':
- case 'PHP_Token_FUNCTION':
- $docblock = $token->getDocblock();
- $this->ignoredLines[$filename][] = $token->getLine();
- if (strpos($docblock, '@codeCoverageIgnore')) {
- $endLine = $token->getEndLine();
- for ($i = $token->getLine(); $i <= $endLine; $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- } elseif ($token instanceof PHP_Token_INTERFACE ||
- $token instanceof PHP_Token_TRAIT ||
- $token instanceof PHP_Token_CLASS) {
- if (empty($classes[$token->getName()]['methods'])) {
- for ($i = $token->getLine();
- $i <= $token->getEndLine();
- $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- } else {
- $firstMethod = array_shift(
- $classes[$token->getName()]['methods']
- );
- do {
- $lastMethod = array_pop(
- $classes[$token->getName()]['methods']
- );
- } while ($lastMethod !== null &&
- substr($lastMethod['signature'], 0, 18) == 'anonymous function');
- if ($lastMethod === null) {
- $lastMethod = $firstMethod;
- }
- for ($i = $token->getLine();
- $i < $firstMethod['startLine'];
- $i++) {
- $this->ignoredLines[$filename][] = $i;
- }
- for ($i = $token->getEndLine();
- $i > $lastMethod['endLine'];
- $i--) {
- $this->ignoredLines[$filename][] = $i;
- }
- }
- }
- break;
- case 'PHP_Token_NAMESPACE':
- $this->ignoredLines[$filename][] = $token->getEndLine();
- // Intentional fallthrough
- case 'PHP_Token_OPEN_TAG':
- case 'PHP_Token_CLOSE_TAG':
- case 'PHP_Token_USE':
- $this->ignoredLines[$filename][] = $token->getLine();
- break;
- }
- if ($ignore) {
- $this->ignoredLines[$filename][] = $token->getLine();
- if ($stop) {
- $ignore = false;
- $stop = false;
- }
- }
- }
- $this->ignoredLines[$filename][] = $numLines + 1;
- $this->ignoredLines[$filename] = array_unique(
- $this->ignoredLines[$filename]
- );
- sort($this->ignoredLines[$filename]);
- }
- return $this->ignoredLines[$filename];
- }
- /**
- * @param array $data
- * @param array $linesToBeCovered
- * @param array $linesToBeUsed
- * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode
- * @since Method available since Release 2.0.0
- */
- private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed)
- {
- $allowedLines = $this->getAllowedLines(
- $linesToBeCovered,
- $linesToBeUsed
- );
- $message = '';
- foreach ($data as $file => $_data) {
- foreach ($_data as $line => $flag) {
- if ($flag == 1 &&
- (!isset($allowedLines[$file]) ||
- !isset($allowedLines[$file][$line]))) {
- $message .= sprintf(
- '- %s:%d' . PHP_EOL,
- $file,
- $line
- );
- }
- }
- }
- if (!empty($message)) {
- throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode(
- $message
- );
- }
- }
- /**
- * @param array $linesToBeCovered
- * @param array $linesToBeUsed
- * @return array
- * @since Method available since Release 2.0.0
- */
- private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed)
- {
- $allowedLines = array();
- foreach (array_keys($linesToBeCovered) as $file) {
- if (!isset($allowedLines[$file])) {
- $allowedLines[$file] = array();
- }
- $allowedLines[$file] = array_merge(
- $allowedLines[$file],
- $linesToBeCovered[$file]
- );
- }
- foreach (array_keys($linesToBeUsed) as $file) {
- if (!isset($allowedLines[$file])) {
- $allowedLines[$file] = array();
- }
- $allowedLines[$file] = array_merge(
- $allowedLines[$file],
- $linesToBeUsed[$file]
- );
- }
- foreach (array_keys($allowedLines) as $file) {
- $allowedLines[$file] = array_flip(
- array_unique($allowedLines[$file])
- );
- }
- return $allowedLines;
- }
- }
- Copyright (c) 2004-2015 Fabien Potencier
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is furnished
- to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- use Symfony\Component\Yaml\Exception\DumpException;
- /**
- * Inline implements a YAML parser/dumper for the YAML inline syntax.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Inline
- {
- const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';
- private static $exceptionOnInvalidType = false;
- private static $objectSupport = false;
- private static $objectForMap = false;
- /**
- * Converts a YAML string to a PHP array.
- *
- * @param string $value A YAML string
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- * @param array $references Mapping of variable names to values
- *
- * @return array A PHP array representing the YAML string
- *
- * @throws ParseException
- */
- public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false, $references = array())
- {
- self::$exceptionOnInvalidType = $exceptionOnInvalidType;
- self::$objectSupport = $objectSupport;
- self::$objectForMap = $objectForMap;
- $value = trim($value);
- if (0 == strlen($value)) {
- return '';
- }
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding('ASCII');
- }
- $i = 0;
- switch ($value[0]) {
- case '[':
- $result = self::parseSequence($value, $i, $references);
- ++$i;
- break;
- case '{':
- $result = self::parseMapping($value, $i, $references);
- ++$i;
- break;
- default:
- $result = self::parseScalar($value, null, array('"', "'"), $i, true, $references);
- }
- // some comments are allowed at the end
- if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
- throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return $result;
- }
- /**
- * Dumps a given PHP variable to a YAML string.
- *
- * @param mixed $value The PHP variable to convert
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML string representing the PHP array
- *
- * @throws DumpException When trying to dump PHP resource
- */
- public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- switch (true) {
- case is_resource($value):
- if ($exceptionOnInvalidType) {
- throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
- }
- return 'null';
- case is_object($value):
- if ($objectSupport) {
- return '!!php/object:'.serialize($value);
- }
- if ($exceptionOnInvalidType) {
- throw new DumpException('Object support when dumping a YAML file has been disabled.');
- }
- return 'null';
- case is_array($value):
- return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport);
- case null === $value:
- return 'null';
- case true === $value:
- return 'true';
- case false === $value:
- return 'false';
- case ctype_digit($value):
- return is_string($value) ? "'$value'" : (int) $value;
- case is_numeric($value):
- $locale = setlocale(LC_NUMERIC, 0);
- if (false !== $locale) {
- setlocale(LC_NUMERIC, 'C');
- }
- if (is_float($value)) {
- $repr = (string) $value;
- if (is_infinite($value)) {
- $repr = str_ireplace('INF', '.Inf', $repr);
- } elseif (floor($value) == $value && $repr == $value) {
- // Preserve float data type since storing a whole number will result in integer value.
- $repr = '!!float '.$repr;
- }
- } else {
- $repr = is_string($value) ? "'$value'" : (string) $value;
- }
- if (false !== $locale) {
- setlocale(LC_NUMERIC, $locale);
- }
- return $repr;
- case '' == $value:
- return "''";
- case Escaper::requiresDoubleQuoting($value):
- return Escaper::escapeWithDoubleQuotes($value);
- case Escaper::requiresSingleQuoting($value):
- case preg_match(self::getHexRegex(), $value):
- case preg_match(self::getTimestampRegex(), $value):
- return Escaper::escapeWithSingleQuotes($value);
- default:
- return $value;
- }
- }
- /**
- * Dumps a PHP array to a YAML string.
- *
- * @param array $value The PHP array to dump
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML string representing the PHP array
- */
- private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport)
- {
- // array
- $keys = array_keys($value);
- $keysCount = count($keys);
- if ((1 === $keysCount && '0' == $keys[0])
- || ($keysCount > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) === $keysCount * ($keysCount - 1) / 2)
- ) {
- $output = array();
- foreach ($value as $val) {
- $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport);
- }
- return sprintf('[%s]', implode(', ', $output));
- }
- // mapping
- $output = array();
- foreach ($value as $key => $val) {
- $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport));
- }
- return sprintf('{ %s }', implode(', ', $output));
- }
- /**
- * Parses a scalar to a YAML string.
- *
- * @param string $scalar
- * @param string $delimiters
- * @param array $stringDelimiters
- * @param int &$i
- * @param bool $evaluate
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array())
- {
- if (in_array($scalar[$i], $stringDelimiters)) {
- // quoted scalar
- $output = self::parseQuotedScalar($scalar, $i);
- if (null !== $delimiters) {
- $tmp = ltrim(substr($scalar, $i), ' ');
- if (!in_array($tmp[0], $delimiters)) {
- throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
- }
- }
- } else {
- // "normal" string
- if (!$delimiters) {
- $output = substr($scalar, $i);
- $i += strlen($output);
- // remove comments
- if (false !== $strpos = strpos($output, ' #')) {
- $output = rtrim(substr($output, 0, $strpos));
- }
- } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
- $output = $match[1];
- $i += strlen($output);
- } else {
- throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar));
- }
- if ($evaluate) {
- $output = self::evaluateScalar($output, $references);
- }
- }
- return $output;
- }
- /**
- * Parses a quoted scalar to YAML.
- *
- * @param string $scalar
- * @param int &$i
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseQuotedScalar($scalar, &$i)
- {
- if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
- throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
- }
- $output = substr($match[0], 1, strlen($match[0]) - 2);
- $unescaper = new Unescaper();
- if ('"' == $scalar[$i]) {
- $output = $unescaper->unescapeDoubleQuotedString($output);
- } else {
- $output = $unescaper->unescapeSingleQuotedString($output);
- }
- $i += strlen($match[0]);
- return $output;
- }
- /**
- * Parses a sequence to a YAML string.
- *
- * @param string $sequence
- * @param int &$i
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseSequence($sequence, &$i = 0, $references = array())
- {
- $output = array();
- $len = strlen($sequence);
- ++$i;
- // [foo, bar, ...]
- while ($i < $len) {
- switch ($sequence[$i]) {
- case '[':
- // nested sequence
- $output[] = self::parseSequence($sequence, $i, $references);
- break;
- case '{':
- // nested mapping
- $output[] = self::parseMapping($sequence, $i, $references);
- break;
- case ']':
- return $output;
- case ',':
- case ' ':
- break;
- default:
- $isQuoted = in_array($sequence[$i], array('"', "'"));
- $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i, true, $references);
- // the value can be an array if a reference has been resolved to an array var
- if (!is_array($value) && !$isQuoted && false !== strpos($value, ': ')) {
- // embedded mapping?
- try {
- $pos = 0;
- $value = self::parseMapping('{'.$value.'}', $pos, $references);
- } catch (\InvalidArgumentException $e) {
- // no, it's not
- }
- }
- $output[] = $value;
- --$i;
- }
- ++$i;
- }
- throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence));
- }
- /**
- * Parses a mapping to a YAML string.
- *
- * @param string $mapping
- * @param int &$i
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException When malformed inline YAML string is parsed
- */
- private static function parseMapping($mapping, &$i = 0, $references = array())
- {
- $output = array();
- $len = strlen($mapping);
- ++$i;
- // {foo: bar, bar:foo, ...}
- while ($i < $len) {
- switch ($mapping[$i]) {
- case ' ':
- case ',':
- ++$i;
- continue 2;
- case '}':
- if (self::$objectForMap) {
- return (object) $output;
- }
- return $output;
- }
- // key
- $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);
- // value
- $done = false;
- while ($i < $len) {
- switch ($mapping[$i]) {
- case '[':
- // nested sequence
- $value = self::parseSequence($mapping, $i, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- break;
- case '{':
- // nested mapping
- $value = self::parseMapping($mapping, $i, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- break;
- case ':':
- case ' ':
- break;
- default:
- $value = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i, true, $references);
- // Spec: Keys MUST be unique; first one wins.
- // Parser cannot abort this mapping earlier, since lines
- // are processed sequentially.
- if (!isset($output[$key])) {
- $output[$key] = $value;
- }
- $done = true;
- --$i;
- }
- ++$i;
- if ($done) {
- continue 2;
- }
- }
- }
- throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping));
- }
- /**
- * Evaluates scalars and replaces magic values.
- *
- * @param string $scalar
- * @param array $references
- *
- * @return string A YAML string
- *
- * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
- */
- private static function evaluateScalar($scalar, $references = array())
- {
- $scalar = trim($scalar);
- $scalarLower = strtolower($scalar);
- if (0 === strpos($scalar, '*')) {
- if (false !== $pos = strpos($scalar, '#')) {
- $value = substr($scalar, 1, $pos - 2);
- } else {
- $value = substr($scalar, 1);
- }
- // an unquoted *
- if (false === $value || '' === $value) {
- throw new ParseException('A reference must contain at least one character.');
- }
- if (!array_key_exists($value, $references)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $value));
- }
- return $references[$value];
- }
- switch (true) {
- case 'null' === $scalarLower:
- case '' === $scalar:
- case '~' === $scalar:
- return;
- case 'true' === $scalarLower:
- return true;
- case 'false' === $scalarLower:
- return false;
- // Optimise for returning strings.
- case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
- switch (true) {
- case 0 === strpos($scalar, '!str'):
- return (string) substr($scalar, 5);
- case 0 === strpos($scalar, '! '):
- return (int) self::parseScalar(substr($scalar, 2));
- case 0 === strpos($scalar, '!!php/object:'):
- if (self::$objectSupport) {
- return unserialize(substr($scalar, 13));
- }
- if (self::$exceptionOnInvalidType) {
- throw new ParseException('Object support when parsing a YAML file has been disabled.');
- }
- return;
- case 0 === strpos($scalar, '!!float '):
- return (float) substr($scalar, 8);
- case ctype_digit($scalar):
- $raw = $scalar;
- $cast = (int) $scalar;
- return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
- case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
- $raw = $scalar;
- $cast = (int) $scalar;
- return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw);
- case is_numeric($scalar):
- case preg_match(self::getHexRegex(), $scalar):
- return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
- case '.inf' === $scalarLower:
- case '.nan' === $scalarLower:
- return -log(0);
- case '-.inf' === $scalarLower:
- return log(0);
- case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
- return (float) str_replace(',', '', $scalar);
- case preg_match(self::getTimestampRegex(), $scalar):
- return strtotime($scalar);
- }
- default:
- return (string) $scalar;
- }
- }
- /**
- * Gets a regex that matches a YAML date.
- *
- * @return string The regular expression
- *
- * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
- */
- private static function getTimestampRegex()
- {
- return <<<EOF
- ~^
- (?P<year>[0-9][0-9][0-9][0-9])
- -(?P<month>[0-9][0-9]?)
- -(?P<day>[0-9][0-9]?)
- (?:(?:[Tt]|[ \t]+)
- (?P<hour>[0-9][0-9]?)
- :(?P<minute>[0-9][0-9])
- :(?P<second>[0-9][0-9])
- (?:\.(?P<fraction>[0-9]*))?
- (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
- (?::(?P<tz_minute>[0-9][0-9]))?))?)?
- $~x
- EOF;
- }
- /**
- * Gets a regex that matches a YAML number in hexadecimal notation.
- *
- * @return string
- */
- private static function getHexRegex()
- {
- return '~^0x[0-9a-f]++$~i';
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Unescaper encapsulates unescaping rules for single and double-quoted
- * YAML strings.
- *
- * @author Matthew Lewinski <matthew@lewinski.org>
- */
- class Unescaper
- {
- /**
- * Parser and Inline assume UTF-8 encoding, so escaped Unicode characters
- * must be converted to that encoding.
- *
- * @deprecated since version 2.5, to be removed in 3.0
- * @internal
- */
- const ENCODING = 'UTF-8';
- /**
- * Regex fragment that matches an escaped character in a double quoted string.
- */
- const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})";
- /**
- * Unescapes a single quoted string.
- *
- * @param string $value A single quoted string.
- *
- * @return string The unescaped string.
- */
- public function unescapeSingleQuotedString($value)
- {
- return str_replace('\'\'', '\'', $value);
- }
- /**
- * Unescapes a double quoted string.
- *
- * @param string $value A double quoted string.
- *
- * @return string The unescaped string.
- */
- public function unescapeDoubleQuotedString($value)
- {
- $self = $this;
- $callback = function ($match) use ($self) {
- return $self->unescapeCharacter($match[0]);
- };
- // evaluate the string
- return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
- }
- /**
- * Unescapes a character that was found in a double-quoted string.
- *
- * @param string $value An escaped character
- *
- * @return string The unescaped character
- */
- public function unescapeCharacter($value)
- {
- switch ($value{1}) {
- case '0':
- return "\x0";
- case 'a':
- return "\x7";
- case 'b':
- return "\x8";
- case 't':
- return "\t";
- case "\t":
- return "\t";
- case 'n':
- return "\n";
- case 'v':
- return "\xB";
- case 'f':
- return "\xC";
- case 'r':
- return "\r";
- case 'e':
- return "\x1B";
- case ' ':
- return ' ';
- case '"':
- return '"';
- case '/':
- return '/';
- case '\\':
- return '\\';
- case 'N':
- // U+0085 NEXT LINE
- return "\xC2\x85";
- case '_':
- // U+00A0 NO-BREAK SPACE
- return "\xC2\xA0";
- case 'L':
- // U+2028 LINE SEPARATOR
- return "\xE2\x80\xA8";
- case 'P':
- // U+2029 PARAGRAPH SEPARATOR
- return "\xE2\x80\xA9";
- case 'x':
- return self::utf8chr(hexdec(substr($value, 2, 2)));
- case 'u':
- return self::utf8chr(hexdec(substr($value, 2, 4)));
- case 'U':
- return self::utf8chr(hexdec(substr($value, 2, 8)));
- }
- }
- /**
- * Get the UTF-8 character for the given code point.
- *
- * @param int $c The unicode code point
- *
- * @return string The corresponding UTF-8 character
- */
- private static function utf8chr($c)
- {
- if (0x80 > $c %= 0x200000) {
- return chr($c);
- }
- if (0x800 > $c) {
- return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
- }
- if (0x10000 > $c) {
- return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
- }
- return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- /**
- * Yaml offers convenience methods to load and dump YAML.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class Yaml
- {
- /**
- * Parses YAML into a PHP array.
- *
- * The parse method, when supplied with a YAML stream (string or file),
- * will do its best to convert YAML in a file into a PHP array.
- *
- * Usage:
- * <code>
- * $array = Yaml::parse(file_get_contents('config.yml'));
- * print_r($array);
- * </code>
- *
- * As this method accepts both plain strings and file names as an input,
- * you must validate the input before calling this method. Passing a file
- * as an input is a deprecated feature and will be removed in 3.0.
- *
- * @param string $input Path to a YAML file or a string containing YAML
- * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
- * @param bool $objectSupport True if object support is enabled, false otherwise
- * @param bool $objectForMap True if maps should return a stdClass instead of array()
- *
- * @return array The YAML converted to a PHP array
- *
- * @throws ParseException If the YAML is not valid
- *
- * @deprecated The ability to pass file names to the Yaml::parse method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.
- *
- * @api
- */
- public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
- {
- // if input is a file, process it
- $file = '';
- if (strpos($input, "\n") === false && is_file($input)) {
- trigger_error('The ability to pass file names to the '.__METHOD__.' method is deprecated since version 2.2 and will be removed in 3.0. Pass the YAML contents of the file instead.', E_USER_DEPRECATED);
- if (false === is_readable($input)) {
- throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input));
- }
- $file = $input;
- $input = file_get_contents($file);
- }
- $yaml = new Parser();
- try {
- return $yaml->parse($input, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } catch (ParseException $e) {
- if ($file) {
- $e->setParsedFile($file);
- }
- throw $e;
- }
- }
- /**
- * Dumps a PHP array to a YAML string.
- *
- * The dump method, when supplied with an array, will do its best
- * to convert the array into friendly YAML.
- *
- * @param array $array PHP array
- * @param int $inline The level where you switch to inline YAML
- * @param int $indent The amount of spaces to use for indentation of nested nodes.
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string A YAML string representing the original PHP array
- *
- * @api
- */
- public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- $yaml = new Dumper();
- $yaml->setIndentation($indent);
- return $yaml->dump($array, $inline, 0, $exceptionOnInvalidType, $objectSupport);
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during parsing.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class ParseException extends RuntimeException
- {
- private $parsedFile;
- private $parsedLine;
- private $snippet;
- private $rawMessage;
- /**
- * Constructor.
- *
- * @param string $message The error message
- * @param int $parsedLine The line where the error occurred
- * @param int $snippet The snippet of code near the problem
- * @param string $parsedFile The file name where the error occurred
- * @param \Exception $previous The previous exception
- */
- public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
- {
- $this->parsedFile = $parsedFile;
- $this->parsedLine = $parsedLine;
- $this->snippet = $snippet;
- $this->rawMessage = $message;
- $this->updateRepr();
- parent::__construct($this->message, 0, $previous);
- }
- /**
- * Gets the snippet of code near the error.
- *
- * @return string The snippet of code
- */
- public function getSnippet()
- {
- return $this->snippet;
- }
- /**
- * Sets the snippet of code near the error.
- *
- * @param string $snippet The code snippet
- */
- public function setSnippet($snippet)
- {
- $this->snippet = $snippet;
- $this->updateRepr();
- }
- /**
- * Gets the filename where the error occurred.
- *
- * This method returns null if a string is parsed.
- *
- * @return string The filename
- */
- public function getParsedFile()
- {
- return $this->parsedFile;
- }
- /**
- * Sets the filename where the error occurred.
- *
- * @param string $parsedFile The filename
- */
- public function setParsedFile($parsedFile)
- {
- $this->parsedFile = $parsedFile;
- $this->updateRepr();
- }
- /**
- * Gets the line where the error occurred.
- *
- * @return int The file line
- */
- public function getParsedLine()
- {
- return $this->parsedLine;
- }
- /**
- * Sets the line where the error occurred.
- *
- * @param int $parsedLine The file line
- */
- public function setParsedLine($parsedLine)
- {
- $this->parsedLine = $parsedLine;
- $this->updateRepr();
- }
- private function updateRepr()
- {
- $this->message = $this->rawMessage;
- $dot = false;
- if ('.' === substr($this->message, -1)) {
- $this->message = substr($this->message, 0, -1);
- $dot = true;
- }
- if (null !== $this->parsedFile) {
- if (PHP_VERSION_ID >= 50400) {
- $jsonOptions = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
- } else {
- $jsonOptions = 0;
- }
- $this->message .= sprintf(' in %s', json_encode($this->parsedFile, $jsonOptions));
- }
- if ($this->parsedLine >= 0) {
- $this->message .= sprintf(' at line %d', $this->parsedLine);
- }
- if ($this->snippet) {
- $this->message .= sprintf(' (near "%s")', $this->snippet);
- }
- if ($dot) {
- $this->message .= '.';
- }
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during dumping.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- class DumpException extends RuntimeException
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception class thrown when an error occurs during parsing.
- *
- * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
- */
- class RuntimeException extends \RuntimeException implements ExceptionInterface
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml\Exception;
- /**
- * Exception interface for all exceptions thrown by the component.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
- */
- interface ExceptionInterface
- {
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- use Symfony\Component\Yaml\Exception\ParseException;
- /**
- * Parser parses YAML strings to convert them to PHP arrays.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Parser
- {
- const FOLDED_SCALAR_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
- private $offset = 0;
- private $lines = array();
- private $currentLineNb = -1;
- private $currentLine = '';
- private $refs = array();
- /**
- * Constructor.
- *
- * @param int $offset The offset of YAML document (used for line numbers in error messages)
- */
- public function __construct($offset = 0)
- {
- $this->offset = $offset;
- }
- /**
- * Parses a YAML string to a PHP value.
- *
- * @param string $value A YAML string
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- *
- * @return mixed A PHP value
- *
- * @throws ParseException If the YAML is not valid
- */
- public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false, $objectForMap = false)
- {
- if (!preg_match('//u', $value)) {
- throw new ParseException('The YAML value does not appear to be valid UTF-8.');
- }
- $this->currentLineNb = -1;
- $this->currentLine = '';
- $value = $this->cleanup($value);
- $this->lines = explode("\n", $value);
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding('UTF-8');
- }
- $data = array();
- $context = null;
- $allowOverwrite = false;
- while ($this->moveToNextLine()) {
- if ($this->isCurrentLineEmpty()) {
- continue;
- }
- // tab?
- if ("\t" === $this->currentLine[0]) {
- throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- $isRef = $mergeNode = false;
- if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
- if ($context && 'mapping' == $context) {
- throw new ParseException('You cannot define a sequence item when in a mapping');
- }
- $context = 'sequence';
- if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
- $isRef = $matches['ref'];
- $values['value'] = $matches['value'];
- }
- // array
- if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $data[] = $parser->parse($this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } else {
- if (isset($values['leadspaces'])
- && preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)
- ) {
- // this is a compact notation element, add to next block and parse
- $c = $this->getRealCurrentLineNb();
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $block = $values['value'];
- if ($this->isNextLineIndented()) {
- $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1);
- }
- $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- } else {
- $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
- }
- }
- } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) {
- if ($context && 'sequence' == $context) {
- throw new ParseException('You cannot define a mapping item when in a sequence');
- }
- $context = 'mapping';
- // force correct settings
- Inline::parse(null, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- try {
- $key = Inline::parseScalar($values['key']);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- if ('<<' === $key) {
- $mergeNode = true;
- $allowOverwrite = true;
- if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
- $refName = substr($values['value'], 1);
- if (!array_key_exists($refName, $this->refs)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- $refValue = $this->refs[$refName];
- if (!is_array($refValue)) {
- throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- foreach ($refValue as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- if (isset($values['value']) && $values['value'] !== '') {
- $value = $values['value'];
- } else {
- $value = $this->getNextEmbedBlock();
- }
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap);
- if (!is_array($parsed)) {
- throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- if (isset($parsed[0])) {
- // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
- // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
- // in the sequence override keys specified in later mapping nodes.
- foreach ($parsed as $parsedItem) {
- if (!is_array($parsedItem)) {
- throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem);
- }
- foreach ($parsedItem as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- }
- } else {
- // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
- // current mapping, unless the key already exists in it.
- foreach ($parsed as $key => $value) {
- if (!isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- }
- }
- } elseif (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
- $isRef = $matches['ref'];
- $values['value'] = $matches['value'];
- }
- if ($mergeNode) {
- // Merge keys
- } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
- // hash
- // if next line is less indented or equal, then it means that the current value is null
- if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = null;
- }
- } else {
- $c = $this->getRealCurrentLineNb() + 1;
- $parser = new self($c);
- $parser->refs = &$this->refs;
- $value = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport, $objectForMap);
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
- // Spec: Keys MUST be unique; first one wins.
- // But overwriting is allowed when a merge node is used in current block.
- if ($allowOverwrite || !isset($data[$key])) {
- $data[$key] = $value;
- }
- }
- } else {
- // multiple documents are not supported
- if ('---' === $this->currentLine) {
- throw new ParseException('Multiple documents are not supported.');
- }
- // 1-liner optionally followed by newline(s)
- if ($this->lines[0] === trim($value)) {
- try {
- $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- if (is_array($value)) {
- $first = reset($value);
- if (is_string($first) && 0 === strpos($first, '*')) {
- $data = array();
- foreach ($value as $alias) {
- $data[] = $this->refs[substr($alias, 1)];
- }
- $value = $data;
- }
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return $value;
- }
- switch (preg_last_error()) {
- case PREG_INTERNAL_ERROR:
- $error = 'Internal PCRE error.';
- break;
- case PREG_BACKTRACK_LIMIT_ERROR:
- $error = 'pcre.backtrack_limit reached.';
- break;
- case PREG_RECURSION_LIMIT_ERROR:
- $error = 'pcre.recursion_limit reached.';
- break;
- case PREG_BAD_UTF8_ERROR:
- $error = 'Malformed UTF-8 data.';
- break;
- case PREG_BAD_UTF8_OFFSET_ERROR:
- $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
- break;
- default:
- $error = 'Unable to parse.';
- }
- throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- if ($isRef) {
- $this->refs[$isRef] = end($data);
- }
- }
- if (isset($mbEncoding)) {
- mb_internal_encoding($mbEncoding);
- }
- return empty($data) ? null : $data;
- }
- /**
- * Returns the current line number (takes the offset into account).
- *
- * @return int The current line number
- */
- private function getRealCurrentLineNb()
- {
- return $this->currentLineNb + $this->offset;
- }
- /**
- * Returns the current line indentation.
- *
- * @return int The current line indentation
- */
- private function getCurrentLineIndentation()
- {
- return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
- }
- /**
- * Returns the next embed block of YAML.
- *
- * @param int $indentation The indent level at which the block is to be read, or null for default
- * @param bool $inSequence True if the enclosing data structure is a sequence
- *
- * @return string A YAML string
- *
- * @throws ParseException When indentation problem are detected
- */
- private function getNextEmbedBlock($indentation = null, $inSequence = false)
- {
- $oldLineIndentation = $this->getCurrentLineIndentation();
- if (!$this->moveToNextLine()) {
- return;
- }
- if (null === $indentation) {
- $newIndent = $this->getCurrentLineIndentation();
- $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine);
- if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
- throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- } else {
- $newIndent = $indentation;
- }
- $data = array();
- if ($this->getCurrentLineIndentation() >= $newIndent) {
- $data[] = substr($this->currentLine, $newIndent);
- } else {
- $this->moveToPreviousLine();
- return;
- }
- if ($inSequence && $oldLineIndentation === $newIndent && '-' === $data[0][0]) {
- // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
- // and therefore no nested list or mapping
- $this->moveToPreviousLine();
- return;
- }
- $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine);
- // Comments must not be removed inside a string block (ie. after a line ending with "|")
- $removeCommentsPattern = '~'.self::FOLDED_SCALAR_PATTERN.'$~';
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
- while ($this->moveToNextLine()) {
- $indent = $this->getCurrentLineIndentation();
- if ($indent === $newIndent) {
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
- }
- if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine) && $newIndent === $indent) {
- $this->moveToPreviousLine();
- break;
- }
- if ($this->isCurrentLineBlank()) {
- $data[] = substr($this->currentLine, $newIndent);
- continue;
- }
- if ($removeComments && $this->isCurrentLineComment()) {
- continue;
- }
- if ($indent >= $newIndent) {
- $data[] = substr($this->currentLine, $newIndent);
- } elseif (0 == $indent) {
- $this->moveToPreviousLine();
- break;
- } else {
- throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
- }
- }
- return implode("\n", $data);
- }
- /**
- * Moves the parser to the next line.
- *
- * @return bool
- */
- private function moveToNextLine()
- {
- if ($this->currentLineNb >= count($this->lines) - 1) {
- return false;
- }
- $this->currentLine = $this->lines[++$this->currentLineNb];
- return true;
- }
- /**
- * Moves the parser to the previous line.
- */
- private function moveToPreviousLine()
- {
- $this->currentLine = $this->lines[--$this->currentLineNb];
- }
- /**
- * Parses a YAML value.
- *
- * @param string $value A YAML value
- * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
- * @param bool $objectSupport True if object support is enabled, false otherwise
- * @param bool $objectForMap true if maps should return a stdClass instead of array()
- *
- * @return mixed A PHP value
- *
- * @throws ParseException When reference does not exist
- */
- private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $objectForMap)
- {
- if (0 === strpos($value, '*')) {
- if (false !== $pos = strpos($value, '#')) {
- $value = substr($value, 1, $pos - 2);
- } else {
- $value = substr($value, 1);
- }
- if (!array_key_exists($value, $this->refs)) {
- throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine);
- }
- return $this->refs[$value];
- }
- if (preg_match('/^'.self::FOLDED_SCALAR_PATTERN.'$/', $value, $matches)) {
- $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
- return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers));
- }
- try {
- return Inline::parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
- } catch (ParseException $e) {
- $e->setParsedLine($this->getRealCurrentLineNb() + 1);
- $e->setSnippet($this->currentLine);
- throw $e;
- }
- }
- /**
- * Parses a folded scalar.
- *
- * @param string $separator The separator that was used to begin this folded scalar (| or >)
- * @param string $indicator The indicator that was used to begin this folded scalar (+ or -)
- * @param int $indentation The indentation that was used to begin this folded scalar
- *
- * @return string The text value
- */
- private function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
- {
- $notEOF = $this->moveToNextLine();
- if (!$notEOF) {
- return '';
- }
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- $text = '';
- // leading blank lines are consumed before determining indentation
- while ($notEOF && $isCurrentLineBlank) {
- // newline only if not EOF
- if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- }
- }
- // determine indentation if not specified
- if (0 === $indentation) {
- if (preg_match('/^ +/', $this->currentLine, $matches)) {
- $indentation = strlen($matches[0]);
- }
- }
- if ($indentation > 0) {
- $pattern = sprintf('/^ {%d}(.*)$/', $indentation);
- while (
- $notEOF && (
- $isCurrentLineBlank ||
- preg_match($pattern, $this->currentLine, $matches)
- )
- ) {
- if ($isCurrentLineBlank) {
- $text .= substr($this->currentLine, $indentation);
- } else {
- $text .= $matches[1];
- }
- // newline only if not EOF
- if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
- $isCurrentLineBlank = $this->isCurrentLineBlank();
- }
- }
- } elseif ($notEOF) {
- $text .= "\n";
- }
- if ($notEOF) {
- $this->moveToPreviousLine();
- }
- // replace all non-trailing single newlines with spaces in folded blocks
- if ('>' === $separator) {
- preg_match('/(\n*)$/', $text, $matches);
- $text = preg_replace('/(?<!\n)\n(?!\n)/', ' ', rtrim($text, "\n"));
- $text .= $matches[1];
- }
- // deal with trailing newlines as indicated
- if ('' === $indicator) {
- $text = preg_replace('/\n+$/s', "\n", $text);
- } elseif ('-' === $indicator) {
- $text = preg_replace('/\n+$/s', '', $text);
- }
- return $text;
- }
- /**
- * Returns true if the next line is indented.
- *
- * @return bool Returns true if the next line is indented, false otherwise
- */
- private function isNextLineIndented()
- {
- $currentIndentation = $this->getCurrentLineIndentation();
- $EOF = !$this->moveToNextLine();
- while (!$EOF && $this->isCurrentLineEmpty()) {
- $EOF = !$this->moveToNextLine();
- }
- if ($EOF) {
- return false;
- }
- $ret = false;
- if ($this->getCurrentLineIndentation() > $currentIndentation) {
- $ret = true;
- }
- $this->moveToPreviousLine();
- return $ret;
- }
- /**
- * Returns true if the current line is blank or if it is a comment line.
- *
- * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
- */
- private function isCurrentLineEmpty()
- {
- return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
- }
- /**
- * Returns true if the current line is blank.
- *
- * @return bool Returns true if the current line is blank, false otherwise
- */
- private function isCurrentLineBlank()
- {
- return '' == trim($this->currentLine, ' ');
- }
- /**
- * Returns true if the current line is a comment line.
- *
- * @return bool Returns true if the current line is a comment line, false otherwise
- */
- private function isCurrentLineComment()
- {
- //checking explicitly the first char of the trim is faster than loops or strpos
- $ltrimmedLine = ltrim($this->currentLine, ' ');
- return $ltrimmedLine[0] === '#';
- }
- /**
- * Cleanups a YAML string to be parsed.
- *
- * @param string $value The input YAML string
- *
- * @return string A cleaned up YAML string
- */
- private function cleanup($value)
- {
- $value = str_replace(array("\r\n", "\r"), "\n", $value);
- // strip YAML header
- $count = 0;
- $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
- $this->offset += $count;
- // remove leading comments
- $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
- if ($count == 1) {
- // items have been removed, update the offset
- $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
- $value = $trimmedValue;
- }
- // remove start of the document marker (---)
- $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
- if ($count == 1) {
- // items have been removed, update the offset
- $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
- $value = $trimmedValue;
- // remove end of the document marker (...)
- $value = preg_replace('#\.\.\.\s*$#s', '', $value);
- }
- return $value;
- }
- /**
- * Returns true if the next line starts unindented collection.
- *
- * @return bool Returns true if the next line starts unindented collection, false otherwise
- */
- private function isNextLineUnIndentedCollection()
- {
- $currentIndentation = $this->getCurrentLineIndentation();
- $notEOF = $this->moveToNextLine();
- while ($notEOF && $this->isCurrentLineEmpty()) {
- $notEOF = $this->moveToNextLine();
- }
- if (false === $notEOF) {
- return false;
- }
- $ret = false;
- if (
- $this->getCurrentLineIndentation() == $currentIndentation
- &&
- $this->isStringUnIndentedCollectionItem($this->currentLine)
- ) {
- $ret = true;
- }
- $this->moveToPreviousLine();
- return $ret;
- }
- /**
- * Returns true if the string is un-indented collection item.
- *
- * @return bool Returns true if the string is un-indented collection item, false otherwise
- */
- private function isStringUnIndentedCollectionItem()
- {
- return (0 === strpos($this->currentLine, '- '));
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Dumper dumps PHP variables to YAML strings.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class Dumper
- {
- /**
- * The amount of spaces to use for indentation of nested nodes.
- *
- * @var int
- */
- protected $indentation = 4;
- /**
- * Sets the indentation.
- *
- * @param int $num The amount of spaces to use for indentation of nested nodes.
- */
- public function setIndentation($num)
- {
- $this->indentation = (int) $num;
- }
- /**
- * Dumps a PHP value to YAML.
- *
- * @param mixed $input The PHP value
- * @param int $inline The level where you switch to inline YAML
- * @param int $indent The level of indentation (used internally)
- * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
- * @param bool $objectSupport true if object support is enabled, false otherwise
- *
- * @return string The YAML representation of the PHP value
- */
- public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false)
- {
- $output = '';
- $prefix = $indent ? str_repeat(' ', $indent) : '';
- if ($inline <= 0 || !is_array($input) || empty($input)) {
- $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport);
- } else {
- $isAHash = array_keys($input) !== range(0, count($input) - 1);
- foreach ($input as $key => $value) {
- $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);
- $output .= sprintf('%s%s%s%s',
- $prefix,
- $isAHash ? Inline::dump($key, $exceptionOnInvalidType, $objectSupport).':' : '-',
- $willBeInlined ? ' ' : "\n",
- $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $exceptionOnInvalidType, $objectSupport)
- ).($willBeInlined ? "\n" : '');
- }
- }
- return $output;
- }
- }
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Yaml;
- /**
- * Escaper encapsulates escaping rules for single and double-quoted
- * YAML strings.
- *
- * @author Matthew Lewinski <matthew@lewinski.org>
- */
- class Escaper
- {
- // Characters that would cause a dumped string to require double quoting.
- const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";
- // Mapping arrays for escaping a double quoted string. The backslash is
- // first to ensure proper escaping because str_replace operates iteratively
- // on the input arrays. This ordering of the characters avoids the use of strtr,
- // which performs more slowly.
- private static $escapees = array('\\', '\\\\', '\\"', '"',
- "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07",
- "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f",
- "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17",
- "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f",
- "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",);
- private static $escaped = array('\\\\', '\\"', '\\\\', '\\"',
- '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
- '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f',
- '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
- '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f',
- '\\N', '\\_', '\\L', '\\P',);
- /**
- * Determines if a PHP value would require double quoting in YAML.
- *
- * @param string $value A PHP value
- *
- * @return bool True if the value would require double quotes.
- */
- public static function requiresDoubleQuoting($value)
- {
- return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
- }
- /**
- * Escapes and surrounds a PHP value with double quotes.
- *
- * @param string $value A PHP value
- *
- * @return string The quoted, escaped string
- */
- public static function escapeWithDoubleQuotes($value)
- {
- return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value));
- }
- /**
- * Determines if a PHP value would require single quoting in YAML.
- *
- * @param string $value A PHP value
- *
- * @return bool True if the value would require single quotes.
- */
- public static function requiresSingleQuoting($value)
- {
- // Determines if a PHP value is entirely composed of a value that would
- // require single quoting in YAML.
- if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) {
- return true;
- }
- // Determines if the PHP value contains any single characters that would
- // cause it to require single quoting in YAML.
- return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value);
- }
- /**
- * Escapes and surrounds a PHP value with single quotes.
- *
- * @param string $value A PHP value
- *
- * @return string The quoted, escaped string
- */
- public static function escapeWithSingleQuotes($value)
- {
- return sprintf("'%s'", str_replace('\'', '\'\'', $value));
- }
- }
- -----BEGIN CERTIFICATE-----
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
- MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
- IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
- MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
- FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
- bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
- dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
- H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
- uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
- mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
- a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
- E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
- WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
- VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
- Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
- cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
- IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
- AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
- YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
- Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
- c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
- mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
- -----END CERTIFICATE-----
- Copyright (c) 2014 Doctrine Project
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator;
- /**
- * Instantiator provides utility methods to build objects without invoking their constructors
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- interface InstantiatorInterface
- {
- /**
- * @param string $className
- *
- * @return object
- *
- * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
- */
- public function instantiate($className);
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- /**
- * Base exception marker interface for the instantiator component
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- interface ExceptionInterface
- {
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- use InvalidArgumentException as BaseInvalidArgumentException;
- use ReflectionClass;
- /**
- * Exception for invalid arguments provided to the instantiator
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
- {
- /**
- * @param string $className
- *
- * @return self
- */
- public static function fromNonExistingClass($className)
- {
- if (interface_exists($className)) {
- return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
- }
- if (PHP_VERSION_ID >= 50400 && trait_exists($className)) {
- return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className));
- }
- return new self(sprintf('The provided class "%s" does not exist', $className));
- }
- /**
- * @param ReflectionClass $reflectionClass
- *
- * @return self
- */
- public static function fromAbstractClass(ReflectionClass $reflectionClass)
- {
- return new self(sprintf(
- 'The provided class "%s" is abstract, and can not be instantiated',
- $reflectionClass->getName()
- ));
- }
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator\Exception;
- use Exception;
- use ReflectionClass;
- use UnexpectedValueException as BaseUnexpectedValueException;
- /**
- * Exception for given parameters causing invalid/unexpected state on instantiation
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
- {
- /**
- * @param ReflectionClass $reflectionClass
- * @param Exception $exception
- *
- * @return self
- */
- public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception)
- {
- return new self(
- sprintf(
- 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
- $reflectionClass->getName()
- ),
- 0,
- $exception
- );
- }
- /**
- * @param ReflectionClass $reflectionClass
- * @param string $errorString
- * @param int $errorCode
- * @param string $errorFile
- * @param int $errorLine
- *
- * @return UnexpectedValueException
- */
- public static function fromUncleanUnSerialization(
- ReflectionClass $reflectionClass,
- $errorString,
- $errorCode,
- $errorFile,
- $errorLine
- ) {
- return new self(
- sprintf(
- 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
- . 'in file "%s" at line "%d"',
- $reflectionClass->getName(),
- $errorFile,
- $errorLine
- ),
- 0,
- new Exception($errorString, $errorCode)
- );
- }
- }
- <?php
- /*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
- namespace Doctrine\Instantiator;
- use Closure;
- use Doctrine\Instantiator\Exception\InvalidArgumentException;
- use Doctrine\Instantiator\Exception\UnexpectedValueException;
- use Exception;
- use ReflectionClass;
- /**
- * {@inheritDoc}
- *
- * @author Marco Pivetta <ocramius@gmail.com>
- */
- final class Instantiator implements InstantiatorInterface
- {
- /**
- * Markers used internally by PHP to define whether {@see \unserialize} should invoke
- * the method {@see \Serializable::unserialize()} when dealing with classes implementing
- * the {@see \Serializable} interface.
- */
- const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
- const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
- /**
- * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes
- */
- private static $cachedInstantiators = array();
- /**
- * @var object[] of objects that can directly be cloned
- */
- private static $cachedCloneables = array();
- /**
- * {@inheritDoc}
- */
- public function instantiate($className)
- {
- if (isset(self::$cachedCloneables[$className])) {
- return clone self::$cachedCloneables[$className];
- }
- if (isset(self::$cachedInstantiators[$className])) {
- $factory = self::$cachedInstantiators[$className];
- return $factory();
- }
- $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
- $instance = $factory();
- $reflection = new ReflectionClass($instance);
- if ($this->isSafeToClone($reflection)) {
- self::$cachedCloneables[$className] = clone $instance;
- }
- return $instance;
- }
- /**
- * @internal
- * @private
- *
- * Builds a {@see \Closure} capable of instantiating the given $className without
- * invoking its constructor.
- * This method is only exposed as public because of PHP 5.3 compatibility. Do not
- * use this method in your own code
- *
- * @param string $className
- *
- * @return Closure
- */
- public function buildFactory($className)
- {
- $reflectionClass = $this->getReflectionClass($className);
- if ($this->isInstantiableViaReflection($reflectionClass)) {
- return function () use ($reflectionClass) {
- return $reflectionClass->newInstanceWithoutConstructor();
- };
- }
- $serializedString = sprintf(
- '%s:%d:"%s":0:{}',
- $this->getSerializationFormat($reflectionClass),
- strlen($className),
- $className
- );
- $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
- return function () use ($serializedString) {
- return unserialize($serializedString);
- };
- }
- /**
- * @param string $className
- *
- * @return ReflectionClass
- *
- * @throws InvalidArgumentException
- */
- private function getReflectionClass($className)
- {
- if (! class_exists($className)) {
- throw InvalidArgumentException::fromNonExistingClass($className);
- }
- $reflection = new ReflectionClass($className);
- if ($reflection->isAbstract()) {
- throw InvalidArgumentException::fromAbstractClass($reflection);
- }
- return $reflection;
- }
- /**
- * @param ReflectionClass $reflectionClass
- * @param string $serializedString
- *
- * @throws UnexpectedValueException
- *
- * @return void
- */
- private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString)
- {
- set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) {
- $error = UnexpectedValueException::fromUncleanUnSerialization(
- $reflectionClass,
- $message,
- $code,
- $file,
- $line
- );
- });
- try {
- unserialize($serializedString);
- } catch (Exception $exception) {
- restore_error_handler();
- throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
- }
- restore_error_handler();
- if ($error) {
- throw $error;
- }
- }
- /**
- * @param ReflectionClass $reflectionClass
- *
- * @return bool
- */
- private function isInstantiableViaReflection(ReflectionClass $reflectionClass)
- {
- if (\PHP_VERSION_ID >= 50600) {
- return ! ($reflectionClass->isInternal() && $reflectionClass->isFinal());
- }
- return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass);
- }
- /**
- * Verifies whether the given class is to be considered internal
- *
- * @param ReflectionClass $reflectionClass
- *
- * @return bool
- */
- private function hasInternalAncestors(ReflectionClass $reflectionClass)
- {
- do {
- if ($reflectionClass->isInternal()) {
- return true;
- }
- } while ($reflectionClass = $reflectionClass->getParentClass());
- return false;
- }
- /**
- * Verifies if the given PHP version implements the `Serializable` interface serialization
- * with an incompatible serialization format. If that's the case, use serialization marker
- * "C" instead of "O".
- *
- * @link http://news.php.net/php.internals/74654
- *
- * @param ReflectionClass $reflectionClass
- *
- * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER
- * or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER
- */
- private function getSerializationFormat(ReflectionClass $reflectionClass)
- {
- if ($this->isPhpVersionWithBrokenSerializationFormat()
- && $reflectionClass->implementsInterface('Serializable')
- ) {
- return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER;
- }
- return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER;
- }
- /**
- * Checks whether the current PHP runtime uses an incompatible serialization format
- *
- * @return bool
- */
- private function isPhpVersionWithBrokenSerializationFormat()
- {
- return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513;
- }
- /**
- * Checks if a class is cloneable
- *
- * @param ReflectionClass $reflection
- *
- * @return bool
- */
- private function isSafeToClone(ReflectionClass $reflection)
- {
- if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) {
- return false;
- }
- // not cloneable if it implements `__clone`, as we want to avoid calling it
- return ! $reflection->hasMethod('__clone');
- }
- }
- PHP_TokenStream
- Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A caching factory for token stream objects.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- class PHP_Token_Stream_CachingFactory
- {
- /**
- * @var array
- */
- protected static $cache = array();
- /**
- * @param string $filename
- * @return PHP_Token_Stream
- */
- public static function get($filename)
- {
- if (!isset(self::$cache[$filename])) {
- self::$cache[$filename] = new PHP_Token_Stream($filename);
- }
- return self::$cache[$filename];
- }
- /**
- * @param string $filename
- */
- public static function clear($filename = NULL)
- {
- if (is_string($filename)) {
- unset(self::$cache[$filename]);
- } else {
- self::$cache = array();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A stream of PHP tokens.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
- {
- /**
- * @var array
- */
- protected static $customTokens = array(
- '(' => 'PHP_Token_OPEN_BRACKET',
- ')' => 'PHP_Token_CLOSE_BRACKET',
- '[' => 'PHP_Token_OPEN_SQUARE',
- ']' => 'PHP_Token_CLOSE_SQUARE',
- '{' => 'PHP_Token_OPEN_CURLY',
- '}' => 'PHP_Token_CLOSE_CURLY',
- ';' => 'PHP_Token_SEMICOLON',
- '.' => 'PHP_Token_DOT',
- ',' => 'PHP_Token_COMMA',
- '=' => 'PHP_Token_EQUAL',
- '<' => 'PHP_Token_LT',
- '>' => 'PHP_Token_GT',
- '+' => 'PHP_Token_PLUS',
- '-' => 'PHP_Token_MINUS',
- '*' => 'PHP_Token_MULT',
- '/' => 'PHP_Token_DIV',
- '?' => 'PHP_Token_QUESTION_MARK',
- '!' => 'PHP_Token_EXCLAMATION_MARK',
- ':' => 'PHP_Token_COLON',
- '"' => 'PHP_Token_DOUBLE_QUOTES',
- '@' => 'PHP_Token_AT',
- '&' => 'PHP_Token_AMPERSAND',
- '%' => 'PHP_Token_PERCENT',
- '|' => 'PHP_Token_PIPE',
- '$' => 'PHP_Token_DOLLAR',
- '^' => 'PHP_Token_CARET',
- '~' => 'PHP_Token_TILDE',
- '`' => 'PHP_Token_BACKTICK'
- );
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var array
- */
- protected $tokens = array();
- /**
- * @var integer
- */
- protected $position = 0;
- /**
- * @var array
- */
- protected $linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
- /**
- * @var array
- */
- protected $classes;
- /**
- * @var array
- */
- protected $functions;
- /**
- * @var array
- */
- protected $includes;
- /**
- * @var array
- */
- protected $interfaces;
- /**
- * @var array
- */
- protected $traits;
- /**
- * @var array
- */
- protected $lineToFunctionMap = array();
- /**
- * Constructor.
- *
- * @param string $sourceCode
- */
- public function __construct($sourceCode)
- {
- if (is_file($sourceCode)) {
- $this->filename = $sourceCode;
- $sourceCode = file_get_contents($sourceCode);
- }
- $this->scan($sourceCode);
- }
- /**
- * Destructor.
- */
- public function __destruct()
- {
- $this->tokens = array();
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $buffer = '';
- foreach ($this as $token) {
- $buffer .= $token;
- }
- return $buffer;
- }
- /**
- * @return string
- * @since Method available since Release 1.1.0
- */
- public function getFilename()
- {
- return $this->filename;
- }
- /**
- * Scans the source for sequences of characters and converts them into a
- * stream of tokens.
- *
- * @param string $sourceCode
- */
- protected function scan($sourceCode)
- {
- $line = 1;
- $tokens = token_get_all($sourceCode);
- $numTokens = count($tokens);
- $lastNonWhitespaceTokenWasDoubleColon = FALSE;
- for ($i = 0; $i < $numTokens; ++$i) {
- $token = $tokens[$i];
- unset($tokens[$i]);
- if (is_array($token)) {
- $name = substr(token_name($token[0]), 2);
- $text = $token[1];
- if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') {
- $name = 'CLASS_NAME_CONSTANT';
- }
- $tokenClass = 'PHP_Token_' . $name;
- } else {
- $text = $token;
- $tokenClass = self::$customTokens[$token];
- }
- $this->tokens[] = new $tokenClass($text, $line, $this, $i);
- $lines = substr_count($text, "\n");
- $line += $lines;
- if ($tokenClass == 'PHP_Token_HALT_COMPILER') {
- break;
- }
- else if ($tokenClass == 'PHP_Token_COMMENT' ||
- $tokenClass == 'PHP_Token_DOC_COMMENT') {
- $this->linesOfCode['cloc'] += $lines + 1;
- }
- if ($name == 'DOUBLE_COLON') {
- $lastNonWhitespaceTokenWasDoubleColon = TRUE;
- }
- else if ($name != 'WHITESPACE') {
- $lastNonWhitespaceTokenWasDoubleColon = FALSE;
- }
- }
- $this->linesOfCode['loc'] = substr_count($sourceCode, "\n");
- $this->linesOfCode['ncloc'] = $this->linesOfCode['loc'] -
- $this->linesOfCode['cloc'];
- }
- /**
- * @return integer
- */
- public function count()
- {
- return count($this->tokens);
- }
- /**
- * @return PHP_Token[]
- */
- public function tokens()
- {
- return $this->tokens;
- }
- /**
- * @return array
- */
- public function getClasses()
- {
- if ($this->classes !== NULL) {
- return $this->classes;
- }
- $this->parse();
- return $this->classes;
- }
- /**
- * @return array
- */
- public function getFunctions()
- {
- if ($this->functions !== NULL) {
- return $this->functions;
- }
- $this->parse();
- return $this->functions;
- }
- /**
- * @return array
- */
- public function getInterfaces()
- {
- if ($this->interfaces !== NULL) {
- return $this->interfaces;
- }
- $this->parse();
- return $this->interfaces;
- }
- /**
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getTraits()
- {
- if ($this->traits !== NULL) {
- return $this->traits;
- }
- $this->parse();
- return $this->traits;
- }
- /**
- * Gets the names of all files that have been included
- * using include(), include_once(), require() or require_once().
- *
- * Parameter $categorize set to TRUE causing this function to return a
- * multi-dimensional array with categories in the keys of the first dimension
- * and constants and their values in the second dimension.
- *
- * Parameter $category allow to filter following specific inclusion type
- *
- * @param bool $categorize OPTIONAL
- * @param string $category OPTIONAL Either 'require_once', 'require',
- * 'include_once', 'include'.
- * @return array
- * @since Method available since Release 1.1.0
- */
- public function getIncludes($categorize = FALSE, $category = NULL)
- {
- if ($this->includes === NULL) {
- $this->includes = array(
- 'require_once' => array(),
- 'require' => array(),
- 'include_once' => array(),
- 'include' => array()
- );
- foreach ($this->tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_REQUIRE_ONCE':
- case 'PHP_Token_REQUIRE':
- case 'PHP_Token_INCLUDE_ONCE':
- case 'PHP_Token_INCLUDE': {
- $this->includes[$token->getType()][] = $token->getName();
- }
- break;
- }
- }
- }
- if (isset($this->includes[$category])) {
- $includes = $this->includes[$category];
- }
- else if ($categorize === FALSE) {
- $includes = array_merge(
- $this->includes['require_once'],
- $this->includes['require'],
- $this->includes['include_once'],
- $this->includes['include']
- );
- } else {
- $includes = $this->includes;
- }
- return $includes;
- }
- /**
- * Returns the name of the function or method a line belongs to.
- *
- * @return string or null if the line is not in a function or method
- * @since Method available since Release 1.2.0
- */
- public function getFunctionForLine($line)
- {
- $this->parse();
- if (isset($this->lineToFunctionMap[$line])) {
- return $this->lineToFunctionMap[$line];
- }
- }
- protected function parse()
- {
- $this->interfaces = array();
- $this->classes = array();
- $this->traits = array();
- $this->functions = array();
- $class = FALSE;
- $classEndLine = FALSE;
- $trait = FALSE;
- $traitEndLine = FALSE;
- $interface = FALSE;
- $interfaceEndLine = FALSE;
- foreach ($this->tokens as $token) {
- switch (get_class($token)) {
- case 'PHP_Token_HALT_COMPILER': {
- return;
- }
- break;
- case 'PHP_Token_INTERFACE': {
- $interface = $token->getName();
- $interfaceEndLine = $token->getEndLine();
- $this->interfaces[$interface] = array(
- 'methods' => array(),
- 'parent' => $token->getParent(),
- 'keywords' => $token->getKeywords(),
- 'docblock' => $token->getDocblock(),
- 'startLine' => $token->getLine(),
- 'endLine' => $interfaceEndLine,
- 'package' => $token->getPackage(),
- 'file' => $this->filename
- );
- }
- break;
- case 'PHP_Token_CLASS':
- case 'PHP_Token_TRAIT': {
- $tmp = array(
- 'methods' => array(),
- 'parent' => $token->getParent(),
- 'interfaces'=> $token->getInterfaces(),
- 'keywords' => $token->getKeywords(),
- 'docblock' => $token->getDocblock(),
- 'startLine' => $token->getLine(),
- 'endLine' => $token->getEndLine(),
- 'package' => $token->getPackage(),
- 'file' => $this->filename
- );
- if ($token instanceof PHP_Token_CLASS) {
- $class = $token->getName();
- $classEndLine = $token->getEndLine();
- $this->classes[$class] = $tmp;
- } else {
- $trait = $token->getName();
- $traitEndLine = $token->getEndLine();
- $this->traits[$trait] = $tmp;
- }
- }
- break;
- case 'PHP_Token_FUNCTION': {
- $name = $token->getName();
- $tmp = array(
- 'docblock' => $token->getDocblock(),
- 'keywords' => $token->getKeywords(),
- 'visibility'=> $token->getVisibility(),
- 'signature' => $token->getSignature(),
- 'startLine' => $token->getLine(),
- 'endLine' => $token->getEndLine(),
- 'ccn' => $token->getCCN(),
- 'file' => $this->filename
- );
- if ($class === FALSE &&
- $trait === FALSE &&
- $interface === FALSE) {
- $this->functions[$name] = $tmp;
- $this->addFunctionToMap(
- $name, $tmp['startLine'], $tmp['endLine']
- );
- }
- else if ($class !== FALSE) {
- $this->classes[$class]['methods'][$name] = $tmp;
- $this->addFunctionToMap(
- $class . '::' . $name,
- $tmp['startLine'],
- $tmp['endLine']
- );
- }
- else if ($trait !== FALSE) {
- $this->traits[$trait]['methods'][$name] = $tmp;
- $this->addFunctionToMap(
- $trait . '::' . $name,
- $tmp['startLine'],
- $tmp['endLine']
- );
- }
- else {
- $this->interfaces[$interface]['methods'][$name] = $tmp;
- }
- }
- break;
- case 'PHP_Token_CLOSE_CURLY': {
- if ($classEndLine !== FALSE &&
- $classEndLine == $token->getLine()) {
- $class = FALSE;
- $classEndLine = FALSE;
- }
- else if ($traitEndLine !== FALSE &&
- $traitEndLine == $token->getLine()) {
- $trait = FALSE;
- $traitEndLine = FALSE;
- }
- else if ($interfaceEndLine !== FALSE &&
- $interfaceEndLine == $token->getLine()) {
- $interface = FALSE;
- $interfaceEndLine = FALSE;
- }
- }
- break;
- }
- }
- }
- /**
- * @return array
- */
- public function getLinesOfCode()
- {
- return $this->linesOfCode;
- }
- /**
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * @return boolean
- */
- public function valid()
- {
- return isset($this->tokens[$this->position]);
- }
- /**
- * @return integer
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * @return PHP_Token
- */
- public function current()
- {
- return $this->tokens[$this->position];
- }
- /**
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * @param mixed $offset
- */
- public function offsetExists($offset)
- {
- return isset($this->tokens[$offset]);
- }
- /**
- * @param mixed $offset
- * @return mixed
- */
- public function offsetGet($offset)
- {
- return $this->tokens[$offset];
- }
- /**
- * @param mixed $offset
- * @param mixed $value
- */
- public function offsetSet($offset, $value)
- {
- $this->tokens[$offset] = $value;
- }
- /**
- * @param mixed $offset
- */
- public function offsetUnset($offset)
- {
- unset($this->tokens[$offset]);
- }
- /**
- * Seek to an absolute position.
- *
- * @param integer $position
- * @throws OutOfBoundsException
- */
- public function seek($position)
- {
- $this->position = $position;
- if (!$this->valid()) {
- throw new OutOfBoundsException('Invalid seek position');
- }
- }
- private function addFunctionToMap($name, $startLine, $endLine)
- {
- for ($line = $startLine; $line <= $endLine; $line++) {
- $this->lineToFunctionMap[$line] = $name;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHP_TokenStream package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A PHP token.
- *
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-token-stream/tree
- * @since Class available since Release 1.0.0
- */
- abstract class PHP_Token
- {
- /**
- * @var string
- */
- protected $text;
- /**
- * @var integer
- */
- protected $line;
- /**
- * @var PHP_Token_Stream
- */
- protected $tokenStream;
- /**
- * @var integer
- */
- protected $id;
- /**
- * Constructor.
- *
- * @param string $text
- * @param integer $line
- * @param PHP_Token_Stream $tokenStream
- * @param integer $id
- */
- public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
- {
- $this->text = $text;
- $this->line = $line;
- $this->tokenStream = $tokenStream;
- $this->id = $id;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- return $this->text;
- }
- /**
- * @return integer
- */
- public function getLine()
- {
- return $this->line;
- }
- }
- abstract class PHP_TokenWithScope extends PHP_Token
- {
- protected $endTokenId;
- /**
- * Get the docblock for this token
- *
- * This method will fetch the docblock belonging to the current token. The
- * docblock must be placed on the line directly above the token to be
- * recognized.
- *
- * @return string|null Returns the docblock as a string if found
- */
- public function getDocblock()
- {
- $tokens = $this->tokenStream->tokens();
- $currentLineNumber = $tokens[$this->id]->getLine();
- $prevLineNumber = $currentLineNumber - 1;
- for ($i = $this->id - 1; $i; $i--) {
- if (!isset($tokens[$i])) {
- return;
- }
- if ($tokens[$i] instanceof PHP_Token_FUNCTION ||
- $tokens[$i] instanceof PHP_Token_CLASS ||
- $tokens[$i] instanceof PHP_Token_TRAIT) {
- // Some other trait, class or function, no docblock can be
- // used for the current token
- break;
- }
- $line = $tokens[$i]->getLine();
- if ($line == $currentLineNumber ||
- ($line == $prevLineNumber &&
- $tokens[$i] instanceof PHP_Token_WHITESPACE)) {
- continue;
- }
- if ($line < $currentLineNumber &&
- !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) {
- break;
- }
- return (string)$tokens[$i];
- }
- }
- public function getEndTokenId()
- {
- $block = 0;
- $i = $this->id;
- $tokens = $this->tokenStream->tokens();
- while ($this->endTokenId === NULL && isset($tokens[$i])) {
- if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY ||
- $tokens[$i] instanceof PHP_Token_CURLY_OPEN) {
- $block++;
- }
- else if ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) {
- $block--;
- if ($block === 0) {
- $this->endTokenId = $i;
- }
- }
- else if (($this instanceof PHP_Token_FUNCTION ||
- $this instanceof PHP_Token_NAMESPACE) &&
- $tokens[$i] instanceof PHP_Token_SEMICOLON) {
- if ($block === 0) {
- $this->endTokenId = $i;
- }
- }
- $i++;
- }
- if ($this->endTokenId === NULL) {
- $this->endTokenId = $this->id;
- }
- return $this->endTokenId;
- }
- public function getEndLine()
- {
- return $this->tokenStream[$this->getEndTokenId()]->getLine();
- }
- }
- abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope {
- public function getVisibility()
- {
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_PRIVATE ||
- $tokens[$i] instanceof PHP_Token_PROTECTED ||
- $tokens[$i] instanceof PHP_Token_PUBLIC)) {
- return strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$i]))
- );
- }
- if (isset($tokens[$i]) &&
- !($tokens[$i] instanceof PHP_Token_STATIC ||
- $tokens[$i] instanceof PHP_Token_FINAL ||
- $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
- // no keywords; stop visibility search
- break;
- }
- }
- }
- public function getKeywords()
- {
- $keywords = array();
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_PRIVATE ||
- $tokens[$i] instanceof PHP_Token_PROTECTED ||
- $tokens[$i] instanceof PHP_Token_PUBLIC)) {
- continue;
- }
- if (isset($tokens[$i]) &&
- ($tokens[$i] instanceof PHP_Token_STATIC ||
- $tokens[$i] instanceof PHP_Token_FINAL ||
- $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
- $keywords[] = strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$i]))
- );
- }
- }
- return implode(',', $keywords);
- }
- }
- abstract class PHP_Token_Includes extends PHP_Token
- {
- protected $name;
- protected $type;
- public function getName()
- {
- if ($this->name !== NULL) {
- return $this->name;
- }
- $tokens = $this->tokenStream->tokens();
- if ($tokens[$this->id+2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
- $this->name = trim($tokens[$this->id+2], "'\"");
- $this->type = strtolower(
- str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
- );
- }
- return $this->name;
- }
- public function getType()
- {
- $this->getName();
- return $this->type;
- }
- }
- class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
- {
- protected $arguments;
- protected $ccn;
- protected $name;
- protected $signature;
- public function getArguments()
- {
- if ($this->arguments !== NULL) {
- return $this->arguments;
- }
- $this->arguments = array();
- $tokens = $this->tokenStream->tokens();
- $typeHint = NULL;
- // Search for first token inside brackets
- $i = $this->id + 2;
- while (!$tokens[$i-1] instanceof PHP_Token_OPEN_BRACKET) {
- $i++;
- }
- while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $typeHint = (string)$tokens[$i];
- }
- else if ($tokens[$i] instanceof PHP_Token_VARIABLE) {
- $this->arguments[(string)$tokens[$i]] = $typeHint;
- $typeHint = NULL;
- }
- $i++;
- }
- return $this->arguments;
- }
- public function getName()
- {
- if ($this->name !== NULL) {
- return $this->name;
- }
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id + 1; $i < count($tokens); $i++) {
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $this->name = (string)$tokens[$i];
- break;
- }
- else if ($tokens[$i] instanceof PHP_Token_AMPERSAND &&
- $tokens[$i+1] instanceof PHP_Token_STRING) {
- $this->name = (string)$tokens[$i+1];
- break;
- }
- else if ($tokens[$i] instanceof PHP_Token_OPEN_BRACKET) {
- $this->name = 'anonymous function';
- break;
- }
- }
- if ($this->name != 'anonymous function') {
- for ($i = $this->id; $i; --$i) {
- if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
- $this->name = $tokens[$i]->getName() . '\\' . $this->name;
- break;
- }
- if ($tokens[$i] instanceof PHP_Token_INTERFACE) {
- break;
- }
- }
- }
- return $this->name;
- }
- public function getCCN()
- {
- if ($this->ccn !== NULL) {
- return $this->ccn;
- }
- $this->ccn = 1;
- $end = $this->getEndTokenId();
- $tokens = $this->tokenStream->tokens();
- for ($i = $this->id; $i <= $end; $i++) {
- switch (get_class($tokens[$i])) {
- case 'PHP_Token_IF':
- case 'PHP_Token_ELSEIF':
- case 'PHP_Token_FOR':
- case 'PHP_Token_FOREACH':
- case 'PHP_Token_WHILE':
- case 'PHP_Token_CASE':
- case 'PHP_Token_CATCH':
- case 'PHP_Token_BOOLEAN_AND':
- case 'PHP_Token_LOGICAL_AND':
- case 'PHP_Token_BOOLEAN_OR':
- case 'PHP_Token_LOGICAL_OR':
- case 'PHP_Token_QUESTION_MARK': {
- $this->ccn++;
- }
- break;
- }
- }
- return $this->ccn;
- }
- public function getSignature()
- {
- if ($this->signature !== NULL) {
- return $this->signature;
- }
- if ($this->getName() == 'anonymous function') {
- $this->signature = 'anonymous function';
- $i = $this->id + 1;
- } else {
- $this->signature = '';
- $i = $this->id + 2;
- }
- $tokens = $this->tokenStream->tokens();
- while (isset($tokens[$i]) &&
- !$tokens[$i] instanceof PHP_Token_OPEN_CURLY &&
- !$tokens[$i] instanceof PHP_Token_SEMICOLON) {
- $this->signature .= $tokens[$i++];
- }
- $this->signature = trim($this->signature);
- return $this->signature;
- }
- }
- class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
- {
- protected $interfaces;
- public function getName()
- {
- return (string)$this->tokenStream[$this->id + 2];
- }
- public function hasParent()
- {
- return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS;
- }
- public function getPackage()
- {
- $className = $this->getName();
- $docComment = $this->getDocblock();
- $result = array(
- 'namespace' => '',
- 'fullPackage' => '',
- 'category' => '',
- 'package' => '',
- 'subpackage' => ''
- );
- for ($i = $this->id; $i; --$i) {
- if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
- $result['namespace'] = $this->tokenStream[$i]->getName();
- break;
- }
- }
- if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['category'] = $matches[1];
- }
- if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['package'] = $matches[1];
- $result['fullPackage'] = $matches[1];
- }
- if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
- $result['subpackage'] = $matches[1];
- $result['fullPackage'] .= '.' . $matches[1];
- }
- if (empty($result['fullPackage'])) {
- $result['fullPackage'] = $this->arrayToName(
- explode('_', str_replace('\\', '_', $className)), '.'
- );
- }
- return $result;
- }
- protected function arrayToName(array $parts, $join = '\\')
- {
- $result = '';
- if (count($parts) > 1) {
- array_pop($parts);
- $result = join($join, $parts);
- }
- return $result;
- }
- public function getParent()
- {
- if (!$this->hasParent()) {
- return FALSE;
- }
- $i = $this->id + 6;
- $tokens = $this->tokenStream->tokens();
- $className = (string)$tokens[$i];
- while (isset($tokens[$i+1]) &&
- !$tokens[$i+1] instanceof PHP_Token_WHITESPACE) {
- $className .= (string)$tokens[++$i];
- }
- return $className;
- }
- public function hasInterfaces()
- {
- return (isset($this->tokenStream[$this->id + 4]) &&
- $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) ||
- (isset($this->tokenStream[$this->id + 8]) &&
- $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS);
- }
- public function getInterfaces()
- {
- if ($this->interfaces !== NULL) {
- return $this->interfaces;
- }
- if (!$this->hasInterfaces()) {
- return ($this->interfaces = FALSE);
- }
- if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) {
- $i = $this->id + 3;
- } else {
- $i = $this->id + 7;
- }
- $tokens = $this->tokenStream->tokens();
- while (!$tokens[$i+1] instanceof PHP_Token_OPEN_CURLY) {
- $i++;
- if ($tokens[$i] instanceof PHP_Token_STRING) {
- $this->interfaces[] = (string)$tokens[$i];
- }
- }
- return $this->interfaces;
- }
- }
- class PHP_Token_ABSTRACT extends PHP_Token {}
- class PHP_Token_AMPERSAND extends PHP_Token {}
- class PHP_Token_AND_EQUAL extends PHP_Token {}
- class PHP_Token_ARRAY extends PHP_Token {}
- class PHP_Token_ARRAY_CAST extends PHP_Token {}
- class PHP_Token_AS extends PHP_Token {}
- class PHP_Token_AT extends PHP_Token {}
- class PHP_Token_BACKTICK extends PHP_Token {}
- class PHP_Token_BAD_CHARACTER extends PHP_Token {}
- class PHP_Token_BOOLEAN_AND extends PHP_Token {}
- class PHP_Token_BOOLEAN_OR extends PHP_Token {}
- class PHP_Token_BOOL_CAST extends PHP_Token {}
- class PHP_Token_BREAK extends PHP_Token {}
- class PHP_Token_CARET extends PHP_Token {}
- class PHP_Token_CASE extends PHP_Token {}
- class PHP_Token_CATCH extends PHP_Token {}
- class PHP_Token_CHARACTER extends PHP_Token {}
- class PHP_Token_CLASS extends PHP_Token_INTERFACE {}
- class PHP_Token_CLASS_C extends PHP_Token {}
- class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token {}
- class PHP_Token_CLONE extends PHP_Token {}
- class PHP_Token_CLOSE_BRACKET extends PHP_Token {}
- class PHP_Token_CLOSE_CURLY extends PHP_Token {}
- class PHP_Token_CLOSE_SQUARE extends PHP_Token {}
- class PHP_Token_CLOSE_TAG extends PHP_Token {}
- class PHP_Token_COLON extends PHP_Token {}
- class PHP_Token_COMMA extends PHP_Token {}
- class PHP_Token_COMMENT extends PHP_Token {}
- class PHP_Token_CONCAT_EQUAL extends PHP_Token {}
- class PHP_Token_CONST extends PHP_Token {}
- class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token {}
- class PHP_Token_CONTINUE extends PHP_Token {}
- class PHP_Token_CURLY_OPEN extends PHP_Token {}
- class PHP_Token_DEC extends PHP_Token {}
- class PHP_Token_DECLARE extends PHP_Token {}
- class PHP_Token_DEFAULT extends PHP_Token {}
- class PHP_Token_DIV extends PHP_Token {}
- class PHP_Token_DIV_EQUAL extends PHP_Token {}
- class PHP_Token_DNUMBER extends PHP_Token {}
- class PHP_Token_DO extends PHP_Token {}
- class PHP_Token_DOC_COMMENT extends PHP_Token {}
- class PHP_Token_DOLLAR extends PHP_Token {}
- class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token {}
- class PHP_Token_DOT extends PHP_Token {}
- class PHP_Token_DOUBLE_ARROW extends PHP_Token {}
- class PHP_Token_DOUBLE_CAST extends PHP_Token {}
- class PHP_Token_DOUBLE_COLON extends PHP_Token {}
- class PHP_Token_DOUBLE_QUOTES extends PHP_Token {}
- class PHP_Token_ECHO extends PHP_Token {}
- class PHP_Token_ELSE extends PHP_Token {}
- class PHP_Token_ELSEIF extends PHP_Token {}
- class PHP_Token_EMPTY extends PHP_Token {}
- class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token {}
- class PHP_Token_ENDDECLARE extends PHP_Token {}
- class PHP_Token_ENDFOR extends PHP_Token {}
- class PHP_Token_ENDFOREACH extends PHP_Token {}
- class PHP_Token_ENDIF extends PHP_Token {}
- class PHP_Token_ENDSWITCH extends PHP_Token {}
- class PHP_Token_ENDWHILE extends PHP_Token {}
- class PHP_Token_END_HEREDOC extends PHP_Token {}
- class PHP_Token_EQUAL extends PHP_Token {}
- class PHP_Token_EVAL extends PHP_Token {}
- class PHP_Token_EXCLAMATION_MARK extends PHP_Token {}
- class PHP_Token_EXIT extends PHP_Token {}
- class PHP_Token_EXTENDS extends PHP_Token {}
- class PHP_Token_FILE extends PHP_Token {}
- class PHP_Token_FINAL extends PHP_Token {}
- class PHP_Token_FOR extends PHP_Token {}
- class PHP_Token_FOREACH extends PHP_Token {}
- class PHP_Token_FUNC_C extends PHP_Token {}
- class PHP_Token_GLOBAL extends PHP_Token {}
- class PHP_Token_GT extends PHP_Token {}
- class PHP_Token_IF extends PHP_Token {}
- class PHP_Token_IMPLEMENTS extends PHP_Token {}
- class PHP_Token_INC extends PHP_Token {}
- class PHP_Token_INCLUDE extends PHP_Token_Includes {}
- class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes {}
- class PHP_Token_INLINE_HTML extends PHP_Token {}
- class PHP_Token_INSTANCEOF extends PHP_Token {}
- class PHP_Token_INT_CAST extends PHP_Token {}
- class PHP_Token_ISSET extends PHP_Token {}
- class PHP_Token_IS_EQUAL extends PHP_Token {}
- class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token {}
- class PHP_Token_IS_IDENTICAL extends PHP_Token {}
- class PHP_Token_IS_NOT_EQUAL extends PHP_Token {}
- class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token {}
- class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token {}
- class PHP_Token_LINE extends PHP_Token {}
- class PHP_Token_LIST extends PHP_Token {}
- class PHP_Token_LNUMBER extends PHP_Token {}
- class PHP_Token_LOGICAL_AND extends PHP_Token {}
- class PHP_Token_LOGICAL_OR extends PHP_Token {}
- class PHP_Token_LOGICAL_XOR extends PHP_Token {}
- class PHP_Token_LT extends PHP_Token {}
- class PHP_Token_METHOD_C extends PHP_Token {}
- class PHP_Token_MINUS extends PHP_Token {}
- class PHP_Token_MINUS_EQUAL extends PHP_Token {}
- class PHP_Token_MOD_EQUAL extends PHP_Token {}
- class PHP_Token_MULT extends PHP_Token {}
- class PHP_Token_MUL_EQUAL extends PHP_Token {}
- class PHP_Token_NEW extends PHP_Token {}
- class PHP_Token_NUM_STRING extends PHP_Token {}
- class PHP_Token_OBJECT_CAST extends PHP_Token {}
- class PHP_Token_OBJECT_OPERATOR extends PHP_Token {}
- class PHP_Token_OPEN_BRACKET extends PHP_Token {}
- class PHP_Token_OPEN_CURLY extends PHP_Token {}
- class PHP_Token_OPEN_SQUARE extends PHP_Token {}
- class PHP_Token_OPEN_TAG extends PHP_Token {}
- class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token {}
- class PHP_Token_OR_EQUAL extends PHP_Token {}
- class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token {}
- class PHP_Token_PERCENT extends PHP_Token {}
- class PHP_Token_PIPE extends PHP_Token {}
- class PHP_Token_PLUS extends PHP_Token {}
- class PHP_Token_PLUS_EQUAL extends PHP_Token {}
- class PHP_Token_PRINT extends PHP_Token {}
- class PHP_Token_PRIVATE extends PHP_Token {}
- class PHP_Token_PROTECTED extends PHP_Token {}
- class PHP_Token_PUBLIC extends PHP_Token {}
- class PHP_Token_QUESTION_MARK extends PHP_Token {}
- class PHP_Token_REQUIRE extends PHP_Token_Includes {}
- class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes {}
- class PHP_Token_RETURN extends PHP_Token {}
- class PHP_Token_SEMICOLON extends PHP_Token {}
- class PHP_Token_SL extends PHP_Token {}
- class PHP_Token_SL_EQUAL extends PHP_Token {}
- class PHP_Token_SR extends PHP_Token {}
- class PHP_Token_SR_EQUAL extends PHP_Token {}
- class PHP_Token_START_HEREDOC extends PHP_Token {}
- class PHP_Token_STATIC extends PHP_Token {}
- class PHP_Token_STRING extends PHP_Token {}
- class PHP_Token_STRING_CAST extends PHP_Token {}
- class PHP_Token_STRING_VARNAME extends PHP_Token {}
- class PHP_Token_SWITCH extends PHP_Token {}
- class PHP_Token_THROW extends PHP_Token {}
- class PHP_Token_TILDE extends PHP_Token {}
- class PHP_Token_TRY extends PHP_Token {}
- class PHP_Token_UNSET extends PHP_Token {}
- class PHP_Token_UNSET_CAST extends PHP_Token {}
- class PHP_Token_USE extends PHP_Token {}
- class PHP_Token_VAR extends PHP_Token {}
- class PHP_Token_VARIABLE extends PHP_Token {}
- class PHP_Token_WHILE extends PHP_Token {}
- class PHP_Token_WHITESPACE extends PHP_Token {}
- class PHP_Token_XOR_EQUAL extends PHP_Token {}
- // Tokens introduced in PHP 5.1
- class PHP_Token_HALT_COMPILER extends PHP_Token {}
- // Tokens introduced in PHP 5.3
- class PHP_Token_DIR extends PHP_Token {}
- class PHP_Token_GOTO extends PHP_Token {}
- class PHP_Token_NAMESPACE extends PHP_TokenWithScope
- {
- public function getName()
- {
- $tokens = $this->tokenStream->tokens();
- $namespace = (string)$tokens[$this->id+2];
- for ($i = $this->id + 3; ; $i += 2) {
- if (isset($tokens[$i]) &&
- $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
- $namespace .= '\\' . $tokens[$i+1];
- } else {
- break;
- }
- }
- return $namespace;
- }
- }
- class PHP_Token_NS_C extends PHP_Token {}
- class PHP_Token_NS_SEPARATOR extends PHP_Token {}
- // Tokens introduced in PHP 5.4
- class PHP_Token_CALLABLE extends PHP_Token {}
- class PHP_Token_INSTEADOF extends PHP_Token {}
- class PHP_Token_TRAIT extends PHP_Token_INTERFACE {}
- class PHP_Token_TRAIT_C extends PHP_Token {}
- // Tokens introduced in PHP 5.5
- class PHP_Token_FINALLY extends PHP_Token {}
- class PHP_Token_YIELD extends PHP_Token {}
- // Tokens introduced in PHP 5.6
- class PHP_Token_ELLIPSIS extends PHP_Token {}
- class PHP_Token_POW extends PHP_Token {}
- class PHP_Token_POW_EQUAL extends PHP_Token {}
- // Tokens introduced in HackLang
- class PHP_Token_TYPELIST_LT extends PHP_Token {}
- class PHP_Token_TYPELIST_GT extends PHP_Token {}
- class PHP_Token_TYPE extends PHP_Token {}
- class PHP_Token_SHAPE extends PHP_Token {}
- class PHP_Token_LAMBDA_OP extends PHP_Token {}
- class PHP_Token_LAMBDA_CP extends PHP_Token {}
- class PHP_Token_LAMBDA_ARROW extends PHP_Token {}
- class PHP_Token_IN extends PHP_Token {}
- class PHP_Token_JOIN extends PHP_Token {}
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown for exceptions encountered with database operations. Provides
- * information regarding which operations failed and the query (if any) it
- * failed on.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Exception extends Exception
- {
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new medium printers.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMediumPrinter
- {
- /**
- * Prints standard output messages.
- *
- * @param string $message
- */
- public function output($message);
- /**
- * Prints standard error messages.
- *
- * @param string $message
- */
- public function error($message);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Delegates database extension commands to the appropriate mode classes.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Command
- {
- /**
- * @var PHPUnit_Extensions_Database_UI_IModeFactory
- */
- protected $modeFactory;
- /**
- * @param PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory
- */
- public function __construct(PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory)
- {
- $this->modeFactory = $modeFactory;
- }
- /**
- * Executes the database extension ui.
- *
- * @param PHPUnit_Extensions_Database_UI_IMedium $medium
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function main(PHPUnit_Extensions_Database_UI_IMedium $medium, PHPUnit_Extensions_Database_UI_Context $context)
- {
- try {
- $medium->buildContext($context);
- $mode = $this->modeFactory->getMode($context->getMode());
- $mode->execute($context->getModeArguments(), $medium);
- } catch (Exception $e) {
- $medium->handleException($e);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A text medium for the database extension tool.
- *
- * This class builds the call context based on command line parameters and
- * prints output to stdout and stderr as appropriate.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Mediums_Text implements PHPUnit_Extensions_Database_UI_IMedium
- {
- /**
- * @var array
- */
- protected $arguments;
- /**
- * @var string
- */
- protected $command;
- /**
- * @param array $arguments
- */
- public function __construct(Array $arguments)
- {
- $this->arguments = $arguments;
- }
- /**
- * Builds the context for the application.
- *
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function buildContext(PHPUnit_Extensions_Database_UI_Context $context)
- {
- $arguments = $this->arguments;
- $this->command = array_shift($arguments);
- $context->setMode(array_shift($arguments));
- $context->setModeArguments($arguments);
- }
- /**
- * Handles the displaying of exceptions received from the application.
- *
- * @param Exception $e
- */
- public function handleException(Exception $e)
- {
- try {
- throw $e;
- } catch (PHPUnit_Extensions_Database_UI_InvalidModeException $invalidMode) {
- if ($invalidMode->getMode() == '') {
- $this->error('Please Specify a Command!' . PHP_EOL);
- } else {
- $this->error('Command Does Not Exist: ' . $invalidMode->getMode() . PHP_EOL);
- }
- $this->error('Valid Commands:' . PHP_EOL);
- foreach ($invalidMode->getValidModes() as $mode) {
- $this->error(' ' . $mode . PHP_EOL);
- }
- } catch (Exception $e) {
- $this->error('Unknown Error: ' . $e->getMessage() . PHP_EOL);
- }
- }
- /**
- * Prints the message to stdout.
- *
- * @param string $message
- */
- public function output($message)
- {
- echo $message;
- }
- /**
- * Prints the message to stderr
- *
- * @param string $message
- */
- public function error($message)
- {
- fputs(STDERR, $message);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An exception thrown when an invalid mode is requested from a mode factory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_InvalidModeException extends LogicException
- {
- /**
- * @var string
- */
- protected $mode;
- /**
- * @var PHPUnit_Extensions_Database_UI_IModeFactory
- */
- protected $modeFactory;
- /**
- * @param string $mode
- * @param string $msg
- * @param PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory
- */
- public function __construct($mode, $msg, PHPUnit_Extensions_Database_UI_IModeFactory $modeFactory)
- {
- $this->mode = $mode;
- $this->modeFactory = $modeFactory;
- parent::__construct($msg);
- }
- /**
- * @return string
- */
- public function getMode()
- {
- return $this->mode;
- }
- /**
- * @return array
- */
- public function getValidModes()
- {
- return $this->modeFactory->getModeList();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new modes
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMode
- {
- /**
- * Executes the mode using the given arguments and medium.
- *
- * @param array $modeArguments
- * @param PHPUnit_Extensions_Database_UI_IMediumPrinter $medium
- */
- public function execute(array $modeArguments, PHPUnit_Extensions_Database_UI_IMediumPrinter $medium);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Holds the context of a particular database extension ui call.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Context
- {
- /**
- * @var string
- */
- protected $mode;
- /**
- * @var array
- */
- protected $modeArguments;
- /**
- * @param string $mode
- */
- public function setMode($mode)
- {
- $this->mode = $mode;
- }
- /**
- * @return string
- */
- public function getMode()
- {
- return $this->mode;
- }
- /**
- * @param array $arguments
- */
- public function setModeArguments(array $arguments)
- {
- $this->mode_arguments = $arguments;
- }
- /**
- * @return array
- */
- public function getModeArguments()
- {
- return $this->mode_arguments;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents arguments received from a medium.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Modes_ExportDataSet_Arguments
- {
- /**
- * @var array
- */
- protected $arguments = array();
- /**
- * @param array $arguments
- */
- public function __construct(array $arguments)
- {
- foreach ($arguments as $argument) {
- list($argName, $argValue) = explode('=', $argument, 2);
- $argName = trim($argName, '-');
- if (!isset($this->arguments[$argName])) {
- $this->arguments[$argName] = array();
- }
- $this->arguments[$argName][] = $argValue;
- }
- }
- /**
- * Returns an array of arguments matching the given $argName
- *
- * @param string $argName
- * @return array
- */
- public function getArgumentArray($argName)
- {
- if ($this->argumentIsSet($argName)) {
- return $this->arguments[$argName];
- } else {
- return NULL;
- }
- }
- /**
- * Returns a single argument value.
- *
- * If $argName points to an array the first argument will be returned.
- *
- * @param string $argName
- * @return mixed
- */
- public function getSingleArgument($argName)
- {
- if ($this->argumentIsSet($argName)) {
- return reset($this->arguments[$argName]);
- } else {
- return NULL;
- }
- }
- /**
- * Returns whether an argument is set.
- *
- * @param string $argName
- * @return bool
- */
- public function argumentIsSet($argName)
- {
- return array_key_exists($argName, $this->arguments);
- }
- /**
- * Returns an array containing the names of all arguments provided.
- *
- * @return array
- */
- public function getArgumentNames()
- {
- return array_keys($this->arguments);
- }
- /**
- * Returns an array of database arguments keyed by name.
- *
- * @todo this should be moved.
- * @return array
- */
- public function getDatabases()
- {
- $databases = $this->getArgumentArray('database');
- $retDb = array();
- foreach ($databases as $db) {
- list($name, $arg) = explode(':', $db, 2);
- $retDb[$name] = $arg;
- }
- return $retDb;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The class for the export-dataset command.
- *
- * This command is used to convert existing data sets or data in the database
- * into a valid data set format.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_Modes_ExportDataSet implements PHPUnit_Extensions_Database_UI_IMode
- {
- /**
- * Executes the export dataset command.
- *
- * @param array $modeArguments
- * @param PHPUnit_Extensions_Database_UI_IMediumPrinter $medium
- */
- public function execute(array $modeArguments, PHPUnit_Extensions_Database_UI_IMediumPrinter $medium)
- {
- $arguments = new PHPUnit_Extensions_Database_UI_Modes_ExportDataSet_Arguments($modeArguments);
- if (FALSE && !$arguments->areValid()) {
- throw new InvalidArgumentException("The arguments for this command are incorrect.");
- }
- $datasets = array();
- foreach ($arguments->getArgumentArray('dataset') as $argString) {
- $datasets[] = $this->getDataSetFromArgument($argString, $arguments->getDatabases());
- }
- $finalDataset = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet($datasets);
- $outputDataset = $this->getPersistorFromArgument($arguments->getSingleArgument('output'));
- $outputDataset->write($finalDataset);
- }
- /**
- * Returns the correct dataset given an argument containing a dataset spec.
- *
- * @param string $argString
- * @param array $databaseList
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected function getDataSetFromArgument($argString, $databaseList)
- {
- $dataSetSpecFactory = new PHPUnit_Extensions_Database_DataSet_Specs_Factory();
- list($type, $dataSetSpecStr) = explode(':', $argString, 2);
- $dataSetSpec = $dataSetSpecFactory->getDataSetSpecByType($type);
- if ($dataSetSpec instanceof PHPUnit_Extensions_Database_IDatabaseListConsumer) {
- $dataSetSpec->setDatabases($databaseList);
- }
- return $dataSetSpec->getDataSet($dataSetSpecStr);
- }
- /**
- * Returns the correct persistor given an argument containing a persistor spec.
- *
- * @param string $argString
- * @return PHPUnit_Extensions_Database_DataSet_IPersistable
- */
- protected function getPersistorFromArgument($argString)
- {
- $persistorFactory = new PHPUnit_Extensions_Database_DataSet_Persistors_Factory();
- list($type, $spec) = explode(':', $argString, 2);
- return $persistorFactory->getPersistorBySpec($type, $spec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new mediums.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IMedium extends PHPUnit_Extensions_Database_UI_IMediumPrinter
- {
- /**
- * Builds the context for the application.
- *
- * @param PHPUnit_Extensions_Database_UI_Context $context
- */
- public function buildContext(PHPUnit_Extensions_Database_UI_Context $context);
- /**
- * Handles the displaying of exceptions received from the application.
- *
- * @param Exception $e
- */
- public function handleException(Exception $e);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default factory for db extension modes.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_UI_ModeFactory implements PHPUnit_Extensions_Database_UI_IModeFactory
- {
- /**
- * Generates a new mode based on a given name.
- *
- * @param string $mode
- * @return PHPUnit_Extensions_Database_UI_IMode
- */
- public function getMode($mode)
- {
- if ($mode == '') {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'A mode was not provided.', $this);
- }
- $modeMap = $this->getModeMap();
- if (isset($modeMap[$mode])) {
- $modeClass = $this->getModeClass($mode, $modeMap[$mode]);
- return new $modeClass();
- } else {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode does not exist. Attempting to load mode ' . $mode, $this);
- }
- }
- /**
- * Returns the names of valid modes this factory can create.
- *
- * @return array
- */
- public function getModeList()
- {
- return array_keys($this->getModeMap());
- }
- /**
- * Returns a map of modes to class name parts
- *
- * @return array
- */
- protected function getModeMap()
- {
- return array('export-dataset' => 'ExportDataSet');
- }
- /**
- * Given a $mode label and a $mode_name class part attempts to return the
- * class name necessary to instantiate the mode.
- *
- * @param string $mode
- * @param string $mode_name
- * @return string
- */
- protected function getModeClass($mode, $mode_name)
- {
- $modeClass = 'PHPUnit_Extensions_Database_UI_Modes_' . $mode_name;
- $modeFile = dirname(__FILE__) . '/Modes/' . $mode_name . '.php';
- if (class_exists($modeClass)) {
- return $modeClass;
- }
- if (!is_readable($modeFile)) {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode\'s file could not be loaded. Trying file ' . $modeFile, $this);
- }
- require_once ($modeFile);
- if (!class_exists($modeClass)) {
- throw new PHPUnit_Extensions_Database_UI_InvalidModeException($mode, 'The mode class was not found in the file. Expecting class name ' . $modeClass, $this);
- }
- return $modeClass;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Defines the interface necessary to create new mode factories
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_UI_IModeFactory
- {
- /**
- * Generates a new mode based on a given name.
- *
- * @param string $mode
- * @return PHPUnit_Extensions_Database_UI_IMode
- */
- public function getMode($mode);
- /**
- * Returns the names of valid modes this factory can create.
- *
- * @return array
- */
- public function getModeList();
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for classes that require a list of databases to operate.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown for exceptions encountered with database operations. Provides
- * information regarding which operations failed and the query (if any) it
- * failed on.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Exception extends RuntimeException
- {
- /**
- * @var string
- */
- protected $operation;
- /**
- * @var string
- */
- protected $preparedQuery;
- /**
- * @var array
- */
- protected $preparedArgs;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $table;
- /**
- * @var string
- */
- protected $error;
- /**
- * Creates a new dbunit operation exception
- *
- * @param string $operation
- * @param string $current_query
- * @param PHPUnit_Extensions_Database_DataSet_ITable $current_table
- * @param string $error
- */
- public function __construct($operation, $current_query, $current_args, $current_table, $error)
- {
- parent::__construct("{$operation} operation failed on query: {$current_query} using args: " . print_r($current_args, TRUE) . " [{$error}]");
- $this->operation = $operation;
- $this->preparedQuery = $current_query;
- $this->preparedArgs = $current_args;
- $this->table = $current_table;
- $this->error = $error;
- }
- public function getOperation()
- {
- return $this->operation;
- }
- public function getQuery()
- {
- return $this->preparedQuery;
- }
- public function getTable()
- {
- return $this->table;
- }
- public function getArgs()
- {
- return $this->preparedArgs;
- }
- public function getError()
- {
- return $this->error;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Updates the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Replace extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'REPLACE';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $query = "
- SELECT COUNT(*)
- FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- /**
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $insertOperation = new PHPUnit_Extensions_Database_Operation_Insert;
- $updateOperation = new PHPUnit_Extensions_Database_Operation_Update;
- $databaseDataSet = $connection->createDataSet();
- foreach ($dataSet as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $databaseTableMetaData = $databaseDataSet->getTableMetaData($table->getTableMetaData()->getTableName());
- $insertQuery = $insertOperation->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $updateQuery = $updateOperation->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $selectQuery = $this->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $insertStatement = $connection->getConnection()->prepare($insertQuery);
- $updateStatement = $connection->getConnection()->prepare($updateQuery);
- $selectStatement = $connection->getConnection()->prepare($selectQuery);
- $rowCount = $table->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $selectArgs = $this->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $selectQuery;
- $args = $selectArgs;
- try {
- $selectStatement->execute($selectArgs);
- if ($selectStatement->fetchColumn(0) > 0) {
- $updateArgs = $updateOperation->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $updateQuery;
- $args = $updateArgs;
- $updateStatement->execute($updateArgs);
- } else {
- $insertArgs = $insertOperation->buildOperationArguments($databaseTableMetaData, $table, $i);
- $query = $insertQuery;
- $args = $insertArgs;
- $insertStatement->execute($insertArgs);
- }
- }
- catch (Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception(
- $this->operationName, $query, $args, $table, $e->getMessage()
- );
- }
- }
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class provides functionality for inserting rows from a dataset into a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Insert extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'INSERT';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $columnCount = count($table->getTableMetaData()->getColumns());
- if ($columnCount > 0) {
- $placeHolders = implode(', ', array_fill(0, $columnCount, '?'));
- $columns = '';
- foreach ($table->getTableMetaData()->getColumns() as $column) {
- $columns .= $connection->quoteSchemaObject($column).', ';
- }
- $columns = substr($columns, 0, -2);
- $query = "
- INSERT INTO {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ({$columns})
- VALUES
- ({$placeHolders})
- ";
- return $query;
- } else {
- return FALSE;
- }
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if (count($databaseTableMetaData->getPrimaryKeys())) {
- return TRUE;
- }
- return FALSE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Deletes the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Delete extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'DELETE';
- protected $iteratorDirection = self::ITERATOR_TYPE_REVERSE;
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $query = "
- DELETE FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface and functionality for executing database
- * operations against a connection using a specific dataSet.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- /**
- * Executes the database operation against the given $connection for the
- * given $dataSet.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- * @throws PHPUnit_Extensions_Database_Operation_Exception
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class represents a null database operation.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Null implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- /* do nothing */
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Deletes all rows from all tables in a dataset.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_DeleteAll implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getReverseIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $query = "
- DELETE FROM {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ";
- try {
- $connection->getConnection()->query($query);
- } catch (PDOException $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception('DELETE_ALL', $query, array(), $table, $e->getMessage());
- }
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Updates the rows in a given dataset using primary key columns.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Update extends PHPUnit_Extensions_Database_Operation_RowBased
- {
- protected $operationName = 'UPDATE';
- protected function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $keys = $databaseTableMetaData->getPrimaryKeys();
- $columns = $table->getTableMetaData()->getColumns();
- $whereStatement = 'WHERE ' . implode(' AND ', $this->buildPreparedColumnArray($keys, $connection));
- $setStatement = 'SET ' . implode(', ', $this->buildPreparedColumnArray($columns, $connection));
- $query = "
- UPDATE {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- {$setStatement}
- {$whereStatement}
- ";
- return $query;
- }
- protected function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row)
- {
- $args = array();
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- foreach ($databaseTableMetaData->getPrimaryKeys() as $columnName) {
- $args[] = $table->getValue($row, $columnName);
- }
- return $args;
- }
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if (count($databaseTableMetaData->getPrimaryKeys())) {
- return TRUE;
- }
- return FALSE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides basic functionality for row based operations.
- *
- * To create a row based operation you must create two functions. The first
- * one, buildOperationQuery(), must return a query that will be used to create
- * a prepared statement. The second one, buildOperationArguments(), should
- * return an array containing arguments for each row.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_Operation_RowBased implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- const ITERATOR_TYPE_FORWARD = 0;
- const ITERATOR_TYPE_REVERSE = 1;
- protected $operationName;
- protected $iteratorDirection = self::ITERATOR_TYPE_FORWARD;
- /**
- * @return string|boolean String containing the query or FALSE if a valid query cannot be constructed
- */
- protected abstract function buildOperationQuery(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection);
- protected abstract function buildOperationArguments(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, $row);
- /**
- * Allows an operation to disable primary keys if necessary.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- protected function disablePrimaryKeys(PHPUnit_Extensions_Database_DataSet_ITableMetaData $databaseTableMetaData, PHPUnit_Extensions_Database_DataSet_ITable $table, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- return FALSE;
- }
- /**
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $databaseDataSet = $connection->createDataSet();
- $dsIterator = $this->iteratorDirection == self::ITERATOR_TYPE_REVERSE ? $dataSet->getReverseIterator() : $dataSet->getIterator();
- foreach ($dsIterator as $table) {
- $rowCount = $table->getRowCount();
- if($rowCount == 0) continue;
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $databaseTableMetaData = $databaseDataSet->getTableMetaData($table->getTableMetaData()->getTableName());
- $query = $this->buildOperationQuery($databaseTableMetaData, $table, $connection);
- $disablePrimaryKeys = $this->disablePrimaryKeys($databaseTableMetaData, $table, $connection);
- if ($query === FALSE) {
- if ($table->getRowCount() > 0) {
- throw new PHPUnit_Extensions_Database_Operation_Exception($this->operationName, '', array(), $table, "Rows requested for insert, but no columns provided!");
- }
- continue;
- }
- if ($disablePrimaryKeys) {
- $connection->disablePrimaryKeys($databaseTableMetaData->getTableName());
- }
- $statement = $connection->getConnection()->prepare($query);
- for ($i = 0; $i < $rowCount; $i++) {
- $args = $this->buildOperationArguments($databaseTableMetaData, $table, $i);
- try {
- $statement->execute($args);
- }
- catch (Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception(
- $this->operationName, $query, $args, $table, $e->getMessage()
- );
- }
- }
- if ($disablePrimaryKeys) {
- $connection->enablePrimaryKeys($databaseTableMetaData->getTableName());
- }
- }
- }
- protected function buildPreparedColumnArray($columns, PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $columnArray = array();
- foreach ($columns as $columnName) {
- $columnArray[] = "{$connection->quoteSchemaObject($columnName)} = ?";
- }
- return $columnArray;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A class factory to easily return database operations.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Factory
- {
- /**
- * Returns a null database operation
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function NONE()
- {
- return new PHPUnit_Extensions_Database_Operation_Null();
- }
- /**
- * Returns a clean insert database operation. It will remove all contents
- * from the table prior to re-inserting rows.
- *
- * @param bool $cascadeTruncates Set to true to force truncates to cascade on databases that support this.
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function CLEAN_INSERT($cascadeTruncates = FALSE)
- {
- return new PHPUnit_Extensions_Database_Operation_Composite(array(
- self::TRUNCATE($cascadeTruncates),
- self::INSERT()
- ));
- }
- /**
- * Returns an insert database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function INSERT()
- {
- return new PHPUnit_Extensions_Database_Operation_Insert();
- }
- /**
- * Returns a truncate database operation.
- *
- * @param bool $cascadeTruncates Set to true to force truncates to cascade on databases that support this.
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function TRUNCATE($cascadeTruncates = FALSE)
- {
- $truncate = new PHPUnit_Extensions_Database_Operation_Truncate();
- $truncate->setCascade($cascadeTruncates);
- return $truncate;
- }
- /**
- * Returns a delete database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function DELETE()
- {
- return new PHPUnit_Extensions_Database_Operation_Delete();
- }
- /**
- * Returns a delete_all database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function DELETE_ALL()
- {
- return new PHPUnit_Extensions_Database_Operation_DeleteAll();
- }
- /**
- * Returns an update database operation.
- *
- * @return PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- public static function UPDATE()
- {
- return new PHPUnit_Extensions_Database_Operation_Update();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class facilitates combining database operations. To create a composite
- * operation pass an array of classes that implement
- * PHPUnit_Extensions_Database_Operation_IDatabaseOperation and they will be
- * executed in that order against all data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Composite implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- /**
- * @var array
- */
- protected $operations = array();
- /**
- * Creates a composite operation.
- *
- * @param array $operations
- */
- public function __construct(Array $operations)
- {
- foreach ($operations as $operation) {
- if ($operation instanceof PHPUnit_Extensions_Database_Operation_IDatabaseOperation) {
- $this->operations[] = $operation;
- } else {
- throw new InvalidArgumentException("Only database operation instances can be passed to a composite database operation.");
- }
- }
- }
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- try {
- foreach ($this->operations as $operation) {
- /* @var $operation PHPUnit_Extensions_Database_Operation_IDatabaseOperation */
- $operation->execute($connection, $dataSet);
- }
- } catch (PHPUnit_Extensions_Database_Operation_Exception $e) {
- throw new PHPUnit_Extensions_Database_Operation_Exception("COMPOSITE[{$e->getOperation()}]", $e->getQuery(), $e->getArgs(), $e->getTable(), $e->getError());
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Executes a truncate against all tables in a dataset.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Operation_Truncate implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- {
- protected $useCascade = FALSE;
- public function setCascade($cascade = TRUE)
- {
- $this->useCascade = $cascade;
- }
- public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getReverseIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $query = "
- {$connection->getTruncateCommand()} {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}
- ";
- if ($this->useCascade && $connection->allowsCascading()) {
- $query .= " CASCADE";
- }
- try {
- $this->disableForeignKeyChecksForMysql($connection);
- $connection->getConnection()->query($query);
- $this->enableForeignKeyChecksForMysql($connection);
- } catch (\Exception $e) {
- $this->enableForeignKeyChecksForMysql($connection);
- if ($e instanceof PDOException) {
- throw new PHPUnit_Extensions_Database_Operation_Exception('TRUNCATE', $query, array(), $table, $e->getMessage());
- }
- throw $e;
- }
- }
- }
- private function disableForeignKeyChecksForMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if ($this->isMysql($connection)) {
- $connection->getConnection()->query('SET FOREIGN_KEY_CHECKS = 0');
- }
- }
- private function enableForeignKeyChecksForMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- if ($this->isMysql($connection)) {
- $connection->getConnection()->query('SET FOREIGN_KEY_CHECKS = 1');
- }
- }
- private function isMysql(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- return $connection->getConnection()->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql';
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestCase extension that provides functionality for testing and asserting
- * against a real database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_TestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var PHPUnit_Extensions_Database_ITester
- */
- protected $databaseTester;
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- protected function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $this->getDatabaseTester()->closeConnection($connection);
- }
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected abstract function getConnection();
- /**
- * Gets the IDatabaseTester for this testCase. If the IDatabaseTester is
- * not set yet, this method calls newDatabaseTester() to obtain a new
- * instance.
- *
- * @return PHPUnit_Extensions_Database_ITester
- */
- protected function getDatabaseTester()
- {
- if (empty($this->databaseTester)) {
- $this->databaseTester = $this->newDatabaseTester();
- }
- return $this->databaseTester;
- }
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected abstract function getDataSet();
- /**
- * Returns the database operation executed in test setup.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getSetUpOperation()
- {
- return PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
- }
- /**
- * Returns the database operation executed in test cleanup.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getTearDownOperation()
- {
- return PHPUnit_Extensions_Database_Operation_Factory::NONE();
- }
- /**
- * Creates a IDatabaseTester for this testCase.
- *
- * @return PHPUnit_Extensions_Database_ITester
- */
- protected function newDatabaseTester()
- {
- return new PHPUnit_Extensions_Database_DefaultTester($this->getConnection());
- }
- /**
- * Creates a new DefaultDatabaseConnection using the given PDO connection
- * and database schema name.
- *
- * @param PDO $connection
- * @param string $schema
- * @return PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection
- */
- protected function createDefaultDBConnection(PDO $connection, $schema = '')
- {
- return new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($connection, $schema);
- }
- /**
- * Creates a new ArrayDataSet with the given array.
- * The array parameter is an associative array of tables where the key is
- * the table name and the value an array of rows. Each row is an associative
- * array by itself with keys representing the field names and the values the
- * actual data.
- * For example:
- * array(
- * "addressbook" => array(
- * array("id" => 1, "name" => "...", "address" => "..."),
- * array("id" => 2, "name" => "...", "address" => "...")
- * )
- * )
- *
- * @param array $data
- * @return PHPUnit_Extensions_Database_DataSet_ArrayDataSet
- */
- protected function createArrayDataSet(array $data)
- {
- return new PHPUnit_Extensions_Database_DataSet_ArrayDataSet($data);
- }
- /**
- * Creates a new FlatXmlDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet
- */
- protected function createFlatXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet($xmlFile);
- }
- /**
- * Creates a new XMLDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_XmlDataSet
- */
- protected function createXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_XmlDataSet($xmlFile);
- }
- /**
- * Create a a new MysqlXmlDataSet with the given $xmlFile. (absolute path.)
- *
- * @param string $xmlFile
- * @return PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet
- * @since Method available since Release 1.0.0
- */
- protected function createMySQLXMLDataSet($xmlFile)
- {
- return new PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet($xmlFile);
- }
- /**
- * Returns an operation factory instance that can be used to instantiate
- * new operations.
- *
- * @return PHPUnit_Extensions_Database_Operation_Factory
- */
- protected function getOperations()
- {
- return new PHPUnit_Extensions_Database_Operation_Factory();
- }
- /**
- * Performs operation returned by getSetUpOperation().
- */
- protected function setUp()
- {
- parent::setUp();
- $this->databaseTester = NULL;
- $this->getDatabaseTester()->setSetUpOperation($this->getSetUpOperation());
- $this->getDatabaseTester()->setDataSet($this->getDataSet());
- $this->getDatabaseTester()->onSetUp();
- }
- /**
- * Performs operation returned by getTearDownOperation().
- */
- protected function tearDown()
- {
- $this->getDatabaseTester()->setTearDownOperation($this->getTearDownOperation());
- $this->getDatabaseTester()->setDataSet($this->getDataSet());
- $this->getDatabaseTester()->onTearDown();
- /**
- * Destroy the tester after the test is run to keep DB connections
- * from piling up.
- */
- $this->databaseTester = NULL;
- }
- /**
- * Asserts that two given tables are equal.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
- * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
- * @param string $message
- */
- public static function assertTablesEqual(PHPUnit_Extensions_Database_DataSet_ITable $expected, PHPUnit_Extensions_Database_DataSet_ITable $actual, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_TableIsEqual($expected);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that two given datasets are equal.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $expected
- * @param PHPUnit_Extensions_Database_DataSet_ITable $actual
- * @param string $message
- */
- public static function assertDataSetsEqual(PHPUnit_Extensions_Database_DataSet_IDataSet $expected, PHPUnit_Extensions_Database_DataSet_IDataSet $actual, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_DataSetIsEqual($expected);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Assert that a given table has a given amount of rows
- *
- * @param string $tableName Name of the table
- * @param int $expected Expected amount of rows in the table
- * @param string $message Optional message
- */
- public function assertTableRowCount($tableName, $expected, $message = '')
- {
- $constraint = new PHPUnit_Extensions_Database_Constraint_TableRowCount($tableName, $expected);
- $actual = $this->getConnection()->getRowCount($tableName);
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a given table contains a given row
- *
- * @param array $expectedRow Row expected to find
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table Table to look into
- * @param string $message Optional message
- */
- public function assertTableContains(array $expectedRow, PHPUnit_Extensions_Database_DataSet_ITable $table, $message = '')
- {
- self::assertThat($table->assertContainsRow($expectedRow), self::isTrue(), $message);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Can be used as a foundation for new DatabaseTesters.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_AbstractTester implements PHPUnit_Extensions_Database_ITester
- {
- /**
- * @var PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- protected $setUpOperation;
- /**
- * @var PHPUnit_Extensions_Database_Operation_IDatabaseOperation
- */
- protected $tearDownOperation;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $dataSet;
- /**
- * @var string
- */
- protected $schema;
- /**
- * Creates a new database tester.
- */
- public function __construct()
- {
- $this->setUpOperation = PHPUnit_Extensions_Database_Operation_Factory::CLEAN_INSERT();
- $this->tearDownOperation = PHPUnit_Extensions_Database_Operation_Factory::NONE();
- }
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- $connection->close();
- }
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet()
- {
- return $this->dataSet;
- }
- /**
- * TestCases must call this method inside setUp().
- */
- public function onSetUp()
- {
- $this->getSetUpOperation()->execute($this->getConnection(), $this->getDataSet());
- }
- /**
- * TestCases must call this method inside tearDown().
- */
- public function onTearDown()
- {
- $this->getTearDownOperation()->execute($this->getConnection(), $this->getDataSet());
- }
- /**
- * Sets the test dataset to use.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function setDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- $this->dataSet = $dataSet;
- }
- /**
- * Sets the schema value.
- *
- * @param string $schema
- */
- public function setSchema($schema)
- {
- $this->schema = $schema;
- }
- /**
- * Sets the DatabaseOperation to call when starting the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $setUpOperation
- */
- public function setSetUpOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $setUpOperation)
- {
- $this->setUpOperation = $setUpOperation;
- }
- /**
- * Sets the DatabaseOperation to call when ending the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $tearDownOperation
- */
- public function setTearDownOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $tearDownOperation)
- {
- $this->tearDownOperation = $tearDownOperation;
- }
- /**
- * Returns the schema value
- *
- * @return string
- */
- protected function getSchema()
- {
- return $this->schema;
- }
- /**
- * Returns the database operation that will be called when starting the test.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getSetUpOperation()
- {
- return $this->setUpOperation;
- }
- /**
- * Returns the database operation that will be called when ending the test.
- *
- * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation
- */
- protected function getTearDownOperation()
- {
- return $this->tearDownOperation;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from an Sqlite database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Sqlite extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $columns = array();
- protected $keys = array();
- protected $truncateCommand = 'DELETE FROM';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT name
- FROM sqlite_master
- WHERE
- type='table' AND
- name <> 'sqlite_sequence'
- ORDER BY name
- ";
- $result = $this->pdo->query($query);
- $tableNames = array();
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sqlite database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $query = "PRAGMA table_info('{$tableName}')";
- $statement = $this->pdo->query($query);
- /* @var $statement PDOStatement */
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- while ($columnData = $statement->fetch(PDO::FETCH_NUM)) {
- $this->columns[$tableName][] = $columnData[1];
- if ($columnData[5] == 1) {
- $this->keys[$tableName][] = $columnData[1];
- }
- }
- }
- }
- <?php
- /**
- * Provides functionality to retrieve meta data from an Dblib (SQL Server) database.
- *
- * @package DbUnit
- * @author Tom Ford <tom@switchsystems.co.uk>
- * @copyright Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @link http://www.phpunit.de/
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Dblib extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * @var array
- */
- protected $columns = array();
- /**
- * @var array
- */
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- $query = "SELECT name
- FROM sys.tables
- ORDER BY name";
- $result = $this->pdo->query($query);
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sql server database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $query = "SELECT name
- FROM sys.columns
- WHERE object_id = OBJECT_ID('".$tableName."')
- ORDER BY column_id";
- $result = $this->pdo->query($query);
- while ($columnName = $result->fetchColumn(0)) {
- $this->columns[$tableName][] = $columnName;
- }
- $keyQuery = "SELECT COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
- FROM sys.indexes AS i INNER JOIN
- sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID
- AND i.index_id = ic.index_id
- WHERE i.is_primary_key = 1 AND OBJECT_NAME(ic.OBJECT_ID) = '".$tableName."'";
- $result = $this->pdo->query($keyQuery);
- while ($columnName = $result->fetchColumn(0)) {
- $this->keys[$tableName][] = $columnName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a MySQL database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_MySQL extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $schemaObjectQuoteChar = '`';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = 'SHOW TABLES';
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $tableNames = array();
- while (($tableName = $statement->fetchColumn(0))) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- $query = 'SHOW COLUMNS FROM ' . $this->quoteSchemaObject($tableName);
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $columnNames = array();
- while (($columnName = $statement->fetchColumn(0))) {
- $columnNames[] = $columnName;
- }
- return $columnNames;
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- $query = 'SHOW INDEX FROM ' . $this->quoteSchemaObject($tableName);
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $statement->setFetchMode(PDO::FETCH_ASSOC);
- $columnNames = array();
- while (($column = $statement->fetch())) {
- if ($column['Key_name'] == 'PRIMARY') {
- $columnNames[] = $column['Column_name'];
- }
- }
- return $columnNames;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a database with information_schema support.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_InformationSchema extends PHPUnit_Extensions_Database_DB_MetaData
- {
- protected $columns = array();
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a sqlite database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME
- FROM
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC,
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- WHERE
- TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND
- TC.TABLE_NAME = KCU.TABLE_NAME AND
- TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA AND
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a Firebird database.
- *
- * @package DbUnit
- * @author Matheus Degiovani (matheus@gigatron.com.br)
- * @copyright 2002-2014 Matheus Degiovani (matheus@gigatron.com.br)
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @version Release: 1.1.2
- * @link http://www.phpunit.de/
- * @since
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Firebird extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'DELETE FROM';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $query = "
- select
- RDB$RELATION_NAME as TABLE_NAME
- from RDB$RELATIONS
- where
- ((RDB$RELATION_TYPE = 0) or
- (RDB$RELATION_TYPE is null)) and
- (RDB$SYSTEM_FLAG = 0)
- order by (RDB$RELATION_NAME)
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a database table.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME, ORDINAL_POSITION
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnQuery = "
- select
- rf.RDB\$FIELD_NAME as COLUMN_NAME,
- rf.RDB\$FIELD_POSITION as ORDINAL_POSITION
- from RDB\$RELATION_FIELDS as rf
- where
- upper(RDB\$RELATION_NAME) = upper(?)
- order by
- ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME,
- KCU.ORDINAL_POSITION
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC
- ON TC.TABLE_NAME = KCU.TABLE_NAME
- WHERE
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyQuery = "
- select
- idseg.rdb\$field_name as COLUMN_NAME,
- idseg.rdb\$field_position as ORDINAL_POSITION,
- rc.rdb\$relation_name as tablename,
- rc.rdb\$constraint_name as pk_name
- from
- RDB\$RELATION_CONSTRAINTS AS rc
- left join
- rdb\$index_segments as idseg on
- (rc.rdb\$index_name = idseg.rdb\$index_name)
- where
- rc.RDB\$CONSTRAINT_TYPE = 'PRIMARY KEY'
- and upper(rc.RDB\$RELATION_NAME) = upper(?)
- order by
- rc.rdb\$constraint_name, idseg.rdb\$field_position
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- if (empty($this->schema)) {
- return 'public';
- } else {
- return $this->schema;
- }
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return false;
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object) {
- return $object; //firebird does not allow object quoting
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from an Oracle database.
- *
- * @package DbUnit
- * @author Trond Hansen <trond@xait.no>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.2.3
- */
- class PHPUnit_Extensions_Database_DB_MetaData_Oci extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * @var array
- */
- protected $columns = array();
- /**
- * @var array
- */
- protected $keys = array();
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- $query = "SELECT table_name
- FROM cat
- WHERE table_type='TABLE'
- ORDER BY table_name";
- $result = $this->pdo->query($query);
- while ($tableName = $result->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a oracle database.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $ownerQuery = '';
- $conOwnerQuery = '';
- $tableParts = $this->splitTableName($tableName);
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- if (!empty($tableParts['schema']))
- {
- $ownerQuery = " AND OWNER = '{$tableParts['schema']}'";
- $conOwnerQuery = " AND a.owner = '{$tableParts['schema']}'";
- }
- $query = "SELECT DISTINCT COLUMN_NAME
- FROM USER_TAB_COLUMNS
- WHERE TABLE_NAME='".$tableParts['table']."'
- $ownerQuery
- ORDER BY COLUMN_NAME";
- $result = $this->pdo->query($query);
- while ($columnName = $result->fetchColumn(0)) {
- $this->columns[$tableName][] = $columnName;
- }
- $keyQuery = "SELECT b.column_name
- FROM user_constraints a, user_cons_columns b
- WHERE a.constraint_type='P'
- AND a.constraint_name=b.constraint_name
- $conOwnerQuery
- AND a.table_name = '".$tableParts['table']."' ";
- $result = $this->pdo->query($keyQuery);
- while ($columnName = $result->fetchColumn(0)) {
- $this->keys[$tableName][] = $columnName;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a PostgreSQL database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_PgSQL extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "
- SELECT DISTINCT
- TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES
- WHERE
- TABLE_TYPE='BASE TABLE' AND
- TABLE_SCHEMA = ?
- ORDER BY TABLE_NAME
- ";
- $statement = $this->pdo->prepare($query);
- $statement->execute(array($this->getSchema()));
- $tableNames = array();
- while ($tableName = $statement->fetchColumn(0)) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- if (!isset($this->columns[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->columns[$tableName];
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- if (!isset($this->keys[$tableName])) {
- $this->loadColumnInfo($tableName);
- }
- return $this->keys[$tableName];
- }
- /**
- * Loads column info from a database table.
- *
- * @param string $tableName
- */
- protected function loadColumnInfo($tableName)
- {
- $this->columns[$tableName] = array();
- $this->keys[$tableName] = array();
- $columnQuery = "
- SELECT DISTINCT
- COLUMN_NAME, ORDINAL_POSITION
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE
- TABLE_NAME = ? AND
- TABLE_SCHEMA = ?
- ORDER BY ORDINAL_POSITION
- ";
- $columnStatement = $this->pdo->prepare($columnQuery);
- $columnStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $columnStatement->fetchColumn(0)) {
- $this->columns[$tableName][] = $columName;
- }
- $keyQuery = "
- SELECT
- KCU.COLUMN_NAME,
- KCU.ORDINAL_POSITION
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE as KCU
- LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC
- ON TC.TABLE_NAME = KCU.TABLE_NAME AND
- TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
- WHERE
- TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
- TC.TABLE_NAME = ? AND
- TC.TABLE_SCHEMA = ?
- ORDER BY
- KCU.ORDINAL_POSITION ASC
- ";
- $keyStatement = $this->pdo->prepare($keyQuery);
- $keyStatement->execute(array($tableName, $this->getSchema()));
- while ($columName = $keyStatement->fetchColumn(0)) {
- $this->keys[$tableName][] = $columName;
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- if (empty($this->schema)) {
- return 'public';
- } else {
- return $this->schema;
- }
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return TRUE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides functionality to retrieve meta data from a Microsoft SQL Server database.
- *
- * @package DbUnit
- * @author Nils Adermann <naderman@naderman.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Extensions_Database_DB_MetaData_SqlSrv extends PHPUnit_Extensions_Database_DB_MetaData
- {
- /**
- * No character used to quote schema objects.
- * @var string
- */
- protected $schemaObjectQuoteChar = '';
- /**
- * The command used to perform a TRUNCATE operation.
- * @var string
- */
- protected $truncateCommand = 'TRUNCATE TABLE';
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames()
- {
- $query = "SELECT name
- FROM sysobjects
- WHERE type='U'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $tableNames = array();
- while (($tableName = $statement->fetchColumn(0))) {
- $tableNames[] = $tableName;
- }
- return $tableNames;
- }
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName)
- {
- $query = "SELECT c.name
- FROM syscolumns c
- LEFT JOIN sysobjects o ON c.id = o.id
- WHERE o.name = '$tableName'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $columnNames = array();
- while (($columnName = $statement->fetchColumn(0))) {
- $columnNames[] = $columnName;
- }
- return $columnNames;
- }
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName)
- {
- $query = "EXEC sp_statistics '$tableName'";
- $statement = $this->pdo->prepare($query);
- $statement->execute();
- $statement->setFetchMode(PDO::FETCH_ASSOC);
- $columnNames = array();
- while (($column = $statement->fetch())) {
- if ($column['TYPE'] == 1) {
- $columnNames[] = $column['COLUMN_NAME'];
- }
- }
- return $columnNames;
- }
- /**
- * Allow overwriting identities for the given table.
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- try {
- $query = "SET IDENTITY_INSERT $tableName ON";
- $this->pdo->exec($query);
- }
- catch (PDOException $e) {
- // ignore the error here - can happen if primary key is not an identity
- }
- }
- /**
- * Reenable auto creation of identities for the given table.
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- try {
- $query = "SET IDENTITY_INSERT $tableName OFF";
- $this->pdo->exec($query);
- }
- catch (PDOException $e) {
- // ignore the error here - can happen if primary key is not an identity
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_Table extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new database table object.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->setTableMetaData($tableMetaData);
- $pdoStatement = $databaseConnection->getConnection()->prepare(PHPUnit_Extensions_Database_DB_DataSet::buildTableSelect($tableMetaData, $databaseConnection));
- $pdoStatement->execute();
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_FilteredDataSet extends PHPUnit_Extensions_Database_DB_DataSet
- {
- /**
- * @var Array
- */
- protected $tableNames;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection, Array $tableNames)
- {
- parent::__construct($databaseConnection);
- $this->tableNames = $tableNames;
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return $this->tableNames;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for communicating with a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DB_IDatabaseConnection
- {
- /**
- * Close this connection.
- */
- public function close();
- /**
- * Creates a dataset containing the specified table names. If no table
- * names are specified then it will created a dataset over the entire
- * database.
- *
- * @param array $tableNames
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function createDataSet(Array $tableNames = NULL);
- /**
- * Creates a table with the result of the specified SQL statement.
- *
- * @param string $resultName
- * @param string $sql
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function createQueryTable($resultName, $sql);
- /**
- * Returns a PDO Connection
- *
- * @return PDO
- */
- public function getConnection();
- /**
- * Returns a database metadata object that can be used to retrieve table
- * meta data from the database.
- *
- * @return PHPUnit_Extensions_Database_DB_IMetaData
- */
- public function getMetaData();
- /**
- * Returns the number of rows in the given table. You can specify an
- * optional where clause to return a subset of the table.
- *
- * @param string $tableName
- * @param string $whereClause
- * @param int
- */
- public function getRowCount($tableName, $whereClause = NULL);
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema();
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object);
- /**
- * Returns the command used to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand();
- /**
- * Returns true if the connection allows cascading
- *
- * @return bool
- */
- public function allowsCascading();
- /**
- * Disables primary keys if connection does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName);
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class loads a table metadata object with database metadata.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_TableMetaData extends PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData
- {
- public function __construct($tableName, PHPUnit_Extensions_Database_DB_IMetaData $databaseMetaData)
- {
- $this->tableName = $tableName;
- $this->columns = $databaseMetaData->getTableColumns($tableName);
- $this->primaryKeys = $databaseMetaData->getTablePrimaryKeys($tableName);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic constructor for all meta data classes and a factory for
- * generating the appropriate meta data class.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DB_MetaData implements PHPUnit_Extensions_Database_DB_IMetaData
- {
- protected static $metaDataClassMap = array(
- 'pgsql' => 'PHPUnit_Extensions_Database_DB_MetaData_PgSQL',
- 'mysql' => 'PHPUnit_Extensions_Database_DB_MetaData_MySQL',
- 'oci' => 'PHPUnit_Extensions_Database_DB_MetaData_Oci',
- 'sqlite' => 'PHPUnit_Extensions_Database_DB_MetaData_Sqlite',
- 'sqlite2'=> 'PHPUnit_Extensions_Database_DB_MetaData_Sqlite',
- 'sqlsrv' => 'PHPUnit_Extensions_Database_DB_MetaData_SqlSrv',
- 'firebird' => 'PHPUnit_Extensions_Database_DB_MetaData_Firebird',
- 'dblib' => 'PHPUnit_Extensions_Database_DB_MetaData_Dblib'
- );
- /**
- * The PDO connection used to retreive database meta data
- *
- * @var PDO
- */
- protected $pdo;
- /**
- * The default schema name for the meta data object.
- *
- * @var string
- */
- protected $schema;
- /**
- * The character used to quote schema objects.
- */
- protected $schemaObjectQuoteChar = '"';
- /**
- * The command used to perform a TRUNCATE operation.
- */
- protected $truncateCommand = 'TRUNCATE';
- /**
- * Creates a new database meta data object using the given pdo connection
- * and schema name.
- *
- * @param PDO $pdo
- * @param string $schema
- */
- public final function __construct(PDO $pdo, $schema = '')
- {
- $this->pdo = $pdo;
- $this->schema = $schema;
- }
- /**
- * Creates a meta data object based on the driver of given $pdo object and
- * $schema name.
- *
- * @param PDO $pdo
- * @param string $schema
- * @return PHPUnit_Extensions_Database_DB_MetaData
- */
- public static function createMetaData(PDO $pdo, $schema = '')
- {
- $driverName = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
- if (isset(self::$metaDataClassMap[$driverName])) {
- $className = self::$metaDataClassMap[$driverName];
- if ($className instanceof ReflectionClass) {
- return $className->newInstance($pdo, $schema);
- } else {
- return self::registerClassWithDriver($className, $driverName)->newInstance($pdo, $schema);
- }
- } else {
- throw new PHPUnit_Extensions_Database_Exception("Could not find a meta data driver for {$driverName} pdo driver.");
- }
- }
- /**
- * Validates and registers the given $className with the given $pdoDriver.
- * It should be noted that this function will not attempt to include /
- * require the file. The $pdoDriver can be determined by the value of the
- * PDO::ATTR_DRIVER_NAME attribute for a pdo object.
- *
- * A reflection of the $className is returned.
- *
- * @param string $className
- * @param string $pdoDriver
- * @return ReflectionClass
- */
- public static function registerClassWithDriver($className, $pdoDriver)
- {
- if (!class_exists($className)) {
- throw new PHPUnit_Extensions_Database_Exception("Specified class for {$pdoDriver} driver ({$className}) does not exist.");
- }
- $reflection = new ReflectionClass($className);
- if ($reflection->isSubclassOf('PHPUnit_Extensions_Database_DB_MetaData')) {
- return self::$metaDataClassMap[$pdoDriver] = $reflection;
- } else {
- throw new PHPUnit_Extensions_Database_Exception("Specified class for {$pdoDriver} driver ({$className}) does not extend PHPUnit_Extensions_Database_DB_MetaData.");
- }
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- return $this->schema;
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object)
- {
- $parts = explode('.', $object);
- $quotedParts = array();
- foreach ($parts as $part) {
- $quotedParts[] = $this->schemaObjectQuoteChar .
- str_replace($this->schemaObjectQuoteChar, $this->schemaObjectQuoteChar.$this->schemaObjectQuoteChar, $part).
- $this->schemaObjectQuoteChar;
- }
- return implode('.', $quotedParts);
- }
- /**
- * Seperates the schema and the table from a fully qualified table name.
- *
- * Returns an associative array containing the 'schema' and the 'table'.
- *
- * @param string $fullTableName
- * @return array
- */
- public function splitTableName($fullTableName)
- {
- if (($dot = strpos($fullTableName, '.')) !== FALSE) {
- return array(
- 'schema' => substr($fullTableName, 0, $dot),
- 'table' => substr($fullTableName, $dot + 1)
- );
- } else {
- return array(
- 'schema' => NULL,
- 'table' => $fullTableName
- );
- }
- }
- /**
- * Returns the command for the database to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand()
- {
- return $this->truncateCommand;
- }
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return FALSE;
- }
- /**
- * Disables primary keys if the rdbms does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- return;
- }
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- return;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for communicating with a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection implements PHPUnit_Extensions_Database_DB_IDatabaseConnection
- {
- /**
- * @var PDO
- */
- protected $connection;
- /**
- * The metadata object used to retrieve table meta data from the database.
- *
- * @var PHPUnit_Extensions_Database_DB_IMetaData
- */
- protected $metaData;
- /**
- * Creates a new database connection
- *
- * @param PDO $connection
- * @param string $schema - The name of the database schema you will be testing against.
- */
- public function __construct(PDO $connection, $schema = '')
- {
- $this->connection = $connection;
- $this->metaData = PHPUnit_Extensions_Database_DB_MetaData::createMetaData($connection, $schema);
- $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- }
- /**
- * Close this connection.
- */
- public function close()
- {
- unset($this->connection);
- }
- /**
- * Returns a database metadata object that can be used to retrieve table
- * meta data from the database.
- *
- * @return PHPUnit_Extensions_Database_DB_IMetaData
- */
- public function getMetaData()
- {
- return $this->metaData;
- }
- /**
- * Returns the schema for the connection.
- *
- * @return string
- */
- public function getSchema()
- {
- return $this->getMetaData()->getSchema();
- }
- /**
- * Creates a dataset containing the specified table names. If no table
- * names are specified then it will created a dataset over the entire
- * database.
- *
- * @param array $tableNames
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- * @todo Implement the filtered data set.
- */
- public function createDataSet(array $tableNames = NULL)
- {
- if (empty($tableNames)) {
- return new PHPUnit_Extensions_Database_DB_DataSet($this);
- } else {
- return new PHPUnit_Extensions_Database_DB_FilteredDataSet($this, $tableNames);
- }
- }
- /**
- * Creates a table with the result of the specified SQL statement.
- *
- * @param string $resultName
- * @param string $sql
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function createQueryTable($resultName, $sql)
- {
- return new PHPUnit_Extensions_Database_DataSet_QueryTable($resultName, $sql, $this);
- }
- /**
- * Returns this connection database configuration
- *
- * @return PHPUnit_Extensions_Database_Database_DatabaseConfig
- */
- public function getConfig()
- {
- }
- /**
- * Returns a PDO Connection
- *
- * @return PDO
- */
- public function getConnection()
- {
- return $this->connection;
- }
- /**
- * Returns the number of rows in the given table. You can specify an
- * optional where clause to return a subset of the table.
- *
- * @param string $tableName
- * @param string $whereClause
- * @return int
- */
- public function getRowCount($tableName, $whereClause = NULL)
- {
- $query = "SELECT COUNT(*) FROM ".$this->quoteSchemaObject($tableName);
- if (isset($whereClause)) {
- $query .= " WHERE {$whereClause}";
- }
- return (int) $this->connection->query($query)->fetchColumn();
- }
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object)
- {
- return $this->getMetaData()->quoteSchemaObject($object);
- }
- /**
- * Returns the command used to truncate a table.
- *
- * @return string
- */
- public function getTruncateCommand()
- {
- return $this->getMetaData()->getTruncateCommand();
- }
- /**
- * Returns true if the connection allows cascading
- *
- * @return bool
- */
- public function allowsCascading()
- {
- return $this->getMetaData()->allowsCascading();
- }
- /**
- * Disables primary keys if connection does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName)
- {
- $this->getMetaData()->disablePrimaryKeys($tableName);
- }
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName)
- {
- $this->getMetaData()->enablePrimaryKeys($tableName);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for retreiving metadata from a database.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DB_IMetaData
- {
- /**
- * Returns an array containing the names of all the tables in the database.
- *
- * @return array
- */
- public function getTableNames();
- /**
- * Returns an array containing the names of all the columns in the
- * $tableName table,
- *
- * @param string $tableName
- * @return array
- */
- public function getTableColumns($tableName);
- /**
- * Returns an array containing the names of all the primary key columns in
- * the $tableName table.
- *
- * @param string $tableName
- * @return array
- */
- public function getTablePrimaryKeys($tableName);
- /**
- * Returns the name of the default schema.
- *
- * @return string
- */
- public function getSchema();
- /**
- * Returns a quoted schema object. (table name, column name, etc)
- *
- * @param string $object
- * @return string
- */
- public function quoteSchemaObject($object);
- /**
- * Returns true if the rdbms allows cascading
- *
- * @return bool
- */
- public function allowsCascading();
- /**
- * Disables primary keys if rdbms does not allow setting them otherwise
- *
- * @param string $tableName
- */
- public function disablePrimaryKeys($tableName);
- /**
- * Reenables primary keys after they have been disabled
- *
- * @param string $tableName
- */
- public function enablePrimaryKeys($tableName);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides iterative access to tables from a database instance.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_TableIterator implements PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * An array of tablenames.
- *
- * @var Array
- */
- protected $tableNames;
- /**
- * If this property is true then the tables will be iterated in reverse
- * order.
- *
- * @var bool
- */
- protected $reverse;
- /**
- * The database dataset that this iterator iterates over.
- *
- * @var PHPUnit_Extensions_Database_DB_DataSet
- */
- protected $dataSet;
- public function __construct($tableNames, PHPUnit_Extensions_Database_DB_DataSet $dataSet, $reverse = FALSE)
- {
- $this->tableNames = $tableNames;
- $this->dataSet = $dataSet;
- $this->reverse = $reverse;
- $this->rewind();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- $tableName = current($this->tableNames);
- return $this->dataSet->getTable($tableName);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- if ($this->reverse) {
- prev($this->tableNames);
- } else {
- next($this->tableNames);
- }
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- if ($this->reverse) {
- end($this->tableNames);
- } else {
- reset($this->tableNames);
- }
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return (current($this->tableNames) !== FALSE);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_DataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables = array();
- /**
- * The database connection this dataset is using.
- *
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->databaseConnection = $databaseConnection;
- }
- /**
- * Creates the query necessary to pull all of the data from a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @return unknown
- */
- public static function buildTableSelect(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection = NULL)
- {
- if ($tableMetaData->getTableName() == '') {
- $e = new Exception("Empty Table Name");
- echo $e->getTraceAsString();
- throw $e;
- }
- $columns = $tableMetaData->getColumns();
- if ($databaseConnection) {
- $columns = array_map(array($databaseConnection, 'quoteSchemaObject'), $columns);
- }
- $columnList = implode(', ', $columns);
- if ($databaseConnection) {
- $tableName = $databaseConnection->quoteSchemaObject($tableMetaData->getTableName());
- } else {
- $tableName = $tableMetaData->getTableName();
- }
- $primaryKeys = $tableMetaData->getPrimaryKeys();
- if ($databaseConnection) {
- $primaryKeys = array_map(array($databaseConnection, 'quoteSchemaObject'), $primaryKeys);
- }
- if (count($primaryKeys)) {
- $orderBy = 'ORDER BY ' . implode(' ASC, ', $primaryKeys) . ' ASC';
- } else {
- $orderBy = '';
- }
- return "SELECT {$columnList} FROM {$tableName} {$orderBy}";
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DB_TableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DB_TableIterator($this->getTableNames(), $this, $reverse);
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function getTable($tableName)
- {
- if (!in_array($tableName, $this->getTableNames())) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- if (empty($this->tables[$tableName])) {
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DB_Table($this->getTableMetaData($tableName), $this->databaseConnection);
- }
- return $this->tables[$tableName];
- }
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData
- */
- public function getTableMetaData($tableName)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $this->databaseConnection->getMetaData()->getTableColumns($tableName), $this->databaseConnection->getMetaData()->getTablePrimaryKeys($tableName));
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return $this->databaseConnection->getMetaData()->getTableNames();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database result set as a DBUnit
- * table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @deprecated The PHPUnit_Extension_Database_DataSet_QueryTable should be used instead
- * @see PHPUnit_Extension_Database_DataSet_QueryTable
- * @see PHPUnit_Extension_Database_DataSet_QueryDataSet
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DB_ResultSetTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new result set table.
- *
- * @param string $tableName
- * @param PDOStatement $pdoStatement
- */
- public function __construct($tableName, PDOStatement $pdoStatement)
- {
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- if (count($this->data)) {
- $columns = array_keys($this->data[0]);
- } else {
- $columns = array();
- }
- $this->setTableMetaData(new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns));
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This is the default implementation of the database tester. It receives its
- * connection object from the constructor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DefaultTester extends PHPUnit_Extensions_Database_AbstractTester
- {
- /**
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $connection;
- /**
- * Creates a new default database tester using the given connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection)
- {
- parent::__construct();
- $this->connection = $connection;
- }
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- public function getConnection()
- {
- return $this->connection;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two dbunit tables are equal.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_TableIsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $value;
- /**
- * @var string
- */
- protected $failure_reason;
- /**
- * Creates a new constraint.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $value
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (!$other instanceof PHPUnit_Extensions_Database_DataSet_ITable) {
- throw new InvalidArgumentException(
- 'PHPUnit_Extensions_Database_DataSet_ITable expected'
- );
- }
- return $this->value->matches($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $other->__toString() . ' ' . $this->toString();
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is equal to expected %s', $this->value->__toString()
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two dbunit datasets are equal.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_DataSetIsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $value;
- /**
- * @var string
- */
- protected $failure_reason;
- /**
- * Creates a new constraint.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $value
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (!$other instanceof PHPUnit_Extensions_Database_DataSet_IDataSet) {
- throw new InvalidArgumentException(
- 'PHPUnit_Extensions_Database_DataSet_IDataSet expected'
- );
- }
- return $this->value->matches($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $other->__toString() . ' ' . $this->toString();
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is equal to expected %s', $this->value->__toString()
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts the row count in a table
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_Constraint_TableRowCount extends PHPUnit_Framework_Constraint
- {
- /**
- * @var int
- */
- protected $value;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Creates a new constraint.
- *
- * @param $tableName
- * @param $value
- */
- public function __construct($tableName, $value)
- {
- parent::__construct();
- $this->tableName = $tableName;
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns TRUE if the
- * constraint is met, FALSE otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other == $this->value;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf('is equal to expected row count %d', $this->value);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This is the interface for DatabaseTester objects. These objects are used to
- * add database testing to existing test cases using composition instead of
- * extension.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_ITester
- {
- /**
- * Closes the specified connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection
- */
- public function closeConnection(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection);
- /**
- * Returns the test database connection.
- *
- * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- public function getConnection();
- /**
- * Returns the test dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet();
- /**
- * TestCases must call this method inside setUp().
- */
- public function onSetUp();
- /**
- * TestCases must call this method inside tearDown().
- */
- public function onTearDown();
- /**
- * Sets the test dataset to use.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function setDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet);
- /**
- * Sets the schema value.
- *
- * @param string $schema
- */
- public function setSchema($schema);
- /**
- * Sets the DatabaseOperation to call when starting the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $setUpOperation
- */
- public function setSetUpOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $setUpOperation);
- /**
- * Sets the DatabaseOperation to call when stopping the test.
- *
- * @param PHPUnit_Extensions_Database_Operation_DatabaseOperation $tearDownOperation
- */
- public function setTearDownOperation(PHPUnit_Extensions_Database_Operation_IDatabaseOperation $tearDownOperation);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Data set implementation for the output of mysqldump --xml.
- *
- * @package DbUnit
- * @author Matthew Turland <tobias382@gmail.com>
- * @copyright 2010-2014 Matthew Turland <tobias382@gmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(array &$tableColumns, array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'mysqldump') {
- throw new PHPUnit_Extensions_Database_Exception('The root element of a MySQL XML data set file must be called <mysqldump>');
- }
- foreach ($this->xmlFileContents->xpath('./database/table_data') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<table_data> elements must include a name attribute');
- }
- $tableName = (string)$tableElement['name'];
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- }
- if (!isset($tableValues[$tableName])) {
- $tableValues[$tableName] = array();
- }
- foreach ($tableElement->xpath('./row') as $rowElement) {
- $rowValues = array();
- foreach ($rowElement->xpath('./field') as $columnElement) {
- if (empty($columnElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<field> element name attributes cannot be empty');
- }
- $columnName = (string)$columnElement['name'];
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- }
- foreach ($tableColumns[$tableName] as $columnName) {
- $fields = $rowElement->xpath('./field[@name="' . $columnName . '"]');
- $column = $fields[0];
- $attr = $column->attributes('http://www.w3.org/2001/XMLSchema-instance');
- if (isset($attr['type']) && (string) $attr['type'] === 'xs:hexBinary') {
- $columnValue = pack('H*',(string)$column);
- } else {
- $null = isset($column['nil']) || isset($attr[0]);
- $columnValue = $null ? NULL : (string)$column;
- }
- $rowValues[$columnName] = $columnValue;
- }
- $tableValues[$tableName][] = $rowValues;
- }
- }
- foreach ($this->xmlFileContents->xpath('./database/table_structure') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception('<table_structure> elements must include a name attribute');
- }
- $tableName = (string) $tableElement['name'];
- foreach ($tableElement->xpath('./field') as $fieldElement) {
- if (empty($fieldElement['Field'])) {
- throw new PHPUnit_Extensions_Database_Exception('<field> elements must include a Field attribute');
- }
- $columnName = (string) $fieldElement['Field'];
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml;
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides access to a database instance as a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_QueryDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables = array();
- /**
- * The database connection this dataset is using.
- *
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * Creates a new dataset using the given database connection.
- *
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct(PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->databaseConnection = $databaseConnection;
- }
- public function addTable($tableName, $query = NULL)
- {
- if ($query === NULL) {
- $query = 'SELECT * FROM ' . $tableName;
- }
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_QueryTable($tableName, $query, $this->databaseConnection);
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DB_TableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DB_Table
- */
- public function getTable($tableName)
- {
- if (!isset($this->tables[$tableName])) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- return $this->tables[$tableName];
- }
- /**
- * Returns a list of table names for the database
- *
- * @return Array
- */
- public function getTableNames()
- {
- return array_keys($this->tables);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates YamlDataSets.
- *
- * You can incrementally add YAML files as tables to your datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_YamlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IYamlParser
- */
- protected $parser;
- /**
- * Creates a new YAML dataset
- *
- * @param string $yamlFile
- * @param PHPUnit_Extensions_Database_DataSet_IYamlParser $parser
- */
- public function __construct($yamlFile, $parser = NULL)
- {
- if ($parser == NULL) {
- $parser = new PHPUnit_Extensions_Database_DataSet_SymfonyYamlParser();
- }
- $this->parser = $parser;
- $this->addYamlFile($yamlFile);
- }
- /**
- * Adds a new yaml file to the dataset.
- * @param string $yamlFile
- */
- public function addYamlFile($yamlFile)
- {
- $data = $this->parser->parseYaml($yamlFile);
- foreach ($data as $tableName => $rows) {
- if (!isset($rows)) {
- $rows = array();
- }
- if (!is_array($rows)) {
- continue;
- }
- if (!array_key_exists($tableName, $this->tables)) {
- $columns = $this->getColumns($rows);
- $tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData(
- $tableName, $columns
- );
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_DefaultTable(
- $tableMetaData
- );
- }
- foreach ($rows as $row) {
- $this->tables[$tableName]->addRow($row);
- }
- }
- }
- /**
- * Creates a unique list of columns from all the rows in a table.
- * If the table is defined another time in the Yaml, and if the Yaml
- * parser could return the multiple occerrences, then this would be
- * insufficient unless we grouped all the occurences of the table
- * into onwe row set. sfYaml, however, does not provide multiple tables
- * with the same name, it only supplies the last table.
- *
- * @params all the rows in a table.
- */
- private function getColumns($rows) {
- $columns = array();
- foreach ($rows as $row) {
- $columns = array_merge($columns, array_keys($row));
- }
- return array_values(array_unique($columns));
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator(
- $this->tables, $reverse
- );
- }
- /**
- * Saves a given $dataset to $filename in YAML format
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- * @param string $filename
- */
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_Yaml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(
- __METHOD__ . ' called with an unwritable file.'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implements the basic functionality of data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractDataSet implements PHPUnit_Extensions_Database_DataSet_IDataSet
- {
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected abstract function createIterator($reverse = FALSE);
- /**
- * Returns an array of table names contained in the dataset.
- *
- * @return array
- */
- public function getTableNames()
- {
- $tableNames = array();
- foreach ($this->getIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $tableNames[] = $table->getTableMetaData()->getTableName();
- }
- return $tableNames;
- }
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData($tableName)
- {
- return $this->getTable($tableName)->getTableMetaData();
- }
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable($tableName)
- {
- foreach ($this->getIterator() as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- if ($table->getTableMetaData()->getTableName() == $tableName) {
- return $table;
- }
- }
- }
- /**
- * Returns an iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getIterator()
- {
- return $this->createIterator();
- }
- /**
- * Returns a reverse iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getReverseIterator()
- {
- return $this->createIterator(TRUE);
- }
- /**
- * Asserts that the given data set matches this data set.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_IDataSet $other)
- {
- $thisTableNames = $this->getTableNames();
- $otherTableNames = $other->getTableNames();
- sort($thisTableNames);
- sort($otherTableNames);
- if ($thisTableNames != $otherTableNames) {
- return FALSE;
- }
- foreach ($thisTableNames as $tableName) {
- $table = $this->getTable($tableName);
- if (!$table->matches($other->getTable($tableName))) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function __toString()
- {
- $iterator = $this->getIterator();
- $dataSetString = '';
- foreach ($iterator as $table) {
- $dataSetString .= $table->__toString();
- }
- return $dataSetString;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides an interface for creating data sets from data set spec strings.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates a data set from a data set spec string.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet($dataSetSpec);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A table decorator that allows filtering out table columns from results.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_TableFilter extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * The table meta data being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $originalTable;
- /**
- * Creates a new table filter using the original table
- *
- * @param $originalTable PHPUnit_Extensions_Database_DataSet_ITable
- * @param $excludeColumns Array @deprecated, use the set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $originalTable, Array $excludeColumns = array())
- {
- $this->originalTable = $originalTable;
- $this->setTableMetaData(new PHPUnit_Extensions_Database_DataSet_TableMetaDataFilter($originalTable->getTableMetaData()));
- $this->addExcludeColumns($excludeColumns);
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return $this->originalTable->getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- if (in_array($column, $this->getTableMetaData()->getColumns())) {
- return $this->originalTable->getValue($row, $column);
- } else {
- throw new InvalidArgumentException("The given row ({$row}) and column ({$column}) do not exist in table {$this->getTableMetaData()->getTableName()}");
- }
- }
- /**
- * Sets the columns to include in the table.
- * @param Array $includeColumns
- */
- public function addIncludeColumns(Array $includeColumns)
- {
- $this->tableMetaData->addIncludeColumns($includeColumns);
- }
- /**
- * Clears the included columns.
- */
- public function clearIncludeColumns()
- {
- $this->tableMetaData->clearIncludeColumns();
- }
- /**
- * Sets the columns to exclude from the table.
- * @param Array $excludeColumns
- */
- public function addExcludeColumns(Array $excludeColumns)
- {
- $this->tableMetaData->addExcludeColumns($excludeColumns);
- }
- /**
- * Clears the included columns.
- */
- public function clearExcludeColumns()
- {
- $this->tableMetaData->clearExcludeColumns();
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(Array $row)
- {
- $this->loadData();
- return parent::assertContainsRow($row);
- }
- /**
- * Loads data into local data table if it's not already loaded
- */
- protected function loadData()
- {
- if ($this->data === NULL) {
- $data = array();
- for($row = 0;$row < $this->originalTable->getRowCount();$row++) {
- $tRow = array();
- foreach($this->getTableMetaData()->getColumns() as $col) {
- $tRow[$col] = $this->getValue($row, $col);
- }
- $data[$row] = $tRow;
- }
- $this->data = $data;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides basic functionality for table meta data.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData implements PHPUnit_Extensions_Database_DataSet_ITableMetaData
- {
- /**
- * The names of all columns in the table.
- *
- * @var Array
- */
- protected $columns;
- /**
- * The names of all the primary keys in the table.
- *
- * @var Array
- */
- protected $primaryKeys;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns()
- {
- return $this->columns;
- }
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys()
- {
- return $this->primaryKeys;
- }
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName()
- {
- return $this->tableName;
- }
- /**
- * Asserts that the given tableMetaData matches this tableMetaData.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITableMetaData $other)
- {
- if ($this->getTableName() != $other->getTableName() ||
- $this->getColumns() != $other->getColumns()) {
- return FALSE;
- }
- return TRUE;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates Composite Datasets
- *
- * Allows for creating datasets from multiple sources (csv, query, xml, etc.)
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_CompositeDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- protected $motherDataSet;
- /**
- * Creates a new Composite dataset
- *
- * You can pass in any data set that implements PHPUnit_Extensions_Database_DataSet_IDataSet
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct(Array $dataSets = array())
- {
- $this->motherDataset = new PHPUnit_Extensions_Database_DataSet_DefaultDataSet();
- foreach ($dataSets as $dataSet)
- {
- $this->addDataSet($dataSet);
- }
- }
- /**
- * Adds a new data set to the composite.
- *
- * The dataset may not define tables that already exist in the composite.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
- */
- public function addDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
- {
- foreach ($dataSet->getTableNames() as $tableName)
- {
- if (!in_array($tableName, $this->getTableNames())) {
- $this->motherDataset->addTable($dataSet->getTable($tableName));
- } else {
- $other = $dataSet->getTable($tableName);
- $table = $this->getTable($tableName);
- if (!$table->getTableMetaData()->matches($other->getTableMetaData()))
- {
- throw new InvalidArgumentException("There is already a table named $tableName with different table definition");
- }
- $table->addTableRows($dataSet->getTable($tableName));
- }
- }
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- if ($reverse) {
- return $this->motherDataset->getReverseIterator();
- } else {
- return $this->motherDataset->getIterator();
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default table iterator
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTableIterator implements PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * An array of tables in the iterator.
- *
- * @var Array
- */
- protected $tables;
- /**
- * If this property is true then the tables will be iterated in reverse
- * order.
- *
- * @var bool
- */
- protected $reverse;
- /**
- * Creates a new default table iterator object.
- *
- * @param array $tables
- * @param bool $reverse
- */
- public function __construct(Array $tables, $reverse = FALSE)
- {
- $this->tables = $tables;
- $this->reverse = $reverse;
- $this->rewind();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- return current($this->tables);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- if ($this->reverse) {
- prev($this->tables);
- } else {
- next($this->tables);
- }
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- if ($this->reverse) {
- end($this->tables);
- } else {
- reset($this->tables);
- }
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return ($this->current() !== FALSE);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A dataset decorator that allows filtering out tables and table columns from
- * results.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DataSetFilter extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * The dataset being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $originalDataSet;
- /**
- * The tables to exclude from the data set.
- * @var Array
- */
- protected $excludeTables = array();
- /**
- * The tables to exclude from the data set.
- * @var Array
- */
- protected $includeTables = array();
- /**
- * The columns to exclude from the data set.
- * @var Array
- */
- protected $excludeColumns = array();
- /**
- * The columns to exclude from the data set.
- * @var Array
- */
- protected $includeColumns = array();
- /**
- * Creates a new filtered data set.
- *
- * The $exclude tables should be an associative array using table names as
- * the key and an array of column names to exclude for the value. If you
- * would like to exclude a full table set the value of the table's entry
- * to the special string '*'.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $originalDataSet
- * @param Array $excludeTables @deprecated use set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $originalDataSet, array $excludeTables = array())
- {
- $this->originalDataSet = $originalDataSet;
- $tables = array();
- foreach ($excludeTables as $tableName => $values) {
- if (is_array($values)) {
- $this->setExcludeColumnsForTable($tableName, $values);
- } elseif ($values == '*') {
- $tables[] = $tableName;
- } else {
- $this->setExcludeColumnsForTable($tableName, (array)$values);
- }
- }
- $this->addExcludeTables($tables);
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- $original_tables = $this->originalDataSet->getIterator($reverse);
- $new_tables = array();
- foreach ($original_tables as $table) {
- /* @var $table PHPUnit_Extensions_Database_DataSet_ITable */
- $tableName = $table->getTableMetaData()->getTableName();
- if ((!in_array($tableName, $this->includeTables) && !empty($this->includeTables)) ||
- in_array($tableName, $this->excludeTables)
- ) {
- continue;
- } elseif (!empty($this->excludeColumns[$tableName]) || !empty($this->includeColumns[$tableName])) {
- $new_table = new PHPUnit_Extensions_Database_DataSet_TableFilter($table);
- if (!empty($this->includeColumns[$tableName])) {
- $new_table->addIncludeColumns($this->includeColumns[$tableName]);
- }
- if (!empty($this->excludeColumns[$tableName])) {
- $new_table->addExcludeColumns($this->excludeColumns[$tableName]);
- }
- $new_tables[] = $new_table;
- } else {
- $new_tables[] = $table;
- }
- }
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($new_tables);
- }
- /**
- * Adds tables to be included in the data set.
- * @param array $tables
- */
- public function addIncludeTables(Array $tables)
- {
- $this->includeTables = array_unique(array_merge($this->includeTables, $tables));
- }
- /**
- * Adds tables to be included in the data set.
- * @param array $tables
- */
- public function addExcludeTables(Array $tables)
- {
- $this->excludeTables = array_unique(array_merge($this->excludeTables, $tables));
- }
- /**
- * Adds columns to include in the data set for the given table.
- * @param string $table
- * @param Array $columns
- */
- public function setIncludeColumnsForTable($table, Array $columns)
- {
- $this->includeColumns[$table] = $columns;
- }
- /**
- * Adds columns to include in the data set for the given table.
- * @param string $table
- * @param Array $columns
- */
- public function setExcludeColumnsForTable($table, Array $columns)
- {
- $this->excludeColumns[$table] = $columns;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for parsing YAML files.
- *
- * @package DbUnit
- * @author Yash Parghi <yash@yashparghi.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.1
- */
- interface PHPUnit_Extensions_Database_DataSet_IYamlParser {
- /**
- * @param string $yamlFile
- * @return array parsed YAML
- */
- public function parseYaml($yamlFile);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_XmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(Array &$tableColumns, Array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'dataset') {
- throw new PHPUnit_Extensions_Database_Exception("The root element of an xml data set file must be called <dataset>");
- }
- foreach ($this->xmlFileContents->xpath('/dataset/table') as $tableElement) {
- if (empty($tableElement['name'])) {
- throw new PHPUnit_Extensions_Database_Exception("Table elements must include a name attribute specifying the table name.");
- }
- $tableName = (string)$tableElement['name'];
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- }
- if (!isset($tableValues[$tableName])) {
- $tableValues[$tableName] = array();
- }
- $tableInstanceColumns = array();
- foreach ($tableElement->xpath('./column') as $columnElement) {
- $columnName = (string)$columnElement;
- if (empty($columnName)) {
- throw new PHPUnit_Extensions_Database_Exception("Missing <column> elements for table $tableName. Add one or more <column> elements to the <table> element.");
- }
- if (!in_array($columnName, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $columnName;
- }
- $tableInstanceColumns[] = $columnName;
- }
-
- foreach ($tableElement->xpath('./row') as $rowElement) {
- $rowValues = array();
- $index = 0;
- $numOfTableInstanceColumns = count($tableInstanceColumns);
- foreach ($rowElement->children() as $columnValue) {
-
- if ($index >= $numOfTableInstanceColumns) {
- throw new PHPUnit_Extensions_Database_Exception("Row contains more values than the number of columns defined for table $tableName.");
- }
- switch ($columnValue->getName()) {
- case 'value':
- $rowValues[$tableInstanceColumns[$index]] = (string)$columnValue;
- $index++;
- break;
- case 'null':
- $rowValues[$tableInstanceColumns[$index]] = NULL;
- $index++;
- break;
- default:
- throw new PHPUnit_Extensions_Database_Exception("Unknown element ".$columnValue->getName()." in a row element.");
- }
- }
- $tableValues[$tableName][] = $rowValues;
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_Xml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- }
- catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * An array of ITable objects.
- *
- * @var array
- */
- protected $tables;
- /**
- * Creates a new dataset using the given tables.
- *
- * @param array $tables
- */
- public function __construct(Array $tables = array())
- {
- $this->tables = $tables;
- }
- /**
- * Adds a table to the dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- public function addTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $this->tables[] = $table;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default YAML parser, using Symfony/Yaml.
- *
- * @package DbUnit
- * @author Yash Parghi <yash@yashparghi.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.1
- */
- class PHPUnit_Extensions_Database_DataSet_SymfonyYamlParser implements PHPUnit_Extensions_Database_DataSet_IYamlParser {
- public function parseYaml($yamlFile) {
- return Symfony\Component\Yaml\Yaml::parse($yamlFile);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_IDataSet extends IteratorAggregate
- {
- /**
- * Returns an array of table names contained in the dataset.
- *
- * @return array
- */
- public function getTableNames();
- /**
- * Returns a table meta data object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData($tableName);
- /**
- * Returns a table object for the given table.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable($tableName);
- /**
- * Returns a reverse iterator for all table objects in the given dataset.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- public function getReverseIterator();
- /**
- * Asserts that the given data set matches this data set.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_IDataSet $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for returning table meta data.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITableMetaData
- {
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns();
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys();
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName();
- /**
- * Asserts that the given tableMetaData matches this tableMetaData.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITableMetaData $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An abstract implementation of a dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_Persistors_Abstract implements PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->saveDataSet($dataset);
- }
- /**
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function saveDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->startDataSet($dataset);
- foreach ($dataset as $table) {
- $this->saveTable($table);
- }
- $this->endDataSet($dataset);
- }
- /**
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function saveTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $rowCount = $table->getRowCount();
- $this->startTable($table);
- for ($i = 0; $i < $rowCount; $i++) {
- $this->row($table->getRow($i), $table);
- }
- $this->endTable($table);
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- abstract protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- abstract protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table);
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table);
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- abstract protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A XML dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Xml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- fwrite($this->fh, "<dataset>\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, "</dataset>\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t<table name=\"{$table->getTableMetaData()->getTableName()}\">\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- fwrite($this->fh, "\t\t<column>{$columnName}</column>\n");
- }
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t</table>\n");
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t\t<row>\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- if (isset($row[$columnName])) {
- fwrite($this->fh, "\t\t\t<value>" . htmlspecialchars($row[$columnName]) . "</value>\n");
- } else {
- fwrite($this->fh, "\t\t\t<null />\n");
- }
- }
- fwrite($this->fh, "\t\t</row>\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Flat XML dataset persistor.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- fwrite($this->fh, "<dataset>\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, "</dataset>\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- if ($table->getRowCount() == 0) {
- fwrite($this->fh, "\t<{$table->getTableMetaData()->getTableName()} />\n");
- }
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- //do nothing
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t<{$table->getTableMetaData()->getTableName()}\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- if (isset($row[$columnName])) {
- fwrite($this->fh, "\t\t{$columnName}=\"". htmlspecialchars($row[$columnName]) . "\"\n");
- }
- }
- fwrite($this->fh, "\t/>\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A yaml dataset persistor
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Yaml implements PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Writes the dataset to a yaml file
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $phpArr = array();
- $emptyTables = array();
- foreach ($dataset as $table) {
- $tableName = $table->getTableMetaData()->getTableName();
- $rowCount = $table->getRowCount();
- if (!$rowCount) {
- $emptyTables[] = $tableName;
- continue;
- }
- $phpArr[$tableName] = array();
- for ($i = 0; $i < $rowCount; $i++) {
- $phpArr[$tableName][] = $table->getRow($i);
- }
- }
- $emptyTablesAsString = '';
- if (count($emptyTables)) {
- $emptyTablesAsString = implode(":\n", $emptyTables) . ":\n\n";
- }
- file_put_contents(
- $this->filename,
- Symfony\Component\Yaml\Yaml::dump($phpArr, 3) . $emptyTablesAsString
- );
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A MySQL XML dataset persistor.
- *
- * @package DbUnit
- * @author Matthew Turland <tobias382@gmail.com>
- * @copyright 2010-2014 Matthew Turland <tobias382@gmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml extends PHPUnit_Extensions_Database_DataSet_Persistors_Abstract
- {
- /**
- * @var string
- */
- protected $filename;
- /**
- * @var string
- */
- protected $database;
- /**
- * @var resource
- */
- protected $fh;
- /**
- * Sets the filename that this persistor will save to.
- *
- * @param string $filename
- */
- public function setFileName($filename)
- {
- $this->filename = $filename;
- }
- /**
- * Sets the name of the database.
- *
- * @param string $database
- */
- public function setDatabase($database)
- {
- $this->database = $database;
- }
- /**
- * Override to save the start of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function startDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- $this->fh = fopen($this->filename, 'w');
- if ($this->fh === FALSE) {
- throw new PHPUnit_Framework_Exception(
- "Could not open {$this->filename} for writing see " . __CLASS__ . "::setFileName()"
- );
- }
- fwrite($this->fh, '<?xml version="1.0" encoding="UTF-8"?>' . "\n");
- fwrite($this->fh, '<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' . "\n");
- fwrite($this->fh, '<database name="' . $this->database . '">' . "\n");
- }
- /**
- * Override to save the end of a dataset.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- protected function endDataSet(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset)
- {
- fwrite($this->fh, '</database>' . "\n");
- fwrite($this->fh, '</mysqldump>' . "\n");
- }
- /**
- * Override to save the start of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function startTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '<table_data name="' . $table->getTableMetaData()->getTableName() . '">' . "\n");
- }
- /**
- * Override to save the end of a table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function endTable(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '</table_data>' . "\n");
- }
- /**
- * Override to save a table row.
- *
- * @param array $row
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- protected function row(Array $row, PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- fwrite($this->fh, "\t" . '<row>' . "\n");
- foreach ($table->getTableMetaData()->getColumns() as $columnName) {
- fwrite($this->fh, "\t\t" . '<field name="' . $columnName . '"');
- if (isset($row[$columnName])) {
- fwrite($this->fh, '>' . htmlspecialchars($row[$columnName]) . '</field>' . "\n");
- } else {
- fwrite($this->fh, ' xsi:nil="true" />' . "\n");
- }
- }
- fwrite($this->fh, "\t" . '</row>' . "\n");
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates the appropriate Persistor based on a given type and spec.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Persistors_Factory
- {
- /**
- * Returns the persistor.
- *
- * @param string $type
- * @param string $spec
- * @return PHPUnit_Extensions_Database_DataSet_IPersistable
- */
- public function getPersistorBySpec($type, $spec)
- {
- switch (strtolower($type)) {
- case 'xml':
- $xmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_Xml();
- $xmlPersistor->setFileName($spec);
- return $xmlPersistor;
- case 'flatxml':
- $flatXmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml();
- $flatXmlPersistor->setFileName($spec);
- return $flatXmlPersistor;
- case 'yaml':
- $yamlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_Yaml();
- $yamlPersistor->setFileName($spec);
- return $yamlPersistor;
- case 'mysqlxml':
- $mysqlXmlPersistor = new PHPUnit_Extensions_Database_DataSet_Persistors_MysqlXml();
- $mysqlXmlPersistor->setFileName($spec);
- return $mysqlXmlPersistor;
- default:
- throw new PHPUnit_Extensions_Database_Exception("I don't know what you want from me. PERSISTOR");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates CsvDataSets.
- *
- * You can incrementally add CSV files as tables to your datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_CsvDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * @var string
- */
- protected $delimiter = ',';
- /**
- * @var string
- */
- protected $enclosure = '"';
- /**
- * @var string
- */
- protected $escape = '"';
- /**
- * Creates a new CSV dataset
- *
- * You can pass in the parameters for how csv files will be read.
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct($delimiter = ',', $enclosure = '"', $escape = '"')
- {
- $this->delimiter = $delimiter;
- $this->enclosure = $enclosure;
- $this->escape = $escape;
- }
- /**
- * Adds a table to the dataset
- *
- * The table will be given the passed name. $csvFile should be a path to
- * a valid csv file (based on the arguments passed to the constructor.)
- *
- * @param string $tableName
- * @param string $csvFile
- */
- public function addTable($tableName, $csvFile)
- {
- if (!is_file($csvFile)) {
- throw new InvalidArgumentException("Could not find csv file: {$csvFile}");
- }
- if (!is_readable($csvFile)) {
- throw new InvalidArgumentException("Could not read csv file: {$csvFile}");
- }
- $fh = fopen($csvFile, 'r');
- $columns = $this->getCsvRow($fh);
- if ($columns === FALSE)
- {
- throw new InvalidArgumentException("Could not determine the headers from the given file {$csvFile}");
- }
- $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
- $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);
- while (($row = $this->getCsvRow($fh)) !== FALSE)
- {
- $table->addRow(array_combine($columns, $row));
- }
- $this->tables[$tableName] = $table;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- /**
- * Returns a row from the csv file in an indexed array.
- *
- * @param resource $fh
- * @return array
- */
- protected function getCsvRow($fh)
- {
- if (version_compare(PHP_VERSION, '5.3.0', '>')) {
- return fgetcsv($fh, NULL, $this->delimiter, $this->enclosure, $this->escape);
- } else {
- return fgetcsv($fh, NULL, $this->delimiter, $this->enclosure);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default table iterator
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementTableIterator implements OuterIterator, PHPUnit_Extensions_Database_DataSet_ITableIterator
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected $innerIterator;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement table iterator object.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableIterator $innerIterator
- * @param array $fullReplacements
- * @param array $subStrReplacements
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableIterator $innerIterator, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->innerIterator = $innerIterator;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable()
- {
- return $this->current();
- }
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- $this->current()->getTableMetaData();
- }
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function current()
- {
- return new PHPUnit_Extensions_Database_DataSet_ReplacementTable($this->innerIterator->current(), $this->fullReplacements, $this->subStrReplacements);
- }
- /**
- * Returns the name of the current table.
- *
- * @return string
- */
- public function key()
- {
- return $this->current()->getTableMetaData()->getTableName();
- }
- /**
- * advances to the next element.
- *
- */
- public function next()
- {
- $this->innerIterator->next();
- }
- /**
- * Rewinds to the first element
- */
- public function rewind()
- {
- $this->innerIterator->rewind();
- }
- /**
- * Returns true if the current index is valid
- *
- * @return bool
- */
- public function valid()
- {
- return $this->innerIterator->valid();
- }
- public function getInnerIterator()
- {
- return $this->innerIterator;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Allows for replacing arbitrary values or portions of values with new data.
- *
- * A usage for this is replacing all values == '[NULL'] with a true NULL value
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- protected $dataSet;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement dataset
- *
- * You can pass in any data set that implements PHPUnit_Extensions_Database_DataSet_IDataSet
- *
- * @param string $delimiter
- * @param string $enclosure
- * @param string $escape
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->dataSet = $dataSet;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- $innerIterator = $reverse ? $this->dataSet->getReverseIterator() : $this->dataSet->getIterator();
- return new PHPUnit_Extensions_Database_DataSet_ReplacementTableIterator($innerIterator, $this->fullReplacements, $this->subStrReplacements);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implements the basic functionality of data sets using a PHP array.
- *
- * @package DbUnit
- * @author Richard Brinkman <richardbrinkman@hotmail.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.3.2
- */
- class PHPUnit_Extensions_Database_DataSet_ArrayDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables = array();
- /**
- * Constructor to build a new ArrayDataSet with the given array.
- * The array parameter is an associative array of tables where the key is
- * the table name and the value an array of rows. Each row is an associative
- * array by itself with keys representing the field names and the values the
- * actual data.
- * For example:
- * array(
- * "addressbook" => array(
- * array("id" => 1, "name" => "...", "address" => "..."),
- * array("id" => 2, "name" => "...", "address" => "...")
- * )
- * )
- *
- * @param array $data
- */
- public function __construct(array $data)
- {
- foreach ($data AS $tableName => $rows) {
- $columns = array();
- if (isset($rows[0])) {
- $columns = array_keys($rows[0]);
- }
- $metaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
- $table = new PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);
- foreach ($rows AS $row) {
- $table->addRow($row);
- }
- $this->tables[$tableName] = $table;
- }
- }
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- public function getTable($tableName)
- {
- if (!isset($this->tables[$tableName])) {
- throw new InvalidArgumentException("$tableName is not a table in the current database.");
- }
- return $this->tables[$tableName];
- }
- }
- ?><?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides default table functionality.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * Creates a new table object using the given $tableMetaData
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData)
- {
- $this->setTableMetaData($tableMetaData);
- $this->data = array();
- }
- /**
- * Adds a row to the table with optional values.
- *
- * @param array $values
- */
- public function addRow($values = array())
- {
- $this->data[] = array_replace(
- array_fill_keys($this->getTableMetaData()->getColumns(), NULL),
- $values
- );
- }
- /**
- * Adds the rows in the passed table to the current table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- */
- public function addTableRows(PHPUnit_Extensions_Database_DataSet_ITable $table)
- {
- $tableColumns = $this->getTableMetaData()->getColumns();
- $rowCount = $table->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $newRow = array();
- foreach ($tableColumns as $columnName) {
- $newRow[$columnName] = $table->getValue($i, $columnName);
- }
- $this->addRow($newRow);
- }
- }
- /**
- * Sets the specified column of the specied row to the specified value.
- *
- * @param int $row
- * @param string $column
- * @param mixed $value
- */
- public function setValue($row, $column, $value)
- {
- if (isset($this->data[$row])) {
- $this->data[$row][$column] = $value;
- } else {
- throw new InvalidArgumentException("The row given does not exist.");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITableIterator extends Iterator
- {
- /**
- * Returns the current table.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- public function getTable();
- /**
- * Returns the current table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData();
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet
- {
- protected function getTableInfo(Array &$tableColumns, Array &$tableValues)
- {
- if ($this->xmlFileContents->getName() != 'dataset') {
- throw new PHPUnit_Extensions_Database_Exception("The root element of a flat xml data set file must be called <dataset>");
- }
- foreach ($this->xmlFileContents->children() as $row) {
- $tableName = $row->getName();
- if (!isset($tableColumns[$tableName])) {
- $tableColumns[$tableName] = array();
- $tableValues[$tableName] = array();
- }
- $values = array();
- foreach ($row->attributes() as $name => $value) {
- if (!in_array($name, $tableColumns[$tableName])) {
- $tableColumns[$tableName][] = $name;
- }
- $values[$name] = $value;
- }
- if (count($values)) {
- $tableValues[$tableName][] = $values;
- }
- }
- }
- public static function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset, $filename)
- {
- $pers = new PHPUnit_Extensions_Database_DataSet_Persistors_FlatXml();
- $pers->setFileName($filename);
- try {
- $pers->write($dataset);
- } catch (RuntimeException $e) {
- throw new PHPUnit_Framework_Exception(__METHOD__ . ' called with an unwritable file.');
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for persisting datasets
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_IPersistable
- {
- /**
- * Writes the given dataset
- *
- * The previous dataset will be overwritten.
- *
- * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataset
- */
- public function write(PHPUnit_Extensions_Database_DataSet_IDataSet $dataset);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of a data set.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- abstract class PHPUnit_Extensions_Database_DataSet_AbstractXmlDataSet extends PHPUnit_Extensions_Database_DataSet_AbstractDataSet
- {
- /**
- * @var array
- */
- protected $tables;
- /**
- * @var SimpleXmlElement
- */
- protected $xmlFileContents;
- /**
- * Creates a new dataset using the given tables.
- *
- * @param array $tables
- */
- public function __construct($xmlFile)
- {
- if (!is_file($xmlFile)) {
- throw new InvalidArgumentException(
- "Could not find xml file: {$xmlFile}"
- );
- }
- $libxmlErrorReporting = libxml_use_internal_errors(TRUE);
- $this->xmlFileContents = simplexml_load_file($xmlFile);
- if (!$this->xmlFileContents) {
- $message = '';
- foreach (libxml_get_errors() as $error) {
- $message .= $error->message;
- }
- throw new RuntimeException($message);
- }
- libxml_clear_errors();
- libxml_use_internal_errors($libxmlErrorReporting);
- $tableColumns = array();
- $tableValues = array();
- $this->getTableInfo($tableColumns, $tableValues);
- $this->createTables($tableColumns, $tableValues);
- }
- /**
- * Reads the simple xml object and creates the appropriate tables and meta
- * data for this dataset.
- */
- protected abstract function getTableInfo(Array &$tableColumns, Array &$tableValues);
- protected function createTables(Array &$tableColumns, Array &$tableValues)
- {
- foreach ($tableValues as $tableName => $values) {
- $table = $this->getOrCreateTable($tableName, $tableColumns[$tableName]);
- foreach ($values as $value) {
- $table->addRow($value);
- }
- }
- }
- /**
- * Returns the table with the matching name. If the table does not exist
- * an empty one is created.
- *
- * @param string $tableName
- * @return PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected function getOrCreateTable($tableName, $tableColumns)
- {
- if (empty($this->tables[$tableName])) {
- $tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $tableColumns);
- $this->tables[$tableName] = new PHPUnit_Extensions_Database_DataSet_DefaultTable($tableMetaData);
- }
- return $this->tables[$tableName];
- }
- /**
- * Creates an iterator over the tables in the data set. If $reverse is
- * true a reverse iterator will be returned.
- *
- * @param bool $reverse
- * @return PHPUnit_Extensions_Database_DataSet_ITableIterator
- */
- protected function createIterator($reverse = FALSE)
- {
- return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TableMetaData decorator that allows filtering columns from another
- * metaData object.
- *
- * The if a whitelist (include) filter is specified, then only those columns
- * will be included.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_TableMetaDataFilter extends PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData
- {
- /**
- * The table meta data being decorated.
- * @var PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- protected $originalMetaData;
- /**
- * The columns to exclude from the meta data.
- * @var Array
- */
- protected $excludeColumns = array();
- /**
- * The columns to include from the meta data.
- * @var Array
- */
- protected $includeColumns = array();
- /**
- * Creates a new filtered table meta data object filtering out
- * $excludeColumns.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $originalMetaData
- * @param array $excludeColumns - Deprecated. Use the set* methods instead.
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITableMetaData $originalMetaData, Array $excludeColumns = array())
- {
- $this->originalMetaData = $originalMetaData;
- $this->addExcludeColumns($excludeColumns);
- }
- /**
- * Returns the names of the columns in the table.
- *
- * @return array
- */
- public function getColumns()
- {
- if (!empty($this->includeColumns)) {
- return array_values(array_intersect($this->originalMetaData->getColumns(), $this->includeColumns));
- }
- elseif (!empty($this->excludeColumns)) {
- return array_values(array_diff($this->originalMetaData->getColumns(), $this->excludeColumns));
- }
- else {
- return $this->originalMetaData->getColumns();
- }
- }
- /**
- * Returns the names of the primary key columns in the table.
- *
- * @return array
- */
- public function getPrimaryKeys()
- {
- return $this->originalMetaData->getPrimaryKeys();
- }
- /**
- * Returns the name of the table.
- *
- * @return string
- */
- public function getTableName()
- {
- return $this->originalMetaData->getTableName();
- }
- /**
- * Sets the columns to include in the table.
- * @param Array $includeColumns
- */
- public function addIncludeColumns(Array $includeColumns)
- {
- $this->includeColumns = array_unique(array_merge($this->includeColumns, $includeColumns));
- }
- /**
- * Clears the included columns.
- */
- public function clearIncludeColumns()
- {
- $this->includeColumns = array();
- }
- /**
- * Sets the columns to exclude from the table.
- * @param Array $excludeColumns
- */
- public function addExcludeColumns(Array $excludeColumns)
- {
- $this->excludeColumns = array_unique(array_merge($this->excludeColumns, $excludeColumns));
- }
- /**
- * Clears the excluded columns.
- */
- public function clearExcludeColumns()
- {
- $this->excludeColumns = array();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Allows for replacing arbitrary strings in your data sets with other values.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- * @todo When setTableMetaData() is taken out of the AbstractTable this class should extend AbstractTable.
- */
- class PHPUnit_Extensions_Database_DataSet_ReplacementTable implements PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable
- */
- protected $table;
- /**
- * @var array
- */
- protected $fullReplacements;
- /**
- * @var array
- */
- protected $subStrReplacements;
- /**
- * Creates a new replacement table
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $table
- * @param array $fullReplacements
- * @param array $subStrReplacements
- */
- public function __construct(PHPUnit_Extensions_Database_DataSet_ITable $table, Array $fullReplacements = array(), Array $subStrReplacements = array())
- {
- $this->table = $table;
- $this->fullReplacements = $fullReplacements;
- $this->subStrReplacements = $subStrReplacements;
- }
- /**
- * Adds a new full replacement
- *
- * Full replacements will only replace values if the FULL value is a match
- *
- * @param string $value
- * @param string $replacement
- */
- public function addFullReplacement($value, $replacement)
- {
- $this->fullReplacements[$value] = $replacement;
- }
- /**
- * Adds a new substr replacement
- *
- * Substr replacements will replace all occurances of the substr in every column
- *
- * @param string $value
- * @param string $replacement
- */
- public function addSubStrReplacement($value, $replacement)
- {
- $this->subStrReplacements[$value] = $replacement;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->table->getTableMetaData();
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return $this->table->getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- return $this->getReplacedValue($this->table->getValue($row, $column));
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- $row = $this->table->getRow($row);
- return array_map(array($this, 'getReplacedValue'), $row);
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $thisMetaData = $this->getTableMetaData();
- $otherMetaData = $other->getTableMetaData();
- if (!$thisMetaData->matches($otherMetaData) ||
- $this->getRowCount() != $other->getRowCount()) {
- return FALSE;
- }
- $columns = $thisMetaData->getColumns();
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- foreach ($columns as $columnName) {
- $thisValue = $this->getValue($i, $columnName);
- $otherValue = $other->getValue($i, $columnName);
- if (is_numeric($thisValue) && is_numeric($otherValue)) {
- if ($thisValue != $otherValue) {
- return FALSE;
- }
- } elseif ($thisValue !== $otherValue) {
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- public function __toString()
- {
- $columns = $this->getTableMetaData()->getColumns();
- $lineSeperator = str_repeat('+----------------------', count($columns)) . "+\n";
- $lineLength = strlen($lineSeperator) - 1;
- $tableString = $lineSeperator;
- $tableString .= '| ' . str_pad($this->getTableMetaData()->getTableName(), $lineLength - 4, ' ', STR_PAD_RIGHT) . " |\n";
- $tableString .= $lineSeperator;
- $tableString .= $this->rowToString($columns);
- $tableString .= $lineSeperator;
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $values = array();
- foreach ($columns as $columnName) {
- $values[] = $this->getValue($i, $columnName);
- }
- $tableString .= $this->rowToString($values);
- $tableString .= $lineSeperator;
- }
- return "\n" . $tableString . "\n";
- }
- protected function rowToString(Array $row)
- {
- $rowString = '';
- foreach ($row as $value) {
- if (is_null($value)) {
- $value = 'NULL';
- }
- $rowString .= '| ' . str_pad(substr($value, 0, 20), 20, ' ', STR_PAD_BOTH) . ' ';
- }
- return $rowString . "|\n";
- }
- protected function getReplacedValue($value)
- {
- if (is_scalar($value) && array_key_exists((string)$value, $this->fullReplacements)) {
- return $this->fullReplacements[$value];
- }
- else if (count($this->subStrReplacements) && isset($value)) {
- return str_replace(array_keys($this->subStrReplacements), array_values($this->subStrReplacements), $value);
- }
- else {
- return $value;
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates DefaultDataSets based off of a spec string.
- *
- * This spec class requires a list of databases to be set to the object before
- * it can return a list of databases.
- *
- * The format of the spec string is as follows:
- *
- * <db label>:<schema>:<table name>:<sql>
- *
- * The db label should be equal to one of the keys in the array of databases
- * passed to setDatabases().
- *
- * The schema should be the primary schema you will be running the sql query
- * against.
- *
- * The table name should be set to what you would like the table name in the
- * dataset to be.
- *
- * The sql is the query you want to use to generate the table columns and data.
- * The column names in the table will be identical to the column aliases in the
- * query.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_DbQuery implements PHPUnit_Extensions_Database_DataSet_ISpec, PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * @var array
- */
- protected $databases = array();
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases)
- {
- $this->databases = $databases;
- }
- /**
- * Creates a Default Data Set with a query table from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_DefaultDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- list($dbLabel, $schema, $table, $sql) = explode(':', $dataSetSpec, 4);
- $databaseInfo = $this->databases[$dbLabel];
- $pdoRflc = new ReflectionClass('PDO');
- $pdo = $pdoRflc->newInstanceArgs(explode('|', $databaseInfo));
- $dbConnection = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($pdo, $schema);
- $table = $dbConnection->createQueryTable($table, $sql);
- return new PHPUnit_Extensions_Database_DataSet_DefaultDataSet(array($table));
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a XML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a xml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Xml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates XML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_XmlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_XmlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a FlatXML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a flat xml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_FlatXml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates Flat XML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a YAML dataset based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <filename>
- *
- * The filename should be the location of a yaml file relative to the
- * current working directory.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Yaml implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates YAML Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_YamlDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- return new PHPUnit_Extensions_Database_DataSet_YamlDataSet($dataSetSpec);
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface for data set spec factories.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_Specs_IFactory
- {
- /**
- * Returns the data set
- *
- * @param string $type
- * @return PHPUnit_Extensions_Database_DataSet_ISpec
- */
- public function getDataSetSpecByType($type);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates CsvDataSets based off of a spec string.
- *
- * The format of the spec string is as follows:
- *
- * <csv options>|table1:filename.csv,table2:filename2.csv
- *
- * The first portion of the spec including the pipe symbol '|' is optional.
- * If the pipe option is included than it may be preceded by up to four
- * characters specifying values for the following arguments in order:
- * delimiter (defaults to ',',) enclosure (defaults to '"',) escape (defaults to '"',).
- *
- * Any additional characters in the csv options will be discarded.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Csv implements PHPUnit_Extensions_Database_DataSet_ISpec
- {
- /**
- * Creates CSV Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_CsvDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- $csvDataSetArgs = $this->getCsvOptions($dataSetSpec);
- $csvDataSetRfl = new ReflectionClass('PHPUnit_Extensions_Database_DataSet_CsvDataSet');
- $csvDataSet = $csvDataSetRfl->newInstanceArgs($csvDataSetArgs);
- foreach ($this->getTableFileMap($dataSetSpec) as $tableName => $file) {
- $csvDataSet->addTable($tableName, $file);
- }
- return $csvDataSet;
- }
- /**
- * Returns CSV options.
- *
- * Returns an array containing the options that will be passed to the
- * PHPUnit_Extensions_Database_DataSet_CsvDataSet constructor. The options
- * are determined by the given $dataSetSpec.
- *
- * @param string $dataSetSpec
- * @return array
- */
- protected function getCsvOptions($dataSetSpec)
- {
- list($csvOptStr, ) = explode('|', $dataSetSpec, 2);
- return str_split($csvOptStr);
- }
- /**
- * Returns map of tables to files.
- *
- * Returns an associative array containing a mapping of tables (the key)
- * to files (the values.) The tables and files are determined by the given
- * $dataSetSpec
- *
- * @param string $dataSetSpec
- * @return array
- */
- protected function getTableFileMap($dataSetSpec)
- {
- $tables = array();
- foreach (explode(',', $dataSetSpec) as $csvfile) {
- list($tableName, $file) = explode(':', $csvfile, 2);
- $tables[$tableName] = $file;
- }
- return $tables;
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a database dataset based off of a spec string.
- *
- * This spec class requires a list of databases to be set to the object before
- * it can return a list of databases.
- *
- * The format of the spec string is as follows:
- *
- * <db label>:<schema>:<tables>
- *
- * The db label should be equal to one of the keys in the array of databases
- * passed to setDatabases().
- *
- * The schema should be the primary schema you will be choosing tables from.
- *
- * The tables should be a comma delimited list of all tables you would like to
- * pull data from.
- *
- * The sql is the query you want to use to generate the table columns and data.
- * The column names in the table will be identical to the column aliases in the
- * query.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_DbTable implements PHPUnit_Extensions_Database_DataSet_ISpec, PHPUnit_Extensions_Database_IDatabaseListConsumer
- {
- /**
- * @var array
- */
- protected $databases = array();
- /**
- * Sets the database for the spec
- *
- * @param array $databases
- */
- public function setDatabases(array $databases)
- {
- $this->databases = $databases;
- }
- /**
- * Creates a DB Data Set from a data set spec.
- *
- * @param string $dataSetSpec
- * @return PHPUnit_Extensions_Database_DataSet_IDataSet
- */
- public function getDataSet($dataSetSpec)
- {
- list($dbLabel, $schema, $tables) = explode(':', $dataSetSpec, 3);
- $databaseInfo = $this->databases[$dbLabel];
- $pdoRflc = new ReflectionClass('PDO');
- $pdo = $pdoRflc->newInstanceArgs(explode('|', $databaseInfo));
- $dbConnection = new PHPUnit_Extensions_Database_DB_DefaultDatabaseConnection($pdo, $schema);
- return !empty($tables) ? $dbConnection->createDataSet(explode(',', $tables)) : $dbConnection->createDataSet();
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates the appropriate DataSet Spec based on a given type.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de//**
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_Specs_Factory implements PHPUnit_Extensions_Database_DataSet_Specs_IFactory
- {
- /**
- * Returns the data set
- *
- * @param string $type
- * @return PHPUnit_Extensions_Database_DataSet_ISpec
- */
- public function getDataSetSpecByType($type)
- {
- switch ($type) {
- case 'xml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Xml();
- case 'flatxml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_FlatXml();
- case 'csv':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Csv();
- case 'yaml':
- return new PHPUnit_Extensions_Database_DataSet_Specs_Yaml();
- case 'dbtable':
- return new PHPUnit_Extensions_Database_DataSet_Specs_DbTable();
- case 'dbquery':
- return new PHPUnit_Extensions_Database_DataSet_Specs_DbQuery();
- default:
- throw new PHPUnit_Extensions_Database_Exception("I don't know what you want from me.");
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides the functionality to represent a database table.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_QueryTable extends PHPUnit_Extensions_Database_DataSet_AbstractTable
- {
- /**
- * @var string
- */
- protected $query;
- /**
- * @var PHPUnit_Extensions_Database_DB_IDatabaseConnection
- */
- protected $databaseConnection;
- /**
- * @var string
- */
- protected $tableName;
- /**
- * Creates a new database query table object.
- *
- * @param string $table_name
- * @param string $query
- * @param PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection
- */
- public function __construct($tableName, $query, PHPUnit_Extensions_Database_DB_IDatabaseConnection $databaseConnection)
- {
- $this->query = $query;
- $this->databaseConnection = $databaseConnection;
- $this->tableName = $tableName;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- $this->createTableMetaData();
- return parent::getTableMetaData();
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(Array $row)
- {
- $this->loadData();
- return parent::assertContainsRow($row);
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- $this->loadData();
- return parent::getRowCount();
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column)
- {
- $this->loadData();
- return parent::getValue($row, $column);
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- $this->loadData();
- return parent::getRow($row);
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $this->loadData();
- return parent::matches($other);
- }
- protected function loadData()
- {
- if ($this->data === NULL) {
- $pdoStatement = $this->databaseConnection->getConnection()->query($this->query);
- $this->data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
- }
- }
- protected function createTableMetaData()
- {
- if ($this->tableMetaData === NULL)
- {
- $this->loadData();
- // if some rows are in the table
- $columns = array();
- if (isset($this->data[0]))
- // get column names from data
- $columns = array_keys($this->data[0]);
- else {
- // if no rows found, get column names from database
- $pdoStatement = $this->databaseConnection->getConnection()->prepare("SELECT column_name FROM information_schema.COLUMNS WHERE table_schema=:schema AND table_name=:table");
- $pdoStatement->execute(array(
- "table" => $this->tableName,
- "schema" => $this->databaseConnection->getSchema()
- ));
- $columns = $pdoStatement->fetchAll(PDO::FETCH_COLUMN, 0);
- }
- // create metadata
- $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $columns);
- }
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic functionality for dbunit tables
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_AbstractTable implements PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- protected $tableMetaData;
- /**
- * A 2-dimensional array containing the data for this table.
- *
- * @var array
- */
- protected $data;
- /**
- * @var PHPUnit_Extensions_Database_DataSet_ITable|null
- */
- private $other;
- /**
- * Sets the metadata for this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData
- * @deprecated
- */
- protected function setTableMetaData(PHPUnit_Extensions_Database_DataSet_ITableMetaData $tableMetaData)
- {
- $this->tableMetaData = $tableMetaData;
- }
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData()
- {
- return $this->tableMetaData;
- }
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount()
- {
- return count($this->data);
- }
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- * @todo reorganize this function to throw the exception first.
- */
- public function getValue($row, $column)
- {
- if (isset($this->data[$row][$column])) {
- $value = $this->data[$row][$column];
- return ($value instanceof SimpleXMLElement) ? (string) $value : $value;
- } else {
- if (!in_array($column, $this->getTableMetaData()->getColumns()) || $this->getRowCount() <= $row) {
- throw new InvalidArgumentException("The given row ({$row}) and column ({$column}) do not exist in table {$this->getTableMetaData()->getTableName()}");
- } else {
- return NULL;
- }
- }
- }
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row)
- {
- if (isset($this->data[$row])) {
- return $this->data[$row];
- } else {
- if ($this->getRowCount() <= $row) {
- throw new InvalidArgumentException("The given row ({$row}) does not exist in table {$this->getTableMetaData()->getTableName()}");
- } else {
- return NULL;
- }
- }
- }
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other)
- {
- $thisMetaData = $this->getTableMetaData();
- $otherMetaData = $other->getTableMetaData();
- if (!$thisMetaData->matches($otherMetaData) ||
- $this->getRowCount() != $other->getRowCount()) {
- return FALSE;
- }
- $columns = $thisMetaData->getColumns();
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- foreach ($columns as $columnName) {
- $thisValue = $this->getValue($i, $columnName);
- $otherValue = $other->getValue($i, $columnName);
- if (is_numeric($thisValue) && is_numeric($otherValue)) {
- if ($thisValue != $otherValue) {
- $this->other = $other;
- return FALSE;
- }
- } elseif ($thisValue !== $otherValue) {
- $this->other = $other;
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- /**
- * Checks if a given row is in the table
- *
- * @param array $row
- *
- * @return bool
- */
- public function assertContainsRow(array $row)
- {
- return in_array($row, $this->data);
- }
- public function __toString()
- {
- $columns = $this->getTableMetaData()->getColumns();
- $lineSeperator = str_repeat('+----------------------', count($columns)) . "+\n";
- $lineLength = strlen($lineSeperator) - 1;
- $tableString = $lineSeperator;
- $tableString .= '| ' . str_pad($this->getTableMetaData()->getTableName(), $lineLength - 4, ' ', STR_PAD_RIGHT) . " |\n";
- $tableString .= $lineSeperator;
- $tableString .= $this->rowToString($columns);
- $tableString .= $lineSeperator;
- $rowCount = $this->getRowCount();
- for ($i = 0; $i < $rowCount; $i++) {
- $values = array();
- foreach ($columns as $columnName) {
- if ($this->other) {
- try {
- if ($this->getValue($i, $columnName) != $this->other->getValue($i, $columnName)) {
- $values[] = sprintf(
- '%s != actual %s',
- var_export($this->getValue($i, $columnName), TRUE),
- var_export($this->other->getValue($i, $columnName), TRUE)
- );
- } else {
- $values[] = $this->getValue($i, $columnName);
- }
- } catch (\InvalidArgumentException $ex) {
- $values[] = $this->getValue($i, $columnName) . ': no row';
- }
- } else {
- $values[] = $this->getValue($i, $columnName);
- }
- }
- $tableString .= $this->rowToString($values) . $lineSeperator;
- }
- return ($this->other ? '(table diff enabled)' : '') . "\n" . $tableString . "\n";
- }
- protected function rowToString(Array $row)
- {
- $rowString = '';
- foreach ($row as $value) {
- if (is_null($value)) {
- $value = 'NULL';
- }
- $rowString .= '| ' . str_pad(substr($value, 0, 20), 20, ' ', STR_PAD_BOTH) . ' ';
- }
- return $rowString . "|\n";
- }
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides a basic interface for creating and reading data from data sets.
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- interface PHPUnit_Extensions_Database_DataSet_ITable
- {
- /**
- * Returns the table's meta data.
- *
- * @return PHPUnit_Extensions_Database_DataSet_ITableMetaData
- */
- public function getTableMetaData();
- /**
- * Returns the number of rows in this table.
- *
- * @return int
- */
- public function getRowCount();
- /**
- * Returns the value for the given column on the given row.
- *
- * @param int $row
- * @param int $column
- */
- public function getValue($row, $column);
- /**
- * Returns the an associative array keyed by columns for the given row.
- *
- * @param int $row
- * @return array
- */
- public function getRow($row);
- /**
- * Asserts that the given table matches this table.
- *
- * @param PHPUnit_Extensions_Database_DataSet_ITable $other
- */
- public function matches(PHPUnit_Extensions_Database_DataSet_ITable $other);
- }
- <?php
- /*
- * This file is part of DBUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The default implementation of table meta data
- *
- * @package DbUnit
- * @author Mike Lively <m@digitalsandwich.com>
- * @copyright 2010-2014 Mike Lively <m@digitalsandwich.com>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://www.phpunit.de/
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData extends PHPUnit_Extensions_Database_DataSet_AbstractTableMetaData
- {
- /**
- * Creates a new default table meta data object.
- *
- * @param string $tableName
- * @param array $columns
- * @param array $primaryKeys
- */
- public function __construct($tableName, Array $columns, Array $primaryKeys = array())
- {
- $this->tableName = $tableName;
- $this->columns = $columns;
- $this->primaryKeys = array();
- foreach ($primaryKeys as $columnName) {
- if (!in_array($columnName, $this->columns)) {
- throw new InvalidArgumentException("Primary key column passed that is not in the column list.");
- } else {
- $this->primaryKeys[] = $columnName;
- }
- }
- }
- }
- <?php
- declare(ticks = 1);
- /**
- * PHP_Invoker
- *
- * Copyright (c) 2011-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHP
- * @subpackage Invoker
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2011-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-invoker
- * @since File available since Release 1.0.0
- */
- /**
- * Utility class for invoking callables with a timeout.
- *
- * @package PHP
- * @subpackage Invoker
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2011-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-invoker
- * @since Class available since Release 1.0.0
- */
- class PHP_Invoker
- {
- /**
- * @var integer
- */
- protected $timeout;
- /**
- * Invokes a callable and raises an exception when the execution does not
- * finish before the specified timeout.
- *
- * @param callable $callable
- * @param array $arguments
- * @param integer $timeout in seconds
- * @return mixed
- * @throws InvalidArgumentException
- */
- public function invoke($callable, array $arguments, $timeout)
- {
- if (!is_callable($callable)) {
- throw new InvalidArgumentException;
- }
- if (!is_integer($timeout)) {
- throw new InvalidArgumentException;
- }
- pcntl_signal(SIGALRM, array($this, 'callback'), TRUE);
- pcntl_alarm($timeout);
- $this->timeout = $timeout;
- try {
- $result = call_user_func_array($callable, $arguments);
- }
- catch (Exception $e) {
- pcntl_alarm(0);
- throw $e;
- }
- pcntl_alarm(0);
- return $result;
- }
- /**
- * Invoked by pcntl_signal() when a SIGALRM occurs.
- */
- public function callback()
- {
- throw new PHP_Invoker_TimeoutException(
- sprintf(
- 'Execution aborted after %s',
- PHP_Timer::secondsToTimeString($this->timeout)
- )
- );
- }
- }
- <?php
- /**
- * PHP_Invoker
- *
- * Copyright (c) 2011-2013, Sebastian Bergmann <sebastian@phpunit.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @package PHP
- * @subpackage Invoker
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2011-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/php-invoker
- * @since File available since Release 1.0.0
- */
- /**
- * @package PHP
- * @subpackage Invoker
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2011-2013 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/php-invoker
- * @since Class available since Release 1.0.0
- */
- class PHP_Invoker_TimeoutException extends RuntimeException
- {
- }
- PHPUnit_MockObject
- Copyright (c) 2002-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Main matcher which defines a full expectation using method, parameter and
- * invocation matchers.
- * This matcher encapsulates all the other matchers and allows the builder to
- * set the specific matchers when the appropriate methods are called (once(),
- * where() etc.).
- *
- * All properties are public so that they can easily be accessed by the builder.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Invocation
- */
- public $invocationMatcher;
- /**
- * @var mixed
- */
- public $afterMatchBuilderId = null;
- /**
- * @var boolean
- */
- public $afterMatchBuilderIsInvoked = false;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_MethodName
- */
- public $methodNameMatcher = null;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Parameters
- */
- public $parametersMatcher = null;
- /**
- * @var PHPUnit_Framework_MockObject_Stub
- */
- public $stub = null;
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
- */
- public function __construct(PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
- {
- $this->invocationMatcher = $invocationMatcher;
- }
- /**
- * @return string
- */
- public function toString()
- {
- $list = array();
- if ($this->invocationMatcher !== null) {
- $list[] = $this->invocationMatcher->toString();
- }
- if ($this->methodNameMatcher !== null) {
- $list[] = 'where ' . $this->methodNameMatcher->toString();
- }
- if ($this->parametersMatcher !== null) {
- $list[] = 'and ' . $this->parametersMatcher->toString();
- }
- if ($this->afterMatchBuilderId !== null) {
- $list[] = 'after ' . $this->afterMatchBuilderId;
- }
- if ($this->stub !== null) {
- $list[] = 'will ' . $this->stub->toString();
- }
- return join(' ', $list);
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- if ($this->afterMatchBuilderId !== null) {
- $builder = $invocation->object
- ->__phpunit_getInvocationMocker()
- ->lookupId($this->afterMatchBuilderId);
- if (!$builder) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'No builder found for match builder identification <%s>',
- $this->afterMatchBuilderId
- )
- );
- }
- $matcher = $builder->getMatcher();
- if ($matcher && $matcher->invocationMatcher->hasBeenInvoked()) {
- $this->afterMatchBuilderIsInvoked = true;
- }
- }
- $this->invocationMatcher->invoked($invocation);
- try {
- if ($this->parametersMatcher !== null &&
- !$this->parametersMatcher->matches($invocation)) {
- $this->parametersMatcher->verify();
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- $e->getMessage()
- ),
- $e->getComparisonFailure()
- );
- }
- if ($this->stub) {
- return $this->stub->invoke($invocation);
- }
- return null;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if ($this->afterMatchBuilderId !== null) {
- $builder = $invocation->object
- ->__phpunit_getInvocationMocker()
- ->lookupId($this->afterMatchBuilderId);
- if (!$builder) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'No builder found for match builder identification <%s>',
- $this->afterMatchBuilderId
- )
- );
- }
- $matcher = $builder->getMatcher();
- if (!$matcher) {
- return false;
- }
- if (!$matcher->invocationMatcher->hasBeenInvoked()) {
- return false;
- }
- }
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- if (!$this->invocationMatcher->matches($invocation)) {
- return false;
- }
- try {
- if (!$this->methodNameMatcher->matches($invocation)) {
- return false;
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- $e->getMessage()
- ),
- $e->getComparisonFailure()
- );
- }
- return true;
- }
- /**
- * @throws PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->invocationMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'No invocation matcher is set'
- );
- }
- if ($this->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception('No method matcher is set');
- }
- try {
- $this->invocationMatcher->verify();
- if ($this->parametersMatcher === null) {
- $this->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
- }
- $invocationIsAny = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount';
- $invocationIsNever = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' && $this->invocationMatcher->isNever();
- if (!$invocationIsAny && !$invocationIsNever) {
- $this->parametersMatcher->verify();
- }
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- "Expectation failed for %s when %s.\n%s",
- $this->methodNameMatcher->toString(),
- $this->invocationMatcher->toString(),
- PHPUnit_Framework_TestFailure::exceptionToString($e)
- )
- );
- }
- }
- /**
- * @since Method available since Release 1.2.4
- */
- public function hasMatchers()
- {
- if ($this->invocationMatcher !== null &&
- !$this->invocationMatcher instanceof PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount) {
- return true;
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which must verify a given expectation.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which can be invoked.
- *
- * The invocation will be taken from a mock object and passed to an object
- * of this class.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Invokable extends PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Invokes the invocation object $invocation so that it can be checked for
- * expectations or matched against stubs.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation object passed from mock object.
- * @return object
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
- /**
- * Checks if the invocation matches.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation object passed from mock object.
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Implementation of the Builder pattern for Mock objects.
- *
- * @package PHPUnit_MockObject
- * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since File available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_MockBuilder
- {
- /**
- * @var PHPUnit_Framework_TestCase
- */
- private $testCase;
- /**
- * @var string
- */
- private $type;
- /**
- * @var array
- */
- private $methods = array();
- /**
- * @var string
- */
- private $mockClassName = '';
- /**
- * @var array
- */
- private $constructorArgs = array();
- /**
- * @var boolean
- */
- private $originalConstructor = true;
- /**
- * @var boolean
- */
- private $originalClone = true;
- /**
- * @var boolean
- */
- private $autoload = true;
- /**
- * @var boolean
- */
- private $cloneArguments = false;
- /**
- * @var boolean
- */
- private $callOriginalMethods = false;
- /**
- * @var object
- */
- private $proxyTarget = null;
- /**
- * @param PHPUnit_Framework_TestCase $testCase
- * @param array|string $type
- */
- public function __construct(PHPUnit_Framework_TestCase $testCase, $type)
- {
- $this->testCase = $testCase;
- $this->type = $type;
- }
- /**
- * Creates a mock object using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMock()
- {
- return $this->testCase->getMock(
- $this->type,
- $this->methods,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->cloneArguments,
- $this->callOriginalMethods,
- $this->proxyTarget
- );
- }
- /**
- * Creates a mock object for an abstract class using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMockForAbstractClass()
- {
- return $this->testCase->getMockForAbstractClass(
- $this->type,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->methods,
- $this->cloneArguments
- );
- }
- /**
- * Creates a mock object for a trait using a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_MockObject
- */
- public function getMockForTrait()
- {
- return $this->testCase->getMockForTrait(
- $this->type,
- $this->constructorArgs,
- $this->mockClassName,
- $this->originalConstructor,
- $this->originalClone,
- $this->autoload,
- $this->methods,
- $this->cloneArguments
- );
- }
- /**
- * Specifies the subset of methods to mock. Default is to mock all of them.
- *
- * @param array|null $methods
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setMethods($methods)
- {
- $this->methods = $methods;
- return $this;
- }
- /**
- * Specifies the arguments for the constructor.
- *
- * @param array $args
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setConstructorArgs(array $args)
- {
- $this->constructorArgs = $args;
- return $this;
- }
- /**
- * Specifies the name for the mock class.
- *
- * @param string $name
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function setMockClassName($name)
- {
- $this->mockClassName = $name;
- return $this;
- }
- /**
- * Disables the invocation of the original constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableOriginalConstructor()
- {
- $this->originalConstructor = false;
- return $this;
- }
- /**
- * Enables the invocation of the original constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableOriginalConstructor()
- {
- $this->originalConstructor = true;
- return $this;
- }
- /**
- * Disables the invocation of the original clone constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableOriginalClone()
- {
- $this->originalClone = false;
- return $this;
- }
- /**
- * Enables the invocation of the original clone constructor.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableOriginalClone()
- {
- $this->originalClone = true;
- return $this;
- }
- /**
- * Disables the use of class autoloading while creating the mock object.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- */
- public function disableAutoload()
- {
- $this->autoload = false;
- return $this;
- }
- /**
- * Enables the use of class autoloading while creating the mock object.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableAutoload()
- {
- $this->autoload = true;
- return $this;
- }
- /**
- * Disables the cloning of arguments passed to mocked methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function disableArgumentCloning()
- {
- $this->cloneArguments = false;
- return $this;
- }
- /**
- * Enables the cloning of arguments passed to mocked methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 1.2.0
- */
- public function enableArgumentCloning()
- {
- $this->cloneArguments = true;
- return $this;
- }
- /**
- * Enables the invocation of the original methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function enableProxyingToOriginalMethods()
- {
- $this->callOriginalMethods = true;
- return $this;
- }
- /**
- * Disables the invocation of the original methods.
- *
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function disableProxyingToOriginalMethods()
- {
- $this->callOriginalMethods = false;
- $this->proxyTarget = null;
- return $this;
- }
- /**
- * Sets the proxy target.
- *
- * @param object $object
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 2.0.0
- */
- public function setProxyTarget($object)
- {
- $this->proxyTarget = $object;
- return $this;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for exceptions used by PHPUnit_MockObject.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 2.0.6
- */
- interface PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 2.0.6
- */
- class PHPUnit_Framework_MockObject_BadMethodCallException extends BadMethodCallException implements PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 2.0.6
- */
- class PHPUnit_Framework_MockObject_RuntimeException extends RuntimeException implements PHPUnit_Framework_MockObject_Exception
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for invocations.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Invocation
- {
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for all mock objects which are generated by
- * PHPUnit_Framework_MockObject_MockBuilder.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_MockObject /*extends PHPUnit_Framework_MockObject_Verifiable*/
- {
- /**
- * Registers a new expectation in the mock object and returns the match
- * object which can be infused with further details.
- *
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
- /**
- * @return PHPUnit_Framework_MockObject_InvocationMocker
- * @since Method available since Release 2.0.0
- */
- public function __phpunit_setOriginalObject($originalObject);
- /**
- * @return PHPUnit_Framework_MockObject_InvocationMocker
- */
- public function __phpunit_getInvocationMocker();
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function __phpunit_verify();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Mocker for invocations which are sent from
- * PHPUnit_Framework_MockObject_MockObject objects.
- *
- * Keeps track of all expectations and stubs as well as registering
- * identifications for builders.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_InvocationMocker implements PHPUnit_Framework_MockObject_Stub_MatcherCollection, PHPUnit_Framework_MockObject_Invokable, PHPUnit_Framework_MockObject_Builder_Namespace
- {
- /**
- * @var PHPUnit_Framework_MockObject_Matcher_Invocation[]
- */
- protected $matchers = array();
- /**
- * @var PHPUnit_Framework_MockObject_Builder_Match[]
- */
- protected $builderMap = array();
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- */
- public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- $this->matchers[] = $matcher;
- }
- /**
- * @since Method available since Release 1.1.0
- */
- public function hasMatchers()
- {
- foreach ($this->matchers as $matcher) {
- if ($matcher->hasMatchers()) {
- return true;
- }
- }
- return false;
- }
- /**
- * @param mixed $id
- * @return boolean|null
- */
- public function lookupId($id)
- {
- if (isset($this->builderMap[$id])) {
- return $this->builderMap[$id];
- }
- return null;
- }
- /**
- * @param mixed $id
- * @param PHPUnit_Framework_MockObject_Builder_Match $builder
- * @throws PHPUnit_Framework_Exception
- */
- public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder)
- {
- if (isset($this->builderMap[$id])) {
- throw new PHPUnit_Framework_Exception(
- 'Match builder with id <' . $id . '> is already registered.'
- );
- }
- $this->builderMap[$id] = $builder;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- return new PHPUnit_Framework_MockObject_Builder_InvocationMocker(
- $this,
- $matcher
- );
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return mixed
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $exception = null;
- $hasReturnValue = false;
- if (strtolower($invocation->methodName) == '__tostring') {
- $returnValue = '';
- } else {
- $returnValue = null;
- }
- foreach ($this->matchers as $match) {
- try {
- if ($match->matches($invocation)) {
- $value = $match->invoked($invocation);
- if (!$hasReturnValue) {
- $returnValue = $value;
- $hasReturnValue = true;
- }
- }
- } catch (Exception $e) {
- $exception = $e;
- }
- }
- if ($exception !== null) {
- throw $exception;
- }
- return $returnValue;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- foreach ($this->matchers as $matcher) {
- if (!$matcher->matches($invocation)) {
- return false;
- }
- }
- return true;
- }
- /**
- * @return boolean
- */
- public function verify()
- {
- foreach ($this->matchers as $matcher) {
- $matcher->verify();
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for a specific method name in the invocations.
- *
- * Checks the method name all incoming invocations, the name is checked against
- * the defined constraint $constraint. If the constraint is met it will return
- * true in matches().
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_MethodName extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @param PHPUnit_Framework_Constraint|string
- * @throws PHPUnit_Framework_Constraint
- */
- public function __construct($constraint)
- {
- if (!$constraint instanceof PHPUnit_Framework_Constraint) {
- if (!is_string($constraint)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint,
- 0,
- 10,
- false,
- true
- );
- }
- $this->constraint = $constraint;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'method name ' . $this->constraint->toString();
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return $this->constraint->evaluate($invocation->methodName, '', true);
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least one
- * time.
- *
- * If the number of invocations is 0 it will throw an exception in verify.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at least once';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count < 1) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at least once but it never occured.'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which allows any parameters to a method.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_AnyParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'with any parameters';
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for specific parameters in the invocations.
- *
- * Checks the parameters of all incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_Parameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var array
- */
- protected $parameters = array();
- /**
- * @var PHPUnit_Framework_MockObject_Invocation
- */
- protected $invocation;
- /**
- * @param array $parameters
- */
- public function __construct(array $parameters)
- {
- foreach ($parameters as $parameter) {
- if (!($parameter instanceof PHPUnit_Framework_Constraint)) {
- $parameter = new PHPUnit_Framework_Constraint_IsEqual(
- $parameter
- );
- }
- $this->parameters[] = $parameter;
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $text = 'with parameter';
- foreach ($this->parameters as $index => $parameter) {
- if ($index > 0) {
- $text .= ' and';
- }
- $text .= ' ' . $index . ' ' . $parameter->toString();
- }
- return $text;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->invocation = $invocation;
- return $this->verify();
- }
- /**
- * Checks if the invocation $invocation matches the current rules. If it
- * does the matcher will get the invoked() method called which should check
- * if an expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->invocation === null) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Mocked method does not exist.'
- );
- }
- if (count($this->invocation->parameters) < count($this->parameters)) {
- $message = 'Parameter count for invocation %s is too low.';
- // The user called `->with($this->anything())`, but may have meant
- // `->withAnyParameters()`.
- //
- // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199
- if (count($this->parameters) === 1 &&
- get_class($this->parameters[0]) === 'PHPUnit_Framework_Constraint_IsAnything') {
- $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.";
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf($message, $this->invocation->toString())
- );
- }
- foreach ($this->parameters as $i => $parameter) {
- $parameter->evaluate(
- $this->invocation->parameters[$i],
- sprintf(
- 'Parameter %s for invocation %s does not match expected ' .
- 'value.',
- $i,
- $this->invocation->toString()
- )
- );
- }
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked zero or more
- * times. This matcher will always match.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked zero or more times';
- }
- /**
- */
- public function verify()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least
- * N times.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var integer
- */
- private $requiredInvocations;
- /**
- * @param integer $requiredInvocations
- */
- public function __construct($requiredInvocations)
- {
- $this->requiredInvocations = $requiredInvocations;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at least ' . $this->requiredInvocations . ' times';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count < $this->requiredInvocations) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at least ' . $this->requiredInvocations .
- ' times but it occured ' . $count . ' time(s).'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes which matches an invocation based on its
- * method name, argument, order or call count.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Matcher_Invocation extends PHPUnit_Framework_SelfDescribing, PHPUnit_Framework_MockObject_Verifiable
- {
- /**
- * Registers the invocation $invocation in the object as being invoked.
- * This will only occur after matches() returns true which means the
- * current invocation is the correct one.
- *
- * The matcher can store information from the invocation which can later
- * be checked in verify(), or it can check the values directly and throw
- * and exception if an expectation is not met.
- *
- * If the matcher is a stub it will also have a return value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation);
- /**
- * Checks if the invocation $invocation matches the current rules. If it does
- * the matcher will get the invoked() method called which should check if an
- * expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which looks for sets of specific parameters in the invocations.
- *
- * Checks the parameters of the incoming invocations, the parameter list is
- * checked against the defined constraints in $parameters. If the constraint
- * is met it will return true in matches().
- *
- * It takes a list of match groups and and increases a call index after each invocation.
- * So the first invocation uses the first group of constraints, the second the next and so on.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- */
- class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
- {
- /**
- * @var array
- */
- private $_parameterGroups = array();
- /**
- * @var array
- */
- private $_invocations = array();
- /**
- * @param array $parameterGroups
- */
- public function __construct(array $parameterGroups)
- {
- foreach ($parameterGroups as $index => $parameters) {
- foreach ($parameters as $parameter) {
- if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
- $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
- }
- $this->_parameterGroups[$index][] = $parameter;
- }
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $text = 'with consecutive parameters';
- return $text;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return bool
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->_invocations[] = $invocation;
- $callIndex = count($this->_invocations) - 1;
- $this->verifyInvocation($invocation, $callIndex);
- return false;
- }
- public function verify()
- {
- foreach ($this->_invocations as $callIndex => $invocation) {
- $this->verifyInvocation($invocation, $callIndex);
- }
- }
- /**
- * Verify a single invocation
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @param int $callIndex
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
- {
- if (isset($this->_parameterGroups[$callIndex])) {
- $parameters = $this->_parameterGroups[$callIndex];
- } else {
- // no parameter assertion for this call index
- return;
- }
- if ($invocation === null) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Mocked method does not exist.'
- );
- }
- if (count($invocation->parameters) < count($parameters)) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'Parameter count for invocation %s is too low.',
- $invocation->toString()
- )
- );
- }
- foreach ($parameters as $i => $parameter) {
- $parameter->evaluate(
- $invocation->parameters[$i],
- sprintf(
- 'Parameter %s for invocation #%d %s does not match expected ' .
- 'value.',
- $i,
- $callIndex,
- $invocation->toString()
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method was invoked at a certain index.
- *
- * If the expected index number does not match the current invocation index it
- * will not match which means it skips all method and parameter matching. Only
- * once the index is reached will the method and parameter start matching and
- * verifying.
- *
- * If the index is never reached it will throw an exception in index.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var integer
- */
- protected $sequenceIndex;
- /**
- * @var integer
- */
- protected $currentIndex = -1;
- /**
- * @param integer $sequenceIndex
- */
- public function __construct($sequenceIndex)
- {
- $this->sequenceIndex = $sequenceIndex;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at sequence index ' . $this->sequenceIndex;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->currentIndex++;
- return $this->currentIndex == $this->sequenceIndex;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- if ($this->currentIndex < $this->sequenceIndex) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'The expected invocation at index %s was never reached.',
- $this->sequenceIndex
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked a certain amount
- * of times.
- * If the number of invocations exceeds the value it will immediately throw an
- * exception,
- * If the number is less it will later be checked in verify() and also throw an
- * exception.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var integer
- */
- protected $expectedCount;
- /**
- * @param integer $expectedCount
- */
- public function __construct($expectedCount)
- {
- $this->expectedCount = $expectedCount;
- }
- /**
- * @return boolean
- */
- public function isNever()
- {
- return $this->expectedCount == 0;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked ' . $this->expectedCount . ' time(s)';
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- parent::invoked($invocation);
- $count = $this->getInvocationCount();
- if ($count > $this->expectedCount) {
- $message = $invocation->toString() . ' ';
- switch ($this->expectedCount) {
- case 0: {
- $message .= 'was not expected to be called.';
- }
- break;
- case 1: {
- $message .= 'was not expected to be called more than once.';
- }
- break;
- default: {
- $message .= sprintf(
- 'was not expected to be called more than %d times.',
- $this->expectedCount
- );
- }
- }
- throw new PHPUnit_Framework_ExpectationFailedException($message);
- }
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count !== $this->expectedCount) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- sprintf(
- 'Method was expected to be called %d times, ' .
- 'actually called %d times.',
- $this->expectedCount,
- $count
- )
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which checks if a method has been invoked at least
- * N times.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
- {
- /**
- * @var integer
- */
- private $allowedInvocations;
- /**
- * @param integer $allowedInvocations
- */
- public function __construct($allowedInvocations)
- {
- $this->allowedInvocations = $allowedInvocations;
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'invoked at most ' . $this->allowedInvocations . ' times';
- }
- /**
- * Verifies that the current expectation is valid. If everything is OK the
- * code should just return, if not it must throw an exception.
- *
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function verify()
- {
- $count = $this->getInvocationCount();
- if ($count > $this->allowedInvocations) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- 'Expected invocation at most ' . $this->allowedInvocations .
- ' times but it occured ' . $count . ' time(s).'
- );
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Records invocations and provides convenience methods for checking them later
- * on.
- * This abstract class can be implemented by matchers which needs to check the
- * number of times an invocation has occured.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- * @abstract
- */
- abstract class PHPUnit_Framework_MockObject_Matcher_InvokedRecorder implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * @var PHPUnit_Framework_MockObject_Invocation[]
- */
- protected $invocations = array();
- /**
- * @return integer
- */
- public function getInvocationCount()
- {
- return count($this->invocations);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Invocation[]
- */
- public function getInvocations()
- {
- return $this->invocations;
- }
- /**
- * @return boolean
- */
- public function hasBeenInvoked()
- {
- return count($this->invocations) > 0;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->invocations[] = $invocation;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * @return boolean
- */
- public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return true;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Invocation matcher which does not care about previous state from earlier
- * invocations.
- *
- * This abstract class can be implemented by matchers which does not care about
- * state but only the current run-time value of the invocation itself.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- * @abstract
- */
- abstract class PHPUnit_Framework_MockObject_Matcher_StatelessInvocation implements PHPUnit_Framework_MockObject_Matcher_Invocation
- {
- /**
- * Registers the invocation $invocation in the object as being invoked.
- * This will only occur after matches() returns true which means the
- * current invocation is the correct one.
- *
- * The matcher can store information from the invocation which can later
- * be checked in verify(), or it can check the values directly and throw
- * and exception if an expectation is not met.
- *
- * If the matcher is a stub it will also have a return value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return mixed
- */
- public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- }
- /**
- * Checks if the invocation $invocation matches the current rules. If it does
- * the matcher will get the invoked() method called which should check if an
- * expectation is met.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * Object containing information on a mocked or stubbed method which
- * was invoked.
- * @return bool
- */
- public function verify()
- {
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use Doctrine\Instantiator\Instantiator;
- use Doctrine\Instantiator\Exception\InvalidArgumentException as InstantiatorInvalidArgumentException;
- use Doctrine\Instantiator\Exception\UnexpectedValueException as InstantiatorUnexpectedValueException;
- if (!function_exists('trait_exists')) {
- function trait_exists($traitname, $autoload = true)
- {
- return false;
- }
- }
- /**
- * Mock Object Code Generator
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Generator
- {
- /**
- * @var array
- */
- private static $cache = array();
- /**
- * @var array
- */
- protected $blacklistedMethodNames = array(
- '__CLASS__' => true,
- '__DIR__' => true,
- '__FILE__' => true,
- '__FUNCTION__' => true,
- '__LINE__' => true,
- '__METHOD__' => true,
- '__NAMESPACE__' => true,
- '__TRAIT__' => true,
- '__clone' => true,
- '__halt_compiler' => true,
- 'abstract' => true,
- 'and' => true,
- 'array' => true,
- 'as' => true,
- 'break' => true,
- 'callable' => true,
- 'case' => true,
- 'catch' => true,
- 'class' => true,
- 'clone' => true,
- 'const' => true,
- 'continue' => true,
- 'declare' => true,
- 'default' => true,
- 'die' => true,
- 'do' => true,
- 'echo' => true,
- 'else' => true,
- 'elseif' => true,
- 'empty' => true,
- 'enddeclare' => true,
- 'endfor' => true,
- 'endforeach' => true,
- 'endif' => true,
- 'endswitch' => true,
- 'endwhile' => true,
- 'eval' => true,
- 'exit' => true,
- 'expects' => true,
- 'extends' => true,
- 'final' => true,
- 'for' => true,
- 'foreach' => true,
- 'function' => true,
- 'global' => true,
- 'goto' => true,
- 'if' => true,
- 'implements' => true,
- 'include' => true,
- 'include_once' => true,
- 'instanceof' => true,
- 'insteadof' => true,
- 'interface' => true,
- 'isset' => true,
- 'list' => true,
- 'namespace' => true,
- 'new' => true,
- 'or' => true,
- 'print' => true,
- 'private' => true,
- 'protected' => true,
- 'public' => true,
- 'require' => true,
- 'require_once' => true,
- 'return' => true,
- 'static' => true,
- 'switch' => true,
- 'throw' => true,
- 'trait' => true,
- 'try' => true,
- 'unset' => true,
- 'use' => true,
- 'var' => true,
- 'while' => true,
- 'xor' => true
- );
- /**
- * @var boolean
- */
- protected $soapLoaded = null;
- /**
- * Returns a mock object for the specified class.
- *
- * @param array|string $type
- * @param array $methods
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param boolean $cloneArguments
- * @param boolean $callOriginalMethods
- * @param object $proxyTarget
- * @return object
- * @throws InvalidArgumentException
- * @throws PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @since Method available since Release 1.0.0
- */
- public function getMock($type, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = true, $callOriginalMethods = false, $proxyTarget = null)
- {
- if (!is_array($type) && !is_string($type)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'array or string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'string');
- }
- if (!is_array($methods) && !is_null($methods)) {
- throw new InvalidArgumentException;
- }
- if ($type === 'Traversable' || $type === '\\Traversable') {
- $type = 'Iterator';
- }
- if (is_array($type)) {
- $type = array_unique(array_map(
- function ($type) {
- if ($type === 'Traversable' ||
- $type === '\\Traversable' ||
- $type === '\\Iterator') {
- return 'Iterator';
- }
- return $type;
- },
- $type
- ));
- }
- if (null !== $methods) {
- foreach ($methods as $method) {
- if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', $method)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Cannot stub or mock method with invalid name "%s"',
- $method
- )
- );
- }
- }
- if ($methods != array_unique($methods)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Cannot stub or mock using a method list that contains duplicates: "%s"',
- implode(', ', $methods)
- )
- );
- }
- }
- if ($mockClassName != '' && class_exists($mockClassName, false)) {
- $reflect = new ReflectionClass($mockClassName);
- if (!$reflect->implementsInterface("PHPUnit_Framework_MockObject_MockObject")) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Class "%s" already exists.',
- $mockClassName
- )
- );
- }
- }
- $mock = $this->generate(
- $type,
- $methods,
- $mockClassName,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- return $this->getObject(
- $mock['code'],
- $mock['mockClassName'],
- $type,
- $callOriginalConstructor,
- $callAutoload,
- $arguments,
- $callOriginalMethods,
- $proxyTarget
- );
- }
- /**
- * @param string $code
- * @param string $className
- * @param array|string $type
- * @param boolean $callOriginalConstructor
- * @param boolean $callAutoload
- * @param array $arguments
- * @param boolean $callOriginalMethods
- * @param object $proxyTarget
- * @return object
- */
- protected function getObject($code, $className, $type = '', $callOriginalConstructor = false, $callAutoload = false, array $arguments = array(), $callOriginalMethods = false, $proxyTarget = null)
- {
- $this->evalClass($code, $className);
- if ($callOriginalConstructor &&
- is_string($type) &&
- !interface_exists($type, $callAutoload)) {
- if (count($arguments) == 0) {
- $object = new $className;
- } else {
- $class = new ReflectionClass($className);
- $object = $class->newInstanceArgs($arguments);
- }
- } else {
- try {
- $instantiator = new Instantiator;
- $object = $instantiator->instantiate($className);
- } catch (InstantiatorUnexpectedValueException $exception) {
- if ($exception->getPrevious()) {
- $exception = $exception->getPrevious();
- }
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- $exception->getMessage()
- );
- } catch (InstantiatorInvalidArgumentException $exception) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- $exception->getMessage()
- );
- }
- }
- if ($callOriginalMethods) {
- if (!is_object($proxyTarget)) {
- if (count($arguments) == 0) {
- $proxyTarget = new $type;
- } else {
- $class = new ReflectionClass($type);
- $proxyTarget = $class->newInstanceArgs($arguments);
- }
- }
- $object->__phpunit_setOriginalObject($proxyTarget);
- }
- return $object;
- }
- /**
- * @param string $code
- * @param string $className
- */
- protected function evalClass($code, $className)
- {
- if (!class_exists($className, false)) {
- eval($code);
- }
- }
- /**
- * Returns a mock object for the specified abstract class with all abstract
- * methods of the class mocked. Concrete methods to mock can be specified with
- * the last parameter
- *
- * @param string $originalClassName
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param array $mockedMethods
- * @param boolean $cloneArguments
- * @return object
- * @since Method available since Release 1.0.0
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = true)
- {
- if (!is_string($originalClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (class_exists($originalClassName, $callAutoload) ||
- interface_exists($originalClassName, $callAutoload)) {
- $reflector = new ReflectionClass($originalClassName);
- $methods = $mockedMethods;
- foreach ($reflector->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
- if (!in_array($method->getName(), $methods)) {
- $methods[] = $method->getName();
- }
- }
- if (empty($methods)) {
- $methods = null;
- }
- return $this->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- } else {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf('Class "%s" does not exist.', $originalClassName)
- );
- }
- }
- /**
- * Returns a mock object for the specified trait with all abstract methods
- * of the trait mocked. Concrete methods to mock can be specified with the
- * `$mockedMethods` parameter.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param array $mockedMethods
- * @param boolean $cloneArguments
- * @return object
- * @since Method available since Release 1.2.3
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForTrait($traitName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = true)
- {
- if (!is_string($traitName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($mockClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (!trait_exists($traitName, $callAutoload)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Trait "%s" does not exist.',
- $traitName
- )
- );
- }
- $className = $this->generateClassName(
- $traitName,
- '',
- 'Trait_'
- );
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'trait_class.tpl'
- );
- $classTemplate->setVar(
- array(
- 'prologue' => 'abstract ',
- 'class_name' => $className['className'],
- 'trait_name' => $traitName
- )
- );
- $this->evalClass(
- $classTemplate->render(),
- $className['className']
- );
- return $this->getMockForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments);
- }
- /**
- * Returns an object for the specified trait.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $traitClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @return object
- * @since Method available since Release 1.1.0
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @throws PHPUnit_Framework_Exception
- */
- public function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true)
- {
- if (!is_string($traitName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($traitClassName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
- }
- if (!trait_exists($traitName, $callAutoload)) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Trait "%s" does not exist.',
- $traitName
- )
- );
- }
- $className = $this->generateClassName(
- $traitName,
- $traitClassName,
- 'Trait_'
- );
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'trait_class.tpl'
- );
- $classTemplate->setVar(
- array(
- 'prologue' => '',
- 'class_name' => $className['className'],
- 'trait_name' => $traitName
- )
- );
- return $this->getObject(
- $classTemplate->render(),
- $className['className']
- );
- }
- /**
- * @param array|string $type
- * @param array $methods
- * @param string $mockClassName
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param boolean $cloneArguments
- * @param boolean $callOriginalMethods
- * @return array
- */
- public function generate($type, array $methods = null, $mockClassName = '', $callOriginalClone = true, $callAutoload = true, $cloneArguments = true, $callOriginalMethods = false)
- {
- if (is_array($type)) {
- sort($type);
- }
- if ($mockClassName == '') {
- $key = md5(
- is_array($type) ? join('_', $type) : $type .
- serialize($methods) .
- serialize($callOriginalClone) .
- serialize($cloneArguments) .
- serialize($callOriginalMethods)
- );
- if (isset(self::$cache[$key])) {
- return self::$cache[$key];
- }
- }
- $mock = $this->generateMock(
- $type,
- $methods,
- $mockClassName,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- if (isset($key)) {
- self::$cache[$key] = $mock;
- }
- return $mock;
- }
- /**
- * @param string $wsdlFile
- * @param string $className
- * @param array $methods
- * @param array $options
- * @return string
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- */
- public function generateClassFromWsdl($wsdlFile, $className, array $methods = array(), array $options = array())
- {
- if ($this->soapLoaded === null) {
- $this->soapLoaded = extension_loaded('soap');
- }
- if ($this->soapLoaded) {
- $options = array_merge($options, array('cache_wsdl' => WSDL_CACHE_NONE));
- $client = new SoapClient($wsdlFile, $options);
- $_methods = array_unique($client->__getFunctions());
- unset($client);
- sort($_methods);
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR .
- 'Generator' . DIRECTORY_SEPARATOR;
- $methodTemplate = new Text_Template(
- $templateDir . 'wsdl_method.tpl'
- );
- $methodsBuffer = '';
- foreach ($_methods as $method) {
- $nameStart = strpos($method, ' ') + 1;
- $nameEnd = strpos($method, '(');
- $name = substr($method, $nameStart, $nameEnd - $nameStart);
- if (empty($methods) || in_array($name, $methods)) {
- $args = explode(
- ',',
- substr(
- $method,
- $nameEnd + 1,
- strpos($method, ')') - $nameEnd - 1
- )
- );
- $numArgs = count($args);
- for ($i = 0; $i < $numArgs; $i++) {
- $args[$i] = substr($args[$i], strpos($args[$i], '$'));
- }
- $methodTemplate->setVar(
- array(
- 'method_name' => $name,
- 'arguments' => join(', ', $args)
- )
- );
- $methodsBuffer .= $methodTemplate->render();
- }
- }
- $optionsBuffer = 'array(';
- foreach ($options as $key => $value) {
- $optionsBuffer .= $key . ' => ' . $value;
- }
- $optionsBuffer .= ')';
- $classTemplate = new Text_Template(
- $templateDir . 'wsdl_class.tpl'
- );
- $namespace = '';
- if (strpos($className, '\\') !== false) {
- $parts = explode('\\', $className);
- $className = array_pop($parts);
- $namespace = 'namespace ' . join('\\', $parts) . ';' . "\n\n";
- }
- $classTemplate->setVar(
- array(
- 'namespace' => $namespace,
- 'class_name' => $className,
- 'wsdl' => $wsdlFile,
- 'options' => $optionsBuffer,
- 'methods' => $methodsBuffer
- )
- );
- return $classTemplate->render();
- } else {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- 'The SOAP extension is required to generate a mock object ' .
- 'from WSDL.'
- );
- }
- }
- /**
- * @param array|string $type
- * @param array|null $methods
- * @param string $mockClassName
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param boolean $cloneArguments
- * @param boolean $callOriginalMethods
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- protected function generateMock($type, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods)
- {
- $templateDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
- DIRECTORY_SEPARATOR;
- $classTemplate = new Text_Template(
- $templateDir . 'mocked_class.tpl'
- );
- $additionalInterfaces = array();
- $cloneTemplate = '';
- $isClass = false;
- $isInterface = false;
- $mockClassName = $this->generateClassName(
- $type,
- $mockClassName,
- 'Mock_'
- );
- if (is_array($type)) {
- foreach ($type as $_type) {
- if (!interface_exists($_type, $callAutoload)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Interface "%s" does not exist.',
- $_type
- )
- );
- }
- $additionalInterfaces[] = $_type;
- foreach ($this->getClassMethods($_type) as $method) {
- if (in_array($method, $methods)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Duplicate method "%s" not allowed.',
- $method
- )
- );
- }
- $methods[] = $method;
- }
- }
- }
- if (class_exists($mockClassName['fullClassName'], $callAutoload)) {
- $isClass = true;
- } else {
- if (interface_exists($mockClassName['fullClassName'], $callAutoload)) {
- $isInterface = true;
- }
- }
- if (!class_exists($mockClassName['fullClassName'], $callAutoload) &&
- !interface_exists($mockClassName['fullClassName'], $callAutoload)) {
- $prologue = 'class ' . $mockClassName['originalClassName'] . "\n{\n}\n\n";
- if (!empty($mockClassName['namespaceName'])) {
- $prologue = 'namespace ' . $mockClassName['namespaceName'] .
- " {\n\n" . $prologue . "}\n\n" .
- "namespace {\n\n";
- $epilogue = "\n\n}";
- }
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- } else {
- $class = new ReflectionClass($mockClassName['fullClassName']);
- if ($class->isFinal()) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Class "%s" is declared "final" and cannot be mocked.',
- $mockClassName['fullClassName']
- )
- );
- }
- if ($class->hasMethod('__clone')) {
- $cloneMethod = $class->getMethod('__clone');
- if (!$cloneMethod->isFinal()) {
- if ($callOriginalClone && !$isInterface) {
- $cloneTemplate = new Text_Template(
- $templateDir . 'unmocked_clone.tpl'
- );
- } else {
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- }
- }
- } else {
- $cloneTemplate = new Text_Template(
- $templateDir . 'mocked_clone.tpl'
- );
- }
- }
- if (is_object($cloneTemplate)) {
- $cloneTemplate = $cloneTemplate->render();
- }
- if (is_array($methods) && empty($methods) &&
- ($isClass || $isInterface)) {
- $methods = $this->getClassMethods($mockClassName['fullClassName']);
- }
- if (!is_array($methods)) {
- $methods = array();
- }
- $mockedMethods = '';
- if (isset($class)) {
- // https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103
- if ($isInterface && $class->implementsInterface('Traversable') &&
- !$class->implementsInterface('Iterator') &&
- !$class->implementsInterface('IteratorAggregate')) {
- $additionalInterfaces[] = 'Iterator';
- $methods = array_merge($methods, $this->getClassMethods('Iterator'));
- }
- foreach ($methods as $methodName) {
- try {
- $method = $class->getMethod($methodName);
- if ($this->canMockMethod($method)) {
- $mockedMethods .= $this->generateMockedMethodDefinitionFromExisting(
- $templateDir,
- $method,
- $cloneArguments,
- $callOriginalMethods
- );
- }
- } catch (ReflectionException $e) {
- $mockedMethods .= $this->generateMockedMethodDefinition(
- $templateDir,
- $mockClassName['fullClassName'],
- $methodName,
- $cloneArguments
- );
- }
- }
- } else {
- foreach ($methods as $methodName) {
- $mockedMethods .= $this->generateMockedMethodDefinition(
- $templateDir,
- $mockClassName['fullClassName'],
- $methodName,
- $cloneArguments
- );
- }
- }
- $method = '';
- if (!in_array('method', $methods)) {
- $methodTemplate = new Text_Template(
- $templateDir . 'mocked_class_method.tpl'
- );
- $method = $methodTemplate->render();
- }
- $classTemplate->setVar(
- array(
- 'prologue' => isset($prologue) ? $prologue : '',
- 'epilogue' => isset($epilogue) ? $epilogue : '',
- 'class_declaration' => $this->generateMockClassDeclaration(
- $mockClassName,
- $isInterface,
- $additionalInterfaces
- ),
- 'clone' => $cloneTemplate,
- 'mock_class_name' => $mockClassName['className'],
- 'mocked_methods' => $mockedMethods,
- 'method' => $method
- )
- );
- return array(
- 'code' => $classTemplate->render(),
- 'mockClassName' => $mockClassName['className']
- );
- }
- /**
- * @param array|string $type
- * @param string $className
- * @param string $prefix
- * @return array
- */
- protected function generateClassName($type, $className, $prefix)
- {
- if (is_array($type)) {
- $type = join('_', $type);
- }
- if ($type[0] == '\\') {
- $type = substr($type, 1);
- }
- $classNameParts = explode('\\', $type);
- if (count($classNameParts) > 1) {
- $type = array_pop($classNameParts);
- $namespaceName = join('\\', $classNameParts);
- $fullClassName = $namespaceName . '\\' . $type;
- } else {
- $namespaceName = '';
- $fullClassName = $type;
- }
- if ($className == '') {
- do {
- $className = $prefix . $type . '_' .
- substr(md5(microtime()), 0, 8);
- } while (class_exists($className, false));
- }
- return array(
- 'className' => $className,
- 'originalClassName' => $type,
- 'fullClassName' => $fullClassName,
- 'namespaceName' => $namespaceName
- );
- }
- /**
- * @param array $mockClassName
- * @param boolean $isInterface
- * @param array $additionalInterfaces
- * @return array
- */
- protected function generateMockClassDeclaration(array $mockClassName, $isInterface, array $additionalInterfaces = array())
- {
- $buffer = 'class ';
- $additionalInterfaces[] = 'PHPUnit_Framework_MockObject_MockObject';
- $interfaces = implode(', ', $additionalInterfaces);
- if ($isInterface) {
- $buffer .= sprintf(
- "%s implements %s",
- $mockClassName['className'],
- $interfaces
- );
- if (!in_array($mockClassName['originalClassName'], $additionalInterfaces)) {
- $buffer .= ', ';
- if (!empty($mockClassName['namespaceName'])) {
- $buffer .= $mockClassName['namespaceName'] . '\\';
- }
- $buffer .= $mockClassName['originalClassName'];
- }
- } else {
- $buffer .= sprintf(
- "%s extends %s%s implements %s",
- $mockClassName['className'],
- !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '',
- $mockClassName['originalClassName'],
- $interfaces
- );
- }
- return $buffer;
- }
- /**
- * @param string $templateDir
- * @param ReflectionMethod $method
- * @param boolean $cloneArguments
- * @param boolean $callOriginalMethods
- * @return string
- */
- protected function generateMockedMethodDefinitionFromExisting($templateDir, ReflectionMethod $method, $cloneArguments, $callOriginalMethods)
- {
- if ($method->isPrivate()) {
- $modifier = 'private';
- } elseif ($method->isProtected()) {
- $modifier = 'protected';
- } else {
- $modifier = 'public';
- }
- if ($method->isStatic()) {
- $modifier .= ' static';
- }
- if ($method->returnsReference()) {
- $reference = '&';
- } else {
- $reference = '';
- }
- return $this->generateMockedMethodDefinition(
- $templateDir,
- $method->getDeclaringClass()->getName(),
- $method->getName(),
- $cloneArguments,
- $modifier,
- $this->getMethodParameters($method),
- $this->getMethodParameters($method, true),
- $reference,
- $callOriginalMethods,
- $method->isStatic()
- );
- }
- /**
- * @param string $templateDir
- * @param string $className
- * @param string $methodName
- * @param boolean $cloneArguments
- * @param string $modifier
- * @param string $arguments_decl
- * @param string $arguments_call
- * @param string $reference
- * @param boolean $callOriginalMethods
- * @param boolean $static
- * @return string
- */
- protected function generateMockedMethodDefinition($templateDir, $className, $methodName, $cloneArguments = true, $modifier = 'public', $arguments_decl = '', $arguments_call = '', $reference = '', $callOriginalMethods = false, $static = false)
- {
- if ($static) {
- $templateFile = 'mocked_static_method.tpl';
- } else {
- $templateFile = sprintf(
- '%s_method.tpl',
- $callOriginalMethods ? 'proxied' : 'mocked'
- );
- }
- $template = new Text_Template($templateDir . $templateFile);
- $template->setVar(
- array(
- 'arguments_decl' => $arguments_decl,
- 'arguments_call' => $arguments_call,
- 'arguments_count' => !empty($arguments_call) ? count(explode(',', $arguments_call)) : 0,
- 'class_name' => $className,
- 'method_name' => $methodName,
- 'modifier' => $modifier,
- 'reference' => $reference,
- 'clone_arguments' => $cloneArguments ? 'TRUE' : 'FALSE'
- )
- );
- return $template->render();
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- */
- protected function canMockMethod(ReflectionMethod $method)
- {
- if ($method->isConstructor() ||
- $method->isFinal() ||
- $method->isPrivate() ||
- isset($this->blacklistedMethodNames[$method->getName()])) {
- return false;
- }
- return true;
- }
- /**
- * Returns the parameters of a function or method.
- *
- * @param ReflectionMethod $method
- * @param boolean $forCall
- * @return string
- * @throws PHPUnit_Framework_MockObject_RuntimeException
- * @since Method available since Release 2.0.0
- */
- protected function getMethodParameters(ReflectionMethod $method, $forCall = false)
- {
- $parameters = array();
- foreach ($method->getParameters() as $i => $parameter) {
- $name = '$' . $parameter->getName();
- /* Note: PHP extensions may use empty names for reference arguments
- * or "..." for methods taking a variable number of arguments.
- */
- if ($name === '$' || $name === '$...') {
- $name = '$arg' . $i;
- }
- if ($this->isVariadic($parameter)) {
- if ($forCall) {
- continue;
- } else {
- $name = '...' . $name;
- }
- }
- $default = '';
- $reference = '';
- $typeHint = '';
- if (!$forCall) {
- if ($parameter->isArray()) {
- $typeHint = 'array ';
- } elseif ((defined('HHVM_VERSION') || version_compare(PHP_VERSION, '5.4.0', '>='))
- && $parameter->isCallable()) {
- $typeHint = 'callable ';
- } else {
- try {
- $class = $parameter->getClass();
- } catch (ReflectionException $e) {
- throw new PHPUnit_Framework_MockObject_RuntimeException(
- sprintf(
- 'Cannot mock %s::%s() because a class or ' .
- 'interface used in the signature is not loaded',
- $method->getDeclaringClass()->getName(),
- $method->getName()
- ),
- 0,
- $e
- );
- }
- if ($class !== null) {
- $typeHint = $class->getName() . ' ';
- }
- }
- if (!$this->isVariadic($parameter)) {
- if ($parameter->isDefaultValueAvailable()) {
- $value = $parameter->getDefaultValue();
- $default = ' = ' . var_export($value, true);
- } elseif ($parameter->isOptional()) {
- $default = ' = null';
- }
- }
- }
- if ($parameter->isPassedByReference()) {
- $reference = '&';
- }
- $parameters[] = $typeHint . $reference . $name . $default;
- }
- return join(', ', $parameters);
- }
- /**
- * @param ReflectionParameter $parameter
- * @return boolean
- * @since Method available since Release 2.2.1
- */
- private function isVariadic(ReflectionParameter $parameter)
- {
- return method_exists('ReflectionParameter', 'isVariadic') && $parameter->isVariadic();
- }
- /**
- * @param string $className
- * @return array
- * @since Method available since Release 2.3.2
- */
- private function getClassMethods($className)
- {
- $class = new ReflectionClass($className);
- $methods = array();
- foreach ($class->getMethods() as $method) {
- if ($method->isPublic() || $method->isAbstract()) {
- $methods[] = $method->getName();
- }
- }
- return $methods;
- }
- }
- public function {method_name}({arguments})
- {
- }
- public function __clone()
- {
- $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
- parent::__clone();
- }
- {prologue}{class_declaration}
- {
- private $__phpunit_invocationMocker;
- private $__phpunit_originalObject;
- {clone}{mocked_methods}
- public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
- {
- return $this->__phpunit_getInvocationMocker()->expects($matcher);
- }
- {method}
- public function __phpunit_setOriginalObject($originalObject)
- {
- $this->__phpunit_originalObject = $originalObject;
- }
- public function __phpunit_getInvocationMocker()
- {
- if ($this->__phpunit_invocationMocker === NULL) {
- $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
- }
- return $this->__phpunit_invocationMocker;
- }
- public function __phpunit_hasMatchers()
- {
- return $this->__phpunit_getInvocationMocker()->hasMatchers();
- }
- public function __phpunit_verify()
- {
- $this->__phpunit_getInvocationMocker()->verify();
- $this->__phpunit_invocationMocker = NULL;
- }
- }{epilogue}
- public function __clone()
- {
- $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- $arguments = array({arguments_call});
- $count = func_num_args();
- if ($count > {arguments_count}) {
- $_arguments = func_get_args();
- for ($i = {arguments_count}; $i < $count; $i++) {
- $arguments[] = $_arguments[$i];
- }
- }
- $this->__phpunit_getInvocationMocker()->invoke(
- new PHPUnit_Framework_MockObject_Invocation_Object(
- '{class_name}', '{method_name}', $arguments, $this, {clone_arguments}
- )
- );
- return call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $arguments);
- }
- {namespace}class {class_name} extends \SoapClient
- {
- public function __construct($wsdl, array $options)
- {
- parent::__construct('{wsdl}', $options);
- }
- {methods}}
- {prologue}class {class_name}
- {
- use {trait_name};
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- $arguments = array({arguments_call});
- $count = func_num_args();
- if ($count > {arguments_count}) {
- $_arguments = func_get_args();
- for ($i = {arguments_count}; $i < $count; $i++) {
- $arguments[] = $_arguments[$i];
- }
- }
- $result = $this->__phpunit_getInvocationMocker()->invoke(
- new PHPUnit_Framework_MockObject_Invocation_Object(
- '{class_name}', '{method_name}', $arguments, $this, {clone_arguments}
- )
- );
- return $result;
- }
- public function method()
- {
- $any = new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount;
- $expects = $this->expects($any);
- return call_user_func_array(array($expects, 'method'), func_get_args());
- }
- {modifier} function {reference}{method_name}({arguments_decl})
- {
- throw new PHPUnit_Framework_MockObject_BadMethodCallException;
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for invocation order matches.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Match extends PHPUnit_Framework_MockObject_Builder_Stub
- {
- /**
- * Defines the expectation which must occur before the current is valid.
- *
- * @param string $id The identification of the expectation that should
- * occur before this one.
- * @return PHPUnit_Framework_MockObject_Builder_Stub
- */
- public function after($id);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for unique identifiers.
- *
- * Defines the interface for recording unique identifiers. The identifiers
- * can be used to define the invocation order of expectations. The expectation
- * is recorded using id() and then defined in order using
- * PHPUnit_Framework_MockObject_Builder_Match::after().
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Identity
- {
- /**
- * Sets the identification of the expectation to $id.
- *
- * @note The identifier is unique per mock object.
- * @param string $id Unique identifiation of expectation.
- */
- public function id($id);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder for mocked or stubbed invocations.
- *
- * Provides methods for building expectations without having to resort to
- * instantiating the various matchers manually. These methods also form a
- * more natural way of reading the expectation. This class should be together
- * with the test case PHPUnit_Framework_MockObject_TestCase.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Builder_InvocationMocker implements PHPUnit_Framework_MockObject_Builder_MethodNameMatch
- {
- /**
- * @var PHPUnit_Framework_MockObject_Stub_MatcherCollection
- */
- protected $collection;
- /**
- * @var PHPUnit_Framework_MockObject_Matcher
- */
- protected $matcher;
- /**
- * @param PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
- */
- public function __construct(PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection, PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
- {
- $this->collection = $collection;
- $this->matcher = new PHPUnit_Framework_MockObject_Matcher(
- $invocationMatcher
- );
- $this->collection->addMatcher($this->matcher);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Matcher
- */
- public function getMatcher()
- {
- return $this->matcher;
- }
- /**
- * @param mixed $id
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function id($id)
- {
- $this->collection->registerId($id, $this);
- return $this;
- }
- /**
- * @param PHPUnit_Framework_MockObject_Stub $stub
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function will(PHPUnit_Framework_MockObject_Stub $stub)
- {
- $this->matcher->stub = $stub;
- return $this;
- }
- /**
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturn($value)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_Return(
- $value
- );
- return $this->will($stub);
- }
- /**
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnMap(array $valueMap)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnValueMap(
- $valueMap
- );
- return $this->will($stub);
- }
- /**
- * @param mixed $argumentIndex
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnArgument($argumentIndex)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnArgument(
- $argumentIndex
- );
- return $this->will($stub);
- }
- /**
- * @param callable $callback
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnCallback($callback)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnCallback(
- $callback
- );
- return $this->will($stub);
- }
- /**
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnSelf()
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_ReturnSelf();
- return $this->will($stub);
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willReturnOnConsecutiveCalls()
- {
- $args = func_get_args();
- $stub = new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args);
- return $this->will($stub);
- }
- /**
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function willThrowException(Exception $exception)
- {
- $stub = new PHPUnit_Framework_MockObject_Stub_Exception($exception);
- return $this->will($stub);
- }
- /**
- * @param mixed $id
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function after($id)
- {
- $this->matcher->afterMatchBuilderId = $id;
- return $this;
- }
- /**
- * Validate that a parameters matcher can be defined, throw exceptions otherwise.
- *
- * @throws PHPUnit_Framework_Exception
- */
- private function canDefineParameters()
- {
- if ($this->matcher->methodNameMatcher === null) {
- throw new PHPUnit_Framework_Exception(
- 'Method name matcher is not defined, cannot define parameter ' .
- ' matcher without one'
- );
- }
- if ($this->matcher->parametersMatcher !== null) {
- throw new PHPUnit_Framework_Exception(
- 'Parameter matcher is already defined, cannot redefine'
- );
- }
- }
- /**
- * @param mixed $argument, ...
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function with()
- {
- $args = func_get_args();
- $this->canDefineParameters();
- $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_Parameters($args);
- return $this;
- }
- /**
- * @param mixed ...$argument
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function withConsecutive()
- {
- $args = func_get_args();
- $this->canDefineParameters();
- $this->matcher->parametersMatcher =
- new PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters($args);
- return $this;
- }
- /**
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function withAnyParameters()
- {
- $this->canDefineParameters();
- $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
- return $this;
- }
- /**
- * @param PHPUnit_Framework_Constraint|string $constraint
- * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
- */
- public function method($constraint)
- {
- if ($this->matcher->methodNameMatcher !== null) {
- throw new PHPUnit_Framework_Exception(
- 'Method name matcher is already defined, cannot redefine'
- );
- }
- $this->matcher->methodNameMatcher = new PHPUnit_Framework_MockObject_Matcher_MethodName($constraint);
- return $this;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for parameter matchers.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_ParametersMatch extends PHPUnit_Framework_MockObject_Builder_Match
- {
- /**
- * Sets the parameters to match for, each parameter to this funtion will
- * be part of match. To perform specific matches or constraints create a
- * new PHPUnit_Framework_Constraint and use it for the parameter.
- * If the parameter value is not a constraint it will use the
- * PHPUnit_Framework_Constraint_IsEqual for the value.
- *
- * Some examples:
- * <code>
- * // match first parameter with value 2
- * $b->with(2);
- * // match first parameter with value 'smock' and second identical to 42
- * $b->with('smock', new PHPUnit_Framework_Constraint_IsEqual(42));
- * </code>
- *
- * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
- */
- public function with();
- /**
- * Sets a matcher which allows any kind of parameters.
- *
- * Some examples:
- * <code>
- * // match any number of parameters
- * $b->withAnyParamers();
- * </code>
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyParameters
- */
- public function withAnyParameters();
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for builders which can register builders with a given identification.
- *
- * This interface relates to PHPUnit_Framework_MockObject_Builder_Identity.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Namespace
- {
- /**
- * Looks up the match builder with identification $id and returns it.
- *
- * @param string $id The identifiction of the match builder.
- * @return PHPUnit_Framework_MockObject_Builder_Match
- */
- public function lookupId($id);
- /**
- * Registers the match builder $builder with the identification $id. The
- * builder can later be looked up using lookupId() to figure out if it
- * has been invoked.
- *
- * @param string $id
- * The identification of the match builder.
- * @param PHPUnit_Framework_MockObject_Builder_Match $builder
- * The builder which is being registered.
- */
- public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for matcher of method names.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_MethodNameMatch extends PHPUnit_Framework_MockObject_Builder_ParametersMatch
- {
- /**
- * Adds a new method name match and returns the parameter match object for
- * further matching possibilities.
- *
- * @param PHPUnit_Framework_Constraint $name
- * Constraint for matching method, if a string is passed it will use
- * the PHPUnit_Framework_Constraint_IsEqual.
- * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
- */
- public function method($name);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Builder interface for stubs which are actions replacing an invocation.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Builder_Stub extends PHPUnit_Framework_MockObject_Builder_Identity
- {
- /**
- * Stubs the matching method with the stub object $stub. Any invocations of
- * the matched method will now be handled by the stub instead.
- *
- * @param PHPUnit_Framework_MockObject_Stub $stub The stub object.
- * @return PHPUnit_Framework_MockObject_Builder_Identity
- */
- public function will(PHPUnit_Framework_MockObject_Stub $stub);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Represents a non-static invocation.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Invocation_Object extends PHPUnit_Framework_MockObject_Invocation_Static
- {
- /**
- * @var object
- */
- public $object;
- /**
- * @param string $className
- * @param string $methodname
- * @param array $parameters
- * @param object $object
- * @param object $cloneObjects
- */
- public function __construct($className, $methodName, array $parameters, $object, $cloneObjects = false)
- {
- parent::__construct($className, $methodName, $parameters, $cloneObjects);
- $this->object = $object;
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Represents a static invocation.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Invocation_Static implements PHPUnit_Framework_MockObject_Invocation, PHPUnit_Framework_SelfDescribing
- {
- /**
- * @var array
- */
- protected static $uncloneableExtensions = array(
- 'mysqli' => true,
- 'SQLite' => true,
- 'sqlite3' => true,
- 'tidy' => true,
- 'xmlwriter' => true,
- 'xsl' => true
- );
- /**
- * @var array
- */
- protected static $uncloneableClasses = array(
- 'Closure',
- 'COMPersistHelper',
- 'IteratorIterator',
- 'RecursiveIteratorIterator',
- 'SplFileObject',
- 'PDORow',
- 'ZipArchive'
- );
- /**
- * @var string
- */
- public $className;
- /**
- * @var string
- */
- public $methodName;
- /**
- * @var array
- */
- public $parameters;
- /**
- * @param string $className
- * @param string $methodname
- * @param array $parameters
- * @param boolean $cloneObjects
- */
- public function __construct($className, $methodName, array $parameters, $cloneObjects = false)
- {
- $this->className = $className;
- $this->methodName = $methodName;
- $this->parameters = $parameters;
- if (!$cloneObjects) {
- return;
- }
- foreach ($this->parameters as $key => $value) {
- if (is_object($value)) {
- $this->parameters[$key] = $this->cloneObject($value);
- }
- }
- }
- /**
- * @return string
- */
- public function toString()
- {
- $exporter = new Exporter;
- return sprintf(
- "%s::%s(%s)",
- $this->className,
- $this->methodName,
- join(
- ', ',
- array_map(
- array($exporter, 'shortenedExport'),
- $this->parameters
- )
- )
- );
- }
- /**
- * @param object $original
- * @return object
- */
- protected function cloneObject($original)
- {
- $cloneable = null;
- $object = new ReflectionObject($original);
- // Check the blacklist before asking PHP reflection to work around
- // https://bugs.php.net/bug.php?id=53967
- if ($object->isInternal() &&
- isset(self::$uncloneableExtensions[$object->getExtensionName()])) {
- $cloneable = false;
- }
- if ($cloneable === null) {
- foreach (self::$uncloneableClasses as $class) {
- if ($original instanceof $class) {
- $cloneable = false;
- break;
- }
- }
- }
- if ($cloneable === null && method_exists($object, 'isCloneable')) {
- $cloneable = $object->isCloneable();
- }
- if ($cloneable === null && $object->hasMethod('__clone')) {
- $method = $object->getMethod('__clone');
- $cloneable = $method->isPublic();
- }
- if ($cloneable === null) {
- $cloneable = true;
- }
- if ($cloneable) {
- try {
- return clone $original;
- } catch (Exception $e) {
- return $original;
- }
- } else {
- return $original;
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An object that stubs the process of a normal method for a mock object.
- *
- * The stub object will replace the code for the stubbed method and return a
- * specific value instead of the original value.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Stub extends PHPUnit_Framework_SelfDescribing
- {
- /**
- * Fakes the processing of the invocation $invocation by returning a
- * specific value.
- *
- * @param PHPUnit_Framework_MockObject_Invocation $invocation
- * The invocation which was mocked and matched by the current method
- * and argument matchers.
- * @return mixed
- */
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by raising a user-defined exception.
- *
- * @package PHPUnit_MockObject
- * @author Oliver Schlicht <o.schlicht@bitExpert.de>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_Exception implements PHPUnit_Framework_MockObject_Stub
- {
- protected $exception;
- public function __construct(Exception $exception)
- {
- $this->exception = $exception;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- throw $this->exception;
- }
- public function toString()
- {
- return sprintf(
- 'raise user-specified exception %s',
- PHPUnit_Util_Type::export($this->exception)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined value.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_Return implements PHPUnit_Framework_MockObject_Stub
- {
- protected $value;
- public function __construct($value)
- {
- $this->value = $value;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return $this->value;
- }
- public function toString()
- {
- return sprintf(
- 'return user-specified value %s',
- PHPUnit_Util_Type::export($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning the current object.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Kris Wallsmith <kris.wallsmith@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnSelf implements PHPUnit_Framework_MockObject_Stub
- {
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if (!$invocation instanceof PHPUnit_Framework_MockObject_Invocation_Object) {
- throw new PHPUnit_Framework_Exception(
- 'The current object can only be returned when mocking an ' .
- 'object, not a static class.'
- );
- }
- return $invocation->object;
- }
- public function toString()
- {
- return 'return the current object';
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a value from a map.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.1.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnValueMap implements PHPUnit_Framework_MockObject_Stub
- {
- protected $valueMap;
- public function __construct(array $valueMap)
- {
- $this->valueMap = $valueMap;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $parameterCount = count($invocation->parameters);
- foreach ($this->valueMap as $map) {
- if (!is_array($map) || $parameterCount != count($map) - 1) {
- continue;
- }
- $return = array_pop($map);
- if ($invocation->parameters === $map) {
- return $return;
- }
- }
- return null;
- }
- public function toString()
- {
- return 'return value from a map';
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined stack of values.
- *
- * @package PHPUnit_MockObject
- * @author Patrick Müller <elias0@gmx.net>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls implements PHPUnit_Framework_MockObject_Stub
- {
- protected $stack;
- protected $value;
- public function __construct($stack)
- {
- $this->stack = $stack;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- $this->value = array_shift($this->stack);
- if ($this->value instanceof PHPUnit_Framework_MockObject_Stub) {
- $this->value = $this->value->invoke($invocation);
- }
- return $this->value;
- }
- public function toString()
- {
- return sprintf(
- 'return user-specified value %s',
- PHPUnit_Util_Type::export($this->value)
- );
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning a user-defined value.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Interface available since Release 1.0.0
- */
- interface PHPUnit_Framework_MockObject_Stub_MatcherCollection
- {
- /**
- * Adds a new matcher to the collection which can be used as an expectation
- * or a stub.
- *
- * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
- * Matcher for invocations to mock objects.
- */
- public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnCallback implements PHPUnit_Framework_MockObject_Stub
- {
- protected $callback;
- public function __construct($callback)
- {
- $this->callback = $callback;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- return call_user_func_array($this->callback, $invocation->parameters);
- }
- public function toString()
- {
- if (is_array($this->callback)) {
- if (is_object($this->callback[0])) {
- $class = get_class($this->callback[0]);
- $type = '->';
- } else {
- $class = $this->callback[0];
- $type = '::';
- }
- return sprintf(
- 'return result of user defined callback %s%s%s() with the ' .
- 'passed arguments',
- $class,
- $type,
- $this->callback[1]
- );
- } else {
- return 'return result of user defined callback ' . $this->callback .
- ' with the passed arguments';
- }
- }
- }
- <?php
- /*
- * This file is part of the PHPUnit_MockObject package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Stubs a method by returning an argument that was passed to the mocked method.
- *
- * @package PHPUnit_MockObject
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @version Release: @package_version@
- * @link http://github.com/sebastianbergmann/phpunit-mock-objects
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_Framework_MockObject_Stub_ReturnArgument extends PHPUnit_Framework_MockObject_Stub_Return
- {
- protected $argumentIndex;
- public function __construct($argumentIndex)
- {
- $this->argumentIndex = $argumentIndex;
- }
- public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
- {
- if (isset($invocation->parameters[$this->argumentIndex])) {
- return $invocation->parameters[$this->argumentIndex];
- } else {
- return null;
- }
- }
- public function toString()
- {
- return sprintf('return argument #%d', $this->argumentIndex);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Marker interface for PHPUnit exceptions.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 4.0.0
- */
- interface PHPUnit_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Test can be run and collect its results.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_Test extends Countable
- {
- /**
- * Runs a test and collects its result in a TestResult instance.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for all PHPUnit Framework exceptions.
- *
- * Ensures that exceptions thrown during a test run do not leave stray
- * references behind.
- *
- * Every Exception contains a stack trace. Each stack frame contains the 'args'
- * of the called function. The function arguments can contain references to
- * instantiated objects. The references prevent the objects from being
- * destructed (until test results are eventually printed), so memory cannot be
- * freed up.
- *
- * With enabled process isolation, test results are serialized in the child
- * process and unserialized in the parent process. The stack trace of Exceptions
- * may contain objects that cannot be serialized or unserialized (e.g., PDO
- * connections). Unserializing user-space objects from the child process into
- * the parent would break the intended encapsulation of process isolation.
- *
- * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Exception extends RuntimeException implements PHPUnit_Exception
- {
- /**
- * @var array
- */
- protected $serializableTrace;
- public function __construct($message = '', $code = 0, Exception $previous = null)
- {
- parent::__construct($message, $code, $previous);
- $this->serializableTrace = $this->getTrace();
- foreach ($this->serializableTrace as $i => $call) {
- unset($this->serializableTrace[$i]['args']);
- }
- }
- /**
- * Returns the serializable trace (without 'args').
- *
- * @return array
- */
- public function getSerializableTrace()
- {
- return $this->serializableTrace;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $string = PHPUnit_Framework_TestFailure::exceptionToString($this);
- if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) {
- $string .= "\n" . $trace;
- }
- return $string;
- }
- public function __sleep()
- {
- return array_keys(get_object_vars($this));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test that printed output.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A set of assert methods.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Framework_Assert
- {
- /**
- * @var integer
- */
- private static $count = 0;
- /**
- * Asserts that an array has a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertArrayHasKey($key, $array, $message = '')
- {
- if (!(is_integer($key) || is_string($key))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'integer or string'
- );
- }
- if (!(is_array($array) || $array instanceof ArrayAccess)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_ArrayHasKey($key);
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that an array has a specified subset.
- *
- * @param array|ArrayAccess $subset
- * @param array|ArrayAccess $array
- * @param boolean $strict Check for object identity
- * @param string $message
- * @since Method available since Release 4.4.0
- */
- public static function assertArraySubset($subset, $array, $strict = false, $message = '')
- {
- if (!is_array($subset)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'array or ArrayAccess'
- );
- }
- if (!is_array($array)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_ArraySubset($subset, $strict);
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that an array does not have a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertArrayNotHasKey($key, $array, $message = '')
- {
- if (!(is_integer($key) || is_string($key))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'integer or string'
- );
- }
- if (!(is_array($array) || $array instanceof ArrayAccess)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or ArrayAccess'
- );
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ArrayHasKey($key)
- );
- self::assertThat($array, $constraint, $message);
- }
- /**
- * Asserts that a haystack contains a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- public static function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- if (is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable) {
- $constraint = new PHPUnit_Framework_Constraint_TraversableContains(
- $needle,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- } elseif (is_string($haystack)) {
- $constraint = new PHPUnit_Framework_Constraint_StringContains(
- $needle,
- $ignoreCase
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array, traversable or string'
- );
- }
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- self::assertContains(
- $needle,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message,
- $ignoreCase,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- }
- /**
- * Asserts that a haystack does not contain a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- public static function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- if (is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable) {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_TraversableContains(
- $needle,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- )
- );
- } elseif (is_string($haystack)) {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringContains(
- $needle,
- $ignoreCase
- )
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array, traversable or string'
- );
- }
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- self::assertNotContains(
- $needle,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message,
- $ignoreCase,
- $checkForObjectIdentity,
- $checkForNonObjectIdentity
- );
- }
- /**
- * Asserts that a haystack contains only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- if ($isNativeType == null) {
- $isNativeType = PHPUnit_Util_Type::isType($type);
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $type,
- $isNativeType
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack contains only instances of a given classname
- *
- * @param string $classname
- * @param array|Traversable $haystack
- * @param string $message
- */
- public static function assertContainsOnlyInstancesOf($classname, $haystack, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $classname,
- false
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains only values of a given type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- self::assertContainsOnly(
- $type,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $isNativeType,
- $message
- );
- }
- /**
- * Asserts that a haystack does not contain only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- if (!(is_array($haystack) ||
- is_object($haystack) && $haystack instanceof Traversable)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'array or traversable'
- );
- }
- if ($isNativeType == null) {
- $isNativeType = PHPUnit_Util_Type::isType($type);
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_TraversableContainsOnly(
- $type,
- $isNativeType
- )
- ),
- $message
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain only values of a given
- * type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- self::assertNotContainsOnly(
- $type,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $isNativeType,
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param integer $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- public static function assertCount($expectedCount, $haystack, $message = '')
- {
- if (!is_int($expectedCount)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- if (!$haystack instanceof Countable &&
- !$haystack instanceof Traversable &&
- !is_array($haystack)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- self::assertThat(
- $haystack,
- new PHPUnit_Framework_Constraint_Count($expectedCount),
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param integer $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertCount(
- $expectedCount,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param integer $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- public static function assertNotCount($expectedCount, $haystack, $message = '')
- {
- if (!is_int($expectedCount)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- if (!$haystack instanceof Countable &&
- !$haystack instanceof Traversable &&
- !is_array($haystack)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_Count($expectedCount)
- );
- self::assertThat($haystack, $constraint, $message);
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param integer $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertNotCount(
- $expectedCount,
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that two variables are equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- public static function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $expected,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a variable is equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- public static function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- self::assertEquals(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that two variables are not equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 2.3.0
- */
- public static function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsEqual(
- $expected,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- )
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a variable is not equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- public static function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- self::assertNotEquals(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that a variable is empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertEmpty($actual, $message = '')
- {
- self::assertThat($actual, self::isEmpty(), $message);
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertEmpty(
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotEmpty($actual, $message = '')
- {
- self::assertThat($actual, self::logicalNot(self::isEmpty()), $message);
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is not empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- self::assertNotEmpty(
- self::readAttribute($haystackClassOrObject, $haystackAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is greater than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertGreaterThan($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::greaterThan($expected), $message);
- }
- /**
- * Asserts that an attribute is greater than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertGreaterThan(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertGreaterThanOrEqual($expected, $actual, $message = '')
- {
- self::assertThat(
- $actual,
- self::greaterThanOrEqual($expected),
- $message
- );
- }
- /**
- * Asserts that an attribute is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertGreaterThanOrEqual(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is smaller than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertLessThan($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::lessThan($expected), $message);
- }
- /**
- * Asserts that an attribute is smaller than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertLessThan(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a value is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertLessThanOrEqual($expected, $actual, $message = '')
- {
- self::assertThat($actual, self::lessThanOrEqual($expected), $message);
- }
- /**
- * Asserts that an attribute is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertLessThanOrEqual(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that the contents of one file is equal to the contents of another
- * file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.2.14
- */
- public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expected, $message);
- self::assertFileExists($actual, $message);
- self::assertEquals(
- file_get_contents($expected),
- file_get_contents($actual),
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of one file is not equal to the contents of
- * another file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.2.14
- */
- public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expected, $message);
- self::assertFileExists($actual, $message);
- self::assertNotEquals(
- file_get_contents($expected),
- file_get_contents($actual),
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of a string is equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.3.0
- */
- public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expectedFile, $message);
- self::assertEquals(
- file_get_contents($expectedFile),
- $actualString,
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that the contents of a string is not equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.3.0
- */
- public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- self::assertFileExists($expectedFile, $message);
- self::assertNotEquals(
- file_get_contents($expectedFile),
- $actualString,
- $message,
- 0,
- 10,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Asserts that a file exists.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertFileExists($filename, $message = '')
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_FileExists;
- self::assertThat($filename, $constraint, $message);
- }
- /**
- * Asserts that a file does not exist.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertFileNotExists($filename, $message = '')
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_FileExists
- );
- self::assertThat($filename, $constraint, $message);
- }
- /**
- * Asserts that a condition is true.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertTrue($condition, $message = '')
- {
- self::assertThat($condition, self::isTrue(), $message);
- }
- /**
- * Asserts that a condition is not true.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotTrue($condition, $message = '')
- {
- self::assertThat($condition, self::logicalNot(self::isTrue()), $message);
- }
- /**
- * Asserts that a condition is false.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertFalse($condition, $message = '')
- {
- self::assertThat($condition, self::isFalse(), $message);
- }
- /**
- * Asserts that a condition is not false.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function assertNotFalse($condition, $message = '')
- {
- self::assertThat($condition, self::logicalNot(self::isFalse()), $message);
- }
- /**
- * Asserts that a variable is not null.
- *
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNotNull($actual, $message = '')
- {
- self::assertThat($actual, self::logicalNot(self::isNull()), $message);
- }
- /**
- * Asserts that a variable is null.
- *
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNull($actual, $message = '')
- {
- self::assertThat($actual, self::isNull(), $message);
- }
- /**
- * Asserts that a class has a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassHasAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_ClassHasAttribute(
- $attributeName
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class does not have a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassNotHasAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ClassHasAttribute($attributeName)
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class has a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassHasStaticAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that a class does not have a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_string($className) || !class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name', $className);
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- )
- );
- self::assertThat($className, $constraint, $message);
- }
- /**
- * Asserts that an object has a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertObjectHasAttribute($attributeName, $object, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
- }
- $constraint = new PHPUnit_Framework_Constraint_ObjectHasAttribute(
- $attributeName
- );
- self::assertThat($object, $constraint, $message);
- }
- /**
- * Asserts that an object does not have a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertObjectNotHasAttribute($attributeName, $object, $message = '')
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'valid attribute name');
- }
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_ObjectHasAttribute($attributeName)
- );
- self::assertThat($object, $constraint, $message);
- }
- /**
- * Asserts that two variables have the same type and value.
- * Used on objects, it asserts that two variables reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- public static function assertSame($expected, $actual, $message = '')
- {
- if (is_bool($expected) && is_bool($actual)) {
- self::assertEquals($expected, $actual, $message);
- } else {
- $constraint = new PHPUnit_Framework_Constraint_IsIdentical(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- }
- /**
- * Asserts that a variable and an attribute of an object have the same type
- * and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertSame(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that two variables do not have the same type and value.
- * Used on objects, it asserts that two variables do not reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- public static function assertNotSame($expected, $actual, $message = '')
- {
- if (is_bool($expected) && is_bool($actual)) {
- self::assertNotEquals($expected, $actual, $message);
- } else {
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsIdentical($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- }
- /**
- * Asserts that a variable and an attribute of an object do not have the
- * same type and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- self::assertNotSame(
- $expected,
- self::readAttribute($actualClassOrObject, $actualAttributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertInstanceOf($expected, $actual, $message = '')
- {
- if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertInstanceOf(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertNotInstanceOf($expected, $actual, $message = '')
- {
- if (!(is_string($expected) && (class_exists($expected) || interface_exists($expected)))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class or interface name');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsInstanceOf($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertNotInstanceOf(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertInternalType($expected, $actual, $message = '')
- {
- if (!is_string($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_IsType(
- $expected
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertInternalType(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertNotInternalType($expected, $actual, $message = '')
- {
- if (!is_string($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_IsType($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- self::assertNotInternalType(
- $expected,
- self::readAttribute($classOrObject, $attributeName),
- $message
- );
- }
- /**
- * Asserts that a string matches a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- */
- public static function assertRegExp($pattern, $string, $message = '')
- {
- if (!is_string($pattern)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_PCREMatch($pattern);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- * @since Method available since Release 2.1.0
- */
- public static function assertNotRegExp($pattern, $string, $message = '')
- {
- if (!is_string($pattern)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_PCREMatch($pattern)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- public static function assertSameSize($expected, $actual, $message = '')
- {
- if (!$expected instanceof Countable &&
- !$expected instanceof Traversable &&
- !is_array($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable');
- }
- if (!$actual instanceof Countable &&
- !$actual instanceof Traversable &&
- !is_array($actual)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- self::assertThat(
- $actual,
- new PHPUnit_Framework_Constraint_SameSize($expected),
- $message
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is not the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- public static function assertNotSameSize($expected, $actual, $message = '')
- {
- if (!$expected instanceof Countable &&
- !$expected instanceof Traversable &&
- !is_array($expected)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable or traversable');
- }
- if (!$actual instanceof Countable &&
- !$actual instanceof Traversable &&
- !is_array($actual)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable or traversable');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_SameSize($expected)
- );
- self::assertThat($actual, $constraint, $message);
- }
- /**
- * Asserts that a string matches a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringMatchesFormat($format, $string, $message = '')
- {
- if (!is_string($format)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringMatches($format);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringNotMatchesFormat($format, $string, $message = '')
- {
- if (!is_string($format)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringMatches($format)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string matches a given format file.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringMatchesFormatFile($formatFile, $string, $message = '')
- {
- self::assertFileExists($formatFile, $message);
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringMatches(
- file_get_contents($formatFile)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
- {
- self::assertFileExists($formatFile, $message);
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringMatches(
- file_get_contents($formatFile)
- )
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string starts with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringStartsWith($prefix, $string, $message = '')
- {
- if (!is_string($prefix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringStartsWith(
- $prefix
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string starts not with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringStartsNotWith($prefix, $string, $message = '')
- {
- if (!is_string($prefix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringStartsWith($prefix)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string ends with a given suffix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringEndsWith($suffix, $string, $message = '')
- {
- if (!is_string($suffix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that a string ends not with a given suffix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- public static function assertStringEndsNotWith($suffix, $string, $message = '')
- {
- if (!is_string($suffix)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_string($string)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- $constraint = new PHPUnit_Framework_Constraint_Not(
- new PHPUnit_Framework_Constraint_StringEndsWith($suffix)
- );
- self::assertThat($string, $constraint, $message);
- }
- /**
- * Asserts that two XML files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile);
- self::assertFileExists($actualFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->load($actualFile);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile);
- self::assertFileExists($actualFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->load($actualFile);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- self::assertFileExists($expectedFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- self::assertFileExists($expectedFile);
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->load($expectedFile);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->loadXML($expectedXml);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- $expected = new DOMDocument;
- $expected->preserveWhiteSpace = false;
- $expected->loadXML($expectedXml);
- $actual = new DOMDocument;
- $actual->preserveWhiteSpace = false;
- $actual->loadXML($actualXml);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that a hierarchy of DOMElements matches.
- *
- * @param DOMElement $expectedElement
- * @param DOMElement $actualElement
- * @param boolean $checkAttributes
- * @param string $message
- * @author Mattis Stordalen Flister <mattis@xait.no>
- * @since Method available since Release 3.3.0
- */
- public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '')
- {
- $expectedElement = clone $expectedElement;
- $actualElement = clone $actualElement;
- self::assertEquals(
- $expectedElement->tagName,
- $actualElement->tagName,
- $message
- );
- if ($checkAttributes) {
- self::assertEquals(
- $expectedElement->attributes->length,
- $actualElement->attributes->length,
- sprintf(
- '%s%sNumber of attributes on node "%s" does not match',
- $message,
- !empty($message) ? "\n" : '',
- $expectedElement->tagName
- )
- );
- for ($i = 0; $i < $expectedElement->attributes->length; $i++) {
- $expectedAttribute = $expectedElement->attributes->item($i);
- $actualAttribute = $actualElement->attributes->getNamedItem(
- $expectedAttribute->name
- );
- if (!$actualAttribute) {
- self::fail(
- sprintf(
- '%s%sCould not find attribute "%s" on node "%s"',
- $message,
- !empty($message) ? "\n" : '',
- $expectedAttribute->name,
- $expectedElement->tagName
- )
- );
- }
- }
- }
- PHPUnit_Util_XML::removeCharacterDataNodes($expectedElement);
- PHPUnit_Util_XML::removeCharacterDataNodes($actualElement);
- self::assertEquals(
- $expectedElement->childNodes->length,
- $actualElement->childNodes->length,
- sprintf(
- '%s%sNumber of child nodes of "%s" differs',
- $message,
- !empty($message) ? "\n" : '',
- $expectedElement->tagName
- )
- );
- for ($i = 0; $i < $expectedElement->childNodes->length; $i++) {
- self::assertEqualXMLStructure(
- $expectedElement->childNodes->item($i),
- $actualElement->childNodes->item($i),
- $checkAttributes,
- $message
- );
- }
- }
- /**
- * Assert the presence, absence, or count of elements in a document matching
- * the CSS $selector, regardless of the contents of those elements.
- *
- * The first argument, $selector, is the CSS selector used to match
- * the elements in the $actual document.
- *
- * The second argument, $count, can be either boolean or numeric.
- * When boolean, it asserts for presence of elements matching the selector
- * (true) or absence of elements (false).
- * When numeric, it asserts the count of elements.
- *
- * assertSelectCount("#binder", true, $xml); // any?
- * assertSelectCount(".binder", 3, $xml); // exactly 3?
- *
- * @param array $selector
- * @param integer|boolean|array $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @deprecated
- */
- public static function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- self::assertSelectEquals(
- $selector,
- true,
- $count,
- $actual,
- $message,
- $isHtml
- );
- }
- /**
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml); // 3?
- *
- * @param array $selector
- * @param string $pattern
- * @param integer|boolean|array $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @deprecated
- */
- public static function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- self::assertSelectEquals(
- $selector,
- "regexp:$pattern",
- $count,
- $actual,
- $message,
- $isHtml
- );
- }
- /**
- * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any?
- * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none?
- *
- * @param array $selector
- * @param string $content
- * @param integer|boolean|array $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @deprecated
- */
- public static function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $tags = PHPUnit_Util_XML::cssSelect(
- $selector,
- $content,
- $actual,
- $isHtml
- );
- // assert specific number of elements
- if (is_numeric($count)) {
- $counted = $tags ? count($tags) : 0;
- self::assertEquals($count, $counted, $message);
- } // assert any elements exist if true, assert no elements exist if false
- elseif (is_bool($count)) {
- $any = count($tags) > 0 && $tags[0] instanceof DOMNode;
- if ($count) {
- self::assertTrue($any, $message);
- } else {
- self::assertFalse($any, $message);
- }
- } // check for range number of elements
- elseif (is_array($count) &&
- (isset($count['>']) || isset($count['<']) ||
- isset($count['>=']) || isset($count['<=']))) {
- $counted = $tags ? count($tags) : 0;
- if (isset($count['>'])) {
- self::assertTrue($counted > $count['>'], $message);
- }
- if (isset($count['>='])) {
- self::assertTrue($counted >= $count['>='], $message);
- }
- if (isset($count['<'])) {
- self::assertTrue($counted < $count['<'], $message);
- }
- if (isset($count['<='])) {
- self::assertTrue($counted <= $count['<='], $message);
- }
- } else {
- throw new PHPUnit_Framework_Exception;
- }
- }
- /**
- * Evaluate an HTML or XML string and assert its structure and/or contents.
- *
- * The first argument ($matcher) is an associative array that specifies the
- * match criteria for the assertion:
- *
- * - `id` : the node with the given id attribute must match the
- * corresponding value.
- * - `tag` : the node type must match the corresponding value.
- * - `attributes` : a hash. The node's attributes must match the
- * corresponding values in the hash.
- * - `content` : The text content must match the given value.
- * - `parent` : a hash. The node's parent must match the
- * corresponding hash.
- * - `child` : a hash. At least one of the node's immediate children
- * must meet the criteria described by the hash.
- * - `ancestor` : a hash. At least one of the node's ancestors must
- * meet the criteria described by the hash.
- * - `descendant` : a hash. At least one of the node's descendants must
- * meet the criteria described by the hash.
- * - `children` : a hash, for counting children of a node.
- * Accepts the keys:
- * - `count` : a number which must equal the number of children
- * that match
- * - `less_than` : the number of matching children must be greater
- * than this number
- * - `greater_than` : the number of matching children must be less than
- * this number
- * - `only` : another hash consisting of the keys to use to match
- * on the children, and only matching children will be
- * counted
- *
- * <code>
- * // Matcher that asserts that there is an element with an id="my_id".
- * $matcher = array('id' => 'my_id');
- *
- * // Matcher that asserts that there is a "span" tag.
- * $matcher = array('tag' => 'span');
- *
- * // Matcher that asserts that there is a "span" tag with the content
- * // "Hello World".
- * $matcher = array('tag' => 'span', 'content' => 'Hello World');
- *
- * // Matcher that asserts that there is a "span" tag with content matching
- * // the regular expression pattern.
- * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
- *
- * // Matcher that asserts that there is a "span" with an "list" class
- * // attribute.
- * $matcher = array(
- * 'tag' => 'span',
- * 'attributes' => array('class' => 'list')
- * );
- *
- * // Matcher that asserts that there is a "span" inside of a "div".
- * $matcher = array(
- * 'tag' => 'span',
- * 'parent' => array('tag' => 'div')
- * );
- *
- * // Matcher that asserts that there is a "span" somewhere inside a
- * // "table".
- * $matcher = array(
- * 'tag' => 'span',
- * 'ancestor' => array('tag' => 'table')
- * );
- *
- * // Matcher that asserts that there is a "span" with at least one "em"
- * // child.
- * $matcher = array(
- * 'tag' => 'span',
- * 'child' => array('tag' => 'em')
- * );
- *
- * // Matcher that asserts that there is a "span" containing a (possibly
- * // nested) "strong" tag.
- * $matcher = array(
- * 'tag' => 'span',
- * 'descendant' => array('tag' => 'strong')
- * );
- *
- * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
- * // as immediate children.
- * $matcher = array(
- * 'tag' => 'span',
- * 'children' => array(
- * 'less_than' => 11,
- * 'greater_than' => 4,
- * 'only' => array('tag' => 'em')
- * )
- * );
- *
- * // Matcher that asserts that there is a "div", with an "ul" ancestor and
- * // a "li" parent (with class="enum"), and containing a "span" descendant
- * // that contains an element with id="my_test" and the text "Hello World".
- * $matcher = array(
- * 'tag' => 'div',
- * 'ancestor' => array('tag' => 'ul'),
- * 'parent' => array(
- * 'tag' => 'li',
- * 'attributes' => array('class' => 'enum')
- * ),
- * 'descendant' => array(
- * 'tag' => 'span',
- * 'child' => array(
- * 'id' => 'my_test',
- * 'content' => 'Hello World'
- * )
- * )
- * );
- *
- * // Use assertTag() to apply a $matcher to a piece of $html.
- * $this->assertTag($matcher, $html);
- *
- * // Use assertTag() to apply a $matcher to a piece of $xml.
- * $this->assertTag($matcher, $xml, '', false);
- * </code>
- *
- * The second argument ($actual) is a string containing either HTML or
- * XML text to be tested.
- *
- * The third argument ($message) is an optional message that will be
- * used if the assertion fails.
- *
- * The fourth argument ($html) is an optional flag specifying whether
- * to load the $actual string into a DOMDocument using the HTML or
- * XML load strategy. It is true by default, which assumes the HTML
- * load strategy. In many cases, this will be acceptable for XML as well.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @deprecated
- */
- public static function assertTag($matcher, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $dom = PHPUnit_Util_XML::load($actual, $isHtml);
- $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
- $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
- self::assertTrue($matched, $message);
- }
- /**
- * This assertion is the exact opposite of assertTag().
- *
- * Rather than asserting that $matcher results in a match, it asserts that
- * $matcher does not match.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @deprecated
- */
- public static function assertNotTag($matcher, $actual, $message = '', $isHtml = true)
- {
- trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
- $dom = PHPUnit_Util_XML::load($actual, $isHtml);
- $tags = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
- $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
- self::assertFalse($matched, $message);
- }
- /**
- * Evaluates a PHPUnit_Framework_Constraint matcher object.
- *
- * @param mixed $value
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
- {
- self::$count += count($constraint);
- $constraint->evaluate($value, $message);
- }
- /**
- * Asserts that a string is a valid JSON string.
- *
- * @param string $actualJson
- * @param string $message
- * @since Method available since Release 3.7.20
- */
- public static function assertJson($actualJson, $message = '')
- {
- if (!is_string($actualJson)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- self::assertThat($actualJson, self::isJson(), $message);
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- $expected = json_decode($expectedJson);
- $actual = json_decode($actualJson);
- self::assertEquals($expected, $actual, $message);
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are not equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- $expected = json_decode($expectedJson);
- $actual = json_decode($actualJson);
- self::assertNotEquals($expected, $actual, $message);
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- self::assertThat($actualJson, $constraint, $message);
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are not equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- public static function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message);
- }
- /**
- * Asserts that two JSON files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- public static function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- self::assertFileExists($actualFile, $message);
- $actualJson = file_get_contents($actualFile);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
- self::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message);
- self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message);
- }
- /**
- * Asserts that two JSON files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- self::assertFileExists($expectedFile, $message);
- self::assertFileExists($actualFile, $message);
- $actualJson = file_get_contents($actualFile);
- $expectedJson = file_get_contents($expectedFile);
- self::assertJson($expectedJson, $message);
- self::assertJson($actualJson, $message);
- // call constraint
- $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
- $expectedJson
- );
- $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
- self::assertThat($expectedJson, $constraintActual, $message);
- self::assertThat($actualJson, $constraintExpected, $message);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_And matcher object.
- *
- * @return PHPUnit_Framework_Constraint_And
- * @since Method available since Release 3.0.0
- */
- public static function logicalAnd()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_And;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.0.0
- */
- public static function logicalOr()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_Or;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Not matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @return PHPUnit_Framework_Constraint_Not
- * @since Method available since Release 3.0.0
- */
- public static function logicalNot(PHPUnit_Framework_Constraint $constraint)
- {
- return new PHPUnit_Framework_Constraint_Not($constraint);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Xor
- * @since Method available since Release 3.0.0
- */
- public static function logicalXor()
- {
- $constraints = func_get_args();
- $constraint = new PHPUnit_Framework_Constraint_Xor;
- $constraint->setConstraints($constraints);
- return $constraint;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsAnything
- * @since Method available since Release 3.0.0
- */
- public static function anything()
- {
- return new PHPUnit_Framework_Constraint_IsAnything;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsTrue
- * @since Method available since Release 3.3.0
- */
- public static function isTrue()
- {
- return new PHPUnit_Framework_Constraint_IsTrue;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
- *
- * @param callable $callback
- * @return PHPUnit_Framework_Constraint_Callback
- */
- public static function callback($callback)
- {
- return new PHPUnit_Framework_Constraint_Callback($callback);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsFalse
- * @since Method available since Release 3.3.0
- */
- public static function isFalse()
- {
- return new PHPUnit_Framework_Constraint_IsFalse;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsJson matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsJson
- * @since Method available since Release 3.7.20
- */
- public static function isJson()
- {
- return new PHPUnit_Framework_Constraint_IsJson;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsNull
- * @since Method available since Release 3.3.0
- */
- public static function isNull()
- {
- return new PHPUnit_Framework_Constraint_IsNull;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- public static function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- return new PHPUnit_Framework_Constraint_Attribute(
- $constraint,
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
- * object.
- *
- * @param mixed $value
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @return PHPUnit_Framework_Constraint_TraversableContains
- * @since Method available since Release 3.0.0
- */
- public static function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return new PHPUnit_Framework_Constraint_TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- * @since Method available since Release 3.1.4
- */
- public static function containsOnly($type)
- {
- return new PHPUnit_Framework_Constraint_TraversableContainsOnly($type);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $classname
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- */
- public static function containsOnlyInstancesOf($classname)
- {
- return new PHPUnit_Framework_Constraint_TraversableContainsOnly($classname, false);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
- *
- * @param mixed $key
- * @return PHPUnit_Framework_Constraint_ArrayHasKey
- * @since Method available since Release 3.0.0
- */
- public static function arrayHasKey($key)
- {
- return new PHPUnit_Framework_Constraint_ArrayHasKey($key);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
- *
- * @param mixed $value
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return PHPUnit_Framework_Constraint_IsEqual
- * @since Method available since Release 3.0.0
- */
- public static function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return new PHPUnit_Framework_Constraint_IsEqual(
- $value,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
- * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
- * object.
- *
- * @param string $attributeName
- * @param mixed $value
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- public static function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return self::attribute(
- self::equalTo(
- $value,
- $delta,
- $maxDepth,
- $canonicalize,
- $ignoreCase
- ),
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsEmpty
- * @since Method available since Release 3.5.0
- */
- public static function isEmpty()
- {
- return new PHPUnit_Framework_Constraint_IsEmpty;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
- *
- * @return PHPUnit_Framework_Constraint_FileExists
- * @since Method available since Release 3.0.0
- */
- public static function fileExists()
- {
- return new PHPUnit_Framework_Constraint_FileExists;
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_GreaterThan
- * @since Method available since Release 3.0.0
- */
- public static function greaterThan($value)
- {
- return new PHPUnit_Framework_Constraint_GreaterThan($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- public static function greaterThanOrEqual($value)
- {
- return self::logicalOr(
- new PHPUnit_Framework_Constraint_IsEqual($value),
- new PHPUnit_Framework_Constraint_GreaterThan($value)
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasAttribute
- * @since Method available since Release 3.1.0
- */
- public static function classHasAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ClassHasAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
- * object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
- * @since Method available since Release 3.1.0
- */
- public static function classHasStaticAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
- * @since Method available since Release 3.0.0
- */
- public static function objectHasAttribute($attributeName)
- {
- return new PHPUnit_Framework_Constraint_ObjectHasAttribute(
- $attributeName
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_IsIdentical
- * @since Method available since Release 3.0.0
- */
- public static function identicalTo($value)
- {
- return new PHPUnit_Framework_Constraint_IsIdentical($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
- *
- * @param string $className
- * @return PHPUnit_Framework_Constraint_IsInstanceOf
- * @since Method available since Release 3.0.0
- */
- public static function isInstanceOf($className)
- {
- return new PHPUnit_Framework_Constraint_IsInstanceOf($className);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_IsType
- * @since Method available since Release 3.0.0
- */
- public static function isType($type)
- {
- return new PHPUnit_Framework_Constraint_IsType($type);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_LessThan
- * @since Method available since Release 3.0.0
- */
- public static function lessThan($value)
- {
- return new PHPUnit_Framework_Constraint_LessThan($value);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- public static function lessThanOrEqual($value)
- {
- return self::logicalOr(
- new PHPUnit_Framework_Constraint_IsEqual($value),
- new PHPUnit_Framework_Constraint_LessThan($value)
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
- *
- * @param string $pattern
- * @return PHPUnit_Framework_Constraint_PCREMatch
- * @since Method available since Release 3.0.0
- */
- public static function matchesRegularExpression($pattern)
- {
- return new PHPUnit_Framework_Constraint_PCREMatch($pattern);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
- *
- * @param string $string
- * @return PHPUnit_Framework_Constraint_StringMatches
- * @since Method available since Release 3.5.0
- */
- public static function matches($string)
- {
- return new PHPUnit_Framework_Constraint_StringMatches($string);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
- *
- * @param mixed $prefix
- * @return PHPUnit_Framework_Constraint_StringStartsWith
- * @since Method available since Release 3.4.0
- */
- public static function stringStartsWith($prefix)
- {
- return new PHPUnit_Framework_Constraint_StringStartsWith($prefix);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
- *
- * @param string $string
- * @param boolean $case
- * @return PHPUnit_Framework_Constraint_StringContains
- * @since Method available since Release 3.0.0
- */
- public static function stringContains($string, $case = true)
- {
- return new PHPUnit_Framework_Constraint_StringContains($string, $case);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
- *
- * @param mixed $suffix
- * @return PHPUnit_Framework_Constraint_StringEndsWith
- * @since Method available since Release 3.4.0
- */
- public static function stringEndsWith($suffix)
- {
- return new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Count matcher object.
- *
- * @param int $count
- * @return PHPUnit_Framework_Constraint_Count
- */
- public static function countOf($count)
- {
- return new PHPUnit_Framework_Constraint_Count($count);
- }
- /**
- * Fails a test with the given message.
- *
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- public static function fail($message = '')
- {
- throw new PHPUnit_Framework_AssertionFailedError($message);
- }
- /**
- * Returns the value of an attribute of a class or an object.
- * This also works for attributes that are declared protected or private.
- *
- * @param mixed $classOrObject
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- */
- public static function readAttribute($classOrObject, $attributeName)
- {
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- if (is_string($classOrObject)) {
- if (!class_exists($classOrObject)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name'
- );
- }
- return self::getStaticAttribute(
- $classOrObject,
- $attributeName
- );
- } elseif (is_object($classOrObject)) {
- return self::getObjectAttribute(
- $classOrObject,
- $attributeName
- );
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name or object'
- );
- }
- }
- /**
- * Returns the value of a static attribute.
- * This also works for attributes that are declared protected or private.
- *
- * @param string $className
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public static function getStaticAttribute($className, $attributeName)
- {
- if (!is_string($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!class_exists($className)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class name');
- }
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- $class = new ReflectionClass($className);
- while ($class) {
- $attributes = $class->getStaticProperties();
- if (array_key_exists($attributeName, $attributes)) {
- return $attributes[$attributeName];
- }
- $class = $class->getParentClass();
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Attribute "%s" not found in class.',
- $attributeName
- )
- );
- }
- /**
- * Returns the value of an object's attribute.
- * This also works for attributes that are declared protected or private.
- *
- * @param object $object
- * @param string $attributeName
- * @return mixed
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public static function getObjectAttribute($object, $attributeName)
- {
- if (!is_object($object)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'object');
- }
- if (!is_string($attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
- }
- if (!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'valid attribute name');
- }
- try {
- $attribute = new ReflectionProperty($object, $attributeName);
- } catch (ReflectionException $e) {
- $reflector = new ReflectionObject($object);
- while ($reflector = $reflector->getParentClass()) {
- try {
- $attribute = $reflector->getProperty($attributeName);
- break;
- } catch (ReflectionException $e) {
- }
- }
- }
- if (isset($attribute)) {
- if (!$attribute || $attribute->isPublic()) {
- return $object->$attributeName;
- }
- $attribute->setAccessible(true);
- $value = $attribute->getValue($object);
- $attribute->setAccessible(false);
- return $value;
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Attribute "%s" not found in object.',
- $attributeName
- )
- );
- }
- /**
- * Mark the test as incomplete.
- *
- * @param string $message
- * @throws PHPUnit_Framework_IncompleteTestError
- * @since Method available since Release 3.0.0
- */
- public static function markTestIncomplete($message = '')
- {
- throw new PHPUnit_Framework_IncompleteTestError($message);
- }
- /**
- * Mark the test as skipped.
- *
- * @param string $message
- * @throws PHPUnit_Framework_SkippedTestError
- * @since Method available since Release 3.0.0
- */
- public static function markTestSkipped($message = '')
- {
- throw new PHPUnit_Framework_SkippedTestError($message);
- }
- /**
- * Return the current assertion count.
- *
- * @return integer
- * @since Method available since Release 3.3.3
- */
- public static function getCount()
- {
- return self::$count;
- }
- /**
- * Reset the assertion counter.
- *
- * @since Method available since Release 3.3.3
- */
- public static function resetCount()
- {
- self::$count = 0;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_CodeCoverageException extends PHPUnit_Framework_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestSuite is a composite of Tests. It runs a collection of test cases.
- *
- * Here is an example using the dynamic test definition.
- *
- * <code>
- * <?php
- * $suite = new PHPUnit_Framework_TestSuite;
- * $suite->addTest(new MathTest('testPass'));
- * ?>
- * </code>
- *
- * Alternatively, a TestSuite can extract the tests to be run automatically.
- * To do so you pass a ReflectionClass instance for your
- * PHPUnit_Framework_TestCase class to the PHPUnit_Framework_TestSuite
- * constructor.
- *
- * <code>
- * <?php
- * $suite = new PHPUnit_Framework_TestSuite(
- * new ReflectionClass('MathTest')
- * );
- * ?>
- * </code>
- *
- * This constructor creates a suite with all the methods starting with
- * "test" that take no arguments.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing, IteratorAggregate
- {
- /**
- * Last count of tests in this suite.
- *
- * @var integer|null
- */
- private $cachedNumTests;
- /**
- * Enable or disable the backup and restoration of the $GLOBALS array.
- *
- * @var boolean
- */
- protected $backupGlobals = null;
- /**
- * Enable or disable the backup and restoration of static attributes.
- *
- * @var boolean
- */
- protected $backupStaticAttributes = null;
- /**
- * @var boolean
- */
- private $disallowChangesToGlobalState = null;
- /**
- * @var boolean
- */
- protected $runTestInSeparateProcess = false;
- /**
- * The name of the test suite.
- *
- * @var string
- */
- protected $name = '';
- /**
- * The test groups of the test suite.
- *
- * @var array
- */
- protected $groups = array();
- /**
- * The tests in the test suite.
- *
- * @var array
- */
- protected $tests = array();
- /**
- * The number of tests in the test suite.
- *
- * @var integer
- */
- protected $numTests = -1;
- /**
- * @var boolean
- */
- protected $testCase = false;
- /**
- * @var array
- */
- protected $foundClasses = array();
- /**
- * @var PHPUnit_Runner_Filter_Factory
- */
- private $iteratorFilter = null;
- /**
- * Constructs a new TestSuite:
- *
- * - PHPUnit_Framework_TestSuite() constructs an empty TestSuite.
- *
- * - PHPUnit_Framework_TestSuite(ReflectionClass) constructs a
- * TestSuite from the given class.
- *
- * - PHPUnit_Framework_TestSuite(ReflectionClass, String)
- * constructs a TestSuite from the given class with the given
- * name.
- *
- * - PHPUnit_Framework_TestSuite(String) either constructs a
- * TestSuite from the given class (if the passed string is the
- * name of an existing class) or constructs an empty TestSuite
- * with the given name.
- *
- * @param mixed $theClass
- * @param string $name
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($theClass = '', $name = '')
- {
- $argumentsValid = false;
- if (is_object($theClass) &&
- $theClass instanceof ReflectionClass) {
- $argumentsValid = true;
- } elseif (is_string($theClass) &&
- $theClass !== '' &&
- class_exists($theClass, false)) {
- $argumentsValid = true;
- if ($name == '') {
- $name = $theClass;
- }
- $theClass = new ReflectionClass($theClass);
- } elseif (is_string($theClass)) {
- $this->setName($theClass);
- return;
- }
- if (!$argumentsValid) {
- throw new PHPUnit_Framework_Exception;
- }
- if (!$theClass->isSubclassOf('PHPUnit_Framework_TestCase')) {
- throw new PHPUnit_Framework_Exception(
- 'Class "' . $theClass->name . '" does not extend PHPUnit_Framework_TestCase.'
- );
- }
- if ($name != '') {
- $this->setName($name);
- } else {
- $this->setName($theClass->getName());
- }
- $constructor = $theClass->getConstructor();
- if ($constructor !== null &&
- !$constructor->isPublic()) {
- $this->addTest(
- self::warning(
- sprintf(
- 'Class "%s" has no public constructor.',
- $theClass->getName()
- )
- )
- );
- return;
- }
- foreach ($theClass->getMethods() as $method) {
- $this->addTestMethod($theClass, $method);
- }
- if (empty($this->tests)) {
- $this->addTest(
- self::warning(
- sprintf(
- 'No tests found in class "%s".',
- $theClass->getName()
- )
- )
- );
- }
- $this->testCase = true;
- }
- /**
- * Returns a string representation of the test suite.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- /**
- * Adds a test to the suite.
- *
- * @param PHPUnit_Framework_Test $test
- * @param array $groups
- */
- public function addTest(PHPUnit_Framework_Test $test, $groups = array())
- {
- $class = new ReflectionClass($test);
- if (!$class->isAbstract()) {
- $this->tests[] = $test;
- $this->numTests = -1;
- if ($test instanceof PHPUnit_Framework_TestSuite &&
- empty($groups)) {
- $groups = $test->getGroups();
- }
- if (empty($groups)) {
- $groups = array('__nogroup__');
- }
- foreach ($groups as $group) {
- if (!isset($this->groups[$group])) {
- $this->groups[$group] = array($test);
- } else {
- $this->groups[$group][] = $test;
- }
- }
- }
- }
- /**
- * Adds the tests from the given class to the suite.
- *
- * @param mixed $testClass
- * @throws PHPUnit_Framework_Exception
- */
- public function addTestSuite($testClass)
- {
- if (is_string($testClass) && class_exists($testClass)) {
- $testClass = new ReflectionClass($testClass);
- }
- if (!is_object($testClass)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'class name or object'
- );
- }
- if ($testClass instanceof PHPUnit_Framework_TestSuite) {
- $this->addTest($testClass);
- } elseif ($testClass instanceof ReflectionClass) {
- $suiteMethod = false;
- if (!$testClass->isAbstract()) {
- if ($testClass->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
- $method = $testClass->getMethod(
- PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
- );
- if ($method->isStatic()) {
- $this->addTest(
- $method->invoke(null, $testClass->getName())
- );
- $suiteMethod = true;
- }
- }
- }
- if (!$suiteMethod && !$testClass->isAbstract()) {
- $this->addTest(new PHPUnit_Framework_TestSuite($testClass));
- }
- } else {
- throw new PHPUnit_Framework_Exception;
- }
- }
- /**
- * Wraps both <code>addTest()</code> and <code>addTestSuite</code>
- * as well as the separate import statements for the user's convenience.
- *
- * If the named file cannot be read or there are no new tests that can be
- * added, a <code>PHPUnit_Framework_Warning</code> will be created instead,
- * leaving the current test run untouched.
- *
- * @param string $filename
- * @param array $phptOptions Array with ini settings for the php instance
- * run, key being the name if the setting,
- * value the ini value.
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 2.3.0
- * @author Stefano F. Rausch <stefano@rausch-e.net>
- */
- public function addTestFile($filename, $phptOptions = array())
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (file_exists($filename) && substr($filename, -5) == '.phpt') {
- $this->addTest(
- new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)
- );
- return;
- }
- // The given file may contain further stub classes in addition to the
- // test class itself. Figure out the actual test class.
- $classes = get_declared_classes();
- $filename = PHPUnit_Util_Fileloader::checkAndLoad($filename);
- $newClasses = array_diff(get_declared_classes(), $classes);
- // The diff is empty in case a parent class (with test methods) is added
- // AFTER a child class that inherited from it. To account for that case,
- // cumulate all discovered classes, so the parent class may be found in
- // a later invocation.
- if ($newClasses) {
- // On the assumption that test classes are defined first in files,
- // process discovered classes in approximate LIFO order, so as to
- // avoid unnecessary reflection.
- $this->foundClasses = array_merge($newClasses, $this->foundClasses);
- }
- // The test class's name must match the filename, either in full, or as
- // a PEAR/PSR-0 prefixed shortname ('NameSpace_ShortName'), or as a
- // PSR-1 local shortname ('NameSpace\ShortName'). The comparison must be
- // anchored to prevent false-positive matches (e.g., 'OtherShortName').
- $shortname = basename($filename, '.php');
- $shortnameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortname, '/') . '$/';
- foreach ($this->foundClasses as $i => $className) {
- if (preg_match($shortnameRegEx, $className)) {
- $class = new ReflectionClass($className);
- if ($class->getFileName() == $filename) {
- $newClasses = array($className);
- unset($this->foundClasses[$i]);
- break;
- }
- }
- }
- foreach ($newClasses as $className) {
- $class = new ReflectionClass($className);
- if (!$class->isAbstract()) {
- if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
- $method = $class->getMethod(
- PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
- );
- if ($method->isStatic()) {
- $this->addTest($method->invoke(null, $className));
- }
- } elseif ($class->implementsInterface('PHPUnit_Framework_Test')) {
- $this->addTestSuite($class);
- }
- }
- }
- $this->numTests = -1;
- }
- /**
- * Wrapper for addTestFile() that adds multiple test files.
- *
- * @param array|Iterator $filenames
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 2.3.0
- */
- public function addTestFiles($filenames)
- {
- if (!(is_array($filenames) ||
- (is_object($filenames) && $filenames instanceof Iterator))) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'array or iterator'
- );
- }
- foreach ($filenames as $filename) {
- $this->addTestFile((string) $filename);
- }
- }
- /**
- * Counts the number of test cases that will be run by this test.
- *
- * @param boolean $preferCache Indicates if cache is preferred.
- * @return integer
- */
- public function count($preferCache = false)
- {
- if ($preferCache && $this->cachedNumTests != null) {
- $numTests = $this->cachedNumTests;
- } else {
- $numTests = 0;
- foreach ($this as $test) {
- $numTests += count($test);
- }
- $this->cachedNumTests = $numTests;
- }
- return $numTests;
- }
- /**
- * @param ReflectionClass $theClass
- * @param string $name
- * @return PHPUnit_Framework_Test
- * @throws PHPUnit_Framework_Exception
- */
- public static function createTest(ReflectionClass $theClass, $name)
- {
- $className = $theClass->getName();
- if (!$theClass->isInstantiable()) {
- return self::warning(
- sprintf('Cannot instantiate class "%s".', $className)
- );
- }
- $backupSettings = PHPUnit_Util_Test::getBackupSettings(
- $className,
- $name
- );
- $preserveGlobalState = PHPUnit_Util_Test::getPreserveGlobalStateSettings(
- $className,
- $name
- );
- $runTestInSeparateProcess = PHPUnit_Util_Test::getProcessIsolationSettings(
- $className,
- $name
- );
- $constructor = $theClass->getConstructor();
- if ($constructor !== null) {
- $parameters = $constructor->getParameters();
- // TestCase() or TestCase($name)
- if (count($parameters) < 2) {
- $test = new $className;
- } // TestCase($name, $data)
- else {
- try {
- $data = PHPUnit_Util_Test::getProvidedData(
- $className,
- $name
- );
- } catch (Exception $e) {
- if (!($e instanceof PHPUnit_Framework_SkippedTestError || $e instanceof PHPUnit_Framework_IncompleteTestError)) {
- $message = sprintf(
- 'The data provider specified for %s::%s is invalid.',
- $className,
- $name
- );
- $_message = $e->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::warning($message);
- } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) {
- $message = sprintf(
- 'Test for %s::%s skipped by data provider',
- $className,
- $name
- );
- $_message = $e->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::skipTest($className, $name, $message);
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) {
- $message = sprintf(
- 'Test for %s::%s marked incomplete by data provider',
- $className,
- $name
- );
- $_message = $e->getMessage();
- if (!empty($_message)) {
- $message .= "\n" . $_message;
- }
- $data = self::incompleteTest($className, $name, $message);
- }
- }
- // Test method with @dataProvider.
- if (isset($data)) {
- $test = new PHPUnit_Framework_TestSuite_DataProvider(
- $className . '::' . $name
- );
- if (empty($data)) {
- $data = self::warning(
- sprintf(
- 'No tests found in suite "%s".',
- $test->getName()
- )
- );
- }
- $groups = PHPUnit_Util_Test::getGroups($className, $name);
- if ($data instanceof PHPUnit_Framework_Warning ||
- $data instanceof PHPUnit_Framework_SkippedTestCase ||
- $data instanceof PHPUnit_Framework_IncompleteTestCase) {
- $test->addTest($data, $groups);
- } else {
- foreach ($data as $_dataName => $_data) {
- $_test = new $className($name, $_data, $_dataName);
- if ($runTestInSeparateProcess) {
- $_test->setRunTestInSeparateProcess(true);
- if ($preserveGlobalState !== null) {
- $_test->setPreserveGlobalState($preserveGlobalState);
- }
- }
- if ($backupSettings['backupGlobals'] !== null) {
- $_test->setBackupGlobals(
- $backupSettings['backupGlobals']
- );
- }
- if ($backupSettings['backupStaticAttributes'] !== null) {
- $_test->setBackupStaticAttributes(
- $backupSettings['backupStaticAttributes']
- );
- }
- $test->addTest($_test, $groups);
- }
- }
- } else {
- $test = new $className;
- }
- }
- }
- if (!isset($test)) {
- throw new PHPUnit_Framework_Exception('No valid test provided.');
- }
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $test->setName($name);
- if ($runTestInSeparateProcess) {
- $test->setRunTestInSeparateProcess(true);
- if ($preserveGlobalState !== null) {
- $test->setPreserveGlobalState($preserveGlobalState);
- }
- }
- if ($backupSettings['backupGlobals'] !== null) {
- $test->setBackupGlobals($backupSettings['backupGlobals']);
- }
- if ($backupSettings['backupStaticAttributes'] !== null) {
- $test->setBackupStaticAttributes(
- $backupSettings['backupStaticAttributes']
- );
- }
- }
- return $test;
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * Returns the name of the suite.
- *
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * Returns the test groups of the suite.
- *
- * @return array
- * @since Method available since Release 3.2.0
- */
- public function getGroups()
- {
- return array_keys($this->groups);
- }
- public function getGroupDetails()
- {
- return $this->groups;
- }
- /**
- * Set tests groups of the test case
- *
- * @param array $groups
- * @since Method available since Release 4.0.0
- */
- public function setGroupDetails(array $groups)
- {
- $this->groups = $groups;
- }
- /**
- * Runs the tests and collects their result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- if (count($this) == 0) {
- return $result;
- }
- $hookMethods = PHPUnit_Util_Test::getHookMethods($this->name);
- $result->startTestSuite($this);
- try {
- $this->setUp();
- foreach ($hookMethods['beforeClass'] as $beforeClassMethod) {
- if ($this->testCase === true &&
- class_exists($this->name, false) &&
- method_exists($this->name, $beforeClassMethod)) {
- if ($missingRequirements = PHPUnit_Util_Test::getMissingRequirements($this->name, $beforeClassMethod)) {
- $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements));
- }
- call_user_func(array($this->name, $beforeClassMethod));
- }
- }
- } catch (PHPUnit_Framework_SkippedTestSuiteError $e) {
- $numTests = count($this);
- for ($i = 0; $i < $numTests; $i++) {
- $result->startTest($this);
- $result->addFailure($this, $e, 0);
- $result->endTest($this, 0);
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- } catch (Exception $e) {
- $numTests = count($this);
- for ($i = 0; $i < $numTests; $i++) {
- $result->startTest($this);
- $result->addError($this, $e, 0);
- $result->endTest($this, 0);
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- }
- foreach ($this as $test) {
- if ($result->shouldStop()) {
- break;
- }
- if ($test instanceof PHPUnit_Framework_TestCase ||
- $test instanceof PHPUnit_Framework_TestSuite) {
- $test->setDisallowChangesToGlobalState($this->disallowChangesToGlobalState);
- $test->setBackupGlobals($this->backupGlobals);
- $test->setBackupStaticAttributes($this->backupStaticAttributes);
- $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess);
- }
- $test->run($result);
- }
- foreach ($hookMethods['afterClass'] as $afterClassMethod) {
- if ($this->testCase === true && class_exists($this->name, false) && method_exists($this->name, $afterClassMethod)) {
- call_user_func(array($this->name, $afterClassMethod));
- }
- }
- $this->tearDown();
- $result->endTestSuite($this);
- return $result;
- }
- /**
- * @param boolean $runTestInSeparateProcess
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.7.0
- */
- public function setRunTestInSeparateProcess($runTestInSeparateProcess)
- {
- if (is_bool($runTestInSeparateProcess)) {
- $this->runTestInSeparateProcess = $runTestInSeparateProcess;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * Runs a test.
- *
- * @deprecated
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- */
- public function runTest(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result)
- {
- $test->run($result);
- }
- /**
- * Sets the name of the suite.
- *
- * @param string
- */
- public function setName($name)
- {
- $this->name = $name;
- }
- /**
- * Returns the test at the given index.
- *
- * @param integer
- * @return PHPUnit_Framework_Test
- */
- public function testAt($index)
- {
- if (isset($this->tests[$index])) {
- return $this->tests[$index];
- } else {
- return false;
- }
- }
- /**
- * Returns the tests as an enumeration.
- *
- * @return array
- */
- public function tests()
- {
- return $this->tests;
- }
- /**
- * Set tests of the test suite
- *
- * @param array $tests
- * @since Method available since Release 4.0.0
- */
- public function setTests(array $tests)
- {
- $this->tests = $tests;
- }
- /**
- * Mark the test suite as skipped.
- *
- * @param string $message
- * @throws PHPUnit_Framework_SkippedTestSuiteError
- * @since Method available since Release 3.0.0
- */
- public function markTestSuiteSkipped($message = '')
- {
- throw new PHPUnit_Framework_SkippedTestSuiteError($message);
- }
- /**
- * @param ReflectionClass $class
- * @param ReflectionMethod $method
- */
- protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
- {
- if (!$this->isTestMethod($method)) {
- return;
- }
- $name = $method->getName();
- if (!$method->isPublic()) {
- $this->addTest(
- self::warning(
- sprintf(
- 'Test method "%s" in test class "%s" is not public.',
- $name,
- $class->getName()
- )
- )
- );
- return;
- }
- $test = self::createTest($class, $name);
- if ($test instanceof PHPUnit_Framework_TestCase ||
- $test instanceof PHPUnit_Framework_TestSuite_DataProvider) {
- $test->setDependencies(
- PHPUnit_Util_Test::getDependencies($class->getName(), $name)
- );
- }
- $this->addTest(
- $test,
- PHPUnit_Util_Test::getGroups($class->getName(), $name)
- );
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- */
- public static function isTestMethod(ReflectionMethod $method)
- {
- if (strpos($method->name, 'test') === 0) {
- return true;
- }
- // @scenario on TestCase::testMethod()
- // @test on TestCase::testMethod()
- $doc_comment = $method->getDocComment();
- return strpos($doc_comment, '@test') !== false ||
- strpos($doc_comment, '@scenario') !== false;
- }
- /**
- * @param string $message
- * @return PHPUnit_Framework_Warning
- */
- protected static function warning($message)
- {
- return new PHPUnit_Framework_Warning($message);
- }
- /**
- * @param string $class
- * @param string $methodName
- * @param string $message
- * @return PHPUnit_Framework_SkippedTestCase
- * @since Method available since Release 4.3.0
- */
- protected static function skipTest($class, $methodName, $message)
- {
- return new PHPUnit_Framework_SkippedTestCase($class, $methodName, $message);
- }
- /**
- * @param string $class
- * @param string $methodName
- * @param string $message
- * @return PHPUnit_Framework_IncompleteTestCase
- * @since Method available since Release 4.3.0
- */
- protected static function incompleteTest($class, $methodName, $message)
- {
- return new PHPUnit_Framework_IncompleteTestCase($class, $methodName, $message);
- }
- /**
- * @param boolean $disallowChangesToGlobalState
- * @since Method available since Release 4.6.0
- */
- public function setDisallowChangesToGlobalState($disallowChangesToGlobalState)
- {
- if (is_null($this->disallowChangesToGlobalState) && is_bool($disallowChangesToGlobalState)) {
- $this->disallowChangesToGlobalState = $disallowChangesToGlobalState;
- }
- }
- /**
- * @param boolean $backupGlobals
- * @since Method available since Release 3.3.0
- */
- public function setBackupGlobals($backupGlobals)
- {
- if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
- $this->backupGlobals = $backupGlobals;
- }
- }
- /**
- * @param boolean $backupStaticAttributes
- * @since Method available since Release 3.4.0
- */
- public function setBackupStaticAttributes($backupStaticAttributes)
- {
- if (is_null($this->backupStaticAttributes) &&
- is_bool($backupStaticAttributes)) {
- $this->backupStaticAttributes = $backupStaticAttributes;
- }
- }
- /**
- * Returns an iterator for this test suite.
- *
- * @return RecursiveIteratorIterator
- * @since Method available since Release 3.1.0
- */
- public function getIterator()
- {
- $iterator = new PHPUnit_Util_TestSuiteIterator($this);
- if ($this->iteratorFilter !== null) {
- $iterator = $this->iteratorFilter->factory($iterator, $this);
- }
- return $iterator;
- }
- public function injectFilter(PHPUnit_Runner_Filter_Factory $filter)
- {
- $this->iteratorFilter = $filter;
- foreach ($this as $test) {
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- $test->injectFilter($filter);
- }
- }
- }
- /**
- * Template Method that is called before the tests
- * of this test suite are run.
- *
- * @since Method available since Release 3.1.0
- */
- protected function setUp()
- {
- }
- /**
- * Template Method that is called after the tests
- * of this test suite have finished running.
- *
- * @since Method available since Release 3.1.0
- */
- protected function tearDown()
- {
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking any exception/error as result of an unit
- * test as risky.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 4.0.0
- */
- interface PHPUnit_Framework_RiskyTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Interface for classes that can return a description of itself.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 3.0.0
- */
- interface PHPUnit_Framework_SelfDescribing
- {
- /**
- * Returns a string representation of the object.
- *
- * @return string
- */
- public function toString();
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Returns a matcher that matches when the method is executed
- * zero or more times.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
- * @since Method available since Release 3.0.0
- */
- function any()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::any',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsAnything
- * @since Method available since Release 3.0.0
- */
- function anything()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::anything',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
- *
- * @param mixed $key
- * @return PHPUnit_Framework_Constraint_ArrayHasKey
- * @since Method available since Release 3.0.0
- */
- function arrayHasKey($key)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::arrayHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that an array has a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertArrayHasKey($key, $array, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArrayHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that an array has a specified subset.
- *
- * @param array|ArrayAccess $subset
- * @param array|ArrayAccess $array
- * @param boolean $strict Check for object identity
- * @param string $message
- * @since Method available since Release 4.4.0
- */
- function assertArraySubset($subset, $array, $strict = false, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArraySubset',
- func_get_args()
- );
- }
- /**
- * Asserts that an array does not have a specified key.
- *
- * @param mixed $key
- * @param array|ArrayAccess $array
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertArrayNotHasKey($key, $array, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertArrayNotHasKey',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object contains only values of a given type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param integer $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is greater than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeGreaterThan',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is smaller than another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeLessThan',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain a needle.
- *
- * @param mixed $needle
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 3.0.0
- */
- function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack that is stored in a static attribute of a class
- * or an attribute of an object does not contain only values of a given
- * type.
- *
- * @param string $type
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable
- * that is stored in an attribute.
- *
- * @param integer $expectedCount
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.6.0
- */
- function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a static attribute of a class or an attribute of an object
- * is not empty.
- *
- * @param string $haystackAttributeName
- * @param mixed $haystackClassOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not equal to an attribute of an object.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param string $actualClassOrObject
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that an attribute is of a given type.
- *
- * @param string $expected
- * @param string $attributeName
- * @param mixed $classOrObject
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable and an attribute of an object do not have the
- * same type and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeNotSame',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable and an attribute of an object have the same type
- * and value.
- *
- * @param mixed $expected
- * @param string $actualAttributeName
- * @param object $actualClassOrObject
- * @param string $message
- */
- function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertAttributeSame',
- func_get_args()
- );
- }
- /**
- * Asserts that a class has a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassHasAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class has a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassHasStaticAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class does not have a specified attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassNotHasAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassNotHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a class does not have a specified static attribute.
- *
- * @param string $attributeName
- * @param string $className
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- function assertContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack contains only instances of a given classname
- *
- * @param string $classname
- * @param array|Traversable $haystack
- * @param string $message
- */
- function assertContainsOnlyInstancesOf($classname, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param integer $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- function assertCount($expectedCount, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertEmpty($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that a hierarchy of DOMElements matches.
- *
- * @param DOMElement $expectedElement
- * @param DOMElement $actualElement
- * @param boolean $checkAttributes
- * @param string $message
- * @author Mattis Stordalen Flister <mattis@xait.no>
- * @since Method available since Release 3.3.0
- */
- function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = false, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEqualXMLStructure',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables are equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- */
- function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is not true.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotTrue($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotTrue',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is false.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertFalse($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFalse',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of one file is equal to the contents of another
- * file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.2.14
- */
- function assertFileEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a file exists.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertFileExists($filename, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileExists',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of one file is not equal to the contents of
- * another file.
- *
- * @param string $expected
- * @param string $actual
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.2.14
- */
- function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a file does not exist.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertFileNotExists($filename, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertFileNotExists',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is greater than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertGreaterThan($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertGreaterThan',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is greater than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertGreaterThanOrEqual($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertGreaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertInstanceOf($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertInternalType($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a string is a valid JSON string.
- *
- * @param string $filename
- * @param string $message
- * @since Method available since Release 3.7.20
- */
- function assertJson($expectedJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJson',
- func_get_args()
- );
- }
- /**
- * Asserts that two JSON files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two JSON files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- */
- function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString',
- func_get_args()
- );
- }
- /**
- * Asserts that the generated JSON encoded object and the content of the given file are not equal.
- *
- * @param string $expectedFile
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two given JSON encoded objects or arrays are not equal.
- *
- * @param string $expectedJson
- * @param string $actualJson
- * @param string $message
- */
- function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is smaller than another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertLessThan($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertLessThan',
- func_get_args()
- );
- }
- /**
- * Asserts that a value is smaller than or equal to another value.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertLessThanOrEqual($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertLessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack does not contain a needle.
- *
- * @param mixed $needle
- * @param mixed $haystack
- * @param string $message
- * @param boolean $ignoreCase
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @since Method available since Release 2.1.0
- */
- function assertNotContains($needle, $haystack, $message = '', $ignoreCase = false, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotContains',
- func_get_args()
- );
- }
- /**
- * Asserts that a haystack does not contain only values of a given type.
- *
- * @param string $type
- * @param mixed $haystack
- * @param boolean $isNativeType
- * @param string $message
- * @since Method available since Release 3.1.4
- */
- function assertNotContainsOnly($type, $haystack, $isNativeType = null, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotContainsOnly',
- func_get_args()
- );
- }
- /**
- * Asserts the number of elements of an array, Countable or Traversable.
- *
- * @param integer $expectedCount
- * @param mixed $haystack
- * @param string $message
- */
- function assertNotCount($expectedCount, $haystack, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotCount',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not empty.
- *
- * @param mixed $actual
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotEmpty($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotEmpty',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables are not equal.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 2.3.0
- */
- function assertNotEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotEquals',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertNotInstanceOf($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotInstanceOf',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not of a given type.
- *
- * @param string $expected
- * @param mixed $actual
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertNotInternalType($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotInternalType',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is not false.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertNotFalse($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotFalse',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is not null.
- *
- * @param mixed $actual
- * @param string $message
- */
- function assertNotNull($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotNull',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- * @since Method available since Release 2.1.0
- */
- function assertNotRegExp($pattern, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables do not have the same type and value.
- * Used on objects, it asserts that two variables do not reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- function assertNotSame($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotSame',
- func_get_args()
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is not the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- function assertNotSameSize($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotSameSize',
- func_get_args()
- );
- }
- /**
- * This assertion is the exact opposite of assertTag().
- *
- * Rather than asserting that $matcher results in a match, it asserts that
- * $matcher does not match.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- function assertNotTag($matcher, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNotTag',
- func_get_args()
- );
- }
- /**
- * Asserts that a variable is null.
- *
- * @param mixed $actual
- * @param string $message
- */
- function assertNull($actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertNull',
- func_get_args()
- );
- }
- /**
- * Asserts that an object has a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertObjectHasAttribute($attributeName, $object, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertObjectHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that an object does not have a specified attribute.
- *
- * @param string $attributeName
- * @param object $object
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertObjectNotHasAttribute($attributeName, $object, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertObjectNotHasAttribute',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given regular expression.
- *
- * @param string $pattern
- * @param string $string
- * @param string $message
- */
- function assertRegExp($pattern, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that two variables have the same type and value.
- * Used on objects, it asserts that two variables reference
- * the same object.
- *
- * @param mixed $expected
- * @param mixed $actual
- * @param string $message
- */
- function assertSame($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSame',
- func_get_args()
- );
- }
- /**
- * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
- * is the same.
- *
- * @param array|Countable|Traversable $expected
- * @param array|Countable|Traversable $actual
- * @param string $message
- */
- function assertSameSize($expected, $actual, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSameSize',
- func_get_args()
- );
- }
- /**
- * Assert the presence, absence, or count of elements in a document matching
- * the CSS $selector, regardless of the contents of those elements.
- *
- * The first argument, $selector, is the CSS selector used to match
- * the elements in the $actual document.
- *
- * The second argument, $count, can be either boolean or numeric.
- * When boolean, it asserts for presence of elements matching the selector
- * (true) or absence of elements (false).
- * When numeric, it asserts the count of elements.
- *
- * assertSelectCount("#binder", true, $xml); // any?
- * assertSelectCount(".binder", 3, $xml); // exactly 3?
- *
- * @param array $selector
- * @param integer $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectCount',
- func_get_args()
- );
- }
- /**
- * assertSelectEquals("#binder .name", "Chuck", true, $xml); // any?
- * assertSelectEquals("#binder .name", "Chuck", false, $xml); // none?
- *
- * @param array $selector
- * @param string $content
- * @param integer $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectEquals',
- func_get_args()
- );
- }
- /**
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
- * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml);// 3?
- *
- * @param array $selector
- * @param string $pattern
- * @param integer $count
- * @param mixed $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertSelectRegExp',
- func_get_args()
- );
- }
- /**
- * Asserts that a string ends not with a given prefix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringEndsNotWith($suffix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEndsNotWith',
- func_get_args()
- );
- }
- /**
- * Asserts that a string ends with a given prefix.
- *
- * @param string $suffix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringEndsWith($suffix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEndsWith',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of a string is equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.3.0
- */
- function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringEqualsFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringMatchesFormat($format, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringMatchesFormat',
- func_get_args()
- );
- }
- /**
- * Asserts that a string matches a given format file.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringMatchesFormatFile($formatFile, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringMatchesFormatFile',
- func_get_args()
- );
- }
- /**
- * Asserts that the contents of a string is not equal
- * to the contents of a file.
- *
- * @param string $expectedFile
- * @param string $actualString
- * @param string $message
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @since Method available since Release 3.3.0
- */
- function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotEqualsFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $format
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringNotMatchesFormat($format, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotMatchesFormat',
- func_get_args()
- );
- }
- /**
- * Asserts that a string does not match a given format string.
- *
- * @param string $formatFile
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.5.0
- */
- function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile',
- func_get_args()
- );
- }
- /**
- * Asserts that a string starts not with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringStartsNotWith($prefix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringStartsNotWith',
- func_get_args()
- );
- }
- /**
- * Asserts that a string starts with a given prefix.
- *
- * @param string $prefix
- * @param string $string
- * @param string $message
- * @since Method available since Release 3.4.0
- */
- function assertStringStartsWith($prefix, $string, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertStringStartsWith',
- func_get_args()
- );
- }
- /**
- * Evaluate an HTML or XML string and assert its structure and/or contents.
- *
- * The first argument ($matcher) is an associative array that specifies the
- * match criteria for the assertion:
- *
- * - `id` : the node with the given id attribute must match the
- * corresponding value.
- * - `tag` : the node type must match the corresponding value.
- * - `attributes` : a hash. The node's attributes must match the
- * corresponding values in the hash.
- * - `content` : The text content must match the given value.
- * - `parent` : a hash. The node's parent must match the
- * corresponding hash.
- * - `child`: a hash. At least one of the node's immediate children
- * must meet the criteria described by the hash.
- * - `ancestor` : a hash. At least one of the node's ancestors must
- * meet the criteria described by the hash.
- * - `descendant` : a hash. At least one of the node's descendants must
- * meet the criteria described by the hash.
- * - `children` : a hash, for counting children of a node.
- * Accepts the keys:
- *- `count`: a number which must equal the number of children
- * that match
- *- `less_than`: the number of matching children must be greater
- * than this number
- *- `greater_than` : the number of matching children must be less than
- * this number
- *- `only` : another hash consisting of the keys to use to match
- * on the children, and only matching children will be
- * counted
- *
- * <code>
- * // Matcher that asserts that there is an element with an id="my_id".
- * $matcher = array('id' => 'my_id');
- *
- * // Matcher that asserts that there is a "span" tag.
- * $matcher = array('tag' => 'span');
- *
- * // Matcher that asserts that there is a "span" tag with the content
- * // "Hello World".
- * $matcher = array('tag' => 'span', 'content' => 'Hello World');
- *
- * // Matcher that asserts that there is a "span" tag with content matching
- * // the regular expression pattern.
- * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
- *
- * // Matcher that asserts that there is a "span" with an "list" class
- * // attribute.
- * $matcher = array(
- * 'tag'=> 'span',
- * 'attributes' => array('class' => 'list')
- * );
- *
- * // Matcher that asserts that there is a "span" inside of a "div".
- * $matcher = array(
- * 'tag'=> 'span',
- * 'parent' => array('tag' => 'div')
- * );
- *
- * // Matcher that asserts that there is a "span" somewhere inside a
- * // "table".
- * $matcher = array(
- * 'tag' => 'span',
- * 'ancestor' => array('tag' => 'table')
- * );
- *
- * // Matcher that asserts that there is a "span" with at least one "em"
- * // child.
- * $matcher = array(
- * 'tag' => 'span',
- * 'child' => array('tag' => 'em')
- * );
- *
- * // Matcher that asserts that there is a "span" containing a (possibly
- * // nested) "strong" tag.
- * $matcher = array(
- * 'tag'=> 'span',
- * 'descendant' => array('tag' => 'strong')
- * );
- *
- * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
- * // as immediate children.
- * $matcher = array(
- * 'tag' => 'span',
- * 'children' => array(
- * 'less_than'=> 11,
- * 'greater_than' => 4,
- * 'only' => array('tag' => 'em')
- * )
- * );
- *
- * // Matcher that asserts that there is a "div", with an "ul" ancestor and
- * // a "li" parent (with class="enum"), and containing a "span" descendant
- * // that contains an element with id="my_test" and the text "Hello World".
- * $matcher = array(
- * 'tag'=> 'div',
- * 'ancestor' => array('tag' => 'ul'),
- * 'parent' => array(
- * 'tag'=> 'li',
- * 'attributes' => array('class' => 'enum')
- * ),
- * 'descendant' => array(
- * 'tag' => 'span',
- * 'child' => array(
- * 'id' => 'my_test',
- * 'content' => 'Hello World'
- * )
- * )
- * );
- *
- * // Use assertTag() to apply a $matcher to a piece of $html.
- * $this->assertTag($matcher, $html);
- *
- * // Use assertTag() to apply a $matcher to a piece of $xml.
- * $this->assertTag($matcher, $xml, '', false);
- * </code>
- *
- * The second argument ($actual) is a string containing either HTML or
- * XML text to be tested.
- *
- * The third argument ($message) is an optional message that will be
- * used if the assertion fails.
- *
- * The fourth argument ($html) is an optional flag specifying whether
- * to load the $actual string into a DOMDocument using the HTML or
- * XML load strategy. It is true by default, which assumes the HTML
- * load strategy. In many cases, this will be acceptable for XML as well.
- *
- * @param array $matcher
- * @param string $actual
- * @param string $message
- * @param boolean $isHtml
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- function assertTag($matcher, $actual, $message = '', $isHtml = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertTag',
- func_get_args()
- );
- }
- /**
- * Evaluates a PHPUnit_Framework_Constraint matcher object.
- *
- * @param mixed$value
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $message
- * @since Method available since Release 3.0.0
- */
- function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertThat',
- func_get_args()
- );
- }
- /**
- * Asserts that a condition is true.
- *
- * @param boolean $condition
- * @param string $message
- * @throws PHPUnit_Framework_AssertionFailedError
- */
- function assertTrue($condition, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertTrue',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML files are equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML files are not equal.
- *
- * @param string $expectedFile
- * @param string $actualFile
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedFile
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.3.0
- */
- function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile',
- func_get_args()
- );
- }
- /**
- * Asserts that two XML documents are not equal.
- *
- * @param string $expectedXml
- * @param string $actualXml
- * @param string $message
- * @since Method available since Release 3.1.0
- */
- function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at the given $index.
- *
- * @param integer $index
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
- * @since Method available since Release 3.0.0
- */
- function at($index)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::at',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed at least once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
- * @since Method available since Release 3.0.0
- */
- function atLeastOnce()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::atLeastOnce',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::attribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
- * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
- * object.
- *
- * @param string $attributeName
- * @param mixed $value
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return PHPUnit_Framework_Constraint_Attribute
- * @since Method available since Release 3.1.0
- */
- function attributeEqualTo($attributeName, $value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::attributeEqualTo',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
- *
- * @param callable $callback
- * @return PHPUnit_Framework_Constraint_Callback
- */
- function callback($callback)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::callback',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasAttribute
- * @since Method available since Release 3.1.0
- */
- function classHasAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::classHasAttribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
- * object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
- * @since Method available since Release 3.1.0
- */
- function classHasStaticAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::classHasStaticAttribute',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
- * object.
- *
- * @param mixed $value
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @return PHPUnit_Framework_Constraint_TraversableContains
- * @since Method available since Release 3.0.0
- */
- function contains($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::contains',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- * @since Method available since Release 3.1.4
- */
- function containsOnly($type)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::containsOnly',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
- * object.
- *
- * @param string $classname
- * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
- */
- function containsOnlyInstancesOf($classname)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::containsOnlyInstancesOf',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
- *
- * @param mixed $value
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @return PHPUnit_Framework_Constraint_IsEqual
- * @since Method available since Release 3.0.0
- */
- function equalTo($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::equalTo',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * exactly $count times.
- *
- * @param integer $count
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function exactly($count)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::exactly',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
- *
- * @return PHPUnit_Framework_Constraint_FileExists
- * @since Method available since Release 3.0.0
- */
- function fileExists()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::fileExists',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_GreaterThan
- * @since Method available since Release 3.0.0
- */
- function greaterThan($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::greaterThan',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_GreaterThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- function greaterThanOrEqual($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::greaterThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_IsIdentical
- * @since Method available since Release 3.0.0
- */
- function identicalTo($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::identicalTo',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsEmpty
- * @since Method available since Release 3.5.0
- */
- function isEmpty()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isEmpty',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsFalse
- * @since Method available since Release 3.3.0
- */
- function isFalse()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isFalse',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
- *
- * @param string $className
- * @return PHPUnit_Framework_Constraint_IsInstanceOf
- * @since Method available since Release 3.0.0
- */
- function isInstanceOf($className)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isInstanceOf',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsJson matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsJson
- * @since Method available since Release 3.7.20
- */
- function isJson()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isJson',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsNull
- * @since Method available since Release 3.3.0
- */
- function isNull()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isNull',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
- *
- * @return PHPUnit_Framework_Constraint_IsTrue
- * @since Method available since Release 3.3.0
- */
- function isTrue()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isTrue',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
- *
- * @param string $type
- * @return PHPUnit_Framework_Constraint_IsType
- * @since Method available since Release 3.0.0
- */
- function isType($type)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::isType',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_LessThan
- * @since Method available since Release 3.0.0
- */
- function lessThan($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::lessThan',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
- * a PHPUnit_Framework_Constraint_IsEqual and a
- * PHPUnit_Framework_Constraint_LessThan matcher object.
- *
- * @param mixed $value
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.1.0
- */
- function lessThanOrEqual($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::lessThanOrEqual',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_And matcher object.
- *
- * @return PHPUnit_Framework_Constraint_And
- * @since Method available since Release 3.0.0
- */
- function logicalAnd()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalAnd',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Not matcher object.
- *
- * @param PHPUnit_Framework_Constraint $constraint
- * @return PHPUnit_Framework_Constraint_Not
- * @since Method available since Release 3.0.0
- */
- function logicalNot(PHPUnit_Framework_Constraint $constraint)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalNot',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Or matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Or
- * @since Method available since Release 3.0.0
- */
- function logicalOr()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalOr',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
- *
- * @return PHPUnit_Framework_Constraint_Xor
- * @since Method available since Release 3.0.0
- */
- function logicalXor()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::logicalXor',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
- *
- * @param string $string
- * @return PHPUnit_Framework_Constraint_StringMatches
- * @since Method available since Release 3.5.0
- */
- function matches($string)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::matches',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
- *
- * @param string $pattern
- * @return PHPUnit_Framework_Constraint_PCREMatch
- * @since Method available since Release 3.0.0
- */
- function matchesRegularExpression($pattern)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::matchesRegularExpression',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is never executed.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function never()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::never',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
- *
- * @param string $attributeName
- * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
- * @since Method available since Release 3.0.0
- */
- function objectHasAttribute($attributeName)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::objectHasAttribute',
- func_get_args()
- );
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
- * @since Method available since Release 3.0.0
- */
- function onConsecutiveCalls()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::onConsecutiveCalls',
- func_get_args()
- );
- }
- /**
- * Returns a matcher that matches when the method is executed exactly once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- function once()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::once',
- func_get_args()
- );
- }
- /**
- *
- *
- * @param integer $argumentIndex
- * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
- * @since Method available since Release 3.3.0
- */
- function returnArgument($argumentIndex)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnArgument',
- func_get_args()
- );
- }
- /**
- *
- *
- * @param mixed $callback
- * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
- * @since Method available since Release 3.3.0
- */
- function returnCallback($callback)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnCallback',
- func_get_args()
- );
- }
- /**
- * Returns the current object.
- *
- * This method is useful when mocking a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
- * @since Method available since Release 3.6.0
- */
- function returnSelf()
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnSelf',
- func_get_args()
- );
- }
- /**
- *
- *
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Stub_Return
- * @since Method available since Release 3.0.0
- */
- function returnValue($value)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnValue',
- func_get_args()
- );
- }
- /**
- *
- *
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
- * @since Method available since Release 3.6.0
- */
- function returnValueMap(array $valueMap)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::returnValueMap',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
- *
- * @param string $string
- * @param boolean $case
- * @return PHPUnit_Framework_Constraint_StringContains
- * @since Method available since Release 3.0.0
- */
- function stringContains($string, $case = true)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringContains',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
- *
- * @param mixed $suffix
- * @return PHPUnit_Framework_Constraint_StringEndsWith
- * @since Method available since Release 3.4.0
- */
- function stringEndsWith($suffix)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringEndsWith',
- func_get_args()
- );
- }
- /**
- * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
- *
- * @param mixed $prefix
- * @return PHPUnit_Framework_Constraint_StringStartsWith
- * @since Method available since Release 3.4.0
- */
- function stringStartsWith($prefix)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_Assert::stringStartsWith',
- func_get_args()
- );
- }
- /**
- *
- *
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Stub_Exception
- * @since Method available since Release 3.1.0
- */
- function throwException(Exception $exception)
- {
- return call_user_func_array(
- 'PHPUnit_Framework_TestCase::throwException',
- func_get_args()
- );
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Creates a synthetic failed assertion.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError
- {
- /**
- * The synthetic file.
- *
- * @var string
- */
- protected $syntheticFile = '';
- /**
- * The synthetic line number.
- *
- * @var integer
- */
- protected $syntheticLine = 0;
- /**
- * The synthetic trace.
- *
- * @var array
- */
- protected $syntheticTrace = array();
- /**
- * Constructor.
- *
- * @param string $message
- * @param integer $code
- * @param string $file
- * @param integer $line
- * @param array $trace
- */
- public function __construct($message, $code, $file, $line, $trace)
- {
- parent::__construct($message, $code);
- $this->syntheticFile = $file;
- $this->syntheticLine = $line;
- $this->syntheticTrace = $trace;
- }
- /**
- * @return string
- */
- public function getSyntheticFile()
- {
- return $this->syntheticFile;
- }
- /**
- * @return integer
- */
- public function getSyntheticLine()
- {
- return $this->syntheticLine;
- }
- /**
- * @return array
- */
- public function getSyntheticTrace()
- {
- return $this->syntheticTrace;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a risky test.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_RiskyTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_RiskyTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Listener for test progress.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_TestListener
- {
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time);
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time);
- /**
- * A test suite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite);
- /**
- * A test suite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite);
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test);
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wraps Exceptions thrown by code under test.
- *
- * Re-instantiates Exceptions thrown by user-space code to retain their original
- * class names, properties, and stack traces (but without arguments).
- *
- * Unlike PHPUnit_Framework_Exception, the complete stack of previous Exceptions
- * is processed.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Daniel F. Kudwien <sun@unleashedmind.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_ExceptionWrapper extends PHPUnit_Framework_Exception
- {
- /**
- * @var string
- */
- protected $classname;
- /**
- * @var PHPUnit_Framework_ExceptionWrapper|null
- */
- protected $previous;
- public function __construct(Exception $e)
- {
- // PDOException::getCode() is a string.
- // @see http://php.net/manual/en/class.pdoexception.php#95812
- parent::__construct($e->getMessage(), (int) $e->getCode());
- $this->classname = get_class($e);
- $this->file = $e->getFile();
- $this->line = $e->getLine();
- $this->serializableTrace = $e->getTrace();
- foreach ($this->serializableTrace as $i => $call) {
- unset($this->serializableTrace[$i]['args']);
- }
- if ($e->getPrevious()) {
- $this->previous = new self($e->getPrevious());
- }
- }
- /**
- * @return string
- */
- public function getClassname()
- {
- return $this->classname;
- }
- /**
- * @return PHPUnit_Framework_ExceptionWrapper
- */
- public function getPreviousWrapped()
- {
- return $this->previous;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $string = PHPUnit_Framework_TestFailure::exceptionToString($this);
- if ($trace = PHPUnit_Util_Filter::getFilteredStacktrace($this)) {
- $string .= "\n" . $trace;
- }
- if ($this->previous) {
- $string .= "\nCaused by\n" . $this->previous;
- }
- return $string;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking a unit test as being skipped.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 3.0.0
- */
- interface PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_InvalidCoversTargetException extends PHPUnit_Framework_CodeCoverageException
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\GlobalState\Snapshot;
- use SebastianBergmann\GlobalState\Restorer;
- use SebastianBergmann\GlobalState\Blacklist;
- use SebastianBergmann\Diff\Differ;
- use SebastianBergmann\Exporter\Exporter;
- use Prophecy\Exception\Prediction\PredictionException;
- use Prophecy\Prophet;
- /**
- * A TestCase defines the fixture to run multiple tests.
- *
- * To define a TestCase
- *
- * 1) Implement a subclass of PHPUnit_Framework_TestCase.
- * 2) Define instance variables that store the state of the fixture.
- * 3) Initialize the fixture state by overriding setUp().
- * 4) Clean-up after a test by overriding tearDown().
- *
- * Each test runs in its own fixture so there can be no side effects
- * among test runs.
- *
- * Here is an example:
- *
- * <code>
- * <?php
- * class MathTest extends PHPUnit_Framework_TestCase
- * {
- * public $value1;
- * public $value2;
- *
- * protected function setUp()
- * {
- * $this->value1 = 2;
- * $this->value2 = 3;
- * }
- * }
- * ?>
- * </code>
- *
- * For each test implement a method which interacts with the fixture.
- * Verify the expected results with assertions specified by calling
- * assert with a boolean.
- *
- * <code>
- * <?php
- * public function testPass()
- * {
- * $this->assertTrue($this->value1 + $this->value2 == 5);
- * }
- * ?>
- * </code>
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * Enable or disable the backup and restoration of the $GLOBALS array.
- * Overwrite this attribute in a child class of TestCase.
- * Setting this attribute in setUp() has no effect!
- *
- * @var boolean
- */
- protected $backupGlobals = null;
- /**
- * @var array
- */
- protected $backupGlobalsBlacklist = array();
- /**
- * Enable or disable the backup and restoration of static attributes.
- * Overwrite this attribute in a child class of TestCase.
- * Setting this attribute in setUp() has no effect!
- *
- * @var boolean
- */
- protected $backupStaticAttributes = null;
- /**
- * @var array
- */
- protected $backupStaticAttributesBlacklist = array();
- /**
- * Whether or not this test is to be run in a separate PHP process.
- *
- * @var boolean
- */
- protected $runTestInSeparateProcess = null;
- /**
- * Whether or not this test should preserve the global state when
- * running in a separate PHP process.
- *
- * @var boolean
- */
- protected $preserveGlobalState = true;
- /**
- * Whether or not this test is running in a separate PHP process.
- *
- * @var boolean
- */
- private $inIsolation = false;
- /**
- * @var array
- */
- private $data = array();
- /**
- * @var string
- */
- private $dataName = '';
- /**
- * @var boolean
- */
- private $useErrorHandler = null;
- /**
- * The name of the expected Exception.
- *
- * @var mixed
- */
- private $expectedException = null;
- /**
- * The message of the expected Exception.
- *
- * @var string
- */
- private $expectedExceptionMessage = '';
- /**
- * The regex pattern to validate the expected Exception message.
- *
- * @var string
- */
- private $expectedExceptionMessageRegExp = '';
- /**
- * The code of the expected Exception.
- *
- * @var integer
- */
- private $expectedExceptionCode;
- /**
- * The name of the test case.
- *
- * @var string
- */
- private $name = null;
- /**
- * @var array
- */
- private $dependencies = array();
- /**
- * @var array
- */
- private $dependencyInput = array();
- /**
- * @var array
- */
- private $iniSettings = array();
- /**
- * @var array
- */
- private $locale = array();
- /**
- * @var array
- */
- private $mockObjects = array();
- /**
- * @var array
- */
- private $mockObjectGenerator = null;
- /**
- * @var integer
- */
- private $status;
- /**
- * @var string
- */
- private $statusMessage = '';
- /**
- * @var integer
- */
- private $numAssertions = 0;
- /**
- * @var PHPUnit_Framework_TestResult
- */
- private $result;
- /**
- * @var mixed
- */
- private $testResult;
- /**
- * @var string
- */
- private $output = '';
- /**
- * @var string
- */
- private $outputExpectedRegex = null;
- /**
- * @var string
- */
- private $outputExpectedString = null;
- /**
- * @var mixed
- */
- private $outputCallback = false;
- /**
- * @var boolean
- */
- private $outputBufferingActive = false;
- /**
- * @var integer
- */
- private $outputBufferingLevel;
- /**
- * @var SebastianBergmann\GlobalState\Snapshot
- */
- private $snapshot;
- /**
- * @var Prophecy\Prophet
- */
- private $prophet;
- /**
- * @var boolean
- */
- private $disallowChangesToGlobalState = false;
- /**
- * Constructs a test case with the given name.
- *
- * @param string $name
- * @param array $data
- * @param string $dataName
- */
- public function __construct($name = null, array $data = array(), $dataName = '')
- {
- if ($name !== null) {
- $this->setName($name);
- }
- $this->data = $data;
- $this->dataName = $dataName;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- $class = new ReflectionClass($this);
- $buffer = sprintf(
- '%s::%s',
- $class->name,
- $this->getName(false)
- );
- return $buffer . $this->getDataSetAsString();
- }
- /**
- * Counts the number of test cases executed by run(TestResult result).
- *
- * @return integer
- */
- public function count()
- {
- return 1;
- }
- /**
- * Returns the annotations for this test.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function getAnnotations()
- {
- return PHPUnit_Util_Test::parseTestMethodAnnotations(
- get_class($this),
- $this->name
- );
- }
- /**
- * Gets the name of a TestCase.
- *
- * @param boolean $withDataSet
- * @return string
- */
- public function getName($withDataSet = true)
- {
- if ($withDataSet) {
- return $this->name . $this->getDataSetAsString(false);
- } else {
- return $this->name;
- }
- }
- /**
- * Returns the size of the test.
- *
- * @return integer
- * @since Method available since Release 3.6.0
- */
- public function getSize()
- {
- return PHPUnit_Util_Test::getSize(
- get_class($this),
- $this->getName(false)
- );
- }
- /**
- * @return string
- * @since Method available since Release 3.6.0
- */
- public function getActualOutput()
- {
- if (!$this->outputBufferingActive) {
- return $this->output;
- } else {
- return ob_get_contents();
- }
- }
- /**
- * @return boolean
- * @since Method available since Release 3.6.0
- */
- public function hasOutput()
- {
- if (strlen($this->output) === 0) {
- return false;
- }
- if ($this->hasExpectationOnOutput()) {
- return false;
- }
- return true;
- }
- /**
- * @param string $expectedRegex
- * @since Method available since Release 3.6.0
- * @throws PHPUnit_Framework_Exception
- */
- public function expectOutputRegex($expectedRegex)
- {
- if ($this->outputExpectedString !== null) {
- throw new PHPUnit_Framework_Exception;
- }
- if (is_string($expectedRegex) || is_null($expectedRegex)) {
- $this->outputExpectedRegex = $expectedRegex;
- }
- }
- /**
- * @param string $expectedString
- * @since Method available since Release 3.6.0
- */
- public function expectOutputString($expectedString)
- {
- if ($this->outputExpectedRegex !== null) {
- throw new PHPUnit_Framework_Exception;
- }
- if (is_string($expectedString) || is_null($expectedString)) {
- $this->outputExpectedString = $expectedString;
- }
- }
- /**
- * @return bool
- * @since Method available since Release 3.6.5
- * @deprecated
- */
- public function hasPerformedExpectationsOnOutput()
- {
- return $this->hasExpectationOnOutput();
- }
- /**
- * @return bool
- * @since Method available since Release 4.3.3
- */
- public function hasExpectationOnOutput()
- {
- return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex);
- }
- /**
- * @return string
- * @since Method available since Release 3.2.0
- */
- public function getExpectedException()
- {
- return $this->expectedException;
- }
- /**
- * @param mixed $exceptionName
- * @param string $exceptionMessage
- * @param integer $exceptionCode
- * @since Method available since Release 3.2.0
- */
- public function setExpectedException($exceptionName, $exceptionMessage = '', $exceptionCode = null)
- {
- $this->expectedException = $exceptionName;
- $this->expectedExceptionMessage = $exceptionMessage;
- $this->expectedExceptionCode = $exceptionCode;
- }
- /**
- * @param mixed $exceptionName
- * @param string $exceptionMessageRegExp
- * @param integer $exceptionCode
- * @since Method available since Release 4.3.0
- */
- public function setExpectedExceptionRegExp($exceptionName, $exceptionMessageRegExp = '', $exceptionCode = null)
- {
- $this->expectedException = $exceptionName;
- $this->expectedExceptionMessageRegExp = $exceptionMessageRegExp;
- $this->expectedExceptionCode = $exceptionCode;
- }
- /**
- * @since Method available since Release 3.4.0
- */
- protected function setExpectedExceptionFromAnnotation()
- {
- try {
- $expectedException = PHPUnit_Util_Test::getExpectedException(
- get_class($this),
- $this->name
- );
- if ($expectedException !== false) {
- $this->setExpectedException(
- $expectedException['class'],
- $expectedException['message'],
- $expectedException['code']
- );
- if (!empty($expectedException['message_regex'])) {
- $this->setExpectedExceptionRegExp(
- $expectedException['class'],
- $expectedException['message_regex'],
- $expectedException['code']
- );
- }
- }
- } catch (ReflectionException $e) {
- }
- }
- /**
- * @param boolean $useErrorHandler
- * @since Method available since Release 3.4.0
- */
- public function setUseErrorHandler($useErrorHandler)
- {
- $this->useErrorHandler = $useErrorHandler;
- }
- /**
- * @since Method available since Release 3.4.0
- */
- protected function setUseErrorHandlerFromAnnotation()
- {
- try {
- $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings(
- get_class($this),
- $this->name
- );
- if ($useErrorHandler !== null) {
- $this->setUseErrorHandler($useErrorHandler);
- }
- } catch (ReflectionException $e) {
- }
- }
- /**
- * @since Method available since Release 3.6.0
- */
- protected function checkRequirements()
- {
- if (!$this->name || !method_exists($this, $this->name)) {
- return;
- }
- $missingRequirements = PHPUnit_Util_Test::getMissingRequirements(
- get_class($this),
- $this->name
- );
- if ($missingRequirements) {
- $this->markTestSkipped(implode(PHP_EOL, $missingRequirements));
- }
- }
- /**
- * Returns the status of this test.
- *
- * @return integer
- * @since Method available since Release 3.1.0
- */
- public function getStatus()
- {
- return $this->status;
- }
- /**
- * Returns the status message of this test.
- *
- * @return string
- * @since Method available since Release 3.3.0
- */
- public function getStatusMessage()
- {
- return $this->statusMessage;
- }
- /**
- * Returns whether or not this test has failed.
- *
- * @return boolean
- * @since Method available since Release 3.0.0
- */
- public function hasFailed()
- {
- $status = $this->getStatus();
- return $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE ||
- $status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- }
- /**
- * Runs the test case and collects the results in a TestResult object.
- * If no TestResult object is passed a new one will be created.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- if (!$this instanceof PHPUnit_Framework_Warning) {
- $this->setTestResultObject($result);
- $this->setUseErrorHandlerFromAnnotation();
- }
- if ($this->useErrorHandler !== null) {
- $oldErrorHandlerSetting = $result->getConvertErrorsToExceptions();
- $result->convertErrorsToExceptions($this->useErrorHandler);
- }
- if (!$this instanceof PHPUnit_Framework_Warning && !$this->handleDependencies()) {
- return;
- }
- if ($this->runTestInSeparateProcess === true &&
- $this->inIsolation !== true &&
- !$this instanceof PHPUnit_Extensions_SeleniumTestCase &&
- !$this instanceof PHPUnit_Extensions_PhptTestCase) {
- $class = new ReflectionClass($this);
- $template = new Text_Template(
- __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl'
- );
- if ($this->preserveGlobalState) {
- $constants = PHPUnit_Util_GlobalState::getConstantsAsString();
- $globals = PHPUnit_Util_GlobalState::getGlobalsAsString();
- $includedFiles = PHPUnit_Util_GlobalState::getIncludedFilesAsString();
- $iniSettings = PHPUnit_Util_GlobalState::getIniSettingsAsString();
- } else {
- $constants = '';
- if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) {
- $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n";
- } else {
- $globals = '';
- }
- $includedFiles = '';
- $iniSettings = '';
- }
- $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false';
- $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false';
- $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false';
- $isStrictAboutTestSize = $result->isStrictAboutTestSize() ? 'true' : 'false';
- $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false';
- if (defined('PHPUNIT_COMPOSER_INSTALL')) {
- $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true);
- } else {
- $composerAutoload = '\'\'';
- }
- if (defined('__PHPUNIT_PHAR__')) {
- $phar = var_export(__PHPUNIT_PHAR__, true);
- } else {
- $phar = '\'\'';
- }
- $data = var_export(serialize($this->data), true);
- $dataName = var_export($this->dataName, true);
- $dependencyInput = var_export(serialize($this->dependencyInput), true);
- $includePath = var_export(get_include_path(), true);
- // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC
- // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences
- $data = "'." . $data . ".'";
- $dataName = "'.(" . $dataName . ").'";
- $dependencyInput = "'." . $dependencyInput . ".'";
- $includePath = "'." . $includePath . ".'";
- $template->setVar(
- array(
- 'composerAutoload' => $composerAutoload,
- 'phar' => $phar,
- 'filename' => $class->getFileName(),
- 'className' => $class->getName(),
- 'methodName' => $this->name,
- 'collectCodeCoverageInformation' => $coverage,
- 'data' => $data,
- 'dataName' => $dataName,
- 'dependencyInput' => $dependencyInput,
- 'constants' => $constants,
- 'globals' => $globals,
- 'include_path' => $includePath,
- 'included_files' => $includedFiles,
- 'iniSettings' => $iniSettings,
- 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything,
- 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests,
- 'isStrictAboutTestSize' => $isStrictAboutTestSize,
- 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests
- )
- );
- $this->prepareTemplate($template);
- $php = PHPUnit_Util_PHP::factory();
- $php->runTestJob($template->render(), $this, $result);
- } else {
- $result->run($this);
- }
- if ($this->useErrorHandler !== null) {
- $result->convertErrorsToExceptions($oldErrorHandlerSetting);
- }
- $this->result = null;
- return $result;
- }
- /**
- * Runs the bare test sequence.
- */
- public function runBare()
- {
- $this->numAssertions = 0;
- $this->snapshotGlobalState();
- $this->startOutputBuffering();
- clearstatcache();
- $currentWorkingDirectory = getcwd();
- $hookMethods = PHPUnit_Util_Test::getHookMethods(get_class($this));
- try {
- $hasMetRequirements = false;
- $this->checkRequirements();
- $hasMetRequirements = true;
- if ($this->inIsolation) {
- foreach ($hookMethods['beforeClass'] as $method) {
- $this->$method();
- }
- }
- $this->setExpectedExceptionFromAnnotation();
- foreach ($hookMethods['before'] as $method) {
- $this->$method();
- }
- $this->assertPreConditions();
- $this->testResult = $this->runTest();
- $this->verifyMockObjects();
- $this->assertPostConditions();
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
- } catch (PHPUnit_Framework_IncompleteTest $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
- $this->statusMessage = $e->getMessage();
- } catch (PHPUnit_Framework_SkippedTest $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
- $this->statusMessage = $e->getMessage();
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->statusMessage = $e->getMessage();
- } catch (PredictionException $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->statusMessage = $e->getMessage();
- } catch (Exception $e) {
- $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- $this->statusMessage = $e->getMessage();
- }
- // Clean up the mock objects.
- $this->mockObjects = array();
- $this->prophet = null;
- // Tear down the fixture. An exception raised in tearDown() will be
- // caught and passed on when no exception was raised before.
- try {
- if ($hasMetRequirements) {
- foreach ($hookMethods['after'] as $method) {
- $this->$method();
- }
- if ($this->inIsolation) {
- foreach ($hookMethods['afterClass'] as $method) {
- $this->$method();
- }
- }
- }
- } catch (Exception $_e) {
- if (!isset($e)) {
- $e = $_e;
- }
- }
- try {
- $this->stopOutputBuffering();
- } catch (PHPUnit_Framework_RiskyTestError $_e) {
- if (!isset($e)) {
- $e = $_e;
- }
- }
- clearstatcache();
- if ($currentWorkingDirectory != getcwd()) {
- chdir($currentWorkingDirectory);
- }
- $this->restoreGlobalState();
- // Clean up INI settings.
- foreach ($this->iniSettings as $varName => $oldValue) {
- ini_set($varName, $oldValue);
- }
- $this->iniSettings = array();
- // Clean up locale settings.
- foreach ($this->locale as $category => $locale) {
- setlocale($category, $locale);
- }
- // Perform assertion on output.
- if (!isset($e)) {
- try {
- if ($this->outputExpectedRegex !== null) {
- $this->assertRegExp($this->outputExpectedRegex, $this->output);
- } elseif ($this->outputExpectedString !== null) {
- $this->assertEquals($this->outputExpectedString, $this->output);
- }
- } catch (Exception $_e) {
- $e = $_e;
- }
- }
- // Workaround for missing "finally".
- if (isset($e)) {
- if ($e instanceof PredictionException) {
- $e = new PHPUnit_Framework_AssertionFailedError($e->getMessage());
- }
- $this->onNotSuccessfulTest($e);
- }
- }
- /**
- * Override to run the test and assert its state.
- *
- * @return mixed
- * @throws Exception|PHPUnit_Framework_Exception
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- if ($this->name === null) {
- throw new PHPUnit_Framework_Exception(
- 'PHPUnit_Framework_TestCase::$name must not be null.'
- );
- }
- try {
- $class = new ReflectionClass($this);
- $method = $class->getMethod($this->name);
- } catch (ReflectionException $e) {
- $this->fail($e->getMessage());
- }
- try {
- $testResult = $method->invokeArgs(
- $this,
- array_merge($this->data, $this->dependencyInput)
- );
- } catch (Exception $e) {
- $checkException = false;
- if (is_string($this->expectedException)) {
- $checkException = true;
- if ($e instanceof PHPUnit_Framework_Exception) {
- $checkException = false;
- }
- $reflector = new ReflectionClass($this->expectedException);
- if ($this->expectedException == 'PHPUnit_Framework_Exception' ||
- $reflector->isSubclassOf('PHPUnit_Framework_Exception')) {
- $checkException = true;
- }
- }
- if ($checkException) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_Exception(
- $this->expectedException
- )
- );
- if (is_string($this->expectedExceptionMessage) &&
- !empty($this->expectedExceptionMessage)) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionMessage(
- $this->expectedExceptionMessage
- )
- );
- }
- if (is_string($this->expectedExceptionMessageRegExp) &&
- !empty($this->expectedExceptionMessageRegExp)) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionMessageRegExp(
- $this->expectedExceptionMessageRegExp
- )
- );
- }
- if ($this->expectedExceptionCode !== null) {
- $this->assertThat(
- $e,
- new PHPUnit_Framework_Constraint_ExceptionCode(
- $this->expectedExceptionCode
- )
- );
- }
- return;
- } else {
- throw $e;
- }
- }
- if ($this->expectedException !== null) {
- $this->assertThat(
- null,
- new PHPUnit_Framework_Constraint_Exception(
- $this->expectedException
- )
- );
- }
- return $testResult;
- }
- /**
- * Verifies the mock object expectations.
- *
- * @since Method available since Release 3.5.0
- */
- protected function verifyMockObjects()
- {
- foreach ($this->mockObjects as $mockObject) {
- if ($mockObject->__phpunit_hasMatchers()) {
- $this->numAssertions++;
- }
- $mockObject->__phpunit_verify();
- }
- if ($this->prophet !== null) {
- try {
- $this->prophet->checkPredictions();
- } catch (Exception $e) {
- /** Intentionally left empty */
- }
- foreach ($this->prophet->getProphecies() as $objectProphecy) {
- foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) {
- foreach ($methodProphecies as $methodProphecy) {
- $this->numAssertions += count($methodProphecy->getCheckedPredictions());
- }
- }
- }
- if (isset($e)) {
- throw $e;
- }
- }
- }
- /**
- * Sets the name of a TestCase.
- *
- * @param string
- */
- public function setName($name)
- {
- $this->name = $name;
- }
- /**
- * Sets the dependencies of a TestCase.
- *
- * @param array $dependencies
- * @since Method available since Release 3.4.0
- */
- public function setDependencies(array $dependencies)
- {
- $this->dependencies = $dependencies;
- }
- /**
- * Returns true if the tests has dependencies
- *
- * @return boolean
- * @since Method available since Release 4.0.0
- */
- public function hasDependencies()
- {
- return count($this->dependencies) > 0;
- }
- /**
- * Sets
- *
- * @param array $dependencyInput
- * @since Method available since Release 3.4.0
- */
- public function setDependencyInput(array $dependencyInput)
- {
- $this->dependencyInput = $dependencyInput;
- }
- /**
- * @param boolean $disallowChangesToGlobalState
- * @since Method available since Release 4.6.0
- */
- public function setDisallowChangesToGlobalState($disallowChangesToGlobalState)
- {
- $this->disallowChangesToGlobalState = $disallowChangesToGlobalState;
- }
- /**
- * Calling this method in setUp() has no effect!
- *
- * @param boolean $backupGlobals
- * @since Method available since Release 3.3.0
- */
- public function setBackupGlobals($backupGlobals)
- {
- if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
- $this->backupGlobals = $backupGlobals;
- }
- }
- /**
- * Calling this method in setUp() has no effect!
- *
- * @param boolean $backupStaticAttributes
- * @since Method available since Release 3.4.0
- */
- public function setBackupStaticAttributes($backupStaticAttributes)
- {
- if (is_null($this->backupStaticAttributes) &&
- is_bool($backupStaticAttributes)) {
- $this->backupStaticAttributes = $backupStaticAttributes;
- }
- }
- /**
- * @param boolean $runTestInSeparateProcess
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setRunTestInSeparateProcess($runTestInSeparateProcess)
- {
- if (is_bool($runTestInSeparateProcess)) {
- if ($this->runTestInSeparateProcess === null) {
- $this->runTestInSeparateProcess = $runTestInSeparateProcess;
- }
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @param boolean $preserveGlobalState
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setPreserveGlobalState($preserveGlobalState)
- {
- if (is_bool($preserveGlobalState)) {
- $this->preserveGlobalState = $preserveGlobalState;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @param boolean $inIsolation
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.4.0
- */
- public function setInIsolation($inIsolation)
- {
- if (is_bool($inIsolation)) {
- $this->inIsolation = $inIsolation;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- /**
- * @return boolean
- * @since Method available since Release 4.3.0
- */
- public function isInIsolation()
- {
- return $this->inIsolation;
- }
- /**
- * @return mixed
- * @since Method available since Release 3.4.0
- */
- public function getResult()
- {
- return $this->testResult;
- }
- /**
- * @param mixed $result
- * @since Method available since Release 3.4.0
- */
- public function setResult($result)
- {
- $this->testResult = $result;
- }
- /**
- * @param callable $callback
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setOutputCallback($callback)
- {
- if (!is_callable($callback)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback');
- }
- $this->outputCallback = $callback;
- }
- /**
- * @return PHPUnit_Framework_TestResult
- * @since Method available since Release 3.5.7
- */
- public function getTestResultObject()
- {
- return $this->result;
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 3.6.0
- */
- public function setTestResultObject(PHPUnit_Framework_TestResult $result)
- {
- $this->result = $result;
- }
- /**
- * This method is a wrapper for the ini_set() function that automatically
- * resets the modified php.ini setting to its original value after the
- * test is run.
- *
- * @param string $varName
- * @param string $newValue
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- protected function iniSet($varName, $newValue)
- {
- if (!is_string($varName)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- $currentValue = ini_set($varName, $newValue);
- if ($currentValue !== false) {
- $this->iniSettings[$varName] = $currentValue;
- } else {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'INI setting "%s" could not be set to "%s".',
- $varName,
- $newValue
- )
- );
- }
- }
- /**
- * This method is a wrapper for the setlocale() function that automatically
- * resets the locale to its original value after the test is run.
- *
- * @param integer $category
- * @param string $locale
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- protected function setLocale()
- {
- $args = func_get_args();
- if (count($args) < 2) {
- throw new PHPUnit_Framework_Exception;
- }
- $category = $args[0];
- $locale = $args[1];
- $categories = array(
- LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME
- );
- if (defined('LC_MESSAGES')) {
- $categories[] = LC_MESSAGES;
- }
- if (!in_array($category, $categories)) {
- throw new PHPUnit_Framework_Exception;
- }
- if (!is_array($locale) && !is_string($locale)) {
- throw new PHPUnit_Framework_Exception;
- }
- $this->locale[$category] = setlocale($category, null);
- $result = call_user_func_array('setlocale', $args);
- if ($result === false) {
- throw new PHPUnit_Framework_Exception(
- 'The locale functionality is not implemented on your platform, ' .
- 'the specified locale does not exist or the category name is ' .
- 'invalid.'
- );
- }
- }
- /**
- * Returns a mock object for the specified class.
- *
- * @param string $originalClassName Name of the class to mock.
- * @param array|null $methods When provided, only methods whose names are in the array
- * are replaced with a configurable test double. The behavior
- * of the other methods is not changed.
- * Providing null means that no methods will be replaced.
- * @param array $arguments Parameters to pass to the original class' constructor.
- * @param string $mockClassName Class name for the generated test double class.
- * @param boolean $callOriginalConstructor Can be used to disable the call to the original class' constructor.
- * @param boolean $callOriginalClone Can be used to disable the call to the original class' clone constructor.
- * @param boolean $callAutoload Can be used to disable __autoload() during the generation of the test double class.
- * @param boolean $cloneArguments
- * @param boolean $callOriginalMethods
- * @return PHPUnit_Framework_MockObject_MockObject
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments,
- $callOriginalMethods
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns a builder object to create mock objects using a fluent interface.
- *
- * @param string $className
- * @return PHPUnit_Framework_MockObject_MockBuilder
- * @since Method available since Release 3.5.0
- */
- public function getMockBuilder($className)
- {
- return new PHPUnit_Framework_MockObject_MockBuilder($this, $className);
- }
- /**
- * Mocks the specified class and returns the name of the mocked class.
- *
- * @param string $originalClassName
- * @param array $methods
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param boolean $cloneArguments
- * @return string
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- protected function getMockClass($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false)
- {
- $mock = $this->getMock(
- $originalClassName,
- $methods,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- return get_class($mock);
- }
- /**
- * Returns a mock object for the specified abstract class with all abstract
- * methods of the class mocked. Concrete methods are not mocked by default.
- * To mock concrete methods, use the 7th parameter ($mockedMethods).
- *
- * @param string $originalClassName
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param array $mockedMethods
- * @param boolean $cloneArguments
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 3.4.0
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass(
- $originalClassName,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $mockedMethods,
- $cloneArguments
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns a mock object based on the given WSDL file.
- *
- * @param string $wsdlFile
- * @param string $originalClassName
- * @param string $mockClassName
- * @param array $methods
- * @param boolean $callOriginalConstructor
- * @param array $options An array of options passed to SOAPClient::_construct
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 3.4.0
- */
- protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = array(), $callOriginalConstructor = true, array $options = array())
- {
- if ($originalClassName === '') {
- $originalClassName = str_replace('.wsdl', '', basename($wsdlFile));
- }
- if (!class_exists($originalClassName)) {
- eval(
- $this->getMockObjectGenerator()->generateClassFromWsdl(
- $wsdlFile,
- $originalClassName,
- $methods,
- $options
- )
- );
- }
- return $this->getMock(
- $originalClassName,
- $methods,
- array('', $options),
- $mockClassName,
- $callOriginalConstructor,
- false,
- false
- );
- }
- /**
- * Returns a mock object for the specified trait with all abstract methods
- * of the trait mocked. Concrete methods to mock can be specified with the
- * `$mockedMethods` parameter.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $mockClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param array $mockedMethods
- * @param boolean $cloneArguments
- * @return PHPUnit_Framework_MockObject_MockObject
- * @since Method available since Release 4.0.0
- * @throws PHPUnit_Framework_Exception
- */
- public function getMockForTrait($traitName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = array(), $cloneArguments = false)
- {
- $mockObject = $this->getMockObjectGenerator()->getMockForTrait(
- $traitName,
- $arguments,
- $mockClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $mockedMethods,
- $cloneArguments
- );
- $this->mockObjects[] = $mockObject;
- return $mockObject;
- }
- /**
- * Returns an object for the specified trait.
- *
- * @param string $traitName
- * @param array $arguments
- * @param string $traitClassName
- * @param boolean $callOriginalConstructor
- * @param boolean $callOriginalClone
- * @param boolean $callAutoload
- * @param boolean $cloneArguments
- * @return object
- * @since Method available since Release 3.6.0
- * @throws PHPUnit_Framework_Exception
- */
- protected function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false)
- {
- return $this->getMockObjectGenerator()->getObjectForTrait(
- $traitName,
- $arguments,
- $traitClassName,
- $callOriginalConstructor,
- $callOriginalClone,
- $callAutoload,
- $cloneArguments
- );
- }
- /**
- * @param string|null $classOrInterface
- * @return \Prophecy\Prophecy\ObjectProphecy
- * @throws \LogicException
- * @since Method available since Release 4.5.0
- */
- protected function prophesize($classOrInterface = null)
- {
- return $this->getProphet()->prophesize($classOrInterface);
- }
- /**
- * Adds a value to the assertion counter.
- *
- * @param integer $count
- * @since Method available since Release 3.3.3
- */
- public function addToAssertionCount($count)
- {
- $this->numAssertions += $count;
- }
- /**
- * Returns the number of assertions performed by this test.
- *
- * @return integer
- * @since Method available since Release 3.3.0
- */
- public function getNumAssertions()
- {
- return $this->numAssertions;
- }
- /**
- * Returns a matcher that matches when the method is executed
- * zero or more times.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function any()
- {
- return new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount;
- }
- /**
- * Returns a matcher that matches when the method is never executed.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function never()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(0);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at least N times.
- *
- * @param integer $requiredInvocations
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount
- * @since Method available since Release 4.2.0
- */
- public static function atLeast($requiredInvocations)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount(
- $requiredInvocations
- );
- }
- /**
- * Returns a matcher that matches when the method is executed at least once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
- * @since Method available since Release 3.0.0
- */
- public static function atLeastOnce()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce;
- }
- /**
- * Returns a matcher that matches when the method is executed exactly once.
- *
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function once()
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(1);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * exactly $count times.
- *
- * @param integer $count
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
- * @since Method available since Release 3.0.0
- */
- public static function exactly($count)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedCount($count);
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at most N times.
- *
- * @param integer $allowedInvocations
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount
- * @since Method available since Release 4.2.0
- */
- public static function atMost($allowedInvocations)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount(
- $allowedInvocations
- );
- }
- /**
- * Returns a matcher that matches when the method is executed
- * at the given index.
- *
- * @param integer $index
- * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
- * @since Method available since Release 3.0.0
- */
- public static function at($index)
- {
- return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index);
- }
- /**
- *
- *
- * @param mixed $value
- * @return PHPUnit_Framework_MockObject_Stub_Return
- * @since Method available since Release 3.0.0
- */
- public static function returnValue($value)
- {
- return new PHPUnit_Framework_MockObject_Stub_Return($value);
- }
- /**
- *
- *
- * @param array $valueMap
- * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
- * @since Method available since Release 3.6.0
- */
- public static function returnValueMap(array $valueMap)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap);
- }
- /**
- *
- *
- * @param integer $argumentIndex
- * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
- * @since Method available since Release 3.3.0
- */
- public static function returnArgument($argumentIndex)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnArgument(
- $argumentIndex
- );
- }
- /**
- *
- *
- * @param mixed $callback
- * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
- * @since Method available since Release 3.3.0
- */
- public static function returnCallback($callback)
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnCallback($callback);
- }
- /**
- * Returns the current object.
- *
- * This method is useful when mocking a fluent interface.
- *
- * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
- * @since Method available since Release 3.6.0
- */
- public static function returnSelf()
- {
- return new PHPUnit_Framework_MockObject_Stub_ReturnSelf();
- }
- /**
- *
- *
- * @param Exception $exception
- * @return PHPUnit_Framework_MockObject_Stub_Exception
- * @since Method available since Release 3.1.0
- */
- public static function throwException(Exception $exception)
- {
- return new PHPUnit_Framework_MockObject_Stub_Exception($exception);
- }
- /**
- * @param mixed $value, ...
- * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
- * @since Method available since Release 3.0.0
- */
- public static function onConsecutiveCalls()
- {
- $args = func_get_args();
- return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args);
- }
- /**
- * Gets the data set description of a TestCase.
- *
- * @param boolean $includeData
- * @return string
- * @since Method available since Release 3.3.0
- */
- protected function getDataSetAsString($includeData = true)
- {
- $buffer = '';
- if (!empty($this->data)) {
- if (is_int($this->dataName)) {
- $buffer .= sprintf(' with data set #%d', $this->dataName);
- } else {
- $buffer .= sprintf(' with data set "%s"', $this->dataName);
- }
- $exporter = new Exporter;
- if ($includeData) {
- $buffer .= sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data));
- }
- }
- return $buffer;
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * @since Method available since Release 3.5.4
- */
- protected function handleDependencies()
- {
- if (!empty($this->dependencies) && !$this->inIsolation) {
- $className = get_class($this);
- $passed = $this->result->passed();
- $passedKeys = array_keys($passed);
- $numKeys = count($passedKeys);
- for ($i = 0; $i < $numKeys; $i++) {
- $pos = strpos($passedKeys[$i], ' with data set');
- if ($pos !== false) {
- $passedKeys[$i] = substr($passedKeys[$i], 0, $pos);
- }
- }
- $passedKeys = array_flip(array_unique($passedKeys));
- foreach ($this->dependencies as $dependency) {
- if (strpos($dependency, '::') === false) {
- $dependency = $className . '::' . $dependency;
- }
- if (!isset($passedKeys[$dependency])) {
- $this->result->addError(
- $this,
- new PHPUnit_Framework_SkippedTestError(
- sprintf(
- 'This test depends on "%s" to pass.',
- $dependency
- )
- ),
- 0
- );
- return false;
- }
- if (isset($passed[$dependency])) {
- if ($passed[$dependency]['size'] != PHPUnit_Util_Test::UNKNOWN &&
- $this->getSize() != PHPUnit_Util_Test::UNKNOWN &&
- $passed[$dependency]['size'] > $this->getSize()) {
- $this->result->addError(
- $this,
- new PHPUnit_Framework_SkippedTestError(
- 'This test depends on a test that is larger than itself.'
- ),
- 0
- );
- return false;
- }
- $this->dependencyInput[$dependency] = $passed[$dependency]['result'];
- } else {
- $this->dependencyInput[$dependency] = null;
- }
- }
- }
- return true;
- }
- /**
- * This method is called before the first test of this test class is run.
- *
- * @since Method available since Release 3.4.0
- */
- public static function setUpBeforeClass()
- {
- }
- /**
- * Sets up the fixture, for example, open a network connection.
- * This method is called before a test is executed.
- *
- */
- protected function setUp()
- {
- }
- /**
- * Performs assertions shared by all tests of a test case.
- *
- * This method is called before the execution of a test starts
- * and after setUp() is called.
- *
- * @since Method available since Release 3.2.8
- */
- protected function assertPreConditions()
- {
- }
- /**
- * Performs assertions shared by all tests of a test case.
- *
- * This method is called before the execution of a test ends
- * and before tearDown() is called.
- *
- * @since Method available since Release 3.2.8
- */
- protected function assertPostConditions()
- {
- }
- /**
- * Tears down the fixture, for example, close a network connection.
- * This method is called after a test is executed.
- */
- protected function tearDown()
- {
- }
- /**
- * This method is called after the last test of this test class is run.
- *
- * @since Method available since Release 3.4.0
- */
- public static function tearDownAfterClass()
- {
- }
- /**
- * This method is called when a test method did not execute successfully.
- *
- * @param Exception $e
- * @since Method available since Release 3.4.0
- * @throws Exception
- */
- protected function onNotSuccessfulTest(Exception $e)
- {
- throw $e;
- }
- /**
- * Performs custom preparations on the process isolation template.
- *
- * @param Text_Template $template
- * @since Method available since Release 3.4.0
- */
- protected function prepareTemplate(Text_Template $template)
- {
- }
- /**
- * Get the mock object generator, creating it if it doesn't exist.
- *
- * @return PHPUnit_Framework_MockObject_Generator
- */
- protected function getMockObjectGenerator()
- {
- if (null === $this->mockObjectGenerator) {
- $this->mockObjectGenerator = new PHPUnit_Framework_MockObject_Generator;
- }
- return $this->mockObjectGenerator;
- }
- /**
- * @since Method available since Release 4.2.0
- */
- private function startOutputBuffering()
- {
- while (!defined('PHPUNIT_TESTSUITE') && ob_get_level() > 0) {
- ob_end_clean();
- }
- ob_start();
- $this->outputBufferingActive = true;
- $this->outputBufferingLevel = ob_get_level();
- }
- /**
- * @since Method available since Release 4.2.0
- */
- private function stopOutputBuffering()
- {
- if (ob_get_level() != $this->outputBufferingLevel) {
- while (ob_get_level() > 0) {
- ob_end_clean();
- }
- throw new PHPUnit_Framework_RiskyTestError(
- 'Test code or tested code did not (only) close its own output buffers'
- );
- }
- $output = ob_get_contents();
- if ($this->outputCallback === false) {
- $this->output = $output;
- } else {
- $this->output = call_user_func_array(
- $this->outputCallback,
- array($output)
- );
- }
- ob_end_clean();
- $this->outputBufferingActive = false;
- $this->outputBufferingLevel = ob_get_level();
- }
- private function snapshotGlobalState()
- {
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($this->runTestInSeparateProcess || $this->inIsolation ||
- (!$backupGlobals && !$this->backupStaticAttributes)) {
- return;
- }
- $this->snapshot = $this->createGlobalStateSnapshot($backupGlobals);
- }
- private function restoreGlobalState()
- {
- if (!$this->snapshot instanceof Snapshot) {
- return;
- }
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($this->disallowChangesToGlobalState) {
- $this->compareGlobalStateSnapshots(
- $this->snapshot,
- $this->createGlobalStateSnapshot($backupGlobals)
- );
- }
- $restorer = new Restorer;
- if ($backupGlobals) {
- $restorer->restoreGlobalVariables($this->snapshot);
- }
- if ($this->backupStaticAttributes) {
- $restorer->restoreStaticAttributes($this->snapshot);
- }
- $this->snapshot = null;
- }
- /**
- * @param boolean $backupGlobals
- * @return Snapshot
- */
- private function createGlobalStateSnapshot($backupGlobals)
- {
- $blacklist = new Blacklist;
- foreach ($this->backupGlobalsBlacklist as $globalVariable) {
- $blacklist->addGlobalVariable($globalVariable);
- }
- if (!defined('PHPUNIT_TESTSUITE')) {
- $blacklist->addClassNamePrefix('PHPUnit');
- $blacklist->addClassNamePrefix('File_Iterator');
- $blacklist->addClassNamePrefix('PHP_CodeCoverage');
- $blacklist->addClassNamePrefix('PHP_Invoker');
- $blacklist->addClassNamePrefix('PHP_Timer');
- $blacklist->addClassNamePrefix('PHP_Token');
- $blacklist->addClassNamePrefix('Symfony');
- $blacklist->addClassNamePrefix('Text_Template');
- $blacklist->addClassNamePrefix('Doctrine\Instantiator');
- foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) {
- foreach ($attributes as $attribute) {
- $blacklist->addStaticAttribute($class, $attribute);
- }
- }
- }
- return new Snapshot(
- $blacklist,
- $backupGlobals,
- $this->backupStaticAttributes,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- );
- }
- /**
- * @param Snapshot $before
- * @param Snapshot $after
- * @throws PHPUnit_Framework_RiskyTestError
- */
- private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after)
- {
- $backupGlobals = $this->backupGlobals === null || $this->backupGlobals === true;
- if ($backupGlobals) {
- $this->compareGlobalStateSnapshotPart(
- $before->globalVariables(),
- $after->globalVariables(),
- "--- Global variables before the test\n+++ Global variables after the test\n"
- );
- $this->compareGlobalStateSnapshotPart(
- $before->superGlobalVariables(),
- $after->superGlobalVariables(),
- "--- Super-global variables before the test\n+++ Super-global variables after the test\n"
- );
- }
- if ($this->backupStaticAttributes) {
- $this->compareGlobalStateSnapshotPart(
- $before->staticAttributes(),
- $after->staticAttributes(),
- "--- Static attributes before the test\n+++ Static attributes after the test\n"
- );
- }
- }
- /**
- * @param array $before
- * @param array $after
- * @param string $header
- * @throws PHPUnit_Framework_RiskyTestError
- */
- private function compareGlobalStateSnapshotPart(array $before, array $after, $header)
- {
- if ($before != $after) {
- $differ = new Differ($header);
- $exporter = new Exporter;
- $diff = $differ->diff(
- $exporter->export($before),
- $exporter->export($after)
- );
- throw new PHPUnit_Framework_RiskyTestError(
- $diff
- );
- }
- }
- /**
- * @return Prophecy\Prophet
- * @since Method available since Release 4.5.0
- */
- private function getProphet()
- {
- if ($this->prophet === null) {
- $this->prophet = new Prophet;
- }
- return $this->prophet;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Exception for expectations which failed their check.
- *
- * The exception contains the error message and optionally a
- * SebastianBergmann\Comparator\ComparisonFailure which is used to
- * generate diff output of the failed expectations.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_ExpectationFailedException extends PHPUnit_Framework_AssertionFailedError
- {
- /**
- * @var SebastianBergmann\Comparator\ComparisonFailure
- */
- protected $comparisonFailure;
- public function __construct($message, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null, Exception $previous = null)
- {
- $this->comparisonFailure = $comparisonFailure;
- parent::__construct($message, 0, $previous);
- }
- /**
- * @return SebastianBergmann\Comparator\ComparisonFailure
- */
- public function getComparisonFailure()
- {
- return $this->comparisonFailure;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP errors.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.2.0
- */
- class PHPUnit_Framework_Error extends PHPUnit_Framework_Exception
- {
- /**
- * Constructor.
- *
- * @param string $message
- * @param integer $code
- * @param string $file
- * @param integer $line
- * @param Exception $previous
- */
- public function __construct($message, $code, $file, $line, Exception $previous = null)
- {
- parent::__construct($message, $code, $previous);
- $this->file = $file;
- $this->line = $line;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Exporter\Exporter;
- /**
- * Abstract base class for constraints. which are placed upon any value.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 3.0.0
- */
- abstract class PHPUnit_Framework_Constraint implements Countable, PHPUnit_Framework_SelfDescribing
- {
- protected $exporter;
- public function __construct()
- {
- $this->exporter = new Exporter;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = false;
- if ($this->matches($other)) {
- $success = true;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return false;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- return 1;
- }
- /**
- * Throws an exception for the given compared value and test description
- *
- * @param mixed $other Evaluated value or object.
- * @param string $description Additional information about the test
- * @param SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- protected function fail($other, $description, SebastianBergmann\Comparator\ComparisonFailure $comparisonFailure = null)
- {
- $failureDescription = sprintf(
- 'Failed asserting that %s.',
- $this->failureDescription($other)
- );
- $additionalFailureDescription = $this->additionalFailureDescription($other);
- if ($additionalFailureDescription) {
- $failureDescription .= "\n" . $additionalFailureDescription;
- }
- if (!empty($description)) {
- $failureDescription = $description . "\n" . $failureDescription;
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- $failureDescription,
- $comparisonFailure
- );
- }
- /**
- * Return additional failure description where needed
- *
- * The function can be overridden to provide additional failure
- * information like a diff
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function additionalFailureDescription($other)
- {
- return '';
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * To provide additional failure information additionalFailureDescription
- * can be used.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $this->exporter->export($other) . ' ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Thrown when an assertion failed.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_AssertionFailedError extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing
- {
- /**
- * Wrapper for getMessage() which is declared as final.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getMessage();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An incomplete test case
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Davey Shafik <me@daveyshafik.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_IncompleteTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var boolean
- */
- protected $backupGlobals = false;
- /**
- * @var boolean
- */
- protected $backupStaticAttributes = false;
- /**
- * @var boolean
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var boolean
- */
- protected $useErrorHandler = false;
- /**
- * @var boolean
- */
- protected $useOutputBuffering = false;
- /**
- * @param string $className
- * @param string $methodName
- * @param string $message
- */
- public function __construct($className, $methodName, $message = '')
- {
- $this->message = $message;
- parent::__construct($className . '::' . $methodName);
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->markTestIncomplete($this->message);
- }
- /**
- * @return string
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_TestSuite
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_TestSuite_DataProvider extends PHPUnit_Framework_TestSuite
- {
- /**
- * Sets the dependencies of a TestCase.
- *
- * @param array $dependencies
- */
- public function setDependencies(array $dependencies)
- {
- foreach ($this->tests as $test) {
- $test->setDependencies($dependencies);
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP deprecated errors.
- * You can disable deprecated-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Deprecated::$enabled = false;
- * </code>
- *
- * @package PHPUnit
- * @subpackage Framework_Error
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP notices.
- * You can disable notice-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Notice::$enabled = false;
- * </code>
- *
- * @package PHPUnit
- * @subpackage Framework_Error
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for PHP warnings.
- * You can disable notice-to-exception conversion by setting
- *
- * <code>
- * PHPUnit_Framework_Error_Warning::$enabled = false;
- * </code>
- *
- * @package PHPUnit
- * @subpackage Framework_Error
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error
- {
- public static $enabled = true;
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of an incomplete test.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test that is skipped because of an invalid @covers annotation.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_InvalidCoversTargetError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a skipped test suite.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestResult collects the results of executing a test case.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestResult implements Countable
- {
- /**
- * @var array
- */
- protected $passed = array();
- /**
- * @var array
- */
- protected $errors = array();
- /**
- * @var array
- */
- protected $failures = array();
- /**
- * @var array
- */
- protected $notImplemented = array();
- /**
- * @var array
- */
- protected $risky = array();
- /**
- * @var array
- */
- protected $skipped = array();
- /**
- * @var array
- */
- protected $listeners = array();
- /**
- * @var integer
- */
- protected $runTests = 0;
- /**
- * @var float
- */
- protected $time = 0;
- /**
- * @var PHPUnit_Framework_TestSuite
- */
- protected $topTestSuite = null;
- /**
- * Code Coverage information.
- *
- * @var PHP_CodeCoverage
- */
- protected $codeCoverage;
- /**
- * @var boolean
- */
- protected $convertErrorsToExceptions = true;
- /**
- * @var boolean
- */
- protected $stop = false;
- /**
- * @var boolean
- */
- protected $stopOnError = false;
- /**
- * @var boolean
- */
- protected $stopOnFailure = false;
- /**
- * @var boolean
- */
- protected $beStrictAboutTestsThatDoNotTestAnything = false;
- /**
- * @var boolean
- */
- protected $beStrictAboutOutputDuringTests = false;
- /**
- * @var boolean
- */
- protected $beStrictAboutTestSize = false;
- /**
- * @var boolean
- */
- protected $beStrictAboutTodoAnnotatedTests = false;
- /**
- * @var boolean
- */
- protected $stopOnRisky = false;
- /**
- * @var boolean
- */
- protected $stopOnIncomplete = false;
- /**
- * @var boolean
- */
- protected $stopOnSkipped = false;
- /**
- * @var boolean
- */
- protected $lastTestFailed = false;
- /**
- * @var integer
- */
- protected $timeoutForSmallTests = 1;
- /**
- * @var integer
- */
- protected $timeoutForMediumTests = 10;
- /**
- * @var integer
- */
- protected $timeoutForLargeTests = 60;
- /**
- * Registers a TestListener.
- *
- * @param PHPUnit_Framework_TestListener
- */
- public function addListener(PHPUnit_Framework_TestListener $listener)
- {
- $this->listeners[] = $listener;
- }
- /**
- * Unregisters a TestListener.
- *
- * @param PHPUnit_Framework_TestListener $listener
- */
- public function removeListener(PHPUnit_Framework_TestListener $listener)
- {
- foreach ($this->listeners as $key => $_listener) {
- if ($listener === $_listener) {
- unset($this->listeners[$key]);
- }
- }
- }
- /**
- * Flushes all flushable TestListeners.
- *
- * @since Method available since Release 3.0.0
- */
- public function flushListeners()
- {
- foreach ($this->listeners as $listener) {
- if ($listener instanceof PHPUnit_Util_Printer) {
- $listener->flush();
- }
- }
- }
- /**
- * Adds an error to the list of errors.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($e instanceof PHPUnit_Framework_RiskyTest) {
- $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addRiskyTest';
- if ($this->stopOnRisky) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
- $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addIncompleteTest';
- if ($this->stopOnIncomplete) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
- $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addSkippedTest';
- if ($this->stopOnSkipped) {
- $this->stop();
- }
- } else {
- $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addError';
- if ($this->stopOnError || $this->stopOnFailure) {
- $this->stop();
- }
- }
- foreach ($this->listeners as $listener) {
- $listener->$notifyMethod($test, $e, $time);
- }
- $this->lastTestFailed = true;
- $this->time += $time;
- }
- /**
- * Adds a failure to the list of failures.
- * The passed in exception caused the failure.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if ($e instanceof PHPUnit_Framework_RiskyTest ||
- $e instanceof PHPUnit_Framework_OutputError) {
- $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addRiskyTest';
- if ($this->stopOnRisky) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
- $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addIncompleteTest';
- if ($this->stopOnIncomplete) {
- $this->stop();
- }
- } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
- $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addSkippedTest';
- if ($this->stopOnSkipped) {
- $this->stop();
- }
- } else {
- $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e);
- $notifyMethod = 'addFailure';
- if ($this->stopOnFailure) {
- $this->stop();
- }
- }
- foreach ($this->listeners as $listener) {
- $listener->$notifyMethod($test, $e, $time);
- }
- $this->lastTestFailed = true;
- $this->time += $time;
- }
- /**
- * Informs the result that a testsuite will be started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- if ($this->topTestSuite === null) {
- $this->topTestSuite = $suite;
- }
- foreach ($this->listeners as $listener) {
- $listener->startTestSuite($suite);
- }
- }
- /**
- * Informs the result that a testsuite was completed.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- foreach ($this->listeners as $listener) {
- $listener->endTestSuite($suite);
- }
- }
- /**
- * Informs the result that a test will be started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->lastTestFailed = false;
- $this->runTests += count($test);
- foreach ($this->listeners as $listener) {
- $listener->startTest($test);
- }
- }
- /**
- * Informs the result that a test was completed.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- foreach ($this->listeners as $listener) {
- $listener->endTest($test, $time);
- }
- if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) {
- $class = get_class($test);
- $key = $class . '::' . $test->getName();
- $this->passed[$key] = array(
- 'result' => $test->getResult(),
- 'size' => PHPUnit_Util_Test::getSize(
- $class,
- $test->getName(false)
- )
- );
- $this->time += $time;
- }
- }
- /**
- * Returns true if no risky test occurred.
- *
- * @return boolean
- * @since Method available since Release 4.0.0
- */
- public function allHarmless()
- {
- return $this->riskyCount() == 0;
- }
- /**
- * Gets the number of risky tests.
- *
- * @return integer
- * @since Method available since Release 4.0.0
- */
- public function riskyCount()
- {
- return count($this->risky);
- }
- /**
- * Returns true if no incomplete test occurred.
- *
- * @return boolean
- */
- public function allCompletelyImplemented()
- {
- return $this->notImplementedCount() == 0;
- }
- /**
- * Gets the number of incomplete tests.
- *
- * @return integer
- */
- public function notImplementedCount()
- {
- return count($this->notImplemented);
- }
- /**
- * Returns an Enumeration for the risky tests.
- *
- * @return array
- * @since Method available since Release 4.0.0
- */
- public function risky()
- {
- return $this->risky;
- }
- /**
- * Returns an Enumeration for the incomplete tests.
- *
- * @return array
- */
- public function notImplemented()
- {
- return $this->notImplemented;
- }
- /**
- * Returns true if no test has been skipped.
- *
- * @return boolean
- * @since Method available since Release 3.0.0
- */
- public function noneSkipped()
- {
- return $this->skippedCount() == 0;
- }
- /**
- * Gets the number of skipped tests.
- *
- * @return integer
- * @since Method available since Release 3.0.0
- */
- public function skippedCount()
- {
- return count($this->skipped);
- }
- /**
- * Returns an Enumeration for the skipped tests.
- *
- * @return array
- * @since Method available since Release 3.0.0
- */
- public function skipped()
- {
- return $this->skipped;
- }
- /**
- * Gets the number of detected errors.
- *
- * @return integer
- */
- public function errorCount()
- {
- return count($this->errors);
- }
- /**
- * Returns an Enumeration for the errors.
- *
- * @return array
- */
- public function errors()
- {
- return $this->errors;
- }
- /**
- * Gets the number of detected failures.
- *
- * @return integer
- */
- public function failureCount()
- {
- return count($this->failures);
- }
- /**
- * Returns an Enumeration for the failures.
- *
- * @return array
- */
- public function failures()
- {
- return $this->failures;
- }
- /**
- * Returns the names of the tests that have passed.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function passed()
- {
- return $this->passed;
- }
- /**
- * Returns the (top) test suite.
- *
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.0.0
- */
- public function topTestSuite()
- {
- return $this->topTestSuite;
- }
- /**
- * Returns whether code coverage information should be collected.
- *
- * @return boolean If code coverage should be collected
- * @since Method available since Release 3.2.0
- */
- public function getCollectCodeCoverageInformation()
- {
- return $this->codeCoverage !== null;
- }
- /**
- * Runs a TestCase.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function run(PHPUnit_Framework_Test $test)
- {
- PHPUnit_Framework_Assert::resetCount();
- $error = false;
- $failure = false;
- $incomplete = false;
- $risky = false;
- $skipped = false;
- $this->startTest($test);
- $errorHandlerSet = false;
- if ($this->convertErrorsToExceptions) {
- $oldErrorHandler = set_error_handler(
- array('PHPUnit_Util_ErrorHandler', 'handleError'),
- E_ALL | E_STRICT
- );
- if ($oldErrorHandler === null) {
- $errorHandlerSet = true;
- } else {
- restore_error_handler();
- }
- }
- $collectCodeCoverage = $this->codeCoverage !== null &&
- !$test instanceof PHPUnit_Extensions_SeleniumTestCase &&
- !$test instanceof PHPUnit_Framework_Warning;
- if ($collectCodeCoverage) {
- // We need to blacklist test source files when no whitelist is used.
- if (!$this->codeCoverage->filter()->hasWhitelist()) {
- $classes = $this->getHierarchy(get_class($test), true);
- foreach ($classes as $class) {
- $this->codeCoverage->filter()->addFileToBlacklist(
- $class->getFileName()
- );
- }
- }
- $this->codeCoverage->start($test);
- }
- PHP_Timer::start();
- try {
- if (!$test instanceof PHPUnit_Framework_Warning &&
- $test->getSize() != PHPUnit_Util_Test::UNKNOWN &&
- $this->beStrictAboutTestSize &&
- extension_loaded('pcntl') && class_exists('PHP_Invoker')) {
- switch ($test->getSize()) {
- case PHPUnit_Util_Test::SMALL: {
- $_timeout = $this->timeoutForSmallTests;
- }
- break;
- case PHPUnit_Util_Test::MEDIUM: {
- $_timeout = $this->timeoutForMediumTests;
- }
- break;
- case PHPUnit_Util_Test::LARGE: {
- $_timeout = $this->timeoutForLargeTests;
- }
- break;
- }
- $invoker = new PHP_Invoker;
- $invoker->invoke(array($test, 'runBare'), array(), $_timeout);
- } else {
- $test->runBare();
- }
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $failure = true;
- if ($e instanceof PHPUnit_Framework_RiskyTestError) {
- $risky = true;
- } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) {
- $incomplete = true;
- } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) {
- $skipped = true;
- }
- } catch (PHPUnit_Framework_Exception $e) {
- $error = true;
- } catch (Exception $e) {
- $e = new PHPUnit_Framework_ExceptionWrapper($e);
- $error = true;
- }
- $time = PHP_Timer::stop();
- $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
- if ($this->beStrictAboutTestsThatDoNotTestAnything &&
- $test->getNumAssertions() == 0) {
- $risky = true;
- }
- if ($collectCodeCoverage) {
- $append = !$risky && !$incomplete && !$skipped;
- $linesToBeCovered = array();
- $linesToBeUsed = array();
- if ($append && $test instanceof PHPUnit_Framework_TestCase) {
- $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered(
- get_class($test),
- $test->getName(false)
- );
- $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed(
- get_class($test),
- $test->getName(false)
- );
- }
- try {
- $this->codeCoverage->stop(
- $append,
- $linesToBeCovered,
- $linesToBeUsed
- );
- } catch (PHP_CodeCoverage_Exception_UnintentionallyCoveredCode $cce) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_UnintentionallyCoveredCodeError(
- 'This test executed code that is not listed as code to be covered or used:' .
- PHP_EOL . $cce->getMessage()
- ),
- $time
- );
- } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_InvalidCoversTargetError(
- $cce->getMessage()
- ),
- $time
- );
- } catch (PHP_CodeCoverage_Exception $cce) {
- $error = true;
- if (!isset($e)) {
- $e = $cce;
- }
- }
- }
- if ($errorHandlerSet === true) {
- restore_error_handler();
- }
- if ($error === true) {
- $this->addError($test, $e, $time);
- } elseif ($failure === true) {
- $this->addFailure($test, $e, $time);
- } elseif ($this->beStrictAboutTestsThatDoNotTestAnything &&
- $test->getNumAssertions() == 0) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_RiskyTestError(
- 'This test did not perform any assertions'
- ),
- $time
- );
- } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_OutputError(
- sprintf(
- 'This test printed output: %s',
- $test->getActualOutput()
- )
- ),
- $time
- );
- } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof PHPUnit_Framework_TestCase) {
- $annotations = $test->getAnnotations();
- if (isset($annotations['method']['todo'])) {
- $this->addFailure(
- $test,
- new PHPUnit_Framework_RiskyTestError(
- 'Test method is annotated with @todo'
- ),
- $time
- );
- }
- }
- $this->endTest($test, $time);
- }
- /**
- * Gets the number of run tests.
- *
- * @return integer
- */
- public function count()
- {
- return $this->runTests;
- }
- /**
- * Checks whether the test run should stop.
- *
- * @return boolean
- */
- public function shouldStop()
- {
- return $this->stop;
- }
- /**
- * Marks that the test run should stop.
- *
- */
- public function stop()
- {
- $this->stop = true;
- }
- /**
- * Returns the PHP_CodeCoverage object.
- *
- * @return PHP_CodeCoverage
- * @since Method available since Release 3.5.0
- */
- public function getCodeCoverage()
- {
- return $this->codeCoverage;
- }
- /**
- * Sets the PHP_CodeCoverage object.
- *
- * @param PHP_CodeCoverage $codeCoverage
- * @since Method available since Release 3.6.0
- */
- public function setCodeCoverage(PHP_CodeCoverage $codeCoverage)
- {
- $this->codeCoverage = $codeCoverage;
- }
- /**
- * Enables or disables the error-to-exception conversion.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.2.14
- */
- public function convertErrorsToExceptions($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->convertErrorsToExceptions = $flag;
- }
- /**
- * Returns the error-to-exception conversion setting.
- *
- * @return boolean
- * @since Method available since Release 3.4.0
- */
- public function getConvertErrorsToExceptions()
- {
- return $this->convertErrorsToExceptions;
- }
- /**
- * Enables or disables the stopping when an error occurs.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- public function stopOnError($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnError = $flag;
- }
- /**
- * Enables or disables the stopping when a failure occurs.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- public function stopOnFailure($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnFailure = $flag;
- }
- /**
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutTestsThatDoNotTestAnything($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTestsThatDoNotTestAnything = $flag;
- }
- /**
- * @return boolean
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutTestsThatDoNotTestAnything()
- {
- return $this->beStrictAboutTestsThatDoNotTestAnything;
- }
- /**
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutOutputDuringTests($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutOutputDuringTests = $flag;
- }
- /**
- * @return boolean
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutOutputDuringTests()
- {
- return $this->beStrictAboutOutputDuringTests;
- }
- /**
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function beStrictAboutTestSize($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTestSize = $flag;
- }
- /**
- * @return boolean
- * @since Method available since Release 4.0.0
- */
- public function isStrictAboutTestSize()
- {
- return $this->beStrictAboutTestSize;
- }
- /**
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.2.0
- */
- public function beStrictAboutTodoAnnotatedTests($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->beStrictAboutTodoAnnotatedTests = $flag;
- }
- /**
- * @return boolean
- * @since Method available since Release 4.2.0
- */
- public function isStrictAboutTodoAnnotatedTests()
- {
- return $this->beStrictAboutTodoAnnotatedTests;
- }
- /**
- * Enables or disables the stopping for risky tests.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 4.0.0
- */
- public function stopOnRisky($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnRisky = $flag;
- }
- /**
- * Enables or disables the stopping for incomplete tests.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.0
- */
- public function stopOnIncomplete($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnIncomplete = $flag;
- }
- /**
- * Enables or disables the stopping for skipped tests.
- *
- * @param boolean $flag
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.1.0
- */
- public function stopOnSkipped($flag)
- {
- if (!is_bool($flag)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- $this->stopOnSkipped = $flag;
- }
- /**
- * Returns the time spent running the tests.
- *
- * @return float
- */
- public function time()
- {
- return $this->time;
- }
- /**
- * Returns whether the entire test was successful or not.
- *
- * @return boolean
- */
- public function wasSuccessful()
- {
- return empty($this->errors) && empty($this->failures);
- }
- /**
- * Sets the timeout for small tests.
- *
- * @param integer $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForSmallTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForSmallTests = $timeout;
- }
- /**
- * Sets the timeout for medium tests.
- *
- * @param integer $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForMediumTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForMediumTests = $timeout;
- }
- /**
- * Sets the timeout for large tests.
- *
- * @param integer $timeout
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.6.0
- */
- public function setTimeoutForLargeTests($timeout)
- {
- if (!is_integer($timeout)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
- }
- $this->timeoutForLargeTests = $timeout;
- }
- /**
- * Returns the class hierarchy for a given class.
- *
- * @param string $className
- * @param boolean $asReflectionObjects
- * @return array
- */
- protected function getHierarchy($className, $asReflectionObjects = false)
- {
- if ($asReflectionObjects) {
- $classes = array(new ReflectionClass($className));
- } else {
- $classes = array($className);
- }
- $done = false;
- while (!$done) {
- if ($asReflectionObjects) {
- $class = new ReflectionClass(
- $classes[count($classes)-1]->getName()
- );
- } else {
- $class = new ReflectionClass($classes[count($classes)-1]);
- }
- $parent = $class->getParentClass();
- if ($parent !== false) {
- if ($asReflectionObjects) {
- $classes[] = $parent;
- } else {
- $classes[] = $parent->getName();
- }
- } else {
- $done = true;
- }
- }
- return $classes;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestFailure collects a failed test together with the caught exception.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_TestFailure
- {
- /**
- * @var string
- */
- private $testName;
- /**
- * @var PHPUnit_Framework_Test|null
- */
- protected $failedTest;
- /**
- * @var Exception
- */
- protected $thrownException;
- /**
- * Constructs a TestFailure with the given test and exception.
- *
- * @param PHPUnit_Framework_Test $failedTest
- * @param Exception $thrownException
- */
- public function __construct(PHPUnit_Framework_Test $failedTest, Exception $thrownException)
- {
- if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) {
- $this->testName = $failedTest->toString();
- } else {
- $this->testName = get_class($failedTest);
- }
- if (!$failedTest instanceof PHPUnit_Framework_TestCase || !$failedTest->isInIsolation()) {
- $this->failedTest = $failedTest;
- }
- $this->thrownException = $thrownException;
- }
- /**
- * Returns a short description of the failure.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- '%s: %s',
- $this->testName,
- $this->thrownException->getMessage()
- );
- }
- /**
- * Returns a description for the thrown exception.
- *
- * @return string
- * @since Method available since Release 3.4.0
- */
- public function getExceptionAsString()
- {
- return self::exceptionToString($this->thrownException);
- }
- /**
- * Returns a description for an exception.
- *
- * @param Exception $e
- * @return string
- * @since Method available since Release 3.2.0
- */
- public static function exceptionToString(Exception $e)
- {
- if ($e instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $e->toString();
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException && $e->getComparisonFailure()) {
- $buffer = $buffer . $e->getComparisonFailure()->getDiff();
- }
- if (!empty($buffer)) {
- $buffer = trim($buffer) . "\n";
- }
- } elseif ($e instanceof PHPUnit_Framework_Error) {
- $buffer = $e->getMessage() . "\n";
- } elseif ($e instanceof PHPUnit_Framework_ExceptionWrapper) {
- $buffer = $e->getClassname() . ': ' . $e->getMessage() . "\n";
- } else {
- $buffer = get_class($e) . ': ' . $e->getMessage() . "\n";
- }
- return $buffer;
- }
- /**
- * Returns the name of the failing test (including data set, if any).
- *
- * @return string
- * @since Method available since Release 4.3.0
- */
- public function getTestName()
- {
- return $this->testName;
- }
- /**
- * Returns the failing test.
- *
- * Note: The test object is not set when the test is executed in process
- * isolation.
- *
- * @see PHPUnit_Framework_Exception
- *
- * @return PHPUnit_Framework_Test|null
- */
- public function failedTest()
- {
- return $this->failedTest;
- }
- /**
- * Gets the thrown exception.
- *
- * @return Exception
- */
- public function thrownException()
- {
- return $this->thrownException;
- }
- /**
- * Returns the exception's message.
- *
- * @return string
- */
- public function exceptionMessage()
- {
- return $this->thrownException()->getMessage();
- }
- /**
- * Returns true if the thrown exception
- * is of type AssertionFailedError.
- *
- * @return boolean
- */
- public function isFailure()
- {
- return ($this->thrownException() instanceof PHPUnit_Framework_AssertionFailedError);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A marker interface for marking any exception/error as result of an unit
- * test as incomplete implementation or currently not implemented.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Framework_IncompleteTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A skipped test case
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Davey Shafik <me@daveyshafik.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_SkippedTestCase extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var boolean
- */
- protected $backupGlobals = false;
- /**
- * @var boolean
- */
- protected $backupStaticAttributes = false;
- /**
- * @var boolean
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var boolean
- */
- protected $useErrorHandler = false;
- /**
- * @var boolean
- */
- protected $useOutputBuffering = false;
- /**
- * @param string $message
- */
- public function __construct($className, $methodName, $message = '')
- {
- $this->message = $message;
- parent::__construct($className . '::' . $methodName);
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->markTestSkipped($this->message);
- }
- /**
- * @return string
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->getName();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the class it is evaluated for has a given
- * attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_ClassHasAttribute extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $attributeName;
- /**
- * @param string $attributeName
- */
- public function __construct($attributeName)
- {
- parent::__construct();
- $this->attributeName = $attributeName;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $class = new ReflectionClass($other);
- return $class->hasProperty($this->attributeName);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'has attribute "%s"',
- $this->attributeName
- );
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%sclass "%s" %s',
- is_object($other) ? 'object of ' : '',
- is_object($other) ? get_class($other) : $other,
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the Traversable it is applied to contains
- * a given value.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_TraversableContains extends PHPUnit_Framework_Constraint
- {
- /**
- * @var boolean
- */
- protected $checkForObjectIdentity;
- /**
- * @var boolean
- */
- protected $checkForNonObjectIdentity;
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @param mixed $value
- * @param boolean $checkForObjectIdentity
- * @param boolean $checkForNonObjectIdentity
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($value, $checkForObjectIdentity = true, $checkForNonObjectIdentity = false)
- {
- parent::__construct();
- if (!is_bool($checkForObjectIdentity)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
- }
- if (!is_bool($checkForNonObjectIdentity)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean');
- }
- $this->checkForObjectIdentity = $checkForObjectIdentity;
- $this->checkForNonObjectIdentity = $checkForNonObjectIdentity;
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($other instanceof SplObjectStorage) {
- return $other->contains($this->value);
- }
- if (is_object($this->value)) {
- foreach ($other as $element) {
- if (($this->checkForObjectIdentity &&
- $element === $this->value) ||
- (!$this->checkForObjectIdentity &&
- $element == $this->value)) {
- return true;
- }
- }
- } else {
- foreach ($other as $element) {
- if (($this->checkForNonObjectIdentity &&
- $element === $this->value) ||
- (!$this->checkForNonObjectIdentity &&
- $element == $this->value)) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if (is_string($this->value) && strpos($this->value, "\n") !== false) {
- return 'contains "' . $this->value . '"';
- } else {
- return 'contains ' . $this->exporter->export($this->value);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s %s',
- is_array($other) ? 'an array' : 'a traversable',
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_ExceptionCode extends PHPUnit_Framework_Constraint
- {
- /**
- * @var integer
- */
- protected $expectedCode;
- /**
- * @param integer $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedCode = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return boolean
- */
- protected function matches($other)
- {
- return (string) $other->getCode() == (string) $this->expectedCode;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s is equal to expected exception code %s',
- $this->exporter->export($other->getCode()),
- $this->exporter->export($this->expectedCode)
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'exception code is ';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_Exception extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $className;
- /**
- * @param string $className
- */
- public function __construct($className)
- {
- parent::__construct();
- $this->className = $className;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other instanceof $this->className;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- if ($other !== null) {
- $message = '';
- if ($other instanceof Exception) {
- $message = '. Message was: "' . $other->getMessage() . '" at'
- . "\n" . $other->getTraceAsString();
- }
- return sprintf(
- 'exception of type "%s" matches expected exception "%s"%s',
- get_class($other),
- $this->className,
- $message
- );
- }
- return sprintf(
- 'exception of type "%s" is thrown',
- $this->className
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'exception of type "%s"',
- $this->className
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_Constraint_SameSize extends PHPUnit_Framework_Constraint_Count
- {
- /**
- * @var integer
- */
- protected $expectedCount;
- /**
- * @param integer $expected
- */
- public function __construct($expected)
- {
- parent::__construct($this->getCountOf($expected));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Asserts whether or not two JSON objects are equal.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Bastian Feder <php@bastian-feder.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.7.0
- */
- class PHPUnit_Framework_Constraint_JsonMatches extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $value;
- /**
- * Creates a new constraint.
- *
- * @param string $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * This method can be overridden to implement the evaluation algorithm.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $decodedOther = json_decode($other);
- if (json_last_error()) {
- return false;
- }
- $decodedValue = json_decode($this->value);
- if (json_last_error()) {
- return false;
- }
- return $decodedOther == $decodedValue;
- }
- /**
- * Returns a string representation of the object.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'matches JSON string "%s"',
- $this->value
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the object it is evaluated for is an instance
- * of a given class.
- *
- * The expected class name is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsInstanceOf extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $className;
- /**
- * @param string $className
- */
- public function __construct($className)
- {
- parent::__construct();
- $this->className = $className;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return ($other instanceof $this->className);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- '%s is an instance of %s "%s"',
- $this->exporter->shortenedExport($other),
- $this->getType(),
- $this->className
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is instance of %s "%s"',
- $this->getType(),
- $this->className
- );
- }
- private function getType()
- {
- try {
- $reflection = new ReflectionClass($this->className);
- if ($reflection->isInterface()) {
- return 'interface';
- }
- } catch (ReflectionException $e) {
- }
- return 'class';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the object it is evaluated for has a given
- * attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_ObjectHasAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $object = new ReflectionObject($other);
- return $object->hasProperty($this->attributeName);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is of a
- * specified type.
- *
- * The expected value is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsType extends PHPUnit_Framework_Constraint
- {
- const TYPE_ARRAY = 'array';
- const TYPE_BOOL = 'bool';
- const TYPE_FLOAT = 'float';
- const TYPE_INT = 'int';
- const TYPE_NULL = 'null';
- const TYPE_NUMERIC = 'numeric';
- const TYPE_OBJECT = 'object';
- const TYPE_RESOURCE = 'resource';
- const TYPE_STRING = 'string';
- const TYPE_SCALAR = 'scalar';
- const TYPE_CALLABLE = 'callable';
- /**
- * @var array
- */
- protected $types = array(
- 'array' => true,
- 'boolean' => true,
- 'bool' => true,
- 'double' => true,
- 'float' => true,
- 'integer' => true,
- 'int' => true,
- 'null' => true,
- 'numeric' => true,
- 'object' => true,
- 'resource' => true,
- 'string' => true,
- 'scalar' => true,
- 'callable' => true
- );
- /**
- * @var string
- */
- protected $type;
- /**
- * @param string $type
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($type)
- {
- parent::__construct();
- if (!isset($this->types[$type])) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Type specified for PHPUnit_Framework_Constraint_IsType <%s> ' .
- 'is not a valid type.',
- $type
- )
- );
- }
- $this->type = $type;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- switch ($this->type) {
- case 'numeric': {
- return is_numeric($other);
- }
- case 'integer':
- case 'int': {
- return is_integer($other);
- }
- case 'double':
- case 'float': {
- return is_float($other);
- }
- case 'string': {
- return is_string($other);
- }
- case 'boolean':
- case 'bool': {
- return is_bool($other);
- }
- case 'null': {
- return is_null($other);
- }
- case 'array': {
- return is_array($other);
- }
- case 'object': {
- return is_object($other);
- }
- case 'resource': {
- return is_resource($other) || is_string(@get_resource_type($other));
- }
- case 'scalar': {
- return is_scalar($other);
- }
- case 'callable': {
- return is_callable($other);
- }
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'is of type "%s"',
- $this->type
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is less than
- * a given value.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_LessThan extends PHPUnit_Framework_Constraint
- {
- /**
- * @var numeric
- */
- protected $value;
- /**
- * @param numeric $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $this->value > $other;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is less than ' . $this->exporter->export($this->value);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the array it is evaluated for has a specified subset.
- *
- * Uses array_replace_recursive() to check if a key value subset is part of the
- * subject array.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Márcio Almada <marcio3w@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.4.0
- */
- class PHPUnit_Framework_Constraint_ArraySubset extends PHPUnit_Framework_Constraint
- {
- /**
- * @var array|ArrayAccess
- */
- protected $subset;
- /**
- * @var boolean
- */
- protected $strict;
- /**
- * @param array|ArrayAccess $subset
- * @param boolean $strict Check for object identity
- */
- public function __construct($subset, $strict = false)
- {
- parent::__construct();
- $this->strict = $strict;
- $this->subset = $subset;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param array|ArrayAccess $other Array or ArrayAcess object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $patched = array_replace_recursive($other, $this->subset);
- if ($this->strict) {
- return $other === $patched;
- } else {
- return $other == $patched;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'has the subset ' . $this->exporter->export($this->subset);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return 'an array ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts true.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === true;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is true';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that a string is valid JSON.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.7.20
- */
- class PHPUnit_Framework_Constraint_IsJson extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- json_decode($other);
- if (json_last_error()) {
- return false;
- }
- return true;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- json_decode($other);
- $error = PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
- json_last_error()
- );
- return sprintf(
- '%s is valid JSON (%s)',
- $this->exporter->shortenedExport($other),
- $error
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is valid JSON';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks if one value is equal to another.
- *
- * Equality is checked with PHP's == operator, the operator is explained in
- * detail at {@url http://www.php.net/manual/en/types.comparisons.php}.
- * Two values are equal if they have the same value disregarding type.
- *
- * The expected value is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Kore Nordmann <kn@ez.no>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsEqual extends PHPUnit_Framework_Constraint
- {
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @var float
- */
- protected $delta = 0.0;
- /**
- * @var integer
- */
- protected $maxDepth = 10;
- /**
- * @var boolean
- */
- protected $canonicalize = false;
- /**
- * @var boolean
- */
- protected $ignoreCase = false;
- /**
- * @var SebastianBergmann\Comparator\ComparisonFailure
- */
- protected $lastFailure;
- /**
- * @param mixed $value
- * @param float $delta
- * @param integer $maxDepth
- * @param boolean $canonicalize
- * @param boolean $ignoreCase
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($value, $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
- {
- parent::__construct();
- if (!is_numeric($delta)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'numeric');
- }
- if (!is_int($maxDepth)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'integer');
- }
- if (!is_bool($canonicalize)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
- }
- if (!is_bool($ignoreCase)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'boolean');
- }
- $this->value = $value;
- $this->delta = $delta;
- $this->maxDepth = $maxDepth;
- $this->canonicalize = $canonicalize;
- $this->ignoreCase = $ignoreCase;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- // If $this->value and $other are identical, they are also equal.
- // This is the most common path and will allow us to skip
- // initialization of all the comparators.
- if ($this->value === $other) {
- return true;
- }
- $comparatorFactory = SebastianBergmann\Comparator\Factory::getInstance();
- try {
- $comparator = $comparatorFactory->getComparatorFor(
- $this->value,
- $other
- );
- $comparator->assertEquals(
- $this->value,
- $other,
- $this->delta,
- $this->canonicalize,
- $this->ignoreCase
- );
- } catch (SebastianBergmann\Comparator\ComparisonFailure $f) {
- if ($returnResult) {
- return false;
- }
- throw new PHPUnit_Framework_ExpectationFailedException(
- trim($description . "\n" . $f->getMessage()),
- $f
- );
- }
- return true;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $delta = '';
- if (is_string($this->value)) {
- if (strpos($this->value, "\n") !== false) {
- return 'is equal to <text>';
- } else {
- return sprintf(
- 'is equal to <string:%s>',
- $this->value
- );
- }
- } else {
- if ($this->delta != 0) {
- $delta = sprintf(
- ' with delta <%F>',
- $this->delta
- );
- }
- return sprintf(
- 'is equal to %s%s',
- $this->exporter->export($this->value),
- $delta
- );
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical XOR.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- $lastResult = null;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- $result = $constraint->evaluate($other, $description, true);
- if ($result === $lastResult) {
- $success = false;
- break;
- }
- $lastResult = $result;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' xor ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Provides human readable messages for each JSON error.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Bastian Feder <php@bastian-feder.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.7.0
- */
- class PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider
- {
- /**
- * Translates JSON error to a human readable string.
- *
- * @param string $error
- * @param string $prefix
- * @return string
- */
- public static function determineJsonError($error, $prefix = '')
- {
- switch ($error) {
- case JSON_ERROR_NONE:
- return;
- case JSON_ERROR_DEPTH:
- return $prefix . 'Maximum stack depth exceeded';
- case JSON_ERROR_STATE_MISMATCH:
- return $prefix . 'Underflow or the modes mismatch';
- case JSON_ERROR_CTRL_CHAR:
- return $prefix . 'Unexpected control character found';
- case JSON_ERROR_SYNTAX:
- return $prefix . 'Syntax error, malformed JSON';
- case JSON_ERROR_UTF8:
- return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded';
- default:
- return $prefix . 'Unknown error';
- }
- }
- /**
- * Translates a given type to a human readable message prefix.
- *
- * @param string $type
- * @return string
- */
- public static function translateTypeToPrefix($type)
- {
- switch (strtolower($type)) {
- case 'expected':
- $prefix = 'Expected value JSON decode error - ';
- break;
- case 'actual':
- $prefix = 'Actual value JSON decode error - ';
- break;
- default:
- $prefix = '';
- break;
- }
- return $prefix;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Diff\Differ;
- /**
- * ...
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch
- {
- /**
- * @var string
- */
- protected $string;
- /**
- * @param string $string
- */
- public function __construct($string)
- {
- parent::__construct($string);
- $this->pattern = $this->createPatternFromFormat(
- preg_replace('/\r\n/', "\n", $string)
- );
- $this->string = $string;
- }
- protected function failureDescription($other)
- {
- return "format description matches text";
- }
- protected function additionalFailureDescription($other)
- {
- $from = preg_split('(\r\n|\r|\n)', $this->string);
- $to = preg_split('(\r\n|\r|\n)', $other);
- foreach ($from as $index => $line) {
- if (isset($to[$index]) && $line !== $to[$index]) {
- $line = $this->createPatternFromFormat($line);
- if (preg_match($line, $to[$index]) > 0) {
- $from[$index] = $to[$index];
- }
- }
- }
- $this->string = implode("\n", $from);
- $other = implode("\n", $to);
- $differ = new Differ("--- Expected\n+++ Actual\n");
- return $differ->diff($this->string, $other);
- }
- protected function createPatternFromFormat($string)
- {
- $string = str_replace(
- array(
- '%e',
- '%s',
- '%S',
- '%a',
- '%A',
- '%w',
- '%i',
- '%d',
- '%x',
- '%f',
- '%c'
- ),
- array(
- '\\' . DIRECTORY_SEPARATOR,
- '[^\r\n]+',
- '[^\r\n]*',
- '.+',
- '.*',
- '\s*',
- '[+-]?\d+',
- '\d+',
- '[0-9a-fA-F]+',
- '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?',
- '.'
- ),
- preg_quote($string, '/')
- );
- return '/^' . $string . '$/s';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical NOT.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Not extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @param PHPUnit_Framework_Constraint $constraint
- */
- public function __construct($constraint)
- {
- parent::__construct();
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint);
- }
- $this->constraint = $constraint;
- }
- /**
- * @param string $string
- * @return string
- */
- public static function negate($string)
- {
- return str_replace(
- array(
- 'contains ',
- 'exists',
- 'has ',
- 'is ',
- 'are ',
- 'matches ',
- 'starts with ',
- 'ends with ',
- 'reference ',
- 'not not '
- ),
- array(
- 'does not contain ',
- 'does not exist',
- 'does not have ',
- 'is not ',
- 'are not ',
- 'does not match ',
- 'starts not with ',
- 'ends not with ',
- 'don\'t reference ',
- 'not '
- ),
- $string
- );
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = !$this->constraint->evaluate($other, $description, true);
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- switch (get_class($this->constraint)) {
- case 'PHPUnit_Framework_Constraint_And':
- case 'PHPUnit_Framework_Constraint_Not':
- case 'PHPUnit_Framework_Constraint_Or': {
- return 'not( ' . $this->constraint->failureDescription($other) . ' )';
- }
- break;
- default: {
- return self::negate(
- $this->constraint->failureDescription($other)
- );
- }
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- switch (get_class($this->constraint)) {
- case 'PHPUnit_Framework_Constraint_And':
- case 'PHPUnit_Framework_Constraint_Not':
- case 'PHPUnit_Framework_Constraint_Or': {
- return 'not( ' . $this->constraint->toString() . ' )';
- }
- break;
- default: {
- return self::negate(
- $this->constraint->toString()
- );
- }
- }
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- return count($this->constraint);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Márcio Almada <marcio3w@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.3.0
- */
- class PHPUnit_Framework_Constraint_ExceptionMessageRegExp extends PHPUnit_Framework_Constraint
- {
- /**
- * @var integer
- */
- protected $expectedMessageRegExp;
- /**
- * @param string $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedMessageRegExp = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return boolean
- */
- protected function matches($other)
- {
- $match = PHPUnit_Util_Regex::pregMatchSafe($this->expectedMessageRegExp, $other->getMessage());
- if (false === $match) {
- throw new PHPUnit_Framework_Exception(
- "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'"
- );
- }
- return 1 === $match;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- "exception message '%s' matches '%s'",
- $other->getMessage(),
- $this->expectedMessageRegExp
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return "exception message matches ";
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the value it is evaluated for is greater
- * than a given value.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_GreaterThan extends PHPUnit_Framework_Constraint
- {
- /**
- * @var numeric
- */
- protected $value;
- /**
- * @param numeric $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $this->value < $other;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is greater than ' . $this->exporter->export($this->value);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.6
- */
- class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Constraint
- {
- /**
- * @var integer
- */
- protected $expectedMessage;
- /**
- * @param string $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedMessage = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param Exception $other
- * @return boolean
- */
- protected function matches($other)
- {
- return strpos($other->getMessage(), $this->expectedMessage) !== false;
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- "exception message '%s' contains '%s'",
- $other->getMessage(),
- $this->expectedMessage
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return 'exception message contains ';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that evaluates against a specified closure.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Timon Rapp <timon@zaeda.net>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- */
- class PHPUnit_Framework_Constraint_Callback extends PHPUnit_Framework_Constraint
- {
- private $callback;
- /**
- * @param callable $callback
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($callback)
- {
- if (!is_callable($callback)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 1,
- 'callable'
- );
- }
- parent::__construct();
- $this->callback = $callback;
- }
- /**
- * Evaluates the constraint for parameter $value. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return call_user_func($this->callback, $other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is accepted by specified callback';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the array it is evaluated for has a given key.
- *
- * Uses array_key_exists() to check if the key is found in the input array, if
- * not found the evaluation fails.
- *
- * The array key is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_ArrayHasKey extends PHPUnit_Framework_Constraint
- {
- /**
- * @var integer|string
- */
- protected $key;
- /**
- * @param integer|string $key
- */
- public function __construct($key)
- {
- parent::__construct();
- $this->key = $key;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if (is_array($other)) {
- return array_key_exists($this->key, $other);
- }
- if ($other instanceof ArrayAccess) {
- return $other->offsetExists($this->key);
- }
- return false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'has the key ' . $this->exporter->export($this->key);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return 'an array ' . $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for contains
- * a given string.
- *
- * Uses strpos() to find the position of the string in the input, if not found
- * the evaluation fails.
- *
- * The sub-string is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_StringContains extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $string;
- /**
- * @var boolean
- */
- protected $ignoreCase;
- /**
- * @param string $string
- * @param boolean $ignoreCase
- */
- public function __construct($string, $ignoreCase = false)
- {
- parent::__construct();
- $this->string = $string;
- $this->ignoreCase = $ignoreCase;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($this->ignoreCase) {
- return stripos($other, $this->string) !== false;
- } else {
- return strpos($other, $this->string) !== false;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if ($this->ignoreCase) {
- $string = strtolower($this->string);
- } else {
- $string = $this->string;
- }
- return sprintf(
- 'contains "%s"',
- $string
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the Traversable it is applied to contains
- * only values of a given type.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Framework_Constraint_TraversableContainsOnly extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $constraint;
- /**
- * @var string
- */
- protected $type;
- /**
- * @param string $type
- * @param boolean $isNativeType
- */
- public function __construct($type, $isNativeType = true)
- {
- parent::__construct();
- if ($isNativeType) {
- $this->constraint = new PHPUnit_Framework_Constraint_IsType($type);
- } else {
- $this->constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
- $type
- );
- }
- $this->type = $type;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- foreach ($other as $item) {
- if (!$this->constraint->evaluate($item, '', true)) {
- $success = false;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'contains only values of type "' . $this->type . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks whether a variable is empty().
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.5.0
- */
- class PHPUnit_Framework_Constraint_IsEmpty extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- if ($other instanceof Countable) {
- return count($other) === 0;
- }
- return empty($other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is empty';
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- $type = gettype($other);
- return sprintf(
- '%s %s %s',
- $type[0] == 'a' || $type[0] == 'o' ? 'an' : 'a',
- $type,
- $this->toString()
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for matches
- * a regular expression.
- *
- * Checks a given value using the Perl Compatible Regular Expression extension
- * in PHP. The pattern is matched by executing preg_match().
- *
- * The pattern string passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_PCREMatch extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $pattern;
- /**
- * @param string $pattern
- */
- public function __construct($pattern)
- {
- parent::__construct();
- $this->pattern = $pattern;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return preg_match($this->pattern, $other) > 0;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'matches PCRE pattern "%s"',
- $this->pattern
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts null.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsNull extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === null;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is null';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_Attribute extends PHPUnit_Framework_Constraint_Composite
- {
- /**
- * @var string
- */
- protected $attributeName;
- /**
- * @param PHPUnit_Framework_Constraint $constraint
- * @param string $attributeName
- */
- public function __construct(PHPUnit_Framework_Constraint $constraint, $attributeName)
- {
- parent::__construct($constraint);
- $this->attributeName = $attributeName;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- return parent::evaluate(
- PHPUnit_Framework_Assert::readAttribute(
- $other,
- $this->attributeName
- ),
- $description,
- $returnResult
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'attribute "' . $this->attributeName . '" ' .
- $this->innerConstraint->toString();
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return $this->toString();
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts false.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Framework_Constraint_IsFalse extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return $other === false;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is false';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the class it is evaluated for has a given
- * static attribute.
- *
- * The attribute name is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Framework_Constraint_ClassHasStaticAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- $class = new ReflectionClass($other);
- if ($class->hasProperty($this->attributeName)) {
- $attribute = $class->getProperty($this->attributeName);
- return $attribute->isStatic();
- } else {
- return false;
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- * @since Method available since Release 3.3.0
- */
- public function toString()
- {
- return sprintf(
- 'has static attribute "%s"',
- $this->attributeName
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical OR.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_Or extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- $constraint = new PHPUnit_Framework_Constraint_IsEqual(
- $constraint
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = false;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- if ($constraint->evaluate($other, $description, true)) {
- $success = true;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' or ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that one value is identical to another.
- *
- * Identical check is performed with PHP's === operator, the operator is
- * explained in detail at
- * {@url http://www.php.net/manual/en/types.comparisons.php}.
- * Two values are identical if they have the same value and are of the same
- * type.
- *
- * The expected value is passed in the constructor.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsIdentical extends PHPUnit_Framework_Constraint
- {
- /**
- * @var float
- */
- const EPSILON = 0.0000000001;
- /**
- * @var mixed
- */
- protected $value;
- /**
- * @param mixed $value
- */
- public function __construct($value)
- {
- parent::__construct();
- $this->value = $value;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- if (is_double($this->value) && is_double($other) &&
- !is_infinite($this->value) && !is_infinite($other) &&
- !is_nan($this->value) && !is_nan($other)) {
- $success = abs($this->value - $other) < self::EPSILON;
- } else {
- $success = $this->value === $other;
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $f = null;
- // if both values are strings, make sure a diff is generated
- if (is_string($this->value) && is_string($other)) {
- $f = new SebastianBergmann\Comparator\ComparisonFailure(
- $this->value,
- $other,
- $this->value,
- $other
- );
- }
- $this->fail($other, $description, $f);
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- if (is_object($this->value) && is_object($other)) {
- return 'two variables reference the same object';
- }
- if (is_string($this->value) && is_string($other)) {
- return 'two strings are identical';
- }
- return parent::failureDescription($other);
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- if (is_object($this->value)) {
- return 'is identical to an object of class "' .
- get_class($this->value) . '"';
- } else {
- return 'is identical to ' .
- $this->exporter->export($this->value);
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that checks if the file(name) that it is evaluated for exists.
- *
- * The file path to check is passed as $other in evaluate().
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_FileExists extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return file_exists($other);
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- 'file "%s" exists',
- $other
- );
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'file exists';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- abstract class PHPUnit_Framework_Constraint_Composite extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $innerConstraint;
- /**
- * @param PHPUnit_Framework_Constraint $innerConstraint
- */
- public function __construct(PHPUnit_Framework_Constraint $innerConstraint)
- {
- parent::__construct();
- $this->innerConstraint = $innerConstraint;
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- try {
- return $this->innerConstraint->evaluate(
- $other,
- $description,
- $returnResult
- );
- } catch (PHPUnit_Framework_ExpectationFailedException $e) {
- $this->fail($other, $description);
- }
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- */
- public function count()
- {
- return count($this->innerConstraint);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for begins with a
- * given prefix.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Constraint_StringStartsWith extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $prefix;
- /**
- * @param string $prefix
- */
- public function __construct($prefix)
- {
- parent::__construct();
- $this->prefix = $prefix;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return strpos($other, $this->prefix) === 0;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'starts with "' . $this->prefix . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that asserts that the string it is evaluated for ends with a given
- * suffix.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Framework_Constraint_StringEndsWith extends PHPUnit_Framework_Constraint
- {
- /**
- * @var string
- */
- protected $suffix;
- /**
- * @param string $suffix
- */
- public function __construct($suffix)
- {
- parent::__construct();
- $this->suffix = $suffix;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other Value or object to evaluate.
- * @return bool
- */
- protected function matches($other)
- {
- return substr($other, 0 - strlen($this->suffix)) == $this->suffix;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'ends with "' . $this->suffix . '"';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Constraint that accepts any input value.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_IsAnything extends PHPUnit_Framework_Constraint
- {
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- return $returnResult ? true : null;
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- return 'is anything';
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.5.0
- */
- public function count()
- {
- return 0;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Framework_Constraint_Count extends PHPUnit_Framework_Constraint
- {
- /**
- * @var integer
- */
- protected $expectedCount = 0;
- /**
- * @param integer $expected
- */
- public function __construct($expected)
- {
- parent::__construct();
- $this->expectedCount = $expected;
- }
- /**
- * Evaluates the constraint for parameter $other. Returns true if the
- * constraint is met, false otherwise.
- *
- * @param mixed $other
- * @return boolean
- */
- protected function matches($other)
- {
- return $this->expectedCount === $this->getCountOf($other);
- }
- /**
- * @param mixed $other
- * @return boolean
- */
- protected function getCountOf($other)
- {
- if ($other instanceof Countable || is_array($other)) {
- return count($other);
- } elseif ($other instanceof Traversable) {
- if ($other instanceof IteratorAggregate) {
- $iterator = $other->getIterator();
- } else {
- $iterator = $other;
- }
- $key = $iterator->key();
- $count = iterator_count($iterator);
- // manually rewind $iterator to previous key, since iterator_count
- // moves pointer
- if ($key !== null) {
- $iterator->rewind();
- while ($iterator->valid() && $key !== $iterator->key()) {
- $iterator->next();
- }
- }
- return $count;
- }
- }
- /**
- * Returns the description of the failure
- *
- * The beginning of failure messages is "Failed asserting that" in most
- * cases. This method should return the second part of that sentence.
- *
- * @param mixed $other Evaluated value or object.
- * @return string
- */
- protected function failureDescription($other)
- {
- return sprintf(
- 'actual size %d matches expected size %d',
- $this->getCountOf($other),
- $this->expectedCount
- );
- }
- /**
- * @return string
- */
- public function toString()
- {
- return sprintf(
- 'count matches %d',
- $this->expectedCount
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Logical AND.
- *
- * @package PHPUnit
- * @subpackage Framework_Constraint
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @author Bernhard Schussek <bschussek@2bepublished.at>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_Constraint_And extends PHPUnit_Framework_Constraint
- {
- /**
- * @var PHPUnit_Framework_Constraint[]
- */
- protected $constraints = array();
- /**
- * @var PHPUnit_Framework_Constraint
- */
- protected $lastConstraint = null;
- /**
- * @param PHPUnit_Framework_Constraint[] $constraints
- * @throws PHPUnit_Framework_Exception
- */
- public function setConstraints(array $constraints)
- {
- $this->constraints = array();
- foreach ($constraints as $constraint) {
- if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
- throw new PHPUnit_Framework_Exception(
- 'All parameters to ' . __CLASS__ .
- ' must be a constraint object.'
- );
- }
- $this->constraints[] = $constraint;
- }
- }
- /**
- * Evaluates the constraint for parameter $other
- *
- * If $returnResult is set to false (the default), an exception is thrown
- * in case of a failure. null is returned otherwise.
- *
- * If $returnResult is true, the result of the evaluation is returned as
- * a boolean value instead: true in case of success, false in case of a
- * failure.
- *
- * @param mixed $other Value or object to evaluate.
- * @param string $description Additional information about the test
- * @param bool $returnResult Whether to return a result or throw an exception
- * @return mixed
- * @throws PHPUnit_Framework_ExpectationFailedException
- */
- public function evaluate($other, $description = '', $returnResult = false)
- {
- $success = true;
- $constraint = null;
- foreach ($this->constraints as $constraint) {
- if (!$constraint->evaluate($other, $description, true)) {
- $success = false;
- break;
- }
- }
- if ($returnResult) {
- return $success;
- }
- if (!$success) {
- $this->fail($other, $description);
- }
- }
- /**
- * Returns a string representation of the constraint.
- *
- * @return string
- */
- public function toString()
- {
- $text = '';
- foreach ($this->constraints as $key => $constraint) {
- if ($key > 0) {
- $text .= ' and ';
- }
- $text .= $constraint->toString();
- }
- return $text;
- }
- /**
- * Counts the number of constraint elements.
- *
- * @return integer
- * @since Method available since Release 3.4.0
- */
- public function count()
- {
- $count = 0;
- foreach ($this->constraints as $constraint) {
- $count += count($constraint);
- }
- return $count;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An empty Listener that can be extended to implement TestListener
- * with just a few lines of code.
- * @see PHPUnit_Framework_TestListener for documentation on the API methods.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Giorgio Sironi<info@giorgiosironi.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- abstract class PHPUnit_Framework_BaseTestListener implements PHPUnit_Framework_TestListener
- {
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- }
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- public function startTest(PHPUnit_Framework_Test $test)
- {
- }
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a skipped test.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
- * case of a test test that unintentionally covers code.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Framework_UnintentionallyCoveredCodeError extends PHPUnit_Framework_RiskyTestError
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A warning.
- *
- * @package PHPUnit
- * @subpackage Framework
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Framework_Warning extends PHPUnit_Framework_TestCase
- {
- /**
- * @var string
- */
- protected $message = '';
- /**
- * @var boolean
- */
- protected $backupGlobals = false;
- /**
- * @var boolean
- */
- protected $backupStaticAttributes = false;
- /**
- * @var boolean
- */
- protected $runTestInSeparateProcess = false;
- /**
- * @var boolean
- */
- protected $useErrorHandler = false;
- /**
- * @param string $message
- */
- public function __construct($message = '')
- {
- $this->message = $message;
- parent::__construct('Warning');
- }
- /**
- * @throws PHPUnit_Framework_Exception
- */
- protected function runTest()
- {
- $this->fail($this->message);
- }
- /**
- * @return string
- * @since Method available since Release 3.0.0
- */
- public function getMessage()
- {
- return $this->message;
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- * @since Method available since Release 3.4.0
- */
- public function toString()
- {
- return 'Warning';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * We have a TestSuite object A.
- * In TestSuite object A we have Tests tagged with @group.
- * We want a TestSuite object B that contains TestSuite objects C, D, ...
- * for the Tests tagged with @group C, @group D, ...
- * Running the Tests from TestSuite object B results in Tests tagged with both
- * @group C and @group D in TestSuite object A to be run twice .
- *
- * <code>
- * $suite = new PHPUnit_Extensions_GroupTestSuite($A, array('C', 'D'));
- * </code>
- *
- * @package PHPUnit
- * @subpackage Extensions
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Extensions_GroupTestSuite extends PHPUnit_Framework_TestSuite
- {
- public function __construct(PHPUnit_Framework_TestSuite $suite, array $groups)
- {
- $groupSuites = array();
- $name = $suite->getName();
- foreach ($groups as $group) {
- $groupSuites[$group] = new PHPUnit_Framework_TestSuite($name . ' - ' . $group);
- $this->addTest($groupSuites[$group]);
- }
- $tests = new RecursiveIteratorIterator(
- new PHPUnit_Util_TestSuiteIterator($suite),
- RecursiveIteratorIterator::LEAVES_ONLY
- );
- foreach ($tests as $test) {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $testGroups = PHPUnit_Util_Test::getGroups(
- get_class($test),
- $test->getName(false)
- );
- foreach ($groups as $group) {
- foreach ($testGroups as $testGroup) {
- if ($group == $testGroup) {
- $groupSuites[$group]->addTest($test);
- }
- }
- }
- }
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Suite for .phpt test cases.
- *
- * @package PHPUnit
- * @subpackage Extensions_PhptTestCase
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Extensions_PhptTestSuite extends PHPUnit_Framework_TestSuite
- {
- /**
- * Constructs a new TestSuite for .phpt test cases.
- *
- * @param string $directory
- * @param array $options Array with ini settings for the php instance run,
- * key being the name if the setting, value the ini value.
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($directory, array $options = array())
- {
- if (is_string($directory) && is_dir($directory)) {
- $this->setName($directory);
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray($directory, '.phpt');
- foreach ($files as $file) {
- $this->addTestFile($file, $options);
- }
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'directory name');
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Decorator that runs a test repeatedly.
- *
- * @package PHPUnit
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator
- {
- /**
- * @var mixed
- */
- protected $filter = false;
- /**
- * @var array
- */
- protected $groups = array();
- /**
- * @var array
- */
- protected $excludeGroups = array();
- /**
- * @var boolean
- */
- protected $processIsolation = false;
- /**
- * @var integer
- */
- protected $timesRepeat = 1;
- /**
- * @param PHPUnit_Framework_Test $test
- * @param integer $timesRepeat
- * @param boolean $processIsolation
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1, $processIsolation = false)
- {
- parent::__construct($test);
- if (is_integer($timesRepeat) &&
- $timesRepeat >= 0) {
- $this->timesRepeat = $timesRepeat;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 2,
- 'positive integer'
- );
- }
- $this->processIsolation = $processIsolation;
- }
- /**
- * Counts the number of test cases that
- * will be run by this test.
- *
- * @return integer
- */
- public function count()
- {
- return $this->timesRepeat * count($this->test);
- }
- /**
- * Runs the decorated test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- //@codingStandardsIgnoreStart
- for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) {
- //@codingStandardsIgnoreEnd
- if ($this->test instanceof PHPUnit_Framework_TestSuite) {
- $this->test->setRunTestInSeparateProcess($this->processIsolation);
- }
- $this->test->run($result);
- }
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for test listeners that interact with an issue tracker.
- *
- * @package PHPUnit
- * @subpackage Extensions_TicketListener
- * @author Sean Coates <sean@caedmon.net>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- abstract class PHPUnit_Extensions_TicketListener implements PHPUnit_Framework_TestListener
- {
- /**
- * @var array
- */
- protected $ticketCounts = array();
- /**
- * @var boolean
- */
- protected $ran = false;
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- }
- /**
- * A test suite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test suite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($this->ran) {
- return;
- }
- $name = $test->getName(false);
- $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
- foreach ($tickets as $ticket) {
- $this->ticketCounts[$ticket][$name] = 1;
- }
- $this->ran = true;
- }
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $ifStatus = array('assigned', 'new', 'reopened');
- $newStatus = 'closed';
- $message = 'Automatically closed by PHPUnit (test passed).';
- $resolution = 'fixed';
- $cumulative = true;
- } elseif ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
- $ifStatus = array('closed');
- $newStatus = 'reopened';
- $message = 'Automatically reopened by PHPUnit (test failed).';
- $resolution = '';
- $cumulative = false;
- } else {
- return;
- }
- $name = $test->getName(false);
- $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
- foreach ($tickets as $ticket) {
- // Remove this test from the totals (if it passed).
- if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- unset($this->ticketCounts[$ticket][$name]);
- }
- // Only close tickets if ALL referenced cases pass
- // but reopen tickets if a single test fails.
- if ($cumulative) {
- // Determine number of to-pass tests:
- if (count($this->ticketCounts[$ticket]) > 0) {
- // There exist remaining test cases with this reference.
- $adjustTicket = false;
- } else {
- // No remaining tickets, go ahead and adjust.
- $adjustTicket = true;
- }
- } else {
- $adjustTicket = true;
- }
- $ticketInfo = $this->getTicketInfo($ticket);
- if ($adjustTicket && in_array($ticketInfo['status'], $ifStatus)) {
- $this->updateTicket($ticket, $newStatus, $message, $resolution);
- }
- }
- }
- }
- abstract protected function getTicketInfo($ticketId = null);
- abstract protected function updateTicket($ticketId, $newStatus, $message, $resolution);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Decorator for Tests.
- *
- * Use TestDecorator as the base class for defining new
- * test decorators. Test decorator subclasses can be introduced
- * to add behaviour before or after a test is run.
- *
- * @package PHPUnit
- * @subpackage Extensions
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * The Test to be decorated.
- *
- * @var object
- */
- protected $test = null;
- /**
- * Constructor.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function __construct(PHPUnit_Framework_Test $test)
- {
- $this->test = $test;
- }
- /**
- * Returns a string representation of the test.
- *
- * @return string
- */
- public function toString()
- {
- return $this->test->toString();
- }
- /**
- * Runs the test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- */
- public function basicRun(PHPUnit_Framework_TestResult $result)
- {
- $this->test->run($result);
- }
- /**
- * Counts the number of test cases that
- * will be run by this test.
- *
- * @return integer
- */
- public function count()
- {
- return count($this->test);
- }
- /**
- * Creates a default TestResult object.
- *
- * @return PHPUnit_Framework_TestResult
- */
- protected function createResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- /**
- * Returns the test to be run.
- *
- * @return PHPUnit_Framework_Test
- */
- public function getTest()
- {
- return $this->test;
- }
- /**
- * Runs the decorated test and collects the
- * result in a TestResult.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- if ($result === null) {
- $result = $this->createResult();
- }
- $this->basicRun($result);
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Runner for PHPT test cases.
- *
- * @package PHPUnit
- * @subpackage Extensions_PhptTestCase
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.4
- */
- class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
- {
- /**
- * @var string
- */
- private $filename;
- /**
- * @var array
- */
- private $settings = array(
- 'allow_url_fopen=1',
- 'auto_append_file=',
- 'auto_prepend_file=',
- 'disable_functions=',
- 'display_errors=1',
- 'docref_root=',
- 'docref_ext=.html',
- 'error_append_string=',
- 'error_prepend_string=',
- 'error_reporting=-1',
- 'html_errors=0',
- 'log_errors=0',
- 'magic_quotes_runtime=0',
- 'output_handler=',
- 'open_basedir=',
- 'output_buffering=Off',
- 'report_memleaks=0',
- 'report_zend_debug=0',
- 'safe_mode=0',
- 'track_errors=1',
- 'xdebug.default_enable=0'
- );
- /**
- * Constructs a test case with the given filename.
- *
- * @param string $filename
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($filename)
- {
- if (!is_string($filename)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
- }
- if (!is_file($filename)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'File "%s" does not exist.',
- $filename
- )
- );
- }
- $this->filename = $filename;
- }
- /**
- * Counts the number of test cases executed by run(TestResult result).
- *
- * @return integer
- */
- public function count()
- {
- return 1;
- }
- /**
- * Runs a test and collects its result in a TestResult instance.
- *
- * @param PHPUnit_Framework_TestResult $result
- * @return PHPUnit_Framework_TestResult
- */
- public function run(PHPUnit_Framework_TestResult $result = null)
- {
- $sections = $this->parse();
- $code = $this->render($sections['FILE']);
- if ($result === null) {
- $result = new PHPUnit_Framework_TestResult;
- }
- $php = PHPUnit_Util_PHP::factory();
- $skip = false;
- $time = 0;
- $settings = $this->settings;
- $result->startTest($this);
- if (isset($sections['INI'])) {
- $settings = array_merge($settings, $this->parseIniSection($sections['INI']));
- }
- if (isset($sections['SKIPIF'])) {
- $jobResult = $php->runJob($sections['SKIPIF'], $settings);
- if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) {
- if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $message)) {
- $message = substr($message[1], 2);
- } else {
- $message = '';
- }
- $result->addFailure($this, new PHPUnit_Framework_SkippedTestError($message), 0);
- $skip = true;
- }
- }
- if (!$skip) {
- PHP_Timer::start();
- $jobResult = $php->runJob($code, $settings);
- $time = PHP_Timer::stop();
- if (isset($sections['EXPECT'])) {
- $assertion = 'assertEquals';
- $expected = $sections['EXPECT'];
- } else {
- $assertion = 'assertStringMatchesFormat';
- $expected = $sections['EXPECTF'];
- }
- $output = preg_replace('/\r\n/', "\n", trim($jobResult['stdout']));
- $expected = preg_replace('/\r\n/', "\n", trim($expected));
- try {
- PHPUnit_Framework_Assert::$assertion($expected, $output);
- } catch (PHPUnit_Framework_AssertionFailedError $e) {
- $result->addFailure($this, $e, $time);
- } catch (Exception $e) {
- $result->addError($this, $e, $time);
- }
- }
- $result->endTest($this, $time);
- return $result;
- }
- /**
- * Returns the name of the test case.
- *
- * @return string
- */
- public function getName()
- {
- return $this->toString();
- }
- /**
- * Returns a string representation of the test case.
- *
- * @return string
- */
- public function toString()
- {
- return $this->filename;
- }
- /**
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- private function parse()
- {
- $sections = array();
- $section = '';
- foreach (file($this->filename) as $line) {
- if (preg_match('/^--([_A-Z]+)--/', $line, $result)) {
- $section = $result[1];
- $sections[$section] = '';
- continue;
- } elseif (empty($section)) {
- throw new PHPUnit_Framework_Exception('Invalid PHPT file');
- }
- $sections[$section] .= $line;
- }
- if (!isset($sections['FILE']) ||
- (!isset($sections['EXPECT']) && !isset($sections['EXPECTF']))) {
- throw new PHPUnit_Framework_Exception('Invalid PHPT file');
- }
- return $sections;
- }
- /**
- * @param string $code
- * @return string
- */
- private function render($code)
- {
- return str_replace(
- array(
- '__DIR__',
- '__FILE__'
- ),
- array(
- "'" . dirname($this->filename) . "'",
- "'" . $this->filename . "'"
- ),
- $code
- );
- }
- /**
- * Parse --INI-- section key value pairs and return as array.
- *
- * @param string
- * @return array
- */
- protected function parseIniSection($content)
- {
- return preg_split('/\n|\r/', $content, -1, PREG_SPLIT_NO_EMPTY);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestRunner for the Command Line Interface (CLI)
- * PHP SAPI Module.
- *
- * @package PHPUnit
- * @subpackage TextUI
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_TextUI_Command
- {
- /**
- * @var array
- */
- protected $arguments = array(
- 'listGroups' => false,
- 'loader' => null,
- 'useDefaultConfiguration' => true
- );
- /**
- * @var array
- */
- protected $options = array();
- /**
- * @var array
- */
- protected $longOptions = array(
- 'colors==' => null,
- 'bootstrap=' => null,
- 'columns=' => null,
- 'configuration=' => null,
- 'coverage-clover=' => null,
- 'coverage-crap4j=' => null,
- 'coverage-html=' => null,
- 'coverage-php=' => null,
- 'coverage-text==' => null,
- 'coverage-xml=' => null,
- 'debug' => null,
- 'exclude-group=' => null,
- 'filter=' => null,
- 'testsuite=' => null,
- 'group=' => null,
- 'help' => null,
- 'include-path=' => null,
- 'list-groups' => null,
- 'loader=' => null,
- 'log-json=' => null,
- 'log-junit=' => null,
- 'log-tap=' => null,
- 'process-isolation' => null,
- 'repeat=' => null,
- 'stderr' => null,
- 'stop-on-error' => null,
- 'stop-on-failure' => null,
- 'stop-on-incomplete' => null,
- 'stop-on-risky' => null,
- 'stop-on-skipped' => null,
- 'report-useless-tests' => null,
- 'strict-coverage' => null,
- 'disallow-test-output' => null,
- 'enforce-time-limit' => null,
- 'disallow-todo-tests' => null,
- 'strict-global-state' => null,
- 'strict' => null,
- 'tap' => null,
- 'testdox' => null,
- 'testdox-html=' => null,
- 'testdox-text=' => null,
- 'test-suffix=' => null,
- 'no-configuration' => null,
- 'no-globals-backup' => null,
- 'printer=' => null,
- 'static-backup' => null,
- 'verbose' => null,
- 'version' => null
- );
- /**
- * @var boolean
- */
- private $versionStringPrinted = false;
- /**
- * @param boolean $exit
- */
- public static function main($exit = true)
- {
- $command = new static;
- return $command->run($_SERVER['argv'], $exit);
- }
- /**
- * @param array $argv
- * @param boolean $exit
- * @return integer
- */
- public function run(array $argv, $exit = true)
- {
- $this->handleArguments($argv);
- $runner = $this->createRunner();
- if (is_object($this->arguments['test']) &&
- $this->arguments['test'] instanceof PHPUnit_Framework_Test) {
- $suite = $this->arguments['test'];
- } else {
- $suite = $runner->getTest(
- $this->arguments['test'],
- $this->arguments['testFile'],
- $this->arguments['testSuffixes']
- );
- }
- if ($this->arguments['listGroups']) {
- $this->printVersionString();
- print "Available test group(s):\n";
- $groups = $suite->getGroups();
- sort($groups);
- foreach ($groups as $group) {
- print " - $group\n";
- }
- if ($exit) {
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- } else {
- return PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
- }
- }
- unset($this->arguments['test']);
- unset($this->arguments['testFile']);
- try {
- $result = $runner->doRun($suite, $this->arguments);
- } catch (PHPUnit_Framework_Exception $e) {
- print $e->getMessage() . "\n";
- }
- $ret = PHPUnit_TextUI_TestRunner::FAILURE_EXIT;
- if (isset($result) && $result->wasSuccessful()) {
- $ret = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
- } elseif (!isset($result) || $result->errorCount() > 0) {
- $ret = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT;
- }
- if ($exit) {
- exit($ret);
- } else {
- return $ret;
- }
- }
- /**
- * Create a TestRunner, override in subclasses.
- *
- * @return PHPUnit_TextUI_TestRunner
- * @since Method available since Release 3.6.0
- */
- protected function createRunner()
- {
- return new PHPUnit_TextUI_TestRunner($this->arguments['loader']);
- }
- /**
- * Handles the command-line arguments.
- *
- * A child class of PHPUnit_TextUI_Command can hook into the argument
- * parsing by adding the switch(es) to the $longOptions array and point to a
- * callback method that handles the switch(es) in the child class like this
- *
- * <code>
- * <?php
- * class MyCommand extends PHPUnit_TextUI_Command
- * {
- * public function __construct()
- * {
- * // my-switch won't accept a value, it's an on/off
- * $this->longOptions['my-switch'] = 'myHandler';
- * // my-secondswitch will accept a value - note the equals sign
- * $this->longOptions['my-secondswitch='] = 'myOtherHandler';
- * }
- *
- * // --my-switch -> myHandler()
- * protected function myHandler()
- * {
- * }
- *
- * // --my-secondswitch foo -> myOtherHandler('foo')
- * protected function myOtherHandler ($value)
- * {
- * }
- *
- * // You will also need this - the static keyword in the
- * // PHPUnit_TextUI_Command will mean that it'll be
- * // PHPUnit_TextUI_Command that gets instantiated,
- * // not MyCommand
- * public static function main($exit = true)
- * {
- * $command = new static;
- *
- * return $command->run($_SERVER['argv'], $exit);
- * }
- *
- * }
- * </code>
- *
- * @param array $argv
- */
- protected function handleArguments(array $argv)
- {
- if (defined('__PHPUNIT_PHAR__')) {
- $this->longOptions['selfupdate'] = null;
- $this->longOptions['self-update'] = null;
- }
- try {
- $this->options = PHPUnit_Util_Getopt::getopt(
- $argv,
- 'd:c:hv',
- array_keys($this->longOptions)
- );
- } catch (PHPUnit_Framework_Exception $e) {
- $this->showError($e->getMessage());
- }
- foreach ($this->options[0] as $option) {
- switch ($option[0]) {
- case '--colors':
- $this->arguments['colors'] = $option[1] ?: PHPUnit_TextUI_ResultPrinter::COLOR_AUTO;
- break;
- case '--bootstrap':
- $this->arguments['bootstrap'] = $option[1];
- break;
- case '--columns':
- if (is_numeric($option[1])) {
- $this->arguments['columns'] = (int) $option[1];
- } elseif ($option[1] == 'max') {
- $this->arguments['columns'] = 'max';
- }
- break;
- case 'c':
- case '--configuration':
- $this->arguments['configuration'] = $option[1];
- break;
- case '--coverage-clover':
- $this->arguments['coverageClover'] = $option[1];
- break;
- case '--coverage-crap4j':
- $this->arguments['coverageCrap4J'] = $option[1];
- break;
- case '--coverage-html':
- $this->arguments['coverageHtml'] = $option[1];
- break;
- case '--coverage-php':
- $this->arguments['coveragePHP'] = $option[1];
- break;
- case '--coverage-text':
- if ($option[1] === null) {
- $option[1] = 'php://stdout';
- }
- $this->arguments['coverageText'] = $option[1];
- $this->arguments['coverageTextShowUncoveredFiles'] = false;
- $this->arguments['coverageTextShowOnlySummary'] = false;
- break;
- case '--coverage-xml':
- $this->arguments['coverageXml'] = $option[1];
- break;
- case 'd':
- $ini = explode('=', $option[1]);
- if (isset($ini[0])) {
- if (isset($ini[1])) {
- ini_set($ini[0], $ini[1]);
- } else {
- ini_set($ini[0], true);
- }
- }
- break;
- case '--debug':
- $this->arguments['debug'] = true;
- break;
- case 'h':
- case '--help':
- $this->showHelp();
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- break;
- case '--filter':
- $this->arguments['filter'] = $option[1];
- break;
- case '--testsuite':
- $this->arguments['testsuite'] = $option[1];
- break;
- case '--group':
- $this->arguments['groups'] = explode(',', $option[1]);
- break;
- case '--exclude-group':
- $this->arguments['excludeGroups'] = explode(
- ',',
- $option[1]
- );
- break;
- case '--test-suffix':
- $this->arguments['testSuffixes'] = explode(
- ',',
- $option[1]
- );
- break;
- case '--include-path':
- $includePath = $option[1];
- break;
- case '--list-groups':
- $this->arguments['listGroups'] = true;
- break;
- case '--printer':
- $this->arguments['printer'] = $option[1];
- break;
- case '--loader':
- $this->arguments['loader'] = $option[1];
- break;
- case '--log-json':
- $this->arguments['jsonLogfile'] = $option[1];
- break;
- case '--log-junit':
- $this->arguments['junitLogfile'] = $option[1];
- break;
- case '--log-tap':
- $this->arguments['tapLogfile'] = $option[1];
- break;
- case '--process-isolation':
- $this->arguments['processIsolation'] = true;
- break;
- case '--repeat':
- $this->arguments['repeat'] = (int) $option[1];
- break;
- case '--stderr':
- $this->arguments['stderr'] = true;
- break;
- case '--stop-on-error':
- $this->arguments['stopOnError'] = true;
- break;
- case '--stop-on-failure':
- $this->arguments['stopOnFailure'] = true;
- break;
- case '--stop-on-incomplete':
- $this->arguments['stopOnIncomplete'] = true;
- break;
- case '--stop-on-risky':
- $this->arguments['stopOnRisky'] = true;
- break;
- case '--stop-on-skipped':
- $this->arguments['stopOnSkipped'] = true;
- break;
- case '--tap':
- $this->arguments['printer'] = 'PHPUnit_Util_Log_TAP';
- break;
- case '--testdox':
- $this->arguments['printer'] = 'PHPUnit_Util_TestDox_ResultPrinter_Text';
- break;
- case '--testdox-html':
- $this->arguments['testdoxHTMLFile'] = $option[1];
- break;
- case '--testdox-text':
- $this->arguments['testdoxTextFile'] = $option[1];
- break;
- case '--no-configuration':
- $this->arguments['useDefaultConfiguration'] = false;
- break;
- case '--no-globals-backup':
- $this->arguments['backupGlobals'] = false;
- break;
- case '--static-backup':
- $this->arguments['backupStaticAttributes'] = true;
- break;
- case 'v':
- case '--verbose':
- $this->arguments['verbose'] = true;
- break;
- case '--version':
- $this->printVersionString();
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- break;
- case '--report-useless-tests':
- $this->arguments['reportUselessTests'] = true;
- break;
- case '--strict-coverage':
- $this->arguments['strictCoverage'] = true;
- break;
- case '--strict-global-state':
- $this->arguments['disallowChangesToGlobalState'] = true;
- break;
- case '--disallow-test-output':
- $this->arguments['disallowTestOutput'] = true;
- break;
- case '--enforce-time-limit':
- $this->arguments['enforceTimeLimit'] = true;
- break;
- case '--disallow-todo-tests':
- $this->arguments['disallowTodoAnnotatedTests'] = true;
- break;
- case '--strict':
- $this->arguments['reportUselessTests'] = true;
- $this->arguments['strictCoverage'] = true;
- $this->arguments['disallowTestOutput'] = true;
- $this->arguments['enforceTimeLimit'] = true;
- $this->arguments['disallowTodoAnnotatedTests'] = true;
- $this->arguments['deprecatedStrictModeOption'] = true;
- break;
- case '--selfupdate':
- case '--self-update':
- $this->handleSelfUpdate();
- break;
- default:
- $optionName = str_replace('--', '', $option[0]);
- if (isset($this->longOptions[$optionName])) {
- $handler = $this->longOptions[$optionName];
- } elseif (isset($this->longOptions[$optionName . '='])) {
- $handler = $this->longOptions[$optionName . '='];
- }
- if (isset($handler) && is_callable(array($this, $handler))) {
- $this->$handler($option[1]);
- }
- }
- }
- $this->handleCustomTestSuite();
- if (!isset($this->arguments['test'])) {
- if (isset($this->options[1][0])) {
- $this->arguments['test'] = $this->options[1][0];
- }
- if (isset($this->options[1][1])) {
- $this->arguments['testFile'] = realpath($this->options[1][1]);
- } else {
- $this->arguments['testFile'] = '';
- }
- if (isset($this->arguments['test']) &&
- is_file($this->arguments['test']) &&
- substr($this->arguments['test'], -5, 5) != '.phpt') {
- $this->arguments['testFile'] = realpath($this->arguments['test']);
- $this->arguments['test'] = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.'));
- }
- }
- if (!isset($this->arguments['testSuffixes'])) {
- $this->arguments['testSuffixes'] = array('Test.php', '.phpt');
- }
- if (isset($includePath)) {
- ini_set(
- 'include_path',
- $includePath . PATH_SEPARATOR . ini_get('include_path')
- );
- }
- if ($this->arguments['loader'] !== null) {
- $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']);
- }
- if (isset($this->arguments['configuration']) &&
- is_dir($this->arguments['configuration'])) {
- $configurationFile = $this->arguments['configuration'] . '/phpunit.xml';
- if (file_exists($configurationFile)) {
- $this->arguments['configuration'] = realpath(
- $configurationFile
- );
- } elseif (file_exists($configurationFile . '.dist')) {
- $this->arguments['configuration'] = realpath(
- $configurationFile . '.dist'
- );
- }
- } elseif (!isset($this->arguments['configuration']) &&
- $this->arguments['useDefaultConfiguration']) {
- if (file_exists('phpunit.xml')) {
- $this->arguments['configuration'] = realpath('phpunit.xml');
- } elseif (file_exists('phpunit.xml.dist')) {
- $this->arguments['configuration'] = realpath(
- 'phpunit.xml.dist'
- );
- }
- }
- if (isset($this->arguments['configuration'])) {
- try {
- $configuration = PHPUnit_Util_Configuration::getInstance(
- $this->arguments['configuration']
- );
- } catch (Exception $e) {
- print $e->getMessage() . "\n";
- exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
- }
- $phpunit = $configuration->getPHPUnitConfiguration();
- $configuration->handlePHPConfiguration();
- /**
- * Issue #1216
- */
- if (isset($this->arguments['bootstrap'])) {
- $this->handleBootstrap($this->arguments['bootstrap']);
- } elseif (isset($phpunit['bootstrap'])) {
- $this->handleBootstrap($phpunit['bootstrap']);
- }
- /**
- * Issue #657
- */
- if (isset($phpunit['stderr']) && ! isset($this->arguments['stderr'])) {
- $this->arguments['stderr'] = $phpunit['stderr'];
- }
- if (isset($phpunit['printerClass'])) {
- if (isset($phpunit['printerFile'])) {
- $file = $phpunit['printerFile'];
- } else {
- $file = '';
- }
- $this->arguments['printer'] = $this->handlePrinter(
- $phpunit['printerClass'],
- $file
- );
- }
- if (isset($phpunit['testSuiteLoaderClass'])) {
- if (isset($phpunit['testSuiteLoaderFile'])) {
- $file = $phpunit['testSuiteLoaderFile'];
- } else {
- $file = '';
- }
- $this->arguments['loader'] = $this->handleLoader(
- $phpunit['testSuiteLoaderClass'],
- $file
- );
- }
- $browsers = $configuration->getSeleniumBrowserConfiguration();
- if (!empty($browsers)) {
- $this->arguments['deprecatedSeleniumConfiguration'] = true;
- if (class_exists('PHPUnit_Extensions_SeleniumTestCase')) {
- PHPUnit_Extensions_SeleniumTestCase::$browsers = $browsers;
- }
- }
- if (!isset($this->arguments['test'])) {
- $testSuite = $configuration->getTestSuiteConfiguration(isset($this->arguments['testsuite']) ? $this->arguments['testsuite'] : null);
- if ($testSuite !== null) {
- $this->arguments['test'] = $testSuite;
- }
- }
- } elseif (isset($this->arguments['bootstrap'])) {
- $this->handleBootstrap($this->arguments['bootstrap']);
- }
- if (isset($this->arguments['printer']) &&
- is_string($this->arguments['printer'])) {
- $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']);
- }
- if (isset($this->arguments['test']) && is_string($this->arguments['test']) && substr($this->arguments['test'], -5, 5) == '.phpt') {
- $test = new PHPUnit_Extensions_PhptTestCase($this->arguments['test']);
- $this->arguments['test'] = new PHPUnit_Framework_TestSuite;
- $this->arguments['test']->addTest($test);
- }
- if (!isset($this->arguments['test']) ||
- (isset($this->arguments['testDatabaseLogRevision']) && !isset($this->arguments['testDatabaseDSN']))) {
- $this->showHelp();
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- }
- /**
- * Handles the loading of the PHPUnit_Runner_TestSuiteLoader implementation.
- *
- * @param string $loaderClass
- * @param string $loaderFile
- * @return PHPUnit_Runner_TestSuiteLoader
- */
- protected function handleLoader($loaderClass, $loaderFile = '')
- {
- if (!class_exists($loaderClass, false)) {
- if ($loaderFile == '') {
- $loaderFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $loaderClass
- );
- }
- $loaderFile = stream_resolve_include_path($loaderFile);
- if ($loaderFile) {
- require $loaderFile;
- }
- }
- if (class_exists($loaderClass, false)) {
- $class = new ReflectionClass($loaderClass);
- if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') &&
- $class->isInstantiable()) {
- return $class->newInstance();
- }
- }
- if ($loaderClass == 'PHPUnit_Runner_StandardTestSuiteLoader') {
- return;
- }
- $this->showError(
- sprintf(
- 'Could not use "%s" as loader.',
- $loaderClass
- )
- );
- }
- /**
- * Handles the loading of the PHPUnit_Util_Printer implementation.
- *
- * @param string $printerClass
- * @param string $printerFile
- * @return PHPUnit_Util_Printer
- */
- protected function handlePrinter($printerClass, $printerFile = '')
- {
- if (!class_exists($printerClass, false)) {
- if ($printerFile == '') {
- $printerFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $printerClass
- );
- }
- $printerFile = stream_resolve_include_path($printerFile);
- if ($printerFile) {
- require $printerFile;
- }
- }
- if (class_exists($printerClass)) {
- $class = new ReflectionClass($printerClass);
- if ($class->implementsInterface('PHPUnit_Framework_TestListener') &&
- $class->isSubclassOf('PHPUnit_Util_Printer') &&
- $class->isInstantiable()) {
- if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) {
- return $printerClass;
- }
- $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null;
- return $class->newInstance($outputStream);
- }
- }
- $this->showError(
- sprintf(
- 'Could not use "%s" as printer.',
- $printerClass
- )
- );
- }
- /**
- * Loads a bootstrap file.
- *
- * @param string $filename
- */
- protected function handleBootstrap($filename)
- {
- try {
- PHPUnit_Util_Fileloader::checkAndLoad($filename);
- } catch (PHPUnit_Framework_Exception $e) {
- $this->showError($e->getMessage());
- }
- }
- /**
- * @since Method available since Release 4.0.0
- */
- protected function handleSelfUpdate()
- {
- $this->printVersionString();
- $localFilename = realpath($_SERVER['argv'][0]);
- if (!is_writable($localFilename)) {
- print "No write permission to update " . $localFilename . "\n";
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- if (!extension_loaded('openssl')) {
- print "The OpenSSL extension is not loaded.\n";
- exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
- }
- $remoteFilename = sprintf(
- 'https://phar.phpunit.de/phpunit%s.phar',
- PHPUnit_Runner_Version::getReleaseChannel()
- );
- $tempFilename = tempnam(sys_get_temp_dir(), 'phpunit') . '.phar';
- // Workaround for https://bugs.php.net/bug.php?id=65538
- $caFile = dirname($tempFilename) . '/ca.pem';
- copy(__PHPUNIT_PHAR_ROOT__ . '/ca.pem', $caFile);
- print 'Updating the PHPUnit PHAR ... ';
- $options = array(
- 'ssl' => array(
- 'allow_self_signed' => false,
- 'cafile' => $caFile,
- 'verify_peer' => true
- )
- );
- if (PHP_VERSION_ID < 50600) {
- $options['ssl']['CN_match'] = 'phar.phpunit.de';
- $options['ssl']['SNI_server_name'] = 'phar.phpunit.de';
- }
- file_put_contents(
- $tempFilename,
- file_get_contents(
- $remoteFilename,
- false,
- stream_context_create($options)
- )
- );
- chmod($tempFilename, 0777 & ~umask());
- try {
- $phar = new Phar($tempFilename);
- unset($phar);
- rename($tempFilename, $localFilename);
- unlink($caFile);
- } catch (Exception $e) {
- unlink($caFile);
- unlink($tempFilename);
- print " done\n\n" . $e->getMessage() . "\n";
- exit(2);
- }
- print " done\n";
- exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
- }
- /**
- * Show the help message.
- */
- protected function showHelp()
- {
- $this->printVersionString();
- print <<<EOT
- Usage: phpunit [options] UnitTest [UnitTest.php]
- phpunit [options] <directory>
- Code Coverage Options:
- --coverage-clover <file> Generate code coverage report in Clover XML format.
- --coverage-crap4j <file> Generate code coverage report in Crap4J XML format.
- --coverage-html <dir> Generate code coverage report in HTML format.
- --coverage-php <file> Export PHP_CodeCoverage object to file.
- --coverage-text=<file> Generate code coverage report in text format.
- Default: Standard output.
- --coverage-xml <dir> Generate code coverage report in PHPUnit XML format.
- Logging Options:
- --log-junit <file> Log test execution in JUnit XML format to file.
- --log-tap <file> Log test execution in TAP format to file.
- --log-json <file> Log test execution in JSON format.
- --testdox-html <file> Write agile documentation in HTML format to file.
- --testdox-text <file> Write agile documentation in Text format to file.
- Test Selection Options:
- --filter <pattern> Filter which tests to run.
- --testsuite <pattern> Filter which testsuite to run.
- --group ... Only runs tests from the specified group(s).
- --exclude-group ... Exclude tests from the specified group(s).
- --list-groups List available test groups.
- --test-suffix ... Only search for test in files with specified
- suffix(es). Default: Test.php,.phpt
- Test Execution Options:
- --report-useless-tests Be strict about tests that do not test anything.
- --strict-coverage Be strict about unintentionally covered code.
- --strict-global-state Be strict about changes to global state
- --disallow-test-output Be strict about output during tests.
- --enforce-time-limit Enforce time limit based on test size.
- --disallow-todo-tests Disallow @todo-annotated tests.
- --process-isolation Run each test in a separate PHP process.
- --no-globals-backup Do not backup and restore \$GLOBALS for each test.
- --static-backup Backup and restore static attributes for each test.
- --colors=<flag> Use colors in output ("never", "auto" or "always").
- --columns <n> Number of columns to use for progress output.
- --columns max Use maximum number of columns for progress output.
- --stderr Write to STDERR instead of STDOUT.
- --stop-on-error Stop execution upon first error.
- --stop-on-failure Stop execution upon first error or failure.
- --stop-on-risky Stop execution upon first risky test.
- --stop-on-skipped Stop execution upon first skipped test.
- --stop-on-incomplete Stop execution upon first incomplete test.
- -v|--verbose Output more verbose information.
- --debug Display debugging information during test execution.
- --loader <loader> TestSuiteLoader implementation to use.
- --repeat <times> Runs the test(s) repeatedly.
- --tap Report test execution progress in TAP format.
- --testdox Report test execution progress in TestDox format.
- --printer <printer> TestListener implementation to use.
- Configuration Options:
- --bootstrap <file> A "bootstrap" PHP file that is run before the tests.
- -c|--configuration <file> Read configuration from XML file.
- --no-configuration Ignore default configuration file (phpunit.xml).
- --include-path <path(s)> Prepend PHP's include_path with given path(s).
- -d key[=value] Sets a php.ini value.
- Miscellaneous Options:
- -h|--help Prints this usage information.
- --version Prints the version and exits.
- EOT;
- if (defined('__PHPUNIT_PHAR__')) {
- print "\n --self-update Update PHPUnit to the latest version.\n";
- }
- }
- /**
- * Custom callback for test suite discovery.
- */
- protected function handleCustomTestSuite()
- {
- }
- private function printVersionString()
- {
- if ($this->versionStringPrinted) {
- return;
- }
- print PHPUnit_Runner_Version::getVersionString() . "\n\n";
- $this->versionStringPrinted = true;
- }
- /**
- */
- private function showError($message)
- {
- $this->printVersionString();
- print $message . "\n";
- exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * A TestRunner for the Command Line Interface (CLI)
- * PHP SAPI Module.
- *
- * @package PHPUnit
- * @subpackage TextUI
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner
- {
- const SUCCESS_EXIT = 0;
- const FAILURE_EXIT = 1;
- const EXCEPTION_EXIT = 2;
- /**
- * @var PHP_CodeCoverage_Filter
- */
- protected $codeCoverageFilter;
- /**
- * @var PHPUnit_Runner_TestSuiteLoader
- */
- protected $loader = null;
- /**
- * @var PHPUnit_TextUI_ResultPrinter
- */
- protected $printer = null;
- /**
- * @var boolean
- */
- protected static $versionStringPrinted = false;
- /**
- * @var array
- */
- private $missingExtensions = array();
- /**
- * @var Runtime
- */
- private $runtime;
- /**
- * @param PHPUnit_Runner_TestSuiteLoader $loader
- * @param PHP_CodeCoverage_Filter $filter
- * @since Method available since Release 3.4.0
- */
- public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, PHP_CodeCoverage_Filter $filter = null)
- {
- if ($filter === null) {
- $filter = $this->getCodeCoverageFilter();
- }
- $this->codeCoverageFilter = $filter;
- $this->loader = $loader;
- $this->runtime = new Runtime;
- }
- /**
- * @param PHPUnit_Framework_Test|ReflectionClass $test
- * @param array $arguments
- * @return PHPUnit_Framework_TestResult
- * @throws PHPUnit_Framework_Exception
- */
- public static function run($test, array $arguments = array())
- {
- if ($test instanceof ReflectionClass) {
- $test = new PHPUnit_Framework_TestSuite($test);
- }
- if ($test instanceof PHPUnit_Framework_Test) {
- $aTestRunner = new PHPUnit_TextUI_TestRunner;
- return $aTestRunner->doRun(
- $test,
- $arguments
- );
- } else {
- throw new PHPUnit_Framework_Exception(
- 'No test case or test suite found.'
- );
- }
- }
- /**
- * @return PHPUnit_Framework_TestResult
- */
- protected function createTestResult()
- {
- return new PHPUnit_Framework_TestResult;
- }
- private function processSuiteFilters(PHPUnit_Framework_TestSuite $suite, array $arguments)
- {
- if (!$arguments['filter'] &&
- empty($arguments['groups']) &&
- empty($arguments['excludeGroups'])) {
- return;
- }
- $filterFactory = new PHPUnit_Runner_Filter_Factory();
- if (!empty($arguments['excludeGroups'])) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'),
- $arguments['excludeGroups']
- );
- }
- if (!empty($arguments['groups'])) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Group_Include'),
- $arguments['groups']
- );
- }
- if ($arguments['filter']) {
- $filterFactory->addFilter(
- new ReflectionClass('PHPUnit_Runner_Filter_Test'),
- $arguments['filter']
- );
- }
- $suite->injectFilter($filterFactory);
- }
- /**
- * @param PHPUnit_Framework_Test $suite
- * @param array $arguments
- * @return PHPUnit_Framework_TestResult
- */
- public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array())
- {
- $this->handleConfiguration($arguments);
- $this->processSuiteFilters($suite, $arguments);
- if (isset($arguments['bootstrap'])) {
- $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap'];
- }
- if ($arguments['backupGlobals'] === false) {
- $suite->setBackupGlobals(false);
- }
- if ($arguments['backupStaticAttributes'] === true) {
- $suite->setBackupStaticAttributes(true);
- }
- if ($arguments['disallowChangesToGlobalState'] === true) {
- $suite->setDisallowChangesToGlobalState(true);
- }
- if (is_integer($arguments['repeat'])) {
- $test = new PHPUnit_Extensions_RepeatedTest(
- $suite,
- $arguments['repeat'],
- $arguments['processIsolation']
- );
- $suite = new PHPUnit_Framework_TestSuite();
- $suite->addTest($test);
- }
- $result = $this->createTestResult();
- if (!$arguments['convertErrorsToExceptions']) {
- $result->convertErrorsToExceptions(false);
- }
- if (!$arguments['convertNoticesToExceptions']) {
- PHPUnit_Framework_Error_Notice::$enabled = false;
- }
- if (!$arguments['convertWarningsToExceptions']) {
- PHPUnit_Framework_Error_Warning::$enabled = false;
- }
- if ($arguments['stopOnError']) {
- $result->stopOnError(true);
- }
- if ($arguments['stopOnFailure']) {
- $result->stopOnFailure(true);
- }
- if ($arguments['stopOnIncomplete']) {
- $result->stopOnIncomplete(true);
- }
- if ($arguments['stopOnRisky']) {
- $result->stopOnRisky(true);
- }
- if ($arguments['stopOnSkipped']) {
- $result->stopOnSkipped(true);
- }
- if ($this->printer === null) {
- if (isset($arguments['printer']) &&
- $arguments['printer'] instanceof PHPUnit_Util_Printer) {
- $this->printer = $arguments['printer'];
- } else {
- $printerClass = 'PHPUnit_TextUI_ResultPrinter';
- if (isset($arguments['printer']) &&
- is_string($arguments['printer']) &&
- class_exists($arguments['printer'], false)) {
- $class = new ReflectionClass($arguments['printer']);
- if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) {
- $printerClass = $arguments['printer'];
- }
- }
- $this->printer = new $printerClass(
- isset($arguments['stderr']) ? 'php://stderr' : null,
- $arguments['verbose'],
- $arguments['colors'],
- $arguments['debug'],
- $arguments['columns']
- );
- }
- }
- if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
- $this->printer->write(
- PHPUnit_Runner_Version::getVersionString() . "\n"
- );
- self::$versionStringPrinted = true;
- if ($arguments['verbose']) {
- $this->printer->write(
- sprintf(
- "\nRuntime:\t%s",
- $this->runtime->getNameWithVersion()
- )
- );
- if ($this->runtime->hasXdebug()) {
- $this->printer->write(
- sprintf(
- " with Xdebug %s",
- phpversion('xdebug')
- )
- );
- }
- if (isset($arguments['configuration'])) {
- $this->printer->write(
- sprintf(
- "\nConfiguration:\t%s",
- $arguments['configuration']->getFilename()
- )
- );
- }
- $this->printer->write("\n");
- }
- if (isset($arguments['deprecatedStrictModeOption'])) {
- print "Warning:\tDeprecated option \"--strict\" used\n";
- } elseif (isset($arguments['deprecatedStrictModeSetting'])) {
- print "Warning:\tDeprecated configuration setting \"strict\" used\n";
- }
- if (isset($arguments['deprecatedSeleniumConfiguration'])) {
- print "Warning:\tDeprecated configuration setting \"selenium\" used\n";
- }
- }
- foreach ($arguments['listeners'] as $listener) {
- $result->addListener($listener);
- }
- $result->addListener($this->printer);
- if (isset($arguments['testdoxHTMLFile'])) {
- $result->addListener(
- new PHPUnit_Util_TestDox_ResultPrinter_HTML(
- $arguments['testdoxHTMLFile']
- )
- );
- }
- if (isset($arguments['testdoxTextFile'])) {
- $result->addListener(
- new PHPUnit_Util_TestDox_ResultPrinter_Text(
- $arguments['testdoxTextFile']
- )
- );
- }
- $codeCoverageReports = 0;
- if (isset($arguments['coverageClover'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageCrap4J'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageHtml'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coveragePHP'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageText'])) {
- $codeCoverageReports++;
- }
- if (isset($arguments['coverageXml'])) {
- $codeCoverageReports++;
- }
- if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
- if ($codeCoverageReports > 0 && !$this->codeCoverageFilter->hasWhitelist()) {
- $this->printer->write("Warning:\tNo whitelist configured for code coverage\n");
- }
- $this->printer->write("\n");
- }
- if ($codeCoverageReports > 0 && (!extension_loaded('tokenizer') || !$this->runtime->canCollectCodeCoverage())) {
- if (!extension_loaded('tokenizer')) {
- $this->showExtensionNotLoadedMessage(
- 'tokenizer',
- 'No code coverage will be generated.'
- );
- } elseif (!extension_loaded('Xdebug')) {
- $this->showExtensionNotLoadedMessage(
- 'Xdebug',
- 'No code coverage will be generated.'
- );
- }
- $codeCoverageReports = 0;
- }
- if ($codeCoverageReports > 0) {
- $codeCoverage = new PHP_CodeCoverage(
- null,
- $this->codeCoverageFilter
- );
- $codeCoverage->setAddUncoveredFilesFromWhitelist(
- $arguments['addUncoveredFilesFromWhitelist']
- );
- $codeCoverage->setCheckForUnintentionallyCoveredCode(
- $arguments['strictCoverage']
- );
- $codeCoverage->setProcessUncoveredFilesFromWhitelist(
- $arguments['processUncoveredFilesFromWhitelist']
- );
- if (isset($arguments['forceCoversAnnotation'])) {
- $codeCoverage->setForceCoversAnnotation(
- $arguments['forceCoversAnnotation']
- );
- }
- if (isset($arguments['mapTestClassNameToCoveredClassName'])) {
- $codeCoverage->setMapTestClassNameToCoveredClassName(
- $arguments['mapTestClassNameToCoveredClassName']
- );
- }
- $result->setCodeCoverage($codeCoverage);
- }
- if ($codeCoverageReports > 1) {
- if (isset($arguments['cacheTokens'])) {
- $codeCoverage->setCacheTokens($arguments['cacheTokens']);
- }
- }
- if (isset($arguments['jsonLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])
- );
- }
- if (isset($arguments['tapLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])
- );
- }
- if (isset($arguments['junitLogfile'])) {
- $result->addListener(
- new PHPUnit_Util_Log_JUnit(
- $arguments['junitLogfile'],
- $arguments['logIncompleteSkipped']
- )
- );
- }
- $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']);
- $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']);
- $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']);
- $result->beStrictAboutTestSize($arguments['enforceTimeLimit']);
- $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']);
- $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']);
- $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']);
- if ($suite instanceof PHPUnit_Framework_TestSuite) {
- $suite->setRunTestInSeparateProcess($arguments['processIsolation']);
- }
- $suite->run($result);
- unset($suite);
- $result->flushListeners();
- if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) {
- $this->printer->printResult($result);
- }
- if (isset($codeCoverage)) {
- if (isset($arguments['coverageClover'])) {
- $this->printer->write(
- "\nGenerating code coverage report in Clover XML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_Clover;
- $writer->process($codeCoverage, $arguments['coverageClover']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageCrap4J'])) {
- $this->printer->write(
- "\nGenerating Crap4J report XML file ..."
- );
- $writer = new PHP_CodeCoverage_Report_Crap4j;
- $writer->process($codeCoverage, $arguments['coverageCrap4J']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageHtml'])) {
- $this->printer->write(
- "\nGenerating code coverage report in HTML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_HTML(
- $arguments['reportLowUpperBound'],
- $arguments['reportHighLowerBound'],
- sprintf(
- ' and <a href="http://phpunit.de/">PHPUnit %s</a>',
- PHPUnit_Runner_Version::id()
- )
- );
- $writer->process($codeCoverage, $arguments['coverageHtml']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coveragePHP'])) {
- $this->printer->write(
- "\nGenerating code coverage report in PHP format ..."
- );
- $writer = new PHP_CodeCoverage_Report_PHP;
- $writer->process($codeCoverage, $arguments['coveragePHP']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- if (isset($arguments['coverageText'])) {
- if ($arguments['coverageText'] == 'php://stdout') {
- $outputStream = $this->printer;
- $colors = $arguments['colors'];
- } else {
- $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']);
- $colors = false;
- }
- $processor = new PHP_CodeCoverage_Report_Text(
- $arguments['reportLowUpperBound'],
- $arguments['reportHighLowerBound'],
- $arguments['coverageTextShowUncoveredFiles'],
- $arguments['coverageTextShowOnlySummary']
- );
- $outputStream->write(
- $processor->process($codeCoverage, $colors)
- );
- }
- if (isset($arguments['coverageXml'])) {
- $this->printer->write(
- "\nGenerating code coverage report in PHPUnit XML format ..."
- );
- $writer = new PHP_CodeCoverage_Report_XML;
- $writer->process($codeCoverage, $arguments['coverageXml']);
- $this->printer->write(" done\n");
- unset($writer);
- }
- }
- return $result;
- }
- /**
- * @param PHPUnit_TextUI_ResultPrinter $resultPrinter
- */
- public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter)
- {
- $this->printer = $resultPrinter;
- }
- /**
- * Override to define how to handle a failed loading of
- * a test suite.
- *
- * @param string $message
- */
- protected function runFailed($message)
- {
- $this->write($message . PHP_EOL);
- exit(self::FAILURE_EXIT);
- }
- /**
- * @param string $buffer
- * @since Method available since Release 3.1.0
- */
- protected function write($buffer)
- {
- if (PHP_SAPI != 'cli') {
- $buffer = htmlspecialchars($buffer);
- }
- if ($this->printer !== null) {
- $this->printer->write($buffer);
- } else {
- print $buffer;
- }
- }
- /**
- * Returns the loader to be used.
- *
- * @return PHPUnit_Runner_TestSuiteLoader
- * @since Method available since Release 2.2.0
- */
- public function getLoader()
- {
- if ($this->loader === null) {
- $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader;
- }
- return $this->loader;
- }
- /**
- * @param array $arguments
- * @since Method available since Release 3.2.1
- */
- protected function handleConfiguration(array &$arguments)
- {
- if (isset($arguments['configuration']) &&
- !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) {
- $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance(
- $arguments['configuration']
- );
- }
- $arguments['debug'] = isset($arguments['debug']) ? $arguments['debug'] : false;
- $arguments['filter'] = isset($arguments['filter']) ? $arguments['filter'] : false;
- $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : array();
- if (isset($arguments['configuration'])) {
- $arguments['configuration']->handlePHPConfiguration();
- $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration();
- if (isset($phpunitConfiguration['deprecatedStrictModeSetting'])) {
- $arguments['deprecatedStrictModeSetting'] = true;
- }
- if (isset($phpunitConfiguration['backupGlobals']) &&
- !isset($arguments['backupGlobals'])) {
- $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals'];
- }
- if (isset($phpunitConfiguration['backupStaticAttributes']) &&
- !isset($arguments['backupStaticAttributes'])) {
- $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes'];
- }
- if (isset($phpunitConfiguration['disallowChangesToGlobalState']) &&
- !isset($arguments['disallowChangesToGlobalState'])) {
- $arguments['disallowChangesToGlobalState'] = $phpunitConfiguration['disallowChangesToGlobalState'];
- }
- if (isset($phpunitConfiguration['bootstrap']) &&
- !isset($arguments['bootstrap'])) {
- $arguments['bootstrap'] = $phpunitConfiguration['bootstrap'];
- }
- if (isset($phpunitConfiguration['cacheTokens']) &&
- !isset($arguments['cacheTokens'])) {
- $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens'];
- }
- if (isset($phpunitConfiguration['colors']) &&
- !isset($arguments['colors'])) {
- $arguments['colors'] = $phpunitConfiguration['colors'];
- }
- if (isset($phpunitConfiguration['convertErrorsToExceptions']) &&
- !isset($arguments['convertErrorsToExceptions'])) {
- $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions'];
- }
- if (isset($phpunitConfiguration['convertNoticesToExceptions']) &&
- !isset($arguments['convertNoticesToExceptions'])) {
- $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions'];
- }
- if (isset($phpunitConfiguration['convertWarningsToExceptions']) &&
- !isset($arguments['convertWarningsToExceptions'])) {
- $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions'];
- }
- if (isset($phpunitConfiguration['processIsolation']) &&
- !isset($arguments['processIsolation'])) {
- $arguments['processIsolation'] = $phpunitConfiguration['processIsolation'];
- }
- if (isset($phpunitConfiguration['stopOnFailure']) &&
- !isset($arguments['stopOnFailure'])) {
- $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure'];
- }
- if (isset($phpunitConfiguration['timeoutForSmallTests']) &&
- !isset($arguments['timeoutForSmallTests'])) {
- $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests'];
- }
- if (isset($phpunitConfiguration['timeoutForMediumTests']) &&
- !isset($arguments['timeoutForMediumTests'])) {
- $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests'];
- }
- if (isset($phpunitConfiguration['timeoutForLargeTests']) &&
- !isset($arguments['timeoutForLargeTests'])) {
- $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests'];
- }
- if (isset($phpunitConfiguration['reportUselessTests']) &&
- !isset($arguments['reportUselessTests'])) {
- $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests'];
- }
- if (isset($phpunitConfiguration['strictCoverage']) &&
- !isset($arguments['strictCoverage'])) {
- $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage'];
- }
- if (isset($phpunitConfiguration['disallowTestOutput']) &&
- !isset($arguments['disallowTestOutput'])) {
- $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput'];
- }
- if (isset($phpunitConfiguration['enforceTimeLimit']) &&
- !isset($arguments['enforceTimeLimit'])) {
- $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit'];
- }
- if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) &&
- !isset($arguments['disallowTodoAnnotatedTests'])) {
- $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests'];
- }
- if (isset($phpunitConfiguration['verbose']) &&
- !isset($arguments['verbose'])) {
- $arguments['verbose'] = $phpunitConfiguration['verbose'];
- }
- if (isset($phpunitConfiguration['forceCoversAnnotation']) &&
- !isset($arguments['forceCoversAnnotation'])) {
- $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation'];
- }
- if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) &&
- !isset($arguments['mapTestClassNameToCoveredClassName'])) {
- $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName'];
- }
- $groupCliArgs = array();
- if (!empty($arguments['groups'])) {
- $groupCliArgs = $arguments['groups'];
- }
- $groupConfiguration = $arguments['configuration']->getGroupConfiguration();
- if (!empty($groupConfiguration['include']) &&
- !isset($arguments['groups'])) {
- $arguments['groups'] = $groupConfiguration['include'];
- }
- if (!empty($groupConfiguration['exclude']) &&
- !isset($arguments['excludeGroups'])) {
- $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs);
- }
- foreach ($arguments['configuration']->getListenerConfiguration() as $listener) {
- if (!class_exists($listener['class'], false) &&
- $listener['file'] !== '') {
- require_once $listener['file'];
- }
- if (class_exists($listener['class'])) {
- if (count($listener['arguments']) == 0) {
- $listener = new $listener['class'];
- } else {
- $listenerClass = new ReflectionClass(
- $listener['class']
- );
- $listener = $listenerClass->newInstanceArgs(
- $listener['arguments']
- );
- }
- if ($listener instanceof PHPUnit_Framework_TestListener) {
- $arguments['listeners'][] = $listener;
- }
- }
- }
- $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration();
- if (isset($loggingConfiguration['coverage-clover']) &&
- !isset($arguments['coverageClover'])) {
- $arguments['coverageClover'] = $loggingConfiguration['coverage-clover'];
- }
- if (isset($loggingConfiguration['coverage-crap4j']) &&
- !isset($arguments['coverageCrap4J'])) {
- $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j'];
- }
- if (isset($loggingConfiguration['coverage-html']) &&
- !isset($arguments['coverageHtml'])) {
- if (isset($loggingConfiguration['lowUpperBound']) &&
- !isset($arguments['reportLowUpperBound'])) {
- $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound'];
- }
- if (isset($loggingConfiguration['highLowerBound']) &&
- !isset($arguments['reportHighLowerBound'])) {
- $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound'];
- }
- $arguments['coverageHtml'] = $loggingConfiguration['coverage-html'];
- }
- if (isset($loggingConfiguration['coverage-php']) &&
- !isset($arguments['coveragePHP'])) {
- $arguments['coveragePHP'] = $loggingConfiguration['coverage-php'];
- }
- if (isset($loggingConfiguration['coverage-text']) &&
- !isset($arguments['coverageText'])) {
- $arguments['coverageText'] = $loggingConfiguration['coverage-text'];
- if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) {
- $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'];
- } else {
- $arguments['coverageTextShowUncoveredFiles'] = false;
- }
- if (isset($loggingConfiguration['coverageTextShowOnlySummary'])) {
- $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary'];
- } else {
- $arguments['coverageTextShowOnlySummary'] = false;
- }
- }
- if (isset($loggingConfiguration['coverage-xml']) &&
- !isset($arguments['coverageXml'])) {
- $arguments['coverageXml'] = $loggingConfiguration['coverage-xml'];
- }
- if (isset($loggingConfiguration['json']) &&
- !isset($arguments['jsonLogfile'])) {
- $arguments['jsonLogfile'] = $loggingConfiguration['json'];
- }
- if (isset($loggingConfiguration['plain'])) {
- $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter(
- $loggingConfiguration['plain'],
- true
- );
- }
- if (isset($loggingConfiguration['tap']) &&
- !isset($arguments['tapLogfile'])) {
- $arguments['tapLogfile'] = $loggingConfiguration['tap'];
- }
- if (isset($loggingConfiguration['junit']) &&
- !isset($arguments['junitLogfile'])) {
- $arguments['junitLogfile'] = $loggingConfiguration['junit'];
- if (isset($loggingConfiguration['logIncompleteSkipped']) &&
- !isset($arguments['logIncompleteSkipped'])) {
- $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped'];
- }
- }
- if (isset($loggingConfiguration['testdox-html']) &&
- !isset($arguments['testdoxHTMLFile'])) {
- $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html'];
- }
- if (isset($loggingConfiguration['testdox-text']) &&
- !isset($arguments['testdoxTextFile'])) {
- $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text'];
- }
- if ((isset($arguments['coverageClover']) ||
- isset($arguments['coverageCrap4J']) ||
- isset($arguments['coverageHtml']) ||
- isset($arguments['coveragePHP']) ||
- isset($arguments['coverageText']) ||
- isset($arguments['coverageXml'])) &&
- $this->runtime->canCollectCodeCoverage()) {
- $filterConfiguration = $arguments['configuration']->getFilterConfiguration();
- $arguments['addUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'];
- $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'];
- if (empty($filterConfiguration['whitelist']['include']['directory']) &&
- empty($filterConfiguration['whitelist']['include']['file'])) {
- foreach ($filterConfiguration['blacklist']['include']['directory'] as $dir) {
- $this->codeCoverageFilter->addDirectoryToBlacklist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix'],
- $dir['group']
- );
- }
- foreach ($filterConfiguration['blacklist']['include']['file'] as $file) {
- $this->codeCoverageFilter->addFileToBlacklist($file);
- }
- foreach ($filterConfiguration['blacklist']['exclude']['directory'] as $dir) {
- $this->codeCoverageFilter->removeDirectoryFromBlacklist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix'],
- $dir['group']
- );
- }
- foreach ($filterConfiguration['blacklist']['exclude']['file'] as $file) {
- $this->codeCoverageFilter->removeFileFromBlacklist($file);
- }
- }
- foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) {
- $this->codeCoverageFilter->addDirectoryToWhitelist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix']
- );
- }
- foreach ($filterConfiguration['whitelist']['include']['file'] as $file) {
- $this->codeCoverageFilter->addFileToWhitelist($file);
- }
- foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) {
- $this->codeCoverageFilter->removeDirectoryFromWhitelist(
- $dir['path'],
- $dir['suffix'],
- $dir['prefix']
- );
- }
- foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) {
- $this->codeCoverageFilter->removeFileFromWhitelist($file);
- }
- }
- }
- $arguments['addUncoveredFilesFromWhitelist'] = isset($arguments['addUncoveredFilesFromWhitelist']) ? $arguments['addUncoveredFilesFromWhitelist'] : true;
- $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : false;
- $arguments['backupGlobals'] = isset($arguments['backupGlobals']) ? $arguments['backupGlobals'] : null;
- $arguments['backupStaticAttributes'] = isset($arguments['backupStaticAttributes']) ? $arguments['backupStaticAttributes'] : null;
- $arguments['disallowChangesToGlobalState'] = isset($arguments['disallowChangesToGlobalState']) ? $arguments['disallowChangesToGlobalState'] : null;
- $arguments['cacheTokens'] = isset($arguments['cacheTokens']) ? $arguments['cacheTokens'] : false;
- $arguments['columns'] = isset($arguments['columns']) ? $arguments['columns'] : 80;
- $arguments['colors'] = isset($arguments['colors']) ? $arguments['colors'] : PHPUnit_TextUI_ResultPrinter::COLOR_DEFAULT;
- $arguments['convertErrorsToExceptions'] = isset($arguments['convertErrorsToExceptions']) ? $arguments['convertErrorsToExceptions'] : true;
- $arguments['convertNoticesToExceptions'] = isset($arguments['convertNoticesToExceptions']) ? $arguments['convertNoticesToExceptions'] : true;
- $arguments['convertWarningsToExceptions'] = isset($arguments['convertWarningsToExceptions']) ? $arguments['convertWarningsToExceptions'] : true;
- $arguments['excludeGroups'] = isset($arguments['excludeGroups']) ? $arguments['excludeGroups'] : array();
- $arguments['groups'] = isset($arguments['groups']) ? $arguments['groups'] : array();
- $arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ? $arguments['logIncompleteSkipped'] : false;
- $arguments['processIsolation'] = isset($arguments['processIsolation']) ? $arguments['processIsolation'] : false;
- $arguments['repeat'] = isset($arguments['repeat']) ? $arguments['repeat'] : false;
- $arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ? $arguments['reportHighLowerBound'] : 90;
- $arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ? $arguments['reportLowUpperBound'] : 50;
- $arguments['stopOnError'] = isset($arguments['stopOnError']) ? $arguments['stopOnError'] : false;
- $arguments['stopOnFailure'] = isset($arguments['stopOnFailure']) ? $arguments['stopOnFailure'] : false;
- $arguments['stopOnIncomplete'] = isset($arguments['stopOnIncomplete']) ? $arguments['stopOnIncomplete'] : false;
- $arguments['stopOnRisky'] = isset($arguments['stopOnRisky']) ? $arguments['stopOnRisky'] : false;
- $arguments['stopOnSkipped'] = isset($arguments['stopOnSkipped']) ? $arguments['stopOnSkipped'] : false;
- $arguments['timeoutForSmallTests'] = isset($arguments['timeoutForSmallTests']) ? $arguments['timeoutForSmallTests'] : 1;
- $arguments['timeoutForMediumTests'] = isset($arguments['timeoutForMediumTests']) ? $arguments['timeoutForMediumTests'] : 10;
- $arguments['timeoutForLargeTests'] = isset($arguments['timeoutForLargeTests']) ? $arguments['timeoutForLargeTests'] : 60;
- $arguments['reportUselessTests'] = isset($arguments['reportUselessTests']) ? $arguments['reportUselessTests'] : false;
- $arguments['strictCoverage'] = isset($arguments['strictCoverage']) ? $arguments['strictCoverage'] : false;
- $arguments['disallowTestOutput'] = isset($arguments['disallowTestOutput']) ? $arguments['disallowTestOutput'] : false;
- $arguments['enforceTimeLimit'] = isset($arguments['enforceTimeLimit']) ? $arguments['enforceTimeLimit'] : false;
- $arguments['disallowTodoAnnotatedTests'] = isset($arguments['disallowTodoAnnotatedTests']) ? $arguments['disallowTodoAnnotatedTests'] : false;
- $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false;
- }
- /**
- * @param $extension
- * @param string $message
- * @since Method available since Release 4.0.0
- */
- private function showExtensionNotLoadedMessage($extension, $message = '')
- {
- if (isset($this->missingExtensions[$extension])) {
- return;
- }
- if (!empty($message)) {
- $message = ' ' . $message;
- }
- $this->showMessage(
- 'The ' . $extension . ' extension is not loaded.' . $message . "\n"
- );
- $this->missingExtensions[$extension] = true;
- }
- /**
- * Shows a message.
- *
- * @param string $message
- * @param boolean $exit
- * @since Method available since Release 4.0.0
- */
- private function showMessage($message, $exit = false)
- {
- $this->write($message . "\n");
- if ($exit) {
- exit(self::EXCEPTION_EXIT);
- }
- }
- /**
- * @return PHP_CodeCoverage_Filter
- */
- private function getCodeCoverageFilter()
- {
- $filter = new PHP_CodeCoverage_Filter;
- if (defined('__PHPUNIT_PHAR__')) {
- $filter->addFileToBlacklist(__PHPUNIT_PHAR__);
- }
- $blacklist = new PHPUnit_Util_Blacklist;
- foreach ($blacklist->getBlacklistedDirectories() as $directory) {
- $filter->addDirectoryToBlacklist($directory);
- }
- return $filter;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Console;
- /**
- * Prints the result of a TextUI TestRunner run.
- *
- * @package PHPUnit
- * @subpackage TextUI
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_TextUI_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- const EVENT_TEST_START = 0;
- const EVENT_TEST_END = 1;
- const EVENT_TESTSUITE_START = 2;
- const EVENT_TESTSUITE_END = 3;
- const COLOR_NEVER = 'never';
- const COLOR_AUTO = 'auto';
- const COLOR_ALWAYS = 'always';
- const COLOR_DEFAULT = self::COLOR_NEVER;
- /**
- * @var array
- */
- private static $ansiCodes = array(
- 'bold' => 1,
- 'fg-black' => 30,
- 'fg-red' => 31,
- 'fg-green' => 32,
- 'fg-yellow' => 33,
- 'fg-blue' => 34,
- 'fg-magenta' => 35,
- 'fg-cyan' => 36,
- 'fg-white' => 37,
- 'bg-black' => 40,
- 'bg-red' => 41,
- 'bg-green' => 42,
- 'bg-yellow' => 43,
- 'bg-blue' => 44,
- 'bg-magenta' => 45,
- 'bg-cyan' => 46,
- 'bg-white' => 47
- );
- /**
- * @var integer
- */
- protected $column = 0;
- /**
- * @var integer
- */
- protected $maxColumn;
- /**
- * @var boolean
- */
- protected $lastTestFailed = false;
- /**
- * @var integer
- */
- protected $numAssertions = 0;
- /**
- * @var integer
- */
- protected $numTests = -1;
- /**
- * @var integer
- */
- protected $numTestsRun = 0;
- /**
- * @var integer
- */
- protected $numTestsWidth;
- /**
- * @var boolean
- */
- protected $colors = false;
- /**
- * @var boolean
- */
- protected $debug = false;
- /**
- * @var boolean
- */
- protected $verbose = false;
- /**
- * @var integer
- */
- private $numberOfColumns;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @param boolean $verbose
- * @param string $colors
- * @param boolean $debug
- * @param integer|string $numberOfColumns
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.0.0
- */
- public function __construct($out = null, $verbose = false, $colors = self::COLOR_DEFAULT, $debug = false, $numberOfColumns = 80)
- {
- parent::__construct($out);
- if (!is_bool($verbose)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
- }
- $availableColors = array(self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS);
- if (!in_array($colors, $availableColors)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(
- 3,
- vsprintf('value from "%s", "%s" or "%s"', $availableColors)
- );
- }
- if (!is_bool($debug)) {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
- }
- if (!is_int($numberOfColumns) && $numberOfColumns != 'max') {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'integer or "max"');
- }
- $console = new Console;
- $maxNumberOfColumns = $console->getNumberOfColumns();
- if ($numberOfColumns == 'max' || $numberOfColumns > $maxNumberOfColumns) {
- $numberOfColumns = $maxNumberOfColumns;
- }
- $this->numberOfColumns = $numberOfColumns;
- $this->verbose = $verbose;
- $this->debug = $debug;
- if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) {
- $this->colors = true;
- } else {
- $this->colors = (self::COLOR_ALWAYS === $colors);
- }
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- public function printResult(PHPUnit_Framework_TestResult $result)
- {
- $this->printHeader();
- $this->printErrors($result);
- $printSeparator = $result->errorCount() > 0;
- if ($printSeparator && $result->failureCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator || $result->failureCount() > 0;
- $this->printFailures($result);
- if ($this->verbose) {
- if ($printSeparator && $result->riskyCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator ||
- $result->riskyCount() > 0;
- $this->printRisky($result);
- if ($printSeparator && $result->notImplementedCount() > 0) {
- $this->write("\n--\n\n");
- }
- $printSeparator = $printSeparator ||
- $result->notImplementedCount() > 0;
- $this->printIncompletes($result);
- if ($printSeparator && $result->skippedCount() > 0) {
- $this->write("\n--\n\n");
- }
- $this->printSkipped($result);
- }
- $this->printFooter($result);
- }
- /**
- * @param array $defects
- * @param string $type
- */
- protected function printDefects(array $defects, $type)
- {
- $count = count($defects);
- if ($count == 0) {
- return;
- }
- $this->write(
- sprintf(
- "There %s %d %s%s:\n",
- ($count == 1) ? 'was' : 'were',
- $count,
- $type,
- ($count == 1) ? '' : 's'
- )
- );
- $i = 1;
- foreach ($defects as $defect) {
- $this->printDefect($defect, $i++);
- }
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- * @param integer $count
- */
- protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count)
- {
- $this->printDefectHeader($defect, $count);
- $this->printDefectTrace($defect);
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- * @param integer $count
- */
- protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count)
- {
- $this->write(
- sprintf(
- "\n%d) %s\n",
- $count,
- $defect->getTestName()
- )
- );
- }
- /**
- * @param PHPUnit_Framework_TestFailure $defect
- */
- protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect)
- {
- $e = $defect->thrownException();
- $this->write((string) $e);
- while ($e = $e->getPrevious()) {
- $this->write("\nCaused by\n" . $e);
- }
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printErrors(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->errors(), 'error');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printFailures(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->failures(), 'failure');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printIncompletes(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->notImplemented(), 'incomplete test');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 4.0.0
- */
- protected function printRisky(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->risky(), 'risky test');
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- * @since Method available since Release 3.0.0
- */
- protected function printSkipped(PHPUnit_Framework_TestResult $result)
- {
- $this->printDefects($result->skipped(), 'skipped test');
- }
- protected function printHeader()
- {
- $this->write("\n\n" . PHP_Timer::resourceUsage() . "\n\n");
- }
- /**
- * @param PHPUnit_Framework_TestResult $result
- */
- protected function printFooter(PHPUnit_Framework_TestResult $result)
- {
- if (count($result) === 0) {
- $this->writeWithColor(
- 'fg-black, bg-yellow',
- 'No tests executed!'
- );
- } elseif ($result->wasSuccessful() &&
- $result->allHarmless() &&
- $result->allCompletelyImplemented() &&
- $result->noneSkipped()) {
- $this->writeWithColor(
- 'fg-black, bg-green',
- sprintf(
- 'OK (%d test%s, %d assertion%s)',
- count($result),
- (count($result) == 1) ? '' : 's',
- $this->numAssertions,
- ($this->numAssertions == 1) ? '' : 's'
- )
- );
- } else {
- if ($result->wasSuccessful()) {
- $color = 'fg-black, bg-yellow';
- if ($this->verbose) {
- $this->write("\n");
- }
- $this->writeWithColor(
- $color,
- 'OK, but incomplete, skipped, or risky tests!'
- );
- } else {
- $color = 'fg-white, bg-red';
- $this->write("\n");
- $this->writeWithColor($color, 'FAILURES!');
- }
- $this->writeCountString(count($result), 'Tests', $color, true);
- $this->writeCountString($this->numAssertions, 'Assertions', $color, true);
- $this->writeCountString($result->errorCount(), 'Errors', $color);
- $this->writeCountString($result->failureCount(), 'Failures', $color);
- $this->writeCountString($result->skippedCount(), 'Skipped', $color);
- $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color);
- $this->writeCountString($result->riskyCount(), 'Risky', $color);
- $this->writeWithColor($color, '.', true);
- }
- }
- /**
- */
- public function printWaitPrompt()
- {
- $this->write("\n<RETURN> to continue\n");
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-red, bold', 'E');
- $this->lastTestFailed = true;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeProgressWithColor('bg-red, fg-white', 'F');
- $this->lastTestFailed = true;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-yellow, bold', 'I');
- $this->lastTestFailed = true;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-yellow, bold', 'R');
- $this->lastTestFailed = true;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeProgressWithColor('fg-cyan, bold', 'S');
- $this->lastTestFailed = true;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- if ($this->numTests == -1) {
- $this->numTests = count($suite);
- $this->numTestsWidth = strlen((string) $this->numTests);
- $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numTestsWidth);
- }
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if ($this->debug) {
- $this->write(
- sprintf(
- "\nStarting test '%s'.\n",
- PHPUnit_Util_Test::describe($test)
- )
- );
- }
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$this->lastTestFailed) {
- $this->writeProgress('.');
- }
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $this->numAssertions += $test->getNumAssertions();
- } elseif ($test instanceof PHPUnit_Extensions_PhptTestCase) {
- $this->numAssertions++;
- }
- $this->lastTestFailed = false;
- if ($test instanceof PHPUnit_Framework_TestCase) {
- if (!$test->hasExpectationOnOutput()) {
- $this->write($test->getActualOutput());
- }
- }
- }
- /**
- * @param string $progress
- */
- protected function writeProgress($progress)
- {
- $this->write($progress);
- $this->column++;
- $this->numTestsRun++;
- if ($this->column == $this->maxColumn) {
- $this->write(
- sprintf(
- ' %' . $this->numTestsWidth . 'd / %' .
- $this->numTestsWidth . 'd (%3s%%)',
- $this->numTestsRun,
- $this->numTests,
- floor(($this->numTestsRun / $this->numTests) * 100)
- )
- );
- $this->writeNewLine();
- }
- }
- protected function writeNewLine()
- {
- $this->column = 0;
- $this->write("\n");
- }
- /**
- * Formats a buffer with a specified ANSI color sequence if colors are
- * enabled.
- *
- * @param string $color
- * @param string $buffer
- * @return string
- * @since Method available since Release 4.0.0
- */
- protected function formatWithColor($color, $buffer)
- {
- if (!$this->colors) {
- return $buffer;
- }
- $codes = array_map('trim', explode(',', $color));
- $lines = explode("\n", $buffer);
- $padding = max(array_map('strlen', $lines));
- $styles = array();
- foreach ($codes as $code) {
- $styles[] = self::$ansiCodes[$code];
- }
- $style = sprintf("\x1b[%sm", implode(';', $styles));
- $styledLines = array();
- foreach ($lines as $line) {
- $styledLines[] = $style . str_pad($line, $padding) . "\x1b[0m";
- }
- return implode("\n", $styledLines);
- }
- /**
- * Writes a buffer out with a color sequence if colors are enabled.
- *
- * @param string $color
- * @param string $buffer
- * @param boolean $lf
- * @since Method available since Release 4.0.0
- */
- protected function writeWithColor($color, $buffer, $lf = true)
- {
- $this->write($this->formatWithColor($color, $buffer));
- if ($lf) {
- $this->write("\n");
- }
- }
- /**
- * Writes progress with a color sequence if colors are enabled.
- *
- * @param string $color
- * @param string $buffer
- * @since Method available since Release 4.0.0
- */
- protected function writeProgressWithColor($color, $buffer)
- {
- $buffer = $this->formatWithColor($color, $buffer);
- $this->writeProgress($buffer);
- }
- /**
- * @param integer $count
- * @param string $name
- * @param string $color
- * @param boolean $always
- * @since Method available since Release 4.6.5
- */
- private function writeCountString($count, $name, $color, $always = false)
- {
- static $first = true;
- if ($always || $count > 0) {
- $this->writeWithColor(
- $color,
- sprintf(
- '%s%s: %d',
- !$first ? ', ' : '',
- $name,
- $count
- ),
- false
- );
- $first = false;
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- if (!function_exists('trait_exists')) {
- function trait_exists($traitname, $autoload = true)
- {
- return false;
- }
- }
- /**
- * Test helpers.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Test
- {
- const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/';
- const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m';
- const REGEX_REQUIRES_VERSION = '/@requires\s+(?P<name>PHP(?:Unit)?)\s+(?P<value>[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m';
- const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P<value>.+?)[ \t]*\r?$/m';
- const REGEX_REQUIRES = '/@requires\s+(?P<name>function|extension)\s+(?P<value>([^ ]+?))[ \t]*\r?$/m';
- const UNKNOWN = -1;
- const SMALL = 0;
- const MEDIUM = 1;
- const LARGE = 2;
- private static $annotationCache = array();
- private static $hookMethods = array();
- /**
- * @param PHPUnit_Framework_Test $test
- * @param boolean $asString
- * @return mixed
- */
- public static function describe(PHPUnit_Framework_Test $test, $asString = true)
- {
- if ($asString) {
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- return $test->toString();
- } else {
- return get_class($test);
- }
- } else {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- return array(
- get_class($test), $test->getName()
- );
- } elseif ($test instanceof PHPUnit_Framework_SelfDescribing) {
- return array('', $test->toString());
- } else {
- return array('', get_class($test));
- }
- }
- }
- /**
- * @param string $className
- * @param string $methodName
- * @return array|bool
- * @throws PHPUnit_Framework_CodeCoverageException
- * @since Method available since Release 4.0.0
- */
- public static function getLinesToBeCovered($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- if (isset($annotations['class']['coversNothing']) || isset($annotations['method']['coversNothing'])) {
- return false;
- }
- return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers');
- }
- /**
- * Returns lines of code specified with the @uses annotation.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 4.0.0
- */
- public static function getLinesToBeUsed($className, $methodName)
- {
- return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses');
- }
- /**
- * @param string $className
- * @param string $methodName
- * @param string $mode
- * @return array
- * @throws PHPUnit_Framework_CodeCoverageException
- * @since Method available since Release 4.2.0
- */
- private static function getLinesToBeCoveredOrUsed($className, $methodName, $mode)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $classShortcut = null;
- if (!empty($annotations['class'][$mode . 'DefaultClass'])) {
- if (count($annotations['class'][$mode . 'DefaultClass']) > 1) {
- throw new PHPUnit_Framework_CodeCoverageException(
- sprintf(
- 'More than one @%sClass annotation in class or interface "%s".',
- $mode,
- $className
- )
- );
- }
- $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0];
- }
- $list = array();
- if (isset($annotations['class'][$mode])) {
- $list = $annotations['class'][$mode];
- }
- if (isset($annotations['method'][$mode])) {
- $list = array_merge($list, $annotations['method'][$mode]);
- }
- $codeList = array();
- foreach (array_unique($list) as $element) {
- if ($classShortcut && strncmp($element, '::', 2) === 0) {
- $element = $classShortcut . $element;
- }
- $element = preg_replace('/[\s()]+$/', '', $element);
- $codeList = array_merge(
- $codeList,
- self::resolveElementToReflectionObjects($element)
- );
- }
- return self::resolveReflectionObjectsToLines($codeList);
- }
- /**
- * Returns the requirements for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.6.0
- */
- public static function getRequirements($className, $methodName)
- {
- $reflector = new ReflectionClass($className);
- $docComment = $reflector->getDocComment();
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment .= "\n" . $reflector->getDocComment();
- $requires = array();
- if ($count = preg_match_all(self::REGEX_REQUIRES_OS, $docComment, $matches)) {
- $requires['OS'] = sprintf(
- '/%s/i',
- addcslashes($matches['value'][$count - 1], '/')
- );
- }
- if ($count = preg_match_all(self::REGEX_REQUIRES_VERSION, $docComment, $matches)) {
- for ($i = 0; $i < $count; $i++) {
- $requires[$matches['name'][$i]] = $matches['value'][$i];
- }
- }
- // https://bugs.php.net/bug.php?id=63055
- $matches = array();
- if ($count = preg_match_all(self::REGEX_REQUIRES, $docComment, $matches)) {
- for ($i = 0; $i < $count; $i++) {
- $name = $matches['name'][$i] . 's';
- if (!isset($requires[$name])) {
- $requires[$name] = array();
- }
- $requires[$name][] = $matches['value'][$i];
- }
- }
- return $requires;
- }
- /**
- * Returns the missing requirements for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 4.3.0
- */
- public static function getMissingRequirements($className, $methodName)
- {
- $required = static::getRequirements($className, $methodName);
- $missing = array();
- if (!empty($required['PHP']) && version_compare(PHP_VERSION, $required['PHP'], '<')) {
- $missing[] = sprintf('PHP %s (or later) is required.', $required['PHP']);
- }
- if (!empty($required['PHPUnit'])) {
- $phpunitVersion = PHPUnit_Runner_Version::id();
- if (version_compare($phpunitVersion, $required['PHPUnit'], '<')) {
- $missing[] = sprintf('PHPUnit %s (or later) is required.', $required['PHPUnit']);
- }
- }
- if (!empty($required['OS']) && !preg_match($required['OS'], PHP_OS)) {
- $missing[] = sprintf('Operating system matching %s is required.', $required['OS']);
- }
- if (!empty($required['functions'])) {
- foreach ($required['functions'] as $function) {
- $pieces = explode('::', $function);
- if (2 === count($pieces) && method_exists($pieces[0], $pieces[1])) {
- continue;
- }
- if (function_exists($function)) {
- continue;
- }
- $missing[] = sprintf('Function %s is required.', $function);
- }
- }
- if (!empty($required['extensions'])) {
- foreach ($required['extensions'] as $extension) {
- if (!extension_loaded($extension)) {
- $missing[] = sprintf('Extension %s is required.', $extension);
- }
- }
- }
- return $missing;
- }
- /**
- * Returns the expected exception for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.3.6
- */
- public static function getExpectedException($className, $methodName)
- {
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment = $reflector->getDocComment();
- $docComment = substr($docComment, 3, -2);
- if (preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $class = $matches[1];
- $code = null;
- $message = '';
- $messageRegExp = '';
- if (isset($matches[2])) {
- $message = trim($matches[2]);
- } elseif (isset($annotations['method']['expectedExceptionMessage'])) {
- $message = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionMessage'][0]
- );
- }
- if (isset($annotations['method']['expectedExceptionMessageRegExp'])) {
- $messageRegExp = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionMessageRegExp'][0]
- );
- }
- if (isset($matches[3])) {
- $code = $matches[3];
- } elseif (isset($annotations['method']['expectedExceptionCode'])) {
- $code = self::parseAnnotationContent(
- $annotations['method']['expectedExceptionCode'][0]
- );
- }
- if (is_numeric($code)) {
- $code = (int) $code;
- } elseif (is_string($code) && defined($code)) {
- $code = (int) constant($code);
- }
- return array(
- 'class' => $class, 'code' => $code, 'message' => $message, 'message_regex' => $messageRegExp
- );
- }
- return false;
- }
- /**
- * Parse annotation content to use constant/class constant values
- *
- * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME
- *
- * If the constant is not found the string is used as is to ensure maximum BC.
- *
- * @param string $message
- * @return string
- */
- private static function parseAnnotationContent($message)
- {
- if (strpos($message, '::') !== false && count(explode('::', $message) == 2)) {
- if (defined($message)) {
- $message = constant($message);
- }
- }
- return $message;
- }
- /**
- * Returns the provided data for a method.
- *
- * @param string $className
- * @param string $methodName
- * @return array|Iterator when a data provider is specified and exists
- * false when a data provider is specified but does not exist
- * null when no data provider is specified
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.2.0
- */
- public static function getProvidedData($className, $methodName)
- {
- $reflector = new ReflectionMethod($className, $methodName);
- $docComment = $reflector->getDocComment();
- $data = null;
- if (preg_match(self::REGEX_DATA_PROVIDER, $docComment, $matches)) {
- $dataProviderMethodNameNamespace = explode('\\', $matches[1]);
- $leaf = explode('::', array_pop($dataProviderMethodNameNamespace));
- $dataProviderMethodName = array_pop($leaf);
- if (!empty($dataProviderMethodNameNamespace)) {
- $dataProviderMethodNameNamespace = implode('\\', $dataProviderMethodNameNamespace) . '\\';
- } else {
- $dataProviderMethodNameNamespace = '';
- }
- if (!empty($leaf)) {
- $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf);
- } else {
- $dataProviderClassName = $className;
- }
- $dataProviderClass = new ReflectionClass($dataProviderClassName);
- $dataProviderMethod = $dataProviderClass->getMethod(
- $dataProviderMethodName
- );
- if ($dataProviderMethod->isStatic()) {
- $object = null;
- } else {
- $object = $dataProviderClass->newInstance();
- }
- if ($dataProviderMethod->getNumberOfParameters() == 0) {
- $data = $dataProviderMethod->invoke($object);
- } else {
- $data = $dataProviderMethod->invoke($object, $methodName);
- }
- }
- if ($data !== null) {
- if (is_object($data)) {
- $data = iterator_to_array($data);
- }
- foreach ($data as $key => $value) {
- if (!is_array($value)) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Data set %s is invalid.',
- is_int($key) ? '#' . $key : '"' . $key . '"'
- )
- );
- }
- }
- }
- return $data;
- }
- /**
- * @param string $className
- * @param string $methodName
- * @return array
- * @throws ReflectionException
- * @since Method available since Release 3.4.0
- */
- public static function parseTestMethodAnnotations($className, $methodName = '')
- {
- if (!isset(self::$annotationCache[$className])) {
- $class = new ReflectionClass($className);
- self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment());
- }
- if (!empty($methodName) && !isset(self::$annotationCache[$className . '::' . $methodName])) {
- try {
- $method = new ReflectionMethod($className, $methodName);
- $annotations = self::parseAnnotations($method->getDocComment());
- } catch (ReflectionException $e) {
- $annotations = array();
- }
- self::$annotationCache[$className . '::' . $methodName] = $annotations;
- }
- return array(
- 'class' => self::$annotationCache[$className],
- 'method' => !empty($methodName) ? self::$annotationCache[$className . '::' . $methodName] : array()
- );
- }
- /**
- * @param string $docblock
- * @return array
- * @since Method available since Release 3.4.0
- */
- private static function parseAnnotations($docblock)
- {
- $annotations = array();
- // Strip away the docblock header and footer to ease parsing of one line annotations
- $docblock = substr($docblock, 3, -2);
- if (preg_match_all('/@(?P<name>[A-Za-z_-]+)(?:[ \t]+(?P<value>.*?))?[ \t]*\r?$/m', $docblock, $matches)) {
- $numMatches = count($matches[0]);
- for ($i = 0; $i < $numMatches; ++$i) {
- $annotations[$matches['name'][$i]][] = $matches['value'][$i];
- }
- }
- return $annotations;
- }
- /**
- * Returns the backup settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getBackupSettings($className, $methodName)
- {
- return array(
- 'backupGlobals' => self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'backupGlobals'
- ),
- 'backupStaticAttributes' => self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'backupStaticAttributes'
- )
- );
- }
- /**
- * Returns the dependencies for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getDependencies($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $dependencies = array();
- if (isset($annotations['class']['depends'])) {
- $dependencies = $annotations['class']['depends'];
- }
- if (isset($annotations['method']['depends'])) {
- $dependencies = array_merge(
- $dependencies,
- $annotations['method']['depends']
- );
- }
- return array_unique($dependencies);
- }
- /**
- * Returns the error handler settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return boolean
- * @since Method available since Release 3.4.0
- */
- public static function getErrorHandlerSettings($className, $methodName)
- {
- return self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'errorHandler'
- );
- }
- /**
- * Returns the groups for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.2.0
- */
- public static function getGroups($className, $methodName = '')
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $groups = array();
- if (isset($annotations['method']['author'])) {
- $groups = $annotations['method']['author'];
- } elseif (isset($annotations['class']['author'])) {
- $groups = $annotations['class']['author'];
- }
- if (isset($annotations['class']['group'])) {
- $groups = array_merge($groups, $annotations['class']['group']);
- }
- if (isset($annotations['method']['group'])) {
- $groups = array_merge($groups, $annotations['method']['group']);
- }
- if (isset($annotations['class']['ticket'])) {
- $groups = array_merge($groups, $annotations['class']['ticket']);
- }
- if (isset($annotations['method']['ticket'])) {
- $groups = array_merge($groups, $annotations['method']['ticket']);
- }
- foreach (array('small', 'medium', 'large') as $size) {
- if (isset($annotations['method'][$size])) {
- $groups[] = $size;
- } elseif (isset($annotations['class'][$size])) {
- $groups[] = $size;
- }
- }
- return array_unique($groups);
- }
- /**
- * Returns the size of the test.
- *
- * @param string $className
- * @param string $methodName
- * @return integer
- * @since Method available since Release 3.6.0
- */
- public static function getSize($className, $methodName)
- {
- $groups = array_flip(self::getGroups($className, $methodName));
- $size = self::UNKNOWN;
- $class = new ReflectionClass($className);
- if (isset($groups['large']) ||
- (class_exists('PHPUnit_Extensions_Database_TestCase', false) &&
- $class->isSubclassOf('PHPUnit_Extensions_Database_TestCase')) ||
- (class_exists('PHPUnit_Extensions_SeleniumTestCase', false) &&
- $class->isSubclassOf('PHPUnit_Extensions_SeleniumTestCase'))) {
- $size = self::LARGE;
- } elseif (isset($groups['medium'])) {
- $size = self::MEDIUM;
- } elseif (isset($groups['small'])) {
- $size = self::SMALL;
- }
- return $size;
- }
- /**
- * Returns the tickets for a test class or method.
- *
- * @param string $className
- * @param string $methodName
- * @return array
- * @since Method available since Release 3.4.0
- */
- public static function getTickets($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $tickets = array();
- if (isset($annotations['class']['ticket'])) {
- $tickets = $annotations['class']['ticket'];
- }
- if (isset($annotations['method']['ticket'])) {
- $tickets = array_merge($tickets, $annotations['method']['ticket']);
- }
- return array_unique($tickets);
- }
- /**
- * Returns the process isolation settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return boolean
- * @since Method available since Release 3.4.1
- */
- public static function getProcessIsolationSettings($className, $methodName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- if (isset($annotations['class']['runTestsInSeparateProcesses']) ||
- isset($annotations['method']['runInSeparateProcess'])) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * Returns the preserve global state settings for a test.
- *
- * @param string $className
- * @param string $methodName
- * @return boolean
- * @since Method available since Release 3.4.0
- */
- public static function getPreserveGlobalStateSettings($className, $methodName)
- {
- return self::getBooleanAnnotationSetting(
- $className,
- $methodName,
- 'preserveGlobalState'
- );
- }
- /**
- * @param string $className
- * @return array
- * @since Method available since Release 4.0.8
- */
- public static function getHookMethods($className)
- {
- if (!class_exists($className, false)) {
- return self::emptyHookMethodsArray();
- }
- if (!isset(self::$hookMethods[$className])) {
- self::$hookMethods[$className] = self::emptyHookMethodsArray();
- try {
- $class = new ReflectionClass($className);
- foreach ($class->getMethods() as $method) {
- if ($method->getDeclaringClass()->getName() != $className) {
- continue;
- }
- if (self::isBeforeClassMethod($method)) {
- self::$hookMethods[$className]['beforeClass'][] = $method->getName();
- }
- if (self::isBeforeMethod($method)) {
- self::$hookMethods[$className]['before'][] = $method->getName();
- }
- if (self::isAfterMethod($method)) {
- self::$hookMethods[$className]['after'][] = $method->getName();
- }
- if (self::isAfterClassMethod($method)) {
- self::$hookMethods[$className]['afterClass'][] = $method->getName();
- }
- }
- } catch (ReflectionException $e) {
- }
- }
- return self::$hookMethods[$className];
- }
- /**
- * @return array
- * @since Method available since Release 4.0.9
- */
- private static function emptyHookMethodsArray()
- {
- return array(
- 'beforeClass' => array('setUpBeforeClass'),
- 'before' => array('setUp'),
- 'after' => array('tearDown'),
- 'afterClass' => array('tearDownAfterClass')
- );
- }
- /**
- * @param string $className
- * @param string $methodName
- * @param string $settingName
- * @return boolean
- * @since Method available since Release 3.4.0
- */
- private static function getBooleanAnnotationSetting($className, $methodName, $settingName)
- {
- $annotations = self::parseTestMethodAnnotations(
- $className,
- $methodName
- );
- $result = null;
- if (isset($annotations['class'][$settingName])) {
- if ($annotations['class'][$settingName][0] == 'enabled') {
- $result = true;
- } elseif ($annotations['class'][$settingName][0] == 'disabled') {
- $result = false;
- }
- }
- if (isset($annotations['method'][$settingName])) {
- if ($annotations['method'][$settingName][0] == 'enabled') {
- $result = true;
- } elseif ($annotations['method'][$settingName][0] == 'disabled') {
- $result = false;
- }
- }
- return $result;
- }
- /**
- * @param string $element
- * @return array
- * @throws PHPUnit_Framework_InvalidCoversTargetException
- * @since Method available since Release 4.0.0
- */
- private static function resolveElementToReflectionObjects($element)
- {
- $codeToCoverList = array();
- if (strpos($element, '::') !== false) {
- list($className, $methodName) = explode('::', $element);
- if (isset($methodName[0]) && $methodName[0] == '<') {
- $classes = array($className);
- foreach ($classes as $className) {
- if (!class_exists($className) &&
- !interface_exists($className)) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing class or ' .
- 'interface "%s".',
- $className
- )
- );
- }
- $class = new ReflectionClass($className);
- $methods = $class->getMethods();
- $inverse = isset($methodName[1]) && $methodName[1] == '!';
- if (strpos($methodName, 'protected')) {
- $visibility = 'isProtected';
- } elseif (strpos($methodName, 'private')) {
- $visibility = 'isPrivate';
- } elseif (strpos($methodName, 'public')) {
- $visibility = 'isPublic';
- }
- foreach ($methods as $method) {
- if ($inverse && !$method->$visibility()) {
- $codeToCoverList[] = $method;
- } elseif (!$inverse && $method->$visibility()) {
- $codeToCoverList[] = $method;
- }
- }
- }
- } else {
- $classes = array($className);
- foreach ($classes as $className) {
- if ($className == '' && function_exists($methodName)) {
- $codeToCoverList[] = new ReflectionFunction(
- $methodName
- );
- } else {
- if (!((class_exists($className) ||
- interface_exists($className) ||
- trait_exists($className)) &&
- method_exists($className, $methodName))) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing method "%s::%s".',
- $className,
- $methodName
- )
- );
- }
- $codeToCoverList[] = new ReflectionMethod(
- $className,
- $methodName
- );
- }
- }
- }
- } else {
- $extended = false;
- if (strpos($element, '<extended>') !== false) {
- $element = str_replace('<extended>', '', $element);
- $extended = true;
- }
- $classes = array($element);
- if ($extended) {
- $classes = array_merge(
- $classes,
- class_implements($element),
- class_parents($element)
- );
- }
- foreach ($classes as $className) {
- if (!class_exists($className) &&
- !interface_exists($className) &&
- !trait_exists($className)) {
- throw new PHPUnit_Framework_InvalidCoversTargetException(
- sprintf(
- 'Trying to @cover or @use not existing class or ' .
- 'interface "%s".',
- $className
- )
- );
- }
- $codeToCoverList[] = new ReflectionClass($className);
- }
- }
- return $codeToCoverList;
- }
- /**
- * @param array $reflectors
- * @return array
- */
- private static function resolveReflectionObjectsToLines(array $reflectors)
- {
- $result = array();
- foreach ($reflectors as $reflector) {
- $filename = $reflector->getFileName();
- if (!isset($result[$filename])) {
- $result[$filename] = array();
- }
- $result[$filename] = array_unique(
- array_merge(
- $result[$filename],
- range($reflector->getStartLine(), $reflector->getEndLine())
- )
- );
- }
- return $result;
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- * @since Method available since Release 4.0.8
- */
- private static function isBeforeClassMethod(ReflectionMethod $method)
- {
- return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false;
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- * @since Method available since Release 4.0.8
- */
- private static function isBeforeMethod(ReflectionMethod $method)
- {
- return preg_match('/@before\b/', $method->getDocComment());
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- * @since Method available since Release 4.0.8
- */
- private static function isAfterClassMethod(ReflectionMethod $method)
- {
- return $method->isStatic() && strpos($method->getDocComment(), '@afterClass') !== false;
- }
- /**
- * @param ReflectionMethod $method
- * @return boolean
- * @since Method available since Release 4.0.8
- */
- private static function isAfterMethod(ReflectionMethod $method)
- {
- return preg_match('/@after\b/', $method->getDocComment());
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Filesystem helpers.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Filesystem
- {
- /**
- * @var array
- */
- protected static $buffer = array();
- /**
- * Maps class names to source file names:
- * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php
- * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php
- *
- * @param string $className
- * @return string
- * @since Method available since Release 3.4.0
- */
- public static function classNameToFilename($className)
- {
- return str_replace(
- array('_', '\\'),
- DIRECTORY_SEPARATOR,
- $className
- ) . '.php';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Command-line options parsing class.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Andrei Zmievski <andrei@php.net>
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Getopt
- {
- public static function getopt(array $args, $short_options, $long_options = null)
- {
- if (empty($args)) {
- return array(array(), array());
- }
- $opts = array();
- $non_opts = array();
- if ($long_options) {
- sort($long_options);
- }
- if (isset($args[0][0]) && $args[0][0] != '-') {
- array_shift($args);
- }
- reset($args);
- array_map('trim', $args);
- while (list($i, $arg) = each($args)) {
- if ($arg == '') {
- continue;
- }
- if ($arg == '--') {
- $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
- break;
- }
- if ($arg[0] != '-' ||
- (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
- $non_opts = array_merge($non_opts, array_slice($args, $i));
- break;
- } elseif (strlen($arg) > 1 && $arg[1] == '-') {
- self::parseLongOption(
- substr($arg, 2),
- $long_options,
- $opts,
- $args
- );
- } else {
- self::parseShortOption(
- substr($arg, 1),
- $short_options,
- $opts,
- $args
- );
- }
- }
- return array($opts, $non_opts);
- }
- protected static function parseShortOption($arg, $short_options, &$opts, &$args)
- {
- $argLen = strlen($arg);
- for ($i = 0; $i < $argLen; $i++) {
- $opt = $arg[$i];
- $opt_arg = null;
- if (($spec = strstr($short_options, $opt)) === false ||
- $arg[$i] == ':') {
- throw new PHPUnit_Framework_Exception(
- "unrecognized option -- $opt"
- );
- }
- if (strlen($spec) > 1 && $spec[1] == ':') {
- if (strlen($spec) > 2 && $spec[2] == ':') {
- if ($i + 1 < $argLen) {
- $opts[] = array($opt, substr($arg, $i + 1));
- break;
- }
- } else {
- if ($i + 1 < $argLen) {
- $opts[] = array($opt, substr($arg, $i + 1));
- break;
- } elseif (list(, $opt_arg) = each($args)) {
- } else {
- throw new PHPUnit_Framework_Exception(
- "option requires an argument -- $opt"
- );
- }
- }
- }
- $opts[] = array($opt, $opt_arg);
- }
- }
- protected static function parseLongOption($arg, $long_options, &$opts, &$args)
- {
- $count = count($long_options);
- $list = explode('=', $arg);
- $opt = $list[0];
- $opt_arg = null;
- if (count($list) > 1) {
- $opt_arg = $list[1];
- }
- $opt_len = strlen($opt);
- for ($i = 0; $i < $count; $i++) {
- $long_opt = $long_options[$i];
- $opt_start = substr($long_opt, 0, $opt_len);
- if ($opt_start != $opt) {
- continue;
- }
- $opt_rest = substr($long_opt, $opt_len);
- if ($opt_rest != '' && $opt[0] != '=' && $i + 1 < $count &&
- $opt == substr($long_options[$i+1], 0, $opt_len)) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt is ambiguous"
- );
- }
- if (substr($long_opt, -1) == '=') {
- if (substr($long_opt, -2) != '==') {
- if (!strlen($opt_arg) &&
- !(list(, $opt_arg) = each($args))) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt requires an argument"
- );
- }
- }
- } elseif ($opt_arg) {
- throw new PHPUnit_Framework_Exception(
- "option --$opt doesn't allow an argument"
- );
- }
- $full_option = '--' . preg_replace('/={1,2}$/', '', $long_opt);
- $opts[] = array($full_option, $opt_arg);
- return;
- }
- throw new PHPUnit_Framework_Exception("unrecognized option --$opt");
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- // Workaround for http://bugs.php.net/bug.php?id=47987,
- // see https://github.com/sebastianbergmann/phpunit/issues#issue/125 for details
- // Use dirname(__DIR__) instead of using /../ because of https://github.com/facebook/hhvm/issues/5215
- require_once dirname(__DIR__) . '/Framework/Error.php';
- require_once dirname(__DIR__) . '/Framework/Error/Notice.php';
- require_once dirname(__DIR__) . '/Framework/Error/Warning.php';
- require_once dirname(__DIR__) . '/Framework/Error/Deprecated.php';
- /**
- * Error handler that converts PHP errors and warnings to exceptions.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.3.0
- */
- class PHPUnit_Util_ErrorHandler
- {
- protected static $errorStack = array();
- /**
- * Returns the error stack.
- *
- * @return array
- */
- public static function getErrorStack()
- {
- return self::$errorStack;
- }
- /**
- * @param integer $errno
- * @param string $errstr
- * @param string $errfile
- * @param integer $errline
- * @throws PHPUnit_Framework_Error
- */
- public static function handleError($errno, $errstr, $errfile, $errline)
- {
- if (!($errno & error_reporting())) {
- return false;
- }
- self::$errorStack[] = array($errno, $errstr, $errfile, $errline);
- $trace = debug_backtrace(false);
- array_shift($trace);
- foreach ($trace as $frame) {
- if ($frame['function'] == '__toString') {
- return false;
- }
- }
- if ($errno == E_NOTICE || $errno == E_USER_NOTICE || $errno == E_STRICT) {
- if (PHPUnit_Framework_Error_Notice::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Notice';
- } elseif ($errno == E_WARNING || $errno == E_USER_WARNING) {
- if (PHPUnit_Framework_Error_Warning::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Warning';
- } elseif ($errno == E_DEPRECATED || $errno == E_USER_DEPRECATED) {
- if (PHPUnit_Framework_Error_Deprecated::$enabled !== true) {
- return false;
- }
- $exception = 'PHPUnit_Framework_Error_Deprecated';
- } else {
- $exception = 'PHPUnit_Framework_Error';
- }
- throw new $exception($errstr, $errno, $errfile, $errline);
- }
- /**
- * Registers an error handler and returns a function that will restore
- * the previous handler when invoked
- * @param integer $severity PHP predefined error constant
- * @link http://www.php.net/manual/en/errorfunc.constants.php
- * @throws Exception if event of specified severity is emitted
- */
- public static function handleErrorOnce($severity = E_WARNING)
- {
- $terminator = function () {
- static $expired = false;
- if (!$expired) {
- $expired = true;
- // cleans temporary error handler
- return restore_error_handler();
- }
- };
- set_error_handler(function ($errno, $errstr) use ($severity) {
- if ($errno === $severity) {
- return;
- }
- return false;
- });
- return $terminator;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * String helpers.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.6.0
- */
- class PHPUnit_Util_String
- {
- /**
- * Converts a string to UTF-8 encoding.
- *
- * @param string $string
- * @return string
- */
- public static function convertToUtf8($string)
- {
- if (!self::isUtf8($string)) {
- if (function_exists('mb_convert_encoding')) {
- $string = mb_convert_encoding($string, 'UTF-8');
- } else {
- $string = utf8_encode($string);
- }
- }
- return $string;
- }
- /**
- * Checks a string for UTF-8 encoding.
- *
- * @param string $string
- * @return boolean
- */
- protected static function isUtf8($string)
- {
- $length = strlen($string);
- for ($i = 0; $i < $length; $i++) {
- if (ord($string[$i]) < 0x80) {
- $n = 0;
- } elseif ((ord($string[$i]) & 0xE0) == 0xC0) {
- $n = 1;
- } elseif ((ord($string[$i]) & 0xF0) == 0xE0) {
- $n = 2;
- } elseif ((ord($string[$i]) & 0xF0) == 0xF0) {
- $n = 3;
- } else {
- return false;
- }
- for ($j = 0; $j < $n; $j++) {
- if ((++$i == $length) || ((ord($string[$i]) & 0xC0) != 0x80)) {
- return false;
- }
- }
- }
- return true;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Factory for PHPUnit_Framework_Exception objects that are used to describe
- * invalid arguments passed to a function or method.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Util_InvalidArgumentHelper
- {
- /**
- * @param integer $argument
- * @param string $type
- * @param mixed $value
- * @return PHPUnit_Framework_Exception
- */
- public static function factory($argument, $type, $value = null)
- {
- $stack = debug_backtrace(false);
- return new PHPUnit_Framework_Exception(
- sprintf(
- 'Argument #%d%sof %s::%s() must be a %s',
- $argument,
- $value !== null ? ' (' . gettype($value) . '#' . $value . ')' : ' (No Value) ',
- $stack[1]['class'],
- $stack[1]['function'],
- $type
- )
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class that can print to STDOUT or write to a file.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Util_Printer
- {
- /**
- * If true, flush output after every write.
- *
- * @var boolean
- */
- protected $autoFlush = false;
- /**
- * @var resource
- */
- protected $out;
- /**
- * @var string
- */
- protected $outTarget;
- /**
- * @var boolean
- */
- protected $printsHTML = false;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @throws PHPUnit_Framework_Exception
- */
- public function __construct($out = null)
- {
- if ($out !== null) {
- if (is_string($out)) {
- if (strpos($out, 'socket://') === 0) {
- $out = explode(':', str_replace('socket://', '', $out));
- if (sizeof($out) != 2) {
- throw new PHPUnit_Framework_Exception;
- }
- $this->out = fsockopen($out[0], $out[1]);
- } else {
- if (strpos($out, 'php://') === false &&
- !is_dir(dirname($out))) {
- mkdir(dirname($out), 0777, true);
- }
- $this->out = fopen($out, 'wt');
- }
- $this->outTarget = $out;
- } else {
- $this->out = $out;
- }
- }
- }
- /**
- * Flush buffer, optionally tidy up HTML, and close output if it's not to a php stream
- */
- public function flush()
- {
- if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) {
- fclose($this->out);
- }
- if ($this->printsHTML === true &&
- $this->outTarget !== null &&
- strpos($this->outTarget, 'php://') !== 0 &&
- strpos($this->outTarget, 'socket://') !== 0 &&
- extension_loaded('tidy')) {
- file_put_contents(
- $this->outTarget,
- tidy_repair_file(
- $this->outTarget,
- array('indent' => true, 'wrap' => 0),
- 'utf8'
- )
- );
- }
- }
- /**
- * Performs a safe, incremental flush.
- *
- * Do not confuse this function with the flush() function of this class,
- * since the flush() function may close the file being written to, rendering
- * the current object no longer usable.
- *
- * @since Method available since Release 3.3.0
- */
- public function incrementalFlush()
- {
- if ($this->out) {
- fflush($this->out);
- } else {
- flush();
- }
- }
- /**
- * @param string $buffer
- */
- public function write($buffer)
- {
- if ($this->out) {
- fwrite($this->out, $buffer);
- if ($this->autoFlush) {
- $this->incrementalFlush();
- }
- } else {
- if (PHP_SAPI != 'cli') {
- $buffer = htmlspecialchars($buffer);
- }
- print $buffer;
- if ($this->autoFlush) {
- $this->incrementalFlush();
- }
- }
- }
- /**
- * Check auto-flush mode.
- *
- * @return boolean
- * @since Method available since Release 3.3.0
- */
- public function getAutoFlush()
- {
- return $this->autoFlush;
- }
- /**
- * Set auto-flushing mode.
- *
- * If set, *incremental* flushes will be done after each write. This should
- * not be confused with the different effects of this class' flush() method.
- *
- * @param boolean $autoFlush
- * @since Method available since Release 3.3.0
- */
- public function setAutoFlush($autoFlush)
- {
- if (is_bool($autoFlush)) {
- $this->autoFlush = $autoFlush;
- } else {
- throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Wrapper for the PHPUnit XML configuration file.
- *
- * Example XML configuration file:
- * <code>
- * <?xml version="1.0" encoding="utf-8" ?>
- *
- * <phpunit backupGlobals="true"
- * backupStaticAttributes="false"
- * bootstrap="/path/to/bootstrap.php"
- * cacheTokens="false"
- * columns="80"
- * colors="false"
- * stderr="false"
- * convertErrorsToExceptions="true"
- * convertNoticesToExceptions="true"
- * convertWarningsToExceptions="true"
- * forceCoversAnnotation="false"
- * mapTestClassNameToCoveredClassName="false"
- * printerClass="PHPUnit_TextUI_ResultPrinter"
- * processIsolation="false"
- * stopOnError="false"
- * stopOnFailure="false"
- * stopOnIncomplete="false"
- * stopOnRisky="false"
- * stopOnSkipped="false"
- * testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
- * timeoutForSmallTests="1"
- * timeoutForMediumTests="10"
- * timeoutForLargeTests="60"
- * beStrictAboutTestsThatDoNotTestAnything="false"
- * beStrictAboutOutputDuringTests="false"
- * beStrictAboutTestSize="false"
- * beStrictAboutTodoAnnotatedTests="false"
- * checkForUnintentionallyCoveredCode="false"
- * disallowChangesToGlobalState="false"
- * verbose="false">
- * <testsuites>
- * <testsuite name="My Test Suite">
- * <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
- * <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
- * <exclude>/path/to/files/exclude</exclude>
- * </testsuite>
- * </testsuites>
- *
- * <groups>
- * <include>
- * <group>name</group>
- * </include>
- * <exclude>
- * <group>name</group>
- * </exclude>
- * </groups>
- *
- * <filter>
- * <blacklist>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * <exclude>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * </exclude>
- * </blacklist>
- * <whitelist addUncoveredFilesFromWhitelist="true"
- * processUncoveredFilesFromWhitelist="false">
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * <exclude>
- * <directory suffix=".php">/path/to/files</directory>
- * <file>/path/to/file</file>
- * </exclude>
- * </whitelist>
- * </filter>
- *
- * <listeners>
- * <listener class="MyListener" file="/optional/path/to/MyListener.php">
- * <arguments>
- * <array>
- * <element key="0">
- * <string>Sebastian</string>
- * </element>
- * </array>
- * <integer>22</integer>
- * <string>April</string>
- * <double>19.78</double>
- * <null/>
- * <object class="stdClass"/>
- * <file>MyRelativeFile.php</file>
- * <directory>MyRelativeDir</directory>
- * </arguments>
- * </listener>
- * </listeners>
- *
- * <logging>
- * <log type="coverage-html" target="/tmp/report" lowUpperBound="50" highLowerBound="90"/>
- * <log type="coverage-clover" target="/tmp/clover.xml"/>
- * <log type="json" target="/tmp/logfile.json"/>
- * <log type="plain" target="/tmp/logfile.txt"/>
- * <log type="tap" target="/tmp/logfile.tap"/>
- * <log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
- * <log type="testdox-html" target="/tmp/testdox.html"/>
- * <log type="testdox-text" target="/tmp/testdox.txt"/>
- * <log type="coverage-crap4j" target="/tmp/crap.xml"/>
- * </logging>
- *
- * <php>
- * <includePath>.</includePath>
- * <ini name="foo" value="bar"/>
- * <const name="foo" value="bar"/>
- * <var name="foo" value="bar"/>
- * <env name="foo" value="bar"/>
- * <post name="foo" value="bar"/>
- * <get name="foo" value="bar"/>
- * <cookie name="foo" value="bar"/>
- * <server name="foo" value="bar"/>
- * <files name="foo" value="bar"/>
- * <request name="foo" value="bar"/>
- * </php>
- *
- * <selenium>
- * <browser name="Firefox on Linux"
- * browser="*firefox /usr/lib/firefox/firefox-bin"
- * host="my.linux.box"
- * port="4444"
- * timeout="30000"/>
- * </selenium>
- * </phpunit>
- * </code>
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.2.0
- */
- class PHPUnit_Util_Configuration
- {
- private static $instances = array();
- protected $document;
- protected $xpath;
- protected $filename;
- /**
- * Loads a PHPUnit configuration file.
- *
- * @param string $filename
- */
- protected function __construct($filename)
- {
- $this->filename = $filename;
- $this->document = PHPUnit_Util_XML::loadFile($filename, false, true, true);
- $this->xpath = new DOMXPath($this->document);
- }
- /**
- * @since Method available since Release 3.4.0
- */
- final private function __clone()
- {
- }
- /**
- * Returns a PHPUnit configuration object.
- *
- * @param string $filename
- * @return PHPUnit_Util_Configuration
- * @since Method available since Release 3.4.0
- */
- public static function getInstance($filename)
- {
- $realpath = realpath($filename);
- if ($realpath === false) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not read "%s".',
- $filename
- )
- );
- }
- if (!isset(self::$instances[$realpath])) {
- self::$instances[$realpath] = new PHPUnit_Util_Configuration($realpath);
- }
- return self::$instances[$realpath];
- }
- /**
- * Returns the realpath to the configuration file.
- *
- * @return string
- * @since Method available since Release 3.6.0
- */
- public function getFilename()
- {
- return $this->filename;
- }
- /**
- * Returns the configuration for SUT filtering.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getFilterConfiguration()
- {
- $addUncoveredFilesFromWhitelist = true;
- $processUncoveredFilesFromWhitelist = false;
- $tmp = $this->xpath->query('filter/whitelist');
- if ($tmp->length == 1) {
- if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) {
- $addUncoveredFilesFromWhitelist = $this->getBoolean(
- (string) $tmp->item(0)->getAttribute(
- 'addUncoveredFilesFromWhitelist'
- ),
- true
- );
- }
- if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) {
- $processUncoveredFilesFromWhitelist = $this->getBoolean(
- (string) $tmp->item(0)->getAttribute(
- 'processUncoveredFilesFromWhitelist'
- ),
- false
- );
- }
- }
- return array(
- 'blacklist' => array(
- 'include' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/blacklist/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/blacklist/file'
- )
- ),
- 'exclude' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/blacklist/exclude/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/blacklist/exclude/file'
- )
- )
- ),
- 'whitelist' => array(
- 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist,
- 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist,
- 'include' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/whitelist/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/whitelist/file'
- )
- ),
- 'exclude' => array(
- 'directory' => $this->readFilterDirectories(
- 'filter/whitelist/exclude/directory'
- ),
- 'file' => $this->readFilterFiles(
- 'filter/whitelist/exclude/file'
- )
- )
- )
- );
- }
- /**
- * Returns the configuration for groups.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getGroupConfiguration()
- {
- $groups = array(
- 'include' => array(),
- 'exclude' => array()
- );
- foreach ($this->xpath->query('groups/include/group') as $group) {
- $groups['include'][] = (string) $group->nodeValue;
- }
- foreach ($this->xpath->query('groups/exclude/group') as $group) {
- $groups['exclude'][] = (string) $group->nodeValue;
- }
- return $groups;
- }
- /**
- * Returns the configuration for listeners.
- *
- * @return array
- * @since Method available since Release 3.4.0
- */
- public function getListenerConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('listeners/listener') as $listener) {
- $class = (string) $listener->getAttribute('class');
- $file = '';
- $arguments = array();
- if ($listener->getAttribute('file')) {
- $file = $this->toAbsolutePath(
- (string) $listener->getAttribute('file'),
- true
- );
- }
- foreach ($listener->childNodes as $node) {
- if ($node instanceof DOMElement && $node->tagName == 'arguments') {
- foreach ($node->childNodes as $argument) {
- if ($argument instanceof DOMElement) {
- if ($argument->tagName == 'file' ||
- $argument->tagName == 'directory') {
- $arguments[] = $this->toAbsolutePath((string) $argument->nodeValue);
- } else {
- $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument);
- }
- }
- }
- }
- }
- $result[] = array(
- 'class' => $class,
- 'file' => $file,
- 'arguments' => $arguments
- );
- }
- return $result;
- }
- /**
- * Returns the logging configuration.
- *
- * @return array
- */
- public function getLoggingConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('logging/log') as $log) {
- $type = (string) $log->getAttribute('type');
- $target = (string) $log->getAttribute('target');
- if (!$target) {
- continue;
- }
- $target = $this->toAbsolutePath($target);
- if ($type == 'coverage-html') {
- if ($log->hasAttribute('lowUpperBound')) {
- $result['lowUpperBound'] = (string) $log->getAttribute('lowUpperBound');
- }
- if ($log->hasAttribute('highLowerBound')) {
- $result['highLowerBound'] = (string) $log->getAttribute('highLowerBound');
- }
- } elseif ($type == 'junit') {
- if ($log->hasAttribute('logIncompleteSkipped')) {
- $result['logIncompleteSkipped'] = $this->getBoolean(
- (string) $log->getAttribute('logIncompleteSkipped'),
- false
- );
- }
- } elseif ($type == 'coverage-text') {
- if ($log->hasAttribute('showUncoveredFiles')) {
- $result['coverageTextShowUncoveredFiles'] = $this->getBoolean(
- (string) $log->getAttribute('showUncoveredFiles'),
- false
- );
- }
- if ($log->hasAttribute('showOnlySummary')) {
- $result['coverageTextShowOnlySummary'] = $this->getBoolean(
- (string) $log->getAttribute('showOnlySummary'),
- false
- );
- }
- }
- $result[$type] = $target;
- }
- return $result;
- }
- /**
- * Returns the PHP configuration.
- *
- * @return array
- * @since Method available since Release 3.2.1
- */
- public function getPHPConfiguration()
- {
- $result = array(
- 'include_path' => array(),
- 'ini' => array(),
- 'const' => array(),
- 'var' => array(),
- 'env' => array(),
- 'post' => array(),
- 'get' => array(),
- 'cookie' => array(),
- 'server' => array(),
- 'files' => array(),
- 'request' => array()
- );
- foreach ($this->xpath->query('php/includePath') as $includePath) {
- $path = (string) $includePath->nodeValue;
- if ($path) {
- $result['include_path'][] = $this->toAbsolutePath($path);
- }
- }
- foreach ($this->xpath->query('php/ini') as $ini) {
- $name = (string) $ini->getAttribute('name');
- $value = (string) $ini->getAttribute('value');
- $result['ini'][$name] = $value;
- }
- foreach ($this->xpath->query('php/const') as $const) {
- $name = (string) $const->getAttribute('name');
- $value = (string) $const->getAttribute('value');
- $result['const'][$name] = $this->getBoolean($value, $value);
- }
- foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
- foreach ($this->xpath->query('php/' . $array) as $var) {
- $name = (string) $var->getAttribute('name');
- $value = (string) $var->getAttribute('value');
- $result[$array][$name] = $this->getBoolean($value, $value);
- }
- }
- return $result;
- }
- /**
- * Handles the PHP configuration.
- *
- * @since Method available since Release 3.2.20
- */
- public function handlePHPConfiguration()
- {
- $configuration = $this->getPHPConfiguration();
- if (! empty($configuration['include_path'])) {
- ini_set(
- 'include_path',
- implode(PATH_SEPARATOR, $configuration['include_path']) .
- PATH_SEPARATOR .
- ini_get('include_path')
- );
- }
- foreach ($configuration['ini'] as $name => $value) {
- if (defined($value)) {
- $value = constant($value);
- }
- ini_set($name, $value);
- }
- foreach ($configuration['const'] as $name => $value) {
- if (!defined($name)) {
- define($name, $value);
- }
- }
- foreach (array('var', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
- // See https://github.com/sebastianbergmann/phpunit/issues/277
- switch ($array) {
- case 'var':
- $target = &$GLOBALS;
- break;
- case 'server':
- $target = &$_SERVER;
- break;
- default:
- $target = &$GLOBALS['_' . strtoupper($array)];
- break;
- }
- foreach ($configuration[$array] as $name => $value) {
- $target[$name] = $value;
- }
- }
- foreach ($configuration['env'] as $name => $value) {
- if (false === getenv($name)) {
- putenv("{$name}={$value}");
- }
- if (!isset($_ENV[$name])) {
- $_ENV[$name] = $value;
- }
- }
- }
- /**
- * Returns the PHPUnit configuration.
- *
- * @return array
- * @since Method available since Release 3.2.14
- */
- public function getPHPUnitConfiguration()
- {
- $result = array();
- $root = $this->document->documentElement;
- if ($root->hasAttribute('cacheTokens')) {
- $result['cacheTokens'] = $this->getBoolean(
- (string) $root->getAttribute('cacheTokens'),
- false
- );
- }
- if ($root->hasAttribute('columns')) {
- $columns = (string) $root->getAttribute('columns');
- if ($columns == 'max') {
- $result['columns'] = 'max';
- } else {
- $result['columns'] = $this->getInteger($columns, 80);
- }
- }
- if ($root->hasAttribute('colors')) {
- /* only allow boolean for compatibility with previous versions
- 'always' only allowed from command line */
- if ($this->getBoolean($root->getAttribute('colors'), false)) {
- $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_AUTO;
- } else {
- $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_NEVER;
- }
- }
- /**
- * Issue #657
- */
- if ($root->hasAttribute('stderr')) {
- $result['stderr'] = $this->getBoolean(
- (string)$root->getAttribute('stderr'),
- false
- );
- }
- if ($root->hasAttribute('backupGlobals')) {
- $result['backupGlobals'] = $this->getBoolean(
- (string) $root->getAttribute('backupGlobals'),
- true
- );
- }
- if ($root->hasAttribute('backupStaticAttributes')) {
- $result['backupStaticAttributes'] = $this->getBoolean(
- (string) $root->getAttribute('backupStaticAttributes'),
- false
- );
- }
- if ($root->getAttribute('bootstrap')) {
- $result['bootstrap'] = $this->toAbsolutePath(
- (string) $root->getAttribute('bootstrap')
- );
- }
- if ($root->hasAttribute('convertErrorsToExceptions')) {
- $result['convertErrorsToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertErrorsToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('convertNoticesToExceptions')) {
- $result['convertNoticesToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertNoticesToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('convertWarningsToExceptions')) {
- $result['convertWarningsToExceptions'] = $this->getBoolean(
- (string) $root->getAttribute('convertWarningsToExceptions'),
- true
- );
- }
- if ($root->hasAttribute('forceCoversAnnotation')) {
- $result['forceCoversAnnotation'] = $this->getBoolean(
- (string) $root->getAttribute('forceCoversAnnotation'),
- false
- );
- }
- if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) {
- $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean(
- (string) $root->getAttribute('mapTestClassNameToCoveredClassName'),
- false
- );
- }
- if ($root->hasAttribute('processIsolation')) {
- $result['processIsolation'] = $this->getBoolean(
- (string) $root->getAttribute('processIsolation'),
- false
- );
- }
- if ($root->hasAttribute('stopOnError')) {
- $result['stopOnError'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnError'),
- false
- );
- }
- if ($root->hasAttribute('stopOnFailure')) {
- $result['stopOnFailure'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnFailure'),
- false
- );
- }
- if ($root->hasAttribute('stopOnIncomplete')) {
- $result['stopOnIncomplete'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnIncomplete'),
- false
- );
- }
- if ($root->hasAttribute('stopOnRisky')) {
- $result['stopOnRisky'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnRisky'),
- false
- );
- }
- if ($root->hasAttribute('stopOnSkipped')) {
- $result['stopOnSkipped'] = $this->getBoolean(
- (string) $root->getAttribute('stopOnSkipped'),
- false
- );
- }
- if ($root->hasAttribute('testSuiteLoaderClass')) {
- $result['testSuiteLoaderClass'] = (string) $root->getAttribute(
- 'testSuiteLoaderClass'
- );
- }
- if ($root->getAttribute('testSuiteLoaderFile')) {
- $result['testSuiteLoaderFile'] = $this->toAbsolutePath(
- (string) $root->getAttribute('testSuiteLoaderFile')
- );
- }
- if ($root->hasAttribute('printerClass')) {
- $result['printerClass'] = (string) $root->getAttribute(
- 'printerClass'
- );
- }
- if ($root->getAttribute('printerFile')) {
- $result['printerFile'] = $this->toAbsolutePath(
- (string) $root->getAttribute('printerFile')
- );
- }
- if ($root->hasAttribute('timeoutForSmallTests')) {
- $result['timeoutForSmallTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForSmallTests'),
- 1
- );
- }
- if ($root->hasAttribute('timeoutForMediumTests')) {
- $result['timeoutForMediumTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForMediumTests'),
- 10
- );
- }
- if ($root->hasAttribute('timeoutForLargeTests')) {
- $result['timeoutForLargeTests'] = $this->getInteger(
- (string) $root->getAttribute('timeoutForLargeTests'),
- 60
- );
- }
- if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) {
- $result['reportUselessTests'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'),
- false
- );
- }
- if ($root->hasAttribute('checkForUnintentionallyCoveredCode')) {
- $result['strictCoverage'] = $this->getBoolean(
- (string) $root->getAttribute('checkForUnintentionallyCoveredCode'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutOutputDuringTests')) {
- $result['disallowTestOutput'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutOutputDuringTests'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) {
- $result['disallowChangesToGlobalState'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutChangesToGlobalState'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutTestSize')) {
- $result['enforceTimeLimit'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTestSize'),
- false
- );
- }
- if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) {
- $result['disallowTodoAnnotatedTests'] = $this->getBoolean(
- (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'),
- false
- );
- }
- if ($root->hasAttribute('strict')) {
- $flag = $this->getBoolean(
- (string) $root->getAttribute('strict'),
- false
- );
- $result['reportUselessTests'] = $flag;
- $result['strictCoverage'] = $flag;
- $result['disallowTestOutput'] = $flag;
- $result['enforceTimeLimit'] = $flag;
- $result['disallowTodoAnnotatedTests'] = $flag;
- $result['deprecatedStrictModeSetting'] = true;
- }
- if ($root->hasAttribute('verbose')) {
- $result['verbose'] = $this->getBoolean(
- (string) $root->getAttribute('verbose'),
- false
- );
- }
- return $result;
- }
- /**
- * Returns the SeleniumTestCase browser configuration.
- *
- * @return array
- * @since Method available since Release 3.2.9
- */
- public function getSeleniumBrowserConfiguration()
- {
- $result = array();
- foreach ($this->xpath->query('selenium/browser') as $config) {
- $name = (string) $config->getAttribute('name');
- $browser = (string) $config->getAttribute('browser');
- if ($config->hasAttribute('host')) {
- $host = (string) $config->getAttribute('host');
- } else {
- $host = 'localhost';
- }
- if ($config->hasAttribute('port')) {
- $port = $this->getInteger(
- (string) $config->getAttribute('port'),
- 4444
- );
- } else {
- $port = 4444;
- }
- if ($config->hasAttribute('timeout')) {
- $timeout = $this->getInteger(
- (string) $config->getAttribute('timeout'),
- 30000
- );
- } else {
- $timeout = 30000;
- }
- $result[] = array(
- 'name' => $name,
- 'browser' => $browser,
- 'host' => $host,
- 'port' => $port,
- 'timeout' => $timeout
- );
- }
- return $result;
- }
- /**
- * Returns the test suite configuration.
- *
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.2.1
- */
- public function getTestSuiteConfiguration($testSuiteFilter = null)
- {
- $testSuiteNodes = $this->xpath->query('testsuites/testsuite');
- if ($testSuiteNodes->length == 0) {
- $testSuiteNodes = $this->xpath->query('testsuite');
- }
- if ($testSuiteNodes->length == 1) {
- return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter);
- }
- if ($testSuiteNodes->length > 1) {
- $suite = new PHPUnit_Framework_TestSuite;
- foreach ($testSuiteNodes as $testSuiteNode) {
- $suite->addTestSuite(
- $this->getTestSuite($testSuiteNode, $testSuiteFilter)
- );
- }
- return $suite;
- }
- }
- /**
- * @param DOMElement $testSuiteNode
- * @return PHPUnit_Framework_TestSuite
- * @since Method available since Release 3.4.0
- */
- protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter = null)
- {
- if ($testSuiteNode->hasAttribute('name')) {
- $suite = new PHPUnit_Framework_TestSuite(
- (string) $testSuiteNode->getAttribute('name')
- );
- } else {
- $suite = new PHPUnit_Framework_TestSuite;
- }
- $exclude = array();
- foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) {
- $excludeFile = (string) $excludeNode->nodeValue;
- if ($excludeFile) {
- $exclude[] = $this->toAbsolutePath($excludeFile);
- }
- }
- $fileIteratorFacade = new File_Iterator_Facade;
- foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) {
- if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) {
- continue;
- }
- $directory = (string) $directoryNode->nodeValue;
- if (empty($directory)) {
- continue;
- }
- if ($directoryNode->hasAttribute('phpVersion')) {
- $phpVersion = (string) $directoryNode->getAttribute('phpVersion');
- } else {
- $phpVersion = PHP_VERSION;
- }
- if ($directoryNode->hasAttribute('phpVersionOperator')) {
- $phpVersionOperator = (string) $directoryNode->getAttribute('phpVersionOperator');
- } else {
- $phpVersionOperator = '>=';
- }
- if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
- continue;
- }
- if ($directoryNode->hasAttribute('prefix')) {
- $prefix = (string) $directoryNode->getAttribute('prefix');
- } else {
- $prefix = '';
- }
- if ($directoryNode->hasAttribute('suffix')) {
- $suffix = (string) $directoryNode->getAttribute('suffix');
- } else {
- $suffix = 'Test.php';
- }
- $files = $fileIteratorFacade->getFilesAsArray(
- $this->toAbsolutePath($directory),
- $suffix,
- $prefix,
- $exclude
- );
- $suite->addTestFiles($files);
- }
- foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) {
- if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) {
- continue;
- }
- $file = (string) $fileNode->nodeValue;
- if (empty($file)) {
- continue;
- }
- // Get the absolute path to the file
- $file = $fileIteratorFacade->getFilesAsArray(
- $this->toAbsolutePath($file)
- );
- if (!isset($file[0])) {
- continue;
- }
- $file = $file[0];
- if ($fileNode->hasAttribute('phpVersion')) {
- $phpVersion = (string) $fileNode->getAttribute('phpVersion');
- } else {
- $phpVersion = PHP_VERSION;
- }
- if ($fileNode->hasAttribute('phpVersionOperator')) {
- $phpVersionOperator = (string) $fileNode->getAttribute('phpVersionOperator');
- } else {
- $phpVersionOperator = '>=';
- }
- if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
- continue;
- }
- $suite->addTestFile($file);
- }
- return $suite;
- }
- /**
- * @param string $value
- * @param boolean $default
- * @return boolean
- * @since Method available since Release 3.2.3
- */
- protected function getBoolean($value, $default)
- {
- if (strtolower($value) == 'false') {
- return false;
- } elseif (strtolower($value) == 'true') {
- return true;
- }
- return $default;
- }
- /**
- * @param string $value
- * @param boolean $default
- * @return boolean
- * @since Method available since Release 3.6.0
- */
- protected function getInteger($value, $default)
- {
- if (is_numeric($value)) {
- return (int) $value;
- }
- return $default;
- }
- /**
- * @param string $query
- * @return array
- * @since Method available since Release 3.2.3
- */
- protected function readFilterDirectories($query)
- {
- $directories = array();
- foreach ($this->xpath->query($query) as $directory) {
- $directoryPath = (string) $directory->nodeValue;
- if (!$directoryPath) {
- continue;
- }
- if ($directory->hasAttribute('prefix')) {
- $prefix = (string) $directory->getAttribute('prefix');
- } else {
- $prefix = '';
- }
- if ($directory->hasAttribute('suffix')) {
- $suffix = (string) $directory->getAttribute('suffix');
- } else {
- $suffix = '.php';
- }
- if ($directory->hasAttribute('group')) {
- $group = (string) $directory->getAttribute('group');
- } else {
- $group = 'DEFAULT';
- }
- $directories[] = array(
- 'path' => $this->toAbsolutePath($directoryPath),
- 'prefix' => $prefix,
- 'suffix' => $suffix,
- 'group' => $group
- );
- }
- return $directories;
- }
- /**
- * @param string $query
- * @return array
- * @since Method available since Release 3.2.3
- */
- protected function readFilterFiles($query)
- {
- $files = array();
- foreach ($this->xpath->query($query) as $file) {
- $filePath = (string) $file->nodeValue;
- if ($filePath) {
- $files[] = $this->toAbsolutePath($filePath);
- }
- }
- return $files;
- }
- /**
- * @param string $path
- * @param boolean $useIncludePath
- * @return string
- * @since Method available since Release 3.5.0
- */
- protected function toAbsolutePath($path, $useIncludePath = false)
- {
- if ($path[0] === '/') {
- return $path;
- }
- // Matches the following on Windows:
- // - \\NetworkComputer\Path
- // - \\.\D:
- // - \\.\c:
- // - C:\Windows
- // - C:\windows
- // - C:/windows
- // - c:/windows
- if (defined('PHP_WINDOWS_VERSION_BUILD') &&
- ($path[0] === '\\' ||
- (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) {
- return $path;
- }
- // Stream
- if (strpos($path, '://') !== false) {
- return $path;
- }
- $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path;
- if ($useIncludePath && !file_exists($file)) {
- $includePathFile = stream_resolve_include_path($path);
- if ($includePathFile) {
- $file = $includePathFile;
- }
- }
- return $file;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- *
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- class PHPUnit_Util_GlobalState
- {
- /**
- * @var array
- */
- protected static $superGlobalArrays = array(
- '_ENV',
- '_POST',
- '_GET',
- '_COOKIE',
- '_SERVER',
- '_FILES',
- '_REQUEST'
- );
- /**
- * @var array
- */
- protected static $superGlobalArraysLong = array(
- 'HTTP_ENV_VARS',
- 'HTTP_POST_VARS',
- 'HTTP_GET_VARS',
- 'HTTP_COOKIE_VARS',
- 'HTTP_SERVER_VARS',
- 'HTTP_POST_FILES'
- );
- public static function getIncludedFilesAsString()
- {
- return static::processIncludedFilesAsString(get_included_files());
- }
- public static function processIncludedFilesAsString(array $files)
- {
- $blacklist = new PHPUnit_Util_Blacklist;
- $prefix = false;
- $result = '';
- if (defined('__PHPUNIT_PHAR__')) {
- $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/';
- }
- for ($i = count($files) - 1; $i > 0; $i--) {
- $file = $files[$i];
- if ($prefix !== false && strpos($file, $prefix) === 0) {
- continue;
- }
- // Skip virtual file system protocols
- if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) {
- continue;
- }
- if (!$blacklist->isBlacklisted($file) && is_file($file)) {
- $result = 'require_once \'' . $file . "';\n" . $result;
- }
- }
- return $result;
- }
- public static function getIniSettingsAsString()
- {
- $result = '';
- $iniSettings = ini_get_all(null, false);
- foreach ($iniSettings as $key => $value) {
- $result .= sprintf(
- '@ini_set(%s, %s);' . "\n",
- self::exportVariable($key),
- self::exportVariable($value)
- );
- }
- return $result;
- }
- public static function getConstantsAsString()
- {
- $constants = get_defined_constants(true);
- $result = '';
- if (isset($constants['user'])) {
- foreach ($constants['user'] as $name => $value) {
- $result .= sprintf(
- 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n",
- $name,
- $name,
- self::exportVariable($value)
- );
- }
- }
- return $result;
- }
- public static function getGlobalsAsString()
- {
- $result = '';
- $superGlobalArrays = self::getSuperGlobalArrays();
- foreach ($superGlobalArrays as $superGlobalArray) {
- if (isset($GLOBALS[$superGlobalArray]) &&
- is_array($GLOBALS[$superGlobalArray])) {
- foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) {
- if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) {
- continue;
- }
- $result .= sprintf(
- '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n",
- $superGlobalArray,
- $key,
- self::exportVariable($GLOBALS[$superGlobalArray][$key])
- );
- }
- }
- }
- $blacklist = $superGlobalArrays;
- $blacklist[] = 'GLOBALS';
- foreach (array_keys($GLOBALS) as $key) {
- if (!in_array($key, $blacklist) && !$GLOBALS[$key] instanceof Closure) {
- $result .= sprintf(
- '$GLOBALS[\'%s\'] = %s;' . "\n",
- $key,
- self::exportVariable($GLOBALS[$key])
- );
- }
- }
- return $result;
- }
- protected static function getSuperGlobalArrays()
- {
- if (ini_get('register_long_arrays') == '1') {
- return array_merge(
- self::$superGlobalArrays,
- self::$superGlobalArraysLong
- );
- } else {
- return self::$superGlobalArrays;
- }
- }
- protected static function exportVariable($variable)
- {
- if (is_scalar($variable) || is_null($variable) ||
- (is_array($variable) && self::arrayOnlyContainsScalars($variable))) {
- return var_export($variable, true);
- }
- return 'unserialize(' .
- var_export(serialize($variable), true) .
- ')';
- }
- protected static function arrayOnlyContainsScalars(array $array)
- {
- $result = true;
- foreach ($array as $element) {
- if (is_array($element)) {
- $result = self::arrayOnlyContainsScalars($element);
- } elseif (!is_scalar($element) && !is_null($element)) {
- $result = false;
- }
- if ($result === false) {
- break;
- }
- }
- return $result;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- if (!defined('JSON_PRETTY_PRINT')) {
- define('JSON_PRETTY_PRINT', 128);
- }
- /**
- * A TestListener that generates JSON messages.
- *
- * @package PHPUnit
- * @subpackage Util_Log
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var string
- */
- protected $currentTestSuiteName = '';
- /**
- * @var string
- */
- protected $currentTestName = '';
- /**
- * @var boolean
- * @access private
- */
- protected $currentTestPass = true;
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeCase(
- 'fail',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Incomplete Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Risky Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeCase(
- 'error',
- $time,
- PHPUnit_Util_Filter::getFilteredStacktrace($e, false),
- 'Skipped Test: ' . $e->getMessage(),
- $test
- );
- $this->currentTestPass = false;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->currentTestSuiteName = $suite->getName();
- $this->currentTestName = '';
- $this->write(
- array(
- 'event' => 'suiteStart',
- 'suite' => $this->currentTestSuiteName,
- 'tests' => count($suite)
- )
- );
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->currentTestSuiteName = '';
- $this->currentTestName = '';
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->currentTestName = PHPUnit_Util_Test::describe($test);
- $this->currentTestPass = true;
- $this->write(
- array(
- 'event' => 'testStart',
- 'suite' => $this->currentTestSuiteName,
- 'test' => $this->currentTestName
- )
- );
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if ($this->currentTestPass) {
- $this->writeCase('pass', $time, array(), '', $test);
- }
- }
- /**
- * @param string $status
- * @param float $time
- * @param array $trace
- * @param string $message
- * @param PHPUnit_Framework_TestCase|null $test
- */
- protected function writeCase($status, $time, array $trace = array(), $message = '', $test = null)
- {
- $output = '';
- // take care of TestSuite producing error (e.g. by running into exception) as TestSuite doesn't have hasOutput
- if ($test !== null && method_exists($test, 'hasOutput') && $test->hasOutput()) {
- $output = $test->getActualOutput();
- }
- $this->write(
- array(
- 'event' => 'test',
- 'suite' => $this->currentTestSuiteName,
- 'test' => $this->currentTestName,
- 'status' => $status,
- 'time' => $time,
- 'trace' => $trace,
- 'message' => PHPUnit_Util_String::convertToUtf8($message),
- 'output' => $output,
- )
- );
- }
- /**
- * @param string $buffer
- */
- public function write($buffer)
- {
- array_walk_recursive($buffer, function (&$input) {
- if (is_string($input)) {
- $input = PHPUnit_Util_String::convertToUtf8($input);
- }
- });
- parent::write(json_encode($buffer, JSON_PRETTY_PRINT));
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestListener that generates a logfile of the
- * test execution using the Test Anything Protocol (TAP).
- *
- * @package PHPUnit
- * @subpackage Util_Log
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Log_TAP extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var integer
- */
- protected $testNumber = 0;
- /**
- * @var integer
- */
- protected $testSuiteLevel = 0;
- /**
- * @var boolean
- */
- protected $testSuccessful = true;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.3.4
- */
- public function __construct($out = null)
- {
- parent::__construct($out);
- $this->write("TAP version 13\n");
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeNotOk($test, 'Error');
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $this->writeNotOk($test, 'Failure');
- $message = explode(
- "\n",
- PHPUnit_Framework_TestFailure::exceptionToString($e)
- );
- $diagnostic = array(
- 'message' => $message[0],
- 'severity' => 'fail'
- );
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
- $cf = $e->getComparisonFailure();
- if ($cf !== null) {
- $diagnostic['data'] = array(
- 'got' => $cf->getActual(),
- 'expected' => $cf->getExpected()
- );
- }
- }
- $yaml = new Symfony\Component\Yaml\Dumper;
- $this->write(
- sprintf(
- " ---\n%s ...\n",
- $yaml->dump($diagnostic, 2, 2)
- )
- );
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->writeNotOk($test, '', 'TODO Incomplete Test');
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->write(
- sprintf(
- "ok %d - # RISKY%s\n",
- $this->testNumber,
- $e->getMessage() != '' ? ' ' . $e->getMessage() : ''
- )
- );
- $this->testSuccessful = false;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- $this->write(
- sprintf(
- "ok %d - # SKIP%s\n",
- $this->testNumber,
- $e->getMessage() != '' ? ' ' . $e->getMessage() : ''
- )
- );
- $this->testSuccessful = false;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuiteLevel++;
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuiteLevel--;
- if ($this->testSuiteLevel == 0) {
- $this->write(sprintf("1..%d\n", $this->testNumber));
- }
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $this->testNumber++;
- $this->testSuccessful = true;
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if ($this->testSuccessful === true) {
- $this->write(
- sprintf(
- "ok %d - %s\n",
- $this->testNumber,
- PHPUnit_Util_Test::describe($test)
- )
- );
- }
- }
- /**
- * @param PHPUnit_Framework_Test $test
- * @param string $prefix
- * @param string $directive
- */
- protected function writeNotOk(PHPUnit_Framework_Test $test, $prefix = '', $directive = '')
- {
- $this->write(
- sprintf(
- "not ok %d - %s%s%s\n",
- $this->testNumber,
- $prefix != '' ? $prefix . ': ' : '',
- PHPUnit_Util_Test::describe($test),
- $directive != '' ? ' # ' . $directive : ''
- )
- );
- $this->testSuccessful = false;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A TestListener that generates a logfile of the test execution in XML markup.
- *
- * The XML markup used is the same as the one that is used by the JUnit Ant task.
- *
- * @package PHPUnit
- * @subpackage Util_Log
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_Log_JUnit extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var DOMDocument
- */
- protected $document;
- /**
- * @var DOMElement
- */
- protected $root;
- /**
- * @var boolean
- */
- protected $logIncompleteSkipped = false;
- /**
- * @var boolean
- */
- protected $writeDocument = true;
- /**
- * @var DOMElement[]
- */
- protected $testSuites = array();
- /**
- * @var integer[]
- */
- protected $testSuiteTests = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteAssertions = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteErrors = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteFailures = array(0);
- /**
- * @var integer[]
- */
- protected $testSuiteTimes = array(0);
- /**
- * @var integer
- */
- protected $testSuiteLevel = 0;
- /**
- * @var DOMElement
- */
- protected $currentTestCase = null;
- /**
- * @var boolean
- */
- protected $attachCurrentTestCase = true;
- /**
- * Constructor.
- *
- * @param mixed $out
- * @param boolean $logIncompleteSkipped
- */
- public function __construct($out = null, $logIncompleteSkipped = false)
- {
- $this->document = new DOMDocument('1.0', 'UTF-8');
- $this->document->formatOutput = true;
- $this->root = $this->document->createElement('testsuites');
- $this->document->appendChild($this->root);
- parent::__construct($out);
- $this->logIncompleteSkipped = $logIncompleteSkipped;
- }
- /**
- * Flush buffer and close output.
- *
- */
- public function flush()
- {
- if ($this->writeDocument === true) {
- $this->write($this->getXML());
- }
- parent::flush();
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->currentTestCase !== null) {
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $test->toString() . "\n";
- } else {
- $buffer = '';
- }
- $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
- "\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e);
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString($buffer)
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- }
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if ($this->currentTestCase !== null) {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($test instanceof PHPUnit_Framework_SelfDescribing) {
- $buffer = $test->toString() . "\n";
- } else {
- $buffer = '';
- }
- $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
- "\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e);
- $failure = $this->document->createElement(
- 'failure',
- PHPUnit_Util_XML::prepareString($buffer)
- );
- $failure->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($failure);
- $this->testSuiteFailures[$this->testSuiteLevel]++;
- }
- }
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Incomplete Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Risky Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if ($this->logIncompleteSkipped && $this->currentTestCase !== null) {
- $error = $this->document->createElement(
- 'error',
- PHPUnit_Util_XML::prepareString(
- "Skipped Test\n" .
- PHPUnit_Util_Filter::getFilteredStacktrace($e)
- )
- );
- $error->setAttribute('type', get_class($e));
- $this->currentTestCase->appendChild($error);
- $this->testSuiteErrors[$this->testSuiteLevel]++;
- } else {
- $this->attachCurrentTestCase = false;
- }
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $testSuite = $this->document->createElement('testsuite');
- $testSuite->setAttribute('name', $suite->getName());
- if (class_exists($suite->getName(), false)) {
- try {
- $class = new ReflectionClass($suite->getName());
- $testSuite->setAttribute('file', $class->getFileName());
- } catch (ReflectionException $e) {
- }
- }
- if ($this->testSuiteLevel > 0) {
- $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite);
- } else {
- $this->root->appendChild($testSuite);
- }
- $this->testSuiteLevel++;
- $this->testSuites[$this->testSuiteLevel] = $testSuite;
- $this->testSuiteTests[$this->testSuiteLevel] = 0;
- $this->testSuiteAssertions[$this->testSuiteLevel] = 0;
- $this->testSuiteErrors[$this->testSuiteLevel] = 0;
- $this->testSuiteFailures[$this->testSuiteLevel] = 0;
- $this->testSuiteTimes[$this->testSuiteLevel] = 0;
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'tests',
- $this->testSuiteTests[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'assertions',
- $this->testSuiteAssertions[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'failures',
- $this->testSuiteFailures[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'errors',
- $this->testSuiteErrors[$this->testSuiteLevel]
- );
- $this->testSuites[$this->testSuiteLevel]->setAttribute(
- 'time',
- sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel])
- );
- if ($this->testSuiteLevel > 1) {
- $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel];
- $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel];
- $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel];
- $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel];
- $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel];
- }
- $this->testSuiteLevel--;
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- $testCase = $this->document->createElement('testcase');
- $testCase->setAttribute('name', $test->getName());
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $class = new ReflectionClass($test);
- $methodName = $test->getName();
- if ($class->hasMethod($methodName)) {
- $method = $class->getMethod($test->getName());
- $testCase->setAttribute('class', $class->getName());
- $testCase->setAttribute('file', $class->getFileName());
- $testCase->setAttribute('line', $method->getStartLine());
- }
- }
- $this->currentTestCase = $testCase;
- }
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$test instanceof PHPUnit_Framework_Warning) {
- if ($this->attachCurrentTestCase) {
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $numAssertions = $test->getNumAssertions();
- $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions;
- $this->currentTestCase->setAttribute(
- 'assertions',
- $numAssertions
- );
- }
- $this->currentTestCase->setAttribute(
- 'time',
- sprintf('%F', $time)
- );
- $this->testSuites[$this->testSuiteLevel]->appendChild(
- $this->currentTestCase
- );
- $this->testSuiteTests[$this->testSuiteLevel]++;
- $this->testSuiteTimes[$this->testSuiteLevel] += $time;
- if (method_exists($test, 'hasOutput') && $test->hasOutput()) {
- $systemOut = $this->document->createElement('system-out');
- $systemOut->appendChild(
- $this->document->createTextNode($test->getActualOutput())
- );
- $this->currentTestCase->appendChild($systemOut);
- }
- }
- }
- $this->attachCurrentTestCase = true;
- $this->currentTestCase = null;
- }
- /**
- * Returns the XML as a string.
- *
- * @return string
- * @since Method available since Release 2.2.0
- */
- public function getXML()
- {
- return $this->document->saveXML();
- }
- /**
- * Enables or disables the writing of the document
- * in flush().
- *
- * This is a "hack" needed for the integration of
- * PHPUnit with Phing.
- *
- * @return string
- * @since Method available since Release 2.2.0
- */
- public function setWriteDocument($flag)
- {
- if (is_bool($flag)) {
- $this->writeDocument = $flag;
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for blacklisting PHPUnit's own source code files.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Util_Blacklist
- {
- /**
- * @var array
- */
- public static $blacklistedClassNames = array(
- 'File_Iterator' => 1,
- 'PHP_CodeCoverage' => 1,
- 'PHP_Invoker' => 1,
- 'PHP_Timer' => 1,
- 'PHP_Token' => 1,
- 'PHPUnit_Framework_TestCase' => 2,
- 'PHPUnit_Extensions_Database_TestCase' => 2,
- 'PHPUnit_Framework_MockObject_Generator' => 2,
- 'PHPUnit_Extensions_SeleniumTestCase' => 2,
- 'PHPUnit_Extensions_Story_TestCase' => 2,
- 'Text_Template' => 1,
- 'Symfony\Component\Yaml\Yaml' => 1,
- 'SebastianBergmann\Diff\Diff' => 1,
- 'SebastianBergmann\Environment\Runtime' => 1,
- 'SebastianBergmann\Comparator\Comparator' => 1,
- 'SebastianBergmann\Exporter\Exporter' => 1,
- 'SebastianBergmann\GlobalState\Snapshot' => 1,
- 'SebastianBergmann\RecursionContext\Context' => 1,
- 'SebastianBergmann\Version' => 1,
- 'Composer\Autoload\ClassLoader' => 1,
- 'Doctrine\Instantiator\Instantiator' => 1,
- 'phpDocumentor\Reflection\DocBlock' => 1,
- 'Prophecy\Prophet' => 1
- );
- /**
- * @var array
- */
- private static $directories;
- /**
- * @return array
- * @since Method available since Release 4.1.0
- */
- public function getBlacklistedDirectories()
- {
- $this->initialize();
- return self::$directories;
- }
- /**
- * @param string $file
- * @return boolean
- */
- public function isBlacklisted($file)
- {
- if (defined('PHPUNIT_TESTSUITE')) {
- return false;
- }
- $this->initialize();
- foreach (self::$directories as $directory) {
- if (strpos($file, $directory) === 0) {
- return true;
- }
- }
- return false;
- }
- private function initialize()
- {
- if (self::$directories === null) {
- self::$directories = array();
- foreach (self::$blacklistedClassNames as $className => $parent) {
- if (!class_exists($className)) {
- continue;
- }
- $reflector = new ReflectionClass($className);
- $directory = $reflector->getFileName();
- for ($i = 0; $i < $parent; $i++) {
- $directory = dirname($directory);
- }
- self::$directories[] = $directory;
- }
- // Hide process isolation workaround on Windows.
- // @see PHPUnit_Util_PHP::factory()
- // @see PHPUnit_Util_PHP_Windows::process()
- if (DIRECTORY_SEPARATOR === '\\') {
- // tempnam() prefix is limited to first 3 chars.
- // @see http://php.net/manual/en/function.tempnam.php
- self::$directories[] = sys_get_temp_dir() . '\\PHP';
- }
- }
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Iterator for test suites.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.1.0
- */
- class PHPUnit_Util_TestSuiteIterator implements RecursiveIterator
- {
- /**
- * @var integer
- */
- protected $position;
- /**
- * @var PHPUnit_Framework_Test[]
- */
- protected $tests;
- /**
- * @param PHPUnit_Framework_TestSuite $testSuite
- */
- public function __construct(PHPUnit_Framework_TestSuite $testSuite)
- {
- $this->tests = $testSuite->tests();
- }
- /**
- * Rewinds the Iterator to the first element.
- *
- */
- public function rewind()
- {
- $this->position = 0;
- }
- /**
- * Checks if there is a current element after calls to rewind() or next().
- *
- * @return boolean
- */
- public function valid()
- {
- return $this->position < count($this->tests);
- }
- /**
- * Returns the key of the current element.
- *
- * @return integer
- */
- public function key()
- {
- return $this->position;
- }
- /**
- * Returns the current element.
- *
- * @return PHPUnit_Framework_Test
- */
- public function current()
- {
- return $this->valid() ? $this->tests[$this->position] : null;
- }
- /**
- * Moves forward to next element.
- *
- */
- public function next()
- {
- $this->position++;
- }
- /**
- * Returns the sub iterator for the current element.
- *
- * @return PHPUnit_Util_TestSuiteIterator
- */
- public function getChildren()
- {
- return new PHPUnit_Util_TestSuiteIterator(
- $this->tests[$this->position]
- );
- }
- /**
- * Checks whether the current element has children.
- *
- * @return boolean
- */
- public function hasChildren()
- {
- return $this->tests[$this->position] instanceof PHPUnit_Framework_TestSuite;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for code filtering.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Util_Filter
- {
- /**
- * Filters stack frames from PHPUnit classes.
- *
- * @param Exception $e
- * @param boolean $asString
- * @return string
- */
- public static function getFilteredStacktrace(Exception $e, $asString = true)
- {
- $prefix = false;
- $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']);
- if (defined('__PHPUNIT_PHAR_ROOT__')) {
- $prefix = __PHPUNIT_PHAR_ROOT__;
- }
- if ($asString === true) {
- $filteredStacktrace = '';
- } else {
- $filteredStacktrace = array();
- }
- if ($e instanceof PHPUnit_Framework_SyntheticError) {
- $eTrace = $e->getSyntheticTrace();
- $eFile = $e->getSyntheticFile();
- $eLine = $e->getSyntheticLine();
- } elseif ($e instanceof PHPUnit_Framework_Exception) {
- $eTrace = $e->getSerializableTrace();
- $eFile = $e->getFile();
- $eLine = $e->getLine();
- } else {
- if ($e->getPrevious()) {
- $e = $e->getPrevious();
- }
- $eTrace = $e->getTrace();
- $eFile = $e->getFile();
- $eLine = $e->getLine();
- }
- if (!self::frameExists($eTrace, $eFile, $eLine)) {
- array_unshift(
- $eTrace,
- array('file' => $eFile, 'line' => $eLine)
- );
- }
- $blacklist = new PHPUnit_Util_Blacklist;
- foreach ($eTrace as $frame) {
- if (isset($frame['file']) && is_file($frame['file']) &&
- !$blacklist->isBlacklisted($frame['file']) &&
- ($prefix === false || strpos($frame['file'], $prefix) !== 0) &&
- $frame['file'] !== $script) {
- if ($asString === true) {
- $filteredStacktrace .= sprintf(
- "%s:%s\n",
- $frame['file'],
- isset($frame['line']) ? $frame['line'] : '?'
- );
- } else {
- $filteredStacktrace[] = $frame;
- }
- }
- }
- return $filteredStacktrace;
- }
- /**
- * @param array $trace
- * @param string $file
- * @param int $line
- * @return boolean
- * @since Method available since Release 3.3.2
- */
- private static function frameExists(array $trace, $file, $line)
- {
- foreach ($trace as $frame) {
- if (isset($frame['file']) && $frame['file'] == $file &&
- isset($frame['line']) && $frame['line'] == $line) {
- return true;
- }
- }
- return false;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prints TestDox documentation in HTML format.
- *
- * @package PHPUnit
- * @subpackage Util_TestDox
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter
- {
- /**
- * @var boolean
- */
- protected $printsHTML = true;
- /**
- * Handler for 'start run' event.
- *
- */
- protected function startRun()
- {
- $this->write('<html><body>');
- }
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- $this->write(
- '<h2 id="' . $name . '">' . $this->currentTestClassPrettified .
- '</h2><ul>'
- );
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param boolean $success
- */
- protected function onTest($name, $success = true)
- {
- if (!$success) {
- $strikeOpen = '<span style="text-decoration:line-through;">';
- $strikeClose = '</span>';
- } else {
- $strikeOpen = '';
- $strikeClose = '';
- }
- $this->write('<li>' . $strikeOpen . $name . $strikeClose . '</li>');
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- $this->write('</ul>');
- }
- /**
- * Handler for 'end run' event.
- *
- */
- protected function endRun()
- {
- $this->write('</body></html>');
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prints TestDox documentation in text format.
- *
- * @package PHPUnit
- * @subpackage Util_TestDox
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_ResultPrinter_Text extends PHPUnit_Util_TestDox_ResultPrinter
- {
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- $this->write($this->currentTestClassPrettified . "\n");
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param boolean $success
- */
- protected function onTest($name, $success = true)
- {
- if ($success) {
- $this->write(' [x] ');
- } else {
- $this->write(' [ ] ');
- }
- $this->write($name . "\n");
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- $this->write("\n");
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for printers of TestDox documentation.
- *
- * @package PHPUnit
- * @subpackage Util_TestDox
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.1.0
- */
- abstract class PHPUnit_Util_TestDox_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
- {
- /**
- * @var PHPUnit_Util_TestDox_NamePrettifier
- */
- protected $prettifier;
- /**
- * @var string
- */
- protected $testClass = '';
- /**
- * @var integer
- */
- protected $testStatus = false;
- /**
- * @var array
- */
- protected $tests = array();
- /**
- * @var integer
- */
- protected $successful = 0;
- /**
- * @var integer
- */
- protected $failed = 0;
- /**
- * @var integer
- */
- protected $risky = 0;
- /**
- * @var integer
- */
- protected $skipped = 0;
- /**
- * @var integer
- */
- protected $incomplete = 0;
- /**
- * @var string
- */
- protected $currentTestClassPrettified;
- /**
- * @var string
- */
- protected $currentTestMethodPrettified;
- /**
- * Constructor.
- *
- * @param resource $out
- */
- public function __construct($out = null)
- {
- parent::__construct($out);
- $this->prettifier = new PHPUnit_Util_TestDox_NamePrettifier;
- $this->startRun();
- }
- /**
- * Flush buffer and close output.
- *
- */
- public function flush()
- {
- $this->doEndClass();
- $this->endRun();
- parent::flush();
- }
- /**
- * An error occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
- $this->failed++;
- }
- /**
- * A failure occurred.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_AssertionFailedError $e
- * @param float $time
- */
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
- $this->failed++;
- }
- /**
- * Incomplete test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- */
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
- $this->incomplete++;
- }
- /**
- * Risky test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 4.0.0
- */
- public function addRiskyTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_RISKY;
- $this->risky++;
- }
- /**
- * Skipped test.
- *
- * @param PHPUnit_Framework_Test $test
- * @param Exception $e
- * @param float $time
- * @since Method available since Release 3.0.0
- */
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
- $this->skipped++;
- }
- /**
- * A testsuite started.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A testsuite ended.
- *
- * @param PHPUnit_Framework_TestSuite $suite
- * @since Method available since Release 2.2.0
- */
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- }
- /**
- * A test started.
- *
- * @param PHPUnit_Framework_Test $test
- */
- public function startTest(PHPUnit_Framework_Test $test)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- $class = get_class($test);
- if ($this->testClass != $class) {
- if ($this->testClass != '') {
- $this->doEndClass();
- }
- $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class);
- $this->startClass($class);
- $this->testClass = $class;
- $this->tests = array();
- }
- $prettified = false;
- $annotations = $test->getAnnotations();
- if (isset($annotations['method']['testdox'][0])) {
- $this->currentTestMethodPrettified = $annotations['method']['testdox'][0];
- $prettified = true;
- }
- if (!$prettified) {
- $this->currentTestMethodPrettified = $this->prettifier->prettifyTestMethod($test->getName(false));
- }
- $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
- }
- /**
- * A test ended.
- *
- * @param PHPUnit_Framework_Test $test
- * @param float $time
- */
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- if (!$this->isOfInterest($test)) {
- return;
- }
- if (!isset($this->tests[$this->currentTestMethodPrettified])) {
- if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $this->tests[$this->currentTestMethodPrettified]['success'] = 1;
- $this->tests[$this->currentTestMethodPrettified]['failure'] = 0;
- } else {
- $this->tests[$this->currentTestMethodPrettified]['success'] = 0;
- $this->tests[$this->currentTestMethodPrettified]['failure'] = 1;
- }
- } else {
- if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
- $this->tests[$this->currentTestMethodPrettified]['success']++;
- } else {
- $this->tests[$this->currentTestMethodPrettified]['failure']++;
- }
- }
- $this->currentTestClassPrettified = null;
- $this->currentTestMethodPrettified = null;
- }
- /**
- * @since Method available since Release 2.3.0
- */
- protected function doEndClass()
- {
- foreach ($this->tests as $name => $data) {
- $this->onTest($name, $data['failure'] == 0);
- }
- $this->endClass($this->testClass);
- }
- /**
- * Handler for 'start run' event.
- *
- */
- protected function startRun()
- {
- }
- /**
- * Handler for 'start class' event.
- *
- * @param string $name
- */
- protected function startClass($name)
- {
- }
- /**
- * Handler for 'on test' event.
- *
- * @param string $name
- * @param boolean $success
- */
- protected function onTest($name, $success = true)
- {
- }
- /**
- * Handler for 'end class' event.
- *
- * @param string $name
- */
- protected function endClass($name)
- {
- }
- /**
- * Handler for 'end run' event.
- *
- */
- protected function endRun()
- {
- }
- private function isOfInterest(PHPUnit_Framework_Test $test)
- {
- return $test instanceof PHPUnit_Framework_TestCase && get_class($test) != 'PHPUnit_Framework_Warning';
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Prettifies class and method names for use in TestDox documentation.
- *
- * @package PHPUnit
- * @subpackage Util_TestDox
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.1.0
- */
- class PHPUnit_Util_TestDox_NamePrettifier
- {
- /**
- * @var string
- */
- protected $prefix = 'Test';
- /**
- * @var string
- */
- protected $suffix = 'Test';
- /**
- * @var array
- */
- protected $strings = array();
- /**
- * Prettifies the name of a test class.
- *
- * @param string $name
- * @return string
- */
- public function prettifyTestClass($name)
- {
- $title = $name;
- if ($this->suffix !== null &&
- $this->suffix == substr($name, -1 * strlen($this->suffix))) {
- $title = substr($title, 0, strripos($title, $this->suffix));
- }
- if ($this->prefix !== null &&
- $this->prefix == substr($name, 0, strlen($this->prefix))) {
- $title = substr($title, strlen($this->prefix));
- }
- if (substr($title, 0, 1) == '\\') {
- $title = substr($title, 1);
- }
- return $title;
- }
- /**
- * Prettifies the name of a test method.
- *
- * @param string $name
- * @return string
- */
- public function prettifyTestMethod($name)
- {
- $buffer = '';
- if (!is_string($name) || strlen($name) == 0) {
- return $buffer;
- }
- $string = preg_replace('#\d+$#', '', $name, -1, $count);
- if (in_array($string, $this->strings)) {
- $name = $string;
- } elseif ($count == 0) {
- $this->strings[] = $string;
- }
- if (strpos($name, '_') !== false) {
- return str_replace('_', ' ', $name);
- }
- $max = strlen($name);
- if (substr($name, 0, 4) == 'test') {
- $offset = 4;
- } else {
- $offset = 0;
- $name[0] = strtoupper($name[0]);
- }
- $wasNumeric = false;
- for ($i = $offset; $i < $max; $i++) {
- if ($i > $offset &&
- ord($name[$i]) >= 65 &&
- ord($name[$i]) <= 90) {
- $buffer .= ' ' . strtolower($name[$i]);
- } else {
- $isNumeric = is_numeric($name[$i]);
- if (!$wasNumeric && $isNumeric) {
- $buffer .= ' ';
- $wasNumeric = true;
- }
- if ($wasNumeric && !$isNumeric) {
- $wasNumeric = false;
- }
- $buffer .= $name[$i];
- }
- }
- return $buffer;
- }
- /**
- * Sets the prefix of test names.
- *
- * @param string $prefix
- */
- public function setPrefix($prefix)
- {
- $this->prefix = $prefix;
- }
- /**
- * Sets the suffix of test names.
- *
- * @param string $suffix
- */
- public function setSuffix($suffix)
- {
- $this->suffix = $suffix;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Error handler that converts PHP errors and warnings to exceptions.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Márcio Almada <marcio3w@gmail.com>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.2.0
- */
- class PHPUnit_Util_Regex
- {
- public static function pregMatchSafe($pattern, $subject, $matches = null, $flags = 0, $offset = 0)
- {
- $handler_terminator = PHPUnit_Util_ErrorHandler::handleErrorOnce(E_WARNING);
- $match = preg_match($pattern, $subject, $matches, $flags, $offset);
- $handler_terminator(); // cleaning
- return $match;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility class for textual type (and value) representation.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.0.0
- */
- class PHPUnit_Util_Type
- {
- public static function isType($type)
- {
- return in_array(
- $type,
- array(
- 'numeric',
- 'integer',
- 'int',
- 'float',
- 'string',
- 'boolean',
- 'bool',
- 'null',
- 'array',
- 'object',
- 'resource',
- 'scalar'
- )
- );
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Default utility for PHP sub-processes.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.5.12
- */
- class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP
- {
- /**
- * Runs a single job (PHP code) using a separate PHP process.
- *
- * @param string $job
- * @param array $settings
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- public function runJob($job, array $settings = array())
- {
- $runtime = new Runtime;
- $process = proc_open(
- $runtime->getBinary() . $this->settingsToParameters($settings),
- array(
- 0 => array('pipe', 'r'),
- 1 => array('pipe', 'w'),
- 2 => array('pipe', 'w')
- ),
- $pipes
- );
- if (!is_resource($process)) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to spawn worker process'
- );
- }
- $this->process($pipes[0], $job);
- fclose($pipes[0]);
- $stdout = stream_get_contents($pipes[1]);
- fclose($pipes[1]);
- $stderr = stream_get_contents($pipes[2]);
- fclose($pipes[2]);
- proc_close($process);
- $this->cleanup();
- return array('stdout' => $stdout, 'stderr' => $stderr);
- }
- /**
- * @param resource $pipe
- * @param string $job
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.12
- */
- protected function process($pipe, $job)
- {
- fwrite($pipe, $job);
- }
- /**
- * @since Method available since Release 3.5.12
- */
- protected function cleanup()
- {
- }
- }
- <?php
- if (!defined('STDOUT')) {
- // php://stdout does not obey output buffering. Any output would break
- // unserialization of child process results in the parent process.
- define('STDOUT', fopen('php://temp', 'w+b'));
- define('STDERR', fopen('php://stderr', 'wb'));
- }
- {iniSettings}
- ini_set('display_errors', 'stderr');
- set_include_path('{include_path}');
- $composerAutoload = {composerAutoload};
- $phar = {phar};
- ob_start();
- if ($composerAutoload) {
- require_once $composerAutoload;
- define('PHPUNIT_COMPOSER_INSTALL', $composerAutoload);
- } else if ($phar) {
- require $phar;
- }
- function __phpunit_run_isolated_test()
- {
- if (!class_exists('{className}')) {
- require_once '{filename}';
- }
- $result = new PHPUnit_Framework_TestResult;
- if ({collectCodeCoverageInformation}) {
- $result->setCodeCoverage(new PHP_CodeCoverage);
- }
- $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything});
- $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests});
- $result->beStrictAboutTestSize({isStrictAboutTestSize});
- $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests});
- $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}');
- $test->setDependencyInput(unserialize('{dependencyInput}'));
- $test->setInIsolation(TRUE);
- ob_end_clean();
- $test->run($result);
- $output = '';
- if (!$test->hasExpectationOnOutput()) {
- $output = $test->getActualOutput();
- }
- rewind(STDOUT);
- if ($stdout = stream_get_contents(STDOUT)) {
- $output = $stdout . $output;
- }
- print serialize(
- array(
- 'testResult' => $test->getResult(),
- 'numAssertions' => $test->getNumAssertions(),
- 'result' => $result,
- 'output' => $output
- )
- );
- }
- {constants}
- {included_files}
- {globals}
- if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) {
- require_once $GLOBALS['__PHPUNIT_BOOTSTRAP'];
- unset($GLOBALS['__PHPUNIT_BOOTSTRAP']);
- }
- __phpunit_run_isolated_test();
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use SebastianBergmann\Environment\Runtime;
- /**
- * Windows utility for PHP sub-processes.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.5.12
- */
- class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default
- {
- /**
- * @var string
- */
- private $tempFile;
- /**
- * {@inheritdoc}
- *
- * Reading from STDOUT or STDERR hangs forever on Windows if the output is
- * too large.
- *
- * @see https://bugs.php.net/bug.php?id=51800
- */
- public function runJob($job, array $settings = array())
- {
- $runtime = new Runtime;
- if (false === $stdout_handle = tmpfile()) {
- throw new PHPUnit_Framework_Exception(
- 'A temporary file could not be created; verify that your TEMP environment variable is writable'
- );
- }
- $process = proc_open(
- $runtime->getBinary() . $this->settingsToParameters($settings),
- array(
- 0 => array('pipe', 'r'),
- 1 => $stdout_handle,
- 2 => array('pipe', 'w')
- ),
- $pipes
- );
- if (!is_resource($process)) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to spawn worker process'
- );
- }
- $this->process($pipes[0], $job);
- fclose($pipes[0]);
- $stderr = stream_get_contents($pipes[2]);
- fclose($pipes[2]);
- proc_close($process);
- rewind($stdout_handle);
- $stdout = stream_get_contents($stdout_handle);
- fclose($stdout_handle);
- $this->cleanup();
- return array('stdout' => $stdout, 'stderr' => $stderr);
- }
- /**
- * @param resource $pipe
- * @param string $job
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.5.12
- */
- protected function process($pipe, $job)
- {
- if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) ||
- file_put_contents($this->tempFile, $job) === false) {
- throw new PHPUnit_Framework_Exception(
- 'Unable to write temporary file'
- );
- }
- fwrite(
- $pipe,
- "<?php require_once " . var_export($this->tempFile, true) . "; ?>"
- );
- }
- /**
- * @since Method available since Release 3.5.12
- */
- protected function cleanup()
- {
- unlink($this->tempFile);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods to load PHP sourcefiles.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.3.0
- */
- class PHPUnit_Util_Fileloader
- {
- /**
- * Checks if a PHP sourcefile is readable.
- * The sourcefile is loaded through the load() method.
- *
- * @param string $filename
- * @return string
- * @throws PHPUnit_Framework_Exception
- */
- public static function checkAndLoad($filename)
- {
- $includePathFilename = stream_resolve_include_path($filename);
- if (!$includePathFilename || !is_readable($includePathFilename)) {
- throw new PHPUnit_Framework_Exception(
- sprintf('Cannot open file "%s".' . "\n", $filename)
- );
- }
- self::load($includePathFilename);
- return $includePathFilename;
- }
- /**
- * Loads a PHP sourcefile.
- *
- * @param string $filename
- * @return mixed
- * @since Method available since Release 3.0.0
- */
- public static function load($filename)
- {
- $oldVariableNames = array_keys(get_defined_vars());
- include_once $filename;
- $newVariables = get_defined_vars();
- $newVariableNames = array_diff(
- array_keys($newVariables),
- $oldVariableNames
- );
- foreach ($newVariableNames as $variableName) {
- if ($variableName != 'oldVariableNames') {
- $GLOBALS[$variableName] = $newVariables[$variableName];
- }
- }
- return $filename;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * XML helpers.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.2.0
- */
- class PHPUnit_Util_XML
- {
- /**
- * Escapes a string for the use in XML documents
- * Any Unicode character is allowed, excluding the surrogate blocks, FFFE,
- * and FFFF (not even as character reference).
- * See http://www.w3.org/TR/xml/#charsets
- *
- * @param string $string
- * @return string
- * @author Kore Nordmann <mail@kore-nordmann.de>
- * @since Method available since Release 3.4.6
- */
- public static function prepareString($string)
- {
- return preg_replace(
- '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/',
- '',
- htmlspecialchars(
- PHPUnit_Util_String::convertToUtf8($string),
- ENT_QUOTES,
- 'UTF-8'
- )
- );
- }
- /**
- * Loads an XML (or HTML) file into a DOMDocument object.
- *
- * @param string $filename
- * @param boolean $isHtml
- * @param boolean $xinclude
- * @param boolean $strict
- * @return DOMDocument
- * @since Method available since Release 3.3.0
- */
- public static function loadFile($filename, $isHtml = false, $xinclude = false, $strict = false)
- {
- $reporting = error_reporting(0);
- $contents = file_get_contents($filename);
- error_reporting($reporting);
- if ($contents === false) {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not read "%s".',
- $filename
- )
- );
- }
- return self::load($contents, $isHtml, $filename, $xinclude, $strict);
- }
- /**
- * Load an $actual document into a DOMDocument. This is called
- * from the selector assertions.
- *
- * If $actual is already a DOMDocument, it is returned with
- * no changes. Otherwise, $actual is loaded into a new DOMDocument
- * as either HTML or XML, depending on the value of $isHtml. If $isHtml is
- * false and $xinclude is true, xinclude is performed on the loaded
- * DOMDocument.
- *
- * Note: prior to PHPUnit 3.3.0, this method loaded a file and
- * not a string as it currently does. To load a file into a
- * DOMDocument, use loadFile() instead.
- *
- * @param string|DOMDocument $actual
- * @param boolean $isHtml
- * @param string $filename
- * @param boolean $xinclude
- * @param boolean $strict
- * @return DOMDocument
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @author Tobias Schlitt <toby@php.net>
- */
- public static function load($actual, $isHtml = false, $filename = '', $xinclude = false, $strict = false)
- {
- if ($actual instanceof DOMDocument) {
- return $actual;
- }
- // Required for XInclude on Windows.
- if ($xinclude) {
- $cwd = getcwd();
- @chdir(dirname($filename));
- }
- $document = new DOMDocument;
- $internal = libxml_use_internal_errors(true);
- $message = '';
- $reporting = error_reporting(0);
- if ('' !== $filename) {
- // Necessary for xinclude
- $document->documentURI = $filename;
- }
- if ($isHtml) {
- $loaded = $document->loadHTML($actual);
- } else {
- $loaded = $document->loadXML($actual);
- }
- if (!$isHtml && $xinclude) {
- $document->xinclude();
- }
- foreach (libxml_get_errors() as $error) {
- $message .= "\n" . $error->message;
- }
- libxml_use_internal_errors($internal);
- error_reporting($reporting);
- if ($xinclude) {
- @chdir($cwd);
- }
- if ($loaded === false || ($strict && $message !== '')) {
- if ($filename !== '') {
- throw new PHPUnit_Framework_Exception(
- sprintf(
- 'Could not load "%s".%s',
- $filename,
- $message != '' ? "\n" . $message : ''
- )
- );
- } else {
- throw new PHPUnit_Framework_Exception($message);
- }
- }
- return $document;
- }
- /**
- *
- *
- * @param DOMNode $node
- * @return string
- * @since Method available since Release 3.4.0
- */
- public static function nodeToText(DOMNode $node)
- {
- if ($node->childNodes->length == 1) {
- return $node->nodeValue;
- }
- $result = '';
- foreach ($node->childNodes as $childNode) {
- $result .= $node->ownerDocument->saveXML($childNode);
- }
- return $result;
- }
- /**
- *
- *
- * @param DOMNode $node
- * @since Method available since Release 3.3.0
- * @author Mattis Stordalen Flister <mattis@xait.no>
- */
- public static function removeCharacterDataNodes(DOMNode $node)
- {
- if ($node->hasChildNodes()) {
- for ($i = $node->childNodes->length - 1; $i >= 0; $i--) {
- if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) {
- $node->removeChild($child);
- }
- }
- }
- }
- /**
- * "Convert" a DOMElement object into a PHP variable.
- *
- * @param DOMElement $element
- * @return mixed
- * @since Method available since Release 3.4.0
- */
- public static function xmlToVariable(DOMElement $element)
- {
- $variable = null;
- switch ($element->tagName) {
- case 'array': {
- $variable = array();
- foreach ($element->getElementsByTagName('element') as $element) {
- $value = self::xmlToVariable($element->childNodes->item(1));
- if ($element->hasAttribute('key')) {
- $variable[(string) $element->getAttribute('key')] = $value;
- } else {
- $variable[] = $value;
- }
- }
- }
- break;
- case 'object': {
- $className = $element->getAttribute('class');
- if ($element->hasChildNodes()) {
- $arguments = $element->childNodes->item(1)->childNodes;
- $constructorArgs = array();
- foreach ($arguments as $argument) {
- if ($argument instanceof DOMElement) {
- $constructorArgs[] = self::xmlToVariable($argument);
- }
- }
- $class = new ReflectionClass($className);
- $variable = $class->newInstanceArgs($constructorArgs);
- } else {
- $variable = new $className;
- }
- }
- break;
- case 'boolean': {
- $variable = $element->nodeValue == 'true' ? true : false;
- }
- break;
- case 'integer':
- case 'double':
- case 'string': {
- $variable = $element->nodeValue;
- settype($variable, $element->tagName);
- }
- break;
- }
- return $variable;
- }
- /**
- * Validate list of keys in the associative array.
- *
- * @param array $hash
- * @param array $validKeys
- * @return array
- * @throws PHPUnit_Framework_Exception
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- public static function assertValidKeys(array $hash, array $validKeys)
- {
- $valids = array();
- // Normalize validation keys so that we can use both indexed and
- // associative arrays.
- foreach ($validKeys as $key => $val) {
- is_int($key) ? $valids[$val] = null : $valids[$key] = $val;
- }
- $validKeys = array_keys($valids);
- // Check for invalid keys.
- foreach ($hash as $key => $value) {
- if (!in_array($key, $validKeys)) {
- $unknown[] = $key;
- }
- }
- if (!empty($unknown)) {
- throw new PHPUnit_Framework_Exception(
- 'Unknown key(s): ' . implode(', ', $unknown)
- );
- }
- // Add default values for any valid keys that are empty.
- foreach ($valids as $key => $value) {
- if (!isset($hash[$key])) {
- $hash[$key] = $value;
- }
- }
- return $hash;
- }
- /**
- * Parse a CSS selector into an associative array suitable for
- * use with findNodes().
- *
- * @param string $selector
- * @param mixed $content
- * @return array
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- public static function convertSelectToTag($selector, $content = true)
- {
- $selector = trim(preg_replace("/\s+/", " ", $selector));
- // substitute spaces within attribute value
- while (preg_match('/\[[^\]]+"[^"]+\s[^"]+"\]/', $selector)) {
- $selector = preg_replace(
- '/(\[[^\]]+"[^"]+)\s([^"]+"\])/',
- "$1__SPACE__$2",
- $selector
- );
- }
- if (strstr($selector, ' ')) {
- $elements = explode(' ', $selector);
- } else {
- $elements = array($selector);
- }
- $previousTag = array();
- foreach (array_reverse($elements) as $element) {
- $element = str_replace('__SPACE__', ' ', $element);
- // child selector
- if ($element == '>') {
- $previousTag = array('child' => $previousTag['descendant']);
- continue;
- }
- // adjacent-sibling selector
- if ($element == '+') {
- $previousTag = array('adjacent-sibling' => $previousTag['descendant']);
- continue;
- }
- $tag = array();
- // match element tag
- preg_match("/^([^\.#\[]*)/", $element, $eltMatches);
- if (!empty($eltMatches[1])) {
- $tag['tag'] = $eltMatches[1];
- }
- // match attributes (\[[^\]]*\]*), ids (#[^\.#\[]*),
- // and classes (\.[^\.#\[]*))
- preg_match_all(
- "/(\[[^\]]*\]*|#[^\.#\[]*|\.[^\.#\[]*)/",
- $element,
- $matches
- );
- if (!empty($matches[1])) {
- $classes = array();
- $attrs = array();
- foreach ($matches[1] as $match) {
- // id matched
- if (substr($match, 0, 1) == '#') {
- $tag['id'] = substr($match, 1);
- } // class matched
- elseif (substr($match, 0, 1) == '.') {
- $classes[] = substr($match, 1);
- } // attribute matched
- elseif (substr($match, 0, 1) == '[' &&
- substr($match, -1, 1) == ']') {
- $attribute = substr($match, 1, strlen($match) - 2);
- $attribute = str_replace('"', '', $attribute);
- // match single word
- if (strstr($attribute, '~=')) {
- list($key, $value) = explode('~=', $attribute);
- $value = "regexp:/.*\b$value\b.*/";
- } // match substring
- elseif (strstr($attribute, '*=')) {
- list($key, $value) = explode('*=', $attribute);
- $value = "regexp:/.*$value.*/";
- } // exact match
- else {
- list($key, $value) = explode('=', $attribute);
- }
- $attrs[$key] = $value;
- }
- }
- if ($classes) {
- $tag['class'] = implode(' ', $classes);
- }
- if ($attrs) {
- $tag['attributes'] = $attrs;
- }
- }
- // tag content
- if (is_string($content)) {
- $tag['content'] = $content;
- }
- // determine previous child/descendants
- if (!empty($previousTag['descendant'])) {
- $tag['descendant'] = $previousTag['descendant'];
- } elseif (!empty($previousTag['child'])) {
- $tag['child'] = $previousTag['child'];
- } elseif (!empty($previousTag['adjacent-sibling'])) {
- $tag['adjacent-sibling'] = $previousTag['adjacent-sibling'];
- unset($tag['content']);
- }
- $previousTag = array('descendant' => $tag);
- }
- return $tag;
- }
- /**
- * Parse an $actual document and return an array of DOMNodes
- * matching the CSS $selector. If an error occurs, it will
- * return false.
- *
- * To only return nodes containing a certain content, give
- * the $content to match as a string. Otherwise, setting
- * $content to true will return all nodes matching $selector.
- *
- * The $actual document may be a DOMDocument or a string
- * containing XML or HTML, identified by $isHtml.
- *
- * @param array $selector
- * @param string $content
- * @param mixed $actual
- * @param boolean $isHtml
- * @return boolean|array
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @author Tobias Schlitt <toby@php.net>
- */
- public static function cssSelect($selector, $content, $actual, $isHtml = true)
- {
- $matcher = self::convertSelectToTag($selector, $content);
- $dom = self::load($actual, $isHtml);
- $tags = self::findNodes($dom, $matcher, $isHtml);
- return $tags;
- }
- /**
- * Parse out the options from the tag using DOM object tree.
- *
- * @param DOMDocument $dom
- * @param array $options
- * @param boolean $isHtml
- * @return array
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- * @author Tobias Schlitt <toby@php.net>
- */
- public static function findNodes(DOMDocument $dom, array $options, $isHtml = true)
- {
- $valid = array(
- 'id', 'class', 'tag', 'content', 'attributes', 'parent',
- 'child', 'ancestor', 'descendant', 'children', 'adjacent-sibling'
- );
- $filtered = array();
- $options = self::assertValidKeys($options, $valid);
- // find the element by id
- if ($options['id']) {
- $options['attributes']['id'] = $options['id'];
- }
- if ($options['class']) {
- $options['attributes']['class'] = $options['class'];
- }
- // find the element by a tag type
- if ($options['tag']) {
- if ($isHtml) {
- $elements = self::getElementsByCaseInsensitiveTagName(
- $dom,
- $options['tag']
- );
- } else {
- $elements = $dom->getElementsByTagName($options['tag']);
- }
- foreach ($elements as $element) {
- $nodes[] = $element;
- }
- if (empty($nodes)) {
- return false;
- }
- } // no tag selected, get them all
- else {
- $tags = array(
- 'a', 'abbr', 'acronym', 'address', 'area', 'b', 'base', 'bdo',
- 'big', 'blockquote', 'body', 'br', 'button', 'caption', 'cite',
- 'code', 'col', 'colgroup', 'dd', 'del', 'div', 'dfn', 'dl',
- 'dt', 'em', 'fieldset', 'form', 'frame', 'frameset', 'h1', 'h2',
- 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe',
- 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link',
- 'map', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup',
- 'option', 'p', 'param', 'pre', 'q', 'samp', 'script', 'select',
- 'small', 'span', 'strong', 'style', 'sub', 'sup', 'table',
- 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title',
- 'tr', 'tt', 'ul', 'var',
- // HTML5
- 'article', 'aside', 'audio', 'bdi', 'canvas', 'command',
- 'datalist', 'details', 'dialog', 'embed', 'figure', 'figcaption',
- 'footer', 'header', 'hgroup', 'keygen', 'mark', 'meter', 'nav',
- 'output', 'progress', 'ruby', 'rt', 'rp', 'track', 'section',
- 'source', 'summary', 'time', 'video', 'wbr'
- );
- foreach ($tags as $tag) {
- if ($isHtml) {
- $elements = self::getElementsByCaseInsensitiveTagName(
- $dom,
- $tag
- );
- } else {
- $elements = $dom->getElementsByTagName($tag);
- }
- foreach ($elements as $element) {
- $nodes[] = $element;
- }
- }
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by attributes
- if ($options['attributes']) {
- foreach ($nodes as $node) {
- $invalid = false;
- foreach ($options['attributes'] as $name => $value) {
- // match by regexp if like "regexp:/foo/i"
- if (preg_match('/^regexp\s*:\s*(.*)/i', $value, $matches)) {
- if (!preg_match($matches[1], $node->getAttribute($name))) {
- $invalid = true;
- }
- } // class can match only a part
- elseif ($name == 'class') {
- // split to individual classes
- $findClasses = explode(
- ' ',
- preg_replace("/\s+/", " ", $value)
- );
- $allClasses = explode(
- ' ',
- preg_replace("/\s+/", " ", $node->getAttribute($name))
- );
- // make sure each class given is in the actual node
- foreach ($findClasses as $findClass) {
- if (!in_array($findClass, $allClasses)) {
- $invalid = true;
- }
- }
- } // match by exact string
- else {
- if ($node->getAttribute($name) != $value) {
- $invalid = true;
- }
- }
- }
- // if every attribute given matched
- if (!$invalid) {
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by content
- if ($options['content'] !== null) {
- foreach ($nodes as $node) {
- $invalid = false;
- // match by regexp if like "regexp:/foo/i"
- if (preg_match('/^regexp\s*:\s*(.*)/i', $options['content'], $matches)) {
- if (!preg_match($matches[1], self::getNodeText($node))) {
- $invalid = true;
- }
- } // match empty string
- elseif ($options['content'] === '') {
- if (self::getNodeText($node) !== '') {
- $invalid = true;
- }
- } // match by exact string
- elseif (strstr(self::getNodeText($node), $options['content']) === false) {
- $invalid = true;
- }
- if (!$invalid) {
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by parent node
- if ($options['parent']) {
- $parentNodes = self::findNodes($dom, $options['parent'], $isHtml);
- $parentNode = isset($parentNodes[0]) ? $parentNodes[0] : null;
- foreach ($nodes as $node) {
- if ($parentNode !== $node->parentNode) {
- continue;
- }
- $filtered[] = $node;
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by child node
- if ($options['child']) {
- $childNodes = self::findNodes($dom, $options['child'], $isHtml);
- $childNodes = !empty($childNodes) ? $childNodes : array();
- foreach ($nodes as $node) {
- foreach ($node->childNodes as $child) {
- foreach ($childNodes as $childNode) {
- if ($childNode === $child) {
- $filtered[] = $node;
- }
- }
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by adjacent-sibling
- if ($options['adjacent-sibling']) {
- $adjacentSiblingNodes = self::findNodes($dom, $options['adjacent-sibling'], $isHtml);
- $adjacentSiblingNodes = !empty($adjacentSiblingNodes) ? $adjacentSiblingNodes : array();
- foreach ($nodes as $node) {
- $sibling = $node;
- while ($sibling = $sibling->nextSibling) {
- if ($sibling->nodeType !== XML_ELEMENT_NODE) {
- continue;
- }
- foreach ($adjacentSiblingNodes as $adjacentSiblingNode) {
- if ($sibling === $adjacentSiblingNode) {
- $filtered[] = $node;
- break;
- }
- }
- break;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by ancestor
- if ($options['ancestor']) {
- $ancestorNodes = self::findNodes($dom, $options['ancestor'], $isHtml);
- $ancestorNode = isset($ancestorNodes[0]) ? $ancestorNodes[0] : null;
- foreach ($nodes as $node) {
- $parent = $node->parentNode;
- while ($parent && $parent->nodeType != XML_HTML_DOCUMENT_NODE) {
- if ($parent === $ancestorNode) {
- $filtered[] = $node;
- }
- $parent = $parent->parentNode;
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by descendant
- if ($options['descendant']) {
- $descendantNodes = self::findNodes($dom, $options['descendant'], $isHtml);
- $descendantNodes = !empty($descendantNodes) ? $descendantNodes : array();
- foreach ($nodes as $node) {
- foreach (self::getDescendants($node) as $descendant) {
- foreach ($descendantNodes as $descendantNode) {
- if ($descendantNode === $descendant) {
- $filtered[] = $node;
- }
- }
- }
- }
- $nodes = $filtered;
- $filtered = array();
- if (empty($nodes)) {
- return false;
- }
- }
- // filter by children
- if ($options['children']) {
- $validChild = array('count', 'greater_than', 'less_than', 'only');
- $childOptions = self::assertValidKeys(
- $options['children'],
- $validChild
- );
- foreach ($nodes as $node) {
- $childNodes = $node->childNodes;
- foreach ($childNodes as $childNode) {
- if ($childNode->nodeType !== XML_CDATA_SECTION_NODE &&
- $childNode->nodeType !== XML_TEXT_NODE) {
- $children[] = $childNode;
- }
- }
- // we must have children to pass this filter
- if (!empty($children)) {
- // exact count of children
- if ($childOptions['count'] !== null) {
- if (count($children) !== $childOptions['count']) {
- break;
- }
- } // range count of children
- elseif ($childOptions['less_than'] !== null &&
- $childOptions['greater_than'] !== null) {
- if (count($children) >= $childOptions['less_than'] ||
- count($children) <= $childOptions['greater_than']) {
- break;
- }
- } // less than a given count
- elseif ($childOptions['less_than'] !== null) {
- if (count($children) >= $childOptions['less_than']) {
- break;
- }
- } // more than a given count
- elseif ($childOptions['greater_than'] !== null) {
- if (count($children) <= $childOptions['greater_than']) {
- break;
- }
- }
- // match each child against a specific tag
- if ($childOptions['only']) {
- $onlyNodes = self::findNodes(
- $dom,
- $childOptions['only'],
- $isHtml
- );
- // try to match each child to one of the 'only' nodes
- foreach ($children as $child) {
- $matched = false;
- foreach ($onlyNodes as $onlyNode) {
- if ($onlyNode === $child) {
- $matched = true;
- }
- }
- if (!$matched) {
- break 2;
- }
- }
- }
- $filtered[] = $node;
- }
- }
- $nodes = $filtered;
- if (empty($nodes)) {
- return;
- }
- }
- // return the first node that matches all criteria
- return !empty($nodes) ? $nodes : array();
- }
- /**
- * Recursively get flat array of all descendants of this node.
- *
- * @param DOMNode $node
- * @return array
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- protected static function getDescendants(DOMNode $node)
- {
- $allChildren = array();
- $childNodes = $node->childNodes ? $node->childNodes : array();
- foreach ($childNodes as $child) {
- if ($child->nodeType === XML_CDATA_SECTION_NODE ||
- $child->nodeType === XML_TEXT_NODE) {
- continue;
- }
- $children = self::getDescendants($child);
- $allChildren = array_merge($allChildren, $children, array($child));
- }
- return isset($allChildren) ? $allChildren : array();
- }
- /**
- * Gets elements by case insensitive tagname.
- *
- * @param DOMDocument $dom
- * @param string $tag
- * @return DOMNodeList
- * @since Method available since Release 3.4.0
- */
- protected static function getElementsByCaseInsensitiveTagName(DOMDocument $dom, $tag)
- {
- $elements = $dom->getElementsByTagName(strtolower($tag));
- if ($elements->length == 0) {
- $elements = $dom->getElementsByTagName(strtoupper($tag));
- }
- return $elements;
- }
- /**
- * Get the text value of this node's child text node.
- *
- * @param DOMNode $node
- * @return string
- * @since Method available since Release 3.3.0
- * @author Mike Naberezny <mike@maintainable.com>
- * @author Derek DeVries <derek@maintainable.com>
- */
- protected static function getNodeText(DOMNode $node)
- {
- if (!$node->childNodes instanceof DOMNodeList) {
- return '';
- }
- $result = '';
- foreach ($node->childNodes as $childNode) {
- if ($childNode->nodeType === XML_TEXT_NODE ||
- $childNode->nodeType === XML_CDATA_SECTION_NODE) {
- $result .= trim($childNode->data) . ' ';
- } else {
- $result .= self::getNodeText($childNode);
- }
- }
- return str_replace(' ', ' ', $result);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Utility methods for PHP sub-processes.
- *
- * @package PHPUnit
- * @subpackage Util
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 3.4.0
- */
- abstract class PHPUnit_Util_PHP
- {
- /**
- * @return PHPUnit_Util_PHP
- * @since Method available since Release 3.5.12
- */
- public static function factory()
- {
- if (DIRECTORY_SEPARATOR == '\\') {
- return new PHPUnit_Util_PHP_Windows;
- }
- return new PHPUnit_Util_PHP_Default;
- }
- /**
- * Runs a single test in a separate PHP process.
- *
- * @param string $job
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- * @throws PHPUnit_Framework_Exception
- */
- public function runTestJob($job, PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result)
- {
- $result->startTest($test);
- $_result = $this->runJob($job);
- $this->processChildResult(
- $test,
- $result,
- $_result['stdout'],
- $_result['stderr']
- );
- }
- /**
- * Runs a single job (PHP code) using a separate PHP process.
- *
- * @param string $job
- * @param array $settings
- * @return array
- * @throws PHPUnit_Framework_Exception
- */
- abstract public function runJob($job, array $settings = array());
- /**
- * @param array $settings
- * @return string
- * @since Method available since Release 4.0.0
- */
- protected function settingsToParameters(array $settings)
- {
- $buffer = '';
- foreach ($settings as $setting) {
- $buffer .= ' -d ' . $setting;
- }
- return $buffer;
- }
- /**
- * Processes the TestResult object from an isolated process.
- *
- * @param PHPUnit_Framework_Test $test
- * @param PHPUnit_Framework_TestResult $result
- * @param string $stdout
- * @param string $stderr
- * @since Method available since Release 3.5.0
- */
- private function processChildResult(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result, $stdout, $stderr)
- {
- $time = 0;
- if (!empty($stderr)) {
- $result->addError(
- $test,
- new PHPUnit_Framework_Exception(trim($stderr)),
- $time
- );
- } else {
- set_error_handler(function ($errno, $errstr, $errfile, $errline) {
- throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);
- });
- try {
- if (strpos($stdout, "#!/usr/bin/env php\n") === 0) {
- $stdout = substr($stdout, 19);
- }
- $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout));
- restore_error_handler();
- } catch (ErrorException $e) {
- restore_error_handler();
- $childResult = false;
- $result->addError(
- $test,
- new PHPUnit_Framework_Exception(trim($stdout), 0, $e),
- $time
- );
- }
- if ($childResult !== false) {
- if (!empty($childResult['output'])) {
- $output = $childResult['output'];
- }
- $test->setResult($childResult['testResult']);
- $test->addToAssertionCount($childResult['numAssertions']);
- $childResult = $childResult['result'];
- if ($result->getCollectCodeCoverageInformation()) {
- $result->getCodeCoverage()->merge(
- $childResult->getCodeCoverage()
- );
- }
- $time = $childResult->time();
- $notImplemented = $childResult->notImplemented();
- $risky = $childResult->risky();
- $skipped = $childResult->skipped();
- $errors = $childResult->errors();
- $failures = $childResult->failures();
- if (!empty($notImplemented)) {
- $result->addError(
- $test,
- $this->getException($notImplemented[0]),
- $time
- );
- } elseif (!empty($risky)) {
- $result->addError(
- $test,
- $this->getException($risky[0]),
- $time
- );
- } elseif (!empty($skipped)) {
- $result->addError(
- $test,
- $this->getException($skipped[0]),
- $time
- );
- } elseif (!empty($errors)) {
- $result->addError(
- $test,
- $this->getException($errors[0]),
- $time
- );
- } elseif (!empty($failures)) {
- $result->addFailure(
- $test,
- $this->getException($failures[0]),
- $time
- );
- }
- }
- }
- $result->endTest($test, $time);
- if (!empty($output)) {
- print $output;
- }
- }
- /**
- * Gets the thrown exception from a PHPUnit_Framework_TestFailure.
- *
- * @param PHPUnit_Framework_TestFailure $error
- * @return Exception
- * @since Method available since Release 3.6.0
- * @see https://github.com/sebastianbergmann/phpunit/issues/74
- */
- private function getException(PHPUnit_Framework_TestFailure $error)
- {
- $exception = $error->thrownException();
- if ($exception instanceof __PHP_Incomplete_Class) {
- $exceptionArray = array();
- foreach ((array) $exception as $key => $value) {
- $key = substr($key, strrpos($key, "\0") + 1);
- $exceptionArray[$key] = $value;
- }
- $exception = new PHPUnit_Framework_SyntheticError(
- sprintf(
- '%s: %s',
- $exceptionArray['_PHP_Incomplete_Class_Name'],
- $exceptionArray['message']
- ),
- $exceptionArray['code'],
- $exceptionArray['file'],
- $exceptionArray['line'],
- $exceptionArray['trace']
- );
- }
- return $exception;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Exception extends RuntimeException implements PHPUnit_Exception
- {
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Test extends RecursiveFilterIterator
- {
- /**
- * @var string
- */
- protected $filter = null;
- /**
- * @var integer
- */
- protected $filterMin;
- /**
- * @var integer
- */
- protected $filterMax;
- /**
- * @param RecursiveIterator $iterator
- * @param string $filter
- */
- public function __construct(RecursiveIterator $iterator, $filter)
- {
- parent::__construct($iterator);
- $this->setFilter($filter);
- }
- /**
- * @param string $filter
- */
- protected function setFilter($filter)
- {
- if (PHPUnit_Util_Regex::pregMatchSafe($filter, '') === false) {
- // Handles:
- // * testAssertEqualsSucceeds#4
- // * testAssertEqualsSucceeds#4-8
- if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) {
- if (isset($matches[3]) && $matches[2] < $matches[3]) {
- $filter = sprintf(
- '%s.*with data set #(\d+)$',
- $matches[1]
- );
- $this->filterMin = $matches[2];
- $this->filterMax = $matches[3];
- } else {
- $filter = sprintf(
- '%s.*with data set #%s$',
- $matches[1],
- $matches[2]
- );
- }
- } // Handles:
- // * testDetermineJsonError@JSON_ERROR_NONE
- // * testDetermineJsonError@JSON.*
- elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) {
- $filter = sprintf(
- '%s.*with data set "%s"$',
- $matches[1],
- $matches[2]
- );
- }
- // Escape delimiters in regular expression. Do NOT use preg_quote,
- // to keep magic characters.
- $filter = sprintf('/%s/', str_replace(
- '/',
- '\\/',
- $filter
- ));
- }
- $this->filter = $filter;
- }
- /**
- * @return boolean
- */
- public function accept()
- {
- $test = $this->getInnerIterator()->current();
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- return true;
- }
- $tmp = PHPUnit_Util_Test::describe($test, false);
- if ($tmp[0] != '') {
- $name = implode('::', $tmp);
- } else {
- $name = $tmp[1];
- }
- $accepted = preg_match($this->filter, $name, $matches);
- if ($accepted && isset($this->filterMax)) {
- $set = end($matches);
- $accepted = $set >= $this->filterMin && $set <= $this->filterMax;
- }
- return $accepted;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Group_Exclude extends PHPUnit_Runner_Filter_GroupFilterIterator
- {
- protected function doAccept($hash)
- {
- return !in_array($hash, $this->groupTests);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Group_Include extends PHPUnit_Runner_Filter_GroupFilterIterator
- {
- protected function doAccept($hash)
- {
- return in_array($hash, $this->groupTests);
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- class PHPUnit_Runner_Filter_Factory
- {
- /**
- * @var array
- */
- private $filters = array();
- /**
- * @param ReflectionClass $filter
- * @param mixed $args
- */
- public function addFilter(ReflectionClass $filter, $args)
- {
- if (!$filter->isSubclassOf('RecursiveFilterIterator')) {
- throw new InvalidArgumentException(
- sprintf(
- 'Class "%s" does not extend RecursiveFilterIterator',
- $filter->name
- )
- );
- }
- $this->filters[] = array($filter, $args);
- }
- /**
- * @return FilterIterator
- */
- public function factory(Iterator $iterator, PHPUnit_Framework_TestSuite $suite)
- {
- foreach ($this->filters as $filter) {
- list($class, $args) = $filter;
- $iterator = $class->newInstance($iterator, $args, $suite);
- }
- return $iterator;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 4.0.0
- */
- abstract class PHPUnit_Runner_Filter_GroupFilterIterator extends RecursiveFilterIterator
- {
- /**
- * @var array
- */
- protected $groupTests = array();
- /**
- * @param RecursiveIterator $iterator
- * @param array $groups
- * @param PHPUnit_Framework_TestSuite $suite
- */
- public function __construct(RecursiveIterator $iterator, array $groups, PHPUnit_Framework_TestSuite $suite)
- {
- parent::__construct($iterator);
- foreach ($suite->getGroupDetails() as $group => $tests) {
- if (in_array($group, $groups)) {
- $testHashes = array_map(
- function ($test) {
- return spl_object_hash($test);
- },
- $tests
- );
- $this->groupTests = array_merge($this->groupTests, $testHashes);
- }
- }
- }
- /**
- * @return boolean
- */
- public function accept()
- {
- $test = $this->getInnerIterator()->current();
- if ($test instanceof PHPUnit_Framework_TestSuite) {
- return true;
- }
- return $this->doAccept(spl_object_hash($test));
- }
- abstract protected function doAccept($hash);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * An interface to define how a test suite should be loaded.
- *
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Interface available since Release 2.0.0
- */
- interface PHPUnit_Runner_TestSuiteLoader
- {
- /**
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- */
- public function load($suiteClassName, $suiteClassFile = '');
- /**
- * @param ReflectionClass $aClass
- * @return ReflectionClass
- */
- public function reload(ReflectionClass $aClass);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Base class for all test runners.
- *
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- abstract class PHPUnit_Runner_BaseTestRunner
- {
- const STATUS_PASSED = 0;
- const STATUS_SKIPPED = 1;
- const STATUS_INCOMPLETE = 2;
- const STATUS_FAILURE = 3;
- const STATUS_ERROR = 4;
- const STATUS_RISKY = 5;
- const SUITE_METHODNAME = 'suite';
- /**
- * Returns the loader to be used.
- *
- * @return PHPUnit_Runner_TestSuiteLoader
- */
- public function getLoader()
- {
- return new PHPUnit_Runner_StandardTestSuiteLoader;
- }
- /**
- * Returns the Test corresponding to the given suite.
- * This is a template method, subclasses override
- * the runFailed() and clearStatus() methods.
- *
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @param mixed $suffixes
- * @return PHPUnit_Framework_Test
- */
- public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '')
- {
- if (is_dir($suiteClassName) &&
- !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
- $facade = new File_Iterator_Facade;
- $files = $facade->getFilesAsArray(
- $suiteClassName,
- $suffixes
- );
- $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
- $suite->addTestFiles($files);
- return $suite;
- }
- try {
- $testClass = $this->loadSuiteClass(
- $suiteClassName,
- $suiteClassFile
- );
- } catch (PHPUnit_Framework_Exception $e) {
- $this->runFailed($e->getMessage());
- return;
- }
- try {
- $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
- if (!$suiteMethod->isStatic()) {
- $this->runFailed(
- 'suite() method must be static.'
- );
- return;
- }
- try {
- $test = $suiteMethod->invoke(null, $testClass->getName());
- } catch (ReflectionException $e) {
- $this->runFailed(
- sprintf(
- "Failed to invoke suite() method.\n%s",
- $e->getMessage()
- )
- );
- return;
- }
- } catch (ReflectionException $e) {
- try {
- $test = new PHPUnit_Framework_TestSuite($testClass);
- } catch (PHPUnit_Framework_Exception $e) {
- $test = new PHPUnit_Framework_TestSuite;
- $test->setName($suiteClassName);
- }
- }
- $this->clearStatus();
- return $test;
- }
- /**
- * Returns the loaded ReflectionClass for a suite name.
- *
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- */
- protected function loadSuiteClass($suiteClassName, $suiteClassFile = '')
- {
- $loader = $this->getLoader();
- return $loader->load($suiteClassName, $suiteClassFile);
- }
- /**
- * Clears the status message.
- *
- */
- protected function clearStatus()
- {
- }
- /**
- * Override to define how to handle a failed loading of
- * a test suite.
- *
- * @param string $message
- */
- abstract protected function runFailed($message);
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * The standard test suite loader.
- *
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Runner_StandardTestSuiteLoader implements PHPUnit_Runner_TestSuiteLoader
- {
- /**
- * @param string $suiteClassName
- * @param string $suiteClassFile
- * @return ReflectionClass
- * @throws PHPUnit_Framework_Exception
- */
- public function load($suiteClassName, $suiteClassFile = '')
- {
- $suiteClassName = str_replace('.php', '', $suiteClassName);
- if (empty($suiteClassFile)) {
- $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename(
- $suiteClassName
- );
- }
- if (!class_exists($suiteClassName, false)) {
- $loadedClasses = get_declared_classes();
- $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile);
- $loadedClasses = array_values(
- array_diff(get_declared_classes(), $loadedClasses)
- );
- }
- if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) {
- $offset = 0 - strlen($suiteClassName);
- foreach ($loadedClasses as $loadedClass) {
- $class = new ReflectionClass($loadedClass);
- if (substr($loadedClass, $offset) === $suiteClassName &&
- $class->getFileName() == $filename) {
- $suiteClassName = $loadedClass;
- break;
- }
- }
- }
- if (!class_exists($suiteClassName, false) && !empty($loadedClasses)) {
- $testCaseClass = 'PHPUnit_Framework_TestCase';
- foreach ($loadedClasses as $loadedClass) {
- $class = new ReflectionClass($loadedClass);
- $classFile = $class->getFileName();
- if ($class->isSubclassOf($testCaseClass) &&
- !$class->isAbstract()) {
- $suiteClassName = $loadedClass;
- $testCaseClass = $loadedClass;
- if ($classFile == realpath($suiteClassFile)) {
- break;
- }
- }
- if ($class->hasMethod('suite')) {
- $method = $class->getMethod('suite');
- if (!$method->isAbstract() &&
- $method->isPublic() &&
- $method->isStatic()) {
- $suiteClassName = $loadedClass;
- if ($classFile == realpath($suiteClassFile)) {
- break;
- }
- }
- }
- }
- }
- if (class_exists($suiteClassName, false)) {
- $class = new ReflectionClass($suiteClassName);
- if ($class->getFileName() == realpath($suiteClassFile)) {
- return $class;
- }
- }
- throw new PHPUnit_Framework_Exception(
- sprintf(
- "Class '%s' could not be found in '%s'.",
- $suiteClassName,
- $suiteClassFile
- )
- );
- }
- /**
- * @param ReflectionClass $aClass
- * @return ReflectionClass
- */
- public function reload(ReflectionClass $aClass)
- {
- return $aClass;
- }
- }
- <?php
- /*
- * This file is part of PHPUnit.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * This class defines the current version of PHPUnit.
- *
- * @package PHPUnit
- * @subpackage Runner
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.phpunit.de/
- * @since Class available since Release 2.0.0
- */
- class PHPUnit_Runner_Version
- {
- private static $pharVersion = "4.7.0";
- private static $version;
- /**
- * Returns the current version of PHPUnit.
- *
- * @return string
- */
- public static function id()
- {
- if (self::$pharVersion !== null) {
- return self::$pharVersion;
- }
- if (self::$version === null) {
- $version = new SebastianBergmann\Version('4.7.0', dirname(dirname(__DIR__)));
- self::$version = $version->getVersion();
- }
- return self::$version;
- }
- /**
- * @return string
- */
- public static function getVersionString()
- {
- return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.';
- }
- /**
- * @return string
- * @since Method available since Release 4.0.0
- */
- public static function getReleaseChannel()
- {
- if (strpos(self::$pharVersion, 'alpha') !== false) {
- return '-alpha';
- }
- if (strpos(self::$pharVersion, 'beta') !== false) {
- return '-beta';
- }
- return '';
- }
- }
- Environment
- Copyright (c) 2014-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Environment package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Environment;
- /**
- * Utility class for HHVM/PHP environment handling.
- *
- * @package Environment
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/environment
- */
- class Runtime
- {
- /**
- * @var string
- */
- private static $binary;
- /**
- * Returns true when the runtime used is HHVM or
- * the runtime used is PHP + Xdebug.
- *
- * @return boolean
- */
- public function canCollectCodeCoverage()
- {
- return $this->isHHVM() || $this->hasXdebug();
- }
- /**
- * Returns the path to the binary of the current runtime.
- * Appends ' --php' to the path when the runtime is HHVM.
- *
- * @return string
- */
- public function getBinary()
- {
- // HHVM
- if (self::$binary === null && $this->isHHVM()) {
- if ((self::$binary = getenv('PHP_BINARY')) === false) {
- self::$binary = PHP_BINARY;
- }
- self::$binary = escapeshellarg(self::$binary) . ' --php';
- }
- // PHP >= 5.4.0
- if (self::$binary === null && defined('PHP_BINARY')) {
- self::$binary = escapeshellarg(PHP_BINARY);
- }
- // PHP < 5.4.0
- if (self::$binary === null) {
- if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) {
- if (strpos($_SERVER['_'], 'phpunit') !== false) {
- $file = file($_SERVER['_']);
- if (strpos($file[0], ' ') !== false) {
- $tmp = explode(' ', $file[0]);
- self::$binary = escapeshellarg(trim($tmp[1]));
- } else {
- self::$binary = escapeshellarg(ltrim(trim($file[0]), '#!'));
- }
- } elseif (strpos(basename($_SERVER['_']), 'php') !== false) {
- self::$binary = escapeshellarg($_SERVER['_']);
- }
- }
- }
- if (self::$binary === null) {
- $possibleBinaryLocations = array(
- PHP_BINDIR . '/php',
- PHP_BINDIR . '/php-cli.exe',
- PHP_BINDIR . '/php.exe'
- );
- foreach ($possibleBinaryLocations as $binary) {
- if (is_readable($binary)) {
- self::$binary = escapeshellarg($binary);
- break;
- }
- }
- }
- if (self::$binary === null) {
- self::$binary = 'php';
- }
- return self::$binary;
- }
- /**
- * @return string
- */
- public function getNameWithVersion()
- {
- return $this->getName() . ' ' . $this->getVersion();
- }
- /**
- * @return string
- */
- public function getName()
- {
- if ($this->isHHVM()) {
- return 'HHVM';
- } else {
- return 'PHP';
- }
- }
- /**
- * @return string
- */
- public function getVendorUrl()
- {
- if ($this->isHHVM()) {
- return 'http://hhvm.com/';
- } else {
- return 'http://php.net/';
- }
- }
- /**
- * @return string
- */
- public function getVersion()
- {
- if ($this->isHHVM()) {
- return HHVM_VERSION;
- } else {
- return PHP_VERSION;
- }
- }
- /**
- * Returns true when the runtime used is PHP and Xdebug is loaded.
- *
- * @return boolean
- */
- public function hasXdebug()
- {
- return $this->isPHP() && extension_loaded('xdebug');
- }
- /**
- * Returns true when the runtime used is HHVM.
- *
- * @return boolean
- */
- public function isHHVM()
- {
- return defined('HHVM_VERSION');
- }
- /**
- * Returns true when the runtime used is PHP.
- *
- * @return boolean
- */
- public function isPHP()
- {
- return !$this->isHHVM();
- }
- }
- <?php
- /*
- * This file is part of the Environment package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Environment;
- /**
- * @package Environment
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright 2014 Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://www.github.com/sebastianbergmann/environment
- */
- class Console
- {
- const STDIN = 0;
- const STDOUT = 1;
- const STDERR = 2;
- /**
- * Returns true if STDOUT supports colorization.
- *
- * This code has been copied and adapted from
- * Symfony\Component\Console\Output\OutputStream.
- *
- * @return boolean
- */
- public function hasColorSupport()
- {
- if (DIRECTORY_SEPARATOR == '\\') {
- return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
- }
- if (!defined('STDOUT')) {
- return false;
- }
- return $this->isInteractive(STDOUT);
- }
- /**
- * Returns the number of columns of the terminal.
- *
- * @return integer
- */
- public function getNumberOfColumns()
- {
- // Windows terminals have a fixed size of 80
- // but one column is used for the cursor.
- if (DIRECTORY_SEPARATOR == '\\') {
- return 79;
- }
- if (!$this->isInteractive(self::STDIN)) {
- return 80;
- }
- if (preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) {
- return (int) $match[1];
- }
- if (preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) {
- return (int) $match[1];
- }
- return 80;
- }
- /**
- * Returns if the file descriptor is an interactive terminal or not.
- *
- * @param int|resource $fileDescriptor
- *
- * @return boolean
- */
- public function isInteractive($fileDescriptor = self::STDOUT)
- {
- return function_exists('posix_isatty') && @posix_isatty($fileDescriptor);
- }
- }
- The MIT License (MIT)
- Copyright (c) 2010 Mike van Riel
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection;
- use phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Context;
- use phpDocumentor\Reflection\DocBlock\Location;
- /**
- * Parses the DocBlock for any structure.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class DocBlock implements \Reflector
- {
- /** @var string The opening line for this docblock. */
- protected $short_description = '';
- /**
- * @var DocBlock\Description The actual
- * description for this docblock.
- */
- protected $long_description = null;
- /**
- * @var Tag[] An array containing all
- * the tags in this docblock; except inline.
- */
- protected $tags = array();
- /** @var Context Information about the context of this DocBlock. */
- protected $context = null;
- /** @var Location Information about the location of this DocBlock. */
- protected $location = null;
- /** @var bool Is this DocBlock (the start of) a template? */
- protected $isTemplateStart = false;
- /** @var bool Does this DocBlock signify the end of a DocBlock template? */
- protected $isTemplateEnd = false;
- /**
- * Parses the given docblock and populates the member fields.
- *
- * The constructor may also receive namespace information such as the
- * current namespace and aliases. This information is used by some tags
- * (e.g. @return, @param, etc.) to turn a relative Type into a FQCN.
- *
- * @param \Reflector|string $docblock A docblock comment (including
- * asterisks) or reflector supporting the getDocComment method.
- * @param Context $context The context in which the DocBlock
- * occurs.
- * @param Location $location The location within the file that this
- * DocBlock occurs in.
- *
- * @throws \InvalidArgumentException if the given argument does not have the
- * getDocComment method.
- */
- public function __construct(
- $docblock,
- Context $context = null,
- Location $location = null
- ) {
- if (is_object($docblock)) {
- if (!method_exists($docblock, 'getDocComment')) {
- throw new \InvalidArgumentException(
- 'Invalid object passed; the given reflector must support '
- . 'the getDocComment method'
- );
- }
- $docblock = $docblock->getDocComment();
- }
- $docblock = $this->cleanInput($docblock);
- list($templateMarker, $short, $long, $tags) = $this->splitDocBlock($docblock);
- $this->isTemplateStart = $templateMarker === '#@+';
- $this->isTemplateEnd = $templateMarker === '#@-';
- $this->short_description = $short;
- $this->long_description = new DocBlock\Description($long, $this);
- $this->parseTags($tags);
- $this->context = $context;
- $this->location = $location;
- }
- /**
- * Strips the asterisks from the DocBlock comment.
- *
- * @param string $comment String containing the comment text.
- *
- * @return string
- */
- protected function cleanInput($comment)
- {
- $comment = trim(
- preg_replace(
- '#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u',
- '$1',
- $comment
- )
- );
- // reg ex above is not able to remove */ from a single line docblock
- if (substr($comment, -2) == '*/') {
- $comment = trim(substr($comment, 0, -2));
- }
- // normalize strings
- $comment = str_replace(array("\r\n", "\r"), "\n", $comment);
- return $comment;
- }
- /**
- * Splits the DocBlock into a template marker, summary, description and block of tags.
- *
- * @param string $comment Comment to split into the sub-parts.
- *
- * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split.
- * @author Mike van Riel <me@mikevanriel.com> for extending the regex with template marker support.
- *
- * @return string[] containing the template marker (if any), summary, description and a string containing the tags.
- */
- protected function splitDocBlock($comment)
- {
- // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This
- // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the
- // performance impact of running a regular expression
- if (strpos($comment, '@') === 0) {
- return array('', '', '', $comment);
- }
- // clears all extra horizontal whitespace from the line endings to prevent parsing issues
- $comment = preg_replace('/\h*$/Sum', '', $comment);
- /*
- * Splits the docblock into a template marker, short description, long description and tags section
- *
- * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may
- * occur after it and will be stripped).
- * - The short description is started from the first character until a dot is encountered followed by a
- * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing
- * errors). This is optional.
- * - The long description, any character until a new line is encountered followed by an @ and word
- * characters (a tag). This is optional.
- * - Tags; the remaining characters
- *
- * Big thanks to RichardJ for contributing this Regular Expression
- */
- preg_match(
- '/
- \A
- # 1. Extract the template marker
- (?:(\#\@\+|\#\@\-)\n?)?
- # 2. Extract the summary
- (?:
- (?! @\pL ) # The summary may not start with an @
- (
- [^\n.]+
- (?:
- (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines
- [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line
- [^\n.]+ # Include anything else
- )*
- \.?
- )?
- )
- # 3. Extract the description
- (?:
- \s* # Some form of whitespace _must_ precede a description because a summary must be there
- (?! @\pL ) # The description may not start with an @
- (
- [^\n]+
- (?: \n+
- (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line
- [^\n]+ # Include anything else
- )*
- )
- )?
- # 4. Extract the tags (anything that follows)
- (\s+ [\s\S]*)? # everything that follows
- /ux',
- $comment,
- $matches
- );
- array_shift($matches);
- while (count($matches) < 4) {
- $matches[] = '';
- }
- return $matches;
- }
- /**
- * Creates the tag objects.
- *
- * @param string $tags Tag block to parse.
- *
- * @return void
- */
- protected function parseTags($tags)
- {
- $result = array();
- $tags = trim($tags);
- if ('' !== $tags) {
- if ('@' !== $tags[0]) {
- throw new \LogicException(
- 'A tag block started with text instead of an actual tag,'
- . ' this makes the tag block invalid: ' . $tags
- );
- }
- foreach (explode("\n", $tags) as $tag_line) {
- if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
- $result[] = $tag_line;
- } else {
- $result[count($result) - 1] .= "\n" . $tag_line;
- }
- }
- // create proper Tag objects
- foreach ($result as $key => $tag_line) {
- $result[$key] = Tag::createInstance(trim($tag_line), $this);
- }
- }
- $this->tags = $result;
- }
- /**
- * Gets the text portion of the doc block.
- *
- * Gets the text portion (short and long description combined) of the doc
- * block.
- *
- * @return string The text portion of the doc block.
- */
- public function getText()
- {
- $short = $this->getShortDescription();
- $long = $this->getLongDescription()->getContents();
- if ($long) {
- return "{$short}\n\n{$long}";
- } else {
- return $short;
- }
- }
- /**
- * Set the text portion of the doc block.
- *
- * Sets the text portion (short and long description combined) of the doc
- * block.
- *
- * @param string $docblock The new text portion of the doc block.
- *
- * @return $this This doc block.
- */
- public function setText($comment)
- {
- list(,$short, $long) = $this->splitDocBlock($comment);
- $this->short_description = $short;
- $this->long_description = new DocBlock\Description($long, $this);
- return $this;
- }
- /**
- * Returns the opening line or also known as short description.
- *
- * @return string
- */
- public function getShortDescription()
- {
- return $this->short_description;
- }
- /**
- * Returns the full description or also known as long description.
- *
- * @return DocBlock\Description
- */
- public function getLongDescription()
- {
- return $this->long_description;
- }
- /**
- * Returns whether this DocBlock is the start of a Template section.
- *
- * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker
- * (`#@+`) that is appended directly after the opening `/**` of a DocBlock.
- *
- * An example of such an opening is:
- *
- * ```
- * /**#@+
- * * My DocBlock
- * * /
- * ```
- *
- * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all
- * elements that follow until another DocBlock is found that contains the closing marker (`#@-`).
- *
- * @see self::isTemplateEnd() for the check whether a closing marker was provided.
- *
- * @return boolean
- */
- public function isTemplateStart()
- {
- return $this->isTemplateStart;
- }
- /**
- * Returns whether this DocBlock is the end of a Template section.
- *
- * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality.
- *
- * @return boolean
- */
- public function isTemplateEnd()
- {
- return $this->isTemplateEnd;
- }
- /**
- * Returns the current context.
- *
- * @return Context
- */
- public function getContext()
- {
- return $this->context;
- }
- /**
- * Returns the current location.
- *
- * @return Location
- */
- public function getLocation()
- {
- return $this->location;
- }
- /**
- * Returns the tags for this DocBlock.
- *
- * @return Tag[]
- */
- public function getTags()
- {
- return $this->tags;
- }
- /**
- * Returns an array of tags matching the given name. If no tags are found
- * an empty array is returned.
- *
- * @param string $name String to search by.
- *
- * @return Tag[]
- */
- public function getTagsByName($name)
- {
- $result = array();
- /** @var Tag $tag */
- foreach ($this->getTags() as $tag) {
- if ($tag->getName() != $name) {
- continue;
- }
- $result[] = $tag;
- }
- return $result;
- }
- /**
- * Checks if a tag of a certain type is present in this DocBlock.
- *
- * @param string $name Tag name to check for.
- *
- * @return bool
- */
- public function hasTag($name)
- {
- /** @var Tag $tag */
- foreach ($this->getTags() as $tag) {
- if ($tag->getName() == $name) {
- return true;
- }
- }
- return false;
- }
- /**
- * Appends a tag at the end of the list of tags.
- *
- * @param Tag $tag The tag to add.
- *
- * @return Tag The newly added tag.
- *
- * @throws \LogicException When the tag belongs to a different DocBlock.
- */
- public function appendTag(Tag $tag)
- {
- if (null === $tag->getDocBlock()) {
- $tag->setDocBlock($this);
- }
- if ($tag->getDocBlock() === $this) {
- $this->tags[] = $tag;
- } else {
- throw new \LogicException(
- 'This tag belongs to a different DocBlock object.'
- );
- }
- return $tag;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection and
- * implement it.
- *
- * @return string
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the exported information (we should use the export static method
- * BUT this throws an exception at this point).
- *
- * @return string
- * @codeCoverageIgnore Not yet implemented
- */
- public function __toString()
- {
- return 'Not yet implemented';
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- /**
- * The location a DocBlock occurs within a file.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Location
- {
- /** @var int Line where the DocBlock text starts. */
- protected $lineNumber = 0;
- /** @var int Column where the DocBlock text starts. */
- protected $columnNumber = 0;
-
- public function __construct(
- $lineNumber = 0,
- $columnNumber = 0
- ) {
- $this->setLineNumber($lineNumber)->setColumnNumber($columnNumber);
- }
- /**
- * @return int Line where the DocBlock text starts.
- */
- public function getLineNumber()
- {
- return $this->lineNumber;
- }
- /**
- *
- * @param type $lineNumber
- * @return $this
- */
- public function setLineNumber($lineNumber)
- {
- $this->lineNumber = (int)$lineNumber;
- return $this;
- }
- /**
- * @return int Column where the DocBlock text starts.
- */
- public function getColumnNumber()
- {
- return $this->columnNumber;
- }
- /**
- *
- * @param int $columnNumber
- * @return $this
- */
- public function setColumnNumber($columnNumber)
- {
- $this->columnNumber = (int)$columnNumber;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
- /**
- * Reflection class for a @since tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SinceTag extends VersionTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @see tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SeeTag extends Tag
- {
- /** @var string */
- protected $refers = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->refers} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- // any output is considered a type
- $this->refers = $parts[0];
- $this->setDescription(isset($parts[1]) ? $parts[1] : '');
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the structural element this tag refers to.
- *
- * @return string
- */
- public function getReference()
- {
- return $this->refers;
- }
- /**
- * Sets the structural element this tag refers to.
- *
- * @param string $refers The new type this tag refers to.
- *
- * @return $this
- */
- public function setReference($refers)
- {
- $this->refers = $refers;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @version tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class VersionTag extends Tag
- {
- /**
- * PCRE regular expression matching a version vector.
- * Assumes the "x" modifier.
- */
- const REGEX_VECTOR = '(?:
- # Normal release vectors.
- \d\S*
- |
- # VCS version vectors. Per PHPCS, they are expected to
- # follow the form of the VCS name, followed by ":", followed
- # by the version vector itself.
- # By convention, popular VCSes like CVS, SVN and GIT use "$"
- # around the actual version vector.
- [^\s\:]+\:\s*\$[^\$]+\$
- )';
- /** @var string The version vector. */
- protected $version = '';
-
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->version} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^
- # The version vector
- (' . self::REGEX_VECTOR . ')
- \s*
- # The description
- (.+)?
- $/sux',
- $this->description,
- $matches
- )) {
- $this->version = $matches[1];
- $this->setDescription(isset($matches[2]) ? $matches[2] : '');
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Gets the version section of the tag.
- *
- * @return string The version section of the tag.
- */
- public function getVersion()
- {
- return $this->version;
- }
-
- /**
- * Sets the version section of the tag.
- *
- * @param string $version The new version section of the tag.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setVersion($version)
- {
- $this->version
- = preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version)
- ? $version
- : '';
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyTag extends ParamTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Type\Collection;
- /**
- * Reflection class for a @return tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ReturnTag extends Tag
- {
- /** @var string The raw type component. */
- protected $type = '';
-
- /** @var Collection The parsed type component. */
- protected $types = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->type} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- // any output is considered a type
- $this->type = $parts[0];
- $this->types = null;
- $this->setDescription(isset($parts[1]) ? $parts[1] : '');
- $this->content = $content;
- return $this;
- }
- /**
- * Returns the unique types of the variable.
- *
- * @return string[]
- */
- public function getTypes()
- {
- return $this->getTypesCollection()->getArrayCopy();
- }
- /**
- * Returns the type section of the variable.
- *
- * @return string
- */
- public function getType()
- {
- return (string) $this->getTypesCollection();
- }
- /**
- * Returns the type collection.
- *
- * @return void
- */
- protected function getTypesCollection()
- {
- if (null === $this->types) {
- $this->types = new Collection(
- array($this->type),
- $this->docblock ? $this->docblock->getContext() : null
- );
- }
- return $this->types;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
- /**
- * Reflection class for a @deprecated tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class DeprecatedTag extends VersionTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @throws tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ThrowsTag extends ReturnTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @covers tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class CoversTag extends SeeTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @source tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class SourceTag extends Tag
- {
- /**
- * @var int The starting line, relative to the structural element's
- * location.
- */
- protected $startingLine = 1;
- /**
- * @var int|null The number of lines, relative to the starting line. NULL
- * means "to the end".
- */
- protected $lineCount = null;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content
- = "{$this->startingLine} {$this->lineCount} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^
- # Starting line
- ([1-9]\d*)
- \s*
- # Number of lines
- (?:
- ((?1))
- \s+
- )?
- # Description
- (.*)
- $/sux',
- $this->description,
- $matches
- )) {
- $this->startingLine = (int)$matches[1];
- if (isset($matches[2]) && '' !== $matches[2]) {
- $this->lineCount = (int)$matches[2];
- }
- $this->setDescription($matches[3]);
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Gets the starting line.
- *
- * @return int The starting line, relative to the structural element's
- * location.
- */
- public function getStartingLine()
- {
- return $this->startingLine;
- }
- /**
- * Sets the starting line.
- *
- * @param int $startingLine The new starting line, relative to the
- * structural element's location.
- *
- * @return $this
- */
- public function setStartingLine($startingLine)
- {
- $this->startingLine = $startingLine;
- $this->content = null;
- return $this;
- }
- /**
- * Returns the number of lines.
- *
- * @return int|null The number of lines, relative to the starting line. NULL
- * means "to the end".
- */
- public function getLineCount()
- {
- return $this->lineCount;
- }
- /**
- * Sets the number of lines.
- *
- * @param int|null $lineCount The new number of lines, relative to the
- * starting line. NULL means "to the end".
- *
- * @return $this
- */
- public function setLineCount($lineCount)
- {
- $this->lineCount = $lineCount;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @uses tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class UsesTag extends SeeTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @method in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class MethodTag extends ReturnTag
- {
- /** @var string */
- protected $method_name = '';
- /** @var string */
- protected $arguments = '';
-
- /** @var bool */
- protected $isStatic = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = '';
- if ($this->isStatic) {
- $this->content .= 'static ';
- }
- $this->content .= $this->type .
- " {$this->method_name}({$this->arguments}) " .
- $this->description;
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- // 1. none or more whitespace
- // 2. optionally the keyword "static" followed by whitespace
- // 3. optionally a word with underscores followed by whitespace : as
- // type for the return value
- // 4. then optionally a word with underscores followed by () and
- // whitespace : as method name as used by phpDocumentor
- // 5. then a word with underscores, followed by ( and any character
- // until a ) and whitespace : as method name with signature
- // 6. any remaining text : as description
- if (preg_match(
- '/^
- # Static keyword
- # Declates a static method ONLY if type is also present
- (?:
- (static)
- \s+
- )?
- # Return type
- (?:
- ([\w\|_\\\\]+)
- \s+
- )?
- # Legacy method name (not captured)
- (?:
- [\w_]+\(\)\s+
- )?
- # Method name
- ([\w\|_\\\\]+)
- # Arguments
- \(([^\)]*)\)
- \s*
- # Description
- (.*)
- $/sux',
- $this->description,
- $matches
- )) {
- list(
- ,
- $static,
- $this->type,
- $this->method_name,
- $this->arguments,
- $this->description
- ) = $matches;
- if ($static) {
- if (!$this->type) {
- $this->type = 'static';
- } else {
- $this->isStatic = true;
- }
- } else {
- if (!$this->type) {
- $this->type = 'void';
- }
- }
- $this->parsedDescription = null;
- }
- return $this;
- }
- /**
- * Sets the name of this method.
- *
- * @param string $method_name The name of the method.
- *
- * @return $this
- */
- public function setMethodName($method_name)
- {
- $this->method_name = $method_name;
- $this->content = null;
- return $this;
- }
- /**
- * Retrieves the method name.
- *
- * @return string
- */
- public function getMethodName()
- {
- return $this->method_name;
- }
- /**
- * Sets the arguments for this method.
- *
- * @param string $arguments A comma-separated arguments line.
- *
- * @return void
- */
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- $this->content = null;
- return $this;
- }
- /**
- * Returns an array containing each argument as array of type and name.
- *
- * Please note that the argument sub-array may only contain 1 element if no
- * type was specified.
- *
- * @return string[]
- */
- public function getArguments()
- {
- if (empty($this->arguments)) {
- return array();
- }
- $arguments = explode(',', $this->arguments);
- foreach ($arguments as $key => $value) {
- $arguments[$key] = explode(' ', trim($value));
- }
- return $arguments;
- }
-
- /**
- * Checks whether the method tag describes a static method or not.
- *
- * @return bool TRUE if the method declaration is for a static method, FALSE
- * otherwise.
- */
- public function isStatic()
- {
- return $this->isStatic;
- }
-
- /**
- * Sets a new value for whether the method is static or not.
- *
- * @param bool $isStatic The new value to set.
- *
- * @return $this
- */
- public function setIsStatic($isStatic)
- {
- $this->isStatic = $isStatic;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property-read tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyReadTag extends PropertyTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for an @author tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class AuthorTag extends Tag
- {
- /**
- * PCRE regular expression matching any valid value for the name component.
- */
- const REGEX_AUTHOR_NAME = '[^\<]*';
- /**
- * PCRE regular expression matching any valid value for the email component.
- */
- const REGEX_AUTHOR_EMAIL = '[^\>]*';
- /** @var string The name of the author */
- protected $authorName = '';
- /** @var string The email of the author */
- protected $authorEmail = '';
-
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = $this->authorName;
- if ('' != $this->authorEmail) {
- $this->content .= "<{$this->authorEmail}>";
- }
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- if (preg_match(
- '/^(' . self::REGEX_AUTHOR_NAME .
- ')(\<(' . self::REGEX_AUTHOR_EMAIL .
- ')\>)?$/u',
- $this->description,
- $matches
- )) {
- $this->authorName = trim($matches[1]);
- if (isset($matches[3])) {
- $this->authorEmail = trim($matches[3]);
- }
- }
- return $this;
- }
- /**
- * Gets the author's name.
- *
- * @return string The author's name.
- */
- public function getAuthorName()
- {
- return $this->authorName;
- }
-
- /**
- * Sets the author's name.
- *
- * @param string $authorName The new author name.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setAuthorName($authorName)
- {
- $this->content = null;
- $this->authorName
- = preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName)
- ? $authorName : '';
- return $this;
- }
- /**
- * Gets the author's email.
- *
- * @return string The author's email.
- */
- public function getAuthorEmail()
- {
- return $this->authorEmail;
- }
-
- /**
- * Sets the author's email.
- *
- * @param string $authorEmail The new author email.
- * An invalid value will set an empty string.
- *
- * @return $this
- */
- public function setAuthorEmail($authorEmail)
- {
- $this->authorEmail
- = preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail)
- ? $authorEmail : '';
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @var tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class VarTag extends ParamTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Ben Selby <benmatselby@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @link tag in a Docblock.
- *
- * @author Ben Selby <benmatselby@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class LinkTag extends Tag
- {
- /** @var string */
- protected $link = '';
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = "{$this->link} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- parent::setContent($content);
- $parts = preg_split('/\s+/Su', $this->description, 2);
- $this->link = $parts[0];
- $this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]);
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the link
- *
- * @return string
- */
- public function getLink()
- {
- return $this->link;
- }
- /**
- * Sets the link
- *
- * @param string $link The link
- *
- * @return $this
- */
- public function setLink($link)
- {
- $this->link = $link;
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @example tag in a Docblock.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ExampleTag extends SourceTag
- {
- /**
- * @var string Path to a file to use as an example.
- * May also be an absolute URI.
- */
- protected $filePath = '';
- /**
- * @var bool Whether the file path component represents an URI.
- * This determines how the file portion appears at {@link getContent()}.
- */
- protected $isURI = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $filePath = '';
- if ($this->isURI) {
- if (false === strpos($this->filePath, ':')) {
- $filePath = str_replace(
- '%2F',
- '/',
- rawurlencode($this->filePath)
- );
- } else {
- $filePath = $this->filePath;
- }
- } else {
- $filePath = '"' . $this->filePath . '"';
- }
- $this->content = $filePath . ' ' . parent::getContent();
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- if (preg_match(
- '/^
- # File component
- (?:
- # File path in quotes
- \"([^\"]+)\"
- |
- # File URI
- (\S+)
- )
- # Remaining content (parsed by SourceTag)
- (?:\s+(.*))?
- $/sux',
- $this->description,
- $matches
- )) {
- if ('' !== $matches[1]) {
- $this->setFilePath($matches[1]);
- } else {
- $this->setFileURI($matches[2]);
- }
- if (isset($matches[3])) {
- parent::setContent($matches[3]);
- } else {
- $this->setDescription('');
- }
- $this->content = $content;
- }
- return $this;
- }
- /**
- * Returns the file path.
- *
- * @return string Path to a file to use as an example.
- * May also be an absolute URI.
- */
- public function getFilePath()
- {
- return $this->filePath;
- }
-
- /**
- * Sets the file path.
- *
- * @param string $filePath The new file path to use for the example.
- *
- * @return $this
- */
- public function setFilePath($filePath)
- {
- $this->isURI = false;
- $this->filePath = trim($filePath);
- $this->content = null;
- return $this;
- }
-
- /**
- * Sets the file path as an URI.
- *
- * This function is equivalent to {@link setFilePath()}, except that it
- * convers an URI to a file path before that.
- *
- * There is no getFileURI(), as {@link getFilePath()} is compatible.
- *
- * @param type $uri The new file URI to use as an example.
- */
- public function setFileURI($uri)
- {
- $this->isURI = true;
- if (false === strpos($uri, ':')) {
- //Relative URL
- $this->filePath = rawurldecode(
- str_replace(array('/', '\\'), '%2F', $uri)
- );
- } else {
- //Absolute URL or URI.
- $this->filePath = $uri;
- }
- $this->content = null;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- use phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @param tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class ParamTag extends ReturnTag
- {
- /** @var string */
- protected $variableName = '';
- /** @var bool determines whether this is a variadic argument */
- protected $isVariadic = false;
- /**
- * {@inheritdoc}
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content
- = "{$this->type} {$this->variableName} {$this->description}";
- }
- return $this->content;
- }
- /**
- * {@inheritdoc}
- */
- public function setContent($content)
- {
- Tag::setContent($content);
- $parts = preg_split(
- '/(\s+)/Su',
- $this->description,
- 3,
- PREG_SPLIT_DELIM_CAPTURE
- );
- // if the first item that is encountered is not a variable; it is a type
- if (isset($parts[0])
- && (strlen($parts[0]) > 0)
- && ($parts[0][0] !== '$')
- ) {
- $this->type = array_shift($parts);
- array_shift($parts);
- }
- // if the next item starts with a $ or ...$ it must be the variable name
- if (isset($parts[0])
- && (strlen($parts[0]) > 0)
- && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')
- ) {
- $this->variableName = array_shift($parts);
- array_shift($parts);
- if (substr($this->variableName, 0, 3) === '...') {
- $this->isVariadic = true;
- $this->variableName = substr($this->variableName, 3);
- }
- }
- $this->setDescription(implode('', $parts));
- $this->content = $content;
- return $this;
- }
- /**
- * Returns the variable's name.
- *
- * @return string
- */
- public function getVariableName()
- {
- return $this->variableName;
- }
- /**
- * Sets the variable's name.
- *
- * @param string $name The new name for this variable.
- *
- * @return $this
- */
- public function setVariableName($name)
- {
- $this->variableName = $name;
- $this->content = null;
- return $this;
- }
- /**
- * Returns whether this tag is variadic.
- *
- * @return boolean
- */
- public function isVariadic()
- {
- return $this->isVariadic;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Tag;
- /**
- * Reflection class for a @property-write tag in a Docblock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class PropertyWriteTag extends PropertyTag
- {
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Barry vd. Heuvel <barryvdh@gmail.com>
- * @copyright 2013 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Serializes a DocBlock instance.
- *
- * @author Barry vd. Heuvel <barryvdh@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Serializer
- {
- /** @var string The string to indent the comment with. */
- protected $indentString = ' ';
- /** @var int The number of times the indent string is repeated. */
- protected $indent = 0;
- /** @var bool Whether to indent the first line. */
- protected $isFirstLineIndented = true;
- /** @var int|null The max length of a line. */
- protected $lineLength = null;
- /**
- * Create a Serializer instance.
- *
- * @param int $indent The number of times the indent string is
- * repeated.
- * @param string $indentString The string to indent the comment with.
- * @param bool $indentFirstLine Whether to indent the first line.
- * @param int|null $lineLength The max length of a line or NULL to
- * disable line wrapping.
- */
- public function __construct(
- $indent = 0,
- $indentString = ' ',
- $indentFirstLine = true,
- $lineLength = null
- ) {
- $this->setIndentationString($indentString);
- $this->setIndent($indent);
- $this->setIsFirstLineIndented($indentFirstLine);
- $this->setLineLength($lineLength);
- }
- /**
- * Sets the string to indent comments with.
- *
- * @param string $indentationString The string to indent comments with.
- *
- * @return $this This serializer object.
- */
- public function setIndentationString($indentString)
- {
- $this->indentString = (string)$indentString;
- return $this;
- }
- /**
- * Gets the string to indent comments with.
- *
- * @return string The indent string.
- */
- public function getIndentationString()
- {
- return $this->indentString;
- }
- /**
- * Sets the number of indents.
- *
- * @param int $indent The number of times the indent string is repeated.
- *
- * @return $this This serializer object.
- */
- public function setIndent($indent)
- {
- $this->indent = (int)$indent;
- return $this;
- }
- /**
- * Gets the number of indents.
- *
- * @return int The number of times the indent string is repeated.
- */
- public function getIndent()
- {
- return $this->indent;
- }
- /**
- * Sets whether or not the first line should be indented.
- *
- * Sets whether or not the first line (the one with the "/**") should be
- * indented.
- *
- * @param bool $indentFirstLine The new value for this setting.
- *
- * @return $this This serializer object.
- */
- public function setIsFirstLineIndented($indentFirstLine)
- {
- $this->isFirstLineIndented = (bool)$indentFirstLine;
- return $this;
- }
- /**
- * Gets whether or not the first line should be indented.
- *
- * @return bool Whether or not the first line should be indented.
- */
- public function isFirstLineIndented()
- {
- return $this->isFirstLineIndented;
- }
- /**
- * Sets the line length.
- *
- * Sets the length of each line in the serialization. Content will be
- * wrapped within this limit.
- *
- * @param int|null $lineLength The length of each line. NULL to disable line
- * wrapping altogether.
- *
- * @return $this This serializer object.
- */
- public function setLineLength($lineLength)
- {
- $this->lineLength = null === $lineLength ? null : (int)$lineLength;
- return $this;
- }
- /**
- * Gets the line length.
- *
- * @return int|null The length of each line or NULL if line wrapping is
- * disabled.
- */
- public function getLineLength()
- {
- return $this->lineLength;
- }
- /**
- * Generate a DocBlock comment.
- *
- * @param DocBlock The DocBlock to serialize.
- *
- * @return string The serialized doc block.
- */
- public function getDocComment(DocBlock $docblock)
- {
- $indent = str_repeat($this->indentString, $this->indent);
- $firstIndent = $this->isFirstLineIndented ? $indent : '';
- $text = $docblock->getText();
- if ($this->lineLength) {
- //3 === strlen(' * ')
- $wrapLength = $this->lineLength - strlen($indent) - 3;
- $text = wordwrap($text, $wrapLength);
- }
- $text = str_replace("\n", "\n{$indent} * ", $text);
- $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
- /** @var Tag $tag */
- foreach ($docblock->getTags() as $tag) {
- $tagText = (string) $tag;
- if ($this->lineLength) {
- $tagText = wordwrap($tagText, $wrapLength);
- }
- $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
- $comment .= "{$indent} * {$tagText}\n";
- }
- $comment .= $indent . ' */';
- return $comment;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- /**
- * The context in which a DocBlock occurs.
- *
- * @author Vasil Rangelov <boen.robot@gmail.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Context
- {
- /** @var string The current namespace. */
- protected $namespace = '';
- /** @var array List of namespace aliases => Fully Qualified Namespace. */
- protected $namespace_aliases = array();
-
- /** @var string Name of the structural element, within the namespace. */
- protected $lsen = '';
-
- /**
- * Cteates a new context.
- * @param string $namespace The namespace where this DocBlock
- * resides in.
- * @param array $namespace_aliases List of namespace aliases => Fully
- * Qualified Namespace.
- * @param string $lsen Name of the structural element, within
- * the namespace.
- */
- public function __construct(
- $namespace = '',
- array $namespace_aliases = array(),
- $lsen = ''
- ) {
- if (!empty($namespace)) {
- $this->setNamespace($namespace);
- }
- $this->setNamespaceAliases($namespace_aliases);
- $this->setLSEN($lsen);
- }
- /**
- * @return string The namespace where this DocBlock resides in.
- */
- public function getNamespace()
- {
- return $this->namespace;
- }
- /**
- * @return array List of namespace aliases => Fully Qualified Namespace.
- */
- public function getNamespaceAliases()
- {
- return $this->namespace_aliases;
- }
-
- /**
- * Returns the Local Structural Element Name.
- *
- * @return string Name of the structural element, within the namespace.
- */
- public function getLSEN()
- {
- return $this->lsen;
- }
-
- /**
- * Sets a new namespace.
- *
- * Sets a new namespace for the context. Leading and trailing slashes are
- * trimmed, and the keywords "global" and "default" are treated as aliases
- * to no namespace.
- *
- * @param string $namespace The new namespace to set.
- *
- * @return $this
- */
- public function setNamespace($namespace)
- {
- if ('global' !== $namespace
- && 'default' !== $namespace
- ) {
- // Srip leading and trailing slash
- $this->namespace = trim((string)$namespace, '\\');
- } else {
- $this->namespace = '';
- }
- return $this;
- }
-
- /**
- * Sets the namespace aliases, replacing all previous ones.
- *
- * @param array $namespace_aliases List of namespace aliases => Fully
- * Qualified Namespace.
- *
- * @return $this
- */
- public function setNamespaceAliases(array $namespace_aliases)
- {
- $this->namespace_aliases = array();
- foreach ($namespace_aliases as $alias => $fqnn) {
- $this->setNamespaceAlias($alias, $fqnn);
- }
- return $this;
- }
-
- /**
- * Adds a namespace alias to the context.
- *
- * @param string $alias The alias name (the part after "as", or the last
- * part of the Fully Qualified Namespace Name) to add.
- * @param string $fqnn The Fully Qualified Namespace Name for this alias.
- * Any form of leading/trailing slashes are accepted, but what will be
- * stored is a name, prefixed with a slash, and no trailing slash.
- *
- * @return $this
- */
- public function setNamespaceAlias($alias, $fqnn)
- {
- $this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\');
- return $this;
- }
-
- /**
- * Sets a new Local Structural Element Name.
- *
- * Sets a new Local Structural Element Name. A local name also contains
- * punctuation determining the kind of structural element (e.g. trailing "("
- * and ")" for functions and methods).
- *
- * @param string $lsen The new local name of a structural element.
- *
- * @return $this
- */
- public function setLSEN($lsen)
- {
- $this->lsen = (string)$lsen;
- return $this;
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock\Type;
- use phpDocumentor\Reflection\DocBlock\Context;
- /**
- * Collection
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Collection extends \ArrayObject
- {
- /** @var string Definition of the OR operator for types */
- const OPERATOR_OR = '|';
- /** @var string Definition of the ARRAY operator for types */
- const OPERATOR_ARRAY = '[]';
- /** @var string Definition of the NAMESPACE operator in PHP */
- const OPERATOR_NAMESPACE = '\\';
- /** @var string[] List of recognized keywords */
- protected static $keywords = array(
- 'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double',
- 'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar',
- 'callback', 'callable', 'false', 'true', 'self', '$this', 'static'
- );
- /**
- * Current invoking location.
- *
- * This is used to prepend to type with a relative location.
- * May also be 'default' or 'global', in which case they are ignored.
- *
- * @var Context
- */
- protected $context = null;
- /**
- * Registers the namespace and aliases; uses that to add and expand the
- * given types.
- *
- * @param string[] $types Array containing a list of types to add to this
- * container.
- * @param Context $location The current invoking location.
- */
- public function __construct(
- array $types = array(),
- Context $context = null
- ) {
- $this->context = null === $context ? new Context() : $context;
- foreach ($types as $type) {
- $this->add($type);
- }
- }
- /**
- * Returns the current invoking location.
- *
- * @return Context
- */
- public function getContext()
- {
- return $this->context;
- }
- /**
- * Adds a new type to the collection and expands it if it contains a
- * relative namespace.
- *
- * If a class in the type contains a relative namespace than this collection
- * will try to expand that into a FQCN.
- *
- * @param string $type A 'Type' as defined in the phpDocumentor
- * documentation.
- *
- * @throws \InvalidArgumentException if a non-string argument is passed.
- *
- * @see http://phpdoc.org/docs/latest/for-users/types.html for the
- * definition of a type.
- *
- * @return void
- */
- public function add($type)
- {
- if (!is_string($type)) {
- throw new \InvalidArgumentException(
- 'A type should be represented by a string, received: '
- .var_export($type, true)
- );
- }
- // separate the type by the OR operator
- $type_parts = explode(self::OPERATOR_OR, $type);
- foreach ($type_parts as $part) {
- $expanded_type = $this->expand($part);
- if ($expanded_type) {
- $this[] = $expanded_type;
- }
- }
- }
-
- /**
- * Returns a string representation of the collection.
- *
- * @return string The resolved types across the collection, separated with
- * {@link self::OPERATOR_OR}.
- */
- public function __toString()
- {
- return implode(self::OPERATOR_OR, $this->getArrayCopy());
- }
- /**
- * Analyzes the given type and returns the FQCN variant.
- *
- * When a type is provided this method checks whether it is not a keyword or
- * Fully Qualified Class Name. If so it will use the given namespace and
- * aliases to expand the type to a FQCN representation.
- *
- * This method only works as expected if the namespace and aliases are set;
- * no dynamic reflection is being performed here.
- *
- * @param string $type The relative or absolute type.
- *
- * @uses getNamespace to determine with what to prefix the type name.
- * @uses getNamespaceAliases to check whether the first part of the relative
- * type name should not be replaced with another namespace.
- *
- * @return string
- */
- protected function expand($type)
- {
- $type = trim($type);
- if (!$type) {
- return '';
- }
- if ($this->isTypeAnArray($type)) {
- return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY;
- }
- if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) {
- $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2);
- $namespace_aliases = $this->context->getNamespaceAliases();
- // if the first segment is not an alias; prepend namespace name and
- // return
- if (!isset($namespace_aliases[$type_parts[0]])) {
- $namespace = $this->context->getNamespace();
- if ('' !== $namespace) {
- $namespace .= self::OPERATOR_NAMESPACE;
- }
- return self::OPERATOR_NAMESPACE . $namespace . $type;
- }
- $type_parts[0] = $namespace_aliases[$type_parts[0]];
- $type = implode(self::OPERATOR_NAMESPACE, $type_parts);
- }
- return $type;
- }
- /**
- * Detects whether the given type represents an array.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isTypeAnArray($type)
- {
- return substr($type, -2) === self::OPERATOR_ARRAY;
- }
- /**
- * Detects whether the given type represents a PHPDoc keyword.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isTypeAKeyword($type)
- {
- return in_array(strtolower($type), static::$keywords, true);
- }
- /**
- * Detects whether the given type represents a relative or absolute path.
- *
- * This method will detect keywords as being absolute; even though they are
- * not preceeded by a namespace separator.
- *
- * @param string $type A relative or absolute type as defined in the
- * phpDocumentor documentation.
- *
- * @return bool
- */
- protected function isRelativeType($type)
- {
- return ($type[0] !== self::OPERATOR_NAMESPACE)
- || $this->isTypeAKeyword($type);
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Parses a tag definition for a DocBlock.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Tag implements \Reflector
- {
- /**
- * PCRE regular expression matching a tag name.
- */
- const REGEX_TAGNAME = '[\w\-\_\\\\]+';
- /** @var string Name of the tag */
- protected $tag = '';
- /**
- * @var string|null Content of the tag.
- * When set to NULL, it means it needs to be regenerated.
- */
- protected $content = '';
- /** @var string Description of the content of this tag */
- protected $description = '';
- /**
- * @var array|null The description, as an array of strings and Tag objects.
- * When set to NULL, it means it needs to be regenerated.
- */
- protected $parsedDescription = null;
- /** @var Location Location of the tag. */
- protected $location = null;
- /** @var DocBlock The DocBlock which this tag belongs to. */
- protected $docblock = null;
-
- /**
- * @var array An array with a tag as a key, and an FQCN to a class that
- * handles it as an array value. The class is expected to inherit this
- * class.
- */
- private static $tagHandlerMappings = array(
- 'author'
- => '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag',
- 'covers'
- => '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag',
- 'deprecated'
- => '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag',
- 'example'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag',
- 'link'
- => '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag',
- 'method'
- => '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag',
- 'param'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag',
- 'property-read'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag',
- 'property'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag',
- 'property-write'
- => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag',
- 'return'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag',
- 'see'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag',
- 'since'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag',
- 'source'
- => '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag',
- 'throw'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
- 'throws'
- => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
- 'uses'
- => '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag',
- 'var'
- => '\phpDocumentor\Reflection\DocBlock\Tag\VarTag',
- 'version'
- => '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag'
- );
- /**
- * Factory method responsible for instantiating the correct sub type.
- *
- * @param string $tag_line The text for this tag, including description.
- * @param DocBlock $docblock The DocBlock which this tag belongs to.
- * @param Location $location Location of the tag.
- *
- * @throws \InvalidArgumentException if an invalid tag line was presented.
- *
- * @return static A new tag object.
- */
- final public static function createInstance(
- $tag_line,
- DocBlock $docblock = null,
- Location $location = null
- ) {
- if (!preg_match(
- '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us',
- $tag_line,
- $matches
- )) {
- throw new \InvalidArgumentException(
- 'Invalid tag_line detected: ' . $tag_line
- );
- }
- $handler = __CLASS__;
- if (isset(self::$tagHandlerMappings[$matches[1]])) {
- $handler = self::$tagHandlerMappings[$matches[1]];
- } elseif (isset($docblock)) {
- $tagName = (string)new Type\Collection(
- array($matches[1]),
- $docblock->getContext()
- );
- if (isset(self::$tagHandlerMappings[$tagName])) {
- $handler = self::$tagHandlerMappings[$tagName];
- }
- }
- return new $handler(
- $matches[1],
- isset($matches[2]) ? $matches[2] : '',
- $docblock,
- $location
- );
- }
- /**
- * Registers a handler for tags.
- *
- * Registers a handler for tags. The class specified is autoloaded if it's
- * not available. It must inherit from this class.
- *
- * @param string $tag Name of tag to regiser a handler for. When
- * registering a namespaced tag, the full name, along with a prefixing
- * slash MUST be provided.
- * @param string|null $handler FQCN of handler. Specifing NULL removes the
- * handler for the specified tag, if any.
- *
- * @return bool TRUE on success, FALSE on failure.
- */
- final public static function registerTagHandler($tag, $handler)
- {
- $tag = trim((string)$tag);
- if (null === $handler) {
- unset(self::$tagHandlerMappings[$tag]);
- return true;
- }
- if ('' !== $tag
- && class_exists($handler, true)
- && is_subclass_of($handler, __CLASS__)
- && !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0.
- ) {
- self::$tagHandlerMappings[$tag] = $handler;
- return true;
- }
- return false;
- }
- /**
- * Parses a tag and populates the member variables.
- *
- * @param string $name Name of the tag.
- * @param string $content The contents of the given tag.
- * @param DocBlock $docblock The DocBlock which this tag belongs to.
- * @param Location $location Location of the tag.
- */
- public function __construct(
- $name,
- $content,
- DocBlock $docblock = null,
- Location $location = null
- ) {
- $this
- ->setName($name)
- ->setContent($content)
- ->setDocBlock($docblock)
- ->setLocation($location);
- }
- /**
- * Gets the name of this tag.
- *
- * @return string The name of this tag.
- */
- public function getName()
- {
- return $this->tag;
- }
- /**
- * Sets the name of this tag.
- *
- * @param string $name The new name of this tag.
- *
- * @return $this
- * @throws \InvalidArgumentException When an invalid tag name is provided.
- */
- public function setName($name)
- {
- if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) {
- throw new \InvalidArgumentException(
- 'Invalid tag name supplied: ' . $name
- );
- }
- $this->tag = $name;
- return $this;
- }
- /**
- * Gets the content of this tag.
- *
- * @return string
- */
- public function getContent()
- {
- if (null === $this->content) {
- $this->content = $this->description;
- }
- return $this->content;
- }
- /**
- * Sets the content of this tag.
- *
- * @param string $content The new content of this tag.
- *
- * @return $this
- */
- public function setContent($content)
- {
- $this->setDescription($content);
- $this->content = $content;
- return $this;
- }
- /**
- * Gets the description component of this tag.
- *
- * @return string
- */
- public function getDescription()
- {
- return $this->description;
- }
- /**
- * Sets the description component of this tag.
- *
- * @param string $description The new description component of this tag.
- *
- * @return $this
- */
- public function setDescription($description)
- {
- $this->content = null;
- $this->parsedDescription = null;
- $this->description = trim($description);
- return $this;
- }
- /**
- * Gets the parsed text of this description.
- *
- * @return array An array of strings and tag objects, in the order they
- * occur within the description.
- */
- public function getParsedDescription()
- {
- if (null === $this->parsedDescription) {
- $description = new Description($this->description, $this->docblock);
- $this->parsedDescription = $description->getParsedContents();
- }
- return $this->parsedDescription;
- }
- /**
- * Gets the docblock this tag belongs to.
- *
- * @return DocBlock The docblock this tag belongs to.
- */
- public function getDocBlock()
- {
- return $this->docblock;
- }
- /**
- * Sets the docblock this tag belongs to.
- *
- * @param DocBlock $docblock The new docblock this tag belongs to. Setting
- * NULL removes any association.
- *
- * @return $this
- */
- public function setDocBlock(DocBlock $docblock = null)
- {
- $this->docblock = $docblock;
- return $this;
- }
- /**
- * Gets the location of the tag.
- *
- * @return Location The tag's location.
- */
- public function getLocation()
- {
- return $this->location;
- }
-
- /**
- * Sets the location of the tag.
- *
- * @param Location $location The new location of the tag.
- *
- * @return $this
- */
- public function setLocation(Location $location = null)
- {
- $this->location = $location;
- return $this;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection and implement it.
- *
- * @return void
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the tag as a serialized string
- *
- * @return string
- */
- public function __toString()
- {
- return "@{$this->getName()} {$this->getContent()}";
- }
- }
- <?php
- /**
- * phpDocumentor
- *
- * PHP Version 5.3
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- namespace phpDocumentor\Reflection\DocBlock;
- use phpDocumentor\Reflection\DocBlock;
- /**
- * Parses a Description of a DocBlock or tag.
- *
- * @author Mike van Riel <mike.vanriel@naenius.com>
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- * @link http://phpdoc.org
- */
- class Description implements \Reflector
- {
- /** @var string */
- protected $contents = '';
- /** @var array The contents, as an array of strings and Tag objects. */
- protected $parsedContents = null;
- /** @var DocBlock The DocBlock which this description belongs to. */
- protected $docblock = null;
- /**
- * Populates the fields of a description.
- *
- * @param string $content The description's conetnts.
- * @param DocBlock $docblock The DocBlock which this description belongs to.
- */
- public function __construct($content, DocBlock $docblock = null)
- {
- $this->setContent($content)->setDocBlock($docblock);
- }
- /**
- * Gets the text of this description.
- *
- * @return string
- */
- public function getContents()
- {
- return $this->contents;
- }
- /**
- * Sets the text of this description.
- *
- * @param string $content The new text of this description.
- *
- * @return $this
- */
- public function setContent($content)
- {
- $this->contents = trim($content);
- $this->parsedContents = null;
- return $this;
- }
- /**
- * Returns the parsed text of this description.
- *
- * @return array An array of strings and tag objects, in the order they
- * occur within the description.
- */
- public function getParsedContents()
- {
- if (null === $this->parsedContents) {
- $this->parsedContents = preg_split(
- '/\{
- # "{@}" is not a valid inline tag. This ensures that
- # we do not treat it as one, but treat it literally.
- (?!@\})
- # We want to capture the whole tag line, but without the
- # inline tag delimiters.
- (\@
- # Match everything up to the next delimiter.
- [^{}]*
- # Nested inline tag content should not be captured, or
- # it will appear in the result separately.
- (?:
- # Match nested inline tags.
- (?:
- # Because we did not catch the tag delimiters
- # earlier, we must be explicit with them here.
- # Notice that this also matches "{}", as a way
- # to later introduce it as an escape sequence.
- \{(?1)?\}
- |
- # Make sure we match hanging "{".
- \{
- )
- # Match content after the nested inline tag.
- [^{}]*
- )* # If there are more inline tags, match them as well.
- # We use "*" since there may not be any nested inline
- # tags.
- )
- \}/Sux',
- $this->contents,
- null,
- PREG_SPLIT_DELIM_CAPTURE
- );
- $count = count($this->parsedContents);
- for ($i=1; $i<$count; $i += 2) {
- $this->parsedContents[$i] = Tag::createInstance(
- $this->parsedContents[$i],
- $this->docblock
- );
- }
- //In order to allow "literal" inline tags, the otherwise invalid
- //sequence "{@}" is changed to "@", and "{}" is changed to "}".
- //See unit tests for examples.
- for ($i=0; $i<$count; $i += 2) {
- $this->parsedContents[$i] = str_replace(
- array('{@}', '{}'),
- array('@', '}'),
- $this->parsedContents[$i]
- );
- }
- }
- return $this->parsedContents;
- }
- /**
- * Return a formatted variant of the Long Description using MarkDown.
- *
- * @todo this should become a more intelligent piece of code where the
- * configuration contains a setting what format long descriptions are.
- *
- * @codeCoverageIgnore Will be removed soon, in favor of adapters at
- * PhpDocumentor itself that will process text in various formats.
- *
- * @return string
- */
- public function getFormattedContents()
- {
- $result = $this->contents;
- // if the long description contains a plain HTML <code> element, surround
- // it with a pre element. Please note that we explicitly used str_replace
- // and not preg_replace to gain performance
- if (strpos($result, '<code>') !== false) {
- $result = str_replace(
- array('<code>', "<code>\r\n", "<code>\n", "<code>\r", '</code>'),
- array('<pre><code>', '<code>', '<code>', '<code>', '</code></pre>'),
- $result
- );
- }
- if (class_exists('Parsedown')) {
- $markdown = \Parsedown::instance();
- $result = $markdown->parse($result);
- } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) {
- $markdown = new \dflydev\markdown\MarkdownExtraParser();
- $result = $markdown->transformMarkdown($result);
- }
- return trim($result);
- }
- /**
- * Gets the docblock this tag belongs to.
- *
- * @return DocBlock The docblock this description belongs to.
- */
- public function getDocBlock()
- {
- return $this->docblock;
- }
- /**
- * Sets the docblock this tag belongs to.
- *
- * @param DocBlock $docblock The new docblock this description belongs to.
- * Setting NULL removes any association.
- *
- * @return $this
- */
- public function setDocBlock(DocBlock $docblock = null)
- {
- $this->docblock = $docblock;
- return $this;
- }
- /**
- * Builds a string representation of this object.
- *
- * @todo determine the exact format as used by PHP Reflection
- * and implement it.
- *
- * @return void
- * @codeCoverageIgnore Not yet implemented
- */
- public static function export()
- {
- throw new \Exception('Not yet implemented');
- }
- /**
- * Returns the long description as a string.
- *
- * @return string
- */
- public function __toString()
- {
- return $this->getContents();
- }
- }
- Version
- Copyright (c) 2013-2015, Sebastian Bergmann <sebastian@phpunit.de>.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Sebastian Bergmann nor the names of his
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- <?php
- /*
- * This file is part of the Version package.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann;
- /**
- * @package Version
- * @author Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
- * @link http://github.com/sebastianbergmann/version
- * @since Class available since Release 1.0.0
- */
- class Version
- {
- private $path;
- private $release;
- private $version;
- /**
- * @param string $release
- * @param string $path
- */
- public function __construct($release, $path)
- {
- $this->release = $release;
- $this->path = $path;
- }
- /**
- * @return string
- */
- public function getVersion()
- {
- if ($this->version === null) {
- if (count(explode('.', $this->release)) == 3) {
- $this->version = $this->release;
- } else {
- $this->version = $this->release . '-dev';
- }
- $git = $this->getGitInformation($this->path);
- if ($git) {
- if (count(explode('.', $this->release)) == 3) {
- $this->version = $git;
- } else {
- $git = explode('-', $git);
- $this->version = $this->release . '-' . end($git);
- }
- }
- }
- return $this->version;
- }
- /**
- * @param string $path
- * @return boolean|string
- */
- private function getGitInformation($path)
- {
- if (!is_dir($path . DIRECTORY_SEPARATOR . '.git')) {
- return false;
- }
- $dir = getcwd();
- chdir($path);
- $returnCode = 1;
- $result = @exec('git describe --tags 2>&1', $output, $returnCode);
- chdir($dir);
- if ($returnCode !== 0) {
- return false;
- }
- return $result;
- }
- }
- hãw?=ä;@,Ž ?eÒ^¤Ý·l¬–¦�‚�)Ñóµ“î
ÖàÇ»8½ø‘iñKŽjãz"“xÇû'hÅ���GBMB
|