package Ġcom . info bip . k af k ist ry . record structure Ċ Ċ import Ġcom . info bip . k af k ist ry . model .* Ċ import Ġkotlin . math . absolute Value Ċ Ċ open Ġclass ĠMer ging Context ( ĊĠĠĠ Ġproperties : ĠRecord Analyzer Properties , ĊĠĠĠ Ġnow : ĠLong Ġ= Ġgenerate Timestamp (), Ċ ) Ġ: ĠProcessing Context ( properties , Ġnow ) Ġ{ ĊĊĠĠĠ Ġfun Ġtimestamp Wrapped Unknown Records Structure ( ĊĠĠĠĠĠĠĠ Ġheaders Fields : ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ?, ĊĠĠĠĠĠĠĠ Ġnullable : ĠBoolean ĊĠĠĠ Ġ) Ġ= ĠTimestamp Wrapped Records Structure ( ĊĠĠĠĠĠĠĠ ĠPayload Type . UNKNOWN , ĊĠĠĠĠĠĠĠ Ġtimestamp Wrapped Header Fields Ġ= Ġheaders Fields , ĊĠĠĠĠĠĠĠ Ġtimestamp Wrapped Json Fields Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġnullable Ġ= Ġwrap Now ( nullable ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimply Ġadd Ġthe Ġnewer Ġfields Ġto Ġthe Ġexist ent Ġones ĊĠĠĠĠ Ġ* Ġfrom : Ġ@ Timestamp Wrapped Records Structure ĊĠĠĠĠ Ġ* Ġto : Ġ@ Timestamp Wrapped Records Structure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġin fix Ġfun ĠTimestamp Wrapped Records Structure . merge ( ĊĠĠĠĠĠĠĠ Ġother : ĠTimestamp Wrapped Records Structure ĊĠĠĠ Ġ): ĠTimestamp Wrapped Records Structure Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payload Type Ġ!= ĠPayload Type . JSON Ġ&& Ġother . payload Type Ġ!= ĠPayload Type . JSON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtimestamp Wrapped Unknown Records Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Fields Ġ= Ġtimestamp Wrapped Header Fields Ġmerge Ġother . timestamp Wrapped Header Fields , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnullable Ġ= Ġ( nullable Ġmerge Boolean Ġother . nullable ). field , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTimestamp Wrapped Records Structure ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPayload Type . JSON , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Wrapped Header Fields Ġ= Ġtimestamp Wrapped Header Fields Ġmerge Ġother . timestamp Wrapped Header Fields , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Wrapped Json Fields Ġ= Ġtimestamp Wrapped Json Fields Ġmerge Ġother . timestamp Wrapped Json Fields , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnullable Ġ= Ġnullable Ġmerge Boolean Ġother . nullable , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ?. merge ( ĊĠĠĠĠĠĠĠ Ġother : ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ? ĊĠĠĠ Ġ): ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull Ġ|| Ġother Ġ== Ġnull Ġ|| Ġthis Ġ== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother Ġ?: Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġthis Is Too Old Dynamic Field Ġ= Ġsize Ġ== Ġ 1 Ġ&& Ġfirst (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . field . name Ġ== Ġnull Ġ&& Ġit . timestamp . too Old () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this Is Too Old Dynamic Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġdo Merge Ġother ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġin fix Ġfun ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> . do Merge ( ĊĠĠĠĠĠĠĠ Ġother : ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ĊĠĠĠ Ġ): ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthis Names Ġ= Ġthis . map Ġ{ Ġit . field . name Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġval Ġother Names Ġ= Ġother . map Ġ{ Ġit . field . name Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty () Ġ&& Ġother . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Collapse As Dynamic Field Names ( other , Ġthis Names , Ġother Names )?. run Ġ{ Ġreturn Ġthis Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġthis Null s Ġ= Ġfilter Ġ{ Ġit . field . type Ġ== ĠRecord FieldType . NULL Ġ}. associate By Ġ{ Ġit . field . name Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġother Null s Ġ= Ġother . filter Ġ{ Ġit . field . type Ġ== ĠRecord FieldType . NULL Ġ}. associate By Ġ{ Ġit . field . name Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġthis Fields Ġ= Ġassociate By Ġ{ Ġit . field . name Ġto Ġit . field . type Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġother Fields Ġ= Ġother . associate By Ġ{ Ġit . field . name Ġto Ġit . field . type Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( this Fields . keys Ġ+ Ġother Fields . keys ). distinct (). map NotNull Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġkey . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Field Ġ= Ġthis Fields [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Field Ġ= Ġother Fields [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Null Ġ= Ġthis Null s [ fieldName ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Null Ġ= Ġother Null s [ fieldName ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// don 't Ġoutput ĠNULL Ġtype Ġif Ġthere Ġis Ġmatching Ġname Ġof Ġnon - NULL Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Field . isNull Type () Ġ&& Ġ( fieldName Ġin Ġother Names ) Ġ&& Ġ! other Field . isNull Type () Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Field . isNull Type () Ġ&& Ġ( fieldName Ġin Ġthis Names ) Ġ&& Ġ! this Field . isNull Type () Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġactual Ġmerge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Field Ġ!= Ġnull Ġ&& Ġother Field Ġ!= Ġnull Ġ-> Ġthis Field Ġmerge Ġother Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// mark Ġas Ġnullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Field Ġ!= Ġnull Ġ-> Ġif Ġ( other Null Ġ!= Ġnull Ġ|| ĠfieldName Ġ! in Ġother Names ) Ġthis Field . as Nullable () Ġelse Ġthis Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Field Ġ!= Ġnull Ġ-> Ġif Ġ( this Null Ġ!= Ġnull Ġ|| ĠfieldName Ġ! in Ġthis Names ) Ġother Field . as Nullable () Ġelse Ġother Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> . maybe Collapse As Dynamic Field Names ( ĊĠĠĠĠĠĠĠ Ġother : ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >>, ĊĠĠĠĠĠĠĠ Ġthis Names : ĠSet < String ? >, ĊĠĠĠĠĠĠĠ Ġother Names : ĠSet < String ? >, ĊĠĠĠ Ġ): ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġin fix Ġfun ĠInt . different Magnitude ( other : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthreshold Diff Ġ= Ġproperties . cardinality Diff Threshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthreshold Factor Ġ= Ġproperties . cardinality Magnitude Factor Threshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( this Ġ- Ġother ). absolute Value Ġ> Ġthreshold Diff Ġ&& Ġ( this Ġ> Ġthreshold Factor Ġ* Ġother Ġ|| Ġthreshold Factor Ġ* Ġthis Ġ< Ġother ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠCollection < String ?> . has Dynamic Field Names () Ġ= Ġany Ġ{ Ġit ?. is Dynamic Name () Ġ?: Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġcommon Names () Ġ= Ġthis Names . intersect ( other Names ) ĊĠĠĠĠĠĠĠ Ġfun Ġnames Count Diff Too M uch () Ġ= Ġthis Names . size . different Magnitude ( other Names . size ) ĊĠĠĠĠĠĠĠ Ġfun Ġis Dynamic () Ġ= Ġthis Names . has Dynamic Field Names () Ġ|| Ġother Names . has Dynamic Field Names () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnames Count Diff Too M uch () Ġ|| Ġcommon Names (). isEmpty () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( is Dynamic ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ( this Ġ+ Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . field . type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ(_, Ġvalues ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . squ ash As Variable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTimestamp Wrapper < Timestamp Wrapped Record Field > ?. isNull Type () Ġ= Ġthis ?. field ?. type Ġ== ĠRecord FieldType . NULL ĊĊĠĠĠ Ġprivate Ġfun ĠString . is Dynamic Name (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isBlank ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! get ( 0 ). is Java Identifier Start ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġ! all Ġ{ Ġit . is Java Identifier Part () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Timestamp Wrapper < Timestamp Wrapped Record Field >> . squ ash As Variable (): ĠTimestamp Wrapper < Timestamp Wrapped Record Field > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfirst (). with Field Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġas Sequence (). map Ġ{ Ġit . field . value Ġ}. reduce Ġ{ Ġacc , Ġwrappers Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġmerge Ġwrappers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġas Sequence (). map Ġ{ Ġit . field . children Ġ}. reduce Ġ{ Ġacc , Ġwrappers Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġmerge Ġwrappers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTimestamp Wrapper < Timestamp Wrapped Record Field >. as Nullable () Ġ= ĊĠĠĠĠĠĠĠ Ġwith Field Ġ{ Ġit . copy ( nullable Ġ= Ġwrap Now ( true )) Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠTimestamp Wrapper < Timestamp Wrapped Record Field >. merge ( ĊĠĠĠĠĠĠĠ Ġother : ĠTimestamp Wrapper < Timestamp Wrapped Record Field > ĊĠĠĠ Ġ): ĠTimestamp Wrapper < Timestamp Wrapped Record Field > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġother . field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Now ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimestamp Wrapped Record Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnullable Ġ= Ġfield . nullable Ġmerge Boolean Ġother . field . nullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġother . field . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġwhen Ġ( other . field . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord FieldType . NULL Ġ-> Ġfield . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġother . field . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . children Ġ!= Ġother . field . children Ġ-> Ġfield . children Ġmerge Ġother . field . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġother . field . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfield . value Ġmerge Ġother . field . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġin fix Ġfun ĠTimestamp Wrapper < Boolean >. merge Boolean ( ĊĠĠĠĠĠĠĠ Ġother : ĠTimestamp Wrapper < Boolean > ĊĠĠĠ Ġ): ĠTimestamp Wrapper < Boolean > Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġfield Ġ-> Ġwhen Ġ(! other . field Ġ&& Ġtimestamp . too Old ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġwrap Now ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwrap Now ( field Ġ|| Ġother . field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠTimestamp Wrapped FieldValue ?. merge ( ĊĠĠĠĠĠĠĠ Ġother : ĠTimestamp Wrapped FieldValue ? ĊĠĠĠ Ġ): ĠTimestamp Wrapped FieldValue ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull Ġ|| Ġother Ġ== Ġnull Ġ|| Ġthis Ġ== Ġother ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother Ġ?: Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmerged High Cardinality Ġ= Ġhigh Cardinality Ġmerge Boolean Ġother . high Cardinality ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > ĠList < T >. take IfNot High Cardinality (): ĠList < T > Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis High Cardinality () Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerged High Cardinality . field Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmerged Values Ġ= Ġwhen Ġ( merged High Cardinality . field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġvalues Ġmerge Value Set Ġother . values ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTimestamp Wrapped FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Cardinality Ġ= Ġmerged High Cardinality Ġmerge Boolean Ġwrap Now ( merged Values . is High Cardinality ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoo Big Ġ= Ġtoo Big Ġmerge Boolean Ġother . too Big , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġmerged Values . take IfNot High Cardinality (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList <* >. is High Cardinality () Ġ= Ġsize Ġ> Ġproperties . value Sampling . max Cardinality ĊĊĠĠĠ Ġprivate Ġin fix Ġfun Ġ< T > ĠList < Timestamp Wrapper < T >> . merge Value Set ( ĊĠĠĠĠĠĠĠ Ġother : ĠList < Timestamp Wrapper < T >> ĊĠĠĠ Ġ): ĠList < Timestamp Wrapper < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence Of ( this , Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . timestamp . too Old () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit . field Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġ_, Ġaccumulator , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accumulator . timestamp Ġ> Ġelement . timestamp ) Ġaccumulator Ġelse Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. values . toList () ĊĠĠĠ Ġ} ĊĊ Ċ } ĊĊ