/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 4 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 . Ċ Ġ*/ Ċ Ċ package Ġcom . android . input method . keyboard Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION _ CODES Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . util . Log Ċ Ċ import Ġcom . android . input method . latin . R Ċ Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Arrays Ċ Ċ class ĠKeyboard Theme // ĠNote : ĠThe Ġtheme Id Ġshould Ġbe Ġaligned Ġwith Ġ" theme Id " Ġattribute Ġof ĠKeyboard Ġstyle Ċ // Ġin Ġvalues / themes -< style >. xml . Ċ internal Ġconstructor ( val Ġm Theme Id : ĠInt , Ġval Ġm Theme Name : ĠString , Ġval Ġm Style Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Min ApiVersion : ĠInt ) Ġ: ĠComparable < Keyboard Theme > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( rhs : ĠKeyboard Theme ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Min ApiVersion Ġ> Ġrhs . m Min ApiVersion ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Min ApiVersion Ġ< Ġrhs . m Min ApiVersion ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( o : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( o Ġ=== Ġthis ) Ġtrue Ġelse Ġo Ġis ĠKeyboard Theme Ġ&& Ġo . m Theme Id Ġ== Ġm Theme Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Theme Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠKeyboard Theme :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠK LP _ KEY BOARD _ THEME _ KEY Ġ= Ġ" pref _ keyboard _ layout _ 2 0 1 1 0 9 1 6 " ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠL XX _ KEY BOARD _ THEME _ KEY Ġ= Ġ" pref _ keyboard _ theme _ 2 0 1 4 0 5 0 9 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġshould Ġbe Ġaligned Ġwith ĠKeyboard . theme Id Ġand ĠKeyboard . Case . keyboard Theme ĊĠĠĠĠĠĠĠ Ġ// Ġattributes ' Ġvalues Ġin Ġattrs . xml . ĊĠĠĠĠĠĠĠ Ġval ĠTHE ME _ ID _ ICS Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠTHE ME _ ID _ K LP Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġval ĠTHE ME _ ID _ L XX _ LIGHT Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġval ĠTHE ME _ ID _ L XX _ DARK Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ THEME _ ID Ġ= ĠTHE ME _ ID _ K LP ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠA VA IL ABLE _ KEY BOARD _ THE MES : ĠArray < Keyboard Theme > Ġ= Ġempty Array () ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠKEY BOARD _ THE MES Ġ= ĠarrayOf ( Keyboard Theme ( THEME _ ID _ ICS , Ġ" ICS ", ĠR . style . Keyboard Theme _ ICS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġhas Ġnever Ġbeen Ġselected Ġbecause Ġwe Ġsupport ĠI CS Ġor Ġlater . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERSION _ CODES . BASE ), ĠKeyboard Theme ( THEME _ ID _ K LP , Ġ" K LP ", ĠR . style . Keyboard Theme _ K LP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDefault Ġtheme Ġfor ĠI CS , ĠJ B , Ġand ĠK LP . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERSION _ CODES . ICE _ CRE AM _ S AND W ICH ), ĠKeyboard Theme ( THEME _ ID _ L XX _ LIGHT , Ġ" L XX Light ", ĠR . style . Keyboard Theme _ L XX _ Light , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDefault Ġtheme Ġfor ĠL XX . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION _ CODES . LO L LI POP ), ĠKeyboard Theme ( THEME _ ID _ L XX _ DARK , Ġ" L XX Dark ", ĠR . style . Keyboard Theme _ L XX _ Dark , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġhas Ġnever Ġbeen Ġselected Ġas Ġdefault Ġtheme . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERSION _ CODES . BASE )) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort Ġ{@ link Ġ# KEY BOARD _ THEME } Ġby Ġdescending Ġorder Ġof Ġ{@ link Ġ# m Min ApiVersion }. ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . sort ( KEY BOARD _ THE MES ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsearch Keyboard Theme ById ( theme Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Theme Ids : ĠArray < Keyboard Theme >): ĠKeyboard Theme ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThis Ġsearch Ġalgorithm Ġisn 't Ġoptimal Ġif Ġthere Ġare Ġmany Ġthemes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( theme Ġin Ġavailable Theme Ids ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( theme . m Theme Id Ġ== Ġtheme Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtheme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠgetDefault Keyboard Theme ( prefs : ĠSharedPreferences , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsdk Version : ĠInt , Ġavailable Theme Array : ĠArray < Keyboard Theme >): ĠKeyboard Theme ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk lp Theme Id String Ġ= Ġprefs . getString ( K LP _ KEY BOARD _ THEME _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( k lp Theme Id String Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sdk Version Ġ<= ĠVERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Id Ġ= ĠInteger . parseInt ( k lp Theme Id String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġsearch Keyboard Theme ById ( theme Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( theme Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtheme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Unknown Ġkeyboard Ġtheme Ġin ĠK LP Ġpreference : Ġ$ k lp Theme Id String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Illegal Ġkeyboard Ġtheme Ġin ĠK LP Ġpreference : Ġ$ k lp Theme Id String ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġold Ġpreference . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Remove ĠK LP Ġkeyboard Ġtheme Ġpreference : Ġ$ k lp Theme Id String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). remove ( K LP _ KEY BOARD _ THEME _ KEY ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThis Ġsearch Ġalgorithm Ġisn 't Ġoptimal Ġif Ġthere Ġare Ġmany Ġthemes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( theme Ġin Ġavailable Theme Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sdk Version Ġ>= Ġtheme . m Min ApiVersion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtheme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearch Keyboard Theme ById ( DEFAULT _ THEME _ ID , Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Keyboard Theme Name ( theme Id : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġsearch Keyboard Theme ById ( theme Id , ĠKEY BOARD _ THE MES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtheme !!. m Theme Name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsave Keyboard Theme Id ( theme Id : ĠInt , Ġprefs : ĠSharedPreferences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Keyboard Theme Id ( theme Id , Ġprefs , ĠBuild . VERSION . SDK _ INT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Preference Key ( sdk Version : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sdk Version Ġ<= ĠVERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK LP _ KEY BOARD _ THEME _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠL XX _ KEY BOARD _ THEME _ KEY ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsave Keyboard Theme Id ( theme Id : ĠInt , Ġprefs : ĠSharedPreferences , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsdk Version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Key Ġ= Ġget Preference Key ( sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). putString ( pref Key , ĠInteger . toString ( theme Id )). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Keyboard Theme ( context : ĠContext ): ĠKeyboard Theme ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Theme Array Ġ= Ġget Available Theme Array ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Keyboard Theme ( prefs , ĠBuild . VERSION . SDK _ INT , Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Available Theme Array ( context : ĠContext ): ĠArray < Keyboard Theme > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AVAILABLE _ KEY BOARD _ THE MES . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Theme Id String Array Ġ= Ġcontext . resources . getInt Array ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . array . keyboard _ theme _ ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Theme List Ġ= ĠArrayList < Keyboard Theme >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġavailable Theme Id String Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġsearch Keyboard Theme ById ( id , ĠKEY BOARD _ THE MES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( theme Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Theme List . add ( theme ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA VA IL ABLE _ KEY BOARD _ THE MES Ġ= Ġavailable Theme List . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . sort ( AVAILABLE _ KEY BOARD _ THE MES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠA VA IL ABLE _ KEY BOARD _ THE MES ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġpackage Ġprivate Ġfor Ġtesting Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget Keyboard Theme ( prefs : ĠSharedPreferences , Ġsdk Version : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Theme Array : ĠArray < Keyboard Theme >): ĠKeyboard Theme ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl xx Theme Id String Ġ= Ġprefs . getString ( L XX _ KEY BOARD _ THEME _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠgetDefault Keyboard Theme ( prefs , Ġsdk Version , Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Id Ġ= ĠInteger . parseInt ( l xx Theme Id String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġsearch Keyboard Theme ById ( theme Id , Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( theme Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtheme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Unknown Ġkeyboard Ġtheme Ġin ĠL XX Ġpreference : Ġ$ l xx Theme Id String ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Illegal Ġkeyboard Ġtheme Ġin ĠL XX Ġpreference : Ġ$ l xx Theme Id String ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġpreference Ġthat Ġcontains Ġunknown Ġor Ġillegal Ġtheme Ġid . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). remove ( L XX _ KEY BOARD _ THEME _ KEY ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetDefault Keyboard Theme ( prefs , Ġsdk Version , Ġavailable Theme Array ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ