package Ġcom . github . ins an us mo kr ass ar . FSM . extensions Ċ Ċ import Ġcom . github . ins an us mo kr ass ar . FSM . core . Runner Ċ import Ġcom . github . ins an us mo kr ass ar . FSM . core . Simple State Ċ import Ġcom . github . ins an us mo kr ass ar . FSM . core . State Ċ import Ġcom . github . ins an us mo kr ass ar . FSM . core . default Action Ċ import Ġcom . github . ins an us mo kr ass ar . IOC . core . getConfig Ċ import Ġcom . github . ins an us mo kr ass ar . IOC . core . package Key Ċ import Ġcom . github . ins an us mo kr ass ar . IOC . utils . extract Ċ import Ġcom . github . ins an us mo kr ass ar . I Object K . interfaces . I Object Ċ import Ġcom . github . ins an us mo kr ass ar . I Object K . interfaces . has Ċ import Ġcom . github . ins an us mo kr ass ar . I Object K . real isations . Simple I Object Ċ import Ġcom . github . ins an us mo kr ass ar . I Object K Real isations . JSON I Object Ċ import Ġorg . json . JSONObject Ċ Ċ val Ġstates Field Ġ= Ġ" states " Ċ Ċ val Ġmark Field Ġ= Ġ" mark " Ċ Ċ val Ġaccept Field Ġ= Ġ" accept " Ċ val Ġerror Field Ġ= Ġ" error " Ċ val Ġstack Field Ġ= Ġ" stack " Ċ val Ġregex Field Ġ= Ġ" regex " Ċ val Ġnext Field Ġ= Ġ" next " Ċ val Ġcallback Field Ġ= Ġ" callback " Ċ Ċ /** Ċ Ġ* ĠUse Ġwith Ġca ution Ġ- Ġthis Ġmethod Ġis Ġnot Ġadd Ġconfig Ġfield Ġfor Ġcallback Ċ Ġ*/ Ċ fun ĠState . to Config List (): ĠList < Any ?> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Any ?> () ĊĠĠĠ Ġresult . add ( accept ) ĊĠĠĠ Ġresult . add ( error ) ĊĠĠĠ Ġresult . add ( stack ) ĊĠĠĠ Ġresult . add ( regex . pattern . replace ("\\ ", Ġ"\\ \ \" )) ĊĠĠĠ Ġnext Ġ? . Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . add ( it ) ĊĠĠĠ Ġ} Ġ?: Ġresult . add ( null ) ĊĠĠĠ Ġif Ġ( action Ġ!= Ġdefault Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Object Ġ= ĠSimple I Object () ĊĠĠĠĠĠĠĠ Ġaction Object . put ( package Key , Ġaction :: class . java . canonical Name ) ĊĠĠĠĠĠĠĠ Ġresult . add ( action Object ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠState . to Config Object ( mark : ĠString ? Ġ= Ġnull ): ĠI Object < Any > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠJSON I Object ( JSONObject ()) ĊĠĠĠ Ġresult . put ( accept Field , Ġaccept ) ĊĠĠĠ Ġresult . put ( error Field , Ġerror ) ĊĠĠĠ Ġresult . put ( stack Field , Ġstack ) ĊĠĠĠ Ġresult . put ( regex Field , Ġregex . pattern ) ĊĠĠĠ Ġnext Ġ? . Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . put ( next Field , Ġit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( action Ġ!= Ġdefault Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Object Ġ= ĠSimple I Object () ĊĠĠĠĠĠĠĠ Ġaction Object . put ( package Key , Ġaction :: class . java . canonical Name ) ĊĠĠĠĠĠĠĠ Ġresult . put ( callback Field , Ġaction Object ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmark ?. Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . put ( mark Field , Ġit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠState . to Config String ( mark : ĠString ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġto Config Object ( mark ). toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait : Ċ Ġ* Ġ< pre > Ċ Ġ* Ġ{ Ċ Ġ* ĠĠĠĠ Ġ" accept ": Ġtrue / false , Ċ Ġ* ĠĠĠĠ Ġ" error ": Ġtrue / false , Ċ Ġ* ĠĠĠĠ Ġ" stack ": Ġtrue / false , Ċ Ġ* ĠĠĠĠ Ġ" regex ": Ġ" regex ", Ċ Ġ* ĠĠĠĠ Ġ" next ": Ġoptional Ġint Ġ( default Ġ== Ġnull ), Ċ Ġ* ĠĠĠĠ Ġ" callback ": Ġ{// optional Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ fun ĠI Object < Any >. extract State (): ĠState Ġ{ ĊĠĠĠ Ġreturn ĠSimple State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( accept Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( accept Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( error Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( error Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( stack Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( stack Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex ( get ( regex Field )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has ( next Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget < Int >( next Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( has ( callback Field )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Config Ġ= Ġget < I Object < Any >>( callback Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Config . get ( package Key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* getConfig ( callback Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait : Ċ Ġ* Ġ< pre > Ċ Ġ* Ġ[ Ċ Ġ* ĠĠĠĠ Ġ< accept >, Ċ Ġ* ĠĠĠĠ Ġ< error >, Ċ Ġ* ĠĠĠĠ Ġ< stack >, Ċ Ġ* ĠĠĠĠ Ġ< regex Ġas Ġstring >, Ċ Ġ* ĠĠĠĠ Ġ< next Ġas ĠInt Ġor Ġnull >, Ċ Ġ* ĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ] Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ fun ĠList < Any >. extract State (): ĠState Ġ{ ĊĠĠĠ Ġreturn ĠSimple State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ( 0 ) Ġas ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ( 1 ) Ġas ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ( 2 ) Ġas ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex ( get ( 3 ) Ġas ĠString ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( get ( 4 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġget ( 4 ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( get ( 5 ) Ġas ĠI Object < Any >). get ( package Key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* getConfig ( get ( 5 ) Ġas ĠI Object < Any >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait : Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ" states ": Ġ[ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< accept >, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< error >, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< stack >, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< regex Ġas Ġstring >, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< next Ġas ĠInt Ġor Ġnull >, Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ], { Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" accept ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" error ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" stack ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" regex ": Ġ" regex ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" next ": Ġoptional Ġint Ġ( default Ġ== Ġnull ), Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" callback ": Ġ{// optional Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ] Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ fun Ġcreate Runner From Config ( config : ĠI Object < Any >): ĠRunner Ġ{ ĊĠĠĠ Ġreturn Ġcreate Runner From States List ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstates Field ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait : Ċ Ġ* Ġ< pre > Ċ Ġ* Ġ[ Ċ Ġ* ĠĠĠĠ Ġ[ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ< accept >, Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ< error >, Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ< stack >, Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ< regex Ġas Ġstring >, Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ< next Ġas ĠInt Ġor Ġnull >, Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ], { Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" accept ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" error ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" stack ": Ġtrue / false , Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" regex ": Ġ" regex ", Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" next ": Ġoptional Ġint Ġ( default Ġ== Ġnull ), Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ" callback ": Ġ{// optional Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package ": Ġ" package Ġto Ġcallback ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config ": Ġany Ġobject Ġas Ġconfig Ġobject . Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ] Ċ Ġ* Ġ</ pre > Ċ Ġ*/ Ċ fun Ġcreate Runner From States List ( states Configs : ĠList < Any >): ĠRunner Ġ{ ĊĠĠĠ Ġval Ġstates Ġ= Ġmutable ListOf < State >() ĊĊĠĠĠ Ġstates Configs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ( it Ġas ? ĠList < Any >) Ġ? . Ġlet Ġ{ ĊĠĠĠĠĠĠ Ġstates . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . extract State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠI Object < *> Ġ-> Ġ( it Ġas ? ĠI Object < Any >) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstates . add ( it . extract State ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRunner ( states ) Ċ } ĊĊĊ