/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . squareup . workflow . diagnostic Ċ Ċ import Ġcom . squareup . workflow . Very Experimental Workflow Ċ import Ġcom . squareup . workflow . Workflow Action Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ Ċ /** Ċ Ġ* ĠRe ceiv es Ġdiagnostic Ġevents Ġfrom Ġthe Ġworkflow Ġruntime Ġwhen Ġsignificant Ġthings Ġhappen , Ġe . g . Ġthe Ċ Ġ* Ġruntime Ġstarts Ġor Ġstops , Ġworkflows Ġand Ġworkers Ġare Ġstarted Ġor Ġstopped , Ġand Ġinformation Ġabout Ċ Ġ* Ġrender Ġpasses Ġand Ġworkflow Ġactions . Ċ Ġ* Ċ Ġ* ĠTo Ġregister Ġa Ġlistener Ġwith Ġthe Ġruntime , Ġset Ċ Ġ* Ġ[ Workflow Session . diagnostic Listener ][ com . squareup . workflow . Workflow Session . diagnostic Listener ] Ċ Ġ* Ġin Ġthe Ġ` before Start ` Ġfunction Ġpassed Ġto Ċ Ġ* Ġ[ launch Workflow In ][ com . squareup . workflow . launch Workflow In ]. Ċ Ġ* Ċ Ġ* ĠMultiple Ġlisteners Ġcan Ġbe Ġcomposed Ġusing Ġthe Ġ[ and Then ] Ġfunction . Ċ Ġ* Ċ Ġ* ĠNo Ġguarantees Ġare Ġmade Ġabout Ġwhat Ġthreads Ġmethods Ġare Ġinvoked Ġon . ĠImplement ations Ġshould Ġtake Ċ Ġ* Ġcare Ġto Ġbe Ġthread - safe . Ċ Ġ* Ċ Ġ* Ġ## ĠSequence Ġof ĠEvents Ċ Ġ* Ċ Ġ* ĠEvents Ġreceived Ġby Ġthis Ġinterface Ġoccur Ġin Ġa Ġwell - defined Ġorder . Ċ Ġ* Ċ Ġ* Ġ 1 . Ġ[ on Runtime Started ] Ċ Ġ* Ġ 1 . Ġ[ on Before RenderPass ] Ċ Ġ* ĠĠĠĠĠ 1 . Ġ[ on Before Workflow Rendered ] Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ- ĠAlso Ġcalled Ġfor Ġeach Ġchild Ġworkflow , Ġrecursively . Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ- ĠChild Ġstart Ġare Ġemitted Ġbefore Ġthe Ġrender Ġmethod Ġreturns . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ 1 . Ġ[ on Workflow Started ] Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ 1 . Ġ[ on Worker Started ] Ċ Ġ* ĠĠĠĠĠ 1 . Ġ[ on After Workflow Rendered ] Ċ Ġ* ĠĠĠĠ Ġ- ĠChild Ġstop Ġevents Ġare Ġemitted Ġafter Ġthe Ġrender Ġmethod Ġreturns . Ċ Ġ* ĠĠĠĠĠĠ Ġ- Ġ[ on Workflow Stopped ] Ċ Ġ* ĠĠĠĠĠĠ Ġ- Ġ[ on Worker Stopped ] Ċ Ġ* Ġ 1 . Ġ[ on After RenderPass ] Ċ Ġ* Ġ 1 . Ġ[ on Before Snapshot Pass ] Ċ Ġ* Ġ 1 . Ġ[ on After Snapshot Pass ] Ċ Ġ* Ġ 1 . ĠEither : Ċ Ġ* ĠĠĠĠ Ġ- Ġ[ on Sink Received ] Ċ Ġ* ĠĠĠĠ Ġ- Ġ[ on Worker Output ] Ċ Ġ* Ġ 1 . Ġ[ on Workflow Action ] Ċ Ġ* Ġ 1 . ĠBack Ġto Ġ[ on Before RenderPass ]. Ċ Ġ* Ġ 1 . Ġ[ on Runtime Stopped ] Ċ Ġ* Ċ Ġ* Ġ## ĠDet ek t ĠConfiguration Ċ Ġ* Ċ Ġ* ĠIf Ġyou 're Ġusing ĠDet ek t , Ġyou Ġmay Ġneed Ġto Ġsuppress Ġsome Ġwarnings Ġwhen Ġimplementing Ġthis Ġinterface . Ċ Ġ* Ċ Ġ* Ġ- ĠAdd Ġ`@ Suppress (" Too Many Functions ") ` Ġto Ġyour Ġclass . Ċ Ġ* Ġ- ĠAdd Ġ`@ Suppress (" Long Parameter List ") ` Ġto Ġ[ on Workflow Started ] Ġif Ġyou Ġoverride Ġit . Ċ Ġ*/ Ċ @ Suppress (" Too Many Functions ") Ċ interface ĠWorkflow Diagnostic Listener Ġ{ ĊĊĠ Ġ// Ġregion ĠRender ĠEvents ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġbefore Ġthe Ġworkflow Ġtree Ġis Ġgoing Ġto Ġbe Ġrendered . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on After RenderPass ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Before RenderPass ( props : ĠAny ?) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġafter Ġ[ on Props Changed ][ com . squareup . workflow . State ful Workflow . on Props Changed ] Ġreturns . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġfor Ġthis Ġevent . ĠIf Ġnull , Ġthe Ġprops Ġfor Ġthe Ġroot ĊĠĠ Ġ* Ġworkflow Ġchanged . Ġ[ old State ] Ġand Ġ[ newState ] Ġwill Ġalways Ġbe Ġnull Ġin Ġthat Ġcase . ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Props Changed ( ĊĠĠĠ Ġworkflow Id : ĠLong ?, ĊĠĠĠ Ġold Props : ĠAny ?, ĊĠĠĠ Ġnew Props : ĠAny ?, ĊĠĠĠ Ġold State : ĠAny ?, ĊĠĠĠ ĠnewState : ĠAny ? ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġbefore Ġan Ġindividual Ġworkflow 's Ġrender Ġmethod Ġis Ġgoing Ġto Ġbe Ġcalled . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on After Workflow Rendered ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Before Workflow Rendered ( ĊĠĠĠ Ġworkflow Id : ĠLong , ĊĠĠĠ Ġprops : ĠAny ?, ĊĠĠĠ Ġstate : ĠAny ? ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġafter Ġan Ġindividual Ġworkflow 's Ġrender Ġmethod Ġwas Ġcalled . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Before Workflow Rendered ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon After Workflow Rendered ( ĊĠĠĠ Ġworkflow Id : ĠLong , ĊĠĠĠ Ġrendering : ĠAny ? ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġafter Ġthe Ġworkflow Ġtree Ġfinishes Ġrendering . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Before RenderPass ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon After RenderPass ( rendering : ĠAny ?) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġbefore Ġall Ġthe Ġworkflows ' ĊĠĠ Ġ* Ġ[ snapshot State ][ com . squareup . workflow . State ful Workflow . snapshot State ] Ġmethods Ġare Ġcalled . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on After Snapshot Pass ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Before Snapshot Pass () Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġjust Ġafter Ġall Ġthe Ġworkflows ' ĊĠĠ Ġ* Ġ[ snapshot State ][ com . squareup . workflow . State ful Workflow . snapshot State ] Ġmethods Ġare Ġcalled . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Before Snapshot Pass ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon After Snapshot Pass () Ġ= ĠUnit ĊĊĠ Ġ// Ġend region ĊĊĠ Ġ// Ġregion ĠL ifetime ĠEvents ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġruntime Ġhas Ġstarted Ġexecuting . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠNo Ġother Ġmethods Ġwill Ġbe Ġcalled Ġon Ġthis Ġinterface Ġbefore Ġthis Ġreturns . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Runtime Stopped ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Runtime Started ( ĊĠĠĠ Ġworkflow Scope : ĠCor outine Scope , ĊĠĠĠ Ġroot Workflow Type : ĠString ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġafter Ġthe Ġruntime Ġhas Ġbeen Ġcancelled Ġor Ġfailed , Ġafter Ġall Ġworkflow - related Ġcor outines ĊĠĠ Ġ* Ġhave Ġcompleted . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Runtime Started ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Runtime Stopped () Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġparticular Ġworkflow Ġnode Ġis Ġstarted Ġat Ġa Ġparticular Ġpoint Ġin Ġthe Ġworkflow ĊĠĠ Ġ* Ġtree . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Worker Stopped ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġjust Ġstarted . ĊĠĠ Ġ* Ġ@ param ĠparentId ĠThe ĠID Ġof Ġthe Ġworkflow Ġwhose Ġcall Ġto ĊĠĠ Ġ* Ġ[ render Child ][ com . squareup . workflow . Render Context . render Child ] Ġcaused Ġthis Ġworkflow Ġto Ġstart . ĊĠĠ Ġ* Ġ@ param Ġworkflow Type ĠThe Ġfully - qualified Ġname Ġof Ġthis Ġworkflow 's Ġclass . ĊĠĠ Ġ* Ġ@ param Ġkey ĠThe Ġkey Ġpassed Ġto Ġ` render Child ` Ġby Ġ[ parentId ] Ġwhen Ġrendering Ġthis Ġworkflow . ĊĠĠ Ġ* Ġ@ param Ġinitial Props ĠThe Ġprops Ġpassed Ġto Ġ` render Child ` Ġby Ġ[ parentId ]. ĊĠĠ Ġ* Ġ@ param ĠinitialState ĠThe Ġstate Ġreturned Ġfrom ĊĠĠ Ġ* Ġ[ initialState ][ com . squareup . workflow . State ful Workflow . initialState ]. ĊĠĠ Ġ* Ġ@ param Ġrestored From Snapshot ĠTrue Ġiff Ġthe Ġsnapshot Ġparameter Ġto Ġ` initialState ` Ġwas Ġnon - null . ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġ@ Suppress (" Long Parameter List ") ĊĠ Ġfun Ġon Workflow Started ( ĊĠĠĠ Ġworkflow Id : ĠLong , ĊĠĠĠ ĠparentId : ĠLong ?, ĊĠĠĠ Ġworkflow Type : ĠString , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġinitial Props : ĠAny ?, ĊĠĠĠ ĠinitialState : ĠAny ?, ĊĠĠĠ Ġrestored From Snapshot : ĠBoolean ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġparticular Ġworkflow Ġnode Ġis Ġstopped Ġat Ġa Ġparticular Ġpoint Ġin Ġthe Ġworkflow Ġtree . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Workflow Started ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġstopped . ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Workflow Stopped ( workflow Id : ĠLong ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġworkflow Ġstarts Ġrunning Ġa Ġnew Ġworker . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Worker Stopped ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworker Id ĠAn Ġglobally - unique ĠID Ġthat Ġuniquely Ġidentifies Ġthe Ġworker . ĊĠĠ Ġ* Ġ@ param Ġparent Workflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġwhose Ġcall Ġto ĊĠĠ Ġ* Ġ[ running Worker ][ com . squareup . workflow . Render Context . running Worker ] Ġcaused Ġthis Ġworker Ġto Ġstart . ĊĠĠ Ġ* Ġ@ param Ġkey ĠThe Ġkey Ġpassed Ġto Ġ` running Worker ` Ġby Ġ[ parent Workflow Id ]. ĊĠĠ Ġ* Ġ@ param Ġdescription ĠA Ġstring Ġdescription Ġof Ġthe Ġworker . ĠContains Ġthe Ġworker 's Ġ` toString `. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Worker Started ( ĊĠĠĠ Ġworker Id : ĠLong , ĊĠĠĠ Ġparent Workflow Id : ĠLong , ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġdescription : ĠString ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġworker Ġfinishes Ġrunning . ĠThe Ġworkflow Ġmay Ġstill Ġtechnically Ġbe Ġ" running " Ġthe ĊĠĠ Ġ* Ġworker , Ġbut Ġit Ġwill Ġnever Ġemit Ġany Ġmore Ġoutputs . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠCorre spon ds Ġto Ġ[ on Worker Started ]. ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworker Id ĠThe ĠID Ġof Ġthe Ġworker Ġthat Ġstopped . ĊĠĠ Ġ* Ġ@ param Ġparent Workflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġwas Ġrunning Ġthis Ġworker . ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Worker Stopped ( ĊĠĠĠ Ġworker Id : ĠLong , ĊĠĠĠ Ġparent Workflow Id : ĠLong ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ// Ġend region ĊĊĠ Ġ// Ġregion ĠUpdate ĠEvents ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġworker Ġemits Ġan Ġoutput . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ[ on Workflow Action ] Ġwill Ġalways Ġbe Ġcalled Ġafter Ġthis . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworker Id ĠThe ĠID Ġof Ġthe Ġworker Ġthat Ġemitted Ġ[ output ]. ĊĠĠ Ġ* Ġ@ param Ġparent Workflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġis Ġrunning Ġthis Ġworker Ġand Ġthat Ġwill ĊĠĠ Ġ* Ġreceive Ġthe Ġoutput . ĊĠĠ Ġ* Ġ@ param Ġoutput ĠThe Ġvalue Ġthat Ġthe Ġworker Ġoutput . ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Worker Output ( ĊĠĠĠ Ġworker Id : ĠLong , ĊĠĠĠ Ġparent Workflow Id : ĠLong , ĊĠĠĠ Ġoutput : ĠAny ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġ[ Sink ][ com . squareup . workflow . Sink ] Ġhas Ġreceived Ġan Ġevent . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ[ on Workflow Action ] Ġwill Ġalways Ġbe Ġcalled Ġafter Ġthis . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġcreated Ġthe Ġsink Ġand Ġwill Ġexecute Ġits ĊĠĠ Ġ* Ġcorresponding Ġ[ Workflow Action ]. ĊĠĠ Ġ* Ġ@ param Ġaction ĠThe Ġ[ Workflow Action ] Ġthat Ġwill Ġbe Ġexecuted Ġby Ġ[ workflow Id ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Sink Received ( ĊĠĠĠ Ġworkflow Id : ĠLong , ĊĠĠĠ Ġaction : ĠWorkflow Action < *, Ġ*> ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCalled Ġwhen Ġa Ġworkflow Ġhas Ġexecuted Ġa Ġ[ Workflow Action ] Ġin Ġresponse Ġto Ġa Ġworker Ġoutput Ġor Ġsink ĊĠĠ Ġ* Ġevent . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠEither Ġ[ on Worker Output ] Ġor Ġ[ on Sink Received ] Ġwill Ġhave Ġbeen Ġcalled Ġbefore Ġthis . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġworkflow Id ĠThe ĠID Ġof Ġthe Ġworkflow Ġthat Ġcreated Ġ[ action ]. ĊĠĠ Ġ* Ġ@ param Ġaction ĠThe Ġ[ Workflow Action ] Ġthat Ġwas Ġexecuted . ĊĠĠ Ġ* Ġ@ param Ġold State ĠThe Ġstate Ġof Ġthe Ġworkflow Ġbefore Ġexecuting Ġ[ action ]. ĊĠĠ Ġ* Ġ@ param ĠnewState ĠThe Ġstate Ġof Ġthe Ġworkflow Ġafter Ġexecuting Ġ[ action ]. ĠIf Ġthe Ġaction Ġdoesn 't Ġset ĊĠĠ Ġ* Ġthe Ġstate , Ġthis Ġwill Ġbe Ġthe Ġsame Ġvalue Ġas Ġ[ old State ]. ĊĠĠ Ġ* Ġ@ param Ġoutput ĠThe Ġoutput Ġvalue Ġreturned Ġfrom Ġ[ action ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Very Experimental Workflow ĊĠ Ġfun Ġon Workflow Action ( ĊĠĠĠ Ġworkflow Id : ĠLong , ĊĠĠĠ Ġaction : ĠWorkflow Action < *, Ġ* >, ĊĠĠĠ Ġold State : ĠAny ?, ĊĠĠĠ ĠnewState : ĠAny ?, ĊĠĠĠ Ġoutput : ĠAny ? ĊĠ Ġ) Ġ= ĠUnit ĊĊĠ Ġ// Ġend region Ċ } Ċ