PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/home/htlwork.com/www/dev/magento/app/code/Infortis/UltraMegamenu/Block/
Upload File :
Current File : /home/htlwork.com/www/dev/magento/app/code/Infortis/UltraMegamenu/Block/Navigation.php
<?php
/**
 * Infortis UltraMegaMenu - category navigation menu
 */

namespace Infortis\UltraMegamenu\Block;

use Infortis\UltraMegamenu\Helper\Data as HelperData;
use Magento\Catalog\Block\Navigation as BlockNavigation;
use Magento\Catalog\Helper\Category;
use Magento\Catalog\Helper\Category\Flat;
use Magento\Catalog\Model\Category as ModelCategory;
use Magento\Catalog\Model\CategoryFactory;
use Magento\Catalog\Model\Indexer\Category\Flat\State;
use Magento\Catalog\Model\Layer\Resolver;
use Magento\Catalog\Model\ResourceModel\Category\Collection as CategoryCollection;
use Magento\Catalog\Model\ResourceModel\Category\Flat as CategoryFlat;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Cms\Helper\Page as CmsHelperPage;
use Magento\Cms\Helper\Data as CmsHelperData;
use Magento\Customer\Model\Session;
use Magento\Framework\App\Http\Context as HttpContext;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Data\Tree\Node\Collection;
use Magento\Framework\Registry;
use Magento\Framework\UrlInterface;
use Magento\Framework\View\DesignInterface;
use Magento\Framework\View\Element\Template\Context;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;

class Navigation extends BlockNavigation
{
    /**
     * @var StoreManagerInterface
     */
    protected $_modelStoreManagerInterface;

    /**
     * @var DesignInterface
     */
    protected $_viewDesignInterface;

    /**
     * @var Session
     */
    protected $_modelSession;

    /**
     * @var HelperData
     */
    protected $_helperData;

    /**
     * @var UrlInterface
     */
    protected $_frameworkUrlInterface;

    /**
     * @var LoggerInterface
     */
    protected $_logLoggerInterface;

    /**
     * @var CategoryFlat
     */
    protected $_resourceModelCategoryFlat;

    /**
     * @var CmsHelperPage
     */
    protected $_cmsHelperPage;

    protected $_frameworkRegistry;

    protected $_helperCategory;
    
    protected $_flatCategoryState;
    
    protected $_filterProvider;
    
    protected $_currentCategoryKey;
    
    protected $_catalogModelLayerFactory;
    
    protected $_layerResolver;
    
    protected $_categoryLayerFactory;
    
    public function __construct(Context $context, 
        CategoryFactory $categoryFactory, 
        CollectionFactory $productCollectionFactory, 
        Resolver $layerResolver, 
        HttpContext $httpContext, 
        Category $catalogCategory, 
        Registry $registry, 
        State $flatState, 
        \Magento\Framework\Registry $frameworkRegistry,
        Session $modelSession,         
        HelperData $helperData,        
        CategoryFlat $resourceModelCategoryFlat,  
        \Magento\Catalog\Model\Indexer\Category\Flat\State $flatCategoryState,      
        CmsHelperPage $cmsHelperPage,    
        \Magento\Cms\Model\Template\FilterProvider $filterProvider,  
        \Magento\Catalog\Model\LayerFactory $catalogModelLayerFactory, 
        \Magento\Catalog\Model\Layer\CategoryFactory $categoryLayerFactory,        
        array $data = [])
    {
        $this->_categoryLayerFactory = $categoryLayerFactory;
        $this->_layerResolver = $layerResolver;
        $this->_helperCategory    = $catalogCategory;
        $this->_frameworkRegistry = $frameworkRegistry;
        $this->_modelStoreManagerInterface = $context->getStoreManager();
        $this->_viewDesignInterface = $context->getDesignPackage();
        $this->_modelSession = $modelSession;
        $this->_helperData = $helperData;
        $this->_flatCategoryState = $flatCategoryState;
        $this->_frameworkUrlInterface = $context->getUrlBuilder();
        $this->_logLoggerInterface = $context->getLogger();
        $this->_resourceModelCategoryFlat = $resourceModelCategoryFlat;
        $this->_cmsHelperPage = $cmsHelperPage;
        $this->_filterProvider = $filterProvider;
        $this->_catalogModelLayerFactory = $catalogModelLayerFactory;
        parent::__construct($context, $categoryFactory, $productCollectionFactory, $layerResolver, $httpContext, $catalogCategory, $registry, $flatState, $data);
    }

    //Constants
    const DDTYPE_NONE           = 0;
    const DDTYPE_MEGA           = 1;
    const DDTYPE_CLASSIC        = 2;
    const DDTYPE_SIMPLE         = 3;

    protected $_ddTypeClass;

    //Base parameters
    protected $_isSimpleSidemenu = FALSE;

    //Additional parameters
    protected $_catBlocksDelimiter;
    
    //previously added:
    protected $_showNumProd = FALSE;
    protected $_tplProcessor = NULL;
    protected $_curCategoryId = NULL;
    //end:NEW

    /**
     * NEW: 
     * Resource initialization
     */
    protected function _construct()
    {
        parent::_construct();
        $this->_ddTypeClass = [self::DDTYPE_MEGA => "mega", self::DDTYPE_CLASSIC => "classic", self::DDTYPE_SIMPLE => "simple"];
        $this->_isSimpleSidemenu = FALSE;
        $this->_catBlocksDelimiter = "#@#";
        $this->_showNumProd = FALSE;
        $this->_tplProcessor = NULL;

        if ($this->_frameworkRegistry->registry('current_category'))
        {
            $this->_curCategoryId = $this->_frameworkRegistry->registry('current_category')->getId();
        }
    }

    /* Added to default method:
     * - check if current page is home page
     * - check if secure
     */
    /**
     * Get Key pieces for caching block content
     *
     * @return array
     */
    public function getCacheKeyInfo()
    {
        $shortCacheId = [
            'CATALOG_NAVIGATION',
            $this->_modelStoreManagerInterface->getStore()->getId(),            
            // $this->_viewDesignInterface->getPackageName(),
            // $this->_viewDesignInterface->getTheme('template'),
            //getCode replaces getPackageName and getTheme
            $this->_viewDesignInterface->getDesignTheme()->getCode(),            
            $this->_modelSession->getCustomerGroupId(),
            'template' => $this->getTemplate(),
            'name' => $this->getNameInLayout(),
            $this->getCurrentCategoryKey(),
            $this->_helperData->isHomePage(),
            (int)$this->_modelStoreManagerInterface->getStore()->isCurrentlySecure(),
        ];
        $cacheId = $shortCacheId;

        $shortCacheId = array_values($shortCacheId);
        $shortCacheId = implode('|', $shortCacheId);
        $shortCacheId = md5($shortCacheId);

        $cacheId['category_path'] = $this->getCurrentCategoryKey();
        $cacheId['short_cache_id'] = $shortCacheId;

        return $cacheId;
    }

    /**
     * Render category to html
     *
     * @param array $parentInfo
     * @param ModelCategory $category
     * @param int Nesting level number
     * @param boolean Whether ot not this item is last, affects list item class
     * @param boolean Whether ot not this item is first, affects list item class
     * @param boolean Whether ot not this item is outermost, affects list item class
     * @param string Extra class of outermost list items
     * @param string If specified wraps children list in div with this class
     * @param boolean Whether ot not to add on* attributes to list item
     * @return string
     */
    protected function _renderCategoryMenuItemHtml($category, $level = 0, $isLast = FALSE, $isFirst = FALSE,
        $isOutermost = FALSE, $outermostItemClass = '', $childrenWrapClass = '', $noEventAttributes = FALSE, $parentInfo = null)
    {
        if (!$category->getIsActive()) {
            return '';
        }
        $html = '';

        // get all children
        if ($this->_flatCategoryState->isFlatEnabled()) {
            $children = (array)$category->getChildrenNodes();
            $childrenCount = count($children);
        } else {
            $children = $category->getChildren();
            $childrenCount = $children->count();
        }
        $hasChildren = ($children && $childrenCount);

        // select active children
        $activeChildren = [];
        foreach ($children as $child) {
            if ($child->getIsActive()) {
                $activeChildren[] = $child;
            }
        }
        $activeChildrenCount = count($activeChildren);
        $hasActiveChildren = ($activeChildrenCount > 0);





        /**
         *
         * Dropdown type
         *
         */
        $helper = $this->_helperData;

        //Assign category to variable cat. Old variable cat will still indicate where we're "loading" attributes.
        $cat = $category;

        //Get dropdown type attribute.
        //Apply constraints of dropdown types: inheritance and order of types.
        //IMPORTANT: these constraints have to be applied just after retrieving value of the dropdown type!
        $ddType = intval($cat->getData('umm_dd_type')); //Dropdown type

        if ($ddType === self::DDTYPE_NONE)
        {
            if ($parentInfo["ddType"] === self::DDTYPE_MEGA)
            {
                //If current category has no type and parent has type 'mega' - current category can't have any type.
                //Keep the type 'none'.
            }
            else
            {
                //If current category has no type and parent has any type except 'mega'
                $ddType = self::DDTYPE_CLASSIC;
            }
        }
        elseif ($ddType === self::DDTYPE_MEGA)
        {
            if ($parentInfo["ddType"] === self::DDTYPE_MEGA)
            {
                //If current category has type 'mega' and parent has type 'mega' - current category can't have any type.
                //Change to type 'none'.
                $ddType = self::DDTYPE_NONE;
            }
        }
        elseif ($ddType === self::DDTYPE_SIMPLE)
        {
            if ($parentInfo["ddType"] === self::DDTYPE_MEGA)
            {
                //If current category has type 'simple' and parent has type 'mega' - current category can't have any type.
                //Change to type 'none'.
                $ddType = self::DDTYPE_NONE;
            }
            elseif ($level === 0)
            {
                //On the top level, category can't have type 'simple'.
                //Change to type 'classic'.
                $ddType = self::DDTYPE_CLASSIC;
            }
        }

        //IMPORTANT:
        //Save info about current category (to pass it later to subcategories).
        //This has to be saved AFTER applying dropdown type constraints.
        $info = [
            "ddType" => $ddType, //Info about current category's dropdown type
        ];





        /**
         *
         * Category blocks
         *
         */
        $getCatBlocks = FALSE;
        $catBlocks = [];
        $htmlBeforeChildren = '';
        $htmlAfterChildren = '';
        $hasAnyCatBlocks = FALSE;
        $levelClass = "level" . $level;

        //Check if category blocks should be retrieved.
        //Retrieve category blocks only if current OR parent category has type 'mega'.
        if (FALSE === $this->_isSimpleSidemenu 
            && ($ddType === self::DDTYPE_MEGA || $parentInfo["ddType"] === self::DDTYPE_MEGA)
            )
        {
            $getCatBlocks = TRUE;
            //Here limitation can be added: e.g. show category blocks only below selected level
        }

        //Retrieve category blocks
        if ($getCatBlocks)
        {
            // $ddBlocks_raw = $this->_getCatBlock($cat, "umm_dd_blocks");
            // if ($ddBlocks_raw)
            // {
            //     $catBlocks = explode($this->_catBlocksDelimiter, $ddBlocks_raw);
            // }

            $catBlocks[0] = $this->_getCatBlock($cat, "umm_dd_block_top");
            $catBlocks[1] = $this->_getCatBlock($cat, "umm_dd_block_left");
            $catBlocks[2] = $this->_getCatBlock($cat, "umm_dd_block_right");
            $catBlocks[3] = $this->_getCatBlock($cat, "umm_dd_block_bottom");

        }

        //Render dropdown with category blocks of the current category if dropdown type is 'mega'.
        //Even if there's no category blocks, this code has to be executed to create wrapper around the subcategories.
        //TODO: maybe it's good to check if there are any subcategories. If no subcat. and no category blocks, then no need to execute this code.
        if (FALSE === $this->_isSimpleSidemenu && $ddType === self::DDTYPE_MEGA)
        {
            $ddProportions_raw = $cat->getData("umm_dd_proportions"); //Dropdown block proportions

            //Calculate grid units for category blocks (left and right) and submenu with subcategories (central column)
            if ($ddProportions_raw)
            {
                //IMPORTANT: it is assumed that values of proportions are numbers
                $proportions = explode(";", $ddProportions_raw);
                $leftUnits      = $proportions[0];
                $centralUnits   = $proportions[1];
                $rightUnits     = $proportions[2];
            }
            else
            {
                //If proportions not specified, all columns are equal
                $leftUnits = $centralUnits = $rightUnits = 4;
            }
            $leftGridClass      = "grid12-" . $leftUnits;
            $childrenGridClass  = "grid12-" . $centralUnits;
            $rightGridClass     = "grid12-" . $rightUnits;

            //Grid units constraints
            if (empty($catBlocks[1]) && empty($catBlocks[2])) //Block "Left" is empty & block "Right" is empty
            {
                $leftGridClass      = '';
                $childrenGridClass  = "grid12-12";
                $rightGridClass     = '';
            }
            elseif (empty($catBlocks[1])) //Block "Left" is empty
            {
                $leftGridClass      = '';
                $childrenGridClass  = "grid12-" . ($leftUnits + $centralUnits);
            }
            elseif (empty($catBlocks[2])) //Block "Right" is empty
            {
                $childrenGridClass  = "grid12-" . ($centralUnits + $rightUnits);
                $rightGridClass     = '';
            }
            //TODO: Try to split units so that each block has equal amount
            elseif (!$hasActiveChildren) //If no subcategories
            {
                $leftGridClass      = "grid12-" . ($leftUnits + $centralUnits);
                $childrenGridClass  = '';
                $rightGridClass     = "grid12-" . $rightUnits;
            }

            /*
             * Check if there are any blocks in this category and get those blocks
             */

            //Block "Top"
            if (!empty($catBlocks[0]))
            {
                $hasAnyCatBlocks = TRUE;
                $htmlBeforeChildren .= '<div class="nav-block nav-block--top std grid-full">' . $catBlocks[0] . '</div>';
            }

            //Block "Left"
            if (!empty($catBlocks[1]))
            {
                $hasAnyCatBlocks = TRUE;
                $htmlBeforeChildren .= '<div class="nav-block nav-block--left std ' . $leftGridClass . '">' . $catBlocks[1] . '</div>';
            }

            //Children
            if ($hasActiveChildren)
            {
                //IMPORTANT: no "nav-block" class here in central block:
                $htmlBeforeChildren .= '<div class="nav-block--center ' . $childrenGridClass . '">';
                //IMPORTANT: here between these elements the list of cateogry's children (subcategories) will be inserted...
                $htmlAfterChildren .= '</div>';
            }

            //Block "Right"
            if (!empty($catBlocks[2]))
            {
                $hasAnyCatBlocks = TRUE;
                $htmlAfterChildren .= '<div class="nav-block nav-block--right std ' . $rightGridClass . '">' . $catBlocks[2] . '</div>';
            }

            //Block "Bottom"
            if (!empty($catBlocks[3]))
            {
                $hasAnyCatBlocks = TRUE;
                $htmlAfterChildren .= '<div class="nav-block nav-block--bottom std grid-full">' . $catBlocks[3] . '</div>';
            }
        }

        //Indicates that the category has a dropdown box
        $hasDropdown = ($hasActiveChildren || $hasAnyCatBlocks) ? TRUE : FALSE;





        /**
         *
         * Calculate and apply classes to: item, link, dropdown wrapper, submenu
         *
         */
        //NEW:
        $itemClasses = ["nav-item"];
        $linkClasses = [];
        $wrapperClasses = []; //IMPORTANT: has to be empty. If any class exist, the wrapper needs to be built for current category.
        $submenuClasses = ["nav-submenu"];

        $panelWrapperWidthStyle = '';
        $submenuWidthStyle = '';
        $caret = '';
        //end:NEW


        // prepare list item html classes
        $itemClasses[] = $levelClass;
        $itemClasses[] = "nav-" . $this->_getItemPosition($level);
        if ($this->isCategoryActive($category))
        {
            $itemClasses[] = "active";

            //If active class doesn't have any children, add special class (required by accordion script to mark the initial category)
            if ($category->getId() === $this->_curCategoryId)
            {
                $itemClasses[] = "current";
            }
        }
        if ($isOutermost && $outermostItemClass) {
            $itemClasses[] = $outermostItemClass;
            $linkClasses[] = $outermostItemClass;
        }
        if ($isFirst) {
            $itemClasses[] = "first";
        }
        if ($isLast) {
            $itemClasses[] = "last";
        }


        //NEW:

        if (FALSE === $this->_isSimpleSidemenu)
        {
            //Apply classes based on dropdown type
            if ($ddType === self::DDTYPE_CLASSIC)
            {
                /*
                 * Item classes
                 */
                if ($hasDropdown)
                {
                    $itemClasses[] = "nav-item--parent"; //This item has dropdown

                    //If item has dropdown, when category has type 'classic', add a special dropdown class to the submenu
                    $submenuClasses[] = "nav-panel--dropdown";
                }
                $itemClasses[] = $this->_ddTypeClass[self::DDTYPE_CLASSIC];

                /*
                 * Submenu classes
                 */
                $submenuClasses[] = "nav-panel"; //Indicate that this is the panel for accordion in mobile menu mode
            }
            elseif ($ddType === self::DDTYPE_MEGA)
            {
                /*
                 * Item classes
                 */
                if ($hasDropdown)
                {
                    $itemClasses[] = "nav-item--parent"; //This item has dropdown

                    //If item has dropdown, when category has type 'mega', add a special dropdown class to the wrapper
                    //but NOT to the submenu.
                    $wrapperClasses[] = "nav-panel--dropdown";
                }
                $itemClasses[] = $this->_ddTypeClass[self::DDTYPE_MEGA];
                
                /*
                 * Panel wrapper classes
                 */
                //- Submenu is wrapped inside additional div. That div will be a real dropdown box for this category.
                //- Add class 'nav-panel' to indicate that this is the actual panel for accordion in mobile menu mode.
                //  IMPORTANT: do not add 'nav-panel' class to the submenu when category has type 'mega',
                //  that class is already added to the dropdown wrapper.
                $wrapperClasses[] = "nav-panel";

                if ($childrenWrapClass)
                {
                    $wrapperClasses[] = $childrenWrapClass;
                }

                /*
                 * Submenu classes
                 */
                $submenuClasses[] = "nav-submenu--mega";

                //Number of columns with subcategories
                //Create column classes which will be used to arrange in columns all the items on the level below.
                //Important: subcategory column classes have to be added directly to the submenu (because of selectors structure).
                $ddSubcatColsCount = intval($cat->getData("umm_dd_columns"));
                if ($ddSubcatColsCount === 0)
                {
                    $ddSubcatColsCount = 4; //Default width of mega mdropdown is full-width so 4 is resonable default number of columns
                }
                $submenuClasses[] = "dd-itemgrid dd-itemgrid-" . $ddSubcatColsCount . "col";
            }
            elseif ($ddType === self::DDTYPE_SIMPLE)
            {
                /*
                 * Item classes
                 */
                $itemClasses[] = $this->_ddTypeClass[self::DDTYPE_SIMPLE];

                /*
                 * Submenu classes
                 */
                $submenuClasses[] = "nav-panel"; //Indicate that this is the panel for accordion in mobile menu mode
            }
            elseif ($ddType === self::DDTYPE_NONE)
            {
                /*
                 * Submenu classes
                 */
                $submenuClasses[] = "nav-panel"; //Indicate that this is the panel for accordion in mobile menu mode
            }

            //Dropdown width
            if ($ddWidth_raw = $cat->getData("umm_dd_width"))
            {
                //Evaluate dropdown width
                $panelWidthStyle = '';
                $widthClass = '';

                //If contain 'px' or '%' string, set the dropdown width using inline styles
                if (strpos($ddWidth_raw, "px") || strpos($ddWidth_raw, "%"))
                {
                    $panelWidthStyle = ' style="width:' . $ddWidth_raw . ';"'; //Important: leave space at the beginning
                }
                else
                {
                    //If width is in proper range (0; 12], create a grid class to apply it to the dropdown
                    $widthClass = intval($ddWidth_raw);
                    if (0 < $widthClass && $widthClass <= 12)
                    {
                        $widthClass = "no-gutter grid12-" . $widthClass;
                    }
                    else
                    {
                        //Important: if no grid class, set empty value
                        $widthClass = '';
                    }
                }

                //Apply dropdown width based on dropdown type
                if ($ddType === self::DDTYPE_CLASSIC)
                {
                    //apply the width style to the submenu which in this case is the dropdown of the current category
                    $submenuWidthStyle = $panelWidthStyle;
                }
                elseif ($ddType === self::DDTYPE_MEGA)
                {
                    $panelWrapperWidthStyle = $panelWidthStyle;

                    //If class exist, add the grid class to the dropdown
                    if ($widthClass)
                    {
                        $wrapperClasses[] = $widthClass;
                    }
                }
            }
            else
            {
                //If dropdown width not specified, use default width
                //IMPORTANT: but only if current category has type 'mega'
                if ($ddType === self::DDTYPE_MEGA)
                {
                    $wrapperClasses[] = "full-width";
                }
            }

            //Apply classes indicating that there are only category blocks or only subcategories
            if ($hasAnyCatBlocks)
            {
                if (FALSE === $hasActiveChildren)
                {
                    //If category has some category blocks but has NO SUBCATEGORIES
                    $itemClasses[] = "nav-item--only-blocks";
                }
            }
            else
            {
                if ($hasActiveChildren)
                {
                    //If category has NO CATEGORY BLOCKS, but has some subcategories
                    $itemClasses[] = "nav-item--only-subcategories";
                }
            }

        } //end: FALSE === $this->_isSimpleSidemenu

        if ($hasDropdown)
        {
            //Add parent class if category has a dropdown box (so it has children or any of the category blocks)
            $itemClasses[] = "parent";

            //Add caret to indicate parent item parent item
            if (FALSE === $this->_isSimpleSidemenu)
            {
                $caret = '<span class="caret"></span>';
            }
        }





        /**
         *
         * Other elements
         *
         */

        //Number of products in category
        $num = '';
        if ($this->_showNumProd && $this->_isSimpleSidemenu) {
            $num = '<span class="number">('. $this->_getNumberOfProducts($cat) .')</span>';
        }

        //Category label
        $catLabel = $this->_getCategoryLabelHtml($cat, $level);

        //Category URL
        //Check if there is a custom target URL for the category
        if ($catTarget_raw = $cat->getData("umm_cat_target"))
        {
            if ($catTarget_raw === "#")
            {
                //If custom target is the hash character return empty string so that 
                //this item is not rendered at all. Important: only in simple sidebar menu.
                if ($this->_isSimpleSidemenu)
                {
                    return '';
                }

                //If custom target is the hash character, use the hash as the target URL and add special class to the link
                $targetUrl = "#";
                $linkClasses[] = "no-click";
            }
            elseif ($catTarget_raw = trim($catTarget_raw))
            {
                //If custom target is not empty:
                if (strpos($catTarget_raw, "http") === 0)
                {
                    //If custom target starts with "http", use it as the target URL
                    $targetUrl = $catTarget_raw;
                }
                else
                {
                    //Otherwise append it to the store base URL
                    $targetUrl = $this->_frameworkUrlInterface->getBaseUrl() . $catTarget_raw;
                }
            }
            else
            {
                //If custom target is empty, load the original URL of the category
                $targetUrl = $this->getCategoryUrl($category);
            }
        }
        else
        {
            $targetUrl = $this->getCategoryUrl($category);
        }





        /**
         *
         * Build the menu item and other elements
         *
         */

        //WHAT: beginning of the menu item --------------------------------------------------

        $html .= "<li" . ($itemClasses ? ' class="' . implode(" ", $itemClasses) . '"'  : '')  . ">";



        //WHAT: menu item: above the link and subcategories --------------------------------------------------

        //NEW:
        //If parent category has type 'mega', insert category block (Block "Top") above the category link.
        if (FALSE === $this->_isSimpleSidemenu && $parentInfo["ddType"] === self::DDTYPE_MEGA)
        {
            //If Block "Top" exist
            if (!empty($catBlocks[0]))
            {
                $html .= '<div class="nav-block nav-block--top std">' . $catBlocks[0] . '</div>';
            }
        }
        //end:NEW



        //WHAT: category link --------------------------------------------------

        $html .= '<a href="' . $targetUrl . '"' . ($linkClasses ? ' class="' . implode(" ", $linkClasses) . '"'  : '') . '>';
        $html .= '<span>' . $this->escapeHtml($category->getName()) . $num . $catLabel . '</span>' . $caret; //NEW: insert category label and caret
        $html .= '</a>';

        // render children
        $htmlChildren = '';
        $j = 0;
        foreach ($activeChildren as $child) {
            $htmlChildren .= $this->_renderCategoryMenuItemHtml(
                $child,                             //category
                ($level + 1),                       //level
                ($j == $activeChildrenCount - 1),   //isLast
                ($j == 0),                          //isFirst
                FALSE,                              //isOutermost
                $outermostItemClass,
                $childrenWrapClass,
                $noEventAttributes,
                $info                               //current category info needed by subcategories
            );
            $j++;
        }



        //WHAT: submenu with subcategories (category's children) --------------------------------------------------

        //TODO:? Can replace with this condition? Looks like it's OK. Check it.
        //if ($hasDropdown)
        if (!empty($htmlChildren) || $hasAnyCatBlocks) //NEW: added condition
        {
            //NEW:
            //Add opener for the menu item
            $html .= '<span class="opener"></span>';

            //If any wrapper classes exist, the wrapper needs to be built
            if (!empty($wrapperClasses))
            {
                $html .= '<div class="' . implode(' ', $wrapperClasses) . '"' . $panelWrapperWidthStyle . '><div class="nav-panel-inner">'; //NEW: additional inner wrapper
            }
            //end:NEW

            $html .= $htmlBeforeChildren; //NEW:
            
            if (!empty($htmlChildren))
            {
                $html .= '<ul class="' . $levelClass .' '. implode(' ', $submenuClasses) . '"' . $submenuWidthStyle . '>'; //TODO: added submenuClasses for acco
                $html .= $htmlChildren;
                $html .= '</ul>';
            }
            
            $html .= $htmlAfterChildren; //NEW:

            //If any wrapper classes exist, the wrapper needs to be built
            if (!empty($wrapperClasses))
            {
                $html .= "</div></div>";
            }
        }



        //WHAT: menu item: after subcategories --------------------------------------------------

        //NEW:
        //If parent category has type 'mega', insert category block (Block "Bottom") below the category link and children.
        if (FALSE === $this->_isSimpleSidemenu && $parentInfo["ddType"] === self::DDTYPE_MEGA)
        {
            //If Block "Bottom" exist
            if (!empty($catBlocks[3]))
            {
                $html .= '<div class="nav-block nav-block--bottom std">' . $catBlocks[3] . '</div>';
            }
        }
        //end:NEW

        $html .= "</li>";

        return $html;
    }
    //end: _renderCategoryMenuItemHtml
    
    /**
     * Render categories menu in HTML. TODO: add new default param value 'level-top'
     *
     * @param bool Add opener if menu is used as accordion.
     * @param int Level number for list item class to start from
     * @param string Extra class of outermost list items
     * @param string If specified wraps children list in div with this class
     * @return string
     */
    public function renderCategoriesMenuHtml($isAccordion = FALSE, $level = 0, $outermostItemClass = '', $childrenWrapClass = '')
    {
        //TODO: get rid of these param: $isAccordion        
        $activeCategories = [];
        foreach ($this->getStoreCategories() as $child) {
            if ($child->getIsActive()) {
                $activeCategories[] = $child;
            }
        }
        $activeCategoriesCount = count($activeCategories);
        $hasActiveCategoriesCount = ($activeCategoriesCount > 0);

        if (!$hasActiveCategoriesCount) {
            return '';
        }

        //NEW:
        //Info about parent category.
        //IMPORTANT: at the beginning parent doesn't exist so it has to have no type.
        $parentInfo = ["ddType" => self::DDTYPE_NONE];
        //end:NEW

        $html = '';
        $j = 0;
        foreach ($activeCategories as $category) {
            $html .= $this->_renderCategoryMenuItemHtml(
                $category,
                $level,
                ($j == $activeCategoriesCount - 1),
                ($j == 0),
                TRUE,
                $outermostItemClass,
                $childrenWrapClass,
                TRUE,
                $parentInfo
            );
            $j++;
        }

        return $html;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * NEW:
     * Render categories menu HTML
     *
     * @param bool Add opener if menu is used as accordion
     * @param string|int Starting category - a point where traverse begins
     * @param int Depth of recursion - how many levels of subcategories retrieve
     * @return string
     */
    public function renderMe($isAccordion, $parent = 0, $recursionLevel = 0)
    {
        //If in mode "parent_no_siblings"
        $curCategoryId = '';
        $curCategoryLevel = '';
        if ($parent === 'parent_no_siblings')
        {
            if ($curCategory = $this->_frameworkRegistry->registry('current_category'))
            {
                $curCategoryId      = $curCategory->getId();
                $curCategoryLevel   = $curCategory->getLevel();
            }
        }

        //Save additional parameters
        $this->_isSimpleSidemenu = TRUE;
        $this->_showNumProd = $this->_helperData->getCfg('sidemenu/num_of_products');
        //TODO: get rid of these param: $isAccordion

        //Basic parameters (from default version of this method) for the main loop
        $level = 0;
        $outermostItemClass = '';
        $childrenWrapClass = '';

        //Retrieve categories by parent
        $parentCategoryId = $this->_getParentCategoryId($parent); //Retrieve parent category ID based on parameter value
        $storeCategories = $this->_getCategoriesByParent($parentCategoryId, $recursionLevel);
        $activeCategories = [];
        /* $this->_logLoggerInterface->debug('renderMe - $storeCategories: ' . get_class($storeCategories) .' : '. gettype($storeCategories)); */

        foreach ($storeCategories as $child)
        {
            if ($child->getIsActive())
            {
                if ($parent === 'parent_no_siblings') //If is in mode "parent_no_siblings"
                {
                    if ($curCategoryLevel !== '' && $child->getLevel() == $curCategoryLevel && $child->getId() != $curCategoryId)
                    {
                        //Omit categories from the same level as current category (leave only current category)
                        continue;
                    }
                }

                $activeCategories[] = $child;
            }
        }
        $activeCategoriesCount = count($activeCategories);
        $hasActiveCategoriesCount = ($activeCategoriesCount > 0);

        if (!$hasActiveCategoriesCount) {
            return '';
        }

        //Info about parent category.
        //IMPORTANT: at the beginning parent doesn't exist so it has to have no type.
        $parentInfo = ["ddType" => self::DDTYPE_NONE];

        $html = '';
        $j = 0;
        foreach ($activeCategories as $category) {
            $html .= $this->_renderCategoryMenuItemHtml(
                $category,
                $level,
                ($j == $activeCategoriesCount - 1),
                ($j == 0),
                TRUE,
                $outermostItemClass,
                $childrenWrapClass,
                TRUE,
                $parentInfo
            );
            $j++;
        }

        return $html;
    }

    /**
     * NEW:
     * Retrieve categories by parent
     *
     * @param int $parentCategoryId Starting category - a point where traverse begins
     * @param int $recursionLevel Depth of recursion - how many levels of subcategories retrieve
     * @param bool $sorted
     * @param bool $asCollection
     * @param bool $toLoad
     * @return Collection|CategoryCollection|array
     */
    protected function _getCategoriesByParent($parentCategoryId = 0, $recursionLevel = 0, $sorted=FALSE, $asCollection=FALSE, $toLoad=TRUE)
    {
        //Check if starting category exists
        /* @var $category ModelCategory */ 
        $category = ObjectManager::getInstance()->create('Magento\Catalog\Model\Category');
        if ($parentCategoryId === NULL || !$category->checkId($parentCategoryId))
        {
            return [];
        }

        //Retrieve categories
        if ($this->_flatCategoryState->isFlatEnabled())
        {
            $storeCategories = $this->_getCategoriesByParentFlat($parentCategoryId, $recursionLevel, $sorted, $asCollection, $toLoad);
        }
        else
        {
            $storeCategories = $category->getCategories($parentCategoryId, $recursionLevel, $sorted, $asCollection, $toLoad);
        }
        
        return $storeCategories;
    }

    /**
     * NEW:
     * Retrieve flat categories by parent
     *
     * @param int $parentCategoryId Starting category - a point where traverse begins
     * @param int $recursionLevel Depth of recursion - how many levels of subcategories retrieve
     * @param bool $sorted
     * @param bool $asCollection
     * @param bool $toLoad
     * @return Collection|CategoryCollection|array
     */
    protected function _getCategoriesByParentFlat($parentCategoryId = 0, $recursionLevel = 0, $sorted=FALSE, $asCollection=FALSE, $toLoad=TRUE)
    {
        $flat = $this->_resourceModelCategoryFlat;
        return $flat->getCategories($parentCategoryId, $recursionLevel, $sorted, $asCollection, $toLoad);
    }

    /**
     * NEW:
     * Retrieve parent category ID based on parameter value
     *
     * @param string|int $parent
     * @return NULL|int
     */
    protected function _getParentCategoryId($parent)
    {
        //Get starting category ID
        $parentCategoryId = NULL;

        if ($parent === 'current')
        {
            $curCategory = $this->_frameworkRegistry->registry('current_category');
            if ($curCategory)
            {
                $parentCategoryId = $curCategory->getId();
            }
        }
        elseif ($parent === 'parent')
        {
            $curCategory = $this->_frameworkRegistry->registry('current_category');
            if ($curCategory)
            {
                $parentCategoryId = $curCategory->getParentId();
            }
        }
        elseif ($parent === 'parent_no_siblings')
        {
            $curCategory = $this->_frameworkRegistry->registry('current_category');
            if ($curCategory)
            {
                $parentCategoryId = $curCategory->getParentId();
            }
        }
        elseif ($parent === 'root' || !$parent)
        {
            $parentCategoryId = $this->_modelStoreManagerInterface->getStore()->getRootCategoryId();
        }
        elseif (is_numeric($parent)) //IMPORTANT: this condition has to be placed after if(!parent)
        {
            $parentCategoryId = intval($parent);
        }

        //If no current category (e.g. if current page is the home page), get fallback category (root)
        $fallback = $this->_helperData->getCfg('sidemenu/fallback');
        if ($parentCategoryId === NULL && $fallback)
        {
            $parentCategoryId = $this->_modelStoreManagerInterface->getStore()->getRootCategoryId();
        }

        return $parentCategoryId;
    }

    /**
     * NEW:
     * Get number of products in category
     *
     * @param ModelCategory
     * @return int
     */
    protected function _getNumberOfProducts($category)
    {
        return $this->_categoryLayerFactory->create()
        ->setCurrentCategory($category->getID())
        ->getProductCollection()
        ->getSize();
    }

    /**
     * NEW:
     * Get block title including variables/placeholders
     *
     * @return string
     */
    public function renderBlockTitle()
    {
        $helper = $this->_helperData;
        $curCategory = $this->_frameworkRegistry->registry('current_category');
        
        //If no current category (e.g. if current page is the home page), check fallback title
        if (!$curCategory)
        {
            //Check if fallback enabled
            $fallback = $helper->getCfg('sidemenu/fallback');
            if ($fallback)
            {
                $blockNameFallback = $helper->getCfg('sidemenu/block_name_fallback');
                if ($blockNameFallback)
                {
                    return $blockNameFallback;
                }
                //Or else get the standard title
            }
        }

        //Get standard block title from parameter
        $blockName = $this->getBlockName();
        if ($blockName === NULL) //Param not set
        {
            $blockName = $helper->getCfg('sidemenu/block_name');
        }

        //Replace variables/placeholders in the title
        $currentCategoryName = '';
        if ($curCategory)
        {
            $currentCategoryName = $curCategory->getName();
        }
        $blockName = str_replace('[current_category]', $currentCategoryName, $blockName);

        return $blockName;
    }

    /**
     * NEW:
     * Get category block (attribute) content.
     *
     * @param ModelCategory
     * @param string $attrId ID of the attribute
     * @return string
     */
    protected function _getCatBlock($cat, $attrId)
    {
            
        return $this->_filterProvider->getBlockFilter()
        ->filter(trim($cat->getData($attrId)));         
    }
    
    /**
     * NEW:
     * Get category label HTML
     *
     * @param ModelCategory
     * @return string
     */
    protected function _getCategoryLabelHtml($cat, $level)
    {
        $catLabelKey = $cat->getData('umm_cat_label');
        
        if ($catLabelKey)
        {
            $catLabelValue = trim($this->_helperData->getCfg('category_labels/' . $catLabelKey));
            if ($catLabelValue)
            {
                if ($level == 0)
                {
                    return '<span class="cat-label cat-label-'. $catLabelKey .' pin-bottom">' . $catLabelValue . '</span>';
                }
                else
                {
                    return '<span class="cat-label cat-label-'. $catLabelKey .'">' . $catLabelValue . '</span>';
                }
            }
        }
        
        return '';
    }
    
    public function getStoreCategories()
    {
        return $this->_helperCategory->getStoreCategories();
    }
    
    protected function _getItemPosition($level)
    {
        if ($level == 0) {
            $zeroLevelPosition = isset($this->_itemLevelPositions[$level]) ? $this->_itemLevelPositions[$level] + 1 : 1;
            $this->_itemLevelPositions = array();
            $this->_itemLevelPositions[$level] = $zeroLevelPosition;
        } elseif (isset($this->_itemLevelPositions[$level])) {
            $this->_itemLevelPositions[$level]++;
        } else {
            $this->_itemLevelPositions[$level] = 1;
        }

        $position = array();
        for($i = 0; $i <= $level; $i++) {
            if (isset($this->_itemLevelPositions[$i])) {
                $position[] = $this->_itemLevelPositions[$i];
            }
        }
        return implode('-', $position);
    }   
    
    public function getHelperData()
    {
        return $this->_helperData;
    }
                    
    public function getCurrentCategoryKey()
    {
        if (!$this->_currentCategoryKey) {
            $category = $this->_frameworkRegistry->registry('current_category');
            if ($category) {
                $this->_currentCategoryKey = $category->getPath();
            } else {
                $this->_currentCategoryKey = $this->_modelStoreManagerInterface->getStore()->getRootCategoryId();
            }
        }

        return $this->_currentCategoryKey;
    
    }
}