1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124 |
- /* Version: 1.0.0 - July 25, 2022 18:16:21 */
- 'use strict';
-
- var fs$1 = require('fs');
- var path$1 = require('path');
- var childProcess = require('child_process');
- var readline = require('readline');
- var os = require('os');
- var tty = require('tty');
- var require$$0 = require('util');
- var require$$0$1 = require('events');
- var assert = require('assert');
- var https = require('https');
- var http = require('http');
- require('console');
-
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
-
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs$1);
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
- var childProcess__default = /*#__PURE__*/_interopDefaultLegacy(childProcess);
- var readline__default = /*#__PURE__*/_interopDefaultLegacy(readline);
- var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
- var tty__default = /*#__PURE__*/_interopDefaultLegacy(tty);
- var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
- var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
- var assert__default = /*#__PURE__*/_interopDefaultLegacy(assert);
- var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
- var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
-
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
- function getAugmentedNamespace(n) {
- if (n.__esModule) return n;
- var a = Object.defineProperty({}, '__esModule', {value: true});
- Object.keys(n).forEach(function (k) {
- var d = Object.getOwnPropertyDescriptor(n, k);
- Object.defineProperty(a, k, d.get ? d : {
- enumerable: true,
- get: function () {
- return n[k];
- }
- });
- });
- return a;
- }
-
- function createCommonjsModule(fn, basedir, module) {
- return module = {
- path: basedir,
- exports: {},
- require: function (path, base) {
- return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
- }
- }, fn(module, module.exports), module.exports;
- }
-
- function commonjsRegister (path, loader) {
- DYNAMIC_REQUIRE_LOADERS[path] = loader;
- }
-
- const DYNAMIC_REQUIRE_LOADERS = Object.create(null);
- const DYNAMIC_REQUIRE_CACHE = Object.create(null);
- const DEFAULT_PARENT_MODULE = {
- id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []
- };
- const CHECKED_EXTENSIONS = ['', '.js', '.json'];
-
- function normalize (path) {
- path = path.replace(/\\/g, '/');
- const parts = path.split('/');
- const slashed = parts[0] === '';
- for (let i = 1; i < parts.length; i++) {
- if (parts[i] === '.' || parts[i] === '') {
- parts.splice(i--, 1);
- }
- }
- for (let i = 1; i < parts.length; i++) {
- if (parts[i] !== '..') continue;
- if (i > 0 && parts[i - 1] !== '..' && parts[i - 1] !== '.') {
- parts.splice(--i, 2);
- i--;
- }
- }
- path = parts.join('/');
- if (slashed && path[0] !== '/')
- path = '/' + path;
- else if (path.length === 0)
- path = '.';
- return path;
- }
-
- function join () {
- if (arguments.length === 0)
- return '.';
- let joined;
- for (let i = 0; i < arguments.length; ++i) {
- let arg = arguments[i];
- if (arg.length > 0) {
- if (joined === undefined)
- joined = arg;
- else
- joined += '/' + arg;
- }
- }
- if (joined === undefined)
- return '.';
-
- return joined;
- }
-
- function isPossibleNodeModulesPath (modulePath) {
- let c0 = modulePath[0];
- if (c0 === '/' || c0 === '\\') return false;
- let c1 = modulePath[1], c2 = modulePath[2];
- if ((c0 === '.' && (!c1 || c1 === '/' || c1 === '\\')) ||
- (c0 === '.' && c1 === '.' && (!c2 || c2 === '/' || c2 === '\\'))) return false;
- if (c1 === ':' && (c2 === '/' || c2 === '\\'))
- return false;
- return true;
- }
-
- function dirname (path) {
- if (path.length === 0)
- return '.';
-
- let i = path.length - 1;
- while (i > 0) {
- const c = path.charCodeAt(i);
- if ((c === 47 || c === 92) && i !== path.length - 1)
- break;
- i--;
- }
-
- if (i > 0)
- return path.substr(0, i);
-
- if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)
- return path.charAt(0);
-
- return '.';
- }
-
- function commonjsResolveImpl (path, originalModuleDir, testCache) {
- const shouldTryNodeModules = isPossibleNodeModulesPath(path);
- path = normalize(path);
- let relPath;
- if (path[0] === '/') {
- originalModuleDir = '/';
- }
- while (true) {
- if (!shouldTryNodeModules) {
- relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;
- } else if (originalModuleDir) {
- relPath = normalize(originalModuleDir + '/node_modules/' + path);
- } else {
- relPath = normalize(join('node_modules', path));
- }
-
- if (relPath.endsWith('/..')) {
- break; // Travelled too far up, avoid infinite loop
- }
-
- for (let extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {
- const resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];
- if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {
- return resolvedPath;
- } if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {
- return resolvedPath;
- } }
- if (!shouldTryNodeModules) break;
- const nextDir = normalize(originalModuleDir + '/..');
- if (nextDir === originalModuleDir) break;
- originalModuleDir = nextDir;
- }
- return null;
- }
-
- function commonjsResolve (path, originalModuleDir) {
- const resolvedPath = commonjsResolveImpl(path, originalModuleDir);
- if (resolvedPath !== null) {
- return resolvedPath;
- }
- return require.resolve(path);
- }
-
- function commonjsRequire (path, originalModuleDir) {
- const resolvedPath = commonjsResolveImpl(path, originalModuleDir);
- if (resolvedPath !== null) {
- let cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];
- if (cachedModule) return cachedModule.exports;
- const loader = DYNAMIC_REQUIRE_LOADERS[resolvedPath];
- if (loader) {
- DYNAMIC_REQUIRE_CACHE[resolvedPath] = cachedModule = {
- id: resolvedPath,
- filename: resolvedPath,
- path: dirname(resolvedPath),
- exports: {},
- parent: DEFAULT_PARENT_MODULE,
- loaded: false,
- children: [],
- paths: [],
- require: function (path, base) {
- return commonjsRequire(path, (base === undefined || base === null) ? cachedModule.path : base);
- }
- };
- try {
- loader.call(commonjsGlobal, cachedModule, cachedModule.exports);
- } catch (error) {
- delete DYNAMIC_REQUIRE_CACHE[resolvedPath];
- throw error;
- }
- cachedModule.loaded = true;
- return cachedModule.exports;
- } }
- return require(path);
- }
-
- commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;
- commonjsRequire.resolve = commonjsResolve;
-
- /**
- * This method returns the first argument it receives.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Util
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'a': 1 };
- *
- * console.log(_.identity(object) === object);
- * // => true
- */
- function identity(value) {
- return value;
- }
-
- var identity_1 = identity;
-
- /** Detect free variable `global` from Node.js. */
-
- var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
-
- var _freeGlobal = freeGlobal;
-
- /** Detect free variable `self`. */
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
-
- /** Used as a reference to the global object. */
- var root = _freeGlobal || freeSelf || Function('return this')();
-
- var _root = root;
-
- /** Built-in value references. */
- var Symbol$1 = _root.Symbol;
-
- var _Symbol = Symbol$1;
-
- /** Used for built-in method references. */
- var objectProto$h = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$e = objectProto$h.hasOwnProperty;
-
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var nativeObjectToString$1 = objectProto$h.toString;
-
- /** Built-in value references. */
- var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;
-
- /**
- * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the raw `toStringTag`.
- */
- function getRawTag(value) {
- var isOwn = hasOwnProperty$e.call(value, symToStringTag$1),
- tag = value[symToStringTag$1];
-
- try {
- value[symToStringTag$1] = undefined;
- var unmasked = true;
- } catch (e) {}
-
- var result = nativeObjectToString$1.call(value);
- if (unmasked) {
- if (isOwn) {
- value[symToStringTag$1] = tag;
- } else {
- delete value[symToStringTag$1];
- }
- }
- return result;
- }
-
- var _getRawTag = getRawTag;
-
- /** Used for built-in method references. */
- var objectProto$g = Object.prototype;
-
- /**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
- var nativeObjectToString = objectProto$g.toString;
-
- /**
- * Converts `value` to a string using `Object.prototype.toString`.
- *
- * @private
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- */
- function objectToString(value) {
- return nativeObjectToString.call(value);
- }
-
- var _objectToString = objectToString;
-
- /** `Object#toString` result references. */
- var nullTag = '[object Null]',
- undefinedTag = '[object Undefined]';
-
- /** Built-in value references. */
- var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;
-
- /**
- * The base implementation of `getTag` without fallbacks for buggy environments.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- function baseGetTag(value) {
- if (value == null) {
- return value === undefined ? undefinedTag : nullTag;
- }
- return (symToStringTag && symToStringTag in Object(value))
- ? _getRawTag(value)
- : _objectToString(value);
- }
-
- var _baseGetTag = baseGetTag;
-
- /**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject$1(value) {
- var type = typeof value;
- return value != null && (type == 'object' || type == 'function');
- }
-
- var isObject_1 = isObject$1;
-
- /** `Object#toString` result references. */
- var asyncTag = '[object AsyncFunction]',
- funcTag$2 = '[object Function]',
- genTag$1 = '[object GeneratorFunction]',
- proxyTag = '[object Proxy]';
-
- /**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
- function isFunction(value) {
- if (!isObject_1(value)) {
- return false;
- }
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 9 which returns 'object' for typed arrays and other constructors.
- var tag = _baseGetTag(value);
- return tag == funcTag$2 || tag == genTag$1 || tag == asyncTag || tag == proxyTag;
- }
-
- var isFunction_1 = isFunction;
-
- /** Used to detect overreaching core-js shims. */
- var coreJsData = _root['__core-js_shared__'];
-
- var _coreJsData = coreJsData;
-
- /** Used to detect methods masquerading as native. */
- var maskSrcKey = (function() {
- var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || '');
- return uid ? ('Symbol(src)_1.' + uid) : '';
- }());
-
- /**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
- function isMasked(func) {
- return !!maskSrcKey && (maskSrcKey in func);
- }
-
- var _isMasked = isMasked;
-
- /** Used for built-in method references. */
- var funcProto$2 = Function.prototype;
-
- /** Used to resolve the decompiled source of functions. */
- var funcToString$2 = funcProto$2.toString;
-
- /**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to convert.
- * @returns {string} Returns the source code.
- */
- function toSource(func) {
- if (func != null) {
- try {
- return funcToString$2.call(func);
- } catch (e) {}
- try {
- return (func + '');
- } catch (e) {}
- }
- return '';
- }
-
- var _toSource = toSource;
-
- /**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
- var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
-
- /** Used to detect host constructors (Safari). */
- var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
- /** Used for built-in method references. */
- var funcProto$1 = Function.prototype,
- objectProto$f = Object.prototype;
-
- /** Used to resolve the decompiled source of functions. */
- var funcToString$1 = funcProto$1.toString;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$d = objectProto$f.hasOwnProperty;
-
- /** Used to detect if a method is native. */
- var reIsNative = RegExp('^' +
- funcToString$1.call(hasOwnProperty$d).replace(reRegExpChar, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
- );
-
- /**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- * else `false`.
- */
- function baseIsNative(value) {
- if (!isObject_1(value) || _isMasked(value)) {
- return false;
- }
- var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor;
- return pattern.test(_toSource(value));
- }
-
- var _baseIsNative = baseIsNative;
-
- /**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
- function getValue(object, key) {
- return object == null ? undefined : object[key];
- }
-
- var _getValue = getValue;
-
- /**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
- function getNative(object, key) {
- var value = _getValue(object, key);
- return _baseIsNative(value) ? value : undefined;
- }
-
- var _getNative = getNative;
-
- /* Built-in method references that are verified to be native. */
- var WeakMap$1 = _getNative(_root, 'WeakMap');
-
- var _WeakMap = WeakMap$1;
-
- /** Used to store function metadata. */
- var metaMap = _WeakMap && new _WeakMap;
-
- var _metaMap = metaMap;
-
- /**
- * The base implementation of `setData` without support for hot loop shorting.
- *
- * @private
- * @param {Function} func The function to associate metadata with.
- * @param {*} data The metadata.
- * @returns {Function} Returns `func`.
- */
- var baseSetData = !_metaMap ? identity_1 : function(func, data) {
- _metaMap.set(func, data);
- return func;
- };
-
- var _baseSetData = baseSetData;
-
- /** Built-in value references. */
- var objectCreate = Object.create;
-
- /**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} proto The object to inherit from.
- * @returns {Object} Returns the new object.
- */
- var baseCreate = (function() {
- function object() {}
- return function(proto) {
- if (!isObject_1(proto)) {
- return {};
- }
- if (objectCreate) {
- return objectCreate(proto);
- }
- object.prototype = proto;
- var result = new object;
- object.prototype = undefined;
- return result;
- };
- }());
-
- var _baseCreate = baseCreate;
-
- /**
- * Creates a function that produces an instance of `Ctor` regardless of
- * whether it was invoked as part of a `new` expression or by `call` or `apply`.
- *
- * @private
- * @param {Function} Ctor The constructor to wrap.
- * @returns {Function} Returns the new wrapped function.
- */
- function createCtor(Ctor) {
- return function() {
- // Use a `switch` statement to work with class constructors. See
- // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
- // for more details.
- var args = arguments;
- switch (args.length) {
- case 0: return new Ctor;
- case 1: return new Ctor(args[0]);
- case 2: return new Ctor(args[0], args[1]);
- case 3: return new Ctor(args[0], args[1], args[2]);
- case 4: return new Ctor(args[0], args[1], args[2], args[3]);
- case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
- case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
- case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
- }
- var thisBinding = _baseCreate(Ctor.prototype),
- result = Ctor.apply(thisBinding, args);
-
- // Mimic the constructor's `return` behavior.
- // See https://es5.github.io/#x13.2.2 for more details.
- return isObject_1(result) ? result : thisBinding;
- };
- }
-
- var _createCtor = createCtor;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$6 = 1;
-
- /**
- * Creates a function that wraps `func` to invoke it with the optional `this`
- * binding of `thisArg`.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
- function createBind(func, bitmask, thisArg) {
- var isBind = bitmask & WRAP_BIND_FLAG$6,
- Ctor = _createCtor(func);
-
- function wrapper() {
- var fn = (this && this !== _root && this instanceof wrapper) ? Ctor : func;
- return fn.apply(isBind ? thisArg : this, arguments);
- }
- return wrapper;
- }
-
- var _createBind = createBind;
-
- /**
- * A faster alternative to `Function#apply`, this function invokes `func`
- * with the `this` binding of `thisArg` and the arguments of `args`.
- *
- * @private
- * @param {Function} func The function to invoke.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {Array} args The arguments to invoke `func` with.
- * @returns {*} Returns the result of `func`.
- */
- function apply(func, thisArg, args) {
- switch (args.length) {
- case 0: return func.call(thisArg);
- case 1: return func.call(thisArg, args[0]);
- case 2: return func.call(thisArg, args[0], args[1]);
- case 3: return func.call(thisArg, args[0], args[1], args[2]);
- }
- return func.apply(thisArg, args);
- }
-
- var _apply = apply;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax$3 = Math.max;
-
- /**
- * Creates an array that is the composition of partially applied arguments,
- * placeholders, and provided arguments into a single array of arguments.
- *
- * @private
- * @param {Array} args The provided arguments.
- * @param {Array} partials The arguments to prepend to those provided.
- * @param {Array} holders The `partials` placeholder indexes.
- * @params {boolean} [isCurried] Specify composing for a curried function.
- * @returns {Array} Returns the new array of composed arguments.
- */
- function composeArgs(args, partials, holders, isCurried) {
- var argsIndex = -1,
- argsLength = args.length,
- holdersLength = holders.length,
- leftIndex = -1,
- leftLength = partials.length,
- rangeLength = nativeMax$3(argsLength - holdersLength, 0),
- result = Array(leftLength + rangeLength),
- isUncurried = !isCurried;
-
- while (++leftIndex < leftLength) {
- result[leftIndex] = partials[leftIndex];
- }
- while (++argsIndex < holdersLength) {
- if (isUncurried || argsIndex < argsLength) {
- result[holders[argsIndex]] = args[argsIndex];
- }
- }
- while (rangeLength--) {
- result[leftIndex++] = args[argsIndex++];
- }
- return result;
- }
-
- var _composeArgs = composeArgs;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax$2 = Math.max;
-
- /**
- * This function is like `composeArgs` except that the arguments composition
- * is tailored for `_.partialRight`.
- *
- * @private
- * @param {Array} args The provided arguments.
- * @param {Array} partials The arguments to append to those provided.
- * @param {Array} holders The `partials` placeholder indexes.
- * @params {boolean} [isCurried] Specify composing for a curried function.
- * @returns {Array} Returns the new array of composed arguments.
- */
- function composeArgsRight(args, partials, holders, isCurried) {
- var argsIndex = -1,
- argsLength = args.length,
- holdersIndex = -1,
- holdersLength = holders.length,
- rightIndex = -1,
- rightLength = partials.length,
- rangeLength = nativeMax$2(argsLength - holdersLength, 0),
- result = Array(rangeLength + rightLength),
- isUncurried = !isCurried;
-
- while (++argsIndex < rangeLength) {
- result[argsIndex] = args[argsIndex];
- }
- var offset = argsIndex;
- while (++rightIndex < rightLength) {
- result[offset + rightIndex] = partials[rightIndex];
- }
- while (++holdersIndex < holdersLength) {
- if (isUncurried || argsIndex < argsLength) {
- result[offset + holders[holdersIndex]] = args[argsIndex++];
- }
- }
- return result;
- }
-
- var _composeArgsRight = composeArgsRight;
-
- /**
- * Gets the number of `placeholder` occurrences in `array`.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} placeholder The placeholder to search for.
- * @returns {number} Returns the placeholder count.
- */
- function countHolders(array, placeholder) {
- var length = array.length,
- result = 0;
-
- while (length--) {
- if (array[length] === placeholder) {
- ++result;
- }
- }
- return result;
- }
-
- var _countHolders = countHolders;
-
- /**
- * The function whose prototype chain sequence wrappers inherit from.
- *
- * @private
- */
- function baseLodash() {
- // No operation performed.
- }
-
- var _baseLodash = baseLodash;
-
- /** Used as references for the maximum length and index of an array. */
- var MAX_ARRAY_LENGTH = 4294967295;
-
- /**
- * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
- *
- * @private
- * @constructor
- * @param {*} value The value to wrap.
- */
- function LazyWrapper(value) {
- this.__wrapped__ = value;
- this.__actions__ = [];
- this.__dir__ = 1;
- this.__filtered__ = false;
- this.__iteratees__ = [];
- this.__takeCount__ = MAX_ARRAY_LENGTH;
- this.__views__ = [];
- }
-
- // Ensure `LazyWrapper` is an instance of `baseLodash`.
- LazyWrapper.prototype = _baseCreate(_baseLodash.prototype);
- LazyWrapper.prototype.constructor = LazyWrapper;
-
- var _LazyWrapper = LazyWrapper;
-
- /**
- * This method returns `undefined`.
- *
- * @static
- * @memberOf _
- * @since 2.3.0
- * @category Util
- * @example
- *
- * _.times(2, _.noop);
- * // => [undefined, undefined]
- */
- function noop() {
- // No operation performed.
- }
-
- var noop_1 = noop;
-
- /**
- * Gets metadata for `func`.
- *
- * @private
- * @param {Function} func The function to query.
- * @returns {*} Returns the metadata for `func`.
- */
- var getData = !_metaMap ? noop_1 : function(func) {
- return _metaMap.get(func);
- };
-
- var _getData = getData;
-
- /** Used to lookup unminified function names. */
- var realNames = {};
-
- var _realNames = realNames;
-
- /** Used for built-in method references. */
- var objectProto$e = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$c = objectProto$e.hasOwnProperty;
-
- /**
- * Gets the name of `func`.
- *
- * @private
- * @param {Function} func The function to query.
- * @returns {string} Returns the function name.
- */
- function getFuncName(func) {
- var result = (func.name + ''),
- array = _realNames[result],
- length = hasOwnProperty$c.call(_realNames, result) ? array.length : 0;
-
- while (length--) {
- var data = array[length],
- otherFunc = data.func;
- if (otherFunc == null || otherFunc == func) {
- return data.name;
- }
- }
- return result;
- }
-
- var _getFuncName = getFuncName;
-
- /**
- * The base constructor for creating `lodash` wrapper objects.
- *
- * @private
- * @param {*} value The value to wrap.
- * @param {boolean} [chainAll] Enable explicit method chain sequences.
- */
- function LodashWrapper(value, chainAll) {
- this.__wrapped__ = value;
- this.__actions__ = [];
- this.__chain__ = !!chainAll;
- this.__index__ = 0;
- this.__values__ = undefined;
- }
-
- LodashWrapper.prototype = _baseCreate(_baseLodash.prototype);
- LodashWrapper.prototype.constructor = LodashWrapper;
-
- var _LodashWrapper = LodashWrapper;
-
- /**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
- var isArray$3 = Array.isArray;
-
- var isArray_1 = isArray$3;
-
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return value != null && typeof value == 'object';
- }
-
- var isObjectLike_1 = isObjectLike;
-
- /**
- * Copies the values of `source` to `array`.
- *
- * @private
- * @param {Array} source The array to copy values from.
- * @param {Array} [array=[]] The array to copy values to.
- * @returns {Array} Returns `array`.
- */
- function copyArray(source, array) {
- var index = -1,
- length = source.length;
-
- array || (array = Array(length));
- while (++index < length) {
- array[index] = source[index];
- }
- return array;
- }
-
- var _copyArray = copyArray;
-
- /**
- * Creates a clone of `wrapper`.
- *
- * @private
- * @param {Object} wrapper The wrapper to clone.
- * @returns {Object} Returns the cloned wrapper.
- */
- function wrapperClone(wrapper) {
- if (wrapper instanceof _LazyWrapper) {
- return wrapper.clone();
- }
- var result = new _LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
- result.__actions__ = _copyArray(wrapper.__actions__);
- result.__index__ = wrapper.__index__;
- result.__values__ = wrapper.__values__;
- return result;
- }
-
- var _wrapperClone = wrapperClone;
-
- /** Used for built-in method references. */
- var objectProto$d = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$b = objectProto$d.hasOwnProperty;
-
- /**
- * Creates a `lodash` object which wraps `value` to enable implicit method
- * chain sequences. Methods that operate on and return arrays, collections,
- * and functions can be chained together. Methods that retrieve a single value
- * or may return a primitive value will automatically end the chain sequence
- * and return the unwrapped value. Otherwise, the value must be unwrapped
- * with `_#value`.
- *
- * Explicit chain sequences, which must be unwrapped with `_#value`, may be
- * enabled using `_.chain`.
- *
- * The execution of chained methods is lazy, that is, it's deferred until
- * `_#value` is implicitly or explicitly called.
- *
- * Lazy evaluation allows several methods to support shortcut fusion.
- * Shortcut fusion is an optimization to merge iteratee calls; this avoids
- * the creation of intermediate arrays and can greatly reduce the number of
- * iteratee executions. Sections of a chain sequence qualify for shortcut
- * fusion if the section is applied to an array and iteratees accept only
- * one argument. The heuristic for whether a section qualifies for shortcut
- * fusion is subject to change.
- *
- * Chaining is supported in custom builds as long as the `_#value` method is
- * directly or indirectly included in the build.
- *
- * In addition to lodash methods, wrappers have `Array` and `String` methods.
- *
- * The wrapper `Array` methods are:
- * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
- *
- * The wrapper `String` methods are:
- * `replace` and `split`
- *
- * The wrapper methods that support shortcut fusion are:
- * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
- * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
- * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
- *
- * The chainable wrapper methods are:
- * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
- * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
- * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
- * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
- * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
- * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
- * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
- * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
- * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
- * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
- * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
- * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
- * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
- * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
- * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
- * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
- * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
- * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
- * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
- * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
- * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
- * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
- * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
- * `zipObject`, `zipObjectDeep`, and `zipWith`
- *
- * The wrapper methods that are **not** chainable by default are:
- * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
- * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
- * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
- * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
- * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
- * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
- * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
- * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
- * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
- * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
- * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
- * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
- * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
- * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
- * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
- * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
- * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
- * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
- * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
- * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
- * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
- * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
- * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
- * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
- * `upperFirst`, `value`, and `words`
- *
- * @name _
- * @constructor
- * @category Seq
- * @param {*} value The value to wrap in a `lodash` instance.
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * function square(n) {
- * return n * n;
- * }
- *
- * var wrapped = _([1, 2, 3]);
- *
- * // Returns an unwrapped value.
- * wrapped.reduce(_.add);
- * // => 6
- *
- * // Returns a wrapped value.
- * var squares = wrapped.map(square);
- *
- * _.isArray(squares);
- * // => false
- *
- * _.isArray(squares.value());
- * // => true
- */
- function lodash(value) {
- if (isObjectLike_1(value) && !isArray_1(value) && !(value instanceof _LazyWrapper)) {
- if (value instanceof _LodashWrapper) {
- return value;
- }
- if (hasOwnProperty$b.call(value, '__wrapped__')) {
- return _wrapperClone(value);
- }
- }
- return new _LodashWrapper(value);
- }
-
- // Ensure wrappers are instances of `baseLodash`.
- lodash.prototype = _baseLodash.prototype;
- lodash.prototype.constructor = lodash;
-
- var wrapperLodash = lodash;
-
- /**
- * Checks if `func` has a lazy counterpart.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
- * else `false`.
- */
- function isLaziable(func) {
- var funcName = _getFuncName(func),
- other = wrapperLodash[funcName];
-
- if (typeof other != 'function' || !(funcName in _LazyWrapper.prototype)) {
- return false;
- }
- if (func === other) {
- return true;
- }
- var data = _getData(other);
- return !!data && func === data[0];
- }
-
- var _isLaziable = isLaziable;
-
- /** Used to detect hot functions by number of calls within a span of milliseconds. */
- var HOT_COUNT = 800,
- HOT_SPAN = 16;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeNow = Date.now;
-
- /**
- * Creates a function that'll short out and invoke `identity` instead
- * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
- * milliseconds.
- *
- * @private
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new shortable function.
- */
- function shortOut(func) {
- var count = 0,
- lastCalled = 0;
-
- return function() {
- var stamp = nativeNow(),
- remaining = HOT_SPAN - (stamp - lastCalled);
-
- lastCalled = stamp;
- if (remaining > 0) {
- if (++count >= HOT_COUNT) {
- return arguments[0];
- }
- } else {
- count = 0;
- }
- return func.apply(undefined, arguments);
- };
- }
-
- var _shortOut = shortOut;
-
- /**
- * Sets metadata for `func`.
- *
- * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
- * period of time, it will trip its breaker and transition to an identity
- * function to avoid garbage collection pauses in V8. See
- * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
- * for more details.
- *
- * @private
- * @param {Function} func The function to associate metadata with.
- * @param {*} data The metadata.
- * @returns {Function} Returns `func`.
- */
- var setData = _shortOut(_baseSetData);
-
- var _setData = setData;
-
- /** Used to match wrap detail comments. */
- var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
- reSplitDetails = /,? & /;
-
- /**
- * Extracts wrapper details from the `source` body comment.
- *
- * @private
- * @param {string} source The source to inspect.
- * @returns {Array} Returns the wrapper details.
- */
- function getWrapDetails(source) {
- var match = source.match(reWrapDetails);
- return match ? match[1].split(reSplitDetails) : [];
- }
-
- var _getWrapDetails = getWrapDetails;
-
- /** Used to match wrap detail comments. */
- var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
-
- /**
- * Inserts wrapper `details` in a comment at the top of the `source` body.
- *
- * @private
- * @param {string} source The source to modify.
- * @returns {Array} details The details to insert.
- * @returns {string} Returns the modified source.
- */
- function insertWrapDetails(source, details) {
- var length = details.length;
- if (!length) {
- return source;
- }
- var lastIndex = length - 1;
- details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
- details = details.join(length > 2 ? ', ' : ' ');
- return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
- }
-
- var _insertWrapDetails = insertWrapDetails;
-
- /**
- * Creates a function that returns `value`.
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Util
- * @param {*} value The value to return from the new function.
- * @returns {Function} Returns the new constant function.
- * @example
- *
- * var objects = _.times(2, _.constant({ 'a': 1 }));
- *
- * console.log(objects);
- * // => [{ 'a': 1 }, { 'a': 1 }]
- *
- * console.log(objects[0] === objects[1]);
- * // => true
- */
- function constant(value) {
- return function() {
- return value;
- };
- }
-
- var constant_1 = constant;
-
- var defineProperty = (function() {
- try {
- var func = _getNative(Object, 'defineProperty');
- func({}, '', {});
- return func;
- } catch (e) {}
- }());
-
- var _defineProperty = defineProperty;
-
- /**
- * The base implementation of `setToString` without support for hot loop shorting.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
- */
- var baseSetToString = !_defineProperty ? identity_1 : function(func, string) {
- return _defineProperty(func, 'toString', {
- 'configurable': true,
- 'enumerable': false,
- 'value': constant_1(string),
- 'writable': true
- });
- };
-
- var _baseSetToString = baseSetToString;
-
- /**
- * Sets the `toString` method of `func` to return `string`.
- *
- * @private
- * @param {Function} func The function to modify.
- * @param {Function} string The `toString` result.
- * @returns {Function} Returns `func`.
- */
- var setToString = _shortOut(_baseSetToString);
-
- var _setToString = setToString;
-
- /**
- * A specialized version of `_.forEach` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
- */
- function arrayEach(array, iteratee) {
- var index = -1,
- length = array == null ? 0 : array.length;
-
- while (++index < length) {
- if (iteratee(array[index], index, array) === false) {
- break;
- }
- }
- return array;
- }
-
- var _arrayEach = arrayEach;
-
- /**
- * The base implementation of `_.findIndex` and `_.findLastIndex` without
- * support for iteratee shorthands.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {Function} predicate The function invoked per iteration.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length,
- index = fromIndex + (fromRight ? 1 : -1);
-
- while ((fromRight ? index-- : ++index < length)) {
- if (predicate(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
-
- var _baseFindIndex = baseFindIndex;
-
- /**
- * The base implementation of `_.isNaN` without support for number objects.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
- */
- function baseIsNaN(value) {
- return value !== value;
- }
-
- var _baseIsNaN = baseIsNaN;
-
- /**
- * A specialized version of `_.indexOf` which performs strict equality
- * comparisons of values, i.e. `===`.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} value The value to search for.
- * @param {number} fromIndex The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function strictIndexOf(array, value, fromIndex) {
- var index = fromIndex - 1,
- length = array.length;
-
- while (++index < length) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
-
- var _strictIndexOf = strictIndexOf;
-
- /**
- * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} value The value to search for.
- * @param {number} fromIndex The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function baseIndexOf(array, value, fromIndex) {
- return value === value
- ? _strictIndexOf(array, value, fromIndex)
- : _baseFindIndex(array, _baseIsNaN, fromIndex);
- }
-
- var _baseIndexOf = baseIndexOf;
-
- /**
- * A specialized version of `_.includes` for arrays without support for
- * specifying an index to search from.
- *
- * @private
- * @param {Array} [array] The array to inspect.
- * @param {*} target The value to search for.
- * @returns {boolean} Returns `true` if `target` is found, else `false`.
- */
- function arrayIncludes(array, value) {
- var length = array == null ? 0 : array.length;
- return !!length && _baseIndexOf(array, value, 0) > -1;
- }
-
- var _arrayIncludes = arrayIncludes;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$5 = 1,
- WRAP_BIND_KEY_FLAG$4 = 2,
- WRAP_CURRY_FLAG$4 = 8,
- WRAP_CURRY_RIGHT_FLAG$2 = 16,
- WRAP_PARTIAL_FLAG$2 = 32,
- WRAP_PARTIAL_RIGHT_FLAG$2 = 64,
- WRAP_ARY_FLAG$3 = 128,
- WRAP_REARG_FLAG$2 = 256,
- WRAP_FLIP_FLAG$1 = 512;
-
- /** Used to associate wrap methods with their bit flags. */
- var wrapFlags = [
- ['ary', WRAP_ARY_FLAG$3],
- ['bind', WRAP_BIND_FLAG$5],
- ['bindKey', WRAP_BIND_KEY_FLAG$4],
- ['curry', WRAP_CURRY_FLAG$4],
- ['curryRight', WRAP_CURRY_RIGHT_FLAG$2],
- ['flip', WRAP_FLIP_FLAG$1],
- ['partial', WRAP_PARTIAL_FLAG$2],
- ['partialRight', WRAP_PARTIAL_RIGHT_FLAG$2],
- ['rearg', WRAP_REARG_FLAG$2]
- ];
-
- /**
- * Updates wrapper `details` based on `bitmask` flags.
- *
- * @private
- * @returns {Array} details The details to modify.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @returns {Array} Returns `details`.
- */
- function updateWrapDetails(details, bitmask) {
- _arrayEach(wrapFlags, function(pair) {
- var value = '_.' + pair[0];
- if ((bitmask & pair[1]) && !_arrayIncludes(details, value)) {
- details.push(value);
- }
- });
- return details.sort();
- }
-
- var _updateWrapDetails = updateWrapDetails;
-
- /**
- * Sets the `toString` method of `wrapper` to mimic the source of `reference`
- * with wrapper details in a comment at the top of the source body.
- *
- * @private
- * @param {Function} wrapper The function to modify.
- * @param {Function} reference The reference function.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @returns {Function} Returns `wrapper`.
- */
- function setWrapToString(wrapper, reference, bitmask) {
- var source = (reference + '');
- return _setToString(wrapper, _insertWrapDetails(source, _updateWrapDetails(_getWrapDetails(source), bitmask)));
- }
-
- var _setWrapToString = setWrapToString;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$4 = 1,
- WRAP_BIND_KEY_FLAG$3 = 2,
- WRAP_CURRY_BOUND_FLAG$1 = 4,
- WRAP_CURRY_FLAG$3 = 8,
- WRAP_PARTIAL_FLAG$1 = 32,
- WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
-
- /**
- * Creates a function that wraps `func` to continue currying.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @param {Function} wrapFunc The function to create the `func` wrapper.
- * @param {*} placeholder The placeholder value.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {Array} [partials] The arguments to prepend to those provided to
- * the new function.
- * @param {Array} [holders] The `partials` placeholder indexes.
- * @param {Array} [argPos] The argument positions of the new function.
- * @param {number} [ary] The arity cap of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
- function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
- var isCurry = bitmask & WRAP_CURRY_FLAG$3,
- newHolders = isCurry ? holders : undefined,
- newHoldersRight = isCurry ? undefined : holders,
- newPartials = isCurry ? partials : undefined,
- newPartialsRight = isCurry ? undefined : partials;
-
- bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
- bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
-
- if (!(bitmask & WRAP_CURRY_BOUND_FLAG$1)) {
- bitmask &= ~(WRAP_BIND_FLAG$4 | WRAP_BIND_KEY_FLAG$3);
- }
- var newData = [
- func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
- newHoldersRight, argPos, ary, arity
- ];
-
- var result = wrapFunc.apply(undefined, newData);
- if (_isLaziable(func)) {
- _setData(result, newData);
- }
- result.placeholder = placeholder;
- return _setWrapToString(result, func, bitmask);
- }
-
- var _createRecurry = createRecurry;
-
- /**
- * Gets the argument placeholder value for `func`.
- *
- * @private
- * @param {Function} func The function to inspect.
- * @returns {*} Returns the placeholder value.
- */
- function getHolder(func) {
- var object = func;
- return object.placeholder;
- }
-
- var _getHolder = getHolder;
-
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER$1 = 9007199254740991;
-
- /** Used to detect unsigned integer values. */
- var reIsUint = /^(?:0|[1-9]\d*)$/;
-
- /**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
- function isIndex(value, length) {
- var type = typeof value;
- length = length == null ? MAX_SAFE_INTEGER$1 : length;
-
- return !!length &&
- (type == 'number' ||
- (type != 'symbol' && reIsUint.test(value))) &&
- (value > -1 && value % 1 == 0 && value < length);
- }
-
- var _isIndex = isIndex;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMin$1 = Math.min;
-
- /**
- * Reorder `array` according to the specified indexes where the element at
- * the first index is assigned as the first element, the element at
- * the second index is assigned as the second element, and so on.
- *
- * @private
- * @param {Array} array The array to reorder.
- * @param {Array} indexes The arranged array indexes.
- * @returns {Array} Returns `array`.
- */
- function reorder(array, indexes) {
- var arrLength = array.length,
- length = nativeMin$1(indexes.length, arrLength),
- oldArray = _copyArray(array);
-
- while (length--) {
- var index = indexes[length];
- array[length] = _isIndex(index, arrLength) ? oldArray[index] : undefined;
- }
- return array;
- }
-
- var _reorder = reorder;
-
- /** Used as the internal argument placeholder. */
- var PLACEHOLDER$1 = '__lodash_placeholder__';
-
- /**
- * Replaces all `placeholder` elements in `array` with an internal placeholder
- * and returns an array of their indexes.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {*} placeholder The placeholder to replace.
- * @returns {Array} Returns the new array of placeholder indexes.
- */
- function replaceHolders(array, placeholder) {
- var index = -1,
- length = array.length,
- resIndex = 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (value === placeholder || value === PLACEHOLDER$1) {
- array[index] = PLACEHOLDER$1;
- result[resIndex++] = index;
- }
- }
- return result;
- }
-
- var _replaceHolders = replaceHolders;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$3 = 1,
- WRAP_BIND_KEY_FLAG$2 = 2,
- WRAP_CURRY_FLAG$2 = 8,
- WRAP_CURRY_RIGHT_FLAG$1 = 16,
- WRAP_ARY_FLAG$2 = 128,
- WRAP_FLIP_FLAG = 512;
-
- /**
- * Creates a function that wraps `func` to invoke it with optional `this`
- * binding of `thisArg`, partial application, and currying.
- *
- * @private
- * @param {Function|string} func The function or method name to wrap.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {Array} [partials] The arguments to prepend to those provided to
- * the new function.
- * @param {Array} [holders] The `partials` placeholder indexes.
- * @param {Array} [partialsRight] The arguments to append to those provided
- * to the new function.
- * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
- * @param {Array} [argPos] The argument positions of the new function.
- * @param {number} [ary] The arity cap of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
- function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
- var isAry = bitmask & WRAP_ARY_FLAG$2,
- isBind = bitmask & WRAP_BIND_FLAG$3,
- isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
- isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
- isFlip = bitmask & WRAP_FLIP_FLAG,
- Ctor = isBindKey ? undefined : _createCtor(func);
-
- function wrapper() {
- var length = arguments.length,
- args = Array(length),
- index = length;
-
- while (index--) {
- args[index] = arguments[index];
- }
- if (isCurried) {
- var placeholder = _getHolder(wrapper),
- holdersCount = _countHolders(args, placeholder);
- }
- if (partials) {
- args = _composeArgs(args, partials, holders, isCurried);
- }
- if (partialsRight) {
- args = _composeArgsRight(args, partialsRight, holdersRight, isCurried);
- }
- length -= holdersCount;
- if (isCurried && length < arity) {
- var newHolders = _replaceHolders(args, placeholder);
- return _createRecurry(
- func, bitmask, createHybrid, wrapper.placeholder, thisArg,
- args, newHolders, argPos, ary, arity - length
- );
- }
- var thisBinding = isBind ? thisArg : this,
- fn = isBindKey ? thisBinding[func] : func;
-
- length = args.length;
- if (argPos) {
- args = _reorder(args, argPos);
- } else if (isFlip && length > 1) {
- args.reverse();
- }
- if (isAry && ary < length) {
- args.length = ary;
- }
- if (this && this !== _root && this instanceof wrapper) {
- fn = Ctor || _createCtor(fn);
- }
- return fn.apply(thisBinding, args);
- }
- return wrapper;
- }
-
- var _createHybrid = createHybrid;
-
- /**
- * Creates a function that wraps `func` to enable currying.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @param {number} arity The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
- function createCurry(func, bitmask, arity) {
- var Ctor = _createCtor(func);
-
- function wrapper() {
- var length = arguments.length,
- args = Array(length),
- index = length,
- placeholder = _getHolder(wrapper);
-
- while (index--) {
- args[index] = arguments[index];
- }
- var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
- ? []
- : _replaceHolders(args, placeholder);
-
- length -= holders.length;
- if (length < arity) {
- return _createRecurry(
- func, bitmask, _createHybrid, wrapper.placeholder, undefined,
- args, holders, undefined, undefined, arity - length);
- }
- var fn = (this && this !== _root && this instanceof wrapper) ? Ctor : func;
- return _apply(fn, this, args);
- }
- return wrapper;
- }
-
- var _createCurry = createCurry;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$2 = 1;
-
- /**
- * Creates a function that wraps `func` to invoke it with the `this` binding
- * of `thisArg` and `partials` prepended to the arguments it receives.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {Array} partials The arguments to prepend to those provided to
- * the new function.
- * @returns {Function} Returns the new wrapped function.
- */
- function createPartial(func, bitmask, thisArg, partials) {
- var isBind = bitmask & WRAP_BIND_FLAG$2,
- Ctor = _createCtor(func);
-
- function wrapper() {
- var argsIndex = -1,
- argsLength = arguments.length,
- leftIndex = -1,
- leftLength = partials.length,
- args = Array(leftLength + argsLength),
- fn = (this && this !== _root && this instanceof wrapper) ? Ctor : func;
-
- while (++leftIndex < leftLength) {
- args[leftIndex] = partials[leftIndex];
- }
- while (argsLength--) {
- args[leftIndex++] = arguments[++argsIndex];
- }
- return _apply(fn, isBind ? thisArg : this, args);
- }
- return wrapper;
- }
-
- var _createPartial = createPartial;
-
- /** Used as the internal argument placeholder. */
- var PLACEHOLDER = '__lodash_placeholder__';
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG$1 = 1,
- WRAP_BIND_KEY_FLAG$1 = 2,
- WRAP_CURRY_BOUND_FLAG = 4,
- WRAP_CURRY_FLAG$1 = 8,
- WRAP_ARY_FLAG$1 = 128,
- WRAP_REARG_FLAG$1 = 256;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMin = Math.min;
-
- /**
- * Merges the function metadata of `source` into `data`.
- *
- * Merging metadata reduces the number of wrappers used to invoke a function.
- * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
- * may be applied regardless of execution order. Methods like `_.ary` and
- * `_.rearg` modify function arguments, making the order in which they are
- * executed important, preventing the merging of metadata. However, we make
- * an exception for a safe combined case where curried functions have `_.ary`
- * and or `_.rearg` applied.
- *
- * @private
- * @param {Array} data The destination metadata.
- * @param {Array} source The source metadata.
- * @returns {Array} Returns `data`.
- */
- function mergeData(data, source) {
- var bitmask = data[1],
- srcBitmask = source[1],
- newBitmask = bitmask | srcBitmask,
- isCommon = newBitmask < (WRAP_BIND_FLAG$1 | WRAP_BIND_KEY_FLAG$1 | WRAP_ARY_FLAG$1);
-
- var isCombo =
- ((srcBitmask == WRAP_ARY_FLAG$1) && (bitmask == WRAP_CURRY_FLAG$1)) ||
- ((srcBitmask == WRAP_ARY_FLAG$1) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
- ((srcBitmask == (WRAP_ARY_FLAG$1 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$1));
-
- // Exit early if metadata can't be merged.
- if (!(isCommon || isCombo)) {
- return data;
- }
- // Use source `thisArg` if available.
- if (srcBitmask & WRAP_BIND_FLAG$1) {
- data[2] = source[2];
- // Set when currying a bound function.
- newBitmask |= bitmask & WRAP_BIND_FLAG$1 ? 0 : WRAP_CURRY_BOUND_FLAG;
- }
- // Compose partial arguments.
- var value = source[3];
- if (value) {
- var partials = data[3];
- data[3] = partials ? _composeArgs(partials, value, source[4]) : value;
- data[4] = partials ? _replaceHolders(data[3], PLACEHOLDER) : source[4];
- }
- // Compose partial right arguments.
- value = source[5];
- if (value) {
- partials = data[5];
- data[5] = partials ? _composeArgsRight(partials, value, source[6]) : value;
- data[6] = partials ? _replaceHolders(data[5], PLACEHOLDER) : source[6];
- }
- // Use source `argPos` if available.
- value = source[7];
- if (value) {
- data[7] = value;
- }
- // Use source `ary` if it's smaller.
- if (srcBitmask & WRAP_ARY_FLAG$1) {
- data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
- }
- // Use source `arity` if one is not provided.
- if (data[9] == null) {
- data[9] = source[9];
- }
- // Use source `func` and merge bitmasks.
- data[0] = source[0];
- data[1] = newBitmask;
-
- return data;
- }
-
- var _mergeData = mergeData;
-
- /** Used to match a single whitespace character. */
- var reWhitespace = /\s/;
-
- /**
- * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
- * character of `string`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {number} Returns the index of the last non-whitespace character.
- */
- function trimmedEndIndex(string) {
- var index = string.length;
-
- while (index-- && reWhitespace.test(string.charAt(index))) {}
- return index;
- }
-
- var _trimmedEndIndex = trimmedEndIndex;
-
- /** Used to match leading whitespace. */
- var reTrimStart = /^\s+/;
-
- /**
- * The base implementation of `_.trim`.
- *
- * @private
- * @param {string} string The string to trim.
- * @returns {string} Returns the trimmed string.
- */
- function baseTrim(string) {
- return string
- ? string.slice(0, _trimmedEndIndex(string) + 1).replace(reTrimStart, '')
- : string;
- }
-
- var _baseTrim = baseTrim;
-
- /** `Object#toString` result references. */
- var symbolTag$3 = '[object Symbol]';
-
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike_1(value) && _baseGetTag(value) == symbolTag$3);
- }
-
- var isSymbol_1 = isSymbol;
-
- /** Used as references for various `Number` constants. */
- var NAN = 0 / 0;
-
- /** Used to detect bad signed hexadecimal string values. */
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
- /** Used to detect binary string values. */
- var reIsBinary = /^0b[01]+$/i;
-
- /** Used to detect octal string values. */
- var reIsOctal = /^0o[0-7]+$/i;
-
- /** Built-in method references without a dependency on `root`. */
- var freeParseInt = parseInt;
-
- /**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
- function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol_1(value)) {
- return NAN;
- }
- if (isObject_1(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject_1(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = _baseTrim(value);
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
- }
-
- var toNumber_1 = toNumber;
-
- /** Used as references for various `Number` constants. */
- var INFINITY$2 = 1 / 0,
- MAX_INTEGER = 1.7976931348623157e+308;
-
- /**
- * Converts `value` to a finite number.
- *
- * @static
- * @memberOf _
- * @since 4.12.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {number} Returns the converted number.
- * @example
- *
- * _.toFinite(3.2);
- * // => 3.2
- *
- * _.toFinite(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toFinite(Infinity);
- * // => 1.7976931348623157e+308
- *
- * _.toFinite('3.2');
- * // => 3.2
- */
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber_1(value);
- if (value === INFINITY$2 || value === -INFINITY$2) {
- var sign = (value < 0 ? -1 : 1);
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
-
- var toFinite_1 = toFinite;
-
- /**
- * Converts `value` to an integer.
- *
- * **Note:** This method is loosely based on
- * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {number} Returns the converted integer.
- * @example
- *
- * _.toInteger(3.2);
- * // => 3
- *
- * _.toInteger(Number.MIN_VALUE);
- * // => 0
- *
- * _.toInteger(Infinity);
- * // => 1.7976931348623157e+308
- *
- * _.toInteger('3.2');
- * // => 3
- */
- function toInteger(value) {
- var result = toFinite_1(value),
- remainder = result % 1;
-
- return result === result ? (remainder ? result - remainder : result) : 0;
- }
-
- var toInteger_1 = toInteger;
-
- /** Error message constants. */
- var FUNC_ERROR_TEXT$1 = 'Expected a function';
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_BIND_FLAG = 1,
- WRAP_BIND_KEY_FLAG = 2,
- WRAP_CURRY_FLAG = 8,
- WRAP_CURRY_RIGHT_FLAG = 16,
- WRAP_PARTIAL_FLAG = 32,
- WRAP_PARTIAL_RIGHT_FLAG = 64;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax$1 = Math.max;
-
- /**
- * Creates a function that either curries or invokes `func` with optional
- * `this` binding and partially applied arguments.
- *
- * @private
- * @param {Function|string} func The function or method name to wrap.
- * @param {number} bitmask The bitmask flags.
- * 1 - `_.bind`
- * 2 - `_.bindKey`
- * 4 - `_.curry` or `_.curryRight` of a bound function
- * 8 - `_.curry`
- * 16 - `_.curryRight`
- * 32 - `_.partial`
- * 64 - `_.partialRight`
- * 128 - `_.rearg`
- * 256 - `_.ary`
- * 512 - `_.flip`
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {Array} [partials] The arguments to be partially applied.
- * @param {Array} [holders] The `partials` placeholder indexes.
- * @param {Array} [argPos] The argument positions of the new function.
- * @param {number} [ary] The arity cap of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
- function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
- var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
- if (!isBindKey && typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT$1);
- }
- var length = partials ? partials.length : 0;
- if (!length) {
- bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
- partials = holders = undefined;
- }
- ary = ary === undefined ? ary : nativeMax$1(toInteger_1(ary), 0);
- arity = arity === undefined ? arity : toInteger_1(arity);
- length -= holders ? holders.length : 0;
-
- if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
- var partialsRight = partials,
- holdersRight = holders;
-
- partials = holders = undefined;
- }
- var data = isBindKey ? undefined : _getData(func);
-
- var newData = [
- func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
- argPos, ary, arity
- ];
-
- if (data) {
- _mergeData(newData, data);
- }
- func = newData[0];
- bitmask = newData[1];
- thisArg = newData[2];
- partials = newData[3];
- holders = newData[4];
- arity = newData[9] = newData[9] === undefined
- ? (isBindKey ? 0 : func.length)
- : nativeMax$1(newData[9] - length, 0);
-
- if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
- bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
- }
- if (!bitmask || bitmask == WRAP_BIND_FLAG) {
- var result = _createBind(func, bitmask, thisArg);
- } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
- result = _createCurry(func, bitmask, arity);
- } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
- result = _createPartial(func, bitmask, thisArg, partials);
- } else {
- result = _createHybrid.apply(undefined, newData);
- }
- var setter = data ? _baseSetData : _setData;
- return _setWrapToString(setter(result, newData), func, bitmask);
- }
-
- var _createWrap = createWrap;
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/curry.js", function (module, exports) {
- var createWrap = _createWrap;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_CURRY_FLAG = 8;
-
- /**
- * Creates a function that accepts arguments of `func` and either invokes
- * `func` returning its result, if at least `arity` number of arguments have
- * been provided, or returns a function that accepts the remaining `func`
- * arguments, and so on. The arity of `func` may be specified if `func.length`
- * is not sufficient.
- *
- * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
- * may be used as a placeholder for provided arguments.
- *
- * **Note:** This method doesn't set the "length" property of curried functions.
- *
- * @static
- * @memberOf _
- * @since 2.0.0
- * @category Function
- * @param {Function} func The function to curry.
- * @param {number} [arity=func.length] The arity of `func`.
- * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
- * @returns {Function} Returns the new curried function.
- * @example
- *
- * var abc = function(a, b, c) {
- * return [a, b, c];
- * };
- *
- * var curried = _.curry(abc);
- *
- * curried(1)(2)(3);
- * // => [1, 2, 3]
- *
- * curried(1, 2)(3);
- * // => [1, 2, 3]
- *
- * curried(1, 2, 3);
- * // => [1, 2, 3]
- *
- * // Curried with placeholders.
- * curried(1)(_, 3)(2);
- * // => [1, 2, 3]
- */
- function curry(func, arity, guard) {
- arity = guard ? undefined : arity;
- var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
- result.placeholder = curry.placeholder;
- return result;
- }
-
- // Assign default placeholders.
- curry.placeholder = {};
-
- module.exports = curry;
-
- });
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/curryRight.js", function (module, exports) {
- var createWrap = _createWrap;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_CURRY_RIGHT_FLAG = 16;
-
- /**
- * This method is like `_.curry` except that arguments are applied to `func`
- * in the manner of `_.partialRight` instead of `_.partial`.
- *
- * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
- * builds, may be used as a placeholder for provided arguments.
- *
- * **Note:** This method doesn't set the "length" property of curried functions.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Function
- * @param {Function} func The function to curry.
- * @param {number} [arity=func.length] The arity of `func`.
- * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
- * @returns {Function} Returns the new curried function.
- * @example
- *
- * var abc = function(a, b, c) {
- * return [a, b, c];
- * };
- *
- * var curried = _.curryRight(abc);
- *
- * curried(3)(2)(1);
- * // => [1, 2, 3]
- *
- * curried(2, 3)(1);
- * // => [1, 2, 3]
- *
- * curried(1, 2, 3);
- * // => [1, 2, 3]
- *
- * // Curried with placeholders.
- * curried(3)(1, _)(2);
- * // => [1, 2, 3]
- */
- function curryRight(func, arity, guard) {
- arity = guard ? undefined : arity;
- var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
- result.placeholder = curryRight.placeholder;
- return result;
- }
-
- // Assign default placeholders.
- curryRight.placeholder = {};
-
- module.exports = curryRight;
-
- });
-
- /** Used to map aliases to their real names. */
-
- var _mapping = createCommonjsModule(function (module, exports) {
- exports.aliasToReal = {
-
- // Lodash aliases.
- 'each': 'forEach',
- 'eachRight': 'forEachRight',
- 'entries': 'toPairs',
- 'entriesIn': 'toPairsIn',
- 'extend': 'assignIn',
- 'extendAll': 'assignInAll',
- 'extendAllWith': 'assignInAllWith',
- 'extendWith': 'assignInWith',
- 'first': 'head',
-
- // Methods that are curried variants of others.
- 'conforms': 'conformsTo',
- 'matches': 'isMatch',
- 'property': 'get',
-
- // Ramda aliases.
- '__': 'placeholder',
- 'F': 'stubFalse',
- 'T': 'stubTrue',
- 'all': 'every',
- 'allPass': 'overEvery',
- 'always': 'constant',
- 'any': 'some',
- 'anyPass': 'overSome',
- 'apply': 'spread',
- 'assoc': 'set',
- 'assocPath': 'set',
- 'complement': 'negate',
- 'compose': 'flowRight',
- 'contains': 'includes',
- 'dissoc': 'unset',
- 'dissocPath': 'unset',
- 'dropLast': 'dropRight',
- 'dropLastWhile': 'dropRightWhile',
- 'equals': 'isEqual',
- 'identical': 'eq',
- 'indexBy': 'keyBy',
- 'init': 'initial',
- 'invertObj': 'invert',
- 'juxt': 'over',
- 'omitAll': 'omit',
- 'nAry': 'ary',
- 'path': 'get',
- 'pathEq': 'matchesProperty',
- 'pathOr': 'getOr',
- 'paths': 'at',
- 'pickAll': 'pick',
- 'pipe': 'flow',
- 'pluck': 'map',
- 'prop': 'get',
- 'propEq': 'matchesProperty',
- 'propOr': 'getOr',
- 'props': 'at',
- 'symmetricDifference': 'xor',
- 'symmetricDifferenceBy': 'xorBy',
- 'symmetricDifferenceWith': 'xorWith',
- 'takeLast': 'takeRight',
- 'takeLastWhile': 'takeRightWhile',
- 'unapply': 'rest',
- 'unnest': 'flatten',
- 'useWith': 'overArgs',
- 'where': 'conformsTo',
- 'whereEq': 'isMatch',
- 'zipObj': 'zipObject'
- };
-
- /** Used to map ary to method names. */
- exports.aryMethod = {
- '1': [
- 'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
- 'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
- 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
- 'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
- 'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
- 'uniqueId', 'words', 'zipAll'
- ],
- '2': [
- 'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
- 'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
- 'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
- 'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
- 'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
- 'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
- 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
- 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
- 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
- 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
- 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
- 'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
- 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
- 'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
- 'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
- 'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
- 'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
- 'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
- 'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
- 'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
- 'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
- 'zipObjectDeep'
- ],
- '3': [
- 'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
- 'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
- 'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
- 'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
- 'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
- 'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
- 'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
- 'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
- 'xorWith', 'zipWith'
- ],
- '4': [
- 'fill', 'setWith', 'updateWith'
- ]
- };
-
- /** Used to map ary to rearg configs. */
- exports.aryRearg = {
- '2': [1, 0],
- '3': [2, 0, 1],
- '4': [3, 2, 0, 1]
- };
-
- /** Used to map method names to their iteratee ary. */
- exports.iterateeAry = {
- 'dropRightWhile': 1,
- 'dropWhile': 1,
- 'every': 1,
- 'filter': 1,
- 'find': 1,
- 'findFrom': 1,
- 'findIndex': 1,
- 'findIndexFrom': 1,
- 'findKey': 1,
- 'findLast': 1,
- 'findLastFrom': 1,
- 'findLastIndex': 1,
- 'findLastIndexFrom': 1,
- 'findLastKey': 1,
- 'flatMap': 1,
- 'flatMapDeep': 1,
- 'flatMapDepth': 1,
- 'forEach': 1,
- 'forEachRight': 1,
- 'forIn': 1,
- 'forInRight': 1,
- 'forOwn': 1,
- 'forOwnRight': 1,
- 'map': 1,
- 'mapKeys': 1,
- 'mapValues': 1,
- 'partition': 1,
- 'reduce': 2,
- 'reduceRight': 2,
- 'reject': 1,
- 'remove': 1,
- 'some': 1,
- 'takeRightWhile': 1,
- 'takeWhile': 1,
- 'times': 1,
- 'transform': 2
- };
-
- /** Used to map method names to iteratee rearg configs. */
- exports.iterateeRearg = {
- 'mapKeys': [1],
- 'reduceRight': [1, 0]
- };
-
- /** Used to map method names to rearg configs. */
- exports.methodRearg = {
- 'assignInAllWith': [1, 0],
- 'assignInWith': [1, 2, 0],
- 'assignAllWith': [1, 0],
- 'assignWith': [1, 2, 0],
- 'differenceBy': [1, 2, 0],
- 'differenceWith': [1, 2, 0],
- 'getOr': [2, 1, 0],
- 'intersectionBy': [1, 2, 0],
- 'intersectionWith': [1, 2, 0],
- 'isEqualWith': [1, 2, 0],
- 'isMatchWith': [2, 1, 0],
- 'mergeAllWith': [1, 0],
- 'mergeWith': [1, 2, 0],
- 'padChars': [2, 1, 0],
- 'padCharsEnd': [2, 1, 0],
- 'padCharsStart': [2, 1, 0],
- 'pullAllBy': [2, 1, 0],
- 'pullAllWith': [2, 1, 0],
- 'rangeStep': [1, 2, 0],
- 'rangeStepRight': [1, 2, 0],
- 'setWith': [3, 1, 2, 0],
- 'sortedIndexBy': [2, 1, 0],
- 'sortedLastIndexBy': [2, 1, 0],
- 'unionBy': [1, 2, 0],
- 'unionWith': [1, 2, 0],
- 'updateWith': [3, 1, 2, 0],
- 'xorBy': [1, 2, 0],
- 'xorWith': [1, 2, 0],
- 'zipWith': [1, 2, 0]
- };
-
- /** Used to map method names to spread configs. */
- exports.methodSpread = {
- 'assignAll': { 'start': 0 },
- 'assignAllWith': { 'start': 0 },
- 'assignInAll': { 'start': 0 },
- 'assignInAllWith': { 'start': 0 },
- 'defaultsAll': { 'start': 0 },
- 'defaultsDeepAll': { 'start': 0 },
- 'invokeArgs': { 'start': 2 },
- 'invokeArgsMap': { 'start': 2 },
- 'mergeAll': { 'start': 0 },
- 'mergeAllWith': { 'start': 0 },
- 'partial': { 'start': 1 },
- 'partialRight': { 'start': 1 },
- 'without': { 'start': 1 },
- 'zipAll': { 'start': 0 }
- };
-
- /** Used to identify methods which mutate arrays or objects. */
- exports.mutate = {
- 'array': {
- 'fill': true,
- 'pull': true,
- 'pullAll': true,
- 'pullAllBy': true,
- 'pullAllWith': true,
- 'pullAt': true,
- 'remove': true,
- 'reverse': true
- },
- 'object': {
- 'assign': true,
- 'assignAll': true,
- 'assignAllWith': true,
- 'assignIn': true,
- 'assignInAll': true,
- 'assignInAllWith': true,
- 'assignInWith': true,
- 'assignWith': true,
- 'defaults': true,
- 'defaultsAll': true,
- 'defaultsDeep': true,
- 'defaultsDeepAll': true,
- 'merge': true,
- 'mergeAll': true,
- 'mergeAllWith': true,
- 'mergeWith': true,
- },
- 'set': {
- 'set': true,
- 'setWith': true,
- 'unset': true,
- 'update': true,
- 'updateWith': true
- }
- };
-
- /** Used to map real names to their aliases. */
- exports.realToAlias = (function() {
- var hasOwnProperty = Object.prototype.hasOwnProperty,
- object = exports.aliasToReal,
- result = {};
-
- for (var key in object) {
- var value = object[key];
- if (hasOwnProperty.call(result, value)) {
- result[value].push(key);
- } else {
- result[value] = [key];
- }
- }
- return result;
- }());
-
- /** Used to map method names to other names. */
- exports.remap = {
- 'assignAll': 'assign',
- 'assignAllWith': 'assignWith',
- 'assignInAll': 'assignIn',
- 'assignInAllWith': 'assignInWith',
- 'curryN': 'curry',
- 'curryRightN': 'curryRight',
- 'defaultsAll': 'defaults',
- 'defaultsDeepAll': 'defaultsDeep',
- 'findFrom': 'find',
- 'findIndexFrom': 'findIndex',
- 'findLastFrom': 'findLast',
- 'findLastIndexFrom': 'findLastIndex',
- 'getOr': 'get',
- 'includesFrom': 'includes',
- 'indexOfFrom': 'indexOf',
- 'invokeArgs': 'invoke',
- 'invokeArgsMap': 'invokeMap',
- 'lastIndexOfFrom': 'lastIndexOf',
- 'mergeAll': 'merge',
- 'mergeAllWith': 'mergeWith',
- 'padChars': 'pad',
- 'padCharsEnd': 'padEnd',
- 'padCharsStart': 'padStart',
- 'propertyOf': 'get',
- 'rangeStep': 'range',
- 'rangeStepRight': 'rangeRight',
- 'restFrom': 'rest',
- 'spreadFrom': 'spread',
- 'trimChars': 'trim',
- 'trimCharsEnd': 'trimEnd',
- 'trimCharsStart': 'trimStart',
- 'zipAll': 'zip'
- };
-
- /** Used to track methods that skip fixing their arity. */
- exports.skipFixed = {
- 'castArray': true,
- 'flow': true,
- 'flowRight': true,
- 'iteratee': true,
- 'mixin': true,
- 'rearg': true,
- 'runInContext': true
- };
-
- /** Used to track methods that skip rearranging arguments. */
- exports.skipRearg = {
- 'add': true,
- 'assign': true,
- 'assignIn': true,
- 'bind': true,
- 'bindKey': true,
- 'concat': true,
- 'difference': true,
- 'divide': true,
- 'eq': true,
- 'gt': true,
- 'gte': true,
- 'isEqual': true,
- 'lt': true,
- 'lte': true,
- 'matchesProperty': true,
- 'merge': true,
- 'multiply': true,
- 'overArgs': true,
- 'partial': true,
- 'partialRight': true,
- 'propertyOf': true,
- 'random': true,
- 'range': true,
- 'rangeRight': true,
- 'subtract': true,
- 'zip': true,
- 'zipObject': true,
- 'zipObjectDeep': true
- };
- }, "/$$rollup_base$$/node_modules/lodash/fp");
-
- /**
- * The default argument placeholder value for methods.
- *
- * @type {Object}
- */
- var placeholder = {};
-
- /** Built-in value reference. */
- var push = Array.prototype.push;
-
- /**
- * Creates a function, with an arity of `n`, that invokes `func` with the
- * arguments it receives.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {number} n The arity of the new function.
- * @returns {Function} Returns the new function.
- */
- function baseArity(func, n) {
- return n == 2
- ? function(a, b) { return func.apply(undefined, arguments); }
- : function(a) { return func.apply(undefined, arguments); };
- }
-
- /**
- * Creates a function that invokes `func`, with up to `n` arguments, ignoring
- * any additional arguments.
- *
- * @private
- * @param {Function} func The function to cap arguments for.
- * @param {number} n The arity cap.
- * @returns {Function} Returns the new function.
- */
- function baseAry(func, n) {
- return n == 2
- ? function(a, b) { return func(a, b); }
- : function(a) { return func(a); };
- }
-
- /**
- * Creates a clone of `array`.
- *
- * @private
- * @param {Array} array The array to clone.
- * @returns {Array} Returns the cloned array.
- */
- function cloneArray(array) {
- var length = array ? array.length : 0,
- result = Array(length);
-
- while (length--) {
- result[length] = array[length];
- }
- return result;
- }
-
- /**
- * Creates a function that clones a given object using the assignment `func`.
- *
- * @private
- * @param {Function} func The assignment function.
- * @returns {Function} Returns the new cloner function.
- */
- function createCloner(func) {
- return function(object) {
- return func({}, object);
- };
- }
-
- /**
- * A specialized version of `_.spread` which flattens the spread array into
- * the arguments of the invoked `func`.
- *
- * @private
- * @param {Function} func The function to spread arguments over.
- * @param {number} start The start position of the spread.
- * @returns {Function} Returns the new function.
- */
- function flatSpread(func, start) {
- return function() {
- var length = arguments.length,
- lastIndex = length - 1,
- args = Array(length);
-
- while (length--) {
- args[length] = arguments[length];
- }
- var array = args[start],
- otherArgs = args.slice(0, start);
-
- if (array) {
- push.apply(otherArgs, array);
- }
- if (start != lastIndex) {
- push.apply(otherArgs, args.slice(start + 1));
- }
- return func.apply(this, otherArgs);
- };
- }
-
- /**
- * Creates a function that wraps `func` and uses `cloner` to clone the first
- * argument it receives.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} cloner The function to clone arguments.
- * @returns {Function} Returns the new immutable function.
- */
- function wrapImmutable(func, cloner) {
- return function() {
- var length = arguments.length;
- if (!length) {
- return;
- }
- var args = Array(length);
- while (length--) {
- args[length] = arguments[length];
- }
- var result = args[0] = cloner.apply(undefined, args);
- func.apply(undefined, args);
- return result;
- };
- }
-
- /**
- * The base implementation of `convert` which accepts a `util` object of methods
- * required to perform conversions.
- *
- * @param {Object} util The util object.
- * @param {string} name The name of the function to convert.
- * @param {Function} func The function to convert.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.cap=true] Specify capping iteratee arguments.
- * @param {boolean} [options.curry=true] Specify currying.
- * @param {boolean} [options.fixed=true] Specify fixed arity.
- * @param {boolean} [options.immutable=true] Specify immutable operations.
- * @param {boolean} [options.rearg=true] Specify rearranging arguments.
- * @returns {Function|Object} Returns the converted function or object.
- */
- function baseConvert(util, name, func, options) {
- var isLib = typeof name == 'function',
- isObj = name === Object(name);
-
- if (isObj) {
- options = func;
- func = name;
- name = undefined;
- }
- if (func == null) {
- throw new TypeError;
- }
- options || (options = {});
-
- var config = {
- 'cap': 'cap' in options ? options.cap : true,
- 'curry': 'curry' in options ? options.curry : true,
- 'fixed': 'fixed' in options ? options.fixed : true,
- 'immutable': 'immutable' in options ? options.immutable : true,
- 'rearg': 'rearg' in options ? options.rearg : true
- };
-
- var defaultHolder = isLib ? func : placeholder,
- forceCurry = ('curry' in options) && options.curry,
- forceFixed = ('fixed' in options) && options.fixed,
- forceRearg = ('rearg' in options) && options.rearg,
- pristine = isLib ? func.runInContext() : undefined;
-
- var helpers = isLib ? func : {
- 'ary': util.ary,
- 'assign': util.assign,
- 'clone': util.clone,
- 'curry': util.curry,
- 'forEach': util.forEach,
- 'isArray': util.isArray,
- 'isError': util.isError,
- 'isFunction': util.isFunction,
- 'isWeakMap': util.isWeakMap,
- 'iteratee': util.iteratee,
- 'keys': util.keys,
- 'rearg': util.rearg,
- 'toInteger': util.toInteger,
- 'toPath': util.toPath
- };
-
- var ary = helpers.ary,
- assign = helpers.assign,
- clone = helpers.clone,
- curry = helpers.curry,
- each = helpers.forEach,
- isArray = helpers.isArray,
- isError = helpers.isError,
- isFunction = helpers.isFunction,
- isWeakMap = helpers.isWeakMap,
- keys = helpers.keys,
- rearg = helpers.rearg,
- toInteger = helpers.toInteger,
- toPath = helpers.toPath;
-
- var aryMethodKeys = keys(_mapping.aryMethod);
-
- var wrappers = {
- 'castArray': function(castArray) {
- return function() {
- var value = arguments[0];
- return isArray(value)
- ? castArray(cloneArray(value))
- : castArray.apply(undefined, arguments);
- };
- },
- 'iteratee': function(iteratee) {
- return function() {
- var func = arguments[0],
- arity = arguments[1],
- result = iteratee(func, arity),
- length = result.length;
-
- if (config.cap && typeof arity == 'number') {
- arity = arity > 2 ? (arity - 2) : 1;
- return (length && length <= arity) ? result : baseAry(result, arity);
- }
- return result;
- };
- },
- 'mixin': function(mixin) {
- return function(source) {
- var func = this;
- if (!isFunction(func)) {
- return mixin(func, Object(source));
- }
- var pairs = [];
- each(keys(source), function(key) {
- if (isFunction(source[key])) {
- pairs.push([key, func.prototype[key]]);
- }
- });
-
- mixin(func, Object(source));
-
- each(pairs, function(pair) {
- var value = pair[1];
- if (isFunction(value)) {
- func.prototype[pair[0]] = value;
- } else {
- delete func.prototype[pair[0]];
- }
- });
- return func;
- };
- },
- 'nthArg': function(nthArg) {
- return function(n) {
- var arity = n < 0 ? 1 : (toInteger(n) + 1);
- return curry(nthArg(n), arity);
- };
- },
- 'rearg': function(rearg) {
- return function(func, indexes) {
- var arity = indexes ? indexes.length : 0;
- return curry(rearg(func, indexes), arity);
- };
- },
- 'runInContext': function(runInContext) {
- return function(context) {
- return baseConvert(util, runInContext(context), options);
- };
- }
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Casts `func` to a function with an arity capped iteratee if needed.
- *
- * @private
- * @param {string} name The name of the function to inspect.
- * @param {Function} func The function to inspect.
- * @returns {Function} Returns the cast function.
- */
- function castCap(name, func) {
- if (config.cap) {
- var indexes = _mapping.iterateeRearg[name];
- if (indexes) {
- return iterateeRearg(func, indexes);
- }
- var n = !isLib && _mapping.iterateeAry[name];
- if (n) {
- return iterateeAry(func, n);
- }
- }
- return func;
- }
-
- /**
- * Casts `func` to a curried function if needed.
- *
- * @private
- * @param {string} name The name of the function to inspect.
- * @param {Function} func The function to inspect.
- * @param {number} n The arity of `func`.
- * @returns {Function} Returns the cast function.
- */
- function castCurry(name, func, n) {
- return (forceCurry || (config.curry && n > 1))
- ? curry(func, n)
- : func;
- }
-
- /**
- * Casts `func` to a fixed arity function if needed.
- *
- * @private
- * @param {string} name The name of the function to inspect.
- * @param {Function} func The function to inspect.
- * @param {number} n The arity cap.
- * @returns {Function} Returns the cast function.
- */
- function castFixed(name, func, n) {
- if (config.fixed && (forceFixed || !_mapping.skipFixed[name])) {
- var data = _mapping.methodSpread[name],
- start = data && data.start;
-
- return start === undefined ? ary(func, n) : flatSpread(func, start);
- }
- return func;
- }
-
- /**
- * Casts `func` to an rearged function if needed.
- *
- * @private
- * @param {string} name The name of the function to inspect.
- * @param {Function} func The function to inspect.
- * @param {number} n The arity of `func`.
- * @returns {Function} Returns the cast function.
- */
- function castRearg(name, func, n) {
- return (config.rearg && n > 1 && (forceRearg || !_mapping.skipRearg[name]))
- ? rearg(func, _mapping.methodRearg[name] || _mapping.aryRearg[n])
- : func;
- }
-
- /**
- * Creates a clone of `object` by `path`.
- *
- * @private
- * @param {Object} object The object to clone.
- * @param {Array|string} path The path to clone by.
- * @returns {Object} Returns the cloned object.
- */
- function cloneByPath(object, path) {
- path = toPath(path);
-
- var index = -1,
- length = path.length,
- lastIndex = length - 1,
- result = clone(Object(object)),
- nested = result;
-
- while (nested != null && ++index < length) {
- var key = path[index],
- value = nested[key];
-
- if (value != null &&
- !(isFunction(value) || isError(value) || isWeakMap(value))) {
- nested[key] = clone(index == lastIndex ? value : Object(value));
- }
- nested = nested[key];
- }
- return result;
- }
-
- /**
- * Converts `lodash` to an immutable auto-curried iteratee-first data-last
- * version with conversion `options` applied.
- *
- * @param {Object} [options] The options object. See `baseConvert` for more details.
- * @returns {Function} Returns the converted `lodash`.
- */
- function convertLib(options) {
- return _.runInContext.convert(options)(undefined);
- }
-
- /**
- * Create a converter function for `func` of `name`.
- *
- * @param {string} name The name of the function to convert.
- * @param {Function} func The function to convert.
- * @returns {Function} Returns the new converter function.
- */
- function createConverter(name, func) {
- var realName = _mapping.aliasToReal[name] || name,
- methodName = _mapping.remap[realName] || realName,
- oldOptions = options;
-
- return function(options) {
- var newUtil = isLib ? pristine : helpers,
- newFunc = isLib ? pristine[methodName] : func,
- newOptions = assign(assign({}, oldOptions), options);
-
- return baseConvert(newUtil, realName, newFunc, newOptions);
- };
- }
-
- /**
- * Creates a function that wraps `func` to invoke its iteratee, with up to `n`
- * arguments, ignoring any additional arguments.
- *
- * @private
- * @param {Function} func The function to cap iteratee arguments for.
- * @param {number} n The arity cap.
- * @returns {Function} Returns the new function.
- */
- function iterateeAry(func, n) {
- return overArg(func, function(func) {
- return typeof func == 'function' ? baseAry(func, n) : func;
- });
- }
-
- /**
- * Creates a function that wraps `func` to invoke its iteratee with arguments
- * arranged according to the specified `indexes` where the argument value at
- * the first index is provided as the first argument, the argument value at
- * the second index is provided as the second argument, and so on.
- *
- * @private
- * @param {Function} func The function to rearrange iteratee arguments for.
- * @param {number[]} indexes The arranged argument indexes.
- * @returns {Function} Returns the new function.
- */
- function iterateeRearg(func, indexes) {
- return overArg(func, function(func) {
- var n = indexes.length;
- return baseArity(rearg(baseAry(func, n), indexes), n);
- });
- }
-
- /**
- * Creates a function that invokes `func` with its first argument transformed.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
- */
- function overArg(func, transform) {
- return function() {
- var length = arguments.length;
- if (!length) {
- return func();
- }
- var args = Array(length);
- while (length--) {
- args[length] = arguments[length];
- }
- var index = config.rearg ? 0 : (length - 1);
- args[index] = transform(args[index]);
- return func.apply(undefined, args);
- };
- }
-
- /**
- * Creates a function that wraps `func` and applys the conversions
- * rules by `name`.
- *
- * @private
- * @param {string} name The name of the function to wrap.
- * @param {Function} func The function to wrap.
- * @returns {Function} Returns the converted function.
- */
- function wrap(name, func, placeholder) {
- var result,
- realName = _mapping.aliasToReal[name] || name,
- wrapped = func,
- wrapper = wrappers[realName];
-
- if (wrapper) {
- wrapped = wrapper(func);
- }
- else if (config.immutable) {
- if (_mapping.mutate.array[realName]) {
- wrapped = wrapImmutable(func, cloneArray);
- }
- else if (_mapping.mutate.object[realName]) {
- wrapped = wrapImmutable(func, createCloner(func));
- }
- else if (_mapping.mutate.set[realName]) {
- wrapped = wrapImmutable(func, cloneByPath);
- }
- }
- each(aryMethodKeys, function(aryKey) {
- each(_mapping.aryMethod[aryKey], function(otherName) {
- if (realName == otherName) {
- var data = _mapping.methodSpread[realName],
- afterRearg = data && data.afterRearg;
-
- result = afterRearg
- ? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)
- : castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);
-
- result = castCap(realName, result);
- result = castCurry(realName, result, aryKey);
- return false;
- }
- });
- return !result;
- });
-
- result || (result = wrapped);
- if (result == func) {
- result = forceCurry ? curry(result, 1) : function() {
- return func.apply(this, arguments);
- };
- }
- result.convert = createConverter(realName, func);
- result.placeholder = func.placeholder = placeholder;
-
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- if (!isObj) {
- return wrap(name, func, defaultHolder);
- }
- var _ = func;
-
- // Convert methods by ary cap.
- var pairs = [];
- each(aryMethodKeys, function(aryKey) {
- each(_mapping.aryMethod[aryKey], function(key) {
- var func = _[_mapping.remap[key] || key];
- if (func) {
- pairs.push([key, wrap(key, func, _)]);
- }
- });
- });
-
- // Convert remaining methods.
- each(keys(_), function(key) {
- var func = _[key];
- if (typeof func == 'function') {
- var length = pairs.length;
- while (length--) {
- if (pairs[length][0] == key) {
- return;
- }
- }
- func.convert = createConverter(key, func);
- pairs.push([key, func]);
- }
- });
-
- // Assign to `_` leaving `_.prototype` unchanged to allow chaining.
- each(pairs, function(pair) {
- _[pair[0]] = pair[1];
- });
-
- _.convert = convertLib;
- _.placeholder = _;
-
- // Assign aliases.
- each(keys(_), function(key) {
- each(_mapping.realToAlias[key] || [], function(alias) {
- _[alias] = _[key];
- });
- });
-
- return _;
- }
-
- var _baseConvert = baseConvert;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_ARY_FLAG = 128;
-
- /**
- * Creates a function that invokes `func`, with up to `n` arguments,
- * ignoring any additional arguments.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Function
- * @param {Function} func The function to cap arguments for.
- * @param {number} [n=func.length] The arity cap.
- * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
- * @returns {Function} Returns the new capped function.
- * @example
- *
- * _.map(['6', '8', '10'], _.ary(parseInt, 1));
- * // => [6, 8, 10]
- */
- function ary(func, n, guard) {
- n = guard ? undefined : n;
- n = (func && n == null) ? func.length : n;
- return _createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
- }
-
- var ary_1 = ary;
-
- /**
- * The base implementation of `assignValue` and `assignMergeValue` without
- * value checks.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
- function baseAssignValue(object, key, value) {
- if (key == '__proto__' && _defineProperty) {
- _defineProperty(object, key, {
- 'configurable': true,
- 'enumerable': true,
- 'value': value,
- 'writable': true
- });
- } else {
- object[key] = value;
- }
- }
-
- var _baseAssignValue = baseAssignValue;
-
- /**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
- function eq(value, other) {
- return value === other || (value !== value && other !== other);
- }
-
- var eq_1 = eq;
-
- /** Used for built-in method references. */
- var objectProto$c = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$a = objectProto$c.hasOwnProperty;
-
- /**
- * Assigns `value` to `key` of `object` if the existing value is not equivalent
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
- function assignValue(object, key, value) {
- var objValue = object[key];
- if (!(hasOwnProperty$a.call(object, key) && eq_1(objValue, value)) ||
- (value === undefined && !(key in object))) {
- _baseAssignValue(object, key, value);
- }
- }
-
- var _assignValue = assignValue;
-
- /**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property identifiers to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @param {Function} [customizer] The function to customize copied values.
- * @returns {Object} Returns `object`.
- */
- function copyObject(source, props, object, customizer) {
- var isNew = !object;
- object || (object = {});
-
- var index = -1,
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
-
- var newValue = customizer
- ? customizer(object[key], source[key], key, object, source)
- : undefined;
-
- if (newValue === undefined) {
- newValue = source[key];
- }
- if (isNew) {
- _baseAssignValue(object, key, newValue);
- } else {
- _assignValue(object, key, newValue);
- }
- }
- return object;
- }
-
- var _copyObject = copyObject;
-
- /**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
- function baseTimes(n, iteratee) {
- var index = -1,
- result = Array(n);
-
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
-
- var _baseTimes = baseTimes;
-
- /** `Object#toString` result references. */
- var argsTag$3 = '[object Arguments]';
-
- /**
- * The base implementation of `_.isArguments`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- */
- function baseIsArguments(value) {
- return isObjectLike_1(value) && _baseGetTag(value) == argsTag$3;
- }
-
- var _baseIsArguments = baseIsArguments;
-
- /** Used for built-in method references. */
- var objectProto$b = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$9 = objectProto$b.hasOwnProperty;
-
- /** Built-in value references. */
- var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
-
- /**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- * else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- var isArguments = _baseIsArguments(function() { return arguments; }()) ? _baseIsArguments : function(value) {
- return isObjectLike_1(value) && hasOwnProperty$9.call(value, 'callee') &&
- !propertyIsEnumerable$1.call(value, 'callee');
- };
-
- var isArguments_1 = isArguments;
-
- /**
- * This method returns `false`.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {boolean} Returns `false`.
- * @example
- *
- * _.times(2, _.stubFalse);
- * // => [false, false]
- */
- function stubFalse() {
- return false;
- }
-
- var stubFalse_1 = stubFalse;
-
- var isBuffer_1 = createCommonjsModule(function (module, exports) {
- /** Detect free variable `exports`. */
- var freeExports = exports && !exports.nodeType && exports;
-
- /** Detect free variable `module`. */
- var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
-
- /** Detect the popular CommonJS extension `module.exports`. */
- var moduleExports = freeModule && freeModule.exports === freeExports;
-
- /** Built-in value references. */
- var Buffer = moduleExports ? _root.Buffer : undefined;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
-
- /**
- * Checks if `value` is a buffer.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
- * @example
- *
- * _.isBuffer(new Buffer(2));
- * // => true
- *
- * _.isBuffer(new Uint8Array(2));
- * // => false
- */
- var isBuffer = nativeIsBuffer || stubFalse_1;
-
- module.exports = isBuffer;
- }, "/$$rollup_base$$/node_modules/lodash");
-
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER = 9007199254740991;
-
- /**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
- function isLength(value) {
- return typeof value == 'number' &&
- value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
-
- var isLength_1 = isLength;
-
- /** `Object#toString` result references. */
- var argsTag$2 = '[object Arguments]',
- arrayTag$2 = '[object Array]',
- boolTag$3 = '[object Boolean]',
- dateTag$3 = '[object Date]',
- errorTag$3 = '[object Error]',
- funcTag$1 = '[object Function]',
- mapTag$5 = '[object Map]',
- numberTag$3 = '[object Number]',
- objectTag$4 = '[object Object]',
- regexpTag$3 = '[object RegExp]',
- setTag$5 = '[object Set]',
- stringTag$3 = '[object String]',
- weakMapTag$3 = '[object WeakMap]';
-
- var arrayBufferTag$3 = '[object ArrayBuffer]',
- dataViewTag$4 = '[object DataView]',
- float32Tag$2 = '[object Float32Array]',
- float64Tag$2 = '[object Float64Array]',
- int8Tag$2 = '[object Int8Array]',
- int16Tag$2 = '[object Int16Array]',
- int32Tag$2 = '[object Int32Array]',
- uint8Tag$2 = '[object Uint8Array]',
- uint8ClampedTag$2 = '[object Uint8ClampedArray]',
- uint16Tag$2 = '[object Uint16Array]',
- uint32Tag$2 = '[object Uint32Array]';
-
- /** Used to identify `toStringTag` values of typed arrays. */
- var typedArrayTags = {};
- typedArrayTags[float32Tag$2] = typedArrayTags[float64Tag$2] =
- typedArrayTags[int8Tag$2] = typedArrayTags[int16Tag$2] =
- typedArrayTags[int32Tag$2] = typedArrayTags[uint8Tag$2] =
- typedArrayTags[uint8ClampedTag$2] = typedArrayTags[uint16Tag$2] =
- typedArrayTags[uint32Tag$2] = true;
- typedArrayTags[argsTag$2] = typedArrayTags[arrayTag$2] =
- typedArrayTags[arrayBufferTag$3] = typedArrayTags[boolTag$3] =
- typedArrayTags[dataViewTag$4] = typedArrayTags[dateTag$3] =
- typedArrayTags[errorTag$3] = typedArrayTags[funcTag$1] =
- typedArrayTags[mapTag$5] = typedArrayTags[numberTag$3] =
- typedArrayTags[objectTag$4] = typedArrayTags[regexpTag$3] =
- typedArrayTags[setTag$5] = typedArrayTags[stringTag$3] =
- typedArrayTags[weakMapTag$3] = false;
-
- /**
- * The base implementation of `_.isTypedArray` without Node.js optimizations.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- */
- function baseIsTypedArray(value) {
- return isObjectLike_1(value) &&
- isLength_1(value.length) && !!typedArrayTags[_baseGetTag(value)];
- }
-
- var _baseIsTypedArray = baseIsTypedArray;
-
- /**
- * The base implementation of `_.unary` without support for storing metadata.
- *
- * @private
- * @param {Function} func The function to cap arguments for.
- * @returns {Function} Returns the new capped function.
- */
- function baseUnary(func) {
- return function(value) {
- return func(value);
- };
- }
-
- var _baseUnary = baseUnary;
-
- var _nodeUtil = createCommonjsModule(function (module, exports) {
- /** Detect free variable `exports`. */
- var freeExports = exports && !exports.nodeType && exports;
-
- /** Detect free variable `module`. */
- var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
-
- /** Detect the popular CommonJS extension `module.exports`. */
- var moduleExports = freeModule && freeModule.exports === freeExports;
-
- /** Detect free variable `process` from Node.js. */
- var freeProcess = moduleExports && _freeGlobal.process;
-
- /** Used to access faster Node.js helpers. */
- var nodeUtil = (function() {
- try {
- // Use `util.types` for Node.js 10+.
- var types = freeModule && freeModule.require && freeModule.require('util').types;
-
- if (types) {
- return types;
- }
-
- // Legacy `process.binding('util')` for Node.js < 10.
- return freeProcess && freeProcess.binding && freeProcess.binding('util');
- } catch (e) {}
- }());
-
- module.exports = nodeUtil;
- }, "/$$rollup_base$$/node_modules/lodash");
-
- /* Node.js helper references. */
- var nodeIsTypedArray = _nodeUtil && _nodeUtil.isTypedArray;
-
- /**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
- var isTypedArray = nodeIsTypedArray ? _baseUnary(nodeIsTypedArray) : _baseIsTypedArray;
-
- var isTypedArray_1 = isTypedArray;
-
- /** Used for built-in method references. */
- var objectProto$a = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
-
- /**
- * Creates an array of the enumerable property names of the array-like `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @param {boolean} inherited Specify returning inherited property names.
- * @returns {Array} Returns the array of property names.
- */
- function arrayLikeKeys(value, inherited) {
- var isArr = isArray_1(value),
- isArg = !isArr && isArguments_1(value),
- isBuff = !isArr && !isArg && isBuffer_1(value),
- isType = !isArr && !isArg && !isBuff && isTypedArray_1(value),
- skipIndexes = isArr || isArg || isBuff || isType,
- result = skipIndexes ? _baseTimes(value.length, String) : [],
- length = result.length;
-
- for (var key in value) {
- if ((inherited || hasOwnProperty$8.call(value, key)) &&
- !(skipIndexes && (
- // Safari 9 has enumerable `arguments.length` in strict mode.
- key == 'length' ||
- // Node.js 0.10 has enumerable non-index properties on buffers.
- (isBuff && (key == 'offset' || key == 'parent')) ||
- // PhantomJS 2 has enumerable non-index properties on typed arrays.
- (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
- // Skip index properties.
- _isIndex(key, length)
- ))) {
- result.push(key);
- }
- }
- return result;
- }
-
- var _arrayLikeKeys = arrayLikeKeys;
-
- /** Used for built-in method references. */
- var objectProto$9 = Object.prototype;
-
- /**
- * Checks if `value` is likely a prototype object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
- */
- function isPrototype(value) {
- var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$9;
-
- return value === proto;
- }
-
- var _isPrototype = isPrototype;
-
- /**
- * Creates a unary function that invokes `func` with its argument transformed.
- *
- * @private
- * @param {Function} func The function to wrap.
- * @param {Function} transform The argument transform.
- * @returns {Function} Returns the new function.
- */
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
-
- var _overArg = overArg;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeKeys = _overArg(Object.keys, Object);
-
- var _nativeKeys = nativeKeys;
-
- /** Used for built-in method references. */
- var objectProto$8 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$7 = objectProto$8.hasOwnProperty;
-
- /**
- * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function baseKeys(object) {
- if (!_isPrototype(object)) {
- return _nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
- result.push(key);
- }
- }
- return result;
- }
-
- var _baseKeys = baseKeys;
-
- /**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
- function isArrayLike(value) {
- return value != null && isLength_1(value.length) && !isFunction_1(value);
- }
-
- var isArrayLike_1 = isArrayLike;
-
- /**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @since 0.1.0
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
- function keys(object) {
- return isArrayLike_1(object) ? _arrayLikeKeys(object) : _baseKeys(object);
- }
-
- var keys_1 = keys;
-
- /**
- * The base implementation of `_.assign` without support for multiple sources
- * or `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
- function baseAssign(object, source) {
- return object && _copyObject(source, keys_1(source), object);
- }
-
- var _baseAssign = baseAssign;
-
- /**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
- function listCacheClear() {
- this.__data__ = [];
- this.size = 0;
- }
-
- var _listCacheClear = listCacheClear;
-
- /**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function assocIndexOf(array, key) {
- var length = array.length;
- while (length--) {
- if (eq_1(array[length][0], key)) {
- return length;
- }
- }
- return -1;
- }
-
- var _assocIndexOf = assocIndexOf;
-
- /** Used for built-in method references. */
- var arrayProto = Array.prototype;
-
- /** Built-in value references. */
- var splice = arrayProto.splice;
-
- /**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function listCacheDelete(key) {
- var data = this.__data__,
- index = _assocIndexOf(data, key);
-
- if (index < 0) {
- return false;
- }
- var lastIndex = data.length - 1;
- if (index == lastIndex) {
- data.pop();
- } else {
- splice.call(data, index, 1);
- }
- --this.size;
- return true;
- }
-
- var _listCacheDelete = listCacheDelete;
-
- /**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function listCacheGet(key) {
- var data = this.__data__,
- index = _assocIndexOf(data, key);
-
- return index < 0 ? undefined : data[index][1];
- }
-
- var _listCacheGet = listCacheGet;
-
- /**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function listCacheHas(key) {
- return _assocIndexOf(this.__data__, key) > -1;
- }
-
- var _listCacheHas = listCacheHas;
-
- /**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
- function listCacheSet(key, value) {
- var data = this.__data__,
- index = _assocIndexOf(data, key);
-
- if (index < 0) {
- ++this.size;
- data.push([key, value]);
- } else {
- data[index][1] = value;
- }
- return this;
- }
-
- var _listCacheSet = listCacheSet;
-
- /**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function ListCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
-
- // Add methods to `ListCache`.
- ListCache.prototype.clear = _listCacheClear;
- ListCache.prototype['delete'] = _listCacheDelete;
- ListCache.prototype.get = _listCacheGet;
- ListCache.prototype.has = _listCacheHas;
- ListCache.prototype.set = _listCacheSet;
-
- var _ListCache = ListCache;
-
- /**
- * Removes all key-value entries from the stack.
- *
- * @private
- * @name clear
- * @memberOf Stack
- */
- function stackClear() {
- this.__data__ = new _ListCache;
- this.size = 0;
- }
-
- var _stackClear = stackClear;
-
- /**
- * Removes `key` and its value from the stack.
- *
- * @private
- * @name delete
- * @memberOf Stack
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function stackDelete(key) {
- var data = this.__data__,
- result = data['delete'](key);
-
- this.size = data.size;
- return result;
- }
-
- var _stackDelete = stackDelete;
-
- /**
- * Gets the stack value for `key`.
- *
- * @private
- * @name get
- * @memberOf Stack
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function stackGet(key) {
- return this.__data__.get(key);
- }
-
- var _stackGet = stackGet;
-
- /**
- * Checks if a stack value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Stack
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function stackHas(key) {
- return this.__data__.has(key);
- }
-
- var _stackHas = stackHas;
-
- /* Built-in method references that are verified to be native. */
- var Map$1 = _getNative(_root, 'Map');
-
- var _Map = Map$1;
-
- /* Built-in method references that are verified to be native. */
- var nativeCreate = _getNative(Object, 'create');
-
- var _nativeCreate = nativeCreate;
-
- /**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
- function hashClear() {
- this.__data__ = _nativeCreate ? _nativeCreate(null) : {};
- this.size = 0;
- }
-
- var _hashClear = hashClear;
-
- /**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function hashDelete(key) {
- var result = this.has(key) && delete this.__data__[key];
- this.size -= result ? 1 : 0;
- return result;
- }
-
- var _hashDelete = hashDelete;
-
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
-
- /** Used for built-in method references. */
- var objectProto$7 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
-
- /**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function hashGet(key) {
- var data = this.__data__;
- if (_nativeCreate) {
- var result = data[key];
- return result === HASH_UNDEFINED$2 ? undefined : result;
- }
- return hasOwnProperty$6.call(data, key) ? data[key] : undefined;
- }
-
- var _hashGet = hashGet;
-
- /** Used for built-in method references. */
- var objectProto$6 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
-
- /**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function hashHas(key) {
- var data = this.__data__;
- return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$5.call(data, key);
- }
-
- var _hashHas = hashHas;
-
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
-
- /**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
- function hashSet(key, value) {
- var data = this.__data__;
- this.size += this.has(key) ? 0 : 1;
- data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
- return this;
- }
-
- var _hashSet = hashSet;
-
- /**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Hash(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
-
- // Add methods to `Hash`.
- Hash.prototype.clear = _hashClear;
- Hash.prototype['delete'] = _hashDelete;
- Hash.prototype.get = _hashGet;
- Hash.prototype.has = _hashHas;
- Hash.prototype.set = _hashSet;
-
- var _Hash = Hash;
-
- /**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
- function mapCacheClear() {
- this.size = 0;
- this.__data__ = {
- 'hash': new _Hash,
- 'map': new (_Map || _ListCache),
- 'string': new _Hash
- };
- }
-
- var _mapCacheClear = mapCacheClear;
-
- /**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
- function isKeyable(value) {
- var type = typeof value;
- return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
- ? (value !== '__proto__')
- : (value === null);
- }
-
- var _isKeyable = isKeyable;
-
- /**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
- function getMapData(map, key) {
- var data = map.__data__;
- return _isKeyable(key)
- ? data[typeof key == 'string' ? 'string' : 'hash']
- : data.map;
- }
-
- var _getMapData = getMapData;
-
- /**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
- function mapCacheDelete(key) {
- var result = _getMapData(this, key)['delete'](key);
- this.size -= result ? 1 : 0;
- return result;
- }
-
- var _mapCacheDelete = mapCacheDelete;
-
- /**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
- function mapCacheGet(key) {
- return _getMapData(this, key).get(key);
- }
-
- var _mapCacheGet = mapCacheGet;
-
- /**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function mapCacheHas(key) {
- return _getMapData(this, key).has(key);
- }
-
- var _mapCacheHas = mapCacheHas;
-
- /**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
- function mapCacheSet(key, value) {
- var data = _getMapData(this, key),
- size = data.size;
-
- data.set(key, value);
- this.size += data.size == size ? 0 : 1;
- return this;
- }
-
- var _mapCacheSet = mapCacheSet;
-
- /**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function MapCache(entries) {
- var index = -1,
- length = entries == null ? 0 : entries.length;
-
- this.clear();
- while (++index < length) {
- var entry = entries[index];
- this.set(entry[0], entry[1]);
- }
- }
-
- // Add methods to `MapCache`.
- MapCache.prototype.clear = _mapCacheClear;
- MapCache.prototype['delete'] = _mapCacheDelete;
- MapCache.prototype.get = _mapCacheGet;
- MapCache.prototype.has = _mapCacheHas;
- MapCache.prototype.set = _mapCacheSet;
-
- var _MapCache = MapCache;
-
- /** Used as the size to enable large array optimizations. */
- var LARGE_ARRAY_SIZE = 200;
-
- /**
- * Sets the stack `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Stack
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the stack cache instance.
- */
- function stackSet(key, value) {
- var data = this.__data__;
- if (data instanceof _ListCache) {
- var pairs = data.__data__;
- if (!_Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
- pairs.push([key, value]);
- this.size = ++data.size;
- return this;
- }
- data = this.__data__ = new _MapCache(pairs);
- }
- data.set(key, value);
- this.size = data.size;
- return this;
- }
-
- var _stackSet = stackSet;
-
- /**
- * Creates a stack cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
- function Stack(entries) {
- var data = this.__data__ = new _ListCache(entries);
- this.size = data.size;
- }
-
- // Add methods to `Stack`.
- Stack.prototype.clear = _stackClear;
- Stack.prototype['delete'] = _stackDelete;
- Stack.prototype.get = _stackGet;
- Stack.prototype.has = _stackHas;
- Stack.prototype.set = _stackSet;
-
- var _Stack = Stack;
-
- /**
- * This function is like
- * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
- * except that it includes inherited enumerable properties.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function nativeKeysIn(object) {
- var result = [];
- if (object != null) {
- for (var key in Object(object)) {
- result.push(key);
- }
- }
- return result;
- }
-
- var _nativeKeysIn = nativeKeysIn;
-
- /** Used for built-in method references. */
- var objectProto$5 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
-
- /**
- * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function baseKeysIn(object) {
- if (!isObject_1(object)) {
- return _nativeKeysIn(object);
- }
- var isProto = _isPrototype(object),
- result = [];
-
- for (var key in object) {
- if (!(key == 'constructor' && (isProto || !hasOwnProperty$4.call(object, key)))) {
- result.push(key);
- }
- }
- return result;
- }
-
- var _baseKeysIn = baseKeysIn;
-
- /**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
- function keysIn(object) {
- return isArrayLike_1(object) ? _arrayLikeKeys(object, true) : _baseKeysIn(object);
- }
-
- var keysIn_1 = keysIn;
-
- /**
- * The base implementation of `_.assignIn` without support for multiple sources
- * or `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
- function baseAssignIn(object, source) {
- return object && _copyObject(source, keysIn_1(source), object);
- }
-
- var _baseAssignIn = baseAssignIn;
-
- var _cloneBuffer = createCommonjsModule(function (module, exports) {
- /** Detect free variable `exports`. */
- var freeExports = exports && !exports.nodeType && exports;
-
- /** Detect free variable `module`. */
- var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;
-
- /** Detect the popular CommonJS extension `module.exports`. */
- var moduleExports = freeModule && freeModule.exports === freeExports;
-
- /** Built-in value references. */
- var Buffer = moduleExports ? _root.Buffer : undefined,
- allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;
-
- /**
- * Creates a clone of `buffer`.
- *
- * @private
- * @param {Buffer} buffer The buffer to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Buffer} Returns the cloned buffer.
- */
- function cloneBuffer(buffer, isDeep) {
- if (isDeep) {
- return buffer.slice();
- }
- var length = buffer.length,
- result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
-
- buffer.copy(result);
- return result;
- }
-
- module.exports = cloneBuffer;
- }, "/$$rollup_base$$/node_modules/lodash");
-
- /**
- * A specialized version of `_.filter` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
- */
- function arrayFilter(array, predicate) {
- var index = -1,
- length = array == null ? 0 : array.length,
- resIndex = 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (predicate(value, index, array)) {
- result[resIndex++] = value;
- }
- }
- return result;
- }
-
- var _arrayFilter = arrayFilter;
-
- /**
- * This method returns a new empty array.
- *
- * @static
- * @memberOf _
- * @since 4.13.0
- * @category Util
- * @returns {Array} Returns the new empty array.
- * @example
- *
- * var arrays = _.times(2, _.stubArray);
- *
- * console.log(arrays);
- * // => [[], []]
- *
- * console.log(arrays[0] === arrays[1]);
- * // => false
- */
- function stubArray() {
- return [];
- }
-
- var stubArray_1 = stubArray;
-
- /** Used for built-in method references. */
- var objectProto$4 = Object.prototype;
-
- /** Built-in value references. */
- var propertyIsEnumerable = objectProto$4.propertyIsEnumerable;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
-
- /**
- * Creates an array of the own enumerable symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
- */
- var getSymbols = !nativeGetSymbols$1 ? stubArray_1 : function(object) {
- if (object == null) {
- return [];
- }
- object = Object(object);
- return _arrayFilter(nativeGetSymbols$1(object), function(symbol) {
- return propertyIsEnumerable.call(object, symbol);
- });
- };
-
- var _getSymbols = getSymbols;
-
- /**
- * Copies own symbols of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy symbols from.
- * @param {Object} [object={}] The object to copy symbols to.
- * @returns {Object} Returns `object`.
- */
- function copySymbols(source, object) {
- return _copyObject(source, _getSymbols(source), object);
- }
-
- var _copySymbols = copySymbols;
-
- /**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
- function arrayPush(array, values) {
- var index = -1,
- length = values.length,
- offset = array.length;
-
- while (++index < length) {
- array[offset + index] = values[index];
- }
- return array;
- }
-
- var _arrayPush = arrayPush;
-
- /** Built-in value references. */
- var getPrototype = _overArg(Object.getPrototypeOf, Object);
-
- var _getPrototype = getPrototype;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeGetSymbols = Object.getOwnPropertySymbols;
-
- /**
- * Creates an array of the own and inherited enumerable symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of symbols.
- */
- var getSymbolsIn = !nativeGetSymbols ? stubArray_1 : function(object) {
- var result = [];
- while (object) {
- _arrayPush(result, _getSymbols(object));
- object = _getPrototype(object);
- }
- return result;
- };
-
- var _getSymbolsIn = getSymbolsIn;
-
- /**
- * Copies own and inherited symbols of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy symbols from.
- * @param {Object} [object={}] The object to copy symbols to.
- * @returns {Object} Returns `object`.
- */
- function copySymbolsIn(source, object) {
- return _copyObject(source, _getSymbolsIn(source), object);
- }
-
- var _copySymbolsIn = copySymbolsIn;
-
- /**
- * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
- * `keysFunc` and `symbolsFunc` to get the enumerable property names and
- * symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @param {Function} symbolsFunc The function to get the symbols of `object`.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function baseGetAllKeys(object, keysFunc, symbolsFunc) {
- var result = keysFunc(object);
- return isArray_1(object) ? result : _arrayPush(result, symbolsFunc(object));
- }
-
- var _baseGetAllKeys = baseGetAllKeys;
-
- /**
- * Creates an array of own enumerable property names and symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function getAllKeys(object) {
- return _baseGetAllKeys(object, keys_1, _getSymbols);
- }
-
- var _getAllKeys = getAllKeys;
-
- /**
- * Creates an array of own and inherited enumerable property names and
- * symbols of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names and symbols.
- */
- function getAllKeysIn(object) {
- return _baseGetAllKeys(object, keysIn_1, _getSymbolsIn);
- }
-
- var _getAllKeysIn = getAllKeysIn;
-
- /* Built-in method references that are verified to be native. */
- var DataView = _getNative(_root, 'DataView');
-
- var _DataView = DataView;
-
- /* Built-in method references that are verified to be native. */
- var Promise$1 = _getNative(_root, 'Promise');
-
- var _Promise = Promise$1;
-
- /* Built-in method references that are verified to be native. */
- var Set$1 = _getNative(_root, 'Set');
-
- var _Set = Set$1;
-
- /** `Object#toString` result references. */
- var mapTag$4 = '[object Map]',
- objectTag$3 = '[object Object]',
- promiseTag = '[object Promise]',
- setTag$4 = '[object Set]',
- weakMapTag$2 = '[object WeakMap]';
-
- var dataViewTag$3 = '[object DataView]';
-
- /** Used to detect maps, sets, and weakmaps. */
- var dataViewCtorString = _toSource(_DataView),
- mapCtorString = _toSource(_Map),
- promiseCtorString = _toSource(_Promise),
- setCtorString = _toSource(_Set),
- weakMapCtorString = _toSource(_WeakMap);
-
- /**
- * Gets the `toStringTag` of `value`.
- *
- * @private
- * @param {*} value The value to query.
- * @returns {string} Returns the `toStringTag`.
- */
- var getTag = _baseGetTag;
-
- // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
- if ((_DataView && getTag(new _DataView(new ArrayBuffer(1))) != dataViewTag$3) ||
- (_Map && getTag(new _Map) != mapTag$4) ||
- (_Promise && getTag(_Promise.resolve()) != promiseTag) ||
- (_Set && getTag(new _Set) != setTag$4) ||
- (_WeakMap && getTag(new _WeakMap) != weakMapTag$2)) {
- getTag = function(value) {
- var result = _baseGetTag(value),
- Ctor = result == objectTag$3 ? value.constructor : undefined,
- ctorString = Ctor ? _toSource(Ctor) : '';
-
- if (ctorString) {
- switch (ctorString) {
- case dataViewCtorString: return dataViewTag$3;
- case mapCtorString: return mapTag$4;
- case promiseCtorString: return promiseTag;
- case setCtorString: return setTag$4;
- case weakMapCtorString: return weakMapTag$2;
- }
- }
- return result;
- };
- }
-
- var _getTag = getTag;
-
- /** Used for built-in method references. */
- var objectProto$3 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$3 = objectProto$3.hasOwnProperty;
-
- /**
- * Initializes an array clone.
- *
- * @private
- * @param {Array} array The array to clone.
- * @returns {Array} Returns the initialized clone.
- */
- function initCloneArray(array) {
- var length = array.length,
- result = new array.constructor(length);
-
- // Add properties assigned by `RegExp#exec`.
- if (length && typeof array[0] == 'string' && hasOwnProperty$3.call(array, 'index')) {
- result.index = array.index;
- result.input = array.input;
- }
- return result;
- }
-
- var _initCloneArray = initCloneArray;
-
- /** Built-in value references. */
- var Uint8Array$1 = _root.Uint8Array;
-
- var _Uint8Array = Uint8Array$1;
-
- /**
- * Creates a clone of `arrayBuffer`.
- *
- * @private
- * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
- * @returns {ArrayBuffer} Returns the cloned array buffer.
- */
- function cloneArrayBuffer(arrayBuffer) {
- var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
- new _Uint8Array(result).set(new _Uint8Array(arrayBuffer));
- return result;
- }
-
- var _cloneArrayBuffer = cloneArrayBuffer;
-
- /**
- * Creates a clone of `dataView`.
- *
- * @private
- * @param {Object} dataView The data view to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned data view.
- */
- function cloneDataView(dataView, isDeep) {
- var buffer = isDeep ? _cloneArrayBuffer(dataView.buffer) : dataView.buffer;
- return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
- }
-
- var _cloneDataView = cloneDataView;
-
- /** Used to match `RegExp` flags from their coerced string values. */
- var reFlags = /\w*$/;
-
- /**
- * Creates a clone of `regexp`.
- *
- * @private
- * @param {Object} regexp The regexp to clone.
- * @returns {Object} Returns the cloned regexp.
- */
- function cloneRegExp(regexp) {
- var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
- result.lastIndex = regexp.lastIndex;
- return result;
- }
-
- var _cloneRegExp = cloneRegExp;
-
- /** Used to convert symbols to primitives and strings. */
- var symbolProto$2 = _Symbol ? _Symbol.prototype : undefined,
- symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;
-
- /**
- * Creates a clone of the `symbol` object.
- *
- * @private
- * @param {Object} symbol The symbol object to clone.
- * @returns {Object} Returns the cloned symbol object.
- */
- function cloneSymbol(symbol) {
- return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};
- }
-
- var _cloneSymbol = cloneSymbol;
-
- /**
- * Creates a clone of `typedArray`.
- *
- * @private
- * @param {Object} typedArray The typed array to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the cloned typed array.
- */
- function cloneTypedArray(typedArray, isDeep) {
- var buffer = isDeep ? _cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
- return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
- }
-
- var _cloneTypedArray = cloneTypedArray;
-
- /** `Object#toString` result references. */
- var boolTag$2 = '[object Boolean]',
- dateTag$2 = '[object Date]',
- mapTag$3 = '[object Map]',
- numberTag$2 = '[object Number]',
- regexpTag$2 = '[object RegExp]',
- setTag$3 = '[object Set]',
- stringTag$2 = '[object String]',
- symbolTag$2 = '[object Symbol]';
-
- var arrayBufferTag$2 = '[object ArrayBuffer]',
- dataViewTag$2 = '[object DataView]',
- float32Tag$1 = '[object Float32Array]',
- float64Tag$1 = '[object Float64Array]',
- int8Tag$1 = '[object Int8Array]',
- int16Tag$1 = '[object Int16Array]',
- int32Tag$1 = '[object Int32Array]',
- uint8Tag$1 = '[object Uint8Array]',
- uint8ClampedTag$1 = '[object Uint8ClampedArray]',
- uint16Tag$1 = '[object Uint16Array]',
- uint32Tag$1 = '[object Uint32Array]';
-
- /**
- * Initializes an object clone based on its `toStringTag`.
- *
- * **Note:** This function only supports cloning values with tags of
- * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
- *
- * @private
- * @param {Object} object The object to clone.
- * @param {string} tag The `toStringTag` of the object to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the initialized clone.
- */
- function initCloneByTag(object, tag, isDeep) {
- var Ctor = object.constructor;
- switch (tag) {
- case arrayBufferTag$2:
- return _cloneArrayBuffer(object);
-
- case boolTag$2:
- case dateTag$2:
- return new Ctor(+object);
-
- case dataViewTag$2:
- return _cloneDataView(object, isDeep);
-
- case float32Tag$1: case float64Tag$1:
- case int8Tag$1: case int16Tag$1: case int32Tag$1:
- case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
- return _cloneTypedArray(object, isDeep);
-
- case mapTag$3:
- return new Ctor;
-
- case numberTag$2:
- case stringTag$2:
- return new Ctor(object);
-
- case regexpTag$2:
- return _cloneRegExp(object);
-
- case setTag$3:
- return new Ctor;
-
- case symbolTag$2:
- return _cloneSymbol(object);
- }
- }
-
- var _initCloneByTag = initCloneByTag;
-
- /**
- * Initializes an object clone.
- *
- * @private
- * @param {Object} object The object to clone.
- * @returns {Object} Returns the initialized clone.
- */
- function initCloneObject(object) {
- return (typeof object.constructor == 'function' && !_isPrototype(object))
- ? _baseCreate(_getPrototype(object))
- : {};
- }
-
- var _initCloneObject = initCloneObject;
-
- /** `Object#toString` result references. */
- var mapTag$2 = '[object Map]';
-
- /**
- * The base implementation of `_.isMap` without Node.js optimizations.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a map, else `false`.
- */
- function baseIsMap(value) {
- return isObjectLike_1(value) && _getTag(value) == mapTag$2;
- }
-
- var _baseIsMap = baseIsMap;
-
- /* Node.js helper references. */
- var nodeIsMap = _nodeUtil && _nodeUtil.isMap;
-
- /**
- * Checks if `value` is classified as a `Map` object.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a map, else `false`.
- * @example
- *
- * _.isMap(new Map);
- * // => true
- *
- * _.isMap(new WeakMap);
- * // => false
- */
- var isMap = nodeIsMap ? _baseUnary(nodeIsMap) : _baseIsMap;
-
- var isMap_1 = isMap;
-
- /** `Object#toString` result references. */
- var setTag$2 = '[object Set]';
-
- /**
- * The base implementation of `_.isSet` without Node.js optimizations.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a set, else `false`.
- */
- function baseIsSet(value) {
- return isObjectLike_1(value) && _getTag(value) == setTag$2;
- }
-
- var _baseIsSet = baseIsSet;
-
- /* Node.js helper references. */
- var nodeIsSet = _nodeUtil && _nodeUtil.isSet;
-
- /**
- * Checks if `value` is classified as a `Set` object.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a set, else `false`.
- * @example
- *
- * _.isSet(new Set);
- * // => true
- *
- * _.isSet(new WeakSet);
- * // => false
- */
- var isSet = nodeIsSet ? _baseUnary(nodeIsSet) : _baseIsSet;
-
- var isSet_1 = isSet;
-
- /** Used to compose bitmasks for cloning. */
- var CLONE_DEEP_FLAG$1 = 1,
- CLONE_FLAT_FLAG = 2,
- CLONE_SYMBOLS_FLAG$1 = 4;
-
- /** `Object#toString` result references. */
- var argsTag$1 = '[object Arguments]',
- arrayTag$1 = '[object Array]',
- boolTag$1 = '[object Boolean]',
- dateTag$1 = '[object Date]',
- errorTag$2 = '[object Error]',
- funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]',
- mapTag$1 = '[object Map]',
- numberTag$1 = '[object Number]',
- objectTag$2 = '[object Object]',
- regexpTag$1 = '[object RegExp]',
- setTag$1 = '[object Set]',
- stringTag$1 = '[object String]',
- symbolTag$1 = '[object Symbol]',
- weakMapTag$1 = '[object WeakMap]';
-
- var arrayBufferTag$1 = '[object ArrayBuffer]',
- dataViewTag$1 = '[object DataView]',
- float32Tag = '[object Float32Array]',
- float64Tag = '[object Float64Array]',
- int8Tag = '[object Int8Array]',
- int16Tag = '[object Int16Array]',
- int32Tag = '[object Int32Array]',
- uint8Tag = '[object Uint8Array]',
- uint8ClampedTag = '[object Uint8ClampedArray]',
- uint16Tag = '[object Uint16Array]',
- uint32Tag = '[object Uint32Array]';
-
- /** Used to identify `toStringTag` values supported by `_.clone`. */
- var cloneableTags = {};
- cloneableTags[argsTag$1] = cloneableTags[arrayTag$1] =
- cloneableTags[arrayBufferTag$1] = cloneableTags[dataViewTag$1] =
- cloneableTags[boolTag$1] = cloneableTags[dateTag$1] =
- cloneableTags[float32Tag] = cloneableTags[float64Tag] =
- cloneableTags[int8Tag] = cloneableTags[int16Tag] =
- cloneableTags[int32Tag] = cloneableTags[mapTag$1] =
- cloneableTags[numberTag$1] = cloneableTags[objectTag$2] =
- cloneableTags[regexpTag$1] = cloneableTags[setTag$1] =
- cloneableTags[stringTag$1] = cloneableTags[symbolTag$1] =
- cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
- cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
- cloneableTags[errorTag$2] = cloneableTags[funcTag] =
- cloneableTags[weakMapTag$1] = false;
-
- /**
- * The base implementation of `_.clone` and `_.cloneDeep` which tracks
- * traversed objects.
- *
- * @private
- * @param {*} value The value to clone.
- * @param {boolean} bitmask The bitmask flags.
- * 1 - Deep clone
- * 2 - Flatten inherited properties
- * 4 - Clone symbols
- * @param {Function} [customizer] The function to customize cloning.
- * @param {string} [key] The key of `value`.
- * @param {Object} [object] The parent object of `value`.
- * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
- * @returns {*} Returns the cloned value.
- */
- function baseClone(value, bitmask, customizer, key, object, stack) {
- var result,
- isDeep = bitmask & CLONE_DEEP_FLAG$1,
- isFlat = bitmask & CLONE_FLAT_FLAG,
- isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
-
- if (customizer) {
- result = object ? customizer(value, key, object, stack) : customizer(value);
- }
- if (result !== undefined) {
- return result;
- }
- if (!isObject_1(value)) {
- return value;
- }
- var isArr = isArray_1(value);
- if (isArr) {
- result = _initCloneArray(value);
- if (!isDeep) {
- return _copyArray(value, result);
- }
- } else {
- var tag = _getTag(value),
- isFunc = tag == funcTag || tag == genTag;
-
- if (isBuffer_1(value)) {
- return _cloneBuffer(value, isDeep);
- }
- if (tag == objectTag$2 || tag == argsTag$1 || (isFunc && !object)) {
- result = (isFlat || isFunc) ? {} : _initCloneObject(value);
- if (!isDeep) {
- return isFlat
- ? _copySymbolsIn(value, _baseAssignIn(result, value))
- : _copySymbols(value, _baseAssign(result, value));
- }
- } else {
- if (!cloneableTags[tag]) {
- return object ? value : {};
- }
- result = _initCloneByTag(value, tag, isDeep);
- }
- }
- // Check for circular references and return its corresponding clone.
- stack || (stack = new _Stack);
- var stacked = stack.get(value);
- if (stacked) {
- return stacked;
- }
- stack.set(value, result);
-
- if (isSet_1(value)) {
- value.forEach(function(subValue) {
- result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
- });
- } else if (isMap_1(value)) {
- value.forEach(function(subValue, key) {
- result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
- });
- }
-
- var keysFunc = isFull
- ? (isFlat ? _getAllKeysIn : _getAllKeys)
- : (isFlat ? keysIn_1 : keys_1);
-
- var props = isArr ? undefined : keysFunc(value);
- _arrayEach(props || value, function(subValue, key) {
- if (props) {
- key = subValue;
- subValue = value[key];
- }
- // Recursively populate clone (susceptible to call stack limits).
- _assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
- });
- return result;
- }
-
- var _baseClone = baseClone;
-
- /** Used to compose bitmasks for cloning. */
- var CLONE_SYMBOLS_FLAG = 4;
-
- /**
- * Creates a shallow clone of `value`.
- *
- * **Note:** This method is loosely based on the
- * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
- * and supports cloning arrays, array buffers, booleans, date objects, maps,
- * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
- * arrays. The own enumerable properties of `arguments` objects are cloned
- * as plain objects. An empty object is returned for uncloneable values such
- * as error objects, functions, DOM nodes, and WeakMaps.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to clone.
- * @returns {*} Returns the cloned value.
- * @see _.cloneDeep
- * @example
- *
- * var objects = [{ 'a': 1 }, { 'b': 2 }];
- *
- * var shallow = _.clone(objects);
- * console.log(shallow[0] === objects[0]);
- * // => true
- */
- function clone(value) {
- return _baseClone(value, CLONE_SYMBOLS_FLAG);
- }
-
- var clone_1 = clone;
-
- /** `Object#toString` result references. */
- var objectTag$1 = '[object Object]';
-
- /** Used for built-in method references. */
- var funcProto = Function.prototype,
- objectProto$2 = Object.prototype;
-
- /** Used to resolve the decompiled source of functions. */
- var funcToString = funcProto.toString;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
-
- /** Used to infer the `Object` constructor. */
- var objectCtorString = funcToString.call(Object);
-
- /**
- * Checks if `value` is a plain object, that is, an object created by the
- * `Object` constructor or one with a `[[Prototype]]` of `null`.
- *
- * @static
- * @memberOf _
- * @since 0.8.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * }
- *
- * _.isPlainObject(new Foo);
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'x': 0, 'y': 0 });
- * // => true
- *
- * _.isPlainObject(Object.create(null));
- * // => true
- */
- function isPlainObject(value) {
- if (!isObjectLike_1(value) || _baseGetTag(value) != objectTag$1) {
- return false;
- }
- var proto = _getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty$2.call(proto, 'constructor') && proto.constructor;
- return typeof Ctor == 'function' && Ctor instanceof Ctor &&
- funcToString.call(Ctor) == objectCtorString;
- }
-
- var isPlainObject_1 = isPlainObject;
-
- /** `Object#toString` result references. */
- var domExcTag = '[object DOMException]',
- errorTag$1 = '[object Error]';
-
- /**
- * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
- * `SyntaxError`, `TypeError`, or `URIError` object.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
- * @example
- *
- * _.isError(new Error);
- * // => true
- *
- * _.isError(Error);
- * // => false
- */
- function isError(value) {
- if (!isObjectLike_1(value)) {
- return false;
- }
- var tag = _baseGetTag(value);
- return tag == errorTag$1 || tag == domExcTag ||
- (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject_1(value));
- }
-
- var isError_1 = isError;
-
- /** `Object#toString` result references. */
- var weakMapTag = '[object WeakMap]';
-
- /**
- * Checks if `value` is classified as a `WeakMap` object.
- *
- * @static
- * @memberOf _
- * @since 4.3.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
- * @example
- *
- * _.isWeakMap(new WeakMap);
- * // => true
- *
- * _.isWeakMap(new Map);
- * // => false
- */
- function isWeakMap(value) {
- return isObjectLike_1(value) && _getTag(value) == weakMapTag;
- }
-
- var isWeakMap_1 = isWeakMap;
-
- /** Used to stand-in for `undefined` hash values. */
- var HASH_UNDEFINED = '__lodash_hash_undefined__';
-
- /**
- * Adds `value` to the array cache.
- *
- * @private
- * @name add
- * @memberOf SetCache
- * @alias push
- * @param {*} value The value to cache.
- * @returns {Object} Returns the cache instance.
- */
- function setCacheAdd(value) {
- this.__data__.set(value, HASH_UNDEFINED);
- return this;
- }
-
- var _setCacheAdd = setCacheAdd;
-
- /**
- * Checks if `value` is in the array cache.
- *
- * @private
- * @name has
- * @memberOf SetCache
- * @param {*} value The value to search for.
- * @returns {number} Returns `true` if `value` is found, else `false`.
- */
- function setCacheHas(value) {
- return this.__data__.has(value);
- }
-
- var _setCacheHas = setCacheHas;
-
- /**
- *
- * Creates an array cache object to store unique values.
- *
- * @private
- * @constructor
- * @param {Array} [values] The values to cache.
- */
- function SetCache(values) {
- var index = -1,
- length = values == null ? 0 : values.length;
-
- this.__data__ = new _MapCache;
- while (++index < length) {
- this.add(values[index]);
- }
- }
-
- // Add methods to `SetCache`.
- SetCache.prototype.add = SetCache.prototype.push = _setCacheAdd;
- SetCache.prototype.has = _setCacheHas;
-
- var _SetCache = SetCache;
-
- /**
- * A specialized version of `_.some` for arrays without support for iteratee
- * shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- * else `false`.
- */
- function arraySome(array, predicate) {
- var index = -1,
- length = array == null ? 0 : array.length;
-
- while (++index < length) {
- if (predicate(array[index], index, array)) {
- return true;
- }
- }
- return false;
- }
-
- var _arraySome = arraySome;
-
- /**
- * Checks if a `cache` value for `key` exists.
- *
- * @private
- * @param {Object} cache The cache to query.
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
- function cacheHas(cache, key) {
- return cache.has(key);
- }
-
- var _cacheHas = cacheHas;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG$5 = 1,
- COMPARE_UNORDERED_FLAG$3 = 2;
-
- /**
- * A specialized version of `baseIsEqualDeep` for arrays with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Array} array The array to compare.
- * @param {Array} other The other array to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `array` and `other` objects.
- * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
- */
- function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5,
- arrLength = array.length,
- othLength = other.length;
-
- if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
- return false;
- }
- // Check that cyclic values are equal.
- var arrStacked = stack.get(array);
- var othStacked = stack.get(other);
- if (arrStacked && othStacked) {
- return arrStacked == other && othStacked == array;
- }
- var index = -1,
- result = true,
- seen = (bitmask & COMPARE_UNORDERED_FLAG$3) ? new _SetCache : undefined;
-
- stack.set(array, other);
- stack.set(other, array);
-
- // Ignore non-index properties.
- while (++index < arrLength) {
- var arrValue = array[index],
- othValue = other[index];
-
- if (customizer) {
- var compared = isPartial
- ? customizer(othValue, arrValue, index, other, array, stack)
- : customizer(arrValue, othValue, index, array, other, stack);
- }
- if (compared !== undefined) {
- if (compared) {
- continue;
- }
- result = false;
- break;
- }
- // Recursively compare arrays (susceptible to call stack limits).
- if (seen) {
- if (!_arraySome(other, function(othValue, othIndex) {
- if (!_cacheHas(seen, othIndex) &&
- (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
- return seen.push(othIndex);
- }
- })) {
- result = false;
- break;
- }
- } else if (!(
- arrValue === othValue ||
- equalFunc(arrValue, othValue, bitmask, customizer, stack)
- )) {
- result = false;
- break;
- }
- }
- stack['delete'](array);
- stack['delete'](other);
- return result;
- }
-
- var _equalArrays = equalArrays;
-
- /**
- * Converts `map` to its key-value pairs.
- *
- * @private
- * @param {Object} map The map to convert.
- * @returns {Array} Returns the key-value pairs.
- */
- function mapToArray(map) {
- var index = -1,
- result = Array(map.size);
-
- map.forEach(function(value, key) {
- result[++index] = [key, value];
- });
- return result;
- }
-
- var _mapToArray = mapToArray;
-
- /**
- * Converts `set` to an array of its values.
- *
- * @private
- * @param {Object} set The set to convert.
- * @returns {Array} Returns the values.
- */
- function setToArray(set) {
- var index = -1,
- result = Array(set.size);
-
- set.forEach(function(value) {
- result[++index] = value;
- });
- return result;
- }
-
- var _setToArray = setToArray;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG$4 = 1,
- COMPARE_UNORDERED_FLAG$2 = 2;
-
- /** `Object#toString` result references. */
- var boolTag = '[object Boolean]',
- dateTag = '[object Date]',
- errorTag = '[object Error]',
- mapTag = '[object Map]',
- numberTag = '[object Number]',
- regexpTag = '[object RegExp]',
- setTag = '[object Set]',
- stringTag = '[object String]',
- symbolTag = '[object Symbol]';
-
- var arrayBufferTag = '[object ArrayBuffer]',
- dataViewTag = '[object DataView]';
-
- /** Used to convert symbols to primitives and strings. */
- var symbolProto$1 = _Symbol ? _Symbol.prototype : undefined,
- symbolValueOf = symbolProto$1 ? symbolProto$1.valueOf : undefined;
-
- /**
- * A specialized version of `baseIsEqualDeep` for comparing objects of
- * the same `toStringTag`.
- *
- * **Note:** This function only supports comparing values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {string} tag The `toStringTag` of the objects to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
- switch (tag) {
- case dataViewTag:
- if ((object.byteLength != other.byteLength) ||
- (object.byteOffset != other.byteOffset)) {
- return false;
- }
- object = object.buffer;
- other = other.buffer;
-
- case arrayBufferTag:
- if ((object.byteLength != other.byteLength) ||
- !equalFunc(new _Uint8Array(object), new _Uint8Array(other))) {
- return false;
- }
- return true;
-
- case boolTag:
- case dateTag:
- case numberTag:
- // Coerce booleans to `1` or `0` and dates to milliseconds.
- // Invalid dates are coerced to `NaN`.
- return eq_1(+object, +other);
-
- case errorTag:
- return object.name == other.name && object.message == other.message;
-
- case regexpTag:
- case stringTag:
- // Coerce regexes to strings and treat strings, primitives and objects,
- // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
- // for more details.
- return object == (other + '');
-
- case mapTag:
- var convert = _mapToArray;
-
- case setTag:
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4;
- convert || (convert = _setToArray);
-
- if (object.size != other.size && !isPartial) {
- return false;
- }
- // Assume cyclic values are equal.
- var stacked = stack.get(object);
- if (stacked) {
- return stacked == other;
- }
- bitmask |= COMPARE_UNORDERED_FLAG$2;
-
- // Recursively compare objects (susceptible to call stack limits).
- stack.set(object, other);
- var result = _equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
- stack['delete'](object);
- return result;
-
- case symbolTag:
- if (symbolValueOf) {
- return symbolValueOf.call(object) == symbolValueOf.call(other);
- }
- }
- return false;
- }
-
- var _equalByTag = equalByTag;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG$3 = 1;
-
- /** Used for built-in method references. */
- var objectProto$1 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
-
- /**
- * A specialized version of `baseIsEqualDeep` for objects with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} stack Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
- var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3,
- objProps = _getAllKeys(object),
- objLength = objProps.length,
- othProps = _getAllKeys(other),
- othLength = othProps.length;
-
- if (objLength != othLength && !isPartial) {
- return false;
- }
- var index = objLength;
- while (index--) {
- var key = objProps[index];
- if (!(isPartial ? key in other : hasOwnProperty$1.call(other, key))) {
- return false;
- }
- }
- // Check that cyclic values are equal.
- var objStacked = stack.get(object);
- var othStacked = stack.get(other);
- if (objStacked && othStacked) {
- return objStacked == other && othStacked == object;
- }
- var result = true;
- stack.set(object, other);
- stack.set(other, object);
-
- var skipCtor = isPartial;
- while (++index < objLength) {
- key = objProps[index];
- var objValue = object[key],
- othValue = other[key];
-
- if (customizer) {
- var compared = isPartial
- ? customizer(othValue, objValue, key, other, object, stack)
- : customizer(objValue, othValue, key, object, other, stack);
- }
- // Recursively compare objects (susceptible to call stack limits).
- if (!(compared === undefined
- ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
- : compared
- )) {
- result = false;
- break;
- }
- skipCtor || (skipCtor = key == 'constructor');
- }
- if (result && !skipCtor) {
- var objCtor = object.constructor,
- othCtor = other.constructor;
-
- // Non `Object` object instances with different constructors are not equal.
- if (objCtor != othCtor &&
- ('constructor' in object && 'constructor' in other) &&
- !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
- typeof othCtor == 'function' && othCtor instanceof othCtor)) {
- result = false;
- }
- }
- stack['delete'](object);
- stack['delete'](other);
- return result;
- }
-
- var _equalObjects = equalObjects;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG$2 = 1;
-
- /** `Object#toString` result references. */
- var argsTag = '[object Arguments]',
- arrayTag = '[object Array]',
- objectTag = '[object Object]';
-
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
-
- /**
- * A specialized version of `baseIsEqual` for arrays and objects which performs
- * deep comparisons and tracks traversed objects enabling objects with circular
- * references to be compared.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
- * @param {Function} customizer The function to customize comparisons.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Object} [stack] Tracks traversed `object` and `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
- function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
- var objIsArr = isArray_1(object),
- othIsArr = isArray_1(other),
- objTag = objIsArr ? arrayTag : _getTag(object),
- othTag = othIsArr ? arrayTag : _getTag(other);
-
- objTag = objTag == argsTag ? objectTag : objTag;
- othTag = othTag == argsTag ? objectTag : othTag;
-
- var objIsObj = objTag == objectTag,
- othIsObj = othTag == objectTag,
- isSameTag = objTag == othTag;
-
- if (isSameTag && isBuffer_1(object)) {
- if (!isBuffer_1(other)) {
- return false;
- }
- objIsArr = true;
- objIsObj = false;
- }
- if (isSameTag && !objIsObj) {
- stack || (stack = new _Stack);
- return (objIsArr || isTypedArray_1(object))
- ? _equalArrays(object, other, bitmask, customizer, equalFunc, stack)
- : _equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
- }
- if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) {
- var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
- othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
-
- if (objIsWrapped || othIsWrapped) {
- var objUnwrapped = objIsWrapped ? object.value() : object,
- othUnwrapped = othIsWrapped ? other.value() : other;
-
- stack || (stack = new _Stack);
- return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
- }
- }
- if (!isSameTag) {
- return false;
- }
- stack || (stack = new _Stack);
- return _equalObjects(object, other, bitmask, customizer, equalFunc, stack);
- }
-
- var _baseIsEqualDeep = baseIsEqualDeep;
-
- /**
- * The base implementation of `_.isEqual` which supports partial comparisons
- * and tracks traversed objects.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {boolean} bitmask The bitmask flags.
- * 1 - Unordered comparison
- * 2 - Partial comparison
- * @param {Function} [customizer] The function to customize comparisons.
- * @param {Object} [stack] Tracks traversed `value` and `other` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
- function baseIsEqual(value, other, bitmask, customizer, stack) {
- if (value === other) {
- return true;
- }
- if (value == null || other == null || (!isObjectLike_1(value) && !isObjectLike_1(other))) {
- return value !== value && other !== other;
- }
- return _baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
- }
-
- var _baseIsEqual = baseIsEqual;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG$1 = 1,
- COMPARE_UNORDERED_FLAG$1 = 2;
-
- /**
- * The base implementation of `_.isMatch` without support for iteratee shorthands.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @param {Object} source The object of property values to match.
- * @param {Array} matchData The property names, values, and compare flags to match.
- * @param {Function} [customizer] The function to customize comparisons.
- * @returns {boolean} Returns `true` if `object` is a match, else `false`.
- */
- function baseIsMatch(object, source, matchData, customizer) {
- var index = matchData.length,
- length = index,
- noCustomizer = !customizer;
-
- if (object == null) {
- return !length;
- }
- object = Object(object);
- while (index--) {
- var data = matchData[index];
- if ((noCustomizer && data[2])
- ? data[1] !== object[data[0]]
- : !(data[0] in object)
- ) {
- return false;
- }
- }
- while (++index < length) {
- data = matchData[index];
- var key = data[0],
- objValue = object[key],
- srcValue = data[1];
-
- if (noCustomizer && data[2]) {
- if (objValue === undefined && !(key in object)) {
- return false;
- }
- } else {
- var stack = new _Stack;
- if (customizer) {
- var result = customizer(objValue, srcValue, key, object, source, stack);
- }
- if (!(result === undefined
- ? _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack)
- : result
- )) {
- return false;
- }
- }
- }
- return true;
- }
-
- var _baseIsMatch = baseIsMatch;
-
- /**
- * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` if suitable for strict
- * equality comparisons, else `false`.
- */
- function isStrictComparable(value) {
- return value === value && !isObject_1(value);
- }
-
- var _isStrictComparable = isStrictComparable;
-
- /**
- * Gets the property names, values, and compare flags of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the match data of `object`.
- */
- function getMatchData(object) {
- var result = keys_1(object),
- length = result.length;
-
- while (length--) {
- var key = result[length],
- value = object[key];
-
- result[length] = [key, value, _isStrictComparable(value)];
- }
- return result;
- }
-
- var _getMatchData = getMatchData;
-
- /**
- * A specialized version of `matchesProperty` for source values suitable
- * for strict equality comparisons, i.e. `===`.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @param {*} srcValue The value to match.
- * @returns {Function} Returns the new spec function.
- */
- function matchesStrictComparable(key, srcValue) {
- return function(object) {
- if (object == null) {
- return false;
- }
- return object[key] === srcValue &&
- (srcValue !== undefined || (key in Object(object)));
- };
- }
-
- var _matchesStrictComparable = matchesStrictComparable;
-
- /**
- * The base implementation of `_.matches` which doesn't clone `source`.
- *
- * @private
- * @param {Object} source The object of property values to match.
- * @returns {Function} Returns the new spec function.
- */
- function baseMatches(source) {
- var matchData = _getMatchData(source);
- if (matchData.length == 1 && matchData[0][2]) {
- return _matchesStrictComparable(matchData[0][0], matchData[0][1]);
- }
- return function(object) {
- return object === source || _baseIsMatch(object, source, matchData);
- };
- }
-
- var _baseMatches = baseMatches;
-
- /** Used to match property names within property paths. */
- var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
- reIsPlainProp = /^\w*$/;
-
- /**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
- function isKey(value, object) {
- if (isArray_1(value)) {
- return false;
- }
- var type = typeof value;
- if (type == 'number' || type == 'symbol' || type == 'boolean' ||
- value == null || isSymbol_1(value)) {
- return true;
- }
- return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
- (object != null && value in Object(object));
- }
-
- var _isKey = isKey;
-
- /** Error message constants. */
- var FUNC_ERROR_TEXT = 'Expected a function';
-
- /**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided, it determines the cache key for storing the result based on the
- * arguments provided to the memoized function. By default, the first argument
- * provided to the memoized function is used as the map cache key. The `func`
- * is invoked with the `this` binding of the memoized function.
- *
- * **Note:** The cache is exposed as the `cache` property on the memoized
- * function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the
- * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
- * method interface of `clear`, `delete`, `get`, `has`, and `set`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] The function to resolve the cache key.
- * @returns {Function} Returns the new memoized function.
- * @example
- *
- * var object = { 'a': 1, 'b': 2 };
- * var other = { 'c': 3, 'd': 4 };
- *
- * var values = _.memoize(_.values);
- * values(object);
- * // => [1, 2]
- *
- * values(other);
- * // => [3, 4]
- *
- * object.a = 2;
- * values(object);
- * // => [1, 2]
- *
- * // Modify the result cache.
- * values.cache.set(object, ['a', 'b']);
- * values(object);
- * // => ['a', 'b']
- *
- * // Replace `_.memoize.Cache`.
- * _.memoize.Cache = WeakMap;
- */
- function memoize(func, resolver) {
- if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- var memoized = function() {
- var args = arguments,
- key = resolver ? resolver.apply(this, args) : args[0],
- cache = memoized.cache;
-
- if (cache.has(key)) {
- return cache.get(key);
- }
- var result = func.apply(this, args);
- memoized.cache = cache.set(key, result) || cache;
- return result;
- };
- memoized.cache = new (memoize.Cache || _MapCache);
- return memoized;
- }
-
- // Expose `MapCache`.
- memoize.Cache = _MapCache;
-
- var memoize_1 = memoize;
-
- /** Used as the maximum memoize cache size. */
- var MAX_MEMOIZE_SIZE = 500;
-
- /**
- * A specialized version of `_.memoize` which clears the memoized function's
- * cache when it exceeds `MAX_MEMOIZE_SIZE`.
- *
- * @private
- * @param {Function} func The function to have its output memoized.
- * @returns {Function} Returns the new memoized function.
- */
- function memoizeCapped(func) {
- var result = memoize_1(func, function(key) {
- if (cache.size === MAX_MEMOIZE_SIZE) {
- cache.clear();
- }
- return key;
- });
-
- var cache = result.cache;
- return result;
- }
-
- var _memoizeCapped = memoizeCapped;
-
- /** Used to match property names within property paths. */
- var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
-
- /** Used to match backslashes in property paths. */
- var reEscapeChar = /\\(\\)?/g;
-
- /**
- * Converts `string` to a property path array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the property path array.
- */
- var stringToPath = _memoizeCapped(function(string) {
- var result = [];
- if (string.charCodeAt(0) === 46 /* . */) {
- result.push('');
- }
- string.replace(rePropName, function(match, number, quote, subString) {
- result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
- });
- return result;
- });
-
- var _stringToPath = stringToPath;
-
- /**
- * A specialized version of `_.map` for arrays without support for iteratee
- * shorthands.
- *
- * @private
- * @param {Array} [array] The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
- function arrayMap(array, iteratee) {
- var index = -1,
- length = array == null ? 0 : array.length,
- result = Array(length);
-
- while (++index < length) {
- result[index] = iteratee(array[index], index, array);
- }
- return result;
- }
-
- var _arrayMap = arrayMap;
-
- /** Used as references for various `Number` constants. */
- var INFINITY$1 = 1 / 0;
-
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = _Symbol ? _Symbol.prototype : undefined,
- symbolToString = symbolProto ? symbolProto.toString : undefined;
-
- /**
- * The base implementation of `_.toString` which doesn't convert nullish
- * values to empty strings.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
- function baseToString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
- }
- if (isArray_1(value)) {
- // Recursively convert values (susceptible to call stack limits).
- return _arrayMap(value, baseToString) + '';
- }
- if (isSymbol_1(value)) {
- return symbolToString ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
- }
-
- var _baseToString = baseToString;
-
- /**
- * Converts `value` to a string. An empty string is returned for `null`
- * and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {string} Returns the converted string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- return value == null ? '' : _baseToString(value);
- }
-
- var toString_1 = toString;
-
- /**
- * Casts `value` to a path array if it's not one.
- *
- * @private
- * @param {*} value The value to inspect.
- * @param {Object} [object] The object to query keys on.
- * @returns {Array} Returns the cast property path array.
- */
- function castPath(value, object) {
- if (isArray_1(value)) {
- return value;
- }
- return _isKey(value, object) ? [value] : _stringToPath(toString_1(value));
- }
-
- var _castPath = castPath;
-
- /** Used as references for various `Number` constants. */
- var INFINITY = 1 / 0;
-
- /**
- * Converts `value` to a string key if it's not a string or symbol.
- *
- * @private
- * @param {*} value The value to inspect.
- * @returns {string|symbol} Returns the key.
- */
- function toKey(value) {
- if (typeof value == 'string' || isSymbol_1(value)) {
- return value;
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
- }
-
- var _toKey = toKey;
-
- /**
- * The base implementation of `_.get` without support for default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @returns {*} Returns the resolved value.
- */
- function baseGet(object, path) {
- path = _castPath(path, object);
-
- var index = 0,
- length = path.length;
-
- while (object != null && index < length) {
- object = object[_toKey(path[index++])];
- }
- return (index && index == length) ? object : undefined;
- }
-
- var _baseGet = baseGet;
-
- /**
- * Gets the value at `path` of `object`. If the resolved value is
- * `undefined`, the `defaultValue` is returned in its place.
- *
- * @static
- * @memberOf _
- * @since 3.7.0
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @param {*} [defaultValue] The value returned for `undefined` resolved values.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.get(object, 'a[0].b.c');
- * // => 3
- *
- * _.get(object, ['a', '0', 'b', 'c']);
- * // => 3
- *
- * _.get(object, 'a.b.c', 'default');
- * // => 'default'
- */
- function get$1(object, path, defaultValue) {
- var result = object == null ? undefined : _baseGet(object, path);
- return result === undefined ? defaultValue : result;
- }
-
- var get_1 = get$1;
-
- /**
- * The base implementation of `_.hasIn` without support for deep paths.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {Array|string} key The key to check.
- * @returns {boolean} Returns `true` if `key` exists, else `false`.
- */
- function baseHasIn(object, key) {
- return object != null && key in Object(object);
- }
-
- var _baseHasIn = baseHasIn;
-
- /**
- * Checks if `path` exists on `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @param {Function} hasFunc The function to check properties.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- */
- function hasPath(object, path, hasFunc) {
- path = _castPath(path, object);
-
- var index = -1,
- length = path.length,
- result = false;
-
- while (++index < length) {
- var key = _toKey(path[index]);
- if (!(result = object != null && hasFunc(object, key))) {
- break;
- }
- object = object[key];
- }
- if (result || ++index != length) {
- return result;
- }
- length = object == null ? 0 : object.length;
- return !!length && isLength_1(length) && _isIndex(key, length) &&
- (isArray_1(object) || isArguments_1(object));
- }
-
- var _hasPath = hasPath;
-
- /**
- * Checks if `path` is a direct or inherited property of `object`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- * @example
- *
- * var object = _.create({ 'a': _.create({ 'b': 2 }) });
- *
- * _.hasIn(object, 'a');
- * // => true
- *
- * _.hasIn(object, 'a.b');
- * // => true
- *
- * _.hasIn(object, ['a', 'b']);
- * // => true
- *
- * _.hasIn(object, 'b');
- * // => false
- */
- function hasIn(object, path) {
- return object != null && _hasPath(object, path, _baseHasIn);
- }
-
- var hasIn_1 = hasIn;
-
- /** Used to compose bitmasks for value comparisons. */
- var COMPARE_PARTIAL_FLAG = 1,
- COMPARE_UNORDERED_FLAG = 2;
-
- /**
- * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
- *
- * @private
- * @param {string} path The path of the property to get.
- * @param {*} srcValue The value to match.
- * @returns {Function} Returns the new spec function.
- */
- function baseMatchesProperty(path, srcValue) {
- if (_isKey(path) && _isStrictComparable(srcValue)) {
- return _matchesStrictComparable(_toKey(path), srcValue);
- }
- return function(object) {
- var objValue = get_1(object, path);
- return (objValue === undefined && objValue === srcValue)
- ? hasIn_1(object, path)
- : _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
- };
- }
-
- var _baseMatchesProperty = baseMatchesProperty;
-
- /**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new accessor function.
- */
- function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
- };
- }
-
- var _baseProperty = baseProperty;
-
- /**
- * A specialized version of `baseProperty` which supports deep paths.
- *
- * @private
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new accessor function.
- */
- function basePropertyDeep(path) {
- return function(object) {
- return _baseGet(object, path);
- };
- }
-
- var _basePropertyDeep = basePropertyDeep;
-
- /**
- * Creates a function that returns the value at `path` of a given object.
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Util
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new accessor function.
- * @example
- *
- * var objects = [
- * { 'a': { 'b': 2 } },
- * { 'a': { 'b': 1 } }
- * ];
- *
- * _.map(objects, _.property('a.b'));
- * // => [2, 1]
- *
- * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
- * // => [1, 2]
- */
- function property(path) {
- return _isKey(path) ? _baseProperty(_toKey(path)) : _basePropertyDeep(path);
- }
-
- var property_1 = property;
-
- /**
- * The base implementation of `_.iteratee`.
- *
- * @private
- * @param {*} [value=_.identity] The value to convert to an iteratee.
- * @returns {Function} Returns the iteratee.
- */
- function baseIteratee(value) {
- // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
- // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
- if (typeof value == 'function') {
- return value;
- }
- if (value == null) {
- return identity_1;
- }
- if (typeof value == 'object') {
- return isArray_1(value)
- ? _baseMatchesProperty(value[0], value[1])
- : _baseMatches(value);
- }
- return property_1(value);
- }
-
- var _baseIteratee = baseIteratee;
-
- /** Used to compose bitmasks for cloning. */
- var CLONE_DEEP_FLAG = 1;
-
- /**
- * Creates a function that invokes `func` with the arguments of the created
- * function. If `func` is a property name, the created function returns the
- * property value for a given element. If `func` is an array or object, the
- * created function returns `true` for elements that contain the equivalent
- * source properties, otherwise it returns `false`.
- *
- * @static
- * @since 4.0.0
- * @memberOf _
- * @category Util
- * @param {*} [func=_.identity] The value to convert to a callback.
- * @returns {Function} Returns the callback.
- * @example
- *
- * var users = [
- * { 'user': 'barney', 'age': 36, 'active': true },
- * { 'user': 'fred', 'age': 40, 'active': false }
- * ];
- *
- * // The `_.matches` iteratee shorthand.
- * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
- * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
- *
- * // The `_.matchesProperty` iteratee shorthand.
- * _.filter(users, _.iteratee(['user', 'fred']));
- * // => [{ 'user': 'fred', 'age': 40 }]
- *
- * // The `_.property` iteratee shorthand.
- * _.map(users, _.iteratee('user'));
- * // => ['barney', 'fred']
- *
- * // Create custom iteratee shorthands.
- * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
- * return !_.isRegExp(func) ? iteratee(func) : function(string) {
- * return func.test(string);
- * };
- * });
- *
- * _.filter(['abc', 'def'], /ef/);
- * // => ['def']
- */
- function iteratee(func) {
- return _baseIteratee(typeof func == 'function' ? func : _baseClone(func, CLONE_DEEP_FLAG));
- }
-
- var iteratee_1 = iteratee;
-
- /** Built-in value references. */
- var spreadableSymbol = _Symbol ? _Symbol.isConcatSpreadable : undefined;
-
- /**
- * Checks if `value` is a flattenable `arguments` object or array.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
- */
- function isFlattenable(value) {
- return isArray_1(value) || isArguments_1(value) ||
- !!(spreadableSymbol && value && value[spreadableSymbol]);
- }
-
- var _isFlattenable = isFlattenable;
-
- /**
- * The base implementation of `_.flatten` with support for restricting flattening.
- *
- * @private
- * @param {Array} array The array to flatten.
- * @param {number} depth The maximum recursion depth.
- * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
- * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
- * @param {Array} [result=[]] The initial result value.
- * @returns {Array} Returns the new flattened array.
- */
- function baseFlatten(array, depth, predicate, isStrict, result) {
- var index = -1,
- length = array.length;
-
- predicate || (predicate = _isFlattenable);
- result || (result = []);
-
- while (++index < length) {
- var value = array[index];
- if (depth > 0 && predicate(value)) {
- if (depth > 1) {
- // Recursively flatten arrays (susceptible to call stack limits).
- baseFlatten(value, depth - 1, predicate, isStrict, result);
- } else {
- _arrayPush(result, value);
- }
- } else if (!isStrict) {
- result[result.length] = value;
- }
- }
- return result;
- }
-
- var _baseFlatten = baseFlatten;
-
- /**
- * Flattens `array` a single level deep.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Array
- * @param {Array} array The array to flatten.
- * @returns {Array} Returns the new flattened array.
- * @example
- *
- * _.flatten([1, [2, [3, [4]], 5]]);
- * // => [1, 2, [3, [4]], 5]
- */
- function flatten(array) {
- var length = array == null ? 0 : array.length;
- return length ? _baseFlatten(array, 1) : [];
- }
-
- var flatten_1 = flatten;
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax = Math.max;
-
- /**
- * A specialized version of `baseRest` which transforms the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @param {Function} transform The rest array transform.
- * @returns {Function} Returns the new function.
- */
- function overRest(func, start, transform) {
- start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
- }
- index = -1;
- var otherArgs = Array(start + 1);
- while (++index < start) {
- otherArgs[index] = args[index];
- }
- otherArgs[start] = transform(array);
- return _apply(func, this, otherArgs);
- };
- }
-
- var _overRest = overRest;
-
- /**
- * A specialized version of `baseRest` which flattens the rest array.
- *
- * @private
- * @param {Function} func The function to apply a rest parameter to.
- * @returns {Function} Returns the new function.
- */
- function flatRest(func) {
- return _setToString(_overRest(func, undefined, flatten_1), func + '');
- }
-
- var _flatRest = flatRest;
-
- /** Used to compose bitmasks for function metadata. */
- var WRAP_REARG_FLAG = 256;
-
- /**
- * Creates a function that invokes `func` with arguments arranged according
- * to the specified `indexes` where the argument value at the first index is
- * provided as the first argument, the argument value at the second index is
- * provided as the second argument, and so on.
- *
- * @static
- * @memberOf _
- * @since 3.0.0
- * @category Function
- * @param {Function} func The function to rearrange arguments for.
- * @param {...(number|number[])} indexes The arranged argument indexes.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var rearged = _.rearg(function(a, b, c) {
- * return [a, b, c];
- * }, [2, 0, 1]);
- *
- * rearged('b', 'c', 'a')
- * // => ['a', 'b', 'c']
- */
- var rearg = _flatRest(function(func, indexes) {
- return _createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
- });
-
- var rearg_1 = rearg;
-
- /**
- * Converts `value` to a property path array.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Util
- * @param {*} value The value to convert.
- * @returns {Array} Returns the new property path array.
- * @example
- *
- * _.toPath('a.b.c');
- * // => ['a', 'b', 'c']
- *
- * _.toPath('a[0].b.c');
- * // => ['a', '0', 'b', 'c']
- */
- function toPath(value) {
- if (isArray_1(value)) {
- return _arrayMap(value, _toKey);
- }
- return isSymbol_1(value) ? [value] : _copyArray(_stringToPath(toString_1(value)));
- }
-
- var toPath_1 = toPath;
-
- var _util = {
- 'ary': ary_1,
- 'assign': _baseAssign,
- 'clone': clone_1,
- 'curry': commonjsRequire("../curry", "/$$rollup_base$$/node_modules/lodash/fp"),
- 'forEach': _arrayEach,
- 'isArray': isArray_1,
- 'isError': isError_1,
- 'isFunction': isFunction_1,
- 'isWeakMap': isWeakMap_1,
- 'iteratee': iteratee_1,
- 'keys': _baseKeys,
- 'rearg': rearg_1,
- 'toInteger': toInteger_1,
- 'toPath': toPath_1
- };
-
- /**
- * Converts `func` of `name` to an immutable auto-curried iteratee-first data-last
- * version with conversion `options` applied. If `name` is an object its methods
- * will be converted.
- *
- * @param {string} name The name of the function to wrap.
- * @param {Function} [func] The function to wrap.
- * @param {Object} [options] The options object. See `baseConvert` for more details.
- * @returns {Function|Object} Returns the converted function or object.
- */
- function convert$2(name, func, options) {
- return _baseConvert(_util, name, func, options);
- }
-
- var convert_1 = convert$2;
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/fp/curry.js", function (module, exports) {
- var convert = convert_1,
- func = convert('curry', commonjsRequire("../curry", "/$$rollup_base$$/node_modules/lodash/fp"));
-
- func.placeholder = placeholder;
- module.exports = func;
-
- });
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/fp/curryN.js", function (module, exports) {
- var convert = convert_1,
- func = convert('curryN', commonjsRequire("../curry", "/$$rollup_base$$/node_modules/lodash/fp"));
-
- func.placeholder = placeholder;
- module.exports = func;
-
- });
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/fp/curryRight.js", function (module, exports) {
- var convert = convert_1,
- func = convert('curryRight', commonjsRequire("../curryRight", "/$$rollup_base$$/node_modules/lodash/fp"));
-
- func.placeholder = placeholder;
- module.exports = func;
-
- });
-
- commonjsRegister("/$$rollup_base$$/node_modules/lodash/fp/curryRightN.js", function (module, exports) {
- var convert = convert_1,
- func = convert('curryRightN', commonjsRequire("../curryRight", "/$$rollup_base$$/node_modules/lodash/fp"));
-
- func.placeholder = placeholder;
- module.exports = func;
-
- });
-
- var moment = createCommonjsModule(function (module, exports) {
- (function (global, factory) {
- module.exports = factory() ;
- }(commonjsGlobal, (function () {
- var hookCallback;
-
- function hooks() {
- return hookCallback.apply(null, arguments);
- }
-
- // This is done to register the method called with moment()
- // without creating circular dependencies.
- function setHookCallback(callback) {
- hookCallback = callback;
- }
-
- function isArray(input) {
- return (
- input instanceof Array ||
- Object.prototype.toString.call(input) === '[object Array]'
- );
- }
-
- function isObject(input) {
- // IE8 will treat undefined and null as object if it wasn't for
- // input != null
- return (
- input != null &&
- Object.prototype.toString.call(input) === '[object Object]'
- );
- }
-
- function hasOwnProp(a, b) {
- return Object.prototype.hasOwnProperty.call(a, b);
- }
-
- function isObjectEmpty(obj) {
- if (Object.getOwnPropertyNames) {
- return Object.getOwnPropertyNames(obj).length === 0;
- } else {
- var k;
- for (k in obj) {
- if (hasOwnProp(obj, k)) {
- return false;
- }
- }
- return true;
- }
- }
-
- function isUndefined(input) {
- return input === void 0;
- }
-
- function isNumber(input) {
- return (
- typeof input === 'number' ||
- Object.prototype.toString.call(input) === '[object Number]'
- );
- }
-
- function isDate(input) {
- return (
- input instanceof Date ||
- Object.prototype.toString.call(input) === '[object Date]'
- );
- }
-
- function map(arr, fn) {
- var res = [],
- i;
- for (i = 0; i < arr.length; ++i) {
- res.push(fn(arr[i], i));
- }
- return res;
- }
-
- function extend(a, b) {
- for (var i in b) {
- if (hasOwnProp(b, i)) {
- a[i] = b[i];
- }
- }
-
- if (hasOwnProp(b, 'toString')) {
- a.toString = b.toString;
- }
-
- if (hasOwnProp(b, 'valueOf')) {
- a.valueOf = b.valueOf;
- }
-
- return a;
- }
-
- function createUTC(input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, true).utc();
- }
-
- function defaultParsingFlags() {
- // We need to deep clone this object.
- return {
- empty: false,
- unusedTokens: [],
- unusedInput: [],
- overflow: -2,
- charsLeftOver: 0,
- nullInput: false,
- invalidEra: null,
- invalidMonth: null,
- invalidFormat: false,
- userInvalidated: false,
- iso: false,
- parsedDateParts: [],
- era: null,
- meridiem: null,
- rfc2822: false,
- weekdayMismatch: false,
- };
- }
-
- function getParsingFlags(m) {
- if (m._pf == null) {
- m._pf = defaultParsingFlags();
- }
- return m._pf;
- }
-
- var some;
- if (Array.prototype.some) {
- some = Array.prototype.some;
- } else {
- some = function (fun) {
- var t = Object(this),
- len = t.length >>> 0,
- i;
-
- for (i = 0; i < len; i++) {
- if (i in t && fun.call(this, t[i], i, t)) {
- return true;
- }
- }
-
- return false;
- };
- }
-
- function isValid(m) {
- if (m._isValid == null) {
- var flags = getParsingFlags(m),
- parsedParts = some.call(flags.parsedDateParts, function (i) {
- return i != null;
- }),
- isNowValid =
- !isNaN(m._d.getTime()) &&
- flags.overflow < 0 &&
- !flags.empty &&
- !flags.invalidEra &&
- !flags.invalidMonth &&
- !flags.invalidWeekday &&
- !flags.weekdayMismatch &&
- !flags.nullInput &&
- !flags.invalidFormat &&
- !flags.userInvalidated &&
- (!flags.meridiem || (flags.meridiem && parsedParts));
-
- if (m._strict) {
- isNowValid =
- isNowValid &&
- flags.charsLeftOver === 0 &&
- flags.unusedTokens.length === 0 &&
- flags.bigHour === undefined;
- }
-
- if (Object.isFrozen == null || !Object.isFrozen(m)) {
- m._isValid = isNowValid;
- } else {
- return isNowValid;
- }
- }
- return m._isValid;
- }
-
- function createInvalid(flags) {
- var m = createUTC(NaN);
- if (flags != null) {
- extend(getParsingFlags(m), flags);
- } else {
- getParsingFlags(m).userInvalidated = true;
- }
-
- return m;
- }
-
- // Plugins that add properties should also add the key here (null value),
- // so we can properly clone ourselves.
- var momentProperties = (hooks.momentProperties = []),
- updateInProgress = false;
-
- function copyConfig(to, from) {
- var i, prop, val;
-
- if (!isUndefined(from._isAMomentObject)) {
- to._isAMomentObject = from._isAMomentObject;
- }
- if (!isUndefined(from._i)) {
- to._i = from._i;
- }
- if (!isUndefined(from._f)) {
- to._f = from._f;
- }
- if (!isUndefined(from._l)) {
- to._l = from._l;
- }
- if (!isUndefined(from._strict)) {
- to._strict = from._strict;
- }
- if (!isUndefined(from._tzm)) {
- to._tzm = from._tzm;
- }
- if (!isUndefined(from._isUTC)) {
- to._isUTC = from._isUTC;
- }
- if (!isUndefined(from._offset)) {
- to._offset = from._offset;
- }
- if (!isUndefined(from._pf)) {
- to._pf = getParsingFlags(from);
- }
- if (!isUndefined(from._locale)) {
- to._locale = from._locale;
- }
-
- if (momentProperties.length > 0) {
- for (i = 0; i < momentProperties.length; i++) {
- prop = momentProperties[i];
- val = from[prop];
- if (!isUndefined(val)) {
- to[prop] = val;
- }
- }
- }
-
- return to;
- }
-
- // Moment prototype object
- function Moment(config) {
- copyConfig(this, config);
- this._d = new Date(config._d != null ? config._d.getTime() : NaN);
- if (!this.isValid()) {
- this._d = new Date(NaN);
- }
- // Prevent infinite loop in case updateOffset creates new moment
- // objects.
- if (updateInProgress === false) {
- updateInProgress = true;
- hooks.updateOffset(this);
- updateInProgress = false;
- }
- }
-
- function isMoment(obj) {
- return (
- obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
- );
- }
-
- function warn(msg) {
- if (
- hooks.suppressDeprecationWarnings === false &&
- typeof console !== 'undefined' &&
- console.warn
- ) {
- console.warn('Deprecation warning: ' + msg);
- }
- }
-
- function deprecate(msg, fn) {
- var firstTime = true;
-
- return extend(function () {
- if (hooks.deprecationHandler != null) {
- hooks.deprecationHandler(null, msg);
- }
- if (firstTime) {
- var args = [],
- arg,
- i,
- key;
- for (i = 0; i < arguments.length; i++) {
- arg = '';
- if (typeof arguments[i] === 'object') {
- arg += '\n[' + i + '] ';
- for (key in arguments[0]) {
- if (hasOwnProp(arguments[0], key)) {
- arg += key + ': ' + arguments[0][key] + ', ';
- }
- }
- arg = arg.slice(0, -2); // Remove trailing comma and space
- } else {
- arg = arguments[i];
- }
- args.push(arg);
- }
- warn(
- msg +
- '\nArguments: ' +
- Array.prototype.slice.call(args).join('') +
- '\n' +
- new Error().stack
- );
- firstTime = false;
- }
- return fn.apply(this, arguments);
- }, fn);
- }
-
- var deprecations = {};
-
- function deprecateSimple(name, msg) {
- if (hooks.deprecationHandler != null) {
- hooks.deprecationHandler(name, msg);
- }
- if (!deprecations[name]) {
- warn(msg);
- deprecations[name] = true;
- }
- }
-
- hooks.suppressDeprecationWarnings = false;
- hooks.deprecationHandler = null;
-
- function isFunction(input) {
- return (
- (typeof Function !== 'undefined' && input instanceof Function) ||
- Object.prototype.toString.call(input) === '[object Function]'
- );
- }
-
- function set(config) {
- var prop, i;
- for (i in config) {
- if (hasOwnProp(config, i)) {
- prop = config[i];
- if (isFunction(prop)) {
- this[i] = prop;
- } else {
- this['_' + i] = prop;
- }
- }
- }
- this._config = config;
- // Lenient ordinal parsing accepts just a number in addition to
- // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
- // TODO: Remove "ordinalParse" fallback in next major release.
- this._dayOfMonthOrdinalParseLenient = new RegExp(
- (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
- '|' +
- /\d{1,2}/.source
- );
- }
-
- function mergeConfigs(parentConfig, childConfig) {
- var res = extend({}, parentConfig),
- prop;
- for (prop in childConfig) {
- if (hasOwnProp(childConfig, prop)) {
- if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
- res[prop] = {};
- extend(res[prop], parentConfig[prop]);
- extend(res[prop], childConfig[prop]);
- } else if (childConfig[prop] != null) {
- res[prop] = childConfig[prop];
- } else {
- delete res[prop];
- }
- }
- }
- for (prop in parentConfig) {
- if (
- hasOwnProp(parentConfig, prop) &&
- !hasOwnProp(childConfig, prop) &&
- isObject(parentConfig[prop])
- ) {
- // make sure changes to properties don't modify parent config
- res[prop] = extend({}, res[prop]);
- }
- }
- return res;
- }
-
- function Locale(config) {
- if (config != null) {
- this.set(config);
- }
- }
-
- var keys;
-
- if (Object.keys) {
- keys = Object.keys;
- } else {
- keys = function (obj) {
- var i,
- res = [];
- for (i in obj) {
- if (hasOwnProp(obj, i)) {
- res.push(i);
- }
- }
- return res;
- };
- }
-
- var defaultCalendar = {
- sameDay: '[Today at] LT',
- nextDay: '[Tomorrow at] LT',
- nextWeek: 'dddd [at] LT',
- lastDay: '[Yesterday at] LT',
- lastWeek: '[Last] dddd [at] LT',
- sameElse: 'L',
- };
-
- function calendar(key, mom, now) {
- var output = this._calendar[key] || this._calendar['sameElse'];
- return isFunction(output) ? output.call(mom, now) : output;
- }
-
- function zeroFill(number, targetLength, forceSign) {
- var absNumber = '' + Math.abs(number),
- zerosToFill = targetLength - absNumber.length,
- sign = number >= 0;
- return (
- (sign ? (forceSign ? '+' : '') : '-') +
- Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
- absNumber
- );
- }
-
- var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
- localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
- formatFunctions = {},
- formatTokenFunctions = {};
-
- // token: 'M'
- // padded: ['MM', 2]
- // ordinal: 'Mo'
- // callback: function () { this.month() + 1 }
- function addFormatToken(token, padded, ordinal, callback) {
- var func = callback;
- if (typeof callback === 'string') {
- func = function () {
- return this[callback]();
- };
- }
- if (token) {
- formatTokenFunctions[token] = func;
- }
- if (padded) {
- formatTokenFunctions[padded[0]] = function () {
- return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
- };
- }
- if (ordinal) {
- formatTokenFunctions[ordinal] = function () {
- return this.localeData().ordinal(
- func.apply(this, arguments),
- token
- );
- };
- }
- }
-
- function removeFormattingTokens(input) {
- if (input.match(/\[[\s\S]/)) {
- return input.replace(/^\[|\]$/g, '');
- }
- return input.replace(/\\/g, '');
- }
-
- function makeFormatFunction(format) {
- var array = format.match(formattingTokens),
- i,
- length;
-
- for (i = 0, length = array.length; i < length; i++) {
- if (formatTokenFunctions[array[i]]) {
- array[i] = formatTokenFunctions[array[i]];
- } else {
- array[i] = removeFormattingTokens(array[i]);
- }
- }
-
- return function (mom) {
- var output = '',
- i;
- for (i = 0; i < length; i++) {
- output += isFunction(array[i])
- ? array[i].call(mom, format)
- : array[i];
- }
- return output;
- };
- }
-
- // format date using native date object
- function formatMoment(m, format) {
- if (!m.isValid()) {
- return m.localeData().invalidDate();
- }
-
- format = expandFormat(format, m.localeData());
- formatFunctions[format] =
- formatFunctions[format] || makeFormatFunction(format);
-
- return formatFunctions[format](m);
- }
-
- function expandFormat(format, locale) {
- var i = 5;
-
- function replaceLongDateFormatTokens(input) {
- return locale.longDateFormat(input) || input;
- }
-
- localFormattingTokens.lastIndex = 0;
- while (i >= 0 && localFormattingTokens.test(format)) {
- format = format.replace(
- localFormattingTokens,
- replaceLongDateFormatTokens
- );
- localFormattingTokens.lastIndex = 0;
- i -= 1;
- }
-
- return format;
- }
-
- var defaultLongDateFormat = {
- LTS: 'h:mm:ss A',
- LT: 'h:mm A',
- L: 'MM/DD/YYYY',
- LL: 'MMMM D, YYYY',
- LLL: 'MMMM D, YYYY h:mm A',
- LLLL: 'dddd, MMMM D, YYYY h:mm A',
- };
-
- function longDateFormat(key) {
- var format = this._longDateFormat[key],
- formatUpper = this._longDateFormat[key.toUpperCase()];
-
- if (format || !formatUpper) {
- return format;
- }
-
- this._longDateFormat[key] = formatUpper
- .match(formattingTokens)
- .map(function (tok) {
- if (
- tok === 'MMMM' ||
- tok === 'MM' ||
- tok === 'DD' ||
- tok === 'dddd'
- ) {
- return tok.slice(1);
- }
- return tok;
- })
- .join('');
-
- return this._longDateFormat[key];
- }
-
- var defaultInvalidDate = 'Invalid date';
-
- function invalidDate() {
- return this._invalidDate;
- }
-
- var defaultOrdinal = '%d',
- defaultDayOfMonthOrdinalParse = /\d{1,2}/;
-
- function ordinal(number) {
- return this._ordinal.replace('%d', number);
- }
-
- var defaultRelativeTime = {
- future: 'in %s',
- past: '%s ago',
- s: 'a few seconds',
- ss: '%d seconds',
- m: 'a minute',
- mm: '%d minutes',
- h: 'an hour',
- hh: '%d hours',
- d: 'a day',
- dd: '%d days',
- w: 'a week',
- ww: '%d weeks',
- M: 'a month',
- MM: '%d months',
- y: 'a year',
- yy: '%d years',
- };
-
- function relativeTime(number, withoutSuffix, string, isFuture) {
- var output = this._relativeTime[string];
- return isFunction(output)
- ? output(number, withoutSuffix, string, isFuture)
- : output.replace(/%d/i, number);
- }
-
- function pastFuture(diff, output) {
- var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
- return isFunction(format) ? format(output) : format.replace(/%s/i, output);
- }
-
- var aliases = {};
-
- function addUnitAlias(unit, shorthand) {
- var lowerCase = unit.toLowerCase();
- aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
- }
-
- function normalizeUnits(units) {
- return typeof units === 'string'
- ? aliases[units] || aliases[units.toLowerCase()]
- : undefined;
- }
-
- function normalizeObjectUnits(inputObject) {
- var normalizedInput = {},
- normalizedProp,
- prop;
-
- for (prop in inputObject) {
- if (hasOwnProp(inputObject, prop)) {
- normalizedProp = normalizeUnits(prop);
- if (normalizedProp) {
- normalizedInput[normalizedProp] = inputObject[prop];
- }
- }
- }
-
- return normalizedInput;
- }
-
- var priorities = {};
-
- function addUnitPriority(unit, priority) {
- priorities[unit] = priority;
- }
-
- function getPrioritizedUnits(unitsObj) {
- var units = [],
- u;
- for (u in unitsObj) {
- if (hasOwnProp(unitsObj, u)) {
- units.push({ unit: u, priority: priorities[u] });
- }
- }
- units.sort(function (a, b) {
- return a.priority - b.priority;
- });
- return units;
- }
-
- function isLeapYear(year) {
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
- }
-
- function absFloor(number) {
- if (number < 0) {
- // -0 -> 0
- return Math.ceil(number) || 0;
- } else {
- return Math.floor(number);
- }
- }
-
- function toInt(argumentForCoercion) {
- var coercedNumber = +argumentForCoercion,
- value = 0;
-
- if (coercedNumber !== 0 && isFinite(coercedNumber)) {
- value = absFloor(coercedNumber);
- }
-
- return value;
- }
-
- function makeGetSet(unit, keepTime) {
- return function (value) {
- if (value != null) {
- set$1(this, unit, value);
- hooks.updateOffset(this, keepTime);
- return this;
- } else {
- return get(this, unit);
- }
- };
- }
-
- function get(mom, unit) {
- return mom.isValid()
- ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
- : NaN;
- }
-
- function set$1(mom, unit, value) {
- if (mom.isValid() && !isNaN(value)) {
- if (
- unit === 'FullYear' &&
- isLeapYear(mom.year()) &&
- mom.month() === 1 &&
- mom.date() === 29
- ) {
- value = toInt(value);
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
- value,
- mom.month(),
- daysInMonth(value, mom.month())
- );
- } else {
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
- }
- }
- }
-
- // MOMENTS
-
- function stringGet(units) {
- units = normalizeUnits(units);
- if (isFunction(this[units])) {
- return this[units]();
- }
- return this;
- }
-
- function stringSet(units, value) {
- if (typeof units === 'object') {
- units = normalizeObjectUnits(units);
- var prioritized = getPrioritizedUnits(units),
- i;
- for (i = 0; i < prioritized.length; i++) {
- this[prioritized[i].unit](units[prioritized[i].unit]);
- }
- } else {
- units = normalizeUnits(units);
- if (isFunction(this[units])) {
- return this[units](value);
- }
- }
- return this;
- }
-
- var match1 = /\d/, // 0 - 9
- match2 = /\d\d/, // 00 - 99
- match3 = /\d{3}/, // 000 - 999
- match4 = /\d{4}/, // 0000 - 9999
- match6 = /[+-]?\d{6}/, // -999999 - 999999
- match1to2 = /\d\d?/, // 0 - 99
- match3to4 = /\d\d\d\d?/, // 999 - 9999
- match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999
- match1to3 = /\d{1,3}/, // 0 - 999
- match1to4 = /\d{1,4}/, // 0 - 9999
- match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
- matchUnsigned = /\d+/, // 0 - inf
- matchSigned = /[+-]?\d+/, // -inf - inf
- matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
- matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
- matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
- // any word (or two) characters or numbers including two/three word month in arabic.
- // includes scottish gaelic two word and hyphenated months
- matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
- regexes;
-
- regexes = {};
-
- function addRegexToken(token, regex, strictRegex) {
- regexes[token] = isFunction(regex)
- ? regex
- : function (isStrict, localeData) {
- return isStrict && strictRegex ? strictRegex : regex;
- };
- }
-
- function getParseRegexForToken(token, config) {
- if (!hasOwnProp(regexes, token)) {
- return new RegExp(unescapeFormat(token));
- }
-
- return regexes[token](config._strict, config._locale);
- }
-
- // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
- function unescapeFormat(s) {
- return regexEscape(
- s
- .replace('\\', '')
- .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (
- matched,
- p1,
- p2,
- p3,
- p4
- ) {
- return p1 || p2 || p3 || p4;
- })
- );
- }
-
- function regexEscape(s) {
- return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
- }
-
- var tokens = {};
-
- function addParseToken(token, callback) {
- var i,
- func = callback;
- if (typeof token === 'string') {
- token = [token];
- }
- if (isNumber(callback)) {
- func = function (input, array) {
- array[callback] = toInt(input);
- };
- }
- for (i = 0; i < token.length; i++) {
- tokens[token[i]] = func;
- }
- }
-
- function addWeekParseToken(token, callback) {
- addParseToken(token, function (input, array, config, token) {
- config._w = config._w || {};
- callback(input, config._w, config, token);
- });
- }
-
- function addTimeToArrayFromToken(token, input, config) {
- if (input != null && hasOwnProp(tokens, token)) {
- tokens[token](input, config._a, config, token);
- }
- }
-
- var YEAR = 0,
- MONTH = 1,
- DATE = 2,
- HOUR = 3,
- MINUTE = 4,
- SECOND = 5,
- MILLISECOND = 6,
- WEEK = 7,
- WEEKDAY = 8;
-
- function mod(n, x) {
- return ((n % x) + x) % x;
- }
-
- var indexOf;
-
- if (Array.prototype.indexOf) {
- indexOf = Array.prototype.indexOf;
- } else {
- indexOf = function (o) {
- // I know
- var i;
- for (i = 0; i < this.length; ++i) {
- if (this[i] === o) {
- return i;
- }
- }
- return -1;
- };
- }
-
- function daysInMonth(year, month) {
- if (isNaN(year) || isNaN(month)) {
- return NaN;
- }
- var modMonth = mod(month, 12);
- year += (month - modMonth) / 12;
- return modMonth === 1
- ? isLeapYear(year)
- ? 29
- : 28
- : 31 - ((modMonth % 7) % 2);
- }
-
- // FORMATTING
-
- addFormatToken('M', ['MM', 2], 'Mo', function () {
- return this.month() + 1;
- });
-
- addFormatToken('MMM', 0, 0, function (format) {
- return this.localeData().monthsShort(this, format);
- });
-
- addFormatToken('MMMM', 0, 0, function (format) {
- return this.localeData().months(this, format);
- });
-
- // ALIASES
-
- addUnitAlias('month', 'M');
-
- // PRIORITY
-
- addUnitPriority('month', 8);
-
- // PARSING
-
- addRegexToken('M', match1to2);
- addRegexToken('MM', match1to2, match2);
- addRegexToken('MMM', function (isStrict, locale) {
- return locale.monthsShortRegex(isStrict);
- });
- addRegexToken('MMMM', function (isStrict, locale) {
- return locale.monthsRegex(isStrict);
- });
-
- addParseToken(['M', 'MM'], function (input, array) {
- array[MONTH] = toInt(input) - 1;
- });
-
- addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
- var month = config._locale.monthsParse(input, token, config._strict);
- // if we didn't find a month name, mark the date as invalid.
- if (month != null) {
- array[MONTH] = month;
- } else {
- getParsingFlags(config).invalidMonth = input;
- }
- });
-
- // LOCALES
-
- var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
- '_'
- ),
- defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split(
- '_'
- ),
- MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
- defaultMonthsShortRegex = matchWord,
- defaultMonthsRegex = matchWord;
-
- function localeMonths(m, format) {
- if (!m) {
- return isArray(this._months)
- ? this._months
- : this._months['standalone'];
- }
- return isArray(this._months)
- ? this._months[m.month()]
- : this._months[
- (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
- ? 'format'
- : 'standalone'
- ][m.month()];
- }
-
- function localeMonthsShort(m, format) {
- if (!m) {
- return isArray(this._monthsShort)
- ? this._monthsShort
- : this._monthsShort['standalone'];
- }
- return isArray(this._monthsShort)
- ? this._monthsShort[m.month()]
- : this._monthsShort[
- MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
- ][m.month()];
- }
-
- function handleStrictParse(monthName, format, strict) {
- var i,
- ii,
- mom,
- llc = monthName.toLocaleLowerCase();
- if (!this._monthsParse) {
- // this is not used
- this._monthsParse = [];
- this._longMonthsParse = [];
- this._shortMonthsParse = [];
- for (i = 0; i < 12; ++i) {
- mom = createUTC([2000, i]);
- this._shortMonthsParse[i] = this.monthsShort(
- mom,
- ''
- ).toLocaleLowerCase();
- this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
- }
- }
-
- if (strict) {
- if (format === 'MMM') {
- ii = indexOf.call(this._shortMonthsParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._longMonthsParse, llc);
- return ii !== -1 ? ii : null;
- }
- } else {
- if (format === 'MMM') {
- ii = indexOf.call(this._shortMonthsParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._longMonthsParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._longMonthsParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortMonthsParse, llc);
- return ii !== -1 ? ii : null;
- }
- }
- }
-
- function localeMonthsParse(monthName, format, strict) {
- var i, mom, regex;
-
- if (this._monthsParseExact) {
- return handleStrictParse.call(this, monthName, format, strict);
- }
-
- if (!this._monthsParse) {
- this._monthsParse = [];
- this._longMonthsParse = [];
- this._shortMonthsParse = [];
- }
-
- // TODO: add sorting
- // Sorting makes sure if one month (or abbr) is a prefix of another
- // see sorting in computeMonthsParse
- for (i = 0; i < 12; i++) {
- // make the regex if we don't have it already
- mom = createUTC([2000, i]);
- if (strict && !this._longMonthsParse[i]) {
- this._longMonthsParse[i] = new RegExp(
- '^' + this.months(mom, '').replace('.', '') + '$',
- 'i'
- );
- this._shortMonthsParse[i] = new RegExp(
- '^' + this.monthsShort(mom, '').replace('.', '') + '$',
- 'i'
- );
- }
- if (!strict && !this._monthsParse[i]) {
- regex =
- '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
- this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (
- strict &&
- format === 'MMMM' &&
- this._longMonthsParse[i].test(monthName)
- ) {
- return i;
- } else if (
- strict &&
- format === 'MMM' &&
- this._shortMonthsParse[i].test(monthName)
- ) {
- return i;
- } else if (!strict && this._monthsParse[i].test(monthName)) {
- return i;
- }
- }
- }
-
- // MOMENTS
-
- function setMonth(mom, value) {
- var dayOfMonth;
-
- if (!mom.isValid()) {
- // No op
- return mom;
- }
-
- if (typeof value === 'string') {
- if (/^\d+$/.test(value)) {
- value = toInt(value);
- } else {
- value = mom.localeData().monthsParse(value);
- // TODO: Another silent failure?
- if (!isNumber(value)) {
- return mom;
- }
- }
- }
-
- dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
- return mom;
- }
-
- function getSetMonth(value) {
- if (value != null) {
- setMonth(this, value);
- hooks.updateOffset(this, true);
- return this;
- } else {
- return get(this, 'Month');
- }
- }
-
- function getDaysInMonth() {
- return daysInMonth(this.year(), this.month());
- }
-
- function monthsShortRegex(isStrict) {
- if (this._monthsParseExact) {
- if (!hasOwnProp(this, '_monthsRegex')) {
- computeMonthsParse.call(this);
- }
- if (isStrict) {
- return this._monthsShortStrictRegex;
- } else {
- return this._monthsShortRegex;
- }
- } else {
- if (!hasOwnProp(this, '_monthsShortRegex')) {
- this._monthsShortRegex = defaultMonthsShortRegex;
- }
- return this._monthsShortStrictRegex && isStrict
- ? this._monthsShortStrictRegex
- : this._monthsShortRegex;
- }
- }
-
- function monthsRegex(isStrict) {
- if (this._monthsParseExact) {
- if (!hasOwnProp(this, '_monthsRegex')) {
- computeMonthsParse.call(this);
- }
- if (isStrict) {
- return this._monthsStrictRegex;
- } else {
- return this._monthsRegex;
- }
- } else {
- if (!hasOwnProp(this, '_monthsRegex')) {
- this._monthsRegex = defaultMonthsRegex;
- }
- return this._monthsStrictRegex && isStrict
- ? this._monthsStrictRegex
- : this._monthsRegex;
- }
- }
-
- function computeMonthsParse() {
- function cmpLenRev(a, b) {
- return b.length - a.length;
- }
-
- var shortPieces = [],
- longPieces = [],
- mixedPieces = [],
- i,
- mom;
- for (i = 0; i < 12; i++) {
- // make the regex if we don't have it already
- mom = createUTC([2000, i]);
- shortPieces.push(this.monthsShort(mom, ''));
- longPieces.push(this.months(mom, ''));
- mixedPieces.push(this.months(mom, ''));
- mixedPieces.push(this.monthsShort(mom, ''));
- }
- // Sorting makes sure if one month (or abbr) is a prefix of another it
- // will match the longer piece.
- shortPieces.sort(cmpLenRev);
- longPieces.sort(cmpLenRev);
- mixedPieces.sort(cmpLenRev);
- for (i = 0; i < 12; i++) {
- shortPieces[i] = regexEscape(shortPieces[i]);
- longPieces[i] = regexEscape(longPieces[i]);
- }
- for (i = 0; i < 24; i++) {
- mixedPieces[i] = regexEscape(mixedPieces[i]);
- }
-
- this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
- this._monthsShortRegex = this._monthsRegex;
- this._monthsStrictRegex = new RegExp(
- '^(' + longPieces.join('|') + ')',
- 'i'
- );
- this._monthsShortStrictRegex = new RegExp(
- '^(' + shortPieces.join('|') + ')',
- 'i'
- );
- }
-
- // FORMATTING
-
- addFormatToken('Y', 0, 0, function () {
- var y = this.year();
- return y <= 9999 ? zeroFill(y, 4) : '+' + y;
- });
-
- addFormatToken(0, ['YY', 2], 0, function () {
- return this.year() % 100;
- });
-
- addFormatToken(0, ['YYYY', 4], 0, 'year');
- addFormatToken(0, ['YYYYY', 5], 0, 'year');
- addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
-
- // ALIASES
-
- addUnitAlias('year', 'y');
-
- // PRIORITIES
-
- addUnitPriority('year', 1);
-
- // PARSING
-
- addRegexToken('Y', matchSigned);
- addRegexToken('YY', match1to2, match2);
- addRegexToken('YYYY', match1to4, match4);
- addRegexToken('YYYYY', match1to6, match6);
- addRegexToken('YYYYYY', match1to6, match6);
-
- addParseToken(['YYYYY', 'YYYYYY'], YEAR);
- addParseToken('YYYY', function (input, array) {
- array[YEAR] =
- input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
- });
- addParseToken('YY', function (input, array) {
- array[YEAR] = hooks.parseTwoDigitYear(input);
- });
- addParseToken('Y', function (input, array) {
- array[YEAR] = parseInt(input, 10);
- });
-
- // HELPERS
-
- function daysInYear(year) {
- return isLeapYear(year) ? 366 : 365;
- }
-
- // HOOKS
-
- hooks.parseTwoDigitYear = function (input) {
- return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
- };
-
- // MOMENTS
-
- var getSetYear = makeGetSet('FullYear', true);
-
- function getIsLeapYear() {
- return isLeapYear(this.year());
- }
-
- function createDate(y, m, d, h, M, s, ms) {
- // can't just apply() to create a date:
- // https://stackoverflow.com/q/181348
- var date;
- // the date constructor remaps years 0-99 to 1900-1999
- if (y < 100 && y >= 0) {
- // preserve leap years using a full 400 year cycle, then reset
- date = new Date(y + 400, m, d, h, M, s, ms);
- if (isFinite(date.getFullYear())) {
- date.setFullYear(y);
- }
- } else {
- date = new Date(y, m, d, h, M, s, ms);
- }
-
- return date;
- }
-
- function createUTCDate(y) {
- var date, args;
- // the Date.UTC function remaps years 0-99 to 1900-1999
- if (y < 100 && y >= 0) {
- args = Array.prototype.slice.call(arguments);
- // preserve leap years using a full 400 year cycle, then reset
- args[0] = y + 400;
- date = new Date(Date.UTC.apply(null, args));
- if (isFinite(date.getUTCFullYear())) {
- date.setUTCFullYear(y);
- }
- } else {
- date = new Date(Date.UTC.apply(null, arguments));
- }
-
- return date;
- }
-
- // start-of-first-week - start-of-year
- function firstWeekOffset(year, dow, doy) {
- var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
- fwd = 7 + dow - doy,
- // first-week day local weekday -- which local weekday is fwd
- fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
-
- return -fwdlw + fwd - 1;
- }
-
- // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
- function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
- var localWeekday = (7 + weekday - dow) % 7,
- weekOffset = firstWeekOffset(year, dow, doy),
- dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
- resYear,
- resDayOfYear;
-
- if (dayOfYear <= 0) {
- resYear = year - 1;
- resDayOfYear = daysInYear(resYear) + dayOfYear;
- } else if (dayOfYear > daysInYear(year)) {
- resYear = year + 1;
- resDayOfYear = dayOfYear - daysInYear(year);
- } else {
- resYear = year;
- resDayOfYear = dayOfYear;
- }
-
- return {
- year: resYear,
- dayOfYear: resDayOfYear,
- };
- }
-
- function weekOfYear(mom, dow, doy) {
- var weekOffset = firstWeekOffset(mom.year(), dow, doy),
- week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
- resWeek,
- resYear;
-
- if (week < 1) {
- resYear = mom.year() - 1;
- resWeek = week + weeksInYear(resYear, dow, doy);
- } else if (week > weeksInYear(mom.year(), dow, doy)) {
- resWeek = week - weeksInYear(mom.year(), dow, doy);
- resYear = mom.year() + 1;
- } else {
- resYear = mom.year();
- resWeek = week;
- }
-
- return {
- week: resWeek,
- year: resYear,
- };
- }
-
- function weeksInYear(year, dow, doy) {
- var weekOffset = firstWeekOffset(year, dow, doy),
- weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
- return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
- }
-
- // FORMATTING
-
- addFormatToken('w', ['ww', 2], 'wo', 'week');
- addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
-
- // ALIASES
-
- addUnitAlias('week', 'w');
- addUnitAlias('isoWeek', 'W');
-
- // PRIORITIES
-
- addUnitPriority('week', 5);
- addUnitPriority('isoWeek', 5);
-
- // PARSING
-
- addRegexToken('w', match1to2);
- addRegexToken('ww', match1to2, match2);
- addRegexToken('W', match1to2);
- addRegexToken('WW', match1to2, match2);
-
- addWeekParseToken(['w', 'ww', 'W', 'WW'], function (
- input,
- week,
- config,
- token
- ) {
- week[token.substr(0, 1)] = toInt(input);
- });
-
- // HELPERS
-
- // LOCALES
-
- function localeWeek(mom) {
- return weekOfYear(mom, this._week.dow, this._week.doy).week;
- }
-
- var defaultLocaleWeek = {
- dow: 0, // Sunday is the first day of the week.
- doy: 6, // The week that contains Jan 6th is the first week of the year.
- };
-
- function localeFirstDayOfWeek() {
- return this._week.dow;
- }
-
- function localeFirstDayOfYear() {
- return this._week.doy;
- }
-
- // MOMENTS
-
- function getSetWeek(input) {
- var week = this.localeData().week(this);
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
-
- function getSetISOWeek(input) {
- var week = weekOfYear(this, 1, 4).week;
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
-
- // FORMATTING
-
- addFormatToken('d', 0, 'do', 'day');
-
- addFormatToken('dd', 0, 0, function (format) {
- return this.localeData().weekdaysMin(this, format);
- });
-
- addFormatToken('ddd', 0, 0, function (format) {
- return this.localeData().weekdaysShort(this, format);
- });
-
- addFormatToken('dddd', 0, 0, function (format) {
- return this.localeData().weekdays(this, format);
- });
-
- addFormatToken('e', 0, 0, 'weekday');
- addFormatToken('E', 0, 0, 'isoWeekday');
-
- // ALIASES
-
- addUnitAlias('day', 'd');
- addUnitAlias('weekday', 'e');
- addUnitAlias('isoWeekday', 'E');
-
- // PRIORITY
- addUnitPriority('day', 11);
- addUnitPriority('weekday', 11);
- addUnitPriority('isoWeekday', 11);
-
- // PARSING
-
- addRegexToken('d', match1to2);
- addRegexToken('e', match1to2);
- addRegexToken('E', match1to2);
- addRegexToken('dd', function (isStrict, locale) {
- return locale.weekdaysMinRegex(isStrict);
- });
- addRegexToken('ddd', function (isStrict, locale) {
- return locale.weekdaysShortRegex(isStrict);
- });
- addRegexToken('dddd', function (isStrict, locale) {
- return locale.weekdaysRegex(isStrict);
- });
-
- addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
- var weekday = config._locale.weekdaysParse(input, token, config._strict);
- // if we didn't get a weekday name, mark the date as invalid
- if (weekday != null) {
- week.d = weekday;
- } else {
- getParsingFlags(config).invalidWeekday = input;
- }
- });
-
- addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
- week[token] = toInt(input);
- });
-
- // HELPERS
-
- function parseWeekday(input, locale) {
- if (typeof input !== 'string') {
- return input;
- }
-
- if (!isNaN(input)) {
- return parseInt(input, 10);
- }
-
- input = locale.weekdaysParse(input);
- if (typeof input === 'number') {
- return input;
- }
-
- return null;
- }
-
- function parseIsoWeekday(input, locale) {
- if (typeof input === 'string') {
- return locale.weekdaysParse(input) % 7 || 7;
- }
- return isNaN(input) ? null : input;
- }
-
- // LOCALES
- function shiftWeekdays(ws, n) {
- return ws.slice(n, 7).concat(ws.slice(0, n));
- }
-
- var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
- '_'
- ),
- defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
- defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
- defaultWeekdaysRegex = matchWord,
- defaultWeekdaysShortRegex = matchWord,
- defaultWeekdaysMinRegex = matchWord;
-
- function localeWeekdays(m, format) {
- var weekdays = isArray(this._weekdays)
- ? this._weekdays
- : this._weekdays[
- m && m !== true && this._weekdays.isFormat.test(format)
- ? 'format'
- : 'standalone'
- ];
- return m === true
- ? shiftWeekdays(weekdays, this._week.dow)
- : m
- ? weekdays[m.day()]
- : weekdays;
- }
-
- function localeWeekdaysShort(m) {
- return m === true
- ? shiftWeekdays(this._weekdaysShort, this._week.dow)
- : m
- ? this._weekdaysShort[m.day()]
- : this._weekdaysShort;
- }
-
- function localeWeekdaysMin(m) {
- return m === true
- ? shiftWeekdays(this._weekdaysMin, this._week.dow)
- : m
- ? this._weekdaysMin[m.day()]
- : this._weekdaysMin;
- }
-
- function handleStrictParse$1(weekdayName, format, strict) {
- var i,
- ii,
- mom,
- llc = weekdayName.toLocaleLowerCase();
- if (!this._weekdaysParse) {
- this._weekdaysParse = [];
- this._shortWeekdaysParse = [];
- this._minWeekdaysParse = [];
-
- for (i = 0; i < 7; ++i) {
- mom = createUTC([2000, 1]).day(i);
- this._minWeekdaysParse[i] = this.weekdaysMin(
- mom,
- ''
- ).toLocaleLowerCase();
- this._shortWeekdaysParse[i] = this.weekdaysShort(
- mom,
- ''
- ).toLocaleLowerCase();
- this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
- }
- }
-
- if (strict) {
- if (format === 'dddd') {
- ii = indexOf.call(this._weekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else if (format === 'ddd') {
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- }
- } else {
- if (format === 'dddd') {
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else if (format === 'ddd') {
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._minWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- }
- }
- }
-
- function localeWeekdaysParse(weekdayName, format, strict) {
- var i, mom, regex;
-
- if (this._weekdaysParseExact) {
- return handleStrictParse$1.call(this, weekdayName, format, strict);
- }
-
- if (!this._weekdaysParse) {
- this._weekdaysParse = [];
- this._minWeekdaysParse = [];
- this._shortWeekdaysParse = [];
- this._fullWeekdaysParse = [];
- }
-
- for (i = 0; i < 7; i++) {
- // make the regex if we don't have it already
-
- mom = createUTC([2000, 1]).day(i);
- if (strict && !this._fullWeekdaysParse[i]) {
- this._fullWeekdaysParse[i] = new RegExp(
- '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
- 'i'
- );
- this._shortWeekdaysParse[i] = new RegExp(
- '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
- 'i'
- );
- this._minWeekdaysParse[i] = new RegExp(
- '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
- 'i'
- );
- }
- if (!this._weekdaysParse[i]) {
- regex =
- '^' +
- this.weekdays(mom, '') +
- '|^' +
- this.weekdaysShort(mom, '') +
- '|^' +
- this.weekdaysMin(mom, '');
- this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (
- strict &&
- format === 'dddd' &&
- this._fullWeekdaysParse[i].test(weekdayName)
- ) {
- return i;
- } else if (
- strict &&
- format === 'ddd' &&
- this._shortWeekdaysParse[i].test(weekdayName)
- ) {
- return i;
- } else if (
- strict &&
- format === 'dd' &&
- this._minWeekdaysParse[i].test(weekdayName)
- ) {
- return i;
- } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
- return i;
- }
- }
- }
-
- // MOMENTS
-
- function getSetDayOfWeek(input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
- if (input != null) {
- input = parseWeekday(input, this.localeData());
- return this.add(input - day, 'd');
- } else {
- return day;
- }
- }
-
- function getSetLocaleDayOfWeek(input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
- return input == null ? weekday : this.add(input - weekday, 'd');
- }
-
- function getSetISODayOfWeek(input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
-
- // behaves the same as moment#day except
- // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
- // as a setter, sunday should belong to the previous week.
-
- if (input != null) {
- var weekday = parseIsoWeekday(input, this.localeData());
- return this.day(this.day() % 7 ? weekday : weekday - 7);
- } else {
- return this.day() || 7;
- }
- }
-
- function weekdaysRegex(isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysStrictRegex;
- } else {
- return this._weekdaysRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- this._weekdaysRegex = defaultWeekdaysRegex;
- }
- return this._weekdaysStrictRegex && isStrict
- ? this._weekdaysStrictRegex
- : this._weekdaysRegex;
- }
- }
-
- function weekdaysShortRegex(isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysShortStrictRegex;
- } else {
- return this._weekdaysShortRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysShortRegex')) {
- this._weekdaysShortRegex = defaultWeekdaysShortRegex;
- }
- return this._weekdaysShortStrictRegex && isStrict
- ? this._weekdaysShortStrictRegex
- : this._weekdaysShortRegex;
- }
- }
-
- function weekdaysMinRegex(isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysMinStrictRegex;
- } else {
- return this._weekdaysMinRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysMinRegex')) {
- this._weekdaysMinRegex = defaultWeekdaysMinRegex;
- }
- return this._weekdaysMinStrictRegex && isStrict
- ? this._weekdaysMinStrictRegex
- : this._weekdaysMinRegex;
- }
- }
-
- function computeWeekdaysParse() {
- function cmpLenRev(a, b) {
- return b.length - a.length;
- }
-
- var minPieces = [],
- shortPieces = [],
- longPieces = [],
- mixedPieces = [],
- i,
- mom,
- minp,
- shortp,
- longp;
- for (i = 0; i < 7; i++) {
- // make the regex if we don't have it already
- mom = createUTC([2000, 1]).day(i);
- minp = regexEscape(this.weekdaysMin(mom, ''));
- shortp = regexEscape(this.weekdaysShort(mom, ''));
- longp = regexEscape(this.weekdays(mom, ''));
- minPieces.push(minp);
- shortPieces.push(shortp);
- longPieces.push(longp);
- mixedPieces.push(minp);
- mixedPieces.push(shortp);
- mixedPieces.push(longp);
- }
- // Sorting makes sure if one weekday (or abbr) is a prefix of another it
- // will match the longer piece.
- minPieces.sort(cmpLenRev);
- shortPieces.sort(cmpLenRev);
- longPieces.sort(cmpLenRev);
- mixedPieces.sort(cmpLenRev);
-
- this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
- this._weekdaysShortRegex = this._weekdaysRegex;
- this._weekdaysMinRegex = this._weekdaysRegex;
-
- this._weekdaysStrictRegex = new RegExp(
- '^(' + longPieces.join('|') + ')',
- 'i'
- );
- this._weekdaysShortStrictRegex = new RegExp(
- '^(' + shortPieces.join('|') + ')',
- 'i'
- );
- this._weekdaysMinStrictRegex = new RegExp(
- '^(' + minPieces.join('|') + ')',
- 'i'
- );
- }
-
- // FORMATTING
-
- function hFormat() {
- return this.hours() % 12 || 12;
- }
-
- function kFormat() {
- return this.hours() || 24;
- }
-
- addFormatToken('H', ['HH', 2], 0, 'hour');
- addFormatToken('h', ['hh', 2], 0, hFormat);
- addFormatToken('k', ['kk', 2], 0, kFormat);
-
- addFormatToken('hmm', 0, 0, function () {
- return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
- });
-
- addFormatToken('hmmss', 0, 0, function () {
- return (
- '' +
- hFormat.apply(this) +
- zeroFill(this.minutes(), 2) +
- zeroFill(this.seconds(), 2)
- );
- });
-
- addFormatToken('Hmm', 0, 0, function () {
- return '' + this.hours() + zeroFill(this.minutes(), 2);
- });
-
- addFormatToken('Hmmss', 0, 0, function () {
- return (
- '' +
- this.hours() +
- zeroFill(this.minutes(), 2) +
- zeroFill(this.seconds(), 2)
- );
- });
-
- function meridiem(token, lowercase) {
- addFormatToken(token, 0, 0, function () {
- return this.localeData().meridiem(
- this.hours(),
- this.minutes(),
- lowercase
- );
- });
- }
-
- meridiem('a', true);
- meridiem('A', false);
-
- // ALIASES
-
- addUnitAlias('hour', 'h');
-
- // PRIORITY
- addUnitPriority('hour', 13);
-
- // PARSING
-
- function matchMeridiem(isStrict, locale) {
- return locale._meridiemParse;
- }
-
- addRegexToken('a', matchMeridiem);
- addRegexToken('A', matchMeridiem);
- addRegexToken('H', match1to2);
- addRegexToken('h', match1to2);
- addRegexToken('k', match1to2);
- addRegexToken('HH', match1to2, match2);
- addRegexToken('hh', match1to2, match2);
- addRegexToken('kk', match1to2, match2);
-
- addRegexToken('hmm', match3to4);
- addRegexToken('hmmss', match5to6);
- addRegexToken('Hmm', match3to4);
- addRegexToken('Hmmss', match5to6);
-
- addParseToken(['H', 'HH'], HOUR);
- addParseToken(['k', 'kk'], function (input, array, config) {
- var kInput = toInt(input);
- array[HOUR] = kInput === 24 ? 0 : kInput;
- });
- addParseToken(['a', 'A'], function (input, array, config) {
- config._isPm = config._locale.isPM(input);
- config._meridiem = input;
- });
- addParseToken(['h', 'hh'], function (input, array, config) {
- array[HOUR] = toInt(input);
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('hmm', function (input, array, config) {
- var pos = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos));
- array[MINUTE] = toInt(input.substr(pos));
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('hmmss', function (input, array, config) {
- var pos1 = input.length - 4,
- pos2 = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos1));
- array[MINUTE] = toInt(input.substr(pos1, 2));
- array[SECOND] = toInt(input.substr(pos2));
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('Hmm', function (input, array, config) {
- var pos = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos));
- array[MINUTE] = toInt(input.substr(pos));
- });
- addParseToken('Hmmss', function (input, array, config) {
- var pos1 = input.length - 4,
- pos2 = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos1));
- array[MINUTE] = toInt(input.substr(pos1, 2));
- array[SECOND] = toInt(input.substr(pos2));
- });
-
- // LOCALES
-
- function localeIsPM(input) {
- // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
- // Using charAt should be more compatible.
- return (input + '').toLowerCase().charAt(0) === 'p';
- }
-
- var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
- // Setting the hour should keep the time, because the user explicitly
- // specified which hour they want. So trying to maintain the same hour (in
- // a new timezone) makes sense. Adding/subtracting hours does not follow
- // this rule.
- getSetHour = makeGetSet('Hours', true);
-
- function localeMeridiem(hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'pm' : 'PM';
- } else {
- return isLower ? 'am' : 'AM';
- }
- }
-
- var baseConfig = {
- calendar: defaultCalendar,
- longDateFormat: defaultLongDateFormat,
- invalidDate: defaultInvalidDate,
- ordinal: defaultOrdinal,
- dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
- relativeTime: defaultRelativeTime,
-
- months: defaultLocaleMonths,
- monthsShort: defaultLocaleMonthsShort,
-
- week: defaultLocaleWeek,
-
- weekdays: defaultLocaleWeekdays,
- weekdaysMin: defaultLocaleWeekdaysMin,
- weekdaysShort: defaultLocaleWeekdaysShort,
-
- meridiemParse: defaultLocaleMeridiemParse,
- };
-
- // internal storage for locale config files
- var locales = {},
- localeFamilies = {},
- globalLocale;
-
- function commonPrefix(arr1, arr2) {
- var i,
- minl = Math.min(arr1.length, arr2.length);
- for (i = 0; i < minl; i += 1) {
- if (arr1[i] !== arr2[i]) {
- return i;
- }
- }
- return minl;
- }
-
- function normalizeLocale(key) {
- return key ? key.toLowerCase().replace('_', '-') : key;
- }
-
- // pick the locale from the array
- // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
- // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
- function chooseLocale(names) {
- var i = 0,
- j,
- next,
- locale,
- split;
-
- while (i < names.length) {
- split = normalizeLocale(names[i]).split('-');
- j = split.length;
- next = normalizeLocale(names[i + 1]);
- next = next ? next.split('-') : null;
- while (j > 0) {
- locale = loadLocale(split.slice(0, j).join('-'));
- if (locale) {
- return locale;
- }
- if (
- next &&
- next.length >= j &&
- commonPrefix(split, next) >= j - 1
- ) {
- //the next array item is better than a shallower substring of this one
- break;
- }
- j--;
- }
- i++;
- }
- return globalLocale;
- }
-
- function loadLocale(name) {
- var oldLocale = null,
- aliasedRequire;
- // TODO: Find a better way to register and load all the locales in Node
- if (
- locales[name] === undefined &&
- 'object' !== 'undefined' &&
- module &&
- module.exports
- ) {
- try {
- oldLocale = globalLocale._abbr;
- aliasedRequire = commonjsRequire;
- aliasedRequire('./locale/' + name);
- getSetGlobalLocale(oldLocale);
- } catch (e) {
- // mark as not found to avoid repeating expensive file require call causing high CPU
- // when trying to find en-US, en_US, en-us for every format call
- locales[name] = null; // null means not found
- }
- }
- return locales[name];
- }
-
- // This function will load locale and then set the global locale. If
- // no arguments are passed in, it will simply return the current global
- // locale key.
- function getSetGlobalLocale(key, values) {
- var data;
- if (key) {
- if (isUndefined(values)) {
- data = getLocale(key);
- } else {
- data = defineLocale(key, values);
- }
-
- if (data) {
- // moment.duration._locale = moment._locale = data;
- globalLocale = data;
- } else {
- if (typeof console !== 'undefined' && console.warn) {
- //warn user if arguments are passed but the locale could not be set
- console.warn(
- 'Locale ' + key + ' not found. Did you forget to load it?'
- );
- }
- }
- }
-
- return globalLocale._abbr;
- }
-
- function defineLocale(name, config) {
- if (config !== null) {
- var locale,
- parentConfig = baseConfig;
- config.abbr = name;
- if (locales[name] != null) {
- deprecateSimple(
- 'defineLocaleOverride',
- 'use moment.updateLocale(localeName, config) to change ' +
- 'an existing locale. moment.defineLocale(localeName, ' +
- 'config) should only be used for creating a new locale ' +
- 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
- );
- parentConfig = locales[name]._config;
- } else if (config.parentLocale != null) {
- if (locales[config.parentLocale] != null) {
- parentConfig = locales[config.parentLocale]._config;
- } else {
- locale = loadLocale(config.parentLocale);
- if (locale != null) {
- parentConfig = locale._config;
- } else {
- if (!localeFamilies[config.parentLocale]) {
- localeFamilies[config.parentLocale] = [];
- }
- localeFamilies[config.parentLocale].push({
- name: name,
- config: config,
- });
- return null;
- }
- }
- }
- locales[name] = new Locale(mergeConfigs(parentConfig, config));
-
- if (localeFamilies[name]) {
- localeFamilies[name].forEach(function (x) {
- defineLocale(x.name, x.config);
- });
- }
-
- // backwards compat for now: also set the locale
- // make sure we set the locale AFTER all child locales have been
- // created, so we won't end up with the child locale set.
- getSetGlobalLocale(name);
-
- return locales[name];
- } else {
- // useful for testing
- delete locales[name];
- return null;
- }
- }
-
- function updateLocale(name, config) {
- if (config != null) {
- var locale,
- tmpLocale,
- parentConfig = baseConfig;
-
- if (locales[name] != null && locales[name].parentLocale != null) {
- // Update existing child locale in-place to avoid memory-leaks
- locales[name].set(mergeConfigs(locales[name]._config, config));
- } else {
- // MERGE
- tmpLocale = loadLocale(name);
- if (tmpLocale != null) {
- parentConfig = tmpLocale._config;
- }
- config = mergeConfigs(parentConfig, config);
- if (tmpLocale == null) {
- // updateLocale is called for creating a new locale
- // Set abbr so it will have a name (getters return
- // undefined otherwise).
- config.abbr = name;
- }
- locale = new Locale(config);
- locale.parentLocale = locales[name];
- locales[name] = locale;
- }
-
- // backwards compat for now: also set the locale
- getSetGlobalLocale(name);
- } else {
- // pass null for config to unupdate, useful for tests
- if (locales[name] != null) {
- if (locales[name].parentLocale != null) {
- locales[name] = locales[name].parentLocale;
- if (name === getSetGlobalLocale()) {
- getSetGlobalLocale(name);
- }
- } else if (locales[name] != null) {
- delete locales[name];
- }
- }
- }
- return locales[name];
- }
-
- // returns locale data
- function getLocale(key) {
- var locale;
-
- if (key && key._locale && key._locale._abbr) {
- key = key._locale._abbr;
- }
-
- if (!key) {
- return globalLocale;
- }
-
- if (!isArray(key)) {
- //short-circuit everything else
- locale = loadLocale(key);
- if (locale) {
- return locale;
- }
- key = [key];
- }
-
- return chooseLocale(key);
- }
-
- function listLocales() {
- return keys(locales);
- }
-
- function checkOverflow(m) {
- var overflow,
- a = m._a;
-
- if (a && getParsingFlags(m).overflow === -2) {
- overflow =
- a[MONTH] < 0 || a[MONTH] > 11
- ? MONTH
- : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
- ? DATE
- : a[HOUR] < 0 ||
- a[HOUR] > 24 ||
- (a[HOUR] === 24 &&
- (a[MINUTE] !== 0 ||
- a[SECOND] !== 0 ||
- a[MILLISECOND] !== 0))
- ? HOUR
- : a[MINUTE] < 0 || a[MINUTE] > 59
- ? MINUTE
- : a[SECOND] < 0 || a[SECOND] > 59
- ? SECOND
- : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
- ? MILLISECOND
- : -1;
-
- if (
- getParsingFlags(m)._overflowDayOfYear &&
- (overflow < YEAR || overflow > DATE)
- ) {
- overflow = DATE;
- }
- if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
- overflow = WEEK;
- }
- if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
- overflow = WEEKDAY;
- }
-
- getParsingFlags(m).overflow = overflow;
- }
-
- return m;
- }
-
- // iso 8601 regex
- // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
- var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
- basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
- tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
- isoDates = [
- ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
- ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
- ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
- ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
- ['YYYY-DDD', /\d{4}-\d{3}/],
- ['YYYY-MM', /\d{4}-\d\d/, false],
- ['YYYYYYMMDD', /[+-]\d{10}/],
- ['YYYYMMDD', /\d{8}/],
- ['GGGG[W]WWE', /\d{4}W\d{3}/],
- ['GGGG[W]WW', /\d{4}W\d{2}/, false],
- ['YYYYDDD', /\d{7}/],
- ['YYYYMM', /\d{6}/, false],
- ['YYYY', /\d{4}/, false],
- ],
- // iso time formats and regexes
- isoTimes = [
- ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
- ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
- ['HH:mm:ss', /\d\d:\d\d:\d\d/],
- ['HH:mm', /\d\d:\d\d/],
- ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
- ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
- ['HHmmss', /\d\d\d\d\d\d/],
- ['HHmm', /\d\d\d\d/],
- ['HH', /\d\d/],
- ],
- aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
- // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
- rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
- obsOffsets = {
- UT: 0,
- GMT: 0,
- EDT: -4 * 60,
- EST: -5 * 60,
- CDT: -5 * 60,
- CST: -6 * 60,
- MDT: -6 * 60,
- MST: -7 * 60,
- PDT: -7 * 60,
- PST: -8 * 60,
- };
-
- // date from iso format
- function configFromISO(config) {
- var i,
- l,
- string = config._i,
- match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
- allowTime,
- dateFormat,
- timeFormat,
- tzFormat;
-
- if (match) {
- getParsingFlags(config).iso = true;
-
- for (i = 0, l = isoDates.length; i < l; i++) {
- if (isoDates[i][1].exec(match[1])) {
- dateFormat = isoDates[i][0];
- allowTime = isoDates[i][2] !== false;
- break;
- }
- }
- if (dateFormat == null) {
- config._isValid = false;
- return;
- }
- if (match[3]) {
- for (i = 0, l = isoTimes.length; i < l; i++) {
- if (isoTimes[i][1].exec(match[3])) {
- // match[2] should be 'T' or space
- timeFormat = (match[2] || ' ') + isoTimes[i][0];
- break;
- }
- }
- if (timeFormat == null) {
- config._isValid = false;
- return;
- }
- }
- if (!allowTime && timeFormat != null) {
- config._isValid = false;
- return;
- }
- if (match[4]) {
- if (tzRegex.exec(match[4])) {
- tzFormat = 'Z';
- } else {
- config._isValid = false;
- return;
- }
- }
- config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
- configFromStringAndFormat(config);
- } else {
- config._isValid = false;
- }
- }
-
- function extractFromRFC2822Strings(
- yearStr,
- monthStr,
- dayStr,
- hourStr,
- minuteStr,
- secondStr
- ) {
- var result = [
- untruncateYear(yearStr),
- defaultLocaleMonthsShort.indexOf(monthStr),
- parseInt(dayStr, 10),
- parseInt(hourStr, 10),
- parseInt(minuteStr, 10),
- ];
-
- if (secondStr) {
- result.push(parseInt(secondStr, 10));
- }
-
- return result;
- }
-
- function untruncateYear(yearStr) {
- var year = parseInt(yearStr, 10);
- if (year <= 49) {
- return 2000 + year;
- } else if (year <= 999) {
- return 1900 + year;
- }
- return year;
- }
-
- function preprocessRFC2822(s) {
- // Remove comments and folding whitespace and replace multiple-spaces with a single space
- return s
- .replace(/\([^)]*\)|[\n\t]/g, ' ')
- .replace(/(\s\s+)/g, ' ')
- .replace(/^\s\s*/, '')
- .replace(/\s\s*$/, '');
- }
-
- function checkWeekday(weekdayStr, parsedInput, config) {
- if (weekdayStr) {
- // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
- var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
- weekdayActual = new Date(
- parsedInput[0],
- parsedInput[1],
- parsedInput[2]
- ).getDay();
- if (weekdayProvided !== weekdayActual) {
- getParsingFlags(config).weekdayMismatch = true;
- config._isValid = false;
- return false;
- }
- }
- return true;
- }
-
- function calculateOffset(obsOffset, militaryOffset, numOffset) {
- if (obsOffset) {
- return obsOffsets[obsOffset];
- } else if (militaryOffset) {
- // the only allowed military tz is Z
- return 0;
- } else {
- var hm = parseInt(numOffset, 10),
- m = hm % 100,
- h = (hm - m) / 100;
- return h * 60 + m;
- }
- }
-
- // date and time from ref 2822 format
- function configFromRFC2822(config) {
- var match = rfc2822.exec(preprocessRFC2822(config._i)),
- parsedArray;
- if (match) {
- parsedArray = extractFromRFC2822Strings(
- match[4],
- match[3],
- match[2],
- match[5],
- match[6],
- match[7]
- );
- if (!checkWeekday(match[1], parsedArray, config)) {
- return;
- }
-
- config._a = parsedArray;
- config._tzm = calculateOffset(match[8], match[9], match[10]);
-
- config._d = createUTCDate.apply(null, config._a);
- config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
-
- getParsingFlags(config).rfc2822 = true;
- } else {
- config._isValid = false;
- }
- }
-
- // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
- function configFromString(config) {
- var matched = aspNetJsonRegex.exec(config._i);
- if (matched !== null) {
- config._d = new Date(+matched[1]);
- return;
- }
-
- configFromISO(config);
- if (config._isValid === false) {
- delete config._isValid;
- } else {
- return;
- }
-
- configFromRFC2822(config);
- if (config._isValid === false) {
- delete config._isValid;
- } else {
- return;
- }
-
- if (config._strict) {
- config._isValid = false;
- } else {
- // Final attempt, use Input Fallback
- hooks.createFromInputFallback(config);
- }
- }
-
- hooks.createFromInputFallback = deprecate(
- 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
- 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
- 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
- function (config) {
- config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
- }
- );
-
- // Pick the first defined of two or three arguments.
- function defaults(a, b, c) {
- if (a != null) {
- return a;
- }
- if (b != null) {
- return b;
- }
- return c;
- }
-
- function currentDateArray(config) {
- // hooks is actually the exported moment object
- var nowValue = new Date(hooks.now());
- if (config._useUTC) {
- return [
- nowValue.getUTCFullYear(),
- nowValue.getUTCMonth(),
- nowValue.getUTCDate(),
- ];
- }
- return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
- }
-
- // convert an array to a date.
- // the array should mirror the parameters below
- // note: all values past the year are optional and will default to the lowest possible value.
- // [year, month, day , hour, minute, second, millisecond]
- function configFromArray(config) {
- var i,
- date,
- input = [],
- currentDate,
- expectedWeekday,
- yearToUse;
-
- if (config._d) {
- return;
- }
-
- currentDate = currentDateArray(config);
-
- //compute day of the year from weeks and weekdays
- if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
- dayOfYearFromWeekInfo(config);
- }
-
- //if the day of the year is set, figure out what it is
- if (config._dayOfYear != null) {
- yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
-
- if (
- config._dayOfYear > daysInYear(yearToUse) ||
- config._dayOfYear === 0
- ) {
- getParsingFlags(config)._overflowDayOfYear = true;
- }
-
- date = createUTCDate(yearToUse, 0, config._dayOfYear);
- config._a[MONTH] = date.getUTCMonth();
- config._a[DATE] = date.getUTCDate();
- }
-
- // Default to current date.
- // * if no year, month, day of month are given, default to today
- // * if day of month is given, default month and year
- // * if month is given, default only year
- // * if year is given, don't default anything
- for (i = 0; i < 3 && config._a[i] == null; ++i) {
- config._a[i] = input[i] = currentDate[i];
- }
-
- // Zero out whatever was not defaulted, including time
- for (; i < 7; i++) {
- config._a[i] = input[i] =
- config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
- }
-
- // Check for 24:00:00.000
- if (
- config._a[HOUR] === 24 &&
- config._a[MINUTE] === 0 &&
- config._a[SECOND] === 0 &&
- config._a[MILLISECOND] === 0
- ) {
- config._nextDay = true;
- config._a[HOUR] = 0;
- }
-
- config._d = (config._useUTC ? createUTCDate : createDate).apply(
- null,
- input
- );
- expectedWeekday = config._useUTC
- ? config._d.getUTCDay()
- : config._d.getDay();
-
- // Apply timezone offset from input. The actual utcOffset can be changed
- // with parseZone.
- if (config._tzm != null) {
- config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
- }
-
- if (config._nextDay) {
- config._a[HOUR] = 24;
- }
-
- // check for mismatching day of week
- if (
- config._w &&
- typeof config._w.d !== 'undefined' &&
- config._w.d !== expectedWeekday
- ) {
- getParsingFlags(config).weekdayMismatch = true;
- }
- }
-
- function dayOfYearFromWeekInfo(config) {
- var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
-
- w = config._w;
- if (w.GG != null || w.W != null || w.E != null) {
- dow = 1;
- doy = 4;
-
- // TODO: We need to take the current isoWeekYear, but that depends on
- // how we interpret now (local, utc, fixed offset). So create
- // a now version of current config (take local/utc/offset flags, and
- // create now).
- weekYear = defaults(
- w.GG,
- config._a[YEAR],
- weekOfYear(createLocal(), 1, 4).year
- );
- week = defaults(w.W, 1);
- weekday = defaults(w.E, 1);
- if (weekday < 1 || weekday > 7) {
- weekdayOverflow = true;
- }
- } else {
- dow = config._locale._week.dow;
- doy = config._locale._week.doy;
-
- curWeek = weekOfYear(createLocal(), dow, doy);
-
- weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
-
- // Default to current week.
- week = defaults(w.w, curWeek.week);
-
- if (w.d != null) {
- // weekday -- low day numbers are considered next week
- weekday = w.d;
- if (weekday < 0 || weekday > 6) {
- weekdayOverflow = true;
- }
- } else if (w.e != null) {
- // local weekday -- counting starts from beginning of week
- weekday = w.e + dow;
- if (w.e < 0 || w.e > 6) {
- weekdayOverflow = true;
- }
- } else {
- // default to beginning of week
- weekday = dow;
- }
- }
- if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
- getParsingFlags(config)._overflowWeeks = true;
- } else if (weekdayOverflow != null) {
- getParsingFlags(config)._overflowWeekday = true;
- } else {
- temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
- config._a[YEAR] = temp.year;
- config._dayOfYear = temp.dayOfYear;
- }
- }
-
- // constant that refers to the ISO standard
- hooks.ISO_8601 = function () {};
-
- // constant that refers to the RFC 2822 form
- hooks.RFC_2822 = function () {};
-
- // date from string and format string
- function configFromStringAndFormat(config) {
- // TODO: Move this to another part of the creation flow to prevent circular deps
- if (config._f === hooks.ISO_8601) {
- configFromISO(config);
- return;
- }
- if (config._f === hooks.RFC_2822) {
- configFromRFC2822(config);
- return;
- }
- config._a = [];
- getParsingFlags(config).empty = true;
-
- // This array is used to make a Date, either with `new Date` or `Date.UTC`
- var string = '' + config._i,
- i,
- parsedInput,
- tokens,
- token,
- skipped,
- stringLength = string.length,
- totalParsedInputLength = 0,
- era;
-
- tokens =
- expandFormat(config._f, config._locale).match(formattingTokens) || [];
-
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- parsedInput = (string.match(getParseRegexForToken(token, config)) ||
- [])[0];
- if (parsedInput) {
- skipped = string.substr(0, string.indexOf(parsedInput));
- if (skipped.length > 0) {
- getParsingFlags(config).unusedInput.push(skipped);
- }
- string = string.slice(
- string.indexOf(parsedInput) + parsedInput.length
- );
- totalParsedInputLength += parsedInput.length;
- }
- // don't parse if it's not a known token
- if (formatTokenFunctions[token]) {
- if (parsedInput) {
- getParsingFlags(config).empty = false;
- } else {
- getParsingFlags(config).unusedTokens.push(token);
- }
- addTimeToArrayFromToken(token, parsedInput, config);
- } else if (config._strict && !parsedInput) {
- getParsingFlags(config).unusedTokens.push(token);
- }
- }
-
- // add remaining unparsed input length to the string
- getParsingFlags(config).charsLeftOver =
- stringLength - totalParsedInputLength;
- if (string.length > 0) {
- getParsingFlags(config).unusedInput.push(string);
- }
-
- // clear _12h flag if hour is <= 12
- if (
- config._a[HOUR] <= 12 &&
- getParsingFlags(config).bigHour === true &&
- config._a[HOUR] > 0
- ) {
- getParsingFlags(config).bigHour = undefined;
- }
-
- getParsingFlags(config).parsedDateParts = config._a.slice(0);
- getParsingFlags(config).meridiem = config._meridiem;
- // handle meridiem
- config._a[HOUR] = meridiemFixWrap(
- config._locale,
- config._a[HOUR],
- config._meridiem
- );
-
- // handle era
- era = getParsingFlags(config).era;
- if (era !== null) {
- config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
- }
-
- configFromArray(config);
- checkOverflow(config);
- }
-
- function meridiemFixWrap(locale, hour, meridiem) {
- var isPm;
-
- if (meridiem == null) {
- // nothing to do
- return hour;
- }
- if (locale.meridiemHour != null) {
- return locale.meridiemHour(hour, meridiem);
- } else if (locale.isPM != null) {
- // Fallback
- isPm = locale.isPM(meridiem);
- if (isPm && hour < 12) {
- hour += 12;
- }
- if (!isPm && hour === 12) {
- hour = 0;
- }
- return hour;
- } else {
- // this is not supposed to happen
- return hour;
- }
- }
-
- // date from string and array of format strings
- function configFromStringAndArray(config) {
- var tempConfig,
- bestMoment,
- scoreToBeat,
- i,
- currentScore,
- validFormatFound,
- bestFormatIsValid = false;
-
- if (config._f.length === 0) {
- getParsingFlags(config).invalidFormat = true;
- config._d = new Date(NaN);
- return;
- }
-
- for (i = 0; i < config._f.length; i++) {
- currentScore = 0;
- validFormatFound = false;
- tempConfig = copyConfig({}, config);
- if (config._useUTC != null) {
- tempConfig._useUTC = config._useUTC;
- }
- tempConfig._f = config._f[i];
- configFromStringAndFormat(tempConfig);
-
- if (isValid(tempConfig)) {
- validFormatFound = true;
- }
-
- // if there is any input that was not parsed add a penalty for that format
- currentScore += getParsingFlags(tempConfig).charsLeftOver;
-
- //or tokens
- currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
-
- getParsingFlags(tempConfig).score = currentScore;
-
- if (!bestFormatIsValid) {
- if (
- scoreToBeat == null ||
- currentScore < scoreToBeat ||
- validFormatFound
- ) {
- scoreToBeat = currentScore;
- bestMoment = tempConfig;
- if (validFormatFound) {
- bestFormatIsValid = true;
- }
- }
- } else {
- if (currentScore < scoreToBeat) {
- scoreToBeat = currentScore;
- bestMoment = tempConfig;
- }
- }
- }
-
- extend(config, bestMoment || tempConfig);
- }
-
- function configFromObject(config) {
- if (config._d) {
- return;
- }
-
- var i = normalizeObjectUnits(config._i),
- dayOrDate = i.day === undefined ? i.date : i.day;
- config._a = map(
- [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
- function (obj) {
- return obj && parseInt(obj, 10);
- }
- );
-
- configFromArray(config);
- }
-
- function createFromConfig(config) {
- var res = new Moment(checkOverflow(prepareConfig(config)));
- if (res._nextDay) {
- // Adding is smart enough around DST
- res.add(1, 'd');
- res._nextDay = undefined;
- }
-
- return res;
- }
-
- function prepareConfig(config) {
- var input = config._i,
- format = config._f;
-
- config._locale = config._locale || getLocale(config._l);
-
- if (input === null || (format === undefined && input === '')) {
- return createInvalid({ nullInput: true });
- }
-
- if (typeof input === 'string') {
- config._i = input = config._locale.preparse(input);
- }
-
- if (isMoment(input)) {
- return new Moment(checkOverflow(input));
- } else if (isDate(input)) {
- config._d = input;
- } else if (isArray(format)) {
- configFromStringAndArray(config);
- } else if (format) {
- configFromStringAndFormat(config);
- } else {
- configFromInput(config);
- }
-
- if (!isValid(config)) {
- config._d = null;
- }
-
- return config;
- }
-
- function configFromInput(config) {
- var input = config._i;
- if (isUndefined(input)) {
- config._d = new Date(hooks.now());
- } else if (isDate(input)) {
- config._d = new Date(input.valueOf());
- } else if (typeof input === 'string') {
- configFromString(config);
- } else if (isArray(input)) {
- config._a = map(input.slice(0), function (obj) {
- return parseInt(obj, 10);
- });
- configFromArray(config);
- } else if (isObject(input)) {
- configFromObject(config);
- } else if (isNumber(input)) {
- // from milliseconds
- config._d = new Date(input);
- } else {
- hooks.createFromInputFallback(config);
- }
- }
-
- function createLocalOrUTC(input, format, locale, strict, isUTC) {
- var c = {};
-
- if (format === true || format === false) {
- strict = format;
- format = undefined;
- }
-
- if (locale === true || locale === false) {
- strict = locale;
- locale = undefined;
- }
-
- if (
- (isObject(input) && isObjectEmpty(input)) ||
- (isArray(input) && input.length === 0)
- ) {
- input = undefined;
- }
- // object construction must be done this way.
- // https://github.com/moment/moment/issues/1423
- c._isAMomentObject = true;
- c._useUTC = c._isUTC = isUTC;
- c._l = locale;
- c._i = input;
- c._f = format;
- c._strict = strict;
-
- return createFromConfig(c);
- }
-
- function createLocal(input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, false);
- }
-
- var prototypeMin = deprecate(
- 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
- function () {
- var other = createLocal.apply(null, arguments);
- if (this.isValid() && other.isValid()) {
- return other < this ? this : other;
- } else {
- return createInvalid();
- }
- }
- ),
- prototypeMax = deprecate(
- 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
- function () {
- var other = createLocal.apply(null, arguments);
- if (this.isValid() && other.isValid()) {
- return other > this ? this : other;
- } else {
- return createInvalid();
- }
- }
- );
-
- // Pick a moment m from moments so that m[fn](other) is true for all
- // other. This relies on the function fn to be transitive.
- //
- // moments should either be an array of moment objects or an array, whose
- // first element is an array of moment objects.
- function pickBy(fn, moments) {
- var res, i;
- if (moments.length === 1 && isArray(moments[0])) {
- moments = moments[0];
- }
- if (!moments.length) {
- return createLocal();
- }
- res = moments[0];
- for (i = 1; i < moments.length; ++i) {
- if (!moments[i].isValid() || moments[i][fn](res)) {
- res = moments[i];
- }
- }
- return res;
- }
-
- // TODO: Use [].sort instead?
- function min() {
- var args = [].slice.call(arguments, 0);
-
- return pickBy('isBefore', args);
- }
-
- function max() {
- var args = [].slice.call(arguments, 0);
-
- return pickBy('isAfter', args);
- }
-
- var now = function () {
- return Date.now ? Date.now() : +new Date();
- };
-
- var ordering = [
- 'year',
- 'quarter',
- 'month',
- 'week',
- 'day',
- 'hour',
- 'minute',
- 'second',
- 'millisecond',
- ];
-
- function isDurationValid(m) {
- var key,
- unitHasDecimal = false,
- i;
- for (key in m) {
- if (
- hasOwnProp(m, key) &&
- !(
- indexOf.call(ordering, key) !== -1 &&
- (m[key] == null || !isNaN(m[key]))
- )
- ) {
- return false;
- }
- }
-
- for (i = 0; i < ordering.length; ++i) {
- if (m[ordering[i]]) {
- if (unitHasDecimal) {
- return false; // only allow non-integers for smallest unit
- }
- if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
- unitHasDecimal = true;
- }
- }
- }
-
- return true;
- }
-
- function isValid$1() {
- return this._isValid;
- }
-
- function createInvalid$1() {
- return createDuration(NaN);
- }
-
- function Duration(duration) {
- var normalizedInput = normalizeObjectUnits(duration),
- years = normalizedInput.year || 0,
- quarters = normalizedInput.quarter || 0,
- months = normalizedInput.month || 0,
- weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
- days = normalizedInput.day || 0,
- hours = normalizedInput.hour || 0,
- minutes = normalizedInput.minute || 0,
- seconds = normalizedInput.second || 0,
- milliseconds = normalizedInput.millisecond || 0;
-
- this._isValid = isDurationValid(normalizedInput);
-
- // representation for dateAddRemove
- this._milliseconds =
- +milliseconds +
- seconds * 1e3 + // 1000
- minutes * 6e4 + // 1000 * 60
- hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
- // Because of dateAddRemove treats 24 hours as different from a
- // day when working around DST, we need to store them separately
- this._days = +days + weeks * 7;
- // It is impossible to translate months into days without knowing
- // which months you are are talking about, so we have to store
- // it separately.
- this._months = +months + quarters * 3 + years * 12;
-
- this._data = {};
-
- this._locale = getLocale();
-
- this._bubble();
- }
-
- function isDuration(obj) {
- return obj instanceof Duration;
- }
-
- function absRound(number) {
- if (number < 0) {
- return Math.round(-1 * number) * -1;
- } else {
- return Math.round(number);
- }
- }
-
- // compare two arrays, return the number of differences
- function compareArrays(array1, array2, dontConvert) {
- var len = Math.min(array1.length, array2.length),
- lengthDiff = Math.abs(array1.length - array2.length),
- diffs = 0,
- i;
- for (i = 0; i < len; i++) {
- if (
- (dontConvert && array1[i] !== array2[i]) ||
- (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
- ) {
- diffs++;
- }
- }
- return diffs + lengthDiff;
- }
-
- // FORMATTING
-
- function offset(token, separator) {
- addFormatToken(token, 0, 0, function () {
- var offset = this.utcOffset(),
- sign = '+';
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- }
- return (
- sign +
- zeroFill(~~(offset / 60), 2) +
- separator +
- zeroFill(~~offset % 60, 2)
- );
- });
- }
-
- offset('Z', ':');
- offset('ZZ', '');
-
- // PARSING
-
- addRegexToken('Z', matchShortOffset);
- addRegexToken('ZZ', matchShortOffset);
- addParseToken(['Z', 'ZZ'], function (input, array, config) {
- config._useUTC = true;
- config._tzm = offsetFromString(matchShortOffset, input);
- });
-
- // HELPERS
-
- // timezone chunker
- // '+10:00' > ['10', '00']
- // '-1530' > ['-15', '30']
- var chunkOffset = /([\+\-]|\d\d)/gi;
-
- function offsetFromString(matcher, string) {
- var matches = (string || '').match(matcher),
- chunk,
- parts,
- minutes;
-
- if (matches === null) {
- return null;
- }
-
- chunk = matches[matches.length - 1] || [];
- parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
- minutes = +(parts[1] * 60) + toInt(parts[2]);
-
- return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
- }
-
- // Return a moment from input, that is local/utc/zone equivalent to model.
- function cloneWithOffset(input, model) {
- var res, diff;
- if (model._isUTC) {
- res = model.clone();
- diff =
- (isMoment(input) || isDate(input)
- ? input.valueOf()
- : createLocal(input).valueOf()) - res.valueOf();
- // Use low-level api, because this fn is low-level api.
- res._d.setTime(res._d.valueOf() + diff);
- hooks.updateOffset(res, false);
- return res;
- } else {
- return createLocal(input).local();
- }
- }
-
- function getDateOffset(m) {
- // On Firefox.24 Date#getTimezoneOffset returns a floating point.
- // https://github.com/moment/moment/pull/1871
- return -Math.round(m._d.getTimezoneOffset());
- }
-
- // HOOKS
-
- // This function will be called whenever a moment is mutated.
- // It is intended to keep the offset in sync with the timezone.
- hooks.updateOffset = function () {};
-
- // MOMENTS
-
- // keepLocalTime = true means only change the timezone, without
- // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
- // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
- // +0200, so we adjust the time as needed, to be valid.
- //
- // Keeping the time actually adds/subtracts (one hour)
- // from the actual represented time. That is why we call updateOffset
- // a second time. In case it wants us to change the offset again
- // _changeInProgress == true case, then we have to adjust, because
- // there is no such time in the given timezone.
- function getSetOffset(input, keepLocalTime, keepMinutes) {
- var offset = this._offset || 0,
- localAdjust;
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- if (input != null) {
- if (typeof input === 'string') {
- input = offsetFromString(matchShortOffset, input);
- if (input === null) {
- return this;
- }
- } else if (Math.abs(input) < 16 && !keepMinutes) {
- input = input * 60;
- }
- if (!this._isUTC && keepLocalTime) {
- localAdjust = getDateOffset(this);
- }
- this._offset = input;
- this._isUTC = true;
- if (localAdjust != null) {
- this.add(localAdjust, 'm');
- }
- if (offset !== input) {
- if (!keepLocalTime || this._changeInProgress) {
- addSubtract(
- this,
- createDuration(input - offset, 'm'),
- 1,
- false
- );
- } else if (!this._changeInProgress) {
- this._changeInProgress = true;
- hooks.updateOffset(this, true);
- this._changeInProgress = null;
- }
- }
- return this;
- } else {
- return this._isUTC ? offset : getDateOffset(this);
- }
- }
-
- function getSetZone(input, keepLocalTime) {
- if (input != null) {
- if (typeof input !== 'string') {
- input = -input;
- }
-
- this.utcOffset(input, keepLocalTime);
-
- return this;
- } else {
- return -this.utcOffset();
- }
- }
-
- function setOffsetToUTC(keepLocalTime) {
- return this.utcOffset(0, keepLocalTime);
- }
-
- function setOffsetToLocal(keepLocalTime) {
- if (this._isUTC) {
- this.utcOffset(0, keepLocalTime);
- this._isUTC = false;
-
- if (keepLocalTime) {
- this.subtract(getDateOffset(this), 'm');
- }
- }
- return this;
- }
-
- function setOffsetToParsedOffset() {
- if (this._tzm != null) {
- this.utcOffset(this._tzm, false, true);
- } else if (typeof this._i === 'string') {
- var tZone = offsetFromString(matchOffset, this._i);
- if (tZone != null) {
- this.utcOffset(tZone);
- } else {
- this.utcOffset(0, true);
- }
- }
- return this;
- }
-
- function hasAlignedHourOffset(input) {
- if (!this.isValid()) {
- return false;
- }
- input = input ? createLocal(input).utcOffset() : 0;
-
- return (this.utcOffset() - input) % 60 === 0;
- }
-
- function isDaylightSavingTime() {
- return (
- this.utcOffset() > this.clone().month(0).utcOffset() ||
- this.utcOffset() > this.clone().month(5).utcOffset()
- );
- }
-
- function isDaylightSavingTimeShifted() {
- if (!isUndefined(this._isDSTShifted)) {
- return this._isDSTShifted;
- }
-
- var c = {},
- other;
-
- copyConfig(c, this);
- c = prepareConfig(c);
-
- if (c._a) {
- other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
- this._isDSTShifted =
- this.isValid() && compareArrays(c._a, other.toArray()) > 0;
- } else {
- this._isDSTShifted = false;
- }
-
- return this._isDSTShifted;
- }
-
- function isLocal() {
- return this.isValid() ? !this._isUTC : false;
- }
-
- function isUtcOffset() {
- return this.isValid() ? this._isUTC : false;
- }
-
- function isUtc() {
- return this.isValid() ? this._isUTC && this._offset === 0 : false;
- }
-
- // ASP.NET json date format regex
- var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
- // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
- // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
- // and further modified to allow for strings containing both week and day
- isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
-
- function createDuration(input, key) {
- var duration = input,
- // matching against regexp is expensive, do it on demand
- match = null,
- sign,
- ret,
- diffRes;
-
- if (isDuration(input)) {
- duration = {
- ms: input._milliseconds,
- d: input._days,
- M: input._months,
- };
- } else if (isNumber(input) || !isNaN(+input)) {
- duration = {};
- if (key) {
- duration[key] = +input;
- } else {
- duration.milliseconds = +input;
- }
- } else if ((match = aspNetRegex.exec(input))) {
- sign = match[1] === '-' ? -1 : 1;
- duration = {
- y: 0,
- d: toInt(match[DATE]) * sign,
- h: toInt(match[HOUR]) * sign,
- m: toInt(match[MINUTE]) * sign,
- s: toInt(match[SECOND]) * sign,
- ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
- };
- } else if ((match = isoRegex.exec(input))) {
- sign = match[1] === '-' ? -1 : 1;
- duration = {
- y: parseIso(match[2], sign),
- M: parseIso(match[3], sign),
- w: parseIso(match[4], sign),
- d: parseIso(match[5], sign),
- h: parseIso(match[6], sign),
- m: parseIso(match[7], sign),
- s: parseIso(match[8], sign),
- };
- } else if (duration == null) {
- // checks for null or undefined
- duration = {};
- } else if (
- typeof duration === 'object' &&
- ('from' in duration || 'to' in duration)
- ) {
- diffRes = momentsDifference(
- createLocal(duration.from),
- createLocal(duration.to)
- );
-
- duration = {};
- duration.ms = diffRes.milliseconds;
- duration.M = diffRes.months;
- }
-
- ret = new Duration(duration);
-
- if (isDuration(input) && hasOwnProp(input, '_locale')) {
- ret._locale = input._locale;
- }
-
- if (isDuration(input) && hasOwnProp(input, '_isValid')) {
- ret._isValid = input._isValid;
- }
-
- return ret;
- }
-
- createDuration.fn = Duration.prototype;
- createDuration.invalid = createInvalid$1;
-
- function parseIso(inp, sign) {
- // We'd normally use ~~inp for this, but unfortunately it also
- // converts floats to ints.
- // inp may be undefined, so careful calling replace on it.
- var res = inp && parseFloat(inp.replace(',', '.'));
- // apply sign while we're at it
- return (isNaN(res) ? 0 : res) * sign;
- }
-
- function positiveMomentsDifference(base, other) {
- var res = {};
-
- res.months =
- other.month() - base.month() + (other.year() - base.year()) * 12;
- if (base.clone().add(res.months, 'M').isAfter(other)) {
- --res.months;
- }
-
- res.milliseconds = +other - +base.clone().add(res.months, 'M');
-
- return res;
- }
-
- function momentsDifference(base, other) {
- var res;
- if (!(base.isValid() && other.isValid())) {
- return { milliseconds: 0, months: 0 };
- }
-
- other = cloneWithOffset(other, base);
- if (base.isBefore(other)) {
- res = positiveMomentsDifference(base, other);
- } else {
- res = positiveMomentsDifference(other, base);
- res.milliseconds = -res.milliseconds;
- res.months = -res.months;
- }
-
- return res;
- }
-
- // TODO: remove 'name' arg after deprecation is removed
- function createAdder(direction, name) {
- return function (val, period) {
- var dur, tmp;
- //invert the arguments, but complain about it
- if (period !== null && !isNaN(+period)) {
- deprecateSimple(
- name,
- 'moment().' +
- name +
- '(period, number) is deprecated. Please use moment().' +
- name +
- '(number, period). ' +
- 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
- );
- tmp = val;
- val = period;
- period = tmp;
- }
-
- dur = createDuration(val, period);
- addSubtract(this, dur, direction);
- return this;
- };
- }
-
- function addSubtract(mom, duration, isAdding, updateOffset) {
- var milliseconds = duration._milliseconds,
- days = absRound(duration._days),
- months = absRound(duration._months);
-
- if (!mom.isValid()) {
- // No op
- return;
- }
-
- updateOffset = updateOffset == null ? true : updateOffset;
-
- if (months) {
- setMonth(mom, get(mom, 'Month') + months * isAdding);
- }
- if (days) {
- set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
- }
- if (milliseconds) {
- mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
- }
- if (updateOffset) {
- hooks.updateOffset(mom, days || months);
- }
- }
-
- var add = createAdder(1, 'add'),
- subtract = createAdder(-1, 'subtract');
-
- function isString(input) {
- return typeof input === 'string' || input instanceof String;
- }
-
- // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
- function isMomentInput(input) {
- return (
- isMoment(input) ||
- isDate(input) ||
- isString(input) ||
- isNumber(input) ||
- isNumberOrStringArray(input) ||
- isMomentInputObject(input) ||
- input === null ||
- input === undefined
- );
- }
-
- function isMomentInputObject(input) {
- var objectTest = isObject(input) && !isObjectEmpty(input),
- propertyTest = false,
- properties = [
- 'years',
- 'year',
- 'y',
- 'months',
- 'month',
- 'M',
- 'days',
- 'day',
- 'd',
- 'dates',
- 'date',
- 'D',
- 'hours',
- 'hour',
- 'h',
- 'minutes',
- 'minute',
- 'm',
- 'seconds',
- 'second',
- 's',
- 'milliseconds',
- 'millisecond',
- 'ms',
- ],
- i,
- property;
-
- for (i = 0; i < properties.length; i += 1) {
- property = properties[i];
- propertyTest = propertyTest || hasOwnProp(input, property);
- }
-
- return objectTest && propertyTest;
- }
-
- function isNumberOrStringArray(input) {
- var arrayTest = isArray(input),
- dataTypeTest = false;
- if (arrayTest) {
- dataTypeTest =
- input.filter(function (item) {
- return !isNumber(item) && isString(input);
- }).length === 0;
- }
- return arrayTest && dataTypeTest;
- }
-
- function isCalendarSpec(input) {
- var objectTest = isObject(input) && !isObjectEmpty(input),
- propertyTest = false,
- properties = [
- 'sameDay',
- 'nextDay',
- 'lastDay',
- 'nextWeek',
- 'lastWeek',
- 'sameElse',
- ],
- i,
- property;
-
- for (i = 0; i < properties.length; i += 1) {
- property = properties[i];
- propertyTest = propertyTest || hasOwnProp(input, property);
- }
-
- return objectTest && propertyTest;
- }
-
- function getCalendarFormat(myMoment, now) {
- var diff = myMoment.diff(now, 'days', true);
- return diff < -6
- ? 'sameElse'
- : diff < -1
- ? 'lastWeek'
- : diff < 0
- ? 'lastDay'
- : diff < 1
- ? 'sameDay'
- : diff < 2
- ? 'nextDay'
- : diff < 7
- ? 'nextWeek'
- : 'sameElse';
- }
-
- function calendar$1(time, formats) {
- // Support for single parameter, formats only overload to the calendar function
- if (arguments.length === 1) {
- if (!arguments[0]) {
- time = undefined;
- formats = undefined;
- } else if (isMomentInput(arguments[0])) {
- time = arguments[0];
- formats = undefined;
- } else if (isCalendarSpec(arguments[0])) {
- formats = arguments[0];
- time = undefined;
- }
- }
- // We want to compare the start of today, vs this.
- // Getting start-of-today depends on whether we're local/utc/offset or not.
- var now = time || createLocal(),
- sod = cloneWithOffset(now, this).startOf('day'),
- format = hooks.calendarFormat(this, sod) || 'sameElse',
- output =
- formats &&
- (isFunction(formats[format])
- ? formats[format].call(this, now)
- : formats[format]);
-
- return this.format(
- output || this.localeData().calendar(format, this, createLocal(now))
- );
- }
-
- function clone() {
- return new Moment(this);
- }
-
- function isAfter(input, units) {
- var localInput = isMoment(input) ? input : createLocal(input);
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() > localInput.valueOf();
- } else {
- return localInput.valueOf() < this.clone().startOf(units).valueOf();
- }
- }
-
- function isBefore(input, units) {
- var localInput = isMoment(input) ? input : createLocal(input);
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() < localInput.valueOf();
- } else {
- return this.clone().endOf(units).valueOf() < localInput.valueOf();
- }
- }
-
- function isBetween(from, to, units, inclusivity) {
- var localFrom = isMoment(from) ? from : createLocal(from),
- localTo = isMoment(to) ? to : createLocal(to);
- if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
- return false;
- }
- inclusivity = inclusivity || '()';
- return (
- (inclusivity[0] === '('
- ? this.isAfter(localFrom, units)
- : !this.isBefore(localFrom, units)) &&
- (inclusivity[1] === ')'
- ? this.isBefore(localTo, units)
- : !this.isAfter(localTo, units))
- );
- }
-
- function isSame(input, units) {
- var localInput = isMoment(input) ? input : createLocal(input),
- inputMs;
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() === localInput.valueOf();
- } else {
- inputMs = localInput.valueOf();
- return (
- this.clone().startOf(units).valueOf() <= inputMs &&
- inputMs <= this.clone().endOf(units).valueOf()
- );
- }
- }
-
- function isSameOrAfter(input, units) {
- return this.isSame(input, units) || this.isAfter(input, units);
- }
-
- function isSameOrBefore(input, units) {
- return this.isSame(input, units) || this.isBefore(input, units);
- }
-
- function diff(input, units, asFloat) {
- var that, zoneDelta, output;
-
- if (!this.isValid()) {
- return NaN;
- }
-
- that = cloneWithOffset(input, this);
-
- if (!that.isValid()) {
- return NaN;
- }
-
- zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
-
- units = normalizeUnits(units);
-
- switch (units) {
- case 'year':
- output = monthDiff(this, that) / 12;
- break;
- case 'month':
- output = monthDiff(this, that);
- break;
- case 'quarter':
- output = monthDiff(this, that) / 3;
- break;
- case 'second':
- output = (this - that) / 1e3;
- break; // 1000
- case 'minute':
- output = (this - that) / 6e4;
- break; // 1000 * 60
- case 'hour':
- output = (this - that) / 36e5;
- break; // 1000 * 60 * 60
- case 'day':
- output = (this - that - zoneDelta) / 864e5;
- break; // 1000 * 60 * 60 * 24, negate dst
- case 'week':
- output = (this - that - zoneDelta) / 6048e5;
- break; // 1000 * 60 * 60 * 24 * 7, negate dst
- default:
- output = this - that;
- }
-
- return asFloat ? output : absFloor(output);
- }
-
- function monthDiff(a, b) {
- if (a.date() < b.date()) {
- // end-of-month calculations work correct when the start month has more
- // days than the end month.
- return -monthDiff(b, a);
- }
- // difference in months
- var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
- // b is in (anchor - 1 month, anchor + 1 month)
- anchor = a.clone().add(wholeMonthDiff, 'months'),
- anchor2,
- adjust;
-
- if (b - anchor < 0) {
- anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
- // linear across the month
- adjust = (b - anchor) / (anchor - anchor2);
- } else {
- anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
- // linear across the month
- adjust = (b - anchor) / (anchor2 - anchor);
- }
-
- //check for negative zero, return zero if negative zero
- return -(wholeMonthDiff + adjust) || 0;
- }
-
- hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
- hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
-
- function toString() {
- return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
- }
-
- function toISOString(keepOffset) {
- if (!this.isValid()) {
- return null;
- }
- var utc = keepOffset !== true,
- m = utc ? this.clone().utc() : this;
- if (m.year() < 0 || m.year() > 9999) {
- return formatMoment(
- m,
- utc
- ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
- : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
- );
- }
- if (isFunction(Date.prototype.toISOString)) {
- // native implementation is ~50x faster, use it when we can
- if (utc) {
- return this.toDate().toISOString();
- } else {
- return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
- .toISOString()
- .replace('Z', formatMoment(m, 'Z'));
- }
- }
- return formatMoment(
- m,
- utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
- );
- }
-
- /**
- * Return a human readable representation of a moment that can
- * also be evaluated to get a new moment which is the same
- *
- * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
- */
- function inspect() {
- if (!this.isValid()) {
- return 'moment.invalid(/* ' + this._i + ' */)';
- }
- var func = 'moment',
- zone = '',
- prefix,
- year,
- datetime,
- suffix;
- if (!this.isLocal()) {
- func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
- zone = 'Z';
- }
- prefix = '[' + func + '("]';
- year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
- datetime = '-MM-DD[T]HH:mm:ss.SSS';
- suffix = zone + '[")]';
-
- return this.format(prefix + year + datetime + suffix);
- }
-
- function format(inputString) {
- if (!inputString) {
- inputString = this.isUtc()
- ? hooks.defaultFormatUtc
- : hooks.defaultFormat;
- }
- var output = formatMoment(this, inputString);
- return this.localeData().postformat(output);
- }
-
- function from(time, withoutSuffix) {
- if (
- this.isValid() &&
- ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
- ) {
- return createDuration({ to: this, from: time })
- .locale(this.locale())
- .humanize(!withoutSuffix);
- } else {
- return this.localeData().invalidDate();
- }
- }
-
- function fromNow(withoutSuffix) {
- return this.from(createLocal(), withoutSuffix);
- }
-
- function to(time, withoutSuffix) {
- if (
- this.isValid() &&
- ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
- ) {
- return createDuration({ from: this, to: time })
- .locale(this.locale())
- .humanize(!withoutSuffix);
- } else {
- return this.localeData().invalidDate();
- }
- }
-
- function toNow(withoutSuffix) {
- return this.to(createLocal(), withoutSuffix);
- }
-
- // If passed a locale key, it will set the locale for this
- // instance. Otherwise, it will return the locale configuration
- // variables for this instance.
- function locale(key) {
- var newLocaleData;
-
- if (key === undefined) {
- return this._locale._abbr;
- } else {
- newLocaleData = getLocale(key);
- if (newLocaleData != null) {
- this._locale = newLocaleData;
- }
- return this;
- }
- }
-
- var lang = deprecate(
- 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
- function (key) {
- if (key === undefined) {
- return this.localeData();
- } else {
- return this.locale(key);
- }
- }
- );
-
- function localeData() {
- return this._locale;
- }
-
- var MS_PER_SECOND = 1000,
- MS_PER_MINUTE = 60 * MS_PER_SECOND,
- MS_PER_HOUR = 60 * MS_PER_MINUTE,
- MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
-
- // actual modulo - handles negative numbers (for dates before 1970):
- function mod$1(dividend, divisor) {
- return ((dividend % divisor) + divisor) % divisor;
- }
-
- function localStartOfDate(y, m, d) {
- // the date constructor remaps years 0-99 to 1900-1999
- if (y < 100 && y >= 0) {
- // preserve leap years using a full 400 year cycle, then reset
- return new Date(y + 400, m, d) - MS_PER_400_YEARS;
- } else {
- return new Date(y, m, d).valueOf();
- }
- }
-
- function utcStartOfDate(y, m, d) {
- // Date.UTC remaps years 0-99 to 1900-1999
- if (y < 100 && y >= 0) {
- // preserve leap years using a full 400 year cycle, then reset
- return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
- } else {
- return Date.UTC(y, m, d);
- }
- }
-
- function startOf(units) {
- var time, startOfDate;
- units = normalizeUnits(units);
- if (units === undefined || units === 'millisecond' || !this.isValid()) {
- return this;
- }
-
- startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
-
- switch (units) {
- case 'year':
- time = startOfDate(this.year(), 0, 1);
- break;
- case 'quarter':
- time = startOfDate(
- this.year(),
- this.month() - (this.month() % 3),
- 1
- );
- break;
- case 'month':
- time = startOfDate(this.year(), this.month(), 1);
- break;
- case 'week':
- time = startOfDate(
- this.year(),
- this.month(),
- this.date() - this.weekday()
- );
- break;
- case 'isoWeek':
- time = startOfDate(
- this.year(),
- this.month(),
- this.date() - (this.isoWeekday() - 1)
- );
- break;
- case 'day':
- case 'date':
- time = startOfDate(this.year(), this.month(), this.date());
- break;
- case 'hour':
- time = this._d.valueOf();
- time -= mod$1(
- time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
- MS_PER_HOUR
- );
- break;
- case 'minute':
- time = this._d.valueOf();
- time -= mod$1(time, MS_PER_MINUTE);
- break;
- case 'second':
- time = this._d.valueOf();
- time -= mod$1(time, MS_PER_SECOND);
- break;
- }
-
- this._d.setTime(time);
- hooks.updateOffset(this, true);
- return this;
- }
-
- function endOf(units) {
- var time, startOfDate;
- units = normalizeUnits(units);
- if (units === undefined || units === 'millisecond' || !this.isValid()) {
- return this;
- }
-
- startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
-
- switch (units) {
- case 'year':
- time = startOfDate(this.year() + 1, 0, 1) - 1;
- break;
- case 'quarter':
- time =
- startOfDate(
- this.year(),
- this.month() - (this.month() % 3) + 3,
- 1
- ) - 1;
- break;
- case 'month':
- time = startOfDate(this.year(), this.month() + 1, 1) - 1;
- break;
- case 'week':
- time =
- startOfDate(
- this.year(),
- this.month(),
- this.date() - this.weekday() + 7
- ) - 1;
- break;
- case 'isoWeek':
- time =
- startOfDate(
- this.year(),
- this.month(),
- this.date() - (this.isoWeekday() - 1) + 7
- ) - 1;
- break;
- case 'day':
- case 'date':
- time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
- break;
- case 'hour':
- time = this._d.valueOf();
- time +=
- MS_PER_HOUR -
- mod$1(
- time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
- MS_PER_HOUR
- ) -
- 1;
- break;
- case 'minute':
- time = this._d.valueOf();
- time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
- break;
- case 'second':
- time = this._d.valueOf();
- time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
- break;
- }
-
- this._d.setTime(time);
- hooks.updateOffset(this, true);
- return this;
- }
-
- function valueOf() {
- return this._d.valueOf() - (this._offset || 0) * 60000;
- }
-
- function unix() {
- return Math.floor(this.valueOf() / 1000);
- }
-
- function toDate() {
- return new Date(this.valueOf());
- }
-
- function toArray() {
- var m = this;
- return [
- m.year(),
- m.month(),
- m.date(),
- m.hour(),
- m.minute(),
- m.second(),
- m.millisecond(),
- ];
- }
-
- function toObject() {
- var m = this;
- return {
- years: m.year(),
- months: m.month(),
- date: m.date(),
- hours: m.hours(),
- minutes: m.minutes(),
- seconds: m.seconds(),
- milliseconds: m.milliseconds(),
- };
- }
-
- function toJSON() {
- // new Date(NaN).toJSON() === null
- return this.isValid() ? this.toISOString() : null;
- }
-
- function isValid$2() {
- return isValid(this);
- }
-
- function parsingFlags() {
- return extend({}, getParsingFlags(this));
- }
-
- function invalidAt() {
- return getParsingFlags(this).overflow;
- }
-
- function creationData() {
- return {
- input: this._i,
- format: this._f,
- locale: this._locale,
- isUTC: this._isUTC,
- strict: this._strict,
- };
- }
-
- addFormatToken('N', 0, 0, 'eraAbbr');
- addFormatToken('NN', 0, 0, 'eraAbbr');
- addFormatToken('NNN', 0, 0, 'eraAbbr');
- addFormatToken('NNNN', 0, 0, 'eraName');
- addFormatToken('NNNNN', 0, 0, 'eraNarrow');
-
- addFormatToken('y', ['y', 1], 'yo', 'eraYear');
- addFormatToken('y', ['yy', 2], 0, 'eraYear');
- addFormatToken('y', ['yyy', 3], 0, 'eraYear');
- addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
-
- addRegexToken('N', matchEraAbbr);
- addRegexToken('NN', matchEraAbbr);
- addRegexToken('NNN', matchEraAbbr);
- addRegexToken('NNNN', matchEraName);
- addRegexToken('NNNNN', matchEraNarrow);
-
- addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (
- input,
- array,
- config,
- token
- ) {
- var era = config._locale.erasParse(input, token, config._strict);
- if (era) {
- getParsingFlags(config).era = era;
- } else {
- getParsingFlags(config).invalidEra = input;
- }
- });
-
- addRegexToken('y', matchUnsigned);
- addRegexToken('yy', matchUnsigned);
- addRegexToken('yyy', matchUnsigned);
- addRegexToken('yyyy', matchUnsigned);
- addRegexToken('yo', matchEraYearOrdinal);
-
- addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
- addParseToken(['yo'], function (input, array, config, token) {
- var match;
- if (config._locale._eraYearOrdinalRegex) {
- match = input.match(config._locale._eraYearOrdinalRegex);
- }
-
- if (config._locale.eraYearOrdinalParse) {
- array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
- } else {
- array[YEAR] = parseInt(input, 10);
- }
- });
-
- function localeEras(m, format) {
- var i,
- l,
- date,
- eras = this._eras || getLocale('en')._eras;
- for (i = 0, l = eras.length; i < l; ++i) {
- switch (typeof eras[i].since) {
- case 'string':
- // truncate time
- date = hooks(eras[i].since).startOf('day');
- eras[i].since = date.valueOf();
- break;
- }
-
- switch (typeof eras[i].until) {
- case 'undefined':
- eras[i].until = +Infinity;
- break;
- case 'string':
- // truncate time
- date = hooks(eras[i].until).startOf('day').valueOf();
- eras[i].until = date.valueOf();
- break;
- }
- }
- return eras;
- }
-
- function localeErasParse(eraName, format, strict) {
- var i,
- l,
- eras = this.eras(),
- name,
- abbr,
- narrow;
- eraName = eraName.toUpperCase();
-
- for (i = 0, l = eras.length; i < l; ++i) {
- name = eras[i].name.toUpperCase();
- abbr = eras[i].abbr.toUpperCase();
- narrow = eras[i].narrow.toUpperCase();
-
- if (strict) {
- switch (format) {
- case 'N':
- case 'NN':
- case 'NNN':
- if (abbr === eraName) {
- return eras[i];
- }
- break;
-
- case 'NNNN':
- if (name === eraName) {
- return eras[i];
- }
- break;
-
- case 'NNNNN':
- if (narrow === eraName) {
- return eras[i];
- }
- break;
- }
- } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
- return eras[i];
- }
- }
- }
-
- function localeErasConvertYear(era, year) {
- var dir = era.since <= era.until ? +1 : -1;
- if (year === undefined) {
- return hooks(era.since).year();
- } else {
- return hooks(era.since).year() + (year - era.offset) * dir;
- }
- }
-
- function getEraName() {
- var i,
- l,
- val,
- eras = this.localeData().eras();
- for (i = 0, l = eras.length; i < l; ++i) {
- // truncate time
- val = this.clone().startOf('day').valueOf();
-
- if (eras[i].since <= val && val <= eras[i].until) {
- return eras[i].name;
- }
- if (eras[i].until <= val && val <= eras[i].since) {
- return eras[i].name;
- }
- }
-
- return '';
- }
-
- function getEraNarrow() {
- var i,
- l,
- val,
- eras = this.localeData().eras();
- for (i = 0, l = eras.length; i < l; ++i) {
- // truncate time
- val = this.clone().startOf('day').valueOf();
-
- if (eras[i].since <= val && val <= eras[i].until) {
- return eras[i].narrow;
- }
- if (eras[i].until <= val && val <= eras[i].since) {
- return eras[i].narrow;
- }
- }
-
- return '';
- }
-
- function getEraAbbr() {
- var i,
- l,
- val,
- eras = this.localeData().eras();
- for (i = 0, l = eras.length; i < l; ++i) {
- // truncate time
- val = this.clone().startOf('day').valueOf();
-
- if (eras[i].since <= val && val <= eras[i].until) {
- return eras[i].abbr;
- }
- if (eras[i].until <= val && val <= eras[i].since) {
- return eras[i].abbr;
- }
- }
-
- return '';
- }
-
- function getEraYear() {
- var i,
- l,
- dir,
- val,
- eras = this.localeData().eras();
- for (i = 0, l = eras.length; i < l; ++i) {
- dir = eras[i].since <= eras[i].until ? +1 : -1;
-
- // truncate time
- val = this.clone().startOf('day').valueOf();
-
- if (
- (eras[i].since <= val && val <= eras[i].until) ||
- (eras[i].until <= val && val <= eras[i].since)
- ) {
- return (
- (this.year() - hooks(eras[i].since).year()) * dir +
- eras[i].offset
- );
- }
- }
-
- return this.year();
- }
-
- function erasNameRegex(isStrict) {
- if (!hasOwnProp(this, '_erasNameRegex')) {
- computeErasParse.call(this);
- }
- return isStrict ? this._erasNameRegex : this._erasRegex;
- }
-
- function erasAbbrRegex(isStrict) {
- if (!hasOwnProp(this, '_erasAbbrRegex')) {
- computeErasParse.call(this);
- }
- return isStrict ? this._erasAbbrRegex : this._erasRegex;
- }
-
- function erasNarrowRegex(isStrict) {
- if (!hasOwnProp(this, '_erasNarrowRegex')) {
- computeErasParse.call(this);
- }
- return isStrict ? this._erasNarrowRegex : this._erasRegex;
- }
-
- function matchEraAbbr(isStrict, locale) {
- return locale.erasAbbrRegex(isStrict);
- }
-
- function matchEraName(isStrict, locale) {
- return locale.erasNameRegex(isStrict);
- }
-
- function matchEraNarrow(isStrict, locale) {
- return locale.erasNarrowRegex(isStrict);
- }
-
- function matchEraYearOrdinal(isStrict, locale) {
- return locale._eraYearOrdinalRegex || matchUnsigned;
- }
-
- function computeErasParse() {
- var abbrPieces = [],
- namePieces = [],
- narrowPieces = [],
- mixedPieces = [],
- i,
- l,
- eras = this.eras();
-
- for (i = 0, l = eras.length; i < l; ++i) {
- namePieces.push(regexEscape(eras[i].name));
- abbrPieces.push(regexEscape(eras[i].abbr));
- narrowPieces.push(regexEscape(eras[i].narrow));
-
- mixedPieces.push(regexEscape(eras[i].name));
- mixedPieces.push(regexEscape(eras[i].abbr));
- mixedPieces.push(regexEscape(eras[i].narrow));
- }
-
- this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
- this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
- this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
- this._erasNarrowRegex = new RegExp(
- '^(' + narrowPieces.join('|') + ')',
- 'i'
- );
- }
-
- // FORMATTING
-
- addFormatToken(0, ['gg', 2], 0, function () {
- return this.weekYear() % 100;
- });
-
- addFormatToken(0, ['GG', 2], 0, function () {
- return this.isoWeekYear() % 100;
- });
-
- function addWeekYearFormatToken(token, getter) {
- addFormatToken(0, [token, token.length], 0, getter);
- }
-
- addWeekYearFormatToken('gggg', 'weekYear');
- addWeekYearFormatToken('ggggg', 'weekYear');
- addWeekYearFormatToken('GGGG', 'isoWeekYear');
- addWeekYearFormatToken('GGGGG', 'isoWeekYear');
-
- // ALIASES
-
- addUnitAlias('weekYear', 'gg');
- addUnitAlias('isoWeekYear', 'GG');
-
- // PRIORITY
-
- addUnitPriority('weekYear', 1);
- addUnitPriority('isoWeekYear', 1);
-
- // PARSING
-
- addRegexToken('G', matchSigned);
- addRegexToken('g', matchSigned);
- addRegexToken('GG', match1to2, match2);
- addRegexToken('gg', match1to2, match2);
- addRegexToken('GGGG', match1to4, match4);
- addRegexToken('gggg', match1to4, match4);
- addRegexToken('GGGGG', match1to6, match6);
- addRegexToken('ggggg', match1to6, match6);
-
- addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (
- input,
- week,
- config,
- token
- ) {
- week[token.substr(0, 2)] = toInt(input);
- });
-
- addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
- week[token] = hooks.parseTwoDigitYear(input);
- });
-
- // MOMENTS
-
- function getSetWeekYear(input) {
- return getSetWeekYearHelper.call(
- this,
- input,
- this.week(),
- this.weekday(),
- this.localeData()._week.dow,
- this.localeData()._week.doy
- );
- }
-
- function getSetISOWeekYear(input) {
- return getSetWeekYearHelper.call(
- this,
- input,
- this.isoWeek(),
- this.isoWeekday(),
- 1,
- 4
- );
- }
-
- function getISOWeeksInYear() {
- return weeksInYear(this.year(), 1, 4);
- }
-
- function getISOWeeksInISOWeekYear() {
- return weeksInYear(this.isoWeekYear(), 1, 4);
- }
-
- function getWeeksInYear() {
- var weekInfo = this.localeData()._week;
- return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
- }
-
- function getWeeksInWeekYear() {
- var weekInfo = this.localeData()._week;
- return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
- }
-
- function getSetWeekYearHelper(input, week, weekday, dow, doy) {
- var weeksTarget;
- if (input == null) {
- return weekOfYear(this, dow, doy).year;
- } else {
- weeksTarget = weeksInYear(input, dow, doy);
- if (week > weeksTarget) {
- week = weeksTarget;
- }
- return setWeekAll.call(this, input, week, weekday, dow, doy);
- }
- }
-
- function setWeekAll(weekYear, week, weekday, dow, doy) {
- var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
- date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
-
- this.year(date.getUTCFullYear());
- this.month(date.getUTCMonth());
- this.date(date.getUTCDate());
- return this;
- }
-
- // FORMATTING
-
- addFormatToken('Q', 0, 'Qo', 'quarter');
-
- // ALIASES
-
- addUnitAlias('quarter', 'Q');
-
- // PRIORITY
-
- addUnitPriority('quarter', 7);
-
- // PARSING
-
- addRegexToken('Q', match1);
- addParseToken('Q', function (input, array) {
- array[MONTH] = (toInt(input) - 1) * 3;
- });
-
- // MOMENTS
-
- function getSetQuarter(input) {
- return input == null
- ? Math.ceil((this.month() + 1) / 3)
- : this.month((input - 1) * 3 + (this.month() % 3));
- }
-
- // FORMATTING
-
- addFormatToken('D', ['DD', 2], 'Do', 'date');
-
- // ALIASES
-
- addUnitAlias('date', 'D');
-
- // PRIORITY
- addUnitPriority('date', 9);
-
- // PARSING
-
- addRegexToken('D', match1to2);
- addRegexToken('DD', match1to2, match2);
- addRegexToken('Do', function (isStrict, locale) {
- // TODO: Remove "ordinalParse" fallback in next major release.
- return isStrict
- ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
- : locale._dayOfMonthOrdinalParseLenient;
- });
-
- addParseToken(['D', 'DD'], DATE);
- addParseToken('Do', function (input, array) {
- array[DATE] = toInt(input.match(match1to2)[0]);
- });
-
- // MOMENTS
-
- var getSetDayOfMonth = makeGetSet('Date', true);
-
- // FORMATTING
-
- addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
-
- // ALIASES
-
- addUnitAlias('dayOfYear', 'DDD');
-
- // PRIORITY
- addUnitPriority('dayOfYear', 4);
-
- // PARSING
-
- addRegexToken('DDD', match1to3);
- addRegexToken('DDDD', match3);
- addParseToken(['DDD', 'DDDD'], function (input, array, config) {
- config._dayOfYear = toInt(input);
- });
-
- // HELPERS
-
- // MOMENTS
-
- function getSetDayOfYear(input) {
- var dayOfYear =
- Math.round(
- (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
- ) + 1;
- return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
- }
-
- // FORMATTING
-
- addFormatToken('m', ['mm', 2], 0, 'minute');
-
- // ALIASES
-
- addUnitAlias('minute', 'm');
-
- // PRIORITY
-
- addUnitPriority('minute', 14);
-
- // PARSING
-
- addRegexToken('m', match1to2);
- addRegexToken('mm', match1to2, match2);
- addParseToken(['m', 'mm'], MINUTE);
-
- // MOMENTS
-
- var getSetMinute = makeGetSet('Minutes', false);
-
- // FORMATTING
-
- addFormatToken('s', ['ss', 2], 0, 'second');
-
- // ALIASES
-
- addUnitAlias('second', 's');
-
- // PRIORITY
-
- addUnitPriority('second', 15);
-
- // PARSING
-
- addRegexToken('s', match1to2);
- addRegexToken('ss', match1to2, match2);
- addParseToken(['s', 'ss'], SECOND);
-
- // MOMENTS
-
- var getSetSecond = makeGetSet('Seconds', false);
-
- // FORMATTING
-
- addFormatToken('S', 0, 0, function () {
- return ~~(this.millisecond() / 100);
- });
-
- addFormatToken(0, ['SS', 2], 0, function () {
- return ~~(this.millisecond() / 10);
- });
-
- addFormatToken(0, ['SSS', 3], 0, 'millisecond');
- addFormatToken(0, ['SSSS', 4], 0, function () {
- return this.millisecond() * 10;
- });
- addFormatToken(0, ['SSSSS', 5], 0, function () {
- return this.millisecond() * 100;
- });
- addFormatToken(0, ['SSSSSS', 6], 0, function () {
- return this.millisecond() * 1000;
- });
- addFormatToken(0, ['SSSSSSS', 7], 0, function () {
- return this.millisecond() * 10000;
- });
- addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
- return this.millisecond() * 100000;
- });
- addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
- return this.millisecond() * 1000000;
- });
-
- // ALIASES
-
- addUnitAlias('millisecond', 'ms');
-
- // PRIORITY
-
- addUnitPriority('millisecond', 16);
-
- // PARSING
-
- addRegexToken('S', match1to3, match1);
- addRegexToken('SS', match1to3, match2);
- addRegexToken('SSS', match1to3, match3);
-
- var token, getSetMillisecond;
- for (token = 'SSSS'; token.length <= 9; token += 'S') {
- addRegexToken(token, matchUnsigned);
- }
-
- function parseMs(input, array) {
- array[MILLISECOND] = toInt(('0.' + input) * 1000);
- }
-
- for (token = 'S'; token.length <= 9; token += 'S') {
- addParseToken(token, parseMs);
- }
-
- getSetMillisecond = makeGetSet('Milliseconds', false);
-
- // FORMATTING
-
- addFormatToken('z', 0, 0, 'zoneAbbr');
- addFormatToken('zz', 0, 0, 'zoneName');
-
- // MOMENTS
-
- function getZoneAbbr() {
- return this._isUTC ? 'UTC' : '';
- }
-
- function getZoneName() {
- return this._isUTC ? 'Coordinated Universal Time' : '';
- }
-
- var proto = Moment.prototype;
-
- proto.add = add;
- proto.calendar = calendar$1;
- proto.clone = clone;
- proto.diff = diff;
- proto.endOf = endOf;
- proto.format = format;
- proto.from = from;
- proto.fromNow = fromNow;
- proto.to = to;
- proto.toNow = toNow;
- proto.get = stringGet;
- proto.invalidAt = invalidAt;
- proto.isAfter = isAfter;
- proto.isBefore = isBefore;
- proto.isBetween = isBetween;
- proto.isSame = isSame;
- proto.isSameOrAfter = isSameOrAfter;
- proto.isSameOrBefore = isSameOrBefore;
- proto.isValid = isValid$2;
- proto.lang = lang;
- proto.locale = locale;
- proto.localeData = localeData;
- proto.max = prototypeMax;
- proto.min = prototypeMin;
- proto.parsingFlags = parsingFlags;
- proto.set = stringSet;
- proto.startOf = startOf;
- proto.subtract = subtract;
- proto.toArray = toArray;
- proto.toObject = toObject;
- proto.toDate = toDate;
- proto.toISOString = toISOString;
- proto.inspect = inspect;
- if (typeof Symbol !== 'undefined' && Symbol.for != null) {
- proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
- return 'Moment<' + this.format() + '>';
- };
- }
- proto.toJSON = toJSON;
- proto.toString = toString;
- proto.unix = unix;
- proto.valueOf = valueOf;
- proto.creationData = creationData;
- proto.eraName = getEraName;
- proto.eraNarrow = getEraNarrow;
- proto.eraAbbr = getEraAbbr;
- proto.eraYear = getEraYear;
- proto.year = getSetYear;
- proto.isLeapYear = getIsLeapYear;
- proto.weekYear = getSetWeekYear;
- proto.isoWeekYear = getSetISOWeekYear;
- proto.quarter = proto.quarters = getSetQuarter;
- proto.month = getSetMonth;
- proto.daysInMonth = getDaysInMonth;
- proto.week = proto.weeks = getSetWeek;
- proto.isoWeek = proto.isoWeeks = getSetISOWeek;
- proto.weeksInYear = getWeeksInYear;
- proto.weeksInWeekYear = getWeeksInWeekYear;
- proto.isoWeeksInYear = getISOWeeksInYear;
- proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
- proto.date = getSetDayOfMonth;
- proto.day = proto.days = getSetDayOfWeek;
- proto.weekday = getSetLocaleDayOfWeek;
- proto.isoWeekday = getSetISODayOfWeek;
- proto.dayOfYear = getSetDayOfYear;
- proto.hour = proto.hours = getSetHour;
- proto.minute = proto.minutes = getSetMinute;
- proto.second = proto.seconds = getSetSecond;
- proto.millisecond = proto.milliseconds = getSetMillisecond;
- proto.utcOffset = getSetOffset;
- proto.utc = setOffsetToUTC;
- proto.local = setOffsetToLocal;
- proto.parseZone = setOffsetToParsedOffset;
- proto.hasAlignedHourOffset = hasAlignedHourOffset;
- proto.isDST = isDaylightSavingTime;
- proto.isLocal = isLocal;
- proto.isUtcOffset = isUtcOffset;
- proto.isUtc = isUtc;
- proto.isUTC = isUtc;
- proto.zoneAbbr = getZoneAbbr;
- proto.zoneName = getZoneName;
- proto.dates = deprecate(
- 'dates accessor is deprecated. Use date instead.',
- getSetDayOfMonth
- );
- proto.months = deprecate(
- 'months accessor is deprecated. Use month instead',
- getSetMonth
- );
- proto.years = deprecate(
- 'years accessor is deprecated. Use year instead',
- getSetYear
- );
- proto.zone = deprecate(
- 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
- getSetZone
- );
- proto.isDSTShifted = deprecate(
- 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
- isDaylightSavingTimeShifted
- );
-
- function createUnix(input) {
- return createLocal(input * 1000);
- }
-
- function createInZone() {
- return createLocal.apply(null, arguments).parseZone();
- }
-
- function preParsePostFormat(string) {
- return string;
- }
-
- var proto$1 = Locale.prototype;
-
- proto$1.calendar = calendar;
- proto$1.longDateFormat = longDateFormat;
- proto$1.invalidDate = invalidDate;
- proto$1.ordinal = ordinal;
- proto$1.preparse = preParsePostFormat;
- proto$1.postformat = preParsePostFormat;
- proto$1.relativeTime = relativeTime;
- proto$1.pastFuture = pastFuture;
- proto$1.set = set;
- proto$1.eras = localeEras;
- proto$1.erasParse = localeErasParse;
- proto$1.erasConvertYear = localeErasConvertYear;
- proto$1.erasAbbrRegex = erasAbbrRegex;
- proto$1.erasNameRegex = erasNameRegex;
- proto$1.erasNarrowRegex = erasNarrowRegex;
-
- proto$1.months = localeMonths;
- proto$1.monthsShort = localeMonthsShort;
- proto$1.monthsParse = localeMonthsParse;
- proto$1.monthsRegex = monthsRegex;
- proto$1.monthsShortRegex = monthsShortRegex;
- proto$1.week = localeWeek;
- proto$1.firstDayOfYear = localeFirstDayOfYear;
- proto$1.firstDayOfWeek = localeFirstDayOfWeek;
-
- proto$1.weekdays = localeWeekdays;
- proto$1.weekdaysMin = localeWeekdaysMin;
- proto$1.weekdaysShort = localeWeekdaysShort;
- proto$1.weekdaysParse = localeWeekdaysParse;
-
- proto$1.weekdaysRegex = weekdaysRegex;
- proto$1.weekdaysShortRegex = weekdaysShortRegex;
- proto$1.weekdaysMinRegex = weekdaysMinRegex;
-
- proto$1.isPM = localeIsPM;
- proto$1.meridiem = localeMeridiem;
-
- function get$1(format, index, field, setter) {
- var locale = getLocale(),
- utc = createUTC().set(setter, index);
- return locale[field](utc, format);
- }
-
- function listMonthsImpl(format, index, field) {
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
-
- format = format || '';
-
- if (index != null) {
- return get$1(format, index, field, 'month');
- }
-
- var i,
- out = [];
- for (i = 0; i < 12; i++) {
- out[i] = get$1(format, i, field, 'month');
- }
- return out;
- }
-
- // ()
- // (5)
- // (fmt, 5)
- // (fmt)
- // (true)
- // (true, 5)
- // (true, fmt, 5)
- // (true, fmt)
- function listWeekdaysImpl(localeSorted, format, index, field) {
- if (typeof localeSorted === 'boolean') {
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
-
- format = format || '';
- } else {
- format = localeSorted;
- index = format;
- localeSorted = false;
-
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
-
- format = format || '';
- }
-
- var locale = getLocale(),
- shift = localeSorted ? locale._week.dow : 0,
- i,
- out = [];
-
- if (index != null) {
- return get$1(format, (index + shift) % 7, field, 'day');
- }
-
- for (i = 0; i < 7; i++) {
- out[i] = get$1(format, (i + shift) % 7, field, 'day');
- }
- return out;
- }
-
- function listMonths(format, index) {
- return listMonthsImpl(format, index, 'months');
- }
-
- function listMonthsShort(format, index) {
- return listMonthsImpl(format, index, 'monthsShort');
- }
-
- function listWeekdays(localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
- }
-
- function listWeekdaysShort(localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
- }
-
- function listWeekdaysMin(localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
- }
-
- getSetGlobalLocale('en', {
- eras: [
- {
- since: '0001-01-01',
- until: +Infinity,
- offset: 1,
- name: 'Anno Domini',
- narrow: 'AD',
- abbr: 'AD',
- },
- {
- since: '0000-12-31',
- until: -Infinity,
- offset: 1,
- name: 'Before Christ',
- narrow: 'BC',
- abbr: 'BC',
- },
- ],
- dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
- ordinal: function (number) {
- var b = number % 10,
- output =
- toInt((number % 100) / 10) === 1
- ? 'th'
- : b === 1
- ? 'st'
- : b === 2
- ? 'nd'
- : b === 3
- ? 'rd'
- : 'th';
- return number + output;
- },
- });
-
- // Side effect imports
-
- hooks.lang = deprecate(
- 'moment.lang is deprecated. Use moment.locale instead.',
- getSetGlobalLocale
- );
- hooks.langData = deprecate(
- 'moment.langData is deprecated. Use moment.localeData instead.',
- getLocale
- );
-
- var mathAbs = Math.abs;
-
- function abs() {
- var data = this._data;
-
- this._milliseconds = mathAbs(this._milliseconds);
- this._days = mathAbs(this._days);
- this._months = mathAbs(this._months);
-
- data.milliseconds = mathAbs(data.milliseconds);
- data.seconds = mathAbs(data.seconds);
- data.minutes = mathAbs(data.minutes);
- data.hours = mathAbs(data.hours);
- data.months = mathAbs(data.months);
- data.years = mathAbs(data.years);
-
- return this;
- }
-
- function addSubtract$1(duration, input, value, direction) {
- var other = createDuration(input, value);
-
- duration._milliseconds += direction * other._milliseconds;
- duration._days += direction * other._days;
- duration._months += direction * other._months;
-
- return duration._bubble();
- }
-
- // supports only 2.0-style add(1, 's') or add(duration)
- function add$1(input, value) {
- return addSubtract$1(this, input, value, 1);
- }
-
- // supports only 2.0-style subtract(1, 's') or subtract(duration)
- function subtract$1(input, value) {
- return addSubtract$1(this, input, value, -1);
- }
-
- function absCeil(number) {
- if (number < 0) {
- return Math.floor(number);
- } else {
- return Math.ceil(number);
- }
- }
-
- function bubble() {
- var milliseconds = this._milliseconds,
- days = this._days,
- months = this._months,
- data = this._data,
- seconds,
- minutes,
- hours,
- years,
- monthsFromDays;
-
- // if we have a mix of positive and negative values, bubble down first
- // check: https://github.com/moment/moment/issues/2166
- if (
- !(
- (milliseconds >= 0 && days >= 0 && months >= 0) ||
- (milliseconds <= 0 && days <= 0 && months <= 0)
- )
- ) {
- milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
- days = 0;
- months = 0;
- }
-
- // The following code bubbles up values, see the tests for
- // examples of what that means.
- data.milliseconds = milliseconds % 1000;
-
- seconds = absFloor(milliseconds / 1000);
- data.seconds = seconds % 60;
-
- minutes = absFloor(seconds / 60);
- data.minutes = minutes % 60;
-
- hours = absFloor(minutes / 60);
- data.hours = hours % 24;
-
- days += absFloor(hours / 24);
-
- // convert days to months
- monthsFromDays = absFloor(daysToMonths(days));
- months += monthsFromDays;
- days -= absCeil(monthsToDays(monthsFromDays));
-
- // 12 months -> 1 year
- years = absFloor(months / 12);
- months %= 12;
-
- data.days = days;
- data.months = months;
- data.years = years;
-
- return this;
- }
-
- function daysToMonths(days) {
- // 400 years have 146097 days (taking into account leap year rules)
- // 400 years have 12 months === 4800
- return (days * 4800) / 146097;
- }
-
- function monthsToDays(months) {
- // the reverse of daysToMonths
- return (months * 146097) / 4800;
- }
-
- function as(units) {
- if (!this.isValid()) {
- return NaN;
- }
- var days,
- months,
- milliseconds = this._milliseconds;
-
- units = normalizeUnits(units);
-
- if (units === 'month' || units === 'quarter' || units === 'year') {
- days = this._days + milliseconds / 864e5;
- months = this._months + daysToMonths(days);
- switch (units) {
- case 'month':
- return months;
- case 'quarter':
- return months / 3;
- case 'year':
- return months / 12;
- }
- } else {
- // handle milliseconds separately because of floating point math errors (issue #1867)
- days = this._days + Math.round(monthsToDays(this._months));
- switch (units) {
- case 'week':
- return days / 7 + milliseconds / 6048e5;
- case 'day':
- return days + milliseconds / 864e5;
- case 'hour':
- return days * 24 + milliseconds / 36e5;
- case 'minute':
- return days * 1440 + milliseconds / 6e4;
- case 'second':
- return days * 86400 + milliseconds / 1000;
- // Math.floor prevents floating point math errors here
- case 'millisecond':
- return Math.floor(days * 864e5) + milliseconds;
- default:
- throw new Error('Unknown unit ' + units);
- }
- }
- }
-
- // TODO: Use this.as('ms')?
- function valueOf$1() {
- if (!this.isValid()) {
- return NaN;
- }
- return (
- this._milliseconds +
- this._days * 864e5 +
- (this._months % 12) * 2592e6 +
- toInt(this._months / 12) * 31536e6
- );
- }
-
- function makeAs(alias) {
- return function () {
- return this.as(alias);
- };
- }
-
- var asMilliseconds = makeAs('ms'),
- asSeconds = makeAs('s'),
- asMinutes = makeAs('m'),
- asHours = makeAs('h'),
- asDays = makeAs('d'),
- asWeeks = makeAs('w'),
- asMonths = makeAs('M'),
- asQuarters = makeAs('Q'),
- asYears = makeAs('y');
-
- function clone$1() {
- return createDuration(this);
- }
-
- function get$2(units) {
- units = normalizeUnits(units);
- return this.isValid() ? this[units + 's']() : NaN;
- }
-
- function makeGetter(name) {
- return function () {
- return this.isValid() ? this._data[name] : NaN;
- };
- }
-
- var milliseconds = makeGetter('milliseconds'),
- seconds = makeGetter('seconds'),
- minutes = makeGetter('minutes'),
- hours = makeGetter('hours'),
- days = makeGetter('days'),
- months = makeGetter('months'),
- years = makeGetter('years');
-
- function weeks() {
- return absFloor(this.days() / 7);
- }
-
- var round = Math.round,
- thresholds = {
- ss: 44, // a few seconds to seconds
- s: 45, // seconds to minute
- m: 45, // minutes to hour
- h: 22, // hours to day
- d: 26, // days to month/week
- w: null, // weeks to month
- M: 11, // months to year
- };
-
- // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
- function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
- return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
- }
-
- function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
- var duration = createDuration(posNegDuration).abs(),
- seconds = round(duration.as('s')),
- minutes = round(duration.as('m')),
- hours = round(duration.as('h')),
- days = round(duration.as('d')),
- months = round(duration.as('M')),
- weeks = round(duration.as('w')),
- years = round(duration.as('y')),
- a =
- (seconds <= thresholds.ss && ['s', seconds]) ||
- (seconds < thresholds.s && ['ss', seconds]) ||
- (minutes <= 1 && ['m']) ||
- (minutes < thresholds.m && ['mm', minutes]) ||
- (hours <= 1 && ['h']) ||
- (hours < thresholds.h && ['hh', hours]) ||
- (days <= 1 && ['d']) ||
- (days < thresholds.d && ['dd', days]);
-
- if (thresholds.w != null) {
- a =
- a ||
- (weeks <= 1 && ['w']) ||
- (weeks < thresholds.w && ['ww', weeks]);
- }
- a = a ||
- (months <= 1 && ['M']) ||
- (months < thresholds.M && ['MM', months]) ||
- (years <= 1 && ['y']) || ['yy', years];
-
- a[2] = withoutSuffix;
- a[3] = +posNegDuration > 0;
- a[4] = locale;
- return substituteTimeAgo.apply(null, a);
- }
-
- // This function allows you to set the rounding function for relative time strings
- function getSetRelativeTimeRounding(roundingFunction) {
- if (roundingFunction === undefined) {
- return round;
- }
- if (typeof roundingFunction === 'function') {
- round = roundingFunction;
- return true;
- }
- return false;
- }
-
- // This function allows you to set a threshold for relative time strings
- function getSetRelativeTimeThreshold(threshold, limit) {
- if (thresholds[threshold] === undefined) {
- return false;
- }
- if (limit === undefined) {
- return thresholds[threshold];
- }
- thresholds[threshold] = limit;
- if (threshold === 's') {
- thresholds.ss = limit - 1;
- }
- return true;
- }
-
- function humanize(argWithSuffix, argThresholds) {
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
-
- var withSuffix = false,
- th = thresholds,
- locale,
- output;
-
- if (typeof argWithSuffix === 'object') {
- argThresholds = argWithSuffix;
- argWithSuffix = false;
- }
- if (typeof argWithSuffix === 'boolean') {
- withSuffix = argWithSuffix;
- }
- if (typeof argThresholds === 'object') {
- th = Object.assign({}, thresholds, argThresholds);
- if (argThresholds.s != null && argThresholds.ss == null) {
- th.ss = argThresholds.s - 1;
- }
- }
-
- locale = this.localeData();
- output = relativeTime$1(this, !withSuffix, th, locale);
-
- if (withSuffix) {
- output = locale.pastFuture(+this, output);
- }
-
- return locale.postformat(output);
- }
-
- var abs$1 = Math.abs;
-
- function sign(x) {
- return (x > 0) - (x < 0) || +x;
- }
-
- function toISOString$1() {
- // for ISO strings we do not use the normal bubbling rules:
- // * milliseconds bubble up until they become hours
- // * days do not bubble at all
- // * months bubble up until they become years
- // This is because there is no context-free conversion between hours and days
- // (think of clock changes)
- // and also not between days and months (28-31 days per month)
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
-
- var seconds = abs$1(this._milliseconds) / 1000,
- days = abs$1(this._days),
- months = abs$1(this._months),
- minutes,
- hours,
- years,
- s,
- total = this.asSeconds(),
- totalSign,
- ymSign,
- daysSign,
- hmsSign;
-
- if (!total) {
- // this is the same as C#'s (Noda) and python (isodate)...
- // but not other JS (goog.date)
- return 'P0D';
- }
-
- // 3600 seconds -> 60 minutes -> 1 hour
- minutes = absFloor(seconds / 60);
- hours = absFloor(minutes / 60);
- seconds %= 60;
- minutes %= 60;
-
- // 12 months -> 1 year
- years = absFloor(months / 12);
- months %= 12;
-
- // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
- s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
-
- totalSign = total < 0 ? '-' : '';
- ymSign = sign(this._months) !== sign(total) ? '-' : '';
- daysSign = sign(this._days) !== sign(total) ? '-' : '';
- hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
-
- return (
- totalSign +
- 'P' +
- (years ? ymSign + years + 'Y' : '') +
- (months ? ymSign + months + 'M' : '') +
- (days ? daysSign + days + 'D' : '') +
- (hours || minutes || seconds ? 'T' : '') +
- (hours ? hmsSign + hours + 'H' : '') +
- (minutes ? hmsSign + minutes + 'M' : '') +
- (seconds ? hmsSign + s + 'S' : '')
- );
- }
-
- var proto$2 = Duration.prototype;
-
- proto$2.isValid = isValid$1;
- proto$2.abs = abs;
- proto$2.add = add$1;
- proto$2.subtract = subtract$1;
- proto$2.as = as;
- proto$2.asMilliseconds = asMilliseconds;
- proto$2.asSeconds = asSeconds;
- proto$2.asMinutes = asMinutes;
- proto$2.asHours = asHours;
- proto$2.asDays = asDays;
- proto$2.asWeeks = asWeeks;
- proto$2.asMonths = asMonths;
- proto$2.asQuarters = asQuarters;
- proto$2.asYears = asYears;
- proto$2.valueOf = valueOf$1;
- proto$2._bubble = bubble;
- proto$2.clone = clone$1;
- proto$2.get = get$2;
- proto$2.milliseconds = milliseconds;
- proto$2.seconds = seconds;
- proto$2.minutes = minutes;
- proto$2.hours = hours;
- proto$2.days = days;
- proto$2.weeks = weeks;
- proto$2.months = months;
- proto$2.years = years;
- proto$2.humanize = humanize;
- proto$2.toISOString = toISOString$1;
- proto$2.toString = toISOString$1;
- proto$2.toJSON = toISOString$1;
- proto$2.locale = locale;
- proto$2.localeData = localeData;
-
- proto$2.toIsoString = deprecate(
- 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
- toISOString$1
- );
- proto$2.lang = lang;
-
- // FORMATTING
-
- addFormatToken('X', 0, 0, 'unix');
- addFormatToken('x', 0, 0, 'valueOf');
-
- // PARSING
-
- addRegexToken('x', matchSigned);
- addRegexToken('X', matchTimestamp);
- addParseToken('X', function (input, array, config) {
- config._d = new Date(parseFloat(input) * 1000);
- });
- addParseToken('x', function (input, array, config) {
- config._d = new Date(toInt(input));
- });
-
- //! moment.js
-
- hooks.version = '2.29.1';
-
- setHookCallback(createLocal);
-
- hooks.fn = proto;
- hooks.min = min;
- hooks.max = max;
- hooks.now = now;
- hooks.utc = createUTC;
- hooks.unix = createUnix;
- hooks.months = listMonths;
- hooks.isDate = isDate;
- hooks.locale = getSetGlobalLocale;
- hooks.invalid = createInvalid;
- hooks.duration = createDuration;
- hooks.isMoment = isMoment;
- hooks.weekdays = listWeekdays;
- hooks.parseZone = createInZone;
- hooks.localeData = getLocale;
- hooks.isDuration = isDuration;
- hooks.monthsShort = listMonthsShort;
- hooks.weekdaysMin = listWeekdaysMin;
- hooks.defineLocale = defineLocale;
- hooks.updateLocale = updateLocale;
- hooks.locales = listLocales;
- hooks.weekdaysShort = listWeekdaysShort;
- hooks.normalizeUnits = normalizeUnits;
- hooks.relativeTimeRounding = getSetRelativeTimeRounding;
- hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
- hooks.calendarFormat = getCalendarFormat;
- hooks.prototype = proto;
-
- // currently HTML5 input type only supports 24-hour formats
- hooks.HTML5_FMT = {
- DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
- DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
- DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
- DATE: 'YYYY-MM-DD', // <input type="date" />
- TIME: 'HH:mm', // <input type="time" />
- TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
- TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
- WEEK: 'GGGG-[W]WW', // <input type="week" />
- MONTH: 'YYYY-MM', // <input type="month" />
- };
-
- return hooks;
-
- })));
- }, "/$$rollup_base$$/node_modules/moment");
-
- let array8 = arrayUntyped,
- array16 = arrayUntyped,
- array32 = arrayUntyped,
- arrayLengthen = arrayLengthenUntyped,
- arrayWiden = arrayWidenUntyped;
- if (typeof Uint8Array !== "undefined") {
- array8 = function(n) { return new Uint8Array(n); };
- array16 = function(n) { return new Uint16Array(n); };
- array32 = function(n) { return new Uint32Array(n); };
-
- arrayLengthen = function(array, length) {
- if (array.length >= length) return array;
- var copy = new array.constructor(length);
- copy.set(array);
- return copy;
- };
-
- arrayWiden = function(array, width) {
- var copy;
- switch (width) {
- case 16: copy = array16(array.length); break;
- case 32: copy = array32(array.length); break;
- default: throw new Error("invalid array width!");
- }
- copy.set(array);
- return copy;
- };
- }
-
- function arrayUntyped(n) {
- var array = new Array(n), i = -1;
- while (++i < n) array[i] = 0;
- return array;
- }
-
- function arrayLengthenUntyped(array, length) {
- var n = array.length;
- while (n < length) array[n++] = 0;
- return array;
- }
-
- function arrayWidenUntyped(array, width) {
- if (width > 32) throw new Error("invalid array width!");
- return array;
- }
-
- // An arbitrarily-wide array of bitmasks
- function bitarray(n) {
- this.length = n;
- this.subarrays = 1;
- this.width = 8;
- this.masks = {
- 0: 0
- };
-
- this[0] = array8(n);
- }
-
- bitarray.prototype.lengthen = function(n) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- this[i] = arrayLengthen(this[i], n);
- }
- this.length = n;
- };
-
- // Reserve a new bit index in the array, returns {offset, one}
- bitarray.prototype.add = function() {
- var m, w, one, i, len;
-
- for (i = 0, len = this.subarrays; i < len; ++i) {
- m = this.masks[i];
- w = this.width - (32 * i);
- // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0
- one = (~m & (m + 1)) >>> 0;
-
- if (w >= 32 && !one) {
- continue;
- }
-
- if (w < 32 && (one & (1 << w))) {
- // widen this subarray
- this[i] = arrayWiden(this[i], w <<= 1);
- this.width = 32 * i + w;
- }
-
- this.masks[i] |= one;
-
- return {
- offset: i,
- one: one
- };
- }
-
- // add a new subarray
- this[this.subarrays] = array8(this.length);
- this.masks[this.subarrays] = 1;
- this.width += 8;
- return {
- offset: this.subarrays++,
- one: 1
- };
- };
-
- // Copy record from index src to index dest
- bitarray.prototype.copy = function(dest, src) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- this[i][dest] = this[i][src];
- }
- };
-
- // Truncate the array to the given length
- bitarray.prototype.truncate = function(n) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- for (var j = this.length - 1; j >= n; j--) {
- this[i][j] = 0;
- }
- }
- this.length = n;
- };
-
- // Checks that all bits for the given index are 0
- bitarray.prototype.zero = function(n) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- if (this[i][n]) {
- return false;
- }
- }
- return true;
- };
-
- // Checks that all bits for the given index are 0 except for possibly one
- bitarray.prototype.zeroExcept = function(n, offset, zero) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- if (i === offset ? this[i][n] & zero : this[i][n]) {
- return false;
- }
- }
- return true;
- };
-
- // Checks that all bits for the given index are 0 except for the specified mask.
- // The mask should be an array of the same size as the filter subarrays width.
- bitarray.prototype.zeroExceptMask = function(n, mask) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- if (this[i][n] & mask[i]) {
- return false;
- }
- }
- return true;
- };
-
- // Checks that only the specified bit is set for the given index
- bitarray.prototype.only = function(n, offset, one) {
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- if (this[i][n] != (i === offset ? one : 0)) {
- return false;
- }
- }
- return true;
- };
-
- // Checks that only the specified bit is set for the given index except for possibly one other
- bitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {
- var mask;
- var i, len;
- for (i = 0, len = this.subarrays; i < len; ++i) {
- mask = this[i][n];
- if (i === offset)
- mask = (mask & zero) >>> 0;
- if (mask != (i === onlyOffset ? onlyOne : 0)) {
- return false;
- }
- }
- return true;
- };
-
- var xfilterArray = {
- array8: arrayUntyped,
- array16: arrayUntyped,
- array32: arrayUntyped,
- arrayLengthen: arrayLengthenUntyped,
- arrayWiden: arrayWidenUntyped,
- bitarray: bitarray
- };
-
- const filterExact = (bisect, value) => {
- return function(values) {
- var n = values.length;
- return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];
- };
- };
-
- const filterRange = (bisect, range) => {
- var min = range[0],
- max = range[1];
- return function(values) {
- var n = values.length;
- return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];
- };
- };
-
- const filterAll = values => {
- return [0, values.length];
- };
-
- var xfilterFilter = {
- filterExact,
- filterRange,
- filterAll
- };
-
- var cr_identity = d => {
- return d;
- };
-
- var cr_null = () => {
- return null;
- };
-
- var cr_zero = () => {
- return 0;
- };
-
- function heap_by(f) {
-
- // Builds a binary heap within the specified array a[lo:hi]. The heap has the
- // property such that the parent a[lo+i] is always less than or equal to its
- // two children: a[lo+2*i+1] and a[lo+2*i+2].
- function heap(a, lo, hi) {
- var n = hi - lo,
- i = (n >>> 1) + 1;
- while (--i > 0) sift(a, i, n, lo);
- return a;
- }
-
- // Sorts the specified array a[lo:hi] in descending order, assuming it is
- // already a heap.
- function sort(a, lo, hi) {
- var n = hi - lo,
- t;
- while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);
- return a;
- }
-
- // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous
- // slice of array a[lo:lo+n]. This method can also be used to update the heap
- // incrementally, without incurring the full cost of reconstructing the heap.
- function sift(a, i, n, lo) {
- var d = a[--lo + i],
- x = f(d),
- child;
- while ((child = i << 1) <= n) {
- if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;
- if (x <= f(a[lo + child])) break;
- a[lo + i] = a[lo + child];
- i = child;
- }
- a[lo + i] = d;
- }
-
- heap.sort = sort;
- return heap;
- }
-
- const h$1 = heap_by(cr_identity);
- h$1.by = heap_by;
-
- function heapselect_by(f) {
- var heap = h$1.by(f);
-
- // Returns a new array containing the top k elements in the array a[lo:hi].
- // The returned array is not sorted, but maintains the heap property. If k is
- // greater than hi - lo, then fewer than k elements will be returned. The
- // order of elements in a is unchanged by this operation.
- function heapselect(a, lo, hi, k) {
- var queue = new Array(k = Math.min(hi - lo, k)),
- min,
- i,
- d;
-
- for (i = 0; i < k; ++i) queue[i] = a[lo++];
- heap(queue, 0, k);
-
- if (lo < hi) {
- min = f(queue[0]);
- do {
- if (f(d = a[lo]) > min) {
- queue[0] = d;
- min = f(heap(queue, 0, k)[0]);
- }
- } while (++lo < hi);
- }
-
- return queue;
- }
-
- return heapselect;
- }
-
-
- const h = heapselect_by(cr_identity);
- h.by = heapselect_by; // assign the raw function to the export as well
-
- function bisect_by(f) {
-
- // Locate the insertion point for x in a to maintain sorted order. The
- // arguments lo and hi may be used to specify a subset of the array which
- // should be considered; by default the entire array is used. If x is already
- // present in a, the insertion point will be before (to the left of) any
- // existing entries. The return value is suitable for use as the first
- // argument to `array.splice` assuming that a is already sorted.
- //
- // The returned insertion point i partitions the array a into two halves so
- // that all v < x for v in a[lo:i] for the left side and all v >= x for v in
- // a[i:hi] for the right side.
- function bisectLeft(a, x, lo, hi) {
- while (lo < hi) {
- var mid = lo + hi >>> 1;
- if (f(a[mid]) < x) lo = mid + 1;
- else hi = mid;
- }
- return lo;
- }
-
- // Similar to bisectLeft, but returns an insertion point which comes after (to
- // the right of) any existing entries of x in a.
- //
- // The returned insertion point i partitions the array into two halves so that
- // all v <= x for v in a[lo:i] for the left side and all v > x for v in
- // a[i:hi] for the right side.
- function bisectRight(a, x, lo, hi) {
- while (lo < hi) {
- var mid = lo + hi >>> 1;
- if (x < f(a[mid])) hi = mid;
- else lo = mid + 1;
- }
- return lo;
- }
-
- bisectRight.right = bisectRight;
- bisectRight.left = bisectLeft;
- return bisectRight;
- }
-
- const bisect = bisect_by(cr_identity);
- bisect.by = bisect_by; // assign the raw function to the export as well
-
- var permute = (array, index, deep) => {
- for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {
- copy[i] = array[index[i]];
- }
- return copy;
- };
-
- const reduceIncrement = p => {
- return p + 1;
- };
-
- const reduceDecrement = p => {
- return p - 1;
- };
-
- const reduceAdd = f => {
- return function(p, v) {
- return p + +f(v);
- };
- };
-
- const reduceSubtract = f => {
- return function(p, v) {
- return p - f(v);
- };
- };
-
- var xfilterReduce = {
- reduceIncrement,
- reduceDecrement,
- reduceAdd,
- reduceSubtract
- };
-
- function deep(t,e,i,n,r){for(r in n=(i=i.split(".")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)}
-
- // Note(cg): result was previsouly using lodash.result, not ESM compatible.
-
- const get = (obj, prop) => {
- const value = obj[prop];
- return (typeof value === 'function') ? value.call(obj) : value;
- };
-
- /**
- * get value of object at a deep path.
- * if the resolved value is a function,
- * it's invoked with the `this` binding of
- * its parent object and its result is returned.
- *
- * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )
- * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)
- * @return {Any} the resolved value
- */
- const reg = /\[([\w\d]+)\]/g;
- var result = (obj, path) => {
- return deep(get, obj, path.replace(reg, '.$1'))
- };
-
- // constants
- var REMOVED_INDEX = -1;
-
- crossfilter$1.heap = h$1;
- crossfilter$1.heapselect = h;
- crossfilter$1.bisect = bisect;
- crossfilter$1.permute = permute;
-
- function crossfilter$1() {
- var crossfilter = {
- add: add,
- remove: removeData,
- dimension: dimension,
- groupAll: groupAll,
- size: size,
- all: all,
- allFiltered: allFiltered,
- onChange: onChange,
- isElementFiltered: isElementFiltered
- };
-
- var data = [], // the records
- n = 0, // the number of records; data.length
- filters, // 1 is filtered out
- filterListeners = [], // when the filters change
- dataListeners = [], // when data is added
- removeDataListeners = [], // when data is removed
- callbacks = [];
-
- filters = new xfilterArray.bitarray(0);
-
- // Adds the specified new records to this crossfilter.
- function add(newData) {
- var n0 = n,
- n1 = newData.length;
-
- // If there's actually new data to add…
- // Merge the new data into the existing data.
- // Lengthen the filter bitset to handle the new records.
- // Notify listeners (dimensions and groups) that new data is available.
- if (n1) {
- data = data.concat(newData);
- filters.lengthen(n += n1);
- dataListeners.forEach(function(l) { l(newData, n0, n1); });
- triggerOnChange('dataAdded');
- }
-
- return crossfilter;
- }
-
- // Removes all records that match the current filters, or if a predicate function is passed,
- // removes all records matching the predicate (ignoring filters).
- function removeData(predicate) {
- var // Mapping from old record indexes to new indexes (after records removed)
- newIndex = new Array(n),
- removed = [],
- usePred = typeof predicate === 'function',
- shouldRemove = function (i) {
- return usePred ? predicate(data[i], i) : filters.zero(i)
- };
-
- for (var index1 = 0, index2 = 0; index1 < n; ++index1) {
- if ( shouldRemove(index1) ) {
- removed.push(index1);
- newIndex[index1] = REMOVED_INDEX;
- } else {
- newIndex[index1] = index2++;
- }
- }
-
- // Remove all matching records from groups.
- filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });
-
- // Update indexes.
- removeDataListeners.forEach(function(l) { l(newIndex); });
-
- // Remove old filters and data by overwriting.
- for (var index3 = 0, index4 = 0; index3 < n; ++index3) {
- if ( newIndex[index3] !== REMOVED_INDEX ) {
- if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];
- ++index4;
- }
- }
-
- data.length = n = index4;
- filters.truncate(index4);
- triggerOnChange('dataRemoved');
- }
-
- function maskForDimensions(dimensions) {
- var n,
- d,
- len,
- id,
- mask = Array(filters.subarrays);
- for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }
- for (d = 0, len = dimensions.length; d < len; d++) {
- // The top bits of the ID are the subarray offset and the lower bits are the bit
- // offset of the "one" mask.
- id = dimensions[d].id();
- mask[id >> 7] &= ~(0x1 << (id & 0x3f));
- }
- return mask;
- }
-
- // Return true if the data element at index i is filtered IN.
- // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.
- function isElementFiltered(i, ignore_dimensions) {
- var mask = maskForDimensions(ignore_dimensions || []);
- return filters.zeroExceptMask(i,mask);
- }
-
- // Adds a new dimension with the specified value accessor function.
- function dimension(value, iterable) {
-
- if (typeof value === 'string') {
- var accessorPath = value;
- value = function(d) { return result(d, accessorPath); };
- }
-
- var dimension = {
- filter: filter,
- filterExact: filterExact,
- filterRange: filterRange,
- filterFunction: filterFunction,
- filterAll: filterAll,
- currentFilter: currentFilter,
- hasCurrentFilter: hasCurrentFilter,
- top: top,
- bottom: bottom,
- group: group,
- groupAll: groupAll,
- dispose: dispose,
- remove: dispose, // for backwards-compatibility
- accessor: value,
- id: function() { return id; }
- };
-
- var one, // lowest unset bit as mask, e.g., 00001000
- zero, // inverted one, e.g., 11110111
- offset, // offset into the filters arrays
- id, // unique ID for this dimension (reused when dimensions are disposed)
- values, // sorted, cached array
- index, // maps sorted value index -> record index (in data)
- newValues, // temporary array storing newly-added values
- newIndex, // temporary array storing newly-added index
- iterablesIndexCount,
- iterablesIndexFilterStatus,
- iterablesEmptyRows = [],
- sortRange = function(n) {
- return cr_range(n).sort(function(A, B) {
- var a = newValues[A], b = newValues[B];
- return a < b ? -1 : a > b ? 1 : A - B;
- });
- },
- refilter = xfilterFilter.filterAll, // for recomputing filter
- refilterFunction, // the custom filter function in use
- filterValue, // the value used for filtering (value, array, function or undefined)
- filterValuePresent, // true if filterValue contains something
- indexListeners = [], // when data is added
- dimensionGroups = [],
- lo0 = 0,
- hi0 = 0,
- t = 0,
- k;
-
- // Updating a dimension is a two-stage process. First, we must update the
- // associated filters for the newly-added records. Once all dimensions have
- // updated their filters, the groups are notified to update.
- dataListeners.unshift(preAdd);
- dataListeners.push(postAdd);
-
- removeDataListeners.push(removeData);
-
- // Add a new dimension in the filter bitmap and store the offset and bitmask.
- var tmp = filters.add();
- offset = tmp.offset;
- one = tmp.one;
- zero = ~one;
-
- // Create a unique ID for the dimension
- // IDs will be re-used if dimensions are disposed.
- // For internal use the ID is the subarray offset shifted left 7 bits or'd with the
- // bit offset of the set bit in the dimension's "one" mask.
- id = (offset << 7) | (Math.log(one) / Math.log(2));
-
- preAdd(data, 0, n);
- postAdd(data, 0, n);
-
- // Incorporates the specified new records into this dimension.
- // This function is responsible for updating filters, values, and index.
- function preAdd(newData, n0, n1) {
- var newIterablesIndexCount,
- newIterablesIndexFilterStatus;
-
- if (iterable){
- // Count all the values
- t = 0;
- j = 0;
- k = [];
-
- for (var i0 = 0; i0 < newData.length; i0++) {
- for(j = 0, k = value(newData[i0]); j < k.length; j++) {
- t++;
- }
- }
-
- newValues = [];
- newIterablesIndexCount = cr_range(newData.length);
- newIterablesIndexFilterStatus = cr_index(t,1);
- var unsortedIndex = cr_range(t);
-
- for (var l = 0, index1 = 0; index1 < newData.length; index1++) {
- k = value(newData[index1]);
- //
- if(!k.length){
- newIterablesIndexCount[index1] = 0;
- iterablesEmptyRows.push(index1 + n0);
- continue;
- }
- newIterablesIndexCount[index1] = k.length;
- for (j = 0; j < k.length; j++) {
- newValues.push(k[j]);
- unsortedIndex[l] = index1;
- l++;
- }
- }
-
- // Create the Sort map used to sort both the values and the valueToData indices
- var sortMap = sortRange(t);
-
- // Use the sortMap to sort the newValues
- newValues = permute(newValues, sortMap);
-
-
- // Use the sortMap to sort the unsortedIndex map
- // newIndex should be a map of sortedValue -> crossfilterData
- newIndex = permute(unsortedIndex, sortMap);
-
- } else {
- // Permute new values into natural order using a standard sorted index.
- newValues = newData.map(value);
- newIndex = sortRange(n1);
- newValues = permute(newValues, newIndex);
- }
-
- // Bisect newValues to determine which new records are selected.
- var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];
-
- var index2, index3, index4;
- if(iterable) {
- n1 = t;
- if (refilterFunction) {
- for (index2 = 0; index2 < n1; ++index2) {
- if (!refilterFunction(newValues[index2], index2)) {
- if(--newIterablesIndexCount[newIndex[index2]] === 0) {
- filters[offset][newIndex[index2] + n0] |= one;
- }
- newIterablesIndexFilterStatus[index2] = 1;
- }
- }
- } else {
- for (index3 = 0; index3 < lo1; ++index3) {
- if(--newIterablesIndexCount[newIndex[index3]] === 0) {
- filters[offset][newIndex[index3] + n0] |= one;
- }
- newIterablesIndexFilterStatus[index3] = 1;
- }
- for (index4 = hi1; index4 < n1; ++index4) {
- if(--newIterablesIndexCount[newIndex[index4]] === 0) {
- filters[offset][newIndex[index4] + n0] |= one;
- }
- newIterablesIndexFilterStatus[index4] = 1;
- }
- }
- } else {
- if (refilterFunction) {
- for (index2 = 0; index2 < n1; ++index2) {
- if (!refilterFunction(newValues[index2], index2)) {
- filters[offset][newIndex[index2] + n0] |= one;
- }
- }
- } else {
- for (index3 = 0; index3 < lo1; ++index3) {
- filters[offset][newIndex[index3] + n0] |= one;
- }
- for (index4 = hi1; index4 < n1; ++index4) {
- filters[offset][newIndex[index4] + n0] |= one;
- }
- }
- }
-
- // If this dimension previously had no data, then we don't need to do the
- // more expensive merge operation; use the new values and index as-is.
- if (!n0) {
- values = newValues;
- index = newIndex;
- iterablesIndexCount = newIterablesIndexCount;
- iterablesIndexFilterStatus = newIterablesIndexFilterStatus;
- lo0 = lo1;
- hi0 = hi1;
- return;
- }
-
-
-
- var oldValues = values,
- oldIndex = index,
- oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,
- old_n0,
- i1 = 0;
-
- i0 = 0;
-
- if(iterable){
- old_n0 = n0;
- n0 = oldValues.length;
- n1 = t;
- }
-
- // Otherwise, create new arrays into which to merge new and old.
- values = iterable ? new Array(n0 + n1) : new Array(n);
- index = iterable ? new Array(n0 + n1) : cr_index(n, n);
- if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);
-
- // Concatenate the newIterablesIndexCount onto the old one.
- if(iterable) {
- var oldiiclength = iterablesIndexCount.length;
- iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);
- for(var j=0; j+oldiiclength < n; j++) {
- iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];
- }
- }
-
- // Merge the old and new sorted values, and old and new index.
- var index5 = 0;
- for (; i0 < n0 && i1 < n1; ++index5) {
- if (oldValues[i0] < newValues[i1]) {
- values[index5] = oldValues[i0];
- if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];
- index[index5] = oldIndex[i0++];
- } else {
- values[index5] = newValues[i1];
- if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];
- index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);
- }
- }
-
- // Add any remaining old values.
- for (; i0 < n0; ++i0, ++index5) {
- values[index5] = oldValues[i0];
- if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];
- index[index5] = oldIndex[i0];
- }
-
- // Add any remaining new values.
- for (; i1 < n1; ++i1, ++index5) {
- values[index5] = newValues[i1];
- if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];
- index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);
- }
-
- // Bisect again to recompute lo0 and hi0.
- bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];
- }
-
- // When all filters have updated, notify index listeners of the new values.
- function postAdd(newData, n0, n1) {
- indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });
- newValues = newIndex = null;
- }
-
- function removeData(reIndex) {
- if (iterable) {
- for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {
- if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {
- iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];
- i1++;
- }
- }
- iterablesEmptyRows.length = i1;
- for (i0 = 0, i1 = 0; i0 < n; i0++) {
- if (reIndex[i0] !== REMOVED_INDEX) {
- if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];
- i1++;
- }
- }
- iterablesIndexCount = iterablesIndexCount.slice(0, i1);
- }
- // Rewrite our index, overwriting removed values
- var n0 = values.length;
- for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {
- oldDataIndex = index[i];
- if (reIndex[oldDataIndex] !== REMOVED_INDEX) {
- if (i !== j) values[j] = values[i];
- index[j] = reIndex[oldDataIndex];
- if (iterable) {
- iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];
- }
- ++j;
- }
- }
- values.length = j;
- if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);
- while (j < n0) index[j++] = 0;
-
- // Bisect again to recompute lo0 and hi0.
- var bounds = refilter(values);
- lo0 = bounds[0], hi0 = bounds[1];
- }
-
- // Updates the selected values based on the specified bounds [lo, hi].
- // This implementation is used by all the public filter methods.
- function filterIndexBounds(bounds) {
-
- var lo1 = bounds[0],
- hi1 = bounds[1];
-
- if (refilterFunction) {
- refilterFunction = null;
- filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);
- lo0 = lo1;
- hi0 = hi1;
- return dimension;
- }
-
- var i,
- j,
- k,
- added = [],
- removed = [],
- valueIndexAdded = [],
- valueIndexRemoved = [];
-
-
- // Fast incremental update based on previous lo index.
- if (lo1 < lo0) {
- for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {
- added.push(index[i]);
- valueIndexAdded.push(i);
- }
- } else if (lo1 > lo0) {
- for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {
- removed.push(index[i]);
- valueIndexRemoved.push(i);
- }
- }
-
- // Fast incremental update based on previous hi index.
- if (hi1 > hi0) {
- for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {
- added.push(index[i]);
- valueIndexAdded.push(i);
- }
- } else if (hi1 < hi0) {
- for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {
- removed.push(index[i]);
- valueIndexRemoved.push(i);
- }
- }
-
- if(!iterable) {
- // Flip filters normally.
-
- for(i=0; i<added.length; i++) {
- filters[offset][added[i]] ^= one;
- }
-
- for(i=0; i<removed.length; i++) {
- filters[offset][removed[i]] ^= one;
- }
-
- } else {
- // For iterables, we need to figure out if the row has been completely removed vs partially included
- // Only count a row as added if it is not already being aggregated. Only count a row
- // as removed if the last element being aggregated is removed.
-
- var newAdded = [];
- var newRemoved = [];
- for (i = 0; i < added.length; i++) {
- iterablesIndexCount[added[i]]++;
- iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;
- if(iterablesIndexCount[added[i]] === 1) {
- filters[offset][added[i]] ^= one;
- newAdded.push(added[i]);
- }
- }
- for (i = 0; i < removed.length; i++) {
- iterablesIndexCount[removed[i]]--;
- iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;
- if(iterablesIndexCount[removed[i]] === 0) {
- filters[offset][removed[i]] ^= one;
- newRemoved.push(removed[i]);
- }
- }
-
- added = newAdded;
- removed = newRemoved;
-
- // Now handle empty rows.
- if(refilter === xfilterFilter.filterAll) {
- for(i = 0; i < iterablesEmptyRows.length; i++) {
- if((filters[offset][k = iterablesEmptyRows[i]] & one)) {
- // Was not in the filter, so set the filter and add
- filters[offset][k] ^= one;
- added.push(k);
- }
- }
- } else {
- // filter in place - remove empty rows if necessary
- for(i = 0; i < iterablesEmptyRows.length; i++) {
- if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {
- // Was in the filter, so set the filter and remove
- filters[offset][k] ^= one;
- removed.push(k);
- }
- }
- }
- }
-
- lo0 = lo1;
- hi0 = hi1;
- filterListeners.forEach(function(l) { l(one, offset, added, removed); });
- triggerOnChange('filtered');
- return dimension;
- }
-
- // Filters this dimension using the specified range, value, or null.
- // If the range is null, this is equivalent to filterAll.
- // If the range is an array, this is equivalent to filterRange.
- // Otherwise, this is equivalent to filterExact.
- function filter(range) {
- return range == null
- ? filterAll() : Array.isArray(range)
- ? filterRange(range) : typeof range === "function"
- ? filterFunction(range)
- : filterExact(range);
- }
-
- // Filters this dimension to select the exact value.
- function filterExact(value) {
- filterValue = value;
- filterValuePresent = true;
- return filterIndexBounds((refilter = xfilterFilter.filterExact(bisect, value))(values));
- }
-
- // Filters this dimension to select the specified range [lo, hi].
- // The lower bound is inclusive, and the upper bound is exclusive.
- function filterRange(range) {
- filterValue = range;
- filterValuePresent = true;
- return filterIndexBounds((refilter = xfilterFilter.filterRange(bisect, range))(values));
- }
-
- // Clears any filters on this dimension.
- function filterAll() {
- filterValue = undefined;
- filterValuePresent = false;
- return filterIndexBounds((refilter = xfilterFilter.filterAll)(values));
- }
-
- // Filters this dimension using an arbitrary function.
- function filterFunction(f) {
- filterValue = f;
- filterValuePresent = true;
-
- refilterFunction = f;
- refilter = xfilterFilter.filterAll;
-
- filterIndexFunction(f, false);
-
- var bounds = refilter(values);
- lo0 = bounds[0], hi0 = bounds[1];
-
- return dimension;
- }
-
- function filterIndexFunction(f, filterAll) {
- var i,
- k,
- x,
- added = [],
- removed = [],
- valueIndexAdded = [],
- valueIndexRemoved = [],
- indexLength = values.length;
-
- if(!iterable) {
- for (i = 0; i < indexLength; ++i) {
- if (!(filters[offset][k = index[i]] & one) ^ !!(x = f(values[i], i))) {
- if (x) added.push(k);
- else removed.push(k);
- }
- }
- }
-
- if(iterable) {
- for(i=0; i < indexLength; ++i) {
- if(f(values[i], i)) {
- added.push(index[i]);
- valueIndexAdded.push(i);
- } else {
- removed.push(index[i]);
- valueIndexRemoved.push(i);
- }
- }
- }
-
- if(!iterable) {
- for(i=0; i<added.length; i++) {
- if(filters[offset][added[i]] & one) filters[offset][added[i]] &= zero;
- }
-
- for(i=0; i<removed.length; i++) {
- if(!(filters[offset][removed[i]] & one)) filters[offset][removed[i]] |= one;
- }
- } else {
-
- var newAdded = [];
- var newRemoved = [];
- for (i = 0; i < added.length; i++) {
- // First check this particular value needs to be added
- if(iterablesIndexFilterStatus[valueIndexAdded[i]] === 1) {
- iterablesIndexCount[added[i]]++;
- iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;
- if(iterablesIndexCount[added[i]] === 1) {
- filters[offset][added[i]] ^= one;
- newAdded.push(added[i]);
- }
- }
- }
- for (i = 0; i < removed.length; i++) {
- // First check this particular value needs to be removed
- if(iterablesIndexFilterStatus[valueIndexRemoved[i]] === 0) {
- iterablesIndexCount[removed[i]]--;
- iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;
- if(iterablesIndexCount[removed[i]] === 0) {
- filters[offset][removed[i]] ^= one;
- newRemoved.push(removed[i]);
- }
- }
- }
-
- added = newAdded;
- removed = newRemoved;
-
- // Now handle empty rows.
- if(filterAll) {
- for(i = 0; i < iterablesEmptyRows.length; i++) {
- if((filters[offset][k = iterablesEmptyRows[i]] & one)) {
- // Was not in the filter, so set the filter and add
- filters[offset][k] ^= one;
- added.push(k);
- }
- }
- } else {
- // filter in place - remove empty rows if necessary
- for(i = 0; i < iterablesEmptyRows.length; i++) {
- if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {
- // Was in the filter, so set the filter and remove
- filters[offset][k] ^= one;
- removed.push(k);
- }
- }
- }
- }
-
- filterListeners.forEach(function(l) { l(one, offset, added, removed); });
- triggerOnChange('filtered');
- }
-
- function currentFilter() {
- return filterValue;
- }
-
- function hasCurrentFilter() {
- return filterValuePresent;
- }
-
- // Returns the top K selected records based on this dimension's order.
- // Note: observes this dimension's filter, unlike group and groupAll.
- function top(k, top_offset) {
- var array = [],
- i = hi0,
- j,
- toSkip = 0;
-
- if(top_offset && top_offset > 0) toSkip = top_offset;
-
- while (--i >= lo0 && k > 0) {
- if (filters.zero(j = index[i])) {
- if(toSkip > 0) {
- //skip matching row
- --toSkip;
- } else {
- array.push(data[j]);
- --k;
- }
- }
- }
-
- if(iterable){
- for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {
- // Add row with empty iterable column at the end
- if(filters.zero(j = iterablesEmptyRows[i])) {
- if(toSkip > 0) {
- //skip matching row
- --toSkip;
- } else {
- array.push(data[j]);
- --k;
- }
- }
- }
- }
-
- return array;
- }
-
- // Returns the bottom K selected records based on this dimension's order.
- // Note: observes this dimension's filter, unlike group and groupAll.
- function bottom(k, bottom_offset) {
- var array = [],
- i,
- j,
- toSkip = 0;
-
- if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;
-
- if(iterable) {
- // Add row with empty iterable column at the top
- for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {
- if(filters.zero(j = iterablesEmptyRows[i])) {
- if(toSkip > 0) {
- //skip matching row
- --toSkip;
- } else {
- array.push(data[j]);
- --k;
- }
- }
- }
- }
-
- i = lo0;
-
- while (i < hi0 && k > 0) {
- if (filters.zero(j = index[i])) {
- if(toSkip > 0) {
- //skip matching row
- --toSkip;
- } else {
- array.push(data[j]);
- --k;
- }
- }
- i++;
- }
-
- return array;
- }
-
- // Adds a new group to this dimension, using the specified key function.
- function group(key) {
- var group = {
- top: top,
- all: all,
- reduce: reduce,
- reduceCount: reduceCount,
- reduceSum: reduceSum,
- order: order,
- orderNatural: orderNatural,
- size: size,
- dispose: dispose,
- remove: dispose // for backwards-compatibility
- };
-
- // Ensure that this group will be removed when the dimension is removed.
- dimensionGroups.push(group);
-
- var groups, // array of {key, value}
- groupIndex, // object id ↦ group id
- groupWidth = 8,
- groupCapacity = capacity(groupWidth),
- k = 0, // cardinality
- select,
- heap,
- reduceAdd,
- reduceRemove,
- reduceInitial,
- update = cr_null,
- reset = cr_null,
- resetNeeded = true,
- groupAll = key === cr_null,
- n0old;
-
- if (arguments.length < 1) key = cr_identity;
-
- // The group listens to the crossfilter for when any dimension changes, so
- // that it can update the associated reduce values. It must also listen to
- // the parent dimension for when data is added, and compute new keys.
- filterListeners.push(update);
- indexListeners.push(add);
- removeDataListeners.push(removeData);
-
- // Incorporate any existing data into the grouping.
- add(values, index, 0, n);
-
- // Incorporates the specified new values into this group.
- // This function is responsible for updating groups and groupIndex.
- function add(newValues, newIndex, n0, n1) {
-
- if(iterable) {
- n0old = n0;
- n0 = values.length - newValues.length;
- n1 = newValues.length;
- }
-
- var oldGroups = groups,
- reIndex = iterable ? [] : cr_index(k, groupCapacity),
- add = reduceAdd,
- remove = reduceRemove,
- initial = reduceInitial,
- k0 = k, // old cardinality
- i0 = 0, // index of old group
- i1 = 0, // index of new record
- j, // object id
- g0, // old group
- x0, // old key
- x1, // new key
- g, // group to add
- x; // key of group to add
-
- // If a reset is needed, we don't need to update the reduce values.
- if (resetNeeded) add = initial = cr_null;
- if (resetNeeded) remove = initial = cr_null;
-
- // Reset the new groups (k is a lower bound).
- // Also, make sure that groupIndex exists and is long enough.
- groups = new Array(k), k = 0;
- if(iterable){
- groupIndex = k0 ? groupIndex : [];
- }
- else {
- groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);
- }
-
-
- // Get the first old key (x0 of g0), if it exists.
- if (k0) x0 = (g0 = oldGroups[0]).key;
-
- // Find the first new key (x1), skipping NaN keys.
- while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;
-
- // While new keys remain…
- while (i1 < n1) {
-
- // Determine the lesser of the two current keys; new and old.
- // If there are no old keys remaining, then always add the new key.
- if (g0 && x0 <= x1) {
- g = g0, x = x0;
-
- // Record the new index of the old group.
- reIndex[i0] = k;
-
- // Retrieve the next old key.
- g0 = oldGroups[++i0];
- if (g0) x0 = g0.key;
- } else {
- g = {key: x1, value: initial()}, x = x1;
- }
-
- // Add the lesser group.
- groups[k] = g;
-
- // Add any selected records belonging to the added group, while
- // advancing the new key and populating the associated group index.
-
- while (x1 <= x) {
- j = newIndex[i1] + (iterable ? n0old : n0);
-
-
- if(iterable){
- if(groupIndex[j]){
- groupIndex[j].push(k);
- }
- else {
- groupIndex[j] = [k];
- }
- }
- else {
- groupIndex[j] = k;
- }
-
- // Always add new values to groups. Only remove when not in filter.
- // This gives groups full information on data life-cycle.
- g.value = add(g.value, data[j], true);
- if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);
- if (++i1 >= n1) break;
- x1 = key(newValues[i1]);
- }
-
- groupIncrement();
- }
-
- // Add any remaining old groups that were greater th1an all new keys.
- // No incremental reduce is needed; these groups have no new records.
- // Also record the new index of the old group.
- while (i0 < k0) {
- groups[reIndex[i0] = k] = oldGroups[i0++];
- groupIncrement();
- }
-
-
- // Fill in gaps with empty arrays where there may have been rows with empty iterables
- if(iterable){
- for (var index1 = 0; index1 < n; index1++) {
- if(!groupIndex[index1]){
- groupIndex[index1] = [];
- }
- }
- }
-
- // If we added any new groups before any old groups,
- // update the group index of all the old records.
- if(k > i0){
- if(iterable){
- for (i0 = 0; i0 < n0old; ++i0) {
- for (index1 = 0; index1 < groupIndex[i0].length; index1++) {
- groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];
- }
- }
- }
- else {
- for (i0 = 0; i0 < n0; ++i0) {
- groupIndex[i0] = reIndex[groupIndex[i0]];
- }
- }
- }
-
- // Modify the update and reset behavior based on the cardinality.
- // If the cardinality is less than or equal to one, then the groupIndex
- // is not needed. If the cardinality is zero, then there are no records
- // and therefore no groups to update or reset. Note that we also must
- // change the registered listener to point to the new method.
- j = filterListeners.indexOf(update);
- if (k > 1 || iterable) {
- update = updateMany;
- reset = resetMany;
- } else {
- if (!k && groupAll) {
- k = 1;
- groups = [{key: null, value: initial()}];
- }
- if (k === 1) {
- update = updateOne;
- reset = resetOne;
- } else {
- update = cr_null;
- reset = cr_null;
- }
- groupIndex = null;
- }
- filterListeners[j] = update;
-
- // Count the number of added groups,
- // and widen the group index as needed.
- function groupIncrement() {
- if(iterable){
- k++;
- return
- }
- if (++k === groupCapacity) {
- reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);
- groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);
- groupCapacity = capacity(groupWidth);
- }
- }
- }
-
- function removeData(reIndex) {
- if (k > 1 || iterable) {
- var oldK = k,
- oldGroups = groups,
- seenGroups = cr_index(oldK, oldK),
- i,
- i0,
- j;
-
- // Filter out non-matches by copying matching group index entries to
- // the beginning of the array.
- if (!iterable) {
- for (i = 0, j = 0; i < n; ++i) {
- if (reIndex[i] !== REMOVED_INDEX) {
- seenGroups[groupIndex[j] = groupIndex[i]] = 1;
- ++j;
- }
- }
- } else {
- for (i = 0, j = 0; i < n; ++i) {
- if (reIndex[i] !== REMOVED_INDEX) {
- groupIndex[j] = groupIndex[i];
- for (i0 = 0; i0 < groupIndex[j].length; i0++) {
- seenGroups[groupIndex[j][i0]] = 1;
- }
- ++j;
- }
- }
- groupIndex = groupIndex.slice(0, j);
- }
-
- // Reassemble groups including only those groups that were referred
- // to by matching group index entries. Note the new group index in
- // seenGroups.
- groups = [], k = 0;
- for (i = 0; i < oldK; ++i) {
- if (seenGroups[i]) {
- seenGroups[i] = k++;
- groups.push(oldGroups[i]);
- }
- }
-
- if (k > 1 || iterable) {
- // Reindex the group index using seenGroups to find the new index.
- if (!iterable) {
- for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];
- } else {
- for (i = 0; i < j; ++i) {
- for (i0 = 0; i0 < groupIndex[i].length; ++i0) {
- groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];
- }
- }
- }
- } else {
- groupIndex = null;
- }
- filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable
- ? (reset = resetMany, update = updateMany)
- : k === 1 ? (reset = resetOne, update = updateOne)
- : reset = update = cr_null;
- } else if (k === 1) {
- if (groupAll) return;
- for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;
- groups = [], k = 0;
- filterListeners[filterListeners.indexOf(update)] =
- update = reset = cr_null;
- }
- }
-
- // Reduces the specified selected or deselected records.
- // This function is only used when the cardinality is greater than 1.
- // notFilter indicates a crossfilter.add/remove operation.
- function updateMany(filterOne, filterOffset, added, removed, notFilter) {
-
- if ((filterOne === one && filterOffset === offset) || resetNeeded) return;
-
- var i,
- j,
- k,
- n,
- g;
-
- if(iterable){
- // Add the added values.
- for (i = 0, n = added.length; i < n; ++i) {
- if (filters.zeroExcept(k = added[i], offset, zero)) {
- for (j = 0; j < groupIndex[k].length; j++) {
- g = groups[groupIndex[k][j]];
- g.value = reduceAdd(g.value, data[k], false, j);
- }
- }
- }
-
- // Remove the removed values.
- for (i = 0, n = removed.length; i < n; ++i) {
- if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {
- for (j = 0; j < groupIndex[k].length; j++) {
- g = groups[groupIndex[k][j]];
- g.value = reduceRemove(g.value, data[k], notFilter, j);
- }
- }
- }
- return;
- }
-
- // Add the added values.
- for (i = 0, n = added.length; i < n; ++i) {
- if (filters.zeroExcept(k = added[i], offset, zero)) {
- g = groups[groupIndex[k]];
- g.value = reduceAdd(g.value, data[k], false);
- }
- }
-
- // Remove the removed values.
- for (i = 0, n = removed.length; i < n; ++i) {
- if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {
- g = groups[groupIndex[k]];
- g.value = reduceRemove(g.value, data[k], notFilter);
- }
- }
- }
-
- // Reduces the specified selected or deselected records.
- // This function is only used when the cardinality is 1.
- // notFilter indicates a crossfilter.add/remove operation.
- function updateOne(filterOne, filterOffset, added, removed, notFilter) {
- if ((filterOne === one && filterOffset === offset) || resetNeeded) return;
-
- var i,
- k,
- n,
- g = groups[0];
-
- // Add the added values.
- for (i = 0, n = added.length; i < n; ++i) {
- if (filters.zeroExcept(k = added[i], offset, zero)) {
- g.value = reduceAdd(g.value, data[k], false);
- }
- }
-
- // Remove the removed values.
- for (i = 0, n = removed.length; i < n; ++i) {
- if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {
- g.value = reduceRemove(g.value, data[k], notFilter);
- }
- }
- }
-
- // Recomputes the group reduce values from scratch.
- // This function is only used when the cardinality is greater than 1.
- function resetMany() {
- var i,
- j,
- g;
-
- // Reset all group values.
- for (i = 0; i < k; ++i) {
- groups[i].value = reduceInitial();
- }
-
- // We add all records and then remove filtered records so that reducers
- // can build an 'unfiltered' view even if there are already filters in
- // place on other dimensions.
- if(iterable){
- for (i = 0; i < n; ++i) {
- for (j = 0; j < groupIndex[i].length; j++) {
- g = groups[groupIndex[i][j]];
- g.value = reduceAdd(g.value, data[i], true, j);
- }
- }
- for (i = 0; i < n; ++i) {
- if (!filters.zeroExcept(i, offset, zero)) {
- for (j = 0; j < groupIndex[i].length; j++) {
- g = groups[groupIndex[i][j]];
- g.value = reduceRemove(g.value, data[i], false, j);
- }
- }
- }
- return;
- }
-
- for (i = 0; i < n; ++i) {
- g = groups[groupIndex[i]];
- g.value = reduceAdd(g.value, data[i], true);
- }
- for (i = 0; i < n; ++i) {
- if (!filters.zeroExcept(i, offset, zero)) {
- g = groups[groupIndex[i]];
- g.value = reduceRemove(g.value, data[i], false);
- }
- }
- }
-
- // Recomputes the group reduce values from scratch.
- // This function is only used when the cardinality is 1.
- function resetOne() {
- var i,
- g = groups[0];
-
- // Reset the singleton group values.
- g.value = reduceInitial();
-
- // We add all records and then remove filtered records so that reducers
- // can build an 'unfiltered' view even if there are already filters in
- // place on other dimensions.
- for (i = 0; i < n; ++i) {
- g.value = reduceAdd(g.value, data[i], true);
- }
-
- for (i = 0; i < n; ++i) {
- if (!filters.zeroExcept(i, offset, zero)) {
- g.value = reduceRemove(g.value, data[i], false);
- }
- }
- }
-
- // Returns the array of group values, in the dimension's natural order.
- function all() {
- if (resetNeeded) reset(), resetNeeded = false;
- return groups;
- }
-
- // Returns a new array containing the top K group values, in reduce order.
- function top(k) {
- var top = select(all(), 0, groups.length, k);
- return heap.sort(top, 0, top.length);
- }
-
- // Sets the reduce behavior for this group to use the specified functions.
- // This method lazily recomputes the reduce values, waiting until needed.
- function reduce(add, remove, initial) {
- reduceAdd = add;
- reduceRemove = remove;
- reduceInitial = initial;
- resetNeeded = true;
- return group;
- }
-
- // A convenience method for reducing by count.
- function reduceCount() {
- return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);
- }
-
- // A convenience method for reducing by sum(value).
- function reduceSum(value) {
- return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);
- }
-
- // Sets the reduce order, using the specified accessor.
- function order(value) {
- select = h.by(valueOf);
- heap = h$1.by(valueOf);
- function valueOf(d) { return value(d.value); }
- return group;
- }
-
- // A convenience method for natural ordering by reduce value.
- function orderNatural() {
- return order(cr_identity);
- }
-
- // Returns the cardinality of this group, irrespective of any filters.
- function size() {
- return k;
- }
-
- // Removes this group and associated event listeners.
- function dispose() {
- var i = filterListeners.indexOf(update);
- if (i >= 0) filterListeners.splice(i, 1);
- i = indexListeners.indexOf(add);
- if (i >= 0) indexListeners.splice(i, 1);
- i = removeDataListeners.indexOf(removeData);
- if (i >= 0) removeDataListeners.splice(i, 1);
- i = dimensionGroups.indexOf(group);
- if (i >= 0) dimensionGroups.splice(i, 1);
- return group;
- }
-
- return reduceCount().orderNatural();
- }
-
- // A convenience function for generating a singleton group.
- function groupAll() {
- var g = group(cr_null), all = g.all;
- delete g.all;
- delete g.top;
- delete g.order;
- delete g.orderNatural;
- delete g.size;
- g.value = function() { return all()[0].value; };
- return g;
- }
-
- // Removes this dimension and associated groups and event listeners.
- function dispose() {
- dimensionGroups.forEach(function(group) { group.dispose(); });
- var i = dataListeners.indexOf(preAdd);
- if (i >= 0) dataListeners.splice(i, 1);
- i = dataListeners.indexOf(postAdd);
- if (i >= 0) dataListeners.splice(i, 1);
- i = removeDataListeners.indexOf(removeData);
- if (i >= 0) removeDataListeners.splice(i, 1);
- filters.masks[offset] &= zero;
- return filterAll();
- }
-
- return dimension;
- }
-
- // A convenience method for groupAll on a dummy dimension.
- // This implementation can be optimized since it always has cardinality 1.
- function groupAll() {
- var group = {
- reduce: reduce,
- reduceCount: reduceCount,
- reduceSum: reduceSum,
- value: value,
- dispose: dispose,
- remove: dispose // for backwards-compatibility
- };
-
- var reduceValue,
- reduceAdd,
- reduceRemove,
- reduceInitial,
- resetNeeded = true;
-
- // The group listens to the crossfilter for when any dimension changes, so
- // that it can update the reduce value. It must also listen to the parent
- // dimension for when data is added.
- filterListeners.push(update);
- dataListeners.push(add);
-
- // For consistency; actually a no-op since resetNeeded is true.
- add(data, 0);
-
- // Incorporates the specified new values into this group.
- function add(newData, n0) {
- var i;
-
- if (resetNeeded) return;
-
- // Cycle through all the values.
- for (i = n0; i < n; ++i) {
-
- // Add all values all the time.
- reduceValue = reduceAdd(reduceValue, data[i], true);
-
- // Remove the value if filtered.
- if (!filters.zero(i)) {
- reduceValue = reduceRemove(reduceValue, data[i], false);
- }
- }
- }
-
- // Reduces the specified selected or deselected records.
- function update(filterOne, filterOffset, added, removed, notFilter) {
- var i,
- k,
- n;
-
- if (resetNeeded) return;
-
- // Add the added values.
- for (i = 0, n = added.length; i < n; ++i) {
- if (filters.zero(k = added[i])) {
- reduceValue = reduceAdd(reduceValue, data[k], notFilter);
- }
- }
-
- // Remove the removed values.
- for (i = 0, n = removed.length; i < n; ++i) {
- if (filters.only(k = removed[i], filterOffset, filterOne)) {
- reduceValue = reduceRemove(reduceValue, data[k], notFilter);
- }
- }
- }
-
- // Recomputes the group reduce value from scratch.
- function reset() {
- var i;
-
- reduceValue = reduceInitial();
-
- // Cycle through all the values.
- for (i = 0; i < n; ++i) {
-
- // Add all values all the time.
- reduceValue = reduceAdd(reduceValue, data[i], true);
-
- // Remove the value if it is filtered.
- if (!filters.zero(i)) {
- reduceValue = reduceRemove(reduceValue, data[i], false);
- }
- }
- }
-
- // Sets the reduce behavior for this group to use the specified functions.
- // This method lazily recomputes the reduce value, waiting until needed.
- function reduce(add, remove, initial) {
- reduceAdd = add;
- reduceRemove = remove;
- reduceInitial = initial;
- resetNeeded = true;
- return group;
- }
-
- // A convenience method for reducing by count.
- function reduceCount() {
- return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);
- }
-
- // A convenience method for reducing by sum(value).
- function reduceSum(value) {
- return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);
- }
-
- // Returns the computed reduce value.
- function value() {
- if (resetNeeded) reset(), resetNeeded = false;
- return reduceValue;
- }
-
- // Removes this group and associated event listeners.
- function dispose() {
- var i = filterListeners.indexOf(update);
- if (i >= 0) filterListeners.splice(i, 1);
- i = dataListeners.indexOf(add);
- if (i >= 0) dataListeners.splice(i, 1);
- return group;
- }
-
- return reduceCount();
- }
-
- // Returns the number of records in this crossfilter, irrespective of any filters.
- function size() {
- return n;
- }
-
- // Returns the raw row data contained in this crossfilter
- function all(){
- return data;
- }
-
- // Returns row data with all dimension filters applied, except for filters in ignore_dimensions
- function allFiltered(ignore_dimensions) {
- var array = [],
- i = 0,
- mask = maskForDimensions(ignore_dimensions || []);
-
- for (i = 0; i < n; i++) {
- if (filters.zeroExceptMask(i, mask)) {
- array.push(data[i]);
- }
- }
-
- return array;
- }
-
- function onChange(cb){
- if(typeof cb !== 'function'){
- /* eslint no-console: 0 */
- console.warn('onChange callback parameter must be a function!');
- return;
- }
- callbacks.push(cb);
- return function(){
- callbacks.splice(callbacks.indexOf(cb), 1);
- };
- }
-
- function triggerOnChange(eventName){
- for (var i = 0; i < callbacks.length; i++) {
- callbacks[i](eventName);
- }
- }
-
- return arguments.length
- ? add(arguments[0])
- : crossfilter;
- }
-
- // Returns an array of size n, big enough to store ids up to m.
- function cr_index(n, m) {
- return (m < 0x101
- ? xfilterArray.array8 : m < 0x10001
- ? xfilterArray.array16
- : xfilterArray.array32)(n);
- }
-
- // Constructs a new array of size n, with sequential values from 0 to n - 1.
- function cr_range(n) {
- var range = cr_index(n, n);
- for (var i = -1; ++i < n;) range[i] = i;
- return range;
- }
-
- function capacity(w) {
- return w === 8
- ? 0x100 : w === 16
- ? 0x10000
- : 0x100000000;
- }
-
- var main = /*#__PURE__*/Object.freeze({
- __proto__: null,
- 'default': crossfilter$1
- });
-
- var crossfilterreq = /*@__PURE__*/getAugmentedNamespace(main);
-
- const crossfilter = crossfilterreq.default ? crossfilterreq.default : crossfilterreq;
- // -------------------------------------------------------------------
- // dx = multidimensional Crossfilter = Wrapper for crossfilter
- var dx = {
- indexFns : { id : function (d) { return d.id || "" } }
- , createIndexFn : function(indexFn, dim){
-
- var indexFns = {
- dim : function(d) { return d[dim] || "" }
- , dimId : function(d) { return d[dim + 'Id'] || "" }
- };
- if(Object.prototype.toString.call(indexFn) === '[object Function]' ) return indexFn;
- if(indexFn) return function(d) { return d[indexFn] || "" } // Assume its the column name on the data.
-
- indexFn = function(d){
- // First time execution detects key to use. We try [dim] then[{{dim}}Id] then [id]
- // This is though dangerous if first item has missing data i.e. d[dim] is undefined even though other rows have d[dim]
- console.error('default generated indexFn on non existence of model property is dangerous.');
- indexFn = d[dim] ? indexFns['dim'] : d[dim + 'Id'] ? indexFns['dimId'] : dx.indexFns['id'];
- dx.indexFns['id'] === indexFn ? console.error('Warning : dimension name not found. Using id as default is not recommended.') : null;
- // Since we were called after the dimension processing has started we will continue to get called until each item is processed.
- // We therefore switch the function that will get called from next time onwards.
- return indexFn(d); //
- };
-
- return function(d){ return indexFn(d) }
- }
-
- , filter : function(filter, dim){
- // Note : Ensure that the filter function that you pass in is the same function object. This is the only way to prevent bloat.
- if(!filter) { console.warn('Useless call to filter without a real filter.'); return;} // All filters should already be in place since we are stateful.
-
- var filterable = dim ? this.dims[dim] : this;
- // Filters are shared between master and dimension on data.
- if(!filterable.wkFilters.get(filter)) {
- filterable.wkFilters.set(filter, true);
- filterable.filters.push(filter); // PB : Note -- Push unique distinct filters ! This will bloat if duplicates are pushed.
- }
-
- // PB : TODO -- Check CF may not re-evaluate filters if it detects no change in filter.
- if(filterable.dxFd){
- // This is a master dim with attached fact dimension. this.model should give us the column name on the fact data.
- filterable.dxFd.filter( filterable.__filter );
- }
- filterable.dxF.filter(filterable.__filter);
-
- // If it does re-evaluate following cascade code is not required.
- // Cascade to all nested dimensions which are implicitly bound.
- // Object.keys(specs.dims).forEach((dim)=>{
- // this.dims[dim].dxF.filter( this.dims[dim].__filter )
- // })
-
- // Handle other custom bound Dimensions on this dimension.
- // Master and Data crossfilters are implicitly bound.
- // this.dims[dim].dxFm ? this.dims[dim].dxFm.filter( this.dims[dim].__filter ) : null;
- // this.dims[dim].dxFd ? this.dims[dim].dxFd.filter( this.dims[dim].__filter ) : null;
-
- }
- , filterAll : function(dim){
-
- var filterable = dim ? this.dims[dim] : this;
-
- if(filterable.dxFd){
- // This is a master dim with attached fact dimension. this.model should give us the column name on the fact data.
- filterable.dxFd.filterAll();
- }
- filterable.dxF.filterAll( );
-
- // Cascade to all nested dimensions.
- // Object.keys(specs.dims).forEach((dim)=>{
- // specs[dim][dx] = specs[dim].data ? dx.create( specs[dim] ) : null;
- // dx.__createPairedDx(specs, dim);
- // })
- }
- , addFilter : function(filter, dim) {
- dim = dim || 'id';
- this.dims[dim].filters.push(filter);
- }
- , __initDim : function(oDim){
- var __filter = function(d){
- for(var f=0; f < oDim.filters.length; f++) {
- // Filter function will be called on the dimension.
- // PB : TODO accept any scope instead of only the dimension.
- if(!oDim.filters[f].call(oDim, d)) return false;
- }
- return true;
- };
- return oDim ? (()=>{
- oDim.wkFilters = new(WeakMap);
- oDim.filters = []; oDim.__filter = __filter;
- return oDim
- })()
- : { wkFilters : new(WeakMap), filters : [], __filter : __filter }
- }
- , __createPairedDx : function(specs, dim, idxFn){
- var oDim = dim === 'id' ? specs : specs.dims[dim];
- idxFn = idxFn || dx.createIndexFn(oDim.indexFn, dim);
-
- oDim.dxU = specs.ndxU.dimension( idxFn );
- oDim.dxF = specs.ndxF.dimension( idxFn );
- }
- , create : function( specs ){
-
- specs.ndxF = crossfilter(specs.data);
- specs.ndxU = crossfilter(specs.data);
-
- // specs.dims ? null : specs.dims = { 'id' : null }
- // specs.dims['id'] = dx.__initDim(specs.dims['id'])
- dx.__initDim(specs); // id Dimension is merged with dx itself. Other dimensions will be found in dims.
- dx.__createPairedDx(specs, 'id', dx.indexFns.id);
-
- specs.dims ? Object.keys(specs.dims).forEach((dim)=>{
- specs.dims[dim].data ? (()=>{
- // We have some master data for this dimension.
- dx.create( specs.dims[dim] );
- // PB : TODO -- We should probably bind the an array dx's ...
- // Eg: An array of master dx's for a fact dx...
- // i.e specs.bound = [ dx1 = practitioner, dx2 = xyz etc...]
-
- })()
- : dx.__initDim(specs.dims[dim]);
-
- var idxFn = dx.createIndexFn(specs.dims[dim].indexFn, dim);
- specs.dims[dim].dxFd = specs.ndxF.dimension( idxFn );
- specs.dims[dim].dxUd = specs.ndxU.dimension( idxFn );
-
- }) : null;
-
- specs.filter = this.filter;
- specs.filterAll = this.filterAll;
- return specs;
- }
- // , exclude : ( dxU, dxF, filterFn )=>{
- // // Excludes filtered from unfiltered.
- // var filterFn = null;
- // if(this.get('selected_doctor.id')) {
-
- // }
- // else {
-
- // var __inclusions = [];
- // var __exclusions = [];
-
- // practitionersDimUnfiltered.top(Infinity).forEach((availablePractitioner)=>{
- // // Per Doc
- // ndxFiltered.filterAll()
- // practitionersDimFiltered.filter(availablePractitioner.id);
- // var freeTimes = getFreeTimes(tRange, practitionersDimFiltered);
- // if(freeTimes.length > 0) { /*available*/
- // __inclusions.push(availablePractitioner) }
- // else {
- // __exclusions.push(availablePractitioner)
- // }
-
- // })
-
- // filterFn = ()=> { return ((inclusions, exclusions)=>{
- // for(var f in filters) {
- // if(!filters[f]) return false;
- // }
- // return true;
- // })(__inclusions, __exclusions) } ;
-
- // practitionersDimFiltered.filter(filterFn);
- // }
- // return filterFn;
- // }
- };
-
- var dx_1 = dx;
-
- var commonmasks = {
- "bed":{
- "wards":{
- "Bone Marrow Transplantation Unit":{
- "title":"Bone Marrow Transplantation Unit",
- "v1wardId":"BMTU",
- "mask":"1"
- },
- "BRB (Birthing Room A-Big)":{
- "title":"BRB (Birthing Room A-Big)",
- "v1wardId":"BRB",
- "mask":"2"
- },
- "BRSP (Birthing Room-Special Private Ward)":{
- "title":"BRSP (Birthing Room-Special Private Ward)",
- "v1wardId":"BRSP",
- "mask":"4"
- },
- "CCU (Coronary Care Unit)":{
- "title":"CCU (Coronary Care Unit)",
- "v1wardId":"CCU",
- "mask":"8"
- },
- "Chemotherapy Unit":{
- "title":"Chemotherapy Unit",
- "v1wardId":"CHEMOTHERAPY",
- "mask":"16"
- },
- "High Intensive Care Unit":{
- "title":"High Intensive Care Unit",
- "v1wardId":"HICU",
- "mask":"32"
- },
- "ICU (Intensive Care Unit )":{
- "title":"ICU (Intensive Care Unit )",
- "v1wardId":"ICU",
- "mask":"64"
- },
- "Labour Room A":{
- "title":"Labour Room A",
- "v1wardId":"LDPRA",
- "mask":"128"
- },
- "Labour Room B":{
- "title":"Labour Room B",
- "v1wardId":"LDPRB",
- "mask":"256"
- },
- "LLC Covid Ward":{
- "title":"LLC Covid Ward",
- "v1wardId":"LLCCOVIDWARD",
- "mask":"512"
- },
- "Mortury":{
- "title":"Mortury",
- "v1wardId":"MORTURY",
- "mask":"1024"
- },
- "NCU (Neonetal Care Unit)":{
- "title":"NCU (Neonetal Care Unit)",
- "v1wardId":"NCU",
- "mask":"2048"
- },
- "Neonatal Intensive Care unit2":{
- "title":"Neonatal Intensive Care unit2",
- "v1wardId":"NICU2",
- "mask":"4096"
- },
- "Operation Theatre":{
- "title":"Operation Theatre",
- "v1wardId":"OT",
- "mask":"8192"
- },
- "Patient Parking Area":{
- "title":"Patient Parking Area",
- "v1wardId":"PARKING",
- "mask":"16384"
- },
- "PCU (Peadiatric Care Unit)":{
- "title":"PCU (Peadiatric Care Unit)",
- "v1wardId":"PCU",
- "mask":"32768"
- },
- "Private Ward":{
- "title":"Private Ward",
- "v1wardId":"PVTWARD",
- "mask":"65536"
- },
- "SPPVT (Special Private)":{
- "title":"SPPVT (Special Private)",
- "v1wardId":"SPLPVT",
- "mask":"131072"
- },
- "Special Private":{
- "title":"Special Private",
- "v1wardId":"SPPVT",
- "mask":"262144"
- },
- "Wing 01-Female":{
- "title":"Wing 01-Female",
- "v1wardId":"W1FEMALE",
- "mask":"524288"
- },
- "Wing 01-Maternity":{
- "title":"Wing 01-Maternity",
- "v1wardId":"W1MATERNITY",
- "mask":"1048576"
- },
- "Wing 01-SP":{
- "title":"Wing 01-SP",
- "v1wardId":"W1SEMIPRIVATE",
- "mask":"2097152"
- },
- "Wing 02-Female":{
- "title":"Wing 02-Female",
- "v1wardId":"WING02",
- "mask":"4194304"
- },
- "Wing 02-Paediatric":{
- "title":"Wing 02-Paediatric",
- "v1wardId":"WING02PED",
- "mask":"8388608"
- },
- "Wing 03":{
- "title":"Wing 03",
- "v1wardId":"WING03",
- "mask":"16777216"
- },
- "Wing 04":{
- "title":"Wing 04",
- "v1wardId":"WING04",
- "mask":"33554432"
- },
- "Wing 05":{
- "title":"Wing 05",
- "v1wardId":"WING05",
- "mask":"67108864"
- },
- "Wing 06":{
- "title":"Wing 06",
- "v1wardId":"WING06",
- "mask":"134217728"
- },
- "PVTWR (Private Wad)":{
- "title":"PVTWR (Private Wad)",
- "v1wardId":"WINGPC",
- "read":4,
- "write":4,
- "mask":"268435456"
- },
- "Inactive":{
- "title":"Inactive",
- "v1wardId":"Inactive",
- "mask":"536870912"
- }
- },
- "bedclassifications":{
- "Bassinet":{
- "v1bedclassificationId":"BNT",
- "title":"Bassinet",
- "category":"Ward Type",
- "read":4,
- "write":4,
- "mask":"1"
- },
- "Birthing Room":{
- "v1bedclassificationId":"BRB",
- "title":"Birthing Room",
- "category":"Ward Type",
- "mask":"2"
- },
- "Casualty":{
- "v1bedclassificationId":"CASUALTY",
- "title":"Casualty",
- "category":"Ward Type",
- "mask":"4"
- },
- "Coronary Care Unit":{
- "v1bedclassificationId":"CCU",
- "title":"Coronary Care Unit",
- "category":"Ward Type",
- "mask":"8"
- },
- "Chemotherapy":{
- "v1bedclassificationId":"CHEMO",
- "title":"Chemotherapy",
- "category":"Ward Type",
- "mask":"16"
- },
- "Day Care":{
- "v1bedclassificationId":"DAYCAR",
- "title":"Day Care",
- "category":"Ward Type",
- "mask":"32"
- },
- "Geriatric":{
- "v1bedclassificationId":"GER",
- "title":"Geriatric",
- "category":"Ward Type",
- "mask":"64"
- },
- "Labour Room":{
- "v1bedclassificationId":"LBR",
- "title":"Labour Room",
- "category":"Ward Type",
- "mask":"128"
- },
- "High Dependency Care Unit":{
- "v1bedclassificationId":"HDU",
- "title":"High Dependency Care Unit",
- "category":"Ward Type",
- "mask":"256"
- },
- "Intensive Care Unit":{
- "v1bedclassificationId":"Intensive Care Unit",
- "title":"Intensive Care Unit",
- "category":"Ward Type",
- "mask":"512"
- },
- "High Risk Labour Room":{
- "v1bedclassificationId":"HRLBR",
- "title":"High Risk Labour Room",
- "category":"Ward Type",
- "mask":"1024"
- },
- "High Intensive Care Unit":{
- "v1bedclassificationId":"HICU",
- "title":"High Intensive Care Unit",
- "category":"Ward Type",
- "mask":"2048"
- },
- "Neonatal Intensive Care Unit":{
- "v1bedclassificationId":"NCU",
- "title":"Neonatal Intensive Care Unit",
- "category":"Ward Type",
- "mask":"4096"
- },
- "Paediatric Intensive Care Unit":{
- "v1bedclassificationId":"PCU",
- "title":"Paediatric Intensive Care Unit",
- "category":"Ward Type",
- "mask":"8192"
- },
- "With TV":{
- "v1bedclassificationId":"WTV",
- "title":"With TV",
- "category":"Amenities",
- "mask":"16384"
- },
- "With AC":{
- "v1bedclassificationId":"WAC",
- "title":"With AC",
- "category":"Amenities",
- "mask":"32768"
- },
- "General Semi Private":{
- "v1bedclassificationId":"GSP",
- "title":"General Semi Private",
- "category":"Bill Category",
- "mask":"65536"
- },
- "General":{
- "v1bedclassificationId":"GEN",
- "title":"General",
- "category":"Bill Category",
- "mask":"131072"
- },
- "Private":{
- "v1bedclassificationId":"PVT",
- "title":"Private",
- "category":"Bill Category",
- "mask":"262144"
- },
- "Delux":{
- "v1bedclassificationId":"DLX",
- "title":"Delux",
- "category":"Bill Category",
- "mask":"524288"
- },
- "VIP":{
- "v1bedclassificationId":"VIP",
- "title":"VIP",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"1048576"
- },
- "Regular":{
- "v1bedclassificationId":"Regular",
- "title":"Regular",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"2097152"
- },
- "Premium Economy":{
- "v1bedclassificationId":"Premium Economy",
- "title":"Premium Economy",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"4194304"
- },
- "Economy":{
- "v1bedclassificationId":"Economy",
- "title":"Economy",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"8388608"
- },
- "Full room":{
- "v1bedclassificationId":"FULL",
- "title":"Full room",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"16777216"
- },
- "Triple Share":{
- "v1bedclassificationId":"TIO",
- "title":"Triple Share",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"33554432"
- },
- "Twin Share":{
- "v1bedclassificationId":"TWIN",
- "title":"Twin Share",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"67108864"
- },
- "Special Private":{
- "v1bedclassificationId":"SPPVT",
- "title":"Special Private",
- "category":"Bill Category",
- "mask":"134217728"
- },
- "Male":{
- "v1bedclassificationId":"MALE",
- "title":"Male",
- "read":4,
- "category":"Gender Type",
- "mask":"268435456"
- },
- "Female":{
- "v1bedclassificationId":"FEMALE",
- "title":"Female",
- "read":4,
- "category":"Gender Type",
- "mask":"536870912"
- },
- "Other":{
- "v1bedclassificationId":"OTHGEN",
- "title":"Other",
- "read":4,
- "category":"Gender Type",
- "mask":"1073741824"
- },
- "Adult":{
- "v1bedclassificationId":"ADLT",
- "title":"Adult",
- "category":"Age Based",
- "mask":"2147483648"
- },
- "Paediatric":{
- "v1bedclassificationId":"PAD",
- "title":"Paediatric",
- "category":"Age Based",
- "mask":"4294967296"
- },
- "Neonatal":{
- "v1bedclassificationId":"NEO",
- "title":"Neonatal",
- "category":"Age Based",
- "mask":"8589934592"
- },
- "Admissible Bed":{
- "v1bedclassificationId":"ADM",
- "title":"Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"17179869184"
- },
- "Non Admissible Bed":{
- "v1bedclassificationId":"NAADM",
- "title":"Non Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"34359738368"
- },
- "Limited Admissible Bed":{
- "v1bedclassificationId":"LMADM",
- "title":"Limited Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"68719476736"
- },
- "Infected":{
- "v1bedclassificationId":"INFECTED",
- "title":"Infected",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"137438953472"
- },
- "Clean":{
- "v1bedclassificationId":"CLEAN",
- "title":"Clean",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"274877906944"
- },
- "Isolation":{
- "v1bedclassificationId":"ISOLATION",
- "title":"Isolation",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"549755813888"
- },
- "Ward":{
- "v1bedclassificationId":"Ward",
- "title":"Ward",
- "category":"Uncategorized",
- "read":4,
- "write":4,
- "mask":"1099511627776"
- },
- "ICU":{
- "v1bedclassificationId":"ICU",
- "title":"ICU",
- "category":"Uncategorized",
- "read":4,
- "write":4,
- "mask":"2199023255552"
- },
- "Inactive":{
- "title":"Inactive",
- "v1bedclassificationId":"Inactive",
- "read":4,
- "write":4,
- "mask":"4398046511104"
- }
- },
- "bedoccupancyclassifications":{
- "Bassinet":{
- "v1bedclassificationId":"BNT",
- "title":"Bassinet",
- "category":"Ward Type",
- "read":4,
- "write":4,
- "mask":"1"
- },
- "Birthing Room":{
- "v1bedclassificationId":"BRB",
- "title":"Birthing Room",
- "category":"Ward Type",
- "mask":"2"
- },
- "Casualty":{
- "v1bedclassificationId":"CASUALTY",
- "title":"Casualty",
- "category":"Ward Type",
- "mask":"4"
- },
- "Coronary Care Unit":{
- "v1bedclassificationId":"CCU",
- "title":"Coronary Care Unit",
- "category":"Ward Type",
- "mask":"8"
- },
- "Chemotherapy":{
- "v1bedclassificationId":"CHEMO",
- "title":"Chemotherapy",
- "category":"Ward Type",
- "mask":"16"
- },
- "Day Care":{
- "v1bedclassificationId":"DAYCAR",
- "title":"Day Care",
- "category":"Ward Type",
- "mask":"32"
- },
- "Geriatric":{
- "v1bedclassificationId":"GER",
- "title":"Geriatric",
- "category":"Ward Type",
- "mask":"64"
- },
- "Labour Room":{
- "v1bedclassificationId":"LBR",
- "title":"Labour Room",
- "category":"Ward Type",
- "mask":"128"
- },
- "High Dependency Care Unit":{
- "v1bedclassificationId":"HDU",
- "title":"High Dependency Care Unit",
- "category":"Ward Type",
- "mask":"256"
- },
- "Intensive Care Unit":{
- "v1bedclassificationId":"Intensive Care Unit",
- "title":"Intensive Care Unit",
- "category":"Ward Type",
- "mask":"512"
- },
- "High Risk Labour Room":{
- "v1bedclassificationId":"HRLBR",
- "title":"High Risk Labour Room",
- "category":"Ward Type",
- "mask":"1024"
- },
- "High Intensive Care Unit":{
- "v1bedclassificationId":"HICU",
- "title":"High Intensive Care Unit",
- "category":"Ward Type",
- "mask":"2048"
- },
- "Neonatal Intensive Care Unit":{
- "v1bedclassificationId":"NCU",
- "title":"Neonatal Intensive Care Unit",
- "category":"Ward Type",
- "mask":"4096"
- },
- "Paediatric Intensive Care Unit":{
- "v1bedclassificationId":"PCU",
- "title":"Paediatric Intensive Care Unit",
- "category":"Ward Type",
- "mask":"8192"
- },
- "With TV":{
- "v1bedclassificationId":"WTV",
- "title":"With TV",
- "category":"Amenities",
- "mask":"16384"
- },
- "With AC":{
- "v1bedclassificationId":"WAC",
- "title":"With AC",
- "category":"Amenities",
- "mask":"32768"
- },
- "General Semi Private":{
- "v1bedclassificationId":"GSP",
- "title":"General Semi Private",
- "category":"Bill Category",
- "mask":"65536"
- },
- "General":{
- "v1bedclassificationId":"GEN",
- "title":"General",
- "category":"Bill Category",
- "mask":"131072"
- },
- "Private":{
- "v1bedclassificationId":"PVT",
- "title":"Private",
- "category":"Bill Category",
- "mask":"262144"
- },
- "Delux":{
- "v1bedclassificationId":"DLX",
- "title":"Delux",
- "category":"Bill Category",
- "mask":"524288"
- },
- "VIP":{
- "v1bedclassificationId":"VIP",
- "title":"VIP",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"1048576"
- },
- "Regular":{
- "v1bedclassificationId":"Regular",
- "title":"Regular",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"2097152"
- },
- "Premium Economy":{
- "v1bedclassificationId":"Premium Economy",
- "title":"Premium Economy",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"4194304"
- },
- "Economy":{
- "v1bedclassificationId":"Economy",
- "title":"Economy",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"8388608"
- },
- "Full room":{
- "v1bedclassificationId":"FULL",
- "title":"Full room",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"16777216"
- },
- "Triple Share":{
- "v1bedclassificationId":"TIO",
- "title":"Triple Share",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"33554432"
- },
- "Twin Share":{
- "v1bedclassificationId":"TWIN",
- "title":"Twin Share",
- "category":"Bed Type",
- "read":4,
- "write":4,
- "mask":"67108864"
- },
- "Special Private":{
- "v1bedclassificationId":"SPPVT",
- "title":"Special Private",
- "category":"Bill Category",
- "mask":"134217728"
- },
- "Male":{
- "v1bedclassificationId":"MALE",
- "title":"Male",
- "read":4,
- "category":"Gender Type",
- "mask":"268435456"
- },
- "Female":{
- "v1bedclassificationId":"FEMALE",
- "title":"Female",
- "read":4,
- "category":"Gender Type",
- "mask":"536870912"
- },
- "Other":{
- "v1bedclassificationId":"OTHGEN",
- "title":"Other",
- "read":4,
- "category":"Gender Type",
- "mask":"1073741824"
- },
- "Adult":{
- "v1bedclassificationId":"ADLT",
- "title":"Adult",
- "category":"Age Based",
- "mask":"2147483648"
- },
- "Paediatric":{
- "v1bedclassificationId":"PAD",
- "title":"Paediatric",
- "category":"Age Based",
- "mask":"4294967296"
- },
- "Neonatal":{
- "v1bedclassificationId":"NEO",
- "title":"Neonatal",
- "category":"Age Based",
- "mask":"8589934592"
- },
- "Admissible Bed":{
- "v1bedclassificationId":"ADM",
- "title":"Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"17179869184"
- },
- "Non Admissible Bed":{
- "v1bedclassificationId":"NAADM",
- "title":"Non Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"34359738368"
- },
- "Limited Admissible Bed":{
- "v1bedclassificationId":"LMADM",
- "title":"Limited Admissible Bed",
- "category":"Admissible Category",
- "read":4,
- "write":4,
- "mask":"68719476736"
- },
- "Infected":{
- "v1bedclassificationId":"INFECTED",
- "title":"Infected",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"137438953472"
- },
- "Clean":{
- "v1bedclassificationId":"CLEAN",
- "title":"Clean",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"274877906944"
- },
- "Isolation":{
- "v1bedclassificationId":"ISOLATION",
- "title":"Isolation",
- "category":"Clinical",
- "read":8,
- "write":8,
- "mask":"549755813888"
- },
- "Ward":{
- "v1bedclassificationId":"Ward",
- "title":"Ward",
- "category":"Uncategorized",
- "read":4,
- "write":4,
- "mask":"1099511627776"
- },
- "ICU":{
- "v1bedclassificationId":"ICU",
- "title":"ICU",
- "category":"Uncategorized",
- "read":4,
- "write":4,
- "mask":"2199023255552"
- },
- "Inactive":{
- "title":"Inactive",
- "v1bedclassificationId":"Inactive",
- "read":4,
- "write":4,
- "mask":"4398046511104"
- }
- }
- },
- "dentalmr":{
- "habits":{
- "Chewing":{
- "title":"Chewing",
- "mask":"1"
- },
- "Smoking":{
- "title":"Smoking",
- "mask":"2"
- },
- "Alchohol":{
- "title":"Alchohol",
- "mask":"4"
- },
- "Other":{
- "title":"Other",
- "mask":"8"
- }
- },
- "oralhygienestatuses":{
- "Calculus":{
- "title":"Calculus",
- "mask":"1"
- },
- "Strain":{
- "title":"Strain",
- "mask":"2"
- },
- "Debris":{
- "title":"Debris",
- "mask":"4"
- },
- "Sub-gingival-calculus":{
- "title":"Sub-gingival-calculus",
- "mask":"8"
- }
- },
- "periodontiums":{
- "Mobility":{
- "title":"Mobility",
- "mask":"1"
- },
- "GR":{
- "title":"GR",
- "mask":"2"
- },
- "PP":{
- "title":"PP",
- "mask":"4"
- },
- "BOP":{
- "title":"BOP",
- "mask":"8"
- },
- "Gingival-inflamation":{
- "title":"Gingival-inflamation",
- "mask":"16"
- }
- },
- "abbreviations":{
- "AA":{
- "title":"AA",
- "mask":"1"
- },
- "AS#":{
- "title":"AS#",
- "mask":"2"
- },
- "AP#":{
- "title":"AP#",
- "mask":"4"
- },
- "AV":{
- "title":"AV",
- "mask":"8"
- },
- "BoP":{
- "title":"BoP",
- "mask":"16"
- },
- "MA":{
- "title":"MA",
- "mask":"32"
- },
- "DA":{
- "title":"DA",
- "mask":"64"
- },
- "H":{
- "title":"H",
- "mask":"128"
- },
- "V":{
- "title":"V",
- "mask":"256"
- },
- "D1":{
- "title":"D1",
- "mask":"512"
- },
- "D2":{
- "title":"D2",
- "mask":"1024"
- },
- "D3":{
- "title":"D3",
- "mask":"2048"
- },
- "D4":{
- "title":"D4",
- "mask":"4096"
- },
- "C":{
- "title":"C",
- "mask":"8192"
- },
- "DT":{
- "title":"DT",
- "mask":"16384"
- },
- "CRF":{
- "title":"CRF",
- "mask":"32768"
- },
- "EX":{
- "title":"EX",
- "mask":"65536"
- },
- "EF":{
- "title":"EF",
- "mask":"131072"
- },
- "EDF":{
- "title":"EDF",
- "mask":"262144"
- },
- "EDP":{
- "title":"EDP",
- "mask":"524288"
- },
- "#EDP":{
- "title":"#EDP",
- "mask":"1048576"
- },
- "E":{
- "title":"E",
- "mask":"2097152"
- },
- "ED":{
- "title":"ED",
- "mask":"4194304"
- },
- "F1":{
- "title":"F1",
- "mask":"8388608"
- },
- "F2":{
- "title":"F2",
- "mask":"16777216"
- },
- "F3":{
- "title":"F3",
- "mask":"33554432"
- },
- "GH":{
- "title":"GH",
- "mask":"67108864"
- },
- "IMP":{
- "title":"IMP",
- "mask":"134217728"
- },
- "IL":{
- "title":"IL",
- "mask":"268435456"
- },
- "LL":{
- "title":"LL",
- "mask":"536870912"
- },
- "MO&DO":{
- "title":"MO&DO",
- "mask":"1073741824"
- },
- "AC":{
- "title":"AC",
- "mask":"2147483648"
- },
- "AT":{
- "title":"AT",
- "mask":"4294967296"
- },
- "BR":{
- "title":"BR",
- "mask":"8589934592"
- },
- "CR":{
- "title":"CR",
- "mask":"17179869184"
- },
- "#E":{
- "title":"#E",
- "mask":"34359738368"
- },
- "F":{
- "title":"F",
- "mask":"68719476736"
- },
- "#F":{
- "title":"#F",
- "mask":"137438953472"
- },
- "FD":{
- "title":"FD",
- "mask":"274877906944"
- },
- "GR":{
- "title":"GR",
- "mask":"549755813888"
- },
- "X":{
- "title":"X",
- "mask":"1099511627776"
- },
- "M1":{
- "title":"M1",
- "mask":"2199023255552"
- },
- "M2":{
- "title":"M2",
- "mask":"4398046511104"
- },
- "M3":{
- "title":"M3",
- "mask":"8796093022208"
- }
- },
- "teethposition":{
- "upperleft":{
- "title":"upperleft",
- "mask":"1"
- },
- "upperright":{
- "title":"upperright",
- "mask":"2"
- },
- "lowerleft":{
- "title":"lowerleft",
- "mask":"4"
- },
- "lowerright":{
- "title":"lowerright",
- "mask":"8"
- },
- "position1":{
- "title":"position1",
- "mask":"16"
- },
- "position2":{
- "title":"position2",
- "mask":"32"
- },
- "position3":{
- "title":"position3",
- "mask":"64"
- },
- "position4":{
- "title":"position4",
- "mask":"128"
- },
- "position5":{
- "title":"position5",
- "mask":"256"
- },
- "position6":{
- "title":"position6",
- "mask":"512"
- },
- "position7":{
- "title":"position7",
- "mask":"1024"
- },
- "position8":{
- "title":"position8",
- "mask":"2048"
- },
- "ischildteeth":{
- "title":"ischildteeth",
- "mask":"4096"
- }
- }
- },
- "item":{
- "ITEMCLASS":{
- "HIGHRISK":{
- "title":"HIGHRISK",
- "mask":"1"
- },
- "ANTIBIOTICUSAGE":{
- "title":"ANTIBIOTICUSAGE",
- "mask":"2"
- },
- "PURCHASABLE":{
- "title":"PURCHASABLE",
- "mask":"4"
- },
- "SERVICES":{
- "title":"SERVICES",
- "mask":"8"
- },
- "GOODS":{
- "title":"GOODS",
- "mask":"16"
- },
- "SALEABLE":{
- "title":"SALEABLE",
- "mask":"32"
- },
- "CONSUMABLE":{
- "title":"CONSUMABLE",
- "mask":"64"
- },
- "STOCKABLE":{
- "title":"STOCKABLE",
- "mask":"128"
- },
- "PHARMACEUTICALS":{
- "title":"PHARMACEUTICALS",
- "mask":"256"
- },
- "NONSTOCK":{
- "title":"NONSTOCK",
- "mask":"512"
- },
- "DISCOUNTS":{
- "title":"DISCOUNTS",
- "mask":"1024"
- },
- "GENERALITEMS":{
- "title":"GENERALITEMS",
- "mask":"2048"
- },
- "TERMS":{
- "title":"TERMS",
- "mask":"4096"
- },
- "SHEETITEMS":{
- "title":"SHEETITEMS",
- "mask":"8192"
- },
- "CAPITALITEM":{
- "title":"CAPITALITEM",
- "mask":"16384"
- },
- "PURCHASEINACTIVATED":{
- "title":"PURCHASEINACTIVATED",
- "mask":"32768"
- },
- "SALEINACTIVATED":{
- "title":"SALEINACTIVATED",
- "mask":"65536"
- }
- }
- },
- "location":{
- "locationclass":{
- "Main Store":{
- "title":"Main Store",
- "mask":"1"
- },
- "SALEABLE":{
- "title":"SALEABLE",
- "mask":"2"
- },
- "CONSUMABLE":{
- "title":"CONSUMABLE",
- "mask":"4"
- },
- "STOCKABLE":{
- "title":"STOCKABLE",
- "mask":"8"
- },
- "PHARMACEUTICALS":{
- "title":"PHARMACEUTICALS",
- "mask":"256"
- },
- "GENERAL ITEMS":{
- "title":"GENERAL ITEMS",
- "mask":"32"
- },
- "TRANSIT":{
- "title":"TRANSIT",
- "mask":"16"
- }
- }
- },
- "policy":{
- "flags":{
- "defaultpharmacynonconsultationentity":{
- "title":"defaultpharmacynonconsultationentity",
- "mask":"1"
- }
- }
- },
- "umask":{
- "description":{
- "SERVICES":{
- "title":"SERVICES",
- "mask":"1"
- },
- "CATEGORY":{
- "title":"CATEGORY",
- "mask":"2"
- },
- "GROUP":{
- "title":"GROUP",
- "mask":"4"
- },
- "CGST":{
- "title":"CGST",
- "mask":"8"
- },
- "SGST":{
- "title":"SGST",
- "mask":"16"
- },
- "IGST":{
- "title":"IGST",
- "mask":"32"
- },
- "UGST":{
- "title":"UGST",
- "mask":"64"
- },
- "PRINTED":{
- "title":"PRINTED",
- "mask":"128"
- },
- "PHARMACEUTICALS":{
- "title":"PHARMACEUTICALS",
- "mask":"256"
- },
- "UPDATED":{
- "title":"UPDATED",
- "mask":"512"
- },
- "DELETED":{
- "title":"DELETED",
- "mask":"1024"
- }
- }
- },
- "user":{
- "roles":{
- "guest":{
- "title":"guest",
- "mask":"1"
- },
- "superadmin":{
- "title":"superadmin",
- "mask":"2"
- },
- "nurseadmin":{
- "title":"nurseadmin",
- "mask":"4"
- },
- "nurse":{
- "title":"nurse",
- "mask":"8"
- },
- "bedadmin":{
- "title":"bedadmin",
- "mask":"16"
- }
- }
- },
- "vendor":{
- "m01" : {
- "externalstockimport": {
- "title": "externalstockimport",
- "mask":"1"
- }
- }
- },
- "billable":{
- "m01" : {
- "createsubencounter": {
- "title": "createsubencounter",
- "mask":"1"
- }
- }
- },
- "ratecard" : {
- "umask" : {
- "enablecredit": {
- "title": "enablecredit",
- "mask":"1"
- },
- "disablecredit": {
- "title": "disablecredit",
- "mask":"2"
- }
-
- }
- }
-
- };
-
- var m_common = commonmasks ;
-
- var helpers = {
-
- islengthgreaterthan : function(value, maxlength){
- if(value && value.length < maxlength){
- return true;
- }
- else {
- return false;
- }
- }
- ,
- isnumbercheck : function (value) {
- if ( typeof(value) === 'string' || typeof(value) === 'number') {
- var re = new RegExp(/^[0-9]+$/);
- if (re.test(value) ) {
- return true;
- }
- else {
- return false;
- }
- }
- else {
- return false
- }
- }
- ,
- isintcheck : function (value) {
- if ( typeof(value) === 'string' || typeof(value) === 'number') {
- var re = new RegExp(/^[1-9]\d*$/);
- if (re.test(value) ) {
- return true;
- }
- else {
- return false;
- }
- }
- else {
- return false
- }
- }
- ,
- isguidcheck : function (value) {
- if ( typeof(value) === 'string' || typeof(value) === 'number') {
- // var re = new RegExp(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i);
- var re = new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', 'i');
- if (re.test(value) ) {
- return true;
- }
- else {
- return false;
- }
- }
- else {
- return false
- }
- }
- };
-
- var validationhelpers = helpers;
-
- try {
- var x = BigInt(0);
- }
- catch(e){
- console.warn('BigInt check failed. Falling back to Number');
- // PB : TODO -- All Number issues with bitmasks will fail since BigInt is not available.
- // Eg : Older Safari versions will not work
- // PB : TODO -- provide a proper polyfill for older Safari Browsers in the ember build.
- BigInt = Number;
- }
-
- // -------------------------------
- // Command line option parsing
- // -------------------------------
- function cliargs$1(args, opts) {
- if (!opts) opts = {};
-
- var flags = { bools : {}, strings : {}, unknownFn: null };
-
- if (typeof opts['unknown'] === 'function') {
- flags.unknownFn = opts['unknown'];
- }
-
- if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
- flags.allBools = true;
- } else {
- [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
- flags.bools[key] = true;
- });
- }
-
- var aliases = {};
- Object.keys(opts.alias || {}).forEach(function (key) {
- aliases[key] = [].concat(opts.alias[key]);
- aliases[key].forEach(function (x) {
- aliases[x] = [key].concat(aliases[key].filter(function (y) {
- return x !== y;
- }));
- });
- });
-
- [].concat(opts.string).filter(Boolean).forEach(function (key) {
- flags.strings[key] = true;
- if (aliases[key]) {
- flags.strings[aliases[key]] = true;
- }
- });
-
- var defaults = opts['default'] || {};
-
- var argv = { _ : [] };
- Object.keys(flags.bools).forEach(function (key) {
- setArg(key, defaults[key] === undefined ? false : defaults[key]);
- });
-
- var notFlags = [];
-
- if (args.indexOf('--') !== -1) {
- notFlags = args.slice(args.indexOf('--')+1);
- args = args.slice(0, args.indexOf('--'));
- }
-
- function argDefined(key, arg) {
- return (flags.allBools && /^--[^=]+$/.test(arg)) ||
- flags.strings[key] || flags.bools[key] || aliases[key];
- }
-
- function setArg (key, val, arg) {
- if (arg && flags.unknownFn && !argDefined(key, arg)) {
- if (flags.unknownFn(arg) === false) return;
- }
-
- var value = !flags.strings[key] && isNumber(val)
- ? Number(val) : val
- ;
- setKey(argv, key.split('.'), value);
-
- (aliases[key] || []).forEach(function (x) {
- setKey(argv, x.split('.'), value);
- });
- }
-
- function setKey (obj, keys, value) {
- var o = obj;
- keys.slice(0,-1).forEach(function (key) {
- if (o[key] === undefined) o[key] = {};
- o = o[key];
- });
-
- var key = keys[keys.length - 1];
- if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
- o[key] = value;
- }
- else if (Array.isArray(o[key])) {
- o[key].push(value);
- }
- else {
- o[key] = [ o[key], value ];
- }
- }
-
- function aliasIsBoolean(key) {
- return aliases[key].some(function (x) {
- return flags.bools[x];
- });
- }
-
- for (var i = 0; i < args.length; i++) {
- var arg = args[i];
-
- if (/^--.+=/.test(arg)) {
- // Using [\s\S] instead of . because js doesn't support the
- // 'dotall' regex modifier. See:
- // http://stackoverflow.com/a/1068308/13216
- var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
- var key = m[1];
- var value = m[2];
- if (flags.bools[key]) {
- value = value !== 'false';
- }
- setArg(key, value, arg);
- }
- else if (/^--no-.+/.test(arg)) {
- var key = arg.match(/^--no-(.+)/)[1];
- setArg(key, false, arg);
- }
- else if (/^--.+/.test(arg)) {
- var key = arg.match(/^--(.+)/)[1];
- var next = args[i + 1];
- if (next !== undefined && !/^-/.test(next)
- && !flags.bools[key]
- && !flags.allBools
- && (aliases[key] ? !aliasIsBoolean(key) : true)) {
- setArg(key, next, arg);
- i++;
- }
- else if (/^(true|false)$/.test(next)) {
- setArg(key, next === 'true', arg);
- i++;
- }
- else {
- setArg(key, flags.strings[key] ? '' : true, arg);
- }
- }
- else if (/^-[^-]+/.test(arg)) {
- var letters = arg.slice(1,-1).split('');
-
- var broken = false;
- for (var j = 0; j < letters.length; j++) {
- var next = arg.slice(j+2);
-
- if (next === '-') {
- setArg(letters[j], next, arg);
- continue;
- }
-
- if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
- setArg(letters[j], next.split('=')[1], arg);
- broken = true;
- break;
- }
-
- if (/[A-Za-z]/.test(letters[j])
- && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
- setArg(letters[j], next, arg);
- broken = true;
- break;
- }
-
- if (letters[j+1] && letters[j+1].match(/\W/)) {
- setArg(letters[j], arg.slice(j+2), arg);
- broken = true;
- break;
- }
- else {
- setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
- }
- }
-
- var key = arg.slice(-1)[0];
- if (!broken && key !== '-') {
- if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
- && !flags.bools[key]
- && (aliases[key] ? !aliasIsBoolean(key) : true)) {
- setArg(key, args[i+1], arg);
- i++;
- }
- else if (args[i+1] && /true|false/.test(args[i+1])) {
- setArg(key, args[i+1] === 'true', arg);
- i++;
- }
- else {
- setArg(key, flags.strings[key] ? '' : true, arg);
- }
- }
- }
- else {
- if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
- argv._.push(
- flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
- );
- }
- if (opts.stopEarly) {
- argv._.push.apply(argv._, args.slice(i + 1));
- break;
- }
- }
- }
-
- Object.keys(defaults).forEach(function (key) {
- if (!hasKey(argv, key.split('.'))) {
- setKey(argv, key.split('.'), defaults[key]);
-
- (aliases[key] || []).forEach(function (x) {
- setKey(argv, x.split('.'), defaults[key]);
- });
- }
- });
-
- if (opts['--']) {
- argv['--'] = new Array();
- notFlags.forEach(function(key) {
- argv['--'].push(key);
- });
- }
- else {
- notFlags.forEach(function(key) {
- argv._.push(key);
- });
- }
-
- return argv;
- }
- /*
- Iterable task should return either truthy or false
- Any fn will return only one value for an array of iterables. If any one iterable fails, the return value would be false.
- If all succeed , the return value will be true.
- If continueOnFailure is false, an execption is raised on any one failure
- */
- var logger = {
- l : function(){}
- };
- var any$3 = function(iterable, continueOnFailure, stopOnFirstSucces, options) {
- options = options || { trace : false };
- var l = logger.l;
- if(options.trace) l = console.log;
- // console.log('-------- ' + l)
-
- var cancelsignal = Symbol();
- return iterable.reduce(
- function(p, tasq, i ,a) {
- var handleError = function(error, pVal){
- if(error !== cancelsignal) {
- l(`E3 : i = ${i} `);
- console.dir(p);
- if(i>0 && a[i-1].info) console.dir(a[i-1].info);
- console.error(a[i-1]);
- a[i-1] ? l("tasq : " + a[i-1].toString()) : null;
-
- if(error.result) console.error(error.result);
- console.error('Error : ' + (error.message || error.messages) + ' -- ' + JSON.stringify(pVal));
- console.error('Error : ' + error.stack);
- tasq ? l("tasq : " + tasq.toString()) : null;
- l('debugData 3-------------------------');
- if(!continueOnFailure) {l("Cancelling remaining on any one failure ..."); throw cancelsignal}
- else return { error, pVal}
- }
- else throw cancelsignal;
- };
-
- if(Promise.resolve(p) === p ) {
- if(i>0 && a[i-1].info) p.info = a[i-1].info;
- var trycall = function(tasq){
- try {
- var result = tasq(); // PB : TODO -- Handle scope for call
- if(tasq.resultHandler) return tasq.resultHandler(result)
- // if(!result) throw result; // Default failure detection for functions is falsy values.
- return result
- } catch (error) {
- console.error(error);
- console.error('Error : ' + error ? error.stack : 'No stack');
- if(!continueOnFailure) throw error; // PB : TODO -- Support array of results for any with or without continueonfailure.
- }
- };
-
- return p.then( function(pVal){
- // Falsy values are no longer treated as task failure exceptions. Specially for Promises.
- // Even tasq function wrappers are required to return promises that eventually either resolve or reject..
- // Failures are known for promises on reject.
- // In future if we support direct sync function execution with a result examination for failure
- // we could examine the result of the function as falsy's... or a result evaluator handler needs to be passed in...
- // if(!pVal) handleError({ error : true, message : 'Failed without result' }, pVal)
-
- // Truthy values are failures if obj has error=true.
-
- var handleNext = function(rVal){
- if(stopOnFirstSucces && i > 0 && Object.prototype.toString.call(rVal) !== '[object Object]') return rVal;
-
- if(stopOnFirstSucces && i > 0 && !rVal.error) return rVal
- l('Task finished with result : ' + JSON.stringify(rVal));
- if(i>0 && a[i-1].info) console.dir(a[i-1].info);
- if(!tasq && !continueOnFailure) { l('Error : No task specified.'); throw false;}
- else if(!tasq) { l('Error : No task specified.'); return false;}
- return (Promise.resolve(tasq) === tasq ) ? tasq : trycall(tasq) ;
- };
-
- if(pVal && pVal.error) {
- if(continueOnFailure) return handleNext(pVal)
- else return handleError(pVal.error, pVal)
- }
-
- if(Promise.resolve(pVal) === pVal) {
- // Passed in function retured a promise. We still need to wait for it.
- return pVal //.then(function(rVal){ return handleNext(rVal); })
- }
- else return handleNext(pVal)
-
- })['catch'](function(error) {
- return handleError(error, null)
- })
- }
- // else if(!p) {
- // handleError({ error : true, message : 'Failed without result' }, pVal)
- // l("Bypass remaining on prior failure");
- // return false; // All remaining tasks will return false in the any results even if they are promisies still running or functions not initiated.
- // }
- else return p; // A truthy value
- }
- , Promise.resolve(true)
- );
- };
-
- function hasKey (obj, keys) {
- var o = obj;
- keys.slice(0,-1).forEach(function (key) {
- o = (o[key] || {});
- });
-
- var key = keys[keys.length - 1];
- return key in o;
- }
-
- function isNumber (x) {
- if (typeof x === 'number') return true;
- if (/^0x[0-9a-f]+$/i.test(x)) return true;
- return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
- }
-
- //Rounds down function
- // num - Value to rounddown, value - rounddown by
- function g_round(num, value) {
- num = parseFloat(num);
- if( num % value == 0){ num = Math.ceil(num/value) * value;}
- else { num = Math.ceil(num/value) * value - value; }
- return Math.round(num)
- }
-
- //Precision rounding function
- // Num - Value to roundoff, value - decimal precision (Ex: 10 - 1 decimal points, 100 - 2 decimal points)
- function p_round(num, value) {
- return Math.round((num + Number.EPSILON) * value) / value
- }
-
- // {{from}}, {{to}}
- // -- Extraday bounding range limits
- // -- null => no bounds => infinite past for {{from}} and infinite future for {{to}}
-
- // {{recurring}} === 0 there is no frequency or pattern that repeats within the bounded range.
- // -- Therefore the bounded range is the SINGULAR event
- // -- => {{start}} === {{from}} and {{end}} === {{to}}
-
- // {{recurring}} = {{pattern}}
- // Many envents either recurring at a regular or irregular extraday frequency specified by bits in {{recurring}}.
- // => pattern defines the frequency. pattern is limited to frequencies >= 1 day.
- // -- A paterrn of all bits daysbits or datesbits turned on is all days.
- // Example: {{from}} === null, {{to}} === null, recurring ==== 0b111111 is all days.
- // Additional Time and frequence information will be found in
- // {{start}}, {{end}}, {{for}} {{every}} {{duration???}}
-
- // -- Irregular Time Patterns within a day are currently not supported but can be supported
- // by another intraday recurring pattern mask {{recurrence To be appropriately renamed}}.
- // hour(24bits), min(60 bits), sec(60bits), ms(1000bits ???) match.
- // -- ms pattern matches to support irregular patterns like 3rd 20th and 908th ms may not be very useful but can be accomodated in the desgin if required.
-
- // -- All offsets are datetime offsets from 1st Jan 1900 ( SQL Server )
-
- // {{repeat}} -- is a repeated offset from an anchor. {{from}}, {{start}} are the only anchors.
- // {{period}} -- if period is specified {{end}} is computed as (n-1)*{{repaat}} + {{period}} <= {{to}} boundary. Where n is the number of occurences.
- // It is preferred for {{end}} to always be computed since we need to explode all events to qualify them wth the pattern anyway.
-
- // {{start}}, {{end}} offsets defining a window with or without a datetime anchor = {{from}} or queried @from normalized to UTC begining of day.
- // -- {{start}} -- Anchored offset to {{from}} or UTC begining of day > queried @from.
- // -- Eg: +8:00 hours from anchor every 24 hours --- {{start}} = 8:00 {{repeat}} = 24hours.
- // => implicitly a recurring repeating subdivision of {{from}} and {{to}} -- defaults to every day if {{every}} is not specified.
- // -- for which day ? => at a minimum {{from}} should not be null
- // -- If no {{from}} and {{to}} are specifed => unbounded so applicable from current date in a windowed form to past and future.
- // -- We only present a windowed set of events for the range being queried.
- // -- Need not be communicated to the client in exploded form. It is the clients responsibility to explode events for presentation.
- // -- Usually an Intraday bounding range but can span multiple days.
- // -- {{recurring}} => filtered by those extraday patterns bound or unbound.
- // -- IMPORTANT NOTE : {{recurring}} is not essential for a recurring event.
- // A recurring pattern is only one way of defining a recurring event mostly irregular patterns.
- // A recurring event with regular intervals can be defined using {{every}} starting at {{start}} or {{from}} if start is not defined.
- // -- {{recurring}} === 0
- // => no pattern but can be recurring, if subdivisions will not repeat beyond {{start}} and {{end}} at an extraday frequency.
- // -- But could be either a single event or an intraday repeating pattern for longer than a single day.
- // -- Since there is no extraday recurring pattern there is nothing to filter for days dates months.
- // -- {{start}} and {{end}} can span multiple consecutive days with or without an extraday pattern.
- // -- specified by the duration between {{start}} and {{end}} from 1st Jan 1970 to whenever {{end}} is.
- // -- single events are better specified as {{from}} and {{to}}
- // -- instead of {{from}} {start} {{end}} which is interpreted equivalent.
- // -- {{every}} => intraday regular frequency of every
- // -- Eg : 2 hours
- // -- {{for}} => for a period of
- // -- Eg : 75 minutes
- // -- {{for}} !== {{every}} provision for intermediate gaps or pauses in the regular {{every}} frequency
- // -- {{duration}} => with an event duration of
- // -- Eg : 15 minutes
- // -- equally distributed and occupying {{for}} without intermediate gaps
- // -- provides for a 3rd level further subdivision at {{for}} without any intermediate gaps.
- // -- {{for}} === {{every}} => {{every}} subdivision has no gaps
- // -- {{duration}} === null => no subdivision of {{for}} => {{for}} is the event
- // -- {{for}} === null => no subdivision of {{every}} {{every}} is itself the event
- // -- Eg : {{start}} = 8:12am 519ms, {{end}} = 8:00pm, {{every}} = 1 hour 6mins 20ms, {{for}} = 13 minutes 5 ms
- // -- PB : TODO -- Do we need an n {{occurences}} limit ? which possibly makes {{end}} redundant. System will pick whichever is earlier.
- // -- Note : It is not possible for {{for}} to repeat and occupy all of {{for}} with equal subdivision
- // However same effect can achived with {{duration}} which occupieas all of {{for}} with {{for}}==={{every}}
- //
- // -- Irregular intraday time frequencies. See discussion above.
-
- // {{quota}} -- quota limit at event. PB : TODO -- Is this required?
- // The same effect can be achieved with a subdivision of granular time slots
- // However qty will actually be computationally more efficient and address subdivision issues where fractions don't round up properly...
-
- // {{available}}
- // -- 0 => Unavialability Pattern
- // -- 1 => Availability Pattern
-
- // -------------------------------------------------------------------
- // timeUtils
- const daysbits = 7;
- const datesbits = 31;
- const monthsbits = 12;
-
- // 2**53-1 (+/-) is largest integer precision for 64 bit floating point IEE 754
- // 7 + 31 + 12 = 50 bits which fits.
- const datebitOffset = daysbits;
- const monthbitOffset = datesbits + daysbits; // Months are 0 based. So we need to offeset by 1 more so 31st is not overrwritten.
-
- const monthsMask = 0b111111111111 * 2** (monthbitOffset);
- const datesMask = 0b1111111111111111111111111111111 * 2 ** (datebitOffset);
- const daysMask = 0b1111111;
-
- var timeUtils = {
- // PB : TODO -- Currently assuming event e1 is a sub 1 day duration. Which may not be true.
- toRecurringPattern( event ){
- var dayBitToSet = event.from.getDay(); // 0 based Index
- var dateBitToSet = event.from.getDate() + datebitOffset - 1; // Dates are 1 based.
- var monthBitToSet = event.from.getMonth() + monthbitOffset; // 0 based
-
- var recurring = 2**dayBitToSet + 2**dateBitToSet + 2**monthBitToSet;
- // PB : TODO -- loop through all matching masks until the end.
- return {
- from : event.from, to : event.to, recurring: recurring
- , start: new Date ( event.from - new Date( moment(event.from).startOf('day') ) )
- , end: new Date ( event.to - new Date( moment(event.to).startOf('day') ) )
- }
- }
- , getSkipFunction(r, boundedRange){
- var areMonthsSelected = monthsMask & r.recurring;
- var areDatesSelected = datesMask & r.recurring;
- var areDaysSelected = daysMask & r.recurring;
-
- if(!areMonthsSelected && !areDatesSelected && !areDaysSelected) {
- console.error("Null patterns are useless for selection. This is probably not a recurring pattern");
- return null;
- }
-
- var filter = { from : boundedRange && boundedRange.from || new Date(moment().startOf('day')), to : boundedRange && boundedRange.to };
-
- // Returns how much to skip for next available value for a dimension.
- var reset = Symbol('reset');
- var stop = Symbol('stop');
- var skipFn = {
- create : (options)=>{
- var startFrom = options.startFrom;
- options.nBits;
- return {
- originOffset : null // From the origin.
- , getSkipGenerator : (selected)=>{
- var startOffset = null; // From position to start from.
-
- // var cycleEntryPoint = null;
- var nextCycleIndex = 0;
- var incrementCycle = [];
- var previous = 0;
- // Discover the cycle from the bitmask.
- for(var b = 0; b < nBits; b++) {
- if(selected & 1) {
- if(utils.js.isNull(originOffset)) this.originOffset = b;
- if(utils.js.isNull(startOffset) && (startFrom - b) <= 0){
- // startOffset cannot be negative. cycleEntryPoint is from the origin and is the entrypoint when there is no fitler.from...
- startOffset = b - startFrom; // As measured from filter.from i.e from startingPoint
- // cycleEntryPoint = b
- nextCycleIndex = incrementCycle.length-1; // The place to enter cycle after startoffset aligns to currentCycleIndex.
- }
- incrementCycle.push(1 + b - previous); // We keep pushing and then splice in the first item as the last item to make this cyclical.
- previous = 1 + b; // Minimum incrment is always 1;
- }
- }
- // Due to the cyclical nature incrementCycle[0] has the increment to the second item
- // and incrementCycle[incrementCycle.length-1] points to first item in cycle.
- incrementCycle.push(incrementCycle.splice(0,1));
- if(nextCycleIndex < 0) nextCycleIndex = 0;
- return function*(){
- var signal = false;
- signal = yield startOffset; // Could be 0. Aligns to the first match in the cycle after from.
- var i = nextCycleIndex;
- for(;;){
- for(; i < incrementCycle.length; i++ ) {
- signal = yield incrementCycle[i];
- if(reset === signal) { signal = yield this.originOffset; break; }
- if(signal === stop || signal.done) return null;
- }
- i = 0;
- }
- }
- }
-
- // Generator for Irregular boundaries.
- , getNextDateGenerator(selection){
- var iterator = this.getSkipGenerator(selection);
-
- return function*(){
- var nextPotentialDate = moment(potentialDate).add(iterator.next(), 'd');
- if(nextPotentialDate.month() != potentialDate.getMonth()) {
- // Handle month boundary increments.
- nextPotentialDate.startOf('month').add(dateIterator.next(reset), 'm');
- }
- var potentialDate = nextPotentialDate;
- yield nextPotentialDate;
- }
- }
- // Cyclical Generator.
- , getNextGenerator(options, selection){
- this.getSkipGenerator(selection);
- var next = filter.from;
-
- return function*(){
- yield next = moment(next).add(dayIterator.next(), 'd');
- }
- }
- }
- }
- };
- var monthSkipper = skipFn.create({ nBits : monthsbits, startFrom : filter.from.getMonth() });
- var daySkipper = skipFn.create({ nBits : daysbits, startFrom : filter.from.getDay() });
- var dateSkipper = skipFn.create({ nBits : datebits, startFrom : filter.from.getDate()-1 }); // Skipfn requires a 0 based startFrom.
-
- if(!areMonthsSelected && !areDatesSelected) return daySkipper(areDaysSelected)
- else if(!areDatesSelected && !areDaysSelected) return monthSkipper(areMonthsSelected/2**(datesbits + daysbits))
- else if(!areMonthsSelected && !areDaysSelected) return dateSkipper(areDatesSelected/2**(daysbits))
- else {
- if(!areMonthsSelected) {
- // Dates, Days are selected.
- return function*(){
-
- var dateIterator = dateSkipper.getNextDateGenerator({ nBits : datebits, startFrom : filter.from.getDate()-1 }, areDatesSelected/2**(daysbits));
- var dayIterator = daySkipper.getNextGenerator({ nBits : daysbits, startFrom : filter.from.getDay() }, areDaysSelected);
-
- var potentialDay = null;
- var potentialDate = dateIterator.next(); // Irregular cycle end...
- if(isAnd) {
- // Both day and date shuld match.
- for(;;){
-
- for(; (potentialDay = dayIterator.next()) < potentialDate ;);
- // PB : TODO -- If we never hit the equals condition this will be a perpetual loop.
- // If both are integer skips we will have a LCM and therefore hit this condition.
- // In the case of sets of irregular skips we still will have the sum of each set also have an LCM.
- // However for irregular boundaries we cannot predict whether an LCM exists and if a equality condition will ever be met.
- // In such cases we need to protect from an infinite loop that will never yield.
- // For dates though despite the irregular boundaries the pattern is that every date, month combination falls on every day of week.
- if(potentialDay == potentialDate) {
- yield potentialDay;
- potentialDate = dateIterator.next();
- continue;
- }
- for(; (potentialDate = dateIterator.next()) < potentialDay;);
- }
- }
- else {
-
- for(;;){
-
- for(; (potentialDay = dayIterator.next()) < potentialDate ;) {
- if(stop === (yield potentialDay)) return null;
- }
- if(potentialDay == potentialDate) {
- potentialDate = dateIterator.next();
- continue; // We need to yield in sorted sequence.
- }
- for(; (potentialDate = dateIterator.next()) < potentialDay;) {
- if(stop === (yield potentialDate)) return null;
- }
- }
- }
- }
- }
-
- }
- }
- , skipThisRecurrable : Symbol('skipThisRecurrable')
- , stopThisIterator : Symbol('stopThisIterator')
- , toEvents( r, boundedRange){
- if(!boundedRange.to) throw 'toEvents requires a bounded Range with an end to terminate. Use generater for unbounded operations'
- ({ from : boundedRange.from || new Date(moment(new Date()).startOf('day')), to : boundedRange.to });
- }
- , jsstart : function(){
- return new Date(moment(new Date(0)).startOf('day')) //1st Jan 1970 12AM local time
- }
- // Returns the whole event that is qualified even by a partial intersection.
- , getEventGenerator : function* (objOrArray, boundedRange, getEvent) {
-
-
- getEvent = getEvent || function(r, startOfDayFrom, start, end) {
- var event = Object.assign( {}, r);
- delete event.recurring;
-
-
- event.from = new Date (startOfDayFrom.getTime() + start.getTime() + utils.getTZOffsetMilliseconds() );
- event.to = new Date ( startOfDayFrom.getTime() + end.getTime() + utils.getTZOffsetMilliseconds());
- // { from : new Date ( startOfDayFrom.getTime() + start.getTime() ) , to : new Date ( startOfDayFrom.getTime() + end.getTime()) }
- return event
- };
-
- var recurrables = utils.js.isObject(objOrArray) ? [objOrArray] : objOrArray;
-
- // We need to start somewhere. We dont need an end as we keep generating perpetually.
- var filter = { from : boundedRange && boundedRange.from || new Date(moment().startOf('day')), to : boundedRange && boundedRange.to };
- for(var gIdx=0; gIdx < recurrables.length; gIdx++){
- // Explode eachRecurrable to list of qualified events
- var eachRecurrable = recurrables[gIdx]; // eachRecurrable -> Recurrable event (eg)
- if( eachRecurrable.to && eachRecurrable.to <= filter.from ) continue; // Disjoint. No need to generate. Usually a past recurring pattern.
-
- var startFrom = filter.from;
-
- if( eachRecurrable.from) {
- if(filter.to && filter.to <= eachRecurrable.from ) continue; // Disjoint.
- if(eachRecurrable.from >= filter.from) startFrom = eachRecurrable.from;
- }
-
- var startOfDayFrom = new Date( moment(startFrom).startOf('day') ); // PB : TODO -- IMP pattern TZ...
- var next = null;
-
- var stopAt = eachRecurrable.to ? filter.to ? Math.min(filter.to, eachRecurrable.to) : eachRecurrable.to : filter.to ? filter.to : false;
- var shouldStop = stopAt ? ()=>{ return option === this.skipThisRecurrable || next.from >= stopAt } : ()=>{ return option === this.skipThisRecurrable || false }; // Perpetual callee can stop asking for next()..
-
- // time recurring patterns are sorted and sequential so there is no chance we will find any more after end.
- // which implies there is no need to test the rest of the recurring patterns until end of the boundary
- if(filter.to && eachRecurrable.to) {
- var stopAt = new Date(Min(filter.to, eachRecurrable.to));
- shouldStop = ()=>{ return option === this.skipThisRecurrable || (stopAt <= next.to ? stopAt : false) };
- }
-
- var start = eachRecurrable.start || this.jsstart();
- var end = eachRecurrable.end || new Date(moment(start).add(1, "d"));
-
- var option = true;
- next = getEvent(eachRecurrable, startOfDayFrom, start, end);
-
- while( !shouldStop() ) {
- // PB : TODO -- If we provide an impossible pattern match we will perpetually not match and end up in an infinite loop.
- var patternMatched = this.__hasPatternIntersection(next, eachRecurrable);
- if(patternMatched) option = yield next;
- if(option === this.stopThisIterator) return null;
- // PB : TODO -- Instead of checking every day skip straightaway to the next sequential pattern match.
- startOfDayFrom = new Date( moment(startOfDayFrom).add(1, 'd') );
- next = getEvent(eachRecurrable, startOfDayFrom, start, end);
- }
- }
- }
-
- // PB : TODO -- Generator that returns a series of intersections events.
- // , recurringIntersectionsG : ()=>{}
-
- , isEvent : function(obj){
- return !obj.recurring
- }
- , isRecurringPattern : function(obj){
- return obj.recurring
- }
- , hasEventIntersection( e1Orr1, e2Orr2 ){
- return utils.timeUtils.isEvent(e1Orr1) && utils.timeUtils.isRecurringPattern( e2Orr2 ) ? utils.timeUtils.__recurringHasIntersection( e1Orr1, e2Orr2 )
- : utils.timeUtils.isEvent(e2Orr2 ) && utils.timeUtils.isRecurringPattern( e1Orr1 ) ? utils.timeUtils.__recurringHasIntersection( e2Orr2, e1Orr1 )
- : utils.timeUtils.isEvent(e1Orr1) && utils.timeUtils.isEvent(e2Orr2) ? utils.timeUtils.__hasEventIntersection( e1Orr1, e2Orr2 )
- : utils.timeUtils.__willPatternsIntersect( e1Orr1, e2Orr2 ) //(()=>{throw 'PB : TDOO -- To Be implemented'})()
- }
-
- , __hasPatternIntersection( e1, p2 ){
-
- var areMonthsSelected = monthsMask & p2.recurring;
- var areDatesSelected = datesMask & p2.recurring;
- var areDaysSelected = daysMask & p2.recurring;
-
- // PB : TODO -- Gaurd against impossible patters like 29th Feb, 31st April etc...
-
- if(!areMonthsSelected && !areDatesSelected && !areDaysSelected) {
- console.error("Null patterns are useless for selection. This is probably not a recurring pattern");
- return null; // Null patterns result in null intersection.
- }
-
- var isAnd = false;
- if(!areMonthsSelected && !areDatesSelected || !areMonthsSelected && !areDaysSelected || !areDatesSelected && !areDaysSelected ) ;
- else {
- isAnd = p2.isAnd;
- }
-
- var p1 = this.toRecurringPattern(e1);
- var patternMatched = p1.recurring & p2.recurring;
- // In the and case asserts if p1 is a subset of p2 not the other way around. A recurring pattern should always be a superset of an event.
- // And that is what is being queried... for any degree of usefulness.
- return ( isAnd ? p1.recurring === patternMatched : patternMatched );
- // returns truthy pattern that intersects.
- }
-
- , __willPatternsIntersect( p1, p2 ){
-
- if(p1.from && p2.to && p2.to <= p1.from) return false;
- if(p2.from && p1.to && p1.to <= p2.from) return false;
-
- var areMonthsSelected = monthsMask & p2.recurring;
- var areDatesSelected = datesMask & p2.recurring;
- var areDaysSelected = daysMask & p2.recurring;
-
- // PB : TODO -- Gaurd against impossible patters like 29th Feb, 31st April etc...
-
- if(!areMonthsSelected && !areDatesSelected && !areDaysSelected) {
- console.error("Null patterns are useless for selection. This is probably not a recurring pattern");
- return null; // Null patterns result in null intersection.
- }
-
- var isAnd = false;
- if(!areMonthsSelected && !areDatesSelected || !areMonthsSelected && !areDaysSelected || !areDatesSelected && !areDaysSelected ) ;
- else {
- isAnd = p2.isAnd;
- }
-
- var areP1MonthsSelected = monthsMask & p1.recurring;
- var areP1DatesSelected = datesMask & p1.recurring;
- var areP1DaysSelected = daysMask & p1.recurring;
-
- // PB : TODO -- Gaurd against impossible patters like 29th Feb, 31st April etc...
-
- if(!areP1MonthsSelected && !areP1DatesSelected && !areP1DaysSelected) {
- console.error("Null patterns are useless for selection. This is probably not a recurring pattern");
- return null; // Null patterns result in null intersection.
- }
-
- var isP1And = false;
- if(!areP1MonthsSelected && !areP1DatesSelected || !areP1MonthsSelected && !areP1DaysSelected || !areP1DatesSelected && !areP1DaysSelected ) ;
- else {
- isP1And = p1.isAnd;
- }
-
-
- if(isAnd && isP1And === isAnd ) {
- return p1.recurring === p2.recurring;
- }
- else if(isAnd) {
- matchtarget = p2.recurring ;
- }
- else if(isP1And ) {
- matchtarget = p1.recurring ;
- }
-
- var patternMatched = p1.recurring & p2.recurring;
- // In the and case asserts if p1 is a subset of p2 not the other way around. A recurring pattern should always be a superset of an event.
- // And that is what is being queried... for any degree of usefulness.
-
- var __patternMatched = ( isAnd || isP1And ? matchtarget === patternMatched : patternMatched );
-
- if(__patternMatched) {
- if(p1.start && p2.end && p2.end <= p1.start) return false;
- if(p2.start && p1.end && p1.end <= p2.start) return false;
-
- return true;
-
- }
- else {
- return false
- }
- // returns truthy pattern that intersects.
- }
- , __recurringHasIntersection(e1, r1){
-
- // PB : TODO -- Date patterns UTC or Local ? i.e does a Monday mask match UTC Mondays or Local Mondays ????
- // PB : TODO -- Use recunrence generator insteadof startOf today hack based on simplified same day start end assumptions.
- if(e1.from && r1.to && r1.to <= e1.from) return false;
- if(r1.from && e1.to && e1.to <= r1.from) return false;
- // Returns intersection or false.
- return ( utils.timeUtils.__hasPatternIntersection(e1, r1) ) ? (()=>{
- // new Date ( new Date( this.rdata.get('unavailablefrom') ) - new Date( moment().startOf('day') ) )
-
- var startOfe1 = new Date( moment(e1.from).startOf('day') );
- var r1E = {
- from: new Date(startOfe1.getTime() + r1.start.getTime() + utils.getTZOffsetMilliseconds() )
- , to: new Date(startOfe1.getTime() + r1.end.getTime() + utils.getTZOffsetMilliseconds() )
- };
- // SAM : TODO -- Verify and enable this code.
- // if(r1.from && r1E.from <= r1.from) r1E.from = r1.from;
- // if(r1.to && r1E.to >= r1.to) r1E.to = r1.to;
- return utils.timeUtils.__hasEventIntersection(e1, r1E)
- })()
- : false
- }
-
- // Checks if two non recurring i.e singular events intersect and if so returns the actual intersection.
- , __hasEventIntersection(e1, e2){
-
- // PB : TODO -- No assertions for invalid inputs e.from is expected to be <= e.to
- if(!e1.from && !e1.to) return e2;
- if(!e2.from && !e2.to) return e1;
-
- var e1FromAnde2To = e1.from && e2.to;
- var e2FromAnde1To = e2.from && e1.to;
-
- var __aFrombTo = (a, b)=>{
- // boundary value overlap is insufficient for intersection. At least 1 millisecond diff is required.
- return (a.from >= b.to ? false
- : a.to && a.to > b.to || !a.to ?
- { from : b.from && b.from > a.from ? b.from : a.from, to : b.to }
- : b.from && b.from >= a.to ? false : { from : b.from && b.from > a.from ? b.from : a.from, to : a.to }
- )
- };
-
- var result = e1FromAnde2To ? __aFrombTo(e1, e2)
- :( e2FromAnde1To ? __aFrombTo(e2, e1)
- : /* e1FromAnde2To is false and e2FromAnde1To is false => either both froms or both tos exist */
- e1.from ? { from: new Date(Math.max(e1.from, e2.from)) } : { to: new Date(Math.min(e1.to, e2.to)) });
-
- return result
- }
-
- , exludeIntersection(freeTimes, e) {
- // Removal of unavilable times will split and splice into the same freeTimes array.
- for(var i =0; i < freeTimes.length; i++) {
- var intersection = timeUtils.hasEventIntersection(freeTimes[i], e);
- if(intersection) {
- // Edit freetime to correct for current collision.
- if(freeTimes[i].from >= intersection.from && freeTimes[i].to <= intersection.to) {
- freeTimes.splice(i,1); i = i-1;
- }
- else {
- var right = Object.assign({}, freeTimes[i]);
- right.from = intersection.to;
- freeTimes[i].to = intersection.from;
- if( right.from < right.to ) {
- freeTimes.splice(++i,0, right); // Skip this we have already processed it.
- }
- }
- }
- }
- }
-
- , getFreeTimes( tRange, events, dimensions) {
- var freeTimes = [tRange];
- for(var eIdx = 0; eIdx < events.length; eIdx++) {
- var e = events[eIdx];
- timeUtils.exludeIntersection(freeTimes, e);
- if(freeTimes.length === 0) break;
- }
- // { result : freeTimes.length > 0, freeTimes : freeTimes}
- return freeTimes;
- }
-
- // PB : TODO -- Timeutils Test cases. Comment in production.
- , testAll(){
-
- // // Disjoint
- // var expected = false
- // var actual = null;
-
- expected = 2**4 + 2**(6+21) + 2**(5+31+6);
- actual = this.toRecurringPattern(
- { from : new Date('5/21/2020, 11:45:00 PM'), to : new Date('5/22/2020, 00:15:00 AM') } ).recurring;
- if(expected !== actual ) throw (' TEST FAILED toRecurringPattern : expected = ' + expected + ' actual = ' + actual)
-
- // actual = this.__hasEventIntersection(
- // { from : new Date('5/21/2020, 11:45:00 PM'), to : new Date('5/22/2020, 00:15:00 AM') }
- // , { from : new Date('5/22/2020, 11:45:00 PM'), to : new Date('5/23/2020, 00:15:00 AM') })
- // if(expected !== actual ) throw (' TEST FAILED Disjoint : expected = ' + expected + ' actual = ' + actual)
-
- // // Interleaved
- // expected = JSON.stringify({ from : new Date('5/22/2020, 00:00:00 AM'), to : new Date('5/22/2020, 00:15:00 AM') })
- // actual = this.__hasEventIntersection(
- // { from : new Date('5/21/2020, 11:45:00 PM'), to : new Date('5/22/2020, 00:15:00 AM') }
- // , { from : new Date('5/22/2020, 00:00:00 AM'), to : new Date('5/22/2020, 00:30:00 AM') })
- // if(expected !== JSON.stringify(actual) ) throw (' TEST FAILED Interleaved : expected = ' + expected + ' actual = ' + JSON.stringify(actual))
-
- // // Subset
- // expected = JSON.stringify({ from : new Date('5/22/2020, 00:00:00 AM'), to : new Date('5/22/2020, 00:10:00 AM') })
- // actual = this.__hasEventIntersection(
- // { from : new Date('5/21/2020, 11:45:00 PM'), to : new Date('5/22/2020, 00:15:00 AM') }
- // , { from : new Date('5/22/2020, 00:00:00 AM'), to : new Date('5/22/2020, 00:10:00 AM') })
- // if(expected !== JSON.stringify(actual) ) throw (' TEST FAILED Interleaved : expected = ' + expected + ' actual = ' + JSON.stringify(actual))
-
- // Null
-
- // Boundary Test Cases....
-
- var r1 = {
- end: new Date("1970-01-01T11:00:00.000Z")
- , every: null
- , from: new Date("2020-06-04T06:30:00.000Z")
- , id: "DC664060-A0A8-11EA-8B3D-7771F3D49CC1"
- , migrationstate: 1
- , practitionerId: "5FDF1790-8288-11E9-9044-91D8D8658887"
- , purpose: "Meeting"
- , recurring: 106
- , start: new Date("1970-01-01T06:30:00.000Z")
- , status: "SCHEDULED"
- , to: null
- };
- var e1 = {
- availability: false
- , end: null
- , every: null
- , for: null
- , from: new Date("2020-06-08T11:00:00.000Z")
- , id: "AEC5A7E1-A96D-11EA-8DE7-19E354C126F4"
- , migrationstate: 8
- , patientId: "271F4970-F173-4530-A894-68F520BF7945"
- , patientmob: "9944715969"
- , patientname: "SAMUEL RAJA DURAI J"
- , practitionerId: "5FDF1790-8288-11E9-9044-91D8D8658887"
- , purpose: "Appointment"
- , start: null
- , status: "SCHEDULED"
- , to: new Date("2020-06-08T11:15:00.000Z")
- };
-
- this.hasEventIntersection(e1, r1);
- debugger
- // Iterators
- var eventIterator = this.getEventGenerator({ recurring : 2**1 }); // All Mondays from today.
- for(var i=0, e; i<10 && !(e=eventIterator.next()).done; i++) {
- console.dir(e);
- }
-
- }
- };
-
- function promisify(ctx, operation, arraylikearguments) {
- // operation.isAsync We cant assume the last argument being a function implies the last arg is the callback unless we are told.
- // Currently we default to the assumption that if the last arg is a function it is the callback.
- var noargs = !arraylikearguments;
- var nocb = noargs || utils.js.isFunction(arraylikearguments[arraylikearguments.length-1]); /* && operation.isAsync */
- // We always expect a callback as the last arg.
- arraylikearguments = arraylikearguments || [function(){}];
- var originalcallback = arraylikearguments.splice(arraylikearguments.length-1, 1)[0];
- return new Promise(function(resolve, reject) {
- var r = operation.call(ctx, ...arraylikearguments, function(err, result) {
- if (err) return reject(arguments);
- resolve(arguments);
- });
- if(nocb) return resolve([r])
- }).then((aArr)=>{
- originalcallback(...aArr);
- return aArr[1]
- }).catch(function(aArr){
- originalcallback(...aArr);
- throw aArr[0];
- });
- }
-
- var Tasq$1 = (function(){
-
- var __proto__ = {
- };
-
- var listeners = [];
-
- function Tasq(first, ...rest){
- first.info = utils.assign({ args : rest }, __proto__);
- return first
- }
- Tasq.create = Tasq;
- Tasq.addlistener = (l)=>{ listeners.push(l); };
- Tasq.catch = (e)=>{ console.error(e); console.error(e.messages.join(' ')); listeners.forEach(l => { l(e); } );};
- Tasq.then = (d)=>{ listeners.forEach(l => { l(null, d); } ); return d};
- return Tasq
- })();
-
-
-
- var Traq$1 = (function(){
- var __proto__ = {};
-
- var log = {
- SUCCESS : []
- , FAILURE : []
- , SKIPPED : []
- };
-
- Traq$1 = function(){ return utils.assign({}, __proto__) };
- Traq$1.create = Traq$1;
- Traq$1.statuslog = statuslog;
- function statuslog(err, data){
- if(err) log.FAILURE.push( {err, data} );
- else log.SUCCESS.push(data);
- }
- Traq$1.notify = (event)=>{
- if(event.error) log.FAILURE.push( event );
- else log.SUCCESS.push(event);
- };
- Traq$1.finally = ()=>{
- console.log('Total : ' + (log.SKIPPED.length + log.SUCCESS.length + log.FAILURE.length));
- console.log('Pass : ' + log.SUCCESS.length );
- console.log('Fail : ' + log.FAILURE.length);
- console.log('Skipped : ' + log.SKIPPED.length);
-
- console.log('FAILURES');
- console.log([JSON.stringify(log.FAILURE)]);
- };
- return Traq$1
- })();
-
-
- var tzoffset = 0;
- var utils = {
- commonmasks : m_common,
- p_round: p_round,
- g_round: g_round,
- escapeRegExp(string) {
- return string.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); // $& means the whole matched string
- }
-
- , getTZOffsetMilliseconds : (()=>{
- var d = new Date();
- var t1 = d.toISOString().replace('Z','');
- var t2 = d.toISOString();
- tzoffset = ( new Date(t2) - (new Date(t1))); // /60/60/1000 -- milliseconds.
- return ()=>{ return tzoffset}
- })()
-
- , getLocalDateYYYYMMDD(date){
- var d = new Date();
- d.setTime(tzoffset + new Date(date).getTime());
- return d.toISOString().slice(0,10).replace(/-/g,"")
- }
-
- , assign(target /** , ...sources */) {
- return utils.assign_core(false, ...arguments)
- }
-
- , assign_strict(target /** , ...sources */) {
- return utils.assign_core(true, ...arguments)
- }
-
- // assign
- , assign_core(keycase, target /** , ...sources */) {
- // Important use this instead of Object.assign.
- // Object.assign has several limitations.
- // 1) It doesn't skip intermediates if the final overriden value is already determined.
- // This implementation address this.
- // 2) It is shallow and doesn't clone object references and therefore risks side effects to original nested objects.
- // This implementation deep clones objects arrays and other types with some limitations.
- // 3) Does not merge but allways overrides.
- // Merges objects and arrays. Overides primitives.
- // Array merge is by default a concatenation.
- // PB : TODO -- If corresponding array indices have objects they can be merged like lodash.
- // 4) Does not retain non writable and configurable attributes.
- // This implementation copies descirptors so clones retain non writability and configurability identical to the source.
- // 5) Recursion can cause infinite recursion. Object.assign doesn't deal with this.
- // Detects and avides ininite recursion.
-
- var cpi = {}; // Caseless property index of already processed target keys. Since we do not alter the target key we need a lookup that gives the actual key.
- var getNormalizedKey = keycase ?
- keycase === 'lower' ? (key)=> key.toLowerCase() : (key)=>key
- : (key)=> key.toLowerCase(); // returns a normalized equivalent key.
-
- // We do a right to left iterations!
- // overrideKeys = true;
-
- // PB : Note -- IMPORTANT alreadyScanned has side effects..
- var alreadyScanned = (key)=>{
-
- Object.keys(target).forEach(k => {
- cpi[k.toLowerCase()] = k;
-
- if(cpi[k.toLowerCase()] !== k){
- Object.defineProperty( target, cpi[k.toLowerCase()], Object.getOwnPropertyDescriptor(target, k) ); // Relocate to new overridden key
- delete target[tkeys[tkidx]]; // PB : TODO -- review that accessors are not called during delete !
- }
- });
- alreadyScanned = ()=>{ return true; }; // Dont do anything next time we are called.
- // Its not necessary that we found it.
- cpi[key.toLowerCase()] ? null : cpi[key.toLowerCase()] = key;
- return false;
- };
-
- // PB : Note -- IMPORTANT findEqualKey has side effects..
- var findEqualKey = (key) => {
- // If equiv key on the target is what the target key should ultimately be we will cache all possible now.
- // However in the overrideKeys case this is not true in which case we postpone until the first one found in the overrider.
- {
-
- if(alreadyScanned(key)) { cpi[key.toLowerCase()] ? null : cpi[key.toLowerCase()] = key; } }
- var targetKey = cpi[key.toLowerCase()];
- return { targetKey, propertyDescriptor : Object.getOwnPropertyDescriptor(target, targetKey) }
- };
-
- var hOP = Object.prototype.hasOwnProperty;
-
- var __assign = function(keycase, target /** , ...sources */) {
-
- if(utils.js.isUndefined(target)) return; // There is noting to assign to. We just play dumb. Why did the caller even call us ?
-
- // PB : TODO -- we need a flag to support undefined overrides. Default behavior is to retain as much as possible.
- // if(utils.js.isUndefined(arguments[arguments.length-1])) return undefined;
- var undef = 0;
- for(; undef < arguments.length-1 && utils.js.isUndefined(arguments[arguments.length-undef-1]); undef++); // Skip all undefined overrides.
- if(undef === arguments.length-1) return target;
-
- if(utils.js.isPrimitive(arguments[arguments.length-1-undef])) return arguments[arguments.length-1-undef];
- else {
- // PB : TODO -- Primitive targets cannot be preserved.
- // Target should be decided on first non primitive discovery.
- // Arrays don't work properly yet...
- // We start with a temporary object and if there is a primitive override it will override this temporary object altogether.
- // PB : TODO -- We could convert primitives to their respective object counterparts... Howeer strings with indexes and arrays will get messy.
- if(utils.js.isPrimitive(target)) {
- target = {};
- } }
-
- for(var
- finalized = {} // One instance for each structurally corresponding key that has already been overridden. Order need not be guaranteed.
- , overrideOrMerge = function (originalkey) {
- // Decision merge or override default to the following.
- // Primitives are overridden by non Primitives ( arrays or objects )
- // Non Primitives are overridden by Primitives. There is no concept of assigning Primitives as new named attributes of Objects.
- // Objects assigned to Objects will be merged.
- // Arrays assigned to Arrays will be merged i.e concatenated. PB : TOOD -- Order will be ??? target then right to left for sources.
-
- // PB : TODO -- We should avoid examining or tampering with the value during clone and should find another way to make this decision.
- // We do not want side effects to occur while examining the value. Accessors and proxies can do this.
- // Currently assuming simple use cases at this point...
- // Ideally Accessor Descriptors should be postponed for evaluation when runtime access to value is required.
-
- var { targetKey, dL } = findEqualKey(originalkey);
- var dR = Object.getOwnPropertyDescriptor(this, originalkey);
-
- if(!dL) {
- // target did not have what it should be according to what was specifed. Lets check for other possibilities.
- dL = Object.getOwnPropertyDescriptor(target, originalkey);
- if(!dL) { Object.defineProperty( target, targetKey, dR ); finalized[targetKey] = true; return; }
- }
-
- if(!utils.js.isUndefined( dR.writable )) { // writable attribute is present only in Data Descriptor Case
- var valR = this[originalkey]; // We can examine data descriptors without any side effects. ( PB : TODO -- Proxies ! are expected to be transparent !! )
- if(utils.js.isPrimitive( valR )) {
- finalized[targetKey] = true;
-
- // Primitive values also are implicitly cloned by Data Descriptors when defineProperty is called.
- // Advantage is writable / configurable permissions are retained instead of simple assignment.
- Object.defineProperty( target, targetKey, dR );
- return
- }
- // If its not primitive it may need to get merged if the Left value is also non primitive and of a compatible type...
- }
-
- // PB : TODO -- Data descriptor that is not writable needs to be handled !? proper check to handle value etc required.
- if(utils.js.isUndefined( dR.writable ) || utils.js.isUndefined( dL.writable ) ){
- // One or both of them is an accessor descriptor.
- // If either one of them is an accessor we need to postpone the merge to runtime evaluation on access.
-
- var dChosen = !utils.js.isUndefined( dL.writable ) ? dR : dL; // Figure out which one is the accessor.
-
- // Accessor Descriptors cannot be examined due to possible side effects and possible differences
- // in the value and its type at the point of execution.
- // Since the accessed value here is meaningless we don't know what type it will eventually be at the point wehre
- // real program code needs the value !!!
- // There are 2 options
- // 1) we could do a decoupling here (at clone time) and capture the value.
- // 2) or we could postpone until run time evaluation.
- // Since in either case We need to examine the value it may be superior to evaluate at runtime and decide then.
- // Although decoupling is important and better done as early as possible the delayed value is more important.
- // PB : TODO -- We should provide a pref to evaluate and decouple at clone time
- // PB : TODO -- The postponing strategy has one more issue where delayed override can clobber target modifications on the left side.
- // -- Causing unexpected values specifically when the delayed override value from the source is expected.
- // Ideally the value that was set intermediately should supercede.
- // -- The preferred behaviour implemented here is to decouple on first set such that the intermediate value set on the clone supercedes.
- // Original getter needs to access value in original context.
- // Setters need to be redirected to "cloned setter" in current context.
- var ctx = this;
- var dRGetter = !utils.js.isUndefined( dR.writable ) ? function(){ return dR.value} : dR.get;
- var dLGetter = !utils.js.isUndefined( dL.writable ) ? function(){ return dL.value} : dL.get;
- var valForSetter = null;
- dR.configurable;
-
- if(!utils.js.isUndefined( dL.writable )) {
- // Oridinarily since we postpone we need to refrence and reevaluete valL also at access time coz the target val could have been switched.
- // The target is now an accessor which gets decoupled on first set in that case there is no need to re-evaluate.
- // These getters are still valid until such a first set happens until which time the valL remains
- // It is therefore possible to cache the valL and use it instead of target[key] at access time....
- var valL = target[targetKey];
- if(utils.js.isPrimitive(valL)) { dChosen.get = function(){ return dRGetter.call(ctx) }; }
- else { dChosen.get = function(){
- // In this case decoupling could happen on first access instead of first set.
- return utils.assign_core(keycase, valL, dRGetter.call(ctx))
- };
- }
- }
- else {
- // rVal could be an accessor or a nonPrimitive. Either case it needs to be mreged in.
- dChosen.get = function(){ return utils.assign_core(keycase, dLGetter.call(target), dRGetter.call(ctx)) };
- }
-
- // __setter ! Although this is running in the current context we cant use the dR.set setter like so dL.set = dR.set
- // this is dangerous as we do not know what else the setter does !!!. We don't konw what the getter does either
- // but we need to do a one time read in any case wheter at clone time or at access time.
- dChosen.set = function(val) {
- // First time set on clone decouples
- dChosen.get = function() { return valForSetter};
- dChosen.set = function(val) { return valForSetter = val };
- dChosen.configurable = true;
- Object.defineProperty( target, targetKey, dChosen );
- return valForSetter = val
- };
- dChosen.configurable = true;
- Object.defineProperty( target, targetKey, dChosen );
- finalized[targetKey] = true;
- return
- }
-
- // Neither is an accessor. valR is nonPrimitive, dL is not an Accessor
- // Target is also a Data Descriptor. We can examine it as well to take a decision.
- var valL = target[targetKey]; // We can examine data descriptors without any side effects. ( Proxies ! are expected to be transparent !! )
- if(utils.js.isPrimitive( valL )) {
- if(!utils.js.isNull( valR ) && !utils.js.isUndefined( valR )) {
- finalized[targetKey] = true;
- Object.defineProperty( target, targetKey, dR );
- }
- return
- }
- else {
- // Neither is Primitive.
- // console.log('Assign Iter...')
- if(valL === valR) { finalized[targetKey] = true; return true;}
- if(utils.js.isObject( valL ) && utils.js.isObject( valR )) { utils.assign_core(keycase, valL, valR ); finalized[targetKey] = true; return;}
- if(utils.js.isArray( valL ) && utils.js.isArray( valR )) { target[targetKey] = valL.concat(valR); finalized[targetKey] = true; return;}
- if(utils.js.isNull( valL ) || utils.js.isNull( valR )) { target[targetKey] = valR; finalized[targetKey] = true; return;}
- if(utils.js.isUndefined( valL ) && utils.js.isUndefined( valR )) { target[targetKey] = valR; finalized[targetKey] = true; return;}
-
- // Functions are tricky. Closures and bound functinos will continue to refer to source locations and could cause unpredictable behaviour.
- // However if such bound functions are being used the intention must be retention of such linkage.
- // Current behavior is to just override. PB : TODO -- Consider options to have multifunction event handlers... if needed.
- if(utils.js.isFunction( valR )) { target[targetKey] = valR; finalized[targetKey] = true; return;}
- else if (utils.js.isFunction( valL )) { return target[targetKey] = valL; } // target may not be valL scope.
-
- // Unsupported assign / merge for property datemodified data types Thu Sep 10 2020 15:59:38 GMT+0530 (India Standard Time)
- // , Thu Sep 10 2020 15:54:22 GMT+0530 (India Standard Time)
- // SAM : TODO dates are not getting merged.
- if(utils.js.isDate( valL ) && utils.js.isDate( valR )) { target[targetKey] = valR; return;}
-
- var msg = `Unsupported assign / merge for property ${targetKey} data types ` + valL + ' , ' + valR;
- console.error(msg);
- throw msg;
- }
- }
- , appendmissing = function (originalkey) {
- var standardizedKey = getNormalizedKey(originalkey);
- if (!hOP.call(finalized, standardizedKey)) overrideOrMerge.call(this, originalkey);
- }
- // Start from the rightmost and override or merge.
- , _junkvar = Object.keys(arguments[arguments.length-1-undef]).forEach(overrideOrMerge, arguments[arguments.length-1-undef])
- , i = arguments.length-1-undef;
- 2 < i--;
- utils.js.isUndefined(arguments[i]) ? null :
- // Intermediate primitives are useless. Skipped coz the target has already been assigned.
- utils.js.isPrimitive(arguments[i]) ? null
- : Object.keys(arguments[i]).forEach(appendmissing, arguments[i])
- ){}
-
-
- return target;
- };
-
- return __assign(...arguments)
- }
-
-
- // PB : TODO -- Proper type checking.
- // , __TPL__typeHandlers : {
- // '[object String]' : defaultFn
- // , '[object Array]' : defaultFn
- // , '[object Object]' : defaultFn
- // , '[object Null]' : defaultFn
- // , '[object Undefined]' : defaultFn
- // , '[object Date]' : defaultFn
- // , '[object RegExp]' : defaultFn
- // , '[object Function]' : defaultFn
- // }
-
- // PB : TODO -- Proper type checking.
- // Javascript language utilities that should have been really in the language itself.
- , js : {
-
- typeInstances : [
- ""
- , 0
- , true
- , null
- , // undefined
- , []
- , {}
- , Symbol()
- , new Date()
- , /.*/
- , Promise.resolve(true)
- , function() {}
- , BigInt(0)
- ]
- , proxyable : []
- , nonproxyable : []
-
- , isString(x) {
- return Object.prototype.toString.call(x) === "[object String]"
- }
- , isNumber(x) {
- return Object.prototype.toString.call(x) === '[object Number]'
- }
- , isBoolean(x) {
- return Object.prototype.toString.call(x) === '[object Boolean]'
- }
- , isNull(x) {
- return Object.prototype.toString.call(x) === '[object Null]'
- }
- , isUndefined(x) {
- return Object.prototype.toString.call(x) === '[object Undefined]'
- }
- , isArray(x) {
- return Object.prototype.toString.call(x) === '[object Array]'
- }
- , isObject(x) {
- return Object.prototype.toString.call(x) === '[object Object]'
- }
- , isSymbol(x) {
- return Object.prototype.toString.call(x) === '[object Symbol]'
- }
- , isDate(x) {
- return Object.prototype.toString.call(x) === '[object Date]'
- }
- , isRegExp(x) {
- return Object.prototype.toString.call(x) === '[object RegExp]'
- }
- , isPromise(x) {
- return Promise.resolve(x) === x
- }
- , isPromiseOrFunction(o) {
- if(utils.js.isPromise( o ) || utils.js.isFunction(o)) return true;
- return false;
- }
- , isFunction(x) {
- return Object.prototype.toString.call(x) === '[object Function]'
- }
- , isBigInt(x) {
- return Object.prototype.toString.call(x) === '[object BigInt]'
- }
-
- , isDataDescriptor(d) { return (utils.js.isUndefined(d.set) && utils.js.isUndefined(d.get)) ? d : false }
-
- // Grouping JS Types into 4 Groups
- // Primitives
- // -- boolean, String, Number
- // Arrays
- // Objects
- // Special
- // -- date, regexp, function ... and other unkown types
- , typeGroups() {
- return [
- '[Primitive]'
- , '[Null]'
- , '[Undefined]'
- , '[Symbol]'
- , '[Array]'
- , '[Object]'
- , '[Special]'
- ]
- }
-
- , typeGroup(x) {
- var tgMap = {
- '[object String]' : '[Primitive]'
- , '[object Number]' : '[Primitive]'
- , '[object Boolean]' : '[Primitive]'
- , '[object Null]' : '[Null]'
- , '[object Undefined]' : '[Undefined]'
- , '[object Symbol]' : '[Symbol]'
- , '[object BigInt]' : '[BigInt]'
-
- , '[object Array]' : '[Array]'
- , '[object Object]' : '[Object]'
- , '[object Date]' : '[Special]'
- , '[object RegExp]' : '[Special]'
- , '[object Function]' : '[Special]'
- , '[object Promise]' : '[Special]'
- };
- return tgMap[Object.prototype.toString.call(x)]
- }
-
- , getTypeInfo(x) {
-
- var typeMap = {
- '[object String]' : //__assign(typeInfo,
- { typeGroup : '[Primitive]', isString : true, isPrimitive : true
- , create : ()=>{return ""} }
- //)
- , '[object Number]' : { typeGroup : '[Primitive]', isNumber : true, isNumeric : true, isPrimitive : true
- , create : ()=>{return 1}}
- , '[object Boolean]' : { typeGroup : '[Primitive]', isBoolean : true, isPrimitive : true
- , create : ()=>{return true}}
- , '[object Null]' : { typeGroup : '[Null]', isNull : true
- , create : ()=>{return null}}
- , '[object Undefined]' : { typeGroup : '[Undefined]', isUndefined : true
- , create : ()=>{return }}
- , '[object Symbol]' : { typeGroup : '[Symbol]', isSymbol : true
- , create : ()=>{return new Symbol()}}
- , '[object BigInt]' : { typeGroup : '[BigInt]', isNumeric : true, isPrimitive : true
- , create : ()=>{return new BigInt()}}
-
- , '[object Array]' : { typeGroup : '[Array]', isArray : true
- , create : ()=>{return []}}
- , '[object Object]' : { typeGroup : '[Object]', isObject : true
- , create : ()=>{return {}}}
- , '[object Date]' : { typeGroup : '[Special]', isDate : true
- , create : ()=>{return new Date}}
- , '[object RegExp]' : { typeGroup : '[Special]', isRegExp : true
- , create : ()=>{return new RegExp}}
- , '[object Function]' : { typeGroup : '[Special]', isFunction : true
- , create : ()=>{return new Function}}
- , '[object Promise]' : { typeGroup : '[Special]', isPromise : true
- , create : ()=>{ throw "Blank promise cannot be created."}}
- };
- return typeMap[Object.prototype.toString.call(x)]
- }
-
- , isPrimitive(x) {
- var xType = this.nativeType(x);
- return xType === '[object Boolean]' || xType === '[object String]' || xType === '[object Number]' || xType === '[object Symbol]' ||
- xType === '[object BigInt]'
- }
-
- , isSpecial(x) {
- return !isArray(x) && !isObject(x) && !isPrimitive(x)
- }
-
- , nativeTypes() {
- return [
- // Primitives
- '[object String]'
- , '[object Number]'
- , '[object Boolean]'
- , '[object Null]'
- , '[object Undefined]'
- , '[object Symbol]'
- , '[object BigInt]'
-
- // Non Primitives.
- , '[object Array]'
- , '[object Object]'
- , '[object Date]'
- , '[object RegExp]'
- , '[object Function]'
- , '[object Promise]'
- ]
- }
-
- , nativeType(x) { return Object.prototype.toString.call(x) }
-
- }
-
- // Upsert for a hash ??
- , hashupsert : function(oA, oB){
- Object.keys(oA).forEach(( oAKey )=>{
- if(oB[oAKey]) {
- var distinct = new Set(oA[oAKey]);
- oB[oAKey].forEach((each)=>{
- distinct.add(each);
- });
- oA[oAKey] = Array.from(distinct);
- }
- });
- }
-
- // Upsert for an array.
- // Also the same as pushdistinct. Target is expected to have only one instance.
- , upsert(arr, val) {
- // 0 -- did nothing
- // 2 -- inserted
- // 3 -- updated
- // PB: TODO -- We can use (new Set(arr)).add ???. But is this more expensive ?
- var found = arr.find((element)=>{ return element === val});
- return found ? utils.js.isObject(val) && utils.js.isObject(val) ? (Object.assign( found, val), 3) : 0
- : (arr.push(val), 2) ;
- }
-
- // accumulate
- // o[toVectorPropName] which is an array
- // and o[propName] which is a string
- // into vectorTarget which is an array
- // already previously accumulated in a similar manner probably already attached as oTarget[toVectorPropName]
-
- // 0 or undefined or null -- didnt do anything. ( val doesn't exist )
- // 1 -- created target and inserted val
- // 2 -- didn't create target but inserted val
- // 3 -- didn't create target but updated val and also handled o[propName].
- , accumulate : function(val, o, propName, toVectorPropName, vectorTargetCreator,
- identityEvaluator
- ){
- var created = 0;
-
- if(utils.js.isUndefined(val)) return; // Nothing to do i.e. nothing was provided to accumulate. We don't accumulate undefined.
- if(val === o[propName]) return; // Nothing to do.
-
- var vectorTargetContainer = o[toVectorPropName] || (o[toVectorPropName] = {});
- if(!vectorTargetCreator) vectorTargetCreator = { create : (val)=>{
- return val ? vectorTargetContainer[o["id"]] = [val] : [] } };
-
- var vectorTarget = vectorTargetContainer[o["id"]];
-
- if(!vectorTarget) {
- created = 1;
- vectorTarget = vectorTargetContainer[o["id"]] = vectorTargetCreator.create(o[propName]);
- }
-
- if(!identityEvaluator) identityEvaluator = (a, b)=>{ return a === b };
-
- var upsertResult = 0;
- if(!created && !utils.js.isUndefined(o[propName])) {
- if(!vectorTargetContainer[o["id"]].find((element)=>{ return identityEvaluator(element, o[propName]) })) {
- upsertResult = utils.upsert(vectorTarget, o[propName]);
- }
- }
- upsertResult = utils.upsert(vectorTarget, val);
- return created ? created : upsertResult;
- }
-
- // async Utils
- , async : {
- all(list, task){
- var queueditems=[];
- list.forEach(function(v, i, a) {
- queueditems.push(task(v, i, a));
- });
- return Promise.all(queueditems)
- }
- }
-
-
- // PB : TODO -- Remove these.
- // , fsdb : require('./fsdb/fsdb')
- // , xlsx : require('./fsdb/xlsx')
- // , xlsxvalidator : require('./fsdb/xlsxvalidator')
-
- , timeUtils
- , dx: dx_1
- , cliargs: cliargs$1
- , any: any$3
- , promisify
- , moment
- , Tasq: Tasq$1
- , Traq: Traq$1
- , validationhelpers : validationhelpers
- };
-
- var utils_1 = utils;
-
- var naiveFallback = function () {
- if (typeof self === "object" && self) return self;
- if (typeof window === "object" && window) return window;
- throw new Error("Unable to resolve global `this`");
- };
-
-
- // https://mathiasbynens.be/notes/globalthis
- var globalThis_1 = (function () {
- if (this) return this;
-
- // Unexpected strict mode (may happen if e.g. bundled into ESM module)
-
- // Fallback to standard globalThis if available
- if (typeof globalThis === "object" && globalThis) return globalThis;
-
- // Thanks @mathiasbynens -> https://mathiasbynens.be/notes/globalthis
- // In all ES5+ engines global object inherits from Object.prototype
- // (if you approached one that doesn't please report)
- try {
-
- Object.prototype.__defineGetter__('__global__', function() {
- return this;
- });
- __global__.globalThis = __global__; // lolwat
-
- } catch (error) {
- // Unfortunate case of updates to Object.prototype being restricted
- // via preventExtensions, seal or freeze
- return naiveFallback();
- }
- try {
- // Safari case (window.__global__ works, but __global__ does not)
- if (!__global__) return naiveFallback();
- return __global__;
- } finally {
- delete Object.prototype.__global__;
- }
- })();
-
- // A selector based channels implementation as compared to a simple array.
- var channelMixin = (function() {
-
- // get channels that qualify for a selector.
- function getSubscriptions(selector) {
- console.dir(this.__channels);
- var filtered = this.__channels; // start with the world...
- // Selector is a simple list of tags.
- for(var select in selector) {
- if(!filtered[selector[select]]) {
- // If the assumption is that all indexes are properly built it implies this channel doesn't exist.
- return []; // We are looking for all selectors therefore if even one fails we don't have anything.
- }
- filtered = filtered[selector[select]];
- }
-
- return filtered['__data']; // Flattened array
- }
-
- function addSubscription(selector, func, context) {
-
- var unfulfilled = selector.splice(0);
- var filtered = this.__channels; // start with the world...
- console.log(filtered);
- for(var select in unfulfilled) {
- if(!filtered[unfulfilled[select]]) {
- filtered[unfulfilled[select]] = { __data : [] };
- }
- filtered = filtered[unfulfilled[select]];
- unfulfilled = unfulfilled.splice(0,1);
- }
-
- // PB : TODO -- All accessor paths need to be indexed !
- // Will currently fail if not published and queried in the same order.
- filtered.__data.push({context: context, callback: func});
- }
-
- return function(){
- this.__channels = {};
- this.getSubscriptions = getSubscriptions;
- this.addSubscription = addSubscription;
- return this;
- }
- })();
-
- // Mediator pattern.
- var mediator = (function() {
-
- var __subscribe = function(selector, func, context) {
- var subscriptions = this.channels.getSubscriptions(selector);
-
- if(subscriptions.length < 1){
- this.channels.addSubscription(selector, func, context);
- }
-
- return this;
- };
-
- var __publish = function(selector) {
- console.log('publishing for selector ' + selector);
- var subscriptions = this.channels.getSubscriptions(selector);
- console.log(subscriptions);
- if(subscriptions.length < 1){ return; }
- var args = Array.prototype.slice.call(arguments, 1);
- for(i=0; i < subscriptions.length; i++) {
- subscription = subscriptions[i];
- subscription.callback.apply(subscription.context, args);
- }
- return this;
- };
-
- return function mediator() {
- var thisObj = this ? this : {};
- Object.defineProperty(thisObj, 'channels', { value : channelMixin.apply({}), writable: false, enumerable : false});
- thisObj.publish = __publish;
- thisObj.subscribe = __subscribe;
- return thisObj;
- };
- })();
-
- // Unique ID creation requires a high quality random # generator. In the browser we therefore
- // require the crypto API and do not support built-in fallback to lower quality random number
- // generators (like Math.random()).
- var getRandomValues;
- var rnds8 = new Uint8Array(16);
- function rng() {
- // lazy load so that environments that need to polyfill have a chance to do so
- if (!getRandomValues) {
- // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
- // find the complete implementation of crypto (msCrypto) on IE11.
- getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);
-
- if (!getRandomValues) {
- throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
- }
- }
-
- return getRandomValues(rnds8);
- }
-
- var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
-
- function validate(uuid) {
- return typeof uuid === 'string' && REGEX.test(uuid);
- }
-
- /**
- * Convert array of 16 byte values to UUID string format of the form:
- * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
- */
-
- var byteToHex = [];
-
- for (var i$2 = 0; i$2 < 256; ++i$2) {
- byteToHex.push((i$2 + 0x100).toString(16).substr(1));
- }
-
- function stringify(arr) {
- var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- // Note: Be careful editing this code! It's been tuned for performance
- // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
- var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one
- // of the following:
- // - One or more input array values don't map to a hex octet (leading to
- // "undefined" in the uuid)
- // - Invalid input values for the RFC `version` or `variant` fields
-
- if (!validate(uuid)) {
- throw TypeError('Stringified UUID is invalid');
- }
-
- return uuid;
- }
-
- //
- // Inspired by https://github.com/LiosK/UUID.js
- // and http://docs.python.org/library/uuid.html
-
- var _nodeId;
-
- var _clockseq; // Previous uuid creation time
-
-
- var _lastMSecs = 0;
- var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
-
- function v1(options, buf, offset) {
- var i = buf && offset || 0;
- var b = buf || new Array(16);
- options = options || {};
- var node = options.node || _nodeId;
- var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
- // specified. We do this lazily to minimize issues related to insufficient
- // system entropy. See #189
-
- if (node == null || clockseq == null) {
- var seedBytes = options.random || (options.rng || rng)();
-
- if (node == null) {
- // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
- node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
- }
-
- if (clockseq == null) {
- // Per 4.2.2, randomize (14 bit) clockseq
- clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
- }
- } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
- // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
- // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
- // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
-
-
- var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
- // cycle to simulate higher resolution clock
-
- var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
-
- var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
-
- if (dt < 0 && options.clockseq === undefined) {
- clockseq = clockseq + 1 & 0x3fff;
- } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
- // time interval
-
-
- if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
- nsecs = 0;
- } // Per 4.2.1.2 Throw error if too many uuids are requested
-
-
- if (nsecs >= 10000) {
- throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
- }
-
- _lastMSecs = msecs;
- _lastNSecs = nsecs;
- _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
-
- msecs += 12219292800000; // `time_low`
-
- var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
- b[i++] = tl >>> 24 & 0xff;
- b[i++] = tl >>> 16 & 0xff;
- b[i++] = tl >>> 8 & 0xff;
- b[i++] = tl & 0xff; // `time_mid`
-
- var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
- b[i++] = tmh >>> 8 & 0xff;
- b[i++] = tmh & 0xff; // `time_high_and_version`
-
- b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
-
- b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
-
- b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
-
- b[i++] = clockseq & 0xff; // `node`
-
- for (var n = 0; n < 6; ++n) {
- b[i + n] = node[n];
- }
-
- return buf || stringify(b);
- }
-
- function parse$1(uuid) {
- if (!validate(uuid)) {
- throw TypeError('Invalid UUID');
- }
-
- var v;
- var arr = new Uint8Array(16); // Parse ########-....-....-....-............
-
- arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
- arr[1] = v >>> 16 & 0xff;
- arr[2] = v >>> 8 & 0xff;
- arr[3] = v & 0xff; // Parse ........-####-....-....-............
-
- arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
- arr[5] = v & 0xff; // Parse ........-....-####-....-............
-
- arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
- arr[7] = v & 0xff; // Parse ........-....-....-####-............
-
- arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
- arr[9] = v & 0xff; // Parse ........-....-....-....-############
- // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
-
- arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
- arr[11] = v / 0x100000000 & 0xff;
- arr[12] = v >>> 24 & 0xff;
- arr[13] = v >>> 16 & 0xff;
- arr[14] = v >>> 8 & 0xff;
- arr[15] = v & 0xff;
- return arr;
- }
-
- function stringToBytes(str) {
- str = unescape(encodeURIComponent(str)); // UTF8 escape
-
- var bytes = [];
-
- for (var i = 0; i < str.length; ++i) {
- bytes.push(str.charCodeAt(i));
- }
-
- return bytes;
- }
-
- var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
- var URL$1 = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
- function v35 (name, version, hashfunc) {
- function generateUUID(value, namespace, buf, offset) {
- if (typeof value === 'string') {
- value = stringToBytes(value);
- }
-
- if (typeof namespace === 'string') {
- namespace = parse$1(namespace);
- }
-
- if (namespace.length !== 16) {
- throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
- } // Compute hash of namespace and value, Per 4.3
- // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
- // hashfunc([...namespace, ... value])`
-
-
- var bytes = new Uint8Array(16 + value.length);
- bytes.set(namespace);
- bytes.set(value, namespace.length);
- bytes = hashfunc(bytes);
- bytes[6] = bytes[6] & 0x0f | version;
- bytes[8] = bytes[8] & 0x3f | 0x80;
-
- if (buf) {
- offset = offset || 0;
-
- for (var i = 0; i < 16; ++i) {
- buf[offset + i] = bytes[i];
- }
-
- return buf;
- }
-
- return stringify(bytes);
- } // Function#name is not settable on some platforms (#270)
-
-
- try {
- generateUUID.name = name; // eslint-disable-next-line no-empty
- } catch (err) {} // For CommonJS default export support
-
-
- generateUUID.DNS = DNS;
- generateUUID.URL = URL$1;
- return generateUUID;
- }
-
- /*
- * Browser-compatible JavaScript MD5
- *
- * Modification of JavaScript MD5
- * https://github.com/blueimp/JavaScript-MD5
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * https://opensource.org/licenses/MIT
- *
- * Based on
- * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
- * Digest Algorithm, as defined in RFC 1321.
- * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- * Distributed under the BSD License
- * See http://pajhome.org.uk/crypt/md5 for more info.
- */
- function md5(bytes) {
- if (typeof bytes === 'string') {
- var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
-
- bytes = new Uint8Array(msg.length);
-
- for (var i = 0; i < msg.length; ++i) {
- bytes[i] = msg.charCodeAt(i);
- }
- }
-
- return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
- }
- /*
- * Convert an array of little-endian words to an array of bytes
- */
-
-
- function md5ToHexEncodedArray(input) {
- var output = [];
- var length32 = input.length * 32;
- var hexTab = '0123456789abcdef';
-
- for (var i = 0; i < length32; i += 8) {
- var x = input[i >> 5] >>> i % 32 & 0xff;
- var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
- output.push(hex);
- }
-
- return output;
- }
- /**
- * Calculate output length with padding and bit length
- */
-
-
- function getOutputLength(inputLength8) {
- return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
- }
- /*
- * Calculate the MD5 of an array of little-endian words, and a bit length.
- */
-
-
- function wordsToMd5(x, len) {
- /* append padding */
- x[len >> 5] |= 0x80 << len % 32;
- x[getOutputLength(len) - 1] = len;
- var a = 1732584193;
- var b = -271733879;
- var c = -1732584194;
- var d = 271733878;
-
- for (var i = 0; i < x.length; i += 16) {
- var olda = a;
- var oldb = b;
- var oldc = c;
- var oldd = d;
- a = md5ff(a, b, c, d, x[i], 7, -680876936);
- d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
- c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
- b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
- a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
- d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
- c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
- b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
- a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
- d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
- c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
- b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
- a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
- d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
- c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
- b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
- a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
- d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
- c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
- b = md5gg(b, c, d, a, x[i], 20, -373897302);
- a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
- d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
- c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
- b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
- a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
- d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
- c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
- b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
- a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
- d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
- c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
- b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
- a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
- d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
- c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
- b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
- a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
- d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
- c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
- b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
- a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
- d = md5hh(d, a, b, c, x[i], 11, -358537222);
- c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
- b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
- a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
- d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
- c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
- b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
- a = md5ii(a, b, c, d, x[i], 6, -198630844);
- d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
- c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
- b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
- a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
- d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
- c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
- b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
- a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
- d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
- c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
- b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
- a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
- d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
- c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
- b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
- a = safeAdd(a, olda);
- b = safeAdd(b, oldb);
- c = safeAdd(c, oldc);
- d = safeAdd(d, oldd);
- }
-
- return [a, b, c, d];
- }
- /*
- * Convert an array bytes to an array of little-endian words
- * Characters >255 have their high-byte silently ignored.
- */
-
-
- function bytesToWords(input) {
- if (input.length === 0) {
- return [];
- }
-
- var length8 = input.length * 8;
- var output = new Uint32Array(getOutputLength(length8));
-
- for (var i = 0; i < length8; i += 8) {
- output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
- }
-
- return output;
- }
- /*
- * Add integers, wrapping at 2^32. This uses 16-bit operations internally
- * to work around bugs in some JS interpreters.
- */
-
-
- function safeAdd(x, y) {
- var lsw = (x & 0xffff) + (y & 0xffff);
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return msw << 16 | lsw & 0xffff;
- }
- /*
- * Bitwise rotate a 32-bit number to the left.
- */
-
-
- function bitRotateLeft(num, cnt) {
- return num << cnt | num >>> 32 - cnt;
- }
- /*
- * These functions implement the four basic operations the algorithm uses.
- */
-
-
- function md5cmn(q, a, b, x, s, t) {
- return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
- }
-
- function md5ff(a, b, c, d, x, s, t) {
- return md5cmn(b & c | ~b & d, a, b, x, s, t);
- }
-
- function md5gg(a, b, c, d, x, s, t) {
- return md5cmn(b & d | c & ~d, a, b, x, s, t);
- }
-
- function md5hh(a, b, c, d, x, s, t) {
- return md5cmn(b ^ c ^ d, a, b, x, s, t);
- }
-
- function md5ii(a, b, c, d, x, s, t) {
- return md5cmn(c ^ (b | ~d), a, b, x, s, t);
- }
-
- var v3 = v35('v3', 0x30, md5);
- var v3$1 = v3;
-
- function v4(options, buf, offset) {
- options = options || {};
- var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-
- rnds[6] = rnds[6] & 0x0f | 0x40;
- rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
-
- if (buf) {
- offset = offset || 0;
-
- for (var i = 0; i < 16; ++i) {
- buf[offset + i] = rnds[i];
- }
-
- return buf;
- }
-
- return stringify(rnds);
- }
-
- // Adapted from Chris Veness' SHA1 code at
- // http://www.movable-type.co.uk/scripts/sha1.html
- function f(s, x, y, z) {
- switch (s) {
- case 0:
- return x & y ^ ~x & z;
-
- case 1:
- return x ^ y ^ z;
-
- case 2:
- return x & y ^ x & z ^ y & z;
-
- case 3:
- return x ^ y ^ z;
- }
- }
-
- function ROTL(x, n) {
- return x << n | x >>> 32 - n;
- }
-
- function sha1(bytes) {
- var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
- var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
-
- if (typeof bytes === 'string') {
- var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
-
- bytes = [];
-
- for (var i = 0; i < msg.length; ++i) {
- bytes.push(msg.charCodeAt(i));
- }
- } else if (!Array.isArray(bytes)) {
- // Convert Array-like to Array
- bytes = Array.prototype.slice.call(bytes);
- }
-
- bytes.push(0x80);
- var l = bytes.length / 4 + 2;
- var N = Math.ceil(l / 16);
- var M = new Array(N);
-
- for (var _i = 0; _i < N; ++_i) {
- var arr = new Uint32Array(16);
-
- for (var j = 0; j < 16; ++j) {
- arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
- }
-
- M[_i] = arr;
- }
-
- M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
- M[N - 1][14] = Math.floor(M[N - 1][14]);
- M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;
-
- for (var _i2 = 0; _i2 < N; ++_i2) {
- var W = new Uint32Array(80);
-
- for (var t = 0; t < 16; ++t) {
- W[t] = M[_i2][t];
- }
-
- for (var _t = 16; _t < 80; ++_t) {
- W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
- }
-
- var a = H[0];
- var b = H[1];
- var c = H[2];
- var d = H[3];
- var e = H[4];
-
- for (var _t2 = 0; _t2 < 80; ++_t2) {
- var s = Math.floor(_t2 / 20);
- var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
- e = d;
- d = c;
- c = ROTL(b, 30) >>> 0;
- b = a;
- a = T;
- }
-
- H[0] = H[0] + a >>> 0;
- H[1] = H[1] + b >>> 0;
- H[2] = H[2] + c >>> 0;
- H[3] = H[3] + d >>> 0;
- H[4] = H[4] + e >>> 0;
- }
-
- return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
- }
-
- var v5 = v35('v5', 0x50, sha1);
- var v5$1 = v5;
-
- var nil = '00000000-0000-0000-0000-000000000000';
-
- function version$1(uuid) {
- if (!validate(uuid)) {
- throw TypeError('Invalid UUID');
- }
-
- return parseInt(uuid.substr(14, 1), 16);
- }
-
- var esmBrowser = /*#__PURE__*/Object.freeze({
- __proto__: null,
- v1: v1,
- v3: v3$1,
- v4: v4,
- v5: v5$1,
- NIL: nil,
- version: version$1,
- validate: validate,
- stringify: stringify,
- parse: parse$1
- });
-
- var require$$3$1 = /*@__PURE__*/getAugmentedNamespace(esmBrowser);
-
- var core = createCommonjsModule(function (module) {
- // var nonStrictThis = function(){ return this; }
- // var strictThis = function(){ 'use strict'; return this; }
-
- (function(){
-
- // import jstpl from './jstpl';
- // var jstpl = require('./jstpl');
- var utils = utils_1;
-
- // var __mEV = function(fnstr) {
- // return eval(fnstr);
- // }
-
- // In strict mode this in Global Scope is not the real global object but a global current context object.
- // Therefore this === global is false.
-
- // https://stackoverflow.com/questions/3277182/how-to-get-the-global-object-in-javascript
- // var __G = {
-
- // // Either the module scope or the global scope. In node this is the module scope.
- // __scope : this
- // // Makes sure the global scope.
- // , __g : (function () {
- // // global || window || WorkerGlobalScope || ???modulescope??? ;
- // return Function('return this')() || (0, eval)('this');
- // }())
- // , __eV : eval
- // , __getMVar(varname) {
- // return eval(varname);
- // }
- // };
-
- var __g = globalThis_1;
- // var __g = __G.__g;
- __g.mediator = mediator.apply({});
- // __g.mediator = __g.mediator.apply({})
- console.dir(__g.mediator);
- // __g.mediator = __g.mediator.apply({});
-
-
- //
- function __is__(t, type){
- if(utils.js.isPrimitive(t)) return false;
- if(!t || !t.mixins) return false;
- return t.__mixins().get(type) ? true : false ; }
-
- // Clazz so as to not conflict with Class ECMAScript keyword. Note the need for this arizes from mixins not bieng easy with Class !?
- const Clazz = (function(){
- // The class factory.
- const __Clazz = function( clazz /* Your class constructor function or extension object ? */) {
- // If clazz a function defined in its closure we honor that as the constructor.
-
- return (function(){
-
- // The actual class constructor
- function __Class() {
- // In strict mode we will get undefined. For Ember transpiled with webpack in the browser we should be fine... ( Check other browsers. )
- if(this === undefined) throw 'Invalid Instance for creation. Cannot be global. Please use Fn.apply or Fn.call with appropriate this scope.'
- if(this === __g) throw 'Invalid Instance for creation. Cannot be global. Please use Fn.apply or Fn.call with appropriate this scope.'
- // new YYYY -- should not be used anywhere.
- // if you use apply or call to invoke
- // we will try to discover whether you called us in such a way to the best extent possible.
- // this === globalthis to not adequate
- // Eg : We could be called as
- // theirclazz.create() && theirclazz() are equivalent
- // theirclazz.create( ...extensions )
- // theirclazz( ...extensions )
- // theirclazz.create.call( otoMorph, ...extensions )
- // If you already have an instance that you want to morph use call or apply
- return utils.assign(this, ...arguments)
- }
-
- // Pristine overrides. Can never be overridden at construction time. Users can easily overrid later...
- var __cp = {
- createusing( oToMorh, ...extensions ){ return utils.assign(oToMorh, ...extensions) }
- , extend(){
- // All new and old instances should get these extensions !?!#@@$
- // older instances are an issue. They could have already overridden. Will need to shift the base proto of all older instances to achieve this !?
- // Current support is only for new instaces created after extend is called.
- // PB : TODO -- Swtich the __proto__ for proper extend support.
-
- // Should we retain the original extend, create and createusing. Well if you are interested in overriding we should make a provision.
- if( this === __Class) return utils.assign(__Class, ...arguments /*, { extend : __Class.extend, create : __Class.create, createusing : __Class.createusing }*/ )
- else return utils.assign(this, ...arguments /*, { extend : __Class.extend, create : __Class.create, createusing : __Class.createusing }*/ )
- }
- , create : __Class
- };
-
- var __createusing = __cp.createusing;
-
- var __constructor = utils.js.isFunction(clazz) ? clazz : null;
- if( __constructor ){
- // We have to support a call site function passed in. But we cannot replace the function itself. So we wrap it and send a different constructur as the class.
- var originalcr = clazz.create || clazz;
- var originalcu = clazz.createusing || function(){ return originalcr.apply(o, arguments) };
- __cp.create = function(){ var o = __Class(...arguments); return originalcu(o, ...arguments) }; // Your constructor should be your create but we switch it to trap here.
- __cp.createusing = function(oToMorh, ...extensions ){
- // PB : TODO -- __g check may not be enough. We need to see what the this object is in the context of the call site function with strict or nonstrict mode !?
- // coz it is different from __g. The purpose of __g is to have a single object acroos the app...
- oToMorh === __g ? (function() { throw 'Cannot use global object in inheritance' })()
- : function(){ var o = __createusing(oToMorh, ...arguments); return originalcu(o, ...arguments) };
- };
- return utils.assign(__Class, __constructor, ...arguments, __cp)
- }
- else if (clazz) {
- // Should all class static members be public and also accessible by instance members ?
- // Privacy is the implementers concern. Provide your own closures to secure your data.
- // Which means all attached members that are public here should continue to be public. Whether they are shared ( referenced ) or deep copied is a strategy decision...
- // Functions are easy to handle.
- // Shared data could either be overridable (instance) or static at the class level.
-
- // Its a bad practice to have static attributes set directly on the class. Allways use accessors or static functions with closures for such data.
- // It may be inevitable but to switch the function prototype to properly address instance level shared data until overridden.
- // Prototypal chains are themselves slow but current strategy of copy everithing for every instance is not a good idea either.
- // Best middle ground is to have a squished prototype chain into a single proto for all instances without the chain.
- // Squishing will require accessors with an override so we don't have to walk the prototype chain...
- // utils.assign already handles this well.
-
- var originalcr = clazz.create || function(){};
- var originalcu = clazz.createusing || function(){ return originalcr.apply(o, ...arguments) };
- __Class.create = function(){ var o = __Class(...arguments); return originalcu(o, ...arguments) };
- __Class.createusing = function(oToMorh, ...extensions ){
- // PB : TODO -- __g check may not be enough. We need to see what the this object is in the context of the call site function with strict or nonstrict mode !?
- // coz it is different from __g. The purpose of __g is to have a single object acroos the app...
- oToMorh === __g ? (function() { throw 'Cannot use global object in inheritance' })()
- : function(){ var o = __createusing(oToMorh, ...arguments); return originalcu(o, ...arguments) };
- };
-
- return utils.assign(__Class, clazz, ...arguments, __cp)
- }
- else return utils.assign(__Class, ...arguments, __cp)
-
- })()
- };
-
-
- __Clazz.create = __Clazz;
- return __Clazz
- })();
-
-
- const Mixin = (function(){
-
- function __createMixBase(clazz){
- if(clazz.is && clazz.is(Mixin)) return clazz;
- return Object.assign(clazz, {
- __mixins : (()=>{ var _m = new WeakMap(); return _m.set(Mixin, true); })()
- , is(){ return __is__(clazz, Mixin) }
- })
- }
-
- function __createdMixinClazz(clazz, ...others){
- // !! getMixinFor(arguements) No need. We just create a new one.
-
- var m = __createMixBase(clazz || {});
- m.extend = function(){
- // Is extend callable on an Instance ? No reason why it shouldn't be callable. The behavior will be that it will return a new class not an instance.
- // Although instances and classes do not need to be distinguished in our context.
-
- Array.from(arguments).forEach(clazz => { this.__mixins.set(clazz, true); });
- // Extend should alter and evolve the class or instance it is enxtening such that all other instances created after should have the extensions.
- return utils.assign(this, ...arguments)
- };
- // PB : TODO -- Addmixin should require a reopen... already created instances may need a prototype switch !?
- // Currently addmixin should only be called before the first instance create of the real extended type
- m.addMixin = function(clazz){ this.__mixins.set(clazz, true); return utils.assign(this, clazz) };
-
- // Switch to retain the same base mixin when called second time onwards.
- // __createdMixinClazz = function(){ return this }
-
- // PB : TODO mixins should not be createable once created.... Only extend should be supprted
- // retain create for backward compatibility to return the same mixin untill all creates are replaced.
- // create is an instance create and should be the create of the most derived clazz in the list of constructors...
- m.create = function(){ return m }; //__createdMixinClazz
-
- return m.extend.apply(m, others)
- // This is not a mixin instance. This is a class factory that returns a new base mixin class for each
- // type that is extending. Therefore create is meaningless for Mixin... Always use extend.
- // However every successive call to extend once already extended should not keep recreating the base but rather reuse the base.
- }
- function __Mixin(){
- return __createdMixinClazz.apply(null, arguments) }
-
- __Mixin.create = __Mixin; // Gives you a clazz that you need to reuse. Do not keep calling for each instance !!!
- __Mixin.extend = __Mixin; // Same behavior here
- return __Mixin
- })();
-
-
- const indexHelper = (function(){
-
- var getPermutations = function(array){
- var permutations = {};
- // l(array.splice(0, 1))
- for(var i in array) {
- // l(array[i]);
- var aclone = array.slice(0);
- aclone.splice(i, 1);
- permutations[array[i]] = getPermutations(aclone );
- }
- return permutations
- };
-
- var getCombinations = function(array){
- // P & C
- // http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0104-65002001000200009
- var set = [];
- var alen = array.length;
- var combinations = 1 << alen; // Math.pow(2, array.length);
-
- for (var i = 1; i < combinations ; i++){
- var combination= [];
- for (var j=0;j<alen;j++) {
- if ((i & (1 << j))){
- combination.push(array[j]);
- }
- }
- set.push(combination);
- }
-
- return set;
- };
-
- return function(obj) {
- obj.getPermutations = getPermutations;
- // obj.getPermutations = getPermutations_HeapsMethod;
- obj.getCombinations = getCombinations;
-
- return obj;
- };
- })();
-
- const AnyStore = (function(){
- // A store that can store any type and lookup any type.
- // Weakmaps cannot have primitives as keys and hashs cannot have objects as keys.
- // This wraps hash and a weakmap into an abstract class that routes to the appropriate
- // store based on the type of the object.
-
- const getForPrimitive = function(primitive, target) { return target.storeForPrmitives[primitive] };
- const getForObject = function(obj, target) { return target.storeForObjects.get(obj) };
- const getForSymbol = function(symbol, target) { return target.storeForObjects.get(target.__symbolToObj[symbol]) };
-
- const setForPrimitive = function(primitive, content, target) {
- // PB : -- Note : Importatn -- No difference between 100 and "100" due to JS keys all being strings...
- target.storeForPrmitives[primitive] = content;
- return content;
- };
-
- const setForObject = function(obj, content, target) {
- // PB : TODO -- need to listen to changes in content and its attributes to re-index it.
- target.storeForObjects.set(obj, content);
- return content;
- };
- const setForSymbol = function(symbol, content, target) {
- // PB : TODO -- need to listen to changes in content and its attributes to re-index it.
- target.storeForObjects.set(target.__symbolToObj[symbol], content);
- return content;
- };
-
- const getFor = {
- '[object String]' : getForPrimitive
- , '[object Object]' : getForObject
- , '[object Date]' : getForObject
- , '[object Symbol]' : getForSymbol
- };
- getFor['[object Number]'] = getFor['[object String]'];
- getFor['[object Array]'] = getFor['[object Object]'];
-
- const setFor = {
- '[object String]' : setForPrimitive
- , '[object Object]' : setForObject
- , '[object Date]' : setForObject
- , '[object Symbol]' : setForSymbol
- };
- setFor['[object Number]'] = setFor['[object String]'];
- setFor['[object Array]'] = setFor['[object Object]'];
- function AnyStore(){
-
- // Dispatch based on type of prop.
- var targ = { storeForPrmitives : {}, storeForObjects : new WeakMap(), __symbolToObj : {}, __symbolFromObj : new WeakMap() };
- var p = new Proxy( targ
- , {
- // PB : TODO -- Proxy handler gets hit for Index function prop..
- get: function (target, prop) {
- if(prop === 'get') return (what)=>{ return getFor[utils.js.nativeType(what)](what, target); }
- if(prop === 'set') return (what, content)=>{
- return setFor[utils.js.nativeType(what)](what, content, targ)
- // return p[p.Index(what)] = content
- }
- return getFor[utils.js.nativeType(prop)](prop, target); }
- // , set: function (target, prop, content) { return setFor[utils.js.nativeType(prop)](prop, content, target); }
- });
- // p.Index = IndexFactory(targ.__symbolFromObj, targ.__symbolToObj);
- // p.get = (what)=>{
- // // Supporting this index access method helps with [] operator. Since objects cant be keys to [] operator.
- // // However this is useful when in future we have a valuecompare based access.
- // // Currently consumers will probably find it cumbersome to access using o[o.Index(someobj)]...
- // // We really don't need to support Index access.
- // return getFor[utils.js.nativeType(what)](what, targ)
- // // return p[p.Index(what, true)]
- // }
- // p.set = (what, content)=>{
- // return setFor[utils.js.nativeType(what)](what, content, targ)
- // // return p[p.Index(what)] = content
- // }
- return p
- }
- AnyStore.create = AnyStore;
- return AnyStore
- })();
-
- const StateStore = (function(){
- // PB : TODO -- Make chosenref optional or even remove from here.
-
- var scopedsatestore = new WeakMap();
- function __StateStore(){}
-
- const singleton = __StateStore();
- function StateStore(){ return singleton }
- StateStore.create = StateStore;
-
- StateStore.getstate = function(choice, scope, statekey, vtrue, vfalse, statecreator){
- var managedstatestore = StateStore.getmanagedstatestore(choice, scope, statecreator);
- if(managedstatestore.get(statekey)) return vtrue || true;
- else return vfalse || false;
- };
- StateStore.getmanagedstatestore = function(entity, scope, statecreator){
- statecreator = statecreator || function(){ return AnyStore.create() };
- var statestore = scopedsatestore.get(scope);
- if(!statestore) { statestore = AnyStore.create(); scopedsatestore.set(scope, statestore);
- var state = statecreator();
- statestore.set(entity, state);
- return state
- }
- return statestore.get(entity) || ( ()=>{
- var state = statecreator();
- statestore.set(entity, state);
- return state
- })()
- };
- StateStore.setstate = function(choice, chosenref, scope, statekey, statevalue, statecreator){
- var managedstatestore = StateStore.getmanagedstatestore(choice, scope, statecreator);
-
- var crtget = function(){
- return chosenref.target.get ? chosenref.target.get(chosenref.targetattr) : chosenref.target[chosenref.targetattr]
- };
-
- var crtset = function(v){
- return chosenref.target.set ? chosenref.target.set(chosenref.targetattr, v) : chosenref.target[chosenref.targetattr] = v
- };
-
- var state = statevalue;
- if (chosenref.multi) {
- crtset( crtget() || Ember.A());
- chosenref.target[chosenref.targetattr].removeObject(choice);
- if(state) chosenref.target[chosenref.targetattr].pushObject(choice);
- } else {
- var prevchoice = crtget();
- if (prevchoice) {
- var prevchoicemanagedstate = StateStore.getmanagedstatestore(prevchoice, scope, statecreator);
- prevchoicemanagedstate.set(statekey, undefined);
- }
- if(state) crtset( choice);
- else crtset(null);
- }
-
- managedstatestore.set(statekey, state);
- };
- StateStore.togglestate = function(choice, chosenref, scope, statekey, statecreator){
- var managedstatestore = StateStore.getmanagedstatestore(choice, scope, statecreator);
- var statevalue = !managedstatestore.get(statekey || 'checked');
- StateStore.setstate(choice, chosenref, scope, statekey, statevalue, statecreator);
- };
- return StateStore.create
- })();
-
- var initglobals = function() {
- var logentry = (function() {
- var __logentry = function(){};
-
- __logentry.create = function(m) { return { ts : new Date(), m : '' + m, callstack : new Error().stack.split("\n") } };
- return __logentry
- })();
-
- // Console channels ???
- var filters = [ "log", "warn", "dir", "time", "timeEnd", "timeLog", "trace", "assert",
- // "clear", "count", "countReset", "group", "groupEnd", "table",
- "debug",
- "info",
- "dirxml",
- "error",
- // "groupCollapsed", "Console",
- "profile",
- "profileEnd",
- "timeStamp"
- // ,
- // "context"
- ];
- var oconsole = Object.assign({}, console);
- // console.error = function(){ logpublisher().publish('error', ...arguments) };
- // filters.forEach((f)=>{ console[f] = function(){ logpublisher().publish(f, ...arguments) }; })
-
-
- var logpublisher = (function() {
- var __channels = {};
- var __productionchannels = {};
- filters.forEach( (filter)=>{ __productionchannels[filter] = __channels[filter] = []; } );
-
- var __developmentchannels = Object.assign({}, __channels);
- var devc = ['review', 'error', 'all'];
- devc.forEach( (filter)=>{ __developmentchannels[filter] = __channels[filter] = (__channels[filter] || []); } );
-
- var env = __g.env.NODE_ENV ? __g.env.NODE_ENV : process.NODE_ENV ? process.NODE_ENV : 'development' ;
- var channels = env === 'development' ? __developmentchannels : __productionchannels;
-
- // PB : TODO -- Publish to a log listener asynchronously.
- // We currently directly call the subscriber function which is synchronous...
-
- var publishers = {};
- var __publish = function(channels, jsonmessage) { channels.forEach( sub=>{ sub(jsonmessage); }); };
- var publish = function(filter, message, ...rest) {
- var jsonmessage = utils.js.isString(message) ? logentry.create(
- // util.format(message, ...rest)
- message
- ) : message;
- oconsole[filter](message, ...rest); //
- // channels.forEach(enabledChannel => {
- // PB : TODO -- Intersect with sbscribed channels.
- // publishers[enabledChannel]( channels[filter], jsonmessage )
- publishers[filter]( channels[filter], jsonmessage );
- // })
- // PB : TODO -- Enable multi channel publicatoin.
- if(env === 'development') publishers['all']( channels['all'], jsonmessage );
- };
-
-
- Object.keys(channels).forEach( (filter)=>{ publishers[filter] = __publish; } );
-
- var __singleTon = {
- console : oconsole,
- review : publishers.review,
- loggers : [],
- publish : function(){
- // getcallee(arguments);
- publish.apply(this, arguments);
- },
- subscribe(filter, subscribers){
- if(channels[filter]) {
- channels[filter].push.apply( channels[filter], subscribers);
- }
- else {
- oconsole.log('Channel Not enabled ' + filter);
- }
- }
- , register(channel) {
- var self = this;
- var channellogger = function(){ publish.call(self, channel, ...arguments); };
- this.loggers.push( channellogger );
- oconsole[channel] = oconsole['log'];
- publishers[channel] = __publish;
- channels[channel] = [];
- return channellogger;
- }
- };
-
- if(env === 'development' && publishers.all) __singleTon.all = publishers.all;
- var __logpublisher = function(){ return __singleTon };
-
- __logpublisher.create = __logpublisher;
- // __logpublisher.addsubscribers = function(subs){ subscribers.push.apply( subscribers, subs)}
- __logpublisher = Mixin.extend(__logpublisher);
- return __logpublisher
- })();
- __g.logpublisher = logpublisher;
- __g.hascore = true;
- };
-
- if(!__g.hascore) { initglobals(); }
-
-
-
- function expandUint32Array(arr, data) {
- const newArray = new Uint32Array(arr.length + data.length);
- newArray.set(arr); // copy old data
- newArray.set(data, arr.length); // copy new data after end of old data
- return newArray;
- }
-
- const HEX_FFFFFFFF = 0xFFFFFFFF;
- const HEX_FFFF0000 = 0xFFFF0000;
- const HEX_FF00 = 0xFF00;
- const HEX_F0 = 0xF0;
- const HEX_0C = 0x0C;
-
- const MAX_32BITS = HEX_FFFFFFFF;
- const MAX_53BITS = Number.MAX_SAFE_INTEGER;
-
- const BIGINT_HEX_FFFFFFFF = BigInt(HEX_FFFFFFFF);
- BigInt(HEX_FFFF0000);
- BigInt(HEX_FF00);
- BigInt(HEX_F0);
- BigInt(HEX_0C);
-
- const BIGINT_MAX_32BITS = BIGINT_HEX_FFFFFFFF;
-
- const BIGINT_0 = BigInt(0);
- const BIGINT_1 = BigInt(1);
- BigInt(2);
- BigInt(4);
- BigInt(8);
- BigInt(16);
- const BIGINT_32 = BigInt(32);
-
- // Only Positive numbers;
- function *bigIntBufferGenerator(bn){
- // len = len || find32BitArrLen(bn); // Inefficeint to detect. Lets just iterate and see where it ends...
- var signal = {};
- var stop = Symbol();
- var i = 0;
- for(;;){
- var bits32 = new Uint32Array(1);
- if(bn > MAX_32BITS){
- bits32[0]= Number((bn & BIGINT_MAX_32BITS));
- signal = (yield {i, bits32}) || {};
- if(signal === stop || signal.done) return {i, bits32};
- bn >>= BIGINT_32;
- i++;
- }
- else {
- bits32[0] = Number(bn);
- return {i, bits32};
- }
- }
- }
-
- function bigIntToBuffer(bn) {
- // if(utils.js.isUndefined(bn) || utils.js.isNull(bn)) throw 'bigIntToBuffer suported only for BigInts...'
- if(!utils.js.isBigInt(bn)) throw 'bigIntToBuffer suported only for BigInts...'
- // PB : Note -- bn must be passed in. Callee should validate.
- var buffer = null;
- var iterator = bigIntBufferGenerator(bn);
- var next = iterator.next();
- if(next && !next.done) buffer = next.value.bits32;
- else return next.value.bits32;
- while(!(next = iterator.next()).done) {
- // PB : TODO -- Ineffficient copy in a loop !!
- // It would be really nice to know how much space is needed. In the absence lets do binary expansion.
- buffer = expandUint32Array(buffer, next.value.bits32);
- }
- buffer = expandUint32Array(buffer, next.value.bits32);
- return buffer;
- }
-
- function bufferToBigInt(buffer) {
- // PB : Note -- buffer must be a Uint32Array. Callee should validate.
- var bn = BIGINT_0;
- for(var i=buffer.length; --i > -1;){ bn <<= BIGINT_32; bn |= BigInt(buffer[i]); }
- return bn;
- }
- // A bitmask can also be specified by a index number of the bit in a BitArray
- // Implemented as a class to distinguish from a mask value.
- // For convenieance mask value is provided the ability to be passed in as a Number althout BitIndexes are more naturally in the Number Space..
- // mask values larger than 32 bits will implicitly need to be converted to BitArrays.
- const BitIndex = (function() { function BitIndex(){ return this } // BitIndex constructor.
- // Should support Numbers, BigInt and Uint32Array.
-
- function __is__(t){ if(t === BitIndex) return true; }
- function __is(type){ return typeof this === type ? true : __is__(type) }
-
- function __create(n){
-
- return BitIndex.apply({
- value : n
- , is : __is
- })
- }
-
- __create.create = __create;
- return __create
- })();
-
- // function leftshift(m){ return utils.js.isNumber(m) ? leftshift_Number(m) : leftshift_BigInt(m) } // Universal.
- function leftshift_Number(m){ return m << 1 }
- function leftshift_BigInt(m){ return m << BIGINT_1 }
- // function leftshift_Uint32Array(m) { throw "leftshift_Uint32Array not yet implemented." }
-
- function indexOfLSB32(x, gptwo){
- // x needs to be a 32 bit number.
- // Private functions don't do validations to avoid overhead of validation.
- // Only public api's need to validate inputs.
- if(x === 0) return null;
-
- var i = 0;
- x & 0xFFFF0000 && (i += 16, x >>= 16),
- x & 0xFF00 && (i += 8, x >>= 8),
- x & 0xF0 && (i += 4, x >>= 4),
- x & 0x0C && (i += 2, x>>= 2),
- x & 2 && (i += 1);
- // x & 1 && (i = 0);
- return i;
- }
-
- // PB : TODO -- Not yet implemented... profile to see if this is any more performant.
- // function indexOfLSB_BigInt_DeBruijn(x, gptwo){
- // // x needs to be a BigInt.
- // // gptwo needs to be BigInt
- // // Private functions don't do validations to avoid overhead of validation.
- // // Only public api's need to validate inputs.
- // if(x === 0) return null;
- // gptwo = gptwo || x & -x;
-
- // // DeBruijn explodes on multiplication and needs to work on BigInts even if the results are containted in 32 bits...
- // // PB : TODO -- Not sure if this is faster. In any case BigInts are slower.
- // var MultiplyDeBruijnBitPosition = [
- // 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
- // 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
- // ];
- // return MultiplyDeBruijnBitPosition[( ( gptwo * BigInt( 0x077CB531 )) >> BigInt(27) ) % BigInt(32) ];
- // }
-
- // https://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set
- // http://graphics.stanford.edu/~seander/bithacks.html
-
- const BitArrayUpto32Bits = (function(){
- function validateBitLength(length){ if(length > 32) throw 'BitArrayUpto32Bits doesnt accept BitLength > 32' }
-
- function __createA(arr){
- validateBitLength(arr.length);
- var created = __create();
-
- // PB : TODO -- Changes this to preincrement. Mask need not overflow for 32 bits...
- var iterateUpto = [
- ()=>{for(var i =0 ; i < 1; i++) { console.log(i); created.assignMask(arr[i], { title : arr[i]}); }}
- , ()=>{for(var i =1 ; i < Math.min(31, arr.length); i++) { console.log(i); created.assignMask(arr[i], { title : arr[i]}, leftshift_Number ); }}
- , ()=>{for(var i =31; i < Math.min(32, arr.length); i++) { console.log(i); created.assignMask(arr[i], { title : arr[i]}, (m)=>{ return leftshift_Number(m)>>>0 } ); }}
- ];
- arr.length > 31 ? iterateUpto.forEach(f=>f()) :
- arr.length > 1 ? iterateUpto.slice(0,2).forEach(f=>f()) :
- iterateUpto[0]();
- return created;
- }
-
- function __createO(o){
- var arr = Object.keys(o);
- validateBitLength(arr.length);
-
- var created = __create();
-
- var iterateUpto = [
- ()=>{for(var i =0 ; i < 1; i++) { console.log(i); created.assignMask(arr[i], o[arr[i]]); }}
- , ()=>{for(var i =1 ; i < Math.min(31, arr.length); i++) { console.log(i); created.assignMask(arr[i], o[arr[i]], leftshift_Number ); }}
- , ()=>{for(var i =31; i < Math.min(32, arr.length); i++) { console.log(i); created.assignMask(arr[i], o[arr[i]], (m)=>{ return leftshift_Number(m)>>>0 } ); }}
- ];
- arr.length > 31 ? iterateUpto.forEach(f=>f()) :
- arr.length > 1 ? iterateUpto.slice(0,2).forEach(f=>f()) :
- iterateUpto[0]();
-
- return created;
- }
-
- function __create(){
-
- // var store = ??? new Uint32Array(1)var mxn = Mixin.create()
- // PB : TODO -- Not in use.
- // var created = utils.assign(mxn,
- // {
- // validateMask(m){
- // if(__is(m, BitIndex)) {
- // if(m > 32) throw 'BitArrayUpto32Bits doesnt accept BitIndex > 32'
- // return { BitIndex, labels : [masks[indexToMask(m.value)]]
- // // , indices : m.value
- // }
- // }
- // if(m > MAX_32BITS) throw "BitArrayUpto32Bits only supports numbers upto MAX_32BITS "
- // if(!utils.js.isNumber(+m)) throw "BitArrayUpto32Bits requires Numbers upto MAX_32BITS "
- // return true;
- // }
- // , labelsToMask : (__labels)=>{
- // var result = 0; __labels.forEach(l=>{ result |= labels[l] })
- // return result >>> 0;
- // }
- // , hasMask : function(label) { return labels[label] ? labels[label].mask : null ; }
- // , maskToLabels(m, transformEach){
- // var valid = this.validateMask(m);
- // if(!valid) throw "Invalid Mask"
- // if(valid.BitIndex) return valid.labels;
-
- // var __labels = [];
- // for(var gptwo;gptwo=m&-m;m^=gptwo) {
- // if(!masks[gptwo]) { console.log('Error : Invalid mask passed in.') }
- // else __labels.push( transformEach(masks[Number(gptwo)], labels[masks[Number(gptwo)]]) )
- // }
- // return __labels;
- // }
- // , labelToMask : (l)=>{ return labels[l] }
- // , bit_or : (a, b)=>a | b
- // , bit_and : (a, b)=>a & b
- // , bit_xor : (a, b)=>a ^ b
- // , bit_not : (a)=> ~a
-
- // , assignMask : function(label, entity, incrementFn) {
- // var lmask = this.hasMask(label); if(lmask) return lmask; // Already assigned.
- // labels[label] = entity;
- // labels[label].mask = currentMaxMask = incrementFn ? incrementFn(currentMaxMask) : __nextMask(); // Use the next unused mask for this dictionary of labels. Currently random. We should eventually have a sort order.
- // masks[labels[label].mask] = label;
- // return labels[label];
- // }
- // , msbIndex : function(v) { throw "msb Not yet implemented" }
- // , indexToMask : function(index) {
- // if(index > 31) throw 'Not supported beyond 32 bits.'
- // return (1 << index) >>> 0;
- // }
- // , indicesToMask : function(indices){
- // var mask = 0;
- // indices.forEach(index=>{
- // if(index > 31) throw 'Not supported beyond 32 bits.'
- // mask |= (1 << index)
- // })
- // return mask >>> 0;
- // }
- // , maskToIndices : function(m) {
- // var valid = this.validateMask(m);
- // if(!valid) throw "Invalid Mask"
- // if(valid.BitIndex) return [m.value];
- // var indices = [];
- // var gptwo;
- // for (;gptwo=m&-m;m^=gptwo) indices.push(indexOfLSB32(gptwo))
- // return indices;
- // }
- // , bit_shiftl : (a, s)=>{ return a << s }
- // , bit_shiftr : (a, s)=>{ return a >> s }
- // , bit_shiftr_uz : (a)=>{ return a >>> 0} // Unsigned right shift by 0.
- // // , bit_shiftl_1 : ()=>{}
-
- // , toJSON(radix, eachFn){
- // var transFormed = {};
- // if(!eachFn) return labels;
- // Object.keys(labels).forEach(label =>{
- // transFormed[label] = eachFn(labels[label])
- // })
- // return transFormed;
- // }
- // , test(){
- // Object.keys(masks).forEach((v, i)=> {
- // console.log( v )
- // console.log( i + ' : ' + v.toString(2) )
- // console.log( this.maskToIndices(v))
- // })
- // console.log( (173).toString(2) )
- // this.maskToIndices(173).map( (i)=>{ console.log( i ) })
- // console.log('indicesToMask :' + this.indicesToMask([1,4,31]).toString(2))
- // }
- // })
- }
-
- var creatorFor = {
- '[object Array]' : __createA
- , '[object Object]' : __createO
- , 'undefined' : function(){ return __create() }
- };
-
- // PB : TODO -- Constructor is not preserved... But mixing in an external passed in object is what we want to achive.
- function BitArrayUpto32Bits(){
- return arguments.length ? creatorFor[utils.js.nativeType(arguments[0])](...arguments) :
- creatorFor['undefined'](...arguments)}
-
- BitArrayUpto32Bits.create = BitArrayUpto32Bits;
- return BitArrayUpto32Bits
- })();
-
-
-
- const BitArrayBigInt = (function(){
-
-
- function __createA(arr){
- var created = __create();
-
- for(var i =0 ; i < 1; i++) { created.assignMask(arr[i], { title : arr[i]}); }
- for(var i =1 ; i < arr.length; i++) { created.assignMask(arr[i], { title : arr[i]}, leftshift_BigInt ); }
- return created;
- }
-
- function __createO(o){
- var arr = Object.keys(o);
- var created = __create();
-
- for(var i =0 ; i < 1; i++) { created.assignMask(arr[i], o[arr[i]]); }
- for(var i =1 ; i < arr.length; i++) { created.assignMask(arr[i], o[arr[i]], leftshift_BigInt ); }
-
- return created;
- }
-
- function __create(){
- var labels = {};
- var masks = {};
-
- var currentMaxMask;
- function __nextMask(){ __nextMask = leftshift_BigInt;
- return currentMaxMask = BIGINT_1; }
-
- // var store = ??? new Uint32Array(1)
- // PB : TODO -- This need not be done on each instance. We need to do an extend on the type...
- // -- BitArrayBigInt.extend({ validateMask(m){) ... })
- var mxn = Mixin.create();
- var created = utils.assign(mxn,
- {
- validateMask(m){
- if(mxn.is(m, BitIndex)) {
- return { BitIndex, labels : [masks[indexToMask(m.value)]] }
- }
- if(!utils.js.isBigInt(BigInt(m))) throw "BitArrayBigInt requires BigInt Mask "
- return true;
- }
- , labelsToMask : (__labels)=>{
- var result = BIGINT_0; __labels.forEach(l=>{ result |= labels[l]; });
- return result ;
- }
- , hasMask : function(label) { return labels[label] ? labels[label].mask : null ; }
- , maskToLabels(m, transformEach){
- m = BigInt(m);
- var valid = this.validateMask(m);
- if(!valid) throw "Invalid Mask"
- if(valid.BitIndex) return valid.labels;
-
- var __labels = [];
- for(var gptwo;gptwo=m&-m;m^=gptwo) {
- if(!masks[gptwo]) { console.log('Error : Invalid mask passed in.'); }
- else __labels.push( transformEach(masks[Number(gptwo)], labels[masks[Number(gptwo)]]) );
- }
- return __labels;
- }
- , labelToMask : (l)=>{ return labels[l] }
- , bit_or : (a, b)=>a | b
- , bit_and : (a, b)=>a & b
- , bit_xor : (a, b)=>a ^ b
- , bit_not : (a)=> ~a
-
- , assignMask : function(label, entity, incrementFn) {
- var lmask = this.hasMask(label); if(lmask) throw `Duplicate assignment for same label ${label} not allowed : mask (${lmask}) ` // Already assigned.
- labels[label] = entity;
- labels[label].mask = currentMaxMask = incrementFn ? incrementFn(currentMaxMask) : __nextMask(); // Use the next unused mask for this dictionary of labels. Currently random. We should eventually have a sort order.
- masks[labels[label].mask] = label;
- return labels[label];
- }
- , msbIndex : function(v) { throw "msb Not yet implemented" }
- , indexToMask : function(index) {
- return BIGINT_1 << index;
- }
- , indicesToMask : function(indices){
- var mask = 0;
- indices.forEach(index=>{
- mask |= (1 << index);
- });
- return mask;
- }
- , maskToIndices : function(m) {
- var valid = this.validateMask(m);
- if(!valid) throw "Invalid Mask"
- if(valid.BitIndex) return [m.value];
- var indices = [];
- var gptwo;
-
- var iterator = bigIntBufferGenerator(BigInt(m));
-
- var next;
- // if(next && !next.done) buffer = next.value.bits32;
- // else return next.value.bits32;
- var i = 0;
- while(!(next = iterator.next()).done) {
- next.value.bits32 > 0 ?
- ( ()=> { for(;gptwo=(next.value.bits32& -next.value.bits32) ;next.value.bits32^=gptwo) indices.push(32 * i + indexOfLSB32(gptwo)); } )
- : null;
- i++;
- }
- for(;gptwo=(next.value.bits32&-next.value.bits32);next.value.bits32^=gptwo) indices.push(32 * i + indexOfLSB32(gptwo));
-
- return indices;
- }
- , bit_shiftl : (a, s)=>{ return a << s }
- , bit_shiftr : (a, s)=>{ return a >> s }
- , bit_shiftr_uz : (a)=>{ throw "BigInt doesnt suppored unsigned right shift."} // Unsigned right shift by 0.
- // , bit_shiftl_1 : ()=>{}
- , toJSON(radix, eachFn){
- var transFormed = {};
- if(!eachFn) return labels;
- Object.keys(labels).forEach(label =>{
- transFormed[label] = eachFn(labels[label]);
- });
- return transFormed;
- }
- , tosqlcte() {
-
- var select = '';
- // debugger
- Object.keys(labels).forEach((label, index, array) =>{
- var labelObject = labels[label];
- var rowselect = 'select ';
- Object.keys(labelObject).forEach((key, index, array) =>{
- rowselect = rowselect + ` '${labelObject[key]}' ${key}`;
- if(array.length !== index+1) rowselect = rowselect + ',';
- });
- select = select + rowselect;
- if(array.length !== index+1) select = select + '\n union all \n';
- });
-
- console.log(select);
- return labels
-
-
- }
- , test(){
- Object.keys(masks).forEach((v, i)=> {
- console.log( v );
- console.log( i + ' : ' + v.toString(2) );
- console.log( this.maskToIndices(v));
- });
- console.log( (173).toString(2) );
- this.maskToIndices(173).map( (i)=>{ console.log( i ); });
- console.log('indicesToMask :' + this.indicesToMask([1,4,31]).toString(2));
- console.log(BigInt(2535301200456458802993406410752));
- console.log('bigIntToBuffer : ' + bigIntToBuffer(BigInt(2535301200456458802993406410752) ));
- console.log('bufferToBigInt : ' + bufferToBigInt( bigIntToBuffer(BigInt(2535301200456458802993406410752)) ));
- }
- }
- );
- created.addMixin(BitArrayBigInt);
- return created;
- }
-
- var creatorFor = {
- '[object Array]' : __createA
- , '[object Object]' : __createO
- , 'undefined' : function(){ return __create() }
- };
-
- // PB : TODO -- Constructor is not preserved... But mixing in an external passed in object is what we want to achive.
- function BitArrayBigInt(){
- return arguments.length ? creatorFor[utils.js.nativeType(arguments[0])](...arguments) :
- creatorFor['undefined'](...arguments)}
-
- BitArrayBigInt.create = BitArrayBigInt;
- return BitArrayBigInt
- })();
-
- // > 32 bits upto 53 bits.
- const BitArrayUpto53Bits = (function(){
-
- function validateBitLength(length){ if(length > 53) throw 'BitArrayUpto53Bits doesnt accept BitLength > 53' }
-
- function __createO(o, options){
- var arr = Object.keys(o);
- validateBitLength(arr.length);
-
- var created = __create();
-
- var iterateUpto = [
- ()=>{for(var i =0 ; i < 1; i++) { console.log(i); created.assignMask(arr[i], o[arr[i]]); }}
- , ()=>{for(var i =1 ; i < Math.min(31, arr.length); i++) { console.log(i); created.assignMask(arr[i], o[arr[i]], leftshift_Number ); }}
- , ()=>{for(var i =31; i < Math.min(32, arr.length); i++) { console.log(i); created.assignMask(arr[i], o[arr[i]], (m)=>{ return leftshift_Number(m)>>>0 } ); }}
- , ()=>{for(var i =32; i < Math.min(53, arr.length); i++) { console.log(i); created.assignMask(arr[i], o[arr[i]], (m)=>{ return Number(BigInt(m) << BIGINT_1) } ); }}
- ];
- arr.length > 32 ? iterateUpto.forEach(f=>f()) :
- arr.length > 31 ? iterateUpto.slice(0,3).forEach(f=>f()) :
- arr.length > 1 ? iterateUpto.slice(0,2).forEach(f=>f()) :
- iterateUpto[0]();
-
- return created;
- }
-
- function __createA(arrInp, options){
- validateBitLength(arrInp.length);
-
- var created = __create();
-
- var arr = [];
- var pregencache = [];
- // PB : Changed to preincrement. Mask need not overflow for 53 bits...
- var iterateUpto = [
- (prelen)=>{for(var i =Math.max(0, prelen) ; i < 1; i++) { console.log(i); created.assignMask(arr[i-prelen], pregencache[arr[i-prelen]] || { title : arr[i-prelen]} ); }}
- , (prelen)=>{for(var i =Math.max(1, prelen) ; i < Math.min(31, arr.length + prelen); i++) { console.log(i); created.assignMask(arr[i-prelen], pregencache[arr[i-prelen]] || { title : arr[i-prelen]}, leftshift_Number ); }}
- , (prelen)=>{for(var i =Math.max(31, prelen); i < Math.min(32, arr.length + prelen); i++) { console.log(i); created.assignMask(arr[i-prelen], pregencache[arr[i-prelen]] || { title : arr[i-prelen]}, (m)=>{ return leftshift_Number(m)>>>0 } ); }}
- , (prelen)=>{for(var i =Math.max(32, prelen); i < Math.min(53, arr.length + prelen); i++) { console.log(i); created.assignMask(arr[i-prelen], pregencache[arr[i-prelen]] || { title : arr[i-prelen]}, (m)=>{ return Number(BigInt(m) << BIGINT_1) } ); }}
- ];
-
- if(options && options.pregenerated) {
- arrInp.forEach((inp=>{
- if(!options.pregenerated[inp] || !options.pregenerated[inp].mask) {
- // Doesn't have a mask so needs generation.
- arr.push(inp);
- pregencache[inp] = options.pregenerated[inp];
- }
- else if(!options.pregenerated[inp]) arr.push(inp);
- }));
-
- Object.keys(options.pregenerated).forEach(p=>{
- if(pregencache[p]) return;
- created.assignMask(p, options.pregenerated[p], created.assignMaxAsNextIncrement );
- });
- var prelen = Object.keys(created.toJSON()).length;
- prelen > 31 ? iterateUpto.slice(3).forEach(f=>f(prelen)) :
- prelen > 30 ?
- (prelen + arr.length) > 32 ? iterateUpto.slice(2).forEach(f=>f(prelen))
- : iterateUpto.slice(2, 3).forEach(f=>f(prelen))
- :
- prelen > 0 ?
- (prelen + arr.length) > 32 ? iterateUpto.slice(1).forEach(f=>f(prelen))
- : (prelen + arr.length) > 31 ? iterateUpto.slice(1,3).forEach(f=>f(prelen)) :
- iterateUpto.slice(1,2).forEach(f=>f(prelen))
- :
- arr.length > 32 ? iterateUpto.forEach(f=>f(prelen)) :
- arr.length > 31 ? iterateUpto.slice(0,3).forEach(f=>f(prelen)) :
- arr.length > 1 ? iterateUpto.slice(0,2).forEach(f=>f(prelen)) :
- iterateUpto[0](prelen);
- }
- else {
- arr = arrInp;
- arr.length > 32 ? iterateUpto.forEach(f=>f(0)) :
- arr.length > 31 ? iterateUpto.slice(0,3).forEach(f=>f(0)) :
- arr.length > 1 ? iterateUpto.slice(0,2).forEach(f=>f(0)) :
- iterateUpto[0](0);
- }
-
- return created;
- }
-
- function __create(){
- var labels = {};
- var masks = {};
-
- var currentMaxMask;
- function __nextMask(){ __nextMask = leftshift_Number;
- return currentMaxMask = 1; }
-
-
-
- // var store = ??? new Uint32Array(1)
- // PB : TODO -- This need not be done on each instance. We need to do an extend on the type...
- // -- BitArrayBigInt.extend({ validateMask(m){) ... })
- var mxn = Mixin.create();
- var created = utils.assign(mxn,
- {
-
- assignMaxAsNextIncrement(possibleMax) {
- if(currentMaxMask && currentMaxMask < possibleMax) currentMaxMask = possibleMax;
- else currentMaxMask = possibleMax;
- }
- , validateMask(m){
- if(mxn.is(m, BitIndex)) {
- return { BitIndex, labels : [masks[indexToMask(m.value)]] }
- }
- if(m > MAX_53BITS) throw "BitArrayUpto53Bits only supports numbers upto MAX_53BITS "
- if(!utils.js.isNumber(+m)) throw "BitArrayUpto53Bits requires Numbers upto MAX_53BITS "
- return true;
- }
- , labelsToMask : (__labels)=>{
- var result = 0; __labels.forEach(l=>{ result |= labels[l]; });
- return result >>> 0;
- }
- , hasMask : function(label) { return labels[label] ? labels[label].mask : null ; }
- , maskToLabels(m, transformEach){
-
- var valid = this.validateMask(m);
- if(!valid) throw "Invalid Mask"
- if(valid.BitIndex) return valid.labels;
-
- var __labels = [];
- var m = BigInt(m);
- // for(var gptwo;gptwo=this.bit_and(m,-m); gptwo = this.bit_xor(m,gptwo)) {
- for(var gptwo;gptwo=m&-m;m^=gptwo) {
- if(!masks[Number(gptwo)]) { console.log('Error : Invalid mask passed in.'); }
- else __labels.push( transformEach(masks[Number(gptwo)], labels[masks[Number(gptwo)]]) );
- }
- return __labels;
- }
- , labelToMask : (l)=>{ return labels[l] }
- , bit_or : (a, b) => {
- return bit_opFn_Upto53(a,b, (a, b)=>a | b)
- }
- , bit_and : (a, b) => bit_opFn_Upto53(a,b, (a, b)=>a & b)
- , bit_xor : (a, b) => bit_opFn_Upto53(a,b, (a, b)=>a ^ b)
- , bit_not : (a) => Number(~BigInt(a))
- , assignMask : function(label, entity, onassignment) {
-
- if(entity && entity.mask && masks[entity.mask]) {
- throw 'Mask collision. Cannot assign requested mask. ' + entity
- }
- var pregenerated = labels[label] || entity;
- // var lmask = this.hasMask(label); if(lmask) return lmask; // Already assigned.
- // Everything is overridable except mask.
- if(pregenerated && pregenerated.mask) {
- onassignment = (onassignment || created.assignMaxAsNextIncrement);
-
- labels[label] = utils.assign(pregenerated, entity, {mask : pregenerated.mask});
- onassignment(pregenerated.mask);
- }
- else {
- onassignment = (onassignment || __nextMask);
-
- labels[label] = entity;
- labels[label].mask = currentMaxMask = onassignment ? onassignment(currentMaxMask) : __nextMask(); // Use the next unused mask for this dictionary of labels. Currently random. We should eventually have a sort order.
- }
- masks[labels[label].mask] = label;
- return labels[label];
- }
- , msbIndex : function(v) { throw "msb Not yet implemented" }
- , indexToMask : function(index) {
- if(index > 52) throw 'Not supported beyond 53 bits.'
- return Number(BigInt(1) << BigInt(index));
- }
- , indicesToMask : function(indices){
- var mask = BigInt(0);
- indices.forEach(index=>{
- if(index > 52) throw 'Not supported beyond 53 bits.'
- mask |= (BIGINT_1 << BigInt(index));
- });
- return Number(mask);
- }
- , maskToIndices : function(m) {
- var valid = this.validateMask(m);
- if(!valid) throw "Invalid Mask"
- if(valid.BitIndex) return [m.value];
- var indices = [];
- var gptwo;
- if(m > MAX_32BITS) {
- var iterator = bigIntBufferGenerator(BigInt(m));
-
- var next;
- // if(next && !next.done) buffer = next.value.bits32;
- // else return next.value.bits32;
- var i = 0;
- while(!(next = iterator.next()).done) {
- next.value.bits32 > 0 ?
- ( ()=> { for(;gptwo=(next.value.bits32& -next.value.bits32) ;next.value.bits32^=gptwo) indices.push(32 * i + indexOfLSB32(gptwo)); } )
- : null;
- i++;
- }
- for(;gptwo=(next.value.bits32&-next.value.bits32);next.value.bits32^=gptwo) indices.push(32 * i + indexOfLSB32(gptwo));
- }
- else {
- m = Number(m);
- for (;gptwo=m&-m;m^=gptwo) indices.push(indexOfLSB32(gptwo)); }
- // for (;gptwo=BigInt(m)&BigInt(-m);m^=gptwo) indices.push(indexOfLSB32(m, gptwo))
-
- return indices;
- }
- , bit_shiftl : (a, s)=>{ return a << s }
- , bit_shiftr : (a, s)=>{ return a >> s }
- , bit_shiftr_uz : (a)=>{ return a >>> 0} // Unsigned right shift by 0.
- // , bit_shiftl_1 : ()=>{}
- , toJSON(radix, eachFn){
- var transFormed = {};
- if(!eachFn) return labels;
- Object.keys(labels).forEach(label =>{
- transFormed[label] = eachFn(labels[label]);
- });
- return transFormed;
- }
- , tosqlcte() {
-
- var select = '';
- // debugger
- Object.keys(labels).forEach((label, index, array) =>{
- var labelObject = labels[label];
- var rowselect = 'select ';
- Object.keys(labelObject).forEach((key, index, array) =>{
- rowselect = rowselect + ` '${labelObject[key]}' ${key}`;
- if(array.length !== index+1) rowselect = rowselect + ',';
- });
- select = select + rowselect;
- if(array.length !== index+1) select = select + '\n union all \n';
- });
-
- console.log(select);
- return labels
-
-
- }
- , test(){
- Object.keys(masks).forEach((v, i)=> {
- console.log( v );
- console.log( i + ' : ' + v.toString(2) );
- console.log( this.maskToIndices(v));
- });
- console.log( (173).toString(2) );
- this.maskToIndices(173).map( (i)=>{ console.log( i ); });
- console.log('indicesToMask :' + this.indicesToMask([1,4,31]).toString(2));
- }
- });
-
- return created;
- }
-
- var creatorFor = {
- '[object Array]' : __createA
- , '[object Object]' : __createO
- , 'undefined' : function(){ return __create() }
-
- };
-
- // PB : TODO -- Constructor is not preserved... But mixing in an external passed in object is what we want to achive.
- function BitArrayUpto53Bits(){
- return arguments.length ? creatorFor[utils.js.nativeType(arguments[0])](...arguments) :
- creatorFor['undefined'](...arguments)}
-
- BitArrayUpto53Bits.create = BitArrayUpto53Bits;
- return BitArrayUpto53Bits
- })();
- function bit_opFn_Upto53(a, b, opFn){
-
- return Number(opFn(BigInt(a), BigInt(b) ))
- // var result = new Uint32Array(2);
- // result[0] = opFn( (a / POWER32)>>0 , (b / POWER32)>>0 )
- // result[1] = opFn(a % POWER32, b % POWER32)
- // return POWER32 * result[0] + result[1];
- }
-
- // An arbitrarily-wide array of bits. Can be used for bitmasks longer than 32 bits in JS.
- const BitArray = (function(){
-
- // const NEEDS_BIT_SPLIT = (b)=> b > Number.MAX_SAFE_INTEGER;
- // const MAX_SAFE_MASK_LENGTH = 32
-
- // function getMinMax(a, b){
- // return a.length > b.length ? { min : b.length, minX : b, max : a.length, maxX : a }
- // : { min : a.length, minX : a, max : b.length, maxX : b }
- // }
-
- // function getTypes(a, b){
- // var aIsPrimitive = utils.js.isPrimitive(a);
- // var bIsPrimitive = utils.js.isPrimitive(b);
- // return { a : aIsPrimitive, b : bIsPrimitive }
- // }
-
- // // Binary oprations
- // function bit_opFn(a, b, opFn){
- // var tt = getTypes(a, b);
- // var mm = {}
- // var getRemaining = function(){ return mm.maxX.subarray(mm.min, mm.max-1)}
- // if(tt.a && tt.b) {
- // // both are primitive
- // mm = { min : 1, minX : [a], max : 1, maxX : [b]}
- // getRemaining = function(){ return []}
- // }
- // else if(tt.a){
- // // b is bitarray
- // mm = { min : 1, minX : [a], max : b.length, maxX : b}
- // }
- // else if(tt.b){
- // mm = { min : 1, minX : [b], max : a.length, maxX : a}
- // }
- // else {
- // var mm = getMinMax(a, b)
- // }
-
- // var result = new Uint32Array(mm.max);
- // for (var i = 0; i < mm.min; ++i) { result.set( [opFn(mm.minX[i], mm.maxX[i])], i) }
- // // js.utils.isPrimitive(mm.maxX) ?
- // var remaining = getRemaining()
- // remaining.length > 0 ? result.set( remaining, mm.min) : null;
- // return result;
- // }
-
- // // Unary operations
- // function bit_opFnU(mm, opFn){
- // var result = new Uint32Array(mm.length);
- // for (var i = 0; i < mm.min; ++i) { result.set( opFn(a), i) }
- // result.set( mm.maxX.subarray(mm.min, mm.max-1), mm.min)
- // return result;
- // }
- // function __expand(){
-
- // }
-
- function __createA(arr){
- // Create a new BitArray
- // Assign Unique bits to each item in an array of labels.
- arr.length % 32;
- arr.length/32 >>> 0;
- var created = arr.length > 53 ?
- BitArrayBigInt.create(...arguments) : arr.length > 32 ?
- BitArrayUpto53Bits.create(...arguments) :
- BitArrayUpto32Bits.create(...arguments);
- return created;
- }
-
- function __createO(o){
- // Create a new BitArray
- // Assign Unique bits to each item in an array of labels.
- var arr = Object.keys(o);
-
- arr.length % 32;
- arr.length/32 >>> 0;
- var created = arr.length > 53 ?
- BitArrayBigInt.create(...arguments) : arr.length > 32 ?
- BitArrayUpto53Bits.create(...arguments) :
- BitArrayUpto32Bits.create(...arguments);
- return created;
- }
-
- function __create(){
-
-
- // var store = new Uint32Array(1)
- // var mxn = Mixin.create()
- var created = BitArrayBigInt.create();
- created.addMixin(BitArray);
- return created;
- }
-
- var creatorFor = {
- '[object Array]' : __createA
- , '[object Object]' : __createO
- , 'undefined' : function(){ return __create() }
- };
- // PB : TODO -- Constructor for BitArrays read from files that have been generated and saved.
- // PB : TODO -- Constructor is not preserved... But mixing in an external passed in object is what we want to achive.
- function BitArray(){
- return arguments.length ? creatorFor[utils.js.nativeType(arguments[0])](...arguments) :
- creatorFor['undefined'](...arguments)}
- BitArray.create = BitArray;
- return BitArray
- })();
-
-
- // var uuidv1 = utils.core.uuidV1;
- const { v1: uuidv1 } = require$$3$1;
- // console.log(uuidv1)
-
- // Mixins.
- const mixs = {
- // __JSTPL : (function() {
- // function __f() {}
- // return function() {
- // this.f = __f;
- // return this;
- // };
- // })()
-
- // Return a set of mixins.
-
- kernelMixin : (function() {
-
- // Wrapper to generate the currently chosen UUID version
- // In JS UUID v4 vs v1 -> In browsers v1 has the timestamp but uses a random number for the node part.
- function __getuuid() {
- return uuidv1();
- }
-
- // uuid property Mainstream getter after lazy init
- function __get() {
- return this.kernel.uuidv1;
- }
-
- // uuid property First Time getter for lazy init.
- function __firstGet() {
- this.kernel.uuidv1 = __getuuid();
-
- __finalize.apply(this);
- return this.uuid;
- }
-
- function __finalize(){
- Object.defineProperty(this.kernel, 'uuidv1', { writable : false, configurable : false});
- Object.defineProperty(this, 'uuid', {
-
- get : __get
- , enumerable : true
- , configurable : false
- });
-
- Object.defineProperty(this, 'kernel', {
-
- enumerable : false
- , configurable : false
- , writable : false
- });
- }
-
- function __defineKernel(){
-
- // MAC and time. Guaranteed unique unless generated way too fast or parallelly.
- //const uuidv1 = utils.core.uuidV1; // (date-time and MAC address)
- //const uuidv2 = // (date-time and MAC Address, DCE security version)
-
- // (namespace name-based) ...
- //const uuidv3md5 = require('uuid/v3');
- //const uuidv5sha1 = require('uuid/v3'); // SHA1(v5) is broken
-
- //const uuidv4 = require('uuid/v4'); //(random)
-
-
- // Kernel Properties are promoted onto the object itself without value as getters and setters as
- // configurable = false
- // enumerable = false
- // writable = false
- Object.defineProperty(this, 'kernel', { value :{}, writable : true });
-
-
- // Keep it lazy. Only generate on first use. Which could be first time persistence.
- Object.defineProperty(this.kernel, 'uuidv1', { writable : true, configurable : true});
-
- // PB : TODO -- Note : A hash of the content may need to be computed dynamically.
- // The best place to do this is on persistance. In memory objects undergo a lot of changes so the hash keeps varying.
- // It therefore becomes unnecessary to compute the hash very frequently. We may need to do this lazily when accessed or
- // simply use all attributes for comparison. The value of a hash is useful only when the attributes are not changing
- // and the hash is precomputed and ready to be used. We need to use gits methodology to track changes.
- }
-
- function __loadKernel() {
- // Reinitialize the kernel for an object that already has a uuid probably loaded from a JSON.
- this.kernel.uuidv1 = this.uuid;
- __finalize.apply(this);
- }
-
- function __attachKernel() {
-
- // Dont mess with something that already has a kernel.
- if(this.hasOwnProperty('kernel')) {
- l('Already has kernel');
- return this;
- }
-
- __defineKernel.apply(this);
-
- if(this.hasOwnProperty('uuid')) {
- l('Already has uuid');
- __loadKernel.apply(this);
-
- return this;
- }
- Object.defineProperty(this, 'uuid', { get : __firstGet, configurable : true});
- return this;
- }
-
- var __kernelInstanceMixin = function() {
- return __attachKernel.apply(this);
- };
- __kernelInstanceMixin.getuuid = __getuuid;
- return __kernelInstanceMixin;
- })()
-
- // Publishes messages to a message queue broker or mediator.
- , publisherMixin : (function() {
- function __publish() {
-
- }
- return function() {
- this.publish = __publish;
- return this;
- };
- })()
- };
-
- // Note : Prophelpers are not mixed into the object and hence need to be applied on some other object.
- const helpers = {
- indexHelper : indexHelper
- , meta : (function() {
-
- // Mainly to observe changes to object properties.
- // A kernel uuid is a prerequisite.
- function spy(obj, prop, action) {
- action = action || 'set';
- if(action != 'set') {
- throw 'Currently only set actions can be observed on properties';
- }
-
- // Get the current descriptor
- var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
- var value = obj[prop];
-
- if(descriptor && descriptor.get && descriptor.get.$meta){
- var originalset = descriptor.set;
- descriptor.set = function(newValue) {
- __g.mediator.publish(obj.uuid + '.' + prop, 'willchange', {from : value, to : newValue});
- originalset(newValue);
- __g.mediator.publish(obj.uuid + '.' + prop, 'haschanged', {from : value, to : newValue});
- };
- return this;
- }
-
- descriptor = {
- get: function() {
- return value;
- },
- set: function(newValue) {
- __g.mediator.publish([obj.uuid, prop, 'willchange'], {from : value, to : newValue});
- value = newValue;
- __g.mediator.publish([obj.uuid, prop, 'haschanged' ], {from : value, to : newValue});
- }
- };
- descriptor.get.$meta = {};
- Object.defineProperty(obj, prop, descriptor);
- return this;
- }
-
- function getCustomPropertyDescriptor(obj, prop) {
- var actualDescriptor = Object.getOwnPropertyDescriptor(obj, prop);
- if (actualDescriptor && actualDescriptor.get && actualDescriptor.get.$meta) {
- return actualDescriptor;
- }
-
- var value = obj[prop];
- var descriptor = {
- get: function() {
- return value;
- },
- set: function(newValue) {
- value = newValue;
- }
- };
- descriptor.get.$meta = {};
-
- Object.defineProperty(obj, prop, descriptor);
- return Object.getOwnPropertyDescriptor(obj, prop);
- }
-
- function setPropertyAttribute(obj, propertyName, attributeName, attributeValue) {
- var descriptor = getCustomPropertyDescriptor(obj, propertyName);
-
- descriptor.get.$meta[attributeName] = attributeValue;
- }
-
- function getPropertyAttributes(obj, propertyName) {
- var descriptor = getCustomPropertyDescriptor(obj, propertyName);
-
- return descriptor.get.$meta;
- }
-
- function getPropertyAttribute(obj, propertyName, attributeName) {
- return getPropertyAttributes(obj, propertyName)[attributeName];
- }
-
- return function(obj) {
- obj.getPropertyAttribute = getPropertyAttribute;
- obj.getPropertyAttributes = getPropertyAttributes;
- obj.setPropertyAttribute = setPropertyAttribute;
- obj.spy = spy;
-
- return obj;
- };
- })()
- };
-
- var core = function(object){
- // We can find call site info here... like this etc.
- // l('in \tFunction core')
- return {
- mixs
- , helpers
- , AnyStore
- , StateStore
- , BitArray
- , BitArrayUpto32Bits
- , BitArrayUpto53Bits
- , BitArrayBigInt
- // core object instances
- , uuidv1
- , Rule
- , uuidv1
- , logpublisher : __g.logpublisher
- , Clazz
- }
- };
-
- // export default core;
- module.exports = core;
- // console.dir(__g.mediator)
- // try {
- // console.log( '__g === global : ' + (__g === global) )
- // }
- // catch(e){
- // console.log( '__g === global : ' + false )
- // }
- // try {
- // console.log( '__g === globalThis : ' + (__g === globalThis) )
- // }
- // catch(e){
- // console.log( '__g === globalThis : ' + false )
- // }
-
-
- function *bigIntBitGenerator(){
- var signal = {};
- var stop = Symbol();
- var iId = 0;
- var bit = BIGINT_1;
- for(;;){
- signal = (yield { iId, bit }) || {};
- if(signal === stop || signal.done) return { iId, bit };
- bit = bit << BIGINT_1;
- iId++;
- }
- }
-
- var Rule = (function(){
-
-
- // Immutable private static.
- var __Rule = {};
-
- // Overridable public static shared on the instance as well as convenience functions.
- // When the extend method is used the instance methods also correspond.
- // IMP : NOTE -- However instance overrides do not switch the static ones attached to the class.
- // These could also be called statically with call or apply Eg: fn.apply(this)
- var _XRule = { assignbit, getParticipating };
- // Extendable public static
- // _Rule should not be referenced anywhere... as its members can be swithed.
-
-
- var _Rule = {
-
- extend : function(extension){
-
- function __create(){ return init.call({}) }
- function __createO(o){ return init.call(o) }
- function __createA(a){ a.forEach(r=> __createO(r)); return a }
- var creatorFor = {
- '[object Array]' : __createA
- , '[object Object]' : __createO
- , 'undefined' : function(){ return __create() }
- };
-
- function Rule(){ return arguments.length ? creatorFor[utils.js.nativeType(arguments[0])](...arguments) : creatorFor['undefined'](...arguments) }
-
- // All static extensions shall be available on the instance as well.
- var _extension = utils.assign({}, _XRule, extension);
- function init() { return utils.assign(this, rProto, _extension, __newInstance(this), this) } _extension.init = init;
- utils.assign(Rule, _Rule, _extension, __Rule);
-
- // Immutable public static methods.
- Rule.create = Rule;
- Rule.build = buildRules;
- Rule.match = match;
- Rule.connect = connectRules;
- Rule.branch = function(as, ...rest){
- // PB : TODO -- All lists will be invalidated when we splice rules in...
- // Rule.create()
- // Replace an exisiting rule node with an intermediate rule that connects this rule to another rule.
- console.error('Not yet implemented.');
- };
-
- // from loopback-connector/lib/sql.js
- // PB : TODO -- a generic multipurpose buildwhere which doesn't enforce model property existence
- // Convert from a natural filter to key val expanded filter.
- // Convert In clauses to one rule for each listed values.
- // Do not output the where clause but inlude the operator in the result assosiated with the respective params.
- // Handle mask overflows gracefully
- /**
- * @param where
- * @returns {ChoppedRules}
- */
- function buildRules(where, data, fullResult, parentRule) {
- let columnValue;
- if (!where) return Promise.resolve(fullResult) ;
-
- if (typeof where !== 'object' || Array.isArray(where)) {
- debug('Invalid value for where: %j', where);
- return Promise.resolve(fullResult);
- }
-
- var ruleset = [];
- // var id = Object.keys(where).length > 1 ? null : data ? data.id : null;
- var id = data ? data.id : null;
- fullResult = fullResult || [];
- var createIntermediate = createIntermediateParentLess;
- var immediateParentP = null;
- if(parentRule) {
- immediateParentP = parentRule;
- createIntermediate = createIntermediateWithParent;
- }
-
- if(Object.keys(where).length > 1) {
- immediateParentP = createIntermediate({operator : AND}, ()=>{ return [] }, parentRule);
- ruleset.push(immediateParentP);
- fullResult.push(immediateParentP);
- createIntermediate = createIntermediateWithParent;
- }
-
- for (const key in where) {
- // Handle and/or operators
- if (key === AND || key === OR) {
- const clauses = where[key];
- if (Array.isArray(clauses)) {
- if(clauses.length > 1) {
- var rp = createIntermediate({operator : key}, (rParent)=>{
- var list = [];
- for (let i = 0, n = clauses.length; i < n; i++) {
- list.push(buildRules(clauses[i], null, fullResult).then( ruleForClause => {
- connectRules(operators[rParent.operator].bit, ruleForClause, rParent);
- return ruleForClause;
- }));
- }
- return list;
- }, immediateParentP);
- ruleset.push(rp);
- fullResult.push(rp);
- }
- else {
- // An outer 'or' OR 'and' condition is meaningless if we have only 1 clause. At least two are required to make sense.
- // We just drop the wrapped grouped (or or and) condition and promote then inner clause to the same level. =
- var rP = buildRules(clauses[0], null, fullResult, immediateParentP);
- // fullResult.push(rP) // Buildrules should should have already pushed this.
- ruleset.push(rP); // buildRules should have already linked parent and child.
- }
- continue;
- }
- else {
- throw 'Invalid filter '
- }
- }
- // eslint-disable one-var
- let expression = where[key];
- let p = key;
- var op ='eq';
- const columnName = columnEscaped(/* modelinstance || */ where, key);
- // eslint-enable one-var
- if (expression === null || expression === undefined) {
- // If null has been passed in we should match null.
- expression = null;
-
- var rpromise = assignbit(Rule.create({ key : columnName, value : toColumnValue(p, expression)})).then((rChild)=>{
- if(immediateParentP) {
- return immediateParentP.then((immediateParent)=> {
- connectRules(operators[immediateParent.operator].bit, rChild, immediateParent);
- return rChild
- })
- }
-
- // PB : TODO -- Unwrapped decendents update on parent!!!
- return rChild
- }).catch(e=>{ console.error('null expression : ' + e); });
-
- fullResult.push(rpromise);
- ruleset.push(rpromise);
- } else if (expression && expression.constructor === Object) {
- const operator = Object.keys(expression)[0];
- expression = expression[operator];
- if (operator === INQ || operator === NIN || operator === BETWEEN) {
- columnValue = [];
- op = operator === INQ ? (EQ) : operator === NIN ? (NEQ) : (LTE);
- if (Array.isArray(expression)) {
- // Column value is a list
- for (let j = 0, m = expression.length; j < m; j++) {
- columnValue.push(toColumnValue(p, expression[j]));
- }
- } else {
- // Loopback keys arrays with an string key called '[]' for operators with an array value. This is weird.
- columnValue.push(toColumnValue(p, expression['[]'] || expression ));
- }
-
- if (operator === BETWEEN) {
- var rp = createIntermediate({operator : AND}, (rParent)=>{
- // BETWEEN v1 AND v2
- columnValue[0] === undefined ? null : columnValue[0];
- columnValue[1] === undefined ? null : columnValue[1];
- if(expression.length !== 2) console.error('Invalid between operator parameter length');
-
- var list = [];
- list.push(assignbit(Rule.create({key : columnName, value : columnValue[0], operator : GTE})).then((rChild)=>{
- connectRules(operators[rParent.operator].bit, rChild, rParent);
- return rChild
- }));
- list.push(assignbit(Rule.create({key : columnName, value : columnValue[1], operator : LTE})).then((rChild)=>{
- connectRules(operators[rParent.operator].bit, rChild, rParent);
- return rChild
- }));
- fullResult.push.apply(fullResult, list);
- return list;
- }, immediateParentP);
- ruleset.push(rp);
- fullResult.push(rp);
-
- } else {
- var rp = createIntermediate({operator : OR}, (rParent)=>{
- // IN (v1,v2,v3) or NOT IN (v1,v2,v3)
- // PB : TODO -- loopbacks handling of nulls is questionable. Invalid rules match nulls and return data.
- if (columnValue.length === 0) {
- if (operator === INQ) {
- columnValue = [null];
- } else {
- // nin () is true
- // nin : [null] is a world query which is an invalid filter. We don't support yet.
- return [];
- }
- }
- var list = [];
- for (let j = 0, m = columnValue.length; j < m; j++) {
- list.push(
- assignbit(Rule.create({key : columnName, value : toColumnValue(p, columnValue[j]), operator : op})).then((rChild)=>{
- connectRules(operators[rParent.operator].bit, rChild, rParent);
- return rChild
- })
- );
- }
- fullResult.push.apply(fullResult, list);
- return list
- }, immediateParentP);
- ruleset.push(rp);
- fullResult.push(rp);
- }
- } else if (operator === 'regexp' && expression instanceof RegExp) {
- // do not coerce RegExp based on property definitions
-
- var rpromise = assignbit(Rule.create({key : columnName, value : toColumnValue(p, expression), operator})).then((rChild)=>{
- if(immediateParentP) {
- return immediateParentP.then((immediateParent)=> {
- connectRules(operators[immediateParent.operator].bit, rChild, immediateParent);
- return rChild
- })
- }
-
- // PB : TODO -- Unwrapped decendents update on parent!!!
- return rChild
- }).catch(e=>{ console.error('Regexp expression : ' + e); });
-
- fullResult.push(rpromise);
- ruleset.push(rpromise);
- // columnValue = expression;
- } else {
- var rpromise = assignbit(Rule.create({key : columnName, value : toColumnValue(p, expression), operator})).then((rChild)=>{
- if(immediateParentP) {
- return immediateParentP.then((immediateParent)=> {
- connectRules(operators[immediateParent.operator].bit, rChild, immediateParent);
- return rChild
- })
- }
-
- // PB : TODO -- Unwrapped decendents update on parent!!!
- return rChild
- }).catch(e=>{ console.error('other expression : ' + e); });
- fullResult.push(rpromise);
- ruleset.push(rpromise);
-
- // columnValue = toColumnValue(p, expression);
- }
-
- } else {
-
- if(utils.js.isArray(expression)) throw 'Invalid array value for filter. Implicit INQ not supported. '
- // ruleProcessor[EQ]();
-
- var rpromise = assignbit(Rule.create({key : columnName, value : toColumnValue(p, expression), operator : EQ})).then((rChild)=>{
- if(immediateParentP) {
- return immediateParentP.then((immediateParent)=> {
- connectRules(operators[immediateParent.operator].bit, rChild, immediateParent);
- return rChild
- })
- }
-
- // PB : TODO -- Unwrapped decendents update on parent!!!
- return rChild
- }).catch(e=>{ console.error('other expression : ' + e); });
-
- fullResult.push(rpromise);
- ruleset.push(rpromise);
- }
- }
-
- return Promise.all(ruleset).then(()=>{
-
- if(immediateParentP){
- return immediateParentP;
- }
- if(ruleset.length > 1) {
- // If only 1 rule there is no point in having an outer implicit and.
- // If length is > 1 it implies there are a mixture of ands ors and raw rules specified as an outer object
- // and we need to return the grouped rule.
-
- // var grpromise = Promise.all(ruleset).then( (list)=>{
- // var grouped = Rule.create({ id, operator : AND }).assignbit();
- // return grouped.then(r=>{
- // r.list = list;
- // return r
- // })
- // });
-
- // fullResult.push(grpromise)
- // return grpromise
-
- return ruleset[ruleset.length-1].then((r)=>{ r.id = id || r.id; return r});
- }
- else if(ruleset.length > 0) {
- return ruleset[0].then((r)=>{ r.id = id || r.id; return r});
- }
- else {
- if(fullResult.length > 0) return fullResult[fullResult.length-1].then((r)=>{ r.id = id || r.id; return r});
- else return Promise.resolve([])
- }
- })
-
- }
- return Rule
- }
- };
- var createIntermediateParentLess = (interMediatGroupParent, createChildren)=>{
- var interMediatGroupParentP = assignbit(Rule.create(interMediatGroupParent)).then((rIntermediate)=>{
- return rIntermediate
- });
-
- var grpromise = interMediatGroupParentP.then((rParent)=>{
-
- // var rParent = resolved[1]
- // if(immediateParentP) {
- // connectRules( operators[ resolved[0].operator].bit, rParent, resolved[0] )
- // // PB : Note -- we connect right here and after children are properly created we update parent descendents when we unwrap to root parent.
- // rParent.ancestors |= resolved[0].ancestors | resolved[0].bit // PB : TODO -- should ancestors be included in the mask ???
- // }
-
- // PB : TODO -- When we unwind descendents on ancestors need to be updated.
- // PB : TODO -- Why is this group not getting pushed into the full list.
- // Also what happens when caluse[i] is an array ? Does a group get created and also clause i ?
- return Promise.all(createChildren(rParent)).then( (list)=>{
- // PB : TODO -- We don't know yet whether id needs to be assigned to this rule
- // or an outer grouped rule.
- rParent.list = list;
- return rParent
- });
- });
- return grpromise;
- };
-
- var createIntermediateWithParent = (interMediatGroupParent, createChildren, immediateParentP)=>{
-
- var interMediatGroupParentP = assignbit(Rule.create(interMediatGroupParent)).then((rIntermediate)=>{
- return immediateParentP.then((immediateParent)=>{
- connectRules(operators[immediateParent.operator].bit, rIntermediate, immediateParent);
- return rIntermediate
- })
- });
-
- var grpromise = interMediatGroupParentP.then((rParent)=>{
-
- // var rParent = resolved[1]
- // if(immediateParentP) {
- // connectRules( operators[ resolved[0].operator].bit, rParent, resolved[0] )
- // // PB : Note -- we connect right here and after children are properly created we update parent descendents when we unwrap to root parent.
- // rParent.ancestors |= resolved[0].ancestors | resolved[0].bit // PB : TODO -- should ancestors be included in the mask ???
- // }
-
- // PB : TODO -- When we unwind descendents on ancestors need to be updated.
- // PB : TODO -- Why is this group not getting pushed into the full list.
- // Also what happens when caluse[i] is an array ? Does a group get created and also clause i ?
- return Promise.all(createChildren(rParent)).then( (list)=>{
- // PB : TODO -- We don't know yet whether id needs to be assigned to this rule
- // or an outer grouped rule.
- rParent.list = list;
- return rParent
- });
- });
- return grpromise;
- };
-
- // Literals
- const EQ = 'eq';
- const LTE = 'lte';
- const GTE = 'gte';
- const LT = 'lt';
- const GT = 'gt';
- const AND = 'and';
- const OR = 'or';
- const INQ = 'inq';
- const BETWEEN = 'between';
- const NIN = 'nin';
- const NEQ = 'neq';
- __Rule.EQ = 1;
- __Rule.LTE = 2;
- __Rule.GTE = 4;
- __Rule.LT = 8;
- __Rule.GT = 16;
- __Rule.AND = 32;
- __Rule.OR = 64;
-
- var operators = {
- eq : { operator : '=', bit : __Rule.EQ}
- , neq : { operator : '!=', bit : __Rule.NEQ}
- , lte : { operator : '<=', bit : __Rule.LTE}
- , gte : { operator : '>=', bit : __Rule.GTE}
- , lt : { operator : '<', bit : __Rule.LT}
- , gt : { operator : '>', bit : __Rule.GT}
- , and : { operator : AND, bit : __Rule.AND}
- , or : { operator : OR, bit : __Rule.OR}
- };
-
- var operatorsIndex = {};
- Object.keys(operators).forEach(op => operatorsIndex[operators[op].bit] = operators[op] );
-
- function __newInstance(o){
- var d = new Date();
- var id = o.id || uuidv1();
- return { v1ruleId : id, id, datecreated : d, datemodified : d
- , permissive : BIGINT_0, restrictive : BIGINT_0, descendents : BIGINT_0, ancestors : BIGINT_0, list :[] }
- }
-
- var globalBitIterator = bigIntBitGenerator();
- function assignbit(rule){ var g = globalBitIterator.next().value; rule.bit = g.bit; rule.ruleiId = g.iId;
- return Promise.resolve(rule); // PB : TODO -- remove backward compatible promisification...
- }
- // Find leaf rules from a set of rules ( in a database of rules ) that match the inputs
- function getParticipating(iRule, rList, cb){
- return Promise.all(iRule.results).then((iRules)=>{
- var SUCCESS = BIGINT_0;
- var FAILURE = BIGINT_0;
- var mask = BIGINT_0;
- var results = rList.filter(rule => {
- var found = iRules.find( iR => {
- if(iR.key && typeof(iR.key)=='string'){iR.key=iR.key.toUpperCase();}
- if(iR === rule || iR.id === rule.id ||
- iR.key === rule.key &&
- ( rule.operator == GT && (
- rule.value <= iR.value && iR.operator == GT
- || rule.value < iR.value && ( iR.operator == GTE || iR.operator == EQ )
- )
- || rule.operator == GTE && (
- rule.value <= iR.value && (iR.operator == GTE || iR.operator == EQ)
- || (iR.value - rule.value) >= 0 && iR.operator == GT
- )
- || rule.operator == LT && (
- rule.value >= iR.value && iR.operator == LT
- || rule.value > iR.value && ( iR.operator == LTE || iR.operator == EQ )
- )
- || rule.operator == LTE && (
- rule.value >= iR.value && (iR.operator == LTE || iR.operator == EQ)
- || (rule.value - iR.value) >= 0 && iR.operator == LT
- )
- || rule.operator == EQ && (
- rule.value == iR.value && iR.operator == EQ
- )
- )
- ) {
-
- SUCCESS |= bufferToBigInt(rule.bit);
- mask |= bufferToBigInt(rule.mask);
- return true;
- }
- });
-
- if(!found) {
- if(rule.isleaf) { FAILURE |= rule.bit; }
- else {
- // Composite rule evaluation here is incomplete since we are still iterating and finding leaf level participants.
- // Optimistically computed in case we get lucky here on first pass for result caching efficiency.
- // No point in attempting a full evaluation for composite rule through parts as parts are still being evaluated.
- // A priority evaluation registration of leaf level descendents with a async postponed evaluation task for this rule...
- // may help with evaulation of relevant rules earlier....
- // This specific rules full evaluation may be moot if no asserting participants can be found.
- // Or all its ancestral rules are already true without needing this rule to be evaluated....
- if(rule.permissive && rule.restrictive){
- if(rule.permissive & SUCCESS ) { SUCCESS |= rule.bit; mask |= rule.mask; return true; }
- if(rule.restrictive & FAILURE) {FAILURE |= rule.bit; }
- if(rule.restrictive && (rule.restrictive & SUCCESS) === rule.restrictive) { SUCCESS |= rule.bit; mask |= rule.mask; return true; }
- if(rule.permissive && (rule.permissive & FAILURE) === rule.permissive) {FAILURE |= rule.bit; }
- }
-
- // if((rule.descendents & SUCCESS) === rule.descendents) {
- // // Implies all intermediate groups are true. We only need to examine direct leaf connections.
- // SUCCESS |= rule.bit;
- // mask |= rule.mask;
- // }
- }
- }
-
- return found;
- });
-
- if(utils.js.isFunction(arguments[arguments.length-1])) { return cb(null, { SUCCESS, FAILURE, mask, results} ) }
- else return { mask, list : found};
- });
- }
-
- function getParticipatingRoots(participating, rList, cb){
- var qualifiedRoots = [];
- rList.forEach((r)=>{
- if(r.isRoot && evaluate(r, participating)){ qualifiedRoots.push(r); }
- });
- cb(null, qualifiedRoots);
- }
-
- function toColumnValue(p, v) { return v; }
- function columnEscaped(inst, p) { return p; }
-
- function getsql_cond_group(){
- if(!this.list) { console.warn(`${this.operator} condition without list is moot`); return ''}
- if(this.list.length < 2) {
- this.list.push( this.list[0] ); // PB : TOOD -- We are adding instead of eliminating Redundant groups ...
- }
- var slqexprs = [];
- this.list.forEach(r => slqexprs.push(r.sql) );
- return '( ' + slqexprs.join( ` ${this.operator} `) + ' )'
- }
-
- function getfilter_cond_group(){
- if(!this.list) { console.warn(`${this.operator} condition without list is moot`); return ''}
- if(this.list.length < 2) {
- this.list.push( this.list[0] ); // PB : TOOD -- We are adding instead of eliminating Redundant groups ...
- }
- var filterexprs = [];
- this.list.forEach(r => filterexprs.push(r.filter) );
- return filterexprs;
- }
-
-
-
-
- // PB : TODO -- This might be easier done in a stored procedure.
- // It will also help if participating is not the whole list but the filtered list relevant for this rule.
- // Relocation so inline functions don't need to be redefined again and again.
- // Implement __Rule.isRoot
- var evaluate = function(rule, participating){
-
- if(rule.bit & participating.SUCCESS ) return true;
- if(rule.bit & participating.FAILURE) return false
- if(rule.permissive & participating.SUCCESS ) { participating.SUCCESS |= rule.bit; return true }
- if(rule.restrictive & participating.FAILURE) {participating.FAILURE |= rule.bit; return false;}
- if(rule.restrictive && (rule.restrictive & participating.SUCCESS) === rule.restrictive) { participating.SUCCESS |= rule.bit; return true }
- if(rule.permissive && (rule.permissive & participating.FAILURE) === rule.permissive) {participating.FAILURE |= rule.bit; return false;}
-
- // PB : TODO -- Truth value of grouped could be driven from the roots so we can limit to those rules that are relevant and avoid evaluation of each one.
-
- if(rule.isleaf) {
- if(participating.results.find( pp => pp === rule )) { participating.SUCCESS |= rule.bit; return true }
- else { participating.FAILURE |= rule.bit; return false; }
- }
- // else {
- // // If descendents are true we can extract only the ones that are direct connections and
- // // Evaluate...
- // var alldescendentsAreTrue = false;
- // if((rule.descendents & participating.SUCCESS) === rule.descendents) {
- // // Implies all intermediate groups are true. We only need to examine direct leaf connections.
- // alldescendentsAreTrue = true;
- // }
- // }
-
- // getUnevaluated
- var permissive = rule.permissive & (BigInt(-1)-participating.SUCCESS) & (BigInt(-1)-participating.FAILURE);
- for(var rc in rule.list){
- var r = rule.list[rc];
- if(r.bit & permissive) {
- if(evaluate(r, participating)) { participating.SUCCESS |= r.bit; participating.SUCCESS |= rule.bit; return true }
- else participating.FAILURE |= r.bit;
- }
- }
- if(rule.permissive){ participating.FAILURE |= rule.bit; return false; }
-
- // getUnevaluated.
- var restrictive = rule.restrictive & (BigInt(-1)-participating.SUCCESS) & (BigInt(-1)-participating.FAILURE);
- for(var rc in rule.list){
- var r = rule.list[rc];
- if(r.bit & restrictive) {
- if(!evaluate(r, participating)) { participating.FAILURE |= r.bit; participating.FAILURE |= rule.bit; return false}
- participating.SUCCESS |= r.bit;
- }
- }
- if(rule.restrictive){ participating.SUCCESS |= rule.bit; return true; }
-
- throw 'Error : A group rule should either be permissive or restrictive...'
-
- };
-
- var match = function (inputs, rList, cb) {
- var results = [];
- if (typeof(clause)==undefined){var clause=null;}
- Rule.build(inputs, clause, results).then((inputRule)=>{
- inputRule.results = results;
- // inputs are usually individual assertions. An and / or condition between individual assertions are usually not useful.
- // Unless the assertion is of the form
- // Eg : this indiviudal's age is between x and y which is kind of rare.
- // A negation is also not how an assertion is typically made. However not from location C or D is a possible assertion.
- // An or assertion is still more rare and is usually an abstraction to not be specific.
- // Eg : The user is from location A or B and uses either a Mac or Ubuntu OS.
- // Although the user has specific characteristics the specificity is not disclosed in the inputs.
- // And is adequate to distinguish the inputs from amongst a superset.
- // In the above example the user cannot be from both locations A and B at the same time but could be using both Mac and Ubuntu probably even at the same time.
- // 1) The simplest and fastest use case is exact matches of input assertions with and exact match of saved rules.
- // 2) exact input values with condition groups in the rules is also supportable.
- // 3) complex input rules as abstract or range assertions matching
- // complex rules that have range or absctract conditions -- How to Implement ??
- // IMPLEMENTATION AS SQL
- // FIND PARTICIPATING rules that evaluate true.
- /* WHERE rule.key = input.key ( rule.operator = '>' AND rule.value <= input.value AND input.operator = '>'
- OR rule.operator = '>' AND rule.value < input.value AND input.operator = '>='
- OR rule.operator = '>=' AND rule.value <= input.value AND (input.operator = '>=' OR input.operator = '=')
- ) AND
- ( rule.operator = '<' AND rule.value <= input.value AND input.operator = '<'
- OR rule.operator = '<' AND rule.value < input.value AND input.operator = '<='
- OR rule.operator = '<=' AND rule.value <= input.value AND (input.operator = '<=' OR input.operator = '=')
- )
- */
- // QUALIFY ALL ( GROUPED and LEAF ) RULES that evaluate true using the assertions from the participating rules.
- /*
- LEFT JOIN rule
- WHERE participating.bit = (participating.bit & rule.mask)
- -- and rule.operator = 'or'
- -- or rule.mask = (allparticipating.mask & rule.mask ) and rule.operator = 'and'
- */
- /* USE THE QUALIFED RULES TO EVALUEATE RESULTS for GROUP LEVELS and ROOT RULES.
- Any grouped rule is associated with 3 kinds evaluation sets composed of rules that are either leaf
- level rules directly or through other promoted grouped rules or groups.
- Evaluation Sets.
- Permissive rules, Restrictive rules, Indeterminant rules
- 1) Permissive bits turn the whole group to true if any one is true.
- Irrespective of all the other participating leaf rules.
- It is therefore not required to evaluate any other types of leaf rules.
- 2) Restrictive rules turn the whole group to false if any one is false.
- If there are no permissive rules it then becomes relevant to evaluate the restrictive rules.
- Other Indeterminant rule evaluation is therefore not relevant.
- 3) Indeterminant rules need to be evaluated at run time.
- -- Are typically unevaluated nested groups
- -- Or can be Individual Evaluated results
- which don't yet determine the overall result and mean anything
- until a complex hierarchy of conditions
- are evaluated and collectively satisifed.
-
- -- Since we do not (yet) support rule negations
- -- it necessarily implies that if all of the Indeterminant set items are true then the whole group is true.
- -- which then implies we can bypass the Indeterminant group and subgroup structure evaluation for efficiency.
-
- -- Pre-Evaluated promotion to parent group evaluation sets to parent groups evaluation sets.
- Composition of a subgroup can be promoted directly into the parent groups evaluation sets when certain conditions are met.
-
- When There are no Permissive rules
- AND ( There are no restrictive rules OR all the restrictive rules are true )
- Then evaluation of the descendents rule set is required until we reach all leaf level nodes.
- Subgroups are recursively evaluated using these same 3 steps.
-
- Following caching efficiencies can be precomputed and stored with the parents rule sets as rule promotions.
- If the sub group rule participates in parents permissive set.
- All of its permissive rules should be added to the parent groups permissive set.
- -- The sub group has no restrictive and descendents sets sub group bit need not be in the parents permissive set.
- If subgroup has restricitve sets and no descendents sets
- -- and is a subset of the parent groups restrictive set
- -- then subgroup bit can be removed from parents permissive and restrictive groups.
- -- This is good for preventing re-evaluation of the sub group for efficiency.
- -- else subgroup bit should be present in the permissive
- Sub group has descendents sets
- -- the sub group bit must necessarily be added to the parents permissive set.
-
- If the sub group rule participates in the parents restrictive set
- - Sub Group is Pure Permissive = Has no restrictive set or descendents set
- Runtime Evaluate.
-
- - Sub Group is Pure Restrictive = Has no permissive or descendents set
- -- Restrictive set of sub group should be promoted into the restrictive set of the parent
- -- sub group bit should be removed from all parent sets for effciency by bypassing subgroup evaluation.
-
- - All other cases Runtime Evaluate.
-
- Sub Group participates in descendents set.
- -- Run time evaluation.
- */
-
- getParticipating(inputRule, rList, (err, participating)=>{
- getParticipatingRoots(participating, rList, (err, participatingRoots)=>{
- cb(null, participatingRoots);
- });
- });
- });
- };
-
- // PB : TODO -- Creations are easy. Edits and updates for addition of a single rule are expensive due to cascading updates to all relations.
- // Connections can be made in multiple dimensions. For Rules we currlently only implement the child and parent dimensions.
- // PB : TODO -ve dimensions ?? In this implementation there are no negative dimensions...
- // So both -ve and +ve dimensions are independent. But can be marked as opposites.
- // Note : Therefore Child and Parent are different independent dimensions.
- // They may not be exactly oposing in this case ( Rules are networks ) and some circular loops may exist.
- var connectRules = function(as, ...rest){ return branch[as](...rest) };
-
- var branch = {};
- branch[__Rule.AND] = function(rChild, rParent, refresh){
- rChild.ancestors |= rParent.ancestors | rParent.bit; // This should set the whole ancestral network.
-
- if(rParent.permissive || rParent.operator === OR) throw 'Error Invalid rule addition to parent'
-
- if(rParent.restrictive & rChild.bit) return; // Was already connected within this and.
- rParent.list.push(rChild);
-
- // if(!rParent.permissive && !rParent.restrictive) {
- // if(rParent.operator !== AND && rParent.operator !== OR) {
- // if(!rParent.operator) rParent.operator = AND; // Implicit AND if unspeicified
- // else throw 'Incomplete parent. Invalid operator or no operator specified.'
- // }
- // rParent.operator === AND ? rParent.restrictive |= rChild.bit : rParent.permissive |= rChild.bit ;
- // }
-
- // Promotions : All child rules are only a bunch of Ands or ors
- // they can be flattened directly into the containing rule.
- // if(!rParent.permissive) { rParent.restrictive |= rChild.restrictive; rParent.restrictive |= rChild.bit; }
- // if(!rParent.restrictive) { rParent.permissive |= rChild.permissive; rParent.permissive |= rChild.bit; }
- rParent.restrictive |= rChild.restrictive | rChild.bit;
-
- // Descendents should be all non immediate descendents.
- // Immmediate descendents can always be computed as (r.permissive | r.restrictive) & !r.descendents
- // child may be either permissive or restrictive. Since child.restrictive is already added in.
- rParent.descendents |= rChild.descendents | rChild.permissive | rChild.restrictive ;
-
- // If we add another ancestral network to one of the ancestors we need to cascaded it down to the child network.
- // and vice versa.
- if(refresh){
- // PB : TODO -- Cascading refreshes should avoid circular loops..
- rChild.refreshDescendents(rChild.ancestors);
- rParent.refreshAncestors(rParent.descendents);
- }
- };
-
- branch[__Rule.OR] = function(rChild, rParent, refresh){
- rChild.ancestors |= rParent.ancestors | rParent.bit;
-
- if(rParent.restrictive || rParent.operator !== OR) throw 'Error Invalid rule addition to parent'
- if(rParent.permissive & rChild.bit) return
- rParent.list.push(rChild);
-
- rParent.permissive |= rChild.permissive | rChild.bit;
-
- rParent.descendents |= rChild.descendents | rChild.permissive | rChild.restrictive ;
- if(refresh){
- rChild.refreshDescendents(rChild.ancestors); // This should set the whole ancestral network.
- rParent.refreshAncestors(rParent.descendents);
- }
- };
-
- var rProto = { migrationstate : 8, operator : EQ
- , evaluate // PB : TODO -- Enforce preconditions for evaluate on instance. Eg. Assignbit is a precondition for evaluate or match.
- , connect : function(parent){
- connectRules(operators[parent.operator].bit, this, parent);
- }
- // PB : TODO -- Cloning descriptors using assgin is expense. Review and just atttach to each new instance...
- , get sql(){
- var getSql = this.operator === AND ? getsql_cond_group : this.operator === OR ? getsql_cond_group
- : ()=>this.key + ' ' + operators[this.operator].operator +
- (Object.prototype.toString.call(this.value) === '[object Date]' ? ` '${this.value.toISOString()}' ` :` '${this.value}' `);
- return getSql.call(this)
- }
- , get filter(){
- var getFilter = this.operator === AND ? getfilter_cond_group : this.operator === OR ? getfilter_cond_group
- : ()=>{
- var f = {};
- f[this.key] = {};
- f[this.key][this.operator] = this.value; return f;};
- return getFilter.call(this)
- }
- // PB : TODO -- this.siblings will be a nice addition.
- , get mask(){ return this.permissive | this.restrictive | this.descendents | this.ancestors | this.bit }
- , get isIndependent() { return (!this.mask || (this.bit === this.mask)) }
- , get isRoot() { return !this.ancestors }
- , get isChild() { return this.ancestors }
- , get isParent() { return (this.permissive | this.restrictive | this.descendents) }
- , get isleaf() { return !this.bit || !(this.permissive | this.restrictive | this.descendents) }
- , get iscomposite() { return this.list.length > 1 } // PB : TODO -- Non composite parents may be possible to collapse
- };
-
- return _Rule.extend()
- })();
- // Rule.build(clause, null, fullResults).then((rootRule)=>{
- // // console.dir(rootRule)
- // return Promise.all(fullResults).then((fullResults)=>{
- // console.dir(fullResults)
- // console.log(fullResults.length)
- // console.dir(rootRule.sql)
-
- // console.dir(Rule.match({ and : [ {"field1" : 'foo'}, {"field2" : 'bar'}] }, fullResults, (err, rootRules)=>{
- // console.dir(rootRules)
- // }))
- // })
- // });
-
- // clause = {
- // or: [
- // { and : [ {"field1" : 'foo'}, {"field2" : 'bar'}] },
- // { and : [ {"field1" : 'morefoo'}, {or : [{"field2" : 'morefoo2'}, {"field3" : 'morefoo3'}] } ] },
- // {"datacontext" : {inq: [1, 2, 4, 16]}},
- // {"date" : {gt: new Date('2020-10-01T18:30:00.000Z')}},
- // { or : [ { x : 'y'}, {"dob" : {between: [new Date('2010-01-01T18:30:00.000Z'), new Date('2010-06-01T18:30:00.000Z')] }} ] }
- // ]
- // , a : { 'eq' : 'b'}
- // , x : 'y'
- // }
- // Rule.build(clause, null, fullResults).then((rootRule)=>{
- // // console.dir(rootRule)
- // return Promise.all(fullResults).then((fullResults)=>{
- // // console.dir(fullResults)
- // console.log(fullResults.length)
- // console.log(fullResults.length)
- // console.dir(rootRule.sql)
-
- // Rule.match({ and : [ {"field1" : 'foo'}, {"field2" : 'bar'}] }, fullResults, (err, rootRules)=>{
- // console.dir(rootRules)
- // })
- // })
- // });
- })();
- }, "/$$rollup_base$$/node_modules/bbhverse");
-
- utils_1.core = core;
- var bbhverse = utils_1;
-
- const { spawn: spawn$1, spawnSync } = childProcess__default["default"];
-
-
- function nodeShellExec$3() {
-
- var args = Array.from(arguments);
- if(args.length > 1){
- var opts = args[2] = args[2] || {};
- opts.title ? null : opts.title = `${args[0]} ${args[1] }`;
-
- }
- else {
- var opts = {
- title : `${args[0]}`
- // , inherit: true, shell: true
- };
- }
- opts.stdin = 'pipe';
-
- // // const spawn = require('child_process').spawn;
- // const s = spawn(
- // 'C:\\Program Files\\Git\\bin\\sh.exe'
- // , ['notepad', 'index'], { cwd: __dirname });
-
-
-
- // var interval = null;
- // var t = setTimeout(function(){
- // interval = setInterval(function(){
-
- // console.log('Awaiting close : ' + child.spawnargs)
-
- // }, 1500)
- // // console.log('Awaiting close : ' + child.spawnargs)
-
- // }, 0)
-
- // child.on('close', (code) => {
- // console.error('Prematurely closed even before promise...')
- // })
- // D:\chess\instances\elixir_01\elxr/.elxr/run-1630002739610/download.bat https://github.com/git-for-windows/git/releases/download/v2.33.0.windows.2/Git-2.33.0.2-64-bit.exe D:\\chess\\instances\\elixir_01\\elxr/Downloads/Git-2.33.0.2-64-bit.exe
- // D:\\chess\\instances\\elixir_01\\elxr/.elxr/run-1630002923584/download.bat https://github.com/git-for-windows/git/releases/download/v2.33.0.windows.2/Git-2.33.0.2-64-bit.exe D:\\chess\\instances\\elixir_01\\elxr/Downloads/Git-2.33.0.2-64-bit.exe
-
- // console.dir(args[2])
- console.dir(`${args[0]} ${args[1].join(' ') }`);
-
- const child = spawn$1(...args);
- var p = new Promise(function(resolve, reject){
- // console.log(...args)
- if(!opts.detached) {
- var messages = []; // PB : TODO -- Explore stream for Task level aggregation to prevent interleaved messages from multiple tasks...
- var success = true;
-
- if(opts.stdio !== 'ignore') {
- child.stdout.setEncoding('utf8');
- child.stderr.setEncoding('utf8');
- child.stdout.on('data', (chunk) => {
- chunk.trim() === '' ? null : messages.push(chunk); /* console.log('d: ' + chunk) */
- process.stdout.write( chunk );
- });
- child.on('error', (chunk) => { success = false; messages.push(chunk); /* console.error('e: ' + chunk) */
- console.log('Error exit not handled.');
- } );
- child.stderr.on('data', (chunk) => {
- if(messages.join('').indexOf('fatal: not a git repository') > -1) opts.haserrors = true;
- messages.push(chunk);
- // process.stdout.write( chunk )
- // console.error('stderr e: ' + chunk)
- });
- }
- child.on('close', (code) => {
- // console.log('Proper close was fired')
- var logEntry = { code, success };
- if(+code !== 0 || opts.haserrors) {
- success = false; logEntry = { messages, result: `${opts.title} exited with code ${code}`, success, code };
- } if(opts.stdio !== 'ignore') {
- logEntry = { result: `${opts.title} exited with code ${code}`, messages, code };
- logEntry.success = success;
- if(opts.evaluateResult) logEntry = opts.evaluateResult(success, logEntry);
- if(opts.runas){
- // success ? logEntry.success = true : null;
- fs__default["default"].writeFileSync('run.log', ', ' + JSON.stringify(logEntry), {'flag':'a+'} );
- }
- else {
- // console.log( messages.join('') )
- process.stdout.write( messages.join('') );
- }
- }
- else if(opts.evaluateResult) {
- try { logEntry = opts.evaluateResult(false, logEntry); }
- catch(e){ reject(e); }
- }
- // clearInterval(interval)
- if(code !== 0 || opts.haserrors) {
- args[2].benign || args[2].ignorefailures ? (logEntry.benign = true, logEntry.ignorefailures = true) : null;
- return reject(logEntry)
- }
- resolve(logEntry);
- });
- }
- else {
- child.unref();
- // clearInterval(interval)
- resolve(true);
- }
- });
- p.process = child;
- return p;
- }
-
- var prompt = function(choices, label, defaultchoice, selectedchoice){
- // prompt accepts either an array or an object as choices.
- var choices = choices || [];
- defaultchoice = defaultchoice || choices[0] || selectedchoice || choices[Object.keys(choices)[0]];
- var ci = 0;
- return this.prompter.ask(
- `${label} \n` + Object.keys(choices).map(
- choice => {
- ++ci; var choice_label = isNaN(+choice) ? `${ci}) (${choice})` : ci + ')';
- return ` ${choice_label} ${choices[choice]} `
- }).join('\n')
- + `\n d) default ( <= ${ defaultchoice || choices[0]} ) : `
- + `\n selected ( <= ${ selectedchoice || defaultchoice || choices[0]} ) : `
- ).then(choice => {
- // propName = promptable.interpret(propValue)
- if(!choice && selectedchoice) return selectedchoice;
- if(!choice) return defaultchoice || choices[0];
- if(choice && isNaN(+choice)) {
- if(choice === 'd') return defaultchoice || choices[0];
- try {
- return JSON.parse(choice);
- }
- catch(e) {
- // console.error(e)
- return choice // Treat it as a string if it is not parsable
- }
- }
- return choices[(+choice) - 1];
- })
- };
-
-
- var cli = {
- nodeShellExec: nodeShellExec$3
- , get prompter() {
- var prompt_interface = {
- ask : function(q){
- // Needs to be serialized. Parallel asks are not possible.
- const clii = readline__default["default"].createInterface({ input: process.stdin, output: process.stdout });
- return new Promise((resolve, reject)=>{
- clii.question(q, (answer)=>{
- try {
- clii.close();
- console.log("readline.createInterface closed");
- resolve(answer);
- }
- catch(e) {
- reject(e);
- }
- });
- })
- }
- };
- return prompt_interface
- }
- , prompt
- , createTask(task, str){
-
- var tasks = {
- getTaskCheckExists : (str)=>{
- return (command, options) => {
- options = options || {};
- return () => {
- var p = nodeShellExec$3.apply(null, [str, [command]]);
- if (options.ignorefailures) {
- return p.then(() => { return true }).catch(e => { // Ignore. Not a major error.
- return false;
- })
- }
- else return p.then(() => { return true });
- }
- }
- }
- };
- return tasks[task](str)
- }
- };
-
- var cliverse = cli;
-
- const { any: any$2 } = bbhverse;
-
-
-
- var nodeShellExec$2 = cliverse.nodeShellExec;
-
- var __isElevated$1 = null;
- var shell_verse$2 = {
- // getCommonTask is agnostic of whether we are running in an elevated shell or not. It runs in either case.
- getCommonTask( taskToRun ){ return ()=>{ return shell_verse$2.runTask(taskToRun) }}
- , runTask : ( taskToRun ) => {
- if (__isElevated$1) return shell_verse$2.elevatedRunner( taskToRun )
- else return shell_verse$2.runNonElevated( taskToRun )
- }
-
- , elevatedRunner( taskToRun, inBatch ){
- // PB : TODO -- Should be called only when we are in an elevated shell that was already requested from an unelevated shell with a batch of tasks.
- try {
- var __runasresult = null;
- return taskToRun().then((r)=>{
- // PB : TODO -- Every elevation should have its own messaging file. Async writes from multiple processes are a problem here...
- fs__default["default"].writeFileSync('run.log', ', ' + JSON.stringify( { info : taskToRun.info, success: true }), { 'flag': 'a+' });
- if(!inBatch) fs__default["default"].writeFileSync('run.done', 'success'); // PB : TODO -- This should be done conditionally if we are running inproc.
- return __runasresult = r;
- })
- .catch((e) => {
- fs__default["default"].writeFileSync('run.log', ', ' + JSON.stringify(e), { 'flag': 'a+' });
- if(!inBatch)fs__default["default"].writeFileSync('run.done', 'failure');
- console.error(e);
- })
- .finally(() => {
- // if(__runasresult && !__runasresult.skipped) fs.unlinkSync('run.done')
- })
- }
- catch (e) {
- console.error('Error Invalid command : ' + e);
- if(!inBatch) fs__default["default"].writeFileSync('run.done', 'error');
- }
- finally {
- }
- }
- , getElevatedTask : function( taskToRun ){ return ()=>{ return shell_verse$2.runElevated(taskToRun) }}
- , getElevatedTaskInBatch : function( taskToRun ){ return ()=>{ return shell_verse$2.runElevatedInBatch(taskToRun) }}
- , runElevatedInBatch : ( taskToRun ) => {
- if (__isElevated$1) return shell_verse$2.elevatedRunner(taskToRun, true)
- else return shell_verse$2.requestElevation(shell_verse$2.elevatedRunner, taskToRun)
- }
- , runElevated : ( taskToRun ) => {
- // Let shell_verse decide whether to Elevate Out of Proc or In Proc
-
- // taskToRun by default is the launched command and args. Specially in windows out of proc.
- // taskToRun = taskToRun || (()=>{ return op[processedArgs.label || processedArgs._[0] || 'undefined'](processedArgs) })
-
- if(taskToRun.processedArgs.skipelevated) return Promise.resolve({ skipped : true });
-
-
- if (__isElevated$1) {
- return shell_verse$2.elevatedRunner(taskToRun)
- }
- else {
- console.log('Requesting Elevated Privileges');
- // requesteElevation is acutally request elevation and run. Both In Proc and Out of Proc.
- // Linux doesnt require elevation for most commands...
- return shell_verse$2.requestElevation(shell_verse$2.elevatedRunner, taskToRun)
- }
- }
- , runElevatedBatch( batchToRun ){
- // In windows we don't need to run each task. We hand over to another shell which in elevated state rebuilds the whole batch and runs.
- // Irrespective of the batch we just call runElevated once.
- if (__isElevated$1) {
- return any$2(batchToRun).then((r)=>{
- // PB : TODO -- Every elevation should have its own messaging file. Async writes from multiple processes are a problem here...
- // fs.writeFileSync('run.log', ', ' + JSON.stringify( { info : taskToRun.info, success: true }), { 'flag': 'a+' })
- fs__default["default"].writeFileSync('run.done', 'success'); // PB : TODO -- This should be done conditionally if we are running inproc.
- return __runasresult = r;
- })
- .catch((e) => {
- // fs.writeFileSync('run.log', ', ' + JSON.stringify(e), { 'flag': 'a+' })
- fs__default["default"].writeFileSync('run.done', 'failure');
- console.error(e);
- })
- // .finally(() => {
- // if(__runasresult && !__runasresult.skipped) fs.unlinkSync('run.done')
- // });
- }
- else {
- return this.runElevated(batchToRun[0])
- }
- }
-
- , getNonElevatedTask : function( taskToRun ){ return ()=>{ return shell_verse$2.runNonElevated(taskToRun) } }
- , runNonElevated : ( taskToRun ) => {
- // Let shell_verse decide whether to Elevate Out of Proc or In Proc
- if(__isElevated$1) {
- return Promise.resolve( 'Skipping regular task in elevated shell.' ) // Regular tasks unless marked as common tasks should not run in elevated shell...
- }
- else {
- // taskToRun by default is the launched command and args.
- // taskToRun = taskToRun || (()=>{ return op[processedArgs.label || processedArgs._[0] || 'undefined'](processedArgs) })
-
- return taskToRun().then(r=>{
- taskToRun.statuslog.statuslog(null, taskToRun.info /*repo*/ );
- return r;
- }).catch((e) => {
- e.info = taskToRun.info;
- taskToRun.statuslog.statuslog(e);
- if(taskToRun.errHandler) throw taskToRun.errHandler(e)
- // console.error(e)
- throw e;
- }).finally(()=>{})
- }
- }
-
- , isElevated : ()=>{
- return acquireElevationState().then( ()=>{
- shell_verse$2.isElevated = () => {
- return Promise.resolve(__isElevated$1)
- };
- return shell_verse$2.isElevated()
- })
- }
-
- // , isElevationOutOfProc : ()=>{ return true }
-
- , acquireElevationState : () => {
- return nodeShellExec$2("fsutil", ["dirty", "query", "C:"], {
- inherit: true
- // , shell: true
- , stdio: 'ignore'
- , env: process.env
- , title: `check privileged execution mode using "fsutil dirty query C:"`
- }).then((exitcode) => {
- console.log('Elevated');
- __isElevated$1 = true;
- }).catch(() => {
- __isElevated$1 = false;
- console.log('Not Elevated');
- }).finally(()=>{
- shell_verse$2.acquireElevationState = ()=> Promise.resolve(__isElevated$1);
- shell_verse$2.isElevated = () => { return Promise.resolve(__isElevated$1)};
- return __isElevated$1;
- })
- }
-
- , getTaskCheckExists : cliverse.createTask('getTaskCheckExists', 'where')
-
- , getbash : ()=>{ return "C:\\Program Files\\Git\\bin\\sh.exe" }
-
- , createJuntionOrLink : (dirOrFile, target, opts) =>{
- return nodeShellExec$2('mklink', ['/J', dirOrFile, target], opts).catch((e) => { console.error(e); })
- }
- , removeJuncionOrLink : ( junctionOrLink )=>{
- return nodeShellExec$2('rmdir', [junctionOrLink], { inherit: true, shell: true, env: process.env })
- }
-
- , requestElevation(elevatedRunner, taskToRun) {
- // PB : TODO -- Multiple parallel request elevations should be queued into a promise.
-
- var processedArgs = taskToRun.processedArgs, selectedinstance = taskToRun.selectedinstance , statuslog = taskToRun.statuslog;
- // Wait for the runas to complete before we read it.
- try {
- fs__default["default"].unlinkSync('run.done');
- fs__default["default"].unlinkSync('run.log');
- }
- catch (e) { } //Ignore
-
- // Find node path to send to hta.
- return nodeShellExec$2('where', ['node']).then(r => {
- var namedArgs = [];
- console.log('result : ' + JSON.stringify(r));
- Object.keys(processedArgs).forEach((v) => { v != '_' ? namedArgs.push('--' + v + '=' + processedArgs[v]) : null; });
- // PB : TODO -- Convert all the cli args back to string.
- var args = [`${selectedinstance.root}/.elxr/run-${taskToRun.runtimestamp}/windowselevate.hta`].concat(processedArgs._);
- namedArgs.length > 0 ? args = args.concat(namedArgs.join(' ')) : null;
- args.push('--runas=self');
- // args.push('--nodepath=' + r.messages[r.messages.length - 1])
- // if (!processedArgs.node_env) args.push('--node_env=' + ENV.NODE_ENV)
- // if (processedArgs.debug) args.push('--debug=true') // Enable to debug elevated..
- // console.dir(processedArgs._)
- // console.dir(namedArgs.join(' '))
- console.dir(args);
- // throw 'test'
-
- return nodeShellExec$2('MSHTA', [`"${args.join('" "')}"`]
- , {
- inherit: true
- , shell: true
- , env: taskToRun.ENV
- , runas: 'self'
- , title: `runas`
- }
- ).then(() => {
- // runas returned.
- try {
- // PB : TODO -- Log is comma prefixed. Needs to be proper JSON.
- var runaslog = JSON.parse('[ { "success" : true, "result" : "started"}' + fs__default["default"].readFileSync('run.log', { flags: 'a+' }) + ']');
- runaslog.forEach((logEntry) => {
- statuslog.statuslog(logEntry.success ? null : logEntry, logEntry);
- logEntry.success ? (console.log(['success :' + logEntry.result]), console.log((logEntry.messages || []).join(' '))) : (console.error(['error :' + logEntry.result]), console.error((logEntry.messages || []).join(' ')));
- });
- }
- catch (e) {
- // We must have a runas log
- statuslog.statuslog(e);
- console.error('Run log error probably was not created by runas : ' + e);
- }
- })
- .catch(err => console.error('Elevation failed : ' + err));
- })
- }
- };
-
- var win_verse$1 = shell_verse$2;
-
- const { any: any$1 } = bbhverse;
-
-
-
- var nodeShellExec$1 = cliverse.nodeShellExec;
-
- // PB : TODO -- linux prerequistes.
- // export GIT_SSL_NO_VERIFY=true
- // npm i -g nodemon
-
- // phantomjs": "^2.1.7
- // "sass": "^1.32.7",
- // "node-sass": "^5.0.0",
- // "ember-cli-sass": "^10.0.1",
- // "gulp-sass": "^4.1.0",
-
- // ember-searchable-select
- // ember-cli-sass
-
- // ember-cp-validatations
- // ember-cli-yuidoc
- // yuidoc-ember-theme
-
- // chess-server-lib/server
- // java
-
- // client
- // export NODE_OPTIONS=--openssl-legacy-provider
-
- // elixir-client npmi
- // elixir-client/chess-client-lib npmi
- // crossfilter2
-
- var __isElevated = null;
- var shell_verse$1 = {
- // getCommonTask is agnostic of whether we are running in an elevated shell or not. It runs in either case.
- getCommonTask( taskToRun ){ return ()=>{ return shell_verse$1.runTask(taskToRun) }}
- , runTask : ( taskToRun ) => {
- if (__isElevated) return shell_verse$1.runElevated( taskToRun )
- else return shell_verse$1.runNonElevated( taskToRun )
- }
-
- , elevatedRunner( taskToRun ){
- // PB : TODO -- Should be called only when we are in an elevated shell that was already requested from an unelevated shell with a batch of tasks.
- try {
- // PB : We do not need IPC in linux. Until a real sudo elevation is required eveything works in non elevated mode...
- var __runasresult = null;
- return taskToRun().then((r)=>{
- // PB : TODO -- Every elevation should have its own messaging file. Async writes from multiple processes are a problem here...
- // fs.writeFileSync('run.log', ', ' + JSON.stringify( { info : taskToRun.info, success: true }), { 'flag': 'a+' })
- // fs.writeFileSync('run.done', 'success') // PB : TODO -- This should be done conditionally if we are running inproc.
- return __runasresult = r;
- })
- .catch((e) => {
- // fs.writeFileSync('run.log', ', ' + JSON.stringify(e), { 'flag': 'a+' })
- // fs.writeFileSync('run.done', 'failure')
- console.error(e);
- })
- .finally(() => {
- // if(__runasresult && !__runasresult.skipped) fs.unlinkSync('run.done')
- })
- }
- catch (e) {
- console.error('Error Invalid command : ' + e);
- // fs.writeFileSync('run.done', 'error')
- }
- finally {
- }
- }
- , getElevatedTask : function( taskToRun ){ return ()=>{ return shell_verse$1.runElevated(taskToRun) }}
- , getElevatedTaskInBatch : function( taskToRun ){ return ()=>{ return shell_verse$1.runElevatedInBatch(taskToRun) }}
- , runElevatedInBatch : ( taskToRun ) => {
- if (__isElevated) return shell_verse$1.elevatedRunner(taskToRun, true)
- else return shell_verse$1.requestElevation(shell_verse$1.elevatedRunner, taskToRun)
- }
- , runElevated : ( taskToRun ) => {
- // Let shell_verse decide whether to Elevate Out of Proc or In Proc
-
- // taskToRun by default is the launched command and args. Specially in windows out of proc.
- // taskToRun = taskToRun || (()=>{ return op[processedArgs.label || processedArgs._[0] || 'undefined'](processedArgs) })
-
- if(taskToRun.processedArgs.skipelevated) return Promise.resolve({ skipped : true });
-
- if(__isElevated) {
- return shell_verse$1.elevatedRunner(taskToRun)
- }
- else {
- console.log('Requesting Elevated Privileges');
- // requesteElevation is acutally request elevation and run. Both In Proc and Out of Proc.
- // Linux doesnt require elevation for most commands...
- return shell_verse$1.requestElevation(shell_verse$1.elevatedRunner, taskToRun)
- }
- }
- , runElevatedBatch( batchToRun ){
- // In windows we don't need to run each task. We hand over to another shell which in elevated state rebuilds the whole batch and runs.
- // Irrespective of the batch we just call runElevated once.
- return any$1(batchToRun.map(shell_verse$1.runElevated))
- }
-
- , getNonElevatedTask : function( taskToRun ){ return ()=>{ return shell_verse$1.runNonElevated(taskToRun) } }
- , runNonElevated : ( taskToRun ) => {
- // Let shell_verse decide whether to Elevate Out of Proc or In Proc
- if(__isElevated) {
- return Promise.resolve( 'Skipping regular task in elevated shell.' ) // Regular tasks unless marked as common tasks should not run in elevated shell...
- }
- else {
- // taskToRun by default is the launched command and args.
- // taskToRun = taskToRun || (()=>{ return op[processedArgs.label || processedArgs._[0] || 'undefined'](processedArgs) })
-
- return taskToRun().then(r=>{
- taskToRun.statuslog.statuslog(null, taskToRun.info /*repo*/ );
- return r;
- }).catch((e) => {
- e.info = taskToRun.info;
- if(taskToRun.errHandler) throw taskToRun.errHandler(e)
- taskToRun.statuslog.statuslog(e);
- // console.error(e)
- throw e;
- }).finally(()=>{})
- }
- }
-
- , isElevated : ()=>{
- return acquireElevationState().then( ()=>{
- shell_verse$1.isElevated = () => {
- return Promise.resolve(__isElevated)
- };
- return shell_verse$1.isElevated()
- })
- }
-
- // , isElevationOutOfProc : ()=>{ return true }
-
- , acquireElevationState : () => {
- return Promise.resolve(false).then(( elevationstate ) => {
- __isElevated ? console.log('Elevated') : console.log('Not Elevated');
- __isElevated = elevationstate;
- }).catch(() => {
- __isElevated = false;
- console.log('Not Elevated');
- }).finally(()=>{
- shell_verse$1.acquireElevationState = ()=> Promise.resolve(__isElevated);
- shell_verse$1.isElevated = () => { return Promise.resolve(__isElevated)};
- return __isElevated;
- })
- }
-
- , getTaskCheckExists : cliverse.createTask('getTaskCheckExists', 'which')
-
- , getbash : ()=>{ return "sh" }
-
- , createJuntionOrLink : (dirOrFile, target, opts)=>{
- return nodeShellExec$1('ln', ['-s', target, dirOrFile], opts).catch((e) => { console.error(e); })
- }
-
- , removeJuncionOrLink : ( junctionOrLink )=>{
- return nodeShellExec$1('rm', [junctionOrLink], { inherit: true, shell: true, env: process.env })
- }
-
- , requestElevation(elevatedRunner, taskToRun) {
- // PB : TODO -- Most linking cmds in linux may not need elevation like in windows.
- // However returning true here is pseudo and will break cases where real elevation is required in linux. We need to refactor to reimplement
- // this with sudo and change all calles to use ony where required.
- return elevatedRunner(taskToRun);
- }
- };
-
- var lin_verse$1 = shell_verse$1;
-
- var colorName = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "darkkhaki": [189, 183, 107],
- "darkmagenta": [139, 0, 139],
- "darkolivegreen": [85, 107, 47],
- "darkorange": [255, 140, 0],
- "darkorchid": [153, 50, 204],
- "darkred": [139, 0, 0],
- "darksalmon": [233, 150, 122],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50]
- };
-
- /* MIT license */
-
- /* eslint-disable no-mixed-operators */
-
-
- // NOTE: conversions should only return primitive values (i.e. arrays, or
- // values that give correct `typeof` results).
- // do not use box values types (i.e. Number(), String(), etc.)
-
- const reverseKeywords = {};
- for (const key of Object.keys(colorName)) {
- reverseKeywords[colorName[key]] = key;
- }
-
- const convert$1 = {
- rgb: {channels: 3, labels: 'rgb'},
- hsl: {channels: 3, labels: 'hsl'},
- hsv: {channels: 3, labels: 'hsv'},
- hwb: {channels: 3, labels: 'hwb'},
- cmyk: {channels: 4, labels: 'cmyk'},
- xyz: {channels: 3, labels: 'xyz'},
- lab: {channels: 3, labels: 'lab'},
- lch: {channels: 3, labels: 'lch'},
- hex: {channels: 1, labels: ['hex']},
- keyword: {channels: 1, labels: ['keyword']},
- ansi16: {channels: 1, labels: ['ansi16']},
- ansi256: {channels: 1, labels: ['ansi256']},
- hcg: {channels: 3, labels: ['h', 'c', 'g']},
- apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
- gray: {channels: 1, labels: ['gray']}
- };
-
- var conversions = convert$1;
-
- // Hide .channels and .labels properties
- for (const model of Object.keys(convert$1)) {
- if (!('channels' in convert$1[model])) {
- throw new Error('missing channels property: ' + model);
- }
-
- if (!('labels' in convert$1[model])) {
- throw new Error('missing channel labels property: ' + model);
- }
-
- if (convert$1[model].labels.length !== convert$1[model].channels) {
- throw new Error('channel and label counts mismatch: ' + model);
- }
-
- const {channels, labels} = convert$1[model];
- delete convert$1[model].channels;
- delete convert$1[model].labels;
- Object.defineProperty(convert$1[model], 'channels', {value: channels});
- Object.defineProperty(convert$1[model], 'labels', {value: labels});
- }
-
- convert$1.rgb.hsl = function (rgb) {
- const r = rgb[0] / 255;
- const g = rgb[1] / 255;
- const b = rgb[2] / 255;
- const min = Math.min(r, g, b);
- const max = Math.max(r, g, b);
- const delta = max - min;
- let h;
- let s;
-
- if (max === min) {
- h = 0;
- } else if (r === max) {
- h = (g - b) / delta;
- } else if (g === max) {
- h = 2 + (b - r) / delta;
- } else if (b === max) {
- h = 4 + (r - g) / delta;
- }
-
- h = Math.min(h * 60, 360);
-
- if (h < 0) {
- h += 360;
- }
-
- const l = (min + max) / 2;
-
- if (max === min) {
- s = 0;
- } else if (l <= 0.5) {
- s = delta / (max + min);
- } else {
- s = delta / (2 - max - min);
- }
-
- return [h, s * 100, l * 100];
- };
-
- convert$1.rgb.hsv = function (rgb) {
- let rdif;
- let gdif;
- let bdif;
- let h;
- let s;
-
- const r = rgb[0] / 255;
- const g = rgb[1] / 255;
- const b = rgb[2] / 255;
- const v = Math.max(r, g, b);
- const diff = v - Math.min(r, g, b);
- const diffc = function (c) {
- return (v - c) / 6 / diff + 1 / 2;
- };
-
- if (diff === 0) {
- h = 0;
- s = 0;
- } else {
- s = diff / v;
- rdif = diffc(r);
- gdif = diffc(g);
- bdif = diffc(b);
-
- if (r === v) {
- h = bdif - gdif;
- } else if (g === v) {
- h = (1 / 3) + rdif - bdif;
- } else if (b === v) {
- h = (2 / 3) + gdif - rdif;
- }
-
- if (h < 0) {
- h += 1;
- } else if (h > 1) {
- h -= 1;
- }
- }
-
- return [
- h * 360,
- s * 100,
- v * 100
- ];
- };
-
- convert$1.rgb.hwb = function (rgb) {
- const r = rgb[0];
- const g = rgb[1];
- let b = rgb[2];
- const h = convert$1.rgb.hsl(rgb)[0];
- const w = 1 / 255 * Math.min(r, Math.min(g, b));
-
- b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
-
- return [h, w * 100, b * 100];
- };
-
- convert$1.rgb.cmyk = function (rgb) {
- const r = rgb[0] / 255;
- const g = rgb[1] / 255;
- const b = rgb[2] / 255;
-
- const k = Math.min(1 - r, 1 - g, 1 - b);
- const c = (1 - r - k) / (1 - k) || 0;
- const m = (1 - g - k) / (1 - k) || 0;
- const y = (1 - b - k) / (1 - k) || 0;
-
- return [c * 100, m * 100, y * 100, k * 100];
- };
-
- function comparativeDistance(x, y) {
- /*
- See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
- */
- return (
- ((x[0] - y[0]) ** 2) +
- ((x[1] - y[1]) ** 2) +
- ((x[2] - y[2]) ** 2)
- );
- }
-
- convert$1.rgb.keyword = function (rgb) {
- const reversed = reverseKeywords[rgb];
- if (reversed) {
- return reversed;
- }
-
- let currentClosestDistance = Infinity;
- let currentClosestKeyword;
-
- for (const keyword of Object.keys(colorName)) {
- const value = colorName[keyword];
-
- // Compute comparative distance
- const distance = comparativeDistance(rgb, value);
-
- // Check if its less, if so set as closest
- if (distance < currentClosestDistance) {
- currentClosestDistance = distance;
- currentClosestKeyword = keyword;
- }
- }
-
- return currentClosestKeyword;
- };
-
- convert$1.keyword.rgb = function (keyword) {
- return colorName[keyword];
- };
-
- convert$1.rgb.xyz = function (rgb) {
- let r = rgb[0] / 255;
- let g = rgb[1] / 255;
- let b = rgb[2] / 255;
-
- // Assume sRGB
- r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);
- g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);
- b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);
-
- const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
- const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
- const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
-
- return [x * 100, y * 100, z * 100];
- };
-
- convert$1.rgb.lab = function (rgb) {
- const xyz = convert$1.rgb.xyz(rgb);
- let x = xyz[0];
- let y = xyz[1];
- let z = xyz[2];
-
- x /= 95.047;
- y /= 100;
- z /= 108.883;
-
- x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
-
- const l = (116 * y) - 16;
- const a = 500 * (x - y);
- const b = 200 * (y - z);
-
- return [l, a, b];
- };
-
- convert$1.hsl.rgb = function (hsl) {
- const h = hsl[0] / 360;
- const s = hsl[1] / 100;
- const l = hsl[2] / 100;
- let t2;
- let t3;
- let val;
-
- if (s === 0) {
- val = l * 255;
- return [val, val, val];
- }
-
- if (l < 0.5) {
- t2 = l * (1 + s);
- } else {
- t2 = l + s - l * s;
- }
-
- const t1 = 2 * l - t2;
-
- const rgb = [0, 0, 0];
- for (let i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * -(i - 1);
- if (t3 < 0) {
- t3++;
- }
-
- if (t3 > 1) {
- t3--;
- }
-
- if (6 * t3 < 1) {
- val = t1 + (t2 - t1) * 6 * t3;
- } else if (2 * t3 < 1) {
- val = t2;
- } else if (3 * t3 < 2) {
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- } else {
- val = t1;
- }
-
- rgb[i] = val * 255;
- }
-
- return rgb;
- };
-
- convert$1.hsl.hsv = function (hsl) {
- const h = hsl[0];
- let s = hsl[1] / 100;
- let l = hsl[2] / 100;
- let smin = s;
- const lmin = Math.max(l, 0.01);
-
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- smin *= lmin <= 1 ? lmin : 2 - lmin;
- const v = (l + s) / 2;
- const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
-
- return [h, sv * 100, v * 100];
- };
-
- convert$1.hsv.rgb = function (hsv) {
- const h = hsv[0] / 60;
- const s = hsv[1] / 100;
- let v = hsv[2] / 100;
- const hi = Math.floor(h) % 6;
-
- const f = h - Math.floor(h);
- const p = 255 * v * (1 - s);
- const q = 255 * v * (1 - (s * f));
- const t = 255 * v * (1 - (s * (1 - f)));
- v *= 255;
-
- switch (hi) {
- case 0:
- return [v, t, p];
- case 1:
- return [q, v, p];
- case 2:
- return [p, v, t];
- case 3:
- return [p, q, v];
- case 4:
- return [t, p, v];
- case 5:
- return [v, p, q];
- }
- };
-
- convert$1.hsv.hsl = function (hsv) {
- const h = hsv[0];
- const s = hsv[1] / 100;
- const v = hsv[2] / 100;
- const vmin = Math.max(v, 0.01);
- let sl;
- let l;
-
- l = (2 - s) * v;
- const lmin = (2 - s) * vmin;
- sl = s * vmin;
- sl /= (lmin <= 1) ? lmin : 2 - lmin;
- sl = sl || 0;
- l /= 2;
-
- return [h, sl * 100, l * 100];
- };
-
- // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
- convert$1.hwb.rgb = function (hwb) {
- const h = hwb[0] / 360;
- let wh = hwb[1] / 100;
- let bl = hwb[2] / 100;
- const ratio = wh + bl;
- let f;
-
- // Wh + bl cant be > 1
- if (ratio > 1) {
- wh /= ratio;
- bl /= ratio;
- }
-
- const i = Math.floor(6 * h);
- const v = 1 - bl;
- f = 6 * h - i;
-
- if ((i & 0x01) !== 0) {
- f = 1 - f;
- }
-
- const n = wh + f * (v - wh); // Linear interpolation
-
- let r;
- let g;
- let b;
- /* eslint-disable max-statements-per-line,no-multi-spaces */
- switch (i) {
- default:
- case 6:
- case 0: r = v; g = n; b = wh; break;
- case 1: r = n; g = v; b = wh; break;
- case 2: r = wh; g = v; b = n; break;
- case 3: r = wh; g = n; b = v; break;
- case 4: r = n; g = wh; b = v; break;
- case 5: r = v; g = wh; b = n; break;
- }
- /* eslint-enable max-statements-per-line,no-multi-spaces */
-
- return [r * 255, g * 255, b * 255];
- };
-
- convert$1.cmyk.rgb = function (cmyk) {
- const c = cmyk[0] / 100;
- const m = cmyk[1] / 100;
- const y = cmyk[2] / 100;
- const k = cmyk[3] / 100;
-
- const r = 1 - Math.min(1, c * (1 - k) + k);
- const g = 1 - Math.min(1, m * (1 - k) + k);
- const b = 1 - Math.min(1, y * (1 - k) + k);
-
- return [r * 255, g * 255, b * 255];
- };
-
- convert$1.xyz.rgb = function (xyz) {
- const x = xyz[0] / 100;
- const y = xyz[1] / 100;
- const z = xyz[2] / 100;
- let r;
- let g;
- let b;
-
- r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
- g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
- b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
-
- // Assume sRGB
- r = r > 0.0031308
- ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)
- : r * 12.92;
-
- g = g > 0.0031308
- ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)
- : g * 12.92;
-
- b = b > 0.0031308
- ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)
- : b * 12.92;
-
- r = Math.min(Math.max(0, r), 1);
- g = Math.min(Math.max(0, g), 1);
- b = Math.min(Math.max(0, b), 1);
-
- return [r * 255, g * 255, b * 255];
- };
-
- convert$1.xyz.lab = function (xyz) {
- let x = xyz[0];
- let y = xyz[1];
- let z = xyz[2];
-
- x /= 95.047;
- y /= 100;
- z /= 108.883;
-
- x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
-
- const l = (116 * y) - 16;
- const a = 500 * (x - y);
- const b = 200 * (y - z);
-
- return [l, a, b];
- };
-
- convert$1.lab.xyz = function (lab) {
- const l = lab[0];
- const a = lab[1];
- const b = lab[2];
- let x;
- let y;
- let z;
-
- y = (l + 16) / 116;
- x = a / 500 + y;
- z = y - b / 200;
-
- const y2 = y ** 3;
- const x2 = x ** 3;
- const z2 = z ** 3;
- y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
- x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
- z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
-
- x *= 95.047;
- y *= 100;
- z *= 108.883;
-
- return [x, y, z];
- };
-
- convert$1.lab.lch = function (lab) {
- const l = lab[0];
- const a = lab[1];
- const b = lab[2];
- let h;
-
- const hr = Math.atan2(b, a);
- h = hr * 360 / 2 / Math.PI;
-
- if (h < 0) {
- h += 360;
- }
-
- const c = Math.sqrt(a * a + b * b);
-
- return [l, c, h];
- };
-
- convert$1.lch.lab = function (lch) {
- const l = lch[0];
- const c = lch[1];
- const h = lch[2];
-
- const hr = h / 360 * 2 * Math.PI;
- const a = c * Math.cos(hr);
- const b = c * Math.sin(hr);
-
- return [l, a, b];
- };
-
- convert$1.rgb.ansi16 = function (args, saturation = null) {
- const [r, g, b] = args;
- let value = saturation === null ? convert$1.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization
-
- value = Math.round(value / 50);
-
- if (value === 0) {
- return 30;
- }
-
- let ansi = 30
- + ((Math.round(b / 255) << 2)
- | (Math.round(g / 255) << 1)
- | Math.round(r / 255));
-
- if (value === 2) {
- ansi += 60;
- }
-
- return ansi;
- };
-
- convert$1.hsv.ansi16 = function (args) {
- // Optimization here; we already know the value and don't need to get
- // it converted for us.
- return convert$1.rgb.ansi16(convert$1.hsv.rgb(args), args[2]);
- };
-
- convert$1.rgb.ansi256 = function (args) {
- const r = args[0];
- const g = args[1];
- const b = args[2];
-
- // We use the extended greyscale palette here, with the exception of
- // black and white. normal palette only has 4 greyscale shades.
- if (r === g && g === b) {
- if (r < 8) {
- return 16;
- }
-
- if (r > 248) {
- return 231;
- }
-
- return Math.round(((r - 8) / 247) * 24) + 232;
- }
-
- const ansi = 16
- + (36 * Math.round(r / 255 * 5))
- + (6 * Math.round(g / 255 * 5))
- + Math.round(b / 255 * 5);
-
- return ansi;
- };
-
- convert$1.ansi16.rgb = function (args) {
- let color = args % 10;
-
- // Handle greyscale
- if (color === 0 || color === 7) {
- if (args > 50) {
- color += 3.5;
- }
-
- color = color / 10.5 * 255;
-
- return [color, color, color];
- }
-
- const mult = (~~(args > 50) + 1) * 0.5;
- const r = ((color & 1) * mult) * 255;
- const g = (((color >> 1) & 1) * mult) * 255;
- const b = (((color >> 2) & 1) * mult) * 255;
-
- return [r, g, b];
- };
-
- convert$1.ansi256.rgb = function (args) {
- // Handle greyscale
- if (args >= 232) {
- const c = (args - 232) * 10 + 8;
- return [c, c, c];
- }
-
- args -= 16;
-
- let rem;
- const r = Math.floor(args / 36) / 5 * 255;
- const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
- const b = (rem % 6) / 5 * 255;
-
- return [r, g, b];
- };
-
- convert$1.rgb.hex = function (args) {
- const integer = ((Math.round(args[0]) & 0xFF) << 16)
- + ((Math.round(args[1]) & 0xFF) << 8)
- + (Math.round(args[2]) & 0xFF);
-
- const string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
-
- convert$1.hex.rgb = function (args) {
- const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
- if (!match) {
- return [0, 0, 0];
- }
-
- let colorString = match[0];
-
- if (match[0].length === 3) {
- colorString = colorString.split('').map(char => {
- return char + char;
- }).join('');
- }
-
- const integer = parseInt(colorString, 16);
- const r = (integer >> 16) & 0xFF;
- const g = (integer >> 8) & 0xFF;
- const b = integer & 0xFF;
-
- return [r, g, b];
- };
-
- convert$1.rgb.hcg = function (rgb) {
- const r = rgb[0] / 255;
- const g = rgb[1] / 255;
- const b = rgb[2] / 255;
- const max = Math.max(Math.max(r, g), b);
- const min = Math.min(Math.min(r, g), b);
- const chroma = (max - min);
- let grayscale;
- let hue;
-
- if (chroma < 1) {
- grayscale = min / (1 - chroma);
- } else {
- grayscale = 0;
- }
-
- if (chroma <= 0) {
- hue = 0;
- } else
- if (max === r) {
- hue = ((g - b) / chroma) % 6;
- } else
- if (max === g) {
- hue = 2 + (b - r) / chroma;
- } else {
- hue = 4 + (r - g) / chroma;
- }
-
- hue /= 6;
- hue %= 1;
-
- return [hue * 360, chroma * 100, grayscale * 100];
- };
-
- convert$1.hsl.hcg = function (hsl) {
- const s = hsl[1] / 100;
- const l = hsl[2] / 100;
-
- const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));
-
- let f = 0;
- if (c < 1.0) {
- f = (l - 0.5 * c) / (1.0 - c);
- }
-
- return [hsl[0], c * 100, f * 100];
- };
-
- convert$1.hsv.hcg = function (hsv) {
- const s = hsv[1] / 100;
- const v = hsv[2] / 100;
-
- const c = s * v;
- let f = 0;
-
- if (c < 1.0) {
- f = (v - c) / (1 - c);
- }
-
- return [hsv[0], c * 100, f * 100];
- };
-
- convert$1.hcg.rgb = function (hcg) {
- const h = hcg[0] / 360;
- const c = hcg[1] / 100;
- const g = hcg[2] / 100;
-
- if (c === 0.0) {
- return [g * 255, g * 255, g * 255];
- }
-
- const pure = [0, 0, 0];
- const hi = (h % 1) * 6;
- const v = hi % 1;
- const w = 1 - v;
- let mg = 0;
-
- /* eslint-disable max-statements-per-line */
- switch (Math.floor(hi)) {
- case 0:
- pure[0] = 1; pure[1] = v; pure[2] = 0; break;
- case 1:
- pure[0] = w; pure[1] = 1; pure[2] = 0; break;
- case 2:
- pure[0] = 0; pure[1] = 1; pure[2] = v; break;
- case 3:
- pure[0] = 0; pure[1] = w; pure[2] = 1; break;
- case 4:
- pure[0] = v; pure[1] = 0; pure[2] = 1; break;
- default:
- pure[0] = 1; pure[1] = 0; pure[2] = w;
- }
- /* eslint-enable max-statements-per-line */
-
- mg = (1.0 - c) * g;
-
- return [
- (c * pure[0] + mg) * 255,
- (c * pure[1] + mg) * 255,
- (c * pure[2] + mg) * 255
- ];
- };
-
- convert$1.hcg.hsv = function (hcg) {
- const c = hcg[1] / 100;
- const g = hcg[2] / 100;
-
- const v = c + g * (1.0 - c);
- let f = 0;
-
- if (v > 0.0) {
- f = c / v;
- }
-
- return [hcg[0], f * 100, v * 100];
- };
-
- convert$1.hcg.hsl = function (hcg) {
- const c = hcg[1] / 100;
- const g = hcg[2] / 100;
-
- const l = g * (1.0 - c) + 0.5 * c;
- let s = 0;
-
- if (l > 0.0 && l < 0.5) {
- s = c / (2 * l);
- } else
- if (l >= 0.5 && l < 1.0) {
- s = c / (2 * (1 - l));
- }
-
- return [hcg[0], s * 100, l * 100];
- };
-
- convert$1.hcg.hwb = function (hcg) {
- const c = hcg[1] / 100;
- const g = hcg[2] / 100;
- const v = c + g * (1.0 - c);
- return [hcg[0], (v - c) * 100, (1 - v) * 100];
- };
-
- convert$1.hwb.hcg = function (hwb) {
- const w = hwb[1] / 100;
- const b = hwb[2] / 100;
- const v = 1 - b;
- const c = v - w;
- let g = 0;
-
- if (c < 1) {
- g = (v - c) / (1 - c);
- }
-
- return [hwb[0], c * 100, g * 100];
- };
-
- convert$1.apple.rgb = function (apple) {
- return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
- };
-
- convert$1.rgb.apple = function (rgb) {
- return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
- };
-
- convert$1.gray.rgb = function (args) {
- return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
- };
-
- convert$1.gray.hsl = function (args) {
- return [0, 0, args[0]];
- };
-
- convert$1.gray.hsv = convert$1.gray.hsl;
-
- convert$1.gray.hwb = function (gray) {
- return [0, 100, gray[0]];
- };
-
- convert$1.gray.cmyk = function (gray) {
- return [0, 0, 0, gray[0]];
- };
-
- convert$1.gray.lab = function (gray) {
- return [gray[0], 0, 0];
- };
-
- convert$1.gray.hex = function (gray) {
- const val = Math.round(gray[0] / 100 * 255) & 0xFF;
- const integer = (val << 16) + (val << 8) + val;
-
- const string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
-
- convert$1.rgb.gray = function (rgb) {
- const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
- return [val / 255 * 100];
- };
-
- /*
- This function routes a model to all other models.
-
- all functions that are routed have a property `.conversion` attached
- to the returned synthetic function. This property is an array
- of strings, each with the steps in between the 'from' and 'to'
- color models (inclusive).
-
- conversions that are not possible simply are not included.
- */
-
- function buildGraph() {
- const graph = {};
- // https://jsperf.com/object-keys-vs-for-in-with-closure/3
- const models = Object.keys(conversions);
-
- for (let len = models.length, i = 0; i < len; i++) {
- graph[models[i]] = {
- // http://jsperf.com/1-vs-infinity
- // micro-opt, but this is simple.
- distance: -1,
- parent: null
- };
- }
-
- return graph;
- }
-
- // https://en.wikipedia.org/wiki/Breadth-first_search
- function deriveBFS(fromModel) {
- const graph = buildGraph();
- const queue = [fromModel]; // Unshift -> queue -> pop
-
- graph[fromModel].distance = 0;
-
- while (queue.length) {
- const current = queue.pop();
- const adjacents = Object.keys(conversions[current]);
-
- for (let len = adjacents.length, i = 0; i < len; i++) {
- const adjacent = adjacents[i];
- const node = graph[adjacent];
-
- if (node.distance === -1) {
- node.distance = graph[current].distance + 1;
- node.parent = current;
- queue.unshift(adjacent);
- }
- }
- }
-
- return graph;
- }
-
- function link(from, to) {
- return function (args) {
- return to(from(args));
- };
- }
-
- function wrapConversion(toModel, graph) {
- const path = [graph[toModel].parent, toModel];
- let fn = conversions[graph[toModel].parent][toModel];
-
- let cur = graph[toModel].parent;
- while (graph[cur].parent) {
- path.unshift(graph[cur].parent);
- fn = link(conversions[graph[cur].parent][cur], fn);
- cur = graph[cur].parent;
- }
-
- fn.conversion = path;
- return fn;
- }
-
- var route = function (fromModel) {
- const graph = deriveBFS(fromModel);
- const conversion = {};
-
- const models = Object.keys(graph);
- for (let len = models.length, i = 0; i < len; i++) {
- const toModel = models[i];
- const node = graph[toModel];
-
- if (node.parent === null) {
- // No possible conversion, or this node is the source model.
- continue;
- }
-
- conversion[toModel] = wrapConversion(toModel, graph);
- }
-
- return conversion;
- };
-
- const convert = {};
-
- const models = Object.keys(conversions);
-
- function wrapRaw(fn) {
- const wrappedFn = function (...args) {
- const arg0 = args[0];
- if (arg0 === undefined || arg0 === null) {
- return arg0;
- }
-
- if (arg0.length > 1) {
- args = arg0;
- }
-
- return fn(args);
- };
-
- // Preserve .conversion property if there is one
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
-
- return wrappedFn;
- }
-
- function wrapRounded(fn) {
- const wrappedFn = function (...args) {
- const arg0 = args[0];
-
- if (arg0 === undefined || arg0 === null) {
- return arg0;
- }
-
- if (arg0.length > 1) {
- args = arg0;
- }
-
- const result = fn(args);
-
- // We're assuming the result is an array here.
- // see notice in conversions.js; don't use box types
- // in conversion functions.
- if (typeof result === 'object') {
- for (let len = result.length, i = 0; i < len; i++) {
- result[i] = Math.round(result[i]);
- }
- }
-
- return result;
- };
-
- // Preserve .conversion property if there is one
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
-
- return wrappedFn;
- }
-
- models.forEach(fromModel => {
- convert[fromModel] = {};
-
- Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
- Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
-
- const routes = route(fromModel);
- const routeModels = Object.keys(routes);
-
- routeModels.forEach(toModel => {
- const fn = routes[toModel];
-
- convert[fromModel][toModel] = wrapRounded(fn);
- convert[fromModel][toModel].raw = wrapRaw(fn);
- });
- });
-
- var colorConvert = convert;
-
- var ansiStyles = createCommonjsModule(function (module) {
-
- const wrapAnsi16 = (fn, offset) => (...args) => {
- const code = fn(...args);
- return `\u001B[${code + offset}m`;
- };
-
- const wrapAnsi256 = (fn, offset) => (...args) => {
- const code = fn(...args);
- return `\u001B[${38 + offset};5;${code}m`;
- };
-
- const wrapAnsi16m = (fn, offset) => (...args) => {
- const rgb = fn(...args);
- return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
- };
-
- const ansi2ansi = n => n;
- const rgb2rgb = (r, g, b) => [r, g, b];
-
- const setLazyProperty = (object, property, get) => {
- Object.defineProperty(object, property, {
- get: () => {
- const value = get();
-
- Object.defineProperty(object, property, {
- value,
- enumerable: true,
- configurable: true
- });
-
- return value;
- },
- enumerable: true,
- configurable: true
- });
- };
-
- /** @type {typeof import('color-convert')} */
- let colorConvert$1;
- const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
- if (colorConvert$1 === undefined) {
- colorConvert$1 = colorConvert;
- }
-
- const offset = isBackground ? 10 : 0;
- const styles = {};
-
- for (const [sourceSpace, suite] of Object.entries(colorConvert$1)) {
- const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;
- if (sourceSpace === targetSpace) {
- styles[name] = wrap(identity, offset);
- } else if (typeof suite === 'object') {
- styles[name] = wrap(suite[targetSpace], offset);
- }
- }
-
- return styles;
- };
-
- function assembleStyles() {
- const codes = new Map();
- const styles = {
- modifier: {
- reset: [0, 0],
- // 21 isn't widely supported and 22 does the same thing
- bold: [1, 22],
- dim: [2, 22],
- italic: [3, 23],
- underline: [4, 24],
- inverse: [7, 27],
- hidden: [8, 28],
- strikethrough: [9, 29]
- },
- color: {
- black: [30, 39],
- red: [31, 39],
- green: [32, 39],
- yellow: [33, 39],
- blue: [34, 39],
- magenta: [35, 39],
- cyan: [36, 39],
- white: [37, 39],
-
- // Bright color
- blackBright: [90, 39],
- redBright: [91, 39],
- greenBright: [92, 39],
- yellowBright: [93, 39],
- blueBright: [94, 39],
- magentaBright: [95, 39],
- cyanBright: [96, 39],
- whiteBright: [97, 39]
- },
- bgColor: {
- bgBlack: [40, 49],
- bgRed: [41, 49],
- bgGreen: [42, 49],
- bgYellow: [43, 49],
- bgBlue: [44, 49],
- bgMagenta: [45, 49],
- bgCyan: [46, 49],
- bgWhite: [47, 49],
-
- // Bright color
- bgBlackBright: [100, 49],
- bgRedBright: [101, 49],
- bgGreenBright: [102, 49],
- bgYellowBright: [103, 49],
- bgBlueBright: [104, 49],
- bgMagentaBright: [105, 49],
- bgCyanBright: [106, 49],
- bgWhiteBright: [107, 49]
- }
- };
-
- // Alias bright black as gray (and grey)
- styles.color.gray = styles.color.blackBright;
- styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
- styles.color.grey = styles.color.blackBright;
- styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
-
- for (const [groupName, group] of Object.entries(styles)) {
- for (const [styleName, style] of Object.entries(group)) {
- styles[styleName] = {
- open: `\u001B[${style[0]}m`,
- close: `\u001B[${style[1]}m`
- };
-
- group[styleName] = styles[styleName];
-
- codes.set(style[0], style[1]);
- }
-
- Object.defineProperty(styles, groupName, {
- value: group,
- enumerable: false
- });
- }
-
- Object.defineProperty(styles, 'codes', {
- value: codes,
- enumerable: false
- });
-
- styles.color.close = '\u001B[39m';
- styles.bgColor.close = '\u001B[49m';
-
- setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));
- setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));
- setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));
- setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));
- setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));
- setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));
-
- return styles;
- }
-
- // Make the export immutable
- Object.defineProperty(module, 'exports', {
- enumerable: true,
- get: assembleStyles
- });
- }, "/$$rollup_base$$/node_modules/ansi-styles");
-
- var hasFlag = (flag, argv = process.argv) => {
- const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
- const position = argv.indexOf(prefix + flag);
- const terminatorPosition = argv.indexOf('--');
- return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
- };
-
- const {env: env$1} = process;
-
- let forceColor;
- if (hasFlag('no-color') ||
- hasFlag('no-colors') ||
- hasFlag('color=false') ||
- hasFlag('color=never')) {
- forceColor = 0;
- } else if (hasFlag('color') ||
- hasFlag('colors') ||
- hasFlag('color=true') ||
- hasFlag('color=always')) {
- forceColor = 1;
- }
-
- if ('FORCE_COLOR' in env$1) {
- if (env$1.FORCE_COLOR === 'true') {
- forceColor = 1;
- } else if (env$1.FORCE_COLOR === 'false') {
- forceColor = 0;
- } else {
- forceColor = env$1.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env$1.FORCE_COLOR, 10), 3);
- }
- }
-
- function translateLevel(level) {
- if (level === 0) {
- return false;
- }
-
- return {
- level,
- hasBasic: true,
- has256: level >= 2,
- has16m: level >= 3
- };
- }
-
- function supportsColor(haveStream, streamIsTTY) {
- if (forceColor === 0) {
- return 0;
- }
-
- if (hasFlag('color=16m') ||
- hasFlag('color=full') ||
- hasFlag('color=truecolor')) {
- return 3;
- }
-
- if (hasFlag('color=256')) {
- return 2;
- }
-
- if (haveStream && !streamIsTTY && forceColor === undefined) {
- return 0;
- }
-
- const min = forceColor || 0;
-
- if (env$1.TERM === 'dumb') {
- return min;
- }
-
- if (process.platform === 'win32') {
- // Windows 10 build 10586 is the first Windows release that supports 256 colors.
- // Windows 10 build 14931 is the first release that supports 16m/TrueColor.
- const osRelease = os__default["default"].release().split('.');
- if (
- Number(osRelease[0]) >= 10 &&
- Number(osRelease[2]) >= 10586
- ) {
- return Number(osRelease[2]) >= 14931 ? 3 : 2;
- }
-
- return 1;
- }
-
- if ('CI' in env$1) {
- if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env$1) || env$1.CI_NAME === 'codeship') {
- return 1;
- }
-
- return min;
- }
-
- if ('TEAMCITY_VERSION' in env$1) {
- return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$1.TEAMCITY_VERSION) ? 1 : 0;
- }
-
- if (env$1.COLORTERM === 'truecolor') {
- return 3;
- }
-
- if ('TERM_PROGRAM' in env$1) {
- const version = parseInt((env$1.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
-
- switch (env$1.TERM_PROGRAM) {
- case 'iTerm.app':
- return version >= 3 ? 3 : 2;
- case 'Apple_Terminal':
- return 2;
- // No default
- }
- }
-
- if (/-256(color)?$/i.test(env$1.TERM)) {
- return 2;
- }
-
- if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$1.TERM)) {
- return 1;
- }
-
- if ('COLORTERM' in env$1) {
- return 1;
- }
-
- return min;
- }
-
- function getSupportLevel(stream) {
- const level = supportsColor(stream, stream && stream.isTTY);
- return translateLevel(level);
- }
-
- var supportsColor_1 = {
- supportsColor: getSupportLevel,
- stdout: translateLevel(supportsColor(true, tty__default["default"].isatty(1))),
- stderr: translateLevel(supportsColor(true, tty__default["default"].isatty(2)))
- };
-
- const stringReplaceAll$1 = (string, substring, replacer) => {
- let index = string.indexOf(substring);
- if (index === -1) {
- return string;
- }
-
- const substringLength = substring.length;
- let endIndex = 0;
- let returnValue = '';
- do {
- returnValue += string.substr(endIndex, index - endIndex) + substring + replacer;
- endIndex = index + substringLength;
- index = string.indexOf(substring, endIndex);
- } while (index !== -1);
-
- returnValue += string.substr(endIndex);
- return returnValue;
- };
-
- const stringEncaseCRLFWithFirstIndex$1 = (string, prefix, postfix, index) => {
- let endIndex = 0;
- let returnValue = '';
- do {
- const gotCR = string[index - 1] === '\r';
- returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix;
- endIndex = index + 1;
- index = string.indexOf('\n', endIndex);
- } while (index !== -1);
-
- returnValue += string.substr(endIndex);
- return returnValue;
- };
-
- var util = {
- stringReplaceAll: stringReplaceAll$1,
- stringEncaseCRLFWithFirstIndex: stringEncaseCRLFWithFirstIndex$1
- };
-
- const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
- const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
- const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
- const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi;
-
- const ESCAPES = new Map([
- ['n', '\n'],
- ['r', '\r'],
- ['t', '\t'],
- ['b', '\b'],
- ['f', '\f'],
- ['v', '\v'],
- ['0', '\0'],
- ['\\', '\\'],
- ['e', '\u001B'],
- ['a', '\u0007']
- ]);
-
- function unescape$1(c) {
- const u = c[0] === 'u';
- const bracket = c[1] === '{';
-
- if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
- return String.fromCharCode(parseInt(c.slice(1), 16));
- }
-
- if (u && bracket) {
- return String.fromCodePoint(parseInt(c.slice(2, -1), 16));
- }
-
- return ESCAPES.get(c) || c;
- }
-
- function parseArguments(name, arguments_) {
- const results = [];
- const chunks = arguments_.trim().split(/\s*,\s*/g);
- let matches;
-
- for (const chunk of chunks) {
- const number = Number(chunk);
- if (!Number.isNaN(number)) {
- results.push(number);
- } else if ((matches = chunk.match(STRING_REGEX))) {
- results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape$1(escape) : character));
- } else {
- throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
- }
- }
-
- return results;
- }
-
- function parseStyle(style) {
- STYLE_REGEX.lastIndex = 0;
-
- const results = [];
- let matches;
-
- while ((matches = STYLE_REGEX.exec(style)) !== null) {
- const name = matches[1];
-
- if (matches[2]) {
- const args = parseArguments(name, matches[2]);
- results.push([name].concat(args));
- } else {
- results.push([name]);
- }
- }
-
- return results;
- }
-
- function buildStyle(chalk, styles) {
- const enabled = {};
-
- for (const layer of styles) {
- for (const style of layer.styles) {
- enabled[style[0]] = layer.inverse ? null : style.slice(1);
- }
- }
-
- let current = chalk;
- for (const [styleName, styles] of Object.entries(enabled)) {
- if (!Array.isArray(styles)) {
- continue;
- }
-
- if (!(styleName in current)) {
- throw new Error(`Unknown Chalk style: ${styleName}`);
- }
-
- current = styles.length > 0 ? current[styleName](...styles) : current[styleName];
- }
-
- return current;
- }
-
- var templates = (chalk, temporary) => {
- const styles = [];
- const chunks = [];
- let chunk = [];
-
- // eslint-disable-next-line max-params
- temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {
- if (escapeCharacter) {
- chunk.push(unescape$1(escapeCharacter));
- } else if (style) {
- const string = chunk.join('');
- chunk = [];
- chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));
- styles.push({inverse, styles: parseStyle(style)});
- } else if (close) {
- if (styles.length === 0) {
- throw new Error('Found extraneous } in Chalk template literal');
- }
-
- chunks.push(buildStyle(chalk, styles)(chunk.join('')));
- chunk = [];
- styles.pop();
- } else {
- chunk.push(character);
- }
- });
-
- chunks.push(chunk.join(''));
-
- if (styles.length > 0) {
- const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
- throw new Error(errMessage);
- }
-
- return chunks.join('');
- };
-
- const {stdout: stdoutColor, stderr: stderrColor} = supportsColor_1;
- const {
- stringReplaceAll,
- stringEncaseCRLFWithFirstIndex
- } = util;
-
- const {isArray: isArray$2} = Array;
-
- // `supportsColor.level` → `ansiStyles.color[name]` mapping
- const levelMapping = [
- 'ansi',
- 'ansi',
- 'ansi256',
- 'ansi16m'
- ];
-
- const styles = Object.create(null);
-
- const applyOptions = (object, options = {}) => {
- if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
- throw new Error('The `level` option should be an integer from 0 to 3');
- }
-
- // Detect level if not set manually
- const colorLevel = stdoutColor ? stdoutColor.level : 0;
- object.level = options.level === undefined ? colorLevel : options.level;
- };
-
- class ChalkClass {
- constructor(options) {
- // eslint-disable-next-line no-constructor-return
- return chalkFactory(options);
- }
- }
-
- const chalkFactory = options => {
- const chalk = {};
- applyOptions(chalk, options);
-
- chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);
-
- Object.setPrototypeOf(chalk, Chalk.prototype);
- Object.setPrototypeOf(chalk.template, chalk);
-
- chalk.template.constructor = () => {
- throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');
- };
-
- chalk.template.Instance = ChalkClass;
-
- return chalk.template;
- };
-
- function Chalk(options) {
- return chalkFactory(options);
- }
-
- for (const [styleName, style] of Object.entries(ansiStyles)) {
- styles[styleName] = {
- get() {
- const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);
- Object.defineProperty(this, styleName, {value: builder});
- return builder;
- }
- };
- }
-
- styles.visible = {
- get() {
- const builder = createBuilder(this, this._styler, true);
- Object.defineProperty(this, 'visible', {value: builder});
- return builder;
- }
- };
-
- const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];
-
- for (const model of usedModels) {
- styles[model] = {
- get() {
- const {level} = this;
- return function (...arguments_) {
- const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);
- return createBuilder(this, styler, this._isEmpty);
- };
- }
- };
- }
-
- for (const model of usedModels) {
- const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
- styles[bgModel] = {
- get() {
- const {level} = this;
- return function (...arguments_) {
- const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);
- return createBuilder(this, styler, this._isEmpty);
- };
- }
- };
- }
-
- const proto = Object.defineProperties(() => {}, {
- ...styles,
- level: {
- enumerable: true,
- get() {
- return this._generator.level;
- },
- set(level) {
- this._generator.level = level;
- }
- }
- });
-
- const createStyler = (open, close, parent) => {
- let openAll;
- let closeAll;
- if (parent === undefined) {
- openAll = open;
- closeAll = close;
- } else {
- openAll = parent.openAll + open;
- closeAll = close + parent.closeAll;
- }
-
- return {
- open,
- close,
- openAll,
- closeAll,
- parent
- };
- };
-
- const createBuilder = (self, _styler, _isEmpty) => {
- const builder = (...arguments_) => {
- if (isArray$2(arguments_[0]) && isArray$2(arguments_[0].raw)) {
- // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`
- return applyStyle(builder, chalkTag(builder, ...arguments_));
- }
-
- // Single argument is hot path, implicit coercion is faster than anything
- // eslint-disable-next-line no-implicit-coercion
- return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));
- };
-
- // We alter the prototype because we must return a function, but there is
- // no way to create a function with a different prototype
- Object.setPrototypeOf(builder, proto);
-
- builder._generator = self;
- builder._styler = _styler;
- builder._isEmpty = _isEmpty;
-
- return builder;
- };
-
- const applyStyle = (self, string) => {
- if (self.level <= 0 || !string) {
- return self._isEmpty ? '' : string;
- }
-
- let styler = self._styler;
-
- if (styler === undefined) {
- return string;
- }
-
- const {openAll, closeAll} = styler;
- if (string.indexOf('\u001B') !== -1) {
- while (styler !== undefined) {
- // Replace any instances already present with a re-opening code
- // otherwise only the part of the string until said closing code
- // will be colored, and the rest will simply be 'plain'.
- string = stringReplaceAll(string, styler.close, styler.open);
-
- styler = styler.parent;
- }
- }
-
- // We can move both next actions out of loop, because remaining actions in loop won't have
- // any/visible effect on parts we add here. Close the styling before a linebreak and reopen
- // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92
- const lfIndex = string.indexOf('\n');
- if (lfIndex !== -1) {
- string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
- }
-
- return openAll + string + closeAll;
- };
-
- let template;
- const chalkTag = (chalk, ...strings) => {
- const [firstString] = strings;
-
- if (!isArray$2(firstString) || !isArray$2(firstString.raw)) {
- // If chalk() was called by itself or with a string,
- // return the string itself as a string.
- return strings.join(' ');
- }
-
- const arguments_ = strings.slice(1);
- const parts = [firstString.raw[0]];
-
- for (let i = 1; i < firstString.length; i++) {
- parts.push(
- String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'),
- String(firstString.raw[i])
- );
- }
-
- if (template === undefined) {
- template = templates;
- }
-
- return template(chalk, parts.join(''));
- };
-
- Object.defineProperties(Chalk.prototype, styles);
-
- const chalk = Chalk(); // eslint-disable-line new-cap
- chalk.supportsColor = stdoutColor;
- chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap
- chalk.stderr.supportsColor = stderrColor;
-
- var source = chalk;
-
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // 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.
-
-
- var isWindows = process.platform === 'win32';
-
-
- // JavaScript implementation of realpath, ported from node pre-v6
-
- var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
-
- function rethrow() {
- // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
- // is fairly slow to generate.
- var callback;
- if (DEBUG) {
- var backtrace = new Error;
- callback = debugCallback;
- } else
- callback = missingCallback;
-
- return callback;
-
- function debugCallback(err) {
- if (err) {
- backtrace.message = err.message;
- err = backtrace;
- missingCallback(err);
- }
- }
-
- function missingCallback(err) {
- if (err) {
- if (process.throwDeprecation)
- throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs
- else if (!process.noDeprecation) {
- var msg = 'fs: missing callback ' + (err.stack || err.message);
- if (process.traceDeprecation)
- console.trace(msg);
- else
- console.error(msg);
- }
- }
- }
- }
-
- function maybeCallback(cb) {
- return typeof cb === 'function' ? cb : rethrow();
- }
-
- path__default["default"].normalize;
-
- // Regexp that finds the next partion of a (partial) path
- // result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
- if (isWindows) {
- var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
- } else {
- var nextPartRe = /(.*?)(?:[\/]+|$)/g;
- }
-
- // Regex to find the device root, including trailing slash. E.g. 'c:\\'.
- if (isWindows) {
- var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
- } else {
- var splitRootRe = /^[\/]*/;
- }
-
- var realpathSync$1 = function realpathSync(p, cache) {
- // make p is absolute
- p = path__default["default"].resolve(p);
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
- return cache[p];
- }
-
- var original = p,
- seenLinks = {},
- knownHard = {};
-
- // current character position in p
- var pos;
- // the partial path so far, including a trailing slash if any
- var current;
- // the partial path without a trailing slash (except when pointing at a root)
- var base;
- // the partial path scanned in the previous round, with slash
- var previous;
-
- start();
-
- function start() {
- // Skip over roots
- var m = splitRootRe.exec(p);
- pos = m[0].length;
- current = m[0];
- base = m[0];
- previous = '';
-
- // On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
- fs__default["default"].lstatSync(base);
- knownHard[base] = true;
- }
- }
-
- // walk down the path, swapping out linked pathparts for their real
- // values
- // NB: p.length changes.
- while (pos < p.length) {
- // find the next part
- nextPartRe.lastIndex = pos;
- var result = nextPartRe.exec(p);
- previous = current;
- current += result[0];
- base = previous + result[1];
- pos = nextPartRe.lastIndex;
-
- // continue if not a symlink
- if (knownHard[base] || (cache && cache[base] === base)) {
- continue;
- }
-
- var resolvedLink;
- if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
- // some known symbolic link. no need to stat again.
- resolvedLink = cache[base];
- } else {
- var stat = fs__default["default"].lstatSync(base);
- if (!stat.isSymbolicLink()) {
- knownHard[base] = true;
- if (cache) cache[base] = base;
- continue;
- }
-
- // read the link if it wasn't read before
- // dev/ino always return 0 on windows, so skip the check.
- var linkTarget = null;
- if (!isWindows) {
- var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
- if (seenLinks.hasOwnProperty(id)) {
- linkTarget = seenLinks[id];
- }
- }
- if (linkTarget === null) {
- fs__default["default"].statSync(base);
- linkTarget = fs__default["default"].readlinkSync(base);
- }
- resolvedLink = path__default["default"].resolve(previous, linkTarget);
- // track this, if given a cache.
- if (cache) cache[base] = resolvedLink;
- if (!isWindows) seenLinks[id] = linkTarget;
- }
-
- // resolve the link, then start over
- p = path__default["default"].resolve(resolvedLink, p.slice(pos));
- start();
- }
-
- if (cache) cache[original] = p;
-
- return p;
- };
-
-
- var realpath$1 = function realpath(p, cache, cb) {
- if (typeof cb !== 'function') {
- cb = maybeCallback(cache);
- cache = null;
- }
-
- // make p is absolute
- p = path__default["default"].resolve(p);
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
- return process.nextTick(cb.bind(null, null, cache[p]));
- }
-
- var original = p,
- seenLinks = {},
- knownHard = {};
-
- // current character position in p
- var pos;
- // the partial path so far, including a trailing slash if any
- var current;
- // the partial path without a trailing slash (except when pointing at a root)
- var base;
- // the partial path scanned in the previous round, with slash
- var previous;
-
- start();
-
- function start() {
- // Skip over roots
- var m = splitRootRe.exec(p);
- pos = m[0].length;
- current = m[0];
- base = m[0];
- previous = '';
-
- // On windows, check that the root exists. On unix there is no need.
- if (isWindows && !knownHard[base]) {
- fs__default["default"].lstat(base, function(err) {
- if (err) return cb(err);
- knownHard[base] = true;
- LOOP();
- });
- } else {
- process.nextTick(LOOP);
- }
- }
-
- // walk down the path, swapping out linked pathparts for their real
- // values
- function LOOP() {
- // stop if scanned past end of path
- if (pos >= p.length) {
- if (cache) cache[original] = p;
- return cb(null, p);
- }
-
- // find the next part
- nextPartRe.lastIndex = pos;
- var result = nextPartRe.exec(p);
- previous = current;
- current += result[0];
- base = previous + result[1];
- pos = nextPartRe.lastIndex;
-
- // continue if not a symlink
- if (knownHard[base] || (cache && cache[base] === base)) {
- return process.nextTick(LOOP);
- }
-
- if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
- // known symbolic link. no need to stat again.
- return gotResolvedLink(cache[base]);
- }
-
- return fs__default["default"].lstat(base, gotStat);
- }
-
- function gotStat(err, stat) {
- if (err) return cb(err);
-
- // if not a symlink, skip to the next path part
- if (!stat.isSymbolicLink()) {
- knownHard[base] = true;
- if (cache) cache[base] = base;
- return process.nextTick(LOOP);
- }
-
- // stat & read the link if not read before
- // call gotTarget as soon as the link target is known
- // dev/ino always return 0 on windows, so skip the check.
- if (!isWindows) {
- var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
- if (seenLinks.hasOwnProperty(id)) {
- return gotTarget(null, seenLinks[id], base);
- }
- }
- fs__default["default"].stat(base, function(err) {
- if (err) return cb(err);
-
- fs__default["default"].readlink(base, function(err, target) {
- if (!isWindows) seenLinks[id] = target;
- gotTarget(err, target);
- });
- });
- }
-
- function gotTarget(err, target, base) {
- if (err) return cb(err);
-
- var resolvedLink = path__default["default"].resolve(previous, target);
- if (cache) cache[base] = resolvedLink;
- gotResolvedLink(resolvedLink);
- }
-
- function gotResolvedLink(resolvedLink) {
- // resolve the link, then start over
- p = path__default["default"].resolve(resolvedLink, p.slice(pos));
- start();
- }
- };
-
- var old = {
- realpathSync: realpathSync$1,
- realpath: realpath$1
- };
-
- var fs_realpath = realpath;
- realpath.realpath = realpath;
- realpath.sync = realpathSync;
- realpath.realpathSync = realpathSync;
- realpath.monkeypatch = monkeypatch;
- realpath.unmonkeypatch = unmonkeypatch;
-
-
- var origRealpath = fs__default["default"].realpath;
- var origRealpathSync = fs__default["default"].realpathSync;
-
- var version = process.version;
- var ok = /^v[0-5]\./.test(version);
-
-
- function newError (er) {
- return er && er.syscall === 'realpath' && (
- er.code === 'ELOOP' ||
- er.code === 'ENOMEM' ||
- er.code === 'ENAMETOOLONG'
- )
- }
-
- function realpath (p, cache, cb) {
- if (ok) {
- return origRealpath(p, cache, cb)
- }
-
- if (typeof cache === 'function') {
- cb = cache;
- cache = null;
- }
- origRealpath(p, cache, function (er, result) {
- if (newError(er)) {
- old.realpath(p, cache, cb);
- } else {
- cb(er, result);
- }
- });
- }
-
- function realpathSync (p, cache) {
- if (ok) {
- return origRealpathSync(p, cache)
- }
-
- try {
- return origRealpathSync(p, cache)
- } catch (er) {
- if (newError(er)) {
- return old.realpathSync(p, cache)
- } else {
- throw er
- }
- }
- }
-
- function monkeypatch () {
- fs__default["default"].realpath = realpath;
- fs__default["default"].realpathSync = realpathSync;
- }
-
- function unmonkeypatch () {
- fs__default["default"].realpath = origRealpath;
- fs__default["default"].realpathSync = origRealpathSync;
- }
-
- var concatMap = function (xs, fn) {
- var res = [];
- for (var i = 0; i < xs.length; i++) {
- var x = fn(xs[i], i);
- if (isArray$1(x)) res.push.apply(res, x);
- else res.push(x);
- }
- return res;
- };
-
- var isArray$1 = Array.isArray || function (xs) {
- return Object.prototype.toString.call(xs) === '[object Array]';
- };
-
- var balancedMatch = balanced;
- function balanced(a, b, str) {
- if (a instanceof RegExp) a = maybeMatch(a, str);
- if (b instanceof RegExp) b = maybeMatch(b, str);
-
- var r = range(a, b, str);
-
- return r && {
- start: r[0],
- end: r[1],
- pre: str.slice(0, r[0]),
- body: str.slice(r[0] + a.length, r[1]),
- post: str.slice(r[1] + b.length)
- };
- }
-
- function maybeMatch(reg, str) {
- var m = str.match(reg);
- return m ? m[0] : null;
- }
-
- balanced.range = range;
- function range(a, b, str) {
- var begs, beg, left, right, result;
- var ai = str.indexOf(a);
- var bi = str.indexOf(b, ai + 1);
- var i = ai;
-
- if (ai >= 0 && bi > 0) {
- if(a===b) {
- return [ai, bi];
- }
- begs = [];
- left = str.length;
-
- while (i >= 0 && !result) {
- if (i == ai) {
- begs.push(i);
- ai = str.indexOf(a, i + 1);
- } else if (begs.length == 1) {
- result = [ begs.pop(), bi ];
- } else {
- beg = begs.pop();
- if (beg < left) {
- left = beg;
- right = bi;
- }
-
- bi = str.indexOf(b, i + 1);
- }
-
- i = ai < bi && ai >= 0 ? ai : bi;
- }
-
- if (begs.length) {
- result = [ left, right ];
- }
- }
-
- return result;
- }
-
- var braceExpansion = expandTop;
-
- var escSlash = '\0SLASH'+Math.random()+'\0';
- var escOpen = '\0OPEN'+Math.random()+'\0';
- var escClose = '\0CLOSE'+Math.random()+'\0';
- var escComma = '\0COMMA'+Math.random()+'\0';
- var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
- function numeric(str) {
- return parseInt(str, 10) == str
- ? parseInt(str, 10)
- : str.charCodeAt(0);
- }
-
- function escapeBraces(str) {
- return str.split('\\\\').join(escSlash)
- .split('\\{').join(escOpen)
- .split('\\}').join(escClose)
- .split('\\,').join(escComma)
- .split('\\.').join(escPeriod);
- }
-
- function unescapeBraces(str) {
- return str.split(escSlash).join('\\')
- .split(escOpen).join('{')
- .split(escClose).join('}')
- .split(escComma).join(',')
- .split(escPeriod).join('.');
- }
-
-
- // Basically just str.split(","), but handling cases
- // where we have nested braced sections, which should be
- // treated as individual members, like {a,{b,c},d}
- function parseCommaParts(str) {
- if (!str)
- return [''];
-
- var parts = [];
- var m = balancedMatch('{', '}', str);
-
- if (!m)
- return str.split(',');
-
- var pre = m.pre;
- var body = m.body;
- var post = m.post;
- var p = pre.split(',');
-
- p[p.length-1] += '{' + body + '}';
- var postParts = parseCommaParts(post);
- if (post.length) {
- p[p.length-1] += postParts.shift();
- p.push.apply(p, postParts);
- }
-
- parts.push.apply(parts, p);
-
- return parts;
- }
-
- function expandTop(str) {
- if (!str)
- return [];
-
- // I don't know why Bash 4.3 does this, but it does.
- // Anything starting with {} will have the first two bytes preserved
- // but *only* at the top level, so {},a}b will not expand to anything,
- // but a{},b}c will be expanded to [a}c,abc].
- // One could argue that this is a bug in Bash, but since the goal of
- // this module is to match Bash's rules, we escape a leading {}
- if (str.substr(0, 2) === '{}') {
- str = '\\{\\}' + str.substr(2);
- }
-
- return expand(escapeBraces(str), true).map(unescapeBraces);
- }
-
- function embrace(str) {
- return '{' + str + '}';
- }
- function isPadded(el) {
- return /^-?0\d/.test(el);
- }
-
- function lte(i, y) {
- return i <= y;
- }
- function gte(i, y) {
- return i >= y;
- }
-
- function expand(str, isTop) {
- var expansions = [];
-
- var m = balancedMatch('{', '}', str);
- if (!m || /\$$/.test(m.pre)) return [str];
-
- var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
- var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
- var isSequence = isNumericSequence || isAlphaSequence;
- var isOptions = m.body.indexOf(',') >= 0;
- if (!isSequence && !isOptions) {
- // {a},b}
- if (m.post.match(/,.*\}/)) {
- str = m.pre + '{' + m.body + escClose + m.post;
- return expand(str);
- }
- return [str];
- }
-
- var n;
- if (isSequence) {
- n = m.body.split(/\.\./);
- } else {
- n = parseCommaParts(m.body);
- if (n.length === 1) {
- // x{{a,b}}y ==> x{a}y x{b}y
- n = expand(n[0], false).map(embrace);
- if (n.length === 1) {
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
- return post.map(function(p) {
- return m.pre + n[0] + p;
- });
- }
- }
- }
-
- // at this point, n is the parts, and we know it's not a comma set
- // with a single entry.
-
- // no need to expand pre, since it is guaranteed to be free of brace-sets
- var pre = m.pre;
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
-
- var N;
-
- if (isSequence) {
- var x = numeric(n[0]);
- var y = numeric(n[1]);
- var width = Math.max(n[0].length, n[1].length);
- var incr = n.length == 3
- ? Math.abs(numeric(n[2]))
- : 1;
- var test = lte;
- var reverse = y < x;
- if (reverse) {
- incr *= -1;
- test = gte;
- }
- var pad = n.some(isPadded);
-
- N = [];
-
- for (var i = x; test(i, y); i += incr) {
- var c;
- if (isAlphaSequence) {
- c = String.fromCharCode(i);
- if (c === '\\')
- c = '';
- } else {
- c = String(i);
- if (pad) {
- var need = width - c.length;
- if (need > 0) {
- var z = new Array(need + 1).join('0');
- if (i < 0)
- c = '-' + z + c.slice(1);
- else
- c = z + c;
- }
- }
- }
- N.push(c);
- }
- } else {
- N = concatMap(n, function(el) { return expand(el, false) });
- }
-
- for (var j = 0; j < N.length; j++) {
- for (var k = 0; k < post.length; k++) {
- var expansion = pre + N[j] + post[k];
- if (!isTop || isSequence || expansion)
- expansions.push(expansion);
- }
- }
-
- return expansions;
- }
-
- var minimatch_1 = minimatch;
- minimatch.Minimatch = Minimatch$1;
-
- var path = (function () { try { return path__default["default"] } catch (e) {}}()) || {
- sep: '/'
- };
- minimatch.sep = path.sep;
-
- var GLOBSTAR = minimatch.GLOBSTAR = Minimatch$1.GLOBSTAR = {};
-
-
- var plTypes = {
- '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
- '?': { open: '(?:', close: ')?' },
- '+': { open: '(?:', close: ')+' },
- '*': { open: '(?:', close: ')*' },
- '@': { open: '(?:', close: ')' }
- };
-
- // any single thing other than /
- // don't need to escape / when using new RegExp()
- var qmark = '[^/]';
-
- // * => any number of characters
- var star = qmark + '*?';
-
- // ** when dots are allowed. Anything goes, except .. and .
- // not (^ or / followed by one or two dots followed by $ or /),
- // followed by anything, any number of times.
- var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?';
-
- // not a ^ or / followed by a dot,
- // followed by anything, any number of times.
- var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?';
-
- // characters that need to be escaped in RegExp.
- var reSpecials = charSet('().*{}+?[]^$\\!');
-
- // "abc" -> { a:true, b:true, c:true }
- function charSet (s) {
- return s.split('').reduce(function (set, c) {
- set[c] = true;
- return set
- }, {})
- }
-
- // normalizes slashes.
- var slashSplit = /\/+/;
-
- minimatch.filter = filter;
- function filter (pattern, options) {
- options = options || {};
- return function (p, i, list) {
- return minimatch(p, pattern, options)
- }
- }
-
- function ext (a, b) {
- b = b || {};
- var t = {};
- Object.keys(a).forEach(function (k) {
- t[k] = a[k];
- });
- Object.keys(b).forEach(function (k) {
- t[k] = b[k];
- });
- return t
- }
-
- minimatch.defaults = function (def) {
- if (!def || typeof def !== 'object' || !Object.keys(def).length) {
- return minimatch
- }
-
- var orig = minimatch;
-
- var m = function minimatch (p, pattern, options) {
- return orig(p, pattern, ext(def, options))
- };
-
- m.Minimatch = function Minimatch (pattern, options) {
- return new orig.Minimatch(pattern, ext(def, options))
- };
- m.Minimatch.defaults = function defaults (options) {
- return orig.defaults(ext(def, options)).Minimatch
- };
-
- m.filter = function filter (pattern, options) {
- return orig.filter(pattern, ext(def, options))
- };
-
- m.defaults = function defaults (options) {
- return orig.defaults(ext(def, options))
- };
-
- m.makeRe = function makeRe (pattern, options) {
- return orig.makeRe(pattern, ext(def, options))
- };
-
- m.braceExpand = function braceExpand (pattern, options) {
- return orig.braceExpand(pattern, ext(def, options))
- };
-
- m.match = function (list, pattern, options) {
- return orig.match(list, pattern, ext(def, options))
- };
-
- return m
- };
-
- Minimatch$1.defaults = function (def) {
- return minimatch.defaults(def).Minimatch
- };
-
- function minimatch (p, pattern, options) {
- assertValidPattern(pattern);
-
- if (!options) options = {};
-
- // shortcut: comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- return false
- }
-
- return new Minimatch$1(pattern, options).match(p)
- }
-
- function Minimatch$1 (pattern, options) {
- if (!(this instanceof Minimatch$1)) {
- return new Minimatch$1(pattern, options)
- }
-
- assertValidPattern(pattern);
-
- if (!options) options = {};
-
- pattern = pattern.trim();
-
- // windows support: need to use /, not \
- if (!options.allowWindowsEscape && path.sep !== '/') {
- pattern = pattern.split(path.sep).join('/');
- }
-
- this.options = options;
- this.set = [];
- this.pattern = pattern;
- this.regexp = null;
- this.negate = false;
- this.comment = false;
- this.empty = false;
- this.partial = !!options.partial;
-
- // make the set of regexps etc.
- this.make();
- }
-
- Minimatch$1.prototype.debug = function () {};
-
- Minimatch$1.prototype.make = make;
- function make () {
- var pattern = this.pattern;
- var options = this.options;
-
- // empty patterns and comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- this.comment = true;
- return
- }
- if (!pattern) {
- this.empty = true;
- return
- }
-
- // step 1: figure out negation, etc.
- this.parseNegate();
-
- // step 2: expand braces
- var set = this.globSet = this.braceExpand();
-
- if (options.debug) this.debug = function debug() { console.error.apply(console, arguments); };
-
- this.debug(this.pattern, set);
-
- // step 3: now we have a set, so turn each one into a series of path-portion
- // matching patterns.
- // These will be regexps, except in the case of "**", which is
- // set to the GLOBSTAR object for globstar behavior,
- // and will not contain any / characters
- set = this.globParts = set.map(function (s) {
- return s.split(slashSplit)
- });
-
- this.debug(this.pattern, set);
-
- // glob --> regexps
- set = set.map(function (s, si, set) {
- return s.map(this.parse, this)
- }, this);
-
- this.debug(this.pattern, set);
-
- // filter out everything that didn't compile properly.
- set = set.filter(function (s) {
- return s.indexOf(false) === -1
- });
-
- this.debug(this.pattern, set);
-
- this.set = set;
- }
-
- Minimatch$1.prototype.parseNegate = parseNegate;
- function parseNegate () {
- var pattern = this.pattern;
- var negate = false;
- var options = this.options;
- var negateOffset = 0;
-
- if (options.nonegate) return
-
- for (var i = 0, l = pattern.length
- ; i < l && pattern.charAt(i) === '!'
- ; i++) {
- negate = !negate;
- negateOffset++;
- }
-
- if (negateOffset) this.pattern = pattern.substr(negateOffset);
- this.negate = negate;
- }
-
- // Brace expansion:
- // a{b,c}d -> abd acd
- // a{b,}c -> abc ac
- // a{0..3}d -> a0d a1d a2d a3d
- // a{b,c{d,e}f}g -> abg acdfg acefg
- // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
- //
- // Invalid sets are not expanded.
- // a{2..}b -> a{2..}b
- // a{b}c -> a{b}c
- minimatch.braceExpand = function (pattern, options) {
- return braceExpand(pattern, options)
- };
-
- Minimatch$1.prototype.braceExpand = braceExpand;
-
- function braceExpand (pattern, options) {
- if (!options) {
- if (this instanceof Minimatch$1) {
- options = this.options;
- } else {
- options = {};
- }
- }
-
- pattern = typeof pattern === 'undefined'
- ? this.pattern : pattern;
-
- assertValidPattern(pattern);
-
- // Thanks to Yeting Li <https://github.com/yetingli> for
- // improving this regexp to avoid a ReDOS vulnerability.
- if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
- // shortcut. no need to expand.
- return [pattern]
- }
-
- return braceExpansion(pattern)
- }
-
- var MAX_PATTERN_LENGTH = 1024 * 64;
- var assertValidPattern = function (pattern) {
- if (typeof pattern !== 'string') {
- throw new TypeError('invalid pattern')
- }
-
- if (pattern.length > MAX_PATTERN_LENGTH) {
- throw new TypeError('pattern is too long')
- }
- };
-
- // parse a component of the expanded set.
- // At this point, no pattern may contain "/" in it
- // so we're going to return a 2d array, where each entry is the full
- // pattern, split on '/', and then turned into a regular expression.
- // A regexp is made at the end which joins each array with an
- // escaped /, and another full one which joins each regexp with |.
- //
- // Following the lead of Bash 4.1, note that "**" only has special meaning
- // when it is the *only* thing in a path portion. Otherwise, any series
- // of * is equivalent to a single *. Globstar behavior is enabled by
- // default, and can be disabled by setting options.noglobstar.
- Minimatch$1.prototype.parse = parse;
- var SUBPARSE = {};
- function parse (pattern, isSub) {
- assertValidPattern(pattern);
-
- var options = this.options;
-
- // shortcuts
- if (pattern === '**') {
- if (!options.noglobstar)
- return GLOBSTAR
- else
- pattern = '*';
- }
- if (pattern === '') return ''
-
- var re = '';
- var hasMagic = !!options.nocase;
- var escaping = false;
- // ? => one single character
- var patternListStack = [];
- var negativeLists = [];
- var stateChar;
- var inClass = false;
- var reClassStart = -1;
- var classStart = -1;
- // . and .. never match anything that doesn't start with .,
- // even when options.dot is set.
- var patternStart = pattern.charAt(0) === '.' ? '' // anything
- // not (start or / followed by . or .. followed by / or end)
- : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
- : '(?!\\.)';
- var self = this;
-
- function clearStateChar () {
- if (stateChar) {
- // we had some state-tracking character
- // that wasn't consumed by this pass.
- switch (stateChar) {
- case '*':
- re += star;
- hasMagic = true;
- break
- case '?':
- re += qmark;
- hasMagic = true;
- break
- default:
- re += '\\' + stateChar;
- break
- }
- self.debug('clearStateChar %j %j', stateChar, re);
- stateChar = false;
- }
- }
-
- for (var i = 0, len = pattern.length, c
- ; (i < len) && (c = pattern.charAt(i))
- ; i++) {
- this.debug('%s\t%s %s %j', pattern, i, re, c);
-
- // skip over any that are escaped.
- if (escaping && reSpecials[c]) {
- re += '\\' + c;
- escaping = false;
- continue
- }
-
- switch (c) {
- /* istanbul ignore next */
- case '/': {
- // completely not allowed, even escaped.
- // Should already be path-split by now.
- return false
- }
-
- case '\\':
- clearStateChar();
- escaping = true;
- continue
-
- // the various stateChar values
- // for the "extglob" stuff.
- case '?':
- case '*':
- case '+':
- case '@':
- case '!':
- this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c);
-
- // all of those are literals inside a class, except that
- // the glob [!a] means [^a] in regexp
- if (inClass) {
- this.debug(' in class');
- if (c === '!' && i === classStart + 1) c = '^';
- re += c;
- continue
- }
-
- // if we already have a stateChar, then it means
- // that there was something like ** or +? in there.
- // Handle the stateChar, then proceed with this one.
- self.debug('call clearStateChar %j', stateChar);
- clearStateChar();
- stateChar = c;
- // if extglob is disabled, then +(asdf|foo) isn't a thing.
- // just clear the statechar *now*, rather than even diving into
- // the patternList stuff.
- if (options.noext) clearStateChar();
- continue
-
- case '(':
- if (inClass) {
- re += '(';
- continue
- }
-
- if (!stateChar) {
- re += '\\(';
- continue
- }
-
- patternListStack.push({
- type: stateChar,
- start: i - 1,
- reStart: re.length,
- open: plTypes[stateChar].open,
- close: plTypes[stateChar].close
- });
- // negation is (?:(?!js)[^/]*)
- re += stateChar === '!' ? '(?:(?!(?:' : '(?:';
- this.debug('plType %j %j', stateChar, re);
- stateChar = false;
- continue
-
- case ')':
- if (inClass || !patternListStack.length) {
- re += '\\)';
- continue
- }
-
- clearStateChar();
- hasMagic = true;
- var pl = patternListStack.pop();
- // negation is (?:(?!js)[^/]*)
- // The others are (?:<pattern>)<type>
- re += pl.close;
- if (pl.type === '!') {
- negativeLists.push(pl);
- }
- pl.reEnd = re.length;
- continue
-
- case '|':
- if (inClass || !patternListStack.length || escaping) {
- re += '\\|';
- escaping = false;
- continue
- }
-
- clearStateChar();
- re += '|';
- continue
-
- // these are mostly the same in regexp and glob
- case '[':
- // swallow any state-tracking char before the [
- clearStateChar();
-
- if (inClass) {
- re += '\\' + c;
- continue
- }
-
- inClass = true;
- classStart = i;
- reClassStart = re.length;
- re += c;
- continue
-
- case ']':
- // a right bracket shall lose its special
- // meaning and represent itself in
- // a bracket expression if it occurs
- // first in the list. -- POSIX.2 2.8.3.2
- if (i === classStart + 1 || !inClass) {
- re += '\\' + c;
- escaping = false;
- continue
- }
-
- // handle the case where we left a class open.
- // "[z-a]" is valid, equivalent to "\[z-a\]"
- // split where the last [ was, make sure we don't have
- // an invalid re. if so, re-walk the contents of the
- // would-be class to re-translate any characters that
- // were passed through as-is
- // TODO: It would probably be faster to determine this
- // without a try/catch and a new RegExp, but it's tricky
- // to do safely. For now, this is safe and works.
- var cs = pattern.substring(classStart + 1, i);
- try {
- RegExp('[' + cs + ']');
- } catch (er) {
- // not a valid class!
- var sp = this.parse(cs, SUBPARSE);
- re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]';
- hasMagic = hasMagic || sp[1];
- inClass = false;
- continue
- }
-
- // finish up the class.
- hasMagic = true;
- inClass = false;
- re += c;
- continue
-
- default:
- // swallow any state char that wasn't consumed
- clearStateChar();
-
- if (escaping) {
- // no need
- escaping = false;
- } else if (reSpecials[c]
- && !(c === '^' && inClass)) {
- re += '\\';
- }
-
- re += c;
-
- } // switch
- } // for
-
- // handle the case where we left a class open.
- // "[abc" is valid, equivalent to "\[abc"
- if (inClass) {
- // split where the last [ was, and escape it
- // this is a huge pita. We now have to re-walk
- // the contents of the would-be class to re-translate
- // any characters that were passed through as-is
- cs = pattern.substr(classStart + 1);
- sp = this.parse(cs, SUBPARSE);
- re = re.substr(0, reClassStart) + '\\[' + sp[0];
- hasMagic = hasMagic || sp[1];
- }
-
- // handle the case where we had a +( thing at the *end*
- // of the pattern.
- // each pattern list stack adds 3 chars, and we need to go through
- // and escape any | chars that were passed through as-is for the regexp.
- // Go through and escape them, taking care not to double-escape any
- // | chars that were already escaped.
- for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
- var tail = re.slice(pl.reStart + pl.open.length);
- this.debug('setting tail', re, pl);
- // maybe some even number of \, then maybe 1 \, followed by a |
- tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
- if (!$2) {
- // the | isn't already escaped, so escape it.
- $2 = '\\';
- }
-
- // need to escape all those slashes *again*, without escaping the
- // one that we need for escaping the | character. As it works out,
- // escaping an even number of slashes can be done by simply repeating
- // it exactly after itself. That's why this trick works.
- //
- // I am sorry that you have to see this.
- return $1 + $1 + $2 + '|'
- });
-
- this.debug('tail=%j\n %s', tail, tail, pl, re);
- var t = pl.type === '*' ? star
- : pl.type === '?' ? qmark
- : '\\' + pl.type;
-
- hasMagic = true;
- re = re.slice(0, pl.reStart) + t + '\\(' + tail;
- }
-
- // handle trailing things that only matter at the very end.
- clearStateChar();
- if (escaping) {
- // trailing \\
- re += '\\\\';
- }
-
- // only need to apply the nodot start if the re starts with
- // something that could conceivably capture a dot
- var addPatternStart = false;
- switch (re.charAt(0)) {
- case '[': case '.': case '(': addPatternStart = true;
- }
-
- // Hack to work around lack of negative lookbehind in JS
- // A pattern like: *.!(x).!(y|z) needs to ensure that a name
- // like 'a.xyz.yz' doesn't match. So, the first negative
- // lookahead, has to look ALL the way ahead, to the end of
- // the pattern.
- for (var n = negativeLists.length - 1; n > -1; n--) {
- var nl = negativeLists[n];
-
- var nlBefore = re.slice(0, nl.reStart);
- var nlFirst = re.slice(nl.reStart, nl.reEnd - 8);
- var nlLast = re.slice(nl.reEnd - 8, nl.reEnd);
- var nlAfter = re.slice(nl.reEnd);
-
- nlLast += nlAfter;
-
- // Handle nested stuff like *(*.js|!(*.json)), where open parens
- // mean that we should *not* include the ) in the bit that is considered
- // "after" the negated section.
- var openParensBefore = nlBefore.split('(').length - 1;
- var cleanAfter = nlAfter;
- for (i = 0; i < openParensBefore; i++) {
- cleanAfter = cleanAfter.replace(/\)[+*?]?/, '');
- }
- nlAfter = cleanAfter;
-
- var dollar = '';
- if (nlAfter === '' && isSub !== SUBPARSE) {
- dollar = '$';
- }
- var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast;
- re = newRe;
- }
-
- // if the re is not "" at this point, then we need to make sure
- // it doesn't match against an empty path part.
- // Otherwise a/* will match a/, which it should not.
- if (re !== '' && hasMagic) {
- re = '(?=.)' + re;
- }
-
- if (addPatternStart) {
- re = patternStart + re;
- }
-
- // parsing just a piece of a larger pattern.
- if (isSub === SUBPARSE) {
- return [re, hasMagic]
- }
-
- // skip the regexp for non-magical patterns
- // unescape anything in it, though, so that it'll be
- // an exact match against a file etc.
- if (!hasMagic) {
- return globUnescape(pattern)
- }
-
- var flags = options.nocase ? 'i' : '';
- try {
- var regExp = new RegExp('^' + re + '$', flags);
- } catch (er) /* istanbul ignore next - should be impossible */ {
- // If it was an invalid regular expression, then it can't match
- // anything. This trick looks for a character after the end of
- // the string, which is of course impossible, except in multi-line
- // mode, but it's not a /m regex.
- return new RegExp('$.')
- }
-
- regExp._glob = pattern;
- regExp._src = re;
-
- return regExp
- }
-
- minimatch.makeRe = function (pattern, options) {
- return new Minimatch$1(pattern, options || {}).makeRe()
- };
-
- Minimatch$1.prototype.makeRe = makeRe;
- function makeRe () {
- if (this.regexp || this.regexp === false) return this.regexp
-
- // at this point, this.set is a 2d array of partial
- // pattern strings, or "**".
- //
- // It's better to use .match(). This function shouldn't
- // be used, really, but it's pretty convenient sometimes,
- // when you just want to work with a regex.
- var set = this.set;
-
- if (!set.length) {
- this.regexp = false;
- return this.regexp
- }
- var options = this.options;
-
- var twoStar = options.noglobstar ? star
- : options.dot ? twoStarDot
- : twoStarNoDot;
- var flags = options.nocase ? 'i' : '';
-
- var re = set.map(function (pattern) {
- return pattern.map(function (p) {
- return (p === GLOBSTAR) ? twoStar
- : (typeof p === 'string') ? regExpEscape(p)
- : p._src
- }).join('\\\/')
- }).join('|');
-
- // must match entire pattern
- // ending in a * or ** will make it less strict.
- re = '^(?:' + re + ')$';
-
- // can match anything, as long as it's not this.
- if (this.negate) re = '^(?!' + re + ').*$';
-
- try {
- this.regexp = new RegExp(re, flags);
- } catch (ex) /* istanbul ignore next - should be impossible */ {
- this.regexp = false;
- }
- return this.regexp
- }
-
- minimatch.match = function (list, pattern, options) {
- options = options || {};
- var mm = new Minimatch$1(pattern, options);
- list = list.filter(function (f) {
- return mm.match(f)
- });
- if (mm.options.nonull && !list.length) {
- list.push(pattern);
- }
- return list
- };
-
- Minimatch$1.prototype.match = function match (f, partial) {
- if (typeof partial === 'undefined') partial = this.partial;
- this.debug('match', f, this.pattern);
- // short-circuit in the case of busted things.
- // comments, etc.
- if (this.comment) return false
- if (this.empty) return f === ''
-
- if (f === '/' && partial) return true
-
- var options = this.options;
-
- // windows: need to use /, not \
- if (path.sep !== '/') {
- f = f.split(path.sep).join('/');
- }
-
- // treat the test path as a set of pathparts.
- f = f.split(slashSplit);
- this.debug(this.pattern, 'split', f);
-
- // just ONE of the pattern sets in this.set needs to match
- // in order for it to be valid. If negating, then just one
- // match means that we have failed.
- // Either way, return on the first hit.
-
- var set = this.set;
- this.debug(this.pattern, 'set', set);
-
- // Find the basename of the path by looking for the last non-empty segment
- var filename;
- var i;
- for (i = f.length - 1; i >= 0; i--) {
- filename = f[i];
- if (filename) break
- }
-
- for (i = 0; i < set.length; i++) {
- var pattern = set[i];
- var file = f;
- if (options.matchBase && pattern.length === 1) {
- file = [filename];
- }
- var hit = this.matchOne(file, pattern, partial);
- if (hit) {
- if (options.flipNegate) return true
- return !this.negate
- }
- }
-
- // didn't get any hits. this is success if it's a negative
- // pattern, failure otherwise.
- if (options.flipNegate) return false
- return this.negate
- };
-
- // set partial to true to test if, for example,
- // "/a/b" matches the start of "/*/b/*/d"
- // Partial means, if you run out of file before you run
- // out of pattern, then that's fine, as long as all
- // the parts match.
- Minimatch$1.prototype.matchOne = function (file, pattern, partial) {
- var options = this.options;
-
- this.debug('matchOne',
- { 'this': this, file: file, pattern: pattern });
-
- this.debug('matchOne', file.length, pattern.length);
-
- for (var fi = 0,
- pi = 0,
- fl = file.length,
- pl = pattern.length
- ; (fi < fl) && (pi < pl)
- ; fi++, pi++) {
- this.debug('matchOne loop');
- var p = pattern[pi];
- var f = file[fi];
-
- this.debug(pattern, p, f);
-
- // should be impossible.
- // some invalid regexp stuff in the set.
- /* istanbul ignore if */
- if (p === false) return false
-
- if (p === GLOBSTAR) {
- this.debug('GLOBSTAR', [pattern, p, f]);
-
- // "**"
- // a/**/b/**/c would match the following:
- // a/b/x/y/z/c
- // a/x/y/z/b/c
- // a/b/x/b/x/c
- // a/b/c
- // To do this, take the rest of the pattern after
- // the **, and see if it would match the file remainder.
- // If so, return success.
- // If not, the ** "swallows" a segment, and try again.
- // This is recursively awful.
- //
- // a/**/b/**/c matching a/b/x/y/z/c
- // - a matches a
- // - doublestar
- // - matchOne(b/x/y/z/c, b/**/c)
- // - b matches b
- // - doublestar
- // - matchOne(x/y/z/c, c) -> no
- // - matchOne(y/z/c, c) -> no
- // - matchOne(z/c, c) -> no
- // - matchOne(c, c) yes, hit
- var fr = fi;
- var pr = pi + 1;
- if (pr === pl) {
- this.debug('** at the end');
- // a ** at the end will just swallow the rest.
- // We have found a match.
- // however, it will not swallow /.x, unless
- // options.dot is set.
- // . and .. are *never* matched by **, for explosively
- // exponential reasons.
- for (; fi < fl; fi++) {
- if (file[fi] === '.' || file[fi] === '..' ||
- (!options.dot && file[fi].charAt(0) === '.')) return false
- }
- return true
- }
-
- // ok, let's see if we can swallow whatever we can.
- while (fr < fl) {
- var swallowee = file[fr];
-
- this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
-
- // XXX remove this slice. Just pass the start index.
- if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
- this.debug('globstar found match!', fr, fl, swallowee);
- // found a match.
- return true
- } else {
- // can't swallow "." or ".." ever.
- // can only swallow ".foo" when explicitly asked.
- if (swallowee === '.' || swallowee === '..' ||
- (!options.dot && swallowee.charAt(0) === '.')) {
- this.debug('dot detected!', file, fr, pattern, pr);
- break
- }
-
- // ** swallows a segment, and continue.
- this.debug('globstar swallow a segment, and continue');
- fr++;
- }
- }
-
- // no match was found.
- // However, in partial mode, we can't say this is necessarily over.
- // If there's more *pattern* left, then
- /* istanbul ignore if */
- if (partial) {
- // ran out of file
- this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
- if (fr === fl) return true
- }
- return false
- }
-
- // something other than **
- // non-magic patterns just have to match exactly
- // patterns with magic have been turned into regexps.
- var hit;
- if (typeof p === 'string') {
- hit = f === p;
- this.debug('string match', p, f, hit);
- } else {
- hit = f.match(p);
- this.debug('pattern match', p, f, hit);
- }
-
- if (!hit) return false
- }
-
- // Note: ending in / means that we'll get a final ""
- // at the end of the pattern. This can only match a
- // corresponding "" at the end of the file.
- // If the file ends in /, then it can only match a
- // a pattern that ends in /, unless the pattern just
- // doesn't have any more for it. But, a/b/ should *not*
- // match "a/b/*", even though "" matches against the
- // [^/]*? pattern, except in partial mode, where it might
- // simply not be reached yet.
- // However, a/b/ should still satisfy a/*
-
- // now either we fell off the end of the pattern, or we're done.
- if (fi === fl && pi === pl) {
- // ran out of pattern and filename at the same time.
- // an exact hit!
- return true
- } else if (fi === fl) {
- // ran out of file, but still had pattern left.
- // this is ok if we're doing the match as part of
- // a glob fs traversal.
- return partial
- } else /* istanbul ignore else */ if (pi === pl) {
- // ran out of pattern, still have file left.
- // this is only acceptable if we're on the very last
- // empty segment of a file with a trailing slash.
- // a/* should match a/b/
- return (fi === fl - 1) && (file[fi] === '')
- }
-
- // should be unreachable.
- /* istanbul ignore next */
- throw new Error('wtf?')
- };
-
- // replace stuff like \* with *
- function globUnescape (s) {
- return s.replace(/\\(.)/g, '$1')
- }
-
- function regExpEscape (s) {
- return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
- }
-
- var inherits_browser = createCommonjsModule(function (module) {
- if (typeof Object.create === 'function') {
- // implementation from standard node.js 'util' module
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- // old school shim for old browsers
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function () {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor();
- ctor.prototype.constructor = ctor;
- }
- };
- }
- }, "/$$rollup_base$$/node_modules/inherits");
-
- var inherits = createCommonjsModule(function (module) {
- try {
- var util = require$$0__default["default"];
- /* istanbul ignore next */
- if (typeof util.inherits !== 'function') throw '';
- module.exports = util.inherits;
- } catch (e) {
- /* istanbul ignore next */
- module.exports = inherits_browser;
- }
- }, "/$$rollup_base$$/node_modules/inherits");
-
- function posix(path) {
- return path.charAt(0) === '/';
- }
-
- function win32(path) {
- // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
- var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
- var result = splitDeviceRe.exec(path);
- var device = result[1] || '';
- var isUnc = Boolean(device && device.charAt(1) !== ':');
-
- // UNC paths are always absolute
- return Boolean(result[2] || isUnc);
- }
-
- var pathIsAbsolute = process.platform === 'win32' ? win32 : posix;
- var posix_1 = posix;
- var win32_1 = win32;
- pathIsAbsolute.posix = posix_1;
- pathIsAbsolute.win32 = win32_1;
-
- var setopts_1 = setopts$2;
- var ownProp_1 = ownProp$2;
- var makeAbs_1 = makeAbs;
- var finish_1 = finish;
- var mark_1 = mark;
- var isIgnored_1 = isIgnored$2;
- var childrenIgnored_1 = childrenIgnored$2;
-
- function ownProp$2 (obj, field) {
- return Object.prototype.hasOwnProperty.call(obj, field)
- }
-
-
-
-
-
- var Minimatch = minimatch_1.Minimatch;
-
- function alphasort (a, b) {
- return a.localeCompare(b, 'en')
- }
-
- function setupIgnores (self, options) {
- self.ignore = options.ignore || [];
-
- if (!Array.isArray(self.ignore))
- self.ignore = [self.ignore];
-
- if (self.ignore.length) {
- self.ignore = self.ignore.map(ignoreMap);
- }
- }
-
- // ignore patterns are always in dot:true mode.
- function ignoreMap (pattern) {
- var gmatcher = null;
- if (pattern.slice(-3) === '/**') {
- var gpattern = pattern.replace(/(\/\*\*)+$/, '');
- gmatcher = new Minimatch(gpattern, { dot: true });
- }
-
- return {
- matcher: new Minimatch(pattern, { dot: true }),
- gmatcher: gmatcher
- }
- }
-
- function setopts$2 (self, pattern, options) {
- if (!options)
- options = {};
-
- // base-matching: just use globstar for that.
- if (options.matchBase && -1 === pattern.indexOf("/")) {
- if (options.noglobstar) {
- throw new Error("base matching requires globstar")
- }
- pattern = "**/" + pattern;
- }
-
- self.silent = !!options.silent;
- self.pattern = pattern;
- self.strict = options.strict !== false;
- self.realpath = !!options.realpath;
- self.realpathCache = options.realpathCache || Object.create(null);
- self.follow = !!options.follow;
- self.dot = !!options.dot;
- self.mark = !!options.mark;
- self.nodir = !!options.nodir;
- if (self.nodir)
- self.mark = true;
- self.sync = !!options.sync;
- self.nounique = !!options.nounique;
- self.nonull = !!options.nonull;
- self.nosort = !!options.nosort;
- self.nocase = !!options.nocase;
- self.stat = !!options.stat;
- self.noprocess = !!options.noprocess;
- self.absolute = !!options.absolute;
- self.fs = options.fs || fs__default["default"];
-
- self.maxLength = options.maxLength || Infinity;
- self.cache = options.cache || Object.create(null);
- self.statCache = options.statCache || Object.create(null);
- self.symlinks = options.symlinks || Object.create(null);
-
- setupIgnores(self, options);
-
- self.changedCwd = false;
- var cwd = process.cwd();
- if (!ownProp$2(options, "cwd"))
- self.cwd = cwd;
- else {
- self.cwd = path__default["default"].resolve(options.cwd);
- self.changedCwd = self.cwd !== cwd;
- }
-
- self.root = options.root || path__default["default"].resolve(self.cwd, "/");
- self.root = path__default["default"].resolve(self.root);
- if (process.platform === "win32")
- self.root = self.root.replace(/\\/g, "/");
-
- // TODO: is an absolute `cwd` supposed to be resolved against `root`?
- // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
- self.cwdAbs = pathIsAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd);
- if (process.platform === "win32")
- self.cwdAbs = self.cwdAbs.replace(/\\/g, "/");
- self.nomount = !!options.nomount;
-
- // disable comments and negation in Minimatch.
- // Note that they are not supported in Glob itself anyway.
- options.nonegate = true;
- options.nocomment = true;
-
- self.minimatch = new Minimatch(pattern, options);
- self.options = self.minimatch.options;
- }
-
- function finish (self) {
- var nou = self.nounique;
- var all = nou ? [] : Object.create(null);
-
- for (var i = 0, l = self.matches.length; i < l; i ++) {
- var matches = self.matches[i];
- if (!matches || Object.keys(matches).length === 0) {
- if (self.nonull) {
- // do like the shell, and spit out the literal glob
- var literal = self.minimatch.globSet[i];
- if (nou)
- all.push(literal);
- else
- all[literal] = true;
- }
- } else {
- // had matches
- var m = Object.keys(matches);
- if (nou)
- all.push.apply(all, m);
- else
- m.forEach(function (m) {
- all[m] = true;
- });
- }
- }
-
- if (!nou)
- all = Object.keys(all);
-
- if (!self.nosort)
- all = all.sort(alphasort);
-
- // at *some* point we statted all of these
- if (self.mark) {
- for (var i = 0; i < all.length; i++) {
- all[i] = self._mark(all[i]);
- }
- if (self.nodir) {
- all = all.filter(function (e) {
- var notDir = !(/\/$/.test(e));
- var c = self.cache[e] || self.cache[makeAbs(self, e)];
- if (notDir && c)
- notDir = c !== 'DIR' && !Array.isArray(c);
- return notDir
- });
- }
- }
-
- if (self.ignore.length)
- all = all.filter(function(m) {
- return !isIgnored$2(self, m)
- });
-
- self.found = all;
- }
-
- function mark (self, p) {
- var abs = makeAbs(self, p);
- var c = self.cache[abs];
- var m = p;
- if (c) {
- var isDir = c === 'DIR' || Array.isArray(c);
- var slash = p.slice(-1) === '/';
-
- if (isDir && !slash)
- m += '/';
- else if (!isDir && slash)
- m = m.slice(0, -1);
-
- if (m !== p) {
- var mabs = makeAbs(self, m);
- self.statCache[mabs] = self.statCache[abs];
- self.cache[mabs] = self.cache[abs];
- }
- }
-
- return m
- }
-
- // lotta situps...
- function makeAbs (self, f) {
- var abs = f;
- if (f.charAt(0) === '/') {
- abs = path__default["default"].join(self.root, f);
- } else if (pathIsAbsolute(f) || f === '') {
- abs = f;
- } else if (self.changedCwd) {
- abs = path__default["default"].resolve(self.cwd, f);
- } else {
- abs = path__default["default"].resolve(f);
- }
-
- if (process.platform === 'win32')
- abs = abs.replace(/\\/g, '/');
-
- return abs
- }
-
-
- // Return true, if pattern ends with globstar '**', for the accompanying parent directory.
- // Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
- function isIgnored$2 (self, path) {
- if (!self.ignore.length)
- return false
-
- return self.ignore.some(function(item) {
- return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
- })
- }
-
- function childrenIgnored$2 (self, path) {
- if (!self.ignore.length)
- return false
-
- return self.ignore.some(function(item) {
- return !!(item.gmatcher && item.gmatcher.match(path))
- })
- }
-
- var common = {
- setopts: setopts_1,
- ownProp: ownProp_1,
- makeAbs: makeAbs_1,
- finish: finish_1,
- mark: mark_1,
- isIgnored: isIgnored_1,
- childrenIgnored: childrenIgnored_1
- };
-
- var require$$3 = glob_1;
-
- var sync = globSync;
- globSync.GlobSync = GlobSync$1;
-
-
-
- minimatch_1.Minimatch;
- require$$3.Glob;
-
-
-
-
-
- var setopts$1 = common.setopts;
- var ownProp$1 = common.ownProp;
- var childrenIgnored$1 = common.childrenIgnored;
- var isIgnored$1 = common.isIgnored;
-
- function globSync (pattern, options) {
- if (typeof options === 'function' || arguments.length === 3)
- throw new TypeError('callback provided to sync glob\n'+
- 'See: https://github.com/isaacs/node-glob/issues/167')
-
- return new GlobSync$1(pattern, options).found
- }
-
- function GlobSync$1 (pattern, options) {
- if (!pattern)
- throw new Error('must provide pattern')
-
- if (typeof options === 'function' || arguments.length === 3)
- throw new TypeError('callback provided to sync glob\n'+
- 'See: https://github.com/isaacs/node-glob/issues/167')
-
- if (!(this instanceof GlobSync$1))
- return new GlobSync$1(pattern, options)
-
- setopts$1(this, pattern, options);
-
- if (this.noprocess)
- return this
-
- var n = this.minimatch.set.length;
- this.matches = new Array(n);
- for (var i = 0; i < n; i ++) {
- this._process(this.minimatch.set[i], i, false);
- }
- this._finish();
- }
-
- GlobSync$1.prototype._finish = function () {
- assert__default["default"](this instanceof GlobSync$1);
- if (this.realpath) {
- var self = this;
- this.matches.forEach(function (matchset, index) {
- var set = self.matches[index] = Object.create(null);
- for (var p in matchset) {
- try {
- p = self._makeAbs(p);
- var real = fs_realpath.realpathSync(p, self.realpathCache);
- set[real] = true;
- } catch (er) {
- if (er.syscall === 'stat')
- set[self._makeAbs(p)] = true;
- else
- throw er
- }
- }
- });
- }
- common.finish(this);
- };
-
-
- GlobSync$1.prototype._process = function (pattern, index, inGlobStar) {
- assert__default["default"](this instanceof GlobSync$1);
-
- // Get the first [n] parts of pattern that are all strings.
- var n = 0;
- while (typeof pattern[n] === 'string') {
- n ++;
- }
- // now n is the index of the first one that is *not* a string.
-
- // See if there's anything else
- var prefix;
- switch (n) {
- // if not, then this is rather simple
- case pattern.length:
- this._processSimple(pattern.join('/'), index);
- return
-
- case 0:
- // pattern *starts* with some non-trivial item.
- // going to readdir(cwd), but not include the prefix in matches.
- prefix = null;
- break
-
- default:
- // pattern has some string bits in the front.
- // whatever it starts with, whether that's 'absolute' like /foo/bar,
- // or 'relative' like '../baz'
- prefix = pattern.slice(0, n).join('/');
- break
- }
-
- var remain = pattern.slice(n);
-
- // get the list of entries.
- var read;
- if (prefix === null)
- read = '.';
- else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) {
- if (!prefix || !pathIsAbsolute(prefix))
- prefix = '/' + prefix;
- read = prefix;
- } else
- read = prefix;
-
- var abs = this._makeAbs(read);
-
- //if ignored, skip processing
- if (childrenIgnored$1(this, read))
- return
-
- var isGlobStar = remain[0] === minimatch_1.GLOBSTAR;
- if (isGlobStar)
- this._processGlobStar(prefix, read, abs, remain, index, inGlobStar);
- else
- this._processReaddir(prefix, read, abs, remain, index, inGlobStar);
- };
-
-
- GlobSync$1.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
- var entries = this._readdir(abs, inGlobStar);
-
- // if the abs isn't a dir, then nothing can match!
- if (!entries)
- return
-
- // It will only match dot entries if it starts with a dot, or if
- // dot is set. Stuff like @(.foo|.bar) isn't allowed.
- var pn = remain[0];
- var negate = !!this.minimatch.negate;
- var rawGlob = pn._glob;
- var dotOk = this.dot || rawGlob.charAt(0) === '.';
-
- var matchedEntries = [];
- for (var i = 0; i < entries.length; i++) {
- var e = entries[i];
- if (e.charAt(0) !== '.' || dotOk) {
- var m;
- if (negate && !prefix) {
- m = !e.match(pn);
- } else {
- m = e.match(pn);
- }
- if (m)
- matchedEntries.push(e);
- }
- }
-
- var len = matchedEntries.length;
- // If there are no matched entries, then nothing matches.
- if (len === 0)
- return
-
- // if this is the last remaining pattern bit, then no need for
- // an additional stat *unless* the user has specified mark or
- // stat explicitly. We know they exist, since readdir returned
- // them.
-
- if (remain.length === 1 && !this.mark && !this.stat) {
- if (!this.matches[index])
- this.matches[index] = Object.create(null);
-
- for (var i = 0; i < len; i ++) {
- var e = matchedEntries[i];
- if (prefix) {
- if (prefix.slice(-1) !== '/')
- e = prefix + '/' + e;
- else
- e = prefix + e;
- }
-
- if (e.charAt(0) === '/' && !this.nomount) {
- e = path__default["default"].join(this.root, e);
- }
- this._emitMatch(index, e);
- }
- // This was the last one, and no stats were needed
- return
- }
-
- // now test all matched entries as stand-ins for that part
- // of the pattern.
- remain.shift();
- for (var i = 0; i < len; i ++) {
- var e = matchedEntries[i];
- var newPattern;
- if (prefix)
- newPattern = [prefix, e];
- else
- newPattern = [e];
- this._process(newPattern.concat(remain), index, inGlobStar);
- }
- };
-
-
- GlobSync$1.prototype._emitMatch = function (index, e) {
- if (isIgnored$1(this, e))
- return
-
- var abs = this._makeAbs(e);
-
- if (this.mark)
- e = this._mark(e);
-
- if (this.absolute) {
- e = abs;
- }
-
- if (this.matches[index][e])
- return
-
- if (this.nodir) {
- var c = this.cache[abs];
- if (c === 'DIR' || Array.isArray(c))
- return
- }
-
- this.matches[index][e] = true;
-
- if (this.stat)
- this._stat(e);
- };
-
-
- GlobSync$1.prototype._readdirInGlobStar = function (abs) {
- // follow all symlinked directories forever
- // just proceed as if this is a non-globstar situation
- if (this.follow)
- return this._readdir(abs, false)
-
- var entries;
- var lstat;
- try {
- lstat = this.fs.lstatSync(abs);
- } catch (er) {
- if (er.code === 'ENOENT') {
- // lstat failed, doesn't exist
- return null
- }
- }
-
- var isSym = lstat && lstat.isSymbolicLink();
- this.symlinks[abs] = isSym;
-
- // If it's not a symlink or a dir, then it's definitely a regular file.
- // don't bother doing a readdir in that case.
- if (!isSym && lstat && !lstat.isDirectory())
- this.cache[abs] = 'FILE';
- else
- entries = this._readdir(abs, false);
-
- return entries
- };
-
- GlobSync$1.prototype._readdir = function (abs, inGlobStar) {
-
- if (inGlobStar && !ownProp$1(this.symlinks, abs))
- return this._readdirInGlobStar(abs)
-
- if (ownProp$1(this.cache, abs)) {
- var c = this.cache[abs];
- if (!c || c === 'FILE')
- return null
-
- if (Array.isArray(c))
- return c
- }
-
- try {
- return this._readdirEntries(abs, this.fs.readdirSync(abs))
- } catch (er) {
- this._readdirError(abs, er);
- return null
- }
- };
-
- GlobSync$1.prototype._readdirEntries = function (abs, entries) {
- // if we haven't asked to stat everything, then just
- // assume that everything in there exists, so we can avoid
- // having to stat it a second time.
- if (!this.mark && !this.stat) {
- for (var i = 0; i < entries.length; i ++) {
- var e = entries[i];
- if (abs === '/')
- e = abs + e;
- else
- e = abs + '/' + e;
- this.cache[e] = true;
- }
- }
-
- this.cache[abs] = entries;
-
- // mark and cache dir-ness
- return entries
- };
-
- GlobSync$1.prototype._readdirError = function (f, er) {
- // handle errors, and cache the information
- switch (er.code) {
- case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
- case 'ENOTDIR': // totally normal. means it *does* exist.
- var abs = this._makeAbs(f);
- this.cache[abs] = 'FILE';
- if (abs === this.cwdAbs) {
- var error = new Error(er.code + ' invalid cwd ' + this.cwd);
- error.path = this.cwd;
- error.code = er.code;
- throw error
- }
- break
-
- case 'ENOENT': // not terribly unusual
- case 'ELOOP':
- case 'ENAMETOOLONG':
- case 'UNKNOWN':
- this.cache[this._makeAbs(f)] = false;
- break
-
- default: // some unusual error. Treat as failure.
- this.cache[this._makeAbs(f)] = false;
- if (this.strict)
- throw er
- if (!this.silent)
- console.error('glob error', er);
- break
- }
- };
-
- GlobSync$1.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
-
- var entries = this._readdir(abs, inGlobStar);
-
- // no entries means not a dir, so it can never have matches
- // foo.txt/** doesn't match foo.txt
- if (!entries)
- return
-
- // test without the globstar, and with every child both below
- // and replacing the globstar.
- var remainWithoutGlobStar = remain.slice(1);
- var gspref = prefix ? [ prefix ] : [];
- var noGlobStar = gspref.concat(remainWithoutGlobStar);
-
- // the noGlobStar pattern exits the inGlobStar state
- this._process(noGlobStar, index, false);
-
- var len = entries.length;
- var isSym = this.symlinks[abs];
-
- // If it's a symlink, and we're in a globstar, then stop
- if (isSym && inGlobStar)
- return
-
- for (var i = 0; i < len; i++) {
- var e = entries[i];
- if (e.charAt(0) === '.' && !this.dot)
- continue
-
- // these two cases enter the inGlobStar state
- var instead = gspref.concat(entries[i], remainWithoutGlobStar);
- this._process(instead, index, true);
-
- var below = gspref.concat(entries[i], remain);
- this._process(below, index, true);
- }
- };
-
- GlobSync$1.prototype._processSimple = function (prefix, index) {
- // XXX review this. Shouldn't it be doing the mounting etc
- // before doing stat? kinda weird?
- var exists = this._stat(prefix);
-
- if (!this.matches[index])
- this.matches[index] = Object.create(null);
-
- // If it doesn't exist, then just mark the lack of results
- if (!exists)
- return
-
- if (prefix && pathIsAbsolute(prefix) && !this.nomount) {
- var trail = /[\/\\]$/.test(prefix);
- if (prefix.charAt(0) === '/') {
- prefix = path__default["default"].join(this.root, prefix);
- } else {
- prefix = path__default["default"].resolve(this.root, prefix);
- if (trail)
- prefix += '/';
- }
- }
-
- if (process.platform === 'win32')
- prefix = prefix.replace(/\\/g, '/');
-
- // Mark this as a match
- this._emitMatch(index, prefix);
- };
-
- // Returns either 'DIR', 'FILE', or false
- GlobSync$1.prototype._stat = function (f) {
- var abs = this._makeAbs(f);
- var needDir = f.slice(-1) === '/';
-
- if (f.length > this.maxLength)
- return false
-
- if (!this.stat && ownProp$1(this.cache, abs)) {
- var c = this.cache[abs];
-
- if (Array.isArray(c))
- c = 'DIR';
-
- // It exists, but maybe not how we need it
- if (!needDir || c === 'DIR')
- return c
-
- if (needDir && c === 'FILE')
- return false
-
- // otherwise we have to stat, because maybe c=true
- // if we know it exists, but not what it is.
- }
- var stat = this.statCache[abs];
- if (!stat) {
- var lstat;
- try {
- lstat = this.fs.lstatSync(abs);
- } catch (er) {
- if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
- this.statCache[abs] = false;
- return false
- }
- }
-
- if (lstat && lstat.isSymbolicLink()) {
- try {
- stat = this.fs.statSync(abs);
- } catch (er) {
- stat = lstat;
- }
- } else {
- stat = lstat;
- }
- }
-
- this.statCache[abs] = stat;
-
- var c = true;
- if (stat)
- c = stat.isDirectory() ? 'DIR' : 'FILE';
-
- this.cache[abs] = this.cache[abs] || c;
-
- if (needDir && c === 'FILE')
- return false
-
- return c
- };
-
- GlobSync$1.prototype._mark = function (p) {
- return common.mark(this, p)
- };
-
- GlobSync$1.prototype._makeAbs = function (f) {
- return common.makeAbs(this, f)
- };
-
- // Returns a wrapper function that returns a wrapped callback
- // The wrapper function should do some stuff, and return a
- // presumably different callback function.
- // This makes sure that own properties are retained, so that
- // decorations and such are not lost along the way.
- var wrappy_1 = wrappy;
- function wrappy (fn, cb) {
- if (fn && cb) return wrappy(fn)(cb)
-
- if (typeof fn !== 'function')
- throw new TypeError('need wrapper function')
-
- Object.keys(fn).forEach(function (k) {
- wrapper[k] = fn[k];
- });
-
- return wrapper
-
- function wrapper() {
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i];
- }
- var ret = fn.apply(this, args);
- var cb = args[args.length-1];
- if (typeof ret === 'function' && ret !== cb) {
- Object.keys(cb).forEach(function (k) {
- ret[k] = cb[k];
- });
- }
- return ret
- }
- }
-
- var once_1 = wrappy_1(once);
- var strict = wrappy_1(onceStrict);
-
- once.proto = once(function () {
- Object.defineProperty(Function.prototype, 'once', {
- value: function () {
- return once(this)
- },
- configurable: true
- });
-
- Object.defineProperty(Function.prototype, 'onceStrict', {
- value: function () {
- return onceStrict(this)
- },
- configurable: true
- });
- });
-
- function once (fn) {
- var f = function () {
- if (f.called) return f.value
- f.called = true;
- return f.value = fn.apply(this, arguments)
- };
- f.called = false;
- return f
- }
-
- function onceStrict (fn) {
- var f = function () {
- if (f.called)
- throw new Error(f.onceError)
- f.called = true;
- return f.value = fn.apply(this, arguments)
- };
- var name = fn.name || 'Function wrapped with `once`';
- f.onceError = name + " shouldn't be called more than once";
- f.called = false;
- return f
- }
- once_1.strict = strict;
-
- var reqs = Object.create(null);
-
-
- var inflight_1 = wrappy_1(inflight);
-
- function inflight (key, cb) {
- if (reqs[key]) {
- reqs[key].push(cb);
- return null
- } else {
- reqs[key] = [cb];
- return makeres(key)
- }
- }
-
- function makeres (key) {
- return once_1(function RES () {
- var cbs = reqs[key];
- var len = cbs.length;
- var args = slice(arguments);
-
- // XXX It's somewhat ambiguous whether a new callback added in this
- // pass should be queued for later execution if something in the
- // list of callbacks throws, or if it should just be discarded.
- // However, it's such an edge case that it hardly matters, and either
- // choice is likely as surprising as the other.
- // As it happens, we do go ahead and schedule it for later execution.
- try {
- for (var i = 0; i < len; i++) {
- cbs[i].apply(null, args);
- }
- } finally {
- if (cbs.length > len) {
- // added more in the interim.
- // de-zalgo, just in case, but don't call again.
- cbs.splice(0, len);
- process.nextTick(function () {
- RES.apply(null, args);
- });
- } else {
- delete reqs[key];
- }
- }
- })
- }
-
- function slice (args) {
- var length = args.length;
- var array = [];
-
- for (var i = 0; i < length; i++) array[i] = args[i];
- return array
- }
-
- // Approach:
- //
- // 1. Get the minimatch set
- // 2. For each pattern in the set, PROCESS(pattern, false)
- // 3. Store matches per-set, then uniq them
- //
- // PROCESS(pattern, inGlobStar)
- // Get the first [n] items from pattern that are all strings
- // Join these together. This is PREFIX.
- // If there is no more remaining, then stat(PREFIX) and
- // add to matches if it succeeds. END.
- //
- // If inGlobStar and PREFIX is symlink and points to dir
- // set ENTRIES = []
- // else readdir(PREFIX) as ENTRIES
- // If fail, END
- //
- // with ENTRIES
- // If pattern[n] is GLOBSTAR
- // // handle the case where the globstar match is empty
- // // by pruning it out, and testing the resulting pattern
- // PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
- // // handle other cases.
- // for ENTRY in ENTRIES (not dotfiles)
- // // attach globstar + tail onto the entry
- // // Mark that this entry is a globstar match
- // PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
- //
- // else // not globstar
- // for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
- // Test ENTRY against pattern[n]
- // If fails, continue
- // If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
- //
- // Caveat:
- // Cache all stats and readdirs results to minimize syscall. Since all
- // we ever care about is existence and directory-ness, we can just keep
- // `true` for files, and [children,...] for directories, or `false` for
- // things that don't exist.
-
- var glob_1 = glob;
-
-
-
- minimatch_1.Minimatch;
-
- var EE = require$$0__default$1["default"].EventEmitter;
-
-
-
-
-
- var setopts = common.setopts;
- var ownProp = common.ownProp;
-
-
- var childrenIgnored = common.childrenIgnored;
- var isIgnored = common.isIgnored;
-
-
-
- function glob (pattern, options, cb) {
- if (typeof options === 'function') cb = options, options = {};
- if (!options) options = {};
-
- if (options.sync) {
- if (cb)
- throw new TypeError('callback provided to sync glob')
- return sync(pattern, options)
- }
-
- return new Glob(pattern, options, cb)
- }
-
- glob.sync = sync;
- var GlobSync = glob.GlobSync = sync.GlobSync;
-
- // old api surface
- glob.glob = glob;
-
- function extend (origin, add) {
- if (add === null || typeof add !== 'object') {
- return origin
- }
-
- var keys = Object.keys(add);
- var i = keys.length;
- while (i--) {
- origin[keys[i]] = add[keys[i]];
- }
- return origin
- }
-
- glob.hasMagic = function (pattern, options_) {
- var options = extend({}, options_);
- options.noprocess = true;
-
- var g = new Glob(pattern, options);
- var set = g.minimatch.set;
-
- if (!pattern)
- return false
-
- if (set.length > 1)
- return true
-
- for (var j = 0; j < set[0].length; j++) {
- if (typeof set[0][j] !== 'string')
- return true
- }
-
- return false
- };
-
- glob.Glob = Glob;
- inherits(Glob, EE);
- function Glob (pattern, options, cb) {
- if (typeof options === 'function') {
- cb = options;
- options = null;
- }
-
- if (options && options.sync) {
- if (cb)
- throw new TypeError('callback provided to sync glob')
- return new GlobSync(pattern, options)
- }
-
- if (!(this instanceof Glob))
- return new Glob(pattern, options, cb)
-
- setopts(this, pattern, options);
- this._didRealPath = false;
-
- // process each pattern in the minimatch set
- var n = this.minimatch.set.length;
-
- // The matches are stored as {<filename>: true,...} so that
- // duplicates are automagically pruned.
- // Later, we do an Object.keys() on these.
- // Keep them as a list so we can fill in when nonull is set.
- this.matches = new Array(n);
-
- if (typeof cb === 'function') {
- cb = once_1(cb);
- this.on('error', cb);
- this.on('end', function (matches) {
- cb(null, matches);
- });
- }
-
- var self = this;
- this._processing = 0;
-
- this._emitQueue = [];
- this._processQueue = [];
- this.paused = false;
-
- if (this.noprocess)
- return this
-
- if (n === 0)
- return done()
-
- var sync = true;
- for (var i = 0; i < n; i ++) {
- this._process(this.minimatch.set[i], i, false, done);
- }
- sync = false;
-
- function done () {
- --self._processing;
- if (self._processing <= 0) {
- if (sync) {
- process.nextTick(function () {
- self._finish();
- });
- } else {
- self._finish();
- }
- }
- }
- }
-
- Glob.prototype._finish = function () {
- assert__default["default"](this instanceof Glob);
- if (this.aborted)
- return
-
- if (this.realpath && !this._didRealpath)
- return this._realpath()
-
- common.finish(this);
- this.emit('end', this.found);
- };
-
- Glob.prototype._realpath = function () {
- if (this._didRealpath)
- return
-
- this._didRealpath = true;
-
- var n = this.matches.length;
- if (n === 0)
- return this._finish()
-
- var self = this;
- for (var i = 0; i < this.matches.length; i++)
- this._realpathSet(i, next);
-
- function next () {
- if (--n === 0)
- self._finish();
- }
- };
-
- Glob.prototype._realpathSet = function (index, cb) {
- var matchset = this.matches[index];
- if (!matchset)
- return cb()
-
- var found = Object.keys(matchset);
- var self = this;
- var n = found.length;
-
- if (n === 0)
- return cb()
-
- var set = this.matches[index] = Object.create(null);
- found.forEach(function (p, i) {
- // If there's a problem with the stat, then it means that
- // one or more of the links in the realpath couldn't be
- // resolved. just return the abs value in that case.
- p = self._makeAbs(p);
- fs_realpath.realpath(p, self.realpathCache, function (er, real) {
- if (!er)
- set[real] = true;
- else if (er.syscall === 'stat')
- set[p] = true;
- else
- self.emit('error', er); // srsly wtf right here
-
- if (--n === 0) {
- self.matches[index] = set;
- cb();
- }
- });
- });
- };
-
- Glob.prototype._mark = function (p) {
- return common.mark(this, p)
- };
-
- Glob.prototype._makeAbs = function (f) {
- return common.makeAbs(this, f)
- };
-
- Glob.prototype.abort = function () {
- this.aborted = true;
- this.emit('abort');
- };
-
- Glob.prototype.pause = function () {
- if (!this.paused) {
- this.paused = true;
- this.emit('pause');
- }
- };
-
- Glob.prototype.resume = function () {
- if (this.paused) {
- this.emit('resume');
- this.paused = false;
- if (this._emitQueue.length) {
- var eq = this._emitQueue.slice(0);
- this._emitQueue.length = 0;
- for (var i = 0; i < eq.length; i ++) {
- var e = eq[i];
- this._emitMatch(e[0], e[1]);
- }
- }
- if (this._processQueue.length) {
- var pq = this._processQueue.slice(0);
- this._processQueue.length = 0;
- for (var i = 0; i < pq.length; i ++) {
- var p = pq[i];
- this._processing--;
- this._process(p[0], p[1], p[2], p[3]);
- }
- }
- }
- };
-
- Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
- assert__default["default"](this instanceof Glob);
- assert__default["default"](typeof cb === 'function');
-
- if (this.aborted)
- return
-
- this._processing++;
- if (this.paused) {
- this._processQueue.push([pattern, index, inGlobStar, cb]);
- return
- }
-
- //console.error('PROCESS %d', this._processing, pattern)
-
- // Get the first [n] parts of pattern that are all strings.
- var n = 0;
- while (typeof pattern[n] === 'string') {
- n ++;
- }
- // now n is the index of the first one that is *not* a string.
-
- // see if there's anything else
- var prefix;
- switch (n) {
- // if not, then this is rather simple
- case pattern.length:
- this._processSimple(pattern.join('/'), index, cb);
- return
-
- case 0:
- // pattern *starts* with some non-trivial item.
- // going to readdir(cwd), but not include the prefix in matches.
- prefix = null;
- break
-
- default:
- // pattern has some string bits in the front.
- // whatever it starts with, whether that's 'absolute' like /foo/bar,
- // or 'relative' like '../baz'
- prefix = pattern.slice(0, n).join('/');
- break
- }
-
- var remain = pattern.slice(n);
-
- // get the list of entries.
- var read;
- if (prefix === null)
- read = '.';
- else if (pathIsAbsolute(prefix) || pathIsAbsolute(pattern.join('/'))) {
- if (!prefix || !pathIsAbsolute(prefix))
- prefix = '/' + prefix;
- read = prefix;
- } else
- read = prefix;
-
- var abs = this._makeAbs(read);
-
- //if ignored, skip _processing
- if (childrenIgnored(this, read))
- return cb()
-
- var isGlobStar = remain[0] === minimatch_1.GLOBSTAR;
- if (isGlobStar)
- this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb);
- else
- this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb);
- };
-
- Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
- var self = this;
- this._readdir(abs, inGlobStar, function (er, entries) {
- return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
- });
- };
-
- Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
-
- // if the abs isn't a dir, then nothing can match!
- if (!entries)
- return cb()
-
- // It will only match dot entries if it starts with a dot, or if
- // dot is set. Stuff like @(.foo|.bar) isn't allowed.
- var pn = remain[0];
- var negate = !!this.minimatch.negate;
- var rawGlob = pn._glob;
- var dotOk = this.dot || rawGlob.charAt(0) === '.';
-
- var matchedEntries = [];
- for (var i = 0; i < entries.length; i++) {
- var e = entries[i];
- if (e.charAt(0) !== '.' || dotOk) {
- var m;
- if (negate && !prefix) {
- m = !e.match(pn);
- } else {
- m = e.match(pn);
- }
- if (m)
- matchedEntries.push(e);
- }
- }
-
- //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
-
- var len = matchedEntries.length;
- // If there are no matched entries, then nothing matches.
- if (len === 0)
- return cb()
-
- // if this is the last remaining pattern bit, then no need for
- // an additional stat *unless* the user has specified mark or
- // stat explicitly. We know they exist, since readdir returned
- // them.
-
- if (remain.length === 1 && !this.mark && !this.stat) {
- if (!this.matches[index])
- this.matches[index] = Object.create(null);
-
- for (var i = 0; i < len; i ++) {
- var e = matchedEntries[i];
- if (prefix) {
- if (prefix !== '/')
- e = prefix + '/' + e;
- else
- e = prefix + e;
- }
-
- if (e.charAt(0) === '/' && !this.nomount) {
- e = path__default["default"].join(this.root, e);
- }
- this._emitMatch(index, e);
- }
- // This was the last one, and no stats were needed
- return cb()
- }
-
- // now test all matched entries as stand-ins for that part
- // of the pattern.
- remain.shift();
- for (var i = 0; i < len; i ++) {
- var e = matchedEntries[i];
- if (prefix) {
- if (prefix !== '/')
- e = prefix + '/' + e;
- else
- e = prefix + e;
- }
- this._process([e].concat(remain), index, inGlobStar, cb);
- }
- cb();
- };
-
- Glob.prototype._emitMatch = function (index, e) {
- if (this.aborted)
- return
-
- if (isIgnored(this, e))
- return
-
- if (this.paused) {
- this._emitQueue.push([index, e]);
- return
- }
-
- var abs = pathIsAbsolute(e) ? e : this._makeAbs(e);
-
- if (this.mark)
- e = this._mark(e);
-
- if (this.absolute)
- e = abs;
-
- if (this.matches[index][e])
- return
-
- if (this.nodir) {
- var c = this.cache[abs];
- if (c === 'DIR' || Array.isArray(c))
- return
- }
-
- this.matches[index][e] = true;
-
- var st = this.statCache[abs];
- if (st)
- this.emit('stat', e, st);
-
- this.emit('match', e);
- };
-
- Glob.prototype._readdirInGlobStar = function (abs, cb) {
- if (this.aborted)
- return
-
- // follow all symlinked directories forever
- // just proceed as if this is a non-globstar situation
- if (this.follow)
- return this._readdir(abs, false, cb)
-
- var lstatkey = 'lstat\0' + abs;
- var self = this;
- var lstatcb = inflight_1(lstatkey, lstatcb_);
-
- if (lstatcb)
- self.fs.lstat(abs, lstatcb);
-
- function lstatcb_ (er, lstat) {
- if (er && er.code === 'ENOENT')
- return cb()
-
- var isSym = lstat && lstat.isSymbolicLink();
- self.symlinks[abs] = isSym;
-
- // If it's not a symlink or a dir, then it's definitely a regular file.
- // don't bother doing a readdir in that case.
- if (!isSym && lstat && !lstat.isDirectory()) {
- self.cache[abs] = 'FILE';
- cb();
- } else
- self._readdir(abs, false, cb);
- }
- };
-
- Glob.prototype._readdir = function (abs, inGlobStar, cb) {
- if (this.aborted)
- return
-
- cb = inflight_1('readdir\0'+abs+'\0'+inGlobStar, cb);
- if (!cb)
- return
-
- //console.error('RD %j %j', +inGlobStar, abs)
- if (inGlobStar && !ownProp(this.symlinks, abs))
- return this._readdirInGlobStar(abs, cb)
-
- if (ownProp(this.cache, abs)) {
- var c = this.cache[abs];
- if (!c || c === 'FILE')
- return cb()
-
- if (Array.isArray(c))
- return cb(null, c)
- }
-
- var self = this;
- self.fs.readdir(abs, readdirCb(this, abs, cb));
- };
-
- function readdirCb (self, abs, cb) {
- return function (er, entries) {
- if (er)
- self._readdirError(abs, er, cb);
- else
- self._readdirEntries(abs, entries, cb);
- }
- }
-
- Glob.prototype._readdirEntries = function (abs, entries, cb) {
- if (this.aborted)
- return
-
- // if we haven't asked to stat everything, then just
- // assume that everything in there exists, so we can avoid
- // having to stat it a second time.
- if (!this.mark && !this.stat) {
- for (var i = 0; i < entries.length; i ++) {
- var e = entries[i];
- if (abs === '/')
- e = abs + e;
- else
- e = abs + '/' + e;
- this.cache[e] = true;
- }
- }
-
- this.cache[abs] = entries;
- return cb(null, entries)
- };
-
- Glob.prototype._readdirError = function (f, er, cb) {
- if (this.aborted)
- return
-
- // handle errors, and cache the information
- switch (er.code) {
- case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
- case 'ENOTDIR': // totally normal. means it *does* exist.
- var abs = this._makeAbs(f);
- this.cache[abs] = 'FILE';
- if (abs === this.cwdAbs) {
- var error = new Error(er.code + ' invalid cwd ' + this.cwd);
- error.path = this.cwd;
- error.code = er.code;
- this.emit('error', error);
- this.abort();
- }
- break
-
- case 'ENOENT': // not terribly unusual
- case 'ELOOP':
- case 'ENAMETOOLONG':
- case 'UNKNOWN':
- this.cache[this._makeAbs(f)] = false;
- break
-
- default: // some unusual error. Treat as failure.
- this.cache[this._makeAbs(f)] = false;
- if (this.strict) {
- this.emit('error', er);
- // If the error is handled, then we abort
- // if not, we threw out of here
- this.abort();
- }
- if (!this.silent)
- console.error('glob error', er);
- break
- }
-
- return cb()
- };
-
- Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
- var self = this;
- this._readdir(abs, inGlobStar, function (er, entries) {
- self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb);
- });
- };
-
-
- Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
- //console.error('pgs2', prefix, remain[0], entries)
-
- // no entries means not a dir, so it can never have matches
- // foo.txt/** doesn't match foo.txt
- if (!entries)
- return cb()
-
- // test without the globstar, and with every child both below
- // and replacing the globstar.
- var remainWithoutGlobStar = remain.slice(1);
- var gspref = prefix ? [ prefix ] : [];
- var noGlobStar = gspref.concat(remainWithoutGlobStar);
-
- // the noGlobStar pattern exits the inGlobStar state
- this._process(noGlobStar, index, false, cb);
-
- var isSym = this.symlinks[abs];
- var len = entries.length;
-
- // If it's a symlink, and we're in a globstar, then stop
- if (isSym && inGlobStar)
- return cb()
-
- for (var i = 0; i < len; i++) {
- var e = entries[i];
- if (e.charAt(0) === '.' && !this.dot)
- continue
-
- // these two cases enter the inGlobStar state
- var instead = gspref.concat(entries[i], remainWithoutGlobStar);
- this._process(instead, index, true, cb);
-
- var below = gspref.concat(entries[i], remain);
- this._process(below, index, true, cb);
- }
-
- cb();
- };
-
- Glob.prototype._processSimple = function (prefix, index, cb) {
- // XXX review this. Shouldn't it be doing the mounting etc
- // before doing stat? kinda weird?
- var self = this;
- this._stat(prefix, function (er, exists) {
- self._processSimple2(prefix, index, er, exists, cb);
- });
- };
- Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
-
- //console.error('ps2', prefix, exists)
-
- if (!this.matches[index])
- this.matches[index] = Object.create(null);
-
- // If it doesn't exist, then just mark the lack of results
- if (!exists)
- return cb()
-
- if (prefix && pathIsAbsolute(prefix) && !this.nomount) {
- var trail = /[\/\\]$/.test(prefix);
- if (prefix.charAt(0) === '/') {
- prefix = path__default["default"].join(this.root, prefix);
- } else {
- prefix = path__default["default"].resolve(this.root, prefix);
- if (trail)
- prefix += '/';
- }
- }
-
- if (process.platform === 'win32')
- prefix = prefix.replace(/\\/g, '/');
-
- // Mark this as a match
- this._emitMatch(index, prefix);
- cb();
- };
-
- // Returns either 'DIR', 'FILE', or false
- Glob.prototype._stat = function (f, cb) {
- var abs = this._makeAbs(f);
- var needDir = f.slice(-1) === '/';
-
- if (f.length > this.maxLength)
- return cb()
-
- if (!this.stat && ownProp(this.cache, abs)) {
- var c = this.cache[abs];
-
- if (Array.isArray(c))
- c = 'DIR';
-
- // It exists, but maybe not how we need it
- if (!needDir || c === 'DIR')
- return cb(null, c)
-
- if (needDir && c === 'FILE')
- return cb()
-
- // otherwise we have to stat, because maybe c=true
- // if we know it exists, but not what it is.
- }
- var stat = this.statCache[abs];
- if (stat !== undefined) {
- if (stat === false)
- return cb(null, stat)
- else {
- var type = stat.isDirectory() ? 'DIR' : 'FILE';
- if (needDir && type === 'FILE')
- return cb()
- else
- return cb(null, type, stat)
- }
- }
-
- var self = this;
- var statcb = inflight_1('stat\0' + abs, lstatcb_);
- if (statcb)
- self.fs.lstat(abs, statcb);
-
- function lstatcb_ (er, lstat) {
- if (lstat && lstat.isSymbolicLink()) {
- // If it's a symlink, then treat it as the target, unless
- // the target does not exist, then treat it as a file.
- return self.fs.stat(abs, function (er, stat) {
- if (er)
- self._stat2(f, abs, null, lstat, cb);
- else
- self._stat2(f, abs, er, stat, cb);
- })
- } else {
- self._stat2(f, abs, er, lstat, cb);
- }
- }
- };
-
- Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
- if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
- this.statCache[abs] = false;
- return cb()
- }
-
- var needDir = f.slice(-1) === '/';
- this.statCache[abs] = stat;
-
- if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
- return cb(null, false, stat)
-
- var c = true;
- if (stat)
- c = stat.isDirectory() ? 'DIR' : 'FILE';
- this.cache[abs] = this.cache[abs] || c;
-
- if (needDir && c === 'FILE')
- return cb()
-
- return cb(null, c, stat)
- };
-
- var spawn = childProcess__default["default"].spawn;
- var exec = childProcess__default["default"].exec;
-
- var treeKill = function (pid, signal, callback) {
- if (typeof signal === 'function' && callback === undefined) {
- callback = signal;
- signal = undefined;
- }
-
- pid = parseInt(pid);
- if (Number.isNaN(pid)) {
- if (callback) {
- return callback(new Error("pid must be a number"));
- } else {
- throw new Error("pid must be a number");
- }
- }
-
- var tree = {};
- var pidsToProcess = {};
- tree[pid] = [];
- pidsToProcess[pid] = 1;
-
- switch (process.platform) {
- case 'win32':
- exec('taskkill /pid ' + pid + ' /T /F', callback);
- break;
- case 'darwin':
- buildProcessTree(pid, tree, pidsToProcess, function (parentPid) {
- return spawn('pgrep', ['-P', parentPid]);
- }, function () {
- killAll(tree, signal, callback);
- });
- break;
- // case 'sunos':
- // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () {
- // killAll(tree, signal, callback);
- // });
- // break;
- default: // Linux
- buildProcessTree(pid, tree, pidsToProcess, function (parentPid) {
- return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]);
- }, function () {
- killAll(tree, signal, callback);
- });
- break;
- }
- };
-
- function killAll (tree, signal, callback) {
- var killed = {};
- try {
- Object.keys(tree).forEach(function (pid) {
- tree[pid].forEach(function (pidpid) {
- if (!killed[pidpid]) {
- killPid(pidpid, signal);
- killed[pidpid] = 1;
- }
- });
- if (!killed[pid]) {
- killPid(pid, signal);
- killed[pid] = 1;
- }
- });
- } catch (err) {
- if (callback) {
- return callback(err);
- } else {
- throw err;
- }
- }
- if (callback) {
- return callback();
- }
- }
-
- function killPid(pid, signal) {
- try {
- process.kill(parseInt(pid, 10), signal);
- }
- catch (err) {
- if (err.code !== 'ESRCH') throw err;
- }
- }
-
- function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) {
- var ps = spawnChildProcessesList(parentPid);
- var allData = '';
- ps.stdout.on('data', function (data) {
- var data = data.toString('ascii');
- allData += data;
- });
-
- var onClose = function (code) {
- delete pidsToProcess[parentPid];
-
- if (code != 0) {
- // no more parent processes
- if (Object.keys(pidsToProcess).length == 0) {
- cb();
- }
- return;
- }
-
- allData.match(/\d+/g).forEach(function (pid) {
- pid = parseInt(pid, 10);
- tree[parentPid].push(pid);
- tree[pid] = [];
- pidsToProcess[pid] = 1;
- buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb);
- });
- };
-
- ps.on('close', onClose);
- }
-
- commonjsGlobal.env = process.env;
- commonjsGlobal.env.NODE_ENV = commonjsGlobal.env.NODE_ENV || 'development';
-
- const fs = fs__default["default"];
-
-
- var any = bbhverse.any;
- var Tasq = bbhverse.Tasq;
- var statuslog = bbhverse.Traq;
- var Traq = bbhverse.Traq;
- Tasq.addlistener(statuslog.statuslog);
- // fs.writeFileSync('run.log', ', ' + JSON.stringify( { m : 'Hello'} ), { 'flag': 'a+' })
- Tasq.addlistener((e)=>{ fs.writeFileSync('run.log', ', ' + JSON.stringify( e ), { 'flag': 'a+' }); });
-
- function isWin(){ return /^win/.test(process.platform) }
- if(isWin()) {
- var win_verse = win_verse$1;
- var shell_verse = win_verse;
- }
- else {
- var lin_verse = lin_verse$1;
- var shell_verse = lin_verse;
- }
-
-
-
- var nodeShellExec = cliverse.nodeShellExec;
-
- const homedir = os__default["default"].homedir();
-
-
- function sysAddPathVar(addpath){
- // Object.assign({
- // inherit: true, shell: true, env: ENV, title: `${command} ${args}`
- // }, options)
-
- // powershell $env:Path -split ';'
- var etask = ()=>{
- return nodeShellExec('Powershell.exe', [
- `$path = [Environment]::GetEnvironmentVariable('PATH', 'Machine')
- $newpath = $path + ';${addpath}'
- [Environment]::SetEnvironmentVariable("PATH", $newpath, 'Machine')`
- ]).then(() => {
- fs.writeFileSync('run.done', 'success');
- }).catch(() => {
- fs.writeFileSync('run.done', 'error');
- })
- };
- etask.statuslog = statuslog;
- etask.selectedinstance = selectedinstance;
- etask.processedArgs = processedArgs;
- etask.runtimestamp = runtimestamp;
- etask.ENV = ENV;
- return shell_verse.runElevated(etask)
-
-
- // var newpath = addpath.split(';');
- // newpath.push(addpath)
- // newpath = Array.from(new Set(newpath)).join(';')
- // // addpath.split(';').forEach(pel => { var kv = pel.split('='); kv[0] === key ? null : newpath.push(pel); } )
- // // setx /M PATH "%PATH%;<path-to-executable-folder>"
- // // %AppData%\npm
- // return nodeShellExec('setx', ['/m', 'PATH', `%PATH%;${addpath}` ]);
- }
-
- // singleton one time lazy
- var getCredentials = function(){
-
- // First call
- var creds = fs.readFileSync(path__default["default"].normalize(`${homedir}/.elxrcredentials`), { encoding: 'utf8' });
- var creds = creds.split('\n').map( c => c.trim() && new URL(c));
- console.log(creds);
- creds.forEach(cred => {console.log( cred.hostname ); console.log( cred.username );} );
-
- // Subsequent calls
- getCredentials = ()=>{ return creds };
- return getCredentials();
- };
-
- const __ALIAS__STAMP__ = '9e7bebe0-1f57-11ec-8f88-778ffeea9d1b';
- const BUILD_VERSION = 'Version: 1.0.0 - built on July 25, 2022 18:16:21';
- const runtimestamp = (new Date()).getTime();
- function getVersion() { return BUILD_VERSION; }
- console.log(getVersion());
-
- // 'use strict';
-
- // PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere.
-
- // PB : TODO --
- // runas bypass non elevated tasks when we request privelege
- // runas message is always error needs to be fixed.
- // runas wait needs to be parallelized.
- // suppress elevation check error messages
- // support runas lauched directly from shell.
- // pass in environment in hta to shellexecute.
-
- // PB : NOTE -- iife doesnt work if previous statement is not terminated by ;
- (function () {
- if (!Array.prototype.earlyreduce) {
- Array.prototype.earlyreduce = function(eachcallback, initialValue, donecallback){
- var iterable = this;
- var donecallback = donecallback || (a=>a);
- var result = { value : initialValue === undefined ? iterable[0] : initialValue };
- initialValue === undefined ? null : result = eachcallback(result, element, i, iterable);
- // function *earlyReduceGenerator(acc, v, i, a) {
- for(var i = initialValue === undefined ? 0 : 1; i < iterable.length; i++){
- var element = iterable[i];
- result = eachcallback(result, element, i, iterable);
- if(result.done) return donecallback(result)
- }
- // }
- return donecallback(result)
- };
- }
- }());
-
- const { existsSync } = fs__default["default"];
- const existslink = function(name, cb){
- fs.lstat(name, (error, stats) => {
- if (error) {
- console.log(error);
- cb(error);
- }
- else {
- console.log("Stats object for: example_directory.txt");
- console.log(stats);
-
- // Using methods of the Stats object
- console.log("Path is file:", stats.isFile());
- console.log("Path is directory:", stats.isDirectory());
- cb(null, true);
- }
- });
- };
- const existsFolderSync = existsSync;
-
- const cliargs = bbhverse.cliargs;
- const processedArgs = cliargs(process.argv.slice(2));
- if(!processedArgs.wd){
- if(process.env.wd);
- else {
- process.env.wd = process.cwd();
- if(process.cwd() === __dirname) {
- // This script was launched in the same dir.
- // We do not know if it was copied to some random location. Check if we have elxr installed in current location. Or subidr.
- process.env.wd = path__default["default"].dirname( process.env.wd ); // Default to the parent.
- }
- }
- }
- else process.env.wd = processedArgs.wd;
- var ENV = Object.assign({}, process.env); // Shallow clone it.
-
-
-
- console.dir(processedArgs);
- // PB : TODO -- defaults for valuless arguments if passed.
- // Object.keys(processedArgs).forEach(a=>{
- // if(Object.prototype.toString.call(processedArgs[a]) === '[object Undefined]' || !processedArgs[a]) || trim(processedArgs[a])) == '') {
-
- // }
- // })
-
- //
-
-
-
-
- // Object.keys(clioverrides).forEach( prop => { })
-
- require$$3.sync;
-
- const { readdir } = fs__default["default"].promises;
-
- // Directory shallow walk and do perform on each dir.
- const dirs = async (perform, src, target, options) => {
- var rs = [];
- for (const dir of await readdir(src || selectedinstance.root, { withFileTypes: true })) {
- if (dir.isDirectory()) rs.push( perform(dir, src, target, options) );
- }
- return any(rs)
- };
-
- var fsMove = async function(from, to, options) {
-
- if(!options?.innernode) {
- var exists = fs.existsSync(from);
- var stats = exists && fs.statSync(from);
- var isDirectory = exists && stats.isDirectory();
- }
- else {
- var isDirectory = options.innernode.isDirectory();
- }
-
- if(!isDirectory) return fs.renameSync(from, to)
-
- fs.mkdirSync(to, { recursive : true });
-
- var rs = [];
- for (const innernode of await readdir(from, { withFileTypes: true })) {
- rs.push( fsMove( path__default["default"].join(from, innernode.name), path__default["default"].join(to, innernode.name), { innernode } ) );
- }
-
- return any(rs)
- };
-
-
-
- // PB : TODO -- Should return a bunch of promises to wait for...
- var copyrecursive = async function(src, target, options) {
-
- if(!options?.innernode) {
- var exists = fs.existsSync(src);
- var stats = exists && fs.statSync(src);
- var isDirectory = exists && stats.isDirectory();
- }
- else {
- var isDirectory = options.innernode.isDirectory();
- }
-
- if(!isDirectory) return fs.copyFileSync(src, target)
-
- fs.mkdirSync(target, { recursive : true });
-
- var rs = [];
- for (const innernode of await readdir(src, { withFileTypes: true })) {
- rs.push( copyrecursive( path__default["default"].join(src, innernode.name), path__default["default"].join(target, innernode.name), { innernode } )
- // .then(()=>{
- // return any(actions.map( a => ()=>a(dir, { isDirectory : true}) ))
- // })
- );
- }
-
- return any(rs)
-
-
- // return fswalk( src, {}, [
- // (src, options)=> {
- // if(options.innernode.isDirectory()) fs.mkdirSync(options.target, { recursive : true })
- // else fs.copyFileSync(src, options.target)
- // }
- // ])
-
- // var exists = fs.existsSync(src);
- // var stats = exists && fs.statSync(src);
- // var isDirectory = exists && stats.isDirectory();
- // if (isDirectory) {
- // fs.mkdirSync(dest, { recursive : true });
- // return dirs( function(childItemName) {
- // return copyrecursive(path.join(src, childItemName.name),
- // path.join(dest, childItemName.name));
- // }, src )
- // } else {
- // fs.copyFileSync(src, dest);
- // }
- };
-
- // var renamerecursive = function(from, to){
- // var exists = fs.existsSync(from);
- // var stats = exists && fs.statSync(from);
- // var isDirectory = exists && stats.isDirectory();
- // if (isDirectory) {
- // fs.mkdirSync(to);
- // dirs( function(childItemName) {
- // renamerecursive(path.join(from, childItemName),
- // path.join(to, childItemName));
- // }, from )
- // // fs.readdirSync(from).forEach(function(childItemName) {
- // // copyrecursive(path.join(from, childItemName),
- // // path.join(to, childItemName));
- // // });
- // } else {
- // fsrename(from, to);
- // }
- // }
-
-
- var regexreplaceall = function(content, ps){
- var repmatches;
- var replaced = content;
- while (repmatches = ps.strOrregexp.exec(content)) {
-
- if(content.length > 0) {
- var replacement = repmatches[0];
- for(var m = 1; m < repmatches.length; m++) {
- replacement = replacement.replace(repmatches[m], ps.substitutes[m-1]);
- }
- replaced = replaced.replace( repmatches[0], replacement );
- }
- }
- return replaced
- };
-
- // filesystem walk
- const fswalk = async (pathToWalk, options, actions) => {
- // options = options || { depthfirst : true }
-
- if(!options.innernode) {
- var exists = fs.existsSync(pathToWalk);
- var stats = exists && fs.statSync(pathToWalk);
- var isDirectory = exists && stats.isDirectory();
- }
- else {
- var isDirectory = options.innernode.isDirectory();
- }
-
- if(!isDirectory) return any(actions.map( a => ()=>a( pathToWalk, bbhverse.assign({}, options
- , { pathToWalk, innernode : options.innernode || { isDirectory : function(){ return true } } }) ) ))
-
- var rs = [];
- for (const innernode of await readdir(pathToWalk, { withFileTypes: true })) {
- rs.push( fswalk( path__default["default"].join(pathToWalk, innernode.name), bbhverse.assign({}, options, {pathToWalk, innernode }), actions )
- // .then(()=>{
- // return any(actions.map( a => ()=>a(innernode, { isDirectory : true}) ))
- // })
- );
- }
- // Wait for the walk to complete before renaming directories.
- Array.prototype.push.apply(rs, actions.map( a => ()=>a( pathToWalk, bbhverse.assign({}, options
- , { pathToWalk, innernode : options.innernode || { isDirectory : function(){ return true } } } ) ) ));
-
- return any(rs)
- };
-
- // var fslink = function(to, options){ try { fs.linkSync( to, options.from ) } catch(e) { throw e } }
- var fslink = function(to, options){ fs.symlinkSync( to, options.from /*, type = "junction"*/ ); };
-
- var fsrename = function(target, options){
- // PB : TODO -- streaming and async.. target could be a stream a string or a filesystem item or a tree node...
-
- var targetname = options.innernode?.name || path__default["default"].parse(target).base;
- var replaced = targetname;
-
- options.patternsubstitutions.forEach( ps => { replaced = regexreplaceall( replaced, ps ); });
- if(replaced && replaced !== targetname) {
- var tr = target.replace( targetname, replaced );
- fs.renameSync(target, tr);
- return tr;
- }
- else return replaced
- };
-
- var fscontentreplace = function( target, options ){
- // do many replacements in one shot in the file.
- if(options.processingtype === 'inplace' && options.sourcetype === 'filesystem' && !options.innernode.isDirectory() ) {
- var content = fs.readFileSync(target, { encoding: 'utf8' }); // PB : TODO -- streaming and async..
- options.patternsubstitutions.forEach( ps => { content = regexreplaceall( content, ps ); });
- fs.writeFileSync(target, content);
- }
- };
-
- var templatelink = function(target, options){
- var targetSubPath = target.replace(options.workingtarget + '/', '' );
- var targetSubPathsplit = targetSubPath.split("/");
- var targetPathBaseDir = `${targetSubPathsplit[0]}/${targetSubPathsplit[1]}`;
-
- var linkToSubPathReplacement = `${options.base}-server-lib/common`;
-
- // var rgxp = new RegExp(`(__link__)${options.base}-server-lib`, "g")
- var rgxp = new RegExp(`(__link__${options.base}-server-lib)`, "g");
- var linkToSubPath = targetSubPath;
- var b = target.match(rgxp);
- var linkFromName = regexreplaceall( target, { strOrregexp : rgxp, substitutes : [ '' ] } );
- linkFromName = linkFromName.replace(options.workingtarget, options.destinationroot);
-
- if( b ) {
- // Only if the pattern matches which is link instruction.
- linkToSubPath = regexreplaceall( linkToSubPath, { strOrregexp : rgxp, substitutes : [ '' ] } );
- }
-
- options.patternsubstitutions.forEach( ps => { linkToSubPath = regexreplaceall( linkToSubPath, ps ); });
- var linkToName = `${options.destinationroot}/${linkToSubPath}`;
-
- if(b){
- linkToSubPath = linkToSubPath.replace( targetPathBaseDir, linkToSubPathReplacement);
-
- // PB : DONT DELETE EVERYTHING ??? Only the linkable ones... Or use an add strategy without deleting...
- fs.unlinkSync( target );
- fslink( `${options.destinationroot}/${linkToSubPath}`, { from : linkFromName } );
- }
- else {
- fsMove( `${options.workingtarget}/${linkToSubPath}`, linkToName );
- // fsMove( `${options.workingtarget}/${linkToSubPath}`, linkFromName )
- }
- };
-
- var getShellTask = (command, args, options) => {
- options = options || {};
- var callshell = command === 'rm' ? getgitbashtask : getshelltask;
- return () => {
- var p = callshell( [command, args, Object.assign({
- inherit: true, shell: true, env: ENV, title: `${command} ${args}`
- }, options)
- ])();
- if (options.ignorefailures) {
- return p.catch(e => {
- // Ignore. Not a major error.
- })
- }
- else return p;
- }
- };
-
- var callshelltask = (args) => {
- // console.dir(args)
- if( Object.prototype.toString.call(args) === '[object Function]' ) {
- return args;
- }
- return getshelltask(args)()
- };
-
- var getCmdString = function(args){ return `"${args[0]} ${args[1].join(' ')}"` };
-
- var getshelltask = (args) => {
- return args[0] === 'rm' ? getgitbashtask(args) : () => {
- return nodeShellExec.apply(null, args).catch(function(e){
- e.benign = args[2].benign;
- if(!e.benign) { console.error(e); }
- throw e
- })
- }
- };
- var getgitbashtask = (args, onEachError) => { return () => {
- return nodeShellExec( `"${gitbash}"`, ['-c', getCmdString(args)], args[2]).catch( onEachError || function(e){ console.error(e); }) }
- };
-
- var getnodeshellexectask = (args) => { return () => { return nodeShellExec.apply(null, args) }};
- var perform = function( serailtasks, taskvector ){ return any( serailtasks(taskvector).map(getnodeshellexectask)) };
-
- var getTaskCheckExists = shell_verse.getTaskCheckExists;
- // var getTaskWithElevation = function(tasdef){ return shell_verse.getElevatedTask( tasdef.elevatedpulltasks ) }
-
- // var getTaskWithoutElevation = function(tasdef){
- // return ()=>{
- // if(!processedArgs.runas) { return tasdef.regularpulltasks(); }
- // else Promise.resolve(true)
- // }
- // }
-
- var gitops = {
-
- getdiscoverbranchcmd : function(repo){
-
- var parameters = ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;'];
- var cmd = [gitbash
- , ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;']
- , { cwd: instanceroot + '/' + repo, title: 'discoverbranch for ' + repo + ' ' + parameters.join(' ') }];
- return cmd
- }
- };
-
- var getPullCmd = (repodef, branch) => {
- // console.log(useGitPull)var getPullCmd = (repo, branch) => {
- // console.log(useGitPull)
- var repo = repodef.repo;
- var pullCmd = [];
- if(!branch) {
- // console.warn('No branch was specified detecting from working client.')
- // First check if working client exists.
- // if (existsSync(instanceroot + '/' + repo)) {
- pullCmd= gitops.getdiscoverbranchcmd(repo);
- // }
- // else performpull
- }
- // var pullCmd = [gitInstallDir
- // , ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;']
- // , { cwd: instanceroot + '/' + repo, title: 'pull all remotes for ' + repo }]
- if(branch) {
- var parameters = ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;'];
- var pullCmd = [ gitbash
- , ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;']
- , { cwd: instanceroot + '/' + repo, title : 'pull all remotes for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }];
- }
- // var pullCmd = ['pullall', [], { cwd : repo }]
- if (useGitPull) pullCmd = ['git', ['pull'], {
- inherit: true, shell: true,
- cwd: instanceroot + '/' + repo
- // , env: process.env
- , runas: processedArgs.runas
- , title: `git pull ${repo}`
- }];
- return pullCmd
- };
-
- // PB : TODO -- Use queueing with async tasks..
- var performPull = (repodef, branch, repoowner, errHandler, elevatedBatch, regularBatch) => {
- var pT = getPullTask(repodef, branch, repoowner, errHandler, elevatedBatch, regularBatch);
- // var waitForBatchAdditions = function(){
- // return pT;
- // }
- // Execute is implied.
- // if(false && (__inelevatedBatch || __inregularBatch) ) return waitForBatchAdditions() // PB : Todo Implemnt a trigger which starts execution.
- // else
- return pT() // Execute it.
- };
-
- var getPullTask = (repodef, branch, repoowner, errHandler, elevatedBatch, regularBatch) => {
- // PB : TODO -- Handle no branch passed in case.
- // if(!branch) { throw 'No branch specified' }
- var repo = repodef.repo;
- elevatedBatch = elevatedBatch || [];
- regularBatch = regularBatch || [];
- try{
- // PB : TODO -- local repo folder named the same as the remote repository name is not enough to establish existence.
- // This remote repo and branch may have been or may need to be added as a local tracking branch
- // to any other local repo folder (with a different name)
- var exists = existsSync(instanceroot + '/' + repo);
- }
- catch(e){
- exists = false;
- console.log(e);
- }
-
- function initTask(etask){
- etask.info = { repo };
- etask.errHandler = errHandler;
- etask.statuslog = statuslog;
- etask.processedArgs = processedArgs;
- etask.selectedinstance = selectedinstance;
- etask.runtimestamp = runtimestamp;
- etask.ENV = ENV;
- }
-
- function initElevatedBatch(){
- elevatedBatch.info = { repo };
- elevatedBatch.errHandler = errHandler;
- elevatedBatch.statuslog = statuslog;
- elevatedBatch.processedArgs = processedArgs;
- elevatedBatch.selectedinstance = selectedinstance;
- elevatedBatch.runtimestamp = runtimestamp;
- elevatedBatch.ENV = ENV;
- }
-
- if (exists) {
-
- var tasks = [];
- return (()=>{
- // PB : TODO -- We need a non cacheable set of properties that need to default to something but then need to escplicitly specified in each run.
- if(selectedinstance.addremotes) {
- return op['get-remotes']({repo}).then(( remotes )=>{
- return op['get-upstream']({repo, remotes}).then(( upstream ) => {
- return __addremotesandpull({ upstream, remotes})
- })
- })
- }
- else return __pull();
- })()
-
- function __pull(){
- var branchprint = branch ? ' branch :' + branch : '';
- var task = ()=>{
- console.log('pulling ' + instanceroot + '/' + repo + branchprint );
- return any(tasks).then( ()=>{
- return nodeShellExec.apply(null, getPullCmd(repodef, branch)).then(() => {
- return true;
- })
- })
- };
- initTask(task);
-
- if(repodef.requiresElevation) {
- elevatedBatch.push(shell_verse.getElevatedTaskInBatch( task ));
- if(elevatedBatch.length === 1) { initElevatedBatch(); initTask(elevatedBatch[0]); } // PB : TDOO -- Make sure first task also has run context. May need to be moved to win_verse
- else initTask(elevatedBatch[elevatedBatch.length-1]);
- return elevatedBatch[elevatedBatch.length-1]
- }
- else {
- regularBatch.push(shell_verse.getNonElevatedTask( task ));
- return regularBatch[regularBatch.length-1]
- }
- }
-
- function __addremotesandpull(options){
-
- // selectedinstance.selectedremotes are optional and need not be enforced to be chosen. The selection for hte selected remotes
- // could also be derived from a crossfilter of remote-type selected for this run and the current chosen and operating reposervers.
- var selectedremotes = Array.from( new Set(selectedinstance.selectedremotes.concat(Object.keys(repodef.remotes || {}))));
- if(selectedremotes.length > 0) ;
-
- var repoRemotes = Object.assign( {}, selectedinstance.remotes, options.remotes, options.upstream, repodef.remotes );
-
- // We need a most permissive filtered list to use as an efficient starting point to further reduce to whats actually needed.
- // However if such a cached list is not available we need to build it by scaning and apply all the filters anyway on the whole world.
-
- Object.keys(repoRemotes).forEach((remotename)=>{
- });
-
- __pull();
- }
- }
- else {
- // PB : TODO -- detect if a clonable repo exists within the context of currentGitAuthUser on remote reposerver...
- console.log('cloning ' + repo);
- // PB : TODO -- add additional remotes after cloning and pull again...
-
- var task = ()=>{
- return nodeShellExec('git', ['clone', '-c', 'core.symlinks=true', selectedinstance.reposerver + `/${repoowner || defaultRepoOwner}/` + repo + '.git'],
- {
- inherit: true, shell: true,
- env: process.env
- , cwd : instanceroot
- , runas: processedArgs.runas
- }).then(() => {
-
- var task = ()=>{
- return nodeShellExec('git', ['config', '--replace-all', 'core.symlinks', true],
- {
- inherit: true, shell: true,
- env: process.env
- , cwd: instanceroot + '/' + repo
- , runas: processedArgs.runas
- , title: `'git', ${['config', '--replace-all', 'core.symlinks', selectedinstance.username].join(' ')}`
- })
- };
-
- initTask(task);
-
- if(repodef.requiresElevation) {
- elevatedBatch.push(shell_verse.getElevatedTaskInBatch( task ));
- return elevatedBatch[elevatedBatch.length-1]
- }
- else {
- regularBatch.push(shell_verse.getNonElevatedTask( task ));
- return regularBatch[regularBatch.length-1]
- }
- })
- };
-
- initTask(task);
- if(repodef.requiresElevation) {
- elevatedBatch.push(shell_verse.getElevatedTaskInBatch( task ));
- return elevatedBatch[elevatedBatch.length-1]
- }
- else {
- regularBatch.push(shell_verse.getNonElevatedTask( task ));
- return regularBatch[regularBatch.length-1]
- }
- }
- };
- var defaultRepoOwner = 'chess';
- var elevatedRunasRepos = null;
- var gitRepos = null;
-
- // grep -qxF 'alias elxr="node elxr/index.js"' ~/.bash_profile || echo 'alias elxr="node elxr/index.js"' >> ~/.bash_profile
- // nodeShellExec('echo', ['elxr'], { inherit : true}) //, {stdio: "inherit"}
-
- var dbForLabel = function (label) {
- var dbsForLabel = {
- devmysql: 'mysql'
- , development: 'mssql'
- , production: 'mssql'
- };
- return dbsForLabel[label] || 'mysql'
- };
-
- // Maps an environment to a branch. Not required if the branch is appropriately named.
- var checkoutMap = { 'development': 'master' };
-
-
- // SAM : TODO Use nodeshellexec where to detect git installation dir
- var gitbash = shell_verse.getbash();
- // var gitbash = "G:\\Installed\\Git\\bin\\sh.exe"
- // Relevant git repos
- var exludeMergeRepos = [];
- var useGitPull = processedArgs.useGitPull || false;
-
- var op = {
- 'h': () => { console.log(elxr.help()); return '-h' }
- , 'clean' : () => {
- // delete all node_module folders and links.
- var tasklist = [];
- dirs( (repodir)=> tasklist.push(getShellTask('rm',['-rf', 'node_modules'], { cwd : instanceroot + '/' + repodir.name })()), instanceroot );
- return Promise.all(tasklist)
- }
- // , 'undefined': () => { return acquireChoices( {} ); }
- , 'reset': () => {
-
- // Reset NPM packages semver so major versions can be updated.
-
- const fs = fs__default["default"];
- const wipeDependencies = (__package) => {
- const file = fs.readFileSync(__package + '/package.json');
- const content = JSON.parse(file);
- for (var devDep in content.devDependencies) {
- if (content.devDependencies[devDep].match(/\W+\d+.\d+.\d+-?((alpha|beta|rc)?.\d+)?/g)) {
- content.devDependencies[devDep] = '*';
- }
- }
- for (var dep in content.dependencies) {
- if (content.dependencies[dep].match(/\W+\d+.\d+.\d+-?((alpha|beta|rc)?.\d+)?/g)) {
- content.dependencies[dep] = '*';
- }
- }
- fs.writeFileSync(__package + '/package.json', JSON.stringify(content));
- };
-
- var repos = ['client'];
- // repos = gitRepos;
- repos.forEach(wipeDependencies);
- // if (require.main === module) {
- // } else {
- // module.exports = wipeDependencies
- // }
-
- }
- , 'upgrade': () => {
- console.log('upgrade.......');
- var tasks = [
- () => {
- var p = nodeShellExec('npm', ['i', '-g', 'npm-upgrade'], {
- inherit: true, shell: true
- , env: process.env
- }).catch((e) => { console.error(e); });
- p.position = 1;
- console.log('One');
- return p;
- }
- , () => {
- var p = nodeShellExec('npm', ['cache', 'clean', '-f'], {
- inherit: true, shell: true
- , env: process.env
- }).catch((e) => { console.error(e); });
-
- p.position = 2;
- console.log('Two');
- return p;
- }
- , () => {
- var p = nodeShellExec('npm', ['install', '-g', 'n'], {
- inherit: true, shell: true
- , env: process.env
- }).catch((e) => { console.error(e); });
- p.position = 3;
- console.log('Three');
- return p;
- }
- , () => {
- var p = nodeShellExec('n', ['latest'], {
- inherit: true, shell: true
- , env: process.env
- }).catch((e) => { console.error(e); });
- p.position = 4;
- console.log('Four');
- return p;
- }
- ];
- any(tasks);
- console.log('.......done');
- console.log('Running exlr upgrade in : ' + path__default["default"].dirname(__dirname));
- console.log('Currently only upgrades ember : ' + path__default["default"].dirname(__dirname));
- console.info('Uninstalling existing ember globally');
- var step1 = nodeShellExec('cmd', ['/c', 'npm', 'uninstall', '-g', 'ember-cli'], {
- stdio: ['pipe', process.stdout, process.stderr],
- inherit: true,
- shell: true,
- cwd: path__default["default"].dirname(__dirname),
- env: env
- });
- step1.on('close', () => {
- console.info('Installing ember globally');
- var step2 = nodeShellExec('cmd', ['/c', 'npm', 'install', '-g', 'ember-cli'], {
- stdio: ['pipe', process.stdout, process.stderr],
- inherit: true,
- shell: true,
- cwd: path__default["default"].dirname(__dirname),
- env: env
- });
-
- step2.on('close', () => {
- nodeShellExec('cmd', ['/c', 'ember', '--version'], {
- stdio: ['pipe', process.stdout, process.stderr],
- inherit: true,
- shell: true,
- cwd: path__default["default"].dirname(__dirname),
- env: env
- });
- });
- });
- }
- , 'push': () => {
- if (!processedArgs._[1]) { console.error('push all not supported. Specify repo name'); return }
- // init remote bare from local
- // pushandinitremotebare
- // https://www.jeffgeerling.com/blogs/jeff-geerling/push-your-git-repositories
- // connect to repo server -- net use 172.16.0.27
- // cd 172.16.0.27/repos/
- // mkdir repo.git
- // cd repo.git
- // git init --bare
- // cd localrepo
- // git remote rename origin githubclone
- // git remote add origin //172.16.0.27/repos/repo.git
- // git push origin master
-
- var repo = processedArgs._[1];
- var remote = 'origin';
-
- var sequentialTaskShellCommands = [];
- if (!existsSync(`Z:/${repo}.git`)) {
- sequentialTaskShellCommands = [
- // ['net', ['use', 'Z:', selectedinstance.reposerver.replace('/','\\')], {
- // inherit : true, shell: true
- // , env: process.env
- // }]
- ['pwd', { cwd: 'Z:', inherit: true }]
- , ['mkdir', [`${repo}.git`], {
- cwd: `Z:`
- , inherit: true, shell: true
- , env: process.env
- }]
- , ['pwd', { cwd: `Z:/${repo}.git`, inherit: true }]
- , ['git', ['init', '--bare'], {
- cwd: `Z:/${repo}.git`
- , inherit: true, shell: true
- , env: process.env
- }]
- // PB : TODO -- Do this conditionally only...
- , ['git', ['remote', 'rename', remote, 'githubclone'], { cwd: `${instanceroot + '/' + repo}` }, (err) => {
- console.log(`Ignoring ${remote} rename error : ` + err); return true; //return true to continue.
- }] // PB ; Todo -- new repositories created locally will not have origin. Handle this failure.
- , ['git', ['remote', 'add', remote, `${selectedinstance.reposerver}/${repo}.git`], { cwd: `${instanceroot + '/' + repo}` }]
- // PB : TODO -- If threre is a gitbubclone origin
- // Set the master to pull from the local repo.
- ];
- if (!existsSync(`Z:`)) {
- sequentialTaskShellCommands.splice(0, 0, ['net', ['use', 'Z:', selectedinstance.reposerver.replace(/\//gm, '\\')], {
- inherit: true, shell: true
- , env: process.env
- }]);
- console.warn('Adding network drive z: for repo server. ' + sequentialTaskShellCommands[0]);
- // throw 'done'
- }
- }
-
- sequentialTaskShellCommands.push(['git', ['push', remote, 'master'], { cwd: `${instanceroot + '/' + repo}` }]);
- // console.dir(sequentialTaskShellCommands);
-
- var tasks = [];
- sequentialTaskShellCommands.forEach(shellcmd => {
- // console.log(shellcmd)
- tasks.push(() => {
-
- var p = nodeShellExec.apply(null, shellcmd.slice(0, 3)).catch((e) => { if (shellcmd[3]) { return shellcmd[3]() } else { console.error(e); } });
- return p;
- });
- });
- any(tasks);
-
- }
- , 'is-git-repo': (dir) => {
- return nodeShellExec('git', ['-C', dir.name, 'rev-parse'], { stdio: 'ignore' })
- }
- // git remote equivalents...
- // git branch --set-upstream-to=elixir-unc/master master
- // git push --set-upstream elixir-unc branch..
- , 'remote': (args) => {
-
- // Subcommands!
- // PB : TODO -- we can now pass in hypehnated args...
- if(!processedArgs.v) return false; // Only -v is supported presently..
-
- var serial_perform = (repo) => {
- var options = { cwd: instanceroot + '/' + repo };
-
- return [
- ['git', ['remote', '-v'], options]
- ]
- };
-
- var x = (args) => {
- var tasq = () => {
- // console.log(args)
- return nodeShellExec.apply(null, args).catch(e => {
- // We continue on failure.
- console.error(tasq.toString());
- })
- };
- tasq.toString = function(){
- return JSON.stringify(args)
- };
- return tasq;
- };
-
- var perform = (dir) => {
- return any(serial_perform(dir.name).map(x))
- };
-
- dirs(perform);
- }
-
- , 'remote set-url': (args) => {
- // git remote set-url elixir-unc //10.10.5.60/gitrepo/chess/bbhverse
- var __args = {
- remotename : args.remotename || processedArgs._[2]
- , url : args.url || processedArgs._[3]
- };
-
- // pushable doesn't mean the remote doesn't support being pushed to.
- // Over here it just means we are disabling pushing to that remote by setting the push portion of the url the a junk remote called no-pushing.
- // PB : TODO -- change this to enablepushing.
- // By default pushing should be disabled. Also developers permissions on the remote is a secondary check for pushing.
- var pushable = processedArgs.pushable || false;
- remotename = __args.remotename;
- url = __args.url;
- var serial_perform_git_seturl = (repo) => {
- // console.log(repo)
- if (pushable) {
- return [
- ['git', ['remote', 'set-url', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }]
- , ['git', ['remote', `set-url`, '--push', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }]
- ]
- }
- else {
- return [
- ['git', ['remote', 'set-url', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }]
- , ['git', ['remote', `set-url`, '--push', remotename, 'no-pushing'], { cwd: instanceroot + '/' + repo }]
- ]
- }
-
- };
-
- var x = (args) => {
- var tasq = () => {
- // console.log(args)
- return nodeShellExec.apply(null, args).catch(e => {
- // We continue on failure.
- console.error(tasq.toString());
- })
- };
- tasq.toString = function(){
- return JSON.stringify(args)
- };
- return tasq;
- };
- var perform_git_seturl = (dir) => {
- op['is-git-repo'](dir).then((logEntry) => {
- return any(serial_perform_git_seturl(dir.name).map(x))
- }).catch((e) => {
- // console.log('Failed : ' + dir.name)
- });
- };
-
- dirs(perform_git_seturl);
- }
- // , 'reset' : ()=>{
- // PB : TODO -- Cant have 2 resets !! | There is an npm reset that should be bundled.
- // // Reset the whole installation pertaining to this elxr folder.
-
- // }
-
- , 'remote exists': (args) => {
- var __args = {
- remotename : args.remotename|| processedArgs._[2]
- , url : args.url || processedArgs._[3]
- , branch : args.branch || processedArgs._[4]
- };
-
- var options = args.repo ? { cwd: instanceroot + '/' + args.repo } : {};
-
- // PB : TODO -- We should evaluate a whole list of remotes passed in from args instead of just one.
- var commands = [
- // git remote -v| while read remote; do "${remote#origin/}" "$remote"; done
- // ['git', ['remote', '-v', '| while read remote; do "${remote#origin/}" "$remote"; done'], utils.assign( {
- [
- // 'git', ['remote', '-v']
- 'git', ['config', `remote.${__args.remotename}.url`]
- , bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , {
- benign : args.benign, ignorefailures : args.ignorefailures,
- evaluateResult : function(err, result){
- return [
- +result.code === 0
- , result
- ]
- }
- } , options) ]
- ];
- var mapped = commands.map(getshelltask); //.map( p => p.catch(e => e)) // Handle errors later.
- mapped.push( function(prevserialtaskresult) {
- var pt = [false , null];
- if(prevserialtaskresult.error) {
- // Previous task has failed.
- pt[1] = prevserialtaskresult.error[1];
- }
- else pt = prevserialtaskresult;
-
- console.dir(prevserialtaskresult);
- return getshelltask(['git', ['ls-remote', `${__args.url}`], bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , {
- benign : args.benign, ignorefailures : args.ignorefailures,
- evaluateResult : function(err, result){
- if(+result.code !== 0) return [pt, [ false, result]]
- // var hasfailed = /^fatal: .*/.test(result.messages.join(' '))
- return [pt, [true, result] ]
- }
- } , options) ])().catch( e => {
- console.error(e);
- return [pt, [ false, null]]
- })
- });
- return any(mapped, true, false, { accumulatedresults : [] }).then( allresolved => {
-
- console.dir(allresolved);
- !allresolved[0][0] && !allresolved[1][0] ? console.log('was not added as a remote and url is currently inaccessible.')
- : allresolved[0][0] && allresolved[1][0] ? console.log('was added as a remote and url is accessible.')
- : allresolved[0][0] && !allresolved[1][0] ? console.log('was added as a remote but url is currently inaccessible.')
- : console.log('was not added as a remote but url is currently accessible.');
-
- return !allresolved[0][0] && !allresolved[1][0] ? [0, 0]
- : allresolved[0][0] && allresolved[1][0] ? [1, 1] // => was added as a remote and url is accessible.
- : allresolved[0][0] && !allresolved[1][0] ? [1, 0] // => was added as a remote but url is currently inaccessible.
- : [0, 1] // => was not added and remote and url is accessible.
- }).catch(e => {
- console.log(e);
- return [0, 0]
- })
- }
-
- , 'remote refresh': (args) => {
- var __args = {
- remotename : args.remotename|| processedArgs._[2]
- , url : args.url || processedArgs._[3]
- , branch : args.branch || processedArgs._[4]
- };
-
- // use the repo manifest to create missing remotes.
- function perform_remote_refresh(dir){
- var repo = dir.name;
- var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo);
- try {
- var remotes = commonjsRequire(`${selectedinstance.root}/${dir.name}/repo-manifest.js`,"/$$rollup_base$$")( null
- , { utils: bbhverse, username : selectedinstance.username, instanceName : selectedinstance.instanceName
- , node_env : selectedinstance.node_env, reposerver : 'https://git.bbh.org.in' } // options
-
- ).remotes || [];
- }
- catch(e){
- var remotes = [];
- }
- // console.log(`${dir.name}/repo-manifest.js` + '---------------------------')
- // console.dir(remotes)
-
- return nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{
- console.log('Processing : ' + dir.name);
- var branch = __branch;
- __args.repo = repo;
- __args.branch = __branch;
- var promises = [];
-
- remotes.forEach(remote =>{
- Object.keys(remote).forEach(remotename => {
- __args.remotename = remotename;
- __args.url = remote[remotename];
- __args.benign = true;
- __args.ignorefailures = true;
- promises.push( op['remote exists']( __args ).then( exists => {
- if(!exists[0]) {
- if(!exists[1]) { console.error( `Skipping inaccessible remote url ${__args.url}` ); }
- else return op['remote add']( { remotename,
- // PB : TODO -- use the most accessible remote instead of the first available.
- url : (bbhverse.js.isArray(remote[remotename]) ? remote[remotename][0] : remote[remotename]), branch
- } )
- }
- })
- );
- });
- });
-
- return Promise.all(promises)
- })
- .catch((e) => { console.log('Processing Error : ' + dir.name); console.error(e); return { error: true, message: repo } })
- }
-
- return dirs(perform_remote_refresh)
- }
- , 'remote add': (args) => {
- // PB : TODO -- set-upstream-to should be chosen and intentionally switched. Coz we can have multiple upstream remotes.
- // Also each upstream remote may need to have is own branch to switch to. We therefore need a branch nomenclature
- // That explicitly has a remote name prefix.
- // git branch branch_name --set-upstream-to your_new_remote/branch_name
- // git branch branch_name -u your_new_remote/branch_name -- older versions
- // git branch -vv -- Detect which branch are we tracking.
- // default upstream should be users own fork.
- // Also need alias branches to
- // define a git alias which would git pull master from one repo, and then git pull master from other remotes.
- // probably git merge from all remotes... and relevant branches...
- // alias pushall='for i in `git remote`; do git push $i; done;'
- // alias pullall='for i in `git remote`; do git pull $i; done;'
- // args === processedArgs ? args = {} : null;
- var __args = {
- remotename : args.remotename|| processedArgs._[2]
- , repo : args.repo
- , url : args.url || processedArgs._[3]
- , branch : args.branch || processedArgs._[4]
- , 'set-upstream' : args['set-upstream'] || processedArgs._[5]
- };
-
- var remotename = __args.remotename;
- var url = __args.url;
- var branch = __args.branch;
-
- var pushable = processedArgs.pushable || false;
-
- var serial_perform_git_add = (repo) => {
- // console.log(repo)
- if (pushable) {
- var gacmds = [
- ['git', ['remote', 'add', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }]
- , ['git', ['pull', remotename, branch], { cwd: instanceroot + '/' + repo }]
- // , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }]
- ];
- }
- else {
-
- var gacmds = [
- ['git', ['remote', 'add', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }]
- , ['git', ['remote', `set-url`, '--push', remotename, 'no-pushing'], { cwd: instanceroot + '/' + repo }]
- , ['git', ['pull', remotename, branch], { cwd: instanceroot + '/' + repo }]
- // When we add a remote it should not automatically become the upstream. The upstream should be a chosen remote else we do not change
- // , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }]
- ];
- }
- if(args['set-upstream']) gacmds.push(['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }]);
- return gacmds
- };
-
- // PB : TODO -- Accumulate using yield... and finally return a set of tasks or promises...
- var perform_git_add = (dir) => {
- op['is-git-repo'](dir).then((logEntry) => {
- // console.log(code)
- if (logEntry.success) {
- nodeShellExec('git', ['remote', 'get-url', remotename], { cwd: dir.name, stdio: 'ignore' }).then(() => {
- console.log('skipped : ' + dir.name + ', reason : A remote with same name already exists.');
- })
- .catch((e) => {
- perform( serial_perform_git_add, dir.name );
- });
- }
- // else console.log('Skipped : Not a Git Repo : ' + dir.name)
- }).catch((e) => {
- console.log('Failed : ' + dir.name);
- });
- };
-
- if(args.repo) { perform_git_add( { name : args.repo} ); }
- else return dirs(perform_git_add)
- }
- , 'remote remove': (args) => {
-
- var __args = {
- remotename : args.remotename|| processedArgs._[2]
- };
- var remotename = __args.remotename;
- var serial_perform_git_remove = (repo) => {
- // console.log(repo)
- return [
- ['git', ['remote', 'remove', remotename], { cwd: instanceroot + '/' + repo }]
- ]
- };
-
- var perform_git_remove = (dir) => {
- op['is-git-repo'](dir).then((logEntry) => {
- // console.log(code)
- if (logEntry.success) {
- nodeShellExec('git', ['remote', 'get-url', remotename], { cwd: dir.name, stdio: 'ignore' }).then(() => {
- any(serial_perform_git_remove(dir.name).map(getnodeshellexectask));
- })
- .catch((e) => {
- console.log('skipped : ' + dir.name + `, reason : No remote named ${remotename}`);
- });
- }
- // else console.log('Skipped : Not a Git Repo : ' + dir.name)
- }).catch((e) => {
- // console.log('Failed : ' + dir.name)
- });
- };
-
- fs__default["default"].promises;
-
- dirs(perform_git_remove);
- }
- , 'get-remotes' : (args) => {
- // var __args = {
- // repo : args?.repo || processedArgs._[1]
- // }
-
- var repo = args.repo;
-
- var serial_perform = (repo) => {
- return [
- ['git', ['remote', '-vvvv'], { cwd: instanceroot + '/' + repo,
- evaluateResult : function( issuccess, result){
- if(!issuccess || +result.code !== 0) throw Object.assign( new Error('git branch -vvvv crashed'), result);
-
- var lines = result.messages.join('').split('\n');
- var remotes = {};
- lines.forEach(line => {
- // pattern = origin https://git.bbh.org.in/chess/elxr (fetch)
- var match = new RegExp(`(\\S+)\\s(\\S+)/${repo}.git\\s\\((\\S+)\\)`).exec(line);
- if(match) {
- var r = remotes[match[1]] || (remotes[match[1]] = { title : match[1] });
- if(match[3] === 'push') { r.push = match[2]; }
- else r.url = match[2];
- }
- });
- return remotes
- }}]
- ]
- };
-
- return perform( serial_perform, repo )
- }
- , 'get-remote' : (upstream) => {
- // var __args = {
- // repo : args?.repo || processedArgs._[1]
- // }
-
- var repo = upstream.repo;
-
- var serial_perform = (repo) => {
- return [
- ['git', ['remote', '-vvvv'], { cwd: instanceroot + '/' + repo,
- evaluateResult : function( issuccess, result){
- if(!issuccess || +result.code !== 0) throw Object.assign( new Error('git branch -vvvv crashed'), result);
-
- // origin https://git.bbh.org.in/chess/elxr (fetch)
- var match = new RegExp(`${upstream.remotename}\\\s(\\S+)/${repo}.git\\s\\(fetch\\)`).exec(result.messages.join(' '));
- if(match) { upstream.url = match[1]; }
- else throw Object.assign( new Error('No upstream found for active branch'), result)
- return upstream
- }}]
- ]
- };
-
- return perform( serial_perform, repo )
- }
- , 'get-upstream' : (args) => {
-
- var __args = {
- repo : args?.repo || processedArgs._[1]
- };
-
- var repo = __args.repo;
-
- var serial_perform = (repo) => {
- return [
- ['git', ['branch', '-vvvv'], { cwd: instanceroot + '/' + repo,
- evaluateResult : function( issuccess, result){
- if(!issuccess || +result.code !== 0) throw Object.assign( new Error('git branch -vvvv crashed'), result);
-
- var match = /\*\s(\S+)\s\S+\s\[(\S+)\/(\S+).*?\].*?/.exec(result.messages.join(' '));
- if(match) { var upstream = { remotename : match[2], branch : match[1], remotebranch : match[3] }; }
- else throw Object.assign( new Error('No upstream found for active branch'), result)
-
- if(args?.remotes) {
- var r = args.remotes[upstream.remotename];
- if(!r) return op['get-remote'](upstream)
-
- r.branch = upstream.branch;
- r.remotebranch = upstream.remotebranch;
- return r
- }
- return op['get-remote'](upstream)
- }}]
- ]
- };
-
- return perform( serial_perform, repo )
- }
- , 'init-gitea': (user) => {
- user = user || processedArgs._[1];
- if (!user) throw 'User name required'
- var serial_perform_init_gitea = (repo) => {
- // console.log(repo)
- return [
- ['git', ['remote', 'add', 'chess', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }]
- , ['git', ['remote', 'set-url', '--push', 'chess', 'no-pushing'], { cwd: instanceroot + '/' + repo }]
- , ['git', ['remote', 'set-url', 'userfork', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }]
- ]
- };
-
- var perform_init_gitea = (dir) => {
- op['is-git-repo'](dir).then((logEntry) => {
- // console.log(code)
- if (logEntry.success) {
- nodeShellExec('git', ['remote', 'get-url', 'chess'], { cwd: dir.name, stdio: 'ignore' }).then(() => {
- console.log('skipped : ' + dir.name + ', reason : Already has remote chess ');
- })
- .catch((e) => {
- perform( serial_perform_init_gitea, dir.name );
- });
- }
- // else console.log('Skipped : Not a Git Repo : ' + dir.name)
- }).catch((e) => {
- // console.log('Failed : ' + dir.name)
- });
- };
-
- dirs(perform_init_gitea);
- }
- , 'syncmaster': (label) => {
- // Usage :
- // elxr pull -- Defaults to run config
-
- Object.assign({}, process.env); // Shallow clone it.
- // console.dir(env)
- console.log('Running exlr pull : ' + path__default["default"].dirname(__dirname));
-
- if (!processedArgs.runas) gitRepos.map((def) => performPull(def, def.branch || 'master'));
- var etask = ()=>{
- return any(elevatedRunasRepos.map((def) => performPull(def, def.branch || 'master'))).then(() => {
- fs.writeFileSync('run.done', 'success');
- }).catch(() => {
- fs.writeFileSync('run.done', 'error');
- })
- };
- etask.statuslog = statuslog;
- etask.selectedinstance = selectedinstance;
- etask.processedArgs = processedArgs;
- etask.runtimestamp = runtimestamp;
- etask.ENV = ENV;
- return shell_verse.runElevated(etask)
- }
-
- , 'repo-relocate' : function(args){
- // relocate a subfolder in source repo to same subfolder in target repo with history.
-
- var args = args || {
- remotebase : processedArgs._[4] || 'http://git.bbh/chess/'
- , folder : processedArgs._[3] || 'server'
- , sourcerepo : processedArgs._[2] || 'client'
- , targetrepo : processedArgs._[1] || 'elixir-server'
- };
- var sourcerepooptions = { cwd: `${instanceroot}/relocate/${args.sourcerepo}`
- // , stdio: ['pipe', process.stdout, process.stderr]
- , inherit: true,
- shell: true,
- env: process.env
- , runas: processedArgs.runas
- };
-
- return op['repo-split'](args).then(()=>{
- return op['repo-merge'](args).then(()=>{
-
- // cleanup folder from source.
- var cmdseq = [
- ['rm', ['-rf', `${args.folder}`], sourcerepooptions ]
- // commits have to intentional...
- // , ['git', ['commit', '-a', '-m', `relocate folder ${args.folder} to ${targetrepo}`], sourcerepooptions ]
- ];
-
- return any(cmdseq.map(getshelltask))
- })
- }).catch(e=>{console.error(e);})
- }
-
- , 'repo-split' : function(args) {
-
- // https://gist.github.com/smdabdoub/17065c348289158277b5
-
- /**
- * Eg : folder, remotebase, sourcerepo, targetrepo
- * args.folder = 'server'
- * args.remotebase = 'https://git.bbh/chess/'
- * args.sourcerepo = 'client'
- * args.targetrepo = 'elixir-server'
- */
-
- var args = args || {
- folder : 'server'
- , remotebase : 'http://git.bbh/chess/'
- , sourcerepo : 'client'
- , targetrepo : 'elixir-server'
- };
-
- var options = { cwd: `${instanceroot}/relocate`
- // , stdio: ['pipe', process.stdout, process.stderr]
- , inherit: true,
- shell: true,
- env: process.env
- , runas: processedArgs.runas
- };
-
- var cmdseq = [
- // create a temporary working dir in current folder where we started execution.
- ['mkdir', [ '-p', `${instanceroot}/relocate`]]
- , ['git', ['clone', `${args.remotebase}${args.sourcerepo}`], options ]
- , ['git', ['clone', `${args.sourcerepo}`, `relocate-${args.sourcerepo}-${args.folder}`], options]
- , ['git', ['clone', `${args.remotebase}${args.targetrepo}`, `relocate-${args.targetrepo}-${args.folder}`], options]
- ];
-
- return any(cmdseq.map(getshelltask)).then(() => {
- // , ['git', ['subtree', 'split', '-P', `${args.folder}`, '-b', `relocate-${args.sourcerepo}-${args.folder}`], sourcerepooptions]
- // split doesnt retain folder structure we need to move and commit ourselves through a branch to retain history...
- // , ['git', [`checkout relocate-${args.sourcerepo}-${args.folder}`], sourcerepooptions]
- // , ['mkdir', [`${args.folder}`], sourcerepooptions]
- // , ['git', ['mv', `!(${args.folder})`, `${args.folder}`], sourcerepooptions ] // requires shopt -s extglob
- // , ['git', ['commit', `-m`, 'Moved to same subfolder after subtree split in branch'] , sourcerepooptions]
-
-
- // subtree split and filter-branch are options. We currently use repo-filter.
- return op['filter-repo'](args)
- }).catch(e=>{console.error(e); throw 'failed'})
- }
-
- , 'repo-merge' : function(args) {
- // Merge source repo into target repo
- var args = args || {
- folder : 'server'
- , remotebase : 'http://git.bbh/chess/'
- , sourcerepo : 'client'
- , targetrepo : 'elixir-server'
- };
-
- ({ cwd: `${instanceroot}/relocate/relocate-${args.sourcerepo}-${args.folder}`
- // , stdio: ['pipe', process.stdout, process.stderr]
- , inherit: true,
- shell: true,
- env: process.env
- , runas: processedArgs.runas
- });
- var targetrepooptions = { cwd: `${instanceroot}/relocate/relocate-${args.targetrepo}-${args.folder}`
- // , stdio: ['pipe', process.stdout, process.stderr]
- , inherit: true,
- shell: true,
- env: process.env
- , runas: processedArgs.runas
- };
-
- var cmdseq = [
- ['git', ['pull', `../relocate-${args.sourcerepo}-${args.folder}`, `master`, '--allow-unrelated-histories']
- , targetrepooptions ]
- // , ['git', ['push', targetrepooptions ] // manual push for now..
- ];
- return any(cmdseq.map(getshelltask)).catch(e=>{console.error(e);})
- }
-
- , 'filter-repo' : function(args){
- // Merge source repo into target repo
- var args = args || {
- folder : 'server'
- , remotebase : 'http://git.bbh/chess/'
- , targetrepo : 'elixir-server'
- };
-
- var targetrepooptions = { cwd: `${instanceroot}/relocate/relocate-${args.sourcerepo}-${args.folder}`
- , inherit: true, shell: true
- , env: process.env
- , runas: processedArgs.runas
- };
-
- var cmdseq = [
- // git checkout -b feature/merge-old-project
- // git remote add src-project ../src-project
- ['git', ['filter-repo', '--path', `${args.folder}`], targetrepooptions ]
- ];
- return any(cmdseq.map(getshelltask)).catch(e=>{console.error(e); throw 'failed' })
- }
-
- , 'filter-branch' : function(preservefolder, repo){
- // https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository
- // git subtree split -P <name-of-folder> -b <name-of-new-branch>
- // Preserve a specific folder.
- // PB : TODO -- filter-branch has known issues. Explore subtree and filter-repo...
- /*
- git clone repo reposplit
- git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter {{folder}} -- --all
- git remote rm origin
- */
-
- throw 'filter-repo-history not yet implmented pls refer to manual commands in code.'
- }
-
- // , 'repo-merge-folder' : function(mergetarget, mergesource, mergefolder){
- // // Merge repo2 into a subfolder in repo1
- // // https://alexharv074.github.io/puppet/2017/10/04/merge-a-git-repository-and-its-history-into-a-subdirectory-of-a-second-git-repository.html
- // // https://thoughts.t37.net/merging-2-different-git-repositories-without-losing-your-history-de7a06bba804
- // /*
- // cd repo1
- // git remote add -f tempmergesource ../{{mergesource}}/.git
- // git merge -s ours --no-commit tempmergesource/master --allow-unrelated-histories
- // git read-tree --prefix={{mergefolder}} -u tempmergesource/master:
- // git commit
-
- // // Repair History
- // // === git filter-branch --tree-filter '(echo === $GIT_COMMIT:; git ls-tree $GIT_COMMIT) >> /tmp/tree.log'
-
- // #!/usr/bin/env bash
-
- // first=ed4f16becc2f03820c164e0617bb98f12ff49ef0
- // last=038e26e21bd60fa265d6637261f3bc918780d2e8
- // subdir=server
-
- // git filter-branch --tree-filter '
- // first='"$first"'
- // last='"$last"'
-
- // subdir='"$subdir"'
- // log_file=/tmp/filter.log
-
- // [ "$GIT_COMMIT" = "$first" ] && seen_first=true
-
- // if [ "$seen_first" = "true" ] && [ "$seen_last" != "true" ]; then
- // echo "=== $GIT_COMMIT: making changes"
- // files=$(git ls-tree --name-only $GIT_COMMIT)
- // mkdir -p $subdir
- // for i in $files; do
- // mv $i $subdir || echo "ERR: mv $i $subdir failed"
- // done
- // else
- // echo "=== $GIT_COMMIT: ignoring"
- // fi \
- // >> $log_file
-
- // [ "$GIT_COMMIT" = "$last" ] && seen_last=true
-
- // status=0 # tell tree-filter never to fail
- // '
-
- // git remote rm tempmergesource
- // */
- // // better alternative for history
- // /**
- // *
- // git clone git@server.com:old-project.git
- // git clone git@server.com:new-project.git
-
- // cd old-project
- // mkdir old-project
- // git mv !(old-project) old-project
- // ls -la and gt mv hidden files ....
- // git commit -a -S -m “Moving old project into its own subdirectory”
-
- // cd ../new-project
- // git remote add old-project ../old-project
- // git fetch old-project
- // git checkout -b feature/merge-old-project
- // git merge -S --allow-unrelated-histories old-project/master
- // git push origin feature/merge-old-project
- // git remote rm old-project
- // */
-
- // throw 'merge-repos not yet implmented pls refer to manual commands in code.'
- // }
-
- , 'pull' : (label) => {
- // Usage :
- // elxr pull -- Defaults to run config
-
- return elxr.getpulltask(selectedinstance)
- }
- , 'isInstalled': () => {
- return nodeShellExec('where', [processedArgs._[1]], { inherit: true }).then(() => {
- console.log(processedArgs._[1] + ' exists.');
- return true;
- });
- }
- , 'c' : ()=>{
-
- }
- , 'i' : () => {
- var tasks = [];
- // tasks.push(op['pull']);
- tasks.push(getShellTask.apply(null, ['rm', [instanceroot + '/run.js'], { ignorefailures: true }]));
- tasks.push(op['use']); // Will pull repos...
- op['npmi'].statuslog = statuslog;
- tasks.push(shell_verse.getNonElevatedTask(op['npmi'])); // We do not run npm i with elevated privilege for security reasons.
-
-
- // var tasksdefs = [
- // ['elxr', ['pull']]
- // , ['elxr', ['use', 'elixir']]
- // , ['elxr', ['npmi']]
- // ]
-
-
- // tasksdefs.forEach(tasksdef=>{
- // tasks.push( ()=> nodeShellExec.apply(null, tasksdef) )
- // })
-
- return any(tasks);
-
- }
- , 'npmi': () => {
- var tasks = [];
-
- // Build fails without babel...
- tasks.push(getShellTask(
- 'npm',[ 'i', '-g', 'babel-cli' ]
- ) );
-
- var npmbuildrepos = ['loopback-jsonapi-model-serializer'];
- // npmbuildrepos = []
- npmbuildrepos.forEach(repo => {
- tasks.push(() => {
- return nodeShellExec('npm', ['i --force'], {
- inherit: true, shell: true
- , cwd: instanceroot + '/' + repo
- , env: process.env
- , title: `npm i for ${repo}`
- }).catch((e) => {
- console.error('Ignoring Benign Error'); console.error(e);
- }).then(() => {
- console.log(`--npm run build for ${repo}--------------------`);
- return nodeShellExec('npm', ['run build'], {
- inherit: true, shell: true
- , cwd: instanceroot + '/' + repo
- , env: process.env
- , title: `npm run build for ${repo}`
- }).then(Tasq.then).catch(Tasq.catch)
- })
- });
- });
-
- return any(tasks).then(() => {
-
- gitRepos.push({ repo : 'chess-server-lib/server'});
- gitRepos = gitRepos.concat(elevatedRunasRepos);
- // console.dir(gitRepos)
- // throw ""
-
- // gitRepos = [
- // // 'bbhverse', 'serververse', 'elixir-server',
- // // 'clientverse',
- // 'client'
- // ];
- var rmtasks = [];
- var repotasks = [];
- var env = Object.assign({}, process.env);
- delete env.NODE_ENV;
- gitRepos.forEach(repodef => {
- rmtasks.push(
- // () => {
- // console.log(`--rm package-lock.json for ${repodef.repo}--------------------`)
- // return nodeShellExec(`"${gitbash}"`, ['-c', '"rm package-lock.json"'], {
- callshelltask(['rm', ['package-lock.json'], {
- inherit: true, shell: true
- , cwd: instanceroot + '/' + repodef.repo
- , env: process.env
- , title: `rm 'package-lock.json' for ${repodef.repo}`
- }])
- .then(()=>{
- console.log(`--rm package-lock.json for ${repodef.repo}--------------------`);
- }).catch((e) => { console.error(e); })
- // }
- );
-
- if (npmbuildrepos.indexOf(repodef.repo) < 0) {
- repotasks.push(
- () => {
- console.log(`--npm i for ${repodef.repo}--------------------`);
- var p = nodeShellExec('npm', ['i', '--force'], {
- inherit: true, shell: true
- , cwd: instanceroot + '/' + repodef.repo
- , env
- , title: `npm i for ${repodef.repo}`
- }).then(Tasq.then).catch(Tasq.catch);
- return p;
- });
- }
- });
-
- // NODE_ENV=development DEBUG=loopback:connector:mssql node --tls-min-v1.0 --inspect elixir/server.js
- // PB : NOTE -- npm i for client does not complete when NODE_ENV=production
- // therefore bower doesn't get installed !!! which then fails installing the bower dependenciew !!!
- // We work around this by running npm i for client without any NODE_ENV which probably defualts to development.
- // PB : TODO -- Investigate why NODE_ENF has an impact on npm i !??
- // Second time try also doesnt work.
- // repotasks.push(
- // () => {
- // var env = Object.assign({}, process.env)
- // delete env.NODE_ENV
- // console.log(`--------------------second time npm i for client--------------------`)
- // return nodeShellExec(`"${gitbash}"`, ['-c', '"npm i --force"'], {
- // // return nodeShellExec('npm', ['i --force'], {
- // inherit: true, shell: true
- // , cwd: instanceroot + '/' + 'client'
- // , env
- // , title: `npm i for client`
- // }).then(Tasq.then).catch(Tasq.catch)
- // })
-
- var bowerRepos = [{ repo : 'elixir-client'}];
- var bowertasks = [];
- bowerRepos.forEach(repodef => {
- bowertasks.push(() => {
- console.log(instanceroot + '/' + repodef.repo + '/node_modules/bower/bin/bower');
- // var p = nodeShellExec('node_modules/bower/bin/bower', ['install'], {
- var p = nodeShellExec(`"${gitbash}"`, ['-c', '"node_modules/bower/bin/bower i"'], {
-
- inherit: true, shell: true
- , cwd: instanceroot + '/' + repodef.repo
- , env: process.env
- , title: `bower i for ${repodef.repo}`
- }).then(Tasq.then).catch(Tasq.catch);
- return p;
- });
- });
- // console.log('rmtasks.length : ' + rmtasks.length)
- return Promise.all(rmtasks).then(() => any(repotasks)).then(()=>any(bowertasks));
- }).catch(e => {
- console.error(e);
- }).finally(statuslog.finally)
-
- }
- , 'start': (args) => {
-
- var label = clioverrides.cmd;
- var env = Object.assign({}, process.env); // Shallow clone it.
- env.NODE_ENV = clioverrides.node_env || 'development';
- var nodecmd = clioverrides.node_env === 'development' ? 'nodemon' : 'node';
-
- function startFn( o ){
- var cmd = [nodecmd, [`--inspect=${o.debugport}`, '--preserve-symlinks', o.script]];
- console.log(`Starting ${o.name}.`);
- var childPromise = nodeShellExec('cmd', ['/k', getCmdString(cmd) ], {
- // inherit : true,
- shell: true,
- detached: true,
- stdio: 'ignore',
- cwd: instanceroot + o.path
- , env: env
- });
-
- var child = childPromise.process;
- var cpid = child.pid;
- if (typeof child.pid !== 'undefined') {
- childPromise.then(()=>{
- console.log(` *** started Elixir Loopback Server PID(${cpid}) : NODE_ENV=${clioverrides.node_env} ${cmd}`);
- fs.writeFileSync('.elixir-server.elixir.server.pid', '' + cpid);
- })
- .catch(e => console.errror(e) );
- }
- }
-
- if(clioverrides.node_env === 'development') {
- env.DEBUG = 'loopback:connector:' + dbForLabel(label);
-
- startFn( { debugport : 9228, script : 'elixir/server.js', name : 'Elixir Loopback Server', path : '/' + 'elixir-server' } );
- startFn( { debugport : 9227, script : 'bin/www', name : 'Express Server', path : '/' + 'chess-server-lib/server' } );
-
- // cmd = 'node'()
-
- // nodeShellExec('node', ['--inspect=9226', ' bin/www'], {
- // inherit : true,
- // shell: true, detached: true,
- // cwd : 'qms/server',
- // env: env,
- // shell : true
- // })
-
- // nodeShellExec('ember', ['s'], {
- // // inherit : true,
- // shell: true, detached: true,
- // cwd : 'client/',
- // env: env
- // })
- console.log('Starting Elixir Client Host.');
- var cmd = ['ember', ['s']];
- var childPromise = nodeShellExec(...cmd, {
- // var childPromise = nodeShellExec('node', ['--inspect=9227', './node_modules/.bin/ember', 's'], {
- // PB : TODO -- ember debugging.
- // inherit : true,
- shell: true,
- detached: true,
- stdio: 'ignore',
- cwd: instanceroot + '/' + 'client'
- , env: env
- });
- // .catch(e=>console.error(e))
-
- child = childPromise.process;
- if (typeof child.pid !== 'undefined') {
- console.log(`started Elixir Client Host PID(${child.pid}) : NODE_ENV=${process.NODE_ENV} ${cmd}`);
- fs.writeFileSync('.client.server.pid', child.pid, {
- encoding: 'utf8'
- });
- }
- }
-
- }
- , 'stop': (label) => {
- const kill = treeKill;
-
- var serverPid = fs.readFileSync('.elixir-server.elixir.server.pid', {
- encoding: 'utf8'
- });
- fs.unlinkSync('.elixir-server.elixir.server.pid');
- console.log(serverPid);
- kill(serverPid);
-
- serverPid = fs.readFileSync('.express.server.pid', {
- encoding: 'utf8'
- });
- fs.unlinkSync('.express.server.pid');
- console.log(serverPid);
- kill(serverPid);
- }
- , 'model' : () => {
- var etask = ()=>{
- var tasks = [
- () => {
- var p = nodeShellExec('mklink', [ `${processedArgs._[2]}.json`
- , `..\\..\\node_modules\\chess-server-lib\\common\\models\\${processedArgs._[2]}.json`], {
- inherit: true, shell: true
- , cwd : instanceroot + `/${selectedinstance.instanceName}-server/${selectedinstance.instanceName}/models`
- , title: `mklink ${processedArgs._[2]}.json ..\\..\\node_modules\\chess-server-lib\\common\\models\\${processedArgs._[2]}.json`
- , env: process.env
- }).catch((e) => { console.error(e); });
- return p;
- }
- ];
- return any(tasks).then(() => {
- fs.writeFileSync('run.done', 'success');
- }).catch(() => {
- fs.writeFileSync('run.done', 'error');
- })
- };
- etask.statuslog = statuslog;
- etask.selectedinstance = selectedinstance;
- etask.processedArgs = processedArgs;
- etask.runtimestamp = runtimestamp;
- etask.ENV = ENV;
- return shell_verse.runElevated(etask)
- }
-
-
- , 'use' : () => {
- // use a certain named instance.
- // Eg :
- // 1) elxr use elixir
- // 2) elxr use cihsr
- // If environment is not specified defaults to development.
- // 1) NODE=test elxr use elixir
-
- /*// Steps
- 1) Delete Config and Data symlinks
- 2) Make Links for config ({{name}}-config-{{node_env}}) and data with the NODE_ENV specified or default to dev
- 3) Iterates all repos and pull all. 'git', ['pull', '--all'].
- 4) Iterates all repos and checkout to the ENV specified. 'git', ['checkout', checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV]
- 5) Iterates all repos and merge from source configured in mergesource. 'git', ['merge', mergesource],
- */
- // We no longer need to check ruans.. ??? if we were initiated from self invoked privileged shell ?
- if (( /*processedArgs.runas && processedArgs.runas !== 'self' &&*/ !processedArgs.force) &&
- runconfig.NODE_ENV && runconfig.NODE_ENV === (selectedinstance.node_env || runconfig.NODE_ENV) &&
- selectedinstance.instanceName && runconfig.use === selectedinstance.instanceName) {
-
- console.log(`No change detected. Already using requested specs : ${runconfig.NODE_ENV} ${runconfig.use}`);
- if (processedArgs.runas) { fs.writeFileSync('run.done', 'success'); }
- if (existsSync('config') && existsSync('data')){
- return
- }
- }
-
- var tasks = [
- () => {
- var promise = new Promise((resolve, reject)=>{
- existslink('config', function(err, data){
- if(data) {
- shell_verse.removeJuncionOrLink('config')
- .then(()=>{resolve(true);})
- .catch((err) => { console.log('Ignoring benign error : ' + err); return resolve(true); });
- }
- else resolve(false);
- });
- });
- return promise;
- },
- () => {
- var promise = new Promise((resolve, reject)=>{
- existslink('data', function(err, data){
- if(data) {
- shell_verse.removeJuncionOrLink('data')
- .then(()=>{resolve(true);})
- .catch((err) => { console.log('Ignoring benign error : ' + err); return resolve(true); });
- }
- else resolve(false);
- });
- });
- return promise;
- },
- ];
- runconfig.NODE_ENV = process.env.NODE_ENV = process.env.NODE_ENV || runconfig.NODE_ENV || 'development';
- if (processedArgs._[1] && runconfig.use !== processedArgs._[1]) runconfig.use = processedArgs._[1];
- if (!runconfig.use && selectedinstance.instanceName) runconfig.use = selectedinstance.instanceName;
- if (!runconfig.use) { throw 'unspecifed use not allowed. Please specify chess instance name.' }
- // console.log(process.env.cwd)
- fs.writeFileSync(instanceroot + '/run.js', 'module.exports = ' + JSON.stringify(runconfig));
-
- var branch = checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV;
-
- var performPullOrCloneForBranch = (def)=>{
- var promise = Promise.resolve(true);
- if (!branch) {
- var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo);
-
- promise = nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{ branch = __branch;})
- .catch((e) => { console.error(e); return { error: true, message: repo } });
-
- }
-
- return promise = promise.then(()=>{ return elxr.getpulltask(def)() }).catch(e => { console.error( 'performPullOrCloneForBranch : Failed ' + e );})
- };
-
- var performCloneAndCheckout = null;
- // cant use git checkout -b it fails when branch already exists.
- var performCheckout = performCloneAndCheckout = (def) => {if (excludeCheckouts[def.repo]) return Promise.resolve({ 'skipped': true })
-
- return performPullOrCloneForBranch(def).then(()=>{
- nodeShellExec('git', ['checkout', def.branch || checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV], {
- // return nodeShellExec('git', ['switch', '-m', '-C', checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV], {
- // inherit : true, shell: true,
- cwd: instanceroot + '/' + def.repo
- // , stdio : ignore // Use when we want to silence output completely.
- , runas: processedArgs.runas
- , title: `git checkout ${def.branch || checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV} for ${def.repo}`
- }).then(()=>{ console.log( `SUCCESS : git checkout ${def.branch || checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV} for ${def.repo}` ); }).catch((e) => { console.error(e); return { error: true, message: def.repo } });
- })
- };
-
- var mergeSources = {
- 'development': null,
- 'test': 'master',
- 'production': 'master'
- };
- var mergesource = mergeSources[checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV];
-
- // Checkout is reduced to pull provided the current branch is the targetbranch
- if(branch === mergesource) performCheckout = (def) => {
- var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo);
- return nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{
-
- if(branch === __branch) return performCloneAndCheckout(def)
- return performPullOrCloneForBranch(def)
- })
- .catch((e) => { console.error(e); return { error: true, message: repo } })
- };
- // else performCheckout = (def) => { return performPullOrCloneForBranch(def) }
-
- var performPullAll = (def) => {
- if (excludeCheckouts[def.repo]) return Promise.resolve({ 'skipped': true })
- return nodeShellExec('git', ['pull', '--all'], {
- // inherit : true, shell: true,
- cwd: instanceroot + '/' + def.repo
- , runas: processedArgs.runas
- , title: `git pull -all for ${checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV} ${def.repo}`
- }).catch((e) => { console.error(e); return { error: true, message: def.repo } })
- };
-
- var excludeCheckouts = Object.assign(exludeMergeRepos);
- delete excludeCheckouts[`elixir-config-${runconfig.NODE_ENV}`];
- delete excludeCheckouts[`cihsr-config-${runconfig.NODE_ENV}`];
-
- var performMerge = (def) => {
- if (exludeMergeRepos[def.repo]) return Promise.resolve({ 'skipped': true })
- return nodeShellExec('git', ['merge', mergesource], {
- inherit: true, shell: true,
- cwd: instanceroot + '/' + def.repo
- , runas: processedArgs.runas
- }).catch((e) => { console.error(e); })
- };
- if(!mergesource || branch === mergesource) performMerge = () => { return Promise.resolve(true) };
-
- // var performRepoOperation = function(def) {
- // elevatedRunasRepos.map((repo) => enqueueCheckout({ repo, branch: def.branch, requiresElevation : true }))
- // return any(gitRepos.map((repo) => performCheckout({ repo, branch: def.branch})))
- // }
-
- return any(tasks).then(() => {
-
- var task = ()=>{
-
- //target is the env is we specify in elxr use command. Default is dev
- //Switch to target branch
- return any(gitRepos.map((repodef) => { return performCheckout({ repo : repodef.repo, branch}).catch(e=>{ console.log(e); }) } ))
- // pull or clone target branch
- .then(() => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(gitRepos.map((repo) => performPullAll(repo)))
- })
- // switch to source branch
- .then( () => {
- if(!mergesource || branch === mergesource ) return Promise.resolve(true) // Dont do anything if there is no source to merge from.
- return any(gitRepos.map((repodef) => performCheckout({ repo : repodef.repo, branch: mergesource})))
- })
- //Pull on merge source branch
- .then( () => {
- if(!mergesource || branch === mergesource ) return Promise.resolve(true)
- return any(gitRepos.map((repo) => performPullAll(repo)))
- })
- //Switch to target branch
- .then( () => {
- if(!mergesource || branch === mergesource ) return Promise.resolve(true)
- return any(gitRepos.map((repodef) => performCheckout({ repo : repodef.repo, branch})))
- })
- .then( //Merge source branch to target branch
- () => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(gitRepos.map((repo) => performMerge( repo ))).catch(err => { console.error('error in performMerge ' + err); })
- })
- };
- task.statuslog = statuslog;
- var netask = shell_verse.getNonElevatedTask(task);
-
- var eltask = ()=> {
- var opts = {
- inherit: true, shell: true
- , cwd : instanceroot
- , env: process.env
- };
- var tasks = [
- () => {
- // Use junctions to avoid npm package issues
- var target = runconfig.use + '-' + 'config' + '-' + process.env.NODE_ENV;
- var p = shell_verse.createJuntionOrLink('config', target, opts);
- return p;
- }
- ];
- // if (processedArgs._[1]) {
- tasks = tasks.concat( [
- () => {
- var dataToLink = runconfig.use + '-data' + '-' + process.env.NODE_ENV;
- if(!existsSync(dataToLink)) dataToLink = runconfig.use + '-data';
- var p = shell_verse.createJuntionOrLink('data', dataToLink, opts);
- return p;
- }
- ]
- );
- // }
-
- return any(tasks).then(()=>{
- // checkout target branch
- return any(elevatedRunasRepos.map((repodef) => performCheckout({ repo : repodef.repo, branch, requiresElevation : true})))
- // pull or clone target branch
- .then(() => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(elevatedRunasRepos.map((repo) => performPullAll(repo)))
- })
- // switch to source branch
- .then( () => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(elevatedRunasRepos.map((repodef) => performCheckout({ repo : repodef.repo, branch: mergesource, requiresElevation : true})))
- })
- //Pull on merge source branch
- .then( () => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(elevatedRunasRepos.map((repodef) => performPullAll({repo : repodef.repo, requiresElevation : true })))
- })
- //Switch to target branch
- .then( () => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(elevatedRunasRepos.map((repodef) => performCheckout({ repo : repodef.repo, branch, requiresElevation : true})))
- })
- .then( //Merge source branch to target branch
- () => {
- if(!mergesource || branch === mergesource) return Promise.resolve(true)
- return any(elevatedRunasRepos.map((repodef) => performMerge({ repo : repodef.repo, requiresElevation : true }))).catch(err => { console.error('error in performMerge ' + err); })
- })
- .then(() => {
- fs.writeFileSync('run.done', 'success');
- }).catch(() => {
- fs.writeFileSync('run.done', 'error');
- })
- })
- };
- eltask.statuslog = statuslog;
- eltask.selectedinstance = selectedinstance;
- eltask.processedArgs = processedArgs;
- var etask = shell_verse.getElevatedTask(eltask);
-
- return etask().then( ()=>{ return netask() })
-
- }).catch((e) => {
- fs.writeFileSync('run.done', 'error : ' + e);
- })
-
- // Antibiotic stewardship program.
- // 1st use is fine.
- // Max vials dispense
- // 2nd use Pharmacy needs justification Form.
- // Approval after a certain period of time.
- }
- , 'g' : () => {
- if (processedArgs.h) {
-
- console.log('elxr g model [modelname] => generate a model named [modelname]');
- console.log('elxr g vmodel [modelname] => generate a model named [modelname]');
- console.log('elxr g vmodel [modelname] --server=true => generate only a server model named [modelname]');
- console.log('elxr g vmodel [modelname] --all=true => default generate server and client model named [modelname]');
- console.log('elxr g => regenerate all known models');
- return
- }
- // nodeShellExec('npm', ['init', '-y'], options);
- // nodeShellExec('npm', ['init', '-y'], options);
- // })
-
- var g = {
- 'client': () => {
- // ember new --skip-bower --no-welcome --skip-git -b {{blueprint}}
-
- console.info('Creating new ember client named : ' + processedArgs._[2]);
- nodeShellExec('cmd', ['/c', 'ember', 'new', processedArgs._[2]], {
- stdio: ['pipe', process.stdout, process.stderr],
- inherit: true,
- shell: true,
- cwd: path__default["default"].dirname(__dirname),
- env: env
- });
- },
-
- 'modelr': () => {
- var tasks = [
- () => {
- var p = nodeShellExec('"ember"', [
- 'g'
- , 'modelr'
- , processedArgs._[2]], {
- inherit: true, shell: true, env: process.env
- }).then(() => {
- console.log('Blueprint generation complete for : ' + processedArgs._[2]);
- return true;
- }).catch((e) => { console.error(e); });
- return p;
- },
- () => {
- var chromePrefsFile = "C:\\chess\\instances\\elixir_01\\data\\Google\\Chrome\\User Data\\chess\\Preferences";
- var chromeprefs = fs.readFileSync(chromePrefsFile, { encoding: 'utf8' });
- chromeprefs = JSON.parse(chromeprefs);
- var previous = chromeprefs.download.default_directory;
- var parentDir = path__default["default"].dirname(__dirname);
- chromeprefs.download.default_directory = parentDir + "\\client\\app\\templates\\components\\resource";
- fs.writeFileSync(chromePrefsFile, JSON.stringify(chromeprefs));
- // PB : TODO -- detect where chrome is installed.
- // PB : TODO -- set the download dir to the place where files are needed.
- var p = nodeShellExec('"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"', [
- '--user-data-dir="C:\\chess\\instances\\elixir_01\\data\\Google\\Chrome\\User Data"'
- , '--profile-directory="chess"'
- , 'http://localhost:4200/admin/crud/create/' + processedArgs._[2]], {
- inherit: true, shell: true
- , env: process.env
- }).then(() => {
- chromeprefs.download.default_directory = previous;
- fs.writeFileSync(chromePrefsFile, JSON.stringify(chromeprefs));
- return true;
- }).catch((e) => { console.error(e); });
- return p;
- }
- ,
- () => {
- console.log('Browser process should have closed here....');
- return true;
- }
- ];
- any(tasks);
-
- }
-
- , 'undefined' : ()=>{
- console.warn('Are you sure you want to refresh all the models.');
- throw 'NOT YET IMPLMENTED'
- }
-
- , 'vmodel' : (options)=>{
- // node --inspect-brk elxr/index.js g vmodel qlabresults --server=true
- options = options || {
- generate : processedArgs['all'] ? 'all' : processedArgs['server'] ? 'server' : processedArgs['client'] ? 'client' : null
- };
-
- if(!options.generate) return 'Nothing specified for generation'
-
- var name = processedArgs._[2];
- if(!name) return 'No name specified for generation'
- var templateverse = `${selectedinstance.root}/bbhverse/__universe__/vmodel`;
- // var templateverse = `${selectedinstance.root}/bbhverse/__universe__/vmodel/__base__-server-lib/common/lib`
-
- var workingtarget = `${selectedinstance.root}/.elxr/run-${runtimestamp}/temp/vmodelworkingdir`;
- var destination = `${selectedinstance.root}`;
-
- // Create a tmp working copy for staging the changes.
- return copyrecursive(templateverse, workingtarget).then( r => {
-
- var base = 'chess'; // -- The server base from where this instance was dervied from.
- var patternsubstitutions = [
- { strOrregexp : /(__name__)/g, substitutes : [name]}
- , { strOrregexp : /(__instance__)/g, substitutes : [selectedinstance.instanceName]}
- , { strOrregexp : /(__base__)/g, substitutes : [base]}
- , { strOrregexp : /(__microservice__)/g, substitutes : [selectedinstance.microservice || selectedinstance.instanceName]}
- , { strOrregexp : /(__microclient__)/g, substitutes : [selectedinstance.microclient || `${selectedinstance.instanceName}-client` || 'client']} // PB : TODO -- elixir-client etc... use a config to find the microclient..
- ];
- var options = { source : templateverse, target : workingtarget
- , base , destinationroot : destination, workingtarget
- , processingtype : 'inplace', sourcetype : 'filesystem', patternsubstitutions };
-
- var actions = [
- fswalk( workingtarget, options
- , [ function(t, o){
-
- // A series of tasks to be executed on each pattern in patternsubstitutions.
- return any([
- // PB : TODO -- Contentreplace is better addressed in memory instead of file IO so do all regexps in sequence in one shot and then rename.
- ()=>{ return fscontentreplace( t, o ) }
- , ()=>{ return fsrename( t, o ) }
- ])
- }] )
- // Post process links in place.
- , () => dirs((innernode, s, t, o ) => fswalk( path__default["default"].join(workingtarget, innernode.name), bbhverse.assign({}, o, { innernode }), [ templatelink ] )
- , workingtarget, null, options)
- // Move to the final destination. Whole tree should move only top level folders are required.
- // , () => fswalk( workingtarget, options, [ fsrename ])
- // , () => dirs( ( child, src, target, options )=>{ return fs.renameSync(path.join(src, child.name), path.join(target, child.name) ) }
- // , workingtarget, destination )
- ];
-
- return any(actions);
-
- })
-
- }
- };
-
- g[processedArgs._[1]]();
- }
-
- , 'create' : () => { return createInstance(selectedinstance) }
-
- , 'httpget' : () => {
- // RESTAPI.get({
- // hostname: 'git.bbh',
- // // port: 443,
- // protocol : 'http:',
- // path: '/',
- // method: 'GET'
- // }, function(data){ console.log(data)}, function(error){ console.log(error)} )
- return createInstance(selectedinstance)
- }
-
- , 'getuser' : ()=>{ return prerequisites.git.getuser().then(u=>{ console.log(u);}) }
- , 'switch user' : (tousername)=>{ return GIT['switch user'](tousername) }
- };
-
- // independent elxr cli operations
- var noprerequisites = {
- add : true, 'set-url' : true, 'repo-relocate' : true
- , remote : true, 'c' : true, 'h' : true
- , httpget : true, getuser : true
- , 'switch user' : true
- , 'switch' : true
- // , 'undefined' : true
- };
-
- var reconfirmcmds = { create : true };
-
- var subcommandlabels = {
- remote : (`remote ${processedArgs._[1] || ''}`).trim()
- , switch : (`switch ${processedArgs._[1] || ''}`).trim()
- };
-
- var cmds = {
- remote : {
- // return a interpreted set of arguments for this comd run context.
- interpret() {
- return { cmd : subcommandlabels['remote'], runchoice : 'c' }
- }
- }
- , resetgitconfig : {
- // return a interpreted set of arguments for this comd run context.
- cmdFn : resetgitconfig
- , interpret() { return { cmd : 'resetgitconfig' } }
- , getPossiblePrompts(){ return {} }
- , noprerequisites : true
- , independentcmd : true
- }
- , reinit : {
- // return a interpreted set of arguments for this comd run context.
- cmdFn : reinit
- , interpret() { return { cmd : 'reinit' } }
- , getPossiblePrompts(){ return {} }
- , noprerequisites : true
- , independentcmd : true
- , requiresElevation : true
- , requires : [ generateDependencies ]
- }
- , init : {
- // return a interpreted set of arguments for this comd run context.
- cmdFn : init
- , interpret() { return { cmd : 'init' } }
- , getPossiblePrompts(){ return {} }
- , noprerequisites : true
- , independentcmd : true
- , requiresElevation : true
- , requires : [ generateDependencies ]
- }
- , switch : {
- interpret() {
- return { cmd : subcommandlabels['switch'], runchoice : 'c', username : processedArgs._[2]
- , reposerver : __default.reposerver
- }
- }
- , getPossiblePrompts(){ return { username : true, reposerver : 'http://git.bbh' } } // Requires only one argument...
- }
- , 'switch user' : {
- interpret() {
- return { cmd : subcommandlabels['switch'], runchoice : 'c', username : processedArgs._[2] }
- }
- , getPossiblePrompts(){ return { username : true } } // Requires only one argument...
- }
-
- // Flat linear structure. Every subcommand should have a top level 'label'
- , 'users' : {
- // default to the users list
- subcommands : { list : {} }
- , cmdFn : ()=>getCredentials() // default
- , cmd : 'users'
- , noprerequisites : true
- }
- , 'users list' : {
- cmdFn : ()=>getCredentials()
- , cmd : 'users list'
- , noprerequisites : true
- }
- , 'get-upstream' :{
- cmdFn : op['get-upstream'] // default
- , cmd : 'get-upstream'
- , noprerequisites : true
- , independentcmd : true
- , interpret() { return { cmd : 'get-upstream' } }
- , getPossiblePrompts(){ return {} }
- }
- , 'g' : {
- cmdFn : op['g'] // default
- , cmd : 'g'
- , noprerequisites : true
- , getPossiblePrompts(){ return {} }
- }
- , 'link' : {
- 'cmd' : 'link'
- // , cmdFn : function( sourecpath, filename, dir ){
- // var afterTargetPath = (dir)=>{
- // console.dir(dir);
-
- // // var tasks = [
- // // () => {
- // // // Use junctions to avoid npm package issues
- // // var p = nodeShellExec('mklink', ['/J', filename, sourecpath], {
- // // inherit: true, shell: true
- // // , cwd : dir || instanceroot
- // // , env: process.env
- // // }).catch((e) => { console.error(e) })
- // // return p;
- // // }
- // // ];
-
- // }
-
- // // console.dir(process.env)
- // if(!dir) getCurrentFolder().then(afterTargetPath);
- // else afterTargetPath(dir)
-
- // }
- , cmdFn : function( cmdopts ){
- // sourecpathandfile should include name of file name
- targetfilename = cmdopts.targetfilename || processedArgs._[1];
- // console.log(processedArgs)
- if(!targetfilename) return Promise.reject('error no file provided for linking')
- targetdir = cmdopts.targetdir || process.env.wd;
- sourecpathandfile = cmdopts.sourecpathandfile || path__default["default"].normalize(`../../node_modules/chess-server-lib/common/models/${targetfilename}`);
-
- var tasks = [
- () => {
- // Use junctions to avoid npm package issues
- var p = nodeShellExec('mklink', [path__default["default"].normalize(`${targetdir + '/' + targetfilename}`), sourecpathandfile], {
- inherit: true, shell: true
- , cwd : targetdir
- , env: process.env
- }).catch((e) => { console.error(e); });
- return p;
- }
- ];
- var etask = ()=>{
- return any(tasks).then(() => {
- fs.writeFileSync('run.done', 'success');
- }).catch(() => {
- fs.writeFileSync('run.done', 'error');
- })
- };
- etask.statuslog = statuslog;
- etask.selectedinstance = selectedinstance;
- etask.processedArgs = processedArgs;
- etask.runtimestamp = runtimestamp;
- etask.ENV = ENV;
- return shell_verse.runElevated(etask)
- }
- , noprerequisites : true
- , privileged : true
- }
- };
-
- var elxrcmd = (function(){
-
- var __cmdprototype = function(){};
- function subcommandlabelFor(cmd, sub){ return (`${cmd} ${sub || ''}`).trim() }
-
- var __cmd = {
- interpret() { return { cmd : this.cmd } }
- , getPossiblePrompts(){ return {} } // Requires only one argument...
- , cmdFn : ()=>{ throw "Elxr Unknown command."}
- , finalized : true
- };
-
- function __createO(o){
- if(o.finalized) return o;
- var subs = Object.keys(cmds[o.cmd].subcommands || {});
- // console.log(subs)
- // console.log(o)
- subs.forEach(sub=>elxrcmd.create( cmds[subcommandlabelFor(o.cmd, sub)] ));
-
- var created = bbhverse.assign_core( { keycase: true, arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , {}, __cmd, cmds[o.cmd], o);
- cmds[o.cmd] = created;
- op[o.cmd] = created.cmdFn;
- noprerequisites[o.cmd] = created.noprerequisites;
- return created.cmdFn;
- }
-
- function create(o){ return __createO(o) }
-
- __cmdprototype.create = create;
-
- return __cmdprototype;
- })();
-
- elxrcmd.create(cmds['users']);
- elxrcmd.create(cmds['g']);
- elxrcmd.create(cmds['link']);
-
- var interpretrun = function(){
-
- var cmd = processedArgs._[0];
- var clioverrides = { cmd };
- processedArgs.node_env ? clioverrides.node_env = processedArgs.node_env
- : (process.env.NODE_ENV && process.env.NODE_ENV.trim())
- ? clioverrides.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) : null;
-
-
- return cmds[cmd] ? cmds[cmd].interpret() : (function(){
- processedArgs._[1] ? clioverrides.instanceName = processedArgs._[1]: null;
- // return clioverrides
- cmds[cmd] = {
- interpret() {
- return Object.assign(clioverrides, { cmd, runchoice : 'c' })
- }
- , getPossiblePrompts(){ return { cmd, username : true, password : true,
- instanceName : true, instanceType : true, reposerver : true } }
- };
- return cmds[cmd].interpret()
- })()
- };
-
- var clioverrides = interpretrun();
- console.dir(clioverrides);
-
-
- var cliname = 'elxr';
- var ver = '1.1';
- var readme = `
- Command syntax examples
-
- elxr
- Displays help. Same as elxr h
-
- elxr i
- Runs interactive propmts to help choose installation options.
-
- NODE_ENV={{yourenvironment}} elxr {{cmd}} {{instancename}} {{otheroptions}}
- General command syntax.
- Eg: NODE_ENV=development elxr pull elixir
-
- Note : Although {{instancename}} is generally a positional parameter supplied immediately after the cmd for most cmd's.
- The specific cmd defines what the value is interpreted as.
- There are several cmds that do not require an {{instancename}} parameter.
- Eg: elxr remote remove origin
- Git operations or passthrough external commands on all repository folders in you working directory.
-
- Main objectives.
- elxr cli is a wrapper around other shell commands and api based operations.
- One of the main objetives it achives is ease of use of repeating an individual cmd multiple times on all targets.
- Eg: A git operation like pull can be repeated consistently on a set of git repositories.
-
- `;
- var help = `
- ${readme}
-
-
- # list of commands... please refer dveloper documentation for ${cliname}
- \r\n\t${
- Object.keys(op).join('\r\n\t')
- }
- `;
-
- var elxr = {
- help() {
- return source.cyanBright(`
- -------------------------------------------------------------------------------
- *** BBH Elixir ***
- -------------------------------------------------------------------------------
- elxr ${ver}
- A cli tool for chess
- ${help}
- -------------------------------------------------------------------------------
- `)
- }
- , info() {
- return source.cyanBright(`
- -------------------------------------------------------------------------------
- *** BBH Elixir ***
- -------------------------------------------------------------------------------
- elxr ${ver}
- A cli tool for chess
- -------------------------------------------------------------------------------
- `)
- }
- , getpulltask(args){
-
- // def can be an instance config
- // Or an object with many repos and elevated repos
- // Or a single repo ( Either Elevated or normal. )
-
-
- // USAGE
- // elxr pull elixir origin master
- // elxr pull
-
- // not all remote branches are setup to be tracked locally (respective remotes and branches).
- // pull --all is useless. As it fetches all remotes and branches but only merges current branch.
- // apart from remote tracking branches We are interested in pulling from all remotes and relavant branches.
- // The branch pipline should feed back to master
- // master -> test -> stage -> release[nnnn] -> production
- // (master) <= git merge [all remotes] production && git merge [all remotes] release[nnnn]
- // git merge [all remotes] stage && git merge [all remotes] test && git merge [all remotes] master
-
- ({
- remotename : args.remotename|| processedArgs._[2]
- , url : args.url || processedArgs._[3]
- , branch : args.branch || processedArgs._[4] // If branch not specified opearte on the current branch of each working directorys
- });
-
- // var commands = [
- // // ['git', ['checkout', __args.branch || checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV]]
- // ,
- // ]
-
- // var parameters = ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;']
- // var pullCmd = [ gitbash
- // , ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;']
- // , { cwd: instanceroot + '/' + repo, title : 'pull all remotes for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }]
-
-
-
- var def = args || {
- repos : selectedinstance.repos,
- elevated : selectedinstance.elevated
- };
-
- var elevatedpulltasks = null;
- if(def.repo) {
- // Single repo case.
- if(def.repo.requiresElevation) {
- var t1 = function() {
- return performPull(def).then(() => {
- return true;
- }).catch((e) => {
- console.error(e);
- }).finally(Traq.finally)
- };
- t1.statuslog = statuslog;
- t1.selectedinstance = selectedinstance;
- t1.processedArgs = processedArgs;
- elevatedpulltasks = shell_verse.getElevatedTask( t1 );
- }
- else {
- var t2 = function(){
- return performPull(def).then(() => {
- console.log('pulled ' + JSON.stringify(def.repo));
- return true;
- }).catch((e) => {
- console.error(e);
- }).finally(Traq.finally)
- };
- t2.statuslog = statuslog;
- var regularpulltasks = shell_verse.getNonElevatedTask( t2 );
- }
- if(elevatedpulltasks) return elevatedpulltasks //getTaskWithElevation( { elevatedpulltasks, regularpulltasks} )
- else return regularpulltasks // getTaskWithoutElevation({ regularpulltasks})
- }
-
- // console.log(`-------------------Processing pull for : ${def.repo} ${def.branch}`)
- console.dir(def);
-
- Object.assign({}, process.env); // Shallow clone it.
- console.log('Running exlr pull : ' + path__default["default"].dirname(__dirname));
-
- processedArgs.useGitPull || false;
-
- if(def.elevated || def.repos) {
- if(def.elevated) def.requiresElevation = true;
- else delete def.requiresElevation;
- }
- else {
- if(def.requiresElevation) def.elevated = [def];
- else def.repos = [def];
- }
-
-
- var regularpulltasks = function(){ return Promise.resolve(true) };
- if(def.elevated){
- elevatedpulltasks = function() {
- var eBatch = [];
- def.elevated.map((def) => getPullTask(def, null, null, null, eBatch));
- return shell_verse.runElevatedBatch(eBatch).then(() => {
- return true;
- }).catch((e) => {
- console.error(e);
- })
- };
- elevatedpulltasks.statuslog = statuslog;
- }
- if(def.repos) {
- var regularpulltasks = function(){
- var pendingpulls = [];
- def.repos.forEach((def) => {
- pendingpulls.push(
- performPull(def).then(()=>{ console.log('pulled ' + JSON.stringify(def.repo)); })
- .catch(e => { console.log(e); throw e })
- );
- });
- return any(pendingpulls).finally(Traq.finally)
- };
- regularpulltasks.statuslog = statuslog;
- }
- // if(elevatedpulltasks) return getTaskWithElevation( { elevatedpulltasks, regularpulltasks} )
- // else return getTaskWithoutElevation({ regularpulltasks})
- return any([ elevatedpulltasks, regularpulltasks ])
- }
- };
-
- function preworkerconfig(){
- // Everything runs after this check is completed. Elevation occurs out of process when needed.
- gitRepos = selectedinstance.repos;
- // gitRepos = ['chess-server-lib'];
-
- // Repositiories that have symlinks that require elevated priviletes in windows to create symlinks
- elevatedRunasRepos = selectedinstance.elevated;
- // Repos that should excluded from merge for releases...
- exludeMergeRepos = selectedinstance.exludeMergeRepos;
- }
-
-
- // The main elxr cli process
- function elxrworker() {
-
- var __runcmd = function (label) {
- var distinquishedlabel = subcommandlabels[label] || label;
- return op[distinquishedlabel] ? op[distinquishedlabel](processedArgs) : null;
- };
-
-
- // --runas
- if (processedArgs.runas) {
- // Weve been asked to run in priviledged mode. Check if we already are privileged.
- // return __runcmd('runas')
- // we no longer have a runas function. This has been moved to shellverse.requestElevation...
- // Each task has knowledge of requiring elevation and will handle elevation requests as needed. Preferably the task will participate in a batch and queue itself.
- //
- return __runcmd(processedArgs.label || processedArgs._[0] || 'undefined');
- }
- else return __runcmd(processedArgs.label || processedArgs._[0] || 'undefined');
- }
-
- // function acquireChoices(selectedinstance) {
-
- // var hasconfig = false;
- // console.warn(chalk.cyan(`
- // -------------------------------------------------------------------------------
- // Could not locate your preferred configuration (you may not specified it)
- // You should fork the default chess configuration to customize and make it
- // your own instance with a named config as
- // {{yourowninstancename}}-config-{{yourchosenenvironment}}
- // And then run this tool as follows
- // NODE_ENV={{yourchosenenvironment}} elxr i {{yourowninstancename}}
- // OR
- // Run this tool with the following command to use a quick start default.
- // elxr --default
- // OR
- // Choose one of the options below to run interactively.
-
- // We will run your choice at the next prompt.
- // -------------------------------------------------------------------------------
- // `))
-
- // var choices = getInteractionPoints(detectedinstanceoptions, __interactive_prompts)
- // var todo = any( __interactive_prompts(selectedinstance, choices) ).then(()=>{
- // return initinstances(selectedinstance)
- // })
-
- // // var prompt = cli.prompter;
- // // return prompt.ask(`Choose an option :
- // // d) Install the default chess instance.
- // // => elxr i chess node_env=development --default
- // // n) Create your custom new instance interactively
- // // => elxr i {{instanceName}} node_env={{environment}}
- // // i) Choose an instance and environment to install
- // // => elxr i {{instanceName}} node_env={{environment}}
- // // c) Choose a command to run ( pull, use, i, npmi ... ) <= pull
- // // => elxr {{cmd}} {{instanceName}} node_env={{environment}}
- // // h) Help
- // // q) Quit
- // // Default <= d
- // // : `).then((choice) => {
- // // if (choice && choice === 'd' || !choice) {
- // // processedArgs._[0] = 'i'
- // // selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess'
- // // selectedinstance.node_env = processedArgs.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env || 'development'
- // // selectedinstance.reposerver = 'https://git.bbh.org.in'
- // // }
- // // else if (choice === 'h') {
- // // processedArgs._[0] = 'h'
- // // fs.writeFileSync('run.done', 'noop help');
- // // console.log(elxr.help()); process.exit()
- // // }
- // // else if (choice === 'n' || choice === 'i') {
- // // var p1 = cli.prompter;
- // // return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) {
- // // processedArgs._[0] = 'i'
- // // selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName;
- // // return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) {
- // // selectedinstance.node_env = processedArgs.node_env = node_env || selectedinstance.node_env
- // // if (choice === 'n') {
- // // selectedinstance.reposerver = 'https://git.bbh.org.in'
- // // console.warn(
- // // chalk.magenta('No Option Available. Your account may not have privileges. You can request here http://git.bbh.org.in/chess'))
- // // process.exit();
- // // }
-
- // // return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) {
- // // selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
- // // })
- // // })
- // // })
- // // } else if (choice === 'c') {
- // // var p1 = cli.prompter;
- // // return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) {
- // // selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName
- // // return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) {
- // // selectedinstance.node_env = processedArgs.node_env = node_env || selectedinstance.node_env
- // // return p1.ask(`Enter cmd :
- // // p) pull
- // // Default <= p
- // // : `).then(function (cmd) {
- // // if (!cmd || cmd === 'p') {
- // // processedArgs._[0] = 'pull'
- // // }
- // // else processedArgs._[0] = cmd
- // // return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposerver || selectedinstance.reposervers[0]} ) : `).then(function (reposerver) {
- // // selectedinstance.reposerver = reposerver || selectedinstance.reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
- // // })
- // // })
- // // })
- // // })
- // // } else {
- // // console.log(chalk.gray(`Default option not exercised. Please follow manual instructions to customize your instance here http://git.bbh.org.in/chess and try again.`));
- // // fs.writeFileSync('run.log', ', ' + JSON.stringify({ success: 'quit without execution' }), { 'flag': 'a+' })
- // // fs.writeFileSync('run.done', 'noop quit');
- // // process.exit()
- // // }
- // // })
- // }
-
-
- // PB : TODO -- Move this to utils assign... as an array merge option.
- var mergeObjByKey = function(arrOfObjs, keyName) {
-
- var keyedDistinct = {};
- var distinctArrOfObjs = [];
-
- arrOfObjs.forEach( o => {
- if(o) (keyedDistinct[o[keyName]] || (keyedDistinct[o[keyName]] = []) ).push(o);
- });
- Object.keys(keyedDistinct).forEach(key => {
- distinctArrOfObjs.push( bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , ...keyedDistinct[key] ) ); // PB : TODO -- Shallow use utils.assign
- });
-
- return distinctArrOfObjs;
- };
-
- var cacheWriteInstanceConfig = function(chessinstances){
- var instanceName = chessinstances['current_run'].instanceName;
- var node_env = chessinstances['current_run'].node_env;
- // PB : TODO -- We should be able to do simply merge at a higher level using assign
- chessinstances[instanceName][node_env].repos = mergeObjByKey(chessinstances[instanceName][node_env].repos || [], 'repo') ;
- chessinstances[instanceName][node_env].elevated = mergeObjByKey(chessinstances[instanceName][node_env].elevated || [], 'repo') ;
- fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' });
- };
-
-
-
- var hostname = os__default["default"].hostname();
- var clustername = null; // PB : TODO -- Prompt to acquire.
- var configs = (function(){
- // We need to discover and use the most specialized config available.
- // Two passes are required as the config currently cloned may be switched by the discovery.
- // If the repo name is the same but has different remotes the newly acquired config from multiple remotes may
- // iteself redefine the remotes, repos and servers for the config which we need to honor..
- return {
- ownerClusterNodeConfig(selected) {
- // Hostname and therefore clusternodename can be anything and can participate in many clusters.
- // Also many cluster node instance can be running as a set of services on the same host on the same port with ( specific domain names )
- var clusternodename = hostname || `CHESS0001${selected.username}`; // Cluster node names need to be unique accross all clusters to avoid collitions.
- clustername = clustername || `${selected.username}-CHESS-${selected.node_env}`;
- return __acquireConfig(selected, { remote : 'userfork' } // PB : TODO -- accessiblity state should switch to public etc..
- , selected.instanceName + '-config-' + selected.node_env + `-${clusternodename}`
- , function(e){ console.info('Customized node level config not found. This is not an Error. Will attempt with owner level config.');
- return e; }
- )
- }
- , ownerInstnace(selected) { return __acquireConfig(selected, { remote : 'userfork' }
- , selected.instanceName + '-config-' + selected.node_env
- , function(e){ console.info('Customized user level config not found. This is not an Error. Will attempt global common instance config.');
- return e }
- )
- }
- // PB : TODO -- Use the ORG level instance before falling back to common Instance coz common instance may not exist for certain orgs.
- , commonInstance(selected) { return __acquireConfig(selected, { defaultRepoOwner }
- , undefined
- , function(e){
- // PB : TODO -- console.info('This is probably an error unless the user is asking to create a new instance with this name.')
- statuslog.statuslog(e, e);
- var manifestpath = path__default["default"].normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest');
- bbhverse.assign_core( { keycase : true, arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , selectedinstance, commonjsRequire(manifestpath,"/$$rollup_base$$")( null, { utils: bbhverse, username : selectedinstance.username, instanceName : selectedinstance.instanceName
- , node_env : selectedinstance.node_env, reposerver : 'https://git.bbh.org.in' } ));
- console.dir(selectedinstance.repos);
- // Config from server always override merges into selection except for the current selection.
- // PB : TODO -- utils.assign Array merges are non-distinct...
- if(selectedinstance?.repos && !selectedinstance.repos[0].repo) {
- console.warn('repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.repos = selectedinstance.repos.map(function(repo){ return { repo } });
- }
- if(selectedinstance?.elevated && !selectedinstance.elevated[0]?.repo) {
- console.warn('elevated repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } });
- }
- chessinstances[selected.instanceName][selected.node_env] = selectedinstance = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , selected, selectedinstance);
- chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers));
- selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0]; // PB : TODO -- Attempt first one that is available and online...
- cacheWriteInstanceConfig(chessinstances);
- // ENV.NODE_ENV = selectedinstance.node_env;
- throw e
- }
- ) }
- // , genericChessInstance(selected) { return __acquireConfig(selected) }
- }
- })();
-
- var eNotImplemented = function(){
- console.error('Not yet implemented');
- process.exit();
- };
-
- // PB : TODO -- accept additional arg - an array specifying custom configPriority.
- var acquireConfig = function(slections){
- var configPriority = [ 'ownerClusterNodeConfig', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ];
- return any(configPriority.map(cfg => { return function() { return configs[cfg](slections) } } ), true, true).then(()=>{
- return acquireData(slections)
- })
- };
-
- var instanceData = (function(){
- return {
- ownerClusterNodeData(selected) {
- var clusternodename = hostname || `CHESS0001${selected.username}`; // Cluster node names need to be unique accross all clusters to avoid collitions.
- clustername = clustername || `${selected.username}-CHESS-${selected.node_env}`;
- return __acquireData(selected, { remote : 'userfork' }
- , selected.instanceName + '-data-' + selected.node_env + `-${clusternodename}`
- , function(e){ console.info('Customized node level data not found. This is not an Error. Will attempt with owner level config.');
- return e; }
- )
- }
- , ownerInstnace(selected) { return __acquireData(selected, { remote : 'userfork' }
- , selected.instanceName + '-data-' + selected.node_env
- , function(e){ console.info('Customized user level data not found. This is not an Error. Will attempt global common instance config.');
- return e }
- )
- }
- // PB : TODO -- Use the ORG level instance before falling back to common Instance coz common instance may not exist for certain orgs.
- , commonInstance(selected) { return __acquireData(selected, { defaultRepoOwner }
-
- // , function(e){ console.info('This is probably an error unless the user is asking to create a new instance with this name.') }
- ) }
- , genericChessInstance(selected) { return __acquireData(selected) }
- }
- })();
-
- var acquireData = function(slections){
- var configPriority = [ 'ownerClusterNodeData', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ];
- return any(configPriority.map(cfg => { return function() { return instanceData[cfg](slections) } } ), true, true)
- };
-
-
- function reinit(){
- sysAddPathVar('%AppData%\\npm');
- resetgitconfig();
- }
-
- function init(){
- sysAddPathVar('%AppData%\\npm');
- resetgitconfig();
- }
-
-
- function resetgitconfig(){
-
- // https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage
- // Git Credential storage...
- // git config --global credential.helper 'store --file ~/.gitcredentials'
- // git credential-store --file ~/.gitcredentials store
- // // notepad C:/Program Files/Git/etc/gitconfig
- // git config --global --unset credential
- // git config --edit --system
- // git config --global credential.helper "store --file ~/gitcredentials"
- // git credential fill
- // git credential-store --file ~/git.store store
-
- // Find system git config
- // git config --global --edit
- // git config --list --show-origin
- // git config --list --show-origin --show-scope
-
-
- // https://stackoverflow.com/questions/35942754/how-can-i-save-username-and-password-in-git
- // Recipie
- // git config --global --unset credentials.helper
- // cd /path/to/my/repo
- // git config --unset credential.helper
- // git config credential.helper 'store --file ~/.git_repo_credentials'
- // git config credential.*.username my_user_name
- // git config credential.https://gitlab.com.username my_user_name
-
- // git credential fill
- // git config --global credential.modalprompt false // doesnst work.
- // core askpass = ;;; https://stackoverflow.com/questions/37182847/how-do-i-disable-git-credential-manager-for-windows
- var options = {
- inherit: true, shell: true //, env: process.env
- , cwd: instanceroot
- , runas: processedArgs.runas
- };
-
- var task = ['git', ['config'], options];
-
- var tasklist = [
- // ['--global', '--unset credentials.helper']
- // ['--unset', 'credentials.helper']
- // ,
- // ['credential.helper', `'store --file git_repo_credentials'`]
- ['--global', 'credential.helper', "'store --file ~/.git_repo_credentials'"]
- , ['--global', '--replace-all', 'user.name', 'pb']
- , ['--global', '--replace-all', 'user.email', 'pradeep@bbh.org.in']
-
- // , ['--list']
- // , ['credential', 'fill']
- ];
- var onEachError = e => console.error( e.messages.join('\n') + e.result + '\n' + require$$0__default["default"].inspect(e) + '\n');
- var shellT = (args) => { return getgitbashtask(args, onEachError)
- // .catch(e => console.error( e.messages.join('\n') + e.result + '\n' + util.inspect(e) + '\n' + tasq.toString()) )
- };
- execserial(tasklist, task, shellT);
- }
-
- var createTasq = (args, shellT, onEachError) => {
- var tasq = shellT ? shellT(args) : (() => { return nodeShellExec.apply(null, args).catch( onEachError || function(e){ console.error(e); } ) });
- tasq.toString = function(){ return JSON.stringify(args)};
- return tasq;
- };
-
- var execserial = function(tasklist, task, shellT){
- var exec = (taskArgs)=>{
- var thistask = task.concat();
- thistask[1] = thistask[1].concat();
- thistask[1].push.apply(thistask[1], taskArgs);
- return createTasq(thistask, shellT)
- };
-
- return any(tasklist.map(exec))
- };
-
-
- var __acquireConfig = function (selected, options, configrepo, errHandler) {
-
- configrepo = configrepo || selected.instanceName + '-config-' + selected.node_env;
-
- var errorHandler = (e) => {
- if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${configrepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){
- // console.error('Could not connect to repo server. Timed Out')
- return cliverse.prompt( ['(y)es', '(n)o', '(r)etry'], 'Could not connect to repo server. Timed Out. Would you like to switch server ? (y/n) ', 'y' ).then(propValue => {
-
- if(propValue === 'y') {
- reconfirm = getReconfirmAll();
- return startElxr()
- }
- else if(propValue === 'r'){
- return acquireConfig(selected)
- }
- else process.exit();
- })
- }
-
- if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${configrepo}.git/' not found`))){
- var choices = {
- t : `install a new temporary local instance with this name ( will not persist ).
- Use your own username for additional options. You can request for a username at chess@bbh.org.in )`
- , e : 'exit' };
-
- if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') {
- choices = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , {
- i : 'create a new instance with this name => will fork the default config under your username'
- , f : 'fork a new instance with this name for yourself for this node from another instance'
- , o : 'fork a new instance with this name for your organization from another instance' // prompt organization name...
- , c : 'create a custom config for yourself for this node' // prompt hostname as nodename
- , p : 'create a custom config for yourself '
- }, choices);
- }
-
- return cliverse.prompt( choices
- , 'Config for instance not found. Would you like to ', 'e' ).then(propValue => {
-
- if(propValue === 't') {
- selectedinstance.local = true; return createInstance(selectedinstance)
- }
- if(propValue === 'i') return eNotImplemented()
- if(propValue === 'f') return eNotImplemented()
- if(propValue === 'o') return eNotImplemented()
- if(propValue === 'c') return eNotImplemented() // return createLocalChessInsance(selectedinstance)
- if(propValue === 'p') return eNotImplemented() // return createChessInstance(selectedinstance)
- // if(propValue === 'o') createChessInstance(selectedinstance, orgname)
- else process.exit();
- })
- }
-
- console.warn(e);
- throw e; //('Config acquisition failed.')
- };
-
- var successHandler = () => {
-
- var manifestpath = path__default["default"].normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest');
- bbhverse.assign_core( { keycase : true, arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , selectedinstance, commonjsRequire(manifestpath,"/$$rollup_base$$")( null, { utils: bbhverse, username : selectedinstance.username, instanceName : selectedinstance.instanceName
- , node_env : selectedinstance.node_env, reposerver : 'https://git.bbh.org.in' }));
- console.dir(selectedinstance.repos);
- // Config from server always override merges into selection except for the current selection.
- // PB : TODO -- utils.assign Array merges are non-distinct...
- if(!selectedinstance.repos[0].repo) {
- console.warn('repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.repos = selectedinstance.repos.map(function(repo){ return { repo } });
- }
- if(selectedinstance.elevated[0] && !selectedinstance.elevated[0].repo) {
- console.warn('elevated repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } });
- }
- chessinstances[selected.instanceName][selected.node_env] = selectedinstance = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , selected, selectedinstance);
- chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers));
- selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0]; // PB : TODO -- Attempt first one that is available and online...
- cacheWriteInstanceConfig(chessinstances);
- ENV.NODE_ENV = selectedinstance.node_env;
- };
-
- return performPull( selected.reposindexed[configrepo] || { repo : configrepo }
- , null, selected.username || options.defaultRepoOwner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler )
- .catch( (e)=>{
- // if(e){
- if(Promise.resolve(e) === e) return e;
- // console.error(e)
- e.benign = true;
- throw e; // Not a hard error but we need this for bcontinueonfailure as we still want to stop on firstsuccess.
- // }
- })
- };
-
- var __acquireData = function (selected, options, datarepo, errHandler) {
-
- datarepo = datarepo || selected.instanceName + '-data';
-
- var errorHandler = (e) => {
- if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${datarepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){
- // console.error('Could not connect to repo server. Timed Out')
- return cliverse.prompt( ['(y)es', '(n)o', '(r)etry'], 'Could not connect to repo server. Timed Out. Would you like to switch server ? (y/n) ', 'y' ).then(propValue => {
-
- if(propValue === 'y') {
- reconfirm = getReconfirmAll();
- return startElxr()
- }
- else if(propValue === 'r'){
- return acquireConfig(selected)
- }
- else process.exit();
- })
- }
-
- if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${datarepo}.git/' not found`))){
- var choices = {
- t : `install a temporary local data folder.
- For more options. Request and use a personal username at chess@bbh.org.in )`
- , e : 'exit' };
-
- if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') {
- choices = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , {
- i : 'create a new instance with this name => will fork the default config under your username'
- , f : 'fork a new instance with this name for yourself for this node from another instance'
- , o : 'fork a new instance with this name for your organization from another instance' // prompt organization name...
- , c : 'create a custom config for yourself for this node' // prompt hostname as nodename
- , p : 'create a custom config for yourself '
- }, choices);
- }
-
- return cliverse.prompt( choices
- , 'Data repo for instance not found. Would you like to ', 'e' ).then(propValue => {
-
- if(propValue === 't') {
- selectedinstance.local = true; return createInstanceData(selectedinstance)
- }
- if(propValue === 'i') return eNotImplemented()
- if(propValue === 'f') return eNotImplemented()
- if(propValue === 'o') return eNotImplemented()
- if(propValue === 'c') return eNotImplemented() // return createLocalChessInsance(selectedinstance)
- if(propValue === 'p') return eNotImplemented() // return createChessInstance(selectedinstance)
- // if(propValue === 'o') createChessInstance(selectedinstance, orgname)
- else process.exit();
- })
- }
-
- console.warn(e);
- throw e; //('Config acquisition failed.')
- };
-
- var successHandler = () => {
-
- };
-
- return performPull( selected.reposindexed[datarepo] || { repo : datarepo }
- , null, selected.username || options.defaultRepoOwner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler )
- .catch( (e)=>{
- // if(e){
- if(Promise.resolve(e) === e) return e;
- // console.error(e)
- e.benign = true;
- throw e; // Not a hard error but we need this for bcontinueonfailure
- // }
- })
- };
-
- var launchpath = path__default["default"].resolve(path__default["default"].normalize(process.env.wd));
- var thisscriptdir = path__default["default"].normalize(__dirname); // PB : TODO -- Thisscriptdir could be dislocated when run as a standalone file... We need to detect this where and how we were run.
- // The easisest would be to ask for a target directory and default to current dir....
- // path.dirname(launchpath).split(path.sep).pop()
-
- var parent = path__default["default"].dirname(launchpath);
- var pp = launchpath;
- var instancediscoverytasks = [];
- while(parent !== pp){
- instancediscoverytasks.push(
- ((pa)=>{
- var p = pa;
- return function(){
- return hasElxr(p).then((value)=>{
- if(value) return p
- // PB : TODO -- Using throw like this is not friendly with any...
- throw Object.assign( new Error('Benign Failure in Batch')
- , { value : false, benign : true });
- })
- }
- })(pp)
- );
- pp = parent;
- parent = path__default["default"].dirname(parent);
- }
-
- var instanceroot = null;
- var detectInstanceRoot = any(instancediscoverytasks, true, true).then( ir => {
- if(ir.error) { instanceroot = path__default["default"].normalize(thisscriptdir) === path__default["default"].normalize(launchpath) ? path__default["default"].normalize(thisscriptdir + '/..') : launchpath ; }
- else instanceroot = ir.pVal;
- return instanceroot
- }).catch(()=>{
- instanceroot = path__default["default"].normalize(thisscriptdir) === path__default["default"].normalize(launchpath) ? path__default["default"].normalize(thisscriptdir + '/..') : launchpath ;
- });
-
- // We first load the default and then override with a runconfig if it exists else we override with the interactive prompts.
- // Then acquire and reload and replace this default.
-
- var hasElxr = function(path, options, cb) {
- // PB : TOOD -- Navigate up the folder chain to discover the relevant .elxr directory.
- options = options || {};
-
-
- var tasks = [
- '/elxr' // Is there a subfolder named elxr
- , '/elxr/.git' // which is self git repository
- // , '/elxr/.elxr' // and has .elxr subfolder we now store this in the instanceroot.
- , '/elxr/' + __ALIAS__STAMP__ // Which has our stamp.
- ];
-
- if(options.sync) { return tasks.earlyreduce((acc, tpath)=>{
- var value = existsFolderSync(path + tpath);
- return { value, done : acc && !value };
- }).value }
-
- if(cb) return cb(null, tasks.earlyreduce((acc, tpath)=>{
- var value = existsFolderSync(path + tpath);
- return { value, done : acc && !value };
- }).value );
-
- return Promise.resolve(tasks.earlyreduce((acc, tpath)=>{
- var value = existsFolderSync(path + tpath);
- return { value, done : acc && !value };
- }).value);
- };
-
- var hasElxrSync = function(path){ return hasElxr(path, { sync :true}); };
-
- var detectfromroot = function(root){
- return { root, node_env : path__default["default"].basename(root), instanceName : path__default["default"].basename( path__default["default"].dirname(root) ) }
- };
-
- var detectLocalInstances = function () {
- console.log(`launchpath = ${launchpath}`);
- console.log(`thisscriptdir = ${thisscriptdir}`);
-
- // PB : TODO -- !Postpone this.
- console.log(`instanceroot = ${instanceroot}`); // Not yet confirmed...
-
- // Note : Paths should already be normalized fefore this.
-
- var root = instanceroot;
- var detected = { root };
- var instanceoptions = [clioverrides];
-
- return hasElxr(launchpath).then( (elxrCliExists) => {
-
- // We need a reference to the root director for elxr cli to be properly oriented.
- if (( elxrCliExists && path__default["default"].normalize(launchpath + '/elxr')) === thisscriptdir) {
- // We were run from the proper root with elxr cli in the subfolder.
- instanceroot = root = launchpath;
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- }
- else {
- if(path__default["default"].normalize(launchpath + '/elxr') === thisscriptdir) {
- // elxrCliExists is false -- and yet thiscriptdir is still proper.
- // PB : TODO -- Maybe a warning / abort if for some reason this scriptdir should not be taken over...
- console.error('Warning : detected thisscriptdir as elxr subfolder but not recognized as elixir. git updates might fail.');
- instanceroot = root = launchpath;
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- }
- else if (launchpath === thisscriptdir) {
-
- var parentHasElxr = hasElxrSync(launchpath + '/..');
- // PB : TODO -- verify if we have .elxr folder in the parent...
- if(!parentHasElxr) {
- // ! thisscriptdir is not elxr.
- console.error('Invalid run location in subfolder that looks like elxr. We should probably abort as elxr will not sync.');
- }
-
- // Same directory doesn't mean we are being run from elxr sub directory.
- // In standalone build script we may or not be in the same location.
- if (BUILD_VERSION.indexOf('Version: {version} - built on {date}') > -1) {
- // Unbuilt therefore we are in the elxr sub directory.
-
- instanceroot = root = path__default["default"].normalize(launchpath + '/..');
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- }
- else {
- // Built version.
- // We could have been run from the elxr subfolder. Highly likely that the built version isn't the full elxr.
- if(parentHasElxr) {
- // Built version was run from the full elxr subfolder. Should work
- // PB : TODO -- but we should switch to the full version...
- instanceroot = root = path__default["default"].normalize(launchpath + '/..');
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- }
- else {
- instanceroot = root = launchpath;
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- // Assume current launchpath is a new instance and create.
- // Figure out the instnace name and environment from parent folders as an alternative option with confirmation if not provided in the arguments.
-
- // if(clioverrides.instanceName) {
- // if(clioverrides.node_env) {
- // instanceroot = root = path.normalize(launchpath + '/' + clioverrides.instanceName + '/' + clioverrides.node_env)
- // instanceoptions.splice( 0, 0, detected = { root, instanceName : clioverrides.instanceName, node_env : clioverrides.node_env })
- // // instanceoptions.splice( 0, 0, detectfromroot(root)) // This can be an option but is unnecessary unless a confirmation is provided.
- // // also folder names may have no relation to the actual instanceName and instanceType coz we need to have many
- // // eg : floder name can be elixir01 but instance name is elixr
- // }
- // else {
- // instanceroot = root = path.normalize(launchpath + '/' + clioverrides.instanceName + '/' + 'development')
- // instanceoptions.splice( 0, 0, detected = { root, instanceName : clioverrides.instanceName, node_env : 'development' })
- // instanceoptions.splice( 0, 0, detectfromroot(root)) // A recessive option only.
- // }
- // }
- // else {
- // instanceroot = root = launchpath;
- // if(clioverrides.node_env) {
- // instanceoptions.splice( 0, 0, detected = { root, node_env : clioverrides.node_env })
- // instanceoptions.splice( 0, 0, detectfromroot(root))
- // }
- // else {
- // // Nothing was specified... We only have one option from root.
- // instanceoptions.splice( 0, 0, detected = detectfromroot(launcpath))
- // }
- // }
- }
- }
- }
- else {
- if(elxrCliExists) {
- instanceroot = root = launchpath;
- instanceoptions.splice( 0, 0, detected = { root });
- instanceoptions.splice( 0, 0, detectfromroot(root));
- }
- }
- }
-
- instanceroot = detected.root;
- __default.root = root;
- clioverrides.root = clioverrides.root || root;
-
- // Resolves empty array when No known instances detected.
- return Promise.resolve(instanceoptions)
- })
-
- };
-
- var getReconfirmAll = ()=>{return { instanceName : true, instanceType : true, reposerver : true, username : true, password : true } };
- if(clioverrides.reconfirm) {
- var reconfirm = getReconfirmAll();
- }
- else { var reconfirm = {}; }
-
- var shouldPrompt = function(k, possiblePrompts, target){
- return ((possiblePrompts[k] !== undefined && possiblePrompts[k] !== null) && target[k] !== possiblePrompts[k]
- || (possiblePrompts[k] === undefined || possiblePrompts[k] === null) && (target[k] === undefined || target[k] === null)
- || reconfirm[k])
- };
-
- var getBoundEachPrompt = function(target, possiblePrompts, promptables, choices, promptsfilter) {
- return function(prompts, k, i, a){
- // Reducer for all prompts on targets.
-
- // No local instances config found. We use a default initialized instance available in selectedinstance
- // Confirm those that were not supplied as user choices in runtime args and proceed to reattempt.
- // PB : TODO -- selectedinstance === __default check to prompt everything...
- if( shouldPrompt(k, possiblePrompts, target) ) {
- delete reconfirm[k];
- // console.log(k)
- // console.dir(possiblePrompts); //console.dir(target)
- prompts.push(async ()=>{
- // PB : NOTE -- Important in async cases when this {{target}} needs to be in the same state as when it was invoked.
- // We need to take a snapshot... Shallow.. !! If required deep should be used based on use case.
- // var asyncthis = Object.assign(this);
- // By default Latest altered state is provided which is an implicit reference directly.
- promptables[k].choices = choices[k];
- Object.defineProperty(target, k, getPromptableAsyncPropDescriptor(k, promptables[k]));
- return await target[k]
- });
- }
- delete possiblePrompts[k]; // PB : TODO We should keep this around instead of deleting so we can do a second pass if required.
- return prompts
- }
- };
-
- var __interactive_prompts = function( target, choices, promptsfilter ){
-
- Object.defineProperty(target, 'node_env', { get : function(){ return this.instanceType } });
-
- var interactionpoints = {
- runchoice : {
- label :
- `Choose an option :
- d) Install the default chess instance.
- => elxr i chess node_env=development --default
- n) Create your custom new instance interactively
- => elxr i {{instanceName}} node_env={{environment}}
- i) Choose an instance and environment to install
- => elxr i {{instanceName}} node_env={{environment}}
- c) Choose a command to run ( pull, use, i, npmi ... ) <= pull
- => elxr {{cmd}} {{instanceName}} node_env={{environment}}
- h) Help
- q) Quit
- : `
- , choices : []
- , defaultchoice : 'c'
- , selectedchoice : target.runchoice
- , interpret : function(choice){
- var interpret_map = {
- d : function(){
- processedArgs._[0] = 'i';
- target.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess';
- target.node_env = processedArgs.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env || 'development';
- target.reposerver = 'https://git.bbh.org.in';
- }
- , n : function() { processedArgs._[0] = 'i'; }
- , i : function() {
- processedArgs._[0] = 'i';
- // processedArgs._[1] = target.instanceName || processedArgs._[1] || 'chess';
- }
- , c : async function() {
- // this here will always be the target.
- Object.defineProperty(this, 'cmd', getPromptableAsyncPropDescriptor('cmd', {
- label : `Enter cmd :
- p) pull
- Default <= p
- : `
- , defaultchoice : 'pull'
- }
- ));
-
- var cmd = await target['cmd'];
- if (!cmd || cmd === 'p') { target['cmd'] = processedArgs._[0] = 'pull'; }
- else target['cmd'] = processedArgs._[0] = cmd;
- return cmd;
- }
- , h : function() { console.log(elxr.help()); process.exit(); } // PB : TODO -- Why do we need log.
- , q : function() { process.exit(); }
- };
-
- if(Promise.resolve(choice) === choice){
- return choice.then( resolvedchoice => {
- return (interpret_map[choice] || interpret_map['c']).call(target)
- })
- }
- else return Promise.resolve( (interpret_map[choice] || interpret_map['c']).call(target) )
-
- // var __interpreter = interpret_map[choice] || interpret_map['c']
- // if(!choice) return interpret_map['c']() // This should not happen prompter should always give us a default choice.
- // if(interpret_map[choice]) __interpreter = interpret_map[choice];
-
- // return __interpreter.call(target)
- }
- }
- , instanceName : { label : `Enter Instance Name ( <= ${target.instanceName || 'chess'} ) : `
- , choices : choices['instanceName'], defaultchoice : 'chess'
- , selectedchoice : target.instanceName
- }
- , instanceType : { label : `Enter Instance Type ( <= ${target.instanceType || 'development'} ) : `
- , choices : choices['instanceType'], defaultchoice : 'development'
- , selectedchoice : target.instanceType || 'development'
- }
- , reposerver : { label : `Enter Repo Server Base Url ( <= ${target.reposerver || 'https://git.bbh.org.in'} ) : `
- , get choices() {
- choices['reposerver'].forEach( rs => {
- var __rs = new URL(rs);
- __rs.hostname = __rs.host;
- __rs.path = '/';
- __rs.method = 'GET';
- RESTAPI.get(__rs, function(data){ rs.accessibility = 'unaccessible'; }
- , function(error){ rs.accessibility = 'unaccessible'; } );
- });
- return choices['reposerver']
- }
- , defaultchoice : 'https://git.bbh.org.in'
- , selectedchoice : target.reposerver
- }
- , 'upstream-remote' : { label : `Enter Remote Name ( <= ${target['upstream-remote'] || 'chess'} ) : `
- , get choices() {
- var reposerver = target['reposerver'];
- var remotes = [];
- var trs = target.reposervers || [];
- trs.forEach(rs => {
- if(rs.server === reposerver){
- remotes.push(remote);
- // PB : TODO -- Sort and display highest priority target.remotes.sort( )
- }
- });
- return remotes
- }
- , defaultchoice : 'userfork'
- , selectedchoice : target['upstream-remote'] || 'userfork'
- // Just using getters resolves dependencies..., dependencies : [ ()=>{ return target['reposerver'] } ]
- }
- , 'remote-type' : { label : `Enter Remote Type ( <= ${target['remote-type'] || 'public'} ) : `
- , get choices() {
- return ['public', 'private', 'github', 'unc']
- }
- , defaultchoice : 'public'
- , selectedchoice : target['remote-type'] || 'public'
- // Just using getters resolves dependencies..., dependencies : [ ()=>{ return target['reposerver'] } ]
- }
- , 'selectedremotes' : { label : `Chose Remote Names ( <= ${target['selectedremotes'] || 'chess'} ) : `
- , get choices() {
- var reposerver = target['reposerver']; // PB : TODO -- We need options to work with multiple selected reposervers at the same time..
- var remotenames = [];
- Object.entries(target.remotes || []).forEach( ([rname, r]) => {
- if(r.server === reposerver && r.accessibility.find( target[ 'remote-type' ] )){
- remotes.push(rname);
- // PB : TODO -- Sort and display highest priority target.remotes.sort( )
- }
- });
- // PB : TODO -- Need to generate all possible permuted choices nP( 1 -> n )
- // Currenty handles all combinations without any priority order.
- var _remotechoices = []; // Array of arrays of choices.
- remotenames.forEach( r => {
- var __rcs = [];
- _remotechoices.forEach(rc => {
- __rcs.push( rc.concat(r) );
- });
- Array.prototype.push.apply( _remotechoices, __rcs);
- _remotechoices.push(r);
- });
-
- return _remotechoices
- }
- , defaultchoice : ['userfork-public', 'chess-public']
- , selectedchoice : target['selectedremotes'] || ['userfork-public', 'chess-public']
- // , defaultchoice : { 'userfork-public' : target.remotes['userfork-public'] , 'chess-public' : target.remotes['chess-public'] }
- // , selectedchoice : target['selectedremotes'] || { 'userfork-public' : target.remotes['userfork-public'] , 'chess-public' : target.remotes['chess-public'] }
-
- // Info : Just using getters resolves dependencies..., dependencies : [ ()=>{ return target['reposerver'] } ]
- }
- , get username() { return { label : `Enter User Id for ${target.reposerver} ( <= ${target.username || 'chess'} ) : `
- , choices : choices['username'], defaultchoice : 'chess', selectedchoice : target.username } }
- , get password() { return { label : `Enter Password for ${target.username} @ ${target.reposerver} ( <= ${target.password || ''} ) : `
- , choices : choices['password'], defaultchoice : '***', selectedchoice : target.password } }
- , get email() { return { label : `Enter Email for ${target.username} @ ${target.reposerver} ( <= ${target.email || ''} ) : `
- , choices : choices['email'], defaultchoice : 'guest@bbh.org.in', selectedchoice : target.email } }
-
- };
-
-
- function getPromptKeys() {
- if(! (processedArgs.label || processedArgs._[0]) ) return Object.assign({}, interactionpoints);
-
- return promptkeys
- }
- var eachPrompt = getBoundEachPrompt( target, getPromptKeys() , interactionpoints, choices);
- return Object.keys(promptsfilter || interactionpoints).reduce(eachPrompt, [])
- };
-
-
- var downloadsdir = '../Downloads';
- var prerequisites = [
- {
- shellcmd: 'git',
- name : 'git',
- url: 'https://github.com/git-for-windows/git/releases/download/v2.31.0.windows.1/Git-2.31.0-64-bit.exe'
- , installer: 'Git-2.31.0-64-bit.exe'
- , installcmd: ['cmd', ['/c', 'start',
- '/WAIT', path__default["default"].resolve(downloadsdir + '/' + 'Git-2.31.0-64-bit.exe')
- , '/VERYSILENT'
- // , '/MERGETASKS=!runcode' // This is required only for vscode...
- ]]
- , preinstallsteps: function() {
- var steps = [
- () => {
- if (!existsSync(downloadsdir + '/' + this.installer)) {
- return nodeShellExec(`${selectedinstance.root}/.elxr/run-${runtimestamp}/download.bat`, [this.url, downloadsdir + '/' + this.installer])
- }
- else return Promise.resolve(true)
- }
- ];
- var prompts = this.getuser(null, ()=>{
- // console.log('preinstallsteps')
- // var gitUser = 'guest';
- // var gitEmail = 'guest@bbh.org.in';
- // var prompts = [];
- // prompts.push( ()=>{ return cli.prompt(choices['username'], 'git user name').then(gituser => gitUser = gituser) } )
- // prompts.push( ()=>{ return cli.prompt(choices['useremail'], 'git user email').then(gitemail => gitEmail = gitemail) } )
-
- // console.log('prompting in preinstallsteps')
- // return any(prompts).then(()=>{
- // var steps = [
- // ['git', ['config', '--global', '--add', 'user.name', `${gitUser}`]]
- // , ['git', ['config', '--global', '--add', 'user.email', `${gitEmail}`]]
- // ]
- // return any(steps.map(getshelltask)).then(() => {
-
- // })
- // });
-
- return Promise.resolve(true)
- });
-
- return any([any(steps), prompts])
- }
- , installsteps: function () {
- return any([this.installcmd].map(getshelltask))
- }
- , postinstallsteps: function(err, users){
- return this.getuser(null, (err, data)=>{
- // ignore err and proceed with data as guest.
- console.dir(data);
- if(data && data.length === 1 && !shouldPrompt('username', promptkeys, selectedinstance) ) {
- return username = data[0];
- }
-
- data = data || ['guest'];
- choices['username'] = Array.from( new Set( data.concat( (choices['username'] || []) )) );
-
- console.log('prompting in postinstallsteps');
-
- var username = 'guest';
- var email = 'guest@bbh.org.in';
- var password = '***';
-
- return any( getInteractionPoints(selectedinstance, promptkeys, { username, password, email}) ).then(()=>{
- if(!data.find(e => e === selectedinstance.username)) {
- var steps = [
- ['git', ['config', '--global', '--add', 'user.name', `${username}`]]
- , ['git', ['config', '--global', '--add', 'user.email', `${email}`]]
- ];
- return any(steps.map(getshelltask)).then(() => {
-
- })
- }
- else {
- return Promise.resolve(true)
- }
- });
- })
- }
- , install: function () {
- return any([ /*this.preinstallsteps,*/ this.installsteps.bind(this), this.postinstallsteps.bind(this)])
- }
- , verifyAndInstall : function(){
- return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then((exists) => {
- if(exists) {
- // return any(['git', ['config', '--global', '-l']].map(getshelltask))
- return this.postinstallsteps.bind(this)()
- }
- return this.install();
- });
- }
- , getuser : function(repo, onResult){
-
- var __onResult = onResult || function(e, data){
- data = data || [];
- choices['username'] = Array.from( new Set( data.concat( (choices['username'] || []) )) );
- // console.dir(choices)
- return data[0]
- };
-
- var globalOrLocal = '--global';
- if(repo) globalOrLocal = '--local';
-
- return any([['git', ['config', globalOrLocal, '--get-all', 'user.name']]].map(getshelltask)).then((result)=>{
- // not yet configured.
- if(!result.success) return __onResult(result)
- else {
- var users = result.messages[0].trim().split('\n');
- if(users.length === 0 ||
- users.length === 1 && users[0] === 'guest') {
-
- return __onResult(result)
- }
- else {
- return __onResult(null, Array.from( new Set( users ) ) ); }// PB : TODO == We should probably prompt with all the users available for selection !
- }
- })
- .catch((e)=>{
- console.log(e);
- return __onResult(e)
- })
- }
- }
- ,
- {
- shellcmd: 'node',
- name : 'node',
- url: 'https://nodejs.org/dist/v14.16.0/node-v14.16.0-x64.msi'
- , installer: 'node-v14.16.0-x64.msi'
- , installcmd: ['MSIEXEC.exe', ['/i'
- , path__default["default"].resolve(downloadsdir + '/' + 'node-v14.16.0-x64.msi')
- , 'ACCEPT=YES', '/passive']]
- , install : function() { return any([this.installcmd].map(getshelltask)).then(() => { }) }
- }
- ];
- for(var i$1=0; i$1<prerequisites.length; i$1++) {
- prerequisites[prerequisites[i$1].name] = prerequisites[i$1];
- }
-
- prerequisites.forEach(p=>{ prerequisites[p.shellcmd] = p; });
-
- function ensureDirectoryExistence(filePath) {
- var dirname = path__default["default"].dirname(filePath);
- if (fs.existsSync(dirname)) {
- return filePath;
- }
- ensureDirectoryExistence(dirname);
- fs.mkdirSync(dirname);
- return filePath;
- }
-
- var mainTasks = [];
- function verifyAndInstallPrerequisites() {
- var downloadtasks = [];
- var installtasks = [];
- prerequisites.forEach(preq => {
- downloadtasks.push(getTaskCheckExists(preq.shellcmd, { ignorefailures: true })().then((exists) => {
- if (exists) console.log(`${preq.shellcmd} exists`);
- else {
- console.log(`${preq.shellcmd} is not installed`);
- return preq.preinstallsteps.call(preq).then(() => {
- installtasks.push(preq.install.bind(preq));
- })
- }
- }));
- });
- return Promise.all(downloadtasks).then(() => { return any(installtasks) })
- }
-
- var getPromptableAsyncPropDescriptor = function(propName, promptable){
- return {
- get (){
- return any( promptable.dependencies || [] ).then(()=>{
-
- return cliverse.prompt( promptable.choices, promptable.label, promptable.defaultchoice, promptable.selectedchoice ).then(propValue => {
-
- var asyncprop = Promise.resolve(propValue);
- if(promptable.interpret){
- asyncprop = promptable.interpret(propValue);
- }
-
- return asyncprop.then(
- ()=>{
- Object.defineProperty(this, propName, {
- value: propValue,
- writable: true,
- configurable : true,
- enumerable : true
- });
- return propValue
- }
- )
- })
- } )
-
- }
- // , set (propValue){
- // Object.defineProperty(this, propName, {
- // value: propValue,
- // writable: true, // PB : TODO -- Use this to fix value permanently until run is over.
- // configurable : true,
- // enumerable : true
- // })
- // return propValue;
- // }
- , configurable : true
- , enumerable : true
- }
- };
-
-
-
-
- function acquirelocalinstances(selected){
- // utils.assign is used to cleanup duplicates... assuming chessinstances.js is probably not clean.
- var chessinstances = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , commonjsRequire(path__default["default"].normalize(selected.root + '/chessinstances.js'),"/$$rollup_base$$"));
- return chessinstances
- }
-
- function findlocalinstances(chessinstances, instanceoptions){
- // We can expect a .elxr at each level.
- ['' /* instanceroot */, '../' /* instanceTypes or node_env */, '../..' /* instanceNames */].
- earlyreduce( ( value, p, i, a )=>{
- var localinstancesPath = `${instanceroot}/${p}.elxr`;
- if(existsSync( localinstancesPath )) {
- try {
- var chessinstances = acquirelocalinstances( { localinstancesPath } );
- return Object.keys(chessinstances).earlyreduce( ( value, instanceName) => {
- return Object.keys(chessinstances[instanceName]).earlyreduce( (value, instanceType) => {
- if( path__default["default"].normalize(chessinstances[instanceName][instanceType].root) === path__default["default"].normalize( instanceroot) ) {
- instanceoptions.splice( 0, 0, chessinstances[instanceName][instanceType]);
- return {
- value : chessinstances[instanceName][instanceType]
- , done : true
- };
- }
- })
- })
- }
- catch(e){
- return { }
- }
- }
- else return { }
- }
- );
- }
-
-
- // function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) }
- var selectedinstance = { root : process.env.wd };
- var runconfig = null;
-
- var chessinstances = { current_run : {} };
- var promptkeys = {
- cmd : processedArgs._[0] || 'pull'
- // Try not to prompt anything unless absolutely necessary or reconfirm is forced.
- // 'instanceName' : true
- // , 'node_env' : true
- // , username : ''
- // , runchoice : 'c'
- };
- // promptkeys.runchoice = promptkeys.cmd ? 'c' : undefined
-
- function createLocalChessInstance( cfg ){
- // return createInstance(cfg)
- reconfirm = getReconfirmAll();
- var inst = {};
- var __new = Object.assign({}, __default, cfg);
- inst[cfg.node_env] = __new; return inst;
- }
-
-
- var choices = {
- 'instanceName' : []
- , 'reposerver' : []
- , 'upstream-remote' : []
- , 'instanceType' : []
- , username : ['guest', 'chessdemo', 'demo']
- };
-
- var getInteractionPoints = function(detectedinstanceoptions, possiblePrompts, promptsfilter){
-
- var instances = [];
- var reposervers = [];
- var remotes = [];
- var instanceNames = [];
- var instanceTypes = ['development', 'production'];
- Object.keys( chessinstances).forEach(instanceName => {
- if(instanceName === 'current_run') return;
- Object.keys( chessinstances[instanceName] ).forEach(node_env=>{
- var instance = chessinstances[instanceName][node_env];
- reposervers = reposervers.concat(instance.reposervers);
- if(instance.reposerver) reposervers.push(instance.reposerver);
- instances.push(instance);
- instanceTypes.push(instance.node_env);
- instanceNames.push(instance.instanceName);
- Array.prototype.push.apply(remotes, Object.keys(instance.reposerverinstances[instance.reposerver].remotes));
- });
- });
- instances = instances.concat(detectedinstanceoptions);
-
- if(selectedinstance['instanceName']) instanceNames.push(selectedinstance['instanceName']);
- if(possiblePrompts['instanceName']) instanceNames.push(possiblePrompts['instanceName']);
- if(selectedinstance['reposervers']) reposervers = reposervers.concat(selectedinstance['reposervers']);
-
- choices['instanceName'] = Array.from( new Set(instanceNames.concat(choices['instanceName'])) );
- choices['reposerver'] = Array.from( new Set(reposervers.concat(choices['reposerver'])) );
- // choices['upstream-remote'] = Array.from( new Set(remotes.concat(choices['upstream-remote'])) )
- choices['instanceType'] = Array.from( new Set(instanceTypes.concat(choices['instanceType'])) );
-
- return __interactive_prompts(selectedinstance, choices, promptsfilter)
- };
-
- var detection_state = {
- localInstanceDetected : false
- };
- const RESTAPI = (function(){
-
- // Singleton
- function RESTAPI(){}
- // RESTAPI.create = RESTAPI; // Returns the one singe instance which is the class itself
- // const options = {
- // hostname: 'whatever.com',
- // port: 443,
- // path: '/todos',
- // method: 'POST',
- // headers: {
- // 'Content-Type': 'application/json',
- // 'Content-Length': data.length
- // }
- // }
- RESTAPI.method = function(options, resolve, reject){
- var __method = function() {
- options.headers = options.headers || { 'Content-Type': 'application/json' };
- if(options.payload) {
- const data = new TextEncoder().encode( JSON.stringify(options.payload) );
- options.headers = options.headers || {
- 'Content-Type': 'application/json',
- 'Content-Length': data.length
- };
- }
- if(!options.authenticatepost) options.headers.Authorization = `token ${usertokens[options.username]}`;
-
- var acquirer = getHTTPorS(options);
- const req = acquirer.request(options, res => {
- if (res.statusCode < 200 || res.statusCode >= 300) {
- return reject(new Error('statusCode=' + res.statusCode));
- }
- var body = [];
- // res.setEncoding('utf8');
- res.on('data', function(chunk) {
- body.push(chunk);
- });
- res.on('end', function() {
- try {
- body = JSON.parse(Buffer.concat(body).toString());
- } catch(e) {
- reject(e);
- }
- resolve(body);
- });
- });
-
- req.on('error', error => {
- console.error(error);
- reject(error);
- });
-
- if(options.payload) req.write(data);
- req.end();
- };
-
- if(!options.authenticatepost && !usertokens[options.username]) {
- RESTAPI.authenticate(options, function(tokenresp){
- usertokens[options.username] = tokenresp.sha1;
- __method();
- },
- function(err){ throw err}
- );
- }
- else __method();
- };
-
- RESTAPI.post = RESTAPI.method;
-
- var usertokens = {};
-
- RESTAPI.authenticate = function(options, resolve, reject){
- options.headers = options.headers || { 'Content-Type': 'application/json' };
-
- if(!usertokens[options.username]) {
- // Authenticate and acquire token.
- // https://git.bbh/api/v1/users/<username>/tokens
- // curl -XPOST -H "Content-Type: application/json" -k -d '{"name":"demo"}' -u demo:demo123 http://git.bbh/api/v1/users/demo/tokens
- var _options = Object.assign({}, options);
- // _options.username = 'demo'
- // _options.password = 'demo123'
- _options.method = 'POST';
- _options.headers.Authorization = `Basic ${Buffer.from(`${_options.username}:${_options.password}`).toString('base64')}`;
- _options.path = `/api/v1/users/${_options.username}/tokens`;
- _options.authenticatepost = true;
-
- var postoptions = { name : _options.username };
- delete _options.username;
- delete _options.password;
- _options.payload = postoptions;
- RESTAPI.post( _options, function(tokenresp){
- // tokenresp = JSON.parse(tokenresp)
- usertokens[options.username] = tokenresp.sha1;
- resolve(tokenresp);
- },
- function(err){ reject(err); }
- );
- }
- else resolve(tokenresp.sha1);
- };
-
- RESTAPI.get = RESTAPI.post = RESTAPI.method;
-
- return RESTAPI
- })();
-
- var getHTTPorS = function(options){ return options.protocol.startsWith('https') ? https__default["default"] : http__default["default"]; };
-
- const GITEA = (function(){
-
- function GITEA(){}
- GITEA.repository = {
- fork( httpoptions, cmdoptions, giteaoptions, resolve, reject ){
- // forkoptions = { owner : httpoptions.username, repo : {{reoptoFork}} }
- // giteaoptions = {
- // organization string
- // --- organization name, if forking into an organization
- // }
- // http://try.gitea.io/api/v1/repos/{owner}/{repo}/forks
- httpoptions.path = `/api/v1/repos/${cmdoptions.owner}/${cmdoptions.repo}/forks`;
- httpoptions.method = 'POST';
- httpoptions.payload = giteaoptions;
- return RESTAPI.post(httpoptions, resolve || function(){}, reject || function(){} )
- }
- , updateattributes( httpoptions, cmdoptions, giteaoptions, resolve, reject ){
- httpoptions.path = `/api/v1/repos/${cmdoptions.owner}/${cmdoptions.repo}`;
- httpoptions.method = 'PATCH';
- httpoptions.payload = giteaoptions;
- return RESTAPI.post(httpoptions, resolve || function(){}, reject || function(){} )
- }
- };
-
- GITEA.user = {
- getuser( httpoptions, cmdoptions, giteaoptions, resolve, reject ){
- // /users/{username} // Get a user
- httpoptions.path = `/api/v1/users/${httpoptions.username}`;
- httpoptions.method = 'GET';
- return RESTAPI.get(httpoptions, giteaoptions, resolve || function(){}, reject || function(){} )
- }
- };
-
- return GITEA
- })();
-
- // Wrapper for Git shell operations. Some meta operations will map to a bunch of GIT commands.
- const GIT = (function(){
- function GIT(){}
-
- Object.assign(GIT, {
- 'switch user'(username){
- var server = new URL(selectedinstance.reposerver);
-
- return GITEA.user.getuser({ hostname : server.host, protocol : server.protocol
- , username : selectedinstance.username, password : selectedinstance.password
- }).then(()=>{
- return nodeShellExec('git', ['config', '--replace-all', 'user.name', username],
- {
- inherit: true, shell: true,
- env: process.env
- , cwd: instanceroot + '/' + repo
- , runas: processedArgs.runas
- , title: `'git', ${['config', '--replace-all', 'user.name', username].join(' ')}`
- })
- }
- )
- .catch(e => {
- console.error(e + 'Could not switch. Probably no such user.');
- })
-
- }
- });
-
- return GIT
- })();
-
- function createInstanceData(target, source) {
-
- var sourceinstance = source || target;
- console.dir(sourceinstance);
- var args = {
- remotebase : sourceinstance.reposerver + '/chess/'
- , sourcerepo : sourceinstance.repo || 'chess-data'
- , targetrepo : `${target.instanceName}-data-${target.instanceType}${target.nodeName ? ('-' + target.nodeName) : ''}`
- };
-
- if(sourceinstance.local) {
-
- var options = {
- inherit: true, shell: true,
- env: process.env
- , cwd : instanceroot
- , runas: processedArgs.runas
- };
- var cmdseq = [
- ['git', ['clone', `${args.remotebase}${args.sourcerepo}`, `${args.targetrepo}`], options]
- ];
- return any(cmdseq.map(getshelltask)).then(() => { return true })
- }
- else {
- // http://try.gitea.io/api/v1/org/{org}/repos
-
- if(source.reposerver !== target.reposerver && source.username !== target.username) {
- throw 'createInstanceData is possible only within the same repository server.'
- }
-
- var server = new URL(target.reposerver);
- return GITEA.repository.fork( { hostname : server.host, protocol : server.protocol
- , username : target.username, password : target.password
- }
- // , { repo : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}`}
- , { repo : `${args.sourcerepo}`, owner : `${target.username}` }, {}, function( repository ){
- return GITEA.repository.updateattributes( {
- hostname : server.host, protocol : server.protocol
- , username : target.username, password : target.password
- }
- , { repo : `${args.sourcerepo}`, owner : `${target.username}` }
- , { name : `${args.targetrepo}`}
- )
- }
- )
- }
-
- // GITEA.repository.updateattributes( {
- // hostname : server.host, protocol : server.protocol
- // , username : selectedinstance.username, password : selectedinstance.password
- // }
- // , { repo : `chess-config`, owner : selectedinstance.username }
- // , { name : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}${selectedinstance.nodeName ? '-' + selectedinstance.nodeName : ''}`}
- // )
-
- // return selectedinstance
- }
-
-
- function createInstance(target, source) {
-
- var sourceinstance = source || target;
- console.dir(sourceinstance);
- var args = {
- remotebase : sourceinstance.reposerver + '/chess/'
- , sourcerepo : sourceinstance.repo || 'chess-config'
- , targetrepo : `${target.instanceName}-config-${target.instanceType}${target.nodeName ? ('-' + target.nodeName) : ''}`
- };
-
- if(sourceinstance.local) {
-
- var options = {
- inherit: true, shell: true,
- env: process.env
- , cwd : instanceroot
- , runas: processedArgs.runas
- };
- var cmdseq = [
- ['git', ['clone', `${args.remotebase}${args.sourcerepo}`, `${args.targetrepo}`], options]
- ];
- return any(cmdseq.map(getshelltask)).then(() => { return true })
- }
- else {
- // http://try.gitea.io/api/v1/org/{org}/repos
-
- if(source.reposerver !== target.reposerver && source.username !== target.username) {
- throw 'createInstance is possible only within the same repository server.'
- }
-
- var server = new URL(target.reposerver);
- return GITEA.repository.fork( { hostname : server.host, protocol : server.protocol
- , username : target.username, password : target.password
- }
- // , { repo : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}`}
- , { repo : `${args.sourcerepo}`, owner : `${target.username}` }, {}, function( repository ){
- return GITEA.repository.updateattributes( {
- hostname : server.host, protocol : server.protocol
- , username : target.username, password : target.password
- }
- , { repo : `${args.sourcerepo}`, owner : `${target.username}` }
- , { name : `${args.targetrepo}`}
- )
- }
- )
- }
-
- // GITEA.repository.updateattributes( {
- // hostname : server.host, protocol : server.protocol
- // , username : selectedinstance.username, password : selectedinstance.password
- // }
- // , { repo : `chess-config`, owner : selectedinstance.username }
- // , { name : `${selectedinstance.instanceName}-config-${selectedinstance.instanceType}${selectedinstance.nodeName ? '-' + selectedinstance.nodeName : ''}`}
- // )
-
- // return selectedinstance
- }
- function initinstances(selected_overrides) {
- var root = selected_overrides.root; // We should always have this coz we are running at some place which is fixed by detectLocalInstances.
-
- var instanceName = selected_overrides.instanceName
- || clioverrides.instanceName
- // || processedArgs._[1]
- || chessinstances.current_run.instanceName;
-
- var node_env = selected_overrides.node_env
- || clioverrides.node_env
- // || processedArgs.node_env
- || chessinstances.current_run.node_env;
-
- var reposerver = selected_overrides.reposerver
- || clioverrides.reposerver
- // || processedArgs.node_env
- || chessinstances.current_run.reposerver;
-
- if(!instanceName) {
- promptkeys['instanceName'] = instanceName = chessinstances.current_run.instanceName = promptkeys['instanceName'] || __default.instanceName;
- promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env;
- promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0];
- }
-
- if(!node_env) {
- promptkeys['node_env'] = node_env = chessinstances.current_run.node_env = promptkeys['node_env'] || __default.node_env;
- promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0];
- }
-
- if(!reposerver) {
- promptkeys['reposerver'] = reposerver = chessinstances.current_run.reposerver = promptkeys['reposerver'] || __default.reposervers[0];
- }
-
- chessinstances[instanceName] = chessinstances[instanceName] || createLocalChessInstance( {
- instanceName, node_env, root : selected_overrides.root, reposerver : selected_overrides.reposerver /* promptkeys['reposerver'] */ } );
- chessinstances['current_run'] = { instanceName: instanceName, node_env, reposerver, root };
-
- if(path__default["default"].normalize(selected_overrides.root) !== path__default["default"].normalize(chessinstances[instanceName][node_env].root)) {
- throw "instanceName and instanceType specified doesn't match whats already present do you want to continue " + chessinstances[instanceName][node_env].root + ' does not match ' + selected_overrides.root
- }
- // Override sequence.
- // __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts
- // PB : TODO -- Undefined keys are overriding and deleting values. We should not allow that.
- // This is ordinary utils.assign behavior. The key should not exist as undefined in the override.
- // PB : TODO -- We now have options that can be passed into assign_core to control this behavior.
- if(selected_overrides.node_env === undefined) delete selected_overrides.node_env;
-
- selectedinstance = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , __default
- , chessinstances[instanceName][node_env]
- , clioverrides
- , selected_overrides
- // , __interactive_prompts -- Cant just override. Also need selectedinstance to be ready...
- );
-
- // chessinstances[instanceName] = chessinstances[instanceName] || {}
- // chessinstances[instanceName][node_env] = chessinstances[instanceName][node_env] || {}
-
- // if(!selectedinstance.repos || selectedinstance.instanceName) {
- // // Brand New.
- // selectedinstance = Object.assign( __default, selectedinstance )
- // }
-
- if(selectedinstance?.repos && !selectedinstance?.repos[0]?.repo) {
- console.warn('repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.repos = selectedinstance.repos.map(function(repo){ return { repo } });
- }
- if(selectedinstance?.elevated && !selectedinstance?.elevated[0]?.repo) {
- console.warn('elevated repo manifest has obsolete format. Attempting upgrade.');
- selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } });
- }
-
- // Config from server always override merges into selection except for the current selection.
- // PB : TODO -- utils.assign Array merges are non-distinct...
- chessinstances[instanceName][node_env] = selectedinstance;
- // chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance;
- cacheWriteInstanceConfig(chessinstances);
- // PB : TODO -- We should probably write the new server config also...
- selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0]; // PB : TODO -- Attempt first one that is available and online...
-
- return chessinstances
- }
-
- var skipprereqs = {};
- var maintask = () => {
-
- // Default cmd to run !
- processedArgs._[0] === processedArgs._[0] || 'pull';
- // selectedinstance.reposerver = selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online from all that are available.
-
- if(!noprerequisites[processedArgs._[0]]
- && !skipprereqs[processedArgs._[0]]
- ) {
- return prerequisites.git.verifyAndInstall().then(()=>{
- var inittasks = [];
- var commontask = () => { preworkerconfig(); return elxrworker() };
- if(!detection_state.localInstanceDetected) {
- var t1 = ()=>{ return createInstance(selectedinstance) };
- t1.statuslog = statuslog;
- var specifictask = shell_verse.getNonElevatedTask(t1);
- }
- else {
- var t2 = ()=>{ return acquireConfig(selectedinstance) };
- t2.statuslog = statuslog;
- var specifictask = shell_verse.getNonElevatedTask(t2);
- }
- inittasks.push( specifictask().catch((err) => {
- console.error('Chosen cofiguraton failed or not found. Fix config and rerun or chose another.');
- console.error(err);
- }).then( commontask )
- // .finally(()=>{
- // fs.writeFileSync('run.log', ', ' + JSON.stringify({ error: e.message }), { 'flag': 'a+' })
- // if(!e.success) fs.writeFileSync('run.done', 'error');
- // // return process.exit()
- // }))
- );
-
- return any(inittasks)
- })
- }
- else {
- console.log('cmd has no preqs or has been configured to skip preqs');
- preworkerconfig();
- return elxrworker()
- }
-
- };
-
- function generateDependencies(){
- // PB : TODO -- Keep only the last n runs...
- // Currently it retains 2*n when proc needs to be relaunched in elevated mode !!!
-
- ensureDirectoryExistence(`${selectedinstance.root}/.elxr/run-${runtimestamp}/download.bat`);
- fs.writeFileSync(ensureDirectoryExistence(path__default["default"].normalize(`${selectedinstance.root}/${downloadsdir}/readme.txt`)), `${getVersion()} Your local downloads for this instance`);
-
- // PB : TODO include and build from files... using rollup..
- var downloadbatch =
- `::**************************************************************************
- :Download_ <url> <File>
- Powershell.exe ^
- $AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'; ^
- [System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols; ^
- (New-Object System.Net.WebClient).DownloadFile('%1','%2')
- exit /b
- ::**************************************************************************`;
- fs.writeFileSync(`${selectedinstance.root}/.elxr/run-${runtimestamp}/download.bat`, downloadbatch);
-
-
- var windowselevate =
- `
- <html><HTA:APPLICATION ID="windowselevate" icon="#"/>
- <script language="vbscript">
- document.title = "elxr control panel"
- self.ResizeTo 200,600
-
- Sub Window_Onload
- self.MoveTo (screen.availWidth - (document.body.clientWidth + 40)),10
- End Sub
-
- Set objShell = CreateObject("WScript.Shell")
- Set objENV = objShell.Environment("Process")
- dim NODE_ENV
- NODE_ENV = objENV("NODE_ENV")
-
- </script>
-
- <script language="javascript">
- //WINDOWSTATE="minimize" SHOWINTASKBAR="no" SYSMENU="no" CAPTION="no"
- // https://devblogs.microsoft.com/scripting/how-can-i-pass-command-line-variables-to-an-hta-when-it-starts/
- // alert(windowselevate.commandLine)
- var args = windowselevate.commandLine.split('"').slice(3);
- // alert(args)
- var processedArgs = { _ : [] }
- var namedArgs = [];
- namedArgs.push('--wd=' + objENV('wd'))
- // alert(namedArgs)
- for(var item in args){
- if(args[item].charAt(0) === '-'){
- namedArgs.push(args[item])
- var split = args[item].split('=');
- processedArgs[split[0].slice(2)] = split[1] || true;
- }
- else processedArgs._.push(args[item]);
- }
- // args = args.forEach(function(item){ })
- // alert('processedArgs._ : ' + processedArgs._);
- // alert(processedArgs.runas);
- // alert(objENV('wd'))
- // PB : TODO -- Convert all the cli args back to string.
- // __filename will sure we are launhed using the same entry point.
- var cargs = (processedArgs.debug ? '--inspect-brk=9228' : '') + ' ${__filename.replace(/\\/g, '\\\\')} ' + processedArgs._.join(' ') + ' ' + namedArgs.join(' ');
- var shell = new ActiveXObject('shell.application');
- // alert('launching node privilged. ' + processedArgs['nodepath'])
- // shell.ShellExecute('cmd.exe', '/k where node', '', '', 10);
- // shell.ShellExecute('cmd.exe', '/k notepad.exe', '', 'runas', 1);
- // shell.ShellExecute('cmd.exe ', '/k node ', '', 'runas', 1);
- // shell.ShellExecute('cmd.exe ', '/k node ' + cargs + '', '', 'runas', 1);
- shell.ShellExecute('node', cargs, '', 'runas', 1);
- // alert('/k node ' + cargs + '')
- // shell.ShellExecute(processedArgs['nodepath'], cargs, '', 'runas', 1);
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- window.onload = function() {
- document.body.style.backgroundColor = 'black';
- document.body.style.fontFamily = 'arial';
- var log = document.createElement('div');
- log.innerHTML='Please Wait';
- function l(msg){ log.innerHTML+= msg; };
- log.style.color = 'blue';
- log.style.width = '95%';
- log.id = 'log';
- document.body.appendChild(log);
-
- l('<Br/>Current config : ')
- l('<Br/>NODE_ENV = ' + NODE_ENV)
- l('<Br/>cmd = ' + processedArgs._[0])
- processedArgs._[1] === 'use' ? l('<Br/>using = ' + processedArgs._[2]) : null;
- l('<Br/><Br/>')
- // alert(fso.GetAbsolutePathName("."))
-
- var timer = function(){
- l('.');
- if(fso.FileExists("run.done")) {
- fso.DeleteFile('run.done')
- close();
- }
- else window.setTimeout(timer, 1000);
- };
- window.setTimeout(timer, 3000);
- };
-
- </script>
- </html>
-
- `;
- fs.writeFileSync(`${selectedinstance.root}/.elxr/run-${runtimestamp}/windowselevate.hta`, windowselevate);
- }
-
- var startElxr = function() {
- const retaincount = 2;
- var min = runtimestamp;
- var collect = [];
-
- if(reconfirmcmds[processedArgs.label || processedArgs._[0]]) {
- reconfirm = getReconfirmAll();
- }
-
- return detectLocalInstances().then((detectedinstanceoptions)=>{
-
- detectedinstanceoptions.splice(0,0, __default);
-
- var cmdinstance = cmds[clioverrides.cmd];
- cmdinstance.getPossiblePrompts();
- selectedinstance.node_env ? selectedinstance.node_env : selectedinstance.node_env = clioverrides.node_env;
- // PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!!
- selectedinstance = bbhverse.assign_core( { arraymergetype : bbhverse.assign_core.DISTINCT_UNION }
- , ...detectedinstanceoptions.slice(-2), promptkeys );
- // promptkeys = utils.assign(promptkeys, clioverrides)
-
- // startElxr requires instance // Independent cmds should have already been bypassed.
-
- // if(cmdprompts.instanceName) {
- // not an instanceless cmd.
- console.dir(selectedinstance);
- try {
-
- chessinstances = acquirelocalinstances(selectedinstance);
- findlocalinstances(chessinstances, detectedinstanceoptions);
- initinstances(selectedinstance); // use the local instances for defaults if at all possible.
- var todo = any( getInteractionPoints(detectedinstanceoptions, promptkeys) ).then(()=>{
- var inst = initinstances(selectedinstance);
- detection_state.localInstanceDetected = true;
- return inst;
- });
- }
- catch (e) {
- // PB : TODO -- verbose mode warning.. console.warn(e) // Missing chessinstances is not an error...
- var todo = any( getInteractionPoints(detectedinstanceoptions, promptkeys) ).then(()=>{
- return initinstances(selectedinstance)
- });
-
- // if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){
- // // Weve not been told what to do.
- // todo = todo.then(() => { return acquireChoices(selectedinstance) })
- // }
-
- todo = todo.then(() => {
- try {
- chessinstances = acquirelocalinstances(selectedinstance);
- findlocalinstances(chessinstances, detectedinstanceoptions);
- detectedinstanceoptions.splice(0,0, __default);
- initinstances(selectedinstance);
- detection_state.localInstanceDetected = true;
- }
- catch (e) {
- // console.error(e)
- console.log('No local instances config found in current root = ' + selectedinstance.root);
- console.log('A config will be createed with the instance and environment chosen...');
- // return (async ()=>{return await __default.reposerver})().then(()=>{
- // // selectedinstance = Object.assign(detectedInstance, clioverrides);
- // return selectedinstance = Object.assign(__default, selectedinstance);
- // })
- detection_state.localInstanceDetected = false;
- return selectedinstance
- }
- });
- }
- return todo.then( ()=>{
- // PB : TODO -- Embed this in the build instead of inlining it.
- // Also attepmt to load from ../chess-config/...
- var __repo_manifest = (commonjsRequire(path__default["default"].normalize(instanceroot + '/elxr/repo-manifest.js'),"/$$rollup_base$$"))(
- 'defaultmanifest' // name
- , { utils: bbhverse, username : selectedinstance.username, instanceName : selectedinstance.instanceName
- , node_env : selectedinstance.node_env, reposerver : 'https://git.bbh.org.in' } // options
- );
-
- __default = Object.assign(__default, __repo_manifest, {
- // Common baseline repos for all chess instances.
- repos : (()=> {
- var __repos = [
- { repo : 'ember-masonry-grid' /*, branch : master*/ } // Default need not be specified.
- , { repo : 'bbhverse' }
- , { repo : 'clientverse' }
- , { repo : 'serververse' }
- , { repo : 'elxr' }
- , { repo : 'ember-searchable-select' }
- , { repo : 'loopback-component-jsonapi' }
- , { repo : 'loopback-jsonapi-model-serializer' }
- , { repo : 'loopback-connector-mysql' }
- , { repo : 'loopback-connector-ds' }
-
- , { repo : 'ember-service-worker' }
- , { repo : 'ember-service-worker-asset-cache' }
- , { repo : 'ember-service-worker-cache-fallback' }
- , { repo : 'ember-service-worker-index' }
- , { repo : 'ember-sw-client-route' }
- , { repo : 'global-this' }
- ];
- Array.prototype.push.apply( __repos, __repo_manifest.repos);
- return __repos;
- })()
- // Requires elevation only in windows
- , elevated : [ { repo : 'chess-server-lib', requiresElevation : true } ]
- , exludeMergeRepos : { }
- });
-
- initinstances(selectedinstance);
- return selectedinstance
- })
- // }
- // else return Promise.resolve(true)
- })
- .then(()=>{
- runconfig = { NODE_ENV: selectedinstance.node_env };
- try { runconfig = Object.assign(runconfig, commonjsRequire(instanceroot + '/run.js',"/$$rollup_base$$")); } catch (e) { }
- generateDependencies();
- if(noprerequisites[processedArgs._[0]]
- || skipprereqs[processedArgs._[0]]
- ) {
- return elxrworker()
- }
-
- var neTask = ()=>{
- ensureDirectoryExistence(`${selectedinstance.root}/.elxr/${__ALIAS__STAMP__}`);
- // collect garbage
- return dirs( (dir)=>{
- var matches = /run-(.*)/gm.exec(dir.name);
- if(matches) {
- if(+(matches[1]) < min) {
- min = matches[1];
- collect.splice( 0, 0, matches[1] );
- }
- else collect.push(matches[1]);
- }
- return Promise.resolve(collect);
- }, `${selectedinstance.root}/.elxr` )
- .then(()=>{
- // delete garbage
- if(collect.length > retaincount) {
-
- var asyncs = [];
- while((collect.length - asyncs.length) > retaincount) {
- asyncs.push(getShellTask('rm',['-rf', `run-${collect[asyncs.length]}`], { cwd : `${selectedinstance.root}/.elxr` })());
- }
- return Promise.all(asyncs)
- }
- else return true
- })
- .catch(e => {
- })
- };
- neTask.statuslog = statuslog;
-
- shell_verse.getNonElevatedTask( neTask )();
-
- var commonTask = ()=>{
- verifyAndInstallPrerequisites.statuslog = statuslog;
- mainTasks.push(verifyAndInstallPrerequisites);
- mainTasks.push(maintask);
- return any(mainTasks);
- };
- return commonTask()
- })
- };
-
- var __default = {}; // PB : TODO -- Use initialized instance instead of default everywhere.
- // PB : TODO -- In windows if we are run from an elevated shell we never move forward and simply exits !?.
- // -- Currently workaround in windows is to always run from a non-elevated shell.
- shell_verse.acquireElevationState().then((elevationstate) => {
- return detectInstanceRoot.then(()=>{
- var cmdobj = cmds[clioverrides.cmd];
- return Promise.all((cmdobj.requires || []).map( (r) => bbhverse.promisify(null, r) ) ).then(()=>{
- if(cmdobj.independentcmd) {
- if(cmdobj.requiresElevation) {
- return cmdobj.cmdFn()
- }
- else return cmdobj.cmdFn()
- }
- else return startElxr()
- })
- .catch(e => {
- if(typeof e === 'symbol') console.log('error : ' + 'symbol');
- else console.log('error : ' + e);
- })
- })
- });
-
-
-
-
- // Sample instances config.
- // var instances = {
- // "elixir": {
- // "production": {
- // "reposervers": ["http://git.bbh", "https://git.bbh.org.in"]
- // , "repos": ["ember-masonry-grid", "client", "elixir-client"]
- // , "exludeMergeRepos": {
- // "elixir-config-development": true, "elixir-config-test": true
- // , "elixir-config-production": true, "elixir-data": true
- // }
- // , "instanceName": "elixir", "node_env": "production"
- // }
- // },
- // "current_run": { "instanceName": "elixir", "node_env": "production" }
- // }
-
- // ,([^\}^\S\r]*?\}) // Regexp to eliminate extra comma at the end of an array or an object...
-
- var elxr_1 = {
-
- };
-
- module.exports = elxr_1;
|