wsg$-Ql|F0iMqam=O
+z%DVx-o}}QZ<`o69IeaArwjj?H>3$&!k8?I5!?h0@0S-CQVoe0{mTFc^^1>+zd{RYA
+zKlqls+AsQ+YKhv&>rp|dV3gXyU7kAWCSW@ZYsw-sCNwwYWk&F2ZRS<>y
+zj)HZ#cEv_iA3rv&72jdK09~xk;i9k6*q~4s!`Djt{OI|R4Yte+T4kZDmubhUOj;nb
+z0_uB$vl+D{M6{u9xNs?VswYF>Z*h;%Axmz-OK;xy#}4d1GE)CgEdt2mTfg$pi)Y81
+zYatuw8nyHf4-flTKd#U_Fl@sh#sWendcstxL*vNJw8>GE6yU(Ckr@PWBU&JIwnk2L
+zn&X#&PWWk3vW354J+Su^zl20Ln!Ci+?8m-;FJ};35_ShPwR}m*Ai34k=x1)T2JBbuYaJBF%A2r$8qI~x
+zWbnqloIJg+u6uY7%aCYS94uHVefE2Hsi%eVG9oAd1$p}i*WC#Ge(wonMie8=F{lAD
+zv$0OS`!8ojo??KI$8e+f#)o>ZRV(ihCP&D7_zc*NP?`X%&eCw_kt;OBM3n5{G6|in
+z3qOy)ovsK>52pO(vNRv+kGHXCgXGNjk`ufnoj02@j)*iIQ%v(VG4&-2z9GfdnWsF2
+zTm~l$k0duPfK@x+6E=2^uZ)=x{~$xN+8{Z^;rvfe9qr)rHmn?D8cdrsLJcdQgUNzB
+zO7#mCF2(DYSQ?Wl4bvjUZYOrEq%}Z)($A`lqb}iXsnB%7
+znn(w??`!XG;F*|gL{blnN}Vi1p@GTiWp9z3dX!9?V~v$v@YQ;T&1#**A`i-^-bL~j
+zX>SUG1yS}dtweTq^<;TXiZ%2Pr4FUw_o|Y=p{!Njse;UmBTnKj6$vk=f~Jf&G{*hz
+zUPkm5Al|WZ=#c?yGLJi59(Fn(}q}0X>+i#C!_&BU{g9S&^_y<66zV9ip
+zC>6{qI-;*2&>5I0Ko0#-)=D>9DR>~jQU&Z*RmwATRY7BTO&pk*UkFT`Fp&*Uc>H7%
+ztZF=DLDF#|T#PlxQYDU#D5g0WErGoF1K5U(gVA7hV~nw^{aCWG11pD!9-u?k0RB4r
+z?_*?_-(XRl-IMjph+@C)Bg_L1lRRMA1neUH`)nLDKv>B@X_AG$(qj=UP2%7vx0YjI
+z!;ccGxv21lPwt`*n@sxBuDcplY#?GIg+4xey{WDEt|U+T!0K-YD&!V!qD+@V09ilh
+zY3+_>3Ysmnd+m?~PXphSua(>EjI&!^2X|n&IfMXv94vPG{qIir4cWB@_HN?yQ&!j0
+z`9>q1j1Pp3VrkC8v8(jxEMTIEJ5fhR4`e2W7p1HMSXoBj>%ta|Q*2Nl@K4SaBQ?J>
+zm(0f5XV|;cXe@nb1%lM&*`
+z`i}484tejy
+zoI{orl~V+wLl~DK{%Ce(3w_4gzC--y$9Zf(k=yBFVX7=|)ht>WU5wH%fNhCFOUnHZ
+z#AL}(q8x&qN0KaX9Qf*-$fMtF6|S&cL3MBQgI*P$*G05%?3U)3(R*Zn$O=aNx_@~u
+z=;}UGpwy#3U;cRBcQ5WogHx~vhL5_6@X}?;wfo{TgTfYt-R^N7>~2fp&OS>xB_+{q
+zAU>~SMOnSy7Z})W>;tP9#}hVA^qkAg>?y?;$HrLmomwni3VljyjkPwN20KQdXZ?z5
+z7k9&r>mlk{y%fV1M0$U$T+H^_>M2z&sBy^A+L>RPHGJJjA=M8q?3)jRFB07-`|1&3
+zKM7-Z5VThAqzlN>C+o
+z>m_FiKPtu*9W}pV-na~d77y1BC17r6qzEA+Pi`m!+*(YDFT+PHp4xBIR~V<3zYn^j@%!4te<0Af=@!9MGnz;|we%OyZ6%@L05;x*@g=t1TpMIt+
+zkY3WC*5#dKwfUu@S%reseVkTR2uj4(C>*M^-^mNUK1&XjaCYl
+zx5&2+RO~Dox*J!3*O)PFib!DDUp5g){Q`FZ4qhLhq&aVAM&pRxi$MqtS>QvBHy9c|
+z$B7e(LdqWiZo$KP@4oes`3?KO$o_!)=nSeS#
+zQ}J&$^;q{<@fSICI_8e<3?a37V3pxM$ie4=g)*?a3&WtS$|1)b2_^XSdA3mE=%`}a
+z_A!tJ<7$Q+a7=*hz(U=onMA!r*=!8mh6C#-brztYy+A9VgP|6-fW8ay6obu2oGd)
+zKzqiMn_qM^li29h35)yS)W_oun`}%>$K46rFj3d2b_f&9Pv+mHybQzK*zSAz|CT$}
+zX8%r+7~5N(LHb*3zj+p17^h_FPCSo9R8S;3IQ*5gEfMcAaJbt0oL%WP_mXM-d8yy_
+zqelI`_9G!hrz~S4T=~lkSg4Bnw>Dudf#0MzQ5ymnM%eGm!cvXah%0{XrU3Sg^_6?(Q~0(Y=7F9v5DJK|&d~nG*2{W1)`M&_8)g#4bgiR>3p1b8ohTsj
+zCwo&*+@1nixvxN8g^G=I&Jn2(atyD{aASQi2!!_OW`0*U`!NbcM{=c3iF6NQOT_Qa
+z<9*z5q6Nz9Z)gdOwDtZIR;R}5XKBwzNzEkO#+>YH)}EaBzv+uxd4cZR^Hby#E14OYcmubDTl
+znn|eLjxGy6sa|^0mKZ0_UKvNFoPNCLvsDs+MuJMKh8XF3*t9K5HpXo8#YSw$GZkjR
+zxka)+A6_IMGZs9#L0gIRl~cX?hkIj!%^W3Ba5TF=sF^lryLykFl6y%48^h$A_1%*S
+zQgky2R>^o#yDy)4!Sp>E)*mSamzwW0L5UVL00zXoaT*CzdhT-)NDi4U$T~hbShWwj
+zA$?IXG|jQ6;EcRKsLl^PvtKl6<=olf4+flSWG4FgS}_dGj@E$8vnIu&xen**U!qJ
+z5&`ntZJ{+38?xy(sd1gVQV710dQP2|aa;H(HyroB1Y4tvw~EsLx<2Q&sdN1ekp1sJ
+zUXqZDAe7`$@h%7P4RYEH;rc2y=7rl$VrctsG?sb)9d>^eo@0NQLD-xs#)ldqz@P${
+zU$U*^Jg}(N`68WN|9+4X5_ClzqL9FE`ZVxNBDOb)I%6J2>y+)w2?RtT%-Ljj2iQe~
+z7Q(cN7aV>5`yca`=E7Unm-=Tbj^2nl;u|Q=?j8RN5l`-&y?Jd+c2gjU)mzFXby$GF
+z#^Rf)a-rwCAi3RUxHsZGtou{_J{~qSqn{4m4tYt3fY9$p_t7DAYCo0vq`h(*ss<3b
+z4$m>~%X0gv7UnIXps_r$k<~Kz(-zz2en=%4-o_ISwZ_84NBJ`bWFp#666BwrPdR!6r
+zC7nC|PY@(+;`Cc9MGtH(+9*}FQaQG*Hl{0c3z08#_GZ8MoNe}dq@?wrWJ3>m9v0s@oi62?9yl9pY49U{=rM8-7Ln~Q2Up(}t_@O
+zJ^qdrv_!5yA?g_hg!qBF5E&F5z^x^?fe~sUcof_dU@^@D1CBz8nnLI*_WcWi%dLZ$
+z#lT_0SDMMAit*oqK&7-_=`R(q?}bfFW$&IQz`A+<#8bL)TGWREaSSRIBc`XjU2db-
+zvox>0bnyJT;eLhsYF>enLrzc1k=u8jFHsweY#Ck=fU%o4Hira-iJc5vFfSnc>JPyC
+zg^Yi>5E@JWIvd=oMj=xjYAn-_o)@Jrz9`6Q_CvyyUb9G6pk3C;A1l>5-QZEBXyxgn
+zg?LPw)h9Nogc`Bd0Liu584|tfI%7uBcH4M(C@ke;81vVq
+z5}$Z0619ruYH#bD%TN+XvU{`PY~&x3ojd)+}5H8j(>-jao
+zo~7`(O6~s^V&26~u&Y3a*(4c^-TOn*O6koSAa8}_jx7vkQ(vvq0=ZxqUmNyJthHdM
+zUz@zXyhC->vt!AQ=gMs{Q0YDCgtA_<)!Fe6)jq%5tU&U{#R
+zKXYqy0)}}VM<&EVyA=wW&XcdB6D|Pc!A(Zde!V*w-1=^5b;&p&KQ-TdE+1r}@&`DN
+z#Q06clijD-(3d97E3l>Esv(DjHuh6b_Ot6cqn^mlSU?r3u$;QIG!x#Kemr(6{6zvD
+z!(y>tuBS_qYtaEV>@$5}H7-HGk9*IMz;pI#D0L9Oz;9o9F`quE-^`L$c$1av;d1ND
+zU3lduOo`xeN~6aOo8(YkK0TREAUq#j`(tBx_L=rA?0vU}k5f7P1A{b<#uej>cTga;
+z!Glk*ACW$L#Iy!@;9qO(6!(u2T!5jq^43fOw4UUp)YW3}tC}6JarCJP&
+z(fAg*#M~64d6A)sA(v+>>Bxo!a;}wr^5gd2h+P8dpD{l5PT~&A;E*5?S|6osra57c2AUAdB-i
+zYI{Y`6M2AOAh}~D7QYKEt0C#ic5
+zW}IU&z>ayo@teSZn`AYMuC9d=QOQ%59o&WhiMC?)W2KOz%nJ;z{_rU&RA)?=ljQAA3iw*q)SNaK%r`SS@m70$3JUgR{)aQzVGxRq`s6
+zoVWCS1I<=cKys=6cZqzRP$L#)ygp>}eSB2@5OoPJ`LWdDt`#=)
+zYc>3j74ijqZ`(g~cOuwZfzlMhu0hMU>p*iYSlJcbD}Qg4mPl1X_f`@yqQ)bX!pKb-
+zZvdTBwm*5jc_tupq8AH$52`8NbPEM|N=*?EF5(<0pnE6PIu2jXh$xaZz4VuHSh%s7
+z_mT(^0%vctcf-@(06J5bHw1!D;S~y`J)k+S3V##^X9p?RAjd^yd1*iH@f!HY!=f|<
+zfDrSNYE*029VbAZskm%XS@#for*;R=w4Bw($xdXS^RVl2fUdJGE2qdk;NaFGQfUW2
+ze5b>{>Bd%Gd}~3>h}!7gyw_qOl6ARVnlT)+(6h3Vi{ay#98-+X-(?&I#T(kc>I#c6
+zx2_pm}%evqWp2uVU{g2KV{uf4P~ud6B#a
+zgpn4=BcJopWcNymn#H78BH&e0JQQ;
+z5~pP%8lA-+D{%d!1p^cWkaYW?i;FDbzNkiV4c4$%BvG%#)Uu|<`p1+
+zAT+NYVhCC7y^XD-BAG|W1+5ytYRMKBsRs4E$bDKhT94T=jJG9N4@rOpFWF&Zgx#q!
+zU06pw*R=yOvW_caoD}YP{{ZvqHMfO2Tb04WJL3r(aW2QemNAV+uQZI*s|)mt7SK^^
+zf@lK8E-)_#%aEC7*{Rq6YP7+%hr^NoY9_sA=6FjvjWKxiNt(!??$WW*$95{Q6BL&T
+zb7*SJ0~+?3pJte!bZ$g>&B)(WDNBC`c1*2U#|{s}^!NRV<}esO>hBp*GVdGuHnUtG
+zCg##LUd|7fg1Q}8KI|W1s4GU0*SPxnv#WD(wCZtZYxs1W#0{j9a>s_11EmWx!;p1+
+zp@aq*fyMHl#(CH_CfmR8CtnxJF??e)Vk5RK(q<=klt%V3iTNvS
+zQ77jQOJ1&fmEBKXNK2r^0m!acMaOjDTpfzDpvE!h=g(7f06Rihl-;&oVPk%!C!Y(l
+zI+=sYba@+G-k(7F?#bIBAE31O8P6iV5f&vAr_o;RMfdPs$bCu+#DKX{ec7dh+&7ES
+zudp9^UbQ!@0#tA4wgCGEV7%Bps`yx9oS#9*j(Z~?%UT|?A*M1<0
+z0i|{YMIt6YSg?F8U=;aXpKB2{KFc+rL;zBlk;(%+8TIwVcrb8*
+zhV~O0G>g~bSYli|Zns>S27Y`C9D~{+N75|aWC0d?V3*1uGl})jKrVrT&-ChGq0R|g
+zmn?_e0kSFe8CMEe=r_YzhW$*KZLHWNXA
+zx={*=*@<*&`TAyr!4
+zqhO&b*}&Mj?L(R+O>7L)Oho%Lou*!K#tkK3y<+`;$sX5w_p|&u{NRkyq{%2zuG_O-
+z9m*7rgp&cf_#?L#yK`t-9~>u0^@kQX~%c7VO&izr7*P
+zM)h=+RmV^DDCyCmMr?mpc7;jl06{0D_)C3$`e)O3tQ;l@0?3%7MS_*@M;44}zp{57
+zPmCh|D`uLce(`7g0?5%$!FBl;K;P|PmD(KMGv)XF!DtYMk9;J&+_a2W#HJe9+)p5=
+zQkdEzU-HT<^GhbNOZ5VSE&m<=hQ3<3bIpYPNGKKKe-MD7rU5KMM8s-E))EC%LprN7
+zTxWE3DWjBa$n10wadaigLD8l9+rt5gt%a+l{9IsQZJTv%KZXs#ilHyeJ^%3Ma(co!
+zEQ87V3gm+!_G2^5qfp`cNg@>Ie`D7OEzW87Lt$#HupkSi+EXhm6=U%3nxy;gU1Q%_
+z!yCr)H_lFgqH}@;IpODQLQ9uvrJ~!9gI7PVks7#n?d)KLD+%WN*q5)G92&?Iu7{y%
+zP|g3>3qWy)N8XVYnB4Tx7J8lVugIb!)I@EOr8(@1@_(Ht4j{!a^v#`54oE#B
+zC(Tf^foe_106=QKvB((&7j~Q9ch|JzH86?LIJzye>mRTa
+zW!>@>3HJ?Q!^XJFuO+}n80Y)4K@i85rp3DMBX(f%IkAyK@X=WO^87}rDAOMY|Fb{<
+z$r~>Htr{;CDKTGS!Nz2eT^SwARiwbe#e`b;H2-$P%?U3@!TIgCoVfAXl*c3*ie;D%
+z)!zPw<^YC!Iu9?+AnJw^)(e9LCqHjJq8cg`cT<^>?GfhsanVbsfSPa4n3ySE2es7=
+zeW|#~83w|5fiw{Le%Um#b)M;(*fXT#WDYMC^ZwVZSo}4EvF3d#!Ng
+z10Z=OaJGNgo|!$vqC(ZIWtNmG!_?~=>$7j^xua-S=)R3*FSyWd<>=R!m?SonR)t
+z`IdICqT51>wT2S}25N>9$s3dDaofHReMt|U8uU2S1rBGXpRSE)0MIqlkWjIyd{%?#
+z8^hvG^Rjv}clLc_KxFT@xK6==%zJIjdbY{86CPbq;+`1Vi;?fyB{iEVav9Vr=PVt-H~+5V$box0eJAxzGIq)bn<}#PEtuWJej&f!1UrX(0jVyqQbq(}pBdh_4=F)inc%+(8txF7X87sjiOAkOI$wdo`QO7b<$;2NGW8c
+z9r6B4Hgfl>sT3HwnbagUwDO~gcrHFj0{b!Ylz{a^a*dA$@;9jh4*l;QlAlm6FT3?>
+z`%>l3)Hj=BQjjqP5FEUO(&t#&Dg7p^T$|$}kL|ZmtZw6-Ww-;w`wTog#5QS~fxQmw
+z8+RZDmu`5gFujrmz+=8~80BfCLM(Obe52wY#~iIySaI7O|4A_C+cEsd+y(=XtwRdz
+zr_|MYG}y{{PIzWqQEa434Swjn^clmLxZ;6!u6060{fROH7AuswQg6Pff^{?e(Wu=g
+z#1dBkE+mn81mzvZ7p&F!kb`pnVD8yPRDVAD5vKjq-P8{GglEVxB=6I>BE8Izk4VW)
+z=YcA)BdF#K-or
+zxxDpRu8`hAx8rN=3h}
+zgLa-USf2-{ttV;Pk<62zj{p>g2|wC+(sKGx>kXSNE3I@~CQND4-#Z8P{ucl()suOnu-#)S5y7?7j$9*Cuv)G}
+z0pouOp+H~n)wh(=c7_u+iYaW!rmq?7H-o$}VBW)Kxc7-$4D$`c^hyK@k}-BVv7_?O
+zZ*b4m?7oE92shYQuPt<+D(~XVt|~neNIOxK`vJ(cf25*j1eb#t#@7b`js0(=v4|OE
+zrSIwUrMCBi?Nj|(cd9=6dpw9HT?Hgi-{FkUiB-#Gke
+zczJ%yMvpoW`c2LEVo`Yan8%9Qva4ey8VoU0g!{43S!*LOcFx3
+zMryHfi+Y85Fy-!h0IJZj{R#^f%OY%4S;V6sLtYZv-VnM^8E;f4;MZ6Ea-Hk2iRLxz
+z`Lz!>q<_`bWCnQo0g#Vi16uTbT=5-E>FDwDOCgg0nR?&D@~#6i&n|@o3%c@@Z2NSW
+z(rd91YfX@uv99i6#K)_JrHktW_U-FoCMkRi^QX1mf&ubYtm9O{(d&wo0CCX(MvgZh
+zTic8kFI|m#U%x|+D|IiQa)cCeXhlUB_e_{EOw##&31(9UEMvxZOmZxHj+xz`%FqcI
+zSfsZs;n`)e-||}q82KDgiGRn${?*fX&+Y`m#_CoA!GhwWS*Z3L<3>4J+C@WOhIa&0
+zn`FA>eD4(Fr(m?CwDj_}ellxJud!OQK$+89G%&ZN+Bkj_SKiEan(zAY8}$YljY!`r
+z{JlnGyeI40(}5v*{i_?S$OI6L72ff`_tPhGr6{`290Jv5G8^w-(l-2{+%y>l^Q*A;
+z1uuYaZqlfMLpj~nxk=nT&SFLkJpa1lv1BJQQ5$uMcJyAvi>I%D80e;*t;a5Cs-aMUJYx{8l1KDT#6x3{{f%U7T88$N5@r@KejZL$%gD0U)1
+zT%#1vd=(Py+?VM{IgZ?JZ-V0yU^DL}qMLNbcB9s!drW$q&8Y@2_OSJe#-vV^(fQ8Z3Msa(Yow*SEt>F)`LqV6L&m_hylBr_
+zVI-L8fP6v6u69&~D9Ipf)DRaLXX8i)2X@$=;$kyqoW591a
+z@15d&vO~TMQ%8YrJy>%4dXbwj#J={M5o|}2ZZiV?+Tq>$oDEG+~(D3johGfi}X_F&1b*nkOq~uC6
+zbM4=Im`=!L((W;3DW{si9eYFGS3Ow1XofLG`U>|L{$x#aB@?QM*k)a4$A`ZdY>
+z03c1Q!20CkZre+dGiSu}C2V+c1V9+jr_a*$*mmVdiGE$_xV^fesZWBv2V$1*+;M6x
+zr^(znSlQgxYnu=wU$b|+Z{GqZt!ov;p(i%->)g^TddCI%lFq=V7yJ}Zk(_H5n{o6i
+zg=g1M!%Ct<7RTh*|7*6vvqYz1FdgzcFFlH@&|#PduYC&YB~?7xPeg>u1dY{iwb3(}
+zE=t&5jwe6ZnM>41w`h&zDi@KN*5!e5EVR(7kAjQe4Izhbo7G~zhPA&0V#K3&vs2z<
+zit)v5h&M8Hr_|Fc;y}z62(jVxO`7^{H)qbQEotzxT!3`?nuqs^PP5alOgHj|XTHyYowLct5@AV%
+zjoGe0bus1&BJ`CFdptXUXrf$L)Gj+UyI1b((ve|f1IVh_leN@__Ynn=cpKE-K5VES
+zW5m$f0nUAg3peBi67aEgu)#bckojm>4q^QW{NKfcB7&`?AJ!gKmyd6>W(v_cj@T8}yuR!e_A|Rl~UtaI&DrOI5k0aaT_}?8~nMra?
+z)_*>=-IMA3Co}&kwZt5D5K=5+h+
+zm0P`h@cJiLN$_-^%;ui#-8q(}Ey9-VzfgE>H?AnQPBm_y8{0XEA$Y3}k}K1BE=MeD
+z@^=xQsqxw5wlTn9Zo$0i31bz3AXoB$-akJ#slLIfgGr1Y$q>51w^eObN}&gAbth{*
+zw`6oaUAJ2sSOn9Cdt()2VastUB|@#o6Xzu@-YJ3P7RtW$865mkWth`w{iXgd7y0f`ywJ-IKHr&9{BPDh
+z$%LGp?+B60>7%*RnpLsWjeP$%8P9qp(9P_A?d`2MQO*3b35ZD9&QpMnZXSKe2y|im
+z+?Ks|kLTZdPVVdZMb^=lrYb_czU^lkMaPB7Eim;7zg~-LTw`+suuuTS
+zp6?4jFDY}CzLxyk`=MA>ayKwycLAk(JD
+zMu42|zVXeUMmGz!vI+g3sl;~!0Dl7TrPn-=i@vTsBm^&C%zA}<+{y%JS{=r
+z4+-bKu{lBgKTY>ds@eXfCbZy~`37+h7OW$q`s-#>63cxhqff#{_?S%`%S|1aX=E19
+z++6FdSql{zLV)VSw6|L@(&GR1R=#8p&$_QI+T=vWo}$6xkn_{GVP!AKI@bKkh-KsO
+z#o=tDejSOxqh>-2*NtjMUE|^j?Zq*V($7%c$@m>{a)fAlwU^^v#k9HKd(CcZwkHOD
+z*k_DsuNP*!lvq(b5!<32Wnag6y6_(_-K<5`^S5WJ+ZA;ezwU(GFxlR#o}jQDGmIwXo0*eS_7G|qGeKE%y}x%FBvBWMVOU?9gNqORo)jDTo${j}9>gO@Gd_re5C9^-
+z>D7oBmgz&n7ATt_u6F24B5B8R3Wj>jAKGVjZPa?~)T}TBwkE>_UEr}I>1!s^=k)wq
+zx~z%M1SFVwCp&JEG*$hZj7x|BA+p16sU==A07~1(vim4mY*;y;Z*K?lh5Bb>7}tZE
+z<^aVezu7z-ZicUEoq)>gbQp7~>fcx1h~2XN9*yM9+wT2-a&$X}Pkhx#jpxia6X1Gd
+z{?$rpi1o~#i*jQCf8h8hgql1pgAy)a=_l)t7AndP&5RvCfus<*;SJ7Fx5Za2-4i?z
+zhB1HT7uzM>8WF($?xuVr)1z!Dyy+JH3C=HSHqq=cmh%(*To5eCe0$-*l4flGs)zl<
+z2|Q6CFtIg-w$!Ph-Lp`1Khp{M5`t@CyKc@bQ*4euqL?;F(t}`*+{PrWx@Z2h{2f@?
+zMO$iJ@U*fE9&&RJ1xJj~#*k$=@~S&3F>O{l$|X+)-4p@j9JYK)(6AEUTb}Wbl@s<+
+zAS=kJMrKCR{rat)j$a>GIpZ@Rc@{r{+`Au~Pq+{wq@Y;4FYLOH;qBK%q1e|I2xn0G
+z+e>^85kJ978MifN^OKm3gKIo&4AV5zMr-%iG1l9Ge?Kn|U*wEwxt@ebbXwjhrlw23wttMl~3GBAdidPof2;BS7{DM=3OZt)I-g{s^Z
+zyr*xGh0yn*FBLdFM1}@NI%Uv%WX*y1@^}ouWW9K(3+kw&Yz%ToL=WY~`(;8aTldMU
+zMxtSJ4By{nw{Bi}mD>(s?n(k|8@*8b5y0@z4-vUCuL2kk1qJ+4!!=(e*#<{qcXIo~uL5+jVarZtb>&K}wI
+zWP{*G?M-!D!saNcnVOJ=6wzL*4RZ9pQ#&Fhu7-YdoeT6|O)4%LjkH3JJz2QnmD`F&
+ziE{ahjo2Rl-;(X^`wHYxg@u5GtTh45gNj5UmiO=$#WdJ6(EQJdHC&d}{@cN8(L?FfVC}pn3mD3Q;nvVi3VUQ`>MP44+
+z5v@;B5z^yqwQ(OZ|5ztm&KJA;XTF(_4*2;9o!B@bXk8dAXr0D?O-XgqN3b6Jpy@5zN^EF3%#MY4Y77Wz@N(ESDg~=-h-Oo)R?-tlIT5sz5kDc|=u+=%W
+zV^k)(vENZjp5PC_rtx=ktp`6JYZOepCv2QhbKAmELhz&fwkI7>1ZD3#yKIW&Y*?*b
+z`#5E&C=kSZ3U~h4Aji4Pe{fS2`OO5}cG3gP-|Mi8a=BpuoZlCU9(G@@^LZFx_GdS0
+zPk>dCAq%&Rd4%muXhRCQJ8@DfS^&E(kp7PHv8;uuB|lm+)Zq4bt+l8)Wik`@%$sy5
+z0O!{txL8vFAZ3GKCF5v7syF{CH1V<56OBEk7!~5VnEd$fmz=&{em}qt1DKnpHnP1%
+zqFpJ=Oqkx$;Ymg9Dix6boXj{-svxs>ZkkqGKYvV
+z*0ulqiPCY9A>D|_LvYnIVl=5&gOmUFMiENWtyWKA`p1UHE(F6!UB^^UJ3PO%+x~jD
+zOV>X#tM9MOk6O3i_~uMm!CHTG(1G4))gT;3;s=bpFk-H<~aGpDzjJg)JV2(Wh(!Nz3mGQ9=6)f9=|
+zql#(W+d4PY8*xP2C%;l6kq=n*xW|2}V3D`?$zta4!#Ad5d;d
+zg)?hh92qla?9Tfi<5f`snPn(@S-P2?GFwK$qI!v2G|)2X$i{ZC3O-=R={C`hENuiu
+zCdHA??fK{rzGBb+_jXhlKb-sJ8F^MqslJNDa^Orqulp_cR8}$9k?hihq>JuYbw8KI
+z-wU)ua#T`JjlYyO?J&(qe6u;02_)L+jbNE!u&Rw*cA@nS(Wi!~1lWh(ZotGKKk0M`
+z>Zm?hA~`Bvb#c_wcLDVUMn^}`?9*CS!lF8d#+P&^tsQ9y&hMCIEM`uy
+zJMg!W)K7v{-~RUUw?&XcK9G__KZNVUP5LI*M$rU{4yK%_p(DBeYhvFbN<%;g9|aq<
+zj*sufKj4a&$W5H_W809|hKsnda)=lM$oY6cXCA%3&y0(F$6a%*{;2($X`SXZ(--hqohQCx0JFLArBbF}GbbT24lg2mDxba-F*`Agh@1fOe5ZP?
+zJIjz6@gHj>$KUm|kc+$N6Y(f56(%5PtaSOQyDqgz-4Iy9u`DGGxb7RGHAjB8*+iHl
+z7Qib9)o3Cpc{9<55RO;XP@=F2!7j%e$^eu2TuoEQ9IfWtHcMIyKc;$JoN*MyW`a}-
+zF5IyU|CDBK&&qjgwfNVqZxJ#>+2kyCNKO-|WPNn{OoK`qMim1BqttZVlQu~6?
+zg{Pti=<)+o72R#$+qX*dg9R)349K;4_xF0v8XQ8HwBkeBqMohDfMr!}#>GZdYYT>X
+zy&abrXs++b-VjzB@pdUjuKFs$xmPVN8E;>drJ!;2V%p@$ADzwa+
+zDTH{3f40w79&j=r9de>yVZV-THjkz|X=%
+z$jP5d|IW4e?*+pU72{Z7ExEsE_#I)OFZCVnyTllU)z)O#8;~sFHBWOB$$RELZIdX-
+z0{B@$%5CAvxC{X|b!S*$zvF7LM2=R$mI`~b)sxlJZtQj%Tq_k}pJE>-){iRES70`1
+z@7(hW>1>r+(CEc_Skc#SiB07o?(JQNAN};$b@NVr>drf_Z{YA(;O%XdEM4G{cF`bg
+z*_8g2>lC@~s%}ZoBC|40{VTEJ>Tw%!GmdQZhA;~yDE_@41HF7WoS%`+yll8d^%gd2
+z@Eg8j7_PU(OF6`Z?(9@wOgSG8pIb&QACkq8Wm)@dKpwkWfwWXr{(t)^=#$3cOxNEm
+zE;JBzznt{DypTzLK2{{~Jmb%RPHofYTEp)vA;md(^!-{Y{mT9N)K4Ft_^Ouozb+G+
+z_{I@=ibIE6h$g`0drv?5r4;-!}eBoH!mhFmln8xwJ}9AY8IvD=wR@oA}p`_;JUJ-n-`lzVnmn5mAF@T`#V
+z@y{6}0TT)wS-D_zroS{(tSeDMNvd4b_WiFeL2n&IVzY`LBDeFQU(0FAzLxyIUVt`p
+z6MYxIyQHdoneV*$Z{j2zF00p_r*gy9N46U
+zmh*YN?O6kSf(+&Oft_jlK)e#dlrW*3*@?Z`CdK4s+vR)qV)fG}7O(
+z(uFCmQQMB27Wu?bClodLT|M^;Y=Q+Glv9$uV|77CC{Jd2P4)UQUKZ$kDlt4{|9(&p
+z?jKUGgccVCJ7L=#nhX-;pWV3Lw
+zM~htn>!4@ugvz!MFu#l#0=Ob5l$AHvIY5%XAz%Bs+kxs4&8Ni-Nncz4&vyI-=vT~M&uh-WP!%7lW~Ys)4)ZAwIK%v
+zRB>f_nxv|O`c)JyJ@%KM&^q?5A?V_WRZPe4?IG?@^~~t`BF9<@8xi9MFkKA^_2SPM
+zYh0TU(R2gcQ%0P!)aQY1Z3JHD1Mh=2B?v!1(n?W!Y4*;OqNU@QO>0SuC2xnTLY750
+zb!UKxHoD7KCRy{ROH0&@;_lT{kIFL1=S
+zN4UokGC%RJ^?p@mp;F~YyWA6&8kij0@Ga>>^S-t_bl%_S*jQ_{%d)U_bpPMg*
+zO#g0AOnhTRJeXDsUmKnib(9FqOIY*88Hp?xB4%VOqose{!PXa72nqEz;qb616LZ=W
+zy-V6<^AbXV;C<&Gr1VuHJ4J6MogNeq%fSk&*ey$(knPT5_f8y1LIw6wn|Q
+zQO*8;@?mqNm~#=8M8n4z8OCrbx}*Qot6Ba<^*(+4Y|ynV-3^k`CEW;uf=Y+d-CawE
+zG}0-ON{Vy}NV6=0fV6_Zf|N7}-246g5%+m=9?t8UGc%vhd(KtXRC!GKxUvV!()Xo8
+zHu!SIdZE$z$ERzCknUoh$No978{EiKn==6tN&TV4n4-=dbY
+zUe(qkTO?itMeAU4KkVbfUp5*rF+0eopZc00NZ91>RB@@sq?9+T<&o_~^}wD>?YXiE
+zHY=*`o`AhjXMNyRYL9JNaL)K@}cgp4Xr&ox6)p)vKDb#FD*WMc}
+zM2y|Q^yl=oeHlpD4UP+Mz*0baqh{~1Q5k$5TB2$GUy10HIzn-w0sz2ytqeLu~wsN75T
+z_Ewge{`;#uEiNmvl0uU}U63U?5m~gUSk8g5gsOkpBVWsuGyyN=EN&UmB)>~O>6&i1@GgOL0XwO{V8g83cO*GYABkV)58gjD|Qv=
+z6WvoBq30{vdkVFpHt_$;C|htI9v4{yOh#?#lX6Qe5R6ND$7a1lvY0O4%AFhhkv^zw
+zy&LZoy)0%9ecV*zbJ=~^;?kj~R0LH>w9+pM0sbg!Q(*X6}*5JGHmTF1H;`ESJ
+zG*9J)H+AFp*<|+AS@*n6kl4=DU_Ca(67a&OdRc-R0C=`g@n}oVU|Imz8ImJRENdUw
+zJC*p55}K%9_3E5y_`ULi^`r67`v_lteLowub(z=xL(A5%EWi-l&jpdYt!F>BkzfdV
+zK<@bVwiC%*dIHcR69ZuiRzajh2wljAsLuYK??`2se8DYl%@5}7#eC)LOS@_ndO`2W
+zYKRd2My?j&d;Xo7d+5+UKuPqhn<+{XVF0?LLnHw$B+uL!LH9o%9GQ*?D*axhcD`Vw
+zJw@+{hG#2YN`NVepCy4*KwZ#vAs{9ESQs%Gxl2l>1E-ax`rFK4QRhNji@Yh1*507|
+zR?$o9E_@zLMcqdU(0N@Pe_sw+u^Nj|h>b+Yr|RApIJFQfi!z3VhxbY+{)=+RYvK)<
+zjPAG-05h1wtg}CScYbfAi78TE%j;6*Q*Zf=O^*w?T!J&@iXOeDJ#(y|5wBh|w19V@
+zJE}lEf)w&Qf`I|%E(o2&COn)Uwiy?MJ~@0*u*kqxx&{~~f4hD7*BNJr2v&sEKpAD{
+z`Q=^YnsQ{gQ>5IjpO&%lR{N_p@3O7H9rnv-wjEu}mIW!_v`zI%(tLJU25`&cnIJH4
+z`hBbo9k^k3MMq`Kk_KnV-W%w2Y>qoiACouzVs<=}(d=?pnAFvlO-u_xxH8Tg(7)*T
+z(1+|rwRF_}9?BMLPlX6J=g<5c26+{{X%PSNwrn|%Z&K@+7+Y%WI2}zuL+1PY`vi#x
+z2dzONL-&Fw4#@Y=8k-{~&2KXVe0$MK&{l}qd_HZsGV>8BKn2dpe^e%PG*D9QmNHnA
+zAg3FF4&;=RG$=R>4-x0NBqT^Ou&Ja2fF)T7ZL+npXxDz^s0Ae_2hee@|?5xRxde`d9;l%J;zXR=QiCbNctk-I&qk}m1
+z^!dd3I(UwD?5a%umo_GF3a$r@Tq1cqX*Tah(;WZ2w_Y|hLJyAvXGz@hyPH%JXP
+zw_w6buWXxJNS{2$UfeIZ*4&FBD1NXVHT0Q%i%iK}*WygEpR7JsrgU7tuE%U$OU4W>qY>W`}
+zV5{g04j=>j8<1j!aszD!ZUqOA%=VHe8?EJ6xy)qd(Rq@@4%}MyEON8`%Et_Ujb>+B
+z3d&BAh_Iwzup8q}WRnGZ)};fVc!vm+HfF@uvh6b?7`g+byO)2uX#RU*E6oOPJtrQn
+zbsFB8&{}A-8E?^8zNSXp(EkF;_3O$WQ8d&;DO$!?RHO7+J@yLXCD+~k_vSQ~rL%MD
+zJ>%>gjDK&1Hq8@VL|$%{MxB$OuWxugYM&QMQborI=eKsl=c{eN9e1QauUez*!RO`)
+zAv$<`QT*=ba(}8m`3VYr<^r;Klgi|;xg=X>tE>CdZ9aGiUVNpPSgd>J(sNK>h5x?*
+zu-p{G(XMDSZ*Vm+Uu>*`1Pn+i6Jy#X=v@77ICu59Iw
+zgHxh|SG8hfs}o?C8$e+yuiSw{-c4FvU0si-cMruI7goycej&cEC^?g4q&;7|fW)^~
+zDaHZT!i*Jfp3(NT?E-C$b5edxcn*}8_L8A|71o`)|_+A-e5>>Pogp
+z1d_4jST8uMK0bF7aO>>nSBmjq$NM)Y)VeYWA0M|!SN-TE%|ZH7?e!eP??u{plQpbM
+zmSM4Tiyfz%r&7`b9(#++JFkp3<(~KK!zMG6&Wh>l?zGD}83OqzmpC|z@%zx^bTr<|
+zBdEiRz3b5LpIoT_D(Z&xZ)MVnJ8QJR6D`n?A&%I<`n|D?o9Y!w6t6-eazDu8c<3-s
+z!gL;W+}|d==py?oUEBmw=Z?>A$5zFwDt=u|U_?w49OIBz=bHKnHGj@xOTHTYdet|Y
+zj_>q}*!tJaGwu8(NSxKOyZcBh&ES07@pN8fbYFHM802y6p2L+0*-6BUc|Qsx$~*$hre)1xamb=YV&P1U8B+{^x-?(z`7-{XW`
+zT;%v-FJ~%7D{L900nDVTADD5+MSP+A3`6Mmof9bP-)oI*ce9h{$@faXq@=FOZVNbd
+z+_3U9zGI?S-c+fRn*4;v1%HJtzBxYV&VdXMH<_!qkYA4x;DXlpkgpk`rMjwYWTAHd
+z7>_yJ(S-*`fj&U=3xFeFiNYq00V^X+&4c8skXcR$z85gP!h5_gD=YhG`8%G%)1OjY
+zmhaYjOG3(aGw?G`7;3gp>n>hQX7N0oA!Zn{T}v3O^@>A3VEscw{ncMS(slj0vdqrR
+z;f`SUa4G&p60Xx2UOG+kGQqv^Pw8ZqxoQOSKiT^*0kb-ZXF2Sy^xcb>X%i166Z(sO
+z8@-I*lWd58tY%1wMKqA$s~EKA(%rXEUl!Dir;}O4Fw*Ahw7LQ*@NcMu!~z_<(Y^X%c`;*CxRU
+z4wT%P>D|9*-IrDA9_ur0{QL%KepF(5@j~5mS{$}a&4H)R_i+YGHb|lW6)(`j+pF$h
+zSe6fvTk$|UN$D%Uw5!Bl-95<Q`bf|oMjyF}S+E7CqD
+z=tjj4A6B?%67Nc~DAJ5$1vUG;QH5i|)H^SVyV*B`Ly95r2e(dq)obDqcV%@x&TVt}
+z+WG^B^tPIj4d?S(@ZLcD;KuKrk61ZEHOdyBtThMt!fzC!wG$@#cqFpYiDIEV=LJ)m
+z<&PPpk7pf4+7|FEsTLE_QJy>RVQ;?rs&0%f^?U3Y8rk9W{rjruv~cnnarKdLfi5EE
+zg5aPgR{*s)r`OEFJ-H-PUWCVLbdYxrFWXEYVhF;YsbI477nOf1+!%bh{x?_2h||!&EM@c%+OAlAazMF-S*-~4pixD(Me%aQu(Nb
+zzh}`&qtfr~FF7sR)k8ranjG}q_|i4ZG1)q7O{@aC#jgWEdojwZX2EClcpnHCr|KC{U
+zSs$uVvej%wp^)l!(*xHuEsE=0ju;Oc<8=|sI|FhF3XsALDqt
+z{dm!s4ndP1!qXQyj)MiKaHfMn6SgJsxMve(paQe}arn??^uU&8#TpLLMihoL!pOR@A$9u(a=B1KD;m;z1z)GZTWUiELO~DTR;#gt^-QLz
+zN!P*y>J^5Y)lDlk@In1}A=ogh8Dps2Y}VJjN(ZDDyARQSbdsgMwF_hzjYjqJ;AAP;
+z#L%%#l*^tXe%{g|zAT{`=>!vPrd3{tl<%jNI9wFuS4b@l2FJz{NMsn9TpSUBc)Qy
+z$=YM*;Iy~QlH5-4gy~{y{_Iw%A~ZX8-y9LDuDuO06rWh#Pau6N>zy4xRD%PK@qm)b
+zC%@*bqV)glB-rFdpx;+%F<8A~0YS-WA4)?|YS_Jx2UnoeykEMZ&RKoLU|&4CC8G?8
+z^BWgaw+knleJ#Sb%?{eNu;j1i1hm)hndylD!h-Iq_A4!`AKRh-?X(oPE(~!*s>>ZW
+z5Zp`3B-E=ZWRLuo-UrdhWFxG+B0_xU9VEb#UVm!~jJ+>|6-WODF&BK1ao+YMpssIR
+zmx%jn3%(F$8BJfEi&`GiBh)C}hyHoZt$(JnG&4A=dCQ`Y`y0ipfZ=|QO{YgGEcA56
+z>xrqaf;kE_qCVOflw(|`bnDvt6}0Cv78HMx4W@uZzr`1I~EVfU0_
+zoExySW9pz|`|@_U5lf!tm>!7u{h>d^c5o3MFE%}9B((vXfUxMx=h8^9NEoT~`TX?%
+zbyDHb;=d3IYHz+(F{BYqs$^{()K&i`m4Qb)6c7K~!ji7)1M!c`Wu$Dmeco2dC8YD+
+z7**M6{rgmzsNEpWy=yy#FmQq88?~oW+OR$i25fwTJ~uz`+3KXZOv853WPintWQ!oDE>jN4dulF9Hl3`)oNWbsUVXLT8dnrh<6l=1WAM&1$JgiojbV(%O8UiKeyL
+zfstKX&xpGtV8^u_HmJ8hMkn}bu|hQ!UR6;>wMMNgzxUYlqO%gBk`Ac3-risvm_Ujl
+zZ?K6rM$&X(=-I0W&aFmt0ZZ`#t2@m@#3D!qaar$#Tx0?Um?TqT`S*+jr6M%DeSQ-j#S$}l+Hwz&
+ztX>ldldkodeFH3$ggNh3gZkZAE?=A)@=%AcqwFa#H>BKZR#G#Dc#~qBRGRYw4;U`g^!91K>nt+zIaXwe_W@}L?_?TpyO
+zBF!dFzaahp#iu!*X_*qP7bl-2lhCg6E;rja!bK-$`5*o~<|4t(Bx>
+z?+hsE$}Nh{z6%e!U{LK)bx>VOWhKqubFzU;n_7=JgjJG3WI)-$WBTd$n31JB!)Sgw
+z#_cMwzf!f+Fn%Oe=ZBOd4NT$Nd=AXA*(Wb6B$kBt!a`&%cgI&g+db|-ujWu)S8LsH
+zjAF0PzpkLe1WYBapC{NhB|U8STJlyE7wwvF*LfR`^YiaN0|BPHJJ;PB3QxKZJbCjVbfDlmI4f+)n{ZAF-RP=H=T~A_YEGwFf*@awVAILD9VFCO*P?utkW9^H2{8
+z>g+WZe}YX&zsX0yIq#Q8rj3(g?zB}(ABgp;6vh0k4Bz%Sl+)3esE3a9gb71*f=iHtgy^4?giRLuN0{XicTdEW9wPpjf7$3BgwkW2)Hw9BKGgR0h8A=UR+e
+z$HT;q|0kNMjRN_+RXcjUtze_A!9CIcY_Gff1%o1MUoMQ@urbkblRC4CHO>E*Cs-a0
+zW0>2U>9r7xGlsNJESk1QeAw;5E^K78~F
+z>G+D#NAP8E>zPg}Vdd|~0P<`u8!KdW=7Y^s)mOfur&E#Rcj`?u#SqkH1ri$Hn{ILrq@rgzjU-3}anEmHSF1dT{CRqnet8kCC*XFoX(Gl>*l;52
+zaL(+NNtck_(t^y4IDiOpWGkw{<3ECy4PdZUv)GBZmnhFSia{oT%KiT~vGj$Zys6cmH>N`0Nb>Sj3!M6$gk1#)nk#5;<2@LD;Y3%m^K8RO5vStfv6-2y8?o2*XHMF^0Q{05hSDFF*ZLSnq_zrc
+z`J7r^Omm8U$lB@Gfo&;~qw{7cea|q%teO}hTi5akV3LKa@YghSz?OREO5AD6#o
+zc}pRl_e?}(D9IhZC+J=k;<`4n&I`x5BOUuw;e@dH=Gz}c?!tr5n_SdtU5l@EfJ3N|
+z=%XZrZkWFH#c~q7N=w*J@!L!L9j;%6e9a*2I1OZM*_DbgfVu;S0sms9z&O34Z1LiD
+zZkiw`y|5qb8=6F>sjgKP7>t>Ac#WFEB+8T3m?%rPsZ7HDrK6VgN*O89=h^bF;JF4u
+zZFL}+Tx5}fM}lkyeU)fK#aIq%`fEAb)>6?bZ@3=yTGd{%bTSvcf|wr}rrg
+zE>M+`>xCJ2hl;;ESdI;_)9wGP<&92|iVC6#S&VUU!!HGaSj`p^6?Cjkf0kqm@9K$d
+zU!{7*uR8fcv(aowj2{K*Ehm>Fba3Sz>K~+u>CsHS!1%TL$n2Ee(EiA+3-u|>yPszz
+zx?w;R4%YFBFh_AciBr)o0ih{0FszthD3C_jVO4_rJQ_;XU@-o^wNqUhG&
+z(f!WVsg*v3<1Xam1x4Z!A{2h8CxHaRnVXCrPy;qjiG42x!z#tnx?FjPY+fc1g@m~I
+z`FC?^D7KP}%`AVJuuwiQ_xu1d8s_V}3hLa>MoA}qZju;!)A`xQ&(Dqc`g9VoeaZMw
+z)7FZQlIZdj2QPUUS6|XCh&}7_b>FN6=>{$NQgt9g2j>JWe2-s2Tf#zQAH`Bs$r^>D
+z8uKubJ>y3;&ab2AD722YXh%N>-Fa-LDNp7lf>9Ua%eGI%`;
+z0_Ya6b=DVt35p*K0uB_!4M$YOf2wT=IyzfN`t}nBCdUAx@Miy0rvTzEc*>GL?ASFT;1aXSvHv8}?p6EcE4qw@1%%pK0T1Cxmfo$;X+h?yGnaV}0`3
+z-n<=HuDdF7w7GrNUFNE?q}pPH@QFrS%U2fz1A|2ek*c=S8q?C_O9DV=UvRQ~;vA2V
+z9yIg?X3uM;2?iEGLuxQ{&Le$?pI6F$eix}|)r-Y(x*x0a`K3M=6o
+z6pq9Y(doT;a`IVpiHp3BOES_qzkB%62fX8y#El;rZ#|l2J%uk1pOhY4rR|aoS6Kh$
+z2P$I-*`U9ga@?t@ar)Da9t45PzRYS4hGi!=$jZ?(I4-S*A!o6ljTzBi`OVZ`DUN?mM{9X
+zbrwcc7>@jn^;90&U0jej@9YHyoi>rr0FG{MZVr~NW3%5~Qq|{OZ`KOVH3MD}Z@4RdrPAlq@6u553jqP5=M^
+
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..368fba3
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,103 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+ id 'dagger.hilt.android.plugin'
+ id 'com.google.gms.google-services'
+ id 'androidx.navigation.safeargs.kotlin'
+ id 'kotlin-kapt'
+ id 'com.google.firebase.crashlytics'
+}
+
+android {
+ namespace 'in.sminnovations.hposregistration'
+ compileSdk 34
+
+ defaultConfig {
+ applicationId "in.sminnovations.hposregistration"
+ minSdk 26
+ targetSdk 34
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+ buildFeatures {
+ viewBinding true
+ }
+ kotlinOptions {
+ jvmTarget = '17'
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.core:core-ktx:1.10.1'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.9.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+
+ // firebase
+ implementation("com.google.firebase:firebase-crashlytics-ktx")
+ implementation platform("com.google.firebase:firebase-bom:32.2.2")
+ implementation("com.google.firebase:firebase-analytics-ktx")
+ implementation 'com.google.firebase:firebase-firestore-ktx'
+ implementation 'com.google.firebase:firebase-auth-ktx'
+ implementation 'com.google.firebase:firebase-storage-ktx'
+ implementation 'com.firebaseui:firebase-ui-firestore:8.0.2'
+ implementation 'com.google.android.gms:play-services-auth:20.6.0'
+
+ // Coroutines
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
+
+ // Coroutine Lifecycle Scopes
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
+ implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
+
+ //Dagger - Hilt
+ implementation "com.google.dagger:hilt-android:2.46"
+ kapt "com.google.dagger:hilt-android-compiler:2.46"
+ kapt "androidx.hilt:hilt-compiler:1.0.0"
+
+ // Navigation Component
+ implementation "androidx.navigation:navigation-fragment-ktx:2.7.0"
+ implementation "androidx.navigation:navigation-ui-ktx:2.7.0"
+
+ // Retrofit + GSON
+ implementation "com.squareup.retrofit2:retrofit:2.9.0"
+ implementation "com.squareup.retrofit2:converter-gson:2.9.0"
+
+ // Timber
+ implementation 'com.jakewharton.timber:timber:4.7.1'
+
+ // Activity KTX for viewModels()
+ implementation "androidx.activity:activity-ktx:1.7.2"
+
+ //image
+ implementation 'com.github.bumptech.glide:glide:4.13.2'
+ annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2'
+
+ //Room
+ implementation "androidx.room:room-ktx:2.6.0-alpha03"
+ implementation "androidx.room:room-runtime:2.6.0-alpha03"
+ kapt ("androidx.room:room-compiler:2.6.0-alpha03")
+
+ // Barcode scanner
+ implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
+
+
+}
\ No newline at end of file
diff --git a/app/google-services.json b/app/google-services.json
new file mode 100644
index 0000000..a593d99
--- /dev/null
+++ b/app/google-services.json
@@ -0,0 +1,113 @@
+{
+ "project_info": {
+ "project_number": "650071678820",
+ "project_id": "hpos-af3cc",
+ "storage_bucket": "hpos-af3cc.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:650071678820:android:f1435a1c07f710036c6471",
+ "android_client_info": {
+ "package_name": "com.example.hposconsentform"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:650071678820:android:7569c1cad4fc99916c6471",
+ "android_client_info": {
+ "package_name": "in.sminnovations.hposregistration"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "650071678820-70kp5jvjda4r5diqch2kn4lc40p4f42g.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "in.sminnovations.hposregistration",
+ "certificate_hash": "7714b9268a81d0cf0fb178b0af8dbb630f8fc70a"
+ }
+ },
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:650071678820:android:f96be19e5d43102b6c6471",
+ "android_client_info": {
+ "package_name": "in.sminnovations.hpostesting"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "650071678820-l87dnr0bdj95get0khgnvfv2an1k6ogq.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "in.sminnovations.hpostesting",
+ "certificate_hash": "7714b9268a81d0cf0fb178b0af8dbb630f8fc70a"
+ }
+ },
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAVdNGCev_AFX0qmuZJF6kxzRzXUTeAW5I"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "650071678820-to41afi9f0gi5r3k6v7pe1e5p96nupcs.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/example/hposregistration/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/hposregistration/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..719b5ce
--- /dev/null
+++ b/app/src/androidTest/java/com/example/hposregistration/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.hposregistration
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.hposregistration", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..14f9ab4
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/HPOSRegistrationApplication.kt b/app/src/main/java/com/example/hposregistration/HPOSRegistrationApplication.kt
new file mode 100644
index 0000000..e652dc2
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/HPOSRegistrationApplication.kt
@@ -0,0 +1,7 @@
+package com.example.hposregistration
+
+import android.app.Application
+import dagger.hilt.android.HiltAndroidApp
+
+@HiltAndroidApp
+class HPOSRegistrationApplication: Application()
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/adapters/UserListOfflineAdapter.kt b/app/src/main/java/com/example/hposregistration/adapters/UserListOfflineAdapter.kt
new file mode 100644
index 0000000..a53b67e
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/adapters/UserListOfflineAdapter.kt
@@ -0,0 +1,49 @@
+package com.example.hposregistration.adapters
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.AsyncListDiffer
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.example.hposregistration.data.user.UserData
+import `in`.sminnovations.hposregistration.databinding.UserItemViewBinding
+
+class UserListOfflineAdapter(private val view: View) : RecyclerView.Adapter() {
+
+ inner class CompanyViewHolder(val binding: UserItemViewBinding) :
+ RecyclerView.ViewHolder(binding.root)
+
+ private val differCallback = object : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: UserData, newItem: UserData): Boolean {
+ return oldItem.name == newItem.name
+ }
+
+ override fun areContentsTheSame(oldItem: UserData, newItem: UserData): Boolean {
+ return oldItem == newItem
+ }
+ }
+
+ val differ = AsyncListDiffer(this, differCallback)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CompanyViewHolder {
+ return CompanyViewHolder(
+ UserItemViewBinding
+ .inflate(LayoutInflater.from(parent.context), parent, false)
+ )
+ }
+
+ override fun getItemCount(): Int {
+ return differ.currentList.size
+ }
+
+ override fun onBindViewHolder(holder: CompanyViewHolder, position: Int) {
+ val userList = differ.currentList[position]
+ holder.binding.apply {
+ userName.text = userList.name
+ userId.text = userList._id
+ Glide.with(view).load(userList.userImageURL).into(userImage)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/adapters/UserListOnlineAdapter.kt b/app/src/main/java/com/example/hposregistration/adapters/UserListOnlineAdapter.kt
new file mode 100644
index 0000000..a475764
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/adapters/UserListOnlineAdapter.kt
@@ -0,0 +1,35 @@
+package com.example.hposregistration.adapters
+
+import android.annotation.SuppressLint
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.example.hposregistration.data.user.UserData
+import com.firebase.ui.firestore.FirestoreRecyclerAdapter
+import com.firebase.ui.firestore.FirestoreRecyclerOptions
+import `in`.sminnovations.hposregistration.databinding.UserItemViewBinding
+
+class UserListOnlineAdapter(options: FirestoreRecyclerOptions, private val view: View) :
+ FirestoreRecyclerAdapter(options) {
+
+ class OrderItemViewHolder(val binding: UserItemViewBinding) :
+ RecyclerView.ViewHolder(binding.root)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OrderItemViewHolder {
+ return OrderItemViewHolder(
+ UserItemViewBinding
+ .inflate(LayoutInflater.from(parent.context), parent, false)
+ )
+ }
+
+ @SuppressLint("SetTextI18n")
+ override fun onBindViewHolder(holder: OrderItemViewHolder, position: Int, model: UserData) {
+ holder.binding.apply {
+ userName.text = "Name: ${model.name}"
+ userId.text = "User ID: ${model._id}"
+ Glide.with(view).load(model.userImageURL).into(userImage)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt
new file mode 100644
index 0000000..cdcf480
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/dao/MyDataBase.kt
@@ -0,0 +1,11 @@
+package com.example.hposregistration.dao
+
+import androidx.room.Database
+import androidx.room.RoomDatabase
+import androidx.room.TypeConverters
+import com.example.hposregistration.data.user.UserData
+
+@Database(entities = [UserData::class], version = 1, exportSchema = false)
+abstract class MyDatabase : RoomDatabase() {
+ abstract fun userDao(): UserDao
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/dao/UserDao.kt b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt
new file mode 100644
index 0000000..bdff697
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/dao/UserDao.kt
@@ -0,0 +1,23 @@
+package com.example.hposregistration.dao
+
+import androidx.lifecycle.LiveData
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.example.hposregistration.data.user.UserData
+
+@Dao
+interface UserDao {
+ @Query("SELECT * from user_table")
+ fun getAll(): LiveData>
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insertAll(userData: UserData)
+
+ @Query("SELECT * FROM user_table WHERE _id = :id")
+ suspend fun getUserByID(id: String): UserData
+
+ @Query("DELETE FROM user_table WHERE _id = :id")
+ suspend fun deleteById(id: String)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/Constant.kt b/app/src/main/java/com/example/hposregistration/data/Constant.kt
new file mode 100644
index 0000000..8462f60
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/Constant.kt
@@ -0,0 +1,43 @@
+package com.example.hposregistration.data
+
+import com.example.hposregistration.data.user.UserData
+
+object Constant {
+
+ fun String.fetchYOBFromDOB(): Int {
+ val startIndex = if (this.length >= 4) this.length - 4 else 0
+ return this.substring(startIndex).toInt()
+ }
+
+ fun String.mapToGender(): UserData.Gender {
+ return if (this.lowercase() == "m" || this.lowercase() == "male") {
+ UserData.Gender.MALE
+ } else if (this.lowercase() == "f" || this.lowercase() == "female") {
+ UserData.Gender.FEMALE
+ } else {
+ UserData.Gender.OTHER
+ }
+ }
+
+ const val USER_ID = "usernameId"
+
+ val STATICID = listOf(
+ "SMIREG1",
+ "SMIREG2",
+ "SMIREG3",
+ "SMIREG4",
+ "SMIREG5",
+ "SMIREG6",
+ "SMIREG7",
+ "SMIREG8",
+ "SMIREG9",
+ "SMIREG10",
+ "SMIREG11",
+ "SMIREG12",
+ "SMIREG13",
+ "SMIREG14",
+ "SMIREG15"
+ )
+
+ const val password = "SMI@12345"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/InternetConnectionLiveData.kt b/app/src/main/java/com/example/hposregistration/data/InternetConnectionLiveData.kt
new file mode 100644
index 0000000..4f1eb2e
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/InternetConnectionLiveData.kt
@@ -0,0 +1,58 @@
+package com.example.hposregistration.data
+
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+import androidx.lifecycle.LiveData
+
+class NetworkStatusLiveData(context: Context) : LiveData() {
+
+ private val connectivityManager: ConnectivityManager =
+ context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+
+ private val networkCallback = object : ConnectivityManager.NetworkCallback() {
+ override fun onAvailable(network: Network) {
+ postValue(true)
+ }
+
+ override fun onLost(network: Network) {
+ postValue(false)
+ }
+ }
+
+ override fun onActive() {
+ super.onActive()
+ postValue(isNetworkAvailable())
+ registerNetworkCallback()
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ unregisterNetworkCallback()
+ }
+
+ private fun registerNetworkCallback() {
+ val networkRequest = NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
+ .build()
+
+ connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
+ }
+
+ private fun unregisterNetworkCallback() {
+ connectivityManager.unregisterNetworkCallback(networkCallback)
+ }
+
+ private fun isNetworkAvailable(): Boolean {
+ val network = connectivityManager.activeNetwork
+ val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
+ return networkCapabilities != null &&
+ networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
+ networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/MainRepository.kt b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt
new file mode 100644
index 0000000..715827d
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/MainRepository.kt
@@ -0,0 +1,33 @@
+package com.example.hposregistration.data
+
+import androidx.lifecycle.LiveData
+import com.example.hposregistration.dao.UserDao
+import com.example.hposregistration.data.user.UserData
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class MainRepository @Inject constructor(
+ private val userDao: UserDao,
+ private val userFireBaseDao: com.example.hposregistration.network.UserDao
+) {
+
+ val allUsers: LiveData> = userDao.getAll()
+
+ suspend fun insert(userData: UserData){
+ userDao.insertAll(userData)
+ }
+
+ suspend fun getUserByID(id: String): UserData {
+ return userDao.getUserByID(id)
+ }
+
+ suspend fun deleteById(id: String) {
+ return userDao.deleteById(id)
+ }
+
+ suspend fun addDataToFirebase(userData: UserData): Response {
+ return userFireBaseDao.addUserToDatabase(userData)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/Response.kt b/app/src/main/java/com/example/hposregistration/data/Response.kt
new file mode 100644
index 0000000..ae4d1e1
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/Response.kt
@@ -0,0 +1,6 @@
+package com.example.hposregistration.data
+
+sealed class Response {
+ data class Success(val data: T) : Response()
+ data class Error(val exception: Exception) : Response()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/SecureQrCode.kt b/app/src/main/java/com/example/hposregistration/data/SecureQrCode.kt
new file mode 100644
index 0000000..be15ad6
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/SecureQrCode.kt
@@ -0,0 +1,253 @@
+package com.example.hposregistration.data
+
+import com.example.hposregistration.data.aadhar.AadharCard
+import com.example.hposregistration.data.aadhar.QrCodeException
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.IOException
+import java.math.BigInteger
+import java.nio.charset.StandardCharsets
+import java.util.LinkedList
+import java.util.zip.GZIPInputStream
+
+/**
+ * Class to decode scanned QRcode
+ */
+open class SecureQrCode(scanData: String?) {
+ private var emailMobilePresent = 0
+ private var imageStartIndex = 0
+ private var imageEndIndex = 0
+ private var decodedData: ArrayList? = null
+ private var signature: String? = null
+ private var email: String? = null
+ private var mobile: String? = null
+ var scannedAadharCard: AadharCard = AadharCard()
+
+ init {
+
+ // 1. Convert Base10 to BigInt
+ val bigIntScanData = scanData?.let { BigInteger(it, 10) }
+
+ // 2. Convert BigInt to Byte Array
+ val byteScanData = bigIntScanData?.toByteArray()
+
+ // 3. Decompress Byte Array
+ val decompByteScanData = byteScanData?.let { decompressData(it) }
+
+ // 4. Split the byte array using delimiter
+ val parts = decompByteScanData?.let { separateData(it) }
+ // Throw error if there are no parts
+ if (parts != null) {
+ if (parts.isEmpty()) {
+ throw QrCodeException("Invalid QR Code Data, no parts found after splitting by delimiter")
+ }
+ }
+
+ // 5. decode extracted data to string
+ if (parts != null) {
+ decodeData(parts)
+ }
+
+ // 6. Extract Signature
+ if (decompByteScanData != null) {
+ decodeSignature(decompByteScanData)
+ }
+
+ // 7. Email and Mobile number
+ if (decompByteScanData != null) {
+ decodeMobileEmail(decompByteScanData)
+ }
+ }
+
+ /**
+ * Decompress the byte array, compression used is GZIP
+ * @param byteScanData compressed byte array
+ * @return uncompressed byte array
+ */
+ @Throws(QrCodeException::class)
+ protected fun decompressData(byteScanData: ByteArray): ByteArray {
+ val bos = ByteArrayOutputStream(byteScanData.size)
+ val bin = ByteArrayInputStream(byteScanData)
+ val gis: GZIPInputStream = try {
+ GZIPInputStream(bin)
+ } catch (e: IOException) {
+ throw QrCodeException("Error in opening Gzip byte stream while decompressing QRcode", e)
+ }
+ var size = 0
+ val buf = ByteArray(1024)
+ while (size >= 0) {
+ try {
+ size = gis.read(buf, 0, buf.size)
+ if (size > 0) {
+ bos.write(buf, 0, size)
+ }
+ } catch (e: IOException) {
+ throw QrCodeException("Error in writing byte stream while decompressing QRcode", e)
+ }
+ }
+ try {
+ gis.close()
+ bin.close()
+ } catch (e: IOException) {
+ throw QrCodeException("Error in closing byte stream while decompressing QRcode", e)
+ }
+ return bos.toByteArray()
+ }
+
+ /**
+ * Function to split byte array with delimiter
+ * @param source source byte array
+ * @return list of separated byte arrays
+ */
+ private fun separateData(source: ByteArray): List {
+ val separatedParts: MutableList = LinkedList()
+ var begin = 0
+ for (i in source.indices) {
+ if (source[i] == SEPARATOR_BYTE) {
+ // skip if first or last byte is separator
+ if (i != 0 && i != source.size - 1) {
+ separatedParts.add(source.copyOfRange(begin, i))
+ }
+ begin = i + 1
+ // check if we have got all the parts of text data
+ if (separatedParts.size == VTC_INDEX + 1) {
+ // this is required to extract image data
+ imageStartIndex = begin
+ break
+ }
+ }
+ }
+ return separatedParts
+ }
+
+ private fun decodeData(encodedData: List) {
+ val i = encodedData.iterator()
+ decodedData = ArrayList()
+ while (i.hasNext()) {
+ decodedData!!.add(String(i.next(), StandardCharsets.ISO_8859_1))
+ }
+ // set the value of email/mobile present flag
+ emailMobilePresent = decodedData!![0].toInt()
+
+ // populate decoded data
+ scannedAadharCard.name = decodedData!![2]
+ scannedAadharCard.dateOfBirth = decodedData!![3]
+ scannedAadharCard.gender = decodedData!![4]
+ scannedAadharCard.careOf = decodedData!![5]
+ scannedAadharCard.district = decodedData!![6]
+ scannedAadharCard.landmark = decodedData!![7]
+ scannedAadharCard.house = decodedData!![8]
+ scannedAadharCard.location = decodedData!![9]
+ scannedAadharCard.pinCode = decodedData!![10]
+ scannedAadharCard.postOffice = decodedData!![11]
+ scannedAadharCard.state = decodedData!![12]
+ scannedAadharCard.street = decodedData!![13]
+ scannedAadharCard.subDistrict = decodedData!![14]
+ scannedAadharCard.vtc = decodedData!![15]
+ }
+
+ /**
+ * ref : https://uidai.gov.in/2-uncategorised/11320-aadhaar-paperless-offline-e-kyc-3.html
+ * Hashing logic for Email ID :
+ * Sha256(Sha256(Email+SharePhrase))*number of times last digit of Aadhaar number
+ * (Ref ID field contains last 4 digits).
+ * Example :
+ * Email: abc@gm.com
+ * Aadhaar Number:XXXX XXXX 3632
+ * Passcode : Lock@487
+ * Hash : Sha256(Sha256(abc@gm.comLock@487))*2
+ * In case of Aadhaar number ends with Zero we will hashed one time.
+ * **********************************************************************
+ * **********************************************************************
+ * Hashing logic for Mobile Number :
+ * Sha256(Sha256(Mobile+SharePhrase))*number of times last digit of Aadhaar number
+ * (Ref ID field contains last 4 digits).
+ * Example :
+ * Mobile: 1234567890
+ * Aadhaar Number:XXXX XXXX 3632
+ * Passcode : Lock@487
+ * Hash: Sha256(Sha256(1234567890Lock@487))*2
+ * In case of Aadhaar number ends with Zero we will hashed one time.
+ */
+ private fun decodeMobileEmail(decompressedData: ByteArray) {
+ val mobileStartIndex: Int
+ val mobileEndIndex: Int
+ val emailStartIndex: Int
+ val emailEndIndex: Int
+ when (emailMobilePresent) {
+ 3 -> {
+ // both email mobile present
+ mobileStartIndex = decompressedData.size - 289 // length -1 -256 -32
+ mobileEndIndex = decompressedData.size - 257 // length -1 -256
+ emailStartIndex = decompressedData.size - 322 // length -1 -256 -32 -1 -32
+ emailEndIndex = decompressedData.size - 290 // length -1 -256 -32 -1
+ mobile = bytesToHex(
+ decompressedData.copyOfRange(mobileStartIndex, mobileEndIndex + 1)
+ )
+ email = bytesToHex(
+ decompressedData.copyOfRange(emailStartIndex, emailEndIndex + 1)
+ )
+ // set image end index, it will be used to extract image data
+ imageEndIndex = decompressedData.size - 323
+ }
+
+ 2 -> {
+ // only mobile
+ email = ""
+ mobileStartIndex = decompressedData.size - 289 // length -1 -256 -32
+ mobileEndIndex = decompressedData.size - 257 // length -1 -256
+ mobile = bytesToHex(
+ decompressedData.copyOfRange(mobileStartIndex, mobileEndIndex + 1)
+ )
+ // set image end index, it will be used to extract image data
+ imageEndIndex = decompressedData.size - 290
+ }
+
+ 1 -> {
+ // only email
+ mobile = ""
+ emailStartIndex = decompressedData.size - 289 // length -1 -256 -32
+ emailEndIndex = decompressedData.size - 257 // length -1 -256
+ email = bytesToHex(
+ decompressedData.copyOfRange(emailStartIndex, emailEndIndex + 1)
+ )
+ // set image end index, it will be used to extract image data
+ imageEndIndex = decompressedData.size - 290
+ }
+
+ else -> {
+ // no mobile or email
+ mobile = ""
+ email = ""
+ // set image end index, it will be used to extract image data
+ imageEndIndex = decompressedData.size - 257
+ }
+ }
+ }
+
+ private fun decodeSignature(decompressedData: ByteArray) {
+ // extract 256 bytes from the end of the byte array
+ val startIndex = decompressedData.size - 257
+ val noOfBytes = 256
+ signature = String(decompressedData, startIndex, noOfBytes, StandardCharsets.ISO_8859_1)
+ }
+
+ companion object {
+ protected const val SEPARATOR_BYTE = 255.toByte()
+ protected const val VTC_INDEX = 15
+
+ /**
+ * Convert byte array to hex string
+ */
+ fun bytesToHex(bytes: ByteArray): String {
+ val hexArray = "0123456789ABCDEF".toCharArray()
+ val hexChars = CharArray(bytes.size * 2)
+ for (j in bytes.indices) {
+ val v = bytes[j].toInt() and 0xFF
+ hexChars[j * 2] = hexArray[v ushr 4]
+ hexChars[j * 2 + 1] = hexArray[v and 0x0F]
+ }
+ return String(hexChars)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/aadhar/AadharCard.kt b/app/src/main/java/com/example/hposregistration/data/aadhar/AadharCard.kt
new file mode 100644
index 0000000..9d56c8f
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/aadhar/AadharCard.kt
@@ -0,0 +1,20 @@
+package com.example.hposregistration.data.aadhar
+
+
+class AadharCard {
+ var name = ""
+ var dateOfBirth = ""
+ var gender = ""
+ var careOf = ""
+ var district = ""
+ var landmark = ""
+ var house = ""
+ var location = ""
+ var pinCode = ""
+ var postOffice = ""
+ var state = ""
+ var street = ""
+ var subDistrict = ""
+ var vtc = ""
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/aadhar/QrCodeException.kt b/app/src/main/java/com/example/hposregistration/data/aadhar/QrCodeException.kt
new file mode 100644
index 0000000..8a60ada
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/aadhar/QrCodeException.kt
@@ -0,0 +1,6 @@
+package com.example.hposregistration.data.aadhar
+
+class QrCodeException : Exception {
+ constructor(message: String?) : super(message) {}
+ constructor(message: String?, cause: Throwable?) : super(message, cause) {}
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/data/user/UserData.kt b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt
new file mode 100644
index 0000000..5ecc79d
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/data/user/UserData.kt
@@ -0,0 +1,42 @@
+package com.example.hposregistration.data.user
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "user_table")
+data class UserData(
+ @PrimaryKey
+ var _id: String = "",
+ var abhaId: String = "",
+ var aadharId: String = "",
+ var name: String = "",
+ var birthYear: String = "",
+ var gender: String = "",
+ var phoneNumber: String = "",
+ var careOf: String = "",
+ var maritalStatus: String = "",
+ var category: String = "",
+ var caste: String = "",
+ var subCaste: String? = "",
+ var appVersion: String ="",
+ var house: String = "",
+ var city: String = "",
+ var district: String = "",
+ var state: String = "",
+ var pinCode: String = "",
+ var bloodGroup: String = "",
+ var isUnderMedication: Boolean? = false,
+ var isUnderTransfusion: Boolean? = false,
+ var sickleCellHistory: String? = "",
+ var userImageURL: String = "",
+ var registeredBy: String? = "",
+ var createdAt: String? = "",
+ var registrationCenterName: String? = "",
+ var testStatus: Boolean = false
+){
+ enum class Gender {
+ MALE,
+ FEMALE,
+ OTHER
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/di/AppModule.kt b/app/src/main/java/com/example/hposregistration/di/AppModule.kt
new file mode 100644
index 0000000..9f0bdf2
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/di/AppModule.kt
@@ -0,0 +1,44 @@
+package com.example.hposregistration.di
+
+import android.app.Application
+import android.content.Context
+import androidx.room.Room
+import com.example.hposregistration.dao.MyDatabase
+import com.example.hposregistration.dao.UserDao
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object AppModule {
+
+ @Provides
+ @Singleton
+ fun provideMyDatabase(@ApplicationContext context: Context): MyDatabase {
+ return Room.databaseBuilder(
+ context, MyDatabase::class.java, "my_database"
+ ).build()
+ }
+
+ @Provides
+ @Singleton
+ fun provideMyDao(myDatabase: MyDatabase): UserDao {
+ return myDatabase.userDao()
+ }
+
+ @Provides
+ @Singleton
+ fun provideMyNetworkDao(): com.example.hposregistration.network.UserDao {
+ return com.example.hposregistration.network.UserDao()
+ }
+
+ @Provides
+ @Singleton
+ fun provideContext(application: Application): Context {
+ return application.applicationContext
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/network/UserDao.kt b/app/src/main/java/com/example/hposregistration/network/UserDao.kt
new file mode 100644
index 0000000..a05f0bf
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/network/UserDao.kt
@@ -0,0 +1,30 @@
+package com.example.hposregistration.network
+
+import com.example.hposregistration.data.Response
+import com.example.hposregistration.data.user.UserData
+import com.google.firebase.firestore.FirebaseFirestore
+import com.google.firebase.firestore.ktx.firestore
+import com.google.firebase.ktx.Firebase
+import kotlinx.coroutines.tasks.await
+
+class UserDao {
+
+ private val db: FirebaseFirestore = Firebase.firestore
+ private val patientCollection = db.collection("patientData")
+
+ suspend fun addUserToDatabase(data: UserData): Response {
+ return try {
+ patientCollection.document()
+ .set(data)
+ .await()
+
+ Response.Success(data._id)
+ } catch (e: Exception) {
+ Response.Error(e)
+ }
+ }
+
+// suspend fun getPatientList(): List {
+// return patientCollection.get().await().toObjects(UserData::class.java)
+// }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt
new file mode 100644
index 0000000..51c0221
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/activities/MainActivity.kt
@@ -0,0 +1,19 @@
+package com.example.hposregistration.ui.activities
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.databinding.ActivityMainBinding
+
+@AndroidEntryPoint
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityMainBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/BaseFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/BaseFragment.kt
new file mode 100644
index 0000000..8b467de
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/BaseFragment.kt
@@ -0,0 +1,50 @@
+package com.example.hposregistration.ui.fragments
+
+import android.view.View
+import android.widget.Button
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import com.journeyapps.barcodescanner.ScanOptions
+
+open class BaseFragment: Fragment() {
+
+ fun hideProgressBar(view: View) {
+ view.visibility = View.GONE
+ }
+
+ fun showProgressBar(view: View) {
+ view.visibility = View.VISIBLE
+ }
+
+// fun hideErrorMessage(view: View) {
+// view.visibility = View.GONE
+// }
+//
+// fun showErrorMessage(message: String, errorView: View, errorMessageView: TextView) {
+// errorView.visibility = View.VISIBLE
+// errorMessageView.text = message
+// }
+//
+// fun markButtonDisable(button: Button) {
+// button.isEnabled = false
+// }
+//
+// fun markButtonEnable(button: Button) {
+// button.isEnabled = true
+// }
+
+ fun scanQR(scannerMessage: String): ScanOptions {
+ val options = ScanOptions()
+ options.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
+ options.setPrompt("Scan a barcode")
+ options.setCameraId(0)
+
+ options.setBeepEnabled(true)
+ options.setBarcodeImageEnabled(true)
+
+ options.setPrompt(scannerMessage)
+ options.setOrientationLocked(false)
+
+ return options
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/LoginFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/LoginFragment.kt
new file mode 100644
index 0000000..40a6a69
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/LoginFragment.kt
@@ -0,0 +1,92 @@
+package com.example.hposregistration.ui.fragments
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import com.example.hposregistration.data.Constant
+import `in`.sminnovations.hposregistration.R
+import `in`.sminnovations.hposregistration.databinding.FragmentLoginBinding
+
+class LoginFragment : Fragment() {
+
+ private var _binding: FragmentLoginBinding? = null
+ private val binding get() = _binding!!
+ private lateinit var sharedPreference: SharedPreferences
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentLoginBinding.inflate(inflater, container, false)
+ sharedPreference = requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ init()
+ }
+
+ private fun init() {
+ if (isUserLoggedIn()) {
+ navigateToUserListFragment()
+ return
+ }
+
+ binding.btnLogin.setOnClickListener {
+ val loginId = binding.loginId.text.toString()
+ val password = binding.password.text.toString()
+
+ if (loginId.isNotBlank() && password.isNotBlank()) {
+ performLogin(loginId, password)
+ } else {
+ if (loginId.isBlank()) {
+ binding.loginId.error = R.string.enter_proper_login_id.toString()
+ }
+ if (password.isBlank()) {
+ binding.password.error = R.string.enter_proper_password.toString()
+ }
+ }
+ }
+ }
+
+ private fun isUserLoggedIn(): Boolean {
+ return sharedPreference.getString(Constant.USER_ID, "")?.isNotBlank() == true
+ }
+
+ private fun navigateToUserListFragment() {
+ findNavController().navigate(R.id.action_loginFragment_to_userListFragment)
+ }
+
+ private fun performLogin(loginId: String, password: String) {
+ val matchingId = Constant.STATICID.firstOrNull { it == loginId }
+ if (matchingId != null) {
+ if (password == Constant.password) {
+ saveUserId(loginId)
+ navigateToUserListFragment()
+ return
+ } else {
+ Toast.makeText(requireContext(), R.string.wrong_password, Toast.LENGTH_SHORT).show()
+ }
+ }
+ Toast.makeText(requireContext(), R.string.wrong_user_id, Toast.LENGTH_SHORT).show()
+ }
+
+ private fun saveUserId(userId: String) {
+ with(sharedPreference.edit()) {
+ putString(Constant.USER_ID, userId)
+ apply()
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/ProfileFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/ProfileFragment.kt
new file mode 100644
index 0000000..9d37edd
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/ProfileFragment.kt
@@ -0,0 +1,26 @@
+package com.example.hposregistration.ui.fragments
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.databinding.FragmentProfileBinding
+
+@AndroidEntryPoint
+class ProfileFragment : Fragment() {
+
+ private lateinit var _binding: FragmentProfileBinding
+
+ private val binding get() = _binding
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentProfileBinding.inflate(layoutInflater, container, false)
+
+ return binding.root
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt
new file mode 100644
index 0000000..61362cd
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/UserListFragment.kt
@@ -0,0 +1,201 @@
+package com.example.hposregistration.ui.fragments
+
+import android.app.AlertDialog
+import android.content.Context
+import android.content.DialogInterface
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.Toast
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import com.example.hposregistration.adapters.UserListOfflineAdapter
+import com.example.hposregistration.adapters.UserListOnlineAdapter
+import com.example.hposregistration.data.Constant
+import com.example.hposregistration.data.user.UserData
+import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
+import com.firebase.ui.firestore.FirestoreRecyclerOptions
+import com.google.firebase.firestore.ktx.firestore
+import com.google.firebase.ktx.Firebase
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.R
+import `in`.sminnovations.hposregistration.databinding.FragmentUserListBinding
+
+@AndroidEntryPoint
+class UserListFragment : BaseFragment() {
+
+ private var _binding: FragmentUserListBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel by viewModels()
+
+ private var isOnline = false
+
+ private lateinit var sharedPreference: SharedPreferences
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentUserListBinding.inflate(inflater, container, false)
+ sharedPreference = requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
+ setupViews()
+ return binding.root
+ }
+
+ override fun onResume() {
+ super.onResume()
+ init()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+
+ private fun setupViews() {
+ binding.btnRegisterUser.setOnClickListener {
+ findNavController().navigate(R.id.action_userListFragment_to_registrationFragment)
+ }
+ binding.btnLogout.setOnClickListener {
+ logoutUser(requireContext())
+ }
+ }
+
+ private fun init() {
+ viewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isNetworkAvailable ->
+ if (isNetworkAvailable) {
+ isOnline = isNetworkAvailable
+ fetchFromServer()
+ checkForLocalDBData()
+ } else {
+ isOnline = isNetworkAvailable
+ fetchFromLocalDB()
+ }
+ }
+
+ binding.uploadData.setOnClickListener {
+ showUploadDialog(requireContext())
+ }
+
+ viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
+ deteleIncompleteRegistration(userDataList)
+ }
+ }
+
+ private fun logoutUser(context: Context) {
+ val builder = AlertDialog.Builder(context)
+ builder.setTitle(R.string.log_out)
+ builder.setMessage(R.string.do_log_out)
+
+ // Positive button
+ builder.setPositiveButton("Yes") { dialog, _ ->
+ saveUserId()
+ findNavController().navigate(R.id.action_userListFragment_to_loginFragment)
+ dialog.dismiss()
+ }
+
+ // Negative button
+ builder.setNegativeButton("No") { dialog, _ ->
+ dialog.dismiss()
+ }
+
+ val dialog = builder.create()
+ dialog.show()
+ }
+
+ private fun saveUserId() {
+ with(sharedPreference.edit()) {
+ putString(Constant.USER_ID, "")
+ apply()
+ }
+ }
+ private fun showUploadDialog(context: Context) {
+ val builder = AlertDialog.Builder(context)
+ builder.setTitle(R.string.upload_db_registration)
+ builder.setMessage(R.string.upload_local_db_to_cloud)
+
+ // Positive button
+ builder.setPositiveButton(R.string.upload) { dialog, _ ->
+ uploadLoadDBData(dialog)
+ }
+
+ // Negative button
+ builder.setNegativeButton(R.string.cancel) { dialog, _ ->
+ dialog.dismiss()
+ }
+
+ val dialog = builder.create()
+ dialog.show()
+ }
+
+ private fun uploadLoadDBData(dialog: DialogInterface) {
+ viewModel.allUserData.observe(viewLifecycleOwner) {
+ if (it.isEmpty()) {
+ dialog.dismiss()
+ } else {
+ it.forEach { userData ->
+ viewModel.addUserToDatabase(userData)
+ viewModel.deleteById(userData._id)
+ }
+ dialog.dismiss()
+ Toast.makeText(requireContext(), R.string.upload_done_successfully, Toast.LENGTH_SHORT)
+ .show()
+ }
+ }
+ }
+
+ private fun checkForLocalDBData() {
+ viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
+ if (userDataList.isEmpty()) {
+ binding.uploadData.visibility = View.GONE
+ } else {
+ binding.uploadData.visibility = View.VISIBLE
+ }
+ }
+ }
+
+ private fun fetchFromServer() {
+ binding.noList.visibility = View.GONE
+ binding.rvOrder.visibility = View.VISIBLE
+ val query = Firebase.firestore.collection("patientData")
+ val recyclerViewOptions =
+ FirestoreRecyclerOptions.Builder().setQuery(query, UserData::class.java)
+ .build()
+ val adapter = UserListOnlineAdapter(recyclerViewOptions, binding.root)
+ binding.rvOrder.adapter = adapter
+ adapter.startListening()
+ }
+
+ private fun fetchFromLocalDB() {
+ binding.uploadData.visibility = View.GONE
+ viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
+ if (isOnline) {
+ binding.noList.visibility = View.GONE
+ binding.rvOrder.visibility = View.VISIBLE
+ } else {
+ if (userDataList.isEmpty()) {
+ binding.noList.visibility = View.VISIBLE
+ binding.rvOrder.visibility = View.GONE
+ } else {
+ binding.noList.visibility = View.GONE
+ binding.rvOrder.visibility = View.VISIBLE
+ deteleIncompleteRegistration(userDataList)
+ val adapter = UserListOfflineAdapter(binding.root)
+ adapter.differ.submitList(userDataList)
+ binding.rvOrder.adapter = adapter
+ }
+ }
+ }
+ }
+
+ private fun deteleIncompleteRegistration(userDataList: List) {
+ userDataList.forEach {
+ if (it.userImageURL.isEmpty()) {
+ viewModel.deleteById(it._id)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/registration/AbhaRegistrationFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/AbhaRegistrationFragment.kt
new file mode 100644
index 0000000..d306b96
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/AbhaRegistrationFragment.kt
@@ -0,0 +1,219 @@
+package com.example.hposregistration.ui.fragments.registration
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
+import com.example.hposregistration.data.Constant.fetchYOBFromDOB
+import com.example.hposregistration.data.Constant.mapToGender
+import com.example.hposregistration.data.SecureQrCode
+import com.example.hposregistration.data.user.UserData
+import com.example.hposregistration.ui.fragments.BaseFragment
+import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
+import com.journeyapps.barcodescanner.ScanContract
+import com.journeyapps.barcodescanner.ScanIntentResult
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.R
+import `in`.sminnovations.hposregistration.databinding.FragmentAbhaRegistrationBinding
+import org.json.JSONObject
+
+@AndroidEntryPoint
+class AbhaRegistrationFragment : BaseFragment() {
+
+ private var _binding: FragmentAbhaRegistrationBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel by viewModels()
+ private val args: AbhaRegistrationFragmentArgs by navArgs()
+ private var userData = UserData()
+
+ private val barcodeLauncher =
+ registerForActivityResult(ScanContract()) { result: ScanIntentResult ->
+ if (result.contents == null) {
+ Toast.makeText(
+ requireContext(), R.string.cancelled_unable_scan, Toast.LENGTH_LONG
+ ).show()
+ } else {
+ processScannedData(result.contents)
+ }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentAbhaRegistrationBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ init()
+ }
+
+ private fun init() {
+ binding.btnScanNow.setOnClickListener {
+ barcodeLauncher.launch(scanQR("Please Scan the Abha ID/Aadhar ID"))
+ }
+
+ if (args.userId != "null") {
+ viewModel.getUserByID(args.userId)
+ }
+
+ viewModel.userData.observe(viewLifecycleOwner) { user ->
+ userData = user
+ with(binding) {
+ aadharID.setText(user.aadharId)
+ etAbhaId.setText(user.abhaId)
+ etName.setText(user.name)
+ centerName.setText(user.registrationCenterName)
+
+ }
+ }
+
+ binding.btnProceed.setOnClickListener {
+ val abhaIdInput = binding.etAbhaId.text.toString()
+ val userName = binding.etName.text.toString()
+ val aadharIdInput = binding.aadharID.text.toString()
+ val centerName = binding.centerName.text.toString()
+
+ if (validateInputs(abhaIdInput, aadharIdInput, userName, centerName)) {
+ userData.apply {
+ name = userName
+ aadharId = aadharIdInput
+ abhaId = abhaIdInput
+ registrationCenterName = centerName
+ _id = aadharId + userName.substring(0, 3).uppercase() + centerName.substring(0, 3).uppercase()
+ }
+
+ viewModel.insert(userData)
+
+ navigateToUserDetailsFragment(userData._id)
+ }
+ }
+ }
+
+ private fun processScannedData(contents: String) {
+ try {
+ val obj = JSONObject(contents)
+
+ userData.apply {
+ abhaId = obj.getString("hidn").replace("-", "")
+ name = obj.getString("name")
+ birthYear = obj.getString("dob").fetchYOBFromDOB().toString()
+ gender = obj.getString("gender").mapToGender().toString()
+ phoneNumber = obj.getString("mobile")
+
+ state = obj.getString("state name")
+ district = obj.getString("district_name")
+ house = obj.getString("address")
+ }
+
+ if (userData.abhaId.isNotEmpty()) {
+ saveUserDataAsPerAbhaId()
+ } else {
+ saveUserDataAsPerAadharId()
+ }
+ } catch (e: Exception) {
+ try {
+ val decodedData = SecureQrCode(contents)
+ val aadharData = decodedData.scannedAadharCard
+ userData.apply {
+ name = aadharData.name
+ birthYear = aadharData.dateOfBirth.fetchYOBFromDOB().toString()
+ gender = aadharData.gender.mapToGender().toString()
+ state = aadharData.state
+ district = aadharData.district
+ house = aadharData.house
+ }
+
+ saveUserDataAsPerAadharId()
+ } catch (e: Exception) {
+ Toast.makeText(
+ requireContext(),
+ R.string.invalid_qr_code,
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ }
+
+ private fun saveUserDataAsPerAbhaId() {
+ with(binding) {
+ tvScanMessage.visibility = View.VISIBLE
+ tvScanMessage.text = R.string.enter_aadhar_manually.toString()
+ etAbhaId.setText(userData.abhaId)
+ etName.setText(userData.name)
+ }
+ Toast.makeText(
+ requireContext(), R.string.scanned_abha_id, Toast.LENGTH_SHORT
+ ).show()
+ }
+
+ private fun saveUserDataAsPerAadharId() {
+ with(binding) {
+ tvScanMessage.text =
+ R.string.scanned_aadhar_id.toString()
+ etName.setText(userData.name)
+ }
+ Toast.makeText(
+ requireContext(), R.string.scanned_aadharid, Toast.LENGTH_SHORT
+ ).show()
+ }
+
+ private fun validateInputs(
+ abhaId: String, aadharId: String, userName: String, centerName: String
+ ): Boolean {
+ with(binding) {
+ if (!checkAbhaIDNumber(abhaId)) {
+ etAbhaId.error = R.string.invalid_abha_id.toString()
+ return false
+ }
+ if (!checkAadharIDNumber(aadharId)) {
+ aadharID.error = R.string.invalid_aadhar_id.toString()
+ return false
+ }
+ if (!checkUserName(userName)) {
+ etName.error = R.string.name_field_error.toString()
+ return false
+ }
+ if (!checkCenterName(centerName)) {
+ etCenterName.error = R.string.center_name_error.toString()
+ return false
+ }
+ }
+ return true
+ }
+
+ private fun checkAbhaIDNumber(abhaId: String): Boolean {
+ return abhaId.isNotEmpty() && abhaId.length >= 14
+ }
+
+ private fun checkAadharIDNumber(aadharId: String): Boolean {
+ return aadharId.isNotEmpty() && aadharId.length >= 12
+ }
+
+ private fun checkUserName(userName: String): Boolean {
+ return userName.isNotEmpty() && userName.length >= 3
+ }
+
+ private fun checkCenterName(centerName: String): Boolean {
+ return centerName.isNotEmpty() && centerName.length >= 3
+ }
+
+ private fun navigateToUserDetailsFragment(userId: String) {
+ val action =
+ AbhaRegistrationFragmentDirections.actionRegistrationFragmentToUserDetailsRegistrationFragment(
+ userId
+ )
+ findNavController().navigate(action)
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/registration/CaptureUserImageFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/CaptureUserImageFragment.kt
new file mode 100644
index 0000000..fea188f
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/CaptureUserImageFragment.kt
@@ -0,0 +1,190 @@
+package com.example.hposregistration.ui.fragments.registration
+
+import android.Manifest
+import android.app.Activity
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.graphics.Bitmap
+import android.net.Uri
+import android.os.Bundle
+import android.provider.MediaStore
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.activity.result.ActivityResultLauncher
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.content.ContextCompat
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
+import com.bumptech.glide.Glide
+import com.example.hposregistration.data.user.UserData
+import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.databinding.FragmentCaptureUserImageBinding
+import java.io.File
+import java.io.FileOutputStream
+import java.io.IOException
+import java.io.OutputStream
+import java.util.UUID
+
+@AndroidEntryPoint
+class CaptureUserImageFragment : Fragment() {
+
+ private var _binding: FragmentCaptureUserImageBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel by viewModels()
+
+ private var userData = UserData()
+
+ private lateinit var cameraLauncher: ActivityResultLauncher
+
+ private val args: CaptureUserImageFragmentArgs by navArgs()
+
+ private lateinit var requestPermissionLauncher: ActivityResultLauncher>
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentCaptureUserImageBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ init()
+ }
+
+ private fun init() {
+ setupViewModel()
+ setupCameraLauncher()
+ setupRequestPermissionLauncher()
+ checkPermissionsAndPerformCameraOperation()
+ }
+
+ private fun setupViewModel() {
+ viewModel.getUserByID(args.userId)
+ viewModel.userData.observe(viewLifecycleOwner) { user ->
+ userData = user
+ if (userData.userImageURL.isNotEmpty()) {
+ binding.userImage.loadImageFromUri(Uri.parse(user.userImageURL))
+ binding.btnSubmit.isEnabled = true
+ binding.btnSubmit.setOnClickListener {
+ navigate()
+ }
+ }
+ }
+ }
+
+ private fun setupCameraLauncher() {
+ cameraLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
+ if (result.resultCode == Activity.RESULT_OK && result.data != null) {
+ val thumbnail: Bitmap = result.data!!.extras!!.get("data") as Bitmap
+ val uri: Uri = saveImageToInternalStorage(thumbnail)
+ uri.let {
+ binding.btnSubmit.isEnabled = true
+ Glide.with(requireActivity()).load(it).into(binding.userImage)
+ binding.btnSubmit.setOnClickListener {
+ submitImage(uri)
+ }
+ }
+ }
+ }
+ }
+
+ private fun setupRequestPermissionLauncher() {
+ requestPermissionLauncher =
+ registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
+ val grantedPermissions = permissions.filterValues { it }
+ val deniedPermissions = permissions.filterValues { !it }
+
+ if (grantedPermissions.isNotEmpty()) {
+ binding.userImage.setOnClickListener {
+
+ takePicture()
+ }
+ }
+
+ if (deniedPermissions.isNotEmpty()) {
+ requestPermissions()
+ }
+ }
+ }
+
+ private fun takePicture() {
+ Intent(MediaStore.ACTION_IMAGE_CAPTURE).also {
+ cameraLauncher.launch(it)
+ }
+ }
+
+ private fun submitImage(uri: Uri) {
+ userData.userImageURL = uri.toString()
+ viewModel.insert(userData)
+ navigate()
+ }
+
+ private fun navigate() {
+ val action = CaptureUserImageFragmentDirections
+ .actionCaptureUserImageFragment2ToReviewDetailsRegistrationFragment(args.userId)
+ findNavController().navigate(action)
+ }
+
+ private fun saveImageToInternalStorage(bitmap: Bitmap): Uri {
+
+ val file = File(context?.filesDir, "${UUID.randomUUID()}.jpg")
+
+ try {
+ val stream: OutputStream = FileOutputStream(file)
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream)
+ stream.flush()
+ stream.close()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ return Uri.fromFile(file)
+ }
+
+ private fun checkPermissionsAndPerformCameraOperation() {
+ val cameraPermission = ContextCompat.checkSelfPermission(
+ requireContext(),
+ Manifest.permission.CAMERA
+ )
+ val storagePermission = ContextCompat.checkSelfPermission(
+ requireContext(),
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ )
+
+ if (cameraPermission == PackageManager.PERMISSION_GRANTED &&
+ storagePermission == PackageManager.PERMISSION_GRANTED
+ ) {
+ binding.userImage.setOnClickListener {
+ takePicture()
+ }
+ } else {
+ requestPermissions()
+ }
+ }
+
+ private fun requestPermissions() {
+ val permissions = arrayOf(
+ Manifest.permission.CAMERA,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ )
+ requestPermissionLauncher.launch(permissions)
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
+
+private fun ImageView.loadImageFromUri(uri: Uri) {
+ Glide.with(this)
+ .load(uri)
+ .into(this)
+}
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/registration/ReviewDetailsRegistrationFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/ReviewDetailsRegistrationFragment.kt
new file mode 100644
index 0000000..ae2c5f1
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/ReviewDetailsRegistrationFragment.kt
@@ -0,0 +1,195 @@
+package com.example.hposregistration.ui.fragments.registration
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
+import com.bumptech.glide.Glide
+import com.example.hposregistration.data.Constant
+import com.example.hposregistration.data.user.UserData
+import com.example.hposregistration.ui.fragments.BaseFragment
+import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.R
+import `in`.sminnovations.hposregistration.databinding.FragmentReviewDetailsRegistrationBinding
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Locale
+
+@AndroidEntryPoint
+class ReviewDetailsRegistrationFragment : BaseFragment() {
+
+ private var _binding: FragmentReviewDetailsRegistrationBinding? = null
+ private val binding get() = _binding!!
+ private lateinit var sharedPreference: SharedPreferences
+
+ private val viewModel by viewModels()
+ private val args: ReviewDetailsRegistrationFragmentArgs by navArgs()
+ private var userData = UserData()
+ private var isOnline = false
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentReviewDetailsRegistrationBinding.inflate(inflater, container, false)
+ sharedPreference =
+ requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ init()
+ }
+
+ private fun init() {
+ viewModel.getUserByID(args.userId)
+ viewModel.userData.observe(viewLifecycleOwner) { user ->
+ userData = user
+ setUserData(user)
+ }
+
+ viewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isNetworkAvailable ->
+ isOnline = isNetworkAvailable
+ }
+
+ binding.btnSubmit.setOnClickListener {
+ if (isOnline) {
+ showProgressBar(binding.progressBarCL)
+ addDataToFirebase()
+ } else {
+ Toast.makeText(
+ requireContext(),
+ R.string.internt_not_local,
+ Toast.LENGTH_SHORT
+ ).show()
+ navigateToUserListFragment()
+ }
+ }
+
+ binding.btnEdit.setOnClickListener {
+ val action =
+ ReviewDetailsRegistrationFragmentDirections.actionReviewDetailsRegistrationFragmentToRegistrationFragment(
+ args.userId
+ )
+ findNavController().navigate(action)
+ }
+
+ viewModel.fireBaseUpload.observe(viewLifecycleOwner) {
+ if (it == "Success") {
+ Toast.makeText(
+ requireContext(),
+ R.string.registration_success,
+ Toast.LENGTH_SHORT
+ ).show()
+ navigateToUserListFragment()
+ }
+ }
+ }
+
+ private fun addDataToFirebase() {
+ userData.createdAt = SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss", Locale.getDefault()
+ ).format(Calendar.getInstance().time)
+ userData.registeredBy = sharedPreference.getString(Constant.USER_ID, "")
+ viewModel.addUserToDatabase(userData)
+ viewModel.deleteById(args.userId)
+ }
+
+ private fun setUserData(userData: UserData) {
+ with(binding) {
+ Glide.with(requireActivity()).load(Uri.parse(userData.userImageURL)).into(userImage)
+ binding.tvUserID.text = requireContext().getString(R.string.user_id, userData._id)
+ binding.tvAbhaId.text =
+ requireContext().getString(R.string.abha_number, userData.abhaId)
+ binding.tvAadharId.text =
+ requireContext().getString(R.string.aadhar_number_details, userData.aadharId)
+ binding.tvUserName.text = requireContext().getString(R.string.user_name, userData.name)
+ binding.tvBirthYear.text =
+ requireContext().getString(R.string.birth_year_details, userData.birthYear)
+ binding.tvGender.text =
+ requireContext().getString(R.string.gender_details, userData.gender)
+ binding.tvPhoneNumber.text =
+ requireContext().getString(R.string.phone_number_details, userData.phoneNumber)
+ binding.tvCareOf.text =
+ requireContext().getString(R.string.care_of_details, userData.careOf)
+ binding.tvMaritalStatus.text =
+ requireContext().getString(R.string.marital_status_details, userData.maritalStatus)
+ binding.tvCategory.text =
+ requireContext().getString(R.string.category_details, userData.category)
+ binding.tvCaste.text =
+ requireContext().getString(R.string.caste_details, userData.caste)
+ if (userData.subCaste != "") {
+ binding.tvSubCaste.text =
+ requireContext().getString(R.string.sub_caste_details, userData.subCaste)
+ }
+ binding.tvHouse.text =
+ requireContext().getString(R.string.house_details, userData.house)
+ binding.tvCity.text =
+ requireContext().getString(R.string.city_town_details, userData.city)
+ binding.tvDistrict.text =
+ requireContext().getString(R.string.district_details, userData.district)
+ binding.tvState.text =
+ requireContext().getString(R.string.state_details, userData.state)
+ binding.tvPincode.text =
+ requireContext().getString(R.string.pincode_details, userData.pinCode)
+ binding.centerName.text =
+ requireContext().getString(R.string.centre_name, userData.registrationCenterName)
+ if (userData.isUnderMedication!!) {
+ binding.tvIsUnderMedication.text = requireContext().getString(
+ R.string.is_patient_under_any_medication_details, "Yes"
+ )
+ } else {
+ binding.tvIsUnderMedication.text = requireContext().getString(
+ R.string.is_patient_under_any_medication_details, "No"
+ )
+ }
+ if (userData.isUnderTransfusion!!) {
+ binding.tvIsUnderTransfusion.text = requireContext().getString(
+ R.string.is_patient_undergoing_any_blood_transfusion_details, "Yes"
+ )
+ } else {
+ binding.tvIsUnderTransfusion.text = requireContext().getString(
+ R.string.is_patient_undergoing_any_blood_transfusion_details, "No"
+ )
+ }
+ if (userData.sickleCellHistory == null) {
+ binding.tvSickleCellFamilyHistory.text = requireContext().getString(
+ R.string.sickle_cell_family_history, "No"
+ )
+
+ } else {
+ binding.tvSickleCellFamilyHistory.text = requireContext().getString(
+ R.string.sickle_cell_family_history, userData.sickleCellHistory
+ )
+ }
+
+ val pInfo = requireActivity().packageManager.getPackageInfo(
+ requireActivity().packageName, 0
+ )
+ val version = pInfo.versionName
+ userData.appVersion = version
+
+ }
+ }
+
+ private fun navigateToUserListFragment() {
+ hideProgressBar(binding.progressBarCL)
+
+ val action =
+ ReviewDetailsRegistrationFragmentDirections.actionReviewDetailsRegistrationFragmentToUserListFragment()
+ findNavController().navigate(action)
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/hposregistration/ui/fragments/registration/UserDetailsRegistrationFragment.kt b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/UserDetailsRegistrationFragment.kt
new file mode 100644
index 0000000..a618e00
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/fragments/registration/UserDetailsRegistrationFragment.kt
@@ -0,0 +1,351 @@
+package com.example.hposregistration.ui.fragments.registration
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
+import com.example.hposregistration.data.user.UserData
+import com.example.hposregistration.ui.viewmodels.RegistrationViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import `in`.sminnovations.hposregistration.R
+import `in`.sminnovations.hposregistration.databinding.FragmentUserDetailsRegistrationBinding
+
+
+@AndroidEntryPoint
+class UserDetailsRegistrationFragment : Fragment() {
+
+ private var _binding: FragmentUserDetailsRegistrationBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel by viewModels()
+
+ private lateinit var userData: UserData
+
+ private val args: UserDetailsRegistrationFragmentArgs by navArgs()
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ _binding = FragmentUserDetailsRegistrationBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ init()
+ }
+
+ private fun init() {
+ setupViewModel()
+ setupSubmitButton()
+
+
+ binding.etCategory.setOnItemClickListener { parent, view, position, id ->
+ if (parent.getItemAtPosition(position).toString().equals("OTHER", ignoreCase = true)) {
+ binding.tilOther.visibility = View.VISIBLE
+ } else {
+ binding.tilOther.visibility = View.GONE
+ }
+ }
+
+ binding.etCaste.setOnItemClickListener { parent, view, position, id ->
+ if (parent.getItemAtPosition(position).toString().equals("OTHER", ignoreCase = true)) {
+ binding.tilOthercaste.visibility = View.VISIBLE
+ } else {
+ binding.tilOthercaste.visibility = View.GONE
+ }
+ }
+ }
+
+ private fun setupViewModel() {
+ viewModel.getUserByID(args.userId)
+ viewModel.userData.observe(viewLifecycleOwner) {
+ userData = it
+ autoFillUserData(userData)
+ }
+ }
+
+ private fun autoFillUserData(user: UserData) {
+ with(binding) {
+ user.birthYear.let { etYob.setText(it) }
+ user.gender.let {
+ when (it) {
+ "Male" -> {
+ male.isChecked = true
+ binding.tilOthergender.visibility = View.GONE
+ }
+ "Female" -> {
+ female.isChecked = true
+ binding.tilOthergender.visibility = View.GONE
+ }
+ else -> {
+ other.isChecked = true
+ binding.tilOthergender.visibility = View.VISIBLE
+ }
+ }
+ }
+ user.phoneNumber.let { etMobile.setText(it) }
+ user.careOf.let { etCareof.setText(it) }
+ user.maritalStatus.let { etIsMarried.setText(it, false) }
+ user.subCaste.let { etSubCaste.setText(it) }
+ user.house.let { etHouse.setText(it) }
+ user.city.let { etCity.setText(it) }
+ user.district.let { etDistrict.setText(it) }
+ user.state.let { etState.setText(it) }
+ user.pinCode.let { etPincode.setText(it) }
+ user.isUnderMedication.let {
+ if (it != null) {
+ yes.isChecked = it
+ }
+ }
+ user.isUnderTransfusion.let {
+ if (it != null) {
+ yes1.isChecked = it
+ }
+ }
+ user.sickleCellHistory.let {
+ if (it != null) {
+ yes1history.isChecked = true
+ }
+ }
+ user.category.let {
+ etCategory.setText(it, false)
+ }
+ user.caste.let {
+ etCaste.setText(it, false)
+ }
+
+ if (yes1history.isChecked) {
+ if (binding.yes1history.isChecked) View.VISIBLE else View.GONE
+
+ user.sickleCellHistory.let { etFamilyHistory.setText(it) }
+ } else {
+ binding.tilFamilyHistory.visibility = View.GONE
+ }
+ binding.yes1history.setOnClickListener {
+ binding.tilFamilyHistory.visibility =
+ if (binding.yes1history.isChecked) View.VISIBLE else View.GONE
+ user.sickleCellHistory.let { etFamilyHistory.setText(it) }
+
+ }
+ binding.no1history.setOnClickListener {
+ binding.tilFamilyHistory.visibility =
+ if (binding.no1history.isChecked) View.GONE else View.VISIBLE
+ }
+
+ if(other.isChecked){
+ user.gender.let { etOthergender.setText(it) }
+ }
+
+ binding.male.setOnClickListener {
+ binding.tilOthergender.visibility = View.GONE
+ }
+
+ binding.female.setOnClickListener {
+ binding.tilOthergender.visibility = View.GONE
+ }
+
+ binding.other.setOnClickListener {
+ binding.tilOthergender.visibility = View.VISIBLE
+ }
+
+ if (binding.etCategory.text.toString().equals("OTHER", ignoreCase = true)) {
+ binding.tilOther.visibility = View.VISIBLE
+ binding.etOther.visibility = View.VISIBLE
+ } else {
+ binding.tilOther.visibility = View.GONE
+ }
+
+ if (binding.etCaste.text.toString().equals("OTHER", ignoreCase = true)) {
+ binding.tilOthercaste.visibility = View.VISIBLE
+ binding.etOthercaste.visibility = View.VISIBLE
+ } else {
+ binding.tilOthercaste.visibility = View.GONE
+ }
+
+ }
+ }
+
+ private fun setupSubmitButton() {
+ binding.btnSubmit.setOnClickListener {
+ if (verifyUserDetails()) {
+ userData._id = args.userId
+ viewModel.insert(userData)
+ navigateToCaptureUserImageFragment()
+ } else {
+ showToast(R.string.enter_details_properly.toString())
+ }
+ }
+ }
+
+ private fun navigateToCaptureUserImageFragment() {
+ val action = UserDetailsRegistrationFragmentDirections
+ .actionUserDetailsRegistrationFragmentToCaptureUserImageFragment2(args.userId)
+ findNavController().navigate(action)
+ }
+
+ private fun verifyUserDetails(): Boolean {
+ with(binding) {
+ val yob = etYob.text.toString()
+ if (yob.isEmpty() || yob.toInt() <= 1900 || yob.toInt() > 2023) {
+ etYob.error = R.string.enter_valid_birth_year.toString()
+ return false
+ } else {
+ userData.birthYear = yob
+ }
+
+ if (male.isChecked) {
+ binding.tilOthergender.visibility = View.GONE
+ userData.gender = "Male"
+ } else if (female.isChecked) {
+ binding.tilOthergender.visibility = View.GONE
+ userData.gender = "Female"
+ } else if(other.isChecked) {
+ binding.tilOthergender.visibility = View.VISIBLE
+ val genderother= binding.etOthergender.text.toString()
+ userData.gender = genderother
+ if (genderother.isEmpty()) {
+ etOthergender.error = R.string.fill_field.toString()
+ return false
+ }
+ }
+
+ val pInfo = requireActivity().packageManager.getPackageInfo(
+ requireActivity().packageName, 0
+ )
+ val version = pInfo.versionName
+ userData.appVersion = version
+
+
+ val mobile = etMobile.text.toString()
+ if (mobile.isEmpty() || mobile.length != 10) {
+ etMobile.error = R.string.valid_mobile_number.toString()
+ return false
+ } else {
+ userData.phoneNumber = mobile
+ }
+
+ val careOf = etCareof.text.toString()
+ if (careOf.isEmpty()) {
+ etCareof.error = R.string.enter_father_husband_name.toString()
+ return false
+ } else {
+ userData.careOf = careOf
+ }
+
+ val maritalStatus = etIsMarried.text.toString()
+ if (maritalStatus.isEmpty()) {
+ etIsMarried.error = R.string.enter_marital_status.toString()
+ return false
+ } else {
+ userData.maritalStatus = maritalStatus
+ }
+
+ val category = etCategory.text.toString()
+ val other = etOther.text.toString()
+ if (category.isEmpty()) {
+ etCategory.error = R.string.enter_category.toString()
+ return false
+ } else if (category == "OTHER" && tilOther.isVisible) {
+ userData.category = other
+ } else {
+ userData.category = category
+ }
+
+ val caste = etCaste.text.toString()
+ val othercaste = etOthercaste.text.toString()
+ if (caste.isEmpty()) {
+ etCaste.error = R.string.enter_caste.toString()
+ return false
+ } else if (caste == "OTHER" && tilOthercaste.isVisible) {
+ userData.caste = othercaste
+ } else {
+ userData.caste = caste
+ }
+
+
+ val subCaste = etSubCaste.text.toString()
+ if (subCaste.isNotEmpty()) {
+ userData.subCaste = subCaste
+ }
+
+ val house = etHouse.text.toString()
+ if (house.isEmpty()) {
+ etHouse.error = R.string.enter_house_address.toString()
+ return false
+ } else {
+ userData.house = house
+ }
+
+ val city = etCity.text.toString()
+ if (city.isEmpty()) {
+ etCity.error = R.string.enter_city.toString()
+ return false
+ } else {
+ userData.city = city
+ }
+
+ val district = etDistrict.text.toString()
+ if (district.isEmpty()) {
+ etDistrict.error = R.string.enter_district.toString()
+ return false
+ } else {
+ userData.district = district
+ }
+
+ val state = etState.text.toString()
+ if (state.isEmpty()) {
+ etState.error = R.string.enter_state.toString()
+ return false
+ } else {
+ userData.state = state
+ }
+
+ val pincode = etPincode.text.toString()
+ if (pincode.isEmpty() || pincode.length != 6) {
+ etPincode.error = R.string.enter_pincode.toString()
+ return false
+ } else {
+ userData.pinCode = pincode
+ }
+
+ userData.isUnderMedication = yes.isChecked
+ userData.isUnderTransfusion = yes1.isChecked
+ userData.sickleCellHistory = yes1history.isChecked.toString()
+
+ if (yes1history.isChecked) {
+ val familyHistory = etFamilyHistory.text.toString()
+ if (familyHistory.isEmpty()) {
+ etFamilyHistory.error = R.string.enter_family_history.toString()
+ return false
+ }
+
+ userData.sickleCellHistory = familyHistory
+ } else {
+
+ userData.sickleCellHistory = null
+
+ }
+
+ return true
+
+
+
+ }
+ }
+
+ private fun showToast(message: String) {
+ Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
diff --git a/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt
new file mode 100644
index 0000000..930e4ca
--- /dev/null
+++ b/app/src/main/java/com/example/hposregistration/ui/viewmodels/RegistrationViewModel.kt
@@ -0,0 +1,76 @@
+package com.example.hposregistration.ui.viewmodels
+
+import android.content.Context
+import android.net.Uri
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.example.hposregistration.data.MainRepository
+import com.example.hposregistration.data.NetworkStatusLiveData
+import com.example.hposregistration.data.Response
+import com.example.hposregistration.data.user.UserData
+import com.google.firebase.storage.FirebaseStorage
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class RegistrationViewModel @Inject constructor(
+ private val mainRepository: MainRepository,
+ context: Context
+) : ViewModel() {
+
+ val userData = MutableLiveData()
+
+ val allUserData = mainRepository.allUsers
+
+ val fireBaseUpload = MutableLiveData()
+
+ fun addUserToDatabase(userData: UserData) = viewModelScope.launch {
+ val file = Uri.parse(userData.userImageURL)
+ val storageRef = FirebaseStorage.getInstance().reference
+ val imageRef = storageRef.child("${userData._id}/${file.lastPathSegment}")
+
+ val uploadTask = file.let { imageRef.putFile(it) }
+ uploadTask.continueWithTask { task ->
+ if (!task.isSuccessful) {
+ throw task.exception!!
+ }
+ imageRef.downloadUrl
+ }.addOnSuccessListener { uri ->
+ userData.userImageURL = uri.toString()
+ addDataToFirebase(userData)
+ }.addOnFailureListener { exception ->
+
+ }
+ }
+
+ private fun addDataToFirebase(userData: UserData) = viewModelScope.launch {
+ when (mainRepository.addDataToFirebase(userData)) {
+ is Response.Success -> {
+ fireBaseUpload.postValue("Success")
+ }
+
+ else -> {
+
+ }
+ }
+ }
+
+ private val _networkStatusLiveData = NetworkStatusLiveData(context)
+ val networkStatusLiveData: LiveData
+ get() = _networkStatusLiveData
+
+ fun insert(userData: UserData) = viewModelScope.launch {
+ mainRepository.insert(userData)
+ }
+
+ fun getUserByID(userId: String) = viewModelScope.launch {
+ userData.postValue(mainRepository.getUserByID(id = userId))
+ }
+
+ fun deleteById(userId: String) = viewModelScope.launch {
+ mainRepository.deleteById(id = userId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml
new file mode 100644
index 0000000..c22704d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml
new file mode 100644
index 0000000..e180e4d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_logout.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_qr_code_scanner.xml b/app/src/main/res/drawable/ic_qr_code_scanner.xml
new file mode 100644
index 0000000..206747a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qr_code_scanner.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/progressbar_costume_view.xml b/app/src/main/res/drawable/progressbar_costume_view.xml
new file mode 100644
index 0000000..613b88a
--- /dev/null
+++ b/app/src/main/res/drawable/progressbar_costume_view.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/sickle_cell_gov_logo.png b/app/src/main/res/drawable/sickle_cell_gov_logo.png
new file mode 100644
index 0000000..20d0952
Binary files /dev/null and b/app/src/main/res/drawable/sickle_cell_gov_logo.png differ
diff --git a/app/src/main/res/drawable/smi_logo.png b/app/src/main/res/drawable/smi_logo.png
new file mode 100644
index 0000000..e3e2ea6
Binary files /dev/null and b/app/src/main/res/drawable/smi_logo.png differ
diff --git a/app/src/main/res/drawable/upload_data.xml b/app/src/main/res/drawable/upload_data.xml
new file mode 100644
index 0000000..c990419
--- /dev/null
+++ b/app/src/main/res/drawable/upload_data.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/font/poppins_bold.ttf b/app/src/main/res/font/poppins_bold.ttf
new file mode 100644
index 0000000..b94d47f
Binary files /dev/null and b/app/src/main/res/font/poppins_bold.ttf differ
diff --git a/app/src/main/res/font/poppins_extra_bold.ttf b/app/src/main/res/font/poppins_extra_bold.ttf
new file mode 100644
index 0000000..8f008c3
Binary files /dev/null and b/app/src/main/res/font/poppins_extra_bold.ttf differ
diff --git a/app/src/main/res/font/poppins_light.ttf b/app/src/main/res/font/poppins_light.ttf
new file mode 100644
index 0000000..2ab0221
Binary files /dev/null and b/app/src/main/res/font/poppins_light.ttf differ
diff --git a/app/src/main/res/font/poppins_medium.ttf b/app/src/main/res/font/poppins_medium.ttf
new file mode 100644
index 0000000..e90e87e
Binary files /dev/null and b/app/src/main/res/font/poppins_medium.ttf differ
diff --git a/app/src/main/res/font/poppins_regular.ttf b/app/src/main/res/font/poppins_regular.ttf
new file mode 100644
index 0000000..be06e7f
Binary files /dev/null and b/app/src/main/res/font/poppins_regular.ttf differ
diff --git a/app/src/main/res/font/poppins_semi_bold.ttf b/app/src/main/res/font/poppins_semi_bold.ttf
new file mode 100644
index 0000000..dabf7c2
Binary files /dev/null and b/app/src/main/res/font/poppins_semi_bold.ttf differ
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..0e525ec
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_abha_registration.xml b/app/src/main/res/layout/fragment_abha_registration.xml
new file mode 100644
index 0000000..6729b21
--- /dev/null
+++ b/app/src/main/res/layout/fragment_abha_registration.xml
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_capture_user_image.xml b/app/src/main/res/layout/fragment_capture_user_image.xml
new file mode 100644
index 0000000..8d9ca7e
--- /dev/null
+++ b/app/src/main/res/layout/fragment_capture_user_image.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
new file mode 100644
index 0000000..a68e4d6
--- /dev/null
+++ b/app/src/main/res/layout/fragment_login.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml
new file mode 100644
index 0000000..ad75626
--- /dev/null
+++ b/app/src/main/res/layout/fragment_profile.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_review_details_registration.xml b/app/src/main/res/layout/fragment_review_details_registration.xml
new file mode 100644
index 0000000..1bfec76
--- /dev/null
+++ b/app/src/main/res/layout/fragment_review_details_registration.xml
@@ -0,0 +1,321 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_user_details_registration.xml b/app/src/main/res/layout/fragment_user_details_registration.xml
new file mode 100644
index 0000000..6d6df39
--- /dev/null
+++ b/app/src/main/res/layout/fragment_user_details_registration.xml
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml
new file mode 100644
index 0000000..53e02b3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_user_list.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_error_message.xml b/app/src/main/res/layout/item_error_message.xml
new file mode 100644
index 0000000..d5f0e9b
--- /dev/null
+++ b/app/src/main/res/layout/item_error_message.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/user_item_view.xml b/app/src/main/res/layout/user_item_view.xml
new file mode 100644
index 0000000..bd1fcaa
--- /dev/null
+++ b/app/src/main/res/layout/user_item_view.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/hpos_icon.xml b/app/src/main/res/mipmap-anydpi-v26/hpos_icon.xml
new file mode 100644
index 0000000..3ef5c0b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/hpos_icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/hpos_icon_round.xml b/app/src/main/res/mipmap-anydpi-v26/hpos_icon_round.xml
new file mode 100644
index 0000000..3ef5c0b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/hpos_icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/hpos_icon.png b/app/src/main/res/mipmap-hdpi/hpos_icon.png
new file mode 100644
index 0000000..3a19d34
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/hpos_icon.png differ
diff --git a/app/src/main/res/mipmap-hdpi/hpos_icon_foreground.png b/app/src/main/res/mipmap-hdpi/hpos_icon_foreground.png
new file mode 100644
index 0000000..7893471
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/hpos_icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/hpos_icon_round.png b/app/src/main/res/mipmap-hdpi/hpos_icon_round.png
new file mode 100644
index 0000000..047361a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/hpos_icon_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/hpos_icon.png b/app/src/main/res/mipmap-mdpi/hpos_icon.png
new file mode 100644
index 0000000..2a5eebe
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/hpos_icon.png differ
diff --git a/app/src/main/res/mipmap-mdpi/hpos_icon_foreground.png b/app/src/main/res/mipmap-mdpi/hpos_icon_foreground.png
new file mode 100644
index 0000000..5d4950d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/hpos_icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/hpos_icon_round.png b/app/src/main/res/mipmap-mdpi/hpos_icon_round.png
new file mode 100644
index 0000000..3bec44e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/hpos_icon_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/hpos_icon.png b/app/src/main/res/mipmap-xhdpi/hpos_icon.png
new file mode 100644
index 0000000..b65f7db
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/hpos_icon.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/hpos_icon_foreground.png b/app/src/main/res/mipmap-xhdpi/hpos_icon_foreground.png
new file mode 100644
index 0000000..1f74549
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/hpos_icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/hpos_icon_round.png b/app/src/main/res/mipmap-xhdpi/hpos_icon_round.png
new file mode 100644
index 0000000..20aea94
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/hpos_icon_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/hpos_icon.png b/app/src/main/res/mipmap-xxhdpi/hpos_icon.png
new file mode 100644
index 0000000..28cb835
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/hpos_icon.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/hpos_icon_foreground.png b/app/src/main/res/mipmap-xxhdpi/hpos_icon_foreground.png
new file mode 100644
index 0000000..cd1b5cd
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/hpos_icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/hpos_icon_round.png b/app/src/main/res/mipmap-xxhdpi/hpos_icon_round.png
new file mode 100644
index 0000000..8e6d235
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/hpos_icon_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/hpos_icon.png b/app/src/main/res/mipmap-xxxhdpi/hpos_icon.png
new file mode 100644
index 0000000..65b6c82
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/hpos_icon.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/hpos_icon_foreground.png b/app/src/main/res/mipmap-xxxhdpi/hpos_icon_foreground.png
new file mode 100644
index 0000000..5d004e4
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/hpos_icon_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/hpos_icon_round.png b/app/src/main/res/mipmap-xxxhdpi/hpos_icon_round.png
new file mode 100644
index 0000000..01337dd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/hpos_icon_round.png differ
diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml
new file mode 100644
index 0000000..bf1a48b
--- /dev/null
+++ b/app/src/main/res/navigation/main_nav_graph.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..2645929
--- /dev/null
+++ b/app/src/main/res/values-hi/strings.xml
@@ -0,0 +1,206 @@
+
+ HPOS रजिस्ट्रेशन
+
+ नमस्ते खाली फ़्रेग्मेंट
+
+
+ पुनः प्रयास करें
+ कनेक्ट करने में विफल
+ रद्द करें
+
+
+ व्यक्ति का ABHA ID/Aadhar ID कार्ड स्कैन करें
+ अब स्कैन करें
+ या
+ ABHA और Aadhar नंबर दर्ज करें
+ ABHA नंबर
+ ABHA ID कार्ड बनाएं
+ यहां क्लिक करें
+ व्यक्ति का Aadhaar कार्ड स्कैन करें
+ आगे बढ़ें
+ Aadhaar नंबर मैन्युअली दर्ज करें
+ Aadhaar नंबर
+ व्यक्ति का विवरण दर्ज करें
+ व्यक्ति का नाम
+ आयु (वर्षों में)
+ लिंग चयन करें
+ नाम खाली नहीं हो सकता
+ आयु खाली नहीं हो सकती
+ लिंग खाली नहीं हो सकता
+ आयु मान्य होनी चाहिए
+ जन्म साल
+ वैवाहिक स्थिति चयन करें
+ पिता/पति का नाम
+ जाति
+ व्यक्ति का पता विवरण
+ जिला
+ शहर / गाँव
+ राज्य
+ पिनकोड
+ रोगी का चिकित्सा रेकॉर्ड
+ समीक्षा
+ रक्त समूह चयन करें
+ घर
+ क्या आप पिछले तीन महीनों से सिक्ल सेल के लिए दवा ले रहे हैं?
+ क्या आपने पिछले तीन महीनों में कोई रक्त प्रवाहन किया है?
+
+ उपयोगकर्ता सूची
+ उपयोगकर्ता पंजीकृत करें
+ क्या उपयोगकर्ता के पास सिक्ल सेल के लिए कोई परिवार का इतिहास है?
+ सिक्ल सेल का परिवारिक इतिहास
+ मोबाइल नंबर (10 अंक)
+ उपजाति
+ उपयोगकर्ता की छवि कैद करें
+ मोबाइल नंबर
+ संपादित करें
+ उपयोगकर्ता विवरण
+ इंटरनेट उपलब्ध नहीं है और स्थानीय डेटाबेस में कोई डेटा उपलब्ध नहीं है
+ उपयोगकर्ता आईडी: %1$s
+ ABHA नंबर: %1$s
+ Aadhar नंबर: %1$s
+ व्यक्ति का नाम: %1$s
+ जन्म साल: %1$s
+ लिंग: %1$s
+ मोबाइल नंबर: %1$s
+ पिता/पति का नाम: %1$s
+ वैवाहिक स्थिति: %1$s
+ श्रेणी: %1$s
+ जाति: %1$s
+ उपजाति: %1$s
+ घर: %1$s
+ शहर/गाँव: %1$s
+ जिला: %1$s
+ राज्य: %1$s
+ केंद्र का नाम: %1$s
+
+ पिनकोड: %1$s
+ क्या दवा ले रहे हैं: %1$s
+ क्या रक्त प्रवाहन हो रहा है: %1$s
+ क्या कोई सिक्ल सेल इतिहास है: %1$s
+ सिक्ल सेल परिवारिक इतिहास: %1$s
+ केंद्र का नाम
+ लॉगिन आईडी
+ पासवर्ड
+ लॉगिन
+ श्रेणी
+ श्रेणी
+ पुरुष
+ महिला
+ अन्य
+ रद्द किया गया: स्कैन करने में असमर्थ, पुनः प्रयास करें!!
+ कृपया एबीए आईडी / आधार आईडी स्कैन करें
+ आपने स्कैन किया हुआ QR कोड अमान्य है, कृपया डेटा मैन्युअली दर्ज करें
+ आपने एबीए आईडी स्कैन किया है, आधार आईडी को मैन्युअली दर्ज करने की आवश्यकता है
+ अमान्य एबीए आईडी
+ अमान्य आधार आईडी
+ नाम फील्ड खाली नहीं हो सकती या 3 अक्षरों से कम होनी चाहिए
+ केंद्र का नाम खाली नहीं हो सकता या 3 अक्षरों से कम होना चाहिए
+ पंजीकरण सफलतापूर्वक हुआ
+ इंटरनेट उपलब्ध नहीं है, परीक्षण विवरण स्थानीय रूप से संग्रहित किए गए हैं
+ कृपया सभी विवरणों को ठीक से दर्ज करें
+ कृपया 1900 से 2023 के बीच एक मान्य जन्म वर्ष दर्ज करें
+ कृपया फ़ील्ड भरें
+ कृपया एक मान्य 10-अंकों का मोबाइल नंबर दर्ज करें
+ कृपया अपना नाम दर्ज करें
+ कृपया अपनी वैवाहिक स्थिति दर्ज करें
+ कृपया अपनी श्रेणी दर्ज करें
+ कृपया अपनी जाति दर्ज करें
+ कृपया अपना घर का पता दर्ज करें
+ कृपया अपने शहर को दर्ज करें
+ कृपया अपने जिले को दर्ज करें
+ कृपया अपने राज्य को दर्ज करें
+ कृपया एक मान्य 6-अंकों कोड दर्ज करें
+ कृपया अपना परिवार का इतिहास दर्ज करें
+ कृपया अपने पालक का नाम दर्ज करें
+ पिता / पति का नाम दर्ज करें
+ क्या आप ऐप्लिकेशन से लॉग आउट करना चाहते हैं?
+ लॉग आउट
+
+ डीबी पंजीकरण अपलोड करें
+ क्या आप स्थानीय डीबी को क्लाउड पर अपलोड करना चाहते हैं?
+ अपलोड
+ अपलोड सफलतापूर्वक हुआ
+
+ कृपया सही लॉगिन आईडी दर्ज करें
+ कृपया सही पासवर्ड दर्ज करें
+ गलत पासवर्ड
+ गलत उपयोगकर्ता आईडी
+ आपने आधार आईडी स्कैन की है, कृपया आधार आईडी नंबर और अभा आईडी को मैन्युअली दर्ज करें
+ आपने आभा आईडी स्कैन की है
+ आपने आधार आईडी स्कैन की है
+
+
+ - NT-A
+ - NT-B
+ - NT-C
+ - NT-D
+ - OBC
+ - OPEN
+ - OTHER
+ - SBC
+ - SC
+ - ST
+
+
+
+ - अहीर
+ - बराई
+ - ब्राह्मण
+ - बौद्ध
+ - चांब़चार
+ - चामार
+ - देवांगन
+ - धीवर
+ - फुलमाली
+ - गोंड
+ - जैन
+ - कोली
+ - कोष्टी
+ - कुंभार
+ - कुंबी
+ - लोहार
+ - माळी
+ - माणा
+ - महार
+ - मौर्या
+ - मुसलमान
+ - नवी
+ - अन्य
+ - पवार
+ - परदेसी
+ - शाहू
+ - सोनार
+ - तेली
+
+
+
+
+ - विवाहित
+ - एकत्र
+ - तलाकशुदा
+
+
+
+
+ - O+ve
+ - O-ve
+ - A+ve
+ - A-ve
+ - B+ve
+ - B-ve
+ - AB+ve
+ - AB-ve
+
+
+
+ - पुरुष
+ - महिला
+ - अन्य
+
+
+
+ - हाँ
+ - नहीं
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml
new file mode 100644
index 0000000..91bbd61
--- /dev/null
+++ b/app/src/main/res/values-ka/strings.xml
@@ -0,0 +1,211 @@
+
+ HPOS ನೋಂದಾಯಿಸಲು
+ ಹಲೋ ಖಾಲಿ ಫ್ರ್ಯಾಗ್ಮೆಂಟ್
+
+ // ದೋಷ ಸಂದೇಶಗಳು
+ ಮರುಪ್ರಯಾಸ
+ ಸಂಪರ್ಕ ಸಾಧಿಸಲಾಗಿಲ್ಲ
+ ರದ್ದು ಮಾಡಿ
+
+
+ //Registration Screens
+ ವ್ಯಕ್ತಿಯ ಏಬಿಎ ಐಡಿ / ಆಧಾರ್ ಐಡಿ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ
+ ಈಗ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ
+ ಅಥವಾ
+ ಏಬಿಎ ಮತ್ತು ಆಧಾರ್ ಸಂಖ್ಯೆಗಳನ್ನು ಕೈಮಾಡಿ
+ ಏಬಿಎ ಸಂಖ್ಯೆ
+ ಏಬಿಎ ಐಡಿ ಕಾರ್ಡ್ ರಚಿಸಿ
+ ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ
+ ವ್ಯಕ್ತಿಯ ಆಧಾರ್ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ
+ ಮುಂದುವರಿಸಿ
+ ಆಧಾರ್ ಸಂಖ್ಯೆಯನ್ನು ಕೈಮಾಡಿ
+ ಆಧಾರ್ ಸಂಖ್ಯೆ
+ ವ್ಯಕ್ತಿಯ ವಿವರಗಳನ್ನು ನಮೂದಿಸಿ
+ ವ್ಯಕ್ತಿಯ ಹೆಸರು
+ ವಯಸ್ಸು ವರ್ಷಗಳಲ್ಲಿ
+ ಲಿಂಗ ಆಯ್ಕೆ ಮಾಡಿ
+ ಹೆಸರು ಖಾಲಿ ಇರಬಾರದು
+ ವಯಸ್ಸು ಖಾಲಿ ಇರಬಾರದು
+ ಲಿಂಗ ಖಾಲಿ ಇರಬಾರದು
+ ವಯಸ್ಸು ಯೋಗ್ಯವಾಗಿರಬೇಕು
+ ಹುಟ್ಟಿದ ವರ್ಷ
+ ವೈವಾಹಿಕ ಸ್ಥಿತಿ ಆಯ್ಕೆ ಮಾಡಿ
+ ತಂದೆಯ / ಗಂಡನ ಹೆಸರು
+ ಜಾತಿ
+ ವ್ಯಕ್ತಿಯ ವಿಳಾಸ ವಿವರಗಳು
+ ಜಿಲ್ಲೆ
+ ನಗರ / ಹಳ್ಳಿ
+ ರಾಜ್ಯ
+ ಪಿನ್ಕೋಡ್
+ ರೋಗಿಯ ವೈದ್ಯಕೀಯ ದಾಖಲೆಗಳು
+ ಸಮೀಕ್ಷಿಸಿ
+ ರಕ್ತ ಗುಂಪು ಆಯ್ಕೆ ಮಾಡಿ
+ ಮನೆ
+ ಹಳೆಯ ಮೂಲಕ ಸಿಕ್ಕಲ್ ಸೆಲ್ ಗೆ ನೀವು ಔಷಧಿಗೆ ಒಳಪಟ್ಟಿದ್ದೀರಾ?
+ ಹಳೆಯ ಮೂಲಕ ರಕ್ತ ಸಂಚಾರ ನಡೆಸಲಾಗಿದೆಯೇ?
+
+
+ ಬಳಕೆದಾರ ಪಟ್ಟಿ
+ ಬಳಕೆದಾರ ನೋಂದಣಿ
+ ಬಳಕೆದಾರನಿಗೆ ಸಿಕ್ಕಲ್ ಸೆಲ್ ಕುಟುಂಬ ಇತಿಹಾಸವಿದೆಯೇ
+ ಸಿಕ್ಕಲ್ ಸೆಲ್ ಕುಟುಂಬ ಇತಿಹಾಸ
+ ಮೊಬೈಲ್ ಸಂಖ್ಯೆ (10 ಅಂಕಗಳು)
+ ಉಪ ಜಾತಿ
+ ಬಳಕೆದಾರ ಚಿತ್ರ ಹಿಡಿಯಿರಿ
+ ಮೊಬೈಲ್ ಸಂಖ್ಯೆ
+ ಸಂಪಾದಿಸಿ
+ ಬಳಕೆದಾರ ವಿವರಗಳು
+ ಇಂಟರ್ನೆಟ್ ಲಭ್ಯವಿಲ್ಲ ಮತ್ತು ಸ್ಥಳಿಯ ಡಿಬಿಯಲ್ಲಿ ಯಾವುದೇ ಡೇಟಾ ಲಭ್ಯವಿಲ್ಲ
+ ಬಳಕೆದಾರ ಐಡಿ: %1$s
+ ಆಭಾ ಸಂಖ್ಯೆ: %1$s
+ ಆಧಾರ ಸಂಖ್ಯೆ: %1$s
+ ವ್ಯಕ್ತಿಯ ಹೆಸರು: %1$s
+ ಹುಟ್ಟಿದ ವರ್ಷ: %1$s
+ ಲಿಂಗ: %1$s
+ ಮೊಬೈಲ್ ಸಂಖ್ಯೆ: %1$s
+ ತಂದೆಯ / ಗಂಡನ ಹೆಸರು: %1$s
+ ವೈವಾಹಿಕ ಸ್ಥಿತಿ: %1$s
+ ವರ್ಗ: %1$s
+ ಜಾತಿ: %1$s
+ ಉಪ ಜಾತಿ: %1$s
+ ಮನೆ: %1$s
+ ನಗರ / ಹಳ್ಳಿ: %1$s
+ ಜಿಲ್ಲೆ: %1$s
+ ರಾಜ್ಯ: %1$s
+ ಕೇಂದ್ರ ಹೆಸರು: %1$s
+
+
+ ಪಿನ್ಕೋಡ್: %1$s
+ ಔಷಧಿಗಳ ಕೆಳಗೆ ಇದ್ದಾರೆ: %1$s
+ ರಕ್ತ ಸಂರಚನೆಯಲ್ಲಿ ಇದ್ದಾರೆ: %1$s
+ ಯಾವುದೇ ಸಿಕ್ಕಲ್ ಸೆಲ್ ಇತಿಹಾಸವಿದೆಯೇ: %1$s
+ ಸಿಕ್ಕಲ್ ಸೆಲ್ ಕುಟುಂಬ ಇತಿಹಾಸ: %1$s
+ ಕೇಂದ್ರ ಹೆಸರು
+ ಲಾಗಿನ್ ಐಡಿ
+ ಪಾಸ್ವರ್ಡ್
+ ಲಾಗಿನ್
+ ವರ್ಗ
+ ವರ್ಗ
+ ಗಂಡು
+ ಹೆಣ್ಣು
+ ಇತರ
+
+
+ ರದ್ದು ಮಾಡಲಾಗಿದೆ: ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ಮತ್ತೊಮ್ಮೆ ಪ್ರಯಾಸಿಸಿ!!
+ ದಯವಿಟ್ಟು ಆಭಾ ಐಡಿ / ಆಧಾರ್ ಐಡಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ
+ ನೀವು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ QR ಕೋಡ್ ಮಾನ್ಯವಿಲ್ಲ, ದಯವಿಟ್ಟು ಮಾಹಿತಿಯನ್ನು ಕೈಮಾಡಿ ನಮೂದಿಸಿ
+ ನೀವು ಅಬ ಹಾ ಐಡಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ, ಆಧಾರ್ ಐಡಿ ಅನ್ನು ಕೈಮಾತ್ರ ನಮೂದಿಸಿ
+ ಅಮಾನ್ಯವಾದ ಅಬ ಹಾ ಐಡಿ
+ ಅಮಾನ್ಯವಾದ ಆಧಾರ್ ಐಡಿ
+ ಹೆಸರು ಕ್ಷೇತ್ರವು ಖಾಲಿ ಇರಲಾರದು ಅಥವಾ 3 ಅಕ್ಷರಗಳಿಂದ ಕಡಿಮೆ ಇರಲಾರದು
+ ಕೇಂದ್ರದ ಹೆಸರು ಖಾಲಿ ಇರಲಾರದು ಅಥವಾ 3 ಅಕ್ಷರಗಳಿಂದ ಕಡಿಮೆ ಇರಲಾರದು
+ ಯಶಸ್ವಿಯಾಗಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ
+ ಇಂಟರ್ನೆಟ್ ಲಭ್ಯವಿಲ್ಲ, ಪರೀಕ್ಷೆ ವಿವರಗಳನ್ನು ಸ್ಥಾನಿಕವಾಗಿ ಉಳಿಸಲಾಗಿದೆ
+ ದಯವಿಟ್ಟು ಎಲ್ಲಾ ವಿವರಗಳನ್ನು ಸರಿಯಾಗಿ ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು 1900 ಮತ್ತು 2023 ನ ನಡುವೆ ಒಂದು ವಾಸಿಸುವ ತಾರೀಖು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ಕ್ಷೇತ್ರವನ್ನು ನಿರೂಪಿಸಿ
+ ದಯವಿಟ್ಟು ಒಂದು ಮಾನ್ಯವಾದ 10 ಅಂಕದ ಮೊಬೈಲ್ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹೆಸರನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ವೈವಾಹಿಕ ಸ್ಥಿತಿಯನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ವರ್ಗವನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಜಾತಿಯನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಮನೆಯ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಗರವನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಜಿಲ್ಲೆಯನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ರಾಜ್ಯವನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ಒಂದು ಮಾನ್ಯ ಆರು-ಅಂಕ ಪಿನ್ಕೋಡ್ ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಕುಟುಂಬದ ಇತಿಹಾಸವನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಅಭಿಭಾವಕರ ಹೆಸರನ್ನು ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ನಿಮ್ಮ ತಂದೆ / ಗಂಡನ ಹೆಸರನ್ನು ನಮೂದಿಸಿ
+ ನೀವು ಅಪ್ಲಿಕೇಶನ್ ನಿಂದ ಲಾಗೌಟ್ ಮಾಡಲು ಇಚ್ಛಿಸುತ್ತೀರಾ?
+ ಲಾಗೌಟ್
+
+ ಡಿಬಿ ನೋಂದಾಯಿಸುವ ಕೊರಕು
+ ನೀವು ಲೋಕಲ್ ಡಿಬಿ ನೋಂದಾಯಿಸನ್ನು ಮೇಘಮಾರ್ಗಕ್ಕೆ ಅಪ್ಲೋಡ್ ಮಾಡಲು ಇಚ್ಛಿಸುವಿರಾ?
+ ಅಪ್ಲೋಡ್
+ ಅಪ್ಲೋಡ್ ಯಶಸ್ವಿಯಾಗಿ ನಡೆಯಿತು
+ ದಯವಿಟ್ಟು ಸರಿಯಾದ ಲಾಗಿನ್ ಐಡಿ ನಮೂದಿಸಿ
+ ದಯವಿಟ್ಟು ಸರಿಯಾದ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ
+ ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್
+ ತಪ್ಪಾದ ಬಳಕೆದಾರ ಐಡಿ
+ ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ್ದೀರಿ, ದಯವಿಟ್ಟು ಆಧಾರ್ ಐಡನ್ನು ನೀವು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದ ಮತ್ತು ಅಭಾ ಐಡನ್ನು ಕೈಯಾರೆ ನಮೂದಿಸಿ
+
+ ನೀವು ಅಭಾ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದಿರಿ
+ ನೀವು ಆಧಾರ್ ಐಡನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿದಿರಿ
+
+
+
+ - ಹೌದು
+ - ಇಲ್ಲ
+
+
+
+ - NT-A
+ - NT-B
+ - NT-C
+ - NT-D
+ - OBC
+ - OPEN
+ - OTHER
+ - SBC
+ - SC
+ - ST
+
+
+
+ - ಅಹೀರ್
+ - ಬರಾಯಿ
+ - ಬ್ರಾಹ್ಮಣ
+ - ಬೌದ್ಧ
+ - ಚಾಂಭಾರ್
+ - ಚಾಮಾರ್
+ - ದೇವಾಂಗನ್
+ - ಧಿವರ್
+ - ಫುಲ್ಮಾಲಿ
+ - ಗೊಂಡ್
+ - ಜೈನ್
+ - ಕೊಲಿ
+ - ಕೊಶ್ತಿ
+ - ಕುಂಭಾರ
+ - ಕುಂಬಿ
+ - ಲೊಹರ್
+ - ಮಾಳಿ
+ - ಮಣ್ಣ
+ - ಮಹಾರ್
+ - ಮೌರ್ಯ
+ - ಮಸ್ಲಿಮ್
+ - ನಾವಿ
+ - ಇತರ
+ - ಪವಾರ್
+ - ಪರ್ದೇಶಿ
+ - ಶಾಹು
+ - ಸೋನಾರ್
+ - ತೆಲಿ
+
+
+
+ - ವಿವಾಹಿತ
+ - ಅವಿವಾಹಿತ
+ - ವಿವಾಹ ವಿಚ್ಛೇದ
+
+
+
+
+ - O+ve
+ - O-ve
+ - A+ve
+ - A-ve
+ - B+ve
+ - B-ve
+ - AB+ve
+ - AB-ve
+
+
+
+ - ಗಂಡು
+ - ಹೆಣ್ಣು
+ - ಇತರ
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..af71b60
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #4daaff
+ #005db3
+ #e5f3ff
+ #FF000000
+ #FFFFFFFF
+ #808080
+ #FF0000
+
\ No newline at end of file
diff --git a/app/src/main/res/values/hpos_icon_background.xml b/app/src/main/res/values/hpos_icon_background.xml
new file mode 100644
index 0000000..d0e39e1
--- /dev/null
+++ b/app/src/main/res/values/hpos_icon_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b947e2d
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,205 @@
+
+ HPOS Registration
+
+ Hello blank fragment
+
+ //Error message
+ Retry
+ Failed to connect
+ Cancel
+
+
+ - Yes
+ - No
+
+
+ //Registration Screens
+ Scan Person ABHA ID/Aadhar ID Card
+ Scan Now
+ OR
+ Enter ABHA and Aadhar Number
+ ABHA Number
+ Create ABHA ID card
+ Click Here
+ Scan Person\'s Aadhaar Card
+ Proceed
+ Enter Aadhaar number manualy
+ Aadhaar Number
+ Enter Person\'s Details
+ Person\'s Name
+ Age in years
+ Select Gender
+ Name can\'t be empty
+ Age can\'t be empty
+ Gender can\'t be empty
+ Age should be valid
+ Birth Year
+ Select Marital status
+ Father\'s/Husband\'s Name
+ Caste
+ Person\'s Address Details
+ District
+ City / Town
+ State
+ Pincode
+ Patient Medical Records
+ Review
+ Select Blood Group
+ House
+ Have you been under medication for Sickle Cell in the past three months?
+ Have you undergone any Blood transfusions in the Past three months ?
+
+ User List
+ Register User
+ Is user having any family history for Sickle Cell
+ Family History of Sickle Cell
+ Mobile Number (10 digits)
+ Sub Caste
+ Capture User Image
+ Mobile Number
+ Edit
+ User Details
+ Internet is not available and there is no Data available in Local DB
+ User ID: %1$s
+ Abha Number: %1$s
+ Aadhar Number: %1$s
+ Person\'s Name: %1$s
+ Birth Year: %1$s
+ Gender: %1$s
+ Mobile Number: %1$s
+ Father\'s/Husband\'s Name: %1$s
+ Marital Status: %1$s
+ Category: %1$s
+ Caste: %1$s
+ Sub Caste: %1$s
+ House: %1$s
+ City/Town: %1$s
+ District: %1$s
+ State: %1$s
+ Center Name: %1$s
+
+ Pincode: %1$s
+ Is Under Medication: %1$s
+ Is Under Blood Transfusion: %1$s
+ Is Any Sickle cell History: %1$s
+ Sickle cell Family History: %1$s
+ Center Name
+ Login ID
+ Password
+ Login
+ Category
+ Category
+ Male
+ Female
+ Other
+
+ Cancelled: Unable to scan, Try Again!!
+ Please Scan the Abha ID/Aadhar ID
+ The QR Code you have scanned is not valid, enter the data manually
+ You have scanned the Abha ID, need to enter Aadhar ID manually
+ Invalid Abha ID
+ Invalid Aadhar ID
+ Name field can\'t be empty or less than 3 characters
+ Center name can\'t be empty or less than 3 characters
+ Registration Done Successfully
+ Internet not available, test details stored locally
+ Please enter all the details properly
+ Please enter a valid birth year between 1900 and 2023
+ Please fill the field
+ Please enter a valid 10-digit mobile number
+ Please enter your name
+ Please enter your marital status
+ Please enter your category
+ Please enter your caste
+ Please enter your house address
+ Please enter your city
+ Please enter your district
+ Please enter your state
+ Please enter a valid 6-digit pin code
+ Please enter your family history
+ Please enter your guardian name
+ enter father/husband name
+ Do you want to LogOut the Application?
+ Log Out
+ Upload DB Registration
+ Do you want to upload the local DB Registration to the cloud?
+ Upload
+ Upload done successfully
+
+ Please enter a proper Login ID
+ Please enter a proper password
+ Wrong Password
+ Wrong UserID
+
+ You have scanned the Aadhar ID, need to enter Aadhar ID number you have scanned and Abha ID manually
+ You have scanned the Abha ID
+ You have scanned the Aadhar ID
+
+
+ - NT-A
+ - NT-B
+ - NT-C
+ - NT-D
+ - OBC
+ - OPEN
+ - OTHER
+ - SBC
+ - SC
+ - ST
+
+
+
+ - AHIR
+ - BARAI
+ - BRAHMAN
+ - BUDDHIST
+ - CHAMBHAR
+ - CHAMAR
+ - DEWANGAN
+ - DHIWAR
+ - FULMALI
+ - GOND
+ - JAIN
+ - KOLI
+ - KOSHTI
+ - KUMBHAR
+ - KUNBI
+ - LOHAR
+ - MALI
+ - MANNA
+ - MAHAR
+ - MOURYA
+ - MUSLIM
+ - NAVI
+ - OTHER
+ - PAWAR
+ - PARDESI
+ - SHAHU
+ - SONAR
+ - TELI
+
+
+
+ - Married
+ - Single
+ - Divorce
+
+
+
+ - O+ve
+ - O-ve
+ - A+ve
+ - A-ve
+ - B+ve
+ - B-ve
+ - AB+ve
+ - AB-ve
+
+
+
+ - Male
+ - Female
+ - Other
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..da999a3
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..3b41415
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..d7d98d4
--- /dev/null
+++ b/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/com/example/hposregistration/ExampleUnitTest.kt b/app/src/test/java/com/example/hposregistration/ExampleUnitTest.kt
new file mode 100644
index 0000000..052990b
--- /dev/null
+++ b/app/src/test/java/com/example/hposregistration/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.hposregistration
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..3c8d57b
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,10 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '8.0.2' apply false
+ id 'com.android.library' version '8.0.2' apply false
+ id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
+ id 'androidx.navigation.safeargs' version '2.7.0-beta02' apply false
+ id 'com.google.dagger.hilt.android' version '2.46' apply false
+ id "com.google.gms.google-services" version "4.3.15" apply false
+ id 'com.google.firebase.crashlytics' version "2.9.8" apply false
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..a2e90d8
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,25 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
+android.defaults.buildfeatures.buildconfig=true
+android.nonFinalResIds=false
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..99d6797
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jul 12 14:05:11 IST 2023
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..1055e41
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "HPOS Registration"
+include ':app'