class ĠT rie Node Ġ{ ĊĠĠĠ Ġprivate Ġval Ġchildren Ġ= Ġmutable Map Of < Char , ĠT rie Node >() ĊĠĠĠ Ġprivate Ġvar Ġis Word Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġadd ( word : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( word . toLowerCase (). as Iterable (). iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Word ( word : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Word ( word . toLowerCase (). as Iterable (). iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Words ( letters : ĠString ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsanitized Letters Ġ= Ġletters . toLowerCase (). replace ("[ ^ a - z .] "," ") ĊĠĠĠĠĠĠĠ Ġval Ġwords Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġfind Words ( Letter Bag ( sanit ized Letters ), Ġwords , Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġwords ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġb oggle Words ( bo ggle Board : ĠB oggle ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwords Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġb oggle Board . tiles . forEach Ġ{ Ġtile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb oggle Words ( tile , Ġwords , Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwords ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd ( letters : ĠIterator < Char >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( letters . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġletter Ġ= Ġletters . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchildren . get Or Put ( letter ) Ġ{ ĠT rie Node () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add ( letters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Word Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Word ( letters : ĠIterator < Char >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( letters . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġletter Ġ= Ġletters . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren [ letter ]?. is Word ( letters ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Word ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠLetter Bag ( letters : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġletter Map Ġ= Ġletters . grouping By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( letter : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġletter Map [ letter ] Ġ= Ġletter Map [ letter ]?. inc () Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove ( letter : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġletter Map [ letter ]?. let Ġ{ Ġif Ġ( it Ġ> Ġ 0 ) Ġletter Map [ letter ] Ġ= Ġit . dec () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcurrent Set (): ĠSet < Char > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġletter Map . filter Values Ġ{ Ġit Ġ> Ġ 0 Ġ}. keys ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Words ( letters : ĠLetter Bag , Ġwords : ĠMutable Set < String >, Ġword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Word ) Ġwords . add ( word ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Letters Ġ= Ġletters . current Set () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Letters . isNotEmpty () Ġ&& Ġchildren . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Letters . contains ('. ')) Ġ{ Ġ// ĠDe al Ġwith Ġblank Ġtiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġletters . remove ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġit . value . find Words ( letters , Ġwords , Ġword Ġ+ Ġit . key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġletters . add ('.') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . filter Keys Ġ{ Ġcurrent Letters . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġletters . remove ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . find Words ( letters , Ġwords , Ġword Ġ+ Ġit . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġletters . add ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġb oggle Words ( tile : ĠB oggle . Tile , Ġwords : ĠMutable Set < String >, Ġword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Word ) Ġwords . add ( word ) ĊĊĠĠĠĠĠĠĠ Ġval Ġun visited Neighbors Ġ= Ġtile . un visited Neighbors () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( un visited Neighbors . isNotEmpty () Ġ&& Ġchildren . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile . visit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun visited Neighbors . forEach Ġ{ Ġneighbor Tile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġletter Ġ= Ġneighbor Tile . letter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren [ letter ]?. bo ggle Words ( neighbor Tile , Ġwords , Ġword Ġ+ Ġletter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile . reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ