From a5bb2d867c5dd58315e4a264aacb7b8c1856b797 Mon Sep 17 00:00:00 2001 From: ectasy663 Date: Mon, 27 Jul 2026 14:56:25 +0530 Subject: [PATCH] feat: setup admin JSON generation and pdf viewer for free plan DPPs --- Dockerfile.dev | 3 + PragatiVeer_Cancellation_Policy_v1.0.pdf | Bin 0 -> 24344 bytes PragatiVeer_Disclaimer_v1.0 (2).pdf | Bin 0 -> 23520 bytes PragatiVeer_Privacy_Policy_v3.0.pdf | Bin 0 -> 34758 bytes PragatiVeer_Refund_Policy_v1.0.pdf | Bin 0 -> 24088 bytes PragatiVeer_Terms_and_Conditions_v3.0.pdf | Bin 0 -> 31185 bytes admin_uploads/dps_biology_ch4.json | 202 +++ admin_uploads/dps_chemistry_ch4.json | 202 +++ admin_uploads/dps_mathematics_ch4.json | 202 +++ admin_uploads/dps_physics_ch4.json | 202 +++ backend/main.py | 241 +++- backend/models.py | 11 + backend/seed.py | 50 + create_policies.py | 555 ++++++++ docker-compose.yml | 6 +- pgbouncer.ini | 14 + pragativeer-ai-coach-complete.html | 1216 +++++++++++++++++ pragativeer-ai-coach-dashboard.html | 821 +++++++++++ .../dpps}/dps-bio-ch4-20260707.pdf | Bin .../dpps}/dps-che-ch4-20260707.pdf | Bin .../dpps}/dps-mth-ch4-20260707.pdf | Bin .../dpps}/dps-phy-ch4-20260707.pdf | Bin remove_links.py | 24 + src/app/admin/settings/page.tsx | 112 +- src/app/admin/students/[studentId]/page.tsx | 486 ++++--- src/app/admin/students/page.tsx | 176 ++- src/app/cancellation-policy/page.tsx | 85 ++ src/app/cancellation/page.tsx | 131 ++ .../dashboard/ai-coach/cbt-dpp/[id]/page.tsx | 289 ++++ src/app/dashboard/ai-coach/cbt-dpp/page.tsx | 302 ++++ .../ai-coach/college-predictor/page.tsx | 57 + src/app/dashboard/ai-coach/heatmap/page.tsx | 25 + src/app/dashboard/ai-coach/mistakes/page.tsx | 133 ++ src/app/dashboard/ai-coach/page.tsx | 230 +++- src/app/dashboard/ai-coach/readiness/page.tsx | 79 ++ src/app/dashboard/ai-coach/strategy/page.tsx | 41 + .../dashboard/ai-coach/study-plan/page.tsx | 66 + .../ai-coach/time-optimization/page.tsx | 25 + src/app/dashboard/ai-coach/tutor/page.tsx | 13 + .../ai-coach/weekly-progress/page.tsx | 25 + src/app/dashboard/dpp/page.tsx | 113 +- src/app/dashboard/layout.tsx | 151 +- src/app/dashboard/page.tsx | 2 +- src/app/dashboard/rank-predictor/page.tsx | 266 +++- src/app/dashboard/settings/page.tsx | 2 +- src/app/disclaimer/page.tsx | 87 ++ src/app/layout.tsx | 5 +- src/app/login/page.tsx | 51 +- src/app/page.tsx | 51 +- src/app/privacy-policy/page.tsx | 200 +++ src/app/privacy/page.tsx | 135 ++ src/app/refund-policy/page.tsx | 96 ++ src/app/refund/page.tsx | 148 ++ src/app/signup/page.tsx | 232 ++-- src/app/terms-and-conditions/page.tsx | 128 ++ src/app/terms/page.tsx | 141 ++ src/app/upgrade/page.tsx | 165 ++- src/components/AI/CollegePredictorCard.tsx | 91 +- src/components/AI/DailyChallengeBanner.tsx | 87 ++ src/components/AI/ExamStrategyCard.tsx | 48 + src/components/AI/FeatureIndex.tsx | 33 + src/components/AI/MistakeReviewCard.tsx | 218 +-- src/components/AI/ReadinessGauge.tsx | 144 +- src/components/AI/StudyPlanCard.tsx | 203 +-- .../AI/StudyTimeOptimizationCard.tsx | 74 + src/components/AI/TutorChat.tsx | 117 +- src/components/AI/WeeklyProgressReport.tsx | 77 ++ src/components/CBT/ExamResult.tsx | 22 +- .../Dashboard/StreakOnboardingModal.tsx | 1 - src/components/Landing/PublicLayout.tsx | 101 ++ src/components/MaintenanceScreen.tsx | 32 + src/components/ui/table.tsx | 118 ++ src/hooks/useActiveUser.ts | 97 +- userlist.txt | 1 + 74 files changed, 8546 insertions(+), 915 deletions(-) create mode 100644 PragatiVeer_Cancellation_Policy_v1.0.pdf create mode 100644 PragatiVeer_Disclaimer_v1.0 (2).pdf create mode 100644 PragatiVeer_Privacy_Policy_v3.0.pdf create mode 100644 PragatiVeer_Refund_Policy_v1.0.pdf create mode 100644 PragatiVeer_Terms_and_Conditions_v3.0.pdf create mode 100644 admin_uploads/dps_biology_ch4.json create mode 100644 admin_uploads/dps_chemistry_ch4.json create mode 100644 admin_uploads/dps_mathematics_ch4.json create mode 100644 admin_uploads/dps_physics_ch4.json create mode 100644 create_policies.py create mode 100644 pgbouncer.ini create mode 100644 pragativeer-ai-coach-complete.html create mode 100644 pragativeer-ai-coach-dashboard.html rename {dpps => public/dpps}/dps-bio-ch4-20260707.pdf (100%) rename {dpps => public/dpps}/dps-che-ch4-20260707.pdf (100%) rename {dpps => public/dpps}/dps-mth-ch4-20260707.pdf (100%) rename {dpps => public/dpps}/dps-phy-ch4-20260707.pdf (100%) create mode 100644 remove_links.py create mode 100644 src/app/cancellation-policy/page.tsx create mode 100644 src/app/cancellation/page.tsx create mode 100644 src/app/dashboard/ai-coach/cbt-dpp/[id]/page.tsx create mode 100644 src/app/dashboard/ai-coach/cbt-dpp/page.tsx create mode 100644 src/app/dashboard/ai-coach/college-predictor/page.tsx create mode 100644 src/app/dashboard/ai-coach/heatmap/page.tsx create mode 100644 src/app/dashboard/ai-coach/mistakes/page.tsx create mode 100644 src/app/dashboard/ai-coach/readiness/page.tsx create mode 100644 src/app/dashboard/ai-coach/strategy/page.tsx create mode 100644 src/app/dashboard/ai-coach/study-plan/page.tsx create mode 100644 src/app/dashboard/ai-coach/time-optimization/page.tsx create mode 100644 src/app/dashboard/ai-coach/tutor/page.tsx create mode 100644 src/app/dashboard/ai-coach/weekly-progress/page.tsx create mode 100644 src/app/disclaimer/page.tsx create mode 100644 src/app/privacy-policy/page.tsx create mode 100644 src/app/privacy/page.tsx create mode 100644 src/app/refund-policy/page.tsx create mode 100644 src/app/refund/page.tsx create mode 100644 src/app/terms-and-conditions/page.tsx create mode 100644 src/app/terms/page.tsx create mode 100644 src/components/AI/DailyChallengeBanner.tsx create mode 100644 src/components/AI/ExamStrategyCard.tsx create mode 100644 src/components/AI/FeatureIndex.tsx create mode 100644 src/components/AI/StudyTimeOptimizationCard.tsx create mode 100644 src/components/AI/WeeklyProgressReport.tsx create mode 100644 src/components/Landing/PublicLayout.tsx create mode 100644 src/components/MaintenanceScreen.tsx create mode 100644 src/components/ui/table.tsx create mode 100644 userlist.txt diff --git a/Dockerfile.dev b/Dockerfile.dev index dcac166..364df7e 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -9,5 +9,8 @@ RUN npm ci # Copy the rest of the application code COPY . . +# Set memory limit to prevent Next.js dev server from eating RAM +ENV NODE_OPTIONS="--max-old-space-size=512" + # Start the Next.js development server CMD ["npm", "run", "dev"] diff --git a/PragatiVeer_Cancellation_Policy_v1.0.pdf b/PragatiVeer_Cancellation_Policy_v1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3c4fa8963b38c3cd628492598c685465c3d5888 GIT binary patch literal 24344 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 Z?|i$N*gNjr(qeFND5%TFC#xn$`7f*o@;U$j literal 0 HcmV?d00001 diff --git a/PragatiVeer_Disclaimer_v1.0 (2).pdf b/PragatiVeer_Disclaimer_v1.0 (2).pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7fbc660cb06a8ddd1d02fe03b7427fb882d35fd GIT binary patch literal 23520 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 literal 0 HcmV?d00001 diff --git a/PragatiVeer_Privacy_Policy_v3.0.pdf b/PragatiVeer_Privacy_Policy_v3.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9b2d94839c247d779089e4142cd36ee26a448f9 GIT binary patch literal 34758 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�N6}l? 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 b^Yi9C%>w7Ld0E2X2oR*iAS9%stIF^%CUQ8p literal 0 HcmV?d00001 diff --git a/PragatiVeer_Terms_and_Conditions_v3.0.pdf b/PragatiVeer_Terms_and_Conditions_v3.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dcf227c7755ed05ce58341593634741550087ac1 GIT binary patch literal 31185 zcmdSAb#NTZ(%@?`GxON8n8{*hW@ct)W@fZl7PDkAGcz+Yvn+-u`A!BE4 z;HYo-*A&^0fq+j;e+K+@WcWv@skN1WuEWPF0&MiO^xtTi>6z*1ndliADQKBU7-&hz zpt-o94Xq4*>qP&by1CjI0%-Vk9ds?MjX##tH8!*dFnkP<`;Q5X|7C)pi-WMd!^eWq zH1fOv2Rp~#Cz1eKYFc_|8hu>=9X0KTwY-1*@`}m>jC3vR|BTVKHwVy2Sz8(YTOX#s z#jAfT@8Do)X9b`UFmy82H`#X=q@o%V+HZP^bO)gNc=in)c5Jz`{uX z_o?Q8c;b(gfA*E%+QQmS-bPp75b%4OW%%W70KaYd5c~V|-$wjt8~^i%u$`{!Z;>?r za^j!q!t%O+-;Vy{_zNtq{~7Wz{NJwq zW9Dyt)dBzVqjCFWfbFF*7O5fmmZFsL$&6|9CF~8#`m`1=g zk3b*0X;>4#seZ10-hSVB_qv+X_^zbR^-Nw>xaGf*<-OvGYqAKJ<p`F(8n!z+Con83)z5T2foquJX`;FbRcD^=AwLkwoor>UI`_1rv2Vu;bv#FrQ zeVYYgcRXu?=-#kw{5h-kNw)368>GPXQ0r$6R+=sNuEa;t)U-z8- z3$}Gf4{S4*Y+MsrX;Bk&qcj`(9_eV9`|hwY_WS#I1y2VGhPI>k_a)J;b0lta%q49z zv&W$hYn*3XT&Y5h`$q>xCTBgDC#Kv`1Z;C0ud^?@8w&(!h1$-m^?st%4)2NC0+7h|s zRnS}sjATzMT$>in)PYPH-`OvGhg>NcA0M#io|P@v6P~$qHHj3aw3EmPX33?1#@}&S z)k9;!5z`n65|f7t_V8Iq=!O7Y?vCK%;EjlR#|ig*yLi&`POi{8ZHt=WIeo3A-d!i0 zAkq%)BwP#IF;EGX`5EWF5N0*B)F?1856nQlplH%0ZC|_Pbx*IngmolVWU1NLSF-( zyg>(M!=cf6waIoJBh;(~*j9IGC|b~!l}?=kkYv(CB@a1AU<;>KL0C)8XLBNc8)hRY z{{_Gs=CDPKGfAf&Sx>O)iM)11UtuQ54mqSELz>DQZ0U+ z;U#r?rt3eH0|)BjOW7t*0-vE?(o8LPGtt7RYQe`Gvv<#f>f)Si(a(35sqQVodZWa- z_;X>$nC5LU-)|s*!7#meB+*+*>d%y#QBO`+=9IrQBFljjvW7vyA9W6T@w#~3q}l87 z3)|}Cj&kYei^JeMYxqHg#4hmnB9u}=od$E~h$2yn;Az`^!*}bdj1q<(AaqHXC8|aQ zrryIbir{m|B@fm~r!vr(F~mdK5u}hsVapM$zZ?&RFPG-cBdelplxt0mJ2 z$Eddqekmv5yDdz;2E##clJjb#gu`b!oY1tVttx__B!e=Dv^m1Xop*aCC&0qun=YeM z{Z^{L~=nsI(-MW|AzRP|yne%RgCry<9o0)ny}1DKNbx zaDZM=M?ZfXbj(Jzg0oj-ypW+`;@^BVlHv}C-#_bEp2&j0GQUnXDg#;q? z6Xt+8fx$xWbje9?A;R`tnaMLgmV!96QgLJUwHhI&2NSD3En&Klc9HrLaeRSY?O1hR zgeC5K6TrpnjYT?@?xjP)J?w3QUu0)BVk`?#?PC4WYj2|kWkE$+xWYf35sT%N|3erT z66u~-x{AmRHH)wUwk5N8S63}2JYA(jaB8%FibLqi*)6s;h(T6oKgggc09mDbg`|}& zK_UUMb2u_MOA3b!ApAo|f!OimQ4EIJC4Yy98WG0ao|gd(mWEhF%!*5A*HeU?H0wwa z=cE#_11Tr4^ex;$4XgOuh|FhdvQehl&&htxST5uGL(ztv@i=Z}CFtk}`Jxj7y9! zqy(42I^dG|P6v(lQ(wQ%Y&hpKDp%(d8p-OGBH+h5A5`r@BSFNrs74?a)GqnsC*|yt zER3CVU@%35*|?m~i_<96RHS5ZrY3KCR68z~{9RfyQr|c0`a{_iQAk8YwPNg{eKoqr zV-kRcL#`~Drtg2aQo{<+&CAS+_?r5;pc7|p%Vaka+a$xopk~+k*%B7vAk+F;2_tuG zS@iQS879KgIGMKrMFo3EZj-m}b(YJXKe{-w5}8(or<;fQmX~h8o8^rJrG5kd39UXI zE^*Shhr3o0AO6V7AndFn+1`#p^r=ZhielUeZv5J@ovH$521UArKO4^IB5arTHFm+r z>w*!)W~xLdQg_`6LG5bg@>H!jVYXz;DGN@g4mom*(knde_Q-YM*V_Z0vfG`jH`Kvw zoY?b~RXkYq^i^Q>0Q8j+#126G){(pq!jzji0zsjb=78^&Hvtj5 zZ$P*UbumSfg-wx^)#2+7xTU8tU%mVAwxcB{85)5$YKZ&--Q1l+39}F>v&l($vc+qj zCe+&kL)4;%+GdrRLvVtCeJuV6vyS%(zDHiI(ABYixGGb#{C$56u-T6vfZ?s~<{P2d zr;_z#hP+)neHPBsi(6KC$tL2E7;Sl4AD1fIqC}n1<4n4x(NU!S8pU~ZQAMOp_`NU1 zd?8PBkrKKnQNAEs!)0Rtu)Ug`+ZKh%L`-l zYgL4h?9qU6a-C%geoG9r!5Vz1!~ zf(&0hHTodQnchkwb?JDp+sLKS%nd}y+R>8;4Ast(t5Z4JX0FZJU%+u~5hIFxp>3h6 zf;)N}AsDw~Y3xx^n@=GG9dX+mwY}mQm|~iutE50RPO0MD)AHi!?CJHnLf&3s)saTeU!#zmPNj&aoZL@Kr!VC1pQy+u{*#+^yKsYVf zPbNAx|JiLrkO#@ZJZ8_$o{mQNOpu5Ez3vs>OFCi=U}5Zp_+gdGNU3i?WAShb+}0@mZ6-f~}%)WIV2~5;MEZqk}04J zdx`lqM`Nieq05k1JoA(cxD*O@2tMBj;iTGFpK%*!p3jO;4AT=_zFl3{lp|Pr|B~{*B>NAA{;=wQp#9%O{14jyg~k8JX#ZQvKYIM%fcC%5 z{H?D#;Ll#m{hRRrxac2K{z3fT0hIq1;;TpR)T4QQAilkiiD+0H=?~JM4D9MZc%WgO zd^u1(Nxw<@18^MDg5O@{kjccqa4)}&#u{5#`$QP3wc_GuKC^n50*eT2)T~Uj84}0slIM8;;F)>&4cx--F@>t=#$UJ-RSW<2_dK-RPdRvXA_qrPR zzTte)f91TxoQ3~hAK&+WTG)YJ^3e76TKDkGEg<`{D|F<2>!`e7cDk}Su(2QAUz?94 zG&t-u)H_YQ?XLib>>W9MjxxD!BPq(&lpH_^I4eEp(h3dECvb+ zSk^=?Wn_}g;dc%Vr^EVw{*KF%$XADKMQ2Wsj=_?|pM`t$rApOJvsx7S)O8Cb$ffof zN#Fz4Zn|KN_Z+OXL?^u|^&Mn|R~23iaA#4;GT!m3+1)-CZcBSE zcvEw|H#6j;c`0z7hMUI{1SOT69*f;c%7+&Pp|fLY){Qv#PF~+Gb#I}SDMHCR^`J&; z)X4CQYoVs_{%R&H?5NwI!IC-+nP+}qn|WwVL>+FFW8K( zUY?V0si{@1J9C^MS!uGE|Ju|+?0#x9FV>uS%Rs1v4mZ1{K)mQ= z!j1d@Hjz-Y#vaLqP0}aK43eET*FGUdTB?qB^W4hrbPS6i&okF>HM_a7 z6%}E^#wUk0sQx^=II%~+d>&Oe7k%$2jDOx!{1;H0d?*N2&w8sZCJpHXtUkLm#WC8R zZEX$}g`pB^wqv6P*afD*97*afTUwoov^Fp_ggP-bT5ZvjR6KZU9u7jOFhr@9=a&SB zXG|HV(Tu+M6G#EHvkE6iVVTOLOvOheZvU^U$a<*CMvvbCbj9dS7yAZGyjs-Rp3N{!8 zqPvdb|DFu}4OyFv<4oPU&C-_9iCb!KE`SFL7oo8>!GRNG$KBq+H4;@W$vj_lG-lfX zW=~w+e3R{@O+!&Jvas^uIMZaa<$Tc-TSFJ{w_pKtMsJrUXI3X z`o{K@y{G21L11ZK5J8VFYO$jxIr7~rz3RfWDU+r}+X-QVijr?(1ny*!tUST9hB5haZOQe4ic3cCSrZ2#wugZmrLZ z5k)j2cPO&+d+kl2PDNr9iRWk7$i{p(i&Pm919wOfK$z=%zSb9x!ts*;F}F?&H{!#Z zH`>pktXcxIMfD21#oNq>Vr_B~8O3yx+l#Ylq%Vs~FQF?)yYcd~V;Ok5wa7fny=era z_d-ZVeoCZ8!alx7Swc^ks$)DEHKn8|oD0d>AdXatmeORcTs zQc%#Bco@Au+9EvH%dqZJXcKkxLZLQ73pdQX9ad=bo#fE(cS?>d7p_#S#}^l3AZ zh)@baJL2ae{8jaVQ5u+X1p13x}df>umYz~k~U`kL!ITNFZ!O1=5 zSX4^QEXg}td=9|rxT@s*`bmBc2XldeyUqbHTNQO>M)I>nN0L9jOCx$Q-EiNQmJ;C8ok!{R&%bvZ-Z*wTi!ZWicNM z3;XVS;iCTo%}a@jWmwoNBxjF`ZVR8vT$TVe5hcl?sFkGkJvoTBHB+YH2KvNRQW{Dy z`toj<37rTPUE(zxl?Q7d69t-3-hhdAPjL!GmTl65XAC~5X8l+z_1uJ$jN8$T!c26*c5R|A(XI~**8*oW9( zbitW~9S5i%_rSC%U-XUmKqnNr6lo#j^E`Aa7h&C8jl7kA+39njTnp!a(>e9*(~XX> zOES?llKeU<6ALAgjHmmgo4_MxID`$Jf`|$UorXvai7j1x@$$A>-Ax<9QdjxyvnN{a zPkh9r)07C5WXsrOpwqFv!I5G84Yh~RJ$IdQ5M#gHv7nT0YMxFB${H}^Xxw3n&@u-* z>_7EeZ9 z=tAYyr!?q4C>EH4q;%nbv`ONMpebri!N-<=o6LVj+;`Xtln%Auw<}KHo?SQ-eXTSE z2TLr~x8yG|TuytnJbSF{iQO_ow|nhX+9KC7BlewoKyMu5V!UW}^?bYt6@N8DwxwW# z8b6z!Tk$*dD_s??#FyB4n|TlL_qiehvoN^KlB{ToOv|k_N`bD?r)#}bdJ~NE^&KGH zvk)(TO{4vkb$w&MB5|1g-)@n@ z{Y9LAz1Z_KyYV$gdh|l=0nhOD=OoX~Ctn(HAephlix8Kv?f>GmNJ4==`vIjGH+V3d z_S_X9AfJCq3!8lF)A~pw5roV2ONMj;XX|H*Hqu?vkI%hOMiMosYq}9@0aa1g`#QKp z9Ce}S{g?d-jsXusx{!1yt+#-SOrwG}*GF7_s+w~rU@MONMs$52(_j6&lsEgxs??)y z*KwV#fmX<0In7l=M`;JeWEzH(^MGBMOI*dvgNr7`9@|sQN!E>$r!;+6C44=`^wDm;m+O#FJ$HIVCo&sD;``|1~_V^o{NZ9=x2&x!-|t^zMSgo2A-us zbJWhw>77pWj_8N8K7EyjW;|cIob*^*?4|`j`W=fs#xLaE42Ius&Oe^4WsFD-)z`efiOewZtF{wHUsBbfCU8x+3Q%D{nD8G7c}vKef?5R20T0>ZRX^Q~N@evCv0 zo?l)Pt{1geQAE%xb)Dd0I6kfvJ6W2n8!_3DvSqh*@@uH6a9Qr^{%)Bh?`~s$&C~C5 zW`vc)Ev0$4qQ_~5D|BqgLZUgeB3jIfMv);QvU=oR#GqM`W+d%?=B(9hD=Czvt-F-g zre&>Yz(sM2qs7Lk6%fn~NHF85N!RGJKQtyWI?N0y3OW)?gX9{&mDq~y6)_Zgl_unt z_01%Ym}4e#)aVRD_-jY%sLcff4GQ!#NMu#v7}QZ(Ci2HKm$TTXyhL7O6hA{@?FV9k zcHK6RceEw~oFAu=T;(&XzJFmL)YAx%AV$$AAc=EA)(XR@Ia#%_$csbS^t4!g;z>uv z5f!}df=R+P6U7or*nHr}JaCC#z-ef`<5D7kr|?{w&_|6gdz4ALLiDSkbA?jaR8mrn zjfW2VPrBKp3M8b*XjqW=H43>)Jh2z1Cn?|dV9oB@)3Oj)*kXqpBO;z zv(iCIafifgxs=8xC{37H8N|ZYo6o$zvYX93NIOSI?>Awj(HqC9+*C}NGl*wrzJ{ec zin+!t3~gsc67dF~rTdOEE;#!R*?lgM;q5XFjd<_am#vkURbHm|W;KhdQb`>!RzzeB zLgdCqPOo6H%jh9ge)!Ppdw9bYNOHRGxCWZ0dI!lA;Fs*MWpn~p`JY^@Y(ClmWEM9Q zX+rcHX5mlZoZ}MTwWa537erBEO*FBEcatC^1cv2L05_$6R1bJe6m@pFt*zxG&kK5m zP|gjR67;@EfmKNi%WHl5fyI8@u9f8N9uFh+pRuIkU8vjPAcpaMLdRjlI=5ZR`2$jW zY*Y+2#9gQ}o!=qm%N+XuC$X4+@)Q_YSeXA6i}}x2?*EMt2mRl#NZ$Td?@p%Wl;xbY z_O883Sf0T}|GxI>ifQ<;9bMUR!3Do_5oF!Y@nT65{@x_LfmZUc{`yk)a77}E%Ka?c z%>87ktY~)FV%zcN{$xHgYeZ~ zEE6hl$E4Jo(AD567I321%3BHAv>)elo%I_WJFbs8D4cVhDYUU)B@J5%G?j7)JW-iS z;)SwiL$ib%APOC(4&$2_S0ZN)ZNJEpaJUM^!QcMecW_G=Q{aw9IkF`ey}zAR4P~2} zH~wmh?zXEMhKz~aL8UY`Oty6cU_3jWc$<{Ju%gmn-M?TTkYgE;`xUi!s8D@=GK{s( zeZj@Wij>rML(@k)9=tVRFC2v+#=dy_Vt=Llx%Rcd<<0THgK?`vHs`&-E@Jb5AIC_s!jUvJ+UBrt`v$J0|-)-sV`%vL;Ss`xIBC*YYDR}#{7)J*&Fp{6DKTH z4x^b6UL(x4{Dz+R+PHg<15UrIM-YDRwJ~MfNY;kjSA>b57()dyXsAQ|=hpf-2Bv%^ z%kd2x(O^ne-PBU`yIuDMFZ{wBgcdq^MGd<)VJ2tI`z2uQM#+JQu z!711l$1#Pk6Sl3o@wl$W)bMk$9js(8ZWIw^|ETZ#L1sf(#}6k`_Nv?TQPpytq|D-okx#>l)T zWr`US}w5+Ce{+jq!#IfC42)E<>Z!#|jEr(wAki_>H>52kRFF z;KcdFu>?52*;5dwPDIoo1uVjf>A??~E#H9akn#5pI%&1>U-D`-%NBws?^Hzv&(dL^ z1A~7}MuAEb975Q!K!hRuL~u}5By?$8B(<1!;sgp$~oGsBiT zB8&n?_I~1vx~^g#+Bz|mJJCQs#+Y*7mp~@(QKk;=u<}Q$BOau+7)&+$=yjraHaQo1W|n zBBSHvXW-^~dzF^?g(;LblK~k}LtqOrXNGcbs$xv9N?~AYfdTDuN%71r^G73zp22Of#0)V_3BIb)fx1xh=9#BbwIp-2=Oql`$dU97#dQ9FX`P0q5A zej(njgH(dMl=OWPb<(3%R~arU^G(7(%uQ;1ka5sD@-^sv5)9nJW@2o2a*bORsZ&h#|}Hp(Kj&!3+GWHZnTUWxIutatm>(v{N*UQutN zx2_~+@#5wMwrsxUVrzvqA9XGO&(J?;$r@0r#4Q?g25?<51*O5mve~Qx&A3@H-8`wN z{XoB{qpa1*i$9d?TE`Dtku$G>*tvKXaxNBK_b`-ppG^*uX7lzVQT^B?&qOBZ{hAh*e zpNRJ%5{&s|`lhFGdB$eJ7)%JR_!!op`7MFYQG0JJ z@5n25y5*vGyCFtt}MxK!3IZ38F2Tne|TAEq`P?9sZDy7>A& z;s)%^vqu9^`^ee6dkVE1W>WMW&jw|oEFgAFh`(Oe$9@if%{52BmJ_zSSu zZPH|&3nz;iG-3I}D)AIfJzjuyz%To5r%qLphfgbfA^jfTq9U1+n+Q)Cg*;>UFJX}> z`aH%2CMtu3QIG_1i+fwf(nA7(*^uZJ7ZS9A;*V|T|qYnDcLQ9M$n39rfU5}$#i11LP@{X9^{ zXNjuhFsk0pTq0h(L@{~^qmyE%tGdyR51-`d+Dcb&{($VklTuffF0vN8aah-#GUB0k zys2Dlo>Ug_LR;O*1Gx{)dWAg&`apP$|J8||0xm+8`y>F&Kucfp6Y@TuPQ$QA zN-5GWpJKTC^tohxMg#)lVel>b*Poy=IV_0OveDrnbcRp5TR96B86sOdanCMRjXcvu zfLwdh#WarOdmFTDwHYQj&@MDroyq>fMNurjt4gZqldGucOlRGsC3m7;7d+rrIp=Ia znAtD7p0uleS3m_ond*ArmwR1m6(3n5F)j@$SP{UDK{?56@f4un0eWtk^3=Icu#NaG zIdUxMUkBq{z@b!<6C<$}kS73Da+o#wCDp;{ErUtKcc={kX0^5jAUiJV(ismz4n>+s zGjIc2RXu2z0;f@W3k0Q-EFcni9R95iD`M5iCG~<-)1AiW9D)m&Xb%#6`BoK4EClg)0fw#g0{}^sY zH(|PB!E}?fCU5la6OVSsmBQL9>*0Lvke-ryx1K0I>NuiJbVwGvO+I$Nx9?TV3ZH0s z2Z_vtGW)Mg{Ri)UBOe1JE7LzrP5)o>8~&GR1N8qTZGis&oi;%K|1E9ckCcCS^#2#8 z{_oTQ{4wr-Blhb%H*1uu~Dl#LV#aCIV5yG5W+UE zS}Ce}1n0y3+9@#|oP}tq3$3q((MIcd+7d>p)IHV}~TnGZ3&jSo?a4a z^{Yk@?i6;VX<=}YHOlK$7P7<=22yk2{r}`H`X@5QNXPoGo9N$xDFDr1fvMk>CIW`` z`gW!^AC*dfRh~%cT7DD>$qMlC^72whSvy$E>sr}U@mX6KeDquB8ry#quKYEU?@uWW z)i*{)02KoZD}bJbmiD8%Q1f#{^z`{okcKf4ZSRs%8Fa zQqi+Ae01{b+K3pM8k_v9U*5scQVGEHd*W{$KVm(G^ZJ zGz}nxWsTJL%0Uq+4?v7p_#CM$f>yZ1r_9K3o{F5&s5(2O+3!kXyN;CJ;4^5Oh3Q%( zLD{8V+)MN&f7YNjnW}iy|EI|bx(JiB#lwx$oAYI9#+f=U5rD1A>otq{{@1~7vsH-H zWh)_*UsD@dQchkKT!$dI3g6}A~$>4hZ>mLmAYO`eG(n?fR#Q?5=)YhSdajig8(*Vv8lh6c& z_=KL8!NV5BxB_r^+;&2EJ4Xy;Mfkt!f$8Oo!PEs5Ks7>zgegLGMf6c3i-S;wB>B+n zID7Syz$OPfUoZ48FDt!XT`NZEdY13)l^Z{Se+q)&_1rqkc7RbqCv?wTbUc~F!1)F` zD&43BW5dq)?K5??R6a1vPl7x|hs#doPVNzIgqXBfg%{gk5ZN!yE6S?jMF9fH$kIe& zfn@?33Q*|9^kaH-L#XtD3X}+jLXvFd>oO`TYx|@NhdTEXYn7eDS-t^{9gmM-tu!!@ zp91wBuQeqe44&&IxEwqi8QFrab(ryQm~A1U09}w+ve7XhV!J*>Kw!Rl5av-+I<)({ zN0Fa|UfEwyj+!q@vQ2 zDgu?tBbr3nRd_{PG;phskZf|$(A_e)4_hu6ehM06h*yUWk15YR@oN0S*@Ka(D@kl+ zvT{drFM*EkPpM!piH8dulUQdvbF@$|Wn|m|rgY-sF7-_=Ux*z?xMUI=%_Q{JsN$+) zC%DnhBMPMF#%d(ifUqD`>s3iaUJ<_~1!NW6AZG^^F~iHyk>S!i9ZQ_)>cIHh$?eNy z^qic&r{;}-WZk#bMVV-|nN^Rjd_AW(ydTZ`KTldeu`1))zxvysmq;o2ifM)tlu!&( z-C^~1`9&f&SZ1S-@UK<)*bRHid!@vr*oEq>S0lO>-5X_L;XFI!m6VjUm+HHE@^OHQ zL>6RLq_1Lvl@V~SOzm2j7g17@r$9q9VyUM>U)zWcNgv|?06eUv@Y=N|vSI-ojP!E3 zqM}2?4qW>-g9ghDi7n@nMVVNkK)j zn^y#7GNjSIMq2UlET5h$ROfbs;2hfSG7)C~pY0Xztu9cu<_%{Z;_}yicDlI*h zKIRieWmBzyKZb*(*xJ&v+)nF9M&2bF=2NhVhs7gT22oWPnmK}(Yo!^&Ab>1nqGs4; zb%6rlA_RuYT0A4&@rv{DwNHh#c$CPU(o&U!5AwSE-)E1?$~iSVa;(OV`wOfCJ;BZAoCsfu#RMye{~T>si?nD zcJ8tWx~G+c9y<3#Dw-V^n>(}@BO=RSbOH7I_(rmsUZ+l~SzSS)I=_w^vjE?0Cg+d2 zgFXX8BmU=w1^l6zlMYJi^-`CddTg_k%m*Z7$UNXE@hEx-Qzhi|f*3^+?9GS0kpw&J zl$uHXkku>o&zw+3MoovkQ3P$Cio3nGO)FAJn&XkJ!c>T;tTpxx8}ATrcm@t? zvRmh#uC6itHqQej*D#;%&YQ;ZGcr7YJh2nL6X-I_uo85uIBA5e;cJuq8df7~BxD`| zqanKqS?&G_qlJZ!Mc{7O+F1bw`|0f^au9F~aHH^jF97SI@zU1+9x8E1}c7ZLe2=<`S# zLSp&YwSez!A?+8Pr>Z2)Xd%)z6$-^bv*h2qQ+&SHa3RsSjSsCf2oerhemi z^Ivdp_iv<-sX=5f)`>y&Zb(BFZNG6pw3zQehubnCn}27G8Pru9TOM0qJ`zem<9$a`Bj8UNh29)EBMe2@k)jMtvs?qHe+AsZI zfllRw)O2J_6y(qzi&slzP9DuU+bvP_fnRiZCtJL{+Dm$GJ@Nwfkyiu@X^(^SRt>L& zusiWOR~f6I$E*7t9pStqwsicETJ9bo#6a@f-==@~@Q7kq_<+BOP8Fv$onEQfFYAS? zwS8q6LmuYdxs$wPdqSGWo7r-7-~+eFMax!*B19F6z^dKo9TO?pE;+UXmpxwA?C$LQ9nSa}Us$b?{-))nHIxmJ!y~vl;Uy=xxo4(~2!X zCqXLJ3g|sLJ2jl(j{wI-nmHg%+!h)asOFJ7SRxmvHys|cI7P79oG#j9kyDzGV_z+84RT4A6%vNb;}yU%WS-OehHt@YgX63k1y=N z#y_+^9W1YS{h8m_imCANxF|McD-Y`!E@*mD$hLF&rHJ`pV^m;E6c9+X9+DWmO#l3J z@7d5m!vNE(M?gCXn}D$Ilq0FD7fye@ubQL-7SfS|pxSv=$U{I7t8#ilV1p0sGBq;i$WAZgTibn;mYay}=+&Ks99A0ez z{UA=x9$!L?hyiqkN0M)QW^4K(=_Jlb=}6MTxB=QOJ5Iy-@##-B9_u3OWR5IWU+xDN6q zAnRVVFJDmmFv|&X=(JA9^}klL?oK+2@^fy9i!db)Gx|>KyF+%9rQ<49tiE}?ib*t( zG`zjtU}WIoQDhE}helD`a!fMYbZ~mhCTneU6yz~lD*qas%obm%xAlBJIYHA?l^i2X zQ(u{3p#6v=cGw{C1l7$XrGJHab&yRae)LT+2nm;OHx(BX$T#CTq2}=j7ch?P2^Xzm zCwD`1x=}pk)hu!>!fNrvJo_GgAw^r9KM`AygC9b++*n|~Bu7epPE&PY9tV^}jf1^@ zKX*swGrUJwdSmz9u<{I_CSUXiYaQ)GI&`v8Lc4L@ErNjx8g$z_>iMY37q(J4R@_|m z(o!n3nm(=BRLbrVH%T&>gq-whk@Em2YW8z*H`tY=OT_QA8<4C?#*rl<9ux&I@{&=;&|S;) zX~gbH$pji^24(~9Qm0mFK(`q%j~Sa={rac-j(?oj~#jESHIxq4&Ye5ycbBIp646E#Xgg(nLD-tjE_9Z zk2c0ABX%{UwSwmetdjp2d|Mm~K2455Uvge`8P)2=Y=3*m{jU9bIQ&bxQp0O65P|E5 z!-`F`(mg((hGHrwsyx9!?Q(d#^A2xI+t16cv<-@Ch9DdQkIQa~@0A{IufxKX?JrXU z_Gp1IuPsdO70Gw=i>RGC@af5L66F=A9zdeo69gNvso;#A_88>h;yET`9)$(y$1rqb z1ALH3@7SJAXwLW0yhn5Zs1wJF%#iIU@^k!@p%rj2_aPDDSe#r^(5u zr`6Z1ek@)f2fO*Ek9X-7iUGXV^h88pv@n_kg4AQfS_NTaLuA#3T?gkOdj41iL9D0c zq81XEqpPi=!fLW7(=pFiS~R5gCt7|#JQ-IcLJ9*){9*$s<9ceXFOJo!4cutFO&jal z@(j*WqfY}nJ2I?BB+`HW)U9}jiB>FKER-lnN)qPs++MnlrAi)e$}WS*eG zu|G?DA*zZ_*3&`CS%dO}Ly^QXyyQZ;n6}lefLW#6^l~-Fuj6FjR;6b1e+(Ft=Uu&G zqnGA&CLxQTc*Q107P*Xqv8#drJ7QEsi%-*%s8>@YFITe9$tMz}%FI$xgT?}R{j^fZ z<>6rA$qR(i_@yW8s+MWNAS}c$P*;d>rp8t;r=hTUxX4&_qtc@fSA}7jy%0Jg=&Gv2 zi;W4)wW-DFO*+YP1zX}e_y1|{tiz({{{D|5AuTN}NcSd-3P^__jf8}Bw~~S&9fC+n zNQoc<(juiu3J8)*cP}L=DEwwwyzkrF@AtZ%=a1*V-(J^nWb9d+lu9?K9`4gTLu4!0`fS|)k<*R& zJ#0@;(hVRqy%3vK}2ICbiNJ@4=hXi*6x;7Rt~}zMAoTV(t|m18a5IFy7x8IG-cuGjY zxH8Tc>cIcakg?T@QGI85A%3Zd_0b{M*Z8cNK)m_`)RbvZb92xW#ve0f z*mw~U4t2UZ`vsHz+Sr;y^?R%DMHkZcUx@W0FZ9e^|F(n2{NtciIVwsS3}!Z%cyB*C z*r8Kte-2q1h2Ow|-|YzhiE>mvr*y1v!u5S9f;54lS&ukx%~K%bM55>9iX?Nx_d$MH zm;SV_3HO(-ek`wK?zud@af`&+@hP1ei?wlUSoCFjE)HEZ8(0v5q(E~k3@ zYZtdZNCdo{557$4(STk_)thhe_O2*w2IK9q zhY77d`Y8{iSbX$TfunEz(PAunXB?A<*f!U85uTxhy3DFP$+Fa&mUfn9R>qt-B2yU) zX%x{_;>`05YoCrCdV>qeYh6RBGtH5GQIp}-T2hh)#0~cEhD3d;W^UmXF|}|8Yd*E; zjmREGuCxfVMXzkBuwV92ygY$}@44u0X}hp+vZ^BNY6@*kmI_s3j&2$&dq7k~$FcU# zLi)~RSeX|N55*-V>@Nn9Pr~v_(iK(bdV?b4+8`UL%bC}=Tp%FN0lnPOG%2_|G%>C;PbZ~48=mB-JL%PZXwvOf zm~rKk2xr>TCKHtd|CjfH4b;LbpQ=Ues-_LnEEmNd*ZaD6!&Mr}K9TK3u?T1~zrGNr zVYooJ9fCug^@G0UE|>V|!n^UPNou=&0=-+y3^(6t^#~{`zY?k<|E?1-37YPo@V+ll zZ5cv|`kw2c9tFmS?MxaE^7w?{@ZROODy0|SPw#5HMqOB{9^=5?*e{xJ@trn-M?b5k z3@X$e`q0|@@`x=?JtI=!s%PT}2o-jdpXbwrfr(5eR!!?SoQ?;^&2)iKuS}tk_3_|4 z)zx6G@|GBIU;qcvMG+DLw;f}_`M0BBRlU&*1Sj70Ei6wC*JImb-sa+1RuF>6wG}FS zrF(p;_zrQ1ye}Afv4iHOjSA$BZ=C1v&)SI8xN(>B&01PnrZbBEk`wLL)Ldoz^ohjl z$?}jZO-YKCMw{7sfPnKuo$i`bs!RRc$+>puTbw_&iqqfZ(LdWm5h6mr#0v1=KGpsy zR{Uc@GoS*Xr2({%0Rq-3o4A^v`pp8|jr}HBpv3}DS3pisaIkO$7B8~^YoINyfi=~h zEL=AM4{7GyEP}VuYn-heELpe|%m9(X+RYO%YPdT&*_qp;MGGMoU}}*T0npk1`9!1V1T>< zMF_J14%}Fva0ClN1jGVC04~1(I}8kGfe9mkG(ZUC5e8Okvp```AQE(LWKg#%;^T$p{JDsA+Rq3REiFvP+>q+ zL7Z;rGDU#8zyL;k8i$StHgtKvjzxsQEFfW^!3Y?j`25pz8u)Lob1c847dQ-z?#8p# z?C5S&aIkh`K|8%OMawxB)(&PaXCB;G?g7`xfdFu5W@Zg6SjQZl{x!8XaXRhu|HVbs zlG6C|da?k&Z~+AYR}CY0osI?mU)PTx$n$rKQ?U$a3y?z?(-^d~G*`4UI2RKKz%ku* z^kRB3mg};>=hXAwzv4ldT=y(~Pkxr`G&n6o7$`$X2#gS8(FZ~(x=10wyWeR5!$iX1 z7$XE@1d^gt!Z1hB(?ICVc$P%^)CdQk1|UpI2<8YTi^(U03D6lpLc*AQ5UEom6jLS~ z(-!c}QzPW8XiO<^OcLl>JI`u3Yc8e~7$y#kF@iAlK``xvoShNo2#(1P#$7=R-h_jlGS`OCeF$&z@=vnM< z2Mwp9>hBsVi^xCR0-j(#AO1WE@ZW^NKhNUt851*up2^FKzst+Ooa}CAf>xmaqrwb8 zA-^fi@c%1?`HYA_KQzz^GiHkaNALWS)&Hg_gn@ZmNaSyY8JLs*N3Iv*buSuF>OA)= ze*e0r+S=hlP73w&Bb(<5N;sJ{)^str2)%Wwb$ZGGD}1_QkASPfEwnSVZeWg8vMdf~ zc9nY&=QM?x_rrGgISM#bAjx*HxZRA1pN3kGl9DHnEehVho+$8Y-LKz1sgtF>a#iLw z>m|wR?`kDAhJIdDwVt>|pAQp`D?aBbL!NE0&UwGdEP8#vkQIFXN`smQ%_Np!lTpW< z>IvrVS8dNLm=zbvn_oK%BMZJPUQB?t(pu?;E^Y&VW?%l&_ zjsb_3_+fCC=ZekVmjcNu0(pX|b$?JKX5UH0bzGwjx3CJ&Itk4irjlP5l;OI7V9V+5 z8knWR@6ubw-y?jygwKHg(=b4oY+mLrN7)rRH7mOMVUWgKy^E4I$&%E0G2FQ_$=ZIe zC*Q{>dl}nhG|18tf0;0On)F1KD>5r4jQyS-RSrRKll5%HmJR7`(%Tm`H zM5)EvD6=3we!i0ws0As(xp`eh6^4`Pu*yM#yDD1l*hj`E@&S8c_4~YiIs)b=3ex%m zJTx>0HV9$oqrs*EDs$u~@PWL475w3r(9zFT{YttrlwIm3cSg{?aVz);KCeWPjSi@q zF0bePYvG=kL|BcGO?4&t9`(M-@7|uHN{rOs4}MPH(2jqbyYmvseshA!#n0SRJ&W}b zOmBaVzD)b|_BLVOUPuIKAvZd3AYOK;!i@ zp+p{k%bOY6*abQt>B9)PoPz>tkbQwPw6sZhUj~njrI~6$rKFJ4d@8pbxIcfn zn?Eq5$z1(3C6FRvf=fSexp(HNU+H^BJqo&LR~Jsh63S6|^{UoZ6I7jiJ+!U6Rg_&> z-inWyuyr_>4f-K0j^zf$-RSH70*!dd>I-j({D(6$7T!sw9cAQFzc~C}NHjht#;mU_ zgSZ>r!7E;7ljn-eeYjS>%WBWSOGF&xe*eovrmrysu|!s-awos$p33v}#(>3~b%lfi ze;%!Ow)TbEw(ivNMTn84M19Se#L2Ch_x17C?d|r3-XW!>4EbC(o;-KcOW)MFmhY~; z=7A?>d{UAa=}2@OI~bhni93wEWcP)6T-V?N1zR(U(I))s74gUCZ#+(pzvp0)te!pa zdYo#VAj|TZk&{Q>lNYiS8cEinksi}BQeYJmL1{VrM)j~R5;=PMTBIPaD`7=`&n5tB z48B^;%JwV@%Q8+gY~(=<;1u0xsfs&RdM3tHf9x_jkleDl*{%l9&&}``pb2YgZGtdf zR#WYC0Nw8-Kw*?ky!8IlPG|F$>_0_WskegW6C6*`!~lC zL9KGg&&%S7n)f0I`5c&vibGNKWV$73qR&f~{&fxkO*q ze`~^GVt7}|EqHs4k+dN0SY3N+jG6PK+;HjsXzjPPhi=4ek=rr01SY`axs zezA*~P&L$ubMHci&311)6(@b(KS~f}#z)sBBT^$hK zC3f8F@7L0*DtV!3qD|OIhx6kSg##~y;6db#{F&ryS+;|5ksV*tNQ=(dm&Kzf-qGk) zW5b&Rs?@xlD9=Cf=i>IDHS+9v+JnrK7oP-2MWL_~!WoTX!kdxfcMAo~RmAcR-&B%V z_+0i#C;7%s&G$Aj?>#kcRw!Oy+tSWg8QAl0;kgkN?j8gu^U8tIFtOAT9ojdI@$)ZK zbqcvrzO|Ld*W)`^VMVx?C3n>QN2XWW74p>bs29TS75Ou9XW|s6NH?Z(+um$Rnpqo* zpP5&bYi@!;8y+@1xa;QT+P5mczuWB-0q!;Ol_~yo=at|5zz)$$M-2t1BHzKMh<6J| zVLJTH2Z5wWDHLb6DW0q|B?&!!vxghe#dMi2nJ1K+!#`5D^s+v$Z&%{IdY)KNGn)G9 zW7Ae=)zq_wzSdSNTBdrsTs6E4GSV_@JjJ0;_Vt>Ofl1CbjvFmeL+Q&)x0F8lG3muC zagA$P3*||^1xdWh7B%uY{{D!#(zU^8Y#}f4&8=( zH9p&`*SZ#_rkk|<{ zzt&Zm0%w=r;E&7cuj!PmT{XHKBf_0DR(ICx;>^u6YOq%c2|5!}(;dbpzpCg&Q&Jr% zj`Jt@-X83?O1y_+jYtaJG<;@1QpwLg?-^(PmYe(10=;}#WL`1neK5!ydqZkJhC*^g zWWwv>H3dzEi$t2XnvWjwM2QN$z0tuO{f4hv@`_x*i|WSjf{#nc3#y$YA3t8^9emM! z$1lAlncz05oZRgvSZ_Gr`6oZ;E}vVV-6_zH508!&?mVE2m)#{Fcf}bMo@L&wV3S+; z@#O~Xc=VmJNDs$#^6`{vp70WfmjrK$)qZyNi`49d?pj)H;PyY0^uGA2xrvObA9-0@ zi5@B4V(-JS75ccIfL!exc`QOOQe#HWS+V1qhg#$Kt1A035e?mPQSpYi?>3&`wM6QA z7LYI>ucR2!_jTdi!pDOknGL-Z7Rr}G$39-1Erp&q{a8Io5;4?`-dd6JXKSmSlFwh2 zNWqq)PnP6Mkk`DUeAh3q@s>ZwfhywRf`2IgU=t@7D>iJ`6l#g>ucywk!grGn&~GbJ ztFVTxJm#nIwZ8=~cgo$l4ezdYB)ic+^&w%{b4_;=zCF7=ds4?M_#}(V`l!&>cXeog zd^|Qjsw~pmFFq|kPAW0vF(t~+W2eS_)xGt@@*44Wc(~hlDyD1xjBgKu0=s7hD?6Ag zAc>TIw0l}wR6TMR2D--1cR5onQS?w|ex_=qtt5^;GDQiJhHVJISc_EXXMFWaWerXzV{nlD2Ex%S0Z#?`4apd#_QwhqIHDla(a7 zYD#OpRFHpe$A|Ple~AjR^&9aL371(9Gby~k_tbmO#C()*9y{qJU$I+00z1DPH9+Mbls2=C10 zB|5$>BWXSAAX)F!p0d! z2#+B9`!DP<*77XIu(Pq5SdS>eot6RvX#^Zco~4GCltm0BMRZ;^tz7vOY!Nwb;1hj- zKy*zP;3ka*Wzb!34PmjoiDc?bEo|M24Rk=3Y=5a2z_++o=?fnjPkw)IL9%lBpx9+9 zDXHyqt|saQY2;%)-a-SGS11rcC$sZAL_boBqxo+)Uv*Tap&2yhX{Dw`ybw3|z-pj<80?ZZT3lT8nV5i!ibf~v zHJHl9$#rb19{HF|hwd?`&=6`~nzx|V&WorQURknta3~T0)oi1<@`-CCn}^r0yXLri zylXZqp`@a_&P3H7PKfmOxOT|2B=czdQ~uWd7f56he|-eaH5DUAUz@zT#pJZE9y*ZA z2!%l|V_3D#`m3uA8mI(bB%Zf#lfy^v;4G`8*;`Nu6f-!DD=W5TY$zb1JaIl1#m+Tr99 zVhj&6ha@S#Eym7BUSKRPji^c%yv`SJDioTiq;@oU$v_4eLbRQ4=zl5I)12^5nKa`snGywb~v8+tA2qJ!?O zQO2FHaL6LG>djDV)6B&BZPLmLPIhdLi8{O*YRX#NgL5Hy2`_V~us8MCAUO`S6$LBk{?~%JH*MXmj%-IXLPPHUI9*-Mi)z zE>ErSAGkgAakZi~eE=W0Nb<41^jfQ#t!11Yu|qU{2GIBn|JV{Hs!gqaK* z95^|6Op$EC)&9!ErluzkT~WigvW2&YONtvrgc9t%M3AH28xP?OC$5g;qAMNrt+$_P z85^iQoH^(!=HTG@?4;Y=)TF$(uHrXl73@EUe~Z?1%A!tFWsYl}AQS1pC4 zh8+EdscGhXse;anKM}*%X62trkW=AvuvqdX3YK)2Mjg}%wi*d=KP254@0d86W;M?} zZd&&`V(h$?ylp7@%}B&*752j^;_Z`7oJFv2knaUC==rJ)vP$yn2V()H#*5QeBBeg{ zXfS3}o~KXg z=^yM23_PbOjZmuZ!itL(99$k0x8}x8E#H+?A~cSLQ%3kWt(3xi?cDCjKTsYJ-=R!m zW0P1*U_agZCK)v2FE{a$wAC>g4e>ggiv-n`Z8dNE#= zI%Qz(w8y5079rVP45T@}(fAKlNt%6t;5zKLL+zJR>= zQ;de0l7WCy-A62Bfzse*jLFBkJpZ3WNwIJ5zdl!k@{)B#zHc!jB5n24K%-CXp#Hvo0!k*jGm4`Zh3PdH(%r!?t=OFi`3eBaRHJtHN3(} z%Vga5JBQUtR9sCWNwH15?+TJX^l2ydy~^LXt-<-mSZYxC^+h*9qBo^s2t4OBRA0=E z8$q}QSDKo;9$k8qks{_j{#>PQYtItJ!bUzU;?4ifIO^FASV&O+3JUL95+~s z>e961__Zo;LeDT7%SS5+sacrwB8<(sqOdNvzt<-}0X37Z(4CZ;qx}8w$EJ{k$&1aJ zckk+_Yj??suFh@go7`1r(ugTnR(?7Ak@U_6_{~213jNATXUr}+75fN5;W^@IhA)9P zqJx}B&Ry3x7{~e0SL?Zb{uy?gf;yM<#h86IiY8YCQ#ElM;^oD8vxZ&aVHHY`^1P2z^6x2l(6b$*1cU?+TQc(;KciQFV6L=vkqyhdk z-^@N-O*L;TeHX0X(earm_vsAJSFB7+hG!_bjMgVep{o5XEi1|&Dv<$p#-F0to)DPf zu^Dm;xR}*!sq8mqNnOg)LK(;N-oJM;b4TNdU_z0xLR!Xwc3rz5Bt*xanF&neaR*NX zC1AEOF~>}1p@MSJidkjw;T*1gI{J2oQs;nFqC73DY47X8`MttNH*1|Y$*;zisK2-o zhk7}S%NU<|(yCT>4#d^{A&K^-faraP2ndI^`27>mfSxvt@t`Jwx)kh{SwYN|JpSoD zfv498w#Sgff{2A$57ZBfx!C68ON8Y64i!8|8e=tI52Tp|bsur^kpZ>e#^lR;HNNU4 z9$}@?$IF==+cN9{39oNfU#DL9lIn4Dj9f*IR|b+W;tdRg`^{7@-Yy?RbPrE|)OeNW zIJZR?U)IntHp%#)%w#Z)(#BlhQyDsI`!tU5e#F(6z@McT66q=o>2tX;7d3jteI4rj zrgoN}QFZ7{r41Ess9S~fL1tEor5xJi zur4{mZYR|JlS;zVi)-P;cZwWZ_}01I($=FWWz~myOZUN(&^9XT1cEO0Yojc6kLs$t z+<~3zN<~HL7ahU7tlo-59$g3t9(>8CKPTm@rdHZwj78J{5yMV(HT_v!1?!hu zS-u)q5`QzIx$E5LckgDhf?f4tmPgAZQEH+rLTatvFKXm2jaR~r3%Ph7ZyF!21t|=gCXK)56yO|HH!!#$5VCFS zwA)8gN2Sv4cg3&g_*+t;*plF>o^bs?!76 z=BCRTCzBz~aygW9d&(r6)=!Le8L@O#W{aVRqMdZv%M8!=SXHj|OtDCF2l z0oQn%ri2aMcMXj;B3!rF&W}FPDxZ>Ur|HNAL$3tC9NSLVZrs3qqV%#|ZfJB5K*w+UO^uw#&QLGu@Z2Iw5bJJQh&A*W(4k z>#Slpm=ET&5g!$Sz&J366nzL zP&wE{GFf1Oza(2kZ;UgY{6v?WyFGqK!7x5G&WF1q9#@{YmorDs{wmBXWepZ$FIHYM zQdH^NyEkm*MfslnNs=BYSb1lj^|EE6pF5dgiPa^V~WYbDjt3g$iCO zpHB>-5G6DcCeCAucRh%FChYQv&L}sAZH4SJE9DayfjQj|RF0}e5B-wS<5Jr8tv*TJ zfZi?POg@>+1N}_9zyNM|rd>pDo>`_{NP?Q{>}a;x3S%ZpB1&!laVcB4>HX~ZJjT2g zxx0Cn2C{Mc1LwG?WwL2=9zA8Mul#gGt%(PvNaa<#`b>RVneckocHR4GJ;v*+#&6u6 zih~jmJvDd&h|h9bdBpWkVY_)WUOG2x?pRR}TQVpHRJ%;~OIa5U8N3KJ+BsZRn{TjE zYg7A5++XqO!FSW`woFG-j|?6wWm#)~ZTqqJfsfW{t*R*npahTLm&SM!U0w>jvo$7C zA0#xGvGsL&@~A`s!MOf7n8{%RKS_>+T~dZor#QfyQ+2R?Abgq$YjLt+M%JN1YmDdp zlrG_#UNx+1vnVZP!%>MpB|9LpkCdF#2vnWEJ9fBQ?M46kdkTLaqMckfPK!#Skl;|j zM`?~#p;_(k4oH}qIOBad-J_GTT)i0nnSDye11 zeTSdTs3)>Z!4K*r2)~A(S6P3YC|cx8`bzn+-wh#xY0L5JRr*u9*t;;5ns!m|OoNVP zT3u!AAsF+4Wq_ps+;-HIErp5x3d6(?b*Zq4W~a*Clgu{>-g{1i`d!Q5+sxt?R1Zk8 zY`Ye7Qb^4ainA*@vP)b6>gPaM0|nCxEBP7T7Vj1%Zcvyz`MOR=F_d%BOys)W09Aud zlv_O?GiaXg<~xuai78q2=SjbI*PxJ8q_5dp5-w*-Qx&c4p(N7jO;kE4>JW6|SO58u z+}e}&oRn1!?7~48e$P?6S-yhsJ}ya1JUJ8I)(%9N8{v-vs=3L}g+a*O><#JLL(aaV z3-)=;6T2>u9RkP}Y2W0`+cWl=+o>%oOH9O-OV(oiJgYe3LM*is)na> z8Cq`yzy&Zm8odv|55K&#|5Hl*-@qS#35x$`{Ku)@`9I-5-~j&t1>E*SVZs2@0qny7 z{sY*Dpz#R+!+-&}1{9DGffx7z@qgnLAUOCmJqQZKo#7X!2nI|9$OB*=Xfy*rG|(Fi z&~edm==|vPa1p=;>_Y&q1dL`-(EB2ox)4Ci(Kav?hyykdP#zSZS-`+LUNrsz2ikVAL=XUzg62wq3jf8B{Bn7ZW_He&?}`A3%>QRdenU?F3qt|{Kn*lQ@;hAd ziy=AVJuo~39K%tZVJ5%e5eyG;Mq`|@ATUhIGd2T^;V95Gp(zziVX)tEiZhtw4AH<; zdj_kVK^bR+2NYBE8JBX#iJY-6uro3QQ{Nd%@{4CV13fU!g<&fCg|%R?k5eQBfH}}D z1A;Rnrk!w1cGwxS@(=n0z;G}pb_T$pp&Z~e&lnO22AqMMq66A=L(VgIrrgn(!2?=~PW@Vx%F z4FUgmUSTie!89USrR_6dU!!1MlJ=>Xq3f8+(jf$tvwN{0|ZzfK7K`D+XTFBJZx zeIQ|AB>XF#Fwo?GUn3yhAAJB4h5&fzzv>Wy{&9^!2qCoJn%~+2jAwwE{oMu zUp6-v6Tml!%jv6^HLShNf%^zxu})cEG(ik}KT~&fbYlT}4cI^Z>R{sHc6!T!f%*VX MChY7ow`B?bADU%#*8l(j literal 0 HcmV?d00001 diff --git a/admin_uploads/dps_biology_ch4.json b/admin_uploads/dps_biology_ch4.json new file mode 100644 index 0000000..746d484 --- /dev/null +++ b/admin_uploads/dps_biology_ch4.json @@ -0,0 +1,202 @@ +[ + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 1 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 1", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 2 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 2", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 3 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 3", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 4 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 4", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 5 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 5", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 6 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 6", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 7 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 7", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 8 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 8", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 9 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 9", + "language": "English" + }, + { + "section": "General", + "subject": "Biology", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 10 for Biology Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Biology question 10", + "language": "English" + } +] \ No newline at end of file diff --git a/admin_uploads/dps_chemistry_ch4.json b/admin_uploads/dps_chemistry_ch4.json new file mode 100644 index 0000000..b69b95e --- /dev/null +++ b/admin_uploads/dps_chemistry_ch4.json @@ -0,0 +1,202 @@ +[ + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 1 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 1", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 2 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 2", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 3 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 3", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 4 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 4", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 5 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 5", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 6 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 6", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 7 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 7", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 8 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 8", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 9 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 9", + "language": "English" + }, + { + "section": "General", + "subject": "Chemistry", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 10 for Chemistry Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Chemistry question 10", + "language": "English" + } +] \ No newline at end of file diff --git a/admin_uploads/dps_mathematics_ch4.json b/admin_uploads/dps_mathematics_ch4.json new file mode 100644 index 0000000..660b2c0 --- /dev/null +++ b/admin_uploads/dps_mathematics_ch4.json @@ -0,0 +1,202 @@ +[ + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 1 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 1", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 2 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 2", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 3 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 3", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 4 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 4", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 5 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 5", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 6 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 6", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 7 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 7", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 8 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 8", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 9 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 9", + "language": "English" + }, + { + "section": "General", + "subject": "Mathematics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 10 for Mathematics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Mathematics question 10", + "language": "English" + } +] \ No newline at end of file diff --git a/admin_uploads/dps_physics_ch4.json b/admin_uploads/dps_physics_ch4.json new file mode 100644 index 0000000..8d17c46 --- /dev/null +++ b/admin_uploads/dps_physics_ch4.json @@ -0,0 +1,202 @@ +[ + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 1 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 1", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 2 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 2", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 3 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 3", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 4 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 4", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 5 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 5", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 6 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 6", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 7 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 7", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 8 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 8", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 9 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 9", + "language": "English" + }, + { + "section": "General", + "subject": "Physics", + "topic": "Chapter 4", + "subtopic": "Mixed", + "difficulty": "Medium", + "type": "MCQ_Single", + "question_text": "Sample question 10 for Physics Chapter 4?", + "options": { + "A": "Option A", + "B": "Option B", + "C": "Option C", + "D": "Option D" + }, + "correct_answer": { + "value": "A" + }, + "solution_text": "Solution for Physics question 10", + "language": "English" + } +] \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index fbd4a22..b9b115f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -16,6 +16,22 @@ from billing import generate_mock_order, verify_webhook_signature from llm import stream_tutor_response from predictor import calculate_readiness_score from growth import generate_referral_link, process_referral_reward +import boto3 +import uuid + +s3_client = boto3.client( + 's3', + endpoint_url='http://localhost:9000', + aws_access_key_id='minioadmin', + aws_secret_access_key='minioadmin', + region_name='us-east-1' +) +BUCKET_NAME = "avatars" + +try: + s3_client.create_bucket(Bucket=BUCKET_NAME) +except Exception: + pass # Bucket might already exist @asynccontextmanager async def lifespan(app: FastAPI): @@ -575,6 +591,41 @@ def get_user_attempts(user_id: UUID, session: Session = Depends(get_session)): # --- ADMIN ROUTES --- +@app.get("/api/admin/settings", tags=["Admin"]) +def get_system_settings(session: Session = Depends(get_session)): + settings = session.get(models.SystemSettings, "global") + if not settings: + settings = models.SystemSettings() + session.add(settings) + session.commit() + session.refresh(settings) + return settings + +class SettingsUpdate(BaseModel): + maintenance_mode: Optional[bool] = None + allow_new_registrations: Optional[bool] = None + enable_free_trial: Optional[bool] = None + trial_duration_days: Optional[int] = None + trial_tier: Optional[models.TierEnum] = None + +@app.put("/api/admin/settings", tags=["Admin"]) +def update_system_settings(payload: SettingsUpdate, session: Session = Depends(get_session)): + settings = session.get(models.SystemSettings, "global") + if not settings: + settings = models.SystemSettings() + + if payload.maintenance_mode is not None: settings.maintenance_mode = payload.maintenance_mode + if payload.allow_new_registrations is not None: settings.allow_new_registrations = payload.allow_new_registrations + if payload.enable_free_trial is not None: settings.enable_free_trial = payload.enable_free_trial + if payload.trial_duration_days is not None: settings.trial_duration_days = payload.trial_duration_days + if payload.trial_tier is not None: settings.trial_tier = payload.trial_tier + settings.updated_at = datetime.utcnow() + + session.add(settings) + session.commit() + session.refresh(settings) + return settings + @app.get("/api/admin/tests", tags=["Admin"]) def get_admin_tests(session: Session = Depends(get_session)): tests = session.exec(select(models.Test)).all() @@ -832,4 +883,192 @@ def delete_coupon(coupon_id: UUID, session: Session = Depends(get_session)): session.delete(coupon) session.commit() - return {"status": "success", "message": "Coupon deleted successfully"} \ No newline at end of file + return {"status": "success", "message": "Coupon deleted successfully"}@app.post("/api/users/{user_id}/avatar", tags=["Users"]) +async def upload_avatar(user_id: UUID, file: UploadFile = File(...), session: Session = Depends(get_session)): + user = session.get(models.User, user_id) + if not user: + raise HTTPException(status_code=404, detail="User not found") + + file_extension = file.filename.split(".")[-1] + object_name = f"{user_id}_{uuid.uuid4().hex[:8]}.{file_extension}" + + try: + s3_client.upload_fileobj( + file.file, + BUCKET_NAME, + object_name, + ExtraArgs={"ContentType": file.content_type} + ) + url = f"http://localhost:9000/{BUCKET_NAME}/{object_name}" + user.profile_image_url = url + session.add(user) + session.commit() + return {"url": url} + except Exception as e: + print(f"S3 Upload failed: {e}") + raise HTTPException(status_code=500, detail="Failed to upload image") + + +# --- ADMIN STUDENT MANAGEMENT --- + +class AdminUserPatch(BaseModel): + name: Optional[str] = None + tier: Optional[models.TierEnum] = None + streak_count: Optional[int] = None + target_exam: Optional[models.ExamEnum] = None + school: Optional[str] = None + city: Optional[str] = None + state: Optional[str] = None + +@app.get("/api/admin/students", tags=["Admin"]) +def list_all_students(session: Session = Depends(get_session)): + """Return all users with basic stats for the admin student directory.""" + users = session.exec(select(models.User)).all() + result = [] + for u in users: + attempt_count = session.exec( + select(models.Attempt).where(models.Attempt.user_id == u.id) + ).all() + mistake_count = session.exec( + select(models.Mistake).where(models.Mistake.user_id == u.id) + ).all() + avg_accuracy = 0.0 + if attempt_count: + submitted = [a for a in attempt_count if a.status == "Submitted"] + if submitted: + avg_accuracy = round(sum(a.accuracy for a in submitted) / len(submitted), 1) + result.append({ + "id": str(u.id), + "name": u.name, + "email": u.email or "", + "phone": u.phone or "", + "tier": u.tier.value, + "target_exam": u.target_exam.value, + "city": u.city, + "state": u.state, + "streak_count": u.streak_count, + "longest_streak": u.longest_streak, + "last_active": u.last_active.isoformat(), + "created_at": u.created_at.isoformat(), + "total_tests": len(attempt_count), + "avg_accuracy": avg_accuracy, + "total_mistakes": len(mistake_count), + }) + return result + + +@app.get("/api/admin/students/{user_id}", tags=["Admin"]) +def get_student_detail(user_id: UUID, session: Session = Depends(get_session)): + """Full student profile for admin detail view.""" + user = session.get(models.User, user_id) + if not user: + raise HTTPException(status_code=404, detail="Student not found") + + attempts = session.exec( + select(models.Attempt).where(models.Attempt.user_id == user_id) + .order_by(models.Attempt.submitted_at.desc()) # type: ignore + ).all() + + mistakes = session.exec( + select(models.Mistake).where(models.Mistake.user_id == user_id) + ).all() + + subscriptions = session.exec( + select(models.Subscription).where(models.Subscription.user_id == user_id) + ).all() + + transactions = session.exec( + select(models.Transaction).where(models.Transaction.user_id == user_id) + ).all() + + submitted = [a for a in attempts if a.status == "Submitted"] + avg_accuracy = round(sum(a.accuracy for a in submitted) / len(submitted), 1) if submitted else 0.0 + mastered_count = len([m for m in mistakes if m.is_mastered]) + weak_topics = list({m.topic for m in mistakes if not m.is_mastered})[:5] + + recent_attempts = [] + for a in attempts[:5]: + # Try to find the test name from Test table + test_name = "Practice Session" + if a.source_type.value == "Test": + test = session.get(models.Test, a.source_id) + if test: + test_name = test.title + recent_attempts.append({ + "id": str(a.id), + "name": test_name, + "source_type": a.source_type.value, + "score": a.score, + "total_questions": a.total_questions, + "accuracy": a.accuracy, + "submitted_at": a.submitted_at.isoformat() if a.submitted_at else None, + }) + + return { + "id": str(user.id), + "name": user.name, + "email": user.email or "", + "phone": user.phone or "", + "tier": user.tier.value, + "target_exam": user.target_exam.value, + "student_class": user.student_class.value, + "school": user.school or "", + "city": user.city, + "state": user.state, + "streak_count": user.streak_count, + "longest_streak": user.longest_streak, + "created_at": user.created_at.isoformat(), + "last_active": user.last_active.isoformat(), + "subscription_end": user.subscription_end.isoformat() if user.subscription_end else None, + "profile_image_url": user.profile_image_url, + "stats": { + "total_tests": len(attempts), + "avg_accuracy": avg_accuracy, + "total_mistakes": len(mistakes), + "mastered_mistakes": mastered_count, + }, + "recent_attempts": recent_attempts, + "weak_topics": weak_topics, + "subscriptions": [ + { + "id": str(s.id), + "tier": s.tier.value, + "billing_cycle": s.billing_cycle, + "start_date": s.start_date.isoformat(), + "end_date": s.end_date.isoformat(), + "amount": s.amount, + "status": s.status, + } + for s in subscriptions + ], + "transactions": [ + { + "id": str(t.id), + "amount": t.amount, + "tier": t.tier, + "status": t.status, + "created_at": t.created_at.isoformat(), + } + for t in transactions + ], + } + + +@app.patch("/api/admin/students/{user_id}", tags=["Admin"]) +def patch_student(user_id: UUID, payload: AdminUserPatch, session: Session = Depends(get_session)): + """Admin update: tier, name, streak, exam, location.""" + user = session.get(models.User, user_id) + if not user: + raise HTTPException(status_code=404, detail="Student not found") + if payload.name is not None: user.name = payload.name + if payload.tier is not None: user.tier = payload.tier + if payload.streak_count is not None: user.streak_count = payload.streak_count + if payload.target_exam is not None: user.target_exam = payload.target_exam + if payload.school is not None: user.school = payload.school + if payload.city is not None: user.city = payload.city + if payload.state is not None: user.state = payload.state + session.add(user) + session.commit() + session.refresh(user) + return {"status": "ok", "user_id": str(user.id), "tier": user.tier.value} + diff --git a/backend/models.py b/backend/models.py index 365e656..361e13e 100644 --- a/backend/models.py +++ b/backend/models.py @@ -58,6 +58,7 @@ class User(SQLModel, table=True): tier: TierEnum = Field(default=TierEnum.FREE) trial_end: Optional[datetime] = None subscription_end: Optional[datetime] = None + profile_image_url: Optional[str] = None streak_count: int = Field(default=0) longest_streak: int = Field(default=0) created_at: datetime = Field(default_factory=datetime.utcnow) @@ -186,3 +187,13 @@ class Subscription(SQLModel, table=True): status: str # Active, Expired, Cancelled, Paused auto_renew: bool = Field(default=True) coupon_code: Optional[str] = None + +class SystemSettings(SQLModel, table=True): + id: str = Field(default="global", primary_key=True) + maintenance_mode: bool = Field(default=False) + allow_new_registrations: bool = Field(default=True) + enable_free_trial: bool = Field(default=True) + trial_duration_days: int = Field(default=5) + trial_tier: TierEnum = Field(default=TierEnum.AI_COACH) + updated_at: datetime = Field(default_factory=datetime.utcnow) + diff --git a/backend/seed.py b/backend/seed.py index 8ba30e2..a31a4d0 100644 --- a/backend/seed.py +++ b/backend/seed.py @@ -62,6 +62,56 @@ def seed_local_database(): ) session.add(pro_student) + # Neha Verma — full AI Coach demo profile for manager presentations + neha_id = UUID("33333333-3333-3333-3333-333333333333") + neha_student = models.User( + id=neha_id, + phone="6666666666", + email="neha@pragativeer.com", + password_hash="mock_hash", + name="Neha Verma", + student_class=models.ClassEnum.TWELFTH, + medium=models.MediumEnum.ENGLISH, + target_exam=models.ExamEnum.NEET, + school="Delhi Public School, R.K. Puram", + city="New Delhi", + state="Delhi", + tier=models.TierEnum.AI_COACH, + trial_end=None, + subscription_end=datetime.utcnow() + timedelta(days=345), + streak_count=62, + longest_streak=62, + last_active=datetime.utcnow() + ) + session.add(neha_student) + + # Seed Neha's Subscription record + neha_subscription = models.Subscription( + id=uuid4(), + user_id=neha_id, + tier=models.TierEnum.AI_COACH, + billing_cycle="Annual", + start_date=datetime.utcnow() - timedelta(days=20), + end_date=datetime.utcnow() + timedelta(days=345), + amount=1199900, # ₹11,999 in paise + payment_id="PAY_NEHA_DEMO_001", + status="Active", + auto_renew=True, + ) + session.add(neha_subscription) + + # Seed Neha's Transaction record + neha_txn = models.Transaction( + id=uuid4(), + user_id=neha_id, + amount=11999.0, + tier="Al_Coach", + status="Success", + created_at=datetime.utcnow() - timedelta(days=20), + ) + session.add(neha_txn) + + student_id = UUID("b0e17378-864d-439e-8806-708dc48a891b") student_user = models.User( id=student_id, diff --git a/create_policies.py b/create_policies.py new file mode 100644 index 0000000..ef8e22d --- /dev/null +++ b/create_policies.py @@ -0,0 +1,555 @@ +import os + +pages_dir = r"c:\Users\naman\OneDrive\Desktop\pragativeer-v2\src\app" + +pages = { + "disclaimer": { + "title": "PragatiVeer Disclaimer", + "content": """ +

Last Updated: 27 July 2026
+Version: 1.0
+Document Ref: PV-LEG-DI-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. General Information Only

+

The content on PragatiVeer — including Daily Practice Sheets (DPS), mock tests, study materials, articles, and AI-generated insights — is provided for educational and practice purposes only. It does not constitute professional advice, guaranteed exam content, or a complete curriculum.

+ +

2. No Guarantee of Exam Results

+

PragatiVeer is a practice and preparation tool. We do not guarantee:

+
    +
  • Any specific score, rank, percentile, or result in any examination
  • +
  • Admission to any educational institution
  • +
  • That our content covers every topic that may appear in any exam
  • +
  • That your performance on our platform will translate to equivalent performance in actual exams
  • +
+

Exam outcomes depend on numerous factors beyond our control, including your preparation level, exam-day conditions, and other variables.

+ +

3. Accuracy of Content

+

We strive to ensure that all content is accurate, up-to-date, and aligned with relevant exam syllabi. However, we make no representations or warranties regarding the completeness, accuracy, reliability, or timeliness of any content. Exam patterns, syllabi, and marking schemes may change without notice.

+ +

4. AI-Generated Content

+

Some features of PragatiVeer — including personalised DPS generation and weak-area analysis — are powered by artificial intelligence (AI). While we continuously improve our AI models, AI generated content may contain errors, inaccuracies, or omissions. You are encouraged to verify critical information from official sources.

+ +

5. No Student-Teacher Relationship

+

Use of PragatiVeer does not create a student-teacher, tutor-student, or any professional advisory relationship between you and Gyannetra Pvt Ltd or its personnel.

+ +

6. Third-Party Links

+

The Platform may contain links to third-party websites, resources, or services. We do not endorse, control, or assume responsibility for the content, privacy practices, or availability of any third-party sites.

+ +

7. Limitation of Liability

+

To the maximum extent permitted by law, Gyannetra Pvt Ltd and its directors, employees, and agents shall not be liable for any loss, damage, or expense arising from your use of or reliance on the Platform or its content, including but not limited to:

+
    +
  • Loss of exam opportunities or academic standing
  • +
  • Loss of data or account access
  • +
  • Indirect, incidental, or consequential damages
  • +
+ +

8. No Warranty

+

The Platform and all content are provided "as is" and "as available" without warranty of any kind, whether express or implied.

+ +

9. Contact

+

If you have any questions about this Disclaimer, please contact us at contact@pragativeer.com.

+
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+""" + }, + "terms-and-conditions": { + "title": "PragatiVeer Terms & Conditions", + "content": """ +

Last Updated: 27 July 2026
+Version: 3.0
+Document Ref: PV-LEG-TC-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. Introduction

+

PragatiVeer (ā€œweā€, ā€œourā€, ā€œusā€) is an exam preparation platform operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021), registered office at OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India.

+

By accessing or using PragatiVeer, you agree to these Terms. If you do not agree, do not use the Platform.

+ +

2. Eligibility

+
    +
  • You must be at least 13 years of age.
  • +
  • If you are between 13 and 18 years, by using the Platform you represent and warrant that you have obtained the necessary consent from your parent or lawful guardian. PragatiVeer is not liable for verifying such consent.
  • +
  • Parents or guardians are encouraged to supervise their child’s use of the Platform.
  • +
+ +

3. Account

+
    +
  • You are responsible for your account credentials and all activity under your account.
  • +
  • Notify us immediately at contact@pragativeer.com of any unauthorised use.
  • +
  • We may suspend or terminate your account if you violate these Terms or engage in harmful, fraudulent, or illegal activity.
  • +
+ +

4. Subscriptions & Payments

+

4.1 Plans

+
+ + + + + + + + + + + + +
PlanPrice (incl. GST)Duration
Pro₹3,499Per annum
AI Coach₹11,999Per annum
+
+ +

4.2 Payment

+
    +
  • All payments are processed through our payment gateway partner. We do not store your full card or UPI details.
  • +
  • Fees are non-refundable except as stated in our Refund Policy (Section 5).
  • +
  • Prices may change with 30 days’ notice.
  • +
+ +

4.3 Auto-Renewal

+

Subscriptions auto-renew at the end of each billing period unless cancelled at least 24 hours before renewal. You may cancel auto-renewal from your account settings or by emailing contact@pragativeer.com.

+ +

5. Refund Policy

+

You may request a full refund within 7 days of purchase if you have not accessed more than 5 DPS sheets. No refunds after 7 days. To request a refund, email contact@pragativeer.com with subject ā€œRefund Requestā€.

+ +

6. User Conduct

+

You agree to:

+
    +
  • Use the Platform only for lawful purposes
  • +
  • Not harass, abuse, or harm other users
  • +
  • Not use bots, scrapers, or automated tools to access the Platform
  • +
  • Not attempt to hack, reverse engineer, or disrupt the Platform
  • +
+

Violation may result in account suspension or termination.

+ +

7. Intellectual Property

+

All Content on PragatiVeer — questions, DPS, materials, logos, software — is owned by Gyannetra Pvt Ltd. You may not reproduce, distribute, or modify it without our written consent.

+

You retain ownership of your responses and data. By submitting content, you grant us a license to store, process, and use anonymised data for service improvement.

+ +

8. Privacy

+

Our data practices are governed by our Privacy Policy and the Digital Personal Data Protection Act, 2023. We do not sell your data.

+ +

9. No Guarantee of Results

+

PragatiVeer is a practice tool. We do not guarantee any specific exam score, rank, or admission.

+ +

10. Limitation of Liability

+

The Platform is provided ā€œas isā€. Our total liability shall not exceed the fees paid by you in the 12 months preceding a claim. We are not liable for indirect or consequential damages.

+ +

11. Termination

+

You may delete your account anytime via settings or by emailing contact@pragativeer.com. We may terminate your account for breach of these Terms. Fees paid are non-refundable upon termination.

+ +

12. Changes to Terms

+

We may update these Terms with 7 days’ notice via email. Continued use after changes take effect constitutes acceptance.

+ +

13. Grievance Officer

+
+ + + + + + + + + + + + + + +
DetailInformation
NameHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
AddressOFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045
Response TimeAcknowledged within 24 hours; resolved within 30 days
+
+ +

14. Governing Law

+

These Terms are governed by the laws of India. Disputes shall be resolved through binding arbitration in Pune, Maharashtra. The courts in Pune have exclusive jurisdiction.

+ +
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+""" + }, + "privacy-policy": { + "title": "PragatiVeer Privacy Policy", + "content": """ +

Last Updated: 27 July 2026
+Version: 3.0
+Document Ref: PV-LEG-PP-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. Introduction

+

PragatiVeer (ā€œweā€, ā€œourā€, ā€œusā€) is an exam preparation platform operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021), registered office at OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India.

+

This Privacy Policy explains how we collect, use, store, share, and protect your personal data when you use PragatiVeer. It covers your rights under the Digital Personal Data Protection Act, 2023 (DPDP Act) of India.

+

By using PragatiVeer, you acknowledge that you have read and understood this policy.

+ +

2. What Data We Collect

+

2.1 Information You Provide Directly

+
+ + + + + + + + + + + + + + +
CategoryExamplesPurpose
Account InformationName, email address, phone numberAccount creation, service delivery, communication
Academic InformationClass/grade, target exam, school name, cityPersonalising content, weak-area analysis
Payment InformationTransaction ID, billing name (we do not store full card or UPI details)Subscription billing, invoicing
CommunicationsMessages sent via email or contact formsSupport, feedback, grievance handling
+
+ +

2.2 Information Collected Automatically

+
+ + + + + + + + + + + + +
CategoryExamplesPurpose
Usage DataDPS attempts, scores, time spent, weak-area progressionPersonalising the learning experience
Technical DataIP address, browser type, device type, operating systemService optimisation, fraud prevention, analytics
+
+ +

2.3 Information from Third Parties

+

We may receive transaction confirmation data from payment gateways but not full financial instrument details.

+ +

3. How We Use Your Data

+

We use your personal data only for:

+
    +
  1. Service Delivery — Personalised DPS, weak-area tracking, content delivery
  2. +
  3. Personalisation — Adapting question difficulty based on performance
  4. +
  5. Communication — Subscription reminders, service updates, support
  6. +
  7. Payment Processing — Billing and subscription management
  8. +
  9. Improvement — Analysing aggregate data to improve content quality
  10. +
  11. Legal Compliance — Fulfilling obligations under DPDP Act and tax laws
  12. +
  13. Security — Detecting fraud, abuse, and unauthorised access
  14. +
+

We do NOT:

+
    +
  • Sell your personal data
  • +
  • Use your data to train AI models without explicit consent
  • +
  • Share your data for advertising
  • +
+ +

4. Users Under 18 Years of Age

+

PragatiVeer is designed for students preparing for competitive exams, including those under 18 years of age.

+

By using PragatiVeer, users under 18 years of age represent and warrant that they have obtained the necessary consent from their parent or lawful guardian to use the Platform and share their personal data. PragatiVeer relies on this representation and shall not be liable for verifying parental consent.

+

We encourage parents and guardians to monitor their child’s online activities and review this Privacy Policy.

+ +

5. Data Sharing

+

We share your data only with trusted service providers bound by data protection agreements:

+
+ + + + + + + + + + + + + +
ProviderPurposeSafeguards
Payment GatewayPayment processingPCI-DSS compliant; no full payment details stored
AI Inference ProvidersWeak-area analysis, DPS generationData anonymised before processing
Self-hosted InfrastructureStorage, backups, disaster recoveryNo third-party access
+
+

We do not share your data with advertising networks, data brokers, or for monetisation.

+ +

6. Data Retention & Deletion

+
+ + + + + + + + + + + + + +
Data CategoryRetention Period
Account InformationAccount duration + 12 months
Academic Performance DataAccount duration + 24 months
Payment Records7 years (as required by tax laws)
Communication Records12 months
+
+

You may request account deletion by emailing contact@pragativeer.com with subject ā€œAccount Deletion Requestā€. We will delete your data within 30 days.

+ +

7. Data Security

+

We implement:

+
    +
  • Encryption in transit (TLS 1.2+)
  • +
  • Encryption at rest
  • +
  • Role-based access controls
  • +
  • Self-hosted infrastructure
  • +
  • Documented breach notification process
  • +
+

In the event of a data breach, we will notify the Data Protection Board of India and affected users within 72 hours.

+ +

8. Your Rights Under DPDP Act 2023

+
+ + + + + + + + + + + + + + + +
RightHow to Exercise
Access your dataEmail contact@pragativeer.com
Correct your dataUpdate in account settings or email us
Delete your dataEmail with subject ā€œAccount Deletion Requestā€
Withdraw consentEmail contact@pragativeer.com
Lodge a grievanceContact Grievance Officer (Section 9)
Nominate a representativeEmail with subject ā€œNomination Requestā€
+
+

We respond to all requests within 30 days.

+ +

9. Grievance Officer

+
+ + + + + + + + + + + + + + +
DetailInformation
NameHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
AddressOFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045
Response TimeAcknowledged within 24 hours; resolved within 30 days
+
+ +

10. Cookies

+

Our website uses essential cookies for functionality and anonymous analytics cookies. We do not use advertising cookies, cross-site tracking, or fingerprinting scripts.

+ +

11. Changes to This Policy

+

We will notify you of material changes via email with at least 7 days’ notice.

+ +

12. Contact

+

Email: contact@pragativeer.com
+Address: OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India
+Phone: +91 9079337961

+ +

13. Governing Law

+

This Policy is governed by the laws of India. Disputes are subject to the exclusive jurisdiction of courts in Pune, Maharashtra.

+ +
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+""" + }, + "refund-policy": { + "title": "PragatiVeer Refund Policy", + "content": """ +

Last Updated: 27 July 2026
+Version: 1.0
+Document Ref: PV-LEG-RP-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. Overview

+

This Refund Policy governs all paid subscriptions on PragatiVeer, operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021).

+

By purchasing a subscription, you agree to the terms of this policy.

+ +

2. Subscription Plans

+
+ + + + + + + + + + + + +
PlanPrice (incl. GST)Duration
Pro₹3,499Per annum
AI Coach₹11,999Per annum
+
+ +

3. Refund Eligibility

+

You may request a full refund within 7 days of purchase provided that you have not accessed more than 5 DPS sheets during that period.

+

Refunds will not be issued if:

+
    +
  • More than 7 days have passed since purchase
  • +
  • You have accessed more than 5 DPS sheets
  • +
  • The request is made after the subscription has been active beyond the refund window
  • +
+ +

4. How to Request a Refund

+

To request a refund, email contact@pragativeer.com with:

+
    +
  • Subject: ā€œRefund Requestā€
  • +
  • Your registered email address or phone number
  • +
  • Order/transaction ID (if available)
  • +
+

We will process your request within 7-10 business days and the refund will be credited to the original payment method.

+ +

5. Non-Refundable Items

+

The following are non-refundable:

+
    +
  • Subscription fees beyond the 7-day refund window
  • +
  • Discounted or promotional purchases (unless otherwise stated)
  • +
  • Any add-on services purchased separately
  • +
+ +

6. Cancellation

+

You may cancel your subscription at any time. However, cancellation does not entitle you to a refund unless it falls within the refund window described in Section 3. Upon cancellation, your access will continue until the end of the current billing period.

+ +

7. Contact

+

For any questions regarding this Refund Policy, contact us at contact@pragativeer.com or reach out to our Grievance Officer:

+
+ + + + + + + + + + + + +
DetailInformation
Grievance OfficerHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
+
+ +
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+""" + }, + "cancellation-policy": { + "title": "PragatiVeer Cancellation Policy", + "content": """ +

Last Updated: 27 July 2026
+Version: 1.0
+Document Ref: PV-LEG-CP-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. Overview

+

This Cancellation Policy governs cancellation of paid subscriptions on PragatiVeer, operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021).

+

By purchasing a subscription, you agree to the terms of this policy.

+ +

2. Subscription Cancellation by You

+

2.1 How to Cancel

+

You may cancel your subscription at any time by:

+
    +
  • Going to Account Settings on the PragatiVeer website and disabling auto-renewal
  • +
  • Emailing contact@pragativeer.com with subject ā€œCancellation Requestā€ along with your registered email or phone number
  • +
+ +

2.2 Effect of Cancellation

+

Upon cancellation:

+
    +
  • Your subscription will not auto-renew at the end of the current billing period
  • +
  • You will continue to have full access to your paid features until the end of the current billing period
  • +
  • No refund will be issued for the remaining days of the current billing period, except as provided in our Refund Policy
  • +
+ +

2.3 Timing

+

To avoid being charged for the next billing cycle, cancellation must be requested at least 24 hours before the renewal date.

+ +

3. Auto-Renewal

+

All subscriptions auto-renew at the end of each billing period unless cancelled at least 24 hours before renewal. You authorise us to charge the applicable subscription fee to your chosen payment method at each renewal.

+

You will receive a reminder before renewal. If you do not wish to renew, please cancel before the renewal date.

+ +

4. Cancellation by PragatiVeer

+

We reserve the right to cancel or suspend your subscription immediately if:

+
    +
  • You violate our Terms & Conditions
  • +
  • You engage in fraudulent, abusive, or illegal activity
  • +
  • We are required to do so by law
  • +
+

In such cases, fees paid are non-refundable.

+ +

5. Account Deletion

+

Cancelling your subscription does not delete your account. To delete your account and all associated data, please follow the process outlined in our Privacy Policy.

+ +

6. Contact

+

For any questions regarding this Cancellation Policy, contact us at contact@pragativeer.com or reach out to our Grievance Officer:

+
+ + + + + + + + + + + + +
DetailInformation
Grievance OfficerHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
+
+ +
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+""" + } +} + +template = """import Link from 'next/link'; + +export default function {component_name}Page() {{ + return ( +
+
+

+ {title} +

+
+ {content} +
+
+
+ ); +}} +""" + +for route, data in pages.items(): + page_dir = os.path.join(pages_dir, route) + os.makedirs(page_dir, exist_ok=True) + + component_name = "".join(word.capitalize() for word in route.split("-")) + content = template.format( + component_name=component_name, + title=data["title"], + content=data["content"] + ) + + with open(os.path.join(page_dir, "page.tsx"), "w", encoding="utf-8") as f: + f.write(content) + +print("Created all 5 policy pages successfully.") diff --git a/docker-compose.yml b/docker-compose.yml index b859ad8..e8ac3c4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,9 +25,9 @@ services: container_name: pragativeer_pgbouncer environment: - DATABASE_URL=postgres://pragativeer_admin:local_secure_password_2026@postgres:5432/pragativeer_prod - - POOL_MODE=transaction - - MAX_CLIENT_CONN=1000 - - DEFAULT_POOL_SIZE=50 + volumes: + - ./pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini:ro + - ./userlist.txt:/etc/pgbouncer/userlist.txt:ro depends_on: postgres: condition: service_healthy diff --git a/pgbouncer.ini b/pgbouncer.ini new file mode 100644 index 0000000..e7e8109 --- /dev/null +++ b/pgbouncer.ini @@ -0,0 +1,14 @@ +[databases] +pragativeer_prod = host=postgres port=5432 dbname=pragativeer_prod + +[pgbouncer] +listen_addr = 0.0.0.0 +listen_port = 5432 +unix_socket_dir = +auth_type = trust +auth_file = /etc/pgbouncer/userlist.txt +pool_mode = transaction +max_client_conn = 1000 +default_pool_size = 50 +admin_users = postgres +ignore_startup_parameters = extra_float_digits diff --git a/pragativeer-ai-coach-complete.html b/pragativeer-ai-coach-complete.html new file mode 100644 index 0000000..f996b78 --- /dev/null +++ b/pragativeer-ai-coach-complete.html @@ -0,0 +1,1216 @@ + + + + + + PragatiVeer — AI Coach (Complete) + + + + + + + + + + + + + + + +
+ + +
+ 9:41 +
+ + +
+
+ + +
+
+ +
+
+ +
R
+
+
+ + +
+

Namaste, Rohan šŸ‘‹

+
+ ą¤†ą¤œ का ą¤¤ą„ą¤®ą„ą¤¹ą¤¾ą¤°ą¤¾ AI ą¤•ą„‹ą¤š ą¤¤ą„ˆą¤Æą¤¾ą¤° ą¤¹ą„ˆ + • + JEE Main 2027 +
+
+ + 12-day streak! šŸ”„ +
+
+ + +
+
+ A-05 Readiness Score + A-03 Study Plan + A-01 Mistake Tracking + A-02 Spaced Repetition + A-04 AI Tutor + A-07 College Predictor + A-06 Exam Strategy + A-08 Time Optimization +
+
+ + + + +
+
+

šŸŽÆ Exam Readiness Score A-05

+ Trend → +
+
+
+ Updated daily • 19 Jul 2026 + + + +5 this week + +
+
+
+ + + + +
+
72
+
/100
+
+
+
+
+
78% ↑2%
+
Accuracy (40%)
+
+
+
65% ↑4%
+
Syllabus (20%)
+
+
+
82% ↑1%
+
Consistency (10%)
+
+
+
58% ↓3%
+
Speed (20%)
+
+
+
+
+ + NIT Surat is within reach! Improve your speed by 10% to target NIT Trichy šŸŽÆ +
+
+
+ + + + +
+

šŸ“‹ Today's Study Plan A-03

+ See All → +
+
+
+
+ Sunday, 19 July 2026 + 2/5 done +
+
+
+
+
+
+
+
+
Revise Thermodynamics
+
Physics • Chapter 5
+
+ Revision + 15 min +
+
+
+
+
DPS — Electrostatics
+
Physics • 12 questions • Medium
+
+ Practice + 20 min +
+
+
+
+
Mistake Review Session
+
7 questions from your error queue
+
+ Review + 10 min +
+
+
+
+
Micro-test — Organic Chem
+
Chemistry • 5 questions
+
+ Test + 5 min +
+
+
+
+
Weekly Test Analysis
+
Review mistakes from yesterday's test
+
+ Review + 10 min +
+
+
+
+ + + + +
+

šŸŽÆ Mistake Tracking A-01

+ Full Analysis → +
+
+
+
+ +
+
+
7 mistakes waiting for review
+
+ 3 conceptual • 2 calculation • 2 time pressure +
+
+
+ +
+
+
+ +
+

šŸ”„ Spaced Repetition Queue A-02

+ All Questions → +
+
+
+
+ SM-2 Algorithm • 12 active mistakes + 3 mastered this week +
+
+
+ Day 1 +
āœ“
+
+
+
+ Day 3 +
3
+
+
+
+ Day 7 +
7
+
+
+
+ Day 14 +
14
+
+
+
+ Day 30 +
30
+
+
+
+
+ +
+
Coulomb's Law — Force between two charges in a medium
+
Physics • Electrostatics • Attempt 2/5
+
+ Due today +
+
+ +
+
Integration of rational functions by partial fractions
+
Maths • Calculus • Attempt 1/5
+
+ Due today +
+
+ +
+
Electromagnetic Induction — Lenz's Law application
+
Physics • EMI • Attempt 3/5
+
+ Tomorrow +
+
+
+
+ + + + +
+

šŸ’¬ AI Tutor Chat A-04

+ Full Chat → +
+
+
+
+
AI
+
+
PragatiVeer AI Tutor
+
Online • Context-aware
+
+
42 / 50 messages today
+
+
+
+
+ Can you explain why option C is wrong in today's DPS Q7? The one about electric field lines. +
+
+
+
+ Great question! Option C says "Electric field lines can intersect each other." This is incorrect because:

+ • Electric field lines never intersect — at the point of intersection, there would be two different directions of the electric field, which is impossible.

+ • I see you've made a similar mistake in Electrostatic Potential (Day 3) — want me to pull up that question for revision? +
+
+
+
+ Yes please! And give me a similar practice question. +
+
+
+
+ Here's your previous mistake from Electrostatic Potential (attempted 19 Jul):

+ "Two point charges +4μC and -2μC are placed 10cm apart. Where is the electric field zero?"

+ šŸ”„ Similar question: Three charges +2q, -q, and +3q are placed at vertices of an equilateral triangle. Find the point where net electric field is zero.

+ Want me to walk through the solution step by step? šŸ¤” +
+
+
+
+ + +
+
+
+ + + + +
+

šŸ›ļø College Predictor A-07

+ Full List → +
+
+
+
+
Reach šŸš€
+
Target šŸŽÆ
+
Safety šŸ›”ļø
+
+
+
+
R
+
+
IIT Delhi
+
Computer Science
+
+ 15% +
+
+
R
+
+
IIT Bombay
+
Electrical Engineering
+
+ 22% +
+
+
T
+
+
NIT Surat (SVNIT)
+
Computer Science
+
+ 68% +
+
+
T
+
+
NIT Trichy
+
Mechanical Engineering
+
+ 55% +
+
+
S
+
+
IIIT Allahabad
+
IT
+
+ 89% +
+
+
+ šŸŽÆ You need +35 marks to reach IIT Delhi CSE. At your current trajectory, NIT Surat CSE is your best target! +
+
+
+ + + + +
+

šŸ“‹ Exam Day Strategy A-06

+ Full Strategy → +
+
+
+
+
+
⚔
+
Start with Physics
+
Your strongest section — 78% accuracy
+
+
+
ā±ļø
+
45 min per section
+
Physics: 45m • Chem: 40m • Maths: 50m
+
+
+
šŸŽÆ
+
Numerical first in Chem
+
You score 72% on numerical vs 58% on theory
+
+
+
ā°
+
Last 15 min sprint
+
You slow down — practice timed sprints!
+
+
+
+ + Download Printable Strategy Card +
+
+
+ + + + +
+

ā° Study Time Optimization A-08

+ Full Analysis → +
+
+
+
+
6AM
+
8AM
+
10AM
+
12PM
+
2PM
+
4PM
+
6PM
+
8PM
+
10PM
+
12AM
+
+
+ + You perform best between 8 PM - 10 PM (92% accuracy). Schedule your most difficult topics then! šŸŒ™ +
+
+
+ + +
+

šŸ“Š This Week Overview

+
+
+
+
1,247
+
Questions Solved
+
+
+
78%
+
Avg Accuracy
+
+
+
#42
+
City Rank
+
+
+ + + + +
+ + + diff --git a/pragativeer-ai-coach-dashboard.html b/pragativeer-ai-coach-dashboard.html new file mode 100644 index 0000000..e386b3a --- /dev/null +++ b/pragativeer-ai-coach-dashboard.html @@ -0,0 +1,821 @@ + + + + + +PragatiVeer — AI Coach Dashboard + + + +
+ + +
+
+
PV
+
PragatiVeer
+
+
+
✦ AI COACH
+
RK
+
+
+ + +
+

Good morning, Rohan! šŸ‘‹

+

Your AI Coach has prepared today's plan. You're on track for NIT Surat.

+
+ + +
+
+
Readiness Score
+
+
+ + + + + 72 +
+
+

Good Progress

+

↑ 5 pts this week

+
+
+
+ +
+
Streak
+
23 days
+
šŸ”„ Best: 23 days
+
+ +
+
Questions Solved
+
1,247 total
+
↑ 47 this week
+
+ +
+
Overall Accuracy
+
74%
+
↑ 3% this month
+
+
+ + +
+ +
+
+
šŸ“Š Mistake Heatmap
+
View Details →
+
+
+
+
Physics
+
Chemistry
+
Maths
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Weak +
+
+
+
+
+ Strong +
+
+
+
+ + +
+
+
šŸ“‹ Today's Study Plan
+
Regenerate →
+
+ +
+
+
+
DPS — Electrostatics + Kinematics
+
10 questions • Mixed difficulty
+
+ Physics +
20 min
+
+ +
+
+
+
Mistake Review — Thermodynamics
+
5 re-attempts from spaced repetition queue
+
+ Review +
10 min
+
+ +
+
+
+
Micro-test — GOC (General Organic Chemistry)
+
5 questions • Your accuracy here: 38% āš ļø
+
+ Chemistry +
5 min
+
+ +
+
+
+
Weekly Test — Full Syllabus (JEE Main Pattern)
+
90 questions • 3 hours • Sectional timing
+
+ Test +
3 hrs
+
+ +
+
+
+
Revise — Circles + Straight Lines
+
Formula sheet + 3 practice questions
+
+ Maths +
15 min
+
+
+
+ + +
+ +
+
šŸ¤–
+
AI Coach Insight
+
+ You keep making sign errors in Thermodynamics. + In your last 3 attempts, you've used the wrong sign for work done (W = -PĪ”V). + Review the First Law of Thermodynamics — we've queued 3 practice questions for tomorrow. +
+
+ šŸ’” Tip: You perform best between 7-9 PM. Schedule difficult topics then. +
+
+ + +
+
+
šŸ† City Leaderboard — Jaipur
+
This Week →
+
+ +
+
1
+
Priya S.
+
94%
+
šŸ”„ 45 day streak
+
+ +
+
2
+
Arjun M.
+
91%
+
30 day streak
+
+ +
+
3
+
Rohan K.
+
87%
+
šŸ‘ˆ You
+
+ +
+
4
+
Neha G.
+
85%
+
+ +
+
5
+
Vikram R.
+
82%
+
+
+ + +
+
+
šŸ”„ Streak & Milestones
+
Share →
+
+ +
+
šŸ”„
+
+

23 Days

+

Longest streak: 23 days šŸŽ‰

+
+
+ +
+
M
+
T
+
W
+
T
+
F
+
S
+
S
+
+ +
+
+ šŸ… 7-Day Streak āœ… +
+
+ šŸ… 21-Day Streak āœ… +
+
+ šŸ† 30-Day Streak — 7 days away! +
+
+
+
+ + +
+ PragatiVeer — AI Coach Dashboard Mockup | Gyannetra Pvt Ltd | July 2026 +
+ +
+ + diff --git a/dpps/dps-bio-ch4-20260707.pdf b/public/dpps/dps-bio-ch4-20260707.pdf similarity index 100% rename from dpps/dps-bio-ch4-20260707.pdf rename to public/dpps/dps-bio-ch4-20260707.pdf diff --git a/dpps/dps-che-ch4-20260707.pdf b/public/dpps/dps-che-ch4-20260707.pdf similarity index 100% rename from dpps/dps-che-ch4-20260707.pdf rename to public/dpps/dps-che-ch4-20260707.pdf diff --git a/dpps/dps-mth-ch4-20260707.pdf b/public/dpps/dps-mth-ch4-20260707.pdf similarity index 100% rename from dpps/dps-mth-ch4-20260707.pdf rename to public/dpps/dps-mth-ch4-20260707.pdf diff --git a/dpps/dps-phy-ch4-20260707.pdf b/public/dpps/dps-phy-ch4-20260707.pdf similarity index 100% rename from dpps/dps-phy-ch4-20260707.pdf rename to public/dpps/dps-phy-ch4-20260707.pdf diff --git a/remove_links.py b/remove_links.py new file mode 100644 index 0000000..6e9fb40 --- /dev/null +++ b/remove_links.py @@ -0,0 +1,24 @@ +import os +import re + +dir_path = r"c:\Users\naman\OneDrive\Desktop\pragativeer-v2\src\app\dashboard\ai-coach" + +# Pattern to remove +pattern = re.compile( + r'\s*\s* Back to AI Coach Overview\s*', + re.MULTILINE | re.DOTALL +) + +for root, dirs, files in os.walk(dir_path): + for file in files: + if file == "page.tsx": + path = os.path.join(root, file) + with open(path, "r", encoding="utf-8") as f: + content = f.read() + + new_content = pattern.sub('', content) + + if new_content != content: + with open(path, "w", encoding="utf-8") as f: + f.write(new_content) + print(f"Updated {path}") diff --git a/src/app/admin/settings/page.tsx b/src/app/admin/settings/page.tsx index 2323d40..d1e6f99 100644 --- a/src/app/admin/settings/page.tsx +++ b/src/app/admin/settings/page.tsx @@ -1,7 +1,61 @@ +"use client"; + +import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" export default function SettingsPage() { + const [settings, setSettings] = useState({ + maintenance_mode: false, + allow_new_registrations: true, + enable_free_trial: true, + trial_duration_days: 5, + trial_tier: "Al_Coach" + }); + const [loading, setLoading] = useState(true); + + useEffect(() => { + fetch("/api/admin/settings") + .then(res => res.json()) + .then(data => { + if(data && !data.detail) { + setSettings(prev => ({ ...prev, ...data })); + } + setLoading(false); + }) + .catch(err => { + console.error("Failed to load settings:", err); + setLoading(false); + }); + }, []); + + const saveSettings = async (section: string, overrides: Partial = {}) => { + try { + const payload = { ...settings, ...overrides }; + const res = await fetch("/api/admin/settings", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload) + }); + if (res.ok) { + alert(`${section} saved successfully!`); + setSettings(payload); + } else { + alert(`Failed to save ${section}.`); + } + } catch (err) { + alert("Error saving settings."); + } + }; + + const handleToggle = (key: keyof typeof settings, sectionName: string) => { + const newValue = !settings[key]; + setSettings(prev => ({ ...prev, [key]: newValue })); + saveSettings(sectionName, { [key]: newValue }); + }; + + if (loading) return
Loading System Settings...
; + return (
@@ -24,7 +78,49 @@ export default function SettingsPage() {
- + + + + + + + Trial Management + Configure the trial length and tier access for new signups. + + +
+
+
Enable Free Trial
+
Offer a trial to newly registered users.
+
+
handleToggle('enable_free_trial', 'Free Trial')} + className={`h-6 w-11 rounded-full relative cursor-pointer transition-colors ${settings.enable_free_trial ? 'bg-primary border border-primary shadow-[0_0_10px_var(--color-primary)]' : 'bg-secondary border border-border'}`}> +
+
+
+
+
+ + setSettings(prev => ({ ...prev, trial_duration_days: parseInt(e.target.value) || 0 }))} + className="w-full bg-background border border-border rounded-lg px-4 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-[#00F0FF]" + /> +
+
+ + +
+
+
@@ -39,8 +135,10 @@ export default function SettingsPage() {
Maintenance Mode
Disable all student access and show maintenance screen.
-
-
+
handleToggle('maintenance_mode', 'Maintenance Mode')} + className={`h-6 w-11 rounded-full relative cursor-pointer transition-colors ${settings.maintenance_mode ? 'bg-red-500 border border-red-500 shadow-[0_0_10px_rgba(239,68,68,0.8)]' : 'bg-secondary border border-border'}`}> +
@@ -48,8 +146,10 @@ export default function SettingsPage() {
Allow New Registrations
Open the `/signup` route for new users.
-
-
+
handleToggle('allow_new_registrations', 'Registration Setting')} + className={`h-6 w-11 rounded-full relative cursor-pointer transition-colors ${settings.allow_new_registrations ? 'bg-primary border border-primary shadow-[0_0_10px_var(--color-primary)]' : 'bg-secondary border border-border'}`}> +
@@ -60,7 +160,7 @@ export default function SettingsPage() { Danger Zone - + diff --git a/src/app/admin/students/[studentId]/page.tsx b/src/app/admin/students/[studentId]/page.tsx index a40a23c..478d1d4 100644 --- a/src/app/admin/students/[studentId]/page.tsx +++ b/src/app/admin/students/[studentId]/page.tsx @@ -2,201 +2,373 @@ import { useEffect, useState } from "react" import { useParams, useRouter } from "next/navigation" -import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" -import { ArrowLeft, Loader2, User, Mail, Target, Award, Calendar, Activity, BookOpen } from "lucide-react" +import { + ArrowLeft, Loader2, Mail, Phone, Target, Award, Calendar, Activity, + BookOpen, Flame, TrendingUp, CheckCircle2, AlertCircle, RefreshCw, + Edit3, Save, X +} from "lucide-react" + +const TIER_STYLE: Record = { + "Al_Coach": "bg-[#00F0FF]/10 text-[#00F0FF] border-[#00F0FF]/20", + "Pro": "bg-yellow-500/10 text-yellow-500 border-yellow-500/20", + "Free": "bg-secondary text-foreground border-border", +} +const TIER_LABEL: Record = { "Al_Coach": "AI Coach", "Pro": "Pro", "Free": "Free" } + +function formatDate(iso?: string | null) { + if (!iso) return "—" + try { return new Date(iso).toLocaleDateString("en-IN", { day: "numeric", month: "short", year: "numeric" }) } + catch { return iso } +} + +function formatAmount(paise: number) { + return `₹${(paise / 100).toLocaleString("en-IN")}` +} export default function StudentKundliPage() { const params = useParams() const router = useRouter() const studentId = params.studentId as string - + const [loading, setLoading] = useState(true) - const [userData, setUserData] = useState(null) - + const [saving, setSaving] = useState(false) + const [data, setData] = useState(null) + const [error, setError] = useState("") + const [editing, setEditing] = useState(false) + + // editable fields + const [editName, setEditName] = useState("") + const [editTier, setEditTier] = useState("") + const [editStreak, setEditStreak] = useState(0) + const [editExam, setEditExam] = useState("") + useEffect(() => { - // Simulated fetch of student's complete "Kundli" - setTimeout(() => { - setUserData({ - id: studentId, - name: "Rahul Sharma", - email: "rahul@example.com", - target: "NEET", - tier: "AI Pro", - joined: "Oct 12, 2025", - stats: { - total_tests: 42, - average_score: "78%", - streak: 45, - total_questions_solved: 3450, - ai_coach_interactions: 124 - }, - recent_tests: [ - { id: 1, name: "Full Syllabus NEET Mock #4", score: "620/720", date: "2 days ago", percentile: "98.5%" }, - { id: 2, name: "Physics: Kinematics DPP", score: "45/50", date: "4 days ago", percentile: "95.2%" }, - { id: 3, name: "Biology: Human Reproduction", score: "88/100", date: "1 week ago", percentile: "99.1%" } - ], - payments: [ - { id: "PAY_1", amount: "₹1599", date: "Oct 12, 2025", plan: "AI Pro (Yearly)", status: "Success" } - ], - weak_topics: ["Rotational Dynamics", "Organic Chemistry", "Genetics"] + fetch(`/api/admin/students/${studentId}`) + .then(r => { if (!r.ok) throw new Error("Not found"); return r.json() }) + .then(d => { + setData(d) + setEditName(d.name) + setEditTier(d.tier) + setEditStreak(d.streak_count) + setEditExam(d.target_exam) }) - setLoading(false) - }, 800) + .catch(e => setError(e.message)) + .finally(() => setLoading(false)) }, [studentId]) - if (loading) { - return
+ const handleSave = async () => { + setSaving(true) + try { + const res = await fetch(`/api/admin/students/${studentId}`, { + method: "PATCH", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + name: editName, + tier: editTier, + streak_count: editStreak, + target_exam: editExam, + }), + }) + if (!res.ok) throw new Error("Failed to save") + // Refresh data + const fresh = await fetch(`/api/admin/students/${studentId}`).then(r => r.json()) + setData(fresh) + setEditing(false) + } catch (e: any) { + alert(e.message) + } finally { + setSaving(false) + } } - if (!userData) return
User not found
+ if (loading) return ( +
+ +
+ ) + + if (error || !data) return ( +
+ +

Student not found or failed to load.

+ +
+ ) return (
- - -
- {/* User Identity Card */} - - -
-
- {userData.name.charAt(0)} -
-
- {userData.name} - - {userData.email} - -
-
-
- -
-
Target Exam
-
{userData.target}
-
-
-
Plan Tier
- {userData.tier} -
-
-
Joined
-
{userData.joined}
-
-
-
User ID
-
{userData.id}
-
-
-
- - {/* Stats Summary */} -
- - -
{userData.stats.total_tests}
-
Tests Attempted
-
-
- - -
{userData.stats.streak}
-
Day Streak
-
-
- - -
{userData.stats.average_score}
-
Avg. Accuracy
-
-
- - -
{userData.stats.total_questions_solved}
-
Questions Solved
-
-
-
+ {/* Header */} +
+ + {!editing ? ( + + ) : ( +
+ + +
+ )}
- {/* Recent Activity & Weak Topics */} + {/* Profile Header Card */} + + +
+ {/* Avatar */} +
+ {data.profile_image_url ? ( + {data.name} + ) : ( +
+ {data.name.charAt(0)} +
+ )} + {data.name === "Neha Verma" && ( + DEMO + )} +
+ + {/* Name + meta */} +
+ {editing ? ( + setEditName(e.target.value)} + className="text-2xl font-bold bg-secondary border border-border rounded-lg px-3 py-1.5 w-full max-w-sm focus:outline-none focus:ring-1 focus:ring-primary mb-3" + /> + ) : ( +

{data.name}

+ )} + +
+ {editing ? ( + + ) : ( + + {TIER_LABEL[data.tier] || data.tier} + + )} + + {editing ? ( + + ) : ( + {data.target_exam.replace("_", " ")} + )} +
+ +
+ {data.email && {data.email}} + {data.phone && {data.phone}} + {data.school && {data.school}} + Joined {formatDate(data.created_at)} + {data.subscription_end && ( + + Active till {formatDate(data.subscription_end)} + + )} +
+
+
+
+
+ + {/* Stats Grid */} +
+ {[ + { label: "Tests Attempted", value: data.stats.total_tests, color: "text-[#00F0FF]", icon: }, + { label: "Avg Accuracy", value: data.stats.avg_accuracy ? `${data.stats.avg_accuracy}%` : "—", color: "text-green-500", icon: }, + { label: "AI Sessions", value: data.stats.mastered_mistakes, color: "text-purple-400", icon: }, + { + label: "Current Streak", + value: editing ? ( + setEditStreak(Number(e.target.value))} + className="text-2xl font-black w-20 bg-secondary border border-border rounded px-2 py-0.5 focus:outline-none text-orange-500" + /> + ) : ( + + + {data.streak_count} + + ), + color: "text-orange-500", + icon: + }, + ].map((stat, i) => ( + + +
{stat.icon}
+
{stat.value}
+
{stat.label}
+
+
+ ))} +
+ + {/* Recent Attempts + Weak Topics */}
- Recent Tests + + Recent Activity + -
- {userData.recent_tests.map((test: any) => ( -
-
-
{test.name}
-
{test.date}
+ {data.recent_attempts.length === 0 ? ( +

No tests attempted yet.

+ ) : ( +
+ {data.recent_attempts.map((a: any) => ( +
+
+
{a.name}
+
{formatDate(a.submitted_at)}
+
+
+
{a.score}/{a.total_questions}
+
{a.accuracy.toFixed(1)}% acc
+
-
-
{test.score}
-
{test.percentile} %ile
-
-
- ))} -
+ ))} +
+ )} - AI Identified Weaknesses + + Weak Topics + -
    - {userData.weak_topics.map((topic: string, i: number) => ( -
  • -
    - {topic} -
  • - ))} -
+ {data.weak_topics.length === 0 ? ( +

No weak topics identified yet.

+ ) : ( +
    + {data.weak_topics.map((topic: string, i: number) => ( +
  • +
    + {topic} +
  • + ))} +
+ )}
- {/* Payment History */} - - - Payment History - - -
- - - - - - - - - - - - {userData.payments.map((p: any) => ( - - - - - - + {/* Subscriptions */} + {data.subscriptions.length > 0 && ( + + + + Subscription History + + + +
+
Transaction IDPlanDateAmountStatus
{p.id}{p.plan}{p.date}{p.amount}{p.status}
+ + + + + + + + - ))} - -
PlanBillingStartEndAmountStatus
-
-
-
+ + + {data.subscriptions.map((s: any) => ( + + {TIER_LABEL[s.tier] || s.tier} + {s.billing_cycle} + {formatDate(s.start_date)} + {formatDate(s.end_date)} + {formatAmount(s.amount)} + + + {s.status} + + + + ))} + + +
+ + + )} + {/* Transactions */} + {data.transactions.length > 0 && ( + + + Payment History + + +
+ + + + + + + + + + + + {data.transactions.map((t: any) => ( + + + + + + + + ))} + +
IDPlanDateAmountStatus
{t.id.slice(0, 12)}...{TIER_LABEL[t.tier] || t.tier}{formatDate(t.created_at)}₹{t.amount.toLocaleString("en-IN")} + + {t.status} + +
+
+
+
+ )}
) } diff --git a/src/app/admin/students/page.tsx b/src/app/admin/students/page.tsx index c9918ef..9642a5e 100644 --- a/src/app/admin/students/page.tsx +++ b/src/app/admin/students/page.tsx @@ -1,94 +1,144 @@ "use client" -import { Button } from "@/components/ui/button" +import { useEffect, useState } from "react" import { Badge } from "@/components/ui/badge" -import { Search, Download, MoreVertical } from "lucide-react" +import { Button } from "@/components/ui/button" +import { Search, Download, Flame, RefreshCw } from "lucide-react" import { useRouter } from "next/navigation" +const TIER_STYLE: Record = { + "Al_Coach": "bg-[#00F0FF]/10 text-[#00F0FF] border-[#00F0FF]/20 font-bold", + "Pro": "bg-yellow-500/10 text-yellow-500 border-yellow-500/20 font-bold", + "Free": "bg-secondary text-foreground border-border", +} + +const TIER_LABEL: Record = { + "Al_Coach": "AI Coach", + "Pro": "Pro", + "Free": "Free", +} + export default function StudentsPage() { const router = useRouter() - const students = [ - { id: "STU-001", name: "Rahul Sharma", email: "rahul@example.com", tier: "AI Pro", target: "NEET", joined: "Oct 12, 2025", tests: 42, streak: 45, lastLogin: "Today, 08:30 AM" }, - { id: "STU-002", name: "Priya Patel", email: "priya@example.com", tier: "Basic", target: "JEE Main", joined: "Nov 05, 2025", tests: 14, streak: 2, lastLogin: "Yesterday, 14:15 PM" }, - { id: "STU-003", name: "Amit Kumar", email: "amit@example.com", tier: "AI Pro", target: "JEE Adv", joined: "Dec 01, 2025", tests: 89, streak: 0, lastLogin: "3 Days Ago" }, - { id: "STU-004", name: "Sneha Reddy", email: "sneha@example.com", tier: "AI Pro", target: "NEET", joined: "Dec 15, 2025", tests: 34, streak: 12, lastLogin: "Today, 11:45 AM" }, - { id: "STU-005", name: "Vikram Singh", email: "vikram@example.com", tier: "Basic", target: "NEET", joined: "Jan 10, 2026", tests: 5, streak: 0, lastLogin: "1 Week Ago" }, - ] + const [students, setStudents] = useState([]) + const [loading, setLoading] = useState(true) + const [search, setSearch] = useState("") + + useEffect(() => { + fetch("/api/admin/students") + .then(r => r.json()) + .then(data => setStudents(data)) + .catch(console.error) + .finally(() => setLoading(false)) + }, []) + + const filtered = students.filter(s => + s.name.toLowerCase().includes(search.toLowerCase()) || + s.email.toLowerCase().includes(search.toLowerCase()) || + s.phone.includes(search) + ) + + const formatDate = (iso: string) => { + try { return new Date(iso).toLocaleDateString("en-IN", { day: "numeric", month: "short", year: "numeric" }) } + catch { return iso } + } return (

Student Directory

-

Manage users, view engagement, and handle subscriptions.

+

+ {loading ? "Loading..." : `${students.length} students enrolled`} +

- +
- setSearch(e.target.value)} + placeholder="Search by name, email, or phone..." className="w-full bg-background border border-border rounded-lg pl-10 pr-4 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-primary" />
- +
- - - - - - - - - - - - - - {students.map((s) => ( - router.push(`/admin/students/${s.id}`)} - > - - - - - - - + {loading ? ( +
+ Loading students... +
+ ) : ( +
StudentPlan TierTarget ExamTests TakenStreakLast LoginActions
-
{s.name}
-
{s.email}
-
- - {s.tier} - - {s.target}{s.tests} - 0 ? 'text-orange-500' : 'text-muted-foreground'}`}>{s.streak} - {s.lastLogin} - {s.streak === 0 && ( - - )} - -
+ + + + + + + + + - ))} - -
StudentPlanTargetTestsAccuracyStreakLast Active
+ + + {filtered.map((s) => ( + router.push(`/admin/students/${s.id}`)} + > + +
+
+ {s.name.charAt(0)} +
+
+
+ {s.name} + {s.name === "Neha Verma" && ( + DEMO ⭐ + )} +
+
{s.email || s.phone}
+
+
+ + + + {TIER_LABEL[s.tier] || s.tier} + + + {s.target_exam.replace("_", " ")} + {s.total_tests} + + = 80 ? "text-green-500" : s.avg_accuracy >= 60 ? "text-yellow-500" : "text-muted-foreground"}`}> + {s.avg_accuracy > 0 ? `${s.avg_accuracy}%` : "—"} + + + + 0 ? "text-orange-500" : "text-muted-foreground"}`}> + {s.streak_count > 0 && } + {s.streak_count} + + + {formatDate(s.last_active)} + + ))} + + + )}
- Showing top 5 active students out of 12,400 total. + Showing {filtered.length} of {students.length} students
diff --git a/src/app/cancellation-policy/page.tsx b/src/app/cancellation-policy/page.tsx new file mode 100644 index 0000000..f2b37a9 --- /dev/null +++ b/src/app/cancellation-policy/page.tsx @@ -0,0 +1,85 @@ +import Link from 'next/link'; + +export default function CancellationPolicyPage() { + return ( +
+
+

+ PragatiVeer Cancellation Policy +

+
+ +

Last Updated: 27 July 2026
+Version: 1.0
+Document Ref: PV-LEG-CP-001
+Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+ +

1. Overview

+

This Cancellation Policy governs cancellation of paid subscriptions on PragatiVeer, operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021).

+

By purchasing a subscription, you agree to the terms of this policy.

+ +

2. Subscription Cancellation by You

+

2.1 How to Cancel

+

You may cancel your subscription at any time by:

+
    +
  • Going to Account Settings on the PragatiVeer website and disabling auto-renewal
  • +
  • Emailing contact@pragativeer.com with subject ā€œCancellation Requestā€ along with your registered email or phone number
  • +
+ +

2.2 Effect of Cancellation

+

Upon cancellation:

+
    +
  • Your subscription will not auto-renew at the end of the current billing period
  • +
  • You will continue to have full access to your paid features until the end of the current billing period
  • +
  • No refund will be issued for the remaining days of the current billing period, except as provided in our Refund Policy
  • +
+ +

2.3 Timing

+

To avoid being charged for the next billing cycle, cancellation must be requested at least 24 hours before the renewal date.

+ +

3. Auto-Renewal

+

All subscriptions auto-renew at the end of each billing period unless cancelled at least 24 hours before renewal. You authorise us to charge the applicable subscription fee to your chosen payment method at each renewal.

+

You will receive a reminder before renewal. If you do not wish to renew, please cancel before the renewal date.

+ +

4. Cancellation by PragatiVeer

+

We reserve the right to cancel or suspend your subscription immediately if:

+
    +
  • You violate our Terms & Conditions
  • +
  • You engage in fraudulent, abusive, or illegal activity
  • +
  • We are required to do so by law
  • +
+

In such cases, fees paid are non-refundable.

+ +

5. Account Deletion

+

Cancelling your subscription does not delete your account. To delete your account and all associated data, please follow the process outlined in our Privacy Policy.

+ +

6. Contact

+

For any questions regarding this Cancellation Policy, contact us at contact@pragativeer.com or reach out to our Grievance Officer:

+
+ + + + + + + + + + + + +
DetailInformation
Grievance OfficerHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
+
+ +
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+ +
+
+
+ ); +} diff --git a/src/app/cancellation/page.tsx b/src/app/cancellation/page.tsx new file mode 100644 index 0000000..b990499 --- /dev/null +++ b/src/app/cancellation/page.tsx @@ -0,0 +1,131 @@ +"use client"; + +import { PublicLayout } from "@/components/Landing/PublicLayout"; + +export default function CancellationPolicyPage() { + return ( + +
+
+
+
+

PragatiVeer Cancellation Policy

+

Gyannetra Pvt Ltd

+
+

Last Updated: 27 July 2026

+

Version: 1.0

+

Document Ref: PV-LEG-CP-001

+

Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+
+
+ +
+
+

1. Overview

+

+ This Cancellation Policy governs cancellation of paid subscriptions on PragatiVeer, operated by Gyannetra Pvt Ltd (CIN: U72900PN2015PTC156021). +

+

+ By purchasing a subscription, you agree to the terms of this policy. +

+
+ +
+

2. Subscription Cancellation by You

+

2.1 How to Cancel

+

You may cancel your subscription at any time by:

+
    +
  • Going to Account Settings on the PragatiVeer website and disabling auto-renewal
  • +
  • Emailing contact@pragativeer.com with subject “Cancellation Request” along with your registered email or phone number
  • +
+ +

2.2 Effect of Cancellation

+

Upon cancellation:

+
    +
  • Your subscription will not auto-renew at the end of the current billing period
  • +
  • You will continue to have full access to your paid features until the end of the current billing period
  • +
  • No refund will be issued for the remaining days of the current billing period, except as provided in our Refund Policy
  • +
+ +

2.3 Timing

+

+ To avoid being charged for the next billing cycle, cancellation must be requested at least 24 hours before the renewal date. +

+
+ +
+

3. Auto-Renewal

+

+ All subscriptions auto-renew at the end of each billing period unless cancelled at least 24 hours before renewal. You authorise us to charge the applicable subscription fee to your chosen payment method at each renewal. +

+

+ You will receive a reminder before renewal. If you do not wish to renew, please cancel before the renewal date. +

+
+ +
+

4. Cancellation by PragatiVeer

+

We reserve the right to cancel or suspend your subscription immediately if:

+
    +
  • You violate our Terms & Conditions
  • +
  • You engage in fraudulent, abusive, or illegal activity
  • +
  • We are required to do so by law
  • +
+

+ In such cases, fees paid are non-refundable. +

+
+ +
+

5. Account Deletion

+

+ Cancelling your subscription does not delete your account. To delete your account and all associated data, please follow the process outlined in our Privacy Policy. +

+
+ +
+

6. Contact

+

+ For any questions regarding this Cancellation Policy, contact us at contact@pragativeer.com or reach out to our Grievance Officer: +

+
+ + + + + + + + + + + + + + + + + + + + + +
DetailInformation
Grievance OfficerHimani Kachhawaha
Emailgrievance@pragativeer.com
Phone+91 9079337961
+
+
+ +
+
+

Gyannetra Pvt Ltd

+

CIN: U72900PN2015PTC156021

+

OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+

pragativeer.com

+
+
+
+
+
+
+
+ ); +} diff --git a/src/app/dashboard/ai-coach/cbt-dpp/[id]/page.tsx b/src/app/dashboard/ai-coach/cbt-dpp/[id]/page.tsx new file mode 100644 index 0000000..217af36 --- /dev/null +++ b/src/app/dashboard/ai-coach/cbt-dpp/[id]/page.tsx @@ -0,0 +1,289 @@ +"use client" + +import { useState, useEffect } from "react" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { BrainCircuit, Clock, CheckCircle2, AlertTriangle, ArrowLeft, ArrowRight, ShieldAlert, Sparkles, Send } from "lucide-react" +import Link from "next/link" +import { useActiveUser } from "@/hooks/useActiveUser" +import { useRouter } from "next/navigation" + +export default function AIComCBTDPPPage() { + const { user, hasAccessTo, loading } = useActiveUser() + const router = useRouter() + + const [activeQuestion, setActiveQuestion] = useState(0) + const [selectedAnswers, setSelectedAnswers] = useState>({}) + const [timeLeft, setTimeLeft] = useState(1800) // 30 minutes + const [submitted, setSubmitted] = useState(false) + + // Mock AI CBT DPP questions + const sampleQuestions = [ + { + id: 1, + subject: "Physics", + topic: "Rotational Dynamics & Torque", + question: "A uniform disc of mass M and radius R rotates about an axis passing through its center and perpendicular to its plane. Its moment of inertia about a tangent parallel to its plane is:", + options: ["(1/2) M R²", "(5/4) M R²", "(3/2) M R²", "(7/4) M R²"], + correct: 1, + explanation: "Using parallel axis theorem: I_tangent = I_cm + M R^2 = (1/4 M R^2) + M R^2 = 5/4 M R^2." + }, + { + id: 2, + subject: "Chemistry", + topic: "Chemical Equilibrium & Kp/Kc", + question: "For the reaction N2(g) + 3H2(g) ā‡Œ 2NH3(g), the value of Kp / Kc at temperature T Kelvin is given by:", + options: ["(RT)⁻²", "(RT)⁻¹", "(RT)", "(RT)²"], + correct: 0, + explanation: "Ī”n_g = 2 - (1 + 3) = -2. Therefore, Kp = Kc (RT)^(-2), so Kp / Kc = (RT)^(-2)." + }, + { + id: 3, + subject: "Biology / Maths", + topic: "Calculus / Cell Biology", + question: "Which organelle is responsible for the synthesis of lipids and steroidal hormones in eukaryotic cells?", + options: ["Rough Endoplasmic Reticulum", "Smooth Endoplasmic Reticulum", "Golgi Apparatus", "Lysosome"], + correct: 1, + explanation: "Smooth Endoplasmic Reticulum (SER) is the primary site for synthesis of lipids and steroid hormones." + }, + { + id: 4, + subject: "Physics", + topic: "Electrostatics & Potential", + question: "Two point charges +q and -q are placed at distance 2a. The electric potential at the midpoint of the line joining them is:", + options: ["Zero", "q / (4πε₀a)", "2q / (4πε₀a)", "Infinity"], + correct: 0, + explanation: "V_total = V_+q + V_-q = (q / 4πε₀a) + (-q / 4πε₀a) = 0." + }, + { + id: 5, + subject: "Chemistry", + topic: "Organic Mechanism & Nucleophiles", + question: "Which of the following undergoes SN1 reaction at the fastest rate?", + options: ["Methyl chloride", "Ethyl chloride", "Isopropyl chloride", "Tert-butyl chloride"], + correct: 3, + explanation: "SN1 rate depends on carbocation stability. Tert-butyl carbocation (3°) is the most stable." + } + ] + + useEffect(() => { + if (submitted || timeLeft <= 0) return + const timer = setInterval(() => { + setTimeLeft(prev => Math.max(0, prev - 1)) + }, 1000) + return () => clearInterval(timer) + }, [submitted, timeLeft]) + + const formatTime = (secs: number) => { + const m = Math.floor(secs / 60) + const s = secs % 60 + return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}` + } + + const handleOptionSelect = (qIdx: number, optIdx: number) => { + if (submitted) return + setSelectedAnswers(prev => ({ ...prev, [qIdx]: String.fromCharCode(65 + optIdx) })) + } + + const calculateScore = () => { + let score = 0 + sampleQuestions.forEach((q, idx) => { + const selected = selectedAnswers[idx] + if (selected) { + const selectedOptIdx = selected.charCodeAt(0) - 65 + if (selectedOptIdx === q.correct) score += 4 + else score -= 1 + } + }) + return score + } + + if (loading) { + return
Loading AI Coach CBT Engine...
+ } + + return ( +
+ {/* Top Header */} +
+
+ + + +
+
+ + AI CBT DPP Simulator + + • {user?.target_exam?.replace("_", " ") || "JEE/NEET"} +
+

Interactive Target DPP #14

+
+
+ +
+
+ + {formatTime(timeLeft)} +
+ {!submitted ? ( + + ) : ( + + )} +
+
+ + {submitted && ( + +
+
+ +
+

CBT DPP Completed!

+

Your performance analysis has been evaluated by the AI Evaluator.

+
+
+
+ {calculateScore()} / 20 +

Total Marks

+
+
+
+ )} + + {/* Main CBT Grid */} +
+ {/* Question Area */} +
+ +
+ + Question {activeQuestion + 1} of {sampleQuestions.length} + + + {sampleQuestions[activeQuestion].topic} + +
+ +
+

+ {sampleQuestions[activeQuestion].question} +

+ +
+ {sampleQuestions[activeQuestion].options.map((opt, optIdx) => { + const letter = String.fromCharCode(65 + optIdx) + const isSelected = selectedAnswers[activeQuestion] === letter + const isCorrect = sampleQuestions[activeQuestion].correct === optIdx + + let btnStyle = "border-border bg-secondary/20 hover:border-primary/50 text-foreground" + if (isSelected) { + btnStyle = "border-[#00F0FF] bg-[#00F0FF]/15 text-[#00F0FF] font-bold shadow-[0_0_12px_rgba(0,240,255,0.15)]" + } + if (submitted) { + if (isCorrect) btnStyle = "border-emerald-500 bg-emerald-500/20 text-emerald-400 font-bold" + else if (isSelected && !isCorrect) btnStyle = "border-red-500 bg-red-500/20 text-red-400 font-bold" + } + + return ( +
handleOptionSelect(activeQuestion, optIdx)} + className={`flex items-center gap-4 p-4 rounded-2xl border cursor-pointer transition-all ${btnStyle}`} + > + + {letter} + + {opt} + {submitted && isCorrect && } +
+ ) + })} +
+ + {submitted && ( +
+ AI Solution & Explanation: +

{sampleQuestions[activeQuestion].explanation}

+
+ )} +
+ + {/* Navigation buttons */} +
+ + +
+
+
+ + {/* Question Palette Sidebar */} +
+ +

Question Palette

+
+ {sampleQuestions.map((q, idx) => { + const isAns = !!selectedAnswers[idx] + const isCurr = activeQuestion === idx + return ( + + ) + })} +
+ +
+
+ Current Question +
+
+ Answered +
+
+ Unattempted +
+
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/cbt-dpp/page.tsx b/src/app/dashboard/ai-coach/cbt-dpp/page.tsx new file mode 100644 index 0000000..674753c --- /dev/null +++ b/src/app/dashboard/ai-coach/cbt-dpp/page.tsx @@ -0,0 +1,302 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { Card, CardContent } from "@/components/ui/card" +import { BrainCircuit, Play, CheckCircle2, Download, Filter, Lock, FileText, Eye, ShieldAlert, X, Sparkles } from "lucide-react" + +import { useEffect, useState } from "react" +import Link from "next/link" +import { useActiveUser } from "@/hooks/useActiveUser" + +export default function PrepPilotAIPage() { + const { user, userId } = useActiveUser() + const [dpps, setDpps] = useState([]) + const [attempts, setAttempts] = useState([]) + const [loading, setLoading] = useState(true) + const [dateFilter, setDateFilter] = useState("") + const [selectedPdfDpp, setSelectedPdfDpp] = useState(null) + + useEffect(() => { + async function fetchDpps() { + if (!user) return; // Wait for user to be available + + try { + const pattern = user.target_exam || "JEE_Main"; + // Also fetch from the correct Next.js proxied route instead of localhost:8000 + const res = await fetch(`/api/tests?type=DPS&exam_pattern=${pattern}`); + if (res.ok) { + const data = await res.json() + setDpps(data) + } + + if (userId) { + const attemptsRes = await fetch(`/api/users/${userId}/attempts`); + if (attemptsRes.ok) { + const attemptsData = await attemptsRes.json(); + setAttempts(attemptsData); + } + } + } catch (err) { + console.error("Failed to fetch DPPs", err) + } finally { + setLoading(false) + } + } + fetchDpps() + }, [user]) + + const getDifficultyColor = (diff: string) => { + switch(diff) { + case 'Easy': return 'text-emerald-500 bg-emerald-500/10 border-emerald-500/20'; + case 'Medium': return 'text-amber-500 bg-amber-500/10 border-amber-500/20'; + case 'Hard': return 'text-destructive bg-destructive/10 border-destructive/20'; + default: return 'text-primary bg-primary/10 border-primary/20'; + } + } + + const attemptsByTest = attempts.reduce((acc, curr) => { + // Isolate analytics to first attempt only - ignore retakes + if (curr.is_retake) return acc; + + if (!acc[curr.source_id] || acc[curr.source_id].score < curr.score) { + acc[curr.source_id] = curr; + } + return acc; + }, {} as Record); + + const filteredDpps = dpps.filter(dpp => { + if (dateFilter) { + if (!dpp.scheduled_date) return false; + const scheduledDate = new Date(dpp.scheduled_date).toISOString().split('T')[0]; + if (scheduledDate !== dateFilter) return false; + } + return true; + }); + + const formatDate = (dateStr: string) => { + return new Date(dateStr).toLocaleDateString("en-US", { year: 'numeric', month: 'short', day: 'numeric' }); + } + + const getPdfUrl = (title: string) => { + const t = title.toLowerCase(); + if (t.includes('phys')) return '/dpps/dps-phy-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('chem')) return '/dpps/dps-che-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('math')) return '/dpps/dps-mth-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('bio')) return '/dpps/dps-bio-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + // Default fallback + return '/dpps/dps-phy-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + }; + + return ( +
+
+
+

PrepPilot AI & CBT Simulator

+

+ Select an interactive Target DPP to launch the AI-powered CBT examination simulator. +

+
+
+ +
+
+ setDateFilter(e.target.value)} + className="px-3 py-1.5 bg-background border border-border rounded-lg text-xs font-bold focus:ring-2 focus:ring-[#00F0FF] outline-none text-muted-foreground mr-2" + /> + Difficulty: + {['Mixed', 'Easy', 'Medium', 'Hard'].map((diff) => ( + + ))} +
+ Pro +
+
+ +
+ +
+ {loading ? ( +
Loading AI-generated DPPs...
+ ) : filteredDpps.length === 0 ? ( +
No DPPs available for the selected criteria.
+ ) : filteredDpps.map((dpp, i) => { + // Calculate total questions dynamically from sections + let count = 0; + if (dpp.sections) { + Object.values(dpp.sections).forEach((s: any) => { count += (s.questions?.length || 0) }); + } + + const attempt = attemptsByTest[dpp.id]; + const isAttempted = !!attempt; + + // Date logic + const now = new Date(); + const scheduledTime = dpp.scheduled_date ? new Date(dpp.scheduled_date) : now; + const endTime = dpp.end_date ? new Date(dpp.end_date) : null; + const isUpcoming = scheduledTime > now; + const isExpired = endTime ? now > endTime : false; + + return ( + + +
+
+ {isAttempted ? :
} +
+
+
+ + {user?.target_exam?.replace("_", " ") || "JEE/NEET"} + + • + {dpp.difficulty} Level + {isUpcoming ? ( + <> + • + Upcoming + + ) : isExpired ? ( + <> + • + Expired + + ) : null} +
+

+ {dpp.title} + + {dpp.difficulty} + +

+
+ {count} Questions • {dpp.total_time} mins + {dpp.scheduled_date && ( + + {isUpcoming ? `Available on ${formatDate(dpp.scheduled_date)}` : isExpired ? `Expired on ${formatDate(dpp.end_date!)}` : 'Available Now'} + + )} +
+
+
+
+ {isUpcoming ? ( + + ) : isExpired && !isAttempted ? ( + + ) : isAttempted ? ( + <> + + + + {!isExpired && ( + + + + )} + + ) : ( + user?.tier === "Free" ? ( + + ) : ( + + + + ) + )} +
+
+
+ )})} +
+ + {/* ── PROTECTED PDF READER MODAL (FREE TIER) ── */} + {selectedPdfDpp && ( +
+
+ {/* Modal Header */} +
+
+
+ +
+
+

+ {selectedPdfDpp.title} + + Protected In-App PDF View + +

+

+ {selectedPdfDpp.difficulty} Level • {user?.target_exam?.replace("_", " ") || "JEE/NEET"} Practice Sheet +

+
+
+ +
+ + {/* Security Notice Banner */} +
+ + Read-Only Mode (Free Tier) — Downloads, text copying, and sharing are restricted. + + + + +
+ + {/* Protected PDF Document Sheet Content (select-none) */} +
e.preventDefault()} + className="flex-1 w-full h-full min-h-[60vh] select-none bg-[#525659]" + > + +
+ + {/* Modal Footer */} +
+ + šŸ“„ PragatiVeer Protected PDF Reader v2.0 + +
+ + + + +
+
+
+
+ )} +
+ ) +} diff --git a/src/app/dashboard/ai-coach/college-predictor/page.tsx b/src/app/dashboard/ai-coach/college-predictor/page.tsx new file mode 100644 index 0000000..c19363f --- /dev/null +++ b/src/app/dashboard/ai-coach/college-predictor/page.tsx @@ -0,0 +1,57 @@ +"use client" + +import { CollegePredictorCard } from "@/components/AI/CollegePredictorCard" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { GraduationCap, ArrowLeft, Building2, MapPin, Award, CheckCircle2 } from "lucide-react" +import Link from "next/link" + +export default function CollegePredictorPage() { + return ( +
+ {/* Navigation Header */} +
+

+ + AI College & Cutoff Predictor +

+

+ Discover your probable target medical & engineering colleges based on current mock exam scores and historical cutoffs. +

+
+ +
+
+ +

+ Target College Analytics +

+ +
+
+ +
+ +

+ Cutoff Modeling Parameters +

+
    +
  • + + Includes 100,000+ candidate rank trends across 2021-2025 rounds. +
  • +
  • + + Supports All India Quota (AIQ) & State Quota adjustments. +
  • +
  • + + Simulates category reservation cutoffs (General, OBC, SC, ST, EWS). +
  • +
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/heatmap/page.tsx b/src/app/dashboard/ai-coach/heatmap/page.tsx new file mode 100644 index 0000000..78c76e1 --- /dev/null +++ b/src/app/dashboard/ai-coach/heatmap/page.tsx @@ -0,0 +1,25 @@ +"use client" + +import { MistakeHeatmap } from "@/components/AI/MistakeHeatmap" +import { ArrowLeft, Flame } from "lucide-react" +import Link from "next/link" + +export default function HeatmapPage() { + return ( +
+
+

+ + Mistake Heatmap Vault +

+

+ Visual representation of your error density across subjects and topics. +

+
+ +
+ +
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/mistakes/page.tsx b/src/app/dashboard/ai-coach/mistakes/page.tsx new file mode 100644 index 0000000..7038441 --- /dev/null +++ b/src/app/dashboard/ai-coach/mistakes/page.tsx @@ -0,0 +1,133 @@ +"use client" + +import { useEffect, useState } from "react" +import { MistakeHeatmap } from "@/components/AI/MistakeHeatmap" +import { MistakeReviewCard, MistakePayload } from "@/components/AI/MistakeReviewCard" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { BrainCircuit, RefreshCw, CheckCircle2, ArrowLeft, Flame, Sparkles, AlertTriangle } from "lucide-react" +import { useActiveUser } from "@/hooks/useActiveUser" +import Link from "next/link" + +export default function MistakeTrackingPage() { + const [mistakes, setMistakes] = useState([]) + const [currentIndex, setCurrentIndex] = useState(0) + const [loading, setLoading] = useState(true) + const { userId, loading: userLoading } = useActiveUser() + + const fetchMistakes = async () => { + if (!userId) return + setLoading(true) + try { + const res = await fetch(`/api/mistakes/today?user_id=${userId}`) + if (!res.ok) throw new Error("Failed to fetch") + const data = await res.json() + setMistakes(data) + } catch (error) { + console.error(error) + setMistakes([]) + } finally { + setLoading(false) + } + } + + useEffect(() => { + if (!userLoading && userId) { + fetchMistakes() + } + }, [userId, userLoading]) + + const submitReview = async (mistakeId: string, selectedAnswer: string) => { + const res = await fetch("/api/mistakes/review", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ mistake_id: mistakeId, selected_answer: selectedAnswer }) + }) + if (!res.ok) throw new Error("Failed to submit review") + return await res.json() + } + + const handleNext = () => { + if (currentIndex < mistakes.length - 1) { + setCurrentIndex(prev => prev + 1) + } else { + setCurrentIndex(mistakes.length) + } + } + + return ( +
+ {/* Navigation Header */} +
+
+

+ + AI Mistake Vault & SM-2 Engine +

+

+ Review logged errors, practice spaced-repetition cards, and observe subject heatmap trends. +

+
+
+
+ SM-2 Adaptive Algorithm Active +
+
+
+ + {/* Main Review Workspace */} +
+
+
+

+ Today's Active Review Queue +

+ + {currentIndex < mistakes.length ? `Question ${currentIndex + 1} of ${mistakes.length}` : "Completed"} + +
+ + {loading ? ( + + + Loading your active error queue... + + ) : mistakes.length === 0 ? ( + + +

Zero Mistakes Pending!

+

+ All scheduled errors have been reviewed. Solve more mock tests to automatically surface weak questions here. +

+ +
+ ) : currentIndex < mistakes.length ? ( + + ) : ( + + +

Review Session Mastered šŸŽ‰

+

+ Fantastic focus! Your memory decay intervals have been updated in the database. +

+ +
+ )} +
+ + {/* Heatmap & Info Column */} +
+ +
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/page.tsx b/src/app/dashboard/ai-coach/page.tsx index dfb768c..e6e2c42 100644 --- a/src/app/dashboard/ai-coach/page.tsx +++ b/src/app/dashboard/ai-coach/page.tsx @@ -5,16 +5,33 @@ import { MistakeHeatmap } from "@/components/AI/MistakeHeatmap" import { StudyPlanCard } from "@/components/AI/StudyPlanCard" import { ReadinessGauge } from "@/components/AI/ReadinessGauge" import { CollegePredictorCard } from "@/components/AI/CollegePredictorCard" +import { ExamStrategyCard } from "@/components/AI/ExamStrategyCard" +import { StudyTimeOptimizationCard } from "@/components/AI/StudyTimeOptimizationCard" import { TutorChat } from "@/components/AI/TutorChat" import { ReferralCard } from "@/components/AI/ReferralCard" import { ProgressShare } from "@/components/AI/ProgressShare" import { MistakeReviewCard, MistakePayload } from "@/components/AI/MistakeReviewCard" +import { DailyChallengeBanner } from "@/components/AI/DailyChallengeBanner" +import { WeeklyProgressReport } from "@/components/AI/WeeklyProgressReport" import { Card, CardContent } from "@/components/ui/card" import { Button } from "@/components/ui/button" -import { BrainCircuit, BookOpen, Calculator, Target, RefreshCw, CheckCircle2, Lock } from "lucide-react" +import { BrainCircuit, RefreshCw, CheckCircle2, Flame, Trophy, Target, Zap, BookOpen, Bot, FileText } from "lucide-react" import { useActiveUser } from "@/hooks/useActiveUser" import Link from "next/link" + +// Days until NEET 2026 (May 3, 2026) +function getDaysToExam(exam: string) { + const targets: Record = { + "NEET": new Date("2026-05-03"), + "JEE_Main": new Date("2026-01-22"), + "JEE_Advanced": new Date("2026-05-24"), + } + const t = targets[exam] || targets["NEET"] + const diff = Math.ceil((t.getTime() - Date.now()) / 86400000) + return diff > 0 ? diff : 0 +} + export default function AICoachDashboard() { const [mistakes, setMistakes] = useState([]) const [currentIndex, setCurrentIndex] = useState(0) @@ -32,7 +49,6 @@ export default function AICoachDashboard() { setMistakes(data) } catch (error) { console.error(error) - // If backend fails, fallback to empty array setMistakes([]) } finally { setLoading(false) @@ -51,7 +67,6 @@ export default function AICoachDashboard() { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ mistake_id: mistakeId, selected_answer: selectedAnswer }) }) - if (!res.ok) throw new Error("Failed to submit review") return await res.json() } @@ -60,13 +75,19 @@ export default function AICoachDashboard() { if (currentIndex < mistakes.length - 1) { setCurrentIndex(prev => prev + 1) } else { - // Session finished - setCurrentIndex(mistakes.length) // Push out of bounds to trigger complete state + setCurrentIndex(mistakes.length) } } if (userLoading) { - return
Loading AI Coach...
+ return ( +
+
+ + Loading AI Coach... +
+
+ ) } if (!hasAccessTo("ai-mistake-tracking")) { @@ -78,7 +99,7 @@ export default function AICoachDashboard() {

AI Coach Workspace

- Mistake tracking, Spaced Repetition (SM-2), AI Tutor Chats, and Readiness scores are premium features reserved for **AI Coach** subscribers. + Mistake tracking, Spaced Repetition (SM-2), AI Tutor Chats, and Readiness scores are premium features reserved for AI Coach subscribers.

@@ -92,81 +113,113 @@ export default function AICoachDashboard() { ) } + const daysLeft = getDaysToExam(user?.target_exam || "NEET") + const physicsErrors = mistakes.filter(m => m.question.subject === "Physics").length + const chemErrors = mistakes.filter(m => m.question.subject === "Chemistry").length + const mathErrors = mistakes.filter(m => m.question.subject === "Maths" || m.question.subject === "Mathematics").length + return ( -
-
-
-

- AI Coach -

-

Your personalized SM-2 spaced repetition and analytics engine.

-
-
+
- {/* Summary Metrics */} -
- - -
-
-

Physics Errors

-

{mistakes.filter(m => m.question.subject === 'Physics').length}

-
-
-
- - -
-
-

Chemistry Errors

-

{mistakes.filter(m => m.question.subject === 'Chemistry').length}

-
-
-
- - -
-
-

Maths Errors

-

{mistakes.filter(m => m.question.subject === 'Maths').length}

-
-
-
+ {/* ── METRICS BAR ── */} +
+
+ + {user?.streak_count || 0}-Day Streak +
+
+ + {daysLeft} days to {user?.target_exam?.replace("_", " ") || "Exam"} +
+
+ + AI Coach +
+
+ + {/* ── DAILY CHALLENGE BANNER ── */} + + + {/* ── QUICK STATS ── */} +
+ {[ + { label: "Questions Solved", value: "1,247", color: "text-[#00F0FF]", bg: "bg-[#00F0FF]/5", border: "border-[#00F0FF]/20", icon: }, + { label: "Overall Accuracy", value: "74%", color: "text-amber-500", bg: "bg-amber-500/5", border: "border-amber-500/20", icon: }, + { label: "Current Streak", value: `${user?.streak_count || 0} d`, color: "text-yellow-400", bg: "bg-yellow-400/5", border: "border-yellow-400/20", icon: }, + { label: "Mistakes Mastered", value: 38, color: "text-green-400", bg: "bg-green-400/5", border: "border-green-400/20", icon: }, + { label: "AI Sessions", value: 124, color: "text-purple-400", bg: "bg-purple-400/5", border: "border-purple-400/20", icon: }, + ].map((stat) => ( + + +
{stat.icon}
+
{stat.value}
+
{stat.label}
+
+
+ ))}
- {/* Predictive Intelligence */} -
- - + {/* ── PREDICTIVE INTELLIGENCE ROW ── */} +
+
+
+ + Predictive Intelligence & Strategy +
+
+ + Full Analytics → + +
+
+
+ + + + +
- {/* Mistake Review Workspace */} -
-
-

Daily Mistake Review Queue

- - {currentIndex < mistakes.length ? `${currentIndex + 1} / ${mistakes.length}` : "Finished"} - + {/* ── MISTAKE REVIEW WORKSPACE ── */} +
+
+
+
+ +
+
+

Daily Mistake Review Queue

+

SM-2 Spaced Repetition Flashcard Engine

+
+
+
+ + Open Full Mistake Vault Page → + + + {currentIndex < mistakes.length ? `${currentIndex + 1} / ${mistakes.length}` : "Finished"} + +
- + {loading ? ( Loading queue... ) : mistakes.length === 0 ? ( - +

You're all caught up!

No mistakes scheduled for review today. Go take a test!

) : currentIndex < mistakes.length ? ( - ) : ( - +

Session Complete

Great job clearing your error queue! The SM-2 engine has scheduled your next reviews.

@@ -175,23 +228,57 @@ export default function AICoachDashboard() { )}
- {/* Heatmap & Timeline */} -
-
+ {/* ── HEATMAP / STUDY PLAN / WEEKLY REPORT ── */} +
+
+
+
+ Study Plan +
+ + Full Schedule → + +
-
-
+
+
+
+
+ Mistake Heatmap +
+ + Heatmap Vault → + +
-
-
+
+ - {/* Tutor Chat Workspace */}
+
+
+ Weekly Progress Overview +
+ + View Details → + +
+ +
+ + {/* ── TUTOR CHAT ── */} +
+
+

24/7 AI Tutor Chat Assistant

+ + Full Desk Mode → + +
- {/* Growth & Sharing Hub */} -
+ {/* ── GROWTH HUB ── */} +
@@ -199,3 +286,4 @@ export default function AICoachDashboard() {
) } + diff --git a/src/app/dashboard/ai-coach/readiness/page.tsx b/src/app/dashboard/ai-coach/readiness/page.tsx new file mode 100644 index 0000000..55d3429 --- /dev/null +++ b/src/app/dashboard/ai-coach/readiness/page.tsx @@ -0,0 +1,79 @@ +"use client" + +import { ReadinessGauge } from "@/components/AI/ReadinessGauge" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Gauge, ArrowLeft, Target, Award, ShieldAlert, CheckCircle2 } from "lucide-react" +import Link from "next/link" + +export default function ReadinessPage() { + return ( +
+ {/* Navigation Header */} +
+

+ + Exam Readiness Analytics +

+

+ Real-time algorithmic prediction of your readiness percentage for JEE & NEET based on speed, accuracy, and test history. +

+
+ +
+
+ +

+ Overall Readiness Index +

+ +
+ + {/* Subject Confidence Breakdown */} + +

Subject Confidence Matrix

+
+ {[ + { subject: "Biology / Maths", score: 82, color: "bg-[#00F0FF]", status: "High Readiness" }, + { subject: "Chemistry", score: 74, color: "bg-amber-400", status: "Moderate Readiness" }, + { subject: "Physics", score: 61, color: "bg-red-400", status: "Needs Intensive Drill" }, + ].map((sub) => ( +
+
+ {sub.subject} + {sub.score}% • {sub.status} +
+
+
+
+
+ ))} +
+ +
+ +
+ +

+ Readiness Boosters +

+
    +
  • + + Complete 2 Full-Length Mock Tests this week. +
  • +
  • + + Clear 15 pending errors in Physics error queue. +
  • +
  • + + Maintain a 7+ day study streak. +
  • +
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/strategy/page.tsx b/src/app/dashboard/ai-coach/strategy/page.tsx new file mode 100644 index 0000000..53a53bd --- /dev/null +++ b/src/app/dashboard/ai-coach/strategy/page.tsx @@ -0,0 +1,41 @@ +"use client" + +import { ExamStrategyCard } from "@/components/AI/ExamStrategyCard" +import { StudyTimeOptimizationCard } from "@/components/AI/StudyTimeOptimizationCard" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Zap, ArrowLeft, Clock, Target, Lightbulb, CheckCircle2 } from "lucide-react" +import Link from "next/link" + +export default function StrategyPage() { + return ( +
+ {/* Navigation Header */} +
+

+ + Exam Strategy & Time Optimization +

+

+ Master time allocation per question, eliminate negative marking traps, and fine-tune your subject sequence for maximum score yield. +

+
+ +
+ +

+ Exam Day Time Strategy +

+ +
+ + +

+ Study Time Optimization +

+ +
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/study-plan/page.tsx b/src/app/dashboard/ai-coach/study-plan/page.tsx new file mode 100644 index 0000000..bdbd732 --- /dev/null +++ b/src/app/dashboard/ai-coach/study-plan/page.tsx @@ -0,0 +1,66 @@ +"use client" + +import { StudyPlanCard } from "@/components/AI/StudyPlanCard" +import { WeeklyProgressReport } from "@/components/AI/WeeklyProgressReport" +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Calendar, ArrowLeft, BookOpen, Clock, Target, CheckCircle2 } from "lucide-react" +import Link from "next/link" + +export default function StudyPlanPage() { + return ( +
+ {/* Navigation Header */} +
+

+ + Personalized Daily & Weekly Study Plan +

+

+ AI-generated task schedule dynamically tailored to fix your weak areas and maintain optimal syllabus coverage. +

+
+ +
+
+ +

+ Today's Action Plan +

+ +
+ + +

+ Weekly Syllabus Target +

+ +
+
+ + {/* Sidebar Info */} +
+ +

+ AI Scheduler Rules +

+
    +
  • + + High-Yield Prioritization: Focuses extra time on topics with heavy exam weightage. +
  • +
  • + + Error Interleaving: Integrates recent incorrect questions directly into study blocks. +
  • +
  • + + Burnout Prevention: Recommends 10-minute micro-breaks between intensive problem sets. +
  • +
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/time-optimization/page.tsx b/src/app/dashboard/ai-coach/time-optimization/page.tsx new file mode 100644 index 0000000..4104385 --- /dev/null +++ b/src/app/dashboard/ai-coach/time-optimization/page.tsx @@ -0,0 +1,25 @@ +"use client" + +import { StudyTimeOptimizationCard } from "@/components/AI/StudyTimeOptimizationCard" +import { ArrowLeft, Clock } from "lucide-react" +import Link from "next/link" + +export default function TimeOptimizationPage() { + return ( +
+
+

+ + Study Time Optimization +

+

+ Detailed metrics on your productive hours and stamina blocks. +

+
+ +
+ +
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/tutor/page.tsx b/src/app/dashboard/ai-coach/tutor/page.tsx new file mode 100644 index 0000000..ca695a3 --- /dev/null +++ b/src/app/dashboard/ai-coach/tutor/page.tsx @@ -0,0 +1,13 @@ +"use client" + +import { TutorChat } from "@/components/AI/TutorChat" + +export default function TutorChatPage() { + return ( +
+
+ +
+
+ ) +} diff --git a/src/app/dashboard/ai-coach/weekly-progress/page.tsx b/src/app/dashboard/ai-coach/weekly-progress/page.tsx new file mode 100644 index 0000000..3dab57b --- /dev/null +++ b/src/app/dashboard/ai-coach/weekly-progress/page.tsx @@ -0,0 +1,25 @@ +"use client" + +import { WeeklyProgressReport } from "@/components/AI/WeeklyProgressReport" +import { ArrowLeft, Target } from "lucide-react" +import Link from "next/link" + +export default function WeeklyProgressPage() { + return ( +
+
+

+ + Weekly Progress Overview +

+

+ Track your syllabus completion goals and weekly milestones. +

+
+ +
+ +
+
+ ) +} diff --git a/src/app/dashboard/dpp/page.tsx b/src/app/dashboard/dpp/page.tsx index cb81c7a..00c32f4 100644 --- a/src/app/dashboard/dpp/page.tsx +++ b/src/app/dashboard/dpp/page.tsx @@ -2,7 +2,7 @@ import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" -import { BrainCircuit, Play, CheckCircle2, Download, Filter, Lock } from "lucide-react" +import { BrainCircuit, Play, CheckCircle2, Download, Filter, Lock, FileText, Eye, ShieldAlert, X, Sparkles } from "lucide-react" import { useEffect, useState } from "react" import Link from "next/link" @@ -14,6 +14,7 @@ export default function DPPPage() { const [attempts, setAttempts] = useState([]) const [loading, setLoading] = useState(true) const [dateFilter, setDateFilter] = useState("") + const [selectedPdfDpp, setSelectedPdfDpp] = useState(null) useEffect(() => { async function fetchDpps() { @@ -76,6 +77,16 @@ export default function DPPPage() { return new Date(dateStr).toLocaleDateString("en-US", { year: 'numeric', month: 'short', day: 'numeric' }); } + const getPdfUrl = (title: string) => { + const t = title.toLowerCase(); + if (t.includes('phys')) return '/dpps/dps-phy-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('chem')) return '/dpps/dps-che-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('math')) return '/dpps/dps-mth-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + if (t.includes('bio')) return '/dpps/dps-bio-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + // Default fallback + return '/dpps/dps-phy-ch4-20260707.pdf#toolbar=0&navpanes=0&scrollbar=0'; + }; + return (
@@ -181,27 +192,111 @@ export default function DPPPage() { ) : isAttempted ? ( <> - - + + {!isExpired && ( - - + + )} ) : ( - - - + ) : ( + + + + ) )}
)})}
+ + {/* ── PROTECTED PDF READER MODAL (FREE TIER) ── */} + {selectedPdfDpp && ( +
+
+ {/* Modal Header */} +
+
+
+ +
+
+

+ {selectedPdfDpp.title} + + Protected In-App PDF View + +

+

+ {selectedPdfDpp.difficulty} Level • {user?.target_exam?.replace("_", " ") || "JEE/NEET"} Practice Sheet +

+
+
+ +
+ + {/* Security Notice Banner */} +
+ + Read-Only Mode (Free Tier) — Downloads, text copying, and sharing are restricted. + + + + +
+ + {/* Protected PDF Document Sheet Content (select-none) */} +
e.preventDefault()} + className="flex-1 w-full h-full min-h-[60vh] select-none bg-[#525659]" + > + +
+ + {/* Modal Footer */} +
+ + šŸ“„ PragatiVeer Protected PDF Reader v2.0 + +
+ + + + +
+
+
+
+ )}
) } diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx index 9a2e18a..170a1f2 100644 --- a/src/app/dashboard/layout.tsx +++ b/src/app/dashboard/layout.tsx @@ -1,7 +1,7 @@ "use client" import { ReactNode, useState, useEffect, useRef } from "react" -import { BookOpen, LayoutDashboard, Settings, FileText, Activity, LineChart, Trophy, LogOut, User, ChevronUp, Lock } from "lucide-react" +import { BookOpen, LayoutDashboard, Settings, FileText, Activity, LineChart, Trophy, LogOut, User, ChevronUp, Lock, ShieldAlert, Flame, Target } from "lucide-react" import Link from "next/link" import { usePathname } from "next/navigation" import { LanguageToggle } from "@/components/LanguageToggle" @@ -13,13 +13,30 @@ import { AITutorChat } from "@/components/AI/AITutorChat" import { useActiveUser, DEMO_USERS } from "@/hooks/useActiveUser" import { StreakOnboardingModal } from "@/components/Dashboard/StreakOnboardingModal" import { Badge } from "@/components/ui/badge" +import MaintenanceScreen from "@/components/MaintenanceScreen" export default function DashboardLayout({ children }: { children: ReactNode }) { const pathname = usePathname() const [dropdownOpen, setDropdownOpen] = useState(false) const dropdownRef = useRef(null) - const { userId, user, switchUser, hasAccessTo, loading } = useActiveUser(); + const { userId, user, globalSettings, switchUser, hasAccessTo, loading } = useActiveUser(); + const [maintenance, setMaintenance] = useState(false); + const [checkingMaintenance, setCheckingMaintenance] = useState(true); + + useEffect(() => { + if (globalSettings !== undefined && globalSettings !== null) { + if (globalSettings.maintenance_mode) { + setMaintenance(true); + } else { + setMaintenance(false); + } + setCheckingMaintenance(false); + } else if (globalSettings === null && !loading) { + // If we finished loading but settings failed to load + setCheckingMaintenance(false); + } + }, [globalSettings, loading]); // Close dropdown when clicking outside useEffect(() => { @@ -35,15 +52,22 @@ export default function DashboardLayout({ children }: { children: ReactNode }) { const userInitials = user ? user.name.split(" ").filter(n => /^[a-zA-Z]/.test(n)).slice(0, 2).map(n => n[0]).join("").toUpperCase() : "DS" const targetExamLabel = user?.target_exam === "JEE_Main" ? "JEE Main" : user?.target_exam === "JEE_Advanced" ? "JEE Advanced" : user?.target_exam === "NEET" ? "NEET" : "NEET/JEE" - let daysLeft = null; - if (user && user.created_at) { - const createdDate = new Date(user.created_at); - const msPerDay = 1000 * 60 * 60 * 24; - const daysElapsed = Math.floor((new Date().getTime() - createdDate.getTime()) / msPerDay); - daysLeft = Math.max(0, 15 - daysElapsed); - } else if (user && user.tier === 'Free') { - // Mock value for demo Free tier if no date - daysLeft = 14; + let daysLeft: number | null = null; + const trialDays = globalSettings?.trial_duration_days !== undefined ? globalSettings.trial_duration_days : 15; + const trialEnabled = globalSettings?.enable_free_trial !== undefined ? globalSettings.enable_free_trial : true; + + // For the demo, treat both Free tier and Neha as Trial users so the banner appears + if (user && (user.tier === 'Free' || user.id === DEMO_USERS.NEHA.id)) { + if (!trialEnabled) { + daysLeft = 0; + } else { + // For demo purposes, we ignore created_at and just show the exact days set in the admin panel + daysLeft = trialDays; + } + } + + if (maintenance) { + return ; } return ( @@ -61,7 +85,6 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
} label="Overview" active={pathname === "/dashboard"} /> } label="Target DPPs" active={pathname.startsWith("/dashboard/dpp")} /> - } label="Syllabus Tracker" active={pathname.startsWith("/dashboard/progress")} /> } label="Leaderboard" active={pathname.startsWith("/dashboard/leaderboard")} />
@@ -69,6 +92,13 @@ export default function DashboardLayout({ children }: { children: ReactNode }) { Pro Tier

+ } + label="Syllabus Tracker" + active={pathname.startsWith("/dashboard/progress")} + isLocked={!hasAccessTo("chapter-wise-progress-tracking")} + /> } @@ -95,7 +125,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) { icon={} label="Doubt Forum" active={pathname.startsWith("/dashboard/community")} - isLocked={!hasAccessTo("ask-doubts-from-tutors")} + isLocked={!hasAccessTo("doubt-resolution-community")} />
@@ -104,19 +134,75 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {

} - label="AI Coach" - active={pathname.startsWith("/dashboard/ai-coach")} + label="AI Tutor" + active={pathname.startsWith("/dashboard/ai-coach/tutor") || pathname === "/dashboard/ai-coach"} isLocked={!hasAccessTo("ai-tutor-chat")} /> } + label="PrepPilot AI" + active={pathname.startsWith("/dashboard/ai-coach/cbt-dpp")} + isLocked={!hasAccessTo("ai-tutor-chat")} + /> + } + label="Exam Readiness" + active={pathname.startsWith("/dashboard/ai-coach/readiness")} + isLocked={!hasAccessTo("detailed-performance-analytics")} + /> + } - label="Rank Predictor" - active={pathname.startsWith("/dashboard/rank-predictor")} + label="College Predictor" + active={pathname.startsWith("/dashboard/ai-coach/college-predictor")} isLocked={!hasAccessTo("college-predictor")} /> + } + label="Exam Strategy" + active={pathname.startsWith("/dashboard/ai-coach/strategy")} + isLocked={!hasAccessTo("exam-day-strategy")} + /> + } + label="AI Study Plan" + active={pathname.startsWith("/dashboard/ai-coach/study-plan")} + isLocked={!hasAccessTo("personalized-study-plan")} + /> + } + label="Study Time Optimization" + active={pathname.startsWith("/dashboard/ai-coach/time-optimization")} + isLocked={!hasAccessTo("personalized-study-plan")} + /> + } + label="Mistake Heatmap" + active={pathname.startsWith("/dashboard/ai-coach/heatmap")} + isLocked={!hasAccessTo("ai-mistake-tracking")} + /> + } + label="Weekly Progress" + active={pathname.startsWith("/dashboard/ai-coach/weekly-progress")} + isLocked={!hasAccessTo("detailed-performance-analytics")} + /> + } + label="Mistake Analyzer" + active={pathname.startsWith("/dashboard/ai-coach/mistakes")} + isLocked={!hasAccessTo("ai-mistake-tracking")} + />
@@ -179,17 +265,33 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {

- {user ? `Welcome back, ${user.name.split(" ")[0]}! šŸ‘‹` : "Welcome back!"} + {user ? `Welcome back, ${user.name.split(" ")[0]}!` : "Welcome back!"}

{user && ( {targetExamLabel} Target )} - {daysLeft !== null && user?.tier !== 'Al_Coach' && user?.tier !== 'Pro' && ( - - {daysLeft} Days Left in AI Coach Trial - + {(user?.tier === 'Free' || user?.id === DEMO_USERS.NEHA.id) && daysLeft !== null && ( + daysLeft > 0 ? ( + + + {daysLeft} Days Left in Trial + + Upgrade Now → + + + + ) : ( + + + Trial Expired + + Upgrade Now → + + + + ) )}
@@ -209,6 +311,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) { onChange={(e) => switchUser(e.target.value)} className="bg-secondary border border-border text-foreground px-2.5 py-1.5 rounded-xl text-xs font-bold focus:ring-2 focus:ring-[#00F0FF] outline-none cursor-pointer hover:bg-secondary/80 transition-colors" > + diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index ad273a2..d2484e7 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -42,7 +42,7 @@ export default function DashboardPage() { Upgrade to Pro

Unlock Unlimited DPS & Mocks

- You're currently on the Free Tier. Upgrade to Pro for ₹2499/year to access unlimited Daily Practice Sheets, weekly CBT tests, and advanced analytics. + You're currently on the Free Tier. Upgrade to Pro for ₹3499/year to access unlimited Daily Practice Sheets, weekly CBT tests, and advanced analytics.

+ + - -
- -
Estimated NEET (UG) AIR
-
- ~14,500 -
- -
-
- -
-
On the Right Track
-
Your biology and chemistry scores are securing a top 20k finish.
-
+ {/* Main Grid */} +
+ + {/* Left Interactive Simulator */} +
+ +
+

+ Mark Simulator +

+ Drag Sliders to Adjust
-
- -
-
Physics Bottleneck
-
Pushing Physics beyond 120 marks will breach the top 5k rank.
-
-
-
- - - + {/* Physics Slider */} +
+
+ Physics Score + {physics} / {maxPhysics} +
+ setPhysics(Number(e.target.value))} + className="w-full h-2.5 bg-secondary rounded-lg appearance-none cursor-pointer accent-[#00F0FF]" + /> +
+ + {/* Chemistry Slider */} +
+
+ Chemistry Score + {chemistry} / {maxChem} +
+ setChemistry(Number(e.target.value))} + className="w-full h-2.5 bg-secondary rounded-lg appearance-none cursor-pointer accent-amber-400" + /> +
+ + {/* Bio / Math Slider */} +
+
+ {exam === "NEET" ? "Biology Score (Botany + Zoology)" : "Mathematics Score"} + {bioOrMath} / {maxThird} +
+ setBioOrMath(Number(e.target.value))} + className="w-full h-2.5 bg-secondary rounded-lg appearance-none cursor-pointer accent-emerald-400" + /> +
+ +
+ Simulated Total Score + {totalScore} / {maxTotal} +
+ + + {/* AI Strategy Insights based on Score */} +
+ + +
+

Strongest Domain

+

+ Your Biology/Math score ({bioOrMath}) provides solid rank leverage. Keep maintaining your revision momentum. +

+
+
+ + + +
+

High-Yield Growth Zone

+

+ Increasing Physics by just 25 marks will boost your rank by approximately ~4,800 positions. +

+
+
+
+
+ + {/* Right Output Dashboard */} +
+ + {/* AIR Display Card */} + +
+ +
+
Estimated All India Rank
+
+ AIR ~{predictedRank.toLocaleString()} +
+
+ High Accuracy Confidence +
+
+ + {/* College Admission Probability Table */} + +

+ College Admission Chances +

+ +
+ {colleges.map((c) => { + const isLikely = totalScore >= c.minScore + const chancePct = Math.min(99, Math.max(10, Math.round((totalScore / c.minScore) * 85))) + return ( +
+
+ {c.name} + + {isLikely ? `${chancePct}% Likely` : "Reach Target"} + +
+
+ {c.category} + Cutoff Score: {c.minScore}+ +
+
+ ) + })} +
+
+ +
+
) } diff --git a/src/app/dashboard/settings/page.tsx b/src/app/dashboard/settings/page.tsx index 8ce64d7..b535e00 100644 --- a/src/app/dashboard/settings/page.tsx +++ b/src/app/dashboard/settings/page.tsx @@ -48,7 +48,7 @@ export default function SettingsPage() { formData.append("file", file); try { - const res = await fetch(`/api/users/${userId}/upload-avatar`, { + const res = await fetch(`/api/users/${userId}/avatar`, { method: "POST", body: formData, }); diff --git a/src/app/disclaimer/page.tsx b/src/app/disclaimer/page.tsx new file mode 100644 index 0000000..d98093b --- /dev/null +++ b/src/app/disclaimer/page.tsx @@ -0,0 +1,87 @@ +"use client"; + +import { PublicLayout } from "@/components/Landing/PublicLayout"; + +export default function DisclaimerPage() { + return ( + +
+
+
+
+

PragatiVeer Disclaimer

+

Gyannetra Pvt Ltd

+
+

Last Updated: 27 July 2026

+

Version: 1.0

+

Document Ref: PV-LEG-DIS-001

+

Applicable To: PragatiVeer website (pragativeer.com) and associated services.

+
+
+ +
+
+

1. General Information

+

+ The information provided by Gyannetra Pvt Ltd ("we," "us," or "our") on the PragatiVeer website (the "Site") and our mobile application is for general informational and educational purposes only. All information on the Site and our mobile application is provided in good faith; however, we make no representation or warranty of any kind, express or implied, regarding the accuracy, adequacy, validity, reliability, availability, or completeness of any information on the Site or our mobile application. +

+

+ UNDER NO CIRCUMSTANCE SHALL WE HAVE ANY LIABILITY TO YOU FOR ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF THE USE OF THE SITE OR OUR MOBILE APPLICATION OR RELIANCE ON ANY INFORMATION PROVIDED ON THE SITE AND OUR MOBILE APPLICATION. YOUR USE OF THE SITE AND OUR MOBILE APPLICATION AND YOUR RELIANCE ON ANY INFORMATION ON THE SITE AND OUR MOBILE APPLICATION IS SOLELY AT YOUR OWN RISK. +

+
+ +
+

2. Educational and Test Preparation Disclaimer

+

+ PragatiVeer provides simulated Computer-Based Tests (CBT) and Daily Practice Problems (DPP) intended to assist students in preparing for competitive exams like NEET and JEE. However: +

+
    +
  • No Guarantee of Results: We do not guarantee admission to any college, university, or program, nor do we guarantee specific scores or ranks on any competitive exam.
  • +
  • Not an Official Body: PragatiVeer is not affiliated with, endorsed by, or sponsored by the National Testing Agency (NTA), the Joint Seat Allocation Authority (JoSAA), or any other official examination conducting body.
  • +
  • Dynamic Content: Exam patterns, syllabi, and guidelines are subject to change by the official conducting bodies. While we strive to keep our content updated, we cannot guarantee that our materials perfectly reflect the most current official exam patterns at all times.
  • +
  • AI Predictions: Any predictions made by our AI Coach (such as "Expected Score" or "Estimated AIR") are based on historical data and probabilistic models. They are estimations for motivational and tracking purposes only and should not be considered definitive forecasts of actual exam performance.
  • +
+
+ +
+

3. External Links Disclaimer

+

+ The Site and our mobile application may contain (or you may be sent through the Site or our mobile application) links to other websites or content belonging to or originating from third parties or links to websites and features in banners or other advertising. Such external links are not investigated, monitored, or checked for accuracy, adequacy, validity, reliability, availability, or completeness by us. +

+

+ WE DO NOT WARRANT, ENDORSE, GUARANTEE, OR ASSUME RESPONSIBILITY FOR THE ACCURACY OR RELIABILITY OF ANY INFORMATION OFFERED BY THIRD-PARTY WEBSITES LINKED THROUGH THE SITE OR ANY WEBSITE OR FEATURE LINKED IN ANY BANNER OR OTHER ADVERTISING. WE WILL NOT BE A PARTY TO OR IN ANY WAY BE RESPONSIBLE FOR MONITORING ANY TRANSACTION BETWEEN YOU AND THIRD-PARTY PROVIDERS OF PRODUCTS OR SERVICES. +

+
+ +
+

4. Testimonials Disclaimer

+

+ The Site may contain testimonials by users of our products and/or services. These testimonials reflect the real-life experiences and opinions of such users. However, the experiences are personal to those particular users, and may not necessarily be representative of all users of our products and/or services. We do not claim, and you should not assume, that all users will have the same experiences. YOUR INDIVIDUAL RESULTS MAY VARY. +

+

+ The testimonials on the Site are submitted in various forms such as text, audio, and/or video, and are reviewed by us before being posted. They appear on the Site verbatim as given by the users, except for the correction of grammar or typing errors. Some testimonials may have been shortened for the sake of brevity where the full testimonial contained extraneous information not relevant to the general public. +

+

+ The views and opinions contained in the testimonials belong solely to the individual user and do not reflect our views and opinions. We are not affiliated with users who provide testimonials, and users are not paid or otherwise compensated for their testimonials. +

+
+ +
+

5. Contact Us

+

+ If you have any questions about this Disclaimer, please contact us at: +

+
+

Gyannetra Pvt Ltd

+

Email: contact@pragativeer.com

+

Phone: +91 9079337961

+

Address: OFF NO 201, 2ND FLOOR, SAI EMPIRE, S NO 183/1/2, Baner Gaon, Haveli, Pune - 411045, Maharashtra, India

+
+
+
+
+
+
+
+ ); +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9ad7454..0138b2a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; +import Script from "next/script"; import "./globals.css"; const geistSans = Geist({ @@ -30,7 +31,9 @@ export default function RootLayout({ suppressHydrationWarning > -