package Ġme . n allen . mod ular code generation . description . cell ml Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Properties Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . core . Json Token Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Deserialize Ċ import Ġcom . fasterxml . jackson . databind . de ser . std . Std Deserializer Ċ import Ġcom . fasterxml . jackson . data format . xml . annotation . Jack son Xml Root Element Ċ import Ġme . n allen . mod ular code generation . description . cell ml . math ml .* Ċ import Ġme . n allen . mod ular code generation . logging . Logger Ċ import Ġjava . util .* Ċ Ċ @ Json Deserialize ( using Ġ= ĠMath Deserializer :: class ) Ċ @ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) Ċ @ Jack son Xml Root Element ( namespace Ġ= Ġ" http :// www . w 3 . org / 1 9 9 8 / Math / Math ML ", Ġlocal Name Ġ= Ġ" math ") Ċ data Ġclass ĠMath ( ĊĠĠĠĠĠĠĠ Ġval Ġitems : ĠArrayList < Math Item > Ġ= ĠArrayList () Ċ ) Ċ Ċ class ĠMath Deserializer ( vc : ĠClass < *> ? Ġ= Ġnull ) Ġ: ĠStd Deserializer < Math >( vc ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser ?, Ġctxt : ĠDeserial ization Context ?): ĠMath Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( p Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmath Object Ġ= ĠMath () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Object Ġ= Ġparse Object ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġparsed Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmath Item Ġ= Ġcreate Math Item ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( math Item Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmath Object . items . add ( math Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmath Object ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMath () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Object ( p : ĠJson Parser ): ĠArrayList < Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= ĠArrayList < Node >() ĊĠĠĠĠĠĠĠ Ġvar ĠfieldName : ĠString ? Ġ= Ġnull ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġtoken Ġ= Ġp . current Token () ĊĊĠĠĠĠĠĠĠ Ġif ( token Ġ!= ĠJson Token . START _ OBJECT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid ĠSchema Ġdetected ") ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġp . nextToken () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( token Ġ== ĠJson Token . FIELD _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfieldName Ġ= Ġp . value AsString ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( needs St oring ( token )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fieldName Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid ĠSchema Ġdetected ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . add ( Node ( fieldName , ĠgetToken Value From Parser ( token , Ġp ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfieldName Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( token Ġ== ĠJson Token . END _ OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile ( true ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfields ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠNode ( val Ġtag : ĠString , Ġval Ġvalue : ĠAny ?) ĊĊĠĠĠ Ġprivate Ġfun Ġneeds St oring ( token : ĠJson Token ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . START _ OBJECT Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NULL Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ STRING Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ INT Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ FLOAT Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ FALSE Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ TRUE Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetToken Value From Parser ( token : ĠJson Token , Ġp : ĠJson Parser ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . START _ OBJECT Ġ-> Ġparse Object ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NULL Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ STRING Ġ-> Ġp . value AsString ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ INT Ġ-> Ġp . value As Int ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ NUMBER _ FLOAT Ġ-> Ġp . value As Double ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ FALSE Ġ-> Ġp . value As Boolean ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Token . VALUE _ TRUE Ġ-> Ġp . value As Boolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Math Item ( node : ĠNode ): ĠMath Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( node . tag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" apply " Ġ-> Ġcreate Apply ( node . value Ġas ĠList < Any ?> ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ci " Ġ-> Ġcreate Ci ( node . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" cn " Ġ-> Ġcreate Cn ( node . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b var " Ġ-> Ġcreate B var ( node . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" piece wise " Ġ-> Ġcreate Piece wise ( node . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" id " Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Unknown Ġtag Ġ< " Ġ+ Ġnode . tag Ġ+ Ġ"> Ġin Ġmath ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Apply ( items : ĠList < Any ?> ): ĠApply Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġoperation : ĠOperation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= ĠArrayList < Math Item >() ĊĊĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item Ġis ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item . tag Ġ== Ġ" id ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġitem . value Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( Operation . isValid Identifier ( item . tag )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( operation Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Multiple Ġoperators Ġinside Ġ< apply > Ġelement ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= ĠOperation . get For Identifier ( item . tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmath Item Ġ= Ġcreate Math Item ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( math Item Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( math Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( operation Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" No Ġoperator Ġfound Ġfor Ġ< apply > Ġelement ") ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . EQ Ġ-> ĠNA ry Operation . create < Eq >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . N EQ Ġ-> ĠBinary Operation . create < N eq >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . GT Ġ-> ĠNA ry Operation . create < Gt >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . LT Ġ-> ĠNA ry Operation . create < Lt >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . G EQ Ġ-> ĠNA ry Operation . create < G eq >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . LE Q Ġ-> ĠNA ry Operation . create < Le q >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . PLUS Ġ-> ĠNA ry Operation . create < Plus >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . MINUS Ġ-> ĠMin us . create ( id , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . TIMES Ġ-> ĠNA ry Operation . create < Times >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . DI VID E Ġ-> ĠBinary Operation . create < Divide >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . POWER Ġ-> ĠBinary Operation . create < Power >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . ROOT Ġ-> ĠRoot . create ( id , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . ABS Ġ-> ĠUnary Operation . create < Abs >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . EXP Ġ-> ĠUnary Operation . create < Exp >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . LN Ġ-> ĠUnary Operation . create < Ln >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . LOG Ġ-> ĠTODO (" LOG ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . FLO OR Ġ-> ĠUnary Operation . create < Floor >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . CE IL ING Ġ-> ĠUnary Operation . create < Ce iling >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . FACTOR IAL Ġ-> ĠUnary Operation . create < Factor ial >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . AND Ġ-> ĠNA ry Operation . create < And >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . OR Ġ-> ĠNA ry Operation . create < Or >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . XOR Ġ-> ĠNA ry Operation . create < Xor >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . NOT Ġ-> ĠUnary Operation . create < Not >( id , Ġoperation , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation . DIFF Ġ-> ĠDiff . create ( id , Ġarguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Ci ( value : ĠAny ?): ĠCi Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value Ġis ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCi ( value . trim ()) ĊĊĠĠĠĠĠĠĠ Ġelse Ġif ( value Ġis ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< ci > Ġprovided Ġ- Ġmissing Ġvariable ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Cn ( value : ĠAny ?): ĠC n Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value Ġis ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" units " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< cn > Ġprovided Ġ- Ġmissing Ġ' units ' Ġargument ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunits Node Ġ= Ġ( value . first { Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" units " Ġ} Ġas ĠNode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( units Node . value Ġ! is ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< cn > Ġprovided Ġ- Ġinvalid Ġ' units ' Ġargument ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ"" Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< cn > Ġprovided Ġ- Ġmissing Ġvalue ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Node Ġ= Ġ( value . first { Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ"" Ġ} Ġas ĠNode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixed Value Node Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Node . value Ġis ĠString Ġ&& Ġvalue Node . value . toDouble OrNull () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode ( value Node . tag , Ġvalue Node . value . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fixed Value Node . value Ġ! is ĠNumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< cn > Ġprovided Ġ- Ġinvalid Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC n ( units Node . value , Ġfixed Value Node . value . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< cn > Ġargument Ġprovided ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate B var ( value : ĠAny ?): ĠB var Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value Ġis ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" ci " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< b var > Ġprovided Ġ- Ġmissing Ġ' ci ' Ġfield ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Node Ġ= Ġ( value . first { Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" ci " Ġ} Ġas ĠNode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" degree " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠB var ( create Ci ( variable Node . value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< b var > Ġargument Ġprovided ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Piece wise ( value : ĠAny ?): ĠPiece wise Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value Ġis ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" piece " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< piece wise > Ġprovided Ġ- Ġmissing Ġany Ġ' piece ' Ġfields ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpieces Ġ= ĠArrayList < Piece >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġvalue . filter Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" piece " Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpieces . add ( create Piece (( item Ġas ĠNode ). value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġotherwise Ġ= Ġif ( value . any Ġ{ Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" otherwise " Ġ&& Ġit . value Ġis ĠList < Any ?> Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġotherwise Value Ġ= Ġ( value . first { Ġit Ġis ĠNode Ġ&& Ġit . tag Ġ== Ġ" otherwise " Ġ&& Ġit . value Ġis ĠList < Any ?> Ġ} Ġas ĠNode ). value Ġas ĠList < Any ?> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= ĠArrayList < Math Item >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġotherwise Value . filter Ġ{ Ġit Ġis ĠNode Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmath Item Ġ= Ġcreate Math Item ( item Ġas ĠNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( math Item Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . add ( math Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠException ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( parts . size Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< otherwise > Ġprovided Ġ- Ġexpected Ġone Ġfield ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPiece wise ( pieces , Ġotherwise ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< piece wise > Ġargument Ġprovided ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Piece ( value : ĠAny ?): ĠPiece Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value Ġis ĠList < Any ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= ĠArrayList < Math Item >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġvalue . filter Ġ{ Ġit Ġis ĠNode Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmath Item Ġ= Ġcreate Math Item ( item Ġas ĠNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( math Item Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . add ( math Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( parts . size Ġ!= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< piece > Ġprovided Ġ- Ġexpected Ġtwo Ġfields ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPiece ( parts [ 0 ], Ġparts [ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠException (" Invalid Ġ< piece > Ġargument Ġprovided ") ĊĠĠĠ Ġ} Ċ } ĊĊĊ