package Ġamp el ma enn chen . lights . actions Ċ Ċ import Ġamp el ma enn chen . lights . Light Ċ import Ġamp el ma enn chen . lights . State ful Light Switch Ċ import Ġamp el ma enn chen . lights . with State Ċ import Ġkotlinx . coroutines . delay Ċ Ċ class ĠM orse Action ( private Ġval Ġlight Switch : ĠStateful Light Switch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmessage : ĠString ) Ġ: ĠLight Action Runnable Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDA H _ CHAR Ġ= Ġ' âĪ Ĵ ' ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD IT _ CHAR Ġ= Ġ' Â· ' ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD IT _ MS Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDA H _ MS Ġ= ĠD IT _ MS Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPA USE _ CODE _ MS Ġ= ĠD IT _ MS ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPA USE _ CHAR _ MS Ġ= ĠDA H _ MS ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPA USE _ WORD _ MS Ġ= ĠD IT _ MS Ġ* Ġ 7 ĊĊĠĠĠĠĠĠĠ Ġval ĠAL PH AB ET Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' A ' Ġto Ġ" Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' B ' Ġto Ġ" âĪ Ĵ Â·Â· Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' C ' Ġto Ġ" âĪ Ĵ Â· âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' D ' Ġto Ġ" âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' E ' Ġto Ġ" Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' F ' Ġto Ġ" Â·Â· âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' G ' Ġto Ġ" âĪ Ĵ âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' H ' Ġto Ġ" Â·Â·Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' I ' Ġto Ġ" Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' J ' Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' K ' Ġto Ġ" âĪ Ĵ Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' L ' Ġto Ġ" Â· âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' M ' Ġto Ġ" âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' N ' Ġto Ġ" âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' O ' Ġto Ġ" âĪ Ĵ âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' P ' Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' Q ' Ġto Ġ" âĪ Ĵ âĪ Ĵ Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' R ' Ġto Ġ" Â· âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' S ' Ġto Ġ" Â·Â· Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' T ' Ġto Ġ" âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' U ' Ġto Ġ" Â·Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' V ' Ġto Ġ" Â·Â· Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' W ' Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' X ' Ġto Ġ" âĪ Ĵ Â·Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' Y ' Ġto Ġ" âĪ Ĵ Â· âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' Z ' Ġto Ġ" âĪ Ĵ âĪ Ĵ Â·Â· " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠNUMBER S Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 1 ' Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 2 ' Ġto Ġ" Â·Â· âĪ Ĵ âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 3 ' Ġto Ġ" Â·Â· Â· âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 4 ' Ġto Ġ" Â·Â·Â·Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 5 ' Ġto Ġ" Â·Â·Â·Â· Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 6 ' Ġto Ġ" âĪ Ĵ Â·Â·Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 7 ' Ġto Ġ" âĪ Ĵ âĪ Ĵ Â·Â· Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 8 ' Ġto Ġ" âĪ Ĵ âĪ Ĵ âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 9 ' Ġto Ġ" âĪ Ĵ âĪ Ĵ âĪ Ĵ âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' Ġto Ġ" âĪ Ĵ âĪ Ĵ âĪ Ĵ âĪ Ĵ âĪ Ĵ " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠSYMBOL S Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ã Ģ ', Ġ' Ã ħ ') Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ã Ħ ') Ġto Ġ" Â· âĪ Ĵ Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ã Ī ') Ġto Ġ" Â· âĪ Ĵ Â·Â· âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ãī ') Ġto Ġ" Â·Â· âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ãĸ ') Ġto Ġ" âĪ Ĵ âĪ Ĵ âĪ Ĵ Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ãľ ') Ġto Ġ" Â·Â· âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' ÃŁ ') Ġto Ġ" Â·Â· Â· âĪ Ĵ âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' Ã ĳ ') Ġto Ġ" âĪ Ĵ âĪ Ĵ Â· âĪ Ĵ âĪ Ĵ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (' ?') Ġto Ġ" Â·Â· âĪ Ĵ âĪ Ĵ Â·Â· ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ('@ ') Ġto Ġ" Â· âĪ Ĵ âĪ Ĵ Â· âĪ Ĵ Â· " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠALLOW ED _ CHAR ACT ERS Ġ= Ġset Of (' Ġ') Ġ+ ĠAL PH AB ET . keys Ġ+ ĠNUMBER S . keys Ġ+ ĠSYMBOL S . keys . flatten () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlight : ĠLight Ġ= Ġlight Switch ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm orse This Ġ= Ġmessage . toUpperCase () ĊĊĠĠĠĠĠĠĠ Ġm orse This . filter Not Ġ{ ĠALLOW ED _ CHAR ACT ERS . contains ( it ) Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠMessage Ġcontains Ġcharacters Ġwhich Ġcannot Ġbe Ġmor sed : Ġ${ it . toCharArray (). toSet (). join ToString ( prefix Ġ= Ġ"'", Ġpostfix Ġ= Ġ"' ") }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlight Switch . with State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm orse Async ( m orse This ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġm orse Async ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlight Switch . switch Off () ĊĠĠĠĠĠĠĠ Ġdelay ( PAUSE _ WORD _ MS ) ĊĊĠĠĠĠĠĠĠ Ġmessage . on Each Ġ{ Ġmsg Char Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' Ġ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( PAUSE _ WORD _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Char . m orse Code . on Each Ġ{ Ġcode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlight Switch . switch On () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDA H _ CHAR Ġ-> Ġdelay ( DA H _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD IT _ CHAR Ġ-> Ġdelay ( D IT _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlight Switch . switch Off () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( PAUSE _ CODE _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( PAUSE _ CHAR _ MS Ġ- ĠPA USE _ CODE _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdelay ( PAUSE _ WORD _ MS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠChar . m orse Code : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequire NotNull ( ALPH AB ET [ this ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠNUMBER S [ this ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠSYMBOL S . keys . find Ġ{ Ġit . contains ( this ) Ġ} ?. let Ġ{ ĠSYMBOL S [ it ] Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ this Ġis Ġa Ġnot Ġm ors able Ġcharacter " ĊĠĠĠĠĠĠĠ Ġ} Ċ }