package Ġcom . so yle . stories . domain . pro se Ċ Ċ import Ġcom . so yle . stories . domain . entities . Entity Ċ import Ġcom . so yle . stories . domain . location . Location Ċ import Ġcom . so yle . stories . domain . project . Project Ċ import Ġcom . so yle . stories . domain . character . Character Ċ import Ġcom . so yle . stories . domain . pro se . events .* Ċ import Ġcom . so yle . stories . domain . theme . Symbol Ċ import Ġcom . so yle . stories . domain . theme . Theme Ċ import Ġcom . so yle . stories . domain . validation . Single Line Ċ import Ġcom . so yle . stories . domain . validation . count Lines Ċ import Ġjava . util .* Ċ Ċ class ĠPro se Ġprivate Ġconstructor ( ĊĠĠĠ Ġoverride Ġval Ġid : ĠId , ĊĠĠĠ Ġval ĠprojectId : ĠProject . Id , ĊĠĠĠ Ġval Ġtext : ĠString , ĊĠĠĠ Ġprivate Ġval Ġ_ mentions : ĠList < Pro se Mention <* >>, ĊĠĠĠ Ġval Ġrevision : ĠLong , ĊĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") Ġdefault Constructor Marker : ĠUnit Ċ ) Ġ: ĠEntity < Pro se . Id > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( projectId : ĠProject . Id ): ĠPro se Update < Pro se Created > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= ĠPro se ( Id (), ĠprojectId , Ġ"", ĠlistOf (), Ġ 0 L , Ġdefault Constructor Marker Ġ= ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpro se . updated By ( Pro se Created ( pro se )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid : ĠId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId : ĠProject . Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent : ĠList < Pro se Content >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrevision : ĠLong ĊĠĠĠĠĠĠĠ Ġ): ĠPro se Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( revision Ġ< Ġ 0 L ) Ġerror (" Revision Ġnumber Ġmust Ġbe Ġat Ġleast Ġ 0 . Ġ ĠGot Ġ$ revision ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġcontent . join ToString ("") Ġ{ Ġ Ġpro se Content Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Content . text Ġ+ Ġ( pro se Content . mention ?. second Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ment ions Ġ= Ġcontent . map NotNull Ġ{ Ġ( leading Text , Ġmention ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mention Ġ== Ġnull ) Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġleading Text . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Mention ( mention . first , ĠPro se Mention Range ( offset , Ġmention . second . length ), Ġtext ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġmention . second . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ment ions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrevision , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Constructor Marker Ġ= ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġreads ĊĊĠĠĠ Ġprivate Ġval Ġsorted Mention Set : ĠSet < Pro se Mention <* >> Ġby Ġlazy Ġ{ Ġsorted Set Of ( compare By Ġ{ Ġit . startIndex Ġ}, Ġ*_ mentions . to Typed Array ()) Ġ} ĊĊĠĠĠ Ġval Ġcontent : ĠList < com . so yle . stories . domain . pro se . content . Pro se Content > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) Ġempty List () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sorted Mention Set . isEmpty ()) Ġreturn @ lazy ĠlistOf ( Pro se Text ( text , Ġ 0 , Ġtext . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Mention Set . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Text ( text . substring ( offset , Ġit . startIndex ), Ġoffset , Ġit . startIndex ). take If Ġ{ Ġit . text . isNotEmpty () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġ_ Ġ-> Ġoffset Ġ= Ġit . end Index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Text ( text . substring ( offset , Ġtext . length ), Ġoffset , Ġtext . length ). take If Ġ{ Ġit . text . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmentions : ĠList < com . so yle . stories . domain . pro se . content . Pro se Content . Mention <* >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ mentions ĊĊĠĠĠ Ġprivate Ġval Ġmentions By EntityId : ĠMap < Mention ed EntityId <* >, ĠList < com . so yle . stories . domain . pro se . content . Pro se Content . Mention <* >>> Ġby Ġlazy Ġ{ Ġmentions . groupBy Ġ{ Ġit . entityId Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġcontains Mention Of ( entityId : ĠM ention ed EntityId < *> ): ĠBoolean Ġ= Ġmentions By EntityId . containsKey ( entityId ) ĊĊĠĠĠ Ġ// Ġupdates ĊĠĠĠ Ġprivate Ġfun Ġcopy ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString Ġ= Ġthis . text , ĊĠĠĠĠĠĠĠ Ġmentions : ĠList < Pro se Mention <* >> Ġ= Ġthis ._ mentions ĊĠĠĠ Ġ) Ġ= ĠPro se ( id , ĠprojectId , Ġtext , Ġmentions , Ġrevision Ġ= Ġrevision Ġ+ Ġ 1 L , Ġdefault Constructor Marker Ġ= ĠUnit ) ĊĊĠĠĠ Ġfun Ġwith Entity Mention ed ( ĊĠĠĠĠĠĠĠ Ġentity Id : ĠM ention ed EntityId <* >, ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġlength : ĠInt ĊĠĠĠ Ġ): ĠPro se Update < Entity Mention ed In Pro se > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠPro se Mention Range ( position , Ġlength ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġ 0 ) Ġthrow ĠIndex OutOfBoundsException ( position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ+ Ġlength Ġ> Ġtext . length ) Ġthrow ĠIndex OutOfBoundsException ( position Ġ+ Ġlength ) ĊĠĠĠĠĠĠĠ Ġif Ġ(_ mentions . any Ġ{ Ġit . position . is Intersect ing ( range ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠM ention Overlap s Existing Mention () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmentions Ġ= Ġ_ mentions Ġ+ ĠPro se Mention ( entityId , Ġrange , Ġtext ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( Entity Mention ed In Pro se ( new Pro se , Ġentity Id , Ġrange )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcom . so yle . stories . domain . pro se . content . Pro se Content . is Intersect ing ( range : ĠInt Range ): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( startIndex Ġ<= Ġend Index Ġ|| Ġrange . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn ĠstartIndex Ġin Ġrange Ġ|| Ġrange . start Ġin ĠstartIndex Ġuntil Ġend Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Text Inserted ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġindex : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠPro se Update < Text Inserted Into Pro se > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinsert Index Ġ= Ġindex Ġ?: Ġthis . text . length ĊĠĠĠĠĠĠĠ Ġif Ġ( mentions . any Ġ{ Ġit . is B isect edBy ( insert Index ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro se Mention Cannot Be B isect ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( mentions Before Index , Ġmentions After Index ) Ġ= Ġ_ mentions . partition Ġ{ Ġit . startIndex Ġ< Ġinsert Index Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= ĠStringBuilder ( this . text ). insert ( insert Index , Ġtext ). toString () ĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnew Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmentions Ġ= Ġmentions Before Index Ġ+ Ġmentions After Index . map Ġ{ Ġit . shift ed Right ( text . length , Ġnew Text ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( Text Inserted Into Pro se ( new Pro se , Ġtext , Ġinsert Index )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcom . so yle . stories . domain . pro se . content . Pro se Content . is B isect edBy ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex Ġin ĠstartIndex Ġ+ Ġ 1 Ġuntil Ġend Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Mention Text Re placed ( entityId : ĠM ention ed EntityId <* >, Ġreplacement : ĠPair < String , ĠString >): ĠPro se Update < Mention Text Re placed ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmentions Of Entity With Match Ġ= Ġmentions By EntityId [ entityId ]. or Empty (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring ( it . startIndex , Ġit . end Index ) Ġ== Ġreplacement . first ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mentions Of Entity With Match . isEmpty ()) Ġreturn Ġthis . updated By ( null ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Difference Ġ= Ġreplacement . second . length Ġ- Ġreplacement . first . length ĊĠĠĠĠĠĠĠ Ġval Ġcontent Builder Ġ= ĠStringBuilder ( text ) ĊĠĠĠĠĠĠĠ Ġmentions Of Entity With Match . fold ( 0 ) Ġ{ Ġadjustment , Ġmention Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Builder . replace ( mention . startIndex Ġ+ Ġadjustment , Ġmention . end Index Ġ+ Ġadjustment , Ġreplacement . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjustment Ġ+ Ġlength Difference ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġcontent Builder . toString () ĊĊĠĠĠĠĠĠĠ Ġvar Ġadjustment Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnew Ment ions Ġ= Ġsorted Mention Set . map Ġ{ Ġmention Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshifted Mention Ġ= Ġmention . shift ed Right ( adjust ment , Ġnew Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shift ed Mention . entityId Ġ== Ġentity Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjustment Ġ+= Ġlength Difference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshifted Mention . with Length ( replacement . second . length , Ġnew Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshifted Mention ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( text Ġ= Ġnew Text , Ġmentions Ġ= Ġnew Ment ions ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM ention Text Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring ( mentions Of Entity With Match . first (). startIndex , Ġmentions Of Entity With Match . first (). end Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplacement . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Text Removed ( ĊĠĠĠĠĠĠĠ Ġrange : ĠInt Range ĊĠĠĠ Ġ): ĠPro se Update < Text Removed From Pro se > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range . first Ġ< Ġ 0 Ġ|| Ġrange . last Ġ> Ġtext . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException (" Accept able Ġrange Ġto Ġremove Ġtext Ġis Ġ 0 .. ${ text . length }. Ġ ĠReceived Ġ$ range ") ĊĠĠĠĠĠĠĠ Ġif Ġ(_ mentions . any Ġ{ Ġit . position . is B isect edBy ( range . first ) Ġ|| Ġit . position . is B isect edBy ( range . last + 1 ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro se Mention Cannot Be B isect ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrange Length Ġ= Ġ( range . last Ġ+ Ġ 1 ) Ġ- Ġrange . first ĊĠĠĠĠĠĠĠ Ġval Ġ( mentions Before Range , Ġmentions After Range Start ) Ġ= Ġ_ mentions . partition Ġ{ Ġit . position . index Ġ< Ġrange . first Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( mentions InRange , Ġmentions After Range ) Ġ= Ġmentions After Range Start . partition Ġ{ Ġit . end () Ġ< Ġrange . last Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= ĠStringBuilder ( text ). remove Range ( range ). toString () ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnew Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmentions Ġ= Ġmentions Before Range Ġ+ Ġmentions After Range . map Ġ{ Ġit . shift ed Left ( range Length , Ġnew Text ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( Text Removed From Pro se ( new Pro se , Ġtext . substring ( range ), Ġrange . first )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwithout Mention ( ĊĠĠĠĠĠĠĠ Ġentity Id : ĠM ention ed EntityId <* >, ĊĠĠĠĠĠĠĠ ĠstartIndex : ĠInt ĊĠĠĠ Ġ): ĠPro se Update < Mention Removed From Pro se > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġcontains Mention Of ( entityId )) Ġthrow ĠM ention DoesNotExist In Pro se ( id , Ġentity Id , ĠstartIndex ) ĊĠĠĠĠĠĠĠ Ġval Ġmention Ġ= Ġmentions By EntityId [ entityId ]. or Empty (). find Ġ{ Ġit . startIndex Ġ== ĠstartIndex Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠM ention DoesNotExist In Pro se ( id , Ġentity Id , ĠstartIndex ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmentions Ġ= Ġ_ mentions . filter Not Ġ{ Ġit Ġ=== Ġmention Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( Mention Removed From Pro se ( new Pro se , Ġentity Id , ĠPro se Mention Range ( startIndex , Ġmention . end Index - ĠstartIndex ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Content Re placed ( content : ĠList < Pro se Content >): ĠPro se Update < Content Re placed > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġcontent . join ToString ("") Ġ{ Ġpro se Content Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Content . text Ġ+ Ġ( pro se Content . mention ?. second Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnew Ment ions Ġ= Ġcontent . map NotNull Ġ{ Ġ( leading Text , Ġmention ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mention Ġ== Ġnull ) Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġleading Text . length ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Mention ( mention . first , ĠPro se Mention Range ( offset , Ġmention . second . length ), Ġnew Text ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġmention . second . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Pro se Ġ= Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnew Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmentions Ġ= Ġnew Ment ions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Pro se . updated By ( Content Re placed ( new Pro se )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠId ( val Ġuuid : ĠUUID Ġ= ĠUUID . randomUUID ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Pro se ($ uuid )" ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġclass ĠPro se Text ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠstartIndex : ĠInt , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġend Index : ĠInt ĊĠĠĠ Ġ) Ġ: Ġcom . so yle . stories . domain . pro se . content . Pro se Content . Text ĊĊĠĠĠ Ġprivate Ġclass ĠPro se Mention < Id Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġentity Id : ĠM ention ed EntityId < Id >, ĊĠĠĠĠĠĠĠ Ġval Ġposition : ĠPro se Mention Range , ĊĠĠĠĠĠĠĠ Ġfull Text : ĠString ĊĠĠĠ Ġ) Ġ: Ġcom . so yle . stories . domain . pro se . content . Pro se Content . Mention < Id > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġstart (): ĠInt Ġ= Ġposition . index ĊĠĠĠĠĠĠĠ Ġfun Ġend (): ĠInt Ġ= Ġposition . index Ġ+ Ġposition . length ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠstartIndex : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġposition . index ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġend Index : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġposition . index Ġ+ Ġposition . length ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtext : ĠSingle Line Ġby Ġlazy Ġ{ Ġcount Lines ( full Text . substring ( startIndex , Ġend Index )) Ġas ĠSingle Line Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġshifted Right ( amount : ĠInt , Ġfull Text : ĠString ) Ġ= ĠPro se Mention ( entityId Ġ= Ġentity Id , Ġposition Ġ= Ġposition . shift ed Right ( amount ), Ġfull Text ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġshifted Left ( amount : ĠInt , Ġfull Text : ĠString ) Ġ= ĠPro se Mention ( entityId Ġ= Ġentity Id , Ġposition Ġ= Ġposition . shift ed Left ( amount ), Ġfull Text ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Length ( length : ĠInt , Ġfull Text : ĠString ) Ġ= ĠPro se Mention ( entityId Ġ= Ġentity Id , Ġposition Ġ= Ġposition . with Length ( length ), Ġfull Text ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠPro se Mention < *> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entityId Ġ!= Ġother . entityId ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġother . position ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ hashCode Ġby Ġlazy Ġ{ ĠlistOf ( position ). fold ( entityId . hashCode ()) Ġ{ Ġa , Ġb Ġ-> Ġ 3 1 Ġ* Ġa Ġ+ Ġb . hashCode ()} Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ_ hashCode ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Pro se Mention ( entityId =$ entityId , Ġposition =$ position )" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠPro se Content ( val Ġtext : ĠString , Ġval Ġmention : ĠPair < Mention ed EntityId <* >, ĠSingle Line > ?) Ċ Ċ sealed Ġclass ĠM ention ed EntityId < Id Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġabstract Ġval Ġid : ĠId Ċ } Ċ Ċ data Ġclass ĠM ention ed Character Id ( override Ġval Ġid : ĠCharacter . Id ) Ġ: ĠM ention ed EntityId < Character . Id >() Ċ data Ġclass ĠM ention ed Location Id ( override Ġval Ġid : ĠLocation . Id ) Ġ: ĠM ention ed EntityId < Location . Id >() Ċ data Ġclass ĠM ention ed Symbol Id ( override Ġval Ġid : ĠSymbol . Id , Ġval Ġtheme Id : ĠTheme . Id ) Ġ: ĠM ention ed EntityId < Symbol . Id >() Ċ Ċ fun ĠCharacter . Id . mention ed () Ġ= ĠM ention ed Character Id ( this ) Ċ fun ĠLocation . Id . mention ed () Ġ= ĠM ention ed Location Id ( this ) Ċ fun ĠSymbol . Id . mention ed ( from Theme : ĠTheme . Id ) Ġ= ĠM ention ed Symbol Id ( this , Ġfrom Theme ) Ċ Ċ data Ġclass ĠPro se Mention Range ( val Ġindex : ĠInt , Ġval Ġlength : ĠInt ) Ġ{ ĊĠĠĠ Ġfun Ġis Intersect ing ( other : ĠPro se Mention Range ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isEmpty () Ġ|| Ġother . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġindex Ġin Ġother . index Ġuntil Ġother . index Ġ+ Ġother . length Ġ|| Ġother . index Ġin Ġindex Ġuntil Ġindex Ġ+ Ġlength ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġis B isect edBy ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex Ġin Ġthis . index Ġ+ Ġ 1 Ġuntil Ġthis . index Ġ+ Ġthis . length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty () Ġ= Ġlength Ġ== Ġ 0 ĊĠĠĠ Ġoperator Ġfun Ġcontains ( index : ĠInt ) Ġ= Ġindex Ġin Ġthis . index .. ( this . index Ġ+ Ġlength ) ĊĊĠĠĠ Ġfun Ġshifted Right ( amount : ĠInt ) Ġ= Ġcopy ( index Ġ= Ġindex Ġ+ Ġamount ) ĊĠĠĠ Ġfun Ġshifted Left ( amount : ĠInt ) Ġ= Ġcopy ( index Ġ= Ġindex Ġ- Ġamount ) ĊĠĠĠ Ġfun Ġwith Length ( length : ĠInt ) Ġ= Ġcopy ( length Ġ= Ġlength ) Ċ } ĊĊ Ċ fun Ġ< E Ġ: ĠPro se Event ?> ĠPro se . updated By ( event : ĠE ) Ġ= ĠPro se Update ( this , Ġevent ) ĊĊ