package Ġcom . blue b err ys olution . pin el ib 1 9 . hardware . device ĊĊ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Environment Ċ import Ġandroid . tele phony . Tele phony Manager Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util . UUID Ċ Ċ /** Ċ Ġ* Ġ@ author Ġli ang jun Ġon Ġ 2 0 1 8 / 1 / 2 1 . Ċ Ġ*/ Ċ Ċ object ĠGet DeviceId Ġ{ ĊĊĠĠĠ Ġ// ä¿ĿåŃĺ æĸĩä»¶çļĦ è·¯å¾Ħ ĊĠĠĠ Ġprivate Ġval ĠCACHE _ IMAGE _ DIR Ġ= Ġ" ar ay / cache / devices " ĊĠĠĠ Ġ// ä¿ĿåŃĺ çļĦæĸĩä»¶ Ġ éĩĩçĶ¨ éļĲèĹı æĸĩä»¶çļĦ å½¢å¼ı è¿Ľè¡Į ä¿ĿåŃĺ ĊĠĠĠ Ġprivate Ġval ĠDE VICES _ FILE _ NAME Ġ= Ġ". DEVICES " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ è®¾å¤ĩ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget DeviceId ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è¯»åıĸ ä¿ĿåŃĺ çļĦ åľ¨ sd åį¡ ä¸ŃçļĦ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠĠĠĠ Ġvar ĠdeviceId Ġ= Ġread Device ID ( context ) ĊĠĠĠĠĠĠĠ Ġ// çĶ¨äºİ çĶŁæĪĲ æľĢç»Ī çļĦ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ æĺ¯åĲ¦ å·²ç»ı çĶŁæĪĲ è¿ĩ , ĊĠĠĠĠĠĠĠ Ġif Ġ( deviceId Ġ!= Ġnull Ġ&& Ġ"" Ġ!= ĠdeviceId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠdeviceId ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ IM ES ( ä¹Łå°±æĺ¯ å¸¸ è¯´ çļĦ DeviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġget IM IE Status ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . append ( deviceId ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ è®¾å¤ĩ çļĦ MAC Address åľ°åĿĢ Ġ åİ» æİī ä¸ŃéĹ´ çĽ¸ éļĶ çļĦ åĨ Ĵ åı· ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġget Local Mac ( context ). replace (" :", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . append ( deviceId ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ ä»¥ä¸Ĭ æĲ ľ æ²¡æľī èİ·åıĸ çĽ¸åºĶ çļĦ åĪĻ èĩªå·± çĶŁæĪĲ çĽ¸åºĶ çļĦ UUID ä½ľä¸º çĽ¸åºĶ è®¾å¤ĩ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠĠĠĠ Ġif Ġ( s Ġ== Ġnull Ġ|| Ġs . length Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġuuid . toString (). replace ("- ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . append ( deviceId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ä¸ºäºĨ ç»Łä¸Ģ æł¼å¼ı å¯¹ è®¾å¤ĩ çļĦ åĶ¯ä¸Ģ æłĩè¯Ĩ è¿Ľè¡Į md 5 åĬłå¯Ĩ Ġ æľĢç»Ī çĶŁæĪĲ 3 2 ä½į åŃĹç¬¦ä¸² ĊĠĠĠĠĠĠĠ Ġval Ġmd 5 Ġ= Ġget MD 5 ( s . toString (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( s . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĮģ ä¹ħ åĮĸ æĵįä½ľ , Ġ è¿Ľè¡Į ä¿ĿåŃĺ åĪ° SD åį¡ ä¸Ń ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Device ID ( md 5 , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmd 5 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ åĽº å®ļçļĦ æĸĩä»¶ ä¸ŃçļĦ åĨħå®¹ , è¿ĻéĩĮ å°±æĺ¯ è¯»åıĸ sd åį¡ ä¸Ń ä¿ĿåŃĺ çļĦ è®¾å¤ĩ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread Device ID ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġget Devices Dir ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfis Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis r Ġ= ĠInputStreamReader ( fis , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin 0 Ġ= ĠBufferedReader ( isr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġin 0 . read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ<= Ġ- 1 ) Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . append ( i . to Char ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} while Ġ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin 0 . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ è®¾å¤ĩ çļĦ DeviceId ( IM ES ) Ġ è¿ĻéĩĮ éľĢè¦ģ çĽ¸åºĶ çļĦ æĿĥéĻĲ < br ></ br > ĊĠĠĠĠ Ġ* ĠéľĢè¦ģ ĠREAD _ PHONE _ STATE Ġ æĿĥéĻĲ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġget IM IE Status ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtm Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . TELE PHONY _ SERVICE ) Ġas ĠTele phony Manager ĊĠĠĠĠĠĠĠ Ġreturn Ġtm . deviceId ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ è®¾å¤ĩ MAC Ġ åľ°åĿĢ Ġ çĶ±äºİ Ġ 6 . 0 Ġä»¥ åĲİ ĠW ifi Manager Ġ å¾ĹåĪ° çļĦ ĠMac Address å¾ĹåĪ° éĥ½æĺ¯ Ġ çĽ¸åĲĮ çļĦ æ²¡æľī æĦı ä¹ī çļĦåĨħå®¹ ĊĠĠĠĠ Ġ* Ġ æīĢä»¥ éĩĩçĶ¨ ä»¥ä¸ĭ æĸ¹æ³ķ èİ·åıĸ Mac åľ°åĿĢ ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Local Mac ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠW ifi Manager Ġwifi Ġ= Ġ( Wifi Manager ) Ġcontext ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . WIFI _ SERVICE ); ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠW ifi Info Ġinfo Ġ= Ġwifi . getConnection Info (); ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġreturn Ġinfo . get Mac Address (); ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġmac Address : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġvar Ġnetwork Interface : ĠNetwork Interface ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Interface Ġ= ĠNetwork Interface . get ByName (" eth 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Interface Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Interface Ġ= ĠNetwork Interface . get ByName (" w lan 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Interface Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr Ġ= Ġnetwork Interface . hardware Address ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġaddr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( String . format ("% 0 2 X :", Ġb )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buf . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . delete Char At ( buf . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmac Address Ġ= Ġbuf . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmac Address ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ Ġ åĨħå®¹ åĪ° ĠSD åį¡ ä¸Ń , Ġ Ġ è¿ĻéĩĮ ä¿ĿåŃĺ çļĦ å°±æĺ¯ Ġ è®¾å¤ĩ åĶ¯ä¸Ģ æłĩè¯Ĩ ç¬¦ ĊĠĠĠĠ Ġ* Ġ@ param Ġstr ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Device ID ( str : ĠString , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġget Devices Dir ( context ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠOutputStream Writer ( fos , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå¯¹ æĮ º çī¹ å®ļçļĦ Ġ åĨħå®¹ è¿Ľè¡Į Ġmd 5 Ġ åĬłå¯Ĩ ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġ Ġ åĬłå¯Ĩ æĺİ æĸĩ ĊĠĠĠĠ Ġ* Ġ@ param Ġupper Case Ġ Ġ åĬłå¯Ĩ ä»¥ åĲİçļĦ åŃĹç¬¦ä¸² æĺ¯ æĺ¯ å¤§ åĨĻ è¿ĺæĺ¯ å°ı åĨĻ Ġ Ġtrue Ġå¤§ åĨĻ Ġ Ġfalse Ġå°ı åĨĻ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget MD 5 ( message : ĠString , Ġupper Case : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmd 5 str Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġmessage . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= Ġmd . digest ( input ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str Ġ= Ġbytes To Hex ( buff , Ġupper Case ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmd 5 str ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġbytes To Hex ( bytes : ĠByteArray , Ġupper Case : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmd 5 str Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġvar Ġdigital : ĠInt ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigital Ġ= Ġbytes [ i ]. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digital Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigital Ġ+= Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digital Ġ< Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . append (" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . append ( Integer . to HexString ( digital )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( upper Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . toString (). toUpperCase () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġmd 5 str . toString (). toLowerCase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç»Łä¸Ģ å¤ĦçĲĨ è®¾å¤ĩ åĶ¯ä¸Ģ æłĩè¯Ĩ Ġ ä¿ĿåŃĺ çļĦæĸĩä»¶ çļĦ åľ°åĿĢ ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Devices Dir ( context : ĠContext ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Crop File : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( Environment . get External Storage State () Ġ== ĠEnvironment . MEDIA _ MOUNT ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrop dir Ġ= ĠFile ( Environment . get External Storage Directory (), ĠCACHE _ IMAGE _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! crop dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crop File Ġ= ĠFile ( crop dir , ĠDE VICES _ FILE _ NAME ) Ġ// ĠçĶ¨ å½ĵåīį æĹ¶éĹ´ ç»Ļ åıĸå¾Ĺ çļĦ åĽ¾çīĩ åĳ½åĲį ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrop dir Ġ= ĠFile ( context . files Dir , ĠCACHE _ IMAGE _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! crop dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Crop File Ġ= ĠFile ( crop dir , ĠDE VICES _ FILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm Crop File ĊĠĠĠ Ġ} Ċ }