package Ġcom . example . android . architecture . blueprint s . todo app . tasks Ċ Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . source . Tasks Repository Ċ import Ġcom . example . android . architecture . blueprint s . todo app . mv ibase . M vi Action Ċ import Ġcom . example . android . architecture . blueprint s . todo app . mv ibase . M vi Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . mv ibase . M vi ViewModel Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Action . Activate Task Action Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Action . Clear Completed Tasks Action Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Action . Complete Task Action Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Action . Load Tasks Action Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Result . Activate Task Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Result . Clear Completed Tasks Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Result . Complete Task Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . tasks . Tasks Result . Load Tasks Result Ċ import Ġcom . example . android . architecture . blueprint s . todo app . util . pair With Delay Ċ import Ġcom . example . android . architecture . blueprint s . todo app . util . schedul ers . Base Scheduler Provider Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ Ċ /** Ċ Ġ* ĠContains Ġand Ġexecutes Ġthe Ġbusiness Ġlogic Ġfor Ġall Ġemitted Ġ[ M vi Action ] Ċ Ġ* Ġand Ġreturns Ġone Ġunique Ġ[ Observable ] Ġof Ġ[ M vi Result ]. Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġcould Ġhave Ġbeen Ġincluded Ġinside Ġthe Ġ[ M vi ViewModel ] Ċ Ġ* Ġbut Ġwas Ġseparated Ġto Ġease Ġmaintenance , Ġas Ġthe Ġ[ M vi ViewModel ] Ġwas Ġgetting Ġtoo Ġbig . Ċ Ġ*/ Ċ class ĠTasks Action Processor Holder ( ĊĠĠĠ Ġprivate Ġval Ġtasks Repository : ĠTasks Repository , ĊĠĠĠ Ġprivate Ġval Ġscheduler Provider : ĠBase Scheduler Provider Ċ ) Ġ{ ĊĊĠ Ġprivate Ġval Ġload Tasks Processor Ġ= ĊĠĠĠĠĠ ĠObservable Transformer < Load Tasks Action , ĠLoad Tasks Result > Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . flatMap Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġtasks Repository . get Tasks ( action . force Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġthe ĠSingle Ġto Ġan ĠObservable Ġto Ġallow Ġemission Ġof Ġmultiple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġevents Ġdown Ġthe Ġstream Ġ( e . g . Ġthe ĠIn Flight Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrap Ġreturned Ġdata Ġinto Ġan Ġimmutable Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġtasks Ġ-> ĠLoad Tasks Result . Success ( tasks , Ġaction . filter Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cast ( Load Tasks Result :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrap Ġany Ġerror Ġinto Ġan Ġimmutable Ġobject Ġand Ġpass Ġit Ġdown Ġthe Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġcrash ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġerrors Ġare Ġdata Ġand Ġhence , Ġshould Ġjust Ġbe Ġpart Ġof Ġthe Ġstream . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( Load Tasks Result :: Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( scheduler Provider . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġan ĠIn Flight Ġevent Ġto Ġnotify Ġthe Ġsubscribers Ġ( e . g . Ġthe ĠUI ) Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoing Ġwork Ġand Ġwaiting Ġon Ġa Ġresponse . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġemit Ġit Ġafter Ġob serving Ġon Ġthe ĠUI Ġthread Ġto Ġallow Ġthe Ġevent Ġto Ġbe Ġemitted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġthe Ġcurrent Ġframe Ġand Ġavoid Ġj ank . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Tasks Result . Load Tasks Result . In Flight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġactivate Task Processor Ġ= ĊĠĠĠĠĠ ĠObservable Transformer < Activate Task Action , ĠActivate Task Result > Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . flatMap Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġtasks Repository . activate Task ( action . task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( tasks Repository . get Tasks ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġthe ĠSingle Ġto Ġan ĠObservable Ġto Ġallow Ġemission Ġof Ġmultiple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġevents Ġdown Ġthe Ġstream Ġ( e . g . Ġthe ĠIn Flight Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġtasks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġtwo Ġevents Ġto Ġallow Ġthe ĠUI Ġnotification Ġto Ġbe Ġhidden Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsome Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair With Delay ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Result . Activate Task Result . Success ( tasks ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Result . Activate Task Result . Hide Ui Notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrap Ġany Ġerror Ġinto Ġan Ġimmutable Ġobject Ġand Ġpass Ġit Ġdown Ġthe Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġcrash ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġerrors Ġare Ġdata Ġand Ġhence , Ġshould Ġjust Ġbe Ġpart Ġof Ġthe Ġstream . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( Activate Task Result :: Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( scheduler Provider . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġan ĠIn Flight Ġevent Ġto Ġnotify Ġthe Ġsubscribers Ġ( e . g . Ġthe ĠUI ) Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoing Ġwork Ġand Ġwaiting Ġon Ġa Ġresponse . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġemit Ġit Ġafter Ġob serving Ġon Ġthe ĠUI Ġthread Ġto Ġallow Ġthe Ġevent Ġto Ġbe Ġemitted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġthe Ġcurrent Ġframe Ġand Ġavoid Ġj ank . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Tasks Result . Activate Task Result . In Flight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġcomplete Task Processor Ġ= ĊĠĠĠĠĠ ĠObservable Transformer < Complete Task Action , ĠComplete Task Result > Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . flatMap Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġtasks Repository . complete Task ( action . task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( tasks Repository . get Tasks ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġthe ĠSingle Ġto Ġan ĠObservable Ġto Ġallow Ġemission Ġof Ġmultiple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġevents Ġdown Ġthe Ġstream Ġ( e . g . Ġthe ĠIn Flight Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġtasks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġtwo Ġevents Ġto Ġallow Ġthe ĠUI Ġnotification Ġto Ġbe Ġhidden Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsome Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair With Delay ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Result . Complete Task Result . Success ( tasks ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTasks Result . Complete Task Result . Hide Ui Notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrap Ġany Ġerror Ġinto Ġan Ġimmutable Ġobject Ġand Ġpass Ġit Ġdown Ġthe Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġcrash ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġerrors Ġare Ġdata Ġand Ġhence , Ġshould Ġjust Ġbe Ġpart Ġof Ġthe Ġstream . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( Complete Task Result :: Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( scheduler Provider . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġan ĠIn Flight Ġevent Ġto Ġnotify Ġthe Ġsubscribers Ġ( e . g . Ġthe ĠUI ) Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoing Ġwork Ġand Ġwaiting Ġon Ġa Ġresponse . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġemit Ġit Ġafter Ġob serving Ġon Ġthe ĠUI Ġthread Ġto Ġallow Ġthe Ġevent Ġto Ġbe Ġemitted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġthe Ġcurrent Ġframe Ġand Ġavoid Ġj ank . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Tasks Result . Complete Task Result . In Flight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġclear Completed Tasks Processor Ġ= ĊĠĠĠĠĠ ĠObservable Transformer < Clear Completed Tasks Action , ĠClear Completed Tasks Result > Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtasks Repository . clear Completed Tasks () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( tasks Repository . get Tasks ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġthe ĠSingle Ġto Ġan ĠObservable Ġto Ġallow Ġemission Ġof Ġmultiple ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġevents Ġdown Ġthe Ġstream Ġ( e . g . Ġthe ĠIn Flight Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġtasks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġtwo Ġevents Ġto Ġallow Ġthe ĠUI Ġnotification Ġto Ġbe Ġhidden Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsome Ġdelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair With Delay ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClear Completed Tasks Result . Success ( tasks ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClear Completed Tasks Result . Hide Ui Notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrap Ġany Ġerror Ġinto Ġan Ġimmutable Ġobject Ġand Ġpass Ġit Ġdown Ġthe Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwithout Ġcrash ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġerrors Ġare Ġdata Ġand Ġhence , Ġshould Ġjust Ġbe Ġpart Ġof Ġthe Ġstream . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( Clear Completed Tasks Result :: Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( scheduler Provider . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmit Ġan ĠIn Flight Ġevent Ġto Ġnotify Ġthe Ġsubscribers Ġ( e . g . Ġthe ĠUI ) Ġwe Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoing Ġwork Ġand Ġwaiting Ġon Ġa Ġresponse . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġemit Ġit Ġafter Ġob serving Ġon Ġthe ĠUI Ġthread Ġto Ġallow Ġthe Ġevent Ġto Ġbe Ġemitted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġthe Ġcurrent Ġframe Ġand Ġavoid Ġj ank . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Tasks Result . Clear Completed Tasks Result . In Flight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSpl its Ġthe Ġ[ Observable ] Ġto Ġmatch Ġeach Ġtype Ġof Ġ[ M vi Action ] Ġto ĊĠĠ Ġ* Ġits Ġcorresponding Ġbusiness Ġlogic Ġprocessor . ĠEach Ġprocessor Ġtakes Ġa Ġdefined Ġ[ M vi Action ], ĊĠĠ Ġ* Ġreturns Ġa Ġdefined Ġ[ M vi Result ] ĊĠĠ Ġ* ĠThe Ġglobal Ġaction Processor Ġthen Ġmerge s Ġall Ġ[ Observable ] Ġback Ġto ĊĠĠ Ġ* Ġone Ġunique Ġ[ Observable ]. ĊĠĠ Ġ* ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġsplitting Ġis Ġdone Ġusing Ġ[ Observable . publish ] Ġwhich Ġallows Ġalmost Ġanything ĊĠĠ Ġ* Ġon Ġthe Ġpassed Ġ[ Observable ] Ġas Ġlong Ġas Ġone Ġand Ġonly Ġone Ġ[ Observable ] Ġis Ġreturned . ĊĠĠ Ġ* ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAn Ġsecurity Ġlayer Ġis Ġalso Ġadded Ġfor Ġunhandled Ġ[ M vi Action ] Ġto Ġallow Ġearly Ġcrash ĊĠĠ Ġ* Ġat Ġruntime Ġto Ġeasy Ġthe Ġmaintenance . ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġvar Ġaction Processor Ġ= ĊĠĠĠĠĠ ĠObservable Transformer < Tasks Action , ĠTasks Result > Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . publish Ġ{ Ġshared Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠObservable . merge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch ĠLoad Tasks Action Ġto Ġload Tasks Processor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . of Type ( Tasks Action . Load Tasks Action :: class . java ). compose ( load Tasks Processor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch ĠActivate Task Action Ġto Ġpopulate Task Processor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . of Type ( Tasks Action . Activate Task Action :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( activate Task Processor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch ĠComplete Task Action Ġto Ġcomplete Task Processor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . of Type ( Tasks Action . Complete Task Action :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( complete Task Processor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatch ĠClear Completed Tasks Action Ġto Ġclear Completed Tasks Processor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . of Type ( Tasks Action . Clear Completed Tasks Action :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( clear Completed Tasks Processor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. merge With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠError Ġfor Ġnot Ġimplemented Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . filter Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ! is ĠTasks Action . Load Tasks Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġv Ġ! is ĠTasks Action . Activate Task Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġv Ġ! is ĠTasks Action . Complete Task Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġv Ġ! is ĠTasks Action . Clear Completed Tasks Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ Ġw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . error < Tasks Result >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIllegalArgumentException (" Unknown ĠAction Ġtype : Ġ$ w ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ċ } Ċ